Skip to content

Releases: PetitChu/holocron

Holocron v1.6.0

12 May 00:27

Choose a tag to compare

Dashboard data-shape & rendering release. Three long-standing dashboard defects, surfaced while writing the novella The Price of Glory, are fixed together. The schema bumps from v2 → v3 with a one-shot upgrade path on next regen — no manual migration required, and the renderer tolerates v2 emissions for back-compat.

Issue A — single source of truth for the book's word-count target. Pre-1.6.0, two unreconciled targets coexisted: per-scene targetWords summed in data.json (often 30,000 from a silent 2,500/scene default) and dashboard-history.json[0].targetTotal captured by the wizard's roadmap phase (often a very different number — 12,000 in the Price of Glory case). The Briefing-tab "Words drafted" card divided by the per-scene sum, ignoring the captured target entirely — producing a meaningless "17% of 30k" headline when the author's declared target was 12k. v1.6.0 makes roadmap.md's YAML frontmatter the canonical source: the wizard captures target_word_count + form_factor + header_progress_mode explicitly using a form-factor Socratic question (short_story / novelette / novella / short_novel / novel); the outliner derives per-scene budgets from the canonical and refuses to silently default to 2,500/scene; the dashboard regen reads the canonical first and re-derives per-scene targets on every pass (with a targetReprovisioned flag when values shift >10%); /holocron:reconcile detects divergence on legacy projects and migrates them with an undoable checkpoint snapshot. The dashboard surfaces the form factor next to the target (12,000 · novella) and warns when the target sits outside the chosen band (Target below novella band — did you mean novelette?).

Issue B — Project Roadmap cards now render the phase name. Pre-1.6.0, the six Briefing-tab roadmap cards rendered only a status pill, a workload · <value> line, and a progress bar — the phase title (Voice declaration, Act II outlining + drafting, etc.) was never shown. Root cause was schema drift: the dashboard skill wrote a phase field while the schema and renderer used label, so the title silently rendered empty. v1.6.0 reconciles on label as canonical and adds owner (subtitle showing which agent drives the phase) and status (enum: complete / in_progress / queued / blocked). The static workload · prefix is removed; the workload value renders bare. A 2px left-edge accent line per status reinforces card identity at a glance.

Issue C — header phase chip becomes mode-aware instead of pinned at 100% forever. Pre-1.6.0, the chip read Phase 7 · 100% from the moment the wizard finished scaffolding and stayed there for the rest of the book's life — becoming information-dead at the exact moment a header progress signal would be most useful (when drafting begins). v1.6.0 adds a phase.mode state-machine computed by the dashboard regen (NOT the renderer): scaffolding while any wizard phase 0–7 is incomplete; drafting once Phase 7 is done AND any chapter has non-zero words. The chip then displays Drafting · 43% (default words-based; data.headerProgressMode opts the author into scene-based or act-based display via roadmap frontmatter). The chip is now a clickable button that jumps to the relevant tab (workshop in drafting, briefing in scaffolding).

Added

  • templates/dashboard/data.schema.json — schema v3 fields: top-level targetWordCount, formFactor, formFactorWarning, headerProgressMode, targetReprovisioned; phase.mode, phase.progressLabel, phase.progressNumeric, phase.currentTask, phase.clickTarget; roadmap[].owner (subtitle) and roadmap[].status (enum). Schema bumps _meta.schemaVersion from 2 to 3.
  • agents/new-project.md — Phase 6 Step 6a: form-factor Socratic question (AskUserQuestion with the five Legends-era reference points), midpoint table for each band, YAML-frontmatter writes to roadmap.md. Phase 7 data.json synth populates all new top-level and phase fields.
  • agents/outliner.md — Step 6 derives per-scene targetWords from the canonical target_word_count (even distribution by default, tension-weighted opt-in). The outliner refuses to outline when target_word_count is missing rather than silently defaulting to 2,500/scene.
  • skills/dashboard/skill.md — canonical target rule, schema v2→v3 one-shot upgrade path, mode-selection rule (scaffolding / drafting / revision), roadmap card field contract ({label, owner, status, workload}), form-factor band table.
  • skills/reconcile/skill.md — Section 7: divergent-target detection between data.json per-scene sum, dashboard-history.json[0].targetTotal, and roadmap.md frontmatter. Migration writes the chosen canonical to roadmap frontmatter, snapshots pre-migration data.json to .holocron-checkpoint.json.migrations[] for undo.
  • templates/dashboard/app.jsx — Words-drafted StatCard now reads data.targetWordCount with fallback to per-chapter sum; renders form-factor suffix next to the target; surfaces formFactorWarning as a warning chip in the footer when the target falls outside the chosen band.
  • templates/dashboard/styles.css — 2px left-edge accent line on roadmap cards keyed by status (kyber cyan for in_progress, bronze for complete, slate for queued, sith crimson for blocked). New .hd-roadmap-owner and .hd-roadmap-workload classes. .hd-pill-chip styling for the now-clickable mode-aware header chip.

