You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Release scriveno 3.6.0: multi-book identity, slug naming, series store
- Add optional book identity (title/subtitle/author/slug/series/book_number) to config.json, written by /scr:new-work and /scr:import with a WORK.md fallback so existing projects keep working
- Add docs/naming-conventions.md and lib/slug.js as the canonical naming contract; the slug helper re-exports the injection-safe algorithm previously scoped to /scr:track
- Keep canonical export and cover filenames as defaults and add self-describing {slug}-... copies when a book identity exists, ending silent collisions across a series
- Platform-encode /scr:build-ebook's EPUB output (ebook-{platform}.epub) to match /scr:build-print, so per-platform store builds no longer overwrite one another
- Sanitize the series store to ~/.scriveno/series/{series_slug}/ with a legacy-path migration shim, a derived books.json index, and optional series-tier STYLE-GUIDE/ART-DIRECTION/GLOSSARY/covers
- Propagate series-tier voice, art direction, and glossary into the drafter, /scr:cover-art --series, and the translator, each with project-local fallback
- Make /scr:manager --switch honest about cwd-based resolution; add per-language and per-edition cover slots; add orphaned illustration/header-prompt hygiene to /scr:reorder-units
- Bump 3.5.0 -> 3.6.0 across the release-alignment file set; add slug-helper and series-naming contract tests (2151 tests green, policy clean)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+14Lines changed: 14 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,20 @@
2
2
3
3
All notable package-level changes to `scriveno` are documented here.
4
4
5
+
## 3.6.0 - 2026-06-26
6
+
7
+
Multi-book identity, slug-based naming, and a first-class series store.
8
+
9
+
- Added `docs/naming-conventions.md` as the canonical contract for book identity, the slug algorithm, the series store, and the deliverable filename grammar `{slug}[-{lang}][-{platform}][-v{n}].{ext}`. Every export, cover, and series command now cites it instead of hardcoding its own scheme.
10
+
- Added `lib/slug.js`: a dependency-free, generic slug helper (`sanitizeSlug`, `buildDeliverableName`, plus a CLI) that re-exports the injection-safe algorithm previously scoped to `/scr:track`. The series directory and book identity now derive from it, closing a path-traversal and collision hazard.
11
+
- Added optional book identity to `config.json` (`title`, `subtitle`, `author`, `slug`, `series`, `book_number`), written by `/scr:new-work` and `/scr:import`, with a documented WORK.md fallback so existing projects keep working unchanged.
12
+
- Export and cover commands now keep their canonical literal output as the default and additionally write a self-describing `{slug}-...` copy when a book identity exists, so a multi-book writer's deliverables no longer collide on shared upload folders.
13
+
-`/scr:build-ebook` now platform-encodes its EPUB output (`ebook-{platform}.epub`) to match `/scr:build-print`'s `print-{platform}.pdf`, so per-platform store builds no longer overwrite one another.
14
+
-`/scr:series-bible` now stores the series under a sanitized `~/.scriveno/series/{series_slug}/` path with a legacy-path migration shim, a derived `books.json` index (`slug`, `book_number`, `title`, `path`), and optional series-tier shared surfaces (`STYLE-GUIDE.md`, `ART-DIRECTION.md`, `GLOSSARY.md`, `covers/`).
15
+
- Series-tier consistency now propagates with project-local fallback: the drafter loads the series voice baseline, `/scr:cover-art --series` reads the series art direction, and the translator reads the series glossary.
16
+
-`/scr:manager --switch` is now honest about Scriveno operating on the current working directory: it prints the exact `cd` to run instead of implying a persistent switch it never had.
17
+
- Added per-language and per-edition cover slots (`build/{lang}/...`, `build/editions/{edition}/...`) and orphaned illustration/header-prompt hygiene to `/scr:reorder-units`.
@@ -265,11 +265,11 @@ Scriveno currently ships installer targets for these AI tooling environments:
265
265
266
266
## Status
267
267
268
-
**Version:** 3.5.0
268
+
**Version:** 3.6.0
269
269
270
270
Scriveno's core command surface is stable across 125 commands, 50 work types, and 11 installer targets. The current repo baseline includes shipped planning milestones through `v2.0 Publishing Cover Packaging`, plus the creative-context, record-store, neutral research layer, world/place/geography layers, prepublish editorial review, branching-next, runtime-sync, adaptive concierge, human-first writing-safeguard, authenticity-diagnostic, domain-grilling, installer-marker cleanup, cross-runtime agent metadata, bounded subagent spawning protocol, model adaptation guide, visible automation status, the shared `npx scriveno@latest status --project .` auto-invoke engine, route-intelligence lanes, safe apply reporting, runtime smoke checks, agent availability checks, route graph audits, workflow-reference guards, the full audit repair pass through `2.0.11`, the first-run proof surface in `2.5.0`, the executable `/scr:first-run` path, command profiles, context-health checks, `/scr:proof-unit`, hub-first command families, and interactive install profile selection. See [Quick Proof](docs/quick-proof.md) for the fastest proof path, [Shipped Assets](docs/shipped-assets.md) for the canonical asset inventory, and [Runtime Support](docs/runtime-support.md) for the runtime compatibility matrix.
271
271
272
-
Version `3.5.0` publishes Scriveno under the package name `scriveno`, so the current install command is `npx scriveno@latest`. The older `scriveno-cli` package name is historical and was unpublished during the rename, so npm cannot attach a deprecation notice to it while it has no active registry record. The older `scriven-cli` package remains on npm only as a deprecated legacy name that points users to `scriveno`. Do not treat either legacy package name as active unless a deliberate compatibility shim is republished. See [CHANGELOG](CHANGELOG.md) for the full list and [docs/release-notes.md](docs/release-notes.md) for the public-facing summary.
272
+
Version `3.6.0` publishes Scriveno under the package name `scriveno`, so the current install command is `npx scriveno@latest`. The older `scriveno-cli` package name is historical and was unpublished during the rename, so npm cannot attach a deprecation notice to it while it has no active registry record. The older `scriven-cli` package remains on npm only as a deprecated legacy name that points users to `scriveno`. Do not treat either legacy package name as active unless a deliberate compatibility shim is republished. See [CHANGELOG](CHANGELOG.md) for the full list and [docs/release-notes.md](docs/release-notes.md) for the public-facing summary.
273
273
274
274
Package history is tracked in [CHANGELOG.md](CHANGELOG.md), and the public-facing summary for this release is in [docs/release-notes.md](docs/release-notes.md).
Copy file name to clipboardExpand all lines: agents/drafter.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,6 +16,8 @@ You will always receive these files loaded into your context (load in this exact
16
16
17
17
1.**STYLE-GUIDE.md** -- The voice DNA. This is the single most important file. Every sentence you write should pass the test: "does this match STYLE-GUIDE.md?" If you're unsure, re-read STYLE-GUIDE.md.
18
18
19
+
**Series voice baseline (optional).** When this book belongs to a series (`.manuscript/config.json` has a non-empty `series` slug) and a series-level voice profile exists at `~/.scriveno/series/{series_slug}/STYLE-GUIDE.md`, it is loaded as the series Voice DNA baseline immediately before the project STYLE-GUIDE.md. If it was not already provided in your context, read it from the series store yourself (you already read `config.json` in the rigor step below, so resolve `series_slug` from `config.series`). The project STYLE-GUIDE.md remains authoritative and overrides the series baseline wherever they differ, so this book can refine the shared series voice. This is what keeps Book 5 sounding like Book 1. If no series voice profile exists, behavior is unchanged. See `docs/naming-conventions.md` section 3.
20
+
19
21
2.**WRITING-RULES.md** (optional). Universal AI-tell don'ts and show-don't-tell triggers. Loaded if present in the project's `.manuscript/` directory or the installed Scriveno templates. STYLE-GUIDE.md wins where they conflict; WRITING-RULES.md is the floor, not the ceiling. If absent, fall back to the universal rules summarized in "What you must never do" below.
20
22
21
23
3.**Pitfall pack** (optional). Type-specific pitfalls keyed off `.manuscript/config.json`'s `work_type`. Resolution order: `.manuscript/PITFALLS.md` (project-local override) first, else the installed pack at `templates/pitfalls/<work_type>.md` (global `~/.scriveno/templates/pitfalls/` or project `.scriveno/templates/pitfalls/`). If neither exists, skip silently. Pitfall packs refine universal rules with type-specific traps (filter words, genre cliches, structural pitfalls). They cannot relax WRITING-RULES.md or override STYLE-GUIDE.md.
Copy file name to clipboardExpand all lines: agents/translator.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,6 +20,8 @@ You will always receive these files loaded into your context:
20
20
21
21
3.**GLOSSARY-{lang}.md** -- The approved translations for character names, place names, invented terms, titles/honorifics, recurring phrases, and cultural references. Every term in this glossary MUST be used exactly as specified. No improvisation on approved terms.
22
22
23
+
**Series glossary (optional).** When the work belongs to a series (`.manuscript/config.json` has a non-empty `series` slug) and a series-level glossary exists at `~/.scriveno/series/{series_slug}/GLOSSARY.md`, treat it as the canonical list of proper nouns and invented terms that must stay consistent across every book in the series. The per-language `GLOSSARY-{lang}.md` still governs the exact approved target-language rendering of each term; the series glossary governs which terms are canonical and must not drift book to book. If a term is in the series glossary but has no `GLOSSARY-{lang}.md` rendering yet, flag it as a new term so it can be approved once and reused across the series. If no series glossary exists, behavior is unchanged. See `docs/naming-conventions.md` section 3.
24
+
23
25
4.**Translation memory excerpt** -- Relevant segments from translation-memory.json that match content in this unit. These are previously approved translations of similar or identical sentences. Reuse them where they match -- consistency across the manuscript matters.
24
26
25
27
5.**CHARACTERS.md excerpt** (or FIGURES.md for sacred works) -- Only the characters/figures relevant to this unit. Includes their voice anchors, speech patterns, and current emotional state. Each character must sound distinct in the target language, just as they do in the source.
Copy file name to clipboardExpand all lines: commands/scr/back-matter.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -78,6 +78,8 @@ Load the following project files:
78
78
- The adapted cast surface for canonical `CHARACTERS.md`, when applicable -- for glossary extraction (names, roles, concepts, terms)
79
79
- Drafted prose from `.manuscript/drafts/` (especially `.manuscript/drafts/body/`) -- for content extraction (glossary terms, endnotes, themes)
80
80
81
+
**Resolve book identity (config first, WORK.md fallback).** When an element needs the book title, author, or series (the "About the Author" bio, the colophon, any "Also by" listing, and the glossary/index headers), prefer the identity keys in `.manuscript/config.json` (`title`, `author`, and the series linkage `series` slug + `book_number`), and fall back to `.manuscript/WORK.md` only when a config key is absent or empty, per the reader fallback contract in `docs/naming-conventions.md` sections 2-3 (config `title`, else the first H1 in WORK.md; config `author`, else the WORK.md author field, else leave blank and do not invent one).
82
+
81
83
**Confirm the `back-matter` command is available** for the current work type by checking `CONSTRAINTS.json`. If the work type's group is in the `hidden` list, inform the writer and stop.
Copy file name to clipboardExpand all lines: commands/scr/build-ebook.md
+39-9Lines changed: 39 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,9 +30,17 @@ You are a **manuscript build specialist** for EPUB output.
30
30
31
31
Load the following project files:
32
32
33
-
-`.manuscript/config.json` -- to get `work_type`, title, author, language, and project settings
33
+
-`.manuscript/config.json` -- to get `work_type`, title, author, language, `slug`, and project settings
34
34
- Scriveno's installed/shared `CONSTRAINTS.json` (global `~/.scriveno/data/CONSTRAINTS.json` or project `.scriveno/data/CONSTRAINTS.json`) -- to check `exports` section for format availability by work type group
35
35
36
+
**Resolve book identity (fallback contract):** when you need `title`, `author`, or `language`, prefer the `.manuscript/config.json` key and fall back to today's source per `docs/naming-conventions.md` section 2:
37
+
38
+
-`title`: config `title`, else the first H1 in `.manuscript/WORK.md`.
39
+
-`author`: config `author`, else the WORK.md author field, else leave blank and do not invent one.
Carry the resolved `slug` (config `slug` if present and non-empty) forward for the slugged-copy step in STEP 4.
43
+
36
44
Resolve shared asset directories before checking templates:
37
45
38
46
-`SHARED_DATA_DIR`: first existing directory from `.scriveno/data`, `$HOME/.scriveno/data`, then `data` when running from the Scriveno source repository
@@ -370,10 +378,10 @@ First, copy the OPF stub for reference:
Invoke Pandoc with the fixed-layout stylesheet. The `{platform}` token is the platform slug resolved in STEP 1.8 (one of `kdp`, `ingram`, `apple`, `bn`, `d2d`, `kobo`, `google`, `smashwords`). Platform-encoding the canonical output mirrors `/scr:build-print`'s `print-{platform}.pdf` so per-platform EPUBs no longer collide:
Note: `--split-level=0` keeps facing pages together as single spine items.
386
394
395
+
**Slugged copy (additive):** when `.manuscript/config.json` has a non-empty `slug`, also write a self-describing copy alongside the canonical file per `docs/naming-conventions.md` sections 4-5. The canonical `ebook-fixed-layout-{platform}.epub` remains the stable contract; the slugged copy is the collision-safe artifact a writer collects for upload:
> **Note:** Fixed-layout EPUB generated. Merge the OPF metadata from `.manuscript/output/fixed-layout.opf` into the EPUB's `package.opf` before submitting to Apple Books.
389
403
390
404
Then proceed to STEP 5 (skip the standard Pandoc invocation below).
391
405
392
-
**If `--fixed-layout` is NOT enabled:** use the standard Pandoc invocation:
406
+
**If `--fixed-layout` is NOT enabled:** use the standard Pandoc invocation. The `{platform}` token is the platform slug resolved in STEP 1.8 (one of `kdp`, `ingram`, `apple`, `bn`, `d2d`, `kobo`, `google`, `smashwords`). Platform-encoding the canonical output mirrors `/scr:build-print`'s `print-{platform}.pdf` so per-platform EPUBs no longer collide:
**Slugged copy (additive):** when `.manuscript/config.json` has a non-empty `slug`, also write a self-describing copy alongside the canonical file per `docs/naming-conventions.md` sections 4-5. The canonical `ebook-{platform}.epub` remains the stable contract; the slugged copy is the collision-safe artifact a writer collects for upload:
If `.manuscript/build/ebook-cover.jpg` does not exist, check `.manuscript/build/ebook-cover.png`. If neither exists, omit the `--epub-cover-image` flag and note:
406
426
> **Note:** No ebook cover found at `.manuscript/build/ebook-cover.jpg` or `.png`. EPUB will be generated without a cover. To add a cover, place your front-cover-only RGB file at `.manuscript/build/ebook-cover.jpg` (or `.png`) and re-run this build command.
407
427
@@ -417,26 +437,36 @@ If `--fixed-layout` is active:
417
437
418
438
Show:
419
439
```
420
-
OK EPUB built -> .manuscript/output/ebook-fixed-layout.epub ({file_size})
440
+
OK EPUB built -> .manuscript/output/ebook-fixed-layout-{platform}.epub ({file_size})
421
441
Platform: {selected platform label}
422
442
```
423
443
444
+
When a non-empty `slug` produced a slugged copy, add a line reporting it:
0 commit comments