scriveno 2.0.6 → 2.0.7

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/aihxp/scriveno/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/scriveno/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-2.0.6-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-2.0.7-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/scriveno.svg)](https://www.npmjs.com/package/scriveno)
7
7
  [![Downloads](https://img.shields.io/npm/dm/scriveno.svg)](https://www.npmjs.com/package/scriveno)
8
8
 
@@ -203,11 +203,11 @@ Scriveno currently ships installer targets for these AI tooling environments:
203
203
 
204
204
  ## Status
205
205
 
206
- **Version:** 2.0.6
206
+ **Version:** 2.0.7
207
207
 
208
- Scriveno's core command surface is stable across 112 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, and installer-marker cleanup work through `2.0.6`. See [Shipped Assets](docs/shipped-assets.md) for the canonical asset inventory and [Runtime Support](docs/runtime-support.md) for the runtime compatibility matrix.
208
+ Scriveno's core command surface is stable across 112 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, and proactive auto-invoke visibility work through `2.0.7`. See [Shipped Assets](docs/shipped-assets.md) for the canonical asset inventory and [Runtime Support](docs/runtime-support.md) for the runtime compatibility matrix.
209
209
 
210
- Version `2.0.6` 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.
210
+ Version `2.0.7` 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.
211
211
 
212
212
  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).
213
213
 
package/bin/install.js CHANGED
@@ -155,6 +155,7 @@ const RUNTIMES = {
155
155
  agents_dir_global: path.join(os.homedir(), '.codex', 'agents'),
156
156
  agents_dir_project: '.codex/agents',
157
157
  skill_style: 'per-command',
158
+ agent_metadata: 'toml',
158
159
  detect: () => fs.existsSync(path.join(os.homedir(), '.codex')),
159
160
  },
160
161
  'opencode': {
@@ -414,6 +415,58 @@ function collectCommandEntries(commandsRoot) {
414
415
  return entries;
415
416
  }
416
417
 
418
+ function stripMarkdownFrontmatter(content) {
419
+ if (typeof content !== 'string' || content.length === 0) return '';
420
+ const stripped = content.charCodeAt(0) === 0xFEFF ? content.slice(1) : content;
421
+ const lines = stripped.split(/\r?\n/);
422
+ if (lines[0] !== '---') return stripped;
423
+ for (let i = 1; i < lines.length; i++) {
424
+ if (lines[i] === '---' || lines[i] === '...') {
425
+ return lines.slice(i + 1).join('\n').replace(/^\n/, '');
426
+ }
427
+ }
428
+ return stripped;
429
+ }
430
+
431
+ function collectAgentEntries(agentsRoot = path.join(PKG_ROOT, 'agents')) {
432
+ if (!fs.existsSync(agentsRoot)) return [];
433
+ const entries = [];
434
+ for (const entry of fs.readdirSync(agentsRoot, { withFileTypes: true })) {
435
+ if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
436
+ const relativePath = entry.name;
437
+ const filePath = path.join(agentsRoot, relativePath);
438
+ const content = fs.readFileSync(filePath, 'utf8');
439
+ const stem = entry.name.replace(/\.md$/, '');
440
+ const frontmatter = readFrontmatterValues(content);
441
+ const name = frontmatter.name || stem;
442
+ const description = frontmatter.description || `${stem.replace(/-/g, ' ')} agent`;
443
+ entries.push({
444
+ name,
445
+ description,
446
+ relativePath,
447
+ metadataFileName: `${name}.toml`,
448
+ content,
449
+ body: stripMarkdownFrontmatter(content),
450
+ });
451
+ }
452
+ entries.sort((a, b) => a.name.localeCompare(b.name));
453
+ return entries;
454
+ }
455
+
456
+ function tomlString(value) {
457
+ return JSON.stringify(String(value));
458
+ }
459
+
460
+ function generateCodexAgentMetadata(entry) {
461
+ return [
462
+ `name = ${tomlString(entry.name)}`,
463
+ `description = ${tomlString(entry.description)}`,
464
+ 'sandbox_mode = "workspace-write"',
465
+ `developer_instructions = ${tomlString(entry.body)}`,
466
+ '',
467
+ ].join('\n');
468
+ }
469
+
417
470
  // Both Claude (flat scr-foo.md filename) and Codex (per-command skill dir
418
471
  // scr-foo/SKILL.md) install commands keyed by the same skill-name function:
419
472
  // /scr:foo and /scr:foo:bar both flatten under commandRefToCodexSkillName by
@@ -1202,6 +1255,64 @@ function writeCodexSkillManifest(skillsDir, skillNames) {
1202
1255
  atomicWriteFileSync(manifestPath, JSON.stringify(manifest, null, 2));
1203
1256
  }
1204
1257
 
1258
+ function isScrivenoCodexAgentMetadataFile(filePath) {
1259
+ if (!fs.existsSync(filePath)) return false;
1260
+ const content = fs.readFileSync(filePath, 'utf8');
1261
+ return content.includes('developer_instructions = ') && (
1262
+ content.includes('# Drafter agent')
1263
+ || content.includes('# Voice checker agent')
1264
+ || content.includes('# Continuity checker agent')
1265
+ || content.includes('# Plan checker agent')
1266
+ || content.includes('# Researcher agent')
1267
+ || content.includes('# Translator agent')
1268
+ );
1269
+ }
1270
+
1271
+ function cleanCodexAgentFiles(agentsDir, currentFileNames) {
1272
+ if (!fs.existsSync(agentsDir)) return 0;
1273
+
1274
+ const manifestPath = path.join(agentsDir, '.scriveno-agents-installed.json');
1275
+ const manifest = readJsonIfExists(manifestPath);
1276
+ const currentFileSet = new Set(currentFileNames);
1277
+ const knownFileNames = new Set(Array.isArray(manifest?.files) ? manifest.files : []);
1278
+
1279
+ for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
1280
+ if (!entry.isFile() || !entry.name.endsWith('.toml')) continue;
1281
+ const filePath = path.join(agentsDir, entry.name);
1282
+ if (isScrivenoCodexAgentMetadataFile(filePath)) {
1283
+ knownFileNames.add(entry.name);
1284
+ }
1285
+ }
1286
+
1287
+ removePathIfExists(manifestPath);
1288
+
1289
+ let removed = 0;
1290
+ for (const fileName of knownFileNames) {
1291
+ if (!currentFileSet.has(fileName) && removePathIfExists(path.join(agentsDir, fileName))) {
1292
+ removed++;
1293
+ }
1294
+ }
1295
+
1296
+ for (const fileName of currentFileNames) {
1297
+ if (removePathIfExists(path.join(agentsDir, fileName))) {
1298
+ removed++;
1299
+ }
1300
+ }
1301
+
1302
+ return removed;
1303
+ }
1304
+
1305
+ function writeCodexAgentManifest(agentsDir, fileNames) {
1306
+ const manifestPath = path.join(agentsDir, '.scriveno-agents-installed.json');
1307
+ const manifest = {
1308
+ installer: 'scriveno',
1309
+ version: VERSION,
1310
+ files: fileNames,
1311
+ generated_at: new Date().toISOString(),
1312
+ };
1313
+ atomicWriteFileSync(manifestPath, JSON.stringify(manifest, null, 2));
1314
+ }
1315
+
1205
1316
  async function main() {
1206
1317
  const parsed = parseArgs(process.argv.slice(2));
1207
1318
  if (parsed.showHelp) {
@@ -1342,6 +1453,26 @@ function installManifestSkillRuntime(runtime, isGlobal, log) {
1342
1453
  log(` ${c('green', 'OK')} ${runtime.label}: ${agentCount} agent prompts -> ${c('dim', path.join(skillsDir, 'agents'))}`);
1343
1454
  }
1344
1455
 
1456
+ function installCodexAgentsWithMetadata(agentsDir) {
1457
+ const agentEntries = collectAgentEntries(path.join(PKG_ROOT, 'agents'));
1458
+ const currentFileNames = agentEntries.flatMap((entry) => [entry.relativePath, entry.metadataFileName]);
1459
+
1460
+ fs.mkdirSync(agentsDir, { recursive: true });
1461
+ const removed = cleanCodexAgentFiles(agentsDir, currentFileNames);
1462
+
1463
+ for (const entry of agentEntries) {
1464
+ atomicWriteFileSync(path.join(agentsDir, entry.relativePath), entry.content);
1465
+ atomicWriteFileSync(path.join(agentsDir, entry.metadataFileName), generateCodexAgentMetadata(entry));
1466
+ }
1467
+ writeCodexAgentManifest(agentsDir, currentFileNames);
1468
+
1469
+ return {
1470
+ agentCount: agentEntries.length,
1471
+ metadataCount: agentEntries.length,
1472
+ removed,
1473
+ };
1474
+ }
1475
+
1345
1476
  function installCodexRuntime(runtime, isGlobal, log) {
1346
1477
  const skillsDir = isGlobal ? runtime.skills_dir_global : path.resolve(runtime.skills_dir_project);
1347
1478
  const commandsDir = isGlobal ? runtime.commands_dir_global : path.resolve(runtime.commands_dir_project);
@@ -1355,7 +1486,6 @@ function installCodexRuntime(runtime, isGlobal, log) {
1355
1486
  removePathIfExists(commandsDir);
1356
1487
  fs.mkdirSync(skillsDir, { recursive: true });
1357
1488
  const removedSkillDirs = cleanCodexSkillDirs(skillsDir, skillNames);
1358
- const removedAgentFiles = cleanMirroredFiles(path.join(PKG_ROOT, 'agents'), agentsDir);
1359
1489
 
1360
1490
  // NOTE: `collectCommandEntries` returns .md files only, and the authoritative
1361
1491
  // `commands/scr/**` tree is .md-only today. No non-.md assets need mirroring.
@@ -1373,7 +1503,7 @@ function installCodexRuntime(runtime, isGlobal, log) {
1373
1503
  commandCount++;
1374
1504
  }
1375
1505
 
1376
- const agentCount = copyDir(path.join(PKG_ROOT, 'agents'), agentsDir);
1506
+ const agentInstall = installCodexAgentsWithMetadata(agentsDir);
1377
1507
 
1378
1508
  for (const entry of commandEntries) {
1379
1509
  const skillDir = path.join(skillsDir, entry.skillName);
@@ -1385,7 +1515,7 @@ function installCodexRuntime(runtime, isGlobal, log) {
1385
1515
 
1386
1516
  log(` ${c('green', 'OK')} ${runtime.label}: ${commandEntries.length} \$scr-* skills -> ${c('dim', skillsDir)}${removedSkillDirs ? c('dim', ` (cleaned ${removedSkillDirs} stale dirs)`) : ''}`);
1387
1517
  log(` ${c('green', 'OK')} ${runtime.label}: ${commandCount} command files -> ${c('dim', commandsDir)}`);
1388
- log(` ${c('green', 'OK')} ${runtime.label}: ${agentCount} agent prompts -> ${c('dim', agentsDir)}${removedAgentFiles ? c('dim', ` (cleaned ${removedAgentFiles} stale files)`) : ''}`);
1518
+ log(` ${c('green', 'OK')} ${runtime.label}: ${agentInstall.agentCount} agent prompts + ${agentInstall.metadataCount} metadata files -> ${c('dim', agentsDir)}${agentInstall.removed ? c('dim', ` (cleaned ${agentInstall.removed} stale files)`) : ''}`);
1389
1519
  }
1390
1520
 
1391
1521
  function installGuidedRuntime(runtime, isGlobal, dataDir, log) {
@@ -1577,16 +1707,23 @@ module.exports = {
1577
1707
  parseArgs,
1578
1708
  resolveInstallRequest,
1579
1709
  collectCommandEntries,
1710
+ collectAgentEntries,
1580
1711
  assertNoSkillNameCollisions,
1581
1712
  cleanCodexSkillDirs,
1713
+ cleanCodexAgentFiles,
1582
1714
  commandRefToCodexSkillName,
1583
1715
  commandRefToClaudeInvocation,
1584
1716
  commandRefToCodexInvocation,
1585
1717
  commandEntryToFlatCommandFileName,
1586
1718
  generateClaudeCommandContent,
1587
1719
  generateCodexCommandContent,
1720
+ generateCodexAgentMetadata,
1588
1721
  rewriteInstalledCommandRefs,
1722
+ installCommandRuntime,
1723
+ installClaudeCommandRuntime,
1724
+ installManifestSkillRuntime,
1589
1725
  installCodexRuntime,
1726
+ installCodexAgentsWithMetadata,
1590
1727
  cleanFlatCommandFiles,
1591
1728
  generateCodexSkill,
1592
1729
  generateSkillManifest,
@@ -182,6 +182,34 @@ If any steps failed, show them in the "Errors" section with actionable fix instr
182
182
 
183
183
  ---
184
184
 
185
+ ## Automation Status
186
+
187
+ Every progress update and final response must include a compact status trail. This is how the writer can tell whether Scriveno auto-chained commands, spawned agents, or only updated local files.
188
+
189
+ ```text
190
+ Automation status:
191
+ Trigger: /scr:autopilot-publish --preset {preset}
192
+ Auto-invoked commands:
193
+ - /scr:voice-check: yes/no
194
+ - /scr:continuity-check: yes/no
195
+ - /scr:front-matter: yes/no
196
+ - /scr:back-matter: yes/no
197
+ - /scr:cover-art: yes/no
198
+ - /scr:export: {count} run(s)
199
+ Spawned agents:
200
+ - voice-checker: {count}
201
+ - continuity-checker: {count}
202
+ Local operations:
203
+ - prerequisite scan: yes/no
204
+ - quality report files written: yes/no
205
+ - export package files written: {count}
206
+ Quality gate:
207
+ - status: warn-only
208
+ - reason: autopilot-publish reports quality findings but continues to export
209
+ ```
210
+
211
+ If a quality command cannot spawn its native agent type, use the installed agent prompt in a fresh context and say `prompt-run fallback used` in the status block.
212
+
185
213
  ## Response Contract
186
214
 
187
215
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -213,6 +213,35 @@ Next Steps:
213
213
  - **NEVER** continue past a blocking error without logging it -- all errors must appear in the completion summary
214
214
  - **NEVER** modify the source manuscript -- translation works on copies in `.manuscript/translation/{lang}/`
215
215
 
216
+ ## Automation Status
217
+
218
+ Every progress update and final response must include a compact status trail. This is how the writer can tell whether Scriveno auto-chained commands, spawned agents, or only updated local files.
219
+
220
+ ```text
221
+ Automation status:
222
+ Trigger: /scr:autopilot-translate {languages}
223
+ Languages: {count}
224
+ Auto-invoked commands per language:
225
+ - /scr:translation-glossary: yes/no
226
+ - /scr:translate: yes/no
227
+ - /scr:translation-memory --build: yes/no
228
+ - /scr:cultural-adaptation: yes/no
229
+ - /scr:back-translate: yes/no
230
+ - /scr:multi-publish: yes/no
231
+ Spawned agents:
232
+ - translator: {count} fresh-context invocation(s)
233
+ Local operations:
234
+ - glossary files written: {count}
235
+ - translation memory files updated: {count}
236
+ - adaptation reports written: {count}
237
+ - export files written: {count}
238
+ Pause:
239
+ - status: none/blocking-error/writer-requested
240
+ - reason: {one sentence}
241
+ ```
242
+
243
+ If the translator native agent type is unavailable, use the installed `agents/translator.md` prompt in a fresh context per unit and say `prompt-run fallback used` in the status block.
244
+
216
245
  ## Response Contract
217
246
 
218
247
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -147,6 +147,35 @@ On pause or stop:
147
147
  2. Include what was just completed and what the next action would be
148
148
  3. Record the writer's notes if they provide any
149
149
 
150
+ ## Automation Status
151
+
152
+ Every progress update and final response must include a compact status trail. This is how the writer can tell whether Scriveno auto-chained commands, spawned agents, or only updated local files.
153
+
154
+ ```text
155
+ Automation status:
156
+ Trigger: /scr:autopilot --profile {profile}
157
+ Profile: guided/supervised/full-auto
158
+ Auto-invoked commands:
159
+ - /scr:discuss N: yes/no
160
+ - /scr:plan N: yes/no
161
+ - /scr:draft N: yes/no
162
+ - /scr:editor-review N: yes/no
163
+ - /scr:submit N: yes/no
164
+ Spawned agents:
165
+ - plan-checker: {count}
166
+ - drafter: {count}
167
+ - voice-checker: {count}
168
+ - continuity-checker: {count}
169
+ Local operations:
170
+ - STATE.md updated: yes/no
171
+ - HISTORY.log updated: yes/no
172
+ Pause:
173
+ - status: none/guided/supervised/quality-gate/blocker
174
+ - reason: {one sentence}
175
+ ```
176
+
177
+ If a command in the chain runs local file operations only, say so under `Local operations` rather than listing it as a spawned agent. If a native agent type is unavailable and an installed prompt-run fallback is used, include that in `Spawned agents`.
178
+
150
179
  ## Response Contract
151
180
 
152
181
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -67,12 +67,34 @@ Load `.manuscript/config.json` to get `work_type`. Load Scriveno's installed/sha
67
67
  </task>
68
68
  </beta_reader_agent>
69
69
 
70
+ If the host runtime cannot spawn a beta reader worker, run the beta reader persona in an isolated fresh context. Report that fallback in the status block.
71
+
70
72
  ### OUTPUT
71
73
 
72
74
  Save to `.manuscript/{act_num}-BETA-READER-NOTES.md`
73
75
 
74
76
  Present findings conversationally to the writer -- this should feel like getting feedback from a trusted reader, not a technical report.
75
77
 
78
+ ## Agent Status
79
+
80
+ Every response must include a short status block that makes invocation visible:
81
+
82
+ ```text
83
+ Agent status:
84
+ Trigger: /scr:beta-reader {scope}
85
+ Spawned agents:
86
+ - beta-reader: 1 fresh-context reader invocation
87
+ Local operations:
88
+ - drafted files checked: {count}
89
+ - focus area applied: yes/no
90
+ - report written: yes/no
91
+ Auto-invoked:
92
+ - none
93
+ Why: beta-reader is experiential feedback only; revision remains a writer decision
94
+ ```
95
+
96
+ If native worker spawning is unavailable, say `prompt-run fallback used` in the status block.
97
+
76
98
  ## Response Contract
77
99
 
78
100
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -27,6 +27,8 @@ Invoke the installed `continuity-checker.md` agent for the writer's active Scriv
27
27
  - DOCTRINES.md, LINEAGES.md, and CHRONOLOGY.md when present (sacred only)
28
28
  - The previous continuity report if one exists, so the agent can verify resolved issues stayed resolved instead of re-flagging them
29
29
 
30
+ If the host runtime cannot spawn a native `continuity-checker` agent type, load the installed `agents/continuity-checker.md` prompt from the active runtime and run it in an isolated fresh context. Record that fallback in the status block.
31
+
30
32
  The agent reads all drafted scenes and checks:
31
33
 
32
34
  If RECORD.md contradicts the drafted text, flag the mismatch as a RECORD drift finding. If the drafted text reveals established facts or open threads that are missing from RECORD.md, list compact suggested updates under a "Record updates" section without rewriting the file unless the writer asked for fixes.
@@ -105,6 +107,25 @@ For each issue:
105
107
 
106
108
  Save to `.manuscript/{act_num}-CONTINUITY-REPORT.md` or `.manuscript/FULL-CONTINUITY-REPORT.md`. For technical work types, use `CONSISTENCY-REPORT` in the writer-facing title even if the file path stays the same.
107
109
 
110
+ ## Agent Status
111
+
112
+ Every response must include a short status block that makes invocation visible:
113
+
114
+ ```text
115
+ Agent status:
116
+ Trigger: /scr:continuity-check {scope}
117
+ Spawned agents:
118
+ - continuity-checker: 1 fresh-context diagnostic invocation
119
+ Local operations:
120
+ - drafted files checked: {count}
121
+ - RECORD.md checked: yes/no
122
+ - prior report checked: yes/no
123
+ - report written: yes/no
124
+ Auto-invoked:
125
+ - none
126
+ Why: continuity-check is diagnostic only; fixes are writer-chosen handoffs
127
+ ```
128
+
108
129
  ## Response Contract
109
130
 
110
131
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -53,6 +53,27 @@ Require `.manuscript/plans/{N}-*-PLAN.md` files to exist. If none exist, also ch
53
53
 
54
54
  8. **Tell the writer:** "Drafted {unit} {N}: X words across Y {atomic_units}. Voice consistency: Z%. Updated RECORD.md with what the draft established. Ready for editor review? Run `/scr:editor-review N` or `/scr:next`."
55
55
 
56
+ ## Agent and Automation Status
57
+
58
+ Every response must include a short status block that makes invocation visible:
59
+
60
+ ```text
61
+ Agent status:
62
+ Trigger: /scr:draft N
63
+ Spawned agents:
64
+ - drafter: {count} fresh-context invocation(s)
65
+ - voice-checker: 1 diagnostic pass, or none if no draft was produced
66
+ Local operations:
67
+ - draft files written: {count}
68
+ - RECORD.md updated: yes/no
69
+ - STATE.md updated: yes/no
70
+ Auto-invoked:
71
+ - /scr:editor-review N: yes/no
72
+ Why: {autopilot.enabled true, full-auto profile, supervised pause, or writer-facing manual mode}
73
+ ```
74
+
75
+ If the host runtime cannot spawn a native `drafter` or `voice-checker` agent type, load the installed agent prompt from the active runtime's `agents/` directory and run it in an isolated fresh context. In the status block, write `Spawned agents: native unavailable; prompt-run fallback used` so the writer can see what happened.
76
+
56
77
  ## History log
57
78
 
58
79
  After all atomic units in this invocation are drafted, append one line to `.manuscript/HISTORY.log` per `docs/history-protocol.md`:
@@ -101,6 +101,8 @@ For any issues flagged, spawn a diagnostic agent:
101
101
  </task>
102
102
  </diagnostic_agent>
103
103
 
104
+ If the host runtime cannot spawn a dedicated diagnostic worker, run the revision diagnosis in an isolated fresh context for each flagged issue group. Report that fallback in the status block.
105
+
104
106
  ---
105
107
 
106
108
  ### STEP 4: GENERATE EDITOR NOTES
@@ -408,6 +410,30 @@ Together these form a complete accountability trail. Neither party's work is los
408
410
 
409
411
  ---
410
412
 
413
+ ## Agent and Automation Status
414
+
415
+ Every response must include a short status block that makes invocation visible:
416
+
417
+ ```text
418
+ Agent status:
419
+ Trigger: /scr:editor-review {mode}
420
+ Spawned agents:
421
+ - revision-diagnostic: {count} fresh-context invocation(s)
422
+ Local operations:
423
+ - reviewable units checked: {count}
424
+ - review report written: yes/no
425
+ - proposal decisions written: yes/no
426
+ - editor notes written: yes/no
427
+ - writer responses written: yes/no
428
+ Auto-invoked:
429
+ - none
430
+ Why: editor-review surfaces decisions and recommended handoffs; it does not revise prose without writer choice
431
+ ```
432
+
433
+ If there were no flagged issues in standard review mode, report `revision-diagnostic: none`. In collaboration modes, report `revision-diagnostic: none` unless diagnosis was explicitly requested.
434
+
435
+ ---
436
+
411
437
  ## Writer-Friendly Language Guide
412
438
 
413
439
  This command uses writer-friendly terminology throughout:
@@ -7,6 +7,8 @@ argument-hint: "[--repair]"
7
7
 
8
8
  You are a project health checker. Diagnose problems in the current Scriveno project and optionally fix what can be auto-fixed.
9
9
 
10
+ Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:health` is local and diagnostic. It does not spawn agents.
11
+
10
12
  ## Diagnostic mode (default, no flags)
11
13
 
12
14
  Run these checks in order and report results with status indicators:
@@ -85,6 +87,23 @@ With `--repair`, fix what can be auto-fixed:
85
87
 
86
88
  After repair: re-run diagnostics and show the updated health report.
87
89
 
90
+ ## Automation Status
91
+
92
+ Every response must include a compact status block:
93
+
94
+ ```text
95
+ Automation status:
96
+ Trigger: /scr:health {flags}
97
+ Spawned agents:
98
+ - none
99
+ Local operations:
100
+ - health checks run: {count}
101
+ - repairs applied: {count}
102
+ Auto-invoked:
103
+ - none
104
+ Why: health uses deterministic local checks; non-deterministic repairs stay manual
105
+ ```
106
+
88
107
  ## Response Contract
89
108
 
90
109
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -98,6 +98,8 @@ Spawn 6 parallel analysis agents:
98
98
  </agent>
99
99
  </analysis_agents>
100
100
 
101
+ If the host runtime cannot spawn these named analysis workers in parallel, run each selected analysis in an isolated fresh context sequentially. Report that fallback clearly. These analysis roles are command-local workers, not installed Scriveno agent prompt files.
102
+
101
103
  ### OUTPUT
102
104
 
103
105
  Save all analysis files to `.manuscript/analysis/`
@@ -110,6 +112,30 @@ Present a summary to the writer showing:
110
112
 
111
113
  This analysis is automatically loaded by `/scr:new-work` and `/scr:new-revision` when it exists.
112
114
 
115
+ ## Agent and Automation Status
116
+
117
+ Every response must include a short status block that makes invocation visible:
118
+
119
+ ```text
120
+ Agent status:
121
+ Trigger: /scr:map-manuscript {area}
122
+ Spawned agents:
123
+ - voice-analyst: yes/no
124
+ - structure-analyst: yes/no
125
+ - character-analyst: yes/no
126
+ - theme-analyst: yes/no
127
+ - world-analyst: yes/no
128
+ - pacing-analyst: yes/no
129
+ Local operations:
130
+ - manuscript files read: {count}
131
+ - analysis files written: {count}
132
+ Auto-invoked:
133
+ - none
134
+ Why: map-manuscript produces analysis artifacts that later commands load when present
135
+ ```
136
+
137
+ If parallel worker spawning is unavailable, say `parallel unavailable; sequential isolated analysis used` in the status block.
138
+
113
139
  ## Response Contract
114
140
 
115
141
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -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.0.6",
72
+ "scriveno_version": "2.0.7",
73
73
  "work_type": "<chosen>",
74
74
  "group": "<group>",
75
75
  "command_unit": "<unit>",
@@ -6,6 +6,8 @@ description: Auto-detect what to do next in your workflow and run it. The one co
6
6
 
7
7
  You are routing the writer to the right next step in their workflow. This command is the universal interface -- a writer who only ever types `/scr:next` should be able to complete an entire novel.
8
8
 
9
+ Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:next` is Level 1 only by default: it may inspect disk state and suggest the safest next command, but it does not spawn agents or mutate files unless autopilot mode explicitly routes into another command.
10
+
9
11
  ## What to do
10
12
 
11
13
  1. **Check for `.manuscript/` directory.** If none, the writer has no project. Run `/scr:new-work` to start one (or tell them to).
@@ -32,6 +34,25 @@ You are routing the writer to the right next step in their workflow. This comman
32
34
  - "Chapter 4 has a plan but no draft yet -- drafting it."
33
35
  - "You haven't discussed the next chapter -- shaping Chapter 5."
34
36
 
37
+ 8. **Run the proactive sweep before choosing the final route.** This is read-only unless autopilot mode has already taken over:
38
+ - Check whether `CONTEXT.md` is missing, stale, or older than STATE.md or the newest draft.
39
+ - Check whether `HISTORY.log` is missing or the last command failed.
40
+ - Check whether voice, continuity, editor-review, beta-reader, or translation reports contain unresolved items.
41
+ - Check whether translation folders, target language config, editor notes, track proposals, stale exports, or unsaved manuscript changes imply a better next command than the linear lifecycle.
42
+ - Check whether STATE.md and disk disagree enough that `/scr:scan` should be recommended first.
43
+
44
+ Display a compact proactive block when any signal changes the recommendation:
45
+
46
+ ```text
47
+ Proactive checks:
48
+ State: <fresh | stale, suggest /scr:scan>
49
+ Session: <fresh | context stale, suggest /scr:resume-work>
50
+ Reviews: <none | N pending, suggest review command>
51
+ Translation: <none | follow-up available>
52
+ Export: <fresh | stale, suggest /scr:export>
53
+ Save: <clean | unsaved manuscript changes, suggest /scr:save>
54
+ ```
55
+
35
56
  ## Routing logic
36
57
 
37
58
  Use the core writing lifecycle as the default map:
@@ -93,6 +114,25 @@ Use progressive surfacing rules:
93
114
  - **Non-blocking craft question or watchpoint** -- If only `QUESTION: Non-blocking`, `HUNCH`, or `WATCHPOINT` items remain, allow the next draft or review step and mention the watchpoint in one sentence.
94
115
  - **Autopilot mode** -- If config has `autopilot.enabled: true`, run multiple steps in sequence without asking, pausing only per the profile's rules (guided, supervised, full-auto).
95
116
 
117
+ ## Agent and Automation Status
118
+
119
+ Every `/scr:next` response must include a short status block when it inspected proactive signals or handed off to another command:
120
+
121
+ ```text
122
+ Automation status:
123
+ Trigger: /scr:next
124
+ Spawned agents:
125
+ - none
126
+ Local operations:
127
+ - proactive sweep: read-only
128
+ - state route computed: yes/no
129
+ Auto-invoked:
130
+ - <recommended command>: yes/no
131
+ Why: /scr:next routes from disk state; it only runs follow-up commands under autopilot or explicit writer intent
132
+ ```
133
+
134
+ If autopilot causes `/scr:next` to run another command, the follow-up command must provide its own agent or automation status block.
135
+
96
136
  ## Adaptive naming
97
137
 
98
138
  Use canonical runnable commands, and adapt the terminology in prompts/output for the current work type. If `command_unit` is `surah`, run `/scr:draft` and frame the work as drafting a surah; keep the command id stable and treat unit labels as presentation only.
@@ -78,12 +78,34 @@ Require `{N}-CONTEXT.md` to exist (from discuss phase). If it doesn't, offer to
78
78
 
79
79
  7. **Update STATE.md** and suggest: "Ready to draft? Run `/scr:draft N`." (Suppress the draft suggestion if any plan came back NEEDS REVISION; suggest addressing the flagged items first.)
80
80
 
81
+ If `.manuscript/config.json` has `autopilot.enabled: true`, all plan checks are READY, and the active profile is `full-auto`, immediately proceed to `/scr:draft N` instead of stopping at a suggestion. In `supervised`, pause here and show the plan-check summary before drafting. In `guided`, ask for approval before drafting.
82
+
81
83
  8. **Append one line to `.manuscript/HISTORY.log`** per `docs/history-protocol.md`:
82
84
  ```
83
85
  {ISO timestamp} | scr:plan | unit={N} | atomic-units={count} | check={READY|N-flagged} | outcome=ok
84
86
  ```
85
87
  If the run failed, use `outcome=failed:<short-reason>` instead. Create HISTORY.log if it does not exist.
86
88
 
89
+ ## Agent and Automation Status
90
+
91
+ Every response must include a short status block that makes invocation visible:
92
+
93
+ ```text
94
+ Agent status:
95
+ Trigger: /scr:plan N
96
+ Spawned agents:
97
+ - plan-checker: {count} fresh-context invocation(s)
98
+ Local operations:
99
+ - plan files written: {count}
100
+ - STATE.md updated: yes/no
101
+ - HISTORY.log updated: yes/no
102
+ Auto-invoked:
103
+ - /scr:draft N: yes/no
104
+ Why: {all plans READY plus full-auto, supervised pause, guided approval needed, or plan check blocked}
105
+ ```
106
+
107
+ If the host runtime cannot spawn a native `plan-checker` agent type, load the installed `agents/plan-checker.md` prompt from the active runtime and run it in an isolated fresh context. In the status block, write `Spawned agents: native unavailable; prompt-run fallback used`.
108
+
87
109
  ## Response Contract
88
110
 
89
111
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -7,6 +7,8 @@ argument-hint: ""
7
7
 
8
8
  You are showing the writer their current project progress.
9
9
 
10
+ Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:progress` is read-only: it can count, compare, and recommend, but it must not spawn agents or write files.
11
+
10
12
  ## Prerequisites
11
13
 
12
14
  - `.manuscript/STATE.md` must exist
@@ -22,6 +24,29 @@ You are showing the writer their current project progress.
22
24
  - "{word_count} words so far."
23
25
  - "{open_threads} open record threads." (only when RECORD.md exists)
24
26
  - "Next: {next_action}"
27
+ 6. Run the Level 1 proactive sweep:
28
+ - If STATE.md counts disagree with draft files, suggest `/scr:scan`.
29
+ - If reports show unresolved review items, suggest the matching review command.
30
+ - If exports are stale, suggest `/scr:export` or `/scr:publish`.
31
+ - If translation work exists and follow-up reports are missing, suggest the next translation check.
32
+ - If unsaved manuscript changes exist, suggest `/scr:save`.
33
+
34
+ ## Automation Status
35
+
36
+ Every response must include a compact status block:
37
+
38
+ ```text
39
+ Automation status:
40
+ Trigger: /scr:progress
41
+ Spawned agents:
42
+ - none
43
+ Local operations:
44
+ - progress counts computed: yes/no
45
+ - proactive sweep: read-only
46
+ Auto-invoked:
47
+ - none
48
+ Why: progress is read-only; it recommends next commands without mutating files
49
+ ```
25
50
 
26
51
  ## Response Contract
27
52
 
@@ -43,6 +43,8 @@ If `--discuss`: Ask 3-5 targeted questions about tone, pacing, and purpose for t
43
43
 
44
44
  If `--research`: Spawn a focused researcher for technique guidance.
45
45
 
46
+ If the host runtime cannot spawn a focused researcher, run the research pass in an isolated fresh context and report `prompt-run fallback used` in the status block.
47
+
46
48
  ### STEP 3: DRAFT
47
49
 
48
50
  Write the passage following all established style guide constraints. Target whatever length feels natural unless the writer specified a target.
@@ -58,6 +60,27 @@ Save plan (if generated) to `.manuscript/quick/{NNN}-{slug}/PLAN.md`
58
60
 
59
61
  Commit: `quick: {slug}`
60
62
 
63
+ ## Agent and Automation Status
64
+
65
+ Every response must include a short status block that makes invocation visible:
66
+
67
+ ```text
68
+ Agent status:
69
+ Trigger: /scr:quick-write {flags}
70
+ Spawned agents:
71
+ - researcher: yes/no
72
+ Local operations:
73
+ - context files loaded: {count}
74
+ - draft file written: yes/no
75
+ - plan file written: yes/no
76
+ Auto-invoked:
77
+ - /scr:continuity-check: yes/no
78
+ - /scr:voice-check: yes/no
79
+ Why: --full runs verification after drafting; --research spawns a focused technique pass
80
+ ```
81
+
82
+ In default mode, report `researcher: none` and both auto-invoked checks as `no`.
83
+
61
84
  ## Response Contract
62
85
 
63
86
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -7,6 +7,8 @@ argument-hint: "[optional message]"
7
7
 
8
8
  You are saving the writer's current work. Your job is to create a git commit with a writer-friendly message, without exposing any git terminology.
9
9
 
10
+ Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:save` does not spawn agents. It owns safe local helpers for `STATE.md`, `CONTEXT.md`, and `HISTORY.log`, then saves `.manuscript/`.
11
+
10
12
  ## What to do
11
13
 
12
14
  1. **Check for `.manuscript/` directory.** If missing: "No manuscript found. Start with `/scr:new-work`."
@@ -69,6 +71,25 @@ You are saving the writer's current work. Your job is to create a git commit wit
69
71
 
70
72
  10. **Tell the writer** the result (see output section below).
71
73
 
74
+ ## Automation Status
75
+
76
+ Every response must include a compact status block:
77
+
78
+ ```text
79
+ Automation status:
80
+ Trigger: /scr:save
81
+ Spawned agents:
82
+ - none
83
+ Local operations:
84
+ - STATE.md updated: yes/no
85
+ - CONTEXT.md regenerated: yes/no
86
+ - HISTORY.log appended: yes/no
87
+ - manuscript files saved: yes/no
88
+ Auto-invoked:
89
+ - /scr:next route computed for CONTEXT.md: yes/no
90
+ Why: save uses deterministic local bookkeeping, not a spawned agent
91
+ ```
92
+
72
93
  ## Writer mode output
73
94
 
74
95
  - **Writer mode** (`developer_mode: false`): "Saved. You can see your save history with `/scr:history`."
@@ -7,6 +7,8 @@ argument-hint: "[--fix] [--quiet]"
7
7
 
8
8
  You are the project's drift detector. Trust nothing. Compare what `.manuscript/STATE.md`, `OUTLINE.md`, `RECORD.md`, `config.json`, and the various structural files **claim** against what the filesystem actually contains, and report every mismatch.
9
9
 
10
+ Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:scan` does not spawn agents. It may run deterministic local checks and, under `--fix` after confirmation, deterministic local repairs.
11
+
10
12
  This is the defense against context corruption. A fresh Claude session, a writer who hand-edited files between sessions, an interrupted command, or a partial revert can all leave the project in an internally inconsistent state. STATE.md says 12 units drafted; the disk has 14. OUTLINE.md lists "Chapter 8" but no draft file exists. RECORD.md says a promise is still open but the draft paid it off. STYLE-GUIDE.md was edited yesterday but no voice-check has run since. `/scr:scan` finds those.
11
13
 
12
14
  This complements `/scr:health` (which fixes structural issues like missing directories) and `/scr:resume-work` (which reads recorded state). `/scr:scan` interrogates whether the recorded state is true.
@@ -261,6 +263,24 @@ After any auto-fix, append a single line to HISTORY.log per `docs/history-protoc
261
263
 
262
264
  ---
263
265
 
266
+ ## Automation Status
267
+
268
+ Every response must include a compact status block:
269
+
270
+ ```text
271
+ Automation status:
272
+ Trigger: /scr:scan {flags}
273
+ Spawned agents:
274
+ - none
275
+ Local operations:
276
+ - drift checks run: {count}
277
+ - auto-fixes applied: {count}
278
+ - HISTORY.log appended: yes/no
279
+ Auto-invoked:
280
+ - none
281
+ Why: scan compares disk state locally; fixes require writer confirmation
282
+ ```
283
+
264
284
  ## Response Contract
265
285
 
266
286
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -7,6 +7,8 @@ argument-hint: ""
7
7
 
8
8
  You are summarizing the writer's current session. Your job is to compute actionable metrics from STATE.md and present them clearly.
9
9
 
10
+ Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:session-report` is read-only and does not spawn agents.
11
+
10
12
  ## What to do
11
13
 
12
14
  1. **Read STATE.md "Last actions" table** to get the full history of actions.
@@ -44,6 +46,23 @@ Present the report in this format:
44
46
  | 3:15 PM | Editor review complete |
45
47
  ```
46
48
 
49
+ ## Automation Status
50
+
51
+ Every response must include a compact status block:
52
+
53
+ ```text
54
+ Automation status:
55
+ Trigger: /scr:session-report
56
+ Spawned agents:
57
+ - none
58
+ Local operations:
59
+ - session metrics computed: yes/no
60
+ - quality pass summary computed: yes/no
61
+ Auto-invoked:
62
+ - none
63
+ Why: session-report summarizes disk state without mutating files
64
+ ```
65
+
47
66
  ## Edge cases
48
67
 
49
68
  - **No actions this session:** If the Last actions table is empty or has no entries after the last pause/resume marker, say: "Nothing to report yet. Start working with `/scr:next`."
@@ -7,7 +7,7 @@ argument-hint: "[--check] [--apply] [--runtime <key>] [--detected] [--global|--p
7
7
 
8
8
  You are synchronizing Scriveno's installed agent surfaces with the current Scriveno source tree.
9
9
 
10
- This command is for local runtime drift: Codex skills, Codex command mirrors, Claude command files, Cursor command files, and agent prompts that no longer match the source files in the Scriveno package or repo.
10
+ This command is for local runtime drift: Codex skills, Codex command mirrors, Claude Code command files, command-directory runtimes, skills runtimes, guided setup assets, and agent prompts that no longer match the source files in the Scriveno package or repo.
11
11
 
12
12
  This is not a package upgrade command. Do not fetch a newer Scriveno release, do not change npm dependencies, and do not modify manuscript content. If the writer wants a newer published package version, that belongs to a future `/scr:update` command.
13
13
 
@@ -47,9 +47,15 @@ If you cannot find a Scriveno source root, stop and explain that `/scr:sync` nee
47
47
  - GitHub Copilot: `~/.github/commands/scr/`, `~/.github/agents/`
48
48
  - Windsurf: `~/.windsurf/commands/scr/`, `~/.windsurf/agents/`
49
49
  - Antigravity: `~/.gemini/antigravity/commands/scr/`, `~/.gemini/antigravity/agents/`
50
+ - Manus Desktop: `~/.manus/skills/scriveno/SKILL.md` plus mirrored `commands/scr/` and `agents/` inside that skill bundle
51
+ - Perplexity Desktop: `~/.scriveno/perplexity/SETUP.md` and `connector-command.txt`
52
+ - Generic skills fallback: `~/.scriveno/skills/SKILL.md` plus mirrored `commands/scr/` and `agents/`
50
53
  4. Compare source files against installed files:
51
54
  - Compare command counts.
52
55
  - Compare a representative hash set for `commands/scr/autopilot.md`, `commands/scr/next.md`, `commands/scr/scan.md`, `commands/scr/sync.md`, and all generated Codex `SKILL.md` wrappers when present.
56
+ - Check that Claude Code flat commands include `/scr-*` invocation rewrites and source-marker behavior after reinstall.
57
+ - Check that standard command-directory runtimes preserve nested command paths under their `commands/scr/` directory.
58
+ - Check that skills runtimes include `SKILL.md`, mirrored commands, and mirrored agent prompts inside their skill bundle.
53
59
  - Check that installed Codex commands include current response-contract and source-marker behavior after reinstall.
54
60
  - Report each runtime as `current`, `stale`, `missing`, or `unknown`.
55
61
  5. Decide mode:
@@ -70,15 +76,57 @@ Adjust flags from the command arguments:
70
76
  7. After applying, verify:
71
77
  - Re-read installed command counts.
72
78
  - Confirm `sync.md` is installed for each target runtime.
79
+ - For Claude Code, confirm `scr-sync.md` exists and installed agent prompts are present in the chosen `agents/` directory.
80
+ - For standard command-directory runtimes, confirm `commands/scr/sync.md` and installed agent prompts are present.
81
+ - For skills runtimes, confirm `SKILL.md`, `commands/scr/sync.md`, and bundled agent prompts are present.
82
+ - For Perplexity Desktop, confirm the setup guide and connector recipe are present.
73
83
  - For Codex, confirm both `~/.codex/commands/scr/sync.md` and `~/.codex/skills/scr-sync/SKILL.md` exist in the chosen scope.
84
+ - For Codex, confirm installed Scriveno agents have matching `.toml` metadata files in the chosen `agents/` directory when the Codex runtime supports agent metadata.
74
85
  - Confirm no stale runtime files remain in the checked target set.
75
- 8. Report:
86
+ 8. Report a compact sync status trail:
76
87
  - Source version
77
88
  - Runtime targets checked
78
89
  - Runtime targets updated
79
90
  - Any skipped targets and why
91
+ - Trigger: `check`, `apply`, or `prompted apply`
92
+ - Agent: `none` for this command
93
+ - Engine: `bin/install.js` when applying, or `hash/count comparison` when checking only
94
+ - Local operations: command files compared, Claude flat commands checked, standard command directories checked, skills manifests checked, guided setup assets checked, agent prompts checked, Codex skills checked, Codex command mirrors checked, Codex agent metadata checked when applicable
95
+ - Result counts: commands, skills, agent prompts, metadata files, stale files removed, and skipped targets
80
96
  - Suggested project-level follow-up with `/scr:scan`
81
97
 
98
+ Use this report shape:
99
+
100
+ ```text
101
+ Sync status:
102
+ Trigger: /scr:sync --apply --detected --global --developer
103
+ Agent: none
104
+ Why: runtime sync is installer-driven, not a writing or review agent task
105
+ Engine: bin/install.js
106
+ Checked:
107
+ - commands: 112 source, 112 installed
108
+ - Claude Code flat commands: 112 installed
109
+ - standard command directories: current
110
+ - skills manifests: current
111
+ - guided setup assets: current
112
+ - Codex skills: 112 installed
113
+ - agent prompts: 6 installed
114
+ - Codex agent metadata: 6 installed
115
+ Updated:
116
+ - Claude Code command files
117
+ - standard command directories
118
+ - skills manifests
119
+ - guided setup assets
120
+ - Codex command mirrors
121
+ - Codex skills
122
+ - Codex agent prompts
123
+ - Codex agent metadata
124
+ Skipped:
125
+ - none
126
+ ```
127
+
128
+ If no files were changed, keep the same shape and set `Updated: none`. If an agent was not spawned, always say `Agent: none` and explain why.
129
+
82
130
  ## Safety Rules
83
131
 
84
132
  - Only overwrite Scriveno-owned installed runtime files.
@@ -494,6 +494,26 @@ For standard revision tracks where only the track has changes (canon is unmodifi
494
494
 
495
495
  The `.manuscript/merge-log.json` file accumulates entries from every co-writing merge. Each entry preserves both versions of contradictory passages, the resolution chosen, and any reconciled text. This provides a history of how parallel work was integrated and supports future continuity auditing.
496
496
 
497
+ ### Automation Status
498
+
499
+ Every `track merge` response must include a compact status block:
500
+
501
+ ```text
502
+ Automation status:
503
+ Trigger: /scr:track merge {track}
504
+ Auto-invoked:
505
+ - /scr:continuity-check equivalent: yes/no
506
+ Spawned agents:
507
+ - continuity-checker: yes/no
508
+ Local operations:
509
+ - track metadata checked: yes/no
510
+ - canon and track changes compared: yes/no
511
+ - merge log updated: yes/no
512
+ Why: co-writing or parallel canon changes require continuity verification before accepting revisions
513
+ ```
514
+
515
+ If continuity verification did not run, say why: standard revision track, canon unchanged, or writer cancelled before merge. If native `continuity-checker` spawning is unavailable, use the installed prompt in an isolated fresh context and report `prompt-run fallback used`.
516
+
497
517
  ---
498
518
 
499
519
  ## Writer-Friendly Language Guide
@@ -171,6 +171,8 @@ Invoke the translator agent (`agents/translator.md`) with fresh context, providi
171
171
 
172
172
  **Fresh context per unit is mandatory.** Each translator invocation is independent -- this prevents translation drift, glossary inconsistency, and register collapse across a long manuscript.
173
173
 
174
+ If the host runtime cannot spawn a native `translator` agent type, load the installed `agents/translator.md` prompt from the active runtime and run it in an isolated fresh context. Record that fallback in the status block.
175
+
174
176
  **5d. Post-unit processing:**
175
177
 
176
178
  After each unit translation:
@@ -214,6 +216,29 @@ After all units are translated, show a summary:
214
216
  > - Back-translate to verify: `/scr:back-translate [lang]`
215
217
  > - Export translation: `/scr:export --format [format] --language [lang]`
216
218
 
219
+ ## Agent and Automation Status
220
+
221
+ Every response must include a short status block that makes invocation visible:
222
+
223
+ ```text
224
+ Agent status:
225
+ Trigger: /scr:translate {language}
226
+ Spawned agents:
227
+ - translator: {count} fresh-context invocation(s)
228
+ Local operations:
229
+ - glossary loaded: yes/no
230
+ - translation memory loaded: yes/no
231
+ - units written: {count}
232
+ - new glossary terms flagged: {count}
233
+ Auto-invoked:
234
+ - /scr:translation-memory {language} --build: yes/no
235
+ - /scr:cultural-adaptation {language}: yes/no
236
+ - /scr:back-translate {language}: yes/no
237
+ Why: {manual translation mode, autopilot-translate phase, or writer requested chained verification}
238
+ ```
239
+
240
+ Plain `/scr:translate` does not auto-run translation memory, cultural adaptation, or back-translation unless the writer requested a chained verification or the command is being run inside `/scr:autopilot-translate`. Show `Auto-invoked: no` for those follow-up checks in manual mode.
241
+
217
242
  ## Response Contract
218
243
 
219
244
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -45,6 +45,8 @@ Spawn the voice-checker agent (`agents/voice-checker.md`) with:
45
45
  - The scoped drafted prose (unit `N` or all units)
46
46
  - If available, previously approved units as reference anchors for comparison
47
47
 
48
+ If the host runtime cannot spawn a native `voice-checker` agent type, load the installed `agents/voice-checker.md` prompt from the active runtime and run it in an isolated fresh context. Record that fallback in the status block.
49
+
48
50
  Because STYLE-GUIDE.md is present, this is voice-deviation framing: the agent measures deviation *from* the writer's voice, not against a generic ideal. An authentic writer habit is not a tell for that writer even when a generic catalog would flag it; STYLE-GUIDE.md wins.
49
51
 
50
52
  The voice-checker agent runs its diagnostic discipline: a scrutiny pre-check (match scrutiny to evidence density; low density biases hard toward a high score), a mandatory false-positive audit with veto power (lone weak signals dropped without lowering the score; strong false positives reclassified as human markers that raise it), and an internal-consistency check (sharp register or sophistication seams flagged against the document's own baseline). It performs deep analysis across four dimensions:
@@ -109,6 +111,24 @@ Save the full report to `.manuscript/{scope}-VOICE-CHECK-REPORT.md` where `{scop
109
111
 
110
112
  Present the score, status, and top issues to the writer. Offer to show the full report.
111
113
 
114
+ ## Agent Status
115
+
116
+ Every response must include a short status block that makes invocation visible:
117
+
118
+ ```text
119
+ Agent status:
120
+ Trigger: /scr:voice-check {scope}
121
+ Spawned agents:
122
+ - voice-checker: 1 fresh-context diagnostic invocation
123
+ Local operations:
124
+ - STYLE-GUIDE.md loaded: yes/no
125
+ - drafted files checked: {count}
126
+ - report written: yes/no
127
+ Auto-invoked:
128
+ - none
129
+ Why: voice-check is diagnostic only; fixes are writer-chosen handoffs
130
+ ```
131
+
112
132
  ## Response Contract
113
133
 
114
134
  Every writer-facing response must end with one to four next-command suggestions. Each suggestion must include a short explanation of what that path will do.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./constraints.schema.json",
3
- "version": "2.0.6",
3
+ "version": "2.0.7",
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."
@@ -0,0 +1,100 @@
1
+ # Auto-Invoke Policy
2
+
3
+ Scriveno can be proactive, but it must be proactive from disk evidence. Commands should inspect `.manuscript/`, reports, timestamps, config, and installed runtime surfaces before choosing an automatic helper.
4
+
5
+ ## Cross-Platform Agent Rules
6
+
7
+ Scriveno agent prompts live in `agents/*.md`. Each host runtime exposes them differently:
8
+
9
+ - Claude Code installs command files in `~/.claude/commands/` and agent prompts in `~/.claude/agents/`.
10
+ - Codex installs `$scr-*` skills, mirrored command files, agent prompts, and `.toml` metadata so Codex can expose agent types.
11
+ - Cursor, Gemini CLI, OpenCode, Copilot, Windsurf, and Antigravity install nested command directories and agent prompts in their runtime-specific agent directories.
12
+ - Manus and the generic skill runtime bundle `SKILL.md`, commands, and agents inside the skill directory.
13
+
14
+ When a host supports native fresh-context spawning, use the native agent or subagent mechanism. When it does not, load the installed agent prompt from the active runtime and run it in an isolated fresh context. When the action is only a file operation, report `Agent: none`.
15
+
16
+ Every automatic path must make the distinction visible.
17
+
18
+ ```text
19
+ Agent status:
20
+ Trigger: <command or state condition>
21
+ Spawned agents:
22
+ - <agent-name>: <count, none, or prompt-run fallback used>
23
+ Local operations:
24
+ - <operation>: <result>
25
+ Auto-invoked:
26
+ - <command or helper>: yes/no
27
+ Why: <one sentence tied to disk state>
28
+ ```
29
+
30
+ Use `Automation status:` for command chains and `Sync status:` for runtime install or sync checks.
31
+
32
+ ## Levels
33
+
34
+ | Level | Behavior | Default | Examples |
35
+ |-------|----------|---------|----------|
36
+ | 1 | Read-only suggestion | Run by default | `/scr:next` route, progress sweep, review queue surfacing |
37
+ | 2 | Safe local helper | Run when directly triggered | `CONTEXT.md` regeneration, `HISTORY.log` append, scan report, stats count |
38
+ | 3 | Scoped agent | Spawn when the command implies it or evidence is bounded | drafter, plan-checker, voice-checker, continuity-checker, translator, beta-reader |
39
+ | 4 | Writer-owned action | Require confirmation | publishing, destructive edits, merge decisions, accepting review findings |
40
+
41
+ ## Level 1: Auto-Suggest
42
+
43
+ Run these read-only checks in `/scr:next`, `/scr:progress`, and closeouts for major commands:
44
+
45
+ - If `STATE.md`, `CONTEXT.md`, `HISTORY.log`, or draft mtimes disagree, suggest `/scr:scan`.
46
+ - If voice or continuity reports have unresolved issues, suggest `/scr:voice-check`, `/scr:continuity-check`, or `/scr:editor-review`.
47
+ - If editor notes or track proposals exist, suggest `/scr:editor-review --notes`, `/scr:editor-review --respond`, or `/scr:track`.
48
+ - If translation folders exist or config lists target languages, suggest translation follow-ups.
49
+ - If export outputs are older than source files, suggest `/scr:export` or `/scr:publish`.
50
+ - If no save exists after recent manuscript changes, suggest `/scr:save`.
51
+
52
+ These checks must not mutate files.
53
+
54
+ ## Level 2: Auto-Run Local Helpers
55
+
56
+ Run these only when the current command directly owns the file operation:
57
+
58
+ - `/scr:save` regenerates `.manuscript/CONTEXT.md`, appends `HISTORY.log`, and commits `.manuscript/`.
59
+ - `/scr:scan --fix` applies deterministic state repairs after confirmation and appends `HISTORY.log`.
60
+ - `/scr:resume-work` may regenerate `CONTEXT.md` from disk state.
61
+ - `/scr:progress` may count drafts, submitted units, open record threads, and stale reports, but does not write.
62
+ - Runtime `/scr:sync --apply` runs the installer and verifies installed command, skill, and agent surfaces.
63
+
64
+ Report these as local operations, not spawned agents.
65
+
66
+ ## Level 3: Auto-Spawn Scoped Agents
67
+
68
+ Spawn or prompt-run fallback is appropriate when the command already implies a specialist role:
69
+
70
+ - `/scr:plan` invokes `plan-checker` per plan.
71
+ - `/scr:draft` invokes `drafter` per atomic unit and a voice diagnostic pass when a draft was produced.
72
+ - `/scr:voice-check` invokes `voice-checker`.
73
+ - `/scr:continuity-check` invokes `continuity-checker`.
74
+ - `/scr:translate` invokes `translator` per unit.
75
+ - `/scr:beta-reader` invokes a beta reader persona.
76
+ - `/scr:map-manuscript` invokes analysis workers, or isolated sequential analysis if parallel workers are unavailable.
77
+ - `/scr:editor-review` invokes revision diagnostics only for flagged issue groups.
78
+
79
+ Do not pretend command-local analysis workers are installed agent files unless they actually are.
80
+
81
+ ## Level 4: Manual Only
82
+
83
+ Never auto-run these without explicit writer confirmation:
84
+
85
+ - deleting or removing units
86
+ - accepting, rejecting, or applying editor decisions
87
+ - merging revision tracks
88
+ - clearing review findings
89
+ - final publish or submission packaging
90
+ - overwriting generated export packages
91
+ - destructive repair, reset, revert, or cleanup
92
+ - broad translation or cultural adaptation chains outside autopilot
93
+
94
+ ## Required Closeout
95
+
96
+ Every proactive command should end with:
97
+
98
+ - one recommended next command
99
+ - a short reason tied to disk state
100
+ - status showing whether agents spawned, local operations ran, or manual boundaries stopped automation
@@ -57,7 +57,7 @@ When a writer runs `/scr:new-work`, Scriveno creates `.manuscript/config.json`.
57
57
 
58
58
  ```json
59
59
  {
60
- "scriveno_version": "2.0.6",
60
+ "scriveno_version": "2.0.7",
61
61
  "work_type": "<chosen>",
62
62
  "group": "<group>",
63
63
  "command_unit": "<unit>",
@@ -2,6 +2,39 @@
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.0.7 - 2026-05-16
6
+
7
+ ### What changed
8
+
9
+ - Codex installs now generate agent metadata beside Scriveno agent prompts so native agent spawning can work when the host exposes those roles.
10
+ - Non-Codex runtimes keep their own install surfaces: Claude Code flat commands and agents, command-directory runtimes, skill-file runtimes, Manus, guided Perplexity Desktop setup, and the generic fallback.
11
+ - Scriveno now has a shared auto-invoke policy for read-only suggestions, deterministic local helpers, scoped agent spawns, and manual-only writer actions.
12
+ - `/scr:next` and `/scr:progress` now do read-only proactive checks and explain what they found.
13
+ - `/scr:save`, `/scr:scan`, `/scr:health`, `/scr:session-report`, `/scr:sync`, and multi-agent workflows now show visible status blocks that say what spawned, what ran locally, and why.
14
+ - Package and shipped metadata are aligned on `2.0.7`.
15
+
16
+ ### Why it matters
17
+
18
+ Writers and developers should not have to guess whether Scriveno used a native agent, a prompt fallback, or a local file operation. This release makes those paths visible and keeps runtime behavior honest across Codex, Claude Code, and the other supported install targets.
19
+
20
+ The practical effect is calmer automation: Scriveno can be more proactive about the next safe move, while still keeping writer-owned actions like publishing, destructive edits, merges, and submissions behind explicit approval.
21
+
22
+ ### Affected areas
23
+
24
+ - Codex agent metadata generation
25
+ - Claude Code and other runtime install verification
26
+ - proactive command guidance
27
+ - local helper visibility
28
+ - `/scr:sync` status reporting
29
+ - README, changelog, release notes, and version metadata
30
+ - regression tests for agent spawning, prompt fallback, and runtime install surfaces
31
+
32
+ ### Verification
33
+
34
+ - `node --test`
35
+ - `npm run release:check`
36
+ - `git diff --check`
37
+
5
38
  ## 2.0.6 - 2026-05-15
6
39
 
7
40
  ### What changed
@@ -34,23 +34,32 @@ Node is not a runtime dependency for Scriveno's markdown command system itself.
34
34
 
35
35
  - **Registry-tested**: installer registry shape is covered by automated tests.
36
36
  - **Repo-documented**: detection and install strategy are documented in the repo.
37
+ - **Install-surface tested**: automated tests run the installer logic for representative targets and assert command files, agent prompts, and runtime-specific metadata or manifests are written in the expected place.
37
38
  - **No host-runtime parity verification yet**: Scriveno does not currently ship an end-to-end verification artifact for behavior inside the host runtime.
38
39
 
39
40
  ## Runtime Compatibility Matrix
40
41
 
41
42
  | Runtime | Install Type | Install Path Shape | Repo Evidence | Support Level | Verification Status |
42
43
  |---------|--------------|--------------------|---------------|---------------|---------------------|
43
- | Claude Code | commands | `~/.claude/commands/scr-*.md` + `~/.claude/agents` or `.claude/commands/scr-*.md` + `.claude/agents` | Installer registry, registry-tested, repo-documented | Primary reference runtime | Registry-tested; repo-documented; no host-runtime parity verification yet |
44
- | Cursor | commands | `~/.cursor/commands/scr` + `~/.cursor/agents` or `.cursor/commands/scr` + `.cursor/agents` | Installer registry, registry-tested, repo-documented | Standard installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
45
- | Gemini CLI | commands | `~/.gemini/commands/scr` + `~/.gemini/agents` or `.gemini/commands/scr` + `.gemini/agents` | Installer registry, registry-tested, repo-documented | Standard installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
46
- | Codex | skills | `~/.codex/skills/scr-*` or `.codex/skills/scr-*` (with mirrored command files in `~/.codex/commands/scr` or `.codex/commands/scr`) | Installer registry, registry-tested, repo-documented | Skills installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
47
- | OpenCode | commands | `~/.config/opencode/commands/scr` + `~/.config/opencode/agents` or `.config/opencode/commands/scr` + `.config/opencode/agents` | Installer registry, registry-tested, repo-documented | Standard installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
48
- | GitHub Copilot | commands | `~/.github/commands/scr` + `~/.github/agents` or `.github/commands/scr` + `.github/agents` | Installer registry, registry-tested, repo-documented | Standard installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
49
- | Windsurf | commands | `~/.windsurf/commands/scr` + `~/.windsurf/agents` or `.windsurf/commands/scr` + `.windsurf/agents` | Installer registry, registry-tested, repo-documented | Standard installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
50
- | Antigravity | commands | `~/.gemini/antigravity/commands/scr` + `~/.gemini/antigravity/agents` or `.gemini/antigravity/commands/scr` + `.gemini/antigravity/agents` | Installer registry, registry-tested, repo-documented | Standard installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
51
- | Manus Desktop | skills | `~/.manus/skills/scriveno/SKILL.md` or `.manus/skills/scriveno/SKILL.md` | Installer registry, registry-tested, repo-documented | Skills installer target | Registry-tested; repo-documented; no host-runtime parity verification yet |
44
+ | Claude Code | commands | `~/.claude/commands/scr-*.md` + `~/.claude/agents` or `.claude/commands/scr-*.md` + `.claude/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Primary reference runtime | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
45
+ | Cursor | commands | `~/.cursor/commands/scr` + `~/.cursor/agents` or `.cursor/commands/scr` + `.cursor/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Standard installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
46
+ | Gemini CLI | commands | `~/.gemini/commands/scr` + `~/.gemini/agents` or `.gemini/commands/scr` + `.gemini/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Standard installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
47
+ | Codex | skills | `~/.codex/skills/scr-*` or `.codex/skills/scr-*` (with mirrored command files in `~/.codex/commands/scr` or `.codex/commands/scr`, plus agent prompts and `.toml` metadata in `~/.codex/agents` or `.codex/agents`) | Installer registry, registry-tested, install-surface tested, repo-documented | Skills installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
48
+ | OpenCode | commands | `~/.config/opencode/commands/scr` + `~/.config/opencode/agents` or `.config/opencode/commands/scr` + `.config/opencode/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Standard installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
49
+ | GitHub Copilot | commands | `~/.github/commands/scr` + `~/.github/agents` or `.github/commands/scr` + `.github/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Standard installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
50
+ | Windsurf | commands | `~/.windsurf/commands/scr` + `~/.windsurf/agents` or `.windsurf/commands/scr` + `.windsurf/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Standard installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
51
+ | Antigravity | commands | `~/.gemini/antigravity/commands/scr` + `~/.gemini/antigravity/agents` or `.gemini/antigravity/commands/scr` + `.gemini/antigravity/agents` | Installer registry, registry-tested, install-surface tested, repo-documented | Standard installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
52
+ | Manus Desktop | skills | `~/.manus/skills/scriveno/SKILL.md` or `.manus/skills/scriveno/SKILL.md`, with mirrored `commands/scr/` and `agents/` inside the skill bundle | Installer registry, registry-tested, install-surface tested, repo-documented | Skills installer target | Registry-tested; install-surface tested; repo-documented; no host-runtime parity verification yet |
52
53
  | Perplexity Desktop | guided-mcp | `~/.scriveno/perplexity/SETUP.md` or `.scriveno/perplexity/SETUP.md` plus Perplexity Desktop Connectors setup | Installer registry, registry-tested, guided setup assets, repo-documented | Guided desktop MCP target | Registry-tested; repo-documented; no host-runtime parity verification yet |
53
- | Generic (SKILL.md) | skills | `~/.scriveno/skills/SKILL.md` or `.scriveno/skills/SKILL.md` | Installer registry, registry-tested | Generic skills fallback | Registry-tested; no host-runtime parity verification yet |
54
+ | Generic (SKILL.md) | skills | `~/.scriveno/skills/SKILL.md` or `.scriveno/skills/SKILL.md`, with mirrored `commands/scr/` and `agents/` inside the skill bundle | Installer registry, registry-tested, install-surface tested | Generic skills fallback | Registry-tested; install-surface tested; no host-runtime parity verification yet |
55
+
56
+ ## Agent Surface By Runtime
57
+
58
+ - Claude Code installs flat command files such as `scr-sync.md` plus agent prompts in its `agents` directory. It does not receive Codex `.toml` metadata.
59
+ - Cursor, Gemini CLI, OpenCode, GitHub Copilot, Windsurf, and Antigravity install nested command directories plus agent prompts in their runtime-specific `agents` directory. They do not receive Codex `.toml` metadata.
60
+ - Codex installs per-command skills, mirrored command files, agent prompts, and `.toml` metadata because Codex uses that metadata to expose agents.
61
+ - Manus Desktop and the generic skills fallback install a manifest `SKILL.md`, mirrored command files, and agent prompts inside the skill bundle.
62
+ - Perplexity Desktop receives setup assets for a local-MCP connector. It does not receive writable command or agent prompt directories from the installer.
54
63
 
55
64
  ## What Scriveno Proves Today
56
65
 
@@ -60,6 +69,7 @@ Scriveno currently proves all of the following in-repo:
60
69
  - each target has a declared install strategy (`commands`, `skills`, or `guided-mcp`)
61
70
  - each target has expected install-path properties in the installer registry
62
71
  - the runtime registry shape is covered by automated installer tests
72
+ - representative install surfaces are covered for Claude Code, standard command-directory runtimes, Codex, Manus Desktop, and the generic skills fallback
63
73
  - the high-level install strategies and detection rules are documented in [Architecture](architecture.md)
64
74
 
65
75
  Scriveno does not currently prove:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scriveno",
3
- "version": "2.0.6",
3
+ "version": "2.0.7",
4
4
  "description": "Spec-driven creative writing, publishing, and translation pipeline for AI coding agents. From blank page to published book.",
5
5
  "bin": {
6
6
  "scriveno": "bin/install.js"
@@ -1,5 +1,5 @@
1
1
  {
2
- "scriveno_version": "2.0.6",
2
+ "scriveno_version": "2.0.7",
3
3
  "work_type": "",
4
4
  "group": "",
5
5
  "command_unit": "",