specweave 3.0.3 → 3.0.6

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.
Files changed (90) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/README.md +2 -2
  3. package/bin/specweave.js +12 -7
  4. package/bin/startup-check.js +1 -1
  5. package/dist/src/cli/commands/auto-handoff.d.ts +17 -23
  6. package/dist/src/cli/commands/auto-handoff.d.ts.map +1 -1
  7. package/dist/src/cli/commands/auto-handoff.js +140 -65
  8. package/dist/src/cli/commands/auto-handoff.js.map +1 -1
  9. package/dist/src/cli/commands/handoff.d.ts +10 -0
  10. package/dist/src/cli/commands/handoff.d.ts.map +1 -1
  11. package/dist/src/cli/commands/handoff.js +50 -0
  12. package/dist/src/cli/commands/handoff.js.map +1 -1
  13. package/dist/src/cli/commands/jev-helpers.d.ts +1 -1
  14. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -1
  15. package/dist/src/cli/commands/jev-helpers.js +8 -4
  16. package/dist/src/cli/commands/jev-helpers.js.map +1 -1
  17. package/dist/src/cli/commands/jev.js +4 -4
  18. package/dist/src/cli/commands/jev.js.map +1 -1
  19. package/dist/src/cli/commands/pickup.d.ts +11 -0
  20. package/dist/src/cli/commands/pickup.d.ts.map +1 -1
  21. package/dist/src/cli/commands/pickup.js +28 -8
  22. package/dist/src/cli/commands/pickup.js.map +1 -1
  23. package/dist/src/cli/helpers/init/gitignore-generator.d.ts.map +1 -1
  24. package/dist/src/cli/helpers/init/gitignore-generator.js +26 -5
  25. package/dist/src/cli/helpers/init/gitignore-generator.js.map +1 -1
  26. package/dist/src/core/config/types.d.ts +2 -2
  27. package/dist/src/core/config/types.d.ts.map +1 -1
  28. package/dist/src/core/jev/client.d.ts +4 -1
  29. package/dist/src/core/jev/client.d.ts.map +1 -1
  30. package/dist/src/core/jev/client.js +118 -23
  31. package/dist/src/core/jev/client.js.map +1 -1
  32. package/dist/src/core/jev/config.d.ts +1 -1
  33. package/dist/src/core/jev/config.d.ts.map +1 -1
  34. package/dist/src/core/jev/config.js +8 -3
  35. package/dist/src/core/jev/config.js.map +1 -1
  36. package/dist/src/core/jev/openai.d.ts +21 -0
  37. package/dist/src/core/jev/openai.d.ts.map +1 -0
  38. package/dist/src/core/jev/openai.js +116 -0
  39. package/dist/src/core/jev/openai.js.map +1 -0
  40. package/dist/src/core/jev/usage.d.ts +4 -0
  41. package/dist/src/core/jev/usage.d.ts.map +1 -1
  42. package/dist/src/core/jev/usage.js +3 -0
  43. package/dist/src/core/jev/usage.js.map +1 -1
  44. package/dist/src/core/session/checkpoint-worker.d.ts +2 -0
  45. package/dist/src/core/session/checkpoint-worker.d.ts.map +1 -0
  46. package/dist/src/core/session/checkpoint-worker.js +43 -0
  47. package/dist/src/core/session/checkpoint-worker.js.map +1 -0
  48. package/dist/src/core/session/handoff-all.d.ts +124 -0
  49. package/dist/src/core/session/handoff-all.d.ts.map +1 -0
  50. package/dist/src/core/session/handoff-all.js +429 -0
  51. package/dist/src/core/session/handoff-all.js.map +1 -0
  52. package/dist/src/core/session/handoff-doc-format.d.ts +9 -0
  53. package/dist/src/core/session/handoff-doc-format.d.ts.map +1 -1
  54. package/dist/src/core/session/handoff-doc-format.js +28 -4
  55. package/dist/src/core/session/handoff-doc-format.js.map +1 -1
  56. package/dist/src/core/session/handoff-git-state.d.ts +3 -1
  57. package/dist/src/core/session/handoff-git-state.d.ts.map +1 -1
  58. package/dist/src/core/session/handoff-git-state.js +32 -12
  59. package/dist/src/core/session/handoff-git-state.js.map +1 -1
  60. package/dist/src/core/session/handoff-report.js +1 -0
  61. package/dist/src/core/session/handoff-report.js.map +1 -1
  62. package/dist/src/core/session/nested-repos.d.ts +90 -0
  63. package/dist/src/core/session/nested-repos.d.ts.map +1 -0
  64. package/dist/src/core/session/nested-repos.js +239 -0
  65. package/dist/src/core/session/nested-repos.js.map +1 -0
  66. package/dist/src/core/session/pickup.d.ts +1 -0
  67. package/dist/src/core/session/pickup.d.ts.map +1 -1
  68. package/dist/src/core/session/pickup.js +4 -4
  69. package/dist/src/core/session/pickup.js.map +1 -1
  70. package/dist/src/core/session/session-checkpoint.d.ts +46 -0
  71. package/dist/src/core/session/session-checkpoint.d.ts.map +1 -0
  72. package/dist/src/core/session/session-checkpoint.js +262 -0
  73. package/dist/src/core/session/session-checkpoint.js.map +1 -0
  74. package/dist/src/core/session/usage-guard.d.ts +59 -51
  75. package/dist/src/core/session/usage-guard.d.ts.map +1 -1
  76. package/dist/src/core/session/usage-guard.js +148 -88
  77. package/dist/src/core/session/usage-guard.js.map +1 -1
  78. package/dist/src/core/session/work-handoff.d.ts +6 -0
  79. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  80. package/dist/src/core/session/work-handoff.js +55 -13
  81. package/dist/src/core/session/work-handoff.js.map +1 -1
  82. package/dist/src/core/tasks/ledger.d.ts +5 -1
  83. package/dist/src/core/tasks/ledger.d.ts.map +1 -1
  84. package/dist/src/core/tasks/ledger.js +6 -2
  85. package/dist/src/core/tasks/ledger.js.map +1 -1
  86. package/package.json +1 -1
  87. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  88. package/plugins/specweave/skills/handoff/SKILL.md +54 -9
  89. package/plugins/specweave/skills/jev/SKILL.md +81 -83
  90. package/src/templates/AGENTS.md.template +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "3.0.3",
