specweave 3.0.2 → 3.0.5

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 (92) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/bin/specweave.js +7 -2
  3. package/dist/src/cli/commands/auto-handoff.d.ts +21 -5
  4. package/dist/src/cli/commands/auto-handoff.d.ts.map +1 -1
  5. package/dist/src/cli/commands/auto-handoff.js +132 -28
  6. package/dist/src/cli/commands/auto-handoff.js.map +1 -1
  7. package/dist/src/cli/commands/handoff.d.ts +10 -0
  8. package/dist/src/cli/commands/handoff.d.ts.map +1 -1
  9. package/dist/src/cli/commands/handoff.js +50 -0
  10. package/dist/src/cli/commands/handoff.js.map +1 -1
  11. package/dist/src/cli/commands/jev-helpers.d.ts +1 -1
  12. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -1
  13. package/dist/src/cli/commands/jev-helpers.js +8 -4
  14. package/dist/src/cli/commands/jev-helpers.js.map +1 -1
  15. package/dist/src/cli/commands/jev.js +4 -4
  16. package/dist/src/cli/commands/jev.js.map +1 -1
  17. package/dist/src/cli/commands/pickup.d.ts +11 -0
  18. package/dist/src/cli/commands/pickup.d.ts.map +1 -1
  19. package/dist/src/cli/commands/pickup.js +28 -8
  20. package/dist/src/cli/commands/pickup.js.map +1 -1
  21. package/dist/src/cli/commands/refresh-plugins.d.ts.map +1 -1
  22. package/dist/src/cli/commands/refresh-plugins.js +3 -9
  23. package/dist/src/cli/commands/refresh-plugins.js.map +1 -1
  24. package/dist/src/cli/commands/task.js +6 -2
  25. package/dist/src/cli/commands/task.js.map +1 -1
  26. package/dist/src/cli/helpers/init/gitignore-generator.d.ts.map +1 -1
  27. package/dist/src/cli/helpers/init/gitignore-generator.js +35 -11
  28. package/dist/src/cli/helpers/init/gitignore-generator.js.map +1 -1
  29. package/dist/src/core/config/types.d.ts +2 -2
  30. package/dist/src/core/config/types.d.ts.map +1 -1
  31. package/dist/src/core/doctor/checkers/installation-health-checker.d.ts +3 -1
  32. package/dist/src/core/doctor/checkers/installation-health-checker.d.ts.map +1 -1
  33. package/dist/src/core/doctor/checkers/installation-health-checker.js +36 -62
  34. package/dist/src/core/doctor/checkers/installation-health-checker.js.map +1 -1
  35. package/dist/src/core/jev/client.d.ts +4 -1
  36. package/dist/src/core/jev/client.d.ts.map +1 -1
  37. package/dist/src/core/jev/client.js +118 -23
  38. package/dist/src/core/jev/client.js.map +1 -1
  39. package/dist/src/core/jev/config.d.ts +1 -1
  40. package/dist/src/core/jev/config.d.ts.map +1 -1
  41. package/dist/src/core/jev/config.js +8 -3
  42. package/dist/src/core/jev/config.js.map +1 -1
  43. package/dist/src/core/jev/openai.d.ts +21 -0
  44. package/dist/src/core/jev/openai.d.ts.map +1 -0
  45. package/dist/src/core/jev/openai.js +116 -0
  46. package/dist/src/core/jev/openai.js.map +1 -0
  47. package/dist/src/core/jev/usage.d.ts +4 -0
  48. package/dist/src/core/jev/usage.d.ts.map +1 -1
  49. package/dist/src/core/jev/usage.js +3 -0
  50. package/dist/src/core/jev/usage.js.map +1 -1
  51. package/dist/src/core/session/handoff-all.d.ts +124 -0
  52. package/dist/src/core/session/handoff-all.d.ts.map +1 -0
  53. package/dist/src/core/session/handoff-all.js +429 -0
  54. package/dist/src/core/session/handoff-all.js.map +1 -0
  55. package/dist/src/core/session/handoff-doc-format.d.ts +7 -0
  56. package/dist/src/core/session/handoff-doc-format.d.ts.map +1 -1
  57. package/dist/src/core/session/handoff-doc-format.js +12 -0
  58. package/dist/src/core/session/handoff-doc-format.js.map +1 -1
  59. package/dist/src/core/session/handoff-report.js +1 -0
  60. package/dist/src/core/session/handoff-report.js.map +1 -1
  61. package/dist/src/core/session/nested-repos.d.ts +90 -0
  62. package/dist/src/core/session/nested-repos.d.ts.map +1 -0
  63. package/dist/src/core/session/nested-repos.js +239 -0
  64. package/dist/src/core/session/nested-repos.js.map +1 -0
  65. package/dist/src/core/session/pickup.d.ts +1 -0
  66. package/dist/src/core/session/pickup.d.ts.map +1 -1
  67. package/dist/src/core/session/pickup.js +4 -4
  68. package/dist/src/core/session/pickup.js.map +1 -1
  69. package/dist/src/core/session/usage-guard.d.ts +84 -13
  70. package/dist/src/core/session/usage-guard.d.ts.map +1 -1
  71. package/dist/src/core/session/usage-guard.js +206 -15
  72. package/dist/src/core/session/usage-guard.js.map +1 -1
  73. package/dist/src/core/session/work-handoff.d.ts +2 -0
  74. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  75. package/dist/src/core/session/work-handoff.js +24 -3
  76. package/dist/src/core/session/work-handoff.js.map +1 -1
  77. package/dist/src/core/tasks/ledger.d.ts +5 -1
  78. package/dist/src/core/tasks/ledger.d.ts.map +1 -1
  79. package/dist/src/core/tasks/ledger.js +6 -2
  80. package/dist/src/core/tasks/ledger.js.map +1 -1
  81. package/dist/src/utils/cleanup-stale-plugins.d.ts +0 -8
  82. package/dist/src/utils/cleanup-stale-plugins.d.ts.map +1 -1
  83. package/dist/src/utils/cleanup-stale-plugins.js +0 -100
  84. package/dist/src/utils/cleanup-stale-plugins.js.map +1 -1
  85. package/dist/src/utils/plugin-copier.d.ts +10 -8
  86. package/dist/src/utils/plugin-copier.d.ts.map +1 -1
  87. package/dist/src/utils/plugin-copier.js +17 -55
  88. package/dist/src/utils/plugin-copier.js.map +1 -1
  89. package/package.json +1 -1
  90. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  91. package/plugins/specweave/skills/handoff/SKILL.md +42 -5
  92. package/plugins/specweave/skills/jev/SKILL.md +81 -83
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "3.0.2",
3
+ "version": "3.0.5",
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.2",
15
+ "version": "3.0.5",
16
16
  "author": {
17
17
  "name": "Anton Abyzov",
18
18
  "email": "anton.abyzov@gmail.com"
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)
@@ -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')
@@ -7,11 +7,13 @@
7
7
  * specweave usage-guard --limit-hit (StopFailure hook, Grok Build)
