Releases: PetitChu/holocron
Holocron v1.6.0
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-leveltargetWordCount,formFactor,formFactorWarning,headerProgressMode,targetReprovisioned;phase.mode,phase.progressLabel,phase.progressNumeric,phase.currentTask,phase.clickTarget;roadmap[].owner(subtitle) androadmap[].status(enum). Schema bumps_meta.schemaVersionfrom2to3.agents/new-project.md— Phase 6 Step 6a: form-factor Socratic question (AskUserQuestionwith the five Legends-era reference points), midpoint table for each band, YAML-frontmatter writes toroadmap.md. Phase 7 data.json synth populates all new top-level andphasefields.agents/outliner.md— Step 6 derives per-scenetargetWordsfrom the canonicaltarget_word_count(even distribution by default, tension-weighted opt-in). The outliner refuses to outline whentarget_word_countis 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 betweendata.jsonper-scene sum,dashboard-history.json[0].targetTotal, androadmap.mdfrontmatter. Migration writes the chosen canonical to roadmap frontmatter, snapshots pre-migrationdata.jsonto.holocron-checkpoint.json.migrations[]for undo.templates/dashboard/app.jsx— Words-drafted StatCard now readsdata.targetWordCountwith fallback to per-chapter sum; renders form-factor suffix next to the target; surfacesformFactorWarningas 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 forin_progress, bronze forcomplete, slate forqueued, sith crimson forblocked). New.hd-roadmap-ownerand.hd-roadmap-workloadclasses..hd-pill-chipstyling for the now-clickable mode-aware header chip.
Changed
templates/dashboard/app.jsx— Briefing-tab roadmap card template rewritten: renders status pill from the newstatusenum (with back-compat fallback to legacydone/activebooleans),labelas title-weight phase name (with back-compat fallback to schema-driftedphasefield),owneras muted display-font subtitle, bareworkloadvalue (the staticworkload ·prefix is gone), and progress bar driven by status.templates/dashboard/app.jsx— header phase chip rewritten: readsphase.progressLabel+phase.progressNumeric(with back-compat fallback to legacyname · progress%); now renders as<button>withonClick→ tab switch tophase.clickTarget; inline progress bar appended to the chip body.templates/dashboard/data.schema.json—roadmap[]items: widenworkloadfrom number-only to["string", "number"](schema previously didn't match the strings regen was emitting). Markactive/donedeprecated-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 inroadmap.mdfrontmatter; per-scenetargetWordsmust sum to it; never silently default to 2,500/scene).
Verification
npm run build:dashboard—app.jscompiles to 225.9 KB, no errors.- Playwright smoke test against the real Price of Glory project (legacy v2
data.jsoncarrying 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:dashboardregen (Issue A also needs/holocron:reconcileto declare the canonical target on legacy projects).
Holocron v1.5.0
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.jsonandpackage-lock.json— declareesbuild0.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 existingconst { useState } = Reactpattern);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 inindex.html. ~1,370 lines. This is now the file authors edit when changing the dashboard.templates/dashboard/app.js— committed build artifact. Loaded byindex.htmlvia<script src="app.js"></script>. Regenerated bynpm run build:dashboard..github/workflows/validate.ymlandrelease.yml— new three-step block afteractions/setup-node@v4:npm ci,npm run build:dashboard, drift gate (git diff --quiet templates/dashboard/app.jsmust return 0, else fail with "stale artifact — runnpm run build:dashboardlocally and commit"). Same gate on PRs and on tag push.- Legacy-Babel detection in
skills/dashboard/skill.md: default-mode output greps the project'sindex.htmlfor<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 editsindex.html, so they are protected by construction.templates/dashboard/index.html—loadJsonshort-circuits onlocation.protocol === 'file:'and reads the inline JSON block directly, skipping the doomedfetch()attempt. Eliminates the three CORS errors and threenet::ERR_FAILEDlines that printed on everyfile://open. Underhttp:///https://the existing fetch-then-fallback path is unchanged.skills/dashboard/skill.md—--installdocumentation now listsapp.jsas a managed file alongsideindex.html,styles.css,assets/.RELEASING.md— new step 0 of the release checklist:npm run build:dashboardbefore 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 droppackage.json,package-lock.json,node_modules/*,templates/dashboard/app.jsxso users never see the build toolchain in the released artifact..gitignore—node_modules/added (committedpackage.json+package-lock.jsondescribe 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
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 whoserolematches/protagonist|pov/i, else any entry with astatsobject, else the first entry. Renders an empty-state line ("No protagonist attributes declared…") if none found. No more hardcodedkiralookup.templates/dashboard/index.html—Velocitycomponent guards against single-snapshot history ((snapshots.length - 1)was dividing by zero, producingNaNSVG coordinates), normalises missing/empty snapshots to one placeholder point, and computesmaxovers.total || 0.templates/dashboard/index.html—normalizeDataextended to cover two more drift patterns observed in real data:history.wordcountSnapshots[](at→date,totalWords→total), andpovTenseConsistency[](scene→chapterId, singlepov/tensescalars expand to declared+detected pairs with reasonable defaults). Also injects an empty 8×7writingActivitymatrix 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
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.html—normalizeData(d)function that runs once after the JSON loader resolvesdata.json(and before React mounts). Renames the observed drift patterns forchapters[],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'sdata.schema.jsonremains the authoritative shape; this layer just stops the cascade of per-tab crashes when a regen drifts.
Holocron v1.4.2
Dashboard patch. Three related fixes for problems that surfaced during a real /holocron:adopt + /holocron:dashboard --install session:
- Briefing tab crashed (
Cannot read properties of undefined (reading 'slice')) whendata.jsonshippedrecentActivity[]entries with the keys{at, type, what}instead of the schema's{date, type, target, summary}. - The same regen blanked two of the three inline-fallback
<script>blocks back to{}, producing "The archive is empty" underfile://where CORS blocksfetch. - The inline-block injection step itself failed earlier in the session with
SyntaxError: unexpected character after line continuation characterbecause the assistant usedpython -c "..."from bash, which mangles backslashes in regex / replacement strings.
Fixed
templates/dashboard/index.html— Briefing-tab "Recent Activity" loop readsr.date || r.atandr.summary || r.whatso 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 viafile://. New step 6 instructs the skill to validate the emitted object againsttemplates/dashboard/data.schema.jsonbefore 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 prohibitspython -c "..."for the inline-fallback refresh (bash strips a layer of backslashes before Python sees the source), mandates single-quoted heredocpython << 'PYEOF'or a temp.inject-inline.pyscript, and mandates a lambda forre.subreplacement (literal replacement strings interpret\1/\2as backrefs and corrupt JSON payloads that contain those byte sequences). Includes the working reference pattern.skills/dashboard/references/technical.md— added arecentActivity[]row to the v0.5.0 field-mapping table reiterating the exact keys and the renderer contract.
Holocron v1.4.0
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 mirroringcommands/new.md. Restores/holocron:adoptnamespacing 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.projectNotesfield intemplates/dashboard/data.schema.json— sibling toinlineNotes. 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.mdsource label in the card's action slot.
Changed
agents/architect.md— addedTaskto the tools list. Body already referenced consultinglucasfor the mythic register check,karpyshynfor psychology, andstoverfor prose-level intensity; the dispatch was unrunnable until now.agents/character-developer.md— addedTaskto the tools list. Body references consultingtraviss,karpyshyn,mandoa-linguistics-consultant,huttese-lexicon-specialist, andsith-linguist-scholarfor character-specific deep-dive work.agents/world-builder.md— addedTaskto the tools list. Body says "defer to thelore-researcheragent" 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--listand--add*confirmation samples. Implementation section split into Inline-marker scan and Project-notes append/list. Workflow split between the two tiers. Existing--processand--clearsemantics preserved verbatim — they still operate only on inline markers;--clearexplicitly does not touchnotes.md.skills/dashboard/skill.md— files-read list now includesnotes.md(parsed into the newprojectNotesfield). Workshop-tab description updated to call out the project-notes parsing and the inline-vs-project distinction.agents/new-project.md— Phase 7data.jsonsynthesis bullet list addsprojectNotes(parsed fromnotes.mdinto 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 to1.4.0.
Notes
- Why three skills shipped without shims. Plugin auto-discovery scans
skills/and registers each one regardless of whether a matchingcommands/X.mdexists; the shim is what controls the picker's display. The three affected skills were each added in different releases (adoptin v1.1.0,illustratein v1.3.x,voice-actin 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 "consultlucas" in its body has no way to actually invokelucas— the reference becomes aspirational documentation. The audit was scoped tight: only agents whose body explicitly references dispatching other agents gotTaskadded;outlinerwas 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 innotes.mdkeeps the chapter files clean and gives the dashboard a clean parse surface. - Backwards compatibility. Existing v1.3.0 projects work without modification.
notes.mdis 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
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 (--archiveflag), 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.0inserts/.gitkeeppattern for scripts.
Changed
agents/new-project.md— Project Structure block updated to includeworld/voice-cast.mdand theinserts/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-actandworld/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 frominserts/audio/, recent entries from thevoice-cast.mdrender log, link to the cast file, CTA to audition uncast characters. Files-read list expands withworld/voice-cast.mdandinserts/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-actrow. NewDependenciessubsection paragraph documents the ElevenLabs MCP install (uvx / pip) and theELEVENLABS_API_KEYenv-var setup. Project-structure block updated forinserts/audio/andworld/voice-cast.md..claude-plugin/plugin.json,.claude-plugin/marketplace.json— version bumped to1.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 nowvoice-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 pluscraft/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/--styleper-call, or by editing the per-character entries invoice-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.mdandinserts/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:buildside 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
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-generatescraft/voice.mdandCLAUDE.md. Adoption-mode integration surfacescraft/voice-analysis.mdas raw evidence and asks the writer to authorvoice.mdthemselves.- 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).--deepmode 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.jsonbumps toschemaVersion: 2. Existing v1 projects still load —/holocron:gotreats the missing2_voicephase 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 thatcraft/voice.mdis 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 writescraft/voice-analysis.mddirectly 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 writecraft/voice.md(that's the author's to write).agents/draft-extractor.md— output split into three files instead of two..holocron-adoption.jsonandcraft/voice-analysis.md(raw evidence) andcraft/tone.md(mechanics only — no Voice section anymore). The persona-namedregisterfield inphase3_premise(renumbered from phase2_premise) is replaced withstoryAtmosphere, with persona names explicitly disallowed. ThevoiceProfileblock in the JSON drops theregisterfield and addscharacteristicMoves,dashStyle,dialogueQuotes— observation-only data. Phase keys renumbered to match schema v2 (phase3_premise,phase4_characters,phase5_world,phase6_roadmap). Explicit guard rails: never writecraft/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 thatvoice-analyzerproduces evidence atcraft/voice-analysis.mdand the author authorscraft/voice.mdthemselves during the wizard's Voice phase. The rewrite-gate prompt to thewriteragent now readscraft/voice.mdas authoritative ahead ofcraft/tone.md(mechanics).skills/dashboard/skill.md— files-read list addscraft/voice.md,craft/voice-analysis.md, andCLAUDE.md. Briefing tab and Workshop tab descriptions updated to surface voice.--deepmode 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 tovoice.mdfor 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 to1.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.mdfrom the voice-analyzer's report, which conflated raw evidence with a declared voice. v1.2.0 splits them: raw evidence atcraft/voice-analysis.md(the analyzer's output), declared voice atcraft/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:goreads 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: ifcraft/voice.mdis 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
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
writeragent 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:buildfor.docxinput), 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. Coordinatesreader-digest(careful mode) andvoice-analyzerin parallel againstimports/original-split/*.md, then synthesises a single.holocron-adoption.jsonat the project root holding the wizard's slot values for every phase plus confidence flags. Also writescraft/tone.mddirectly 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.jsonat 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:adoptowns the scaffold + draft import.craft/tone.mdis 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 to1.1.0.
Notes
- Single-document input only in v1.1.0. One
.mdor 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.mdis populated fromvoice-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}andimports/original-split/*.mdare never overwritten or deleted. The rewritten output lives underchapters/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:adoptfollows the same convention.
Holocron v1.0.0
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 dashboard —
index.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-scriptproduces 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 pipeline —
claude plugin validateschema 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:referencesskill in slash-completion. Internal path references in 4 skills (write,plan,outline,character) updated fromskills/references/X.mdtoreferences/X.md. Agent files already used the barereferences/X.mdform (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 theSKILL_LIBRARY_DIRS = {"references"}whitelist that was a workaround for the pre-1.0 location. Now dead code; deleted..claude-plugin/marketplace.json— addedmetadata.descriptionsoclaude plugin validateno 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; newDependenciessubsection flagging pandoc requirement upfront; commands table updated to include the missing/holocron:in-universe-scriptrow; Specialist reviewers section updated to list thesith-linguist-scholarandhuttese-lexicon-specialistagents introduced in 0.6.0 and 0.7.0; version marker bumped..claude-plugin/plugin.json,.claude-plugin/marketplace.json— version bumped to1.0.0.
Notes
- Forked from
fictionby Daniel Howells (MIT). The fork's history of structural changes is preserved in this CHANGELOG; the upstream history lives inCHANGELOG-FICTION-ORIGINAL.md. - Personal-use first. Distributed via the Claude Code plugin marketplace as
PetitChu/holocron.