3
+ "version": "3.0.6",
4
4
  "description": "Portable intent, specifications, task evidence, and handoffs across AI coding tools.",
5
5
  "owner": {
6
6
  "name": "Anton Abyzov",
@@ -12,7 +12,7 @@
12
12
  "description": "SpecWeave unified plugin — increment lifecycle (plan, work the ledger, verify, review, complete), cross-tool handoff, GitHub/Jira/ADO sync",
13
13
  "source": "./plugins/specweave",
14
14
  "category": "development",
15
- "version": "3.0.3",
15
+ "version": "3.0.6",
16
16
  "author": {
17
17
  "name": "Anton Abyzov",
18
18
  "email": "anton.abyzov@gmail.com"
package/README.md CHANGED
@@ -33,7 +33,7 @@ you (in Codex, or account 2): pick up
33
33
 
34
34
  That is the whole handoff. "Hand off" runs `specweave handoff`: it releases your task claims, records why you stopped, and pushes your branch plus a snapshot of your uncommitted edits. "Pick up" runs `specweave pickup` in any other tool, account, machine or cloud session (a Claude Code Projects thread, a Codex cloud task): it brings that work into the checkout and prints the next task with its acceptance criteria. Nothing to copy, no paths to paste.
35
35
 
36
- Running out mid-task? `specweave auto-handoff on`, once per machine, makes it automatic: when a session reaches 90% of your plan's 5-hour or weekly limit, it hands off by itself and tells you to say "pick up" elsewhere. Claude Code reads the limit through its status line (your own status line keeps working) and Codex through a Stop hook. Under the threshold it costs no tokens. `--at 85` changes the threshold and `off` undoes every change.
36
+ Keep a local recovery point with `specweave auto-handoff on`, once per machine. Claude Code and Codex queue silent background checkpoints after turns, at most once every five minutes per worktree and session. They need no model or network, never stop work at a usage percentage, and leave claims and the checkout untouched. `auto-handoff status` shows the checkpoint directory. When you choose to switch tools or machines, use `specweave handoff` to transfer ownership and push your work; `pickup` does not apply automatic checkpoints. [Automatic checkpoint rules](https://spec-weave.com/docs/guides/auto-handoff/) explains recovery and supported hooks.
37
37
 
38
38
  `specweave report` writes an HTML timeline of who did what on an increment (tools, sessions, handoffs, pickups, test evidence), straight from the ledger.
39
39
 
@@ -86,7 +86,7 @@ npm i -g specweave@3
86
86
  specweave update
87
87
  ```
88
88
 
89
- `specweave update` rewrites `AGENTS.md` into the lean form, turns `CLAUDE.md` into an import of it, keeps your own sections, and backs up the old files under `.specweave/backups/`. Existing increments need no migration. The **[3.0.0 changelog](https://github.com/anton-abyzov/specweave/blob/develop/CHANGELOG.md#300---2026-09-25)** lists what changed and what was removed. To have sessions hand off by themselves near the usage limit, run `specweave auto-handoff on` once.
89
+ `specweave update` rewrites `AGENTS.md` into the lean form, turns `CLAUDE.md` into an import of it, keeps your own sections, and backs up the old files under `.specweave/backups/`. Existing increments need no migration. The **[3.0.0 changelog](https://github.com/anton-abyzov/specweave/blob/develop/CHANGELOG.md#300---2026-09-25)** lists what changed and what was removed. To keep local recovery checkpoints after turns, run `specweave auto-handoff on` once. Existing enabled settings use the new behavior after upgrading the CLI; run `specweave update` to refresh old quota-stop instructions in project files.
90
90
 
91
91
  <br/>
92
92
 
package/bin/specweave.js CHANGED
@@ -184,6 +184,8 @@ program
184
184
  program
185
185
  .command('handoff [incrementId]')
186
186
  .description('Hand off your work: release your claims, record why, and push it so `specweave pickup` continues it in any tool or account')
187
+ .option('--all', 'Write .specweave/handoffs/<date>-INDEX.md and index.json: every active increment and every nested repo with local-only work (writes nothing else)')
188
+ .option('--dry-run', 'With --all: print the index instead of writing it')
187
189
  .option('--reason <reason>', 'Why you are handing off (e.g. "out of tokens")')
188
190
  .option('--summary <summary>', 'Short summary of where things stand')
189
191
  .option('--next <next>', 'The exact next step for the resuming agent')
@@ -211,6 +213,8 @@ program
211
213
  json: options.json,
212
214
  push: options.push === false ? false : undefined,
213
215
  keepClaims: options.keepClaims,
216
+ all: options.all,
217
+ dryRun: options.dryRun,
214
218
  });
215
219
  });
216
220
 
@@ -219,10 +223,11 @@ program
219
223
  .command('pickup [incrementId]')
220
224
  .description('Pick up handed-off work (from any tool, machine or account) and print the next task with its acceptance criteria')
221
225
  .option('--no-apply', 'Only show the waiting handoff; do not apply it to this checkout')
226
+ .option('--all', 'Print the newest handoff index (from `handoff --all`), actionable increments first; changes nothing')
222
227
  .option('--json', 'Output as JSON')
223
228
  .action(async (incrementId, options) => {
224
229
  const { pickupCommand } = await import('../dist/src/cli/commands/pickup.js');
225
- process.exitCode = await pickupCommand({ incrementId, json: options.json, apply: options.apply });
230
+ process.exitCode = await pickupCommand({ incrementId, json: options.json, apply: options.apply, all: options.all });
226
231
  });
227
232
 
228
233
  // Report command - HTML timeline of an increment's ledger (handoff evidence)
@@ -244,11 +249,11 @@ program
244
249
  process.exitCode = await noteCommand(text, { incrementId });
245
250
  });
246
251
 
247
- // Auto-handoff - hand off by itself near the plan's usage limit (Claude Code, Codex)
252
+ // Auto-handoff - silent local recovery checkpoints (Claude Code, Codex)
248
253
  program
249
254
  .command('auto-handoff [action]')
250
- .description('on | off | status: hand off automatically at a share of the usage limit (default 90%)')
251
- .option('--at <percent>', 'Threshold in percent of any usage window', (v) => Number(v))
255
+ .description('on | off | status: save local background checkpoints without interrupting work')
256
+ .option('--at <percent>', 'Legacy compatibility option; checkpoints are independent of usage', (v) => Number(v))
252
257
  .action(async (action, options) => {
253
258
  const { autoHandoffCommand } = await import('../dist/src/cli/commands/auto-handoff.js');
254
259
  process.exitCode = await autoHandoffCommand(action, { at: options.at });
@@ -265,8 +270,8 @@ program
265
270
 
266
271
  program
267
272
  .command('usage-guard')
268
- .description('Stop hook: asks the agent to hand off once usage passes the auto-handoff threshold')
269
- .option('--limit-hit', 'StopFailure hook (Grok Build): hand off now, the turn hit the rate limit')
273
+ .description('Stop hook: queue a local checkpoint and return without interrupting work')
274
+ .option('--limit-hit', 'StopFailure hook: save locally after a rate-limit failure')
270
275
  .action(async (options) => {
271
276
  const { usageGuardCommand } = await import('../dist/src/cli/commands/auto-handoff.js');
272
277
  process.exitCode = await usageGuardCommand({ limitHit: options.limitHit === true });
@@ -277,7 +282,7 @@ program
277
282
  .command('jev <action> [args...]')
278
283
  .description('Jev (System One): doctor | setup | ask | route | task | guard | screen | failure | browse | usage')
279
284
  .option('--json', 'Machine-readable JSON output')
280
- .option('--provider <name>', 'setup: openrouter | typesafe')
285
+ .option('--provider <name>', 'setup: openrouter | typesafe | openai')
281
286
  .option('--model <model>', 'setup: model id (defaults to the provider default)')
282
287
  .option('--guard-bash', 'setup: enable the opt-in PreToolUse Bash guard')
283
288
  .option('--no-guard-bash', 'setup: disable the Bash guard')
@@ -4,7 +4,7 @@ export async function checkForDuplicates() {
4
4
  try {
5
5
  // Skip check for init command (no .specweave yet)
6
6
  const args = process.argv.slice(2);
7
- if (args.length === 0 || args[0] === 'init' || args[0] === '--help' || args[0] === '-h' || args[0] === '--version' || args[0] === '-V') {
7
+ if (args.length === 0 || ['init', 'usage-guard', 'statusline'].includes(args[0]) || args[0] === '--help' || args[0] === '-h' || args[0] === '--version' || args[0] === '-V') {
8
8
  return;
9
9
  }
10
10
 
@@ -1,30 +1,10 @@
1
- /**
2
- * CLI Commands: auto-handoff, statusline, usage-guard
3
- *
4
- * specweave auto-handoff [on|off|status] [--at 90]
5
- * specweave statusline [--wrap "<your status line command>"] (Claude Code status line)
6
- * specweave usage-guard (Stop hook, Claude Code and Codex)
7
- * specweave usage-guard --limit-hit (StopFailure hook, Grok Build)
8
- *
9
- * `auto-handoff on` wires the tools once, in the user's own settings:
10
- * Claude Code gets the status line (wrapping any existing one) and a Stop
11
- * hook; Codex gets the same Stop hook in ~/.codex/hooks.json. From then on a
12
- * session that reaches the threshold hands off by itself. Grok Build reports
13
- * no usage percentage, so it gets a StopFailure hook in ~/.grok/hooks/ that
14
- * runs the handoff itself right after a turn hits the rate limit.
15
- *
16
- * @module cli/commands/auto-handoff
17
- */
1
+ /** Opt-in local checkpoints, status display, and silent lifecycle hooks. */
18
2
  /** Claude Code status line: record usage, then print a line (or the wrapped command's). */
19
3
  export declare function statuslineCommand(opts?: {
20
4
  wrap?: string;
21
5
  home?: string;
22
6
  }): Promise<number>;
23
- /**
24
- * Stop hook for Claude Code and Codex: `{}` or a block that asks for a handoff.
25
- * With `limitHit` (Grok Build's StopFailure hook) the model has already run
26
- * out, so the hook writes the handoff itself.
27
- */
7
+ /** Always return valid empty hook JSON. Saving happens outside the model turn. */
28
8
  export declare function usageGuardCommand(opts?: {
29
9
  home?: string;
30
10
  limitHit?: boolean;
@@ -47,12 +27,26 @@ type Settings = Record<string, unknown> & {
47
27
  command?: string;
48
28
  };
49
29
  };
50
- /** Grok Build hook file: hand off when a turn fails on the rate limit. */
30
+ /** Grok Build hook file: save locally when a turn fails on the rate limit. */
51
31
  export declare function grokHook(): Settings;
52
32
  export interface AutoHandoffOptions {
53
33
  at?: number;
54
34
  home?: string;
55
35
  }
56
36
  export declare function autoHandoffCommand(action?: string, opts?: AutoHandoffOptions): Promise<number>;
37
+ /**
38
+ * Codex runs a user hook only after the user trusts it, and records that in
39
+ * ~/.codex/config.toml as a `[hooks.state."<home>/.codex/hooks.json:stop:<group>:<hook>"]`
40
+ * table with a `trusted_hash`. Plugin hooks use keys like
41
+ * `"sw@specweave:hooks/hooks.json:stop:0:0"`, which say nothing about ours.
42
+ * The hash covers the hook's content, so a changed hook needs approving again.
43
+ * There is no command to approve one; Codex asks when it next starts in a terminal.
44
+ */
45
+ export declare function codexHookTrusted(home?: string): boolean;
46
+ /**
47
+ * What `auto-handoff status` prints: checkpoint policy, whether each tool's hooks
48
+ * are actually in place, and the last usage each tool reported.
49
+ */
50
+ export declare function autoHandoffStatus(home?: string, now?: number): string[];
57
51
  export {};
58
52
  //# sourceMappingURL=auto-handoff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-handoff.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/auto-handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA8BH,2FAA2F;AAC3F,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAepG;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBzH;AAED,UAAU,SAAS;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AACvG,UAAU,SAAS;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;CAAE;AAC7D,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAoCpI,0EAA0E;AAC1E,wBAAgB,QAAQ,IAAI,QAAQ,CASnC;AAMD,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CAAC,MAAM,SAAW,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE1G"}
1
+ {"version":3,"file":"auto-handoff.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/auto-handoff.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAgC5E,2FAA2F;AAC3F,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpG;AAED,kFAAkF;AAClF,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CASzH;AAED,UAAU,SAAS;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AACvG,UAAU,SAAS;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;CAAE;AAC7D,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AA0CpI,8EAA8E;AAC9E,wBAAgB,QAAQ,IAAI,QAAQ,CASnC;AAMD,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CAAC,MAAM,SAAW,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmE1G;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,SAAe,GAAG,OAAO,CAsB7D;AAWD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,SAAe,EAAE,GAAG,SAAa,GAAG,MAAM,EAAE,CA2CjF"}
@@ -1,27 +1,12 @@
1
- /**
2
- * CLI Commands: auto-handoff, statusline, usage-guard
3
- *
4
- * specweave auto-handoff [on|off|status] [--at 90]
5
- * specweave statusline [--wrap "<your status line command>"] (Claude Code status line)
6
- * specweave usage-guard (Stop hook, Claude Code and Codex)
7
- * specweave usage-guard --limit-hit (StopFailure hook, Grok Build)
8
- *
9
- * `auto-handoff on` wires the tools once, in the user's own settings:
10
- * Claude Code gets the status line (wrapping any existing one) and a Stop
11
- * hook; Codex gets the same Stop hook in ~/.codex/hooks.json. From then on a
12
- * session that reaches the threshold hands off by itself. Grok Build reports
13
- * no usage percentage, so it gets a StopFailure hook in ~/.grok/hooks/ that
14
- * runs the handoff itself right after a turn hits the rate limit.
15
- *
16
- * @module cli/commands/auto-handoff
17
- */
1
+ /** Opt-in local checkpoints, status display, and silent lifecycle hooks. */
18
2
  import * as fs from 'fs';
19
3
  import * as os from 'os';
20
4
  import * as path from 'path';
21
5
  import { spawnSync } from 'child_process';
22
- import { DEFAULT_THRESHOLD, readSettings, writeSettings, recordClaudeUsage, usageGuard, usageSummary, fullest, limitHitTarget, } from '../../core/session/usage-guard.js';
23
- import { detectTool } from '../../core/tasks/ledger.js';
6
+ import { DEFAULT_THRESHOLD, readSettings, writeSettings, recordClaudeUsage, usageSummary, latestClaudeReading, latestCodexReading, claudeCachedReading, desktopUsageReading, } from '../../core/session/usage-guard.js';
7
+ import { queueSessionCheckpoint } from '../../core/session/session-checkpoint.js';
24
8
  const GUARD_COMMAND = 'specweave usage-guard';
9
+ const LIMIT_HIT_COMMAND = `${GUARD_COMMAND} --limit-hit`;
25
10
  const STATUS_COMMAND = 'specweave statusline';
26
11
  async function readStdin() {
27
12
  if (process.stdin.isTTY)
@@ -52,34 +37,20 @@ export async function statuslineCommand(opts = {}) {
52
37
  }
53
38
  const cwd = input.workspace?.current_dir ?? input.cwd ?? process.cwd();
54
39
  const model = input.model?.display_name;
55
- const top = fullest(windows);
56
- process.stdout.write([path.basename(cwd), model, windows.length ? usageSummary(windows) : '', top && top.percent >= (readSettings(opts.home)?.at ?? 101) ? 'hand off' : '']
40
+ process.stdout.write([path.basename(cwd), model, windows.length ? usageSummary(windows) : '']
57
41
  .filter(Boolean).join(' · ') + '\n');
58
42
  return 0;
59
43
  }
60
- /**
61
- * Stop hook for Claude Code and Codex: `{}` or a block that asks for a handoff.
62
- * With `limitHit` (Grok Build's StopFailure hook) the model has already run
63
- * out, so the hook writes the handoff itself.
64
- */
44
+ /** Always return valid empty hook JSON. Saving happens outside the model turn. */
65
45
  export async function usageGuardCommand(opts = {}) {
66
- if (opts.limitHit) {
67
- try {
68
- const root = limitHitTarget(parse(opts.input ?? await readStdin()), { home: opts.home });
69
- if (root) {
70
- const { handoffCommand } = await import('./handoff.js');
71
- await handoffCommand({ cwd: root, reason: `rate limit reached in ${detectTool()}` });
72
- }
73
- }
74
- catch { /* a hook must never break the tool */ }
75
- return 0;
76
- }
77
- let result = {};
78
46
  try {
79
- result = usageGuard(parse(opts.input ?? await readStdin()), { home: opts.home });
47
+ const input = parse(opts.input ?? await readStdin());
48
+ if (readSettings(opts.home) && (!opts.limitHit || input.error === 'rate_limit')) {
49
+ await queueSessionCheckpoint(input, { home: opts.home });
50
+ }
80
51
  }
81
- catch { /* a hook must never break the tool */ }
82
- process.stdout.write(JSON.stringify(result) + '\n');
52
+ catch { /* a hook must never break the tool or steer the model */ }
53
+ process.stdout.write('{}\n');
83
54
  return 0;
84
55
  }
85
56
  function readJson(file) {
@@ -96,32 +67,38 @@ function writeJson(file, data) {
96
67
  fs.mkdirSync(path.dirname(file), { recursive: true });
97
68
  fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n');
98
69
  }
99
- function hasGuard(s) {
100
- return (s.hooks?.Stop ?? []).some((g) => (g.hooks ?? []).some((h) => h.command === GUARD_COMMAND));
70
+ function hasHook(s, event, command) {
71
+ return (s.hooks?.[event] ?? []).some((g) => (g.hooks ?? []).some((h) => h.command === command));
101
72
  }
102
- function addGuard(s) {
73
+ function addHook(s, event, group) {
74
+ const command = group.hooks?.[0]?.command ?? '';
75
+ if (hasHook(s, event, command))
76
+ return;
103
77
  s.hooks = s.hooks ?? {};
104
- s.hooks.Stop = [...(s.hooks.Stop ?? []), { hooks: [{ type: 'command', command: GUARD_COMMAND, timeout: 10 }] }];
78
+ s.hooks[event] = [...(s.hooks[event] ?? []), group];
105
79
  }
106
- function removeGuard(s) {
107
- if (!s.hooks?.Stop)
80
+ function removeHook(s, event, command) {
81
+ if (!s.hooks?.[event])
108
82
  return;
109
- s.hooks.Stop = s.hooks.Stop
110
- .map((g) => ({ ...g, hooks: (g.hooks ?? []).filter((h) => h.command !== GUARD_COMMAND) }))
83
+ s.hooks[event] = s.hooks[event]
84
+ .map((g) => ({ ...g, hooks: (g.hooks ?? []).filter((h) => h.command !== command) }))
111
85
  .filter((g) => g.hooks.length);
112
- if (!s.hooks.Stop.length)
113
- delete s.hooks.Stop;
86
+ if (!s.hooks[event].length)
87
+ delete s.hooks[event];
114
88
  if (!Object.keys(s.hooks).length)
115
89
  delete s.hooks;
116
90
  }
91
+ const STOP_HOOK = { hooks: [{ type: 'command', command: GUARD_COMMAND, timeout: 10 }] };
92
+ /** Claude Code: a failed turn can save without calling the model again. */
93
+ const CLAUDE_LIMIT_HOOK = { matcher: 'rate_limit', hooks: [{ type: 'command', command: LIMIT_HIT_COMMAND, timeout: 60 }] };
117
94
  const GROK_HOOK_FILE = 'specweave-auto-handoff.json';
118
- /** Grok Build hook file: hand off when a turn fails on the rate limit. */
95
+ /** Grok Build hook file: save locally when a turn fails on the rate limit. */
119
96
  export function grokHook() {
120
97
  return {
121
98
  hooks: {
122
99
  StopFailure: [{
123
100
  matcher: 'rate_limit',
124
- hooks: [{ type: 'command', command: `${GUARD_COMMAND} --limit-hit`, timeout: 60, env: { SPECWEAVE_TOOL: 'grok' } }],
101
+ hooks: [{ type: 'command', command: LIMIT_HIT_COMMAND, timeout: 60, env: { SPECWEAVE_TOOL: 'grok' } }],
125
102
  }],
126
103
  },
127
104
  };
@@ -153,35 +130,37 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
153
130
  previousStatusLine = claude.statusLine;
154
131
  claude.statusLine = { ...(claude.statusLine ?? {}), type: 'command', command: current ? `${STATUS_COMMAND} --wrap ${shellQuote(current)}` : STATUS_COMMAND };
155
132
  }
156
- if (!hasGuard(claude))
157
- addGuard(claude);
133
+ addHook(claude, 'Stop', STOP_HOOK);
134
+ addHook(claude, 'StopFailure', CLAUDE_LIMIT_HOOK);
158
135
  writeJson(claudeFile, claude);
159
- say(`Claude Code: status line ${current ? 'wraps your existing one' : 'set'} and Stop hook added in ${claudeFile}`);
136
+ say(`Claude Code: status line ${current ? 'wraps your existing one' : 'set'}, Stop and StopFailure hooks added in ${claudeFile}`);
160
137
  }
161
138
  if (fs.existsSync(path.dirname(codexFile))) {
162
139
  const codex = readJson(codexFile);
163
140
  if (!codex)
164
141
  say(`Left ${codexFile} alone: it is not valid JSON.`);
165
142
  else {
166
- if (!hasGuard(codex))
167
- addGuard(codex);
143
+ addHook(codex, 'Stop', STOP_HOOK);
168
144
  writeJson(codexFile, codex);
169
- say(`Codex: Stop hook added in ${codexFile} (Codex asks you to trust a new hook once)`);
145
+ say(`Codex: Stop hook added in ${codexFile}. Codex skips it until you trust it: open \`codex\` in a terminal once and approve the hook when it asks.`);
170
146
  }
171
147
  }