8
8
  *
9
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.
10
+ * Claude Code gets the status line (wrapping any existing one), a Stop hook
11
+ * and a StopFailure hook; Codex gets the same Stop hook in ~/.codex/hooks.json.
12
+ * From then on a session that reaches the threshold hands off by itself.
13
+ * Grok Build reports no usage percentage, so it gets only the StopFailure
14
+ * hook, in ~/.grok/hooks/; it runs the handoff itself right after a turn hits
15
+ * the rate limit. In Claude Code the same StopFailure hook is the backstop for
16
+ * a turn that jumps past the limit before the Stop hook could ask.
15
17
  *
16
18
  * @module cli/commands/auto-handoff
17
19
  */
@@ -54,5 +56,19 @@ export interface AutoHandoffOptions {
54
56
  home?: string;
55
57
  }
56
58
  export declare function autoHandoffCommand(action?: string, opts?: AutoHandoffOptions): Promise<number>;
59
+ /**
60
+ * Codex runs a user hook only after the user trusts it, and records that in
61
+ * ~/.codex/config.toml as a `[hooks.state."<home>/.codex/hooks.json:stop:<group>:<hook>"]`
62
+ * table with a `trusted_hash`. Plugin hooks use keys like
63
+ * `"sw@specweave:hooks/hooks.json:stop:0:0"`, which say nothing about ours.
64
+ * The hash covers the hook's content, so a changed hook needs approving again.
65
+ * There is no command to approve one; Codex asks when it next starts in a terminal.
66
+ */
67
+ export declare function codexHookTrusted(home?: string): boolean;
68
+ /**
69
+ * What `auto-handoff status` prints: the threshold, whether each tool's hooks
70
+ * are actually in place, and the last usage each tool reported.
71
+ */
72
+ export declare function autoHandoffStatus(home?: string, now?: number): string[];
57
73
  export {};
