@ironbee-ai/cli 0.1.1 → 0.2.0

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 (73) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +38 -9
  3. package/dist/clients/base.d.ts +3 -1
  4. package/dist/clients/base.d.ts.map +1 -1
  5. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  6. package/dist/clients/claude/hooks/clear-verdict.js +2 -1
  7. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  8. package/dist/clients/claude/hooks/require-verdict.d.ts +13 -0
  9. package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -0
  10. package/dist/clients/claude/hooks/require-verdict.js +42 -0
  11. package/dist/clients/claude/hooks/require-verdict.js.map +1 -0
  12. package/dist/clients/claude/hooks/session-start.d.ts +4 -3
  13. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  14. package/dist/clients/claude/hooks/session-start.js +22 -18
  15. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  16. package/dist/clients/claude/index.d.ts +2 -1
  17. package/dist/clients/claude/index.d.ts.map +1 -1
  18. package/dist/clients/claude/index.js +46 -24
  19. package/dist/clients/claude/index.js.map +1 -1
  20. package/dist/clients/claude/rule.md +10 -8
  21. package/dist/clients/claude/skill.md +32 -9
  22. package/dist/clients/cursor/hooks/clear-verdict.d.ts +11 -0
  23. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -0
  24. package/dist/clients/cursor/hooks/clear-verdict.js +57 -0
  25. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -0
  26. package/dist/clients/cursor/hooks/require-verdict.d.ts +12 -0
  27. package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -0
  28. package/dist/clients/cursor/hooks/require-verdict.js +48 -0
  29. package/dist/clients/cursor/hooks/require-verdict.js.map +1 -0
  30. package/dist/clients/cursor/hooks/session-start.d.ts +9 -0
  31. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -0
  32. package/dist/clients/cursor/hooks/session-start.js +75 -0
  33. package/dist/clients/cursor/hooks/session-start.js.map +1 -0
  34. package/dist/clients/cursor/hooks/track-action.d.ts +16 -0
  35. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -0
  36. package/dist/clients/cursor/hooks/track-action.js +92 -0
  37. package/dist/clients/cursor/hooks/track-action.js.map +1 -0
  38. package/dist/clients/cursor/hooks/verify-gate.d.ts +13 -0
  39. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -0
  40. package/dist/clients/cursor/hooks/verify-gate.js +49 -0
  41. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -0
  42. package/dist/clients/cursor/index.d.ts +20 -0
  43. package/dist/clients/cursor/index.d.ts.map +1 -0
  44. package/dist/clients/cursor/index.js +213 -0
  45. package/dist/clients/cursor/index.js.map +1 -0
  46. package/dist/clients/cursor/rule.md +42 -0
  47. package/dist/clients/cursor/skill.md +86 -0
  48. package/dist/clients/registry.d.ts.map +1 -1
  49. package/dist/clients/registry.js +2 -1
  50. package/dist/clients/registry.js.map +1 -1
  51. package/dist/commands/hook.d.ts.map +1 -1
  52. package/dist/commands/hook.js +61 -0
  53. package/dist/commands/hook.js.map +1 -1
  54. package/dist/commands/install.d.ts.map +1 -1
  55. package/dist/commands/install.js +1 -13
  56. package/dist/commands/install.js.map +1 -1
  57. package/dist/commands/status.js +3 -3
  58. package/dist/commands/verify.js +3 -3
  59. package/dist/hooks/core/actions.d.ts +7 -0
  60. package/dist/hooks/core/actions.d.ts.map +1 -1
  61. package/dist/hooks/core/actions.js +5 -0
  62. package/dist/hooks/core/actions.js.map +1 -1
  63. package/dist/hooks/core/submit-verdict.d.ts +21 -0
  64. package/dist/hooks/core/submit-verdict.d.ts.map +1 -0
  65. package/dist/hooks/core/submit-verdict.js +109 -0
  66. package/dist/hooks/core/submit-verdict.js.map +1 -0
  67. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  68. package/dist/hooks/core/verify-gate.js +66 -49
  69. package/dist/hooks/core/verify-gate.js.map +1 -1
  70. package/dist/index.js +0 -0
  71. package/dist/lib/icon.js +1 -1
  72. package/dist/lib/icon.js.map +1 -1
  73. package/package.json +2 -2
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CursorClient = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const logger_1 = require("../../lib/logger");
7
+ const output_1 = require("../../lib/output");
8
+ const verify_gate_1 = require("./hooks/verify-gate");
9
+ const clear_verdict_1 = require("./hooks/clear-verdict");
10
+ const track_action_1 = require("./hooks/track-action");
11
+ const session_start_1 = require("./hooks/session-start");
12
+ const require_verdict_1 = require("./hooks/require-verdict");
13
+ const MCP_SERVER_NAME = "browser-devtools";
14
+ const MCP_SERVER_PACKAGE = "browser-devtools-mcp";
15
+ const IRONBEE_HOOK_MARKER = "ironbee";
16
+ // Color for [cursor] label — gray
17
+ function cursorColor(text) {
18
+ return output_1.pc.dim(text);
19
+ }
20
+ class CursorClient {
21
+ constructor() {
22
+ this.name = "cursor";
23
+ }
24
+ detect(projectDir) {
25
+ return (0, fs_1.existsSync)((0, path_1.join)(projectDir, ".cursor"));
26
+ }
27
+ resolveProjectDir() {
28
+ return process.env.CURSOR_PROJECT_DIR ?? process.env.IRONBEE_PROJECT_DIR ?? process.cwd();
29
+ }
30
+ install(projectDir) {
31
+ const cursorDir = (0, path_1.join)(projectDir, ".cursor");
32
+ const rulesDir = (0, path_1.join)(cursorDir, "rules");
33
+ const skillsDir = (0, path_1.join)(cursorDir, "skills");
34
+ (0, fs_1.mkdirSync)(rulesDir, { recursive: true });
35
+ (0, fs_1.mkdirSync)(skillsDir, { recursive: true });
36
+ const hooksPath = (0, path_1.join)(cursorDir, "hooks.json");
37
+ this.mergeHooksConfig(hooksPath);
38
+ const skillPath = (0, path_1.join)(skillsDir, "ironbee-verification.md");
39
+ const skillContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "skill.md"), "utf-8");
40
+ (0, fs_1.writeFileSync)(skillPath, skillContent);
41
+ const rulePath = (0, path_1.join)(rulesDir, "ironbee-verification.mdc");
42
+ const ruleContent = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, "rule.md"), "utf-8");
43
+ (0, fs_1.writeFileSync)(rulePath, ruleContent);
44
+ const mcpPath = (0, path_1.join)(cursorDir, "mcp.json");
45
+ this.writeMcpConfig(mcpPath);
46
+ console.log(` ${output_1.pc.dim("→")} ${cursorColor("[cursor]")} hooks ${output_1.pc.dim("→")} ${output_1.pc.dim(hooksPath)}`);
47
+ console.log(` ${output_1.pc.dim("→")} ${cursorColor("[cursor]")} skill ${output_1.pc.dim("→")} ${output_1.pc.dim(skillPath)}`);
48
+ console.log(` ${output_1.pc.dim("→")} ${cursorColor("[cursor]")} rule ${output_1.pc.dim("→")} ${output_1.pc.dim(rulePath)}`);
49
+ console.log(` ${output_1.pc.dim("→")} ${cursorColor("[cursor]")} mcp ${output_1.pc.dim("→")} ${output_1.pc.dim(mcpPath)}`);
50
+ console.log();
51
+ console.log(` ${output_1.pc.yellow("⚠")} ${output_1.pc.yellow("Cursor requires manual steps:")}`);
52
+ console.log(` ${output_1.pc.yellow("1.")} Restart Cursor to load the new hooks and MCP config`);
53
+ console.log(` ${output_1.pc.yellow("2.")} Go to ${output_1.pc.bold("Settings → Tools & MCP")} and verify ${output_1.pc.bold("browser-devtools")} is enabled`);
54
+ console.log(` ${output_1.pc.yellow("3.")} If the server shows as enabled but tools are unavailable, toggle it off and on`);
55
+ }
56
+ uninstall(projectDir) {
57
+ const cursorDir = (0, path_1.join)(projectDir, ".cursor");
58
+ // remove skill and rule files
59
+ const skillPath = (0, path_1.join)(cursorDir, "skills", "ironbee-verification.md");
60
+ const rulePath = (0, path_1.join)(cursorDir, "rules", "ironbee-verification.mdc");
61
+ this.removeFile(skillPath);
62
+ this.removeFile(rulePath);
63
+ // remove ironbee hooks from hooks.json
64
+ const hooksPath = (0, path_1.join)(cursorDir, "hooks.json");
65
+ this.removeIronBeeHooks(hooksPath);
66
+ // remove browser-devtools from mcp.json
67
+ const mcpPath = (0, path_1.join)(cursorDir, "mcp.json");
68
+ this.removeMcpServer(mcpPath);
69
+ console.log(` ${output_1.pc.dim("→")} ${cursorColor("[cursor]")} removed hooks, skill, rule, and MCP`);
70
+ console.log();
71
+ console.log(` ${output_1.pc.yellow("⚠")} Restart Cursor to apply changes`);
72
+ }
73
+ runVerifyGate(projectDir) {
74
+ (0, verify_gate_1.run)(projectDir);
75
+ }
76
+ runClearVerdict(projectDir) {
77
+ (0, clear_verdict_1.run)(projectDir);
78
+ }
79
+ runTrackAction(projectDir) {
80
+ (0, track_action_1.run)(projectDir);
81
+ }
82
+ runSessionStart(projectDir) {
83
+ (0, session_start_1.run)(projectDir);
84
+ }
85
+ runRequireVerdict(projectDir) {
86
+ (0, require_verdict_1.run)(projectDir);
87
+ }
88
+ isIronBeeHook(entry) {
89
+ return entry.command.includes(IRONBEE_HOOK_MARKER);
90
+ }
91
+ mergeHooksConfig(hooksPath) {
92
+ let config = { version: 1, hooks: {} };
93
+ if ((0, fs_1.existsSync)(hooksPath)) {
94
+ try {
95
+ config = JSON.parse((0, fs_1.readFileSync)(hooksPath, "utf-8"));
96
+ if (!config.hooks) {
97
+ config.hooks = {};
98
+ }
99
+ }
100
+ catch (e) {
101
+ logger_1.logger.debug(`failed to parse ${hooksPath}: ${e}`);
102
+ config = { version: 1, hooks: {} };
103
+ }
104
+ }
105
+ // remove existing ironbee entries first (for re-install)
106
+ for (const eventType of Object.keys(config.hooks)) {
107
+ config.hooks[eventType] = config.hooks[eventType].filter((entry) => !this.isIronBeeHook(entry));
108
+ }
109
+ // ── sessionStart — record session, output instructions ──
110
+ if (!config.hooks.sessionStart) {
111
+ config.hooks.sessionStart = [];
112
+ }
113
+ config.hooks.sessionStart.push({
114
+ command: `ironbee hook session-start --client cursor`,
115
+ });
116
+ // ── preToolUse — block edits if browser tools used without verdict ──
117
+ if (!config.hooks.preToolUse) {
118
+ config.hooks.preToolUse = [];
119
+ }
120
+ config.hooks.preToolUse.push({
121
+ command: `ironbee hook require-verdict --client cursor`,
122
+ matcher: "Write",
123
+ failClosed: true,
124
+ });
125
+ // ── afterFileEdit — record file edits, clear verdict ──
126
+ if (!config.hooks.afterFileEdit) {
127
+ config.hooks.afterFileEdit = [];
128
+ }
129
+ config.hooks.afterFileEdit.push({
130
+ command: `ironbee hook clear-verdict --client cursor`,
131
+ });
132
+ // ── postToolUse — track browser-devtools tool calls ──
133
+ if (!config.hooks.postToolUse) {
134
+ config.hooks.postToolUse = [];
135
+ }
136
+ config.hooks.postToolUse.push({
137
+ command: `ironbee hook track-action --client cursor`,
138
+ matcher: "MCP:.*",
139
+ });
140
+ // ── stop — verify-gate, forces re-verification via followup_message ──
141
+ if (!config.hooks.stop) {
142
+ config.hooks.stop = [];
143
+ }
144
+ config.hooks.stop.push({
145
+ command: `ironbee hook verify-gate --client cursor`,
146
+ });
147
+ config.version = 1;
148
+ (0, fs_1.writeFileSync)(hooksPath, JSON.stringify(config, null, 2));
149
+ }
150
+ removeIronBeeHooks(hooksPath) {
151
+ if (!(0, fs_1.existsSync)(hooksPath)) {
152
+ return;
153
+ }
154
+ try {
155
+ const config = JSON.parse((0, fs_1.readFileSync)(hooksPath, "utf-8"));
156
+ if (!config.hooks) {
157
+ return;
158
+ }
159
+ for (const eventType of Object.keys(config.hooks)) {
160
+ config.hooks[eventType] = config.hooks[eventType].filter((entry) => !this.isIronBeeHook(entry));
161
+ }
162
+ (0, fs_1.writeFileSync)(hooksPath, JSON.stringify(config, null, 2));
163
+ }
164
+ catch (e) {
165
+ logger_1.logger.debug(`failed to remove hooks from ${hooksPath}: ${e}`);
166
+ }
167
+ }
168
+ removeMcpServer(mcpPath) {
169
+ if (!(0, fs_1.existsSync)(mcpPath)) {
170
+ return;
171
+ }
172
+ try {
173
+ const config = JSON.parse((0, fs_1.readFileSync)(mcpPath, "utf-8"));
174
+ if (config.mcpServers && config.mcpServers[MCP_SERVER_NAME]) {
175
+ delete config.mcpServers[MCP_SERVER_NAME];
176
+ (0, fs_1.writeFileSync)(mcpPath, JSON.stringify(config, null, 2));
177
+ }
178
+ }
179
+ catch (e) {
180
+ logger_1.logger.debug(`failed to remove MCP server from ${mcpPath}: ${e}`);
181
+ }
182
+ }
183
+ removeFile(filePath) {
184
+ if ((0, fs_1.existsSync)(filePath)) {
185
+ (0, fs_1.unlinkSync)(filePath);
186
+ }
187
+ }
188
+ writeMcpConfig(mcpPath) {
189
+ let config = { mcpServers: {} };
190
+ if ((0, fs_1.existsSync)(mcpPath)) {
191
+ try {
192
+ config = JSON.parse((0, fs_1.readFileSync)(mcpPath, "utf-8"));
193
+ if (!config.mcpServers) {
194
+ config.mcpServers = {};
195
+ }
196
+ }
197
+ catch (e) {
198
+ logger_1.logger.debug(`failed to parse ${mcpPath}: ${e}`);
199
+ config = { mcpServers: {} };
200
+ }
201
+ }
202
+ config.mcpServers[MCP_SERVER_NAME] = {
203
+ command: "npx",
204
+ args: ["-y", MCP_SERVER_PACKAGE],
205
+ env: {
206
+ BROWSER_DEVTOOLS_INSTALL_CHROMIUM: "true",
207
+ },
208
+ };
209
+ (0, fs_1.writeFileSync)(mcpPath, JSON.stringify(config, null, 2));
210
+ }
211
+ }
212
+ exports.CursorClient = CursorClient;
213
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clients/cursor/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ ---
2
+ description: "MANDATORY browser verification after code changes — IronBee enforcement"
3
+ alwaysApply: true
4
+ ---
5
+
6
+ You MUST verify all code changes in the browser before completing any task. After every verification attempt, you MUST submit a verdict (pass or fail) via `ironbee hook submit-verdict` before doing anything else. If verification fails, submit the fail verdict first, then fix.
7
+
8
+ Verification is NOT just visual — you must functionally test the changes by interacting with the application through the browser-devtools MCP server. Click buttons, fill forms, trigger the flows you changed, and confirm things actually work end-to-end.
9
+
10
+ You are responsible for the full application lifecycle during verification:
11
+ - **Build** the application if needed (e.g. `npm run build`, `npm run dev`, `docker compose build`)
12
+ - **Start** the dev server before navigating to any page (e.g. `npm run dev`, `docker compose up -d`)
13
+ - **Stop** the dev server after verification is complete (e.g. `Ctrl+C`, `docker compose down`)
14
+ If the application is already running, skip the start step. If the build fails, fix it before proceeding.
15
+
16
+ Required verification steps:
17
+ 1. Build and start the application if not already running
18
+ 2. Navigate to affected page(s) with `mcp__browser-devtools__navigation_go-to`
19
+ 3. **Functionally test** the changes — click, type, submit, navigate, interact with the UI to exercise the code paths you modified
20
+ 4. Take a screenshot with `mcp__browser-devtools__content_take-screenshot` to capture the final state
21
+ 5. Check accessibility with `mcp__browser-devtools__a11y_take-aria-snapshot`
22
+ 6. Check console for errors with `mcp__browser-devtools__o11y_get-console-messages`
23
+ 7. Stop the dev server when done
24
+ 8. **IMMEDIATELY submit your verdict** — do NOT edit any code before submitting: `echo '<verdict-json>' | ironbee hook submit-verdict`
25
+ - Pass → submit pass verdict
26
+ - Fail → submit fail verdict with issues, THEN fix the code and re-verify
27
+
28
+ Steps 2, 4, 5, and 6 are checked by the stop hook. Step 3 is expected — do not just take a screenshot and call it done.
29
+
30
+ The session-start hook outputs your session ID at the beginning of your session. After EVERY verification attempt, you MUST submit a verdict before doing anything else — even if it failed. Do not skip to fixing code. The submit-verdict command validates and records the verdict.
31
+
32
+ If verification fails: submit fail verdict → fix the code → re-verify → submit again.
33
+
34
+ Every file edit automatically clears your verdict, requiring re-verification.
35
+
36
+ ## BANNED
37
+
38
+ - Writing verdict.json directly — always use `ironbee hook submit-verdict`
39
+ - Skipping the fail verdict — always submit fail before fixing, so issues are tracked
40
+ - Submitting a verdict without actually performing browser verification
41
+ - Submitting a verdict based on assumptions, code reading, or prior knowledge
42
+ - Copying example verdicts from hook messages without doing real verification first
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: ironbee-verification
3
+ description: >
4
+ MANDATORY browser verification after code changes. Activates when: implementing features,
5
+ fixing bugs, modifying UI components, changing API endpoints, updating styles, refactoring code,
6
+ or completing ANY task that changes application behavior. After writing or editing code files,
7
+ you MUST verify changes through the browser-devtools MCP server and submit a verdict (pass or fail)
8
+ before reporting task completion. If verification fails, submit the fail verdict before fixing.
9
+ ---
10
+
11
+ # IronBee Browser Verification
12
+
13
+ ## Rule
14
+ No task is complete until changes are verified in the browser — visually AND functionally. After verification, you MUST submit a verdict (pass or fail) before doing anything else. If verification fails, submit the fail verdict first, then fix.
15
+
16
+ ## MCP Server
17
+ Verification is performed using the **browser-devtools** MCP server (`browser-devtools-mcp` package).
18
+ All browser interactions must go through this server's tools.
19
+
20
+ ## Application Lifecycle
21
+ You are responsible for managing the application during verification:
22
+ - **Build** the application if needed (e.g. `npm run build`, `npm run dev`, `docker compose build`, or whatever the project uses)
23
+ - **Start** the dev server before navigating to any page (e.g. `npm run dev`, `docker compose up`, `docker compose up -d`)
24
+ - **Stop** the dev server after verification is complete (e.g. `Ctrl+C`, `docker compose down`)
25
+
26
+ If the application is already running, skip the start step. If the build fails, fix the build error before proceeding with verification.
27
+
28
+ ## Flow
29
+ 1. Implement your changes (write/edit code)
30
+ 2. **Build and start** the application if not already running
31
+ 3. **Functionally test** your changes through the browser:
32
+ - **Navigate**: `mcp__browser-devtools__navigation_go-to` — go to the affected page(s)
33
+ - **Interact**: Use the browser agent to **actually test** what you changed — click buttons, fill forms, submit data, trigger workflows, navigate between pages. Do not just look at the page.
34
+ - **Screenshot**: `mcp__browser-devtools__content_take-screenshot` — capture the final visual state
35
+ - **Accessibility**: `mcp__browser-devtools__a11y_take-aria-snapshot` — verify page structure
36
+ - **Console**: `mcp__browser-devtools__o11y_get-console-messages` — check for errors
37
+ Navigate, Screenshot, Accessibility, and Console tools are MANDATORY. Functional interaction is expected for every verification.
38
+ 4. **Stop** the dev server when verification is complete
39
+ 5. **IMMEDIATELY submit your verdict** — do NOT edit any code before submitting: `echo '<verdict-json>' | ironbee hook submit-verdict`
40
+ - If everything works → submit pass verdict
41
+ - If something is broken → submit fail verdict with issues describing what failed
42
+ - **Never skip this step.** Every verification attempt must be recorded, pass or fail.
43
+ 6. If you submitted a fail verdict → fix the code → rebuild → go back to step 2 → submit again → repeat until pass
44
+
45
+ ## What good verification looks like
46
+ - Changed a form handler? → Start the app, fill the form, submit it, verify the response
47
+ - Added a button? → Click it, confirm the expected action happens
48
+ - Fixed a routing bug? → Navigate through the affected routes
49
+ - Updated an API call? → Trigger the action that calls the API, verify the result in the UI
50
+ - Changed styling? → Take a screenshot AND interact to ensure layout didn't break functionality
51
+
52
+ ## How it works
53
+ - At session start, the session-start hook outputs your session ID
54
+ - After verification, submit your verdict: `echo '<verdict-json>' | ironbee hook submit-verdict`
55
+ - The submit-verdict command validates your verdict and records it
56
+ - When you stop, the stop hook checks that browser tools were used AND a valid verdict exists
57
+ - Every code edit automatically clears your verdict, requiring re-verification
58
+
59
+ ## Agent Teams
60
+ - Subagents focus on implementation only — do NOT verify
61
+ - The main orchestrator agent verifies ALL changes after subagents complete
62
+ - Each session's verification is isolated via session-specific verdict files
63
+
64
+ ## Verdict format
65
+
66
+ On pass:
67
+ ```json
68
+ {"session_id":"<your-session-id>","status":"pass","pages_tested":["http://localhost:3000/page"],"checks":["feature works"],"console_errors":0,"network_failures":0}
69
+ ```
70
+
71
+ On fail (issues is required):
72
+ ```json
73
+ {"session_id":"<your-session-id>","status":"fail","pages_tested":["http://localhost:3000/page"],"checks":["feature broken"],"console_errors":1,"network_failures":0,"issues":["button click handler not firing"]}
74
+ ```
75
+
76
+ On pass after a previous fail (fixes is required):
77
+ ```json
78
+ {"session_id":"<your-session-id>","status":"pass","pages_tested":["http://localhost:3000/page"],"checks":["feature works"],"console_errors":0,"network_failures":0,"fixes":["reattached click handler to submit button"]}
79
+ ```
80
+
81
+ ## Important
82
+ - **Always submit a verdict after every verification attempt** — both pass AND fail. Fail verdicts are tracked for analytics.
83
+ - The stop hook checks BOTH that browser-devtools MCP tools were used AND a valid verdict exists
84
+ - Submit verdicts via `ironbee hook submit-verdict`, do NOT write verdict.json directly
85
+ - Every file edit automatically clears your session's verdict
86
+ - After 3 failed verification attempts, you may complete but must report issues
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/clients/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAKvC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE,CAE3D"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/clients/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIjC,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAKvC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE,CAE3D"}
@@ -4,10 +4,11 @@ exports.REGISTERED_CLIENTS = void 0;
4
4
  exports.findClient = findClient;
