@ironbee-ai/cli 0.16.0 → 0.17.1

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 (84) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/clients/base.d.ts +17 -4
  3. package/dist/clients/base.d.ts.map +1 -1
  4. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  5. package/dist/clients/claude/hooks/clear-verdict.js +6 -1
  6. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  7. package/dist/clients/claude/hooks/require-verdict.d.ts +8 -1
  8. package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
  9. package/dist/clients/claude/hooks/require-verdict.js +9 -2
  10. package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
  11. package/dist/clients/claude/hooks/require-verification.d.ts +10 -1
  12. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  13. package/dist/clients/claude/hooks/require-verification.js +34 -6
  14. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  15. package/dist/clients/claude/index.d.ts +6 -2
  16. package/dist/clients/claude/index.d.ts.map +1 -1
  17. package/dist/clients/claude/index.js +65 -32
  18. package/dist/clients/claude/index.js.map +1 -1
  19. package/dist/clients/codex/hooks/clear-verdict.d.ts.map +1 -1
  20. package/dist/clients/codex/hooks/clear-verdict.js +5 -1
  21. package/dist/clients/codex/hooks/clear-verdict.js.map +1 -1
  22. package/dist/clients/codex/hooks/require-verdict.d.ts +7 -1
  23. package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -1
  24. package/dist/clients/codex/hooks/require-verdict.js +8 -2
  25. package/dist/clients/codex/hooks/require-verdict.js.map +1 -1
  26. package/dist/clients/codex/hooks/require-verification.d.ts +9 -1
  27. package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -1
  28. package/dist/clients/codex/hooks/require-verification.js +25 -5
  29. package/dist/clients/codex/hooks/require-verification.js.map +1 -1
  30. package/dist/clients/codex/index.d.ts +12 -2
  31. package/dist/clients/codex/index.d.ts.map +1 -1
  32. package/dist/clients/codex/index.js +73 -37
  33. package/dist/clients/codex/index.js.map +1 -1
  34. package/dist/clients/codex/util.d.ts +11 -6
  35. package/dist/clients/codex/util.d.ts.map +1 -1
  36. package/dist/clients/codex/util.js +41 -13
  37. package/dist/clients/codex/util.js.map +1 -1
  38. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  39. package/dist/clients/cursor/hooks/clear-verdict.js +4 -1
  40. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  41. package/dist/clients/cursor/hooks/require-verdict.d.ts +7 -1
  42. package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -1
  43. package/dist/clients/cursor/hooks/require-verdict.js +8 -2
  44. package/dist/clients/cursor/hooks/require-verdict.js.map +1 -1
  45. package/dist/clients/cursor/hooks/require-verification.d.ts +8 -1
  46. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  47. package/dist/clients/cursor/hooks/require-verification.js +27 -6
  48. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  49. package/dist/clients/cursor/index.d.ts +6 -2
  50. package/dist/clients/cursor/index.d.ts.map +1 -1
  51. package/dist/clients/cursor/index.js +56 -30
  52. package/dist/clients/cursor/index.js.map +1 -1
  53. package/dist/commands/hook.js +4 -2
  54. package/dist/commands/hook.js.map +1 -1
  55. package/dist/commands/verification-toggle.d.ts +19 -0
  56. package/dist/commands/verification-toggle.d.ts.map +1 -1
  57. package/dist/commands/verification-toggle.js +88 -5
  58. package/dist/commands/verification-toggle.js.map +1 -1
  59. package/dist/commands/verification.d.ts +3 -0
  60. package/dist/commands/verification.d.ts.map +1 -1
  61. package/dist/commands/verification.js +34 -3
  62. package/dist/commands/verification.js.map +1 -1
  63. package/dist/hooks/core/activity-end.d.ts +8 -0
  64. package/dist/hooks/core/activity-end.d.ts.map +1 -1
  65. package/dist/hooks/core/activity-end.js +15 -0
  66. package/dist/hooks/core/activity-end.js.map +1 -1
  67. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  68. package/dist/hooks/core/submit-verdict.js +29 -17
  69. package/dist/hooks/core/submit-verdict.js.map +1 -1
  70. package/dist/hooks/core/verification-lifecycle.d.ts +20 -0
  71. package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -1
  72. package/dist/hooks/core/verification-lifecycle.js +41 -0
  73. package/dist/hooks/core/verification-lifecycle.js.map +1 -1
  74. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  75. package/dist/hooks/core/verify-gate.js +11 -5
  76. package/dist/hooks/core/verify-gate.js.map +1 -1
  77. package/dist/lib/config.d.ts +40 -0
  78. package/dist/lib/config.d.ts.map +1 -1
  79. package/dist/lib/config.js +52 -1
  80. package/dist/lib/config.js.map +1 -1
  81. package/dist/tui/config/schema.d.ts.map +1 -1
  82. package/dist/tui/config/schema.js +8 -0
  83. package/dist/tui/config/schema.js.map +1 -1
  84. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.1 (2026-06-03)