172
148
  if (fs.existsSync(path.join(home, '.grok'))) {
173
149
  writeJson(grokFile, grokHook());
174
- say(`Grok Build: StopFailure hook added in ${grokFile}; it hands off right after a turn hits the rate limit, since Grok shows no usage percentage`);
150
+ say(`Grok Build: StopFailure hook added in ${grokFile}; it saves a local checkpoint after a rate-limit failure`);
175
151
  }
176
152
  writeSettings({ at, since: new Date().toISOString(), ...(previousStatusLine ? { previousStatusLine } : {}) }, home);
177
- say(`Auto-handoff is on: at ${at}% of any usage window, the session runs \`specweave handoff\` and tells you to say "pick up" elsewhere.`);
153
+ say('Auto-handoff is on: local checkpoints refresh after turns, at most once every five minutes. Work continues; quota percentages never stop it.');
154
+ if (opts.at !== undefined)
155
+ say('--at is accepted for compatibility; checkpoints no longer depend on a usage threshold.');
178
156
  return 0;
179
157
  }
180
158
  if (action === 'off') {
181
159
  const settings = readSettings(home);
182
160
  const claude = readJson(claudeFile);
183
161
  if (claude && fs.existsSync(claudeFile)) {
184
- removeGuard(claude);
162
+ removeHook(claude, 'Stop', GUARD_COMMAND);
163
+ removeHook(claude, 'StopFailure', LIMIT_HIT_COMMAND);
185
164
  if (claude.statusLine?.command?.startsWith(STATUS_COMMAND)) {
186
165
  if (settings?.previousStatusLine)
187
166
  claude.statusLine = settings.previousStatusLine;
@@ -192,7 +171,7 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
192
171
  }
193
172
  const codex = fs.existsSync(codexFile) ? readJson(codexFile) : undefined;
194
173
  if (codex) {
195
- removeGuard(codex);
174
+ removeHook(codex, 'Stop', GUARD_COMMAND);
196
175
  writeJson(codexFile, codex);
197
176
  }
198
177
  fs.rmSync(grokFile, { force: true });
@@ -200,8 +179,104 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
200
179
  say('Auto-handoff is off; your previous status line is back.');
201
180
  return 0;
202
181
  }
203
- const settings = readSettings(home);
204
- say(settings ? `Auto-handoff is on at ${settings.at}% (since ${settings.since ?? 'unknown'}).` : 'Auto-handoff is off. Turn it on with `specweave auto-handoff on`.');
182
+ for (const line of autoHandoffStatus(home))
183
+ say(line);
205
184
  return 0;
206
185
  }
