@ironbee-ai/cli 0.14.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +2 -95
  3. package/dist/clients/claude/index.d.ts.map +1 -1
  4. package/dist/clients/claude/index.js +11 -14
  5. package/dist/clients/claude/index.js.map +1 -1
  6. package/dist/clients/cursor/hooks/session-start.js +1 -1
  7. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  8. package/dist/clients/cursor/index.d.ts.map +1 -1
  9. package/dist/clients/cursor/index.js +9 -13
  10. package/dist/clients/cursor/index.js.map +1 -1
  11. package/dist/commands/status.js +1 -1
  12. package/dist/commands/verify.d.ts.map +1 -1
  13. package/dist/commands/verify.js +1 -2
  14. package/dist/commands/verify.js.map +1 -1
  15. package/dist/index.js +0 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/lib/fs-prune.d.ts +1 -1
  18. package/dist/lib/fs-prune.js +1 -1
  19. package/dist/tui/sessions/area.d.ts.map +1 -1
  20. package/dist/tui/sessions/area.js +2 -45
  21. package/dist/tui/sessions/area.js.map +1 -1
  22. package/package.json +1 -1
  23. package/dist/analysis/code-changes.d.ts +0 -22
  24. package/dist/analysis/code-changes.d.ts.map +0 -1
  25. package/dist/analysis/code-changes.js +0 -141
  26. package/dist/analysis/code-changes.js.map +0 -1
  27. package/dist/analysis/cross-session.d.ts +0 -34
  28. package/dist/analysis/cross-session.d.ts.map +0 -1
  29. package/dist/analysis/cross-session.js +0 -230
  30. package/dist/analysis/cross-session.js.map +0 -1
  31. package/dist/analysis/fix-effectiveness.d.ts +0 -16
  32. package/dist/analysis/fix-effectiveness.d.ts.map +0 -1
  33. package/dist/analysis/fix-effectiveness.js +0 -99
  34. package/dist/analysis/fix-effectiveness.js.map +0 -1
  35. package/dist/analysis/scoring.d.ts +0 -15
  36. package/dist/analysis/scoring.d.ts.map +0 -1
  37. package/dist/analysis/scoring.js +0 -59
  38. package/dist/analysis/scoring.js.map +0 -1
  39. package/dist/analysis/time-analysis.d.ts +0 -22
  40. package/dist/analysis/time-analysis.d.ts.map +0 -1
  41. package/dist/analysis/time-analysis.js +0 -174
  42. package/dist/analysis/time-analysis.js.map +0 -1
  43. package/dist/analysis/verdict-details.d.ts +0 -23
  44. package/dist/analysis/verdict-details.d.ts.map +0 -1
  45. package/dist/analysis/verdict-details.js +0 -59
  46. package/dist/analysis/verdict-details.js.map +0 -1
  47. package/dist/analysis/verification-quality.d.ts +0 -20
  48. package/dist/analysis/verification-quality.d.ts.map +0 -1
  49. package/dist/analysis/verification-quality.js +0 -145
  50. package/dist/analysis/verification-quality.js.map +0 -1
  51. package/dist/clients/claude/commands/ironbee-analyze.md +0 -42
  52. package/dist/clients/cursor/commands/ironbee-analyze/SKILL.md +0 -48
  53. package/dist/commands/analyze.d.ts +0 -3
  54. package/dist/commands/analyze.d.ts.map +0 -1
  55. package/dist/commands/analyze.js +0 -329
  56. package/dist/commands/analyze.js.map +0 -1
