@ironbee-ai/cli 0.3.0 → 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 +11 -8
- package/README.md +104 -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.map +1 -1
- package/dist/clients/claude/hooks/session-start.js +7 -0
- 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.js +1 -1
- 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.map +1 -1
- package/dist/clients/cursor/hooks/session-start.js +3 -0
- 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.js +1 -1
- 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 +79 -0
- package/dist/commands/hook.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 +1 -0
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +35 -27
- 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 +1 -1
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +13 -20
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,99 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-effectiveness.js","sourceRoot":"","sources":["../../src/analysis/fix-effectiveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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,CAiDvB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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 four components: pass rate, page coverage, check depth, error cleanliness
|
|
29
|
+
let verificationQualityScore;
|
|
30
|
+
if (quality === null || quality.totalVerifications === 0) {
|
|
31
|
+
verificationQualityScore = 0;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const passPct = (quality.passCount / quality.totalVerifications) * 100;
|
|
35
|
+
const pagesPct = Math.min(quality.averagePagesTestedCount / 3, 1) * 100;
|
|
36
|
+
const checksPct = Math.min(quality.averageChecksCount / 5, 1) * 100;
|
|
37
|
+
const cleanPct = (1 / (quality.averageConsoleErrors + 1)) * 100;
|
|
38
|
+
verificationQualityScore = Math.round((passPct + pagesPct + checksPct + cleanPct) / 4);
|
|
39
|
+
}
|
|
40
|
+
// --- Code Confidence Score (0-100) ---
|
|
41
|
+
// pass_count / total_verdicts * 100
|
|
42
|
+
const passCount = quality !== null ? quality.passCount : 0;
|
|
43
|
+
const totalVerdicts = quality !== null ? quality.totalVerifications : 0;
|
|
44
|
+
let codeConfidenceScore;
|
|
45
|
+
if (totalVerdicts === 0) {
|
|
46
|
+
codeConfidenceScore = 100;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
codeConfidenceScore = Math.round((passCount / totalVerdicts) * 100);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
agentEfficiencyScore,
|
|
53
|
+
verificationQualityScore,
|
|
54
|
+
codeConfidenceScore,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/analysis/scoring.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAWH,4CAoDC;AApDD,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,uFAAuF;IACvF,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,QAAQ,GAAW,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QAChF,MAAM,SAAS,GAAW,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5E,MAAM,QAAQ,GAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACxE,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3F,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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
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 = new Date(sessionStartEntry.timestamp).getTime();
|
|
39
|
+
const lastTs = new Date(entries[entries.length - 1].timestamp).getTime();
|
|
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 = new Date(entry.timestamp).getTime();
|
|
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
|
|
@@ -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"}
|