186
+ /**
187
+ * Codex runs a user hook only after the user trusts it, and records that in
188
+ * ~/.codex/config.toml as a `[hooks.state."<home>/.codex/hooks.json:stop:<group>:<hook>"]`
189
+ * table with a `trusted_hash`. Plugin hooks use keys like
190
+ * `"sw@specweave:hooks/hooks.json:stop:0:0"`, which say nothing about ours.
191
+ * The hash covers the hook's content, so a changed hook needs approving again.
192
+ * There is no command to approve one; Codex asks when it next starts in a terminal.
193
+ */
194
+ export function codexHookTrusted(home = os.homedir()) {
195
+ const hooksFile = path.join(home, '.codex', 'hooks.json');
196
+ const codex = readJson(hooksFile);
197
+ const groups = codex?.hooks?.Stop ?? [];
198
+ const wanted = new Set();
199
+ groups.forEach((g, gi) => (g.hooks ?? []).forEach((h, hi) => {
200
+ if (h.command === GUARD_COMMAND)
201
+ wanted.add(`${hooksFile}:stop:${gi}:${hi}`);
202
+ }));
203
+ if (!wanted.size)
204
+ return false;
205
+ let toml;
206
+ try {
207
+ toml = fs.readFileSync(path.join(home, '.codex', 'config.toml'), 'utf8');
208
+ }
209
+ catch {
210
+ return false;
211
+ }
212
+ let current;
213
+ for (const line of toml.split(/\r?\n/)) {
214
+ const table = line.match(/^\s*\[(.*)\]\s*(#.*)?$/);
215
+ if (table) {
216
+ const key = table[1].match(/^\s*hooks\.state\.\s*"((?:[^"\\]|\\.)*)"\s*$/);
217
+ current = key ? key[1].replace(/\\(.)/g, '$1') : undefined;
218
+ continue;
219
+ }
220
+ if (current && wanted.has(current) && /^\s*trusted_hash\s*=\s*"[^"]+"/.test(line))
221
+ return true;
222
+ }
223
+ return false;
224
+ }
225
+ function ago(ms, now) {
226
+ const min = Math.max(0, Math.round((now - ms) / 60000));
227
+ return min < 60 ? `${min} min ago` : min < 48 * 60 ? `${Math.round(min / 60)} h ago` : `${Math.round(min / 1440)} days ago`;
228
+ }
229
+ function readingLine(r, now) {
230
+ return r ? `last reading ${usageSummary(r.windows)} (${ago(r.at, now)})` : 'no usage reading yet';
231
+ }
232
+ /**
233
+ * What `auto-handoff status` prints: checkpoint policy, whether each tool's hooks
234
+ * are actually in place, and the last usage each tool reported.
235
+ */
236
+ export function autoHandoffStatus(home = os.homedir(), now = Date.now()) {
237
+ const settings = readSettings(home);
238
+ if (!settings)
239
+ return ['Auto-handoff is off. Turn it on with `specweave auto-handoff on`.'];
240
+ const lines = [`Auto-handoff is on: local background checkpoints every five minutes after turns (since ${settings.since ?? 'unknown'}).`];
241
+ let broken = false;
242
+ const claude = readJson(path.join(home, '.claude', 'settings.json'));
243
+ if (claude) {
244
+ const missing = [
245
+ claude.statusLine?.command?.startsWith(STATUS_COMMAND) ? '' : 'status line',
246
+ hasHook(claude, 'Stop', GUARD_COMMAND) ? '' : 'Stop hook',
247
+ hasHook(claude, 'StopFailure', LIMIT_HIT_COMMAND) ? '' : 'StopFailure hook',
248
+ ].filter(Boolean);
249
+ broken || (broken = missing.length > 0);
250
+ const statusReading = latestClaudeReading(home);
251
+ const fallbacks = [
252
+ [statusReading, ''],
253
+ [desktopUsageReading({ home, now }), ' from the desktop app'],
254
+ [claudeCachedReading({ home, now }), ' from Claude Code\'s usage cache'],
255
+ ];
256
+ const [best, source] = fallbacks.filter(([r]) => r).sort(([a], [b]) => b.at - a.at)[0] ?? [undefined, ''];
257
+ const reading = `${readingLine(best, now)}${source}`;
258
+ lines.push(`Claude Code: ${missing.length ? `missing ${missing.join(', ')}` : 'status line, Stop and StopFailure hooks in place'}; ${reading}`);
259
+ lines.push(' Usage readings are informational only; saving does not depend on a status line, account quota or proxy provider.');
260
+ }
261
+ const codexFile = path.join(home, '.codex', 'hooks.json');
262
+ if (fs.existsSync(path.dirname(codexFile))) {
263
+ const codex = readJson(codexFile);
264
+ const ok = !!codex && hasHook(codex, 'Stop', GUARD_COMMAND);
265
+ broken || (broken = !ok);
266
+ const trusted = codexHookTrusted(home);
267
+ lines.push(`Codex: ${ok ? `Stop hook in place${trusted ? '' : ' but not approved yet'}` : 'missing Stop hook'}; ${readingLine(latestCodexReading(home), now)}`);
268
+ if (ok && !trusted)
269
+ lines.push(' Codex skips a hook until you trust it: open `codex` in a terminal and approve the hook when it asks. It asks again whenever the hook changes, for example after `auto-handoff on` with a new SpecWeave version.');
270
+ }
271
+ if (fs.existsSync(path.join(home, '.grok'))) {
272
+ const ok = fs.existsSync(path.join(home, '.grok', 'hooks', GROK_HOOK_FILE));
273
+ broken || (broken = !ok);
274
+ lines.push(`Grok Build: ${ok ? 'StopFailure hook in place' : 'missing StopFailure hook'}; Grok reports no usage, so it saves locally when a turn hits the limit`);
275
+ }
276
+ lines.push(`Local checkpoints: ${path.join(home, '.specweave', 'checkpoints')} (per worktree and session; current.json points to the latest complete save).`);
277
+ lines.push('To transfer work to another tool or machine, run `specweave handoff` explicitly. Automatic checkpoints never push or release claims.');
278
+ if (broken)
279
+ lines.push('Run `specweave auto-handoff on` again to put the missing pieces back.');
280
+ return lines;
281
+ }
207
282
  //# sourceMappingURL=auto-handoff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../../../../src/cli/commands/auto-handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../../../../src/cli/commands/auto-handoff.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@
