scriveno 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/agents/voice-checker.md +10 -0
- package/commands/scr/autopilot-publish.md +1 -1
- package/commands/scr/autopilot-translate.md +5 -6
- package/commands/scr/autopilot.md +3 -3
- package/commands/scr/beta-reader.md +6 -3
- package/commands/scr/build-ebook.md +1 -1
- package/commands/scr/build-print.md +2 -2
- package/commands/scr/continuity-check.md +1 -0
- package/commands/scr/copy-edit.md +1 -0
- package/commands/scr/dialogue-audit.md +1 -0
- package/commands/scr/discussion-questions.md +1 -0
- package/commands/scr/draft.md +2 -2
- package/commands/scr/export.md +1 -1
- package/commands/scr/help.md +1 -1
- package/commands/scr/line-edit.md +1 -0
- package/commands/scr/map-manuscript.md +1 -0
- package/commands/scr/multi-publish.md +3 -2
- package/commands/scr/new-character.md +1 -0
- package/commands/scr/new-work.md +1 -1
- package/commands/scr/originality-check.md +1 -0
- package/commands/scr/pacing-analysis.md +1 -0
- package/commands/scr/polish.md +1 -0
- package/commands/scr/quick-write.md +4 -1
- package/commands/scr/sensitivity-review.md +1 -0
- package/commands/scr/synopsis.md +1 -0
- package/commands/scr/theme-tracker.md +1 -0
- package/commands/scr/timeline.md +1 -0
- package/commands/scr/track.md +2 -0
- package/commands/scr/translate.md +1 -1
- package/commands/scr/voice-check.md +1 -0
- package/data/CONSTRAINTS.json +2 -1
- package/data/export-templates/scriveno-book.typst +2 -2
- package/data/export-templates/scriveno-chapbook.typst +1 -1
- package/data/export-templates/scriveno-picturebook.typst +9 -0
- package/data/export-templates/scriveno-stageplay.typst +14 -4
- package/docs/architecture.md +3 -2
- package/docs/command-reference.md +22 -22
- package/docs/configuration.md +28 -3
- package/docs/contributing.md +2 -2
- package/docs/drafter-quality.md +1 -1
- package/docs/release-notes.md +25 -0
- package/docs/route-graph.md +1 -1
- package/docs/translation.md +7 -11
- package/docs/voice-dna.md +3 -3
- package/lib/track-safety.js +72 -0
- package/package.json +1 -1
- package/templates/config.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/aihxp/scriveno/actions/workflows/ci.yml)
|
|
4
4
|
[](LICENSE)
|
|
5
|
-
[](CHANGELOG.md)
|
|
6
6
|
[](https://www.npmjs.com/package/scriveno)
|
|
7
7
|
[](https://www.npmjs.com/package/scriveno)
|
|
8
8
|
[](docs/runtime-support.md#shared-auto-invoke-engine)
|
|
@@ -141,6 +141,8 @@ For sacred and historical texts, Voice DNA is supplemented by 10 sacred voice re
|
|
|
141
141
|
|
|
142
142
|
**Interactive:** interactive fiction, game narrative
|
|
143
143
|
|
|
144
|
+
**Speech:** speech
|
|
145
|
+
|
|
144
146
|
**Sacred & historical:** scripture (Biblical, Quranic, Torah, Vedic, Buddhist, generic), commentary/exegesis, devotional, liturgical text, historical chronicle, historical account, mythological collection, religious epic, sermon, homiletic collection
|
|
145
147
|
|
|
146
148
|
Each work type has its own structural hierarchy and **industry-standard word count and page range guidance** -- a novel targets 70,000-100,000 words across 20-35 chapters, a screenplay targets 90-120 pages across 3-5 acts. These ranges guide outlining, progress tracking, and drafter pacing. The runnable command ids stay stable, while Scriveno adapts the wording around them -- a Torah commentary still runs `/scr:plan 3`, but frames that work as planning Parashah 3.
|
|
@@ -244,11 +246,11 @@ Scriveno currently ships installer targets for these AI tooling environments:
|
|
|
244
246
|
|
|
245
247
|
## Status
|
|
246
248
|
|
|
247
|
-
**Version:** 2.
|
|
249
|
+
**Version:** 2.6.0
|
|
248
250
|
|
|
249
251
|
Scriveno's core command surface is stable across 113 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, branching-next, runtime-sync, adaptive concierge, human-first writing-safeguard, authenticity-diagnostic, domain-grilling, installer-marker cleanup, cross-runtime agent metadata, visible automation status, the shared `scriveno status --project .` auto-invoke engine, route-intelligence lanes, safe apply reporting, runtime smoke checks, agent availability checks, route graph audits, the full audit repair pass through `2.0.11`, the first-run proof surface in `2.5.0`, and the executable `/scr:first-run` path. 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.
|
|
250
252
|
|
|
251
|
-
Version `2.
|
|
253
|
+
Version `2.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.
|
|
252
254
|
|
|
253
255
|
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).
|
|
254
256
|
|
package/agents/voice-checker.md
CHANGED
|
@@ -147,6 +147,16 @@ Map the band to the existing tiers:
|
|
|
147
147
|
- **60-74, Mixed signals (notable) / leaning AI:** Fail. Noticeable drift. Offer to re-draft problem sections.
|
|
148
148
|
- **Below 60, Reads AI-generated:** Severe. Clustered dead-giveaways, uniform rhythm, or chat-artifact contamination. Do not proceed. Recommend re-drafting with an updated STYLE-GUIDE.md or running `/scr:voice-test` to recalibrate.
|
|
149
149
|
|
|
150
|
+
### Normalized drift (for callers that need a 0-1 figure)
|
|
151
|
+
|
|
152
|
+
Some callers -- `/scr:draft`, `/scr:autopilot`, and the `voice.drift_threshold` config knob -- need drift on a 0-1 scale rather than this 0-100 score. Convert with:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
drift = (100 - score) / 100
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
So a score of 100 is 0.00 drift, 90 is 0.10, 70 is 0.30, 60 is 0.40. The default `drift_threshold` of 0.3 therefore means "pause or offer a re-draft when the voice score falls below 70" -- the FAIL band and worse. This is the single definition of drift; callers reference it rather than inventing their own scale.
|
|
159
|
+
|
|
150
160
|
Before finalizing a low score, re-read the strongest human markers you found and ask whether the band is honestly supported. Scoring genuine careful human prose low because it is formal or clean is this check's worst failure.
|
|
151
161
|
|
|
152
162
|
## Tone
|
|
@@ -78,7 +78,7 @@ Continuity check: 1 warning
|
|
|
78
78
|
Proceeding with export. Review full reports after completion.
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
**Quality gate policy (D-09):** Always proceed to the export pipeline
|
|
81
|
+
**Quality gate policy (D-09):** The quality gate is advisory and never blocks. Always proceed to the export pipeline, including when the voice check or continuity check finds problems. autopilot-publish is the unattended path: it does not stop to ask the writer and it does not abort the run. The gate exists to make problems visible, not to veto. One case gets extra visibility: when the voice score is below 60 (the voice-checker's "Reads AI-generated / do not proceed" band), flag it prominently in the quality-gate summary, write the full voice-check report to the output directory, and list it as the top issue in the final completion report with an explicit recommendation to re-draft the flagged units before publishing. Still finish the export so the run stays unattended; the writer decides whether to publish the package or re-draft after reading the report.
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -56,8 +56,8 @@ RTL_LANGUAGES = ["ar", "he", "ur", "fa", "yi", "ps", "sd"]
|
|
|
56
56
|
CJK_LANGUAGES = ["zh", "ja", "ko"]
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
- RTL languages
|
|
60
|
-
- CJK languages
|
|
59
|
+
- RTL languages: `/scr:multi-publish` derives text direction from the language code, so no extra flag is needed
|
|
60
|
+
- CJK languages: `/scr:multi-publish` applies CJK font and spacing handling from the language code
|
|
61
61
|
- All other languages default to LTR
|
|
62
62
|
|
|
63
63
|
Log the detection:
|
|
@@ -123,9 +123,8 @@ Log drift annotation counts:
|
|
|
123
123
|
|
|
124
124
|
If `--skip-publish` is NOT set:
|
|
125
125
|
- Determine text direction for this language (RTL/LTR/CJK from Step 2)
|
|
126
|
-
- Run `/scr:multi-publish --
|
|
127
|
-
-
|
|
128
|
-
- For CJK languages, pass `--cjk-mode` to enable CJK-specific line breaking and font handling
|
|
126
|
+
- Run `/scr:multi-publish --languages {lang}` for all available export formats
|
|
127
|
+
- RTL and CJK output is handled automatically: `/scr:multi-publish` sets text direction and CJK line breaking from the language code, so no extra flags are required
|
|
129
128
|
|
|
130
129
|
If `--skip-publish` IS set:
|
|
131
130
|
- Log: `"[fr] Phase 6/6: Multi-publish skipped (--skip-publish)."`
|
|
@@ -209,7 +208,7 @@ Next Steps:
|
|
|
209
208
|
|
|
210
209
|
- **NEVER** skip the glossary phase -- term consistency across the manuscript depends on it
|
|
211
210
|
- **NEVER** run cultural adaptation before translation is complete for that language
|
|
212
|
-
- **
|
|
211
|
+
- **ALWAYS** confirm the language code is correct before export; `/scr:multi-publish` uses it to set RTL direction and CJK handling, and a wrong code yields unreadable PDF and EPUB
|
|
213
212
|
- **NEVER** continue past a blocking error without logging it -- all errors must appear in the completion summary
|
|
214
213
|
- **NEVER** modify the source manuscript -- translation works on copies in `.manuscript/translation/{lang}/`
|
|
215
214
|
|
|
@@ -88,7 +88,7 @@ The writer trusts the pipeline. Autopilot runs until the entire manuscript is co
|
|
|
88
88
|
**Pause behavior:** Run until ALL units are complete. Pause ONLY on these conditions:
|
|
89
89
|
|
|
90
90
|
1. **Continuity contradiction** the agent cannot resolve (e.g., a character is in two places at once, a previously established fact is contradicted)
|
|
91
|
-
2. **Voice drift** exceeding `config.voice.drift_threshold` (default 0.3). After each unit,
|
|
91
|
+
2. **Voice drift** exceeding `config.voice.drift_threshold` (default 0.3). After each unit, run the voice-checker agent against STYLE-GUIDE.md to get an Overall score (0-100). Compute normalized drift as `drift = (100 - score) / 100` (see the "Normalized drift" section of `voice-checker.md`) and pause when `drift` exceeds the threshold -- at the default 0.3 that means a voice score below 70, the voice-checker's FAIL band.
|
|
92
92
|
3. **Plot hole** with no clear resolution path (e.g., a setup with no payoff, a character motivation gap)
|
|
93
93
|
4. **Missing critical information** that prevents drafting (character motivation gap, setting inconsistency, unresolved plot dependency)
|
|
94
94
|
5. **Record drift** against `.manuscript/RECORD.md` that the agent cannot resolve safely (e.g., a promised payoff is contradicted, an open thread is closed without being recorded, or a next-unit obligation is skipped)
|
|
@@ -108,7 +108,7 @@ The writer trusts the pipeline. Autopilot runs until the entire manuscript is co
|
|
|
108
108
|
**On completion:** Show a comprehensive summary:
|
|
109
109
|
- Total units drafted
|
|
110
110
|
- Total word count
|
|
111
|
-
- Voice consistency score across the
|
|
111
|
+
- Voice consistency: the voice-checker Overall score (0-100), averaged across the units that were voice-checked during the run
|
|
112
112
|
- Open record threads, reader promises, and unresolved next-unit obligations from RECORD.md
|
|
113
113
|
- Any flags or issues encountered during the run
|
|
114
114
|
- List of any quality gate pauses that occurred and how they were resolved
|
|
@@ -223,7 +223,7 @@ If the command stops because a prerequisite is missing, suggest the command that
|
|
|
223
223
|
|
|
224
224
|
- **NEVER** run without updating STATE.md -- resume depends on accurate state
|
|
225
225
|
- **NEVER** show raw git output in writer mode (when `developer_mode` is `false`)
|
|
226
|
-
- **NEVER** skip the voice comparison after drafting --
|
|
226
|
+
- **NEVER** skip the voice comparison after drafting -- run the voice-checker agent against STYLE-GUIDE.md; if the host runtime cannot spawn it, fall back to the drafter's built-in self-check (Step 4 in drafter.md)
|
|
227
227
|
- **NEVER** re-draft a unit that STATE.md shows as already submitted -- submitted means the writer approved it
|
|
228
228
|
- **NEVER** skip stages in the chain (discuss-plan-draft-review-submit) unless the writer explicitly says "skip"
|
|
229
229
|
- **NEVER** continue past a quality gate pause in full-auto without writer input -- the whole point is that these are conditions the pipeline cannot resolve alone
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Simulate a beta reader's experience of the manuscript
|
|
2
|
+
description: Simulate a beta reader's experience of the manuscript using a fresh-context reader persona.
|
|
3
|
+
argument-hint: "[N] [--focus <area>]"
|
|
3
4
|
---
|
|
4
5
|
|
|
5
|
-
# /scr:beta-reader --
|
|
6
|
+
# /scr:beta-reader -- Reader-Perspective Review
|
|
6
7
|
|
|
7
|
-
Simulate a beta reader's experience of the manuscript.
|
|
8
|
+
Simulate a beta reader's experience of the manuscript using a fresh-context reader persona.
|
|
9
|
+
|
|
10
|
+
This command simulates an independent reader in a fresh context using the same model, not a second or external AI. Genuine cross-AI review would require an external CLI call that Scriveno does not currently wire.
|
|
8
11
|
|
|
9
12
|
## Usage
|
|
10
13
|
```
|
|
@@ -153,7 +153,7 @@ Apply tradition data to `.manuscript/output/metadata.yaml` (before STEP 3f write
|
|
|
153
153
|
- `tibetan` script -> `bo`
|
|
154
154
|
- `devanagari` script -> `sa` (Sanskrit)
|
|
155
155
|
- `latin` script -> use the project language from config.json (default `en`)
|
|
156
|
-
- Set `
|
|
156
|
+
- Set `mainfont:` to the first entry in the manifest's `font_stack`. (For the EPUB itself the non-Latin font is applied through `scriveno-epub.css`; `mainfont` keeps the metadata key aligned with the print build.)
|
|
157
157
|
|
|
158
158
|
If `rtl: true` in the manifest, add `--metadata dir=rtl` to the Pandoc invocation in STEP 4.
|
|
159
159
|
|
|
@@ -156,7 +156,7 @@ Apply tradition data to `.manuscript/output/metadata.yaml` (before STEP 3f write
|
|
|
156
156
|
- `tibetan` script -> `bo`
|
|
157
157
|
- `devanagari` script -> `sa` (Sanskrit)
|
|
158
158
|
- `latin` script -> use the project language from config.json (default `en`)
|
|
159
|
-
- Set `
|
|
159
|
+
- Set `mainfont:` to the first entry in the manifest's `font_stack`. (`mainfont` is the Pandoc variable the Typst book/chapbook templates read for the body font; `font-family` is not.)
|
|
160
160
|
|
|
161
161
|
If `rtl: true` in the manifest, add `--metadata dir=rtl` to the Pandoc invocation in STEP 4.
|
|
162
162
|
|
|
@@ -415,7 +415,7 @@ estimated_pages = Math.round(word_count / manifest.trim_sizes[trim].wpp)
|
|
|
415
415
|
|
|
416
416
|
Compare against `manifest.max_pages`:
|
|
417
417
|
- For paperback: compare against `manifest.max_pages.paperback`
|
|
418
|
-
- For hardcover:
|
|
418
|
+
- For hardcover: the hardcover page limit applies to KDP only. Compare against `manifest.max_pages.hardcover` only if `--hardcover` was passed AND the platform is `kdp` AND the manifest defines `max_pages.hardcover`. For any other platform (for example `ingram`, which defines only `max_pages.paperback`), ignore `--hardcover` for the page-limit check and use `manifest.max_pages.paperback`.
|
|
419
419
|
|
|
420
420
|
If `estimated_pages` exceeds the limit:
|
|
421
421
|
|
package/commands/scr/draft.md
CHANGED
|
@@ -35,7 +35,7 @@ Require `.manuscript/plans/{N}-*-PLAN.md` files to exist. If none exist, also ch
|
|
|
35
35
|
|
|
36
36
|
3. **Save drafted output** to `.manuscript/drafts/body/{N}-{A}-DRAFT.md`.
|
|
37
37
|
|
|
38
|
-
4. **After all atomic units in the unit are drafted,
|
|
38
|
+
4. **After all atomic units in the unit are drafted, run a voice-check pass.** Invoke the installed `voice-checker.md` agent in a fresh context on the drafted unit -- the same agent `/scr:voice-check` uses. It loads the unit and STYLE-GUIDE.md and returns an Overall score (0-100). Convert to normalized drift (`drift = (100 - score) / 100`; see the "Normalized drift" section of `voice-checker.md`) and, if drift exceeds `config.voice.drift_threshold` (default 0.3, i.e. a voice score below 70), flag the scenes that drove the score down and offer to re-draft them. If the host runtime cannot spawn the voice-checker, fall back to the drafter's built-in self-check (Step 4 in `drafter.md`) and say so in the status block.
|
|
39
39
|
|
|
40
40
|
5. **Update RECORD.md.** After drafting, extract what the new draft establishes on page. Update `.manuscript/RECORD.md` with only durable, reader-visible changes:
|
|
41
41
|
- established facts, claims, events, definitions, procedures, objects, relationships, or constraints
|
|
@@ -51,7 +51,7 @@ Require `.manuscript/plans/{N}-*-PLAN.md` files to exist. If none exist, also ch
|
|
|
51
51
|
|
|
52
52
|
7. **Update STATE.md:** mark unit as drafted, note word count, flag any voice-check issues.
|
|
53
53
|
|
|
54
|
-
8. **Tell the writer:** "Drafted {unit} {N}: X words across Y {atomic_units}. Voice consistency: Z
|
|
54
|
+
8. **Tell the writer:** "Drafted {unit} {N}: X words across Y {atomic_units}. Voice consistency: Z% (the voice-checker Overall score for this unit; omit this figure if the voice-check could not run). Updated RECORD.md with what the draft established. Ready for editor review? Run `/scr:editor-review N` or `/scr:next`."
|
|
55
55
|
|
|
56
56
|
## Agent and Automation Status
|
|
57
57
|
|
package/commands/scr/export.md
CHANGED
|
@@ -341,7 +341,7 @@ title: "[title from config.json]"
|
|
|
341
341
|
subtitle: "[subtitle if available]"
|
|
342
342
|
author:
|
|
343
343
|
- name: "[author from config.json]"
|
|
344
|
-
|
|
344
|
+
lang: "[language from config.json, default en-US]"
|
|
345
345
|
rights: "Copyright [year] [author]. All rights reserved."
|
|
346
346
|
date: "[current year]"
|
|
347
347
|
description: "[description if available]"
|
package/commands/scr/help.md
CHANGED
|
@@ -34,7 +34,7 @@ You are helping the user navigate Scriveno commands. Load Scriveno's installed/s
|
|
|
34
34
|
|
|
35
35
|
## The "getting started" view (no project yet)
|
|
36
36
|
|
|
37
|
-
Ask the user what they want to do. Don't list
|
|
37
|
+
Ask the user what they want to do. Don't list all 113 commands -- show them this:
|
|
38
38
|
|
|
39
39
|
```
|
|
40
40
|
Scriveno -- ready to start.
|
|
@@ -199,7 +199,7 @@ Determine text direction from language code:
|
|
|
199
199
|
|
|
200
200
|
Set the appropriate direction for Pandoc and Typst output:
|
|
201
201
|
- Pandoc: `--variable dir=rtl` or `--variable dir=ltr`
|
|
202
|
-
- Typst:
|
|
202
|
+
- Typst: the book interior template reads the Pandoc `dir` variable set above to orient text
|
|
203
203
|
|
|
204
204
|
#### 5d. Number Formatting
|
|
205
205
|
|
|
@@ -238,7 +238,7 @@ title: "[translated title]"
|
|
|
238
238
|
subtitle: "[translated subtitle]"
|
|
239
239
|
author:
|
|
240
240
|
- name: "[author name]"
|
|
241
|
-
|
|
241
|
+
lang: "[lang code]"
|
|
242
242
|
dir: "[ltr or rtl]"
|
|
243
243
|
rights: "Copyright [year] [author]. [Translated rights statement]."
|
|
244
244
|
date: "[current year]"
|
|
@@ -274,6 +274,7 @@ pandoc .manuscript/translation/{lang}/assembled-manuscript.md \
|
|
|
274
274
|
pandoc .manuscript/translation/{lang}/assembled-manuscript.md \
|
|
275
275
|
-o .manuscript/output/translations/{lang}/manuscript-{lang}.pdf \
|
|
276
276
|
--pdf-engine=typst \
|
|
277
|
+
--template=data/export-templates/scriveno-book.typst \
|
|
277
278
|
--metadata-file=.manuscript/translation/{lang}/metadata.yaml \
|
|
278
279
|
--toc --toc-depth=1 \
|
|
279
280
|
-V dir={ltr|rtl}
|
package/commands/scr/new-work.md
CHANGED
|
@@ -69,7 +69,7 @@ Always create `RECORD.md` from `templates/RECORD.md` without renaming it. It is
|
|
|
69
69
|
Write `.manuscript/config.json` by starting from `templates/config.json` and filling the project-specific values. The generated config must include the shared settings blocks that later commands read:
|
|
70
70
|
```json
|
|
71
71
|
{
|
|
72
|
-
"scriveno_version": "2.
|
|
72
|
+
"scriveno_version": "2.6.0",
|
|
73
73
|
"work_type": "<chosen>",
|
|
74
74
|
"group": "<group>",
|
|
75
75
|
"command_unit": "<unit>",
|
package/commands/scr/polish.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Write a scene, passage, or chapter outside the full planning workflow.
|
|
3
|
+
argument-hint: "[--discuss] [--research] [--full]"
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
# /scr:quick-write -- Ad-Hoc Writing Without Full Planning
|
|
@@ -18,7 +19,7 @@ Write a scene, passage, or chapter outside the full planning workflow.
|
|
|
18
19
|
|
|
19
20
|
## Instruction
|
|
20
21
|
|
|
21
|
-
Quick write
|
|
22
|
+
Quick write is the fast path. It loads STYLE-GUIDE.md, drafts in the current conversation context (not a fresh per-unit context), and commits atomically. It runs continuity and voice checks only when you pass `--full`. For voice-critical work, prefer `/scr:draft`, which drafts each unit in a fresh context and always runs a voice-check.
|
|
22
23
|
|
|
23
24
|
### STEP 1: GATHER INTENT
|
|
24
25
|
|
|
@@ -49,6 +50,8 @@ If the host runtime cannot spawn a focused researcher, run the research pass in
|
|
|
49
50
|
|
|
50
51
|
Write the passage following all established style guide constraints. Target whatever length feels natural unless the writer specified a target.
|
|
51
52
|
|
|
53
|
+
Quick-write drafts in the current conversation context rather than spawning the drafter in a fresh per-unit context; this trades some voice isolation for speed. When fresh-context voice fidelity matters, use `/scr:draft` instead.
|
|
54
|
+
|
|
52
55
|
### STEP 4: VERIFY (if --full)
|
|
53
56
|
|
|
54
57
|
Run continuity and voice checks against existing manuscript.
|
package/commands/scr/synopsis.md
CHANGED
package/commands/scr/timeline.md
CHANGED
package/commands/scr/track.md
CHANGED
|
@@ -48,6 +48,8 @@ Track metadata lives in `.manuscript/tracks.json`. Create this file on first `tr
|
|
|
48
48
|
|
|
49
49
|
**Label-to-branch mapping (D-01):** Writer-friendly labels are stored as-is. The git branch name is derived by slugifying the label: lowercase, replace spaces with hyphens, strip special characters (keep alphanumeric and hyphens only), prefix with `track/`. Example: "Second Draft Attempt" becomes `track/second-draft-attempt`.
|
|
50
50
|
|
|
51
|
+
This slugify step is the one safety boundary that keeps a writer-chosen label out of a shell command, so it is mandatory, never optional. The canonical algorithm ships as `lib/track-safety.js` (installed to `<data-dir>/lib/track-safety.js`). To derive the slug and a collision-free branch deterministically instead of applying the rules by hand, run `node <data-dir>/lib/track-safety.js "<label>"`, which prints `{"slug":"...","branch":"..."}` with collisions already resolved against a comma-separated second argument of existing branch names. A correct slug contains only `[a-z0-9-]`; if it contains anything else, do not pass it to git.
|
|
52
|
+
|
|
51
53
|
**Canon branch metadata:** `canon_branch` stores the real branch name of the canon manuscript. This may be `main`, `master`, `trunk`, or any other branch name the writer uses.
|
|
52
54
|
|
|
53
55
|
## Canon Branch Resolution
|
|
@@ -214,7 +214,7 @@ After all units are translated, show a summary:
|
|
|
214
214
|
> - Build translation memory: `/scr:translation-memory [lang] --build`
|
|
215
215
|
> - Cultural adaptation review: `/scr:cultural-adaptation [lang]`
|
|
216
216
|
> - Back-translate to verify: `/scr:back-translate [lang]`
|
|
217
|
-
> - Export translation: `/scr:
|
|
217
|
+
> - Export translation: `/scr:multi-publish --languages [lang] --format [format]` (the translated-export path; `/scr:export` builds the source-language manuscript only)
|
|
218
218
|
|
|
219
219
|
## Agent and Automation Status
|
|
220
220
|
|
package/data/CONSTRAINTS.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./constraints.schema.json",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"description": "Scriveno constraint system: work types, command availability, exports, and dependencies. Every command checks this file at runtime.",
|
|
5
5
|
"_notes": {
|
|
6
6
|
"sacred_keys": "Sacred subcommands live at commands/scr/sacred/<name>.md and run as /scr:sacred:<name>. Their CONSTRAINTS keys use the sacred:<name> form so /scr:help can render the runnable slash-command path directly. The sacred-numbering-format entry is a separate flat command (commands/scr/sacred-numbering-format.md) that surfaces the active tradition's numbering format. It used to be named sacred-verse-numbering, which collided with sacred:verse-numbering at install time -- both flattened to scr-sacred-verse-numbering. Renamed in v1.6.x; the installer now refuses to install when two sources share a flat skill name."
|
|
@@ -2340,6 +2340,7 @@
|
|
|
2340
2340
|
},
|
|
2341
2341
|
"beta-reader": {
|
|
2342
2342
|
"category": "review",
|
|
2343
|
+
"description": "Simulate a beta reader's experience of the manuscript using a fresh-context reader persona (same model, not a second or external AI).",
|
|
2343
2344
|
"available": [
|
|
2344
2345
|
"all"
|
|
2345
2346
|
],
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
#let margin-bottom = $if(margin-bottom)$$margin-bottom$$else$0.75in$endif$
|
|
14
14
|
|
|
15
15
|
// Text direction: parameterized for RTL compatibility (Phase 7)
|
|
16
|
-
#let text-dir = $if(
|
|
16
|
+
#let text-dir = $if(dir)$$dir$$else$ltr$endif$
|
|
17
17
|
|
|
18
18
|
// Language code for CJK detection
|
|
19
|
-
#let lang-code = $if(
|
|
19
|
+
#let lang-code = $if(lang)$"$lang$"$else$"en"$endif$
|
|
20
20
|
|
|
21
21
|
// CJK detection helper
|
|
22
22
|
#let is-cjk = lang-code in ("zh", "ja", "ko")
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
#let margin-outside = $if(margin-outside)$$margin-outside$$else$0.625in$endif$
|
|
17
17
|
|
|
18
18
|
// Text direction
|
|
19
|
-
#let text-dir = $if(
|
|
19
|
+
#let text-dir = $if(dir)$$dir$$else$ltr$endif$
|
|
20
20
|
|
|
21
21
|
// Font configuration -- chapbooks default to a clean readable serif
|
|
22
22
|
#let body-font = $if(mainfont)$"$mainfont$"$else$"Libertinus Serif"$endif$
|
|
@@ -20,6 +20,13 @@
|
|
|
20
20
|
// Override with -V margin-top= etc. if custom margins are needed
|
|
21
21
|
#let margin-all = $if(margin-top)$$margin-top$$else$0.375in$endif$
|
|
22
22
|
|
|
23
|
+
// Text direction: parameterized for RTL compatibility (set via --metadata dir=rtl).
|
|
24
|
+
// Margins are symmetric and body text is centered, so only the base text
|
|
25
|
+
// direction needs to flip for right-to-left scripts.
|
|
26
|
+
#let text-dir = $if(dir)$$dir$$else$ltr$endif$
|
|
27
|
+
#let is-rtl = text-dir == rtl
|
|
28
|
+
#let lang-code = $if(lang)$"$lang$"$else$"en"$endif$
|
|
29
|
+
|
|
23
30
|
// Metadata
|
|
24
31
|
#let book-title = $if(title)$"$title$"$else$"Untitled"$endif$
|
|
25
32
|
#let book-author = $if(author)$"$for(author)$$it.name$$sep$, $endfor$"$else$""$endif$
|
|
@@ -46,6 +53,8 @@
|
|
|
46
53
|
#set text(
|
|
47
54
|
font: $if(mainfont)$"$mainfont$"$else$"Helvetica"$endif$,
|
|
48
55
|
size: $if(fontsize)$$fontsize$$else$16pt$endif$,
|
|
56
|
+
dir: text-dir,
|
|
57
|
+
lang: lang-code,
|
|
49
58
|
fallback: true,
|
|
50
59
|
)
|
|
51
60
|
|
|
@@ -17,6 +17,13 @@
|
|
|
17
17
|
#let margin-top = $if(margin-top)$$margin-top$$else$1in$endif$
|
|
18
18
|
#let margin-bottom = $if(margin-bottom)$$margin-bottom$$else$1in$endif$
|
|
19
19
|
|
|
20
|
+
// Text direction: parameterized for RTL compatibility (set via --metadata dir=rtl).
|
|
21
|
+
// For right-to-left scripts the wider binding margin moves to the right edge and
|
|
22
|
+
// the page number flips to the top-left.
|
|
23
|
+
#let text-dir = $if(dir)$$dir$$else$ltr$endif$
|
|
24
|
+
#let is-rtl = text-dir == rtl
|
|
25
|
+
#let lang-code = $if(lang)$"$lang$"$else$"en"$endif$
|
|
26
|
+
|
|
20
27
|
// Metadata
|
|
21
28
|
#let play-title = $if(title)$"$title$"$else$"Untitled"$endif$
|
|
22
29
|
#let play-author = $if(author)$"$for(author)$$it.name$$sep$, $endfor$"$else$""$endif$
|
|
@@ -30,16 +37,17 @@
|
|
|
30
37
|
width: page-width,
|
|
31
38
|
height: page-height,
|
|
32
39
|
margin: (
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
// The 1.5in binding margin sits on the left for LTR and flips to the right for RTL.
|
|
41
|
+
left: if is-rtl { margin-right } else { margin-left },
|
|
42
|
+
right: if is-rtl { margin-left } else { margin-right },
|
|
35
43
|
top: margin-top,
|
|
36
44
|
bottom: margin-bottom,
|
|
37
45
|
),
|
|
38
|
-
// Page numbering: top-right,
|
|
46
|
+
// Page numbering: top-right for LTR scripts, top-left for RTL
|
|
39
47
|
header: context {
|
|
40
48
|
let page-num = counter(page).get().first()
|
|
41
49
|
if page-num > 1 {
|
|
42
|
-
align(right, text(size: 10pt)[#str(page-num).])
|
|
50
|
+
align(if is-rtl { left } else { right }, text(size: 10pt)[#str(page-num).])
|
|
43
51
|
}
|
|
44
52
|
},
|
|
45
53
|
)
|
|
@@ -48,6 +56,8 @@
|
|
|
48
56
|
#set text(
|
|
49
57
|
font: $if(mainfont)$"$mainfont$"$else$"Courier New"$endif$,
|
|
50
58
|
size: $if(fontsize)$$fontsize$$else$12pt$endif$,
|
|
59
|
+
dir: text-dir,
|
|
60
|
+
lang: lang-code,
|
|
51
61
|
fallback: true,
|
|
52
62
|
)
|
|
53
63
|
|
package/docs/architecture.md
CHANGED
|
@@ -164,7 +164,8 @@ scriveno/
|
|
|
164
164
|
scriveno-book.typst Book interior PDF
|
|
165
165
|
scriveno-epub.css EPUB styling
|
|
166
166
|
scriveno-academic.latex Academic paper formatting
|
|
167
|
-
|
|
167
|
+
proof/ Committed proof bundles (voice-dna, runtime-parity)
|
|
168
|
+
templates/ Per-project starting content (repo root, sibling of data/)
|
|
168
169
|
config.json Per-project configuration template
|
|
169
170
|
WORK.md Work overview template
|
|
170
171
|
OUTLINE.md Structural outline template
|
|
@@ -422,7 +423,7 @@ The voice-checker agent (`agents/voice-checker.md`) compares drafted prose again
|
|
|
422
423
|
- Specific issues organized by category (structural voice, lexical voice, character voice, AI-slop indicators)
|
|
423
424
|
- Severity ratings (drift vs critical violation)
|
|
424
425
|
|
|
425
|
-
The voice-checker is invoked after every drafted unit.
|
|
426
|
+
The voice-checker is invoked after every drafted unit and returns an Overall score (0-100). Normalized drift is `drift = (100 - score) / 100`, so the default `config.json` threshold of 0.3 means the writer is offered a re-draft when the voice score falls below 70. See the "Normalized drift" section of `agents/voice-checker.md` for the single definition callers share.
|
|
426
427
|
|
|
427
428
|
### Calibration
|
|
428
429
|
|
|
@@ -245,7 +245,7 @@ Show the proof-first path, runtime command shapes, demo sequence, proof artifact
|
|
|
245
245
|
|
|
246
246
|
### `/scr:next`
|
|
247
247
|
|
|
248
|
-
**Description:** Auto-detect what to do next in your workflow and
|
|
248
|
+
**Description:** Auto-detect what to do next in your workflow and run it. The one command a writer can always use.
|
|
249
249
|
|
|
250
250
|
**Usage:** `/scr:next`
|
|
251
251
|
|
|
@@ -277,7 +277,7 @@ Scriveno maps your intent to the right command and runs it.
|
|
|
277
277
|
|
|
278
278
|
### `/scr:help`
|
|
279
279
|
|
|
280
|
-
**Description:** Show Scriveno commands grouped by
|
|
280
|
+
**Description:** Show Scriveno commands grouped by workflow stage, filtered to what's relevant for your current work type and progress.
|
|
281
281
|
|
|
282
282
|
**Usage:** `/scr:help [category or search term]`
|
|
283
283
|
|
|
@@ -350,7 +350,7 @@ Import an existing Word document and split it into chapters, scenes, and context
|
|
|
350
350
|
|
|
351
351
|
**Description:** Spawn parallel analysis agents to understand an existing manuscript's voice, structure, characters, and themes.
|
|
352
352
|
|
|
353
|
-
**Usage:** `/scr:map-manuscript`
|
|
353
|
+
**Usage:** `/scr:map-manuscript [area]`
|
|
354
354
|
|
|
355
355
|
**Prerequisites:** None
|
|
356
356
|
|
|
@@ -564,7 +564,7 @@ Visualize your novel's structure mapped to the hero's journey.
|
|
|
564
564
|
|
|
565
565
|
**Description:** Generate a chronological event timeline from the outline.
|
|
566
566
|
|
|
567
|
-
**Usage:** `/scr:timeline`
|
|
567
|
+
**Usage:** `/scr:timeline [--story-order] [--chronological]`
|
|
568
568
|
|
|
569
569
|
**Prerequisites:** OUTLINE.md must exist
|
|
570
570
|
|
|
@@ -584,7 +584,7 @@ See events in chronological order, even if your narrative is non-linear.
|
|
|
584
584
|
|
|
585
585
|
**Description:** Track thematic threads across the work with auto-detection suggestions.
|
|
586
586
|
|
|
587
|
-
**Usage:** `/scr:theme-tracker`
|
|
587
|
+
**Usage:** `/scr:theme-tracker [--detect]`
|
|
588
588
|
|
|
589
589
|
**Prerequisites:** THEMES.md must exist
|
|
590
590
|
|
|
@@ -780,7 +780,7 @@ Commands for creating and managing characters, relationships, and world-building
|
|
|
780
780
|
|
|
781
781
|
**Description:** Build a complete character profile through guided interactive interview.
|
|
782
782
|
|
|
783
|
-
**Usage:** `/scr:new-character
|
|
783
|
+
**Usage:** `/scr:new-character <name>`
|
|
784
784
|
|
|
785
785
|
**Prerequisites:** WORK.md must exist
|
|
786
786
|
|
|
@@ -962,7 +962,7 @@ Scriveno drafts a sample passage using your voice profile. If it doesn't sound r
|
|
|
962
962
|
|
|
963
963
|
**Description:** Perform a line-level prose quality pass with inline annotations.
|
|
964
964
|
|
|
965
|
-
**Usage:** `/scr:line-edit`
|
|
965
|
+
**Usage:** `/scr:line-edit [N]`
|
|
966
966
|
|
|
967
967
|
**Prerequisites:** Draft must exist
|
|
968
968
|
|
|
@@ -980,7 +980,7 @@ Scriveno reads your prose line by line, flagging weak verbs, passive voice, redu
|
|
|
980
980
|
|
|
981
981
|
**Description:** Perform a correctness pass for grammar, spelling, punctuation, and consistency.
|
|
982
982
|
|
|
983
|
-
**Usage:** `/scr:copy-edit`
|
|
983
|
+
**Usage:** `/scr:copy-edit [N]`
|
|
984
984
|
|
|
985
985
|
**Prerequisites:** Draft must exist
|
|
986
986
|
|
|
@@ -998,7 +998,7 @@ Catch typos, grammar issues, and consistency problems (character name spellings,
|
|
|
998
998
|
|
|
999
999
|
**Description:** Chain line-edit, copy-edit, and voice-check for comprehensive prose polish.
|
|
1000
1000
|
|
|
1001
|
-
**Usage:** `/scr:polish`
|
|
1001
|
+
**Usage:** `/scr:polish [N]`
|
|
1002
1002
|
|
|
1003
1003
|
**Prerequisites:** Draft and STYLE-GUIDE.md must exist
|
|
1004
1004
|
|
|
@@ -1016,7 +1016,7 @@ Run all three quality passes in sequence. The comprehensive final polish before
|
|
|
1016
1016
|
|
|
1017
1017
|
**Description:** Write a scene, passage, or chapter outside the full planning workflow.
|
|
1018
1018
|
|
|
1019
|
-
**Usage:** `/scr:quick-write`
|
|
1019
|
+
**Usage:** `/scr:quick-write [--discuss] [--research] [--full]`
|
|
1020
1020
|
|
|
1021
1021
|
**Prerequisites:** None
|
|
1022
1022
|
|
|
@@ -1038,7 +1038,7 @@ Commands for reviewing your manuscript from different angles -- continuity, voic
|
|
|
1038
1038
|
|
|
1039
1039
|
**Description:** Automated continuity verification to scan for narrative contradictions across the manuscript.
|
|
1040
1040
|
|
|
1041
|
-
**Usage:** `/scr:continuity-check`
|
|
1041
|
+
**Usage:** `/scr:continuity-check [N]`
|
|
1042
1042
|
|
|
1043
1043
|
**Prerequisites:** Draft must exist
|
|
1044
1044
|
|
|
@@ -1059,7 +1059,7 @@ Find contradictions: "In Chapter 3 Maria has brown eyes, but in Chapter 7 they'r
|
|
|
1059
1059
|
|
|
1060
1060
|
**Description:** Compare drafted prose against STYLE-GUIDE.md to detect voice drift.
|
|
1061
1061
|
|
|
1062
|
-
**Usage:** `/scr:voice-check`
|
|
1062
|
+
**Usage:** `/scr:voice-check [N]`
|
|
1063
1063
|
|
|
1064
1064
|
**Prerequisites:** Draft and STYLE-GUIDE.md must exist
|
|
1065
1065
|
|
|
@@ -1080,7 +1080,7 @@ Detect where your drafted prose drifts from your established voice profile.
|
|
|
1080
1080
|
|
|
1081
1081
|
**Description:** Flag potential sensitivity issues with context, suggest alternatives, and note intentional craft.
|
|
1082
1082
|
|
|
1083
|
-
**Usage:** `/scr:sensitivity-review`
|
|
1083
|
+
**Usage:** `/scr:sensitivity-review [N]`
|
|
1084
1084
|
|
|
1085
1085
|
**Prerequisites:** Draft must exist
|
|
1086
1086
|
|
|
@@ -1102,7 +1102,7 @@ Flag content that could be unintentionally harmful, with context-aware suggestio
|
|
|
1102
1102
|
|
|
1103
1103
|
**Description:** Generate a structure-aware pacing report analyzing scene tempo and narrative flow.
|
|
1104
1104
|
|
|
1105
|
-
**Usage:** `/scr:pacing-analysis`
|
|
1105
|
+
**Usage:** `/scr:pacing-analysis [N]`
|
|
1106
1106
|
|
|
1107
1107
|
**Prerequisites:** Draft must exist
|
|
1108
1108
|
|
|
@@ -1120,7 +1120,7 @@ See where your story drags or rushes. Scriveno maps scene length, tension, and t
|
|
|
1120
1120
|
|
|
1121
1121
|
**Description:** Audit dialogue for character voice differentiation, attribution clarity, and talking-head detection.
|
|
1122
1122
|
|
|
1123
|
-
**Usage:** `/scr:dialogue-audit`
|
|
1123
|
+
**Usage:** `/scr:dialogue-audit [N]`
|
|
1124
1124
|
|
|
1125
1125
|
**Prerequisites:** Draft must exist with dialogue
|
|
1126
1126
|
|
|
@@ -1139,9 +1139,9 @@ Check that each character sounds distinct, dialogue tags are clear, and scenes a
|
|
|
1139
1139
|
|
|
1140
1140
|
### `/scr:beta-reader`
|
|
1141
1141
|
|
|
1142
|
-
**Description:** Simulate a beta reader's experience of the manuscript
|
|
1142
|
+
**Description:** Simulate a beta reader's experience of the manuscript using a fresh-context reader persona (same model, not a second or external AI).
|
|
1143
1143
|
|
|
1144
|
-
**Usage:** `/scr:beta-reader`
|
|
1144
|
+
**Usage:** `/scr:beta-reader [N] [--focus <area>]`
|
|
1145
1145
|
|
|
1146
1146
|
**Prerequisites:** Draft must exist
|
|
1147
1147
|
|
|
@@ -1163,7 +1163,7 @@ Get a simulated reader's reaction: what hooked them, where they got confused, wh
|
|
|
1163
1163
|
|
|
1164
1164
|
**Description:** Scan drafted prose for AI-generated patterns and unintentional similarity to published works.
|
|
1165
1165
|
|
|
1166
|
-
**Usage:** `/scr:originality-check`
|
|
1166
|
+
**Usage:** `/scr:originality-check [N]`
|
|
1167
1167
|
|
|
1168
1168
|
**Prerequisites:** Draft must exist
|
|
1169
1169
|
|
|
@@ -1259,7 +1259,7 @@ Get three blurb variations: punchy (Amazon listing), standard (back cover), exte
|
|
|
1259
1259
|
|
|
1260
1260
|
**Description:** Generate plot synopsis at specified length for query and submission packages.
|
|
1261
1261
|
|
|
1262
|
-
**Usage:** `/scr:synopsis`
|
|
1262
|
+
**Usage:** `/scr:synopsis [--length <1p|2p|5p>]`
|
|
1263
1263
|
|
|
1264
1264
|
**Prerequisites:** Complete draft must exist
|
|
1265
1265
|
|
|
@@ -1313,7 +1313,7 @@ Generate a full book proposal: overview, market analysis, chapter summaries, aut
|
|
|
1313
1313
|
|
|
1314
1314
|
**Description:** Generate reading group discussion questions exploring themes, characters, and craft.
|
|
1315
1315
|
|
|
1316
|
-
**Usage:** `/scr:discussion-questions`
|
|
1316
|
+
**Usage:** `/scr:discussion-questions [--count <N>]`
|
|
1317
1317
|
|
|
1318
1318
|
**Prerequisites:** Complete draft must exist
|
|
1319
1319
|
|
|
@@ -1478,7 +1478,7 @@ Build a poetry-submission DOCX for journal or contest submission using the poetr
|
|
|
1478
1478
|
|
|
1479
1479
|
**Description:** Run full publishing pipeline unattended with quality gate (voice-check + continuity-check).
|
|
1480
1480
|
|
|
1481
|
-
**Usage:** `/scr:autopilot-publish --preset <preset
|
|
1481
|
+
**Usage:** `/scr:autopilot-publish --preset <preset> [--front-level <minimum|balanced|maximum|skip>] [--back-level <minimum|balanced|maximum|skip>]`
|
|
1482
1482
|
|
|
1483
1483
|
**Prerequisites:** Complete draft must exist
|
|
1484
1484
|
|
|
@@ -1513,7 +1513,7 @@ Commands for generating cover art, scene illustrations, character references, ma
|
|
|
1513
1513
|
- `--trim <size>` -- Preferred trim shorthand for prompt framing
|
|
1514
1514
|
- `--kdp <trim_size>` -- Legacy alias for `--trim`
|
|
1515
1515
|
- `--series` -- Generate series-consistent cover
|
|
1516
|
-
- `--prompt-only` -- Generate prompts without
|
|
1516
|
+
- `--prompt-only` -- Generate prompts without packaging reminders
|
|
1517
1517
|
- `--element` -- Generate specific cover element
|
|
1518
1518
|
|
|
1519
1519
|
**Example:**
|
package/docs/configuration.md
CHANGED
|
@@ -57,22 +57,47 @@ When a writer runs `/scr:new-work`, Scriveno creates `.manuscript/config.json`.
|
|
|
57
57
|
|
|
58
58
|
```json
|
|
59
59
|
{
|
|
60
|
-
"scriveno_version": "2.
|
|
60
|
+
"scriveno_version": "2.6.0",
|
|
61
61
|
"work_type": "<chosen>",
|
|
62
62
|
"group": "<group>",
|
|
63
63
|
"command_unit": "<unit>",
|
|
64
64
|
"developer_mode": false,
|
|
65
65
|
"created_at": "<ISO timestamp>",
|
|
66
|
+
"updated_at": "<ISO timestamp>",
|
|
66
67
|
"autopilot": {
|
|
67
68
|
"enabled": false,
|
|
68
|
-
"profile": "guided"
|
|
69
|
+
"profile": "guided",
|
|
70
|
+
"custom_checkpoints": []
|
|
71
|
+
},
|
|
72
|
+
"voice": {
|
|
73
|
+
"calibrated": false,
|
|
74
|
+
"last_calibration": null,
|
|
75
|
+
"drift_threshold": 0.3
|
|
76
|
+
},
|
|
77
|
+
"draft": {
|
|
78
|
+
"rigor": "standard",
|
|
79
|
+
"context_profile": "standard",
|
|
80
|
+
"pitfalls_enabled": true
|
|
81
|
+
},
|
|
82
|
+
"export": {
|
|
83
|
+
"default_format": "docx_manuscript",
|
|
84
|
+
"include_front_matter": true,
|
|
85
|
+
"include_back_matter": true
|
|
86
|
+
},
|
|
87
|
+
"translation": {
|
|
88
|
+
"source_language": "en",
|
|
89
|
+
"target_languages": []
|
|
90
|
+
},
|
|
91
|
+
"collaboration": {
|
|
92
|
+
"tracks_enabled": false,
|
|
93
|
+
"default_track": "canon"
|
|
69
94
|
}
|
|
70
95
|
}
|
|
71
96
|
```
|
|
72
97
|
|
|
73
98
|
That `scriveno_version` value should track the current package release and the live `/scr:new-work` contract, not an older milestone snapshot.
|
|
74
99
|
|
|
75
|
-
Every project gets those core keys. Additional blocks are added only when the work type requires them.
|
|
100
|
+
Every project gets those core keys and shared blocks (`autopilot`, `voice`, `draft`, `export`, `translation`, `collaboration`). The `voice.drift_threshold` default of 0.3 is the voice-drift gate: drift is `(100 - score) / 100`, so 0.3 offers a re-draft when the voice score falls below 70 (see [Drafter Quality](drafter-quality.md) and `agents/voice-checker.md`). Additional blocks are added only when the work type requires them: a `technical` block for technical writing, top-level sacred profile keys for sacred work types, and `platform` for work types with an inferred publishing target.
|
|
76
101
|
|
|
77
102
|
### Technical writing projects
|
|
78
103
|
|
package/docs/contributing.md
CHANGED
|
@@ -19,7 +19,7 @@ templates/ Base project templates + technical/ and sacred/ variants
|
|
|
19
19
|
templates/technical/ 6 technical-writing context variants
|
|
20
20
|
templates/sacred/ Sacred-specific context templates and tradition manifests
|
|
21
21
|
bin/install.js Multi-platform installer (Node.js)
|
|
22
|
-
docs/ Documentation suite (
|
|
22
|
+
docs/ Documentation suite (25 guides)
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Key principle: the AI agent reads these files at runtime. There is no compilation, no bundling, no transpilation. If you can write markdown, you can contribute.
|
|
@@ -343,7 +343,7 @@ The export command (`commands/scr/export.md`) needs to know about your format. A
|
|
|
343
343
|
|
|
344
344
|
### Step 3: Add CONSTRAINTS.json entry (if restricted)
|
|
345
345
|
|
|
346
|
-
If your export format is only available for certain work types, add an entry to the `"
|
|
346
|
+
If your export format is only available for certain work types, add an entry to the `"exports"` section of CONSTRAINTS.json with an `available` array specifying which work type groups can use it (or `["all"]` for universal formats).
|
|
347
347
|
|
|
348
348
|
## Testing Your Changes
|
|
349
349
|
|
package/docs/drafter-quality.md
CHANGED
|
@@ -104,7 +104,7 @@ Rough guidance for matching settings to model class. The writer's experience wit
|
|
|
104
104
|
| Mid-tier (Sonnet 4.x, GPT-4 mini, Haiku 4.x) | Day-to-day drafting, most novels and screenplays | `standard` | `standard` |
|
|
105
105
|
| Budget (Haiku, GPT-3.5, local 7-13B) | Bulk drafting of short scenes, repetitive structural work | `strict` | `minimal` |
|
|
106
106
|
|
|
107
|
-
If voice fidelity drops below the writer's `voice.drift_threshold
|
|
107
|
+
If voice fidelity drops below the writer's `voice.drift_threshold` (a voice-checker score below 70 at the default 0.3, where drift is `(100 - score) / 100`), the first lever is `rigor: strict`. The second is to step up a model tier. The third is to recalibrate STYLE-GUIDE.md via `/scr:voice-test`.
|
|
108
108
|
|
|
109
109
|
## Token economy
|
|
110
110
|
|
package/docs/release-notes.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
This document is the public-facing summary of what changed between package releases. For package history, see the root [CHANGELOG](../CHANGELOG.md).
|
|
4
4
|
|
|
5
|
+
## 2.6.0 - 2026-05-29
|
|
6
|
+
|
|
7
|
+
### What changed
|
|
8
|
+
|
|
9
|
+
- Fixed a Pandoc-variable mismatch so RTL, CJK, and non-Latin fonts now reach the print and PDF path; added RTL support to the picturebook and stageplay templates (all four interior templates verified with `dir=rtl`).
|
|
10
|
+
- Made the voice-drift gate functional: `agents/voice-checker.md` now defines `drift = (100 - score) / 100`, so the default `voice.drift_threshold` of 0.3 means a re-draft is offered below a voice score of 70.
|
|
11
|
+
- Kept `/scr:autopilot-publish` fully unattended and advisory; a severe voice failure is surfaced loudly rather than halting the run.
|
|
12
|
+
- Corrected `/scr:quick-write` and `/scr:beta-reader` framing to match what they actually do.
|
|
13
|
+
- Marked the translation and illustration API tables as future targets, not shipped behavior.
|
|
14
|
+
- Audited and fixed documentation drift across the suite: command reference usage lines, the configuration baseline, the architecture file tree, voice-dna part numbering, the missing speech work type, and stale counts.
|
|
15
|
+
- Added `lib/track-safety.js` with adversarial tests, and `argument-hint` to 17 commands.
|
|
16
|
+
|
|
17
|
+
### Why it matters
|
|
18
|
+
|
|
19
|
+
This release closes the gap between what Scriveno documented and what it shipped. The export fix makes RTL and non-Latin print output actually work, the voice gate is now a real computed check instead of a phantom threshold, and the documentation no longer claims integrations or behavior that the prompt system does not provide.
|
|
20
|
+
|
|
21
|
+
### Affected areas
|
|
22
|
+
|
|
23
|
+
- export and print templates (RTL, CJK, fonts)
|
|
24
|
+
- voice-checker drift mapping and autopilot gates
|
|
25
|
+
- translation and illustration honesty
|
|
26
|
+
- documentation suite (command reference, configuration, architecture, voice-dna, README)
|
|
27
|
+
- track-safety helper and command argument hints
|
|
28
|
+
- package metadata and release-alignment tests
|
|
29
|
+
|
|
5
30
|
## 2.5.0 - 2026-05-16
|
|
6
31
|
|
|
7
32
|
### What changed
|
package/docs/route-graph.md
CHANGED
|
@@ -13,7 +13,7 @@ The text report summarizes command count, graph edges, agent-capable routes, loc
|
|
|
13
13
|
|
|
14
14
|
## Current Shape
|
|
15
15
|
|
|
16
|
-
As of `2.
|
|
16
|
+
As of `2.6.0`, the route graph contains:
|
|
17
17
|
|
|
18
18
|
- 113 commands
|
|
19
19
|
- intent-order edges from `command_intents`
|
package/docs/translation.md
CHANGED
|
@@ -2,17 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
Scriveno translates your manuscript into any language while preserving your voice. The translation pipeline handles glossary management, translation memory, cultural adaptation, quality verification, and multi-language publishing -- from setup to finished translated editions.
|
|
4
4
|
|
|
5
|
-
This guide covers the full pipeline:
|
|
5
|
+
This guide covers the full pipeline: how translation works, translating your manuscript, managing terminology, verifying quality, and publishing in multiple languages.
|
|
6
6
|
|
|
7
|
-
## Translation
|
|
7
|
+
## Translation approach
|
|
8
8
|
|
|
9
|
-
Scriveno
|
|
9
|
+
Scriveno translates through the in-context translator agent (`agents/translator.md`), not an external translation API. The agent itself handles literary nuance, sacred-text registers, and cultural adaptation that machine-translation services miss. It applies your voice profile, maintains glossary compliance, and can do formal or dynamic equivalence translation. Every unit is translated by the translator agent in fresh context with your STYLE-GUIDE.md loaded.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
**Google Cloud Translation** -- Broad language coverage with 130+ languages. Required for Arabic, Hebrew, Hindi, Swahili, and other languages DeepL does not cover. Best choice for RTL scripts and languages with limited DeepL support.
|
|
14
|
-
|
|
15
|
-
**AI Agent (Claude/GPT)** -- The AI agent itself handles literary nuance, sacred text translation, and cultural adaptation that machine translation APIs miss. It applies your voice profile, maintains glossary compliance, and can do formal/dynamic equivalence translation. This is Scriveno's default for literary content -- every unit is translated by the translator agent with your STYLE-GUIDE.md loaded.
|
|
11
|
+
DeepL and Google Cloud Translation are documented as possible future integration targets, not current behavior. Scriveno does not call either service today; if an automated machine-translation path is added later, this guide will describe how it plugs in.
|
|
16
12
|
|
|
17
13
|
The translator agent works unit by unit in fresh context (just like the drafter), ensuring consistent quality and glossary compliance across the entire manuscript.
|
|
18
14
|
|
|
@@ -171,7 +167,7 @@ The TMX export produces industry-standard Translation Memory eXchange format com
|
|
|
171
167
|
|
|
172
168
|
## Cultural Adaptation
|
|
173
169
|
|
|
174
|
-
|
|
170
|
+
Translation handles words. Cultural adaptation handles meaning. Scriveno flags culturally sensitive content that needs deliberate attention beyond a faithful unit-by-unit rendering.
|
|
175
171
|
|
|
176
172
|
```
|
|
177
173
|
/scr:cultural-adaptation fr
|
|
@@ -247,8 +243,8 @@ Scriveno handles right-to-left and CJK (Chinese, Japanese, Korean) scripts throu
|
|
|
247
243
|
|
|
248
244
|
RTL languages (Arabic, Hebrew, Persian, Urdu) receive special handling:
|
|
249
245
|
|
|
250
|
-
- **Text direction** -- Export commands
|
|
251
|
-
- **Template adjustments** -- The Typst book template reverses inside/outside margins for RTL binding
|
|
246
|
+
- **Text direction** -- Export commands pass the Pandoc `dir` variable (`dir=rtl`); the Typst interior templates read that `dir` variable to orient text
|
|
247
|
+
- **Template adjustments** -- The Typst interior templates honor RTL: the book template reverses inside/outside margins for RTL binding, and the stageplay template flips its binding margin and page-number alignment. The chapbook and picturebook templates set text direction from the `dir` variable.
|
|
252
248
|
- **Font requirements** -- RTL exports need fonts with Arabic/Hebrew glyph support. Scriveno uses system-available fonts by default; specify custom fonts in `.manuscript/config.json`
|
|
253
249
|
- **Punctuation** -- Quotation marks use the appropriate convention (e.g., French-style guillemets for Arabic)
|
|
254
250
|
|
package/docs/voice-dna.md
CHANGED
|
@@ -138,7 +138,7 @@ This section governs the speed and flow of narrative.
|
|
|
138
138
|
- **Between chapters** -- Cliffhangers, echoes, or clean breaks
|
|
139
139
|
- **Time jumps** -- How they're signaled, how frequent, how handled
|
|
140
140
|
|
|
141
|
-
### Part
|
|
141
|
+
### Part 8: Reference Influences
|
|
142
142
|
|
|
143
143
|
This section captures the authors, works, and passages that anchor your voice.
|
|
144
144
|
|
|
@@ -210,7 +210,7 @@ The 10 registers are:
|
|
|
210
210
|
| **Parabolic** | Allegorical, story-within-story | "The kingdom of heaven is like..." concrete daily-life imagery |
|
|
211
211
|
| **Didactic** | Instructional, systematic, expository | Topic-by-topic structure, teacher-student dynamic, Q&A format |
|
|
212
212
|
|
|
213
|
-
Each unit's plan file specifies which register to use. Your STYLE-GUIDE.md Part 8
|
|
213
|
+
Each unit's plan file specifies which register to use. Your STYLE-GUIDE.md "Sacred voice registers" part (Part 8 in the shipped template) describes how YOU handle each register -- the drafter always defers to your personalized register style over the generic descriptions.
|
|
214
214
|
|
|
215
215
|
If no register is specified in a plan file, the drafter defaults to narrative-historical.
|
|
216
216
|
|
|
@@ -276,7 +276,7 @@ See [docs/drafter-quality.md](drafter-quality.md) for the full system, including
|
|
|
276
276
|
### Too many metaphors / not enough metaphors
|
|
277
277
|
|
|
278
278
|
**Symptom:** Prose is either overwritten or too bare.
|
|
279
|
-
**Fix:** Adjust metaphor density in STYLE-GUIDE.md Part
|
|
279
|
+
**Fix:** Adjust metaphor density in STYLE-GUIDE.md Part 3 (vocabulary and figurative language). "Sparse" means one metaphor per page at most. "Dense" means multiple per paragraph. Find your natural density by looking at your existing writing.
|
|
280
280
|
|
|
281
281
|
### AI-sounding hedging
|
|
282
282
|
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// lib/track-safety.js
|
|
2
|
+
// Canonical, dependency-free slug + branch derivation for /scr:track (D-01).
|
|
3
|
+
//
|
|
4
|
+
// The track.md prompt instructs the agent to slugify a writer-provided track
|
|
5
|
+
// label before it ever touches a git or shell command. This module is the
|
|
6
|
+
// single source of truth for that algorithm. The installer copies lib/ into the
|
|
7
|
+
// writer's data dir, so it ships as <data-dir>/lib/track-safety.js and a runtime
|
|
8
|
+
// can derive a guaranteed-safe slug deterministically instead of relying on the
|
|
9
|
+
// model to apply the rules by hand:
|
|
10
|
+
//
|
|
11
|
+
// node <data-dir>/lib/track-safety.js "Editor's Suggestions"
|
|
12
|
+
// -> {"slug":"editors-suggestions","branch":"track/editors-suggestions"}
|
|
13
|
+
//
|
|
14
|
+
// Safety property: a sanitized slug contains only [a-z0-9-]. It can never carry
|
|
15
|
+
// a shell metacharacter, quote, whitespace, path separator, or command
|
|
16
|
+
// substitution, so interpolating `track/<slug>` into a git command line is safe.
|
|
17
|
+
|
|
18
|
+
'use strict';
|
|
19
|
+
|
|
20
|
+
// A slug is shell-safe iff it is a non-empty run of lowercase alphanumerics and
|
|
21
|
+
// hyphens with no leading/trailing hyphen.
|
|
22
|
+
const SLUG_SAFE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
|
|
23
|
+
const FALLBACK_SLUG = 'untitled';
|
|
24
|
+
|
|
25
|
+
// Apply the D-01 rules: lowercase, whitespace/underscores to hyphen, strip
|
|
26
|
+
// everything that is not [a-z0-9-], collapse hyphen runs, trim edge hyphens.
|
|
27
|
+
// Returns FALLBACK_SLUG when the label has no usable characters (e.g. "***",
|
|
28
|
+
// "日本", "") so the caller never produces an empty branch name.
|
|
29
|
+
function sanitizeTrackSlug(label) {
|
|
30
|
+
const slug = String(label == null ? '' : label)
|
|
31
|
+
.toLowerCase()
|
|
32
|
+
.replace(/[\s_]+/g, '-')
|
|
33
|
+
.replace(/[^a-z0-9-]+/g, '')
|
|
34
|
+
.replace(/-+/g, '-')
|
|
35
|
+
.replace(/^-+|-+$/g, '');
|
|
36
|
+
return slug.length > 0 ? slug : FALLBACK_SLUG;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isShellSafeSlug(slug) {
|
|
40
|
+
return typeof slug === 'string' && SLUG_SAFE.test(slug);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Resolve a collision-free branch name. `existingBranches` is the set of branch
|
|
44
|
+
// names already present in the repo (e.g. parsed from `git branch`). Mirrors
|
|
45
|
+
// track.md create-step 6: append -2, -3, ... to the slug until the branch name
|
|
46
|
+
// is free.
|
|
47
|
+
function resolveTrackBranch(label, existingBranches = []) {
|
|
48
|
+
const taken = new Set(existingBranches);
|
|
49
|
+
const baseSlug = sanitizeTrackSlug(label);
|
|
50
|
+
let slug = baseSlug;
|
|
51
|
+
let n = 2;
|
|
52
|
+
while (taken.has(`track/${slug}`)) {
|
|
53
|
+
slug = `${baseSlug}-${n}`;
|
|
54
|
+
n += 1;
|
|
55
|
+
}
|
|
56
|
+
return { slug, branch: `track/${slug}` };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = {
|
|
60
|
+
sanitizeTrackSlug,
|
|
61
|
+
isShellSafeSlug,
|
|
62
|
+
resolveTrackBranch,
|
|
63
|
+
FALLBACK_SLUG,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
if (require.main === module) {
|
|
67
|
+
const label = process.argv[2] || '';
|
|
68
|
+
const existing = process.argv[3]
|
|
69
|
+
? process.argv[3].split(',').map((s) => s.trim()).filter(Boolean)
|
|
70
|
+
: [];
|
|
71
|
+
process.stdout.write(JSON.stringify(resolveTrackBranch(label, existing)) + '\n');
|
|
72
|
+
}
|
package/package.json
CHANGED
package/templates/config.json
CHANGED