@ironbee-ai/cli 0.2.1 → 0.4.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 +31 -3
- package/README.md +118 -3
- package/dist/analysis/code-changes.d.ts +22 -0
- package/dist/analysis/code-changes.d.ts.map +1 -0
- package/dist/analysis/code-changes.js +141 -0
- package/dist/analysis/code-changes.js.map +1 -0
- package/dist/analysis/cross-session.d.ts +34 -0
- package/dist/analysis/cross-session.d.ts.map +1 -0
- package/dist/analysis/cross-session.js +230 -0
- package/dist/analysis/cross-session.js.map +1 -0
- package/dist/analysis/fix-effectiveness.d.ts +16 -0
- package/dist/analysis/fix-effectiveness.d.ts.map +1 -0
- package/dist/analysis/fix-effectiveness.js +99 -0
- package/dist/analysis/fix-effectiveness.js.map +1 -0
- package/dist/analysis/scoring.d.ts +15 -0
- package/dist/analysis/scoring.d.ts.map +1 -0
- package/dist/analysis/scoring.js +57 -0
- package/dist/analysis/scoring.js.map +1 -0
- package/dist/analysis/time-analysis.d.ts +22 -0
- package/dist/analysis/time-analysis.d.ts.map +1 -0
- package/dist/analysis/time-analysis.js +174 -0
- package/dist/analysis/time-analysis.js.map +1 -0
- package/dist/analysis/verdict-details.d.ts +23 -0
- package/dist/analysis/verdict-details.d.ts.map +1 -0
- package/dist/analysis/verdict-details.js +59 -0
- package/dist/analysis/verdict-details.js.map +1 -0
- package/dist/analysis/verification-quality.d.ts +19 -0
- package/dist/analysis/verification-quality.d.ts.map +1 -0
- package/dist/analysis/verification-quality.js +182 -0
- package/dist/analysis/verification-quality.js.map +1 -0
- package/dist/clients/base.d.ts +2 -0
- package/dist/clients/base.d.ts.map +1 -1
- package/dist/clients/claude/commands/ironbee-analyze.md +42 -0
- package/dist/clients/claude/hooks/clear-verdict.js +1 -1
- package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verification.d.ts +15 -0
- package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -0
- package/dist/clients/claude/hooks/require-verification.js +61 -0
- package/dist/clients/claude/hooks/require-verification.js.map +1 -0
- package/dist/clients/claude/hooks/session-start.d.ts +1 -1
- package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-start.js +10 -1
- package/dist/clients/claude/hooks/session-start.js.map +1 -1
- package/dist/clients/claude/hooks/track-action.d.ts +1 -1
- package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/claude/hooks/track-action.js +58 -13
- package/dist/clients/claude/hooks/track-action.js.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.d.ts +1 -1
- package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.js +3 -3
- package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
- package/dist/clients/claude/index.d.ts +2 -0
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +43 -9
- package/dist/clients/claude/index.js.map +1 -1
- package/dist/clients/claude/rule.md +9 -7
- package/dist/clients/claude/skill.md +11 -8
- package/dist/clients/claude/skills/ironbee-analyze.md +39 -0
- package/dist/clients/cursor/commands/ironbee-analyze/SKILL.md +48 -0
- package/dist/clients/cursor/hooks/clear-verdict.js +1 -1
- package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.d.ts +15 -0
- package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/require-verification.js +63 -0
- package/dist/clients/cursor/hooks/require-verification.js.map +1 -0
- package/dist/clients/cursor/hooks/session-start.d.ts +1 -1
- package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/session-start.js +6 -1
- package/dist/clients/cursor/hooks/session-start.js.map +1 -1
- package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/track-action.js +62 -12
- package/dist/clients/cursor/hooks/track-action.js.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.d.ts +1 -1
- package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.js +3 -3
- package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
- package/dist/clients/cursor/index.d.ts +2 -0
- package/dist/clients/cursor/index.d.ts.map +1 -1
- package/dist/clients/cursor/index.js +31 -6
- package/dist/clients/cursor/index.js.map +1 -1
- package/dist/clients/cursor/rule.md +9 -7
- package/dist/clients/cursor/skill.md +11 -8
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +298 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +81 -2
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +3 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +3 -1
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/hooks/core/actions.d.ts +19 -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/clear-verdict.d.ts +1 -1
- package/dist/hooks/core/clear-verdict.d.ts.map +1 -1
- package/dist/hooks/core/clear-verdict.js +13 -9
- package/dist/hooks/core/clear-verdict.js.map +1 -1
- package/dist/hooks/core/session-state.d.ts +47 -0
- package/dist/hooks/core/session-state.d.ts.map +1 -0
- package/dist/hooks/core/session-state.js +192 -0
- package/dist/hooks/core/session-state.js.map +1 -0
- package/dist/hooks/core/submit-verdict.d.ts +2 -1
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +38 -28
- package/dist/hooks/core/submit-verdict.js.map +1 -1
- package/dist/hooks/core/verification-lifecycle.d.ts +30 -0
- package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -0
- package/dist/hooks/core/verification-lifecycle.js +75 -0
- package/dist/hooks/core/verification-lifecycle.js.map +1 -0
- package/dist/hooks/core/verify-gate.d.ts +2 -2
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +28 -33
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/telemetry.d.ts +23 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +265 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +7 -0
- package/dist/scripts/postinstall.d.ts.map +1 -0
- package/dist/scripts/postinstall.js +12 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/scripts/preuninstall.d.ts +8 -0
- package/dist/scripts/preuninstall.d.ts.map +1 -0
- package/dist/scripts/preuninstall.js +13 -0
- package/dist/scripts/preuninstall.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee — Verification Quality Analysis
|
|
4
|
+
*
|
|
5
|
+
* Reads actions.jsonl and calculates verification quality metrics.
|
|
6
|
+
* Pure logic — no process.exit, no stdin, no side effects.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.analyzeVerificationQuality = analyzeVerificationQuality;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
function parseEntries(actionsFile) {
|
|
12
|
+
if (!(0, fs_1.existsSync)(actionsFile)) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
const content = (0, fs_1.readFileSync)(actionsFile, "utf-8");
|
|
16
|
+
const lines = content.trim().split("\n").filter((l) => l.length > 0);
|
|
17
|
+
const entries = [];
|
|
18
|
+
for (const line of lines) {
|
|
19
|
+
try {
|
|
20
|
+
const entry = JSON.parse(line);
|
|
21
|
+
entries.push(entry);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// skip malformed lines
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return entries;
|
|
28
|
+
}
|
|
29
|
+
function extractVerdictData(entry) {
|
|
30
|
+
if (entry.type !== "verdict_write") {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const verdict = entry.verdict;
|
|
34
|
+
if (typeof verdict !== "object" || verdict === null) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const v = verdict;
|
|
38
|
+
return {
|
|
39
|
+
status: typeof v.status === "string" ? v.status : undefined,
|
|
40
|
+
console_errors: typeof v.console_errors === "number" ? v.console_errors : undefined,
|
|
41
|
+
network_failures: typeof v.network_failures === "number" ? v.network_failures : undefined,
|
|
42
|
+
pages_tested: Array.isArray(v.pages_tested) ? v.pages_tested : undefined,
|
|
43
|
+
checks: Array.isArray(v.checks) ? v.checks : undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function buildChains(entries) {
|
|
47
|
+
const chains = [];
|
|
48
|
+
let currentChain = { verdicts: [] };
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
if (entry.type === "verdict_write") {
|
|
51
|
+
const data = extractVerdictData(entry);
|
|
52
|
+
if (data !== null) {
|
|
53
|
+
currentChain.verdicts.push(data);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (entry.type === "verification_requested" && entry.action === "allow") {
|
|
57
|
+
if (currentChain.verdicts.length > 0) {
|
|
58
|
+
chains.push(currentChain);
|
|
59
|
+
}
|
|
60
|
+
currentChain = { verdicts: [] };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// push trailing chain if it has verdicts
|
|
64
|
+
if (currentChain.verdicts.length > 0) {
|
|
65
|
+
chains.push(currentChain);
|
|
66
|
+
}
|
|
67
|
+
return chains;
|
|
68
|
+
}
|
|
69
|
+
function analyzeVerificationQuality(actionsFile) {
|
|
70
|
+
const entries = parseEntries(actionsFile);
|
|
71
|
+
// Collect all verdict_write entries
|
|
72
|
+
const allVerdicts = [];
|
|
73
|
+
for (const entry of entries) {
|
|
74
|
+
const data = extractVerdictData(entry);
|
|
75
|
+
if (data !== null) {
|
|
76
|
+
allVerdicts.push(data);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (allVerdicts.length === 0) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const chains = buildChains(entries);
|
|
83
|
+
// First-pass success rate
|
|
84
|
+
let firstPassSuccesses = 0;
|
|
85
|
+
const totalChains = chains.length;
|
|
86
|
+
for (const chain of chains) {
|
|
87
|
+
if (chain.verdicts.length > 0 && chain.verdicts[0].status === "pass") {
|
|
88
|
+
firstPassSuccesses++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const firstPassSuccessRate = totalChains > 0
|
|
92
|
+
? Math.round((firstPassSuccesses / totalChains) * 100)
|
|
93
|
+
: 0;
|
|
94
|
+
// Pass / fail counts
|
|
95
|
+
let passCount = 0;
|
|
96
|
+
let failCount = 0;
|
|
97
|
+
for (const v of allVerdicts) {
|
|
98
|
+
if (v.status === "pass") {
|
|
99
|
+
passCount++;
|
|
100
|
+
}
|
|
101
|
+
else if (v.status === "fail") {
|
|
102
|
+
failCount++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Average retries: for each chain that ends in pass, count fails before the pass
|
|
106
|
+
const retryCounts = [];
|
|
107
|
+
for (const chain of chains) {
|
|
108
|
+
// Find the first pass in the chain
|
|
109
|
+
let failsBeforePass = 0;
|
|
110
|
+
let foundPass = false;
|
|
111
|
+
for (const v of chain.verdicts) {
|
|
112
|
+
if (v.status === "pass") {
|
|
113
|
+
foundPass = true;
|
|
114
|
+
retryCounts.push(failsBeforePass);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
if (v.status === "fail") {
|
|
118
|
+
failsBeforePass++;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Chains that never reach pass don't contribute to average retries
|
|
122
|
+
if (!foundPass) {
|
|
123
|
+
// still count them — they had all fails as "retries" with no success
|
|
124
|
+
// but per spec, average retries is about retries before pass
|
|
125
|
+
// so we skip chains with no pass
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const averageRetries = retryCounts.length > 0
|
|
129
|
+
? Math.round((retryCounts.reduce((a, b) => a + b, 0) / retryCounts.length) * 10) / 10
|
|
130
|
+
: 0;
|
|
131
|
+
// Averages across all verdicts
|
|
132
|
+
let totalConsoleErrors = 0;
|
|
133
|
+
let consoleErrorCount = 0;
|
|
134
|
+
let totalNetworkFailures = 0;
|
|
135
|
+
let networkFailureCount = 0;
|
|
136
|
+
let totalPagesTestedCount = 0;
|
|
137
|
+
let pagesTestedEntries = 0;
|
|
138
|
+
let totalChecksCount = 0;
|
|
139
|
+
let checksEntries = 0;
|
|
140
|
+
for (const v of allVerdicts) {
|
|
141
|
+
if (v.console_errors !== undefined) {
|
|
142
|
+
totalConsoleErrors += v.console_errors;
|
|
143
|
+
consoleErrorCount++;
|
|
144
|
+
}
|
|
145
|
+
if (v.network_failures !== undefined) {
|
|
146
|
+
totalNetworkFailures += v.network_failures;
|
|
147
|
+
networkFailureCount++;
|
|
148
|
+
}
|
|
149
|
+
if (v.pages_tested !== undefined) {
|
|
150
|
+
totalPagesTestedCount += v.pages_tested.length;
|
|
151
|
+
pagesTestedEntries++;
|
|
152
|
+
}
|
|
153
|
+
if (v.checks !== undefined) {
|
|
154
|
+
totalChecksCount += v.checks.length;
|
|
155
|
+
checksEntries++;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const averageConsoleErrors = consoleErrorCount > 0
|
|
159
|
+
? Math.round((totalConsoleErrors / consoleErrorCount) * 10) / 10
|
|
160
|
+
: 0;
|
|
161
|
+
const averageNetworkFailures = networkFailureCount > 0
|
|
162
|
+
? Math.round((totalNetworkFailures / networkFailureCount) * 10) / 10
|
|
163
|
+
: 0;
|
|
164
|
+
const averagePagesTestedCount = pagesTestedEntries > 0
|
|
165
|
+
? Math.round((totalPagesTestedCount / pagesTestedEntries) * 10) / 10
|
|
166
|
+
: 0;
|
|
167
|
+
const averageChecksCount = checksEntries > 0
|
|
168
|
+
? Math.round((totalChecksCount / checksEntries) * 10) / 10
|
|
169
|
+
: 0;
|
|
170
|
+
return {
|
|
171
|
+
firstPassSuccessRate,
|
|
172
|
+
totalVerifications: allVerdicts.length,
|
|
173
|
+
passCount,
|
|
174
|
+
failCount,
|
|
175
|
+
averageRetries,
|
|
176
|
+
averageConsoleErrors,
|
|
177
|
+
averageNetworkFailures,
|
|
178
|
+
averagePagesTestedCount,
|
|
179
|
+
averageChecksCount,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=verification-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-quality.js","sourceRoot":"","sources":["../../src/analysis/verification-quality.ts"],"names":[],"mappings":"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"}
|
package/dist/clients/base.d.ts
CHANGED
|
@@ -18,5 +18,7 @@ export interface IClient {
|
|
|
18
18
|
runSessionStart(projectDir: string): void;
|
|
19
19
|
/** Runs the require-verdict PreToolUse hook for this client. */
|
|
20
20
|
runRequireVerdict(projectDir: string): void;
|
|
21
|
+
/** Runs the require-verification PreToolUse hook for this client. */
|
|
22
|
+
runRequireVerification(projectDir: string): void;
|
|
21
23
|
}
|
|
22
24
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/clients/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wEAAwE;IACxE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpC,oEAAoE;IACpE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,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,IAAI,CAAC;IAExC,+DAA+D;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C,8DAA8D;IAC9D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzC,mDAAmD;IACnD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C,gEAAgE;IAChE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/clients/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wEAAwE;IACxE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpC,oEAAoE;IACpE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,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,IAAI,CAAC;IAExC,+DAA+D;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C,8DAA8D;IAC9D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzC,mDAAmD;IACnD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C,gEAAgE;IAChE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5C,qEAAqE;IACrE,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAClD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# IronBee Session Analysis
|
|
2
|
+
|
|
3
|
+
Run `ironbee analyze --json --detailed` via Bash to get raw session metrics, then provide a semantic analysis.
|
|
4
|
+
|
|
5
|
+
## Steps
|
|
6
|
+
|
|
7
|
+
1. Run `ironbee analyze --json --detailed` (all sessions) or `ironbee analyze <session-id> --json` (specific session) via Bash
|
|
8
|
+
2. Parse the JSON output
|
|
9
|
+
3. Analyze and interpret the results:
|
|
10
|
+
|
|
11
|
+
### Time Analysis
|
|
12
|
+
- Is the coding:verification:fix ratio healthy? (High fix% = inefficient coding)
|
|
13
|
+
- Is time to first verification reasonable? (Too long = agent coding without testing)
|
|
14
|
+
|
|
15
|
+
### Verification Quality
|
|
16
|
+
- What is the first-pass success rate? Why might it be low?
|
|
17
|
+
- Are enough pages and checks being tested? (Low numbers = superficial testing)
|
|
18
|
+
|
|
19
|
+
### Code Changes
|
|
20
|
+
- Which files are hot files? Are they expected to change frequently?
|
|
21
|
+
- Which files are problematic? What might be causing repeated fixes?
|
|
22
|
+
- Is there edit churn? (Same file in multiple fix cycles = root cause not resolved)
|
|
23
|
+
|
|
24
|
+
### Fix Effectiveness
|
|
25
|
+
- Are fixes working? (Low fix success rate = agent not understanding the problem)
|
|
26
|
+
- Is re-fail rate high? What patterns do you see in the issues?
|
|
27
|
+
|
|
28
|
+
### Semantic Analysis (LLM-powered)
|
|
29
|
+
- Group similar issues from verdict data into categories (e.g., "contrast issues", "event handler bugs", "API errors")
|
|
30
|
+
- Identify recurring patterns across sessions
|
|
31
|
+
- Suggest root causes for frequently failing files
|
|
32
|
+
|
|
33
|
+
### Scoring
|
|
34
|
+
- Interpret the efficiency, quality, and confidence scores
|
|
35
|
+
- Compare with project averages if cross-session data is available
|
|
36
|
+
|
|
37
|
+
## Output Format
|
|
38
|
+
Provide a structured report with:
|
|
39
|
+
- Executive summary (1-2 sentences)
|
|
40
|
+
- Key findings (bullet points)
|
|
41
|
+
- Recommendations (actionable next steps)
|
|
42
|
+
- Risk areas (files/patterns to watch)
|
|
@@ -52,7 +52,7 @@ function run(projectDir) {
|
|
|
52
52
|
(0, actions_1.appendAction)(actionsFile, fileEditEntry);
|
|
53
53
|
(0, clear_verdict_1.runClearVerdict)({
|
|
54
54
|
verdictFile: `${projectDir}/.ironbee/sessions/${sessionId}/verdict.json`,
|
|
55
|
-
|
|
55
|
+
sessionDir: `${projectDir}/.ironbee/sessions/${sessionId}`,
|
|
56
56
|
});
|
|
57
57
|
process.exit(0);
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/clear-verdict.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAgBH,kBA6CC;AA3DD,qEAAoE;AACpE,yDAA2E;AAC3E,gDAAsF;AACtF,gDAAyD;AACzD,8CAA+C;AAU/C,SAAgB,GAAG,CAAC,UAAkB;IAClC,IAAI,SAAS,GAAW,SAAS,CAAC;IAClC,IAAI,KAA6B,CAAC;IAClC,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAA2B,CAAC;QAC1D,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QAC1C,IAAA,mBAAU,EAAC,GAAG,UAAU,sBAAsB,SAAS,cAAc,CAAC,CAAC;IAC3E,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,4DAA4D;IAC5D,MAAM,WAAW,GAAuB,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IACpE,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACpG,eAAM,CAAC,KAAK,CAAC,wDAAwD,WAAW,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,6CAA6C;IAC7C,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,MAAM,GAAkB,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,IAAA,6BAAoB,EAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;YAC7C,eAAM,CAAC,KAAK,CAAC,+DAA+D,WAAW,GAAG,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAW,GAAG,UAAU,sBAAsB,SAAS,gBAAgB,CAAC;IAEzF,oCAAoC;IACpC,MAAM,aAAa,GAAmB;QAClC,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS;QACvC,SAAS,EAAE,WAAW;KACzB,CAAC;IACF,IAAA,sBAAY,EAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEzC,IAAA,+BAAe,EAAC;QACZ,WAAW,EAAE,GAAG,UAAU,sBAAsB,SAAS,eAAe;QACxE,
|
|
1
|
+
{"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/clear-verdict.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAgBH,kBA6CC;AA3DD,qEAAoE;AACpE,yDAA2E;AAC3E,gDAAsF;AACtF,gDAAyD;AACzD,8CAA+C;AAU/C,SAAgB,GAAG,CAAC,UAAkB;IAClC,IAAI,SAAS,GAAW,SAAS,CAAC;IAClC,IAAI,KAA6B,CAAC;IAClC,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAA2B,CAAC;QAC1D,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QAC1C,IAAA,mBAAU,EAAC,GAAG,UAAU,sBAAsB,SAAS,cAAc,CAAC,CAAC;IAC3E,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,4DAA4D;IAC5D,MAAM,WAAW,GAAuB,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IACpE,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACpG,eAAM,CAAC,KAAK,CAAC,wDAAwD,WAAW,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,6CAA6C;IAC7C,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,MAAM,GAAkB,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,IAAA,6BAAoB,EAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;YAC7C,eAAM,CAAC,KAAK,CAAC,+DAA+D,WAAW,GAAG,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAW,GAAG,UAAU,sBAAsB,SAAS,gBAAgB,CAAC;IAEzF,oCAAoC;IACpC,MAAM,aAAa,GAAmB;QAClC,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS;QACvC,SAAS,EAAE,WAAW;KACzB,CAAC;IACF,IAAA,sBAAY,EAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEzC,IAAA,+BAAe,EAAC;QACZ,WAAW,EAAE,GAAG,UAAU,sBAAsB,SAAS,eAAe;QACxE,UAAU,EAAE,GAAG,UAAU,sBAAsB,SAAS,EAAE;KAC7D,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code — require-verification hook adapter
|
|
3
|
+
*
|
|
4
|
+
* PreToolUse hook for mcp__browser-devtools__.* — blocks browser
|
|
5
|
+
* tool usage if no active verification cycle. Forces agent to call
|
|
6
|
+
* `ironbee hook verification-start` before using browser tools.
|
|
7
|
+
*
|
|
8
|
+
* When allowed, injects `_metadata` into tool input with sessionId and traceId
|
|
9
|
+
* so the MCP server knows the active session/trace context.
|
|
10
|
+
*
|
|
11
|
+
* Exit 0 = allow tool (with updatedInput containing _metadata)
|
|
12
|
+
* Exit 2 = block tool
|
|
13
|
+
*/
|
|
14
|
+
export declare function run(projectDir: string): void;
|
|
15
|
+
//# sourceMappingURL=require-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-verification.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH,wBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA6C5C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code — require-verification hook adapter
|
|
4
|
+
*
|
|
5
|
+
* PreToolUse hook for mcp__browser-devtools__.* — blocks browser
|
|
6
|
+
* tool usage if no active verification cycle. Forces agent to call
|
|
7
|
+
* `ironbee hook verification-start` before using browser tools.
|
|
8
|
+
*
|
|
9
|
+
* When allowed, injects `_metadata` into tool input with sessionId and traceId
|
|
10
|
+
* so the MCP server knows the active session/trace context.
|
|
11
|
+
*
|
|
12
|
+
* Exit 0 = allow tool (with updatedInput containing _metadata)
|
|
13
|
+
* Exit 2 = block tool
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.run = run;
|
|
17
|
+
const session_state_1 = require("../../../hooks/core/session-state");
|
|
18
|
+
const logger_1 = require("../../../lib/logger");
|
|
19
|
+
const stdin_1 = require("../../../lib/stdin");
|
|
20
|
+
function run(projectDir) {
|
|
21
|
+
let input;
|
|
22
|
+
try {
|
|
23
|
+
input = JSON.parse((0, stdin_1.readStdin)());
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
logger_1.logger.debug(`failed to parse stdin: ${e}`);
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
const sessionId = input.session_id ?? "default";
|
|
30
|
+
const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
|
|
31
|
+
(0, logger_1.setLogFile)(`${sessionDir}/session.log`);
|
|
32
|
+
const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
|
|
33
|
+
if (!verificationId) {
|
|
34
|
+
process.stderr.write(`BLOCKED: You must start a verification cycle before using browser-devtools tools.
|
|
35
|
+
|
|
36
|
+
Start verification first:
|
|
37
|
+
echo '{"session_id":"${sessionId}"}' | ironbee hook verification-start
|
|
38
|
+
|
|
39
|
+
Then use browser tools to verify your changes.
|
|
40
|
+
`);
|
|
41
|
+
process.exit(2);
|
|
42
|
+
}
|
|
43
|
+
const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
|
|
44
|
+
// inject _metadata into tool input so MCP server knows session/trace context
|
|
45
|
+
const updatedInput = { ...(input.tool_input ?? {}) };
|
|
46
|
+
updatedInput._metadata = {
|
|
47
|
+
sessionId,
|
|
48
|
+
verificationId,
|
|
49
|
+
traceId,
|
|
50
|
+
};
|
|
51
|
+
const output = {
|
|
52
|
+
hookSpecificOutput: {
|
|
53
|
+
hookEventName: "PreToolUse",
|
|
54
|
+
permissionDecision: "allow",
|
|
55
|
+
updatedInput,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
process.stdout.write(JSON.stringify(output));
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=require-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-verification.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/require-verification.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAoBH,kBA6CC;AA/DD,qEAA8F;AAC9F,gDAAyD;AACzD,8CAA+C;AAgB/C,SAAgB,GAAG,CAAC,UAAkB;IAClC,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,cAAc,GAAuB,IAAA,uCAAuB,EAAC,UAAU,CAAC,CAAC;IAC/E,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;yBAGJ,SAAS;;;CAGjC,CAAC,CAAC;QACK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAuB,IAAA,gCAAgB,EAAC,UAAU,CAAC,CAAC;IAEjE,6EAA6E;IAC7E,MAAM,YAAY,GAA4B,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;IAC9E,YAAY,CAAC,SAAS,GAAG;QACrB,SAAS;QACT,cAAc;QACd,OAAO;KACV,CAAC;IAEF,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"}
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
* Bash commands (like submit-verdict) can access it automatically,
|
|
7
7
|
* and outputs the session ID and submit-verdict command to stdout.
|
|
8
8
|
*/
|
|
9
|
-
export declare function run(projectDir: string): void
|
|
9
|
+
export declare function run(projectDir: string): Promise<void>;
|
|
10
10
|
//# sourceMappingURL=session-start.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E3D"}
|
|
@@ -10,9 +10,11 @@
|
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.run = run;
|
|
12
12
|
const actions_1 = require("../../../hooks/core/actions");
|
|
13
|
+
const session_state_1 = require("../../../hooks/core/session-state");
|
|
13
14
|
const logger_1 = require("../../../lib/logger");
|
|
14
15
|
const stdin_1 = require("../../../lib/stdin");
|
|
15
|
-
|
|
16
|
+
const telemetry_1 = require("../../../lib/telemetry");
|
|
17
|
+
async function run(projectDir) {
|
|
16
18
|
let input;
|
|
17
19
|
try {
|
|
18
20
|
input = JSON.parse((0, stdin_1.readStdin)());
|
|
@@ -30,7 +32,14 @@ function run(projectDir) {
|
|
|
30
32
|
session_id: sessionId,
|
|
31
33
|
source: input.source,
|
|
32
34
|
};
|
|
35
|
+
const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
|
|
33
36
|
(0, actions_1.appendAction)(actionsFile, entry);
|
|
37
|
+
// reconcile state on startup/resume/clear — but NOT on compact
|
|
38
|
+
// (compact just compresses context, session continues mid-flow)
|
|
39
|
+
if (input.source !== "compact") {
|
|
40
|
+
(0, session_state_1.reconcileSessionState)(sessionDir, actionsFile, actions_1.appendAction);
|
|
41
|
+
}
|
|
42
|
+
await (0, telemetry_1.trackSessionStart)("claude", sessionId);
|
|
34
43
|
logger_1.logger.debug(`session-start: ${sessionId} (${input.source ?? "unknown"})`);
|
|
35
44
|
const verdictPass = JSON.stringify({
|
|
36
45
|
session_id: sessionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/session-start.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/session-start.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAaH,kBA0EC;AArFD,yDAA+E;AAC/E,qEAA0E;AAC1E,gDAAyD;AACzD,8CAA+C;AAC/C,sDAA2D;AAOpD,KAAK,UAAU,GAAG,CAAC,UAAkB;IACxC,IAAI,KAA8B,CAAC;IACnC,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAA4B,CAAC;IAC/D,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,WAAW,GAAW,GAAG,UAAU,sBAAsB,SAAS,gBAAgB,CAAC;IACzF,IAAA,mBAAU,EAAC,GAAG,UAAU,sBAAsB,SAAS,cAAc,CAAC,CAAC;IAEvE,MAAM,KAAK,GAAuB;QAC9B,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,KAAK,CAAC,MAAM;KACvB,CAAC;IAEF,MAAM,UAAU,GAAW,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC;IAC1E,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjC,+DAA+D;IAC/D,gEAAgE;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAA,qCAAqB,EAAC,UAAU,EAAE,WAAW,EAAE,sBAAY,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAA,6BAAiB,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7C,eAAM,CAAC,KAAK,CAAC,kBAAkB,SAAS,KAAK,KAAK,CAAC,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC;IAE3E,MAAM,WAAW,GAAW,IAAI,CAAC,SAAS,CAAC;QACvC,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,CAAC,qCAAqC,CAAC;QACrD,MAAM,EAAE,CAAC,2BAA2B,EAAE,0BAA0B,CAAC;QACjE,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC;KACtB,CAAC,CAAC;IACH,MAAM,WAAW,GAAW,IAAI,CAAC,SAAS,CAAC;QACvC,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,CAAC,qCAAqC,CAAC;QACrD,MAAM,EAAE,CAAC,cAAc,EAAE,4BAA4B,CAAC;QACtD,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC,iCAAiC,EAAE,sBAAsB,CAAC;KACtE,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;cAIX,SAAS;;;;;;;;UAQb,WAAW;;;UAGX,WAAW;;;;;;CAMpB,CAAC,CAAC;IAEC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Appends tool_call entries to actions.jsonl for the session.
|
|
6
6
|
*
|
|
7
7
|
* Handles both direct tool calls and nested callTool() invocations
|
|
8
|
-
* inside the execute tool (mcp__browser-
|
|
8
|
+
* inside the execute tool (mcp__browser-devtools__bdt_execute).
|
|
9
9
|
*/
|
|
10
10
|
export declare function run(projectDir: string): void;
|
|
11
11
|
//# sourceMappingURL=track-action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-action.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/track-action.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"track-action.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/track-action.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqFH,wBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA2C5C"}
|
|
@@ -6,30 +6,74 @@
|
|
|
6
6
|
* Appends tool_call entries to actions.jsonl for the session.
|
|
7
7
|
*
|
|
8
8
|
* Handles both direct tool calls and nested callTool() invocations
|
|
9
|
-
* inside the execute tool (mcp__browser-
|
|
9
|
+
* inside the execute tool (mcp__browser-devtools__bdt_execute).
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.run = run;
|
|
13
13
|
const actions_1 = require("../../../hooks/core/actions");
|
|
14
14
|
const logger_1 = require("../../../lib/logger");
|
|
15
15
|
const stdin_1 = require("../../../lib/stdin");
|
|
16
|
-
const
|
|
16
|
+
const CALL_TOOL_NAME_PATTERN = /callTool\(\s*['"]([^'"]+)['"]/g;
|
|
17
17
|
const MCP_PREFIX = "mcp__browser-devtools__";
|
|
18
|
-
const
|
|
18
|
+
const TOOL_NAME_PREFIX = "bdt_";
|
|
19
|
+
const EXECUTE_TOOL = `${MCP_PREFIX}${TOOL_NAME_PREFIX}execute`;
|
|
19
20
|
function toFullName(shortName) {
|
|
20
21
|
return shortName.startsWith(MCP_PREFIX) ? shortName : `${MCP_PREFIX}${shortName}`;
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
/** Extract balanced braces starting at position after opening brace. */
|
|
24
|
+
function extractBalancedBraces(str, startIndex) {
|
|
25
|
+
if (str[startIndex] !== "{") {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
let depth = 0;
|
|
29
|
+
for (let i = startIndex; i < str.length; i++) {
|
|
30
|
+
if (str[i] === "{") {
|
|
31
|
+
depth++;
|
|
32
|
+
}
|
|
33
|
+
else if (str[i] === "}") {
|
|
34
|
+
depth--;
|
|
35
|
+
if (depth === 0) {
|
|
36
|
+
return str.slice(startIndex, i + 1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
function extractNestedToolCalls(toolInput) {
|
|
23
43
|
const inputStr = typeof toolInput === "string"
|
|
24
44
|
? toolInput
|
|
25
45
|
: JSON.stringify(toolInput ?? "");
|
|
26
|
-
const
|
|
27
|
-
|
|
46
|
+
const results = [];
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
let match = CALL_TOOL_NAME_PATTERN.exec(inputStr);
|
|
28
49
|
while (match !== null) {
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
const toolName = toFullName(match[1]);
|
|
51
|
+
if (!seen.has(toolName)) {
|
|
52
|
+
seen.add(toolName);
|
|
53
|
+
// try to extract args: look for comma + { after the tool name
|
|
54
|
+
let args = undefined;
|
|
55
|
+
const afterName = match.index + match[0].length;
|
|
56
|
+
const rest = inputStr.slice(afterName).trimStart();
|
|
57
|
+
if (rest.startsWith(",")) {
|
|
58
|
+
const afterComma = rest.slice(1).trimStart();
|
|
59
|
+
if (afterComma.startsWith("{")) {
|
|
60
|
+
const braceStr = extractBalancedBraces(afterComma, 0);
|
|
61
|
+
if (braceStr) {
|
|
62
|
+
try {
|
|
63
|
+
args = JSON.parse(braceStr);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// JS object literal, not valid JSON — store as string
|
|
67
|
+
args = braceStr;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
results.push({ name: toolName, args });
|
|
73
|
+
}
|
|
74
|
+
match = CALL_TOOL_NAME_PATTERN.exec(inputStr);
|
|
31
75
|
}
|
|
32
|
-
return
|
|
76
|
+
return results;
|
|
33
77
|
}
|
|
34
78
|
function run(projectDir) {
|
|
35
79
|
let input;
|
|
@@ -57,15 +101,16 @@ function run(projectDir) {
|
|
|
57
101
|
logger_1.logger.debug(`track-action: ${toolName}`);
|
|
58
102
|
// for execute tool, extract and record nested callTool() invocations
|
|
59
103
|
if (toolName === EXECUTE_TOOL) {
|
|
60
|
-
const nested =
|
|
61
|
-
for (const
|
|
104
|
+
const nested = extractNestedToolCalls(input.tool_input);
|
|
105
|
+
for (const call of nested) {
|
|
62
106
|
const nestedEntry = {
|
|
63
107
|
type: "tool_call",
|
|
64
108
|
timestamp,
|
|
65
|
-
tool_name: name,
|
|
109
|
+
tool_name: call.name,
|
|
110
|
+
tool_input: call.args,
|
|
66
111
|
};
|
|
67
112
|
(0, actions_1.appendAction)(actionsFile, nestedEntry);
|
|
68
|
-
logger_1.logger.debug(`track-action (nested): ${name}`);
|
|
113
|
+
logger_1.logger.debug(`track-action (nested): ${call.name}`);
|
|
69
114
|
}
|
|
70
115
|
}
|
|
71
116
|
process.exit(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-action.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/track-action.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;
|
|
1
|
+
{"version":3,"file":"track-action.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/track-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-gate.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/verify-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,
|
|
1
|
+
{"version":3,"file":"verify-gate.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/verify-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC3D"}
|
|
@@ -14,7 +14,7 @@ const verify_gate_1 = require("../../../hooks/core/verify-gate");
|
|
|
14
14
|
const config_1 = require("../../../lib/config");
|
|
15
15
|
const logger_1 = require("../../../lib/logger");
|
|
16
16
|
const stdin_1 = require("../../../lib/stdin");
|
|
17
|
-
function run(projectDir) {
|
|
17
|
+
async function run(projectDir) {
|
|
18
18
|
let input;
|
|
19
19
|
try {
|
|
20
20
|
input = JSON.parse((0, stdin_1.readStdin)());
|
|
@@ -26,11 +26,11 @@ function run(projectDir) {
|
|
|
26
26
|
const sessionId = input.session_id ?? "default";
|
|
27
27
|
(0, logger_1.setLogFile)(`${projectDir}/.ironbee/sessions/${sessionId}/session.log`);
|
|
28
28
|
const config = (0, config_1.loadConfig)(projectDir);
|
|
29
|
-
const result = (0, verify_gate_1.runVerifyGate)({
|
|
29
|
+
const result = await (0, verify_gate_1.runVerifyGate)({
|
|
30
30
|
sessionId,
|
|
31
|
+
sessionDir: `${projectDir}/.ironbee/sessions/${sessionId}`,
|
|
31
32
|
actionsFile: `${projectDir}/.ironbee/sessions/${sessionId}/actions.jsonl`,
|
|
32
33
|
verdictFile: `${projectDir}/.ironbee/sessions/${sessionId}/verdict.json`,
|
|
33
|
-
retryFile: `${projectDir}/.ironbee/sessions/${sessionId}/retries`,
|
|
34
34
|
maxRetries: (0, config_1.getMaxRetries)(config),
|
|
35
35
|
});
|
|
36
36
|
if (result.action === "allow") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-gate.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/verify-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAWH,kBAkCC;AA3CD,iEAAkF;AAClF,gDAA+E;AAC/E,gDAAyD;AACzD,8CAA+C;
|
|
1
|
+
{"version":3,"file":"verify-gate.js","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/verify-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAWH,kBAkCC;AA3CD,iEAAkF;AAClF,gDAA+E;AAC/E,gDAAyD;AACzD,8CAA+C;AAMxC,KAAK,UAAU,GAAG,CAAC,UAAkB;IACxC,IAAI,KAA0B,CAAC;IAC/B,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAwB,CAAC;IAC3D,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,MAAM,GAAkB,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;IAErD,MAAM,MAAM,GAAqB,MAAM,IAAA,2BAAa,EAAC;QACjD,SAAS;QACT,UAAU,EAAE,GAAG,UAAU,sBAAsB,SAAS,EAAE;QAC1D,WAAW,EAAE,GAAG,UAAU,sBAAsB,SAAS,gBAAgB;QACzE,WAAW,EAAE,GAAG,UAAU,sBAAsB,SAAS,eAAe;QACxE,UAAU,EAAE,IAAA,sBAAa,EAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,+CAA+C;IAC/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -5,11 +5,13 @@ export declare class ClaudeClient implements IClient {
|
|
|
5
5
|
resolveProjectDir(): string;
|
|
6
6
|
install(projectDir: string): void;
|
|
7
7
|
uninstall(projectDir: string): void;
|
|
8
|
+
private cleanupArtifacts;
|
|
8
9
|
runVerifyGate(projectDir: string): void;
|
|
9
10
|
runClearVerdict(projectDir: string): void;
|
|
10
11
|
runTrackAction(projectDir: string): void;
|
|
11
12
|
runSessionStart(projectDir: string): void;
|
|
12
13
|
runRequireVerdict(projectDir: string): void;
|
|
14
|
+
runRequireVerification(projectDir: string): void;
|
|
13
15
|
private isIronBeeHook;
|
|
14
16
|
private mergeHooksConfig;
|
|
15
17
|
private removeIronBeeHooks;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clients/claude/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA2ClC,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,GAAG,IAAI;IA2CjC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,OAAO,CAAC,gBAAgB;IAuBjB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvD,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAsGxB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,gBAAgB;CAgC3B;AAuBD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1D"}
|