@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,230 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — Cross-Session Analysis
4
+ *
5
+ * Scans all sessions in .ironbee/sessions/ and produces aggregate metrics.
6
+ * Pure logic — no process.exit, no stdin, no side effects.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.analyzeCrossSessions = analyzeCrossSessions;
10
+ const fs_1 = require("fs");
11
+ const path_1 = require("path");
12
+ const time_analysis_1 = require("./time-analysis");
13
+ const verification_quality_1 = require("./verification-quality");
14
+ const fix_effectiveness_1 = require("./fix-effectiveness");
15
+ const code_changes_1 = require("./code-changes");
16
+ const scoring_1 = require("./scoring");
17
+ function parseEntries(actionsFile) {
18
+ if (!(0, fs_1.existsSync)(actionsFile)) {
19
+ return [];
20
+ }
21
+ const content = (0, fs_1.readFileSync)(actionsFile, "utf-8");
22
+ const trimmed = content.trim();
23
+ if (trimmed.length === 0) {
24
+ return [];
25
+ }
26
+ const lines = trimmed.split("\n").filter((l) => l.length > 0);
27
+ const entries = [];
28
+ for (const line of lines) {
29
+ try {
30
+ const entry = JSON.parse(line);
31
+ entries.push(entry);
32
+ }
33
+ catch {
34
+ // skip malformed lines
35
+ }
36
+ }
37
+ return entries;
38
+ }
39
+ function hasSessionReconcile(actionsFile) {
40
+ const entries = parseEntries(actionsFile);
41
+ return entries.some((e) => e.reason === "session_reconcile");
42
+ }
43
+ function getSessionTimestamp(actionsFile) {
44
+ const entries = parseEntries(actionsFile);
45
+ const sessionStart = entries.find((e) => e.type === "session_start");
46
+ if (sessionStart) {
47
+ return sessionStart.timestamp;
48
+ }
49
+ // Fallback: use first entry timestamp
50
+ if (entries.length > 0) {
51
+ return entries[0].timestamp;
52
+ }
53
+ return null;
54
+ }
55
+ function isFirstVerdictPass(actionsFile) {
56
+ const entries = parseEntries(actionsFile);
57
+ for (const entry of entries) {
58
+ if (entry.type === "verdict_write") {
59
+ const verdict = entry.verdict;
60
+ if (typeof verdict === "object" && verdict !== null) {
61
+ const v = verdict;
62
+ return v.status === "pass";
63
+ }
64
+ return false;
65
+ }
66
+ }
67
+ return false;
68
+ }
69
+ function hasAnyVerdict(actionsFile) {
70
+ const entries = parseEntries(actionsFile);
71
+ return entries.some((e) => e.type === "verdict_write");
72
+ }
73
+ function getLastVerdictStatus(actionsFile) {
74
+ const entries = parseEntries(actionsFile);
75
+ for (let i = entries.length - 1; i >= 0; i--) {
76
+ if (entries[i].type === "verdict_write") {
77
+ const verdict = entries[i].verdict;
78
+ if (verdict && typeof verdict.status === "string") {
79
+ return verdict.status;
80
+ }
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ function analyzeCrossSessions(sessionsDir) {
86
+ if (!(0, fs_1.existsSync)(sessionsDir)) {
87
+ return null;
88
+ }
89
+ let dirEntries;
90
+ try {
91
+ dirEntries = (0, fs_1.readdirSync)(sessionsDir);
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ // Filter to actual directories
97
+ const sessionIds = dirEntries.filter((name) => {
98
+ try {
99
+ return (0, fs_1.statSync)((0, path_1.join)(sessionsDir, name)).isDirectory();
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ });
105
+ if (sessionIds.length === 0) {
106
+ return null;
107
+ }
108
+ const summaries = [];
109
+ let totalDuration = 0;
110
+ let totalVerificationCycles = 0;
111
+ let totalFixCycles = 0;
112
+ let totalEfficiencyScore = 0;
113
+ let totalCodeConfidence = 0;
114
+ let sessionsWithVerdicts = 0;
115
+ let firstPassSuccessCount = 0;
116
+ let totalSuccessfulFixes = 0;
117
+ let totalFixAttemptsCounted = 0;
118
+ let abandonedSessions = 0;
119
+ let scoredSessions = 0;
120
+ // Aggregate problematic files across sessions
121
+ const globalFileFixCounts = new Map();
122
+ for (const sessionId of sessionIds) {
123
+ const actionsFile = (0, path_1.join)(sessionsDir, sessionId, "actions.jsonl");
124
+ const timeResult = (0, time_analysis_1.analyzeTime)(actionsFile);
125
+ const qualityResult = (0, verification_quality_1.analyzeVerificationQuality)(actionsFile);
126
+ const fixResult = (0, fix_effectiveness_1.analyzeFixEffectiveness)(actionsFile);
127
+ const codeChanges = (0, code_changes_1.analyzeCodeChanges)(actionsFile);
128
+ const scoring = (0, scoring_1.calculateScoring)(timeResult, qualityResult);
129
+ const timestamp = getSessionTimestamp(actionsFile);
130
+ const duration = timeResult !== null ? timeResult.sessionDuration : 0;
131
+ const verificationCycles = timeResult !== null ? timeResult.verificationCycles : 0;
132
+ const fixCycles = timeResult !== null ? timeResult.fixCycles : 0;
133
+ const hasVerdict = hasAnyVerdict(actionsFile);
134
+ const firstPass = hasVerdict ? isFirstVerdictPass(actionsFile) : false;
135
+ const lastStatus = getLastVerdictStatus(actionsFile);
136
+ const efficiencyScore = scoring !== null ? scoring.agentEfficiencyScore : 0;
137
+ const codeConfidence = scoring !== null ? scoring.codeConfidenceScore : 0;
138
+ if (timestamp !== null) {
139
+ summaries.push({
140
+ sessionId,
141
+ timestamp,
142
+ duration,
143
+ verificationCycles,
144
+ fixCycles,
145
+ firstPassSuccess: firstPass,
146
+ lastVerdictStatus: lastStatus,
147
+ agentEfficiencyScore: efficiencyScore,
148
+ });
149
+ }
150
+ totalDuration += duration;
151
+ totalVerificationCycles += verificationCycles;
152
+ totalFixCycles += fixCycles;
153
+ if (scoring !== null) {
154
+ totalEfficiencyScore += efficiencyScore;
155
+ totalCodeConfidence += codeConfidence;
156
+ scoredSessions++;
157
+ }
158
+ if (hasVerdict) {
159
+ sessionsWithVerdicts++;
160
+ if (firstPass) {
161
+ firstPassSuccessCount++;
162
+ }
163
+ }
164
+ if (fixResult !== null) {
165
+ totalSuccessfulFixes += fixResult.successfulFixes;
166
+ totalFixAttemptsCounted += fixResult.successfulFixes + fixResult.failedFixes;
167
+ }
168
+ if (hasSessionReconcile(actionsFile)) {
169
+ abandonedSessions++;
170
+ }
171
+ // Merge problematic files
172
+ if (codeChanges !== null) {
173
+ for (const f of codeChanges.problematicFiles) {
174
+ const current = globalFileFixCounts.get(f.filePath) ?? 0;
175
+ globalFileFixCounts.set(f.filePath, current + f.fixEditCount);
176
+ }
177
+ }
178
+ }
179
+ // Sort summaries by timestamp desc (most recent first)
180
+ summaries.sort((a, b) => {
181
+ return new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime();
182
+ });
183
+ const totalSessions = sessionIds.length;
184
+ const aggregateFirstPassRate = sessionsWithVerdicts > 0
185
+ ? Math.round((firstPassSuccessCount / sessionsWithVerdicts) * 100)
186
+ : 0;
187
+ const aggregateFixSuccessRate = totalFixAttemptsCounted > 0
188
+ ? Math.round((totalSuccessfulFixes / totalFixAttemptsCounted) * 100)
189
+ : 0;
190
+ const averageSessionDuration = totalSessions > 0
191
+ ? Math.round(totalDuration / totalSessions)
192
+ : 0;
193
+ const averageVerificationCycles = totalSessions > 0
194
+ ? Math.round((totalVerificationCycles / totalSessions) * 10) / 10
195
+ : 0;
196
+ const averageFixCycles = totalSessions > 0
197
+ ? Math.round((totalFixCycles / totalSessions) * 10) / 10
198
+ : 0;
199
+ const averageEfficiencyScore = scoredSessions > 0
200
+ ? Math.round(totalEfficiencyScore / scoredSessions)
201
+ : 0;
202
+ const averageCodeConfidence = scoredSessions > 0
203
+ ? Math.round((totalCodeConfidence / scoredSessions) * 100) / 100
204
+ : 0;
205
+ const abandonRate = totalSessions > 0
206
+ ? Math.round((abandonedSessions / totalSessions) * 100)
207
+ : 0;
208
+ // Top 5 most problematic files
209
+ const mostProblematicFiles = [...globalFileFixCounts.entries()]
210
+ .map(([filePath, fixEditCount]) => ({
211
+ filePath,
212
+ fixEditCount,
213
+ }))
214
+ .sort((a, b) => b.fixEditCount - a.fixEditCount)
215
+ .slice(0, 5);
216
+ return {
217
+ totalSessions,
218
+ sessionSummaries: summaries,
219
+ aggregateFirstPassRate,
220
+ aggregateFixSuccessRate,
221
+ averageSessionDuration,
222
+ averageVerificationCycles,
223
+ averageFixCycles,
224
+ averageEfficiencyScore,
225
+ averageCodeConfidence,
226
+ mostProblematicFiles,
227
+ abandonRate,
228
+ };
229
+ }
230
+ //# sourceMappingURL=cross-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-session.js","sourceRoot":"","sources":["../../src/analysis/cross-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * IronBee — Fix Effectiveness Analysis
3
+ *
4
+ * Reads actions.jsonl and calculates fix effectiveness metrics.
5
+ * Pure logic — no process.exit, no stdin, no side effects.
6
+ */
7
+ export interface FixEffectivenessAnalysis {
8
+ fixSuccessRate: number;
9
+ totalFixAttempts: number;
10
+ successfulFixes: number;
11
+ failedFixes: number;
12
+ fixToVerifyRatio: number;
13
+ reFailRate: number;
14
+ }
15
+ export declare function analyzeFixEffectiveness(actionsFile: string): FixEffectivenessAnalysis | null;
16
+ //# sourceMappingURL=fix-effectiveness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-effectiveness.d.ts","sourceRoot":"","sources":["../../src/analysis/fix-effectiveness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,wBAAwB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACtB;AA4BD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAgF5F"}
@@ -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