@ironbee-ai/cli 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +19 -8
  2. package/README.md +163 -3
  3. package/dist/analysis/code-changes.d.ts +22 -0
  4. package/dist/analysis/code-changes.d.ts.map +1 -0
  5. package/dist/analysis/code-changes.js +141 -0
  6. package/dist/analysis/code-changes.js.map +1 -0
  7. package/dist/analysis/cross-session.d.ts +34 -0
  8. package/dist/analysis/cross-session.d.ts.map +1 -0
  9. package/dist/analysis/cross-session.js +230 -0
  10. package/dist/analysis/cross-session.js.map +1 -0
  11. package/dist/analysis/fix-effectiveness.d.ts +16 -0
  12. package/dist/analysis/fix-effectiveness.d.ts.map +1 -0
  13. package/dist/analysis/fix-effectiveness.js +99 -0
  14. package/dist/analysis/fix-effectiveness.js.map +1 -0
  15. package/dist/analysis/scoring.d.ts +15 -0
  16. package/dist/analysis/scoring.d.ts.map +1 -0
  17. package/dist/analysis/scoring.js +57 -0
  18. package/dist/analysis/scoring.js.map +1 -0
  19. package/dist/analysis/time-analysis.d.ts +22 -0
  20. package/dist/analysis/time-analysis.d.ts.map +1 -0
  21. package/dist/analysis/time-analysis.js +174 -0
  22. package/dist/analysis/time-analysis.js.map +1 -0
  23. package/dist/analysis/verdict-details.d.ts +23 -0
  24. package/dist/analysis/verdict-details.d.ts.map +1 -0
  25. package/dist/analysis/verdict-details.js +59 -0
  26. package/dist/analysis/verdict-details.js.map +1 -0
  27. package/dist/analysis/verification-quality.d.ts +19 -0
  28. package/dist/analysis/verification-quality.d.ts.map +1 -0
  29. package/dist/analysis/verification-quality.js +182 -0
  30. package/dist/analysis/verification-quality.js.map +1 -0
  31. package/dist/clients/base.d.ts +2 -0
  32. package/dist/clients/base.d.ts.map +1 -1
  33. package/dist/clients/claude/commands/ironbee-analyze.md +42 -0
  34. package/dist/clients/claude/commands/ironbee-verify.md +127 -0
  35. package/dist/clients/claude/hooks/clear-verdict.js +1 -1
  36. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  37. package/dist/clients/claude/hooks/require-verification.d.ts +15 -0
  38. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -0
  39. package/dist/clients/claude/hooks/require-verification.js +63 -0
  40. package/dist/clients/claude/hooks/require-verification.js.map +1 -0
  41. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  42. package/dist/clients/claude/hooks/session-start.js +7 -0
  43. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  44. package/dist/clients/claude/hooks/track-action.d.ts +1 -1
  45. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  46. package/dist/clients/claude/hooks/track-action.js +58 -13
  47. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  48. package/dist/clients/claude/hooks/verify-gate.js +1 -1
  49. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  50. package/dist/clients/claude/index.d.ts +2 -0
  51. package/dist/clients/claude/index.d.ts.map +1 -1
  52. package/dist/clients/claude/index.js +51 -19
  53. package/dist/clients/claude/index.js.map +1 -1
  54. package/dist/clients/claude/rule.md +10 -7
  55. package/dist/clients/claude/skill.md +13 -8
  56. package/dist/clients/claude/skills/ironbee-analyze.md +39 -0
  57. package/dist/clients/cursor/commands/ironbee-analyze/SKILL.md +48 -0
  58. package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +133 -0
  59. package/dist/clients/cursor/hooks/clear-verdict.js +1 -1
  60. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  61. package/dist/clients/cursor/hooks/require-verification.d.ts +15 -0
  62. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -0
  63. package/dist/clients/cursor/hooks/require-verification.js +65 -0
  64. package/dist/clients/cursor/hooks/require-verification.js.map +1 -0
  65. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  66. package/dist/clients/cursor/hooks/session-start.js +3 -0
  67. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  68. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  69. package/dist/clients/cursor/hooks/track-action.js +62 -12
  70. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  71. package/dist/clients/cursor/hooks/verify-gate.js +1 -1
  72. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  73. package/dist/clients/cursor/index.d.ts +2 -0
  74. package/dist/clients/cursor/index.d.ts.map +1 -1
  75. package/dist/clients/cursor/index.js +41 -16
  76. package/dist/clients/cursor/index.js.map +1 -1
  77. package/dist/clients/cursor/rule.md +10 -7
  78. package/dist/clients/cursor/skill.md +13 -8
  79. package/dist/commands/analyze.d.ts +3 -0
  80. package/dist/commands/analyze.d.ts.map +1 -0
  81. package/dist/commands/analyze.js +298 -0
  82. package/dist/commands/analyze.js.map +1 -0
  83. package/dist/commands/hook.d.ts.map +1 -1
  84. package/dist/commands/hook.js +79 -0
  85. package/dist/commands/hook.js.map +1 -1
  86. package/dist/hooks/core/actions.d.ts +19 -0
  87. package/dist/hooks/core/actions.d.ts.map +1 -1
  88. package/dist/hooks/core/actions.js +5 -0
  89. package/dist/hooks/core/actions.js.map +1 -1
  90. package/dist/hooks/core/clear-verdict.d.ts +1 -1
  91. package/dist/hooks/core/clear-verdict.d.ts.map +1 -1
  92. package/dist/hooks/core/clear-verdict.js +13 -9
  93. package/dist/hooks/core/clear-verdict.js.map +1 -1
  94. package/dist/hooks/core/session-state.d.ts +47 -0
  95. package/dist/hooks/core/session-state.d.ts.map +1 -0
  96. package/dist/hooks/core/session-state.js +192 -0
  97. package/dist/hooks/core/session-state.js.map +1 -0
  98. package/dist/hooks/core/submit-verdict.d.ts +1 -0
  99. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  100. package/dist/hooks/core/submit-verdict.js +35 -27
  101. package/dist/hooks/core/submit-verdict.js.map +1 -1
  102. package/dist/hooks/core/verification-lifecycle.d.ts +30 -0
  103. package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -0
  104. package/dist/hooks/core/verification-lifecycle.js +75 -0
  105. package/dist/hooks/core/verification-lifecycle.js.map +1 -0
  106. package/dist/hooks/core/verify-gate.d.ts +1 -1
  107. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  108. package/dist/hooks/core/verify-gate.js +13 -20
  109. package/dist/hooks/core/verify-gate.js.map +1 -1
  110. package/dist/index.js +3 -0
  111. package/dist/index.js.map +1 -1
  112. package/dist/lib/config.d.ts +18 -0
  113. package/dist/lib/config.d.ts.map +1 -1
  114. package/dist/lib/config.js +59 -0
  115. package/dist/lib/config.js.map +1 -1
  116. package/package.json +4 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-analysis.js","sourceRoot":"","sources":["../../src/analysis/time-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * IronBee — Verdict Details Extraction