12
12
  * [--reason <r>] [--summary <s>] [--next <n>] [--gotcha <g>] \
13
13
  * [--decision <d> ...] [--inline] [--non-specweave] [--out <path>] [--json] \
14
14
  * [--push] [--keep-claims]
15
+ * specweave handoff --all [--reason <r>] [--out <dir>] [--dry-run] [--json]
15
16
  *
16
17
  * Output is three or four lines: what was handed off, how to continue ("pick
17
18
  * up" in the other tool), and where the details are. `--inline` prints a
@@ -20,6 +21,9 @@
20
21
  * With `--json`, the full {@link WorkHandoffResult} is printed as JSON instead
21
22
  * (for programmatic callers — e.g. the hook handler and tests).
22
23
  *
24
+ * `--all` writes the handoff index instead (every active increment plus the
25
+ * nested checkouts with local-only work); see core/session/handoff-all.
26
+ *
23
27
  * Part of increment 0867: Cross-Tool Work Handoff.
24
28
  *
25
29
  * @module cli/commands/handoff
@@ -49,8 +53,14 @@ export interface HandoffCommandOptions {
49
53
  push?: boolean;
50
54
  /** `--keep-claims` → do not release this agent's task claims. */
51
55
  keepClaims?: boolean;
56
+ /** `--all` → write the index of every active increment and nested repo. */
57
+ all?: boolean;
58
+ /** `--dry-run` (with `--all`) → print the index, write nothing. */
59
+ dryRun?: boolean;
52
60
  /** Override the starting directory for workspace resolution (tests). */
53
61
  cwd?: string;
54
62
  }
63
+ /** `specweave handoff --all`: write (or with `--dry-run` print) the handoff index. */
64
+ export declare function handoffAllCommand(opts?: HandoffCommandOptions): Promise<number>;
55
65
  export declare function handoffCommand(opts?: HandoffCommandOptions): Promise<void>;
56
66
  //# sourceMappingURL=handoff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEpF"}
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAYH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,sFAAsF;AACtF,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BzF;AAED,wBAAsB,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EpF"}