58
74
  //# 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;;;;;;;;;;;;;;;;;;GAkBG;AAgCH,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,CAkBzH;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,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,CAkE1G;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,CAyCjF"}
@@ -7,11 +7,13 @@
7
7
  * specweave usage-guard --limit-hit (StopFailure hook, Grok Build)
8
8
  *
9
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.
10
+ * Claude Code gets the status line (wrapping any existing one), a Stop hook
11
+ * and a StopFailure hook; Codex gets the same Stop hook in ~/.codex/hooks.json.
12
+ * From then on a session that reaches the threshold hands off by itself.
13
+ * Grok Build reports no usage percentage, so it gets only the StopFailure
14
+ * hook, in ~/.grok/hooks/; it runs the handoff itself right after a turn hits
15
+ * the rate limit. In Claude Code the same StopFailure hook is the backstop for
16
+ * a turn that jumps past the limit before the Stop hook could ask.
15
17
  *
16
18
  * @module cli/commands/auto-handoff
17
19
  */
@@ -19,9 +21,10 @@ import * as fs from 'fs';
19
21
  import * as os from 'os';
20
22
  import * as path from 'path';
21
23
  import { spawnSync } from 'child_process';
22
- import { DEFAULT_THRESHOLD, readSettings, writeSettings, recordClaudeUsage, usageGuard, usageSummary, fullest, limitHitTarget, } from '../../core/session/usage-guard.js';
24
+ import { DEFAULT_THRESHOLD, readSettings, writeSettings, recordClaudeUsage, usageGuard, usageSummary, fullest, limitHitTarget, latestClaudeReading, latestCodexReading, claudeCachedReading, desktopUsageReading, } from '../../core/session/usage-guard.js';
23
25
  import { detectTool } from '../../core/tasks/ledger.js';
24
26
  const GUARD_COMMAND = 'specweave usage-guard';
27
+ const LIMIT_HIT_COMMAND = `${GUARD_COMMAND} --limit-hit`;
25
28
  const STATUS_COMMAND = 'specweave statusline';
