@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.
- package/CHANGELOG.md +12 -0
- package/dist/clients/base.d.ts +17 -4
- package/dist/clients/base.d.ts.map +1 -1
- package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/claude/hooks/clear-verdict.js +6 -1
- package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verdict.d.ts +8 -1
- package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verdict.js +9 -2
- package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verification.d.ts +10 -1
- package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verification.js +34 -6
- package/dist/clients/claude/hooks/require-verification.js.map +1 -1
- package/dist/clients/claude/index.d.ts +6 -2
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +65 -32
- package/dist/clients/claude/index.js.map +1 -1
- package/dist/clients/codex/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/codex/hooks/clear-verdict.js +5 -1
- package/dist/clients/codex/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/codex/hooks/require-verdict.d.ts +7 -1
- package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -1
- package/dist/clients/codex/hooks/require-verdict.js +8 -2
- package/dist/clients/codex/hooks/require-verdict.js.map +1 -1
- package/dist/clients/codex/hooks/require-verification.d.ts +9 -1
- package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/codex/hooks/require-verification.js +25 -5
- package/dist/clients/codex/hooks/require-verification.js.map +1 -1
- package/dist/clients/codex/index.d.ts +12 -2
- package/dist/clients/codex/index.d.ts.map +1 -1
- package/dist/clients/codex/index.js +73 -37
- package/dist/clients/codex/index.js.map +1 -1
- package/dist/clients/codex/util.d.ts +11 -6
- package/dist/clients/codex/util.d.ts.map +1 -1
- package/dist/clients/codex/util.js +41 -13
- package/dist/clients/codex/util.js.map +1 -1
- package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/clear-verdict.js +4 -1
- package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/require-verdict.d.ts +7 -1
- package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/require-verdict.js +8 -2
- package/dist/clients/cursor/hooks/require-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.d.ts +8 -1
- package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.js +27 -6
- package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
- package/dist/clients/cursor/index.d.ts +6 -2
- package/dist/clients/cursor/index.d.ts.map +1 -1
- package/dist/clients/cursor/index.js +56 -30
- package/dist/clients/cursor/index.js.map +1 -1
- package/dist/commands/hook.js +4 -2
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/verification-toggle.d.ts +19 -0
- package/dist/commands/verification-toggle.d.ts.map +1 -1
- package/dist/commands/verification-toggle.js +88 -5
- package/dist/commands/verification-toggle.js.map +1 -1
- package/dist/commands/verification.d.ts +3 -0
- package/dist/commands/verification.d.ts.map +1 -1
- package/dist/commands/verification.js +34 -3
- package/dist/commands/verification.js.map +1 -1
- package/dist/hooks/core/activity-end.d.ts +8 -0
- package/dist/hooks/core/activity-end.d.ts.map +1 -1
- package/dist/hooks/core/activity-end.js +15 -0
- package/dist/hooks/core/activity-end.js.map +1 -1
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +29 -17
- package/dist/hooks/core/submit-verdict.js.map +1 -1
- package/dist/hooks/core/verification-lifecycle.d.ts +20 -0
- package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -1
- package/dist/hooks/core/verification-lifecycle.js +41 -0
- package/dist/hooks/core/verification-lifecycle.js.map +1 -1
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +11 -5
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/lib/config.d.ts +40 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +52 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/tui/config/schema.d.ts.map +1 -1
- package/dist/tui/config/schema.js +8 -0
- package/dist/tui/config/schema.js.map +1 -1
- 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)
|
package/dist/clients/base.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
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;
|
|
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:
|
|
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":";AAAA;;;;;;;;;;;;;GAaG;;
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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":";AAAA
|
|
1
|
+
{"version":3,"file":"require-verification.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;AAkCH,kBA0IC;AA1KD,mCAAoC;AACpC,qEAAyK;AACzK,yDAAiE;AACjE,2DAA6D;AAC7D,uFAAwG;AACxG,gDAAiD;AACjD,gDAAyD;AACzD,kCAA+C;AAC/C,8CAA+C;AAE/C;;;;iBAIiB;AACjB,MAAM,wBAAwB,GAAW,kBAAkB,CAAC;AAiBrD,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,MAAM,UAAU,GAAW,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC;IAC1E,IAAA,mBAAU,EAAC,GAAG,UAAU,cAAc,CAAC,CAAC;IAExC,MAAM,WAAW,GAAW,GAAG,UAAU,gBAAgB,CAAC;IAE1D,MAAM,cAAc,GAAuB,IAAA,uCAAuB,EAAC,UAAU,CAAC,CAAC;IAC/E,wEAAwE;IACxE,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;yBAGJ,SAAS;;;CAGjC,CAAC,CAAC;QACK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,mEAAmE;IACnE,sEAAsE;IACtE,kEAAkE;IAClE,0BAA0B;IAC1B,MAAM,QAAQ,GAAW,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;IAC/C,MAAM,qBAAqB,GAAY,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;IACtF,MAAM,oBAAoB,GAAY,QAAQ,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;IACvF,IACI,CAAC,IAAI;QACL,qBAAqB;QACrB,IAAA,mCAAmB,EAAC,UAAU,CAAC;QAC/B,CAAC,IAAA,iCAAiB,EAAC,UAAU,CAAC;QAC9B,CAAC,oBAAoB,EACvB,CAAC;QACC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;CAU5B,CAAC,CAAC;QACK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,yEAAyE;IACzE,MAAM,IAAA,wBAAa,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAEzE,2EAA2E;IAC3E,wEAAwE;IACxE,wEAAwE;IACxE,0EAA0E;IAC1E,4EAA4E;IAC5E,2EAA2E;IAC3E,sEAAsE;IACtE,oCAAoC;IACpC,IAAI,uBAAuB,GAAuB,cAAc,CAAC;IACjE,IAAI,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACnC,MAAM,MAAM,GAA4B,MAAM,IAAA,0CAAiB,EAAC,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QACjI,uBAAuB,GAAG,MAAM,CAAC,cAAc,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAuB,IAAA,gCAAgB,EAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAuB,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IAEvE,6EAA6E;IAC7E,MAAM,WAAW,GAAW,IAAA,4BAAkB,EAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAa,CAAC,OAAO,WAAW,EAAE,EAAE,OAAO,SAAS,EAAE,CAAC,CAAC;IAC7E,IAAI,UAAU,EAAE,CAAC;QACb,eAAe,CAAC,IAAI,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,6EAA6E;IAC7E,IAAI,uBAAuB,EAAE,CAAC;QAC1B,eAAe,CAAC,IAAI,CAAC,OAAO,uBAAuB,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,UAAU,GAAW,WAAW,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAClE,MAAM,MAAM,GAAkC,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;IACrE,MAAM,YAAY,GAA4B,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAA4B;QACtC,WAAW;QACX,SAAS;QACT,UAAU;QACV,cAAc,EAAE,uBAAuB;QACvC,OAAO;QACP,UAAU;QACV,oEAAoE;QACpE,kEAAkE;QAClE,gEAAgE;QAChE,gEAAgE;QAChE,kDAAkD;QAClD,UAAU,EAAE,IAAA,mBAAU,GAAE;KAC3B,CAAC;IACF,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;IAC3C,CAAC;IACD,+DAA+D;IAC/D,qEAAqE;IACrE,mEAAmE;IACnE,6DAA6D;IAC7D,uEAAuE;IACvE,mEAAmE;IACnE,gEAAgE;IAChE,gBAAgB;IAChB,QAAQ,CAAC,SAAS,GAAG,IAAA,2BAAoB,EAAC,KAAK,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC;IACvF,MAAM,SAAS,GAAuB,IAAA,4BAAY,EAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,SAAS,EAAE,CAAC;QACZ,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;QACxB,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC3B,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IACvD,CAAC;IACD,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC;IAElC,MAAM,MAAM,GAA2B;QACnC,kBAAkB,EAAE;YAChB,aAAa,EAAE,YAAY;YAC3B,kBAAkB,EAAE,OAAO;YAC3B,YAAY;SACf;KACJ,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -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
|
|
61
|
-
|
|
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,
|
|
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
|
|
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,
|
|
151
|
-
this.writePermissions(settingsPath,
|
|
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 (
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
183
|
-
|
|
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,
|
|
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 (
|
|
557
|
-
// ── PreToolUse
|
|
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
|
|
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
|
|
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
|
|
596
|
-
//
|
|
597
|
-
//
|
|
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 =
|
|
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
|
-
//
|
|
628
|
-
//
|
|
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 =
|
|
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({
|