4
+
5
+ ### Bug Fixes
6
+
7
+ * **codex:** strip orphaned MCP child sub-tables on server removal ([15e5be1](https://github.com/ironbee-ai/ironbee-cli/commit/15e5be1ce6d821e091bd5326b693fb29cde31ac9))
8
+
9
+ ## 0.17.0 (2026-06-03)
10
+
11
+ ### Features
12
+
13
+ * **verification:** add assist mode (verification.auto sub-toggle) ([#20](https://github.com/ironbee-ai/ironbee-cli/issues/20)) ([d57b5df](https://github.com/ironbee-ai/ironbee-cli/commit/d57b5df045e1d915d65cc7057e4dba5d3f4b9ef5))
14
+
3
15
  ## 0.16.0 (2026-06-02)
4
16
 
5
17
  ## 0.15.0 (2026-05-26)
@@ -38,10 +38,23 @@ export interface IClient {
38
38
  runTrackActionMonitor(projectDir: string): Promise<void>;
39
39
  /** Runs the session-start hook for this client. */
40
40
  runSessionStart(projectDir: string): Promise<void>;
41
- /** Runs the require-verdict PreToolUse hook for this client. */
42
- runRequireVerdict(projectDir: string): Promise<void>;
43
- /** Runs the require-verification PreToolUse hook for this client. */
44
- runRequireVerification(projectDir: string): Promise<void>;
41
+ /**
42
+ * Runs the require-verdict PreToolUse hook for this client.
43
+ * `opts.soft` (assist mode `verification.auto: false`) runs the
44
+ * non-blocking variant: still stashes create-vs-update / changeset state but
45
+ * never blocks the edit.
46
+ */
47
+ runRequireVerdict(projectDir: string, opts?: {
48
+ soft?: boolean;
49
+ }): Promise<void>;
50
+ /**
51
+ * Runs the require-verification PreToolUse hook for this client.
52
+ * `opts.soft` (assist mode) runs the non-blocking variant: still injects
53
+ * `_metadata` into the tool input but never blocks the devtools call.
54
+ */
55
+ runRequireVerification(projectDir: string, opts?: {
56
+ soft?: boolean;
57
+ }): Promise<void>;
45
58
  /** Runs the activity-start hook for this client (UserPromptSubmit / beforeSubmitPrompt). */
46
59
  runActivityStart(projectDir: string): Promise<void>;
47
60
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/clients/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wEAAwE;IACxE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAE1D,2EAA2E;IAC3E,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,yFAAyF;IACzF,iBAAiB,IAAI,MAAM,CAAC;IAE5B,sDAAsD;IACtD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,+DAA+D;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,8DAA8D;IAC9D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;;;;OAOG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;;;;OAKG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,mDAAmD;IACnD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,gEAAgE;IAChE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD,qEAAqE;IACrE,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,4FAA4F;IAC5F,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD,8DAA8D;IAC9D,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/clients/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wEAAwE;IACxE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAE1D,2EAA2E;IAC3E,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,yFAAyF;IACzF,iBAAiB,IAAI,MAAM,CAAC;IAE5B,sDAAsD;IACtD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,+DAA+D;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,8DAA8D;IAC9D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;;;;OAOG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;;;;OAKG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,mDAAmD;IACnD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;;;;OAKG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhF;;;;OAIG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErF,4FAA4F;IAC5F,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD,8DAA8D;IAC9D,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"clear-verdict.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/clear-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoFH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E3D"}
1
+ {"version":3,"file":"clear-verdict.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/clear-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqFH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkF3D"}
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.run = run;
18
18
  const fs_1 = require("fs");
19
19
  const clear_verdict_1 = require("../../../hooks/core/clear-verdict");
20
+ const verification_lifecycle_1 = require("../../../hooks/core/verification-lifecycle");
20
21
  const actions_1 = require("../../../hooks/core/actions");
21
22
  const session_state_1 = require("../../../hooks/core/session-state");
22
23
  const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
@@ -99,6 +100,10 @@ async function run(projectDir) {
99
100
  logger_1.logger.debug(`skipping clear-verdict: unsupported tool ${input.tool_name}`);
100
101
  process.exit(0);
101
102
  }
103
+ // Open a fix cycle lazily if this edit is addressing a failed verification
104
+ // (lastVerdictStatus === "fail"). Returns the fix_id to tag this change
105
+ // with, or undefined when it's ordinary coding (no prior fail / post-pass).
106
+ const fixId = await (0, verification_lifecycle_1.openFixCycleIfFixing)({ sessionDir, actionsFile });
102
107
  const entry = {
103
108
  ...(0, actions_1.baseFields)(actionsFile),
104
109
  type: "file_change",
@@ -109,7 +114,7 @@ async function run(projectDir) {
109
114
  lines_added: facts.lines_added,
110
115
  lines_removed: facts.lines_removed,
111
116
  activity_id: (0, session_state_1.getActiveActivityId)(sessionDir),
112
- fix_id: (0, session_state_1.getActiveFixId)(sessionDir),
117
+ fix_id: fixId,
113
118
  };
114
119
  // Live↔import event.id parity. Per CLAUDE.md events.md: "live and import
115
120
  // events collide cleanly on (session_id, id)". Claude's import path
@@ -1 +1 @@
1
- {"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/clear-verdict.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/clear-verdict.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,13 @@
13
13
  *
14
14
  * Exit 0 = allow edit
15
15
  * Exit 2 = block edit (stderr message shown to agent)
16
+ *
17
+ * **Soft mode** (`opts.soft`, installed in assist mode — `verification.auto:
18
+ * false`): never blocks. The "used devtools without verdict" exit is skipped;
19
+ * the hook still performs the create-vs-update / changeset pre-read stash so
20
+ * file_change events stay accurate, and still opens the activity.
16
21
  */
17
- export declare function run(projectDir: string): Promise<void>;
22
+ export declare function run(projectDir: string, opts?: {
23
+ soft?: boolean;
24
+ }): Promise<void>;
18
25
  //# sourceMappingURL=require-verdict.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"require-verdict.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD3D"}
1
+ {"version":3,"file":"require-verdict.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAmBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDtF"}
@@ -14,6 +14,11 @@
14
14
  *
15
15
  * Exit 0 = allow edit
16
16
  * Exit 2 = block edit (stderr message shown to agent)
17
+ *
18
+ * **Soft mode** (`opts.soft`, installed in assist mode — `verification.auto:
19
+ * false`): never blocks. The "used devtools without verdict" exit is skipped;
20
+ * the hook still performs the create-vs-update / changeset pre-read stash so
21
+ * file_change events stay accurate, and still opens the activity.
17
22
  */
18
23
  Object.defineProperty(exports, "__esModule", { value: true });
19
24
  exports.run = run;
@@ -24,7 +29,8 @@ const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
24
29
  const config_1 = require("../../../lib/config");
25
30
  const logger_1 = require("../../../lib/logger");
26
31
  const stdin_1 = require("../../../lib/stdin");
27
- async function run(projectDir) {
32
+ async function run(projectDir, opts) {
33
+ const soft = opts?.soft === true;
28
34
  let input;
29
35
  try {
30
36
  input = JSON.parse((0, stdin_1.readStdin)());
@@ -37,7 +43,8 @@ async function run(projectDir) {
37
43
  (0, logger_1.setLogFile)(`${projectDir}/.ironbee/sessions/${sessionId}/session.log`);
38
44
  const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
39
45
  const actionsFile = `${sessionDir}/actions.jsonl`;
40
- if ((0, actions_1.hasToolCallsSinceLastVerdict)(actionsFile)) {
46
+ // Soft mode (assist) never blocks — it only stashes for file_change accuracy.
47
+ if (!soft && (0, actions_1.hasToolCallsSinceLastVerdict)(actionsFile)) {
41
48
  process.stderr.write(`BLOCKED: You used verification tools (browser-devtools / node-devtools / backend-devtools) but did not submit a verdict. You MUST submit a verdict (pass or fail) before editing code.
42
49
 
43
50
  Submit your verdict first:
@@ -1 +1 @@
1
- {"version":3,"file":"require-verdict.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verdict.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAmBH,kBAmDC;AApED,2BAA8C;AAC9C,yDAA2E;AAC3E,2DAA6D;AAC7D,uEAAsF;AACtF,gDAAyF;AACzF,gDAAyD;AACzD,8CAA+C;AAWxC,KAAK,UAAU,GAAG,CAAC,UAAkB;IACxC,IAAI,KAA4B,CAAC;IACjC,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAA0B,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAW,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IACxD,IAAA,mBAAU,EAAC,GAAG,UAAU,sBAAsB,SAAS,cAAc,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAW,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAW,GAAG,UAAU,gBAAgB,CAAC;IAE1D,IAAI,IAAA,sCAA4B,EAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;yBAGJ,SAAS;;;CAGjC,CAAC,CAAC;QACK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAuB,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IACjE,IAAI,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAkB,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAY,IAAA,gCAAuB,EAAC,MAAM,CAAC,CAAC;QAClE,MAAM,WAAW,GAAY,IAAA,eAAU,EAAC,QAAQ,CAAC,CAAC;QAElD,uEAAuE;QACvE,mEAAmE;QACnE,iEAAiE;QACjE,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,gBAAgB,CAAC,EAAE,CAAC;YAClF,MAAM,KAAK,GAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAC5D,IAAI,gBAAgB,IAAI,WAAW,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACD,KAAK,CAAC,aAAa,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,eAAM,CAAC,KAAK,CAAC,sBAAsB,QAAQ,2BAA2B,CAAC,EAAE,CAAC,CAAC;gBAC/E,CAAC;YACL,CAAC;YACD,IAAA,iCAAgB,EAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,MAAM,IAAA,wBAAa,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAEzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"require-verdict.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verdict.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAmBH,kBAqDC;AAtED,2BAA8C;AAC9C,yDAA2E;AAC3E,2DAA6D;AAC7D,uEAAsF;AACtF,gDAAyF;AACzF,gDAAyD;AACzD,8CAA+C;AAWxC,KAAK,UAAU,GAAG,CAAC,UAAkB,EAAE,IAAyB;IACnE,MAAM,IAAI,GAAY,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC1C,IAAI,KAA4B,CAAC;IACjC,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAA0B,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAW,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IACxD,IAAA,mBAAU,EAAC,GAAG,UAAU,sBAAsB,SAAS,cAAc,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAW,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAW,GAAG,UAAU,gBAAgB,CAAC;IAE1D,8EAA8E;IAC9E,IAAI,CAAC,IAAI,IAAI,IAAA,sCAA4B,EAAC,WAAW,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;yBAGJ,SAAS;;;CAGjC,CAAC,CAAC;QACK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAuB,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IACjE,IAAI,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAkB,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAY,IAAA,gCAAuB,EAAC,MAAM,CAAC,CAAC;QAClE,MAAM,WAAW,GAAY,IAAA,eAAU,EAAC,QAAQ,CAAC,CAAC;QAElD,uEAAuE;QACvE,mEAAmE;QACnE,iEAAiE;QACjE,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,gBAAgB,CAAC,EAAE,CAAC;YAClF,MAAM,KAAK,GAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAC5D,IAAI,gBAAgB,IAAI,WAAW,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACD,KAAK,CAAC,aAAa,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,eAAM,CAAC,KAAK,CAAC,sBAAsB,QAAQ,2BAA2B,CAAC,EAAE,CAAC,CAAC;gBAC/E,CAAC;YACL,CAAC;YACD,IAAA,iCAAgB,EAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,MAAM,IAAA,wBAAa,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAEzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
@@ -14,6 +14,15 @@
14
14
  *
15
15
  * Exit 0 = allow tool (with updatedInput containing _metadata)
16
16
  * Exit 2 = block tool
17
+ *
18
+ * **Soft mode** (`opts.soft`, installed in assist mode — `verification.auto:
19
+ * false`): never blocks. The two enforcement exits (no active cycle, recording
20
+ * required) are skipped — the hook only injects `_metadata` so MCP-side
21
+ * tool_call events keep collector routing + session correlation even when the
22
+ * agent uses devtools without a verification cycle. `verificationId` / `traceId`
23
+ * ride along only when a cycle happens to be active (manual `/ironbee-verify`).
17
24
  */
18
- export declare function run(projectDir: string): Promise<void>;
25
+ export declare function run(projectDir: string, opts?: {
26
+ soft?: boolean;
27
+ }): Promise<void>;
19
28
  //# sourceMappingURL=require-verification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"require-verification.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiCH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqH3D"}
1
+ {"version":3,"file":"require-verification.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAkCH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ItF"}
@@ -15,6 +15,13 @@
15
15
  *
16
16
  * Exit 0 = allow tool (with updatedInput containing _metadata)
17
17
  * Exit 2 = block tool
18
+ *
19
+ * **Soft mode** (`opts.soft`, installed in assist mode — `verification.auto:
20
+ * false`): never blocks. The two enforcement exits (no active cycle, recording
21
+ * required) are skipped — the hook only injects `_metadata` so MCP-side
22
+ * tool_call events keep collector routing + session correlation even when the
23
+ * agent uses devtools without a verification cycle. `verificationId` / `traceId`
24
+ * ride along only when a cycle happens to be active (manual `/ironbee-verify`).
18
25
  */
19
26
  Object.defineProperty(exports, "__esModule", { value: true });
20
27
  exports.run = run;
@@ -22,6 +29,7 @@ const crypto_1 = require("crypto");
22
29
  const session_state_1 = require("../../../hooks/core/session-state");
23
30
  const actions_1 = require("../../../hooks/core/actions");
24
31
  const activity_1 = require("../../../hooks/core/activity");
32
+ const verification_lifecycle_1 = require("../../../hooks/core/verification-lifecycle");
25
33
  const config_1 = require("../../../lib/config");
26
34
  const logger_1 = require("../../../lib/logger");
27
35
  const util_1 = require("../util");
@@ -32,7 +40,8 @@ const stdin_1 = require("../../../lib/stdin");
32
40
  * of truth — this fallback is only used if the tool_name field is malformed
33
41
  * or absent. */
34
42
  const FALLBACK_MCP_SERVER_NAME = "browser-devtools";
35
- async function run(projectDir) {
43
+ async function run(projectDir, opts) {
44
+ const soft = opts?.soft === true;
36
45
  let input;
37
46
  try {
38
47
  input = JSON.parse((0, stdin_1.readStdin)());
@@ -46,7 +55,8 @@ async function run(projectDir) {
46
55
  (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
47
56
  const actionsFile = `${sessionDir}/actions.jsonl`;
48
57
  const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
49
- if (!verificationId) {
58
+ // Soft mode (assist) never enforces a cycle — it only injects metadata.
59
+ if (!verificationId && !soft) {
50
60
  process.stderr.write(`BLOCKED: You must start a verification cycle before using devtools tools (browser-devtools / node-devtools / backend-devtools).
51
61
 
52
62
  Start verification first:
@@ -58,11 +68,13 @@ Then use the verification tools for the active cycle(s) — bdt_* for browser, n
58
68
  }
59
69
  // Recording enforcement is browser-only (§12). Node-devtools tools
60
70
  // (ndt_*) bypass this check entirely — they never set recordingActive
61
- // and never need it to be true.
71
+ // and never need it to be true. Skipped entirely in soft mode (no
72
+ // enforcement in assist).
62
73
  const toolName = input.tool_name ?? "";
63
74
  const isBrowserDevToolsCall = toolName.startsWith("mcp__browser-devtools__");
64
75
  const isRecordingStartTool = toolName.endsWith("bdt_content_start-recording");
65
- if (isBrowserDevToolsCall &&
76
+ if (!soft &&
77
+ isBrowserDevToolsCall &&
66
78
  (0, session_state_1.isRecordingRequired)(sessionDir) &&
67
79
  !(0, session_state_1.isRecordingActive)(sessionDir) &&
68
80
  !isRecordingStartTool) {
@@ -81,6 +93,19 @@ Then use the verification tools for the active cycle(s) — bdt_* for browser, n
81
93
  }
82
94
  // ensure activity is open before reading its ID for metadata propagation
83
95
  await (0, activity_1.startActivity)({ sessionDir, actionsFile, source: "pre_tool_use" });
96
+ // Assist auto-open: in soft mode, instead of blocking when no verification
97
+ // cycle is active, OPEN one now (the symmetric counterpart to enforce's
98
+ // block). `startVerification` closes any open fix (fix_end) and opens a
99
+ // fresh verification_start, so this devtools call is bracketed by a cycle
100
+ // and re-verification after a fix closes the fix. The new vid/trace is then
101
+ // injected into THIS call's `_metadata` so the MCP-emitted tool_call event
102
+ // carries the correct correlation too. Recording is never required in
103
+ // assist (recordingEnabled: false).
104
+ let effectiveVerificationId = verificationId;
105
+ if (soft && !effectiveVerificationId) {
106
+ const opened = await (0, verification_lifecycle_1.startVerification)({ sessionId, sessionDir, actionsFile, recordingEnabled: false });
107
+ effectiveVerificationId = opened.verificationId;
108
+ }
84
109
  const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
85
110
  const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
86
111
  // inject _metadata into tool input so MCP server knows session/trace context
@@ -89,7 +114,10 @@ Then use the verification tools for the active cycle(s) — bdt_* for browser, n
89
114
  if (activityId) {
90
115
  traceStateParts.push(`aid:${activityId}`);
91
116
  }
92
- traceStateParts.push(`vid:${verificationId}`);
117
+ // Tag vid when a cycle is active (always, after the assist auto-open above).
118
+ if (effectiveVerificationId) {
119
+ traceStateParts.push(`vid:${effectiveVerificationId}`);
120
+ }
93
121
  const traceState = `ironbee=${traceStateParts.join(";")}`;
94
122
  const config = (0, config_1.loadConfig)(projectDir);
95
123
  const updatedInput = { ...(input.tool_input ?? {}) };
@@ -97,7 +125,7 @@ Then use the verification tools for the active cycle(s) — bdt_* for browser, n
97
125
  projectName,
98
126
  sessionId,
99
127
  activityId,
100
- verificationId,
128
+ verificationId: effectiveVerificationId,
101
129
  traceId,
102
130
  traceState,
103
131
  // Stable wire id for the tool_call event. The MCP server reads this
@@ -1 +1 @@
1
- {"version":3,"file":"require-verification.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"require-verification.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":"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"}
@@ -57,8 +57,12 @@ export declare class ClaudeClient implements IClient {
57
57
  runClearVerdict(projectDir: string): Promise<void>;
58
58
  runTrackAction(projectDir: string): Promise<void>;
59
59
  runSessionStart(projectDir: string): Promise<void>;
60
- runRequireVerdict(projectDir: string): Promise<void>;
61
- runRequireVerification(projectDir: string): Promise<void>;
60
+ runRequireVerdict(projectDir: string, opts?: {
61
+ soft?: boolean;
62
+ }): Promise<void>;
63
+ runRequireVerification(projectDir: string, opts?: {
64
+ soft?: boolean;
65
+ }): Promise<void>;
62
66
  runActivityStart(projectDir: string): Promise<void>;
63
67
  runActivityEnd(projectDir: string): Promise<void>;
64
68
  runTrackActionMonitor(projectDir: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clients/claude/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAelC,OAAO,EAAoG,aAAa,EAAwI,MAAM,kBAAkB,CAAC;AAqJzR,qBAAa,YAAa,YAAW,OAAO;IACxC,SAAgB,IAAI,EAAE,MAAM,CAAY;IAEjC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAInC,iBAAiB,IAAI,MAAM;IAI3B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI;IAqEzD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,OAAO,CAAC,gBAAgB;IAsCxB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAgB3B,uFAAuF;IACvF,OAAO,CAAC,mBAAmB;IAiC3B,8EAA8E;IAC9E,OAAO,CAAC,oBAAoB;IAkB5B,4FAA4F;IAC5F,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAyCpB,iGAAiG;IACjG,OAAO,CAAC,aAAa;IA8BrB;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAcnB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IA0KxB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;IAkDtB,OAAO,CAAC,gBAAgB;CAwE3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clients/claude/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAelC,OAAO,EAAoG,aAAa,EAAuJ,MAAM,kBAAkB,CAAC;AAqJxS,qBAAa,YAAa,YAAW,OAAO;IACxC,SAAgB,IAAI,EAAE,MAAM,CAAY;IAEjC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAInC,iBAAiB,IAAI,MAAM;IAI3B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI;IAuFzD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,OAAO,CAAC,gBAAgB;IAsCxB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAgB3B,uFAAuF;IACvF,OAAO,CAAC,mBAAmB;IAiC3B,8EAA8E;IAC9E,OAAO,CAAC,oBAAoB;IAkB5B,4FAA4F;IAC5F,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAyCpB,iGAAiG;IACjG,OAAO,CAAC,aAAa;IA8BrB;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAcnB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/E,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAwLxB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;IAkDtB,OAAO,CAAC,gBAAgB;CAwE3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1D"}
@@ -134,7 +134,12 @@ class ClaudeClient {
134
134
  }
135
135
  install(projectDir, config) {
136
136
  const cfg = config ?? (0, config_1.loadConfig)(projectDir);
137
- const verificationEnabled = (0, config_1.getVerificationEnabled)(cfg);
137
+ const mode = (0, config_1.getVerificationMode)(cfg);
138
+ // "enforce" and "assist" both keep the verification machinery installed
139
+ // (MCP servers, permissions, the /ironbee-verify command). They differ
140
+ // only in enforcement: assist installs soft (non-blocking) PreToolUse
141
+ // hooks, no Stop gate, and skips the skill + rule.
142
+ const verificationActive = mode !== "monitor";
138
143
  // Clean up old artifacts first (safe for re-install / upgrade and
139
144
  // necessary when toggling between enabled/disabled mode so stale
140
145
  // skill/rule/verify-command/MCP entries from the prior mode are removed).
@@ -147,8 +152,8 @@ class ClaudeClient {
147
152
  (0, fs_1.mkdirSync)(rulesDir, { recursive: true });
148
153
  (0, fs_1.mkdirSync)(commandsDir, { recursive: true });
149
154
  const settingsPath = (0, path_1.join)(claudeDir, "settings.json");
150
- this.mergeHooksConfig(settingsPath, verificationEnabled);
151
- this.writePermissions(settingsPath, verificationEnabled, projectDir);
155
+ this.mergeHooksConfig(settingsPath, mode);
156
+ this.writePermissions(settingsPath, verificationActive, projectDir);
152
157
  // OTEL collector env block (Claude-only). Independent of verification —
153
158
  // session_context is a pure monitoring signal, so it's written in
154
159
  // monitoring mode too. Gated on the otel pipeline being enabled.
@@ -160,14 +165,21 @@ class ClaudeClient {
160
165
  // feature being enabled; otherwise the user's statusline is left
161
166
  // untouched.
162
167
  this.installStatusLine(projectDir, cfg);
163
- if (verificationEnabled) {
164
- // Enforcement artifacts only present when verification is on.
165
- const verifySkillPath = (0, path_1.join)(skillsDir, "ironbee-verification.md");
166
- const verifySkillContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "skills", "ironbee-verification.md"), "utf-8");
167
- (0, fs_1.writeFileSync)(verifySkillPath, verifySkillContent);
168
- const rulePath = (0, path_1.join)(rulesDir, "ironbee-verification.md");
169
- const ruleContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "rules", "ironbee-verification.md"), "utf-8");
170
- (0, fs_1.writeFileSync)(rulePath, ruleContent);
168
+ if (verificationActive) {
169
+ // Skill + rule are the always-on "you must verify" mandate — only
170
+ // installed in enforce mode. Assist mode is manual-trigger-only
171
+ // (the /ironbee-verify command), so it skips them to avoid telling
172
+ // the agent it's blocked when nothing actually enforces.
173
+ if (mode === "enforce") {
174
+ const verifySkillPath = (0, path_1.join)(skillsDir, "ironbee-verification.md");
175
+ const verifySkillContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "skills", "ironbee-verification.md"), "utf-8");
176
+ (0, fs_1.writeFileSync)(verifySkillPath, verifySkillContent);
177
+ const rulePath = (0, path_1.join)(rulesDir, "ironbee-verification.md");
178
+ const ruleContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "rules", "ironbee-verification.md"), "utf-8");
179
+ (0, fs_1.writeFileSync)(rulePath, ruleContent);
180
+ }
181
+ // The /ironbee-verify slash command — the manual verification
182
+ // trigger. Installed in BOTH enforce and assist mode.
171
183
  const verifyCommandPath = (0, path_1.join)(commandsDir, "ironbee-verify.md");
172
184
  const verifyCommandContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "commands", "ironbee-verify.md"), "utf-8");
173
185
  (0, fs_1.writeFileSync)(verifyCommandPath, verifyCommandContent);
@@ -176,11 +188,18 @@ class ClaudeClient {
176
188
  // Source md files ship with empty runtime marker blocks. Sync them
177
189
  // to the project's current config state so that enabled platforms
178
190
  // get their fragment content and disabled ones get the placeholder.
179
- // Idempotent — safe on first install AND re-install.
191
+ // Idempotent — safe on first install AND re-install. In assist mode
192
+ // only the command file exists; the skill/rule targets are skipped
193
+ // automatically (applyPlatformToProjectFiles guards on existsSync).
180
194
  (0, platform_section_1.syncPlatformSectionsToConfig)(projectDir, platformsDirFor);
181
195
  console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} settings ${output_1.pc.dim("→")} ${output_1.pc.dim(settingsPath)}`);
182
- console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} skills ${output_1.pc.dim("")} ${output_1.pc.dim(skillsDir)}`);
183
- console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} rule ${output_1.pc.dim("→")} ${output_1.pc.dim(rulePath)}`);
196
+ if (mode === "enforce") {
197
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} skills ${output_1.pc.dim("→")} ${output_1.pc.dim(skillsDir)}`);
198
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} rule ${output_1.pc.dim("→")} ${output_1.pc.dim(rulesDir)}`);
199
+ }
200
+ else {
201
+ console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} ${output_1.pc.yellow("assist mode")} (verification.auto: false) — manual /ironbee-verify only, no enforcement`);
202
+ }
184
203
  console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} commands ${output_1.pc.dim("→")} ${output_1.pc.dim(commandsDir)}`);
185
204
  console.log(` ${output_1.pc.dim("→")} ${(0, output_1.orange)("[claude]")} mcp ${output_1.pc.dim("→")} ${output_1.pc.dim(mcpPath)}`);
186
205
  }
@@ -472,11 +491,11 @@ class ClaudeClient {
472
491
  async runSessionStart(projectDir) {
473
492
  await (0, session_start_1.run)(projectDir);
474
493
  }
475
- async runRequireVerdict(projectDir) {
476
- await (0, require_verdict_1.run)(projectDir);
494
+ async runRequireVerdict(projectDir, opts) {
495
+ await (0, require_verdict_1.run)(projectDir, opts);
477
496
  }
478
- async runRequireVerification(projectDir) {
479
- await (0, require_verification_1.run)(projectDir);
497
+ async runRequireVerification(projectDir, opts) {
498
+ await (0, require_verification_1.run)(projectDir, opts);
480
499
  }
481
500
  async runActivityStart(projectDir) {
482
501
  await (0, activity_start_1.run)(projectDir);
@@ -500,7 +519,15 @@ class ClaudeClient {
500
519
  isIronBeeHook(entry) {
501
520
  return entry.hooks.some((h) => h.command.includes(IRONBEE_HOOK_MARKER));
502
521
  }
503
- mergeHooksConfig(settingsPath, verificationEnabled) {
522
+ mergeHooksConfig(settingsPath, mode) {
523
+ // enforce + assist both keep the recording machinery (full track-action,
524
+ // clear-verdict) and the PreToolUse hooks installed. They differ in:
525
+ // - enforce: blocking require-verification / require-verdict, verify-gate Stop.
526
+ // - assist: soft (non-blocking) require-* (`--soft`), activity-end Stop.
527
+ // monitor strips both PreToolUse hooks + clear-verdict and runs the lean
528
+ // track-action-monitor + activity-end pair.
529
+ const verificationActive = mode !== "monitor";
530
+ const softFlag = mode === "assist" ? " --soft" : "";
504
531
  let settings = {};
505
532
  if ((0, fs_1.existsSync)(settingsPath)) {
506
533
  try {
@@ -553,8 +580,10 @@ class ClaudeClient {
553
580
  },
554
581
  ],
555
582
  });
556
- if (verificationEnabled) {
557
- // ── PreToolUse (enforcement) — block devtools without active verification ──
583
+ if (verificationActive) {
584
+ // ── PreToolUse — block devtools without active verification ──
585
+ // In assist mode the `--soft` variant runs (never blocks; metadata-
586
+ // injection only).
558
587
  if (!settings.hooks.PreToolUse) {
559
588
  settings.hooks.PreToolUse = [];
560
589
  }
@@ -563,21 +592,23 @@ class ClaudeClient {
563
592
  hooks: [
564
593
  {
565
594
  type: "command",
566
- command: `ironbee hook require-verification --client claude`,
595
+ command: `ironbee hook require-verification --client claude${softFlag}`,
567
596
  },
568
597
  ],
569
598
  });
570
- // ── PreToolUse (enforcement) — block edits without verdict ──
599
+ // ── PreToolUse — block edits without verdict (soft = stash only) ──
571
600
  settings.hooks.PreToolUse.push({
572
601
  matcher: "Write|Edit",
573
602
  hooks: [
574
603
  {
575
604
  type: "command",
576
- command: `ironbee hook require-verdict --client claude`,
605
+ command: `ironbee hook require-verdict --client claude${softFlag}`,
577
606
  },
578
607
  ],
579
608
  });
580
- // ── PostToolUse (enforcement) — file_change events + verdict clear ──
609
+ // ── PostToolUse — file_change events + verdict clear ──
610
+ // Installed in enforce + assist (file_change recording is wanted in
611
+ // both; clearing the verdict on edit is harmless when nothing gates).
581
612
  if (!settings.hooks.PostToolUse) {
582
613
  settings.hooks.PostToolUse = [];
583
614
  }
@@ -592,13 +623,14 @@ class ClaudeClient {
592
623
  });
593
624
  }
594
625
  // ── PostToolUse (always) — track every tool call ──
595
- // Mode-specific variant: full track-action when enabled (verify-gate
596
- // dependencies for devtools), lean track-action-monitor when disabled
597
- // (queue submit + activity fallback only).
626
+ // Mode-specific variant: full track-action when verification is active
627
+ // (enforce + assist — devtools tool_call records feed manual verification
628
+ // + future evidence extractors), lean track-action-monitor in monitor
629
+ // mode (queue submit + activity fallback only).
598
630
  if (!settings.hooks.PostToolUse) {
599
631
  settings.hooks.PostToolUse = [];
600
632
  }
601
- const trackActionCommand = verificationEnabled
633
+ const trackActionCommand = verificationActive
602
634
  ? `ironbee hook track-action --client claude`
603
635
  : `ironbee hook track-action-monitor --client claude`;
604
636
  settings.hooks.PostToolUse.push({
@@ -624,12 +656,13 @@ class ClaudeClient {
624
656
  ],
625
657
  });
626
658
  // ── Stop (always) — mode-specific variant ──
627
- // Enabled: verify-gate (multi-cycle gate + endActivity + queue flush).
628
- // Disabled: activity-end (endActivity + queue flush only).
659
+ // Enforce: verify-gate (multi-cycle blocking gate + endActivity + flush).
660
+ // Assist + monitor: activity-end (endActivity + queue flush only — assist
661
+ // never gates completion, so it uses the same lean Stop as monitoring).
629
662
  if (!settings.hooks.Stop) {
630
663
  settings.hooks.Stop = [];
631
664
  }
632
- const stopCommand = verificationEnabled
665
+ const stopCommand = mode === "enforce"
633
666
  ? `ironbee hook verify-gate --client claude`
634
667
  : `ironbee hook activity-end --client claude`;
635
668
  settings.hooks.Stop.push({