Changed

  • templates/dashboard/app.jsx — Briefing-tab roadmap card template rewritten: renders status pill from the new status enum (with back-compat fallback to legacy done/active booleans), label as title-weight phase name (with back-compat fallback to schema-drifted phase field), owner as muted display-font subtitle, bare workload value (the static workload · prefix is gone), and progress bar driven by status.
  • templates/dashboard/app.jsx — header phase chip rewritten: reads phase.progressLabel + phase.progressNumeric (with back-compat fallback to legacy name · progress%); now renders as <button> with onClick → tab switch to phase.clickTarget; inline progress bar appended to the chip body.
  • templates/dashboard/data.schema.jsonroadmap[] items: widen workload from number-only to ["string", "number"] (schema previously didn't match the strings regen was emitting). Mark active / done deprecated-but-tolerated for one version.
  • skills/new/skill.md — Defaults section: length target now uses the five-band form-factor framing; documents the canonical-target invariant (single source of truth in roadmap.md frontmatter; per-scene targetWords must sum to it; never silently default to 2,500/scene).

Verification

  • npm run build:dashboardapp.js compiles to 225.9 KB, no errors.
  • Playwright smoke test against the real Price of Glory project (legacy v2 data.json carrying the divergent state from the bug report): all five tabs render without console errors; the six roadmap cards now display title + owner + bare workload; the header chip is a clickable <button> with the bronze-accent left-edge line on completed cards; CSS variables verified (rgb(201, 162, 74) × 2px). Back-compat fallbacks correctly render legacy v2 data; Issues A and C fully resolve after the next /holocron:dashboard regen (Issue A also needs /holocron:reconcile to declare the canonical target on legacy projects).

Holocron v1.5.0

11 May 16:48

Choose a tag to compare

Dashboard polish release. Two long-standing console nuisances are fixed: the in-browser Babel transformer warning (every page load), and the cluster of CORS errors that print when the dashboard is opened directly via file:// (every page load). The dashboard now opens with a fully silent DevTools console on both file:// and http:// paths.

The Babel removal was originally locked at 0.5.0 as part of a hybrid-bundle trade-off — the design handoff used external JSX files that file:// CORS blocks, and inlining the Babel block was the chosen workaround. A precompile step was never on the table. v1.5.0 closes that gap: the JSX is extracted into a sibling source file, compiled once at plugin-author release time with esbuild, and shipped as app.js alongside index.html. The author runs npm install once and npm run build:dashboard before each tag; CI rebuilds the artifact on every push and fails the build if the committed app.js is stale vs. the source, so the two cannot drift. The release zip excludes the build toolchain (package.json, package-lock.json, node_modules/, templates/dashboard/app.jsx); users only see the precompiled JS.

Added

  • package.json and package-lock.json — declare esbuild 0.24.2 as the only dev dependency. Single npm script: npm run build:dashboard. First time the plugin repo has a Node toolchain; intentionally minimal — esbuild does one thing (compile JSX) and exits.
  • scripts/build_dashboard.mjs — ~20-line esbuild invocation. Classic React.createElement JSX factory (matches the existing const { useState } = React pattern); bundle: false (React/ReactDOM/lucide stay as CDN UMD globals); format: 'iife' (matches Babel-standalone's evaluation semantics); inline sourcemap; not minified (readable in user-installed dashboards).
  • templates/dashboard/app.jsx — canonical JSX source, extracted verbatim from the v1.4.4 <script type="text/babel"> block in index.html. ~1,370 lines. This is now the file authors edit when changing the dashboard.
  • templates/dashboard/app.js — committed build artifact. Loaded by index.html via <script src="app.js"></script>. Regenerated by npm run build:dashboard.
  • .github/workflows/validate.yml and release.yml — new three-step block after actions/setup-node@v4: npm ci, npm run build:dashboard, drift gate (git diff --quiet templates/dashboard/app.js must return 0, else fail with "stale artifact — run npm run build:dashboard locally and commit"). Same gate on PRs and on tag push.
  • Legacy-Babel detection in skills/dashboard/skill.md: default-mode output greps the project's index.html for <script type="text/babel"> and prints a one-line upgrade banner pointing at /holocron:dashboard --install. No auto-overwrite; the user opts in. Lazy upgrade preserves the rule that default mode never touches HTML structure.

Changed

  • templates/dashboard/index.html — Babel CDN script dropped. <script type="text/babel">…</script> block (~1,370 lines) replaced by a single <script src="app.js"></script>. The file shrank from 1,648 lines to 280 lines. The three inline-fallback <script type="application/json"> blocks at the top of the file are untouched — the build never edits index.html, so they are protected by construction.
  • templates/dashboard/index.htmlloadJson short-circuits on location.protocol === 'file:' and reads the inline JSON block directly, skipping the doomed fetch() attempt. Eliminates the three CORS errors and three net::ERR_FAILED lines that printed on every file:// open. Under http:// / https:// the existing fetch-then-fallback path is unchanged.
  • skills/dashboard/skill.md--install documentation now lists app.js as a managed file alongside index.html, styles.css, assets/.
  • RELEASING.md — new step 0 of the release checklist: npm run build:dashboard before tagging. "What ships in the zip" updated to list the new excludes (package.json, package-lock.json, node_modules/, templates/dashboard/app.jsx).
  • .github/workflows/release.yml — zip exclude list extended to drop package.json, package-lock.json, node_modules/*, templates/dashboard/app.jsx so users never see the build toolchain in the released artifact.
  • .gitignorenode_modules/ added (committed package.json + package-lock.json describe the dep tree; the tree itself isn't committed).

Migration

Old projects keep working — <script type="text/babel"> + the unpkg Babel CDN are still in their index.html and the CDN still serves Babel-standalone. The next /holocron:dashboard regen prints an upgrade banner suggesting /holocron:dashboard --install. That command overwrites the project's index.html + styles.css + app.js with the new compiled renderer, refreshes the three inline JSON blocks in the same pass, and leaves data.json / dashboard-history.json untouched. No manuscript content, character files, world files, outline, voice, or any other project file is touched at any point.

Verified

Both paths confirmed via Playwright before tag push: http://localhost (all 5 tabs render, zero console errors, zero warnings — only a benign favicon 404) and file:// short-circuit logic confirmed by inspection (no fetch attempt possible under file: protocol).

Holocron v1.4.4

11 May 15:17

Choose a tag to compare

Dashboard fixes verified end-to-end via Playwright. v1.4.3 shipped untested code that fixed Story but left People crashing on hardcoded data.characters.kira.stats (template assumed a specific protagonist key from the example data — every real project has a different protagonist key, so every real project crashed People), Workshop crashing on s.date.slice in the Velocity sparkline (data.history.wordcountSnapshots had drifted shape {at, totalWords} instead of {date, total}), and the Story tab's POV/Tense table emitting React key warnings (povTenseConsistency[] rows used {scene, pov, tense} instead of {chapterId, declaredPov, detectedPov, declaredTense, detectedTense}). Every tab now renders against the real-world drifted data with zero console errors.

Fixed

  • templates/dashboard/index.html — PeopleTab picks the protagonist by inspecting characters in this order: any entry whose role matches /protagonist|pov/i, else any entry with a stats object, else the first entry. Renders an empty-state line ("No protagonist attributes declared…") if none found. No more hardcoded kira lookup.
  • templates/dashboard/index.htmlVelocity component guards against single-snapshot history ((snapshots.length - 1) was dividing by zero, producing NaN SVG coordinates), normalises missing/empty snapshots to one placeholder point, and computes max over s.total || 0.
  • templates/dashboard/index.htmlnormalizeData extended to cover two more drift patterns observed in real data: history.wordcountSnapshots[] (atdate, totalWordstotal), and povTenseConsistency[] (scenechapterId, single pov/tense scalars expand to declared+detected pairs with reasonable defaults). Also injects an empty 8×7 writingActivity matrix when the field is missing, so the cadence heatmap renders an empty grid instead of crashing.

Process note

This release was verified by loading index.html via python -m http.server and clicking each of the five tabs through a Playwright MCP browser, checking the console after each click. All five tabs reach zero errors. v1.4.3 should not have shipped without this check.

Holocron v1.4.3

11 May 15:06

Choose a tag to compare

Dashboard navigation patch. After v1.4.2 fixed the Briefing tab, clicking Story / People / Galaxy / Workshop tabs crashed the page with Cannot read properties of undefined (reading 'toLocaleString') (and other variants depending on the tab). A wide schema-drift audit found that almost every consumed array shape had drifted in LLM-emitted data.json — scenes used {n, tension} instead of {id, tensionPlanned, actualWords, targetWords}, plot threads used scenes instead of events, foreshadow used {at, of, payload} instead of {seed, plantedAt, payoffAt, status}, structural beats used {scene, beat} instead of {chapterId, name, desc}, factions used stateAtStart instead of state, continuity flags used scene instead of chapterId, subagent runs and timeline both used at instead of date — and so on. Each different drift crashed a different tab.

Fixing the skill spec alone wouldn't have unblocked the user, because the project already had drifted data on disk. The fix is a normalization layer in the dashboard template that maps known drifted keys to schema keys once at load time, before any tab renders.

Added

  • templates/dashboard/index.htmlnormalizeData(d) function that runs once after the JSON loader resolves data.json (and before React mounts). Renames the observed drift patterns for chapters[], recentActivity[], acts.actN.scenes[], plotThreads[], foreshadow[], structuralBeats[], factions[], locations[], forceTraditions[], continuityFlags[], subagentRuns[], timeline[]. Adds sensible defaults for fields the schema requires but a drifted emission may have omitted (chapterId, actualWords, targetWords, empty arrays for anchor / appearance lists). Idempotent — schema-conforming data passes through unchanged. The skill spec's data.schema.json remains the authoritative shape; this layer just stops the cascade of per-tab crashes when a regen drifts.

Holocron v1.4.2

11 May 14:29

Choose a tag to compare

Dashboard patch. Three related fixes for problems that surfaced during a real /holocron:adopt + /holocron:dashboard --install session:

  1. Briefing tab crashed (Cannot read properties of undefined (reading 'slice')) when data.json shipped recentActivity[] entries with the keys {at, type, what} instead of the schema's {date, type, target, summary}.
  2. The same regen blanked two of the three inline-fallback <script> blocks back to {}, producing "The archive is empty" under file:// where CORS blocks fetch.
  3. The inline-block injection step itself failed earlier in the session with SyntaxError: unexpected character after line continuation character because the assistant used python -c "..." from bash, which mangles backslashes in regex / replacement strings.

Fixed

  • templates/dashboard/index.html — Briefing-tab "Recent Activity" loop reads r.date || r.at and r.summary || r.what so a drifted-key emission degrades to a missing field instead of crashing the entire tab. Schema-conforming data renders exactly as before.

Changed

  • skills/dashboard/skill.md — step 5 of "What this does" expanded: the regen must refresh all three inline <script> blocks (project-data-inline, dashboard-history-inline, knowledge-summaries-inline), not just the first. Leaving the other two as the placeholder {} produces the "The archive is empty" state when the dashboard is opened via file://. New step 6 instructs the skill to validate the emitted object against templates/dashboard/data.schema.json before write — required-field check, no non-conforming write. New "Schema lock" section calls out the two field-name drifts observed in practice (recentActivity[] keys, chapters[] keys) with explicit do-not-emit guidance. New "Injection mechanics" section prohibits python -c "..." for the inline-fallback refresh (bash strips a layer of backslashes before Python sees the source), mandates single-quoted heredoc python << 'PYEOF' or a temp .inject-inline.py script, and mandates a lambda for re.sub replacement (literal replacement strings interpret \1/\2 as backrefs and corrupt JSON payloads that contain those byte sequences). Includes the working reference pattern.
  • skills/dashboard/references/technical.md — added a recentActivity[] row to the v0.5.0 field-mapping table reiterating the exact keys and the renderer contract.

Holocron v1.4.0

11 May 06:25

Choose a tag to compare

Polish release. Three independent fixes that surfaced during real-world use of v1.3.0.

1. Namespace shims for /holocron:adopt, /holocron:illustrate, /holocron:voice-act. These three skills shipped without a matching commands/X.md shim, so the slash-command picker showed them as bare /adopt, /illustrate, /voice-act instead of the namespaced /holocron: form every other command uses. The skills still worked, but the picker mismatch read as "this one is broken or different" — exactly the confusion the namespace exists to prevent. Adding a 6-line shim per command (mirroring commands/new.md) restores parity. commands/ and skills/ directory counts now match (26 ↔ 26).

2. Task tool added to wizard specialist agents. architect, character-developer, and world-builder all reference dispatching other agents in their bodies — architect consults lucas / karpyshyn / stover; character-developer consults traviss / karpyshyn / mandoa-linguistics-consultant / huttese-lexicon-specialist / sith-linguist-scholar; world-builder defers to lore-researcher. None of them had Task in their tools list, which meant those references were aspirational, not executable. Added Task to all three. outliner was audited and left alone (only reads files, doesn't dispatch).

3. Project-level notes infrastructure. /holocron:notes previously only handled the inline %%NOTE: …%% markers inside chapter prose. Writers had no first-class place for project-wide ideas, todos, world questions, or "remember to fix X" reminders that don't belong in a specific chapter. v1.4.0 adds a second tier: notes.md at the project root with four sections (Ideas / Todos / World Questions / Remember), four new flags on the existing skill (--add, --add-todo, --add-question, --add-remember) that each append a dated bullet under the right section, a --list flag that renders both tiers in one view, and a new Project Notes card on the dashboard's Workshop tab that mirrors the inline-notes card pattern.

The two tiers stay distinct: inline markers are about prose-level edits ("damp wool repeated in chapter 7"); project notes are about everything else ("Bao-Dur POV chapter midway through Act II"). The dashboard surfaces both side by side. The existing --process and --clear flows for inline markers are untouched; --clear does not touch notes.md (project notes are durable).

Added

  • commands/adopt.md — slash-command shim. 6 lines mirroring commands/new.md. Restores /holocron:adopt namespacing in the picker.
  • commands/illustrate.md — same pattern for /holocron:illustrate.
  • commands/voice-act.md — same pattern for /holocron:voice-act.
  • templates/standalone-story/notes.md — new project-level scratchpad scaffold. Four sections (Ideas / Todos / World Questions / Remember), each with an HTML comment explaining what belongs there. Top of file documents the four /holocron:notes --add* flags so the writer can discover them inline.
  • projectNotes field in templates/dashboard/data.schema.json — sibling to inlineNotes. Object with four string-array properties (ideas, todos, questions, remember).
  • Project Notes card in templates/dashboard/index.html — full-width card on the Workshop tab, rendered above the existing 2-column row that holds Inline Notes and Subagent Runs. Two-column inner grid for the four sections. Empty state ("No project notes yet. Use /holocron:notes --add "…" to add one.") when all sections are empty. Total-item count + notes.md source label in the card's action slot.

Changed

  • agents/architect.md — added Task to the tools list. Body already referenced consulting lucas for the mythic register check, karpyshyn for psychology, and stover for prose-level intensity; the dispatch was unrunnable until now.
  • agents/character-developer.md — added Task to the tools list. Body references consulting traviss, karpyshyn, mandoa-linguistics-consultant, huttese-lexicon-specialist, and sith-linguist-scholar for character-specific deep-dive work.
  • agents/world-builder.md — added Task to the tools list. Body says "defer to the lore-researcher agent" for canonical-fact resolution.
  • skills/notes/skill.md — extended for the two-tier system. Description rewritten to call out both inline markers and project notes. Argument hint expanded to cover the new flags. New "Tier 2 — Project Notes (notes.md)" section. Usage block lists every flag. Output format expanded with --list and --add* confirmation samples. Implementation section split into Inline-marker scan and Project-notes append/list. Workflow split between the two tiers. Existing --process and --clear semantics preserved verbatim — they still operate only on inline markers; --clear explicitly does not touch notes.md.
  • skills/dashboard/skill.md — files-read list now includes notes.md (parsed into the new projectNotes field). Workshop-tab description updated to call out the project-notes parsing and the inline-vs-project distinction.
  • agents/new-project.md — Phase 7 data.json synthesis bullet list adds projectNotes (parsed from notes.md into the four-section object). On first install, all four sections are empty; subsequent runs re-parse from the file.
  • .claude-plugin/plugin.json, .claude-plugin/marketplace.json — version bumped to 1.4.0.

Notes

  • Why three skills shipped without shims. Plugin auto-discovery scans skills/ and registers each one regardless of whether a matching commands/X.md exists; the shim is what controls the picker's display. The three affected skills were each added in different releases (adopt in v1.1.0, illustrate in v1.3.x, voice-act in v1.3.0) and none of those releases included the shim creation step in the release checklist. The fix is one-time; future skill additions should bundle the shim with the skill.
  • Why the Task gap matters. Without Task, an agent that references "consult lucas" in its body has no way to actually invoke lucas — the reference becomes aspirational documentation. The audit was scoped tight: only agents whose body explicitly references dispatching other agents got Task added; outliner was reviewed and intentionally left without it (its body only references files, not other agents).
  • Why project notes belong in their own file, not in a chapter. Inline %%markers%% are scoped to a specific line in a specific chapter — they're for prose-level edits. Project notes are scoped to the whole project — they're for ideas that aren't tied to a specific scene. Forcing project ideas into chapter files would require the writer to pick an arbitrary host chapter; keeping them in notes.md keeps the chapter files clean and gives the dashboard a clean parse surface.
  • Backwards compatibility. Existing v1.3.0 projects work without modification. notes.md is absent until either the writer runs /holocron:notes --add* (the skill creates the file from the template if missing) or runs /holocron:reconcile (which detects and offers to install missing scaffold files). Dashboard renders an empty Project Notes card in either case — no breakage.

Holocron v1.3.0

11 May 05:07

Choose a tag to compare

AI voiceover. Adds /holocron:voice-act and the voice-actor agent — the first MCP integration in Holocron, wiring up the official elevenlabs-mcp server (TTS, voice search, voice details, voice previews, subscription checks). Four modes: audition (compare 3–5 candidate voices side-by-side for casting), soundbite (confirm a locked voice with a clean canonical render), scene (multi-voice render of a finished scene with attribution-driven speaker switching), and line (single-line re-take with stability/style overrides). Per-character voice assignments live in a new world/voice-cast.md, generated from a template by /holocron:new. Renders land in inserts/audio/ with .transcript.txt sidecars listing every voice ID and rendering parameter. Every render is also logged to an append-only render log inside voice-cast.md.

The manuscript stays clean. Chapter files are never modified — no SSML, no emotion tags, no inline directives. All per-render direction (stability, style, speed, pacing) lives in the in-flight ElevenLabs prompt the agent synthesises from prose context plus the character profile plus craft/voice.md's declared narrative register. The same chapter file feeds /holocron:write, /holocron:critic, /holocron:edit, /holocron:build, and /holocron:voice-act without compromise.

The pattern mirrors v0.7.0's script-renderer (PNG glyph inserts via Pillow): text → external pipeline → media artifact in inserts/<media-type>/ with a sidecar. Three-layer dispatch (preflight → cast lookup → MCP call), fail-fast on missing dependencies, conservative-on-fabrication (never picks a voice ID silently — audition produces candidates, the writer locks the winner manually).

Added

  • agents/voice-actor.md — new specialist agent (opus, magenta). Frontmatter declares the ElevenLabs MCP tool surface (mcp__elevenlabs__text_to_speech, search_voices, get_voice, text_to_voice, list_models, check_subscription) plus the standard file tools. System prompt covers the 6-step pipeline (preflight → path resolution → mode dispatch → prompt synthesis → MCP call → output artifact + render log), per-mode procedures for audition / soundbite / scene / line, prompt-synthesis heuristics (anger → lower stability + raise style; sorrow → raise stability + lower speed slightly; etc.), conservative discipline (never invents a voice ID, never modifies prose), four triggering examples covering common writer phrasings.
  • skills/voice-act/skill.md — slash-command entry point. /holocron:voice-act <audition|soundbite|scene|line> <args>. Documents the four modes, prerequisites (MCP install, API key, optional ffmpeg for scene stitching), the workflow (audition → manual lock → soundbite confirm → scene), re-casting protocol (--archive flag), and what the skill does NOT do (no SSML in chapter files, no voice-cloning of the author, no soundscape generation, no audiobook stitching across chapters).
  • templates/standalone-story/world/voice-cast.md — new per-project cast template. Sections: Narrator voice settings, per-character cast entries (voice ID, accent/origin, speech-pattern notes, settings overrides, audition log), append-only render log, cast-change protocol. YAML frontmatter for indexing; prose-first body for human editing.
  • templates/standalone-story/inserts/audio/.gitkeep — output directory placeholder. Mirrors the v0.7.0 inserts/.gitkeep pattern for scripts.

Changed

  • agents/new-project.md — Project Structure block updated to include world/voice-cast.md and the inserts/ directory tree (audio + aurebesh / etc.). No new wizard phase — voicing is post-write, optional, and orthogonal to the project-bootstrap flow.
  • templates/standalone-story/README.md — new Audio (optional) section near the bottom, pointing the writer at /holocron:voice-act and world/voice-cast.md. Framed as an optional add-on, not a required step.
  • skills/dashboard/skill.md — Workshop tab gains a Voiceover section: cast-completion status (N of M characters cast), rendered MP3 count from inserts/audio/, recent entries from the voice-cast.md render log, link to the cast file, CTA to audition uncast characters. Files-read list expands with world/voice-cast.md and inserts/audio/*.mp3.
  • README.md (plugin root) — Status block bumped to v1.3.0 with a one-paragraph summary of the new feature. Commands table adds the /holocron:voice-act row. New Dependencies subsection paragraph documents the ElevenLabs MCP install (uvx / pip) and the ELEVENLABS_API_KEY env-var setup. Project-structure block updated for inserts/audio/ and world/voice-cast.md.
  • .claude-plugin/plugin.json, .claude-plugin/marketplace.json — version bumped to 1.3.0.

Notes

  • First MCP consumer in the plugin. Holocron's external pipelines (font install + glyph render, EPUB build) all run through Python helpers via Bash. The voice-actor agent introduces a different pattern — MCP tool calls dispatched directly from the agent. The skill / agent frontmatter declares the specific tool surface (mcp__elevenlabs__text_to_speech, etc.) so permissions are scoped tight.
  • Why audition is the entry point. A locked voice that doesn't survive contact with extended dialogue is the failure mode that wastes the most credits. Audition produces 3–5 candidate soundbites at once; the writer listens and picks; the lock is then the writer's explicit edit to voice-cast.md. The agent never picks a voice silently — even when only one candidate would clearly fit the character profile.
  • Why the manuscript stays clean. Holocron is built on plain-markdown chapter files that every agent reads — writer, chapter-reviewer, editor, critique, continuity, the critic personas, and now voice-actor. If voice-actor wrote SSML into chapters, every other agent would have to learn to ignore it. The cleaner architecture is: chapters are prose; emotion/pacing for renders is synthesised at render time from prose context plus the character profile plus craft/voice.md. The trade-off is that the writer can't fine-tune the audio render by adding inline markers — but they can fine-tune by overriding --stability / --style per-call, or by editing the per-character entries in voice-cast.md.
  • Credit accounting. ElevenLabs free tier ships 10k credits/month (~20 soundbites, ~3 scene renders). The agent surfaces credit usage in every reply via check_subscription. Scene mode flags when a render will exceed 10k credits before dispatching.
  • Backwards compatibility. Existing v1.2.0 projects work without modification — world/voice-cast.md and inserts/audio/ are absent until the writer runs /holocron:voice-act, at which point the agent halts and points them at the template. No automatic file creation in old projects; the writer opts in.

Deferred (candidates for v1.3.x or v1.4)

  • Voice cloning of the author for narration (ElevenLabs supports it via voice_clone; out of scope for v1.3.0 — separate feature class).
  • Soundscape generation for scene ambience (the MCP server supports text_to_sound_effects; out of scope).
  • Full audiobook assembly — per-scene MP3s stitched into per-chapter audio with normalised levels, M4B output, chapter markers. Natural v1.4 once per-scene renders are reliable in real-world use.
  • EPUB-with-embedded-audio build (EPUB 3 media overlays) — possible on the /holocron:build side but requires significant scaffolding; out of scope.
  • Live-render-during-write (writer agent triggers a render preview after each scene). Deferred until the cost/latency profile is understood.

Holocron v1.2.0

11 May 03:31

Choose a tag to compare

Author voice as a first-class concept. v1.1.0's /holocron:adopt flow leaked language suggesting the plugin could "match one of your voice personas" — referring to the critic personas (Lucas, Zahn, Stover, Karpyshyn, Traviss, James Wood). That was a misread of intent. Those personas are reviewers only; the plugin's purpose is to help the author develop their own voice from the start, not to imitate published writers. This release makes that explicit and structural.

The author's voice now lives in a dedicated, canonical document (craft/voice.md) generated during a new dedicated wizard phase (Phase 2: Voice, between Era and Premise). Every agent reads it as authoritative via a project-level CLAUDE.md that pulls in the voice declaration as shared context. The writer agent's hierarchy is explicit: craft/voice.md overrides its built-in literary references (Cusk, Offill, Ishiguro, Karpyshyn, Stover, Zahn, Traviss) every time they conflict. Voice is portable across projects via a new import flow — it's the author's, not the story's. The adopt flow no longer auto-writes the declared voice; it produces raw evidence (craft/voice-analysis.md) and the author authors voice.md themselves during the wizard.

Added

  • templates/standalone-story/craft/voice.md — new canonical author-voice document. Sections: How I sound, Rhythm, Distance & interiority, Register, What I am NOT trying to sound like, Sample paragraph, Imported from. Top-of-file disclaimer states clearly that the critic personas review work; they are not voice targets.
  • templates/standalone-story/CLAUDE.md — new project-level shared agent context. Sections: Author Voice (transcludes voice.md), Craft Rules pointer, Critic Personas reminder, Reference Points (absorbed-not-imitated). This file is read by every Holocron agent when it touches the project.
  • agents/new-project.md — new Phase 2: Voice between Era (Phase 1) and Premise (now Phase 3). Three paths: Import from another Holocron project (voice is yours; it travels with you across projects); Write fresh, guided by open questions that capture the author's words verbatim; Starter template for the author to fill in themselves. Auto-generates craft/voice.md and CLAUDE.md. Adoption-mode integration surfaces craft/voice-analysis.md as raw evidence and asks the writer to author voice.md themselves.
  • Voice surfaces on the dashboard. Briefing tab gets a Voice card (status: declared / evidence-only / missing; 2–3 line excerpt of "How I sound"; last-modified; CTA if missing). Workshop tab gets a Voice section (consistency stats, voice-drift flags from reviews, link to voice.md). --deep mode adds voice-vs-declared consistency: per-chapter sentence rhythm + POV/tense/distance compared against the author's declared voice.

Changed

  • Phase renumbering — schema v2. Inserting Phase 2 (Voice) shifts every downstream phase by one. New order: 0 Setup, 1 Era, 2 Voice, 3 Premise, 4 Characters, 5 World, 6 Roadmap, 7 Dashboard, 8 Ready to Write. .holocron-checkpoint.json bumps to schemaVersion: 2. Existing v1 projects still load — /holocron:go treats the missing 2_voice phase as incomplete and offers to run it before continuing.
  • agents/new-project.md — Phase 3 (formerly Phase 2: Premise & Theme) register question rewritten. Persona-named options removed entirely ("Karpyshyn-style moral grey", "Stover-style intensity", "Traviss-style military", "Zahn-style tactical", "Lucas-mythic-operatic" — gone). Replaced with Story atmosphere: content/emotional-aesthetic descriptors ("Morally-grey protagonist", "Intense / philosophical", "Tactical / military", "System-rigorous", "Operatic / mythic", "Mixed"). Explicit disclaimer above the options: "This is the STORY's atmosphere — its emotional aesthetic. It is separate from YOUR voice (declared in Phase 2). The named critics REVIEW your work; they are not voice models."
  • agents/writer.md — new "The Author's Voice Comes First" section at the top of the agent body, asserting that craft/voice.md is authoritative and overrides every reference and craft default the agent carries. The existing "Your Sensibility" section is preserved but explicitly reframed as absorbed background craft, never voice targets — the section now opens with a guard rail stating the author's declared voice always wins on conflict. The "Before You Write" reading hierarchy is explicit: CLAUDE.md (1) → craft/voice.md (2) → craft/tone.md (3) → README (4) → characters (5) → outline (6) → prior chapters (7). Missing voice.md is a hard-stop, not a fall-through.
  • agents/voice-analyzer.md — reframed from "produces a voice report" to "extracts voice EVIDENCE". Now writes craft/voice-analysis.md directly in adoption mode (was: returned the report inline for the draft-extractor to consume). The output format adds Rhythm & Sentence Patterns, Narrative Distance, Sample Passages, and "What the prose currently AVOIDS" sections. The "Recommendations" section is removed — the author decides what to do with the evidence; the analyzer reports. Frontmatter description explicitly states: does NOT write craft/voice.md (that's the author's to write).
  • agents/draft-extractor.md — output split into three files instead of two. .holocron-adoption.json and craft/voice-analysis.md (raw evidence) and craft/tone.md (mechanics only — no Voice section anymore). The persona-named register field in phase3_premise (renumbered from phase2_premise) is replaced with storyAtmosphere, with persona names explicitly disallowed. The voiceProfile block in the JSON drops the register field and adds characteristicMoves, dashStyle, dialogueQuotes — observation-only data. Phase keys renumbered to match schema v2 (phase3_premise, phase4_characters, phase5_world, phase6_roadmap). Explicit guard rails: never write craft/voice.md; the author authors it during the wizard.
  • skills/adopt/skill.md — description reframed: extracts "voice evidence" (not "voice"). Step-by-step prose updated to make explicit that voice-analyzer produces evidence at craft/voice-analysis.md and the author authors craft/voice.md themselves during the wizard's Voice phase. The rewrite-gate prompt to the writer agent now reads craft/voice.md as authoritative ahead of craft/tone.md (mechanics).
  • skills/dashboard/skill.md — files-read list adds craft/voice.md, craft/voice-analysis.md, and CLAUDE.md. Briefing tab and Workshop tab descriptions updated to surface voice. --deep mode adds voice-vs-declared consistency analysis.
  • templates/standalone-story/craft/tone.md — Voice section stripped. File is now mechanics only (POV, tense, style guide, scene-break marker, internal-thought style, project-specific overrides). Header points readers to voice.md for voice.
  • templates/standalone-story/README.md — "Tone & References" section refactored into "Voice & Craft". The persona-named reference list is reframed as "Critics who will review you" (explicitly: not people to write like). Outside-genre references explained as absorbed-by-the-writer-agent background craft, never voice targets.
  • README.md (plugin root) — Status block, project-structure block, Personas section all updated for the voice-first framing. Personas section header changed to "Personas (reviewers, NOT voice models)" with an explicit disclaimer at the top.
  • .claude-plugin/plugin.json, .claude-plugin/marketplace.json — version bumped to 1.2.0.

Notes

  • Why personas can't be voice models. Karpyshyn, Stover, Zahn, Traviss, Lucas, and James Wood are reviewers carrying single concerns (moral-grey psychology, philosophical violence, system rigor, Mandalorian culture, mythic structure, sentence-craft). They're calibrated to evaluate prose against those concerns — not to generate it. Even when v1.1.0's adopt flow leaked language about "matching a persona's voice", the personas never actually produced prose; the language was a misread of intent. v1.2.0 removes that ambiguity from every file in the plugin.
  • Voice is the author's, not the story's. Voice travels across projects via the import flow in Phase 2. The author's rhythm, distance, and negative space don't restart with each story. Atmosphere (Phase 3) is the story-specific layer — Karpyshyn-energy versus Stover-energy as emotional aesthetics, with no persona names attached.
  • Adopt no longer claims to write the declared voice. v1.1.0 wrote craft/tone.md from the voice-analyzer's report, which conflated raw evidence with a declared voice. v1.2.0 splits them: raw evidence at craft/voice-analysis.md (the analyzer's output), declared voice at craft/voice.md (the author's output, written during the wizard's Voice phase). The two files coexist; the analysis is reference material, the voice is canon.
  • Backwards compatibility. Existing v1 projects open without breaking. The checkpoint schema bumps to v2 but /holocron:go reads either version. v1 projects show a missing-voice card on the Briefing tab until the author runs through the new Phase 2; until then, the writer agent falls back to its absorbed references (with the new hard-stop check: if craft/voice.md is missing, the agent will refuse to write a full chapter and ask the author to declare their voice first).
  • No new critic persona was added. The critique surface is unchanged. v1.2.0 is a voice-architecture release, not a review-tooling release.

Holocron v1.1.0

11 May 02:41

Choose a tag to compare

New entry-point command: /holocron:adopt. Writers arriving with an existing draft (a .md file or a .docx) can now bring their work into Holocron without manually populating every wizard slot themselves. Adopt wraps the existing six-phase /holocron:new wizard with two new phases:

  • Before the wizard: extract era, premise, theme, characters, world, outline, and voice from the draft; populate the wizard's questions with those values as recommended defaults the writer can accept / edit / skip.
  • After the wizard: dispatch the writer agent to rewrite the existing chapters in the project's voice and craft rules — one chapter at a time, with an approval gate between each — so the writer can continue from any approved chapter using the rest of the Holocron toolkit.

The resulting project is indistinguishable from one created by /holocron:new — same files in the same places — but seeded from the writer's existing material instead of a blank page.

Added

  • skills/adopt/skill.md — new entry-point skill /holocron:adopt [path to draft.md or draft.docx]. Mirrors /holocron:new's frontmatter and dispatch model. Body documents the four-phase user experience (Import → Extract → Wizard with pre-fill → Rewrite gate), the pandoc preflight (reused from /holocron:build for .docx input), the project-folder scaffold, the chapter-heading splitting rules, the extractor handoff, the wizard handoff in adoption mode, and the per-chapter rewrite approval loop. Resumable via /holocron:go.
  • agents/draft-extractor.md — new specialist agent. Coordinates reader-digest (careful mode) and voice-analyzer in parallel against imports/original-split/*.md, then synthesises a single .holocron-adoption.json at the project root holding the wizard's slot values for every phase plus confidence flags. Also writes craft/tone.md directly from the voice profile (preserving the writer's existing voice rather than imposing a plugin-default register). Schema-version 1; opus-model; tools: Read, Glob, Write, Task.

Changed

  • agents/new-project.md — adds an "Adoption mode" section near the top, before Phase 0. The wizard agent now detects .holocron-adoption.json at the project root and uses its values as pre-filled defaults at each phase, honouring per-field confidence flags (high → lead with the extracted value; medium → acknowledge uncertainty; low → ask openly as if no extraction had happened). Specialist dispatch rules (architect, character-developer, outliner, lore-researcher, world-builder) are unchanged — deep work still happens, it just starts from a populated draft instead of a blank one. Phase 0 is skipped in adoption mode because /holocron:adopt owns the scaffold + draft import. craft/tone.md is honoured as authored by the extractor (preserves the writer's voice).
  • README.md — Commands table now includes /holocron:adopt. Status block updated for the 1.1.0 release. Current-version marker bumped.
  • .claude-plugin/plugin.json, .claude-plugin/marketplace.json — version bumped to 1.1.0.

Notes

  • Single-document input only in v1.1.0. One .md or one .docx. Folder-of-files input mode is deferred; writers with a folder should concatenate first. Future v1.2.0 could add the folder mode if real-world drafts demand it.
  • Voice extraction preserves the writer's voice. craft/tone.md is populated from voice-analyzer's output — the writer's existing style — not from a Karpyshyn / Stover / Zahn template. The writer agent then applies plugin-level craft rules (no filter words, audiobook awareness, scene structure) on top of the writer's voice during the rewrite phase. The intent is "match my voice, sharpen my craft," not "rewrite me into a different writer."
  • Originals are preserved. imports/original.{md,docx} and imports/original-split/*.md are never overwritten or deleted. The rewritten output lives under chapters/ per Holocron convention. The writer can diff at any time.
  • Rewrite is gated chapter-by-chapter. Never batch. Prevents voice drift compounding before the writer sees it. The writer can bail at any chapter; the rest of imports/ waits for a future resume.
  • Era mismatch is surfaced, not silenced. If the extractor flags non-OR-detected, Phase 1 of the wizard asks the writer explicitly whether to relocate to Old Republic or proceed off-piste. No silent transposition.
  • No new entry-point in commands/. Holocron has been on skills-only dispatch since 1.0.0 (commands/ is empty); /holocron:adopt follows the same convention.

Holocron v1.0.0

11 May 00:48

Choose a tag to compare

First stable release. After eight 0.x iterations the writing workflow, knowledge base, persona reviewers, and build pipeline are all production-ready for single-author Old Republic fiction projects. No new features in this release — 1.0.0 is the milestone marker for the work already in 0.7.3, plus a final cleanup pass.

What's in 1.0.0 (cumulative)

  • 24 writing skills — full lifecycle from /holocron:new (scaffold) through /holocron:plan, /holocron:outline, /holocron:character, /holocron:write, /holocron:review, /holocron:critique, /holocron:edit, to /holocron:build (EPUB), plus utility skills (/holocron:dashboard, /holocron:naming, /holocron:in-universe-name, /holocron:in-universe-script, /holocron:language, /holocron:lore, /holocron:reconcile, /holocron:cover, /holocron:illustrate, /holocron:synopsis, /holocron:notes, /holocron:status, /holocron:next, /holocron:go, /holocron:critic).
  • 37 specialist agents — writer + architect + outliner + chapter-reviewer + 6 persona reviewers (Karpyshyn / Zahn / Traviss / Stover / Lucas / James Wood) + 5 specialists (Force lore, era continuity, Mando'a, Sith, Huttese) + lore-researcher + script-renderer + in-universe-namer + the rest of the literary-craft toolchain.
  • ~130-file master knowledge base — Old Republic timeline at parity across eight eras (Pre-Republic, Tales of the Jedi, Mandalorian Wars, Jedi Civil War, KOTOR II, SWTOR / Cold War, New Sith Wars, Bane / Rule of Two), factions (Jedi, Sith, Mandalorians, Republic, Hutt Cartel, crime syndicates), Force philosophy and abilities, in-universe languages (Mando'a, Huttese, Sith, Galactic Basic), 38 sentient species, tech (lightsabers, starships, superweapons, droids, weapons), and Old Republic artefacts.
  • Interactive project dashboardindex.html + data.json, regenerated by /holocron:dashboard, surfacing chapter status, word counts, character arcs, the relationship graph, and per-chapter prose analytics.
  • In-universe script rendering/holocron:in-universe-script produces paste-ready PNG inserts in Aurebesh, Mando'a, Sith Kittât, or Huttese, with a curated font library and on-demand language-specialist dispatch for canon-faithful translation.
  • EPUB build pipeline — pandoc-driven, with preflight check and cross-platform install hints.
  • Tag-driven release pipelineclaude plugin validate schema check on every push, five-gate release workflow, auto-extracted GitHub Release notes.

Changed since 0.7.3

  • skills/references/references/ — moved the shared craft-reference library to the plugin root so Claude Code's auto-discovery no longer surfaces it as a ghost /holocron:references skill in slash-completion. Internal path references in 4 skills (write, plan, outline, character) updated from skills/references/X.md to references/X.md. Agent files already used the bare references/X.md form (now correct from plugin root); no agent edits needed. The folder's own README has been refreshed to document the new location and the rationale.
  • scripts/validate.py — removed the SKILL_LIBRARY_DIRS = {"references"} whitelist that was a workaround for the pre-1.0 location. Now dead code; deleted.
  • .claude-plugin/marketplace.json — added metadata.description so claude plugin validate no longer emits a missing-description warning against the marketplace manifest.
  • README.md — first stable release framing in the Status block; era scope rewritten to describe shipped coverage rather than "planned" coverage; new Dependencies subsection flagging pandoc requirement upfront; commands table updated to include the missing /holocron:in-universe-script row; Specialist reviewers section updated to list the sith-linguist-scholar and huttese-lexicon-specialist agents introduced in 0.6.0 and 0.7.0; version marker bumped.
  • .claude-plugin/plugin.json, .claude-plugin/marketplace.json — version bumped to 1.0.0.

Notes

  • Forked from fiction by Daniel Howells (MIT). The fork's history of structural changes is preserved in this CHANGELOG; the upstream history lives in CHANGELOG-FICTION-ORIGINAL.md.
  • Personal-use first. Distributed via the Claude Code plugin marketplace as PetitChu/holocron.