@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.
- package/CHANGELOG.md +2 -0
- package/README.md +38 -9
- package/dist/clients/base.d.ts +3 -1
- 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 +2 -1
- package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verdict.d.ts +13 -0
- package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -0
- package/dist/clients/claude/hooks/require-verdict.js +42 -0
- package/dist/clients/claude/hooks/require-verdict.js.map +1 -0
- package/dist/clients/claude/hooks/session-start.d.ts +4 -3
- package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-start.js +22 -18
- package/dist/clients/claude/hooks/session-start.js.map +1 -1
- package/dist/clients/claude/index.d.ts +2 -1
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +46 -24
- package/dist/clients/claude/index.js.map +1 -1
- package/dist/clients/claude/rule.md +10 -8
- package/dist/clients/claude/skill.md +32 -9
- package/dist/clients/cursor/hooks/clear-verdict.d.ts +11 -0
- package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/clear-verdict.js +57 -0
- package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -0
- package/dist/clients/cursor/hooks/require-verdict.d.ts +12 -0
- package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/require-verdict.js +48 -0
- package/dist/clients/cursor/hooks/require-verdict.js.map +1 -0
- package/dist/clients/cursor/hooks/session-start.d.ts +9 -0
- package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/session-start.js +75 -0
- package/dist/clients/cursor/hooks/session-start.js.map +1 -0
- package/dist/clients/cursor/hooks/track-action.d.ts +16 -0
- package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/track-action.js +92 -0
- package/dist/clients/cursor/hooks/track-action.js.map +1 -0
- package/dist/clients/cursor/hooks/verify-gate.d.ts +13 -0
- package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/verify-gate.js +49 -0
- package/dist/clients/cursor/hooks/verify-gate.js.map +1 -0
- package/dist/clients/cursor/index.d.ts +20 -0
- package/dist/clients/cursor/index.d.ts.map +1 -0
- package/dist/clients/cursor/index.js +213 -0
- package/dist/clients/cursor/index.js.map +1 -0
- package/dist/clients/cursor/rule.md +42 -0
- package/dist/clients/cursor/skill.md +86 -0
- package/dist/clients/registry.d.ts.map +1 -1
- package/dist/clients/registry.js +2 -1
- package/dist/clients/registry.js.map +1 -1
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +61 -0
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +1 -13
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/status.js +3 -3
- package/dist/commands/verify.js +3 -3
- package/dist/hooks/core/actions.d.ts +7 -0
- package/dist/hooks/core/actions.d.ts.map +1 -1
- package/dist/hooks/core/actions.js +5 -0
- package/dist/hooks/core/actions.js.map +1 -1
- package/dist/hooks/core/submit-verdict.d.ts +21 -0
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -0
- package/dist/hooks/core/submit-verdict.js +109 -0
- package/dist/hooks/core/submit-verdict.js.map +1 -0
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +66 -49
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/lib/icon.js +1 -1
- package/dist/lib/icon.js.map +1 -1
- 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;
|
|
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"}
|
package/dist/clients/registry.js
CHANGED
|
@@ -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
|
-
|
|
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":";;;
|
|
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;
|
|
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"}
|
package/dist/commands/hook.js
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -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
|
|
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":";;;AAAA,yCAAoC;AACpC,2BAAgC;AAChC,+BAA+B;
|
|
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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -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.
|
|
63
|
-
console.log(` ${output_1.pc.dim("
|
|
64
|
-
for (const e of verdict.
|
|
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
|
}
|
package/dist/commands/verify.js
CHANGED
|
@@ -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.
|
|
69
|
-
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.
|
|
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;
|
|
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;;
|
|
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"}
|