@@ -1,99 +0,0 @@
1
- "use strict";
2
- /**
3
- * IronBee — Fix Effectiveness Analysis
4
- *
5
- * Reads actions.jsonl and calculates fix effectiveness metrics.
6
- * Pure logic — no process.exit, no stdin, no side effects.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.analyzeFixEffectiveness = analyzeFixEffectiveness;
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 analyzeFixEffectiveness(actionsFile) {
30
- const entries = parseEntries(actionsFile);
31
- // Identify fix cycles: fix_start → fix_end pairs
32
- const fixCycles = [];
33
- let pendingFixStartIndex = null;
34
- for (let i = 0; i < entries.length; i++) {
35
- if (entries[i].type === "fix_start") {
36
- pendingFixStartIndex = i;
37
- }
38
- else if (entries[i].type === "fix_end" && pendingFixStartIndex !== null) {
39
- fixCycles.push({ fixStartIndex: pendingFixStartIndex, fixEndIndex: i });
40
- pendingFixStartIndex = null;
41
- }
42
- }
43
- // Return null if no fix cycles found
44
- if (fixCycles.length === 0) {
45
- return null;
46
- }
47
- // Count verification_start entries for fix-to-verify ratio
48
- let verificationCycleCount = 0;
49
- for (const entry of entries) {
50
- if (entry.type === "verification_start") {
51
- verificationCycleCount++;
52
- }
53
- }
54
- // For each fix cycle, find the next verdict_write after fix_end
55
- let successfulFixes = 0;
56
- let failedFixes = 0;
57
- for (const cycle of fixCycles) {
58
- let nextVerdictStatus = null;
59
- for (let i = cycle.fixEndIndex + 1; i < entries.length; i++) {
60
- if (entries[i].type === "verdict_write") {
61
- const verdict = entries[i].verdict;
62
- if (typeof verdict === "object" && verdict !== null) {
63
- const v = verdict;
64
- if (typeof v.status === "string") {
65
- nextVerdictStatus = v.status;
66
- }
67
- }
68
- break;
69
- }
70
- }
71
- if (nextVerdictStatus === "pass") {
72
- successfulFixes++;
73
- }
74
- else if (nextVerdictStatus === "fail") {
75
- failedFixes++;
76
- }
77
- // If nextVerdictStatus is null (no subsequent verdict), don't count it
78
- }
79
- const totalFixAttempts = fixCycles.length;
80
- const countedFixes = successfulFixes + failedFixes;
81
- const fixSuccessRate = countedFixes > 0
82
- ? Math.round((successfulFixes / countedFixes) * 100)
83
- : 0;
84
- const reFailRate = countedFixes > 0
85
- ? Math.round((failedFixes / countedFixes) * 100)
86
- : 0;
87
- const fixToVerifyRatio = verificationCycleCount > 0
88
- ? Math.round((fixCycles.length / verificationCycleCount) * 10) / 10
89
- : 0;
90
- return {
91
- fixSuccessRate,
92
- totalFixAttempts,
93
- successfulFixes,
94
- failedFixes,
95
- fixToVerifyRatio,
96
- reFailRate,
97
- };
98
- }
99
- //# sourceMappingURL=fix-effectiveness.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fix-effectiveness.js","sourceRoot":"","sources":["../../src/analysis/fix-effectiveness.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * IronBee — Session Scoring
3
- *
4
- * Combines time analysis and verification quality into composite scores.
5
- * Pure logic — no process.exit, no stdin, no side effects.
6
- */
7
- import { TimeAnalysis } from "./time-analysis";
8
- import { VerificationQualityAnalysis } from "./verification-quality";
9
- export interface SessionScoring {
10
- agentEfficiencyScore: number;
11
- verificationQualityScore: number;
12
- codeConfidenceScore: number;
13
- }
14
- export declare function calculateScoring(time: TimeAnalysis | null, quality: VerificationQualityAnalysis | null): SessionScoring | null;
15
- //# sourceMappingURL=scoring.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/analysis/scoring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,WAAW,cAAc;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,YAAY,GAAG,IAAI,EACzB,OAAO,EAAE,2BAA2B,GAAG,IAAI,GAC5C,cAAc,GAAG,IAAI,CAmDvB"}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- /**
3
- * IronBee — Session Scoring
4
- *
5
- * Combines time analysis and verification quality into composite scores.
6
- * Pure logic — no process.exit, no stdin, no side effects.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.calculateScoring = calculateScoring;
10
- function calculateScoring(time, quality) {
11
- if (time === null && quality === null) {
12
- return null;
13
- }
14
- // --- Agent Efficiency Score (0-100) ---
15
- // coding_time / (coding_time + fix_time) * 100
16
- // High = most time spent coding, low fix overhead
17
- const codingTime = time !== null ? time.codingTime : 0;
18
- const fixTimeVal = time !== null ? time.fixTime : 0;
19
- const productiveTime = codingTime + fixTimeVal;
20
- let agentEfficiencyScore;
21
- if (productiveTime === 0) {
22
- agentEfficiencyScore = 100;
23
- }
24
- else {
25
- agentEfficiencyScore = Math.round((codingTime / productiveTime) * 100);
26
- }
27
- // --- Verification Quality Score (0-100) ---
28
- // Average of two components: pass rate, check depth.
29
- // TODO: when verify-gate derives structural evidence from tool_call records
30
- // (pages tested, console error count, network failure count), add those
31
- // components back here (page coverage, error cleanliness). See
32
- // `verify-gate.ts` evidence-extractor TODO.
33
- let verificationQualityScore;
34
- if (quality === null || quality.totalVerifications === 0) {
35
- verificationQualityScore = 0;
36
- }
37
- else {
38
- const passPct = (quality.passCount / quality.totalVerifications) * 100;
39
- const checksPct = Math.min(quality.averageChecksCount / 5, 1) * 100;
40
- verificationQualityScore = Math.round((passPct + checksPct) / 2);
41
- }
42
- // --- Code Confidence Score (0-100) ---
43
- // pass_count / total_verdicts * 100
44
- const passCount = quality !== null ? quality.passCount : 0;
45
- const totalVerdicts = quality !== null ? quality.totalVerifications : 0;
46
- let codeConfidenceScore;
47
- if (totalVerdicts === 0) {
48
- codeConfidenceScore = 100;
49
- }
50
- else {
51
- codeConfidenceScore = Math.round((passCount / totalVerdicts) * 100);
52
- }
53
- return {
54
- agentEfficiencyScore,
55
- verificationQualityScore,
56
- codeConfidenceScore,
57
- };
58
- }
59
- //# sourceMappingURL=scoring.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/analysis/scoring.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAWH,4CAsDC;AAtDD,SAAgB,gBAAgB,CAC5B,IAAyB,EACzB,OAA2C;IAE3C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,yCAAyC;IACzC,+CAA+C;IAC/C,kDAAkD;IAClD,MAAM,UAAU,GAAW,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAW,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAW,UAAU,GAAG,UAAU,CAAC;IAEvD,IAAI,oBAA4B,CAAC;IACjC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACvB,oBAAoB,GAAG,GAAG,CAAC;IAC/B,CAAC;SAAM,CAAC;QACJ,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,6CAA6C;IAC7C,qDAAqD;IACrD,4EAA4E;IAC5E,wEAAwE;IACxE,+DAA+D;IAC/D,4CAA4C;IAC5C,IAAI,wBAAgC,CAAC;IACrC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,kBAAkB,KAAK,CAAC,EAAE,CAAC;QACvD,wBAAwB,GAAG,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACJ,MAAM,OAAO,GAAW,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC;QAC/E,MAAM,SAAS,GAAW,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5E,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,wCAAwC;IACxC,oCAAoC;IACpC,MAAM,SAAS,GAAW,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GAAW,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhF,IAAI,mBAA2B,CAAC;IAChC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACtB,mBAAmB,GAAG,GAAG,CAAC;IAC9B,CAAC;SAAM,CAAC;QACJ,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,OAAO;QACH,oBAAoB;QACpB,wBAAwB;QACxB,mBAAmB;KACtB,CAAC;AACN,CAAC"}
@@ -1,22 +0,0 @@
1
- /**
2
- * IronBee — Time Analysis
3
- *
4
- * Reads actions.jsonl and calculates time-based session metrics.
5
- * Pure logic — no process.exit, no stdin, no side effects.
6
- */
7
- export interface TimeAnalysis {
8
- sessionDuration: number;
9
- codingTime: number;
10
- verificationTime: number;
11
- fixTime: number;
12
- codingPercent: number;
13
- verificationPercent: number;
14
- fixPercent: number;
15
- timeToFirstVerification: number | null;
16
- verificationCycles: number;
17
- fixCycles: number;
18
- averageVerificationDuration: number | null;
19
- averageFixDuration: number | null;
20
- }
21
- export declare function analyzeTime(actionsFile: string): TimeAnalysis | null;
22
- //# sourceMappingURL=time-analysis.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time-analysis.d.ts","sourceRoot":"","sources":["../../src/analysis/time-analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAyBD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAmKpE"}
@@ -1,174 +0,0 @@
1
- "use strict";
2
- /**
3
- * IronBee — Time Analysis
4
- *
5
- * Reads actions.jsonl and calculates time-based session metrics.
6
- * Pure logic — no process.exit, no stdin, no side effects.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.analyzeTime = analyzeTime;
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 analyzeTime(actionsFile) {
30
- const entries = parseEntries(actionsFile);
31
- if (entries.length === 0) {
32
- return null;
33
- }
34
- const sessionStartEntry = entries.find((e) => e.type === "session_start");
35
- if (!sessionStartEntry) {
36
- return null;
37
- }
38
- const startTs = sessionStartEntry.timestamp;
39
- const lastTs = entries[entries.length - 1].timestamp;
40
- const sessionDuration = Math.max(0, lastTs - startTs);
41
- let currentPhase = "coding";
42
- let phaseStartTs = startTs;
43
- let codingTime = 0;
44
- let verificationTime = 0;
45
- let fixTime = 0;
46
- let verificationCycles = 0;
47
- let fixCycles = 0;
48
- let timeToFirstVerification = null;
49
- const verificationDurations = [];
50
- const fixDurations = [];
51
- let currentVerificationStart = null;
52
- let currentFixStart = null;
53
- for (const entry of entries) {
54
- const ts = entry.timestamp;
55
- if (entry.type === "session_start") {
56
- // session_start marks beginning of coding
57
- currentPhase = "coding";
58
- phaseStartTs = ts;
59
- continue;
60
- }
61
- if (entry.type === "verification_start") {
62
- // end current phase
63
- const elapsed = ts - phaseStartTs;
64
- if (currentPhase === "coding") {
65
- codingTime += elapsed;
66
- }
67
- else if (currentPhase === "fix") {
68
- fixTime += elapsed;
69
- if (currentFixStart !== null) {
70
- fixDurations.push(ts - currentFixStart);
71
- currentFixStart = null;
72
- }
73
- }
74
- // start verification
75
- currentPhase = "verification";
76
- phaseStartTs = ts;
77
- verificationCycles++;
78
- currentVerificationStart = ts;
79
- if (timeToFirstVerification === null) {
80
- timeToFirstVerification = ts - startTs;
81
- }
82
- continue;
83
- }
84
- if (entry.type === "verification_end") {
85
- if (currentPhase === "verification") {
86
- const elapsed = ts - phaseStartTs;
87
- verificationTime += elapsed;
88
- if (currentVerificationStart !== null) {
89
- verificationDurations.push(ts - currentVerificationStart);
90
- currentVerificationStart = null;
91
- }
92
- }
93
- // after verification ends, go back to coding
94
- currentPhase = "coding";
95
- phaseStartTs = ts;
96
- continue;
97
- }
98
- if (entry.type === "fix_start") {
99
- // end current phase
100
- const elapsed = ts - phaseStartTs;
101
- if (currentPhase === "coding") {
102
- codingTime += elapsed;
103
- }
104
- else if (currentPhase === "verification") {
105
- verificationTime += elapsed;
106
- if (currentVerificationStart !== null) {
107
- verificationDurations.push(ts - currentVerificationStart);
108
- currentVerificationStart = null;
109
- }
110
- }
111
- currentPhase = "fix";
112
- phaseStartTs = ts;
113
- fixCycles++;
114
- currentFixStart = ts;
115
- continue;
116
- }
117
- if (entry.type === "fix_end") {
118
- if (currentPhase === "fix") {
119
- const elapsed = ts - phaseStartTs;
120
- fixTime += elapsed;
121
- if (currentFixStart !== null) {
122
- fixDurations.push(ts - currentFixStart);
123
- currentFixStart = null;
124
- }
125
- }
126
- // after fix ends, go back to coding
127
- currentPhase = "coding";
128
- phaseStartTs = ts;
129
- continue;
130
- }
131
- }
132
- // account for trailing time in whatever phase was active at the end
133
- const trailingTime = lastTs - phaseStartTs;
134
- if (currentPhase === "coding") {
135
- codingTime += trailingTime;
136
- }
137
- else if (currentPhase === "verification") {
138
- verificationTime += trailingTime;
139
- if (currentVerificationStart !== null) {
140
- verificationDurations.push(lastTs - currentVerificationStart);
141
- }
142
- }
143
- else if (currentPhase === "fix") {
144
- fixTime += trailingTime;
145
- if (currentFixStart !== null) {
146
- fixDurations.push(lastTs - currentFixStart);
147
- }
148
- }
149
- const totalPhaseTime = codingTime + verificationTime + fixTime;
150
- const codingPercent = totalPhaseTime > 0 ? Math.round((codingTime / totalPhaseTime) * 100) : 0;
151
- const verificationPercent = totalPhaseTime > 0 ? Math.round((verificationTime / totalPhaseTime) * 100) : 0;
152
- const fixPercent = totalPhaseTime > 0 ? Math.round((fixTime / totalPhaseTime) * 100) : 0;
153
- const averageVerificationDuration = verificationDurations.length > 0
154
- ? Math.round(verificationDurations.reduce((a, b) => a + b, 0) / verificationDurations.length)
155
- : null;
156
- const averageFixDuration = fixDurations.length > 0
157
- ? Math.round(fixDurations.reduce((a, b) => a + b, 0) / fixDurations.length)
158
- : null;
159
- return {
160
- sessionDuration,
161
- codingTime,
162
- verificationTime,
163
- fixTime,
164
- codingPercent,
165
- verificationPercent,
166
- fixPercent,
167
- timeToFirstVerification,
168
- verificationCycles,
169
- fixCycles,
170
- averageVerificationDuration,
171
- averageFixDuration,
172
- };
173
- }
174
- //# sourceMappingURL=time-analysis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time-analysis.js","sourceRoot":"","sources":["../../src/analysis/time-analysis.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /**
2
- * IronBee — Verdict Details Extraction
3
- *
4
- * Extracts raw verdict data (status, checks, issues, fixes) from
5
- * actions.jsonl for semantic analysis by LLM agents. Per-cycle structural
6
- * evidence (pages tested, console errors, probes, endpoints called, …) is
7
- * NOT part of the verdict shape — it will be derived from `tool_call`
8
- * records by a future extractor. See `verify-gate.ts` TODO.
9
- * Pure logic — no process.exit, no stdin, no side effects.
10
- */
11
- export interface VerdictDetail {
12
- timestamp: number;
13
- status: string;
14
- checks: string[];
15
- issues: string[];
16
- fixes: string[];
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"verdict-details.d.ts","sourceRoot":"","sources":["../../src/analysis/verdict-details.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,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,CAkDtF"}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- /**
3
- * IronBee — Verdict Details Extraction
4
- *
5
- * Extracts raw verdict data (status, checks, issues, fixes) from
6
- * actions.jsonl for semantic analysis by LLM agents. Per-cycle structural
7
- * evidence (pages tested, console errors, probes, endpoints called, …) is
8
- * NOT part of the verdict shape — it will be derived from `tool_call`
9
- * records by a future extractor. See `verify-gate.ts` TODO.
10
- * Pure logic — no process.exit, no stdin, no side effects.
11
- */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.extractVerdictDetails = extractVerdictDetails;
14
- const fs_1 = require("fs");
15
- function extractVerdictDetails(actionsFile) {
16
- if (!(0, fs_1.existsSync)(actionsFile)) {
17
- return null;
18
- }
19
- let content;
20
- try {
21
- content = (0, fs_1.readFileSync)(actionsFile, "utf-8");
22
- }
23
- catch {
24
- return null;
25
- }
26
- const lines = content.trim().split("\n").filter((l) => l.length > 0);
27
- const verdicts = [];
28
- for (const line of lines) {
29
- try {
30
- const entry = JSON.parse(line);
31
- if (entry.type !== "verdict_write") {
32
- continue;
33
- }
34
- const verdict = entry.verdict;
35
- if (!verdict) {
36
- continue;
37
- }
38
- const detail = {
39
- timestamp: entry.timestamp,
40
- status: typeof verdict.status === "string" ? verdict.status : "unknown",
41
- checks: Array.isArray(verdict.checks) ? verdict.checks.map(String) : [],
42
- issues: Array.isArray(verdict.issues) ? verdict.issues.map(String) : [],
43
- fixes: Array.isArray(verdict.fixes) ? verdict.fixes.map(String) : [],
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"verdict-details.js","sourceRoot":"","sources":["../../src/analysis/verdict-details.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAkBH,sDAkDC;AAlED,2BAA8C;AAgB9C,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,GAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC;YAC/C,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,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;aACvE,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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * IronBee — Verification Quality Analysis
3
- *
4
- * Reads actions.jsonl and calculates verification quality metrics.
5
- * Per-cycle structural metrics (avg console errors, network failures,
6
- * pages tested) have been removed — those values are no longer part of
7
- * the verdict shape; they will return when verify-gate derives them
8
- * from `tool_call` records. See `verify-gate.ts` TODO.
9
- * Pure logic — no process.exit, no stdin, no side effects.
10
- */
11
- export interface VerificationQualityAnalysis {
12
- firstPassSuccessRate: number;
13
- totalVerifications: number;
14
- passCount: number;
15
- failCount: number;
16
- averageRetries: number;
17
- averageChecksCount: number;
18
- }
19
- export declare function analyzeVerificationQuality(actionsFile: string): VerificationQualityAnalysis | null;
20
- //# sourceMappingURL=verification-quality.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verification-quality.d.ts","sourceRoot":"","sources":["../../src/analysis/verification-quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;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,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AA6ED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,2BAA2B,GAAG,IAAI,CAoFlG"}
@@ -1,145 +0,0 @@
1
- "use strict";
2
- /**
3
- * IronBee — Verification Quality Analysis
4
- *
5
- * Reads actions.jsonl and calculates verification quality metrics.
6
- * Per-cycle structural metrics (avg console errors, network failures,
7
- * pages tested) have been removed — those values are no longer part of
8
- * the verdict shape; they will return when verify-gate derives them
9
- * from `tool_call` records. See `verify-gate.ts` TODO.
10
- * Pure logic — no process.exit, no stdin, no side effects.
11
- */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.analyzeVerificationQuality = analyzeVerificationQuality;
14
- const fs_1 = require("fs");
15
- function parseEntries(actionsFile) {
16
- if (!(0, fs_1.existsSync)(actionsFile)) {
17
- return [];
18
- }
19
- const content = (0, fs_1.readFileSync)(actionsFile, "utf-8");
20
- const lines = content.trim().split("\n").filter((l) => l.length > 0);
21
- const entries = [];
22
- for (const line of lines) {
23
- try {
24
- const entry = JSON.parse(line);
25
- entries.push(entry);
26
- }
27
- catch {
28
- // skip malformed lines
29
- }
30
- }
31
- return entries;
32
- }
33
- function extractVerdictData(entry) {
34
- if (entry.type !== "verdict_write") {
35
- return null;
36
- }
37
- const verdict = entry.verdict;
38
- if (typeof verdict !== "object" || verdict === null) {
39
- return null;
40
- }
41
- const v = verdict;
42
- return {
43
- status: typeof v.status === "string" ? v.status : undefined,
44
- checks: Array.isArray(v.checks) ? v.checks : undefined,
45
- };
46
- }
47
- function buildChains(entries) {
48
- const chains = [];
49
- let currentChain = { verdicts: [] };
50
- for (const entry of entries) {
51
- if (entry.type === "verdict_write") {
52
- const data = extractVerdictData(entry);
53
- if (data !== null) {
54
- currentChain.verdicts.push(data);
55
- }
56
- }
57
- if (entry.type === "verification_requested" && entry.action === "allow") {
58
- if (currentChain.verdicts.length > 0) {
59
- chains.push(currentChain);
60
- }
61
- currentChain = { verdicts: [] };
62
- }
63
- }
64
- // push trailing chain if it has verdicts
65
- if (currentChain.verdicts.length > 0) {
66
- chains.push(currentChain);
67
- }
68
- return chains;
69
- }
70
- function analyzeVerificationQuality(actionsFile) {
71
- const entries = parseEntries(actionsFile);
72
- // Collect all verdict_write entries
73
- const allVerdicts = [];
74
- for (const entry of entries) {
75
- const data = extractVerdictData(entry);
76
- if (data !== null) {
77
- allVerdicts.push(data);
78
- }
79
- }
80
- if (allVerdicts.length === 0) {
81
- return null;
82
- }
83
- const chains = buildChains(entries);
84
- // First-pass success rate
85
- let firstPassSuccesses = 0;
86
- const totalChains = chains.length;
87
- for (const chain of chains) {
88
- if (chain.verdicts.length > 0 && chain.verdicts[0].status === "pass") {
89
- firstPassSuccesses++;
90
- }
91
- }
92
- const firstPassSuccessRate = totalChains > 0
93
- ? Math.round((firstPassSuccesses / totalChains) * 100)
94
- : 0;
95
- // Pass / fail counts
96
- let passCount = 0;
97
- let failCount = 0;
98
- for (const v of allVerdicts) {
99
- if (v.status === "pass") {
100
- passCount++;
101
- }
102
- else if (v.status === "fail") {
103
- failCount++;
104
- }
105
- }
106
- // Average retries: for each chain that ends in pass, count fails before the pass.
107
- // Chains that never reach pass don't contribute (average is over pass-terminated chains).
108
- const retryCounts = [];
109
- for (const chain of chains) {
110
- let failsBeforePass = 0;
111
- for (const v of chain.verdicts) {
112
- if (v.status === "pass") {
113
- retryCounts.push(failsBeforePass);
114
- break;
115
- }
116
- if (v.status === "fail") {
117
- failsBeforePass++;
118
- }
119
- }
120
- }
121
- const averageRetries = retryCounts.length > 0
122
- ? Math.round((retryCounts.reduce((a, b) => a + b, 0) / retryCounts.length) * 10) / 10
123
- : 0;
124
- // Average checks count
125
- let totalChecksCount = 0;
126
- let checksEntries = 0;
127
- for (const v of allVerdicts) {
128
- if (v.checks !== undefined) {
129
- totalChecksCount += v.checks.length;
130
- checksEntries++;
131
- }
132
- }
133
- const averageChecksCount = checksEntries > 0
134
- ? Math.round((totalChecksCount / checksEntries) * 10) / 10
135
- : 0;
136
- return {
137
- firstPassSuccessRate,
138
- totalVerifications: allVerdicts.length,
139
- passCount,
140
- failCount,
141
- averageRetries,
142
- averageChecksCount,
143
- };
144
- }
145
- //# sourceMappingURL=verification-quality.js.map