26
29
  async function readStdin() {
27
30
  if (process.stdin.isTTY)
@@ -68,7 +71,8 @@ export async function usageGuardCommand(opts = {}) {
68
71
  const root = limitHitTarget(parse(opts.input ?? await readStdin()), { home: opts.home });
69
72
  if (root) {
70
73
  const { handoffCommand } = await import('./handoff.js');
71
- await handoffCommand({ cwd: root, reason: `rate limit reached in ${detectTool()}` });
74
+ const tool = detectTool();
75
+ await handoffCommand({ cwd: root, reason: tool === 'cli' ? 'usage limit reached' : `usage limit reached in ${tool}` });
72
76
  }
73
77
  }
74
78
  catch { /* a hook must never break the tool */ }
@@ -96,24 +100,30 @@ function writeJson(file, data) {
96
100
  fs.mkdirSync(path.dirname(file), { recursive: true });
97
101
  fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n');
98
102
  }
99
- function hasGuard(s) {
100
- return (s.hooks?.Stop ?? []).some((g) => (g.hooks ?? []).some((h) => h.command === GUARD_COMMAND));
103
+ function hasHook(s, event, command) {
104
+ return (s.hooks?.[event] ?? []).some((g) => (g.hooks ?? []).some((h) => h.command === command));
101
105
  }
102
- function addGuard(s) {
106
+ function addHook(s, event, group) {
107
+ const command = group.hooks?.[0]?.command ?? '';
108
+ if (hasHook(s, event, command))
109
+ return;
103
110
  s.hooks = s.hooks ?? {};
104
- s.hooks.Stop = [...(s.hooks.Stop ?? []), { hooks: [{ type: 'command', command: GUARD_COMMAND, timeout: 10 }] }];
111
+ s.hooks[event] = [...(s.hooks[event] ?? []), group];
105
112
  }
106
- function removeGuard(s) {
107
- if (!s.hooks?.Stop)
113
+ function removeHook(s, event, command) {
114
+ if (!s.hooks?.[event])
108
115
  return;
109
- s.hooks.Stop = s.hooks.Stop
110
- .map((g) => ({ ...g, hooks: (g.hooks ?? []).filter((h) => h.command !== GUARD_COMMAND) }))
116
+ s.hooks[event] = s.hooks[event]
117
+ .map((g) => ({ ...g, hooks: (g.hooks ?? []).filter((h) => h.command !== command) }))
111
118
  .filter((g) => g.hooks.length);
112
- if (!s.hooks.Stop.length)
113
- delete s.hooks.Stop;
119
+ if (!s.hooks[event].length)
120
+ delete s.hooks[event];
114
121
  if (!Object.keys(s.hooks).length)
115
122
  delete s.hooks;
116
123
  }
124
+ const STOP_HOOK = { hooks: [{ type: 'command', command: GUARD_COMMAND, timeout: 10 }] };
125
+ /** Claude Code: a turn that failed on the usage limit (HTTP 429) hands off from the hook itself. */
126
+ const CLAUDE_LIMIT_HOOK = { matcher: 'rate_limit', hooks: [{ type: 'command', command: LIMIT_HIT_COMMAND, timeout: 60 }] };
117
127
  const GROK_HOOK_FILE = 'specweave-auto-handoff.json';
118
128
  /** Grok Build hook file: hand off when a turn fails on the rate limit. */
119
129
  export function grokHook() {
@@ -121,7 +131,7 @@ export function grokHook() {
121
131
  hooks: {
122
132
  StopFailure: [{
123
133
  matcher: 'rate_limit',
124
- hooks: [{ type: 'command', command: `${GUARD_COMMAND} --limit-hit`, timeout: 60, env: { SPECWEAVE_TOOL: 'grok' } }],
134
+ hooks: [{ type: 'command', command: LIMIT_HIT_COMMAND, timeout: 60, env: { SPECWEAVE_TOOL: 'grok' } }],
125
135
  }],
126
136
  },
127
137
  };
@@ -153,20 +163,19 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
153
163
  previousStatusLine = claude.statusLine;
154
164
  claude.statusLine = { ...(claude.statusLine ?? {}), type: 'command', command: current ? `${STATUS_COMMAND} --wrap ${shellQuote(current)}` : STATUS_COMMAND };
155
165
  }
156
- if (!hasGuard(claude))
157
- addGuard(claude);
166
+ addHook(claude, 'Stop', STOP_HOOK);
167
+ addHook(claude, 'StopFailure', CLAUDE_LIMIT_HOOK);
158
168
  writeJson(claudeFile, claude);
159
- say(`Claude Code: status line ${current ? 'wraps your existing one' : 'set'} and Stop hook added in ${claudeFile}`);
169
+ say(`Claude Code: status line ${current ? 'wraps your existing one' : 'set'}, Stop and StopFailure hooks added in ${claudeFile}`);
160
170
  }
161
171
  if (fs.existsSync(path.dirname(codexFile))) {
162
172
  const codex = readJson(codexFile);
163
173
  if (!codex)
164
174
  say(`Left ${codexFile} alone: it is not valid JSON.`);
165
175
  else {
166
- if (!hasGuard(codex))
167
- addGuard(codex);
176
+ addHook(codex, 'Stop', STOP_HOOK);
168
177
  writeJson(codexFile, codex);
169
- say(`Codex: Stop hook added in ${codexFile} (Codex asks you to trust a new hook once)`);
178
+ 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
179
  }
171
180
  }
172
181
  if (fs.existsSync(path.join(home, '.grok'))) {
@@ -181,7 +190,8 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
181
190
  const settings = readSettings(home);
182
191
  const claude = readJson(claudeFile);
183
192
  if (claude && fs.existsSync(claudeFile)) {
184
- removeGuard(claude);
193
+ removeHook(claude, 'Stop', GUARD_COMMAND);
194
+ removeHook(claude, 'StopFailure', LIMIT_HIT_COMMAND);
185
195
  if (claude.statusLine?.command?.startsWith(STATUS_COMMAND)) {
186
196
  if (settings?.previousStatusLine)
187
197
  claude.statusLine = settings.previousStatusLine;
@@ -192,7 +202,7 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
192
202
  }
193
203
  const codex = fs.existsSync(codexFile) ? readJson(codexFile) : undefined;
194
204
  if (codex) {
195
- removeGuard(codex);
205
+ removeHook(codex, 'Stop', GUARD_COMMAND);
196
206
  writeJson(codexFile, codex);
197
207
  }
198
208
  fs.rmSync(grokFile, { force: true });
@@ -200,8 +210,102 @@ export async function autoHandoffCommand(action = 'status', opts = {}) {
200
210
  say('Auto-handoff is off; your previous status line is back.');
201
211
  return 0;
202
212
  }
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`.');
213
+ for (const line of autoHandoffStatus(home))
214
+ say(line);
205
215
  return 0;
206
216
  }
217
+ /**
218
+ * Codex runs a user hook only after the user trusts it, and records that in
219
+ * ~/.codex/config.toml as a `[hooks.state."<home>/.codex/hooks.json:stop:<group>:<hook>"]`
220
+ * table with a `trusted_hash`. Plugin hooks use keys like
221
+ * `"sw@specweave:hooks/hooks.json:stop:0:0"`, which say nothing about ours.
222
+ * The hash covers the hook's content, so a changed hook needs approving again.
223
+ * There is no command to approve one; Codex asks when it next starts in a terminal.
224
+ */
225
+ export function codexHookTrusted(home = os.homedir()) {
226
+ const hooksFile = path.join(home, '.codex', 'hooks.json');
227
+ const codex = readJson(hooksFile);
228
+ const groups = codex?.hooks?.Stop ?? [];
229
+ const wanted = new Set();
230
+ groups.forEach((g, gi) => (g.hooks ?? []).forEach((h, hi) => {
231
+ if (h.command === GUARD_COMMAND)
232
+ wanted.add(`${hooksFile}:stop:${gi}:${hi}`);
233
+ }));
234
+ if (!wanted.size)
235
+ return false;
236
+ let toml;
237
+ try {
238
+ toml = fs.readFileSync(path.join(home, '.codex', 'config.toml'), 'utf8');
239
+ }
240
+ catch {
241
+ return false;
242
+ }
243
+ let current;
244
+ for (const line of toml.split(/\r?\n/)) {
245
+ const table = line.match(/^\s*\[(.*)\]\s*(#.*)?$/);
246
+ if (table) {
247
+ const key = table[1].match(/^\s*hooks\.state\.\s*"((?:[^"\\]|\\.)*)"\s*$/);
248
+ current = key ? key[1].replace(/\\(.)/g, '$1') : undefined;
249
+ continue;
250
+ }
251
+ if (current && wanted.has(current) && /^\s*trusted_hash\s*=\s*"[^"]+"/.test(line))
252
+ return true;
253
+ }
254
+ return false;
255
+ }
256
+ function ago(ms, now) {
257
+ const min = Math.max(0, Math.round((now - ms) / 60000));
258
+ return min < 60 ? `${min} min ago` : min < 48 * 60 ? `${Math.round(min / 60)} h ago` : `${Math.round(min / 1440)} days ago`;
259
+ }
260
+ function readingLine(r, now) {
261
+ return r ? `last reading ${usageSummary(r.windows)} (${ago(r.at, now)})` : 'no usage reading yet';
262
+ }
263
+ /**
264
+ * What `auto-handoff status` prints: the threshold, whether each tool's hooks
265
+ * are actually in place, and the last usage each tool reported.
266
+ */
267
+ export function autoHandoffStatus(home = os.homedir(), now = Date.now()) {
268
+ const settings = readSettings(home);
269
+ if (!settings)
270
+ return ['Auto-handoff is off. Turn it on with `specweave auto-handoff on`.'];
271
+ const lines = [`Auto-handoff is on at ${settings.at}% (since ${settings.since ?? 'unknown'}).`];
272
+ let broken = false;
273
+ const claude = readJson(path.join(home, '.claude', 'settings.json'));
274
+ if (claude) {
275
+ const missing = [
276
+ claude.statusLine?.command?.startsWith(STATUS_COMMAND) ? '' : 'status line',
277
+ hasHook(claude, 'Stop', GUARD_COMMAND) ? '' : 'Stop hook',
278
+ hasHook(claude, 'StopFailure', LIMIT_HIT_COMMAND) ? '' : 'StopFailure hook',
279
+ ].filter(Boolean);
280
+ broken || (broken = missing.length > 0);
281
+ const statusReading = latestClaudeReading(home);
282
+ const fallbacks = [
283
+ [statusReading, ''],
284
+ [desktopUsageReading({ home, now }), ' from the desktop app'],
285
+ [claudeCachedReading({ home, now }), ' from Claude Code\'s usage cache'],
286
+ ];
287
+ const [best, source] = fallbacks.filter(([r]) => r).sort(([a], [b]) => b.at - a.at)[0] ?? [undefined, ''];
288
+ const reading = `${readingLine(best, now)}${source}`;
289
+ lines.push(`Claude Code: ${missing.length ? `missing ${missing.join(', ')}` : 'status line, Stop and StopFailure hooks in place'}; ${reading}`);
290
+ lines.push(' Desktop, Remote Control and `claude -p` sessions run no status line. They read the desktop app\'s usage samples (every 15 minutes or so) or Claude Code\'s usage cache when either is fresh, so a jump past the threshold between samples is missed; then they hand off when a turn hits the limit.');
291
+ }
292
+ const codexFile = path.join(home, '.codex', 'hooks.json');
293
+ if (fs.existsSync(path.dirname(codexFile))) {
294
+ const codex = readJson(codexFile);
295
+ const ok = !!codex && hasHook(codex, 'Stop', GUARD_COMMAND);
296
+ broken || (broken = !ok);
297
+ const trusted = codexHookTrusted(home);
298
+ lines.push(`Codex: ${ok ? `Stop hook in place${trusted ? '' : ' but not approved yet'}` : 'missing Stop hook'}; ${readingLine(latestCodexReading(home), now)}`);
299
+ if (ok && !trusted)
300
+ 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.');
301
+ }
302
+ if (fs.existsSync(path.join(home, '.grok'))) {
303
+ const ok = fs.existsSync(path.join(home, '.grok', 'hooks', GROK_HOOK_FILE));
304
+ broken || (broken = !ok);
305
+ lines.push(`Grok Build: ${ok ? 'StopFailure hook in place' : 'missing StopFailure hook'}; Grok reports no usage, so it hands off when a turn hits the limit`);
306
+ }
307
+ if (broken)
308
+ lines.push('Run `specweave auto-handoff on` again to put the missing pieces back.');
309
+ return lines;
310
+ }
207
311
  //# 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"}
@@ -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,13 +21,62 @@
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
26
30
  */
31
+ import * as fs from 'fs';
27
32
  import * as path from 'path';
33
+ import { resolveEffectiveRoot } from '../../utils/find-project-root.js';
34
+ import { writeHandoffIndex } from '../../core/session/handoff-all.js';
28
35
  import { buildWorkHandoff, AmbiguousActiveIncrementError, } from '../../core/session/work-handoff.js';
36
+ /** `specweave handoff --all`: write (or with `--dry-run` print) the handoff index. */
37
+ export async function handoffAllCommand(opts = {}) {
38
+ const root = resolveEffectiveRoot(opts.cwd ?? process.cwd());
39
+ if (!fs.existsSync(path.join(root, '.specweave'))) {
40
+ process.stderr.write('Not a SpecWeave workspace: `handoff --all` needs a .specweave folder.\n');
41
+ return 1;
42
+ }
43
+ const result = await writeHandoffIndex(root, { reason: opts.reason, outDir: opts.out, dryRun: opts.dryRun });
44
+ if (opts.json) {
45
+ process.stdout.write(JSON.stringify(result.index, null, 2) + '\n');
46
+ return 0;
47
+ }
48
+ if (opts.dryRun) {
49
+ process.stdout.write(result.markdown);
50
+ return 0;
51
+ }
52
+ const rel = (p) => path.relative(root, p).split(path.sep).join('/');
53
+ const waiting = result.index.rows.filter((r) => r.waits.length).length;
54
+ const repos = result.index.repos;
55
+ const out = [
56
+ `Indexed ${result.index.rows.length} active increment${result.index.rows.length === 1 ? '' : 's'} (${result.index.rows.length - waiting} actionable, ${waiting} waiting on a person)` +
57
+ (repos ? `; ${repos.flagged.length} of ${repos.scanned} checkouts hold local-only work.` : '.'),
58
+ 'Nothing was committed or pushed. Commit and push the local-only work listed there, or tell the next session about it.',
59
+ 'On the other side, say "pick up all" (or run `specweave pickup --all`).',
60
+ `Details: ${rel(result.mdPath)} and ${rel(result.jsonPath)}`,
61
+ ];
62
+ process.stdout.write(out.join('\n') + '\n');
63
+ return 0;
64
+ }
29
65
  export async function handoffCommand(opts = {}) {
66
+ if (opts.all) {
67
+ if (opts.incrementId) {
68
+ process.stderr.write('`--all` covers every active increment; drop the increment id or drop --all.\n');
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ process.exitCode = await handoffAllCommand(opts);
73
+ return;
74
+ }
75
+ if (opts.dryRun) {
76
+ process.stderr.write('`--dry-run` works with `--all` only.\n');
77
+ process.exitCode = 1;
78
+ return;
79
+ }
30
80
  const startDir = opts.cwd ?? process.cwd();
31
81
  const builderOpts = {
32
82
  incrementId: opts.incrementId,
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../../src/cli/commands/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,6BAA6B,GAE9B,MAAM,oCAAoC,CAAC;AA+B5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B,EAAE;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAuB;QACtC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,QAAQ;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;IAEF,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,6BAA6B,EAAE,CAAC;YACjD,yEAAyE;YACzE,4EAA4E;YAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD;gBACnD,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClD,oDAAoD,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAC5E,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;IAChG,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;SAC/D,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU;QAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClE,GAAG,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1H,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAC5G,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;QAC1G,GAAG,CAAC,IAAI,CAAC,iJAAiJ,CAAC,CAAC;IAC9J,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAE5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../../src/cli/commands/handoff.ts"],"names":[],"mappings":"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"}
@@ -110,7 +110,7 @@ export declare function shorthandQuestions(opts: {
110
110
  /** Body of a `## <heading>` section of a markdown doc, up to the next `## `. */
111
111
  export declare function extractSection(markdown: string, heading: string): string;
112
112
  /** `0.0000155` → `$0.0000155`; small enough that toFixed(2) would read as $0.00. */
113
- export declare function formatCost(cost: number): string;
113
+ export declare function formatCost(cost: number | undefined): string;
114
114
  /** `{a: 0.91, b: 0.09}` → `a 0.91 · b 0.09`, highest first, top 5. */
115
115
  export declare function formatProbabilities(probabilities: Record<string, number>): string;
116
116
  export interface JevCommandOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"jev-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/jev-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jev-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/jev-helpers.ts"],"names":[],"mappings":"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"}
@@ -408,7 +408,9 @@ export function extractSection(markdown, heading) {
408
408
  }
409
409
  /** `0.0000155` → `$0.0000155`; small enough that toFixed(2) would read as $0.00. */
410
410
  export function formatCost(cost) {
411
- if (!Number.isFinite(cost) || cost === 0)
411
+ if (cost === undefined || !Number.isFinite(cost))
412
+ return 'unknown';
413
+ if (cost === 0)
412
414
  return '$0';
413
415
  return cost < 0.01 ? `$${cost.toPrecision(3)}` : `$${cost.toFixed(4)}`;
414
416
  }
@@ -487,7 +489,7 @@ export async function jevDoctor(root, env, opts) {
487
489
  else {
488
490
  out(' ping skipped (Jev unavailable)');
489
491
  }
490
- out(` usage ${summary.calls} call(s) · ${summary.input_tokens} input tokens · ${formatCost(summary.cost)}`);
492
+ out(` usage ${summary.calls} call(s) · ${summary.input_tokens} input tokens · ${formatCost(summary.unknownCostCalls ? undefined : summary.cost)}`);
491
493
  if (unavailable)
492
494
  err('Jev unavailable: run `specweave jev setup` (exit 4 = continue without Jev)');
493
495
  return code;
@@ -515,8 +517,8 @@ export async function jevSetup(root, env, opts) {
515
517
  return EXIT.ok;
516
518
  }
517
519
  const requested = opts.provider?.trim().toLowerCase();
518
- if (requested && requested !== 'openrouter' && requested !== 'typesafe') {
519
- err(`Unknown provider "${opts.provider}". Use: openrouter | typesafe`);
520
+ if (requested && requested !== 'openrouter' && requested !== 'typesafe' && requested !== 'openai') {
521
+ err(`Unknown provider "${opts.provider}". Use: openrouter | typesafe | openai`);
520
522
  return EXIT.error;
521
523
  }
522
524
  const provider = requested ?? cfg.provider;
@@ -528,6 +530,7 @@ export async function jevSetup(root, env, opts) {
528
530
  enabled: true,
529
531
  provider,
530
532
  model,
533
+ apiKeyEnv: provider === cfg.provider ? cfg.apiKeyEnv : undefined,
531
534
  guards: { bash: guardBash },
532
535
  };
533
536
  const key = resolveApiKey(candidate, env);
@@ -551,6 +554,7 @@ export async function jevSetup(root, env, opts) {
551
554
  enabled: true,
552
555
  provider,
553
556
  model,
557
+ apiKeyEnv: provider === cfg.provider ? cfg.apiKeyEnv : undefined,
554
558
  guards: { bash: guardBash },
555
559
  });
556
560
  const markerPresent = setGuardMarker(root, guardBash);