scriveno 2.0.7 → 2.0.9

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,9 +2,11 @@
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.7-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-2.0.9-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
+ [![Status CLI](https://img.shields.io/badge/status%20CLI-scriveno%20status-blue)](docs/runtime-support.md#shared-auto-invoke-engine)
9
+ [![Route Intelligence](https://img.shields.io/badge/route%20intelligence-agent%20lanes-blue)](docs/auto-invoke-policy.md)
8
10
 
9
11
  **[scriveno on npm](https://www.npmjs.com/package/scriveno)**
10
12
 
@@ -18,6 +20,9 @@ Scriveno is best understood as **AI-native longform writing software built aroun
18
20
 
19
21
  ```bash
20
22
  npx scriveno@latest
23
+
24
+ # Optional project status check
25
+ scriveno status --project .
21
26
  ```
22
27
 
23
28
  ---
@@ -68,6 +73,21 @@ If you want the shortest proof-first route, read [Proof Artifacts](docs/proof-ar
68
73
 
69
74
  ---
70
75
 
76
+ ## Proactive status
77
+
78
+ Scriveno ships a shared read-only status engine for every installer target. The public CLI is:
79
+
80
+ ```bash
81
+ scriveno status --project .
82
+ scriveno status . --json
83
+ ```
84
+
85
+ It inspects disk evidence such as `.manuscript/`, `STATE.md`, `CONTEXT.md`, plan files, drafts, review coverage, notes, revision proposals, translation work, publishing prerequisites, exports, and history, then recommends the safest next command. The engine does not mutate files and does not spawn agents by itself. Command surfaces such as `/scr-next`, `/scr:next`, `/scr:progress`, `/scr:session-report`, and `/scr:sync` call it when local command execution is available, then fall back to embedded markdown logic when a host cannot run Node. See [Auto-Invoke Policy](docs/auto-invoke-policy.md) and [Runtime Support](docs/runtime-support.md#shared-auto-invoke-engine).
86
+
87
+ The status report separates `Candidate agents`, `Candidate local helpers`, and `Manual gates`. That means Scriveno can say when a route is ready for a drafter, voice-checker, translator, continuity-checker, or review worker, when a deterministic helper such as save or scan is enough, and when writer approval is required for publishing, export overwrites, track merges, or undo.
88
+
89
+ ---
90
+
71
91
  ## The Voice DNA system
72
92
 
73
93
  Scriveno's core insight: drafted prose should sound like *you*, not like an AI. Before drafting begins, `/scr:profile-writer` builds a detailed voice profile across 15+ dimensions:
@@ -171,6 +191,7 @@ Scriveno is built on five principles:
171
191
  - [Contributing](docs/contributing.md) -- How to add commands, agents, work types, and templates
172
192
  - [Architecture](docs/architecture.md) -- How Scriveno works under the hood
173
193
  - [Configuration](docs/configuration.md) -- Package, installer, constraints, and `.manuscript/config.json` surfaces
194
+ - [Auto-Invoke Policy](docs/auto-invoke-policy.md) -- Shared status engine, route intelligence lanes, visible automation status, and agent-spawn boundaries
174
195
  - [Development](docs/development.md) -- Contributor workflow for changing commands, templates, installer logic, and docs
175
196
  - [Testing](docs/testing.md) -- What the test suite covers and which checks to run before shipping
176
197
  - [Release Notes](docs/release-notes.md) -- Public summary of what changed between package releases
@@ -195,7 +216,7 @@ Scriveno currently ships installer targets for these AI tooling environments:
195
216
  - **Perplexity Desktop** (guided local-MCP setup)
196
217
  - **Generic (SKILL.md)** fallback
197
218
 
198
- **Installer baseline:** `Node.js >=20.0.0` for `npx scriveno@latest` and `bin/install.js`. For new installs, use a currently supported LTS such as Node.js 24; Node.js 20 is now a compatibility floor, not the recommended fresh-install target.
219
+ **Installer baseline:** `Node.js >=20.0.0` for `npx scriveno@latest`, `bin/install.js`, and `scriveno status --project .`. For new installs, use a currently supported LTS such as Node.js 24; Node.js 20 is now a compatibility floor, not the recommended fresh-install target.
199
220
 
200
221
  **Support note:** Claude Code is the primary reference runtime and now installs a flat `/scr-*` command surface. The environments listed above are installer targets, not a claim that every host runtime has verified parity today. Codex currently installs a skill-native `$scr-*` surface, while Perplexity Desktop is a guided local-MCP target rather than a writable command runtime. See the [runtime compatibility matrix](docs/runtime-support.md) for install type, support level, and verification status.
201
222
 
@@ -203,11 +224,11 @@ Scriveno currently ships installer targets for these AI tooling environments:
203
224
 
204
225
  ## Status
205
226
 
206
- **Version:** 2.0.7
227
+ **Version:** 2.0.9
207
228
 
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.
229
+ 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, visible automation status, the shared `scriveno status --project .` auto-invoke engine, and route-intelligence lanes through `2.0.9`. 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
230
 
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.
231
+ Version `2.0.9` 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
232
 
212
233
  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
234
 
package/bin/install.js CHANGED
@@ -6,6 +6,7 @@ const os = require('os');
6
6
  const readline = require('readline');
7
7
  const crypto = require('crypto');
8
8
  const architecturalProfiles = require('../lib/architectural-profiles.js');
9
+ const autoInvokeEngine = require('../lib/auto-invoke-engine.js');
9
10
 
10
11
  const PKG_ROOT = path.join(__dirname, '..');
11
12
  const PKG = require('../package.json');
@@ -820,6 +821,8 @@ function printHelp() {
820
821
  console.log(BANNER);
821
822
  console.log(`Usage:
822
823
  scriveno
824
+ scriveno status --project .
825
+ scriveno status . --json
823
826
  scriveno --runtimes codex,claude-code --global --writer --silent
824
827
 
825
828
  Options:
@@ -834,6 +837,12 @@ Options:
834
837
  --help Show this help text
835
838
  --version Show the Scriveno package version
836
839
 
840
+ Status options:
841
+ status Inspect a project and recommend the next command
842
+ --project <path> Project root to inspect (default: current directory)
843
+ --trigger <name> Status trigger label (default: scriveno status)
844
+ --json Print machine-readable status JSON
845
+
837
846
  Runtime keys:
838
847
  ${Object.keys(RUNTIMES).join(', ')}
839
848
  `);
@@ -841,6 +850,7 @@ Runtime keys:
841
850
 
842
851
  function parseArgs(argv) {
843
852
  const options = {
853
+ command: 'install',
844
854
  runtimeKeys: [],
845
855
  installDetected: false,
846
856
  isGlobal: null,
@@ -848,8 +858,44 @@ function parseArgs(argv) {
848
858
  silent: false,
849
859
  showHelp: false,
850
860
  showVersion: false,
861
+ statusProjectRoot: process.cwd(),
862
+ statusTrigger: 'scriveno status',
863
+ statusJson: false,
851
864
  };
852
865
 
866
+ if (argv[0] === 'status') {
867
+ options.command = 'status';
868
+ for (let i = 1; i < argv.length; i++) {
869
+ const arg = argv[i];
870
+ if (arg === '--help' || arg === '-h') {
871
+ options.showHelp = true;
872
+ } else if (arg === '--version' || arg === '-v') {
873
+ options.showVersion = true;
874
+ } else if (arg === '--json') {
875
+ options.statusJson = true;
876
+ } else if (arg === '--project') {
877
+ const value = argv[i + 1];
878
+ if (!value) throw new Error('--project requires a value for status');
879
+ options.statusProjectRoot = value;
880
+ i++;
881
+ } else if (arg.startsWith('--project=')) {
882
+ options.statusProjectRoot = arg.slice('--project='.length);
883
+ } else if (arg === '--trigger') {
884
+ const value = argv[i + 1];
885
+ if (!value) throw new Error('--trigger requires a value');
886
+ options.statusTrigger = value;
887
+ i++;
888
+ } else if (arg.startsWith('--trigger=')) {
889
+ options.statusTrigger = arg.slice('--trigger='.length);
890
+ } else if (arg.startsWith('-')) {
891
+ throw new Error(`Unknown status argument "${arg}"`);
892
+ } else {
893
+ options.statusProjectRoot = arg;
894
+ }
895
+ }
896
+ return options;
897
+ }
898
+
853
899
  function addRuntimeList(value) {
854
900
  for (const key of String(value).split(',').map((item) => item.trim()).filter(Boolean)) {
855
901
  if (!Object.prototype.hasOwnProperty.call(RUNTIMES, key)) {
@@ -901,6 +947,16 @@ function parseArgs(argv) {
901
947
  return options;
902
948
  }
903
949
 
950
+ function runStatus({ projectRoot, trigger, json }) {
951
+ const analysis = autoInvokeEngine.analyzeProject(projectRoot);
952
+ if (json) {
953
+ console.log(JSON.stringify(analysis, null, 2));
954
+ } else {
955
+ console.log(autoInvokeEngine.formatReport(analysis, { trigger }));
956
+ }
957
+ return analysis;
958
+ }
959
+
904
960
  function resolveInstallRequest(parsed, detectedRuntimeKeys, { isTTY }) {
905
961
  const hasRuntimeDirective = parsed.runtimeKeys.length > 0 || parsed.installDetected;
906
962
  const hasModifierOverrides = parsed.isGlobal !== null || parsed.developerMode !== null;
@@ -1324,6 +1380,15 @@ async function main() {
1324
1380
  return;
1325
1381
  }
1326
1382
 
1383
+ if (parsed.command === 'status') {
1384
+ runStatus({
1385
+ projectRoot: parsed.statusProjectRoot,
1386
+ trigger: parsed.statusTrigger,
1387
+ json: parsed.statusJson,
1388
+ });
1389
+ return;
1390
+ }
1391
+
1327
1392
  const detectedRuntimeKeys = Object.entries(RUNTIMES).filter(([, runtime]) => runtime.detect()).map(([key]) => key);
1328
1393
  const installRequest = resolveInstallRequest(parsed, detectedRuntimeKeys, { isTTY: Boolean(process.stdin.isTTY) });
1329
1394
 
@@ -1545,11 +1610,13 @@ function installGuidedRuntime(runtime, isGlobal, dataDir, log) {
1545
1610
  function writeSharedAssets(dataDir, runtimeKeys, isGlobal, developerMode, installMode, log) {
1546
1611
  fs.mkdirSync(path.join(dataDir, 'templates'), { recursive: true });
1547
1612
  fs.mkdirSync(path.join(dataDir, 'data'), { recursive: true });
1613
+ fs.mkdirSync(path.join(dataDir, 'lib'), { recursive: true });
1548
1614
  const templateResult = copyDirWithPreservation(path.join(PKG_ROOT, 'templates'), path.join(dataDir, 'templates'));
1549
1615
  const dataResult = copyDirWithPreservation(path.join(PKG_ROOT, 'data'), path.join(dataDir, 'data'));
1616
+ const libResult = copyDirWithPreservation(path.join(PKG_ROOT, 'lib'), path.join(dataDir, 'lib'));
1550
1617
  const sum = (r) => r.fresh + r.replaced + r.backedUp;
1551
- log(` ${c('green', 'OK')} ${sum(templateResult)} templates + ${sum(dataResult)} data files -> ${c('dim', dataDir)}`);
1552
- const totalBackedUp = templateResult.backedUp + dataResult.backedUp;
1618
+ log(` ${c('green', 'OK')} ${sum(templateResult)} templates + ${sum(dataResult)} data files + ${sum(libResult)} lib files -> ${c('dim', dataDir)}`);
1619
+ const totalBackedUp = templateResult.backedUp + dataResult.backedUp + libResult.backedUp;
1553
1620
  if (totalBackedUp > 0) {
1554
1621
  log(` ${c('yellow', 'i')} Preserved ${totalBackedUp} user-modified file(s) as .backup.<timestamp>`);
1555
1622
  }
@@ -1706,6 +1773,7 @@ module.exports = {
1706
1773
  RUNTIMES,
1707
1774
  parseArgs,
1708
1775
  resolveInstallRequest,
1776
+ runStatus,
1709
1777
  collectCommandEntries,
1710
1778
  collectAgentEntries,
1711
1779
  assertNoSkillNameCollisions,
@@ -1754,4 +1822,10 @@ module.exports = {
1754
1822
  // Per-work-type pitfall packs
1755
1823
  listPitfallPacks: architecturalProfiles.listPitfallPacks,
1756
1824
  getPitfallPackPath: architecturalProfiles.getPitfallPackPath,
1825
+ // Shared proactive status engine
1826
+ autoInvokeEngine,
1827
+ analyzeProject: autoInvokeEngine.analyzeProject,
1828
+ formatAutoInvokeReport: autoInvokeEngine.formatReport,
1829
+ getRuntimeAgentSupport: autoInvokeEngine.getRuntimeAgentSupport,
1830
+ listRuntimeAgentSupport: autoInvokeEngine.listRuntimeAgentSupport,
1757
1831
  };
@@ -96,9 +96,15 @@ Automation status:
96
96
  Trigger: /scr:health {flags}
97
97
  Spawned agents:
98
98
  - none
99
+ Candidate agents:
100
+ - none
99
101
  Local operations:
100
102
  - health checks run: {count}
101
103
  - repairs applied: {count}
104
+ Candidate local helpers:
105
+ - /scr:scan or /scr:save when health detects repairable drift
106
+ Manual gates:
107
+ - repairs that require writer confirmation
102
108
  Auto-invoked:
103
109
  - none
104
110
  Why: health uses deterministic local checks; non-deterministic repairs stay manual
@@ -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.7",
72
+ "scriveno_version": "2.0.9",
73
73
  "work_type": "<chosen>",
74
74
  "group": "<group>",
75
75
  "command_unit": "<unit>",
@@ -8,6 +8,17 @@ You are routing the writer to the right next step in their workflow. This comman
8
8
 
9
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
10
 
11
+ Use the shared executable engine before falling back to manual inspection. Try the first available path:
12
+
13
+ ```bash
14
+ scriveno status --project "$PWD" --trigger /scr:next
15
+ node lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:next
16
+ node "$HOME/.scriveno/lib/auto-invoke-engine.js" --project "$PWD" --trigger /scr:next
17
+ node .scriveno/lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:next
18
+ ```
19
+
20
+ This engine is installed into Scriveno shared assets for every runtime, including Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, Windsurf, Antigravity, Manus, Perplexity Desktop, and the generic skill fallback. If the engine is not present, perform the read-only sweep below.
21
+
11
22
  ## What to do
12
23
 
13
24
  1. **Check for `.manuscript/` directory.** If none, the writer has no project. Run `/scr:new-work` to start one (or tell them to).
@@ -123,9 +134,15 @@ Automation status:
123
134
  Trigger: /scr:next
124
135
  Spawned agents:
125
136
  - none
137
+ Candidate agents:
138
+ - <recommended agent route or none>
126
139
  Local operations:
127
140
  - proactive sweep: read-only
128
141
  - state route computed: yes/no
142
+ Candidate local helpers:
143
+ - <recommended helper or none>
144
+ Manual gates:
145
+ - <writer-owned route or none>
129
146
  Auto-invoked:
130
147
  - <recommended command>: yes/no
131
148
  Why: /scr:next routes from disk state; it only runs follow-up commands under autopilot or explicit writer intent
@@ -9,6 +9,17 @@ You are showing the writer their current project progress.
9
9
 
10
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
11
 
12
+ Use the shared executable engine before falling back to manual counts. Try the first available path:
13
+
14
+ ```bash
15
+ scriveno status --project "$PWD" --trigger /scr:progress
16
+ node lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:progress
17
+ node "$HOME/.scriveno/lib/auto-invoke-engine.js" --project "$PWD" --trigger /scr:progress
18
+ node .scriveno/lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:progress
19
+ ```
20
+
21
+ This engine is installed into Scriveno shared assets for every runtime, including Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, Windsurf, Antigravity, Manus, Perplexity Desktop, and the generic skill fallback. If the engine is not present, perform the read-only progress logic below.
22
+
12
23
  ## Prerequisites
13
24
 
14
25
  - `.manuscript/STATE.md` must exist
@@ -40,9 +51,15 @@ Automation status:
40
51
  Trigger: /scr:progress
41
52
  Spawned agents:
42
53
  - none
54
+ Candidate agents:
55
+ - <recommended agent route or none>
43
56
  Local operations:
44
57
  - progress counts computed: yes/no
45
58
  - proactive sweep: read-only
59
+ Candidate local helpers:
60
+ - <recommended helper or none>
61
+ Manual gates:
62
+ - <writer-owned route or none>
46
63
  Auto-invoked:
47
64
  - none
48
65
  Why: progress is read-only; it recommends next commands without mutating files
@@ -80,11 +80,17 @@ Automation status:
80
80
  Trigger: /scr:save
81
81
  Spawned agents:
82
82
  - none
83
+ Candidate agents:
84
+ - none
83
85
  Local operations:
84
86
  - STATE.md updated: yes/no
85
87
  - CONTEXT.md regenerated: yes/no
86
88
  - HISTORY.log appended: yes/no
87
89
  - manuscript files saved: yes/no
90
+ Candidate local helpers:
91
+ - /scr:scan if saved state and disk still disagree
92
+ Manual gates:
93
+ - none
88
94
  Auto-invoked:
89
95
  - /scr:next route computed for CONTEXT.md: yes/no
90
96
  Why: save uses deterministic local bookkeeping, not a spawned agent
@@ -272,10 +272,16 @@ Automation status:
272
272
  Trigger: /scr:scan {flags}
273
273
  Spawned agents:
274
274
  - none
275
+ Candidate agents:
276
+ - none
275
277
  Local operations:
276
278
  - drift checks run: {count}
277
279
  - auto-fixes applied: {count}
278
280
  - HISTORY.log appended: yes/no
281
+ Candidate local helpers:
282
+ - /scr:save if scan repairs changed state
283
+ Manual gates:
284
+ - fixes that require writer confirmation
279
285
  Auto-invoked:
280
286
  - none
281
287
  Why: scan compares disk state locally; fixes require writer confirmation
@@ -9,6 +9,17 @@ You are summarizing the writer's current session. Your job is to compute actiona
9
9
 
10
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
11
 
12
+ Use the shared executable engine for the read-only status portion before computing session-specific metrics. Try the first available path:
13
+
14
+ ```bash
15
+ scriveno status --project "$PWD" --trigger /scr:session-report
16
+ node lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:session-report
17
+ node "$HOME/.scriveno/lib/auto-invoke-engine.js" --project "$PWD" --trigger /scr:session-report
18
+ node .scriveno/lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:session-report
19
+ ```
20
+
21
+ This engine is installed into Scriveno shared assets for every runtime, including Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, Windsurf, Antigravity, Manus, Perplexity Desktop, and the generic skill fallback. If the engine is not present, continue with the read-only report logic below.
22
+
12
23
  ## What to do
13
24
 
14
25
  1. **Read STATE.md "Last actions" table** to get the full history of actions.
@@ -55,9 +66,15 @@ Automation status:
55
66
  Trigger: /scr:session-report
56
67
  Spawned agents:
57
68
  - none
69
+ Candidate agents:
70
+ - <recommended agent route or none>
58
71
  Local operations:
59
72
  - session metrics computed: yes/no
60
73
  - quality pass summary computed: yes/no
74
+ Candidate local helpers:
75
+ - <recommended helper or none>
76
+ Manual gates:
77
+ - <writer-owned route or none>
61
78
  Auto-invoked:
62
79
  - none
63
80
  Why: session-report summarizes disk state without mutating files
@@ -11,6 +11,17 @@ This command is for local runtime drift: Codex skills, Codex command mirrors, Cl
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
 
14
+ The auto-invoke status engine is a shared runtime asset. It is copied for every install target and can be checked with one of these paths:
15
+
16
+ ```bash
17
+ scriveno status --project "$PWD" --trigger /scr:sync
18
+ node lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:sync
19
+ node "$HOME/.scriveno/lib/auto-invoke-engine.js" --project "$PWD" --trigger /scr:sync
20
+ node .scriveno/lib/auto-invoke-engine.js --project "$PWD" --trigger /scr:sync
21
+ ```
22
+
23
+ Use it for read-only project status and next-command reasoning. Use `bin/install.js` for runtime file synchronization.
24
+
14
25
  ## Prerequisites
15
26
 
16
27
  - Node.js >=20.0.0