5
5
  exports.detectClients = detectClients;
6
6
  const claude_1 = require("./claude");
7
+ const cursor_1 = require("./cursor");
7
8
  /** All registered clients. Add new clients here as they are implemented. */
8
9
  exports.REGISTERED_CLIENTS = [
9
10
  new claude_1.ClaudeClient(),
10
- // new CursorClient(), // TODO: add when implementing Cursor support
11
+ new cursor_1.CursorClient(),
11
12
  // new OpenCodeClient(), // TODO: add when implementing OpenCode support
12
13
  // new CodexClient(), // TODO: add when implementing Codex support
13
14
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/clients/registry.ts"],"names":[],"mappings":";;;AAWA,gCAEC;AAED,sCAEC;AAhBD,qCAAwC;AAExC,4EAA4E;AAC/D,QAAA,kBAAkB,GAAc;IACzC,IAAI,qBAAY,EAAE;IAClB,sEAAsE;IACtE,wEAAwE;IACxE,qEAAqE;CACxE,CAAC;AAEF,SAAgB,UAAU,CAAC,IAAY;IACnC,OAAO,0BAAkB,CAAC,IAAI,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,aAAa,CAAC,UAAkB;IAC5C,OAAO,0BAAkB,CAAC,MAAM,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/clients/registry.ts"],"names":[],"mappings":";;;AAYA,gCAEC;AAED,sCAEC;AAjBD,qCAAwC;AACxC,qCAAwC;AAExC,4EAA4E;AAC/D,QAAA,kBAAkB,GAAc;IACzC,IAAI,qBAAY,EAAE;IAClB,IAAI,qBAAY,EAAE;IAClB,wEAAwE;IACxE,qEAAqE;CACxE,CAAC;AAEF,SAAgB,UAAU,CAAC,IAAY;IACnC,OAAO,0BAAkB,CAAC,IAAI,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,aAAa,CAAC,UAAkB;IAC5C,OAAO,0BAAkB,CAAC,MAAM,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,WAAW,EAAE,OACiD,CAAC"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,eAAO,MAAM,WAAW,EAAE,OACiD,CAAC"}
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hookCommand = void 0;
4
4
  const commander_1 = require("commander");
5
5
  const registry_1 = require("../clients/registry");
6
+ const submit_verdict_1 = require("../hooks/core/submit-verdict");
7
+ const logger_1 = require("../lib/logger");
8
+ const stdin_1 = require("../lib/stdin");
6
9
  function resolveClient(clientName) {
7
10
  const name = clientName ?? process.env.IRONBEE_CLIENT;
8
11
  if (!name) {
@@ -54,4 +57,62 @@ exports.hookCommand
54
57
  const projectDir = client.resolveProjectDir();
55
58
  client.runSessionStart(projectDir);
56
59
  });
60
+ exports.hookCommand
61
+ .command("require-verdict")
62
+ .description("PreToolUse hook — blocks file edits until verdict is submitted after browser tool usage")
63
+ .option("--client <name>", "client name (overrides IRONBEE_CLIENT env var)")
64
+ .action((options) => {
65
+ const client = resolveClient(options.client);
66
+ const projectDir = client.resolveProjectDir();
67
+ client.runRequireVerdict(projectDir);
68
+ });
69
+ exports.hookCommand
70
+ .command("submit-verdict")
71
+ .description("Submit verification verdict (called by agent via Bash)")
72
+ .option("--project-dir <dir>", "project directory (overrides env vars)")
73
+ .action((options) => {
74
+ const projectDir = options.projectDir
75
+ ?? process.env.IRONBEE_PROJECT_DIR
76
+ ?? process.env.CLAUDE_PROJECT_DIR
77
+ ?? process.env.CURSOR_PROJECT_DIR
78
+ ?? process.cwd();
79
+ let verdictJson;
80
+ try {
81
+ verdictJson = (0, stdin_1.readStdin)();
82
+ }
83
+ catch {
84
+ process.stderr.write("Error: no verdict JSON provided via stdin.\n");
85
+ process.exit(1);
86
+ }
87
+ // extract session_id from verdict JSON
88
+ let parsed;
89
+ try {
90
+ parsed = JSON.parse(verdictJson);
91
+ }
92
+ catch {
93
+ process.stderr.write("Error: verdict is not valid JSON.\n");
94
+ process.exit(1);
95
+ }
96
+ const sessionId = typeof parsed.session_id === "string" ? parsed.session_id : undefined;
97
+ if (!sessionId) {
98
+ process.stderr.write("Error: verdict JSON must include a \"session_id\" field.\n");
99
+ process.exit(1);
100
+ }
101
+ const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
102
+ (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
103
+ const result = (0, submit_verdict_1.runSubmitVerdict)({
104
+ sessionId,
105
+ verdictFile: `${sessionDir}/verdict.json`,
106
+ actionsFile: `${sessionDir}/actions.jsonl`,
107
+ verdictJson,
108
+ });
109
+ if (result.success) {
110
+ process.stdout.write(result.message + "\n");
111
+ process.exit(0);
112
+ }
113
+ else {
114
+ process.stderr.write(result.message + "\n");
115
+ process.exit(1);
116
+ }
117
+ });
57
118
  //# sourceMappingURL=hook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AAEpC,kDAAiD;AAEjD,SAAS,aAAa,CAAC,UAA8B;IACjD,MAAM,IAAI,GAAuB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1E,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAwB,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC;IAErD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,yCAAyC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAEY,QAAA,WAAW,GAAY,IAAI,mBAAO,CAAC,MAAM,CAAC;KAClD,WAAW,CAAC,yDAAyD,CAAC,CAAC;AAE5E,mBAAW;KACN,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEP,mBAAW;KACN,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEP,mBAAW;KACN,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEP,mBAAW;KACN,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAQ,EAAE;IAC3C,MAAM,MAAM,GAAY,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAW,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACtD,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,cAAc,EAAE,OA+CvB,CAAC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,EAAE,OA6CvB,CAAC"}
@@ -4,19 +4,9 @@ exports.installCommand = void 0;
4
4
  const commander_1 = require("commander");
5
5
  const fs_1 = require("fs");
6
6
  const path_1 = require("path");
7
- const child_process_1 = require("child_process");
8
7
  const registry_1 = require("../clients/registry");
9
8
  const claude_1 = require("../clients/claude");
10
9
  const output_1 = require("../lib/output");
11
- function resolveIronBeePath() {
12
- const cmd = process.platform === "win32" ? "where" : "which";
13
- try {
14
- return (0, child_process_1.execFileSync)(cmd, ["ironbee"]).toString().trim();
15
- }
16
- catch {
17
- return process.argv[1];
18
- }
19
- }
20
10
  function clientNames() {
21
11
  const names = registry_1.REGISTERED_CLIENTS.map((c) => c.name);
22
12
  return names.join(", ");
@@ -31,7 +21,6 @@ exports.installCommand = new commander_1.Command("install")
31
21
  output_1.log.error(`Directory not found: ${projectDir}`);
32
22
  process.exit(1);
33
23
  }
34
- const ironBeePath = resolveIronBeePath();
35
24
  let clients;
36
25
  if (options.client === "all") {
37
26
  clients = registry_1.REGISTERED_CLIENTS;
@@ -58,10 +47,9 @@ exports.installCommand = new commander_1.Command("install")
58
47
  output_1.log.blank();
59
48
  (0, claude_1.prepareIronBeeDir)(projectDir);
60
49
  for (const client of clients) {
61
- client.install(projectDir, ironBeePath);
50
+ client.install(projectDir);
62
51
  }
63
52
  output_1.log.blank();
64
- output_1.log.label("binary", output_1.pc.dim(ironBeePath));
65
53
  output_1.log.label("project", output_1.pc.dim(projectDir));
66
54
  output_1.log.blank();
67
55
  output_1.log.success(`IronBee installed. ${output_1.pc.dim("Restart your AI coding client to activate the hooks.")}`);
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,2BAAgC;AAChC,+BAA+B;AAE/B,kDAAoF;AACpF,8CAAsD;AACtD,0CAAwC;AAExC,SAAS,WAAW;IAChB,MAAM,KAAK,GAAa,6BAAkB,CAAC,GAAG,CAAC,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAEY,QAAA,cAAc,GAAY,IAAI,mBAAO,CAAC,SAAS,CAAC;KACxD,WAAW,CAAC,yDAAyD,CAAC;KACtE,QAAQ,CAAC,eAAe,EAAE,0BAA0B,EAAE,GAAG,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,WAAW,EAAE,aAAa,CAAC;KAC/E,MAAM,CAAC,CAAC,GAAW,EAAE,OAA4B,EAAQ,EAAE;IACxD,MAAM,UAAU,GAAW,IAAA,cAAO,EAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,YAAG,CAAC,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,OAAkB,CAAC;IAEvB,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,GAAG,6BAAkB,CAAC;IACjC,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,KAAK,GAAwB,IAAA,qBAAU,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,YAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,MAAM,iBAAiB,WAAW,EAAE,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACJ,OAAO,GAAG,IAAA,wBAAa,EAAC,UAAU,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,YAAG,CAAC,IAAI,CAAC,sCAAsC,6BAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7E,OAAO,GAAG,CAAC,6BAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACJ,MAAM,QAAQ,GAAW,OAAO,CAAC,GAAG,CAAC,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChF,YAAG,CAAC,IAAI,CAAC,uBAAuB,WAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,YAAG,CAAC,KAAK,EAAE,CAAC;IACZ,IAAA,0BAAiB,EAAC,UAAU,CAAC,CAAC;IAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,YAAG,CAAC,KAAK,EAAE,CAAC;IACZ,YAAG,CAAC,KAAK,CAAC,SAAS,EAAE,WAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,YAAG,CAAC,KAAK,EAAE,CAAC;IACZ,YAAG,CAAC,OAAO,CAAC,sBAAsB,WAAE,CAAC,GAAG,CAAC,sDAAsD,CAAC,EAAE,CAAC,CAAC;AACxG,CAAC,CAAC,CAAC"}
@@ -59,9 +59,9 @@ exports.statusCommand = new commander_1.Command("status")
59
59
  if (retries > 0) {
60
60
  console.log(` ${output_1.pc.dim("retries")} : ${output_1.pc.yellow(`${retries}/3`)}`);
61
61
  }
62
- if (verdict.status === "fail" && verdict.errors?.length) {
63
- console.log(` ${output_1.pc.dim("errors")} :`);
64
- for (const e of verdict.errors) {
62
+ if (verdict.status === "fail" && verdict.issues?.length) {
63
+ console.log(` ${output_1.pc.dim("issues")} :`);
64
+ for (const e of verdict.issues) {
65
65
  console.log(` ${output_1.pc.red("•")} ${e}`);
66
66
  }
67
67
  }
@@ -65,12 +65,12 @@ function checkVerdict(verdict) {
65
65
  pass(`status: ${verdict.status}`);
66
66
  }
67
67
  if (verdict.status === "fail") {
68
- if (!Array.isArray(verdict.errors) || verdict.errors.length === 0) {
69
- fail("errors", 'required when status is "fail"');
68
+ if (!Array.isArray(verdict.issues) || verdict.issues.length === 0) {
69
+ fail("issues", 'required when status is "fail"');
70
70
  allPassed = false;
71
71
  }
72
72
  else {
73
- pass(`errors (${verdict.errors.length} item(s))`);
73
+ pass(`errors (${verdict.issues.length} item(s))`);
74
74
  }
75
75
  }
76
76
  return allPassed;
@@ -17,6 +17,12 @@ export interface ToolCallAction extends ActionEntry {
17
17
  }
18
18
  export interface VerificationRequestedAction extends ActionEntry {
19
19
  type: "verification_requested";
20
+ action?: "allow" | "block";
21
+ reason?: string;
22
+ }
23
+ export interface VerdictWriteAction extends ActionEntry {
24
+ type: "verdict_write";
25
+ verdict: Record<string, unknown>;
20
26
  }
21
27
  export interface FileEditAction extends ActionEntry {
22
28
  type: "file_edit";
@@ -31,5 +37,6 @@ export interface SessionStartAction extends ActionEntry {
31
37
  export declare function appendAction(actionsFile: string, entry: ActionEntry): void;
32
38
  export declare function readActionsSinceLastMarker(actionsFile: string, markerType: string): ActionEntry[];
33
39
  export declare function getToolCallsSinceLastVerification(actionsFile: string): ToolCallAction[];
40
+ export declare function hasToolCallsSinceLastVerdict(actionsFile: string): boolean;
34
41
  export declare function hasFileEditsSinceLastVerification(actionsFile: string): boolean;
35
42
  //# sourceMappingURL=actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA4B,SAAQ,WAAW;IAC5D,IAAI,EAAE,wBAAwB,CAAC;CAClC;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAO1E;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CA6BjG;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAGvF;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG9E"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA4B,SAAQ,WAAW;IAC5D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAO1E;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CA6BjG;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAGvF;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGzE;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG9E"}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.appendAction = appendAction;
10
10
  exports.readActionsSinceLastMarker = readActionsSinceLastMarker;
11
11
  exports.getToolCallsSinceLastVerification = getToolCallsSinceLastVerification;
12
+ exports.hasToolCallsSinceLastVerdict = hasToolCallsSinceLastVerdict;
12
13
  exports.hasFileEditsSinceLastVerification = hasFileEditsSinceLastVerification;
13
14
  const fs_1 = require("fs");
14
15
  const path_1 = require("path");
@@ -54,6 +55,10 @@ function getToolCallsSinceLastVerification(actionsFile) {
54
55
  const entries = readActionsSinceLastMarker(actionsFile, "verification_requested");
55
56
  return entries.filter((e) => e.type === "tool_call");
56
57
  }
58
+ function hasToolCallsSinceLastVerdict(actionsFile) {
59
+ const entries = readActionsSinceLastMarker(actionsFile, "verdict_write");
60
+ return entries.some((e) => e.type === "tool_call");
61
+ }
57
62
  function hasFileEditsSinceLastVerification(actionsFile) {
58
63
  const entries = readActionsSinceLastMarker(actionsFile, "verification_requested");
59
64
  return entries.some((e) => e.type === "file_edit");
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAmCH,oCAOC;AAED,gEA6BC;AAED,8EAGC;AAED,8EAGC;AAjFD,2BAAyE;AACzE,+BAA+B;AAC/B,6CAA0C;AA+B1C,SAAgB,YAAY,CAAC,WAAmB,EAAE,KAAkB;IAChE,IAAI,CAAC;QACD,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAA,mBAAc,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,8BAA8B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;AACL,CAAC;AAED,SAAgB,0BAA0B,CAAC,WAAmB,EAAE,UAAkB;IAC9E,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAW,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAa,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhG,IAAI,eAAe,GAAW,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACD,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAgB,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5B,eAAe,GAAG,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,uBAAuB;YAC3B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,+BAA+B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAc,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3F,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA0CH,oCAOC;AAED,gEA6BC;AAED,8EAGC;AAED,oEAGC;AAED,8EAGC;AA7FD,2BAAyE;AACzE,+BAA+B;AAC/B,6CAA0C;AAsC1C,SAAgB,YAAY,CAAC,WAAmB,EAAE,KAAkB;IAChE,IAAI,CAAC;QACD,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAA,mBAAc,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,8BAA8B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;AACL,CAAC;AAED,SAAgB,0BAA0B,CAAC,WAAmB,EAAE,UAAkB;IAC9E,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAW,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAa,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhG,IAAI,eAAe,GAAW,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACD,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAgB,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5B,eAAe,GAAG,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,uBAAuB;YAC3B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,+BAA+B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAc,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3F,CAAC;AAED,SAAgB,4BAA4B,CAAC,WAAmB;IAC5D,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC"}