3
+ *
4
+ * Extracts raw verdict data (checks, issues, fixes, pages_tested)
5
+ * from actions.jsonl for semantic analysis by LLM agents.
6
+ * Pure logic — no process.exit, no stdin, no side effects.
7
+ */
8
+ export interface VerdictDetail {
9
+ timestamp: string;
10
+ status: string;
11
+ pages_tested: string[];
12
+ checks: string[];
13
+ issues: string[];
14
+ fixes: string[];
15
+ console_errors: number;
16
+ network_failures: number;
17
+ verification_id?: string;
18
+ }
19
+ export interface VerdictDetailsResult {
20
+ verdicts: VerdictDetail[];
21
+ }
22
+ export declare function extractVerdictDetails(actionsFile: string): VerdictDetailsResult | null;
23
+ //# sourceMappingURL=verdict-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-details.d.ts","sourceRoot":"","sources":["../../src/analysis/verdict-details.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAqDtF"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — Verdict Details Extraction
4
+ *
5
+ * Extracts raw verdict data (checks, issues, fixes, pages_tested)
6
+ * from actions.jsonl for semantic analysis by LLM agents.
7
+ * Pure logic — no process.exit, no stdin, no side effects.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.extractVerdictDetails = extractVerdictDetails;
11
+ const fs_1 = require("fs");
12
+ function extractVerdictDetails(actionsFile) {
13
+ if (!(0, fs_1.existsSync)(actionsFile)) {
14
+ return null;
15
+ }
16
+ let content;
17
+ try {
18
+ content = (0, fs_1.readFileSync)(actionsFile, "utf-8");
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ const lines = content.trim().split("\n").filter((l) => l.length > 0);
24
+ const verdicts = [];
25
+ for (const line of lines) {
26
+ try {
27
+ const entry = JSON.parse(line);
28
+ if (entry.type !== "verdict_write") {
29
+ continue;
30
+ }
31
+ const verdict = entry.verdict;
32
+ if (!verdict) {
33
+ continue;
34
+ }
35
+ const detail = {
36
+ timestamp: entry.timestamp,
37
+ status: typeof verdict.status === "string" ? verdict.status : "unknown",
38
+ pages_tested: Array.isArray(verdict.pages_tested) ? verdict.pages_tested.map(String) : [],
39
+ checks: Array.isArray(verdict.checks) ? verdict.checks.map(String) : [],
40
+ issues: Array.isArray(verdict.issues) ? verdict.issues.map(String) : [],
41
+ fixes: Array.isArray(verdict.fixes) ? verdict.fixes.map(String) : [],
42
+ console_errors: typeof verdict.console_errors === "number" ? verdict.console_errors : 0,
43
+ network_failures: typeof verdict.network_failures === "number" ? verdict.network_failures : 0,
44
+ };
45
+ if (typeof entry.verification_id === "string") {
46
+ detail.verification_id = entry.verification_id;
47
+ }
48
+ verdicts.push(detail);
49
+ }
50
+ catch {
51
+ // skip malformed lines
52
+ }
53
+ }
54
+ if (verdicts.length === 0) {
55
+ return null;
56
+ }
57
+ return { verdicts };
58
+ }
59
+ //# sourceMappingURL=verdict-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-details.js","sourceRoot":"","sources":["../../src/analysis/verdict-details.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAqBH,sDAqDC;AAxED,2BAA8C;AAmB9C,SAAgB,qBAAqB,CAAC,WAAmB;IACrD,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACD,OAAO,GAAG,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,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;IAChG,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC;YACD,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;YAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACjC,SAAS;YACb,CAAC;YAED,MAAM,OAAO,GAA4B,KAAK,CAAC,OAAkC,CAAC;YAClF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,SAAS;YACb,CAAC;YAED,MAAM,MAAM,GAAkB;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACvE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBACzF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBACvE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBACvE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBACpE,cAAc,EAAE,OAAO,OAAO,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBACvF,gBAAgB,EAAE,OAAO,OAAO,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;aAChG,CAAC;YAEF,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;YACnD,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACL,uBAAuB;QAC3B,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * IronBee — Verification Quality Analysis
3
+ *
4
+ * Reads actions.jsonl and calculates verification quality metrics.
5
+ * Pure logic — no process.exit, no stdin, no side effects.
6
+ */
7
+ export interface VerificationQualityAnalysis {
8
+ firstPassSuccessRate: number;
9
+ totalVerifications: number;
10
+ passCount: number;
11
+ failCount: number;
12
+ averageRetries: number;
13
+ averageConsoleErrors: number;
14
+ averageNetworkFailures: number;
15
+ averagePagesTestedCount: number;
16
+ averageChecksCount: number;
17
+ }
18
+ export declare function analyzeVerificationQuality(actionsFile: string): VerificationQualityAnalysis | null;
19
+ //# sourceMappingURL=verification-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-quality.d.ts","sourceRoot":"","sources":["../../src/analysis/verification-quality.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,2BAA2B;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAmFD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,2BAA2B,GAAG,IAAI,CA4HlG"}
@@ -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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"}
@@ -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;CAC7C"}
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)
@@ -0,0 +1,127 @@
1
+ # IronBee Verify
2
+
3
+ Verify the current code changes in the browser.
4
+
5
+ ## Usage
6
+ - `/ironbee-verify` — **default** — focus on what changed, visual + functional checks on affected areas
7
+ - `/ironbee-verify full` — **full scope** — entire application, all checklists, edge cases, responsive, accessibility deep dive
8
+ - `/ironbee-verify visual` — **visual only** — contrast, layout, spacing, fonts, images, theming
9
+ - `/ironbee-verify functional` — **functional only** — clicks, forms, navigation, data flow, error handling
10
+
11
+ If no argument is given, use **default** mode.
12
+
13
+ ---
14
+
15
+ ## Steps (all modes)
16
+
17
+ 1. **Start verification**: Run `echo '{"session_id":"$IRONBEE_SESSION_ID"}' | ironbee hook verification-start` via Bash
18
+ 2. **Build and start** the application if not already running
19
+ 3. **For EVERY page you visit**, repeat this cycle:
20
+ a. **Navigate** using `mcp__browser-devtools__bdt_navigation_go-to`
21
+ b. **Take a FULL PAGE screenshot** using `mcp__browser-devtools__bdt_content_take-screenshot` with `fullPage: true`
22
+ c. **Take an ARIA snapshot** using `mcp__browser-devtools__bdt_a11y_take-aria-snapshot`
23
+ d. **STOP and visually analyze the screenshot** — switch your focus entirely to finding visual problems. Look at this screenshot as if your ONLY job is to find visual defects:
24
+ **WARNING: ARIA reports DOM content, not what the user actually sees.** Do NOT assume the page looks correct just because ARIA shows the right content. Only the screenshot tells you what the user actually sees.
25
+ - Text readability — is it readable against its background? Look for text that blends in or poor contrast
26
+ - Layout — overlapping elements, unexpected gaps, overflow, content cut off
27
+ - Spacing — consistent padding/margin? Too cramped or too far apart?
28
+ - Colors — intentional and consistent? Any jarring mismatches?
29
+ - Typography — right sizes? Clipped or truncated text?
30
+ - Images/icons — loaded? Right size and aspect ratio?
31
+ - States — empty, loading, disabled, error states rendered properly?
32
+ Report your visual findings before continuing.
33
+ e. **Read the ARIA snapshot** — verify headings, labels, landmarks, and structure
34
+ f. If anything looks wrong → note it as an issue
35
+ 4. **Functionally test** — run the checklist for your mode (see below). After each significant interaction, take another screenshot and repeat the visual analysis.
36
+ 5. **Check console** for errors using `mcp__browser-devtools__bdt_o11y_get-console-messages`
37
+ 6. **Stop** the dev server when verification is complete
38
+ 7. **Submit your verdict** via Bash:
39
+ - Pass: `echo '{"session_id":"...","status":"pass","pages_tested":[...],"checks":[...],"console_errors":0,"network_failures":0}' | ironbee hook submit-verdict`
40
+ - Fail: `echo '{"session_id":"...","status":"fail","pages_tested":[...],"checks":[...],"console_errors":N,"network_failures":N,"issues":["describe what failed"]}' | ironbee hook submit-verdict`
41
+ 8. **If failed** → collect ALL issues first (finish testing all affected pages), submit one fail verdict with all issues, then fix everything, rebuild, and re-verify. Do not fix one issue at a time — batch fixes to avoid repeated build/restart cycles.
42
+ 9. If pass after a previous fail, include `"fixes"` in the verdict describing what was fixed
43
+
44
+ ---
45
+
46
+ ## Default Mode
47
+
48
+ Focus on the code you changed — not the entire application.
49
+
50
+ ### 1. Study the changes
51
+ 1. Run `git diff --name-only` and `git diff --name-only HEAD~1`
52
+ 2. **Ignore `.ironbee/`, `.claude/`, `.cursor/`** — tool config, not application code
53
+ 3. **Read the full diff** (`git diff` and/or `git diff HEAD~1`) — understand every change: what was added, removed, modified. Note specific values (colors, sizes, conditions, logic, API endpoints, component props).
54
+ 4. Before opening the browser, you should be able to answer: what exactly changed, what should look or behave differently, and what could go wrong?
55
+
56
+ ### 2. Verify in the browser
57
+ - **Cross-reference the diff against what you see.** For each change in the diff, verify it is correctly reflected in the browser. If the diff changes a color → check that color. If it changes a calculation → verify the result. If it adds a component → confirm it renders.
58
+ - **Test the flow end-to-end** — navigate, click, fill forms, submit, verify the outcome
59
+ - **Check one edge case** — empty input, invalid data, or double-click
60
+ - **Console** — any new errors or warnings?
61
+
62
+ ---
63
+
64
+ ## Full Mode (`/ironbee-verify full`)
65
+
66
+ Comprehensive verification of the **entire application**. Do NOT run `git diff` or scope to recent changes. Test every page, every flow, every visual detail. Any issue is a failure, regardless of when it was introduced.
67
+
68
+ ### Visual Checklist
69
+ In addition to the per-page visual analysis in step 3d:
70
+ - **Responsiveness** — does the layout adapt if viewport changes? No horizontal scrolling on standard widths
71
+ - **Borders & separators** — visible and consistent? Not too faint or missing
72
+ - **Scroll behavior** — does the page scroll smoothly? No content hidden behind sticky headers/footers?
73
+
74
+ ### Functional Checklist
75
+ - **Navigation** — do links and buttons navigate to the correct pages?
76
+ - **Forms** — fill inputs with real data, select options, submit. Do validation messages appear correctly?
77
+ - **Buttons & interactions** — do click handlers fire? Do toggles, dropdowns, and modals work?
78
+ - **Data flow** — does submitted data appear where expected?
79
+ - **Error handling** — what happens with invalid input? Does the UI handle errors gracefully?
80
+ - **Authentication** — if applicable, do protected routes redirect correctly?
81
+ - **API calls** — do network requests succeed? Check for failed requests in console/network
82
+ - **State persistence** — does state survive page refresh where expected?
83
+ - **Edge cases** — empty inputs, very long text, special characters, rapid clicks
84
+
85
+ ### Accessibility (deep dive)
86
+ - Are headings hierarchical? Do form inputs have labels? Are landmarks present?
87
+ - Check for missing alt text on images
88
+
89
+ ---
90
+
91
+ ## Visual Mode (`/ironbee-verify visual`)
92
+
93
+ Focus exclusively on visual quality. Run the per-page visual analysis from step 3d on every page, plus:
94
+ - **Responsiveness** — viewport changes, no horizontal scrolling
95
+ - **Borders & separators** — visible and consistent?
96
+ - **Scroll behavior** — smooth scrolling, no hidden content
97
+
98
+ Take screenshots of **multiple states** if applicable (hover, active, disabled, empty, populated).
99
+
100
+ ---
101
+
102
+ ## Functional Mode (`/ironbee-verify functional`)
103
+
104
+ Focus exclusively on behavior. Use the same functional checklist as Full Mode above.
105
+
106
+ Test the **complete user flow**, not just the single step you changed.
107
+
108
+ ---
109
+
110
+ ## When to FAIL
111
+
112
+ If you observe ANY problem — wrong data, unexpected errors, visual defects, broken interactions, console errors, data inconsistency between pages — you MUST submit a **fail** verdict.
113
+
114
+ **Do NOT rationalize away problems.** If something looks wrong or behaves unexpectedly, it IS wrong. In **full** mode, there is no such thing as "pre-existing" — if it's broken, fail it.
115
+
116
+ **After a fail verdict, you MUST fix the issues and re-verify.** Do not just report and stop.
117
+
118
+ ## Verdict Quality
119
+
120
+ Your `checks` array must list **specific observations**, not generic statements:
121
+ - GOOD: `["login form renders with email and password fields", "submitted valid credentials, redirected to /dashboard", "console clean — 0 errors"]`
122
+ - BAD: `["it works", "looks good", "feature implemented"]`
123
+
124
+ ## Important
125
+ - ALWAYS submit a verdict after every verification attempt — both pass AND fail
126
+ - Do NOT edit code before submitting a fail verdict
127
+ - **Noticing a bug and submitting pass is the #1 violation** — if you see it, fail it
@@ -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
- retryFile: `${projectDir}/.ironbee/sessions/${sessionId}/retries`,
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,SAAS,EAAE,GAAG,UAAU,sBAAsB,SAAS,UAAU;KACpE,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
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,CA+C5C"}
@@ -0,0 +1,63 @@
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 traceState = `ironbee=sid:${sessionId};vid:${verificationId}`;
46
+ const updatedInput = { ...(input.tool_input ?? {}) };
47
+ updatedInput._metadata = {
48
+ sessionId,
49
+ verificationId,
50
+ traceId,
51
+ traceState,
52
+ };
53
+ const output = {
54
+ hookSpecificOutput: {
55
+ hookEventName: "PreToolUse",
56
+ permissionDecision: "allow",
57
+ updatedInput,
58
+ },
59
+ };
60
+ process.stdout.write(JSON.stringify(output));
61
+ process.exit(0);
62
+ }
63
+ //# 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,kBA+CC;AAjED,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,UAAU,GAAW,eAAe,SAAS,QAAQ,cAAc,EAAE,CAAC;IAC5E,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;QACP,UAAU;KACb,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../../../src/clients/claude/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkE3D"}
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"}