@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.
Files changed (110) hide show
  1. package/CHANGELOG.md +11 -8
  2. package/README.md +104 -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/hooks/clear-verdict.js +1 -1
  35. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  36. package/dist/clients/claude/hooks/require-verification.d.ts +15 -0
  37. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -0
  38. package/dist/clients/claude/hooks/require-verification.js +61 -0
  39. package/dist/clients/claude/hooks/require-verification.js.map +1 -0
  40. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  41. package/dist/clients/claude/hooks/session-start.js +7 -0
  42. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  43. package/dist/clients/claude/hooks/track-action.d.ts +1 -1
  44. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  45. package/dist/clients/claude/hooks/track-action.js +58 -13
  46. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  47. package/dist/clients/claude/hooks/verify-gate.js +1 -1
  48. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  49. package/dist/clients/claude/index.d.ts +2 -0
  50. package/dist/clients/claude/index.d.ts.map +1 -1
  51. package/dist/clients/claude/index.js +43 -9
  52. package/dist/clients/claude/index.js.map +1 -1
  53. package/dist/clients/claude/rule.md +9 -7
  54. package/dist/clients/claude/skill.md +11 -8
  55. package/dist/clients/claude/skills/ironbee-analyze.md +39 -0
  56. package/dist/clients/cursor/commands/ironbee-analyze/SKILL.md +48 -0
  57. package/dist/clients/cursor/hooks/clear-verdict.js +1 -1
  58. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  59. package/dist/clients/cursor/hooks/require-verification.d.ts +15 -0
  60. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -0
  61. package/dist/clients/cursor/hooks/require-verification.js +63 -0
  62. package/dist/clients/cursor/hooks/require-verification.js.map +1 -0
  63. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  64. package/dist/clients/cursor/hooks/session-start.js +3 -0
  65. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  66. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  67. package/dist/clients/cursor/hooks/track-action.js +62 -12
  68. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  69. package/dist/clients/cursor/hooks/verify-gate.js +1 -1
  70. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  71. package/dist/clients/cursor/index.d.ts +2 -0
  72. package/dist/clients/cursor/index.d.ts.map +1 -1
  73. package/dist/clients/cursor/index.js +31 -6
  74. package/dist/clients/cursor/index.js.map +1 -1
  75. package/dist/clients/cursor/rule.md +9 -7
  76. package/dist/clients/cursor/skill.md +11 -8
  77. package/dist/commands/analyze.d.ts +3 -0
  78. package/dist/commands/analyze.d.ts.map +1 -0
  79. package/dist/commands/analyze.js +298 -0
  80. package/dist/commands/analyze.js.map +1 -0
  81. package/dist/commands/hook.d.ts.map +1 -1
  82. package/dist/commands/hook.js +79 -0
  83. package/dist/commands/hook.js.map +1 -1
  84. package/dist/hooks/core/actions.d.ts +19 -0
  85. package/dist/hooks/core/actions.d.ts.map +1 -1
  86. package/dist/hooks/core/actions.js +5 -0
  87. package/dist/hooks/core/actions.js.map +1 -1
  88. package/dist/hooks/core/clear-verdict.d.ts +1 -1
  89. package/dist/hooks/core/clear-verdict.d.ts.map +1 -1
  90. package/dist/hooks/core/clear-verdict.js +13 -9
  91. package/dist/hooks/core/clear-verdict.js.map +1 -1
  92. package/dist/hooks/core/session-state.d.ts +47 -0
  93. package/dist/hooks/core/session-state.d.ts.map +1 -0
  94. package/dist/hooks/core/session-state.js +192 -0
  95. package/dist/hooks/core/session-state.js.map +1 -0
  96. package/dist/hooks/core/submit-verdict.d.ts +1 -0
  97. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  98. package/dist/hooks/core/submit-verdict.js +35 -27
  99. package/dist/hooks/core/submit-verdict.js.map +1 -1
  100. package/dist/hooks/core/verification-lifecycle.d.ts +30 -0
  101. package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -0
  102. package/dist/hooks/core/verification-lifecycle.js +75 -0
  103. package/dist/hooks/core/verification-lifecycle.js.map +1 -0
  104. package/dist/hooks/core/verify-gate.d.ts +1 -1
  105. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  106. package/dist/hooks/core/verify-gate.js +13 -20
  107. package/dist/hooks/core/verify-gate.js.map +1 -1
  108. package/dist/index.js +3 -0
  109. package/dist/index.js.map +1 -1
  110. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,34 +1,37 @@
1
1
  # Changelog
2
2
 
3
- ## 0.3.0 (2026-03-17)
3
+ ## 0.4.0 (2026-03-22)
4
+
5
+ ### Features
6
+
7
+ * **analyze:** add session analytics with time, quality, code changes, fix effectiveness, scoring, cross-session analysis, and /ironbee-analyze command ([61fe0c8](https://github.com/ironbee-ai/ironbee-cli/commit/61fe0c8060731e66e23a9e17d010fc9d373fcbe9))
4
8
 
5
9
  All notable changes to this project will be documented in this file.
6
10
 
7
- ## [0.2.1](https://github.com/ironbee-ai/ironbee-cli/compare/v0.2.0...v0.2.1) (2026-03-16)
11
+ ## [0.3.0](https://github.com/ironbee-ai/ironbee-cli/compare/v0.2.1...v0.3.0) (2026-03-17)
8
12
 
13
+ ### Features
14
+
15
+ * **telemetry:** add telemetry support ([#3](https://github.com/ironbee-ai/ironbee-cli/issues/3)) ([e39398b](https://github.com/ironbee-ai/ironbee-cli/commit/e39398b))
16
+
17
+ ## [0.2.1](https://github.com/ironbee-ai/ironbee-cli/compare/v0.2.0...v0.2.1) (2026-03-16)
9
18
 
10
19
  ### Refactors
11
20
 
12
21
  * **banner:** update banner for the terminals without color support ([3865968](https://github.com/ironbee-ai/ironbee-cli/commit/3865968))
13
22
 
14
-
15
23
  ## [0.2.0](https://github.com/ironbee-ai/ironbee-cli/compare/v0.1.1...v0.2.0) (2026-03-16)
16
24
 
17
-
18
25
  ### Features
19
26
 
20
27
  * **cursor:** initial impl ([#2](https://github.com/ironbee-ai/ironbee-cli/issues/2)) ([872a91e](https://github.com/ironbee-ai/ironbee-cli/commit/872a91e))
21
28
 
22
-
23
29
  ### Bug Fixes
24
30
 
25
- * **build:** fix banner.txt path resolution for npm global install ([1830699](https://github.com/ironbee-ai/ironbee-cli/commit/1830699))
26
31
  * **readme:** fix license and CI badges ([42ea61c](https://github.com/ironbee-ai/ironbee-cli/commit/42ea61c))
27
32
 
28
-
29
33
  ## [0.1.1](https://github.com/ironbee-ai/ironbee-cli/compare/v0.1.0...v0.1.1) (2026-03-14)
30
34
 
31
-
32
35
  ### Features
33
36
 
34
37
  * **claude:** initial impl ([#1](https://github.com/ironbee-ai/ironbee-cli/issues/1)) ([960c59d](https://github.com/ironbee-ai/ironbee-cli/commit/960c59d))
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  </h1>
5
5
 
6
6
  <p align="center">
7
- <strong>The CLI for <a href="https://ironbee.ai">IronBee</a> — The Verification Layer for Agentic Development</strong>
7
+ <strong>The CLI for <a href="https://ironbee.ai">IronBee</a> — Verification and Intelligence Layer for Agentic Development</strong>
8
8
  </p>
9
9
 
10
10
  <p align="center">
@@ -19,6 +19,8 @@
19
19
 
20
20
  No more "it should work" — every change is tested.
21
21
 
22
+ IronBee also tracks every verification cycle — coding time, fix time, pass/fail rates, problematic files — and provides session and project-level analytics for LLM-powered semantic insights.
23
+
22
24
  Powered by [browser-devtools-mcp](https://browser-devtools.com) — the agent navigates pages, clicks buttons, fills forms, takes screenshots, checks console errors, and writes a structured verdict.
23
25
 
24
26
  ## Supported Clients
@@ -72,6 +74,7 @@ ironbee install [project-dir] [--client <name>] Set up hooks and config
72
74
  ironbee uninstall [project-dir] [--client <name>] Remove hooks and config
73
75
  ironbee status [project-dir] Show verdict status for active sessions
74
76
  ironbee verify [session-id] Dry-run verdict validation
77
+ ironbee analyze [session-id] Analyze session metrics (or all sessions)
75
78
  ```
76
79
 
77
80
  ## Configuration
@@ -166,13 +169,111 @@ Each AI session gets its own directory under `.ironbee/sessions/<session-id>/`:
166
169
  ```
167
170
  .ironbee/sessions/<session-id>/
168
171
  actions.jsonl # Event log (file edits, tool calls, verification markers)
169
- verdict.json # Written by agent after verification
170
- retries # Retry counter
172
+ verdict.json # Current verdict (cleared on code edit)
173
+ state.json # Session state (retries, active verification, trace ID, active fix, phase)
171
174
  session.log # Debug log
172
175
  ```
173
176
 
174
177
  This means parallel sessions (e.g., multiple Claude Code instances) don't interfere with each other.
175
178
 
179
+ ## Analytics
180
+
181
+ `ironbee analyze` provides metrics about verification sessions — how time is spent, how effective verifications are, and how confident we can be in the agent's code.
182
+
183
+ ### Usage
184
+
185
+ ```bash
186
+ ironbee analyze <session-id> # single session analysis
187
+ ironbee analyze # all sessions (project-level)
188
+ ironbee analyze --json # JSON output
189
+ ironbee analyze --detailed # include verdict details (checks, issues, fixes)
190
+ ironbee analyze --json --detailed # JSON with verdict text for LLM semantic analysis
191
+ ironbee analyze <session-id> --json --detailed # single session JSON with verdict details
192
+ ```
193
+
194
+ The `--detailed` flag includes raw verdict text (checks, issues, fixes) in the output. This is designed for LLM-powered semantic analysis — use `/ironbee-analyze` in Claude Code or Cursor to have the agent interpret these details automatically.
195
+
196
+ ### Session Analysis
197
+
198
+ #### Phase Distribution
199
+
200
+ Each session is divided into three phases:
201
+
202
+ | Phase | What it measures |
203
+ |-------|-----------------|
204
+ | **Coding** | Time from session start to first verification, and between fix end and next verification start |
205
+ | **Verification** | Time between `verification_start` and `verification_end` — browser testing |
206
+ | **Fixing** | Time between `fix_start` and `fix_end` — fixing failed verifications |
207
+
208
+ #### Cycles
209
+
210
+ | Metric | Meaning |
211
+ |--------|---------|
212
+ | Verifications | Number of verification cycles in the session |
213
+ | Fixes | Number of fix cycles (each fail verdict starts a fix) |
214
+ | Avg verify | Average duration of a verification cycle |
215
+ | Avg fix | Average duration of a fix cycle |
216
+ | First verify | Time from session start to first verification |
217
+
218
+ #### Verification Quality
219
+
220
+ | Metric | Meaning |
221
+ |--------|---------|
222
+ | First-pass rate | Percentage of verification chains where the first verdict was pass |
223
+ | Verdicts | Total verdict count (pass + fail) |
224
+ | Avg retries | Average number of fail verdicts before pass per chain |
225
+ | Avg console errs | Average `console_errors` across all verdicts |
226
+ | Avg network fails | Average `network_failures` across all verdicts |
227
+ | Avg pages tested | Average number of pages tested per verdict |
228
+ | Avg checks | Average number of checks performed per verdict |
229
+
230
+ #### Code Changes
231
+
232
+ | Metric | Meaning |
233
+ |--------|---------|
234
+ | Total edits | Total file edit operations in the session |
235
+ | Unique files | Number of distinct files edited |
236
+ | Avg per verify | Average file edits before each verification |
237
+ | Avg per fix | Average file edits during each fix cycle |
238
+ | Hot Files | Top 5 most frequently edited files |
239
+ | Problematic Files | Top 5 files with most edits during fix cycles |
240
+ | Edit Churn | Files edited in 2+ separate fix cycles (root cause may not be resolved) |
241
+
242
+ #### Fix Effectiveness
243
+
244
+ | Metric | Meaning |
245
+ |--------|---------|
246
+ | Success rate | Percentage of fixes followed by a pass verdict |
247
+ | Re-fail rate | Percentage of fixes followed by another fail verdict |
248
+ | Fix/verify | Ratio of fix cycles to verification cycles (0 = no fixes needed) |
249
+
250
+ #### Scoring
251
+
252
+ Three scores summarize the session:
253
+
254
+ | Score | Formula | What it measures |
255
+ |-------|---------|-----------------|
256
+ | **Efficiency** | `coding_time / (coding_time + fix_time) × 100` | How much productive time vs fix overhead. High = minimal wasted time on fixes |
257
+ | **Quality** | `(pass_pct + pages_pct + checks_pct + clean_pct) / 4` | How thorough and clean the verification was. Components: pass rate, page coverage (3+ = 100%), check depth (5+ = 100%), error cleanliness (0 errors = 100%) |
258
+ | **Confidence** | `pass_count / total_verdicts × 100` | How likely the agent's code works. Based on verdict pass rate |
259
+
260
+ ### Project Analysis
261
+
262
+ When run without a session ID, `ironbee analyze` aggregates metrics across all sessions:
263
+
264
+ | Metric | Meaning |
265
+ |--------|---------|
266
+ | Session History | Each session's summary — duration, cycles, outcome, score |
267
+ | Avg duration | Average session duration across all sessions |
268
+ | Avg verifies | Average verification cycles per session |
269
+ | Avg fixes | Average fix cycles per session |
270
+ | First-pass rate | Percentage of sessions where the first verdict was pass |
271
+ | Fix success rate | Percentage of all fixes (across sessions) that succeeded |
272
+ | Abandon rate | Percentage of sessions with interrupted verification/fix cycles |
273
+ | Avg efficiency | Average efficiency score across all sessions |
274
+ | Avg confidence | Average confidence score across all sessions |
275
+ | Problematic Files | Top 5 files with most fix edits across all sessions |
276
+
176
277
  ## Telemetry
177
278
 
178
279
  IronBee collects anonymous usage data to help improve the product. No source code, file contents, or personally identifiable information is ever sent.
@@ -0,0 +1,22 @@
1
+ /**
2
+ * IronBee — Code Change Analysis
3
+ *
4
+ * Reads actions.jsonl and calculates code change metrics.
5
+ * Pure logic — no process.exit, no stdin, no side effects.
6
+ */
7
+ export interface FileStats {
8
+ filePath: string;
9
+ editCount: number;
10
+ fixEditCount: number;
11
+ }
12
+ export interface CodeChangeAnalysis {
13
+ totalFileEdits: number;
14
+ uniqueFilesEdited: number;
15
+ filesEditedPerVerification: number;
16
+ filesChangedPerFix: number;
17
+ hotFiles: FileStats[];
18
+ problematicFiles: FileStats[];
19
+ editChurnFiles: string[];
20
+ }
21
+ export declare function analyzeCodeChanges(actionsFile: string): CodeChangeAnalysis | null;
22
+ //# sourceMappingURL=code-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-changes.d.ts","sourceRoot":"","sources":["../../src/analysis/code-changes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0BAA0B,EAAE,MAAM,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,gBAAgB,EAAE,SAAS,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC5B;AAuBD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAqIjF"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — Code Change Analysis
4
+ *
5
+ * Reads actions.jsonl and calculates code change metrics.
6
+ * Pure logic — no process.exit, no stdin, no side effects.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.analyzeCodeChanges = analyzeCodeChanges;
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 analyzeCodeChanges(actionsFile) {
30
+ const entries = parseEntries(actionsFile);
31
+ // Collect all file_edit entries
32
+ const fileEdits = entries.filter((e) => e.type === "file_edit");
33
+ if (fileEdits.length === 0) {
34
+ return null;
35
+ }
36
+ const totalFileEdits = fileEdits.length;
37
+ // Unique files
38
+ const uniqueFiles = new Set();
39
+ for (const edit of fileEdits) {
40
+ const filePath = edit.file_path;
41
+ if (typeof filePath === "string") {
42
+ uniqueFiles.add(filePath);
43
+ }
44
+ }
45
+ const uniqueFilesEdited = uniqueFiles.size;
46
+ // Track phases and count edits per phase type
47
+ let inFixPhase = false;
48
+ let currentFixId = null;
49
+ let codingEditCount = 0;
50
+ let fixEditCount = 0;
51
+ let verificationCount = 0;
52
+ let fixCount = 0;
53
+ // Per-file stats
54
+ const fileEditCounts = new Map();
55
+ const fileFixEditCounts = new Map();
56
+ // Track which fix cycles each file appears in (for churn detection)
57
+ const fileFixCycles = new Map();
58
+ for (const entry of entries) {
59
+ if (entry.type === "fix_start") {
60
+ inFixPhase = true;
61
+ currentFixId = entry.fix_id;
62
+ fixCount++;
63
+ continue;
64
+ }
65
+ if (entry.type === "fix_end") {
66
+ inFixPhase = false;
67
+ currentFixId = null;
68
+ continue;
69
+ }
70
+ if (entry.type === "verification_start") {
71
+ inFixPhase = false;
72
+ currentFixId = null;
73
+ verificationCount++;
74
+ continue;
75
+ }
76
+ if (entry.type === "file_edit") {
77
+ const filePath = entry.file_path;
78
+ if (inFixPhase) {
79
+ fixEditCount++;
80
+ if (typeof filePath === "string") {
81
+ const currentCount = fileFixEditCounts.get(filePath) ?? 0;
82
+ fileFixEditCounts.set(filePath, currentCount + 1);
83
+ if (typeof currentFixId === "string") {
84
+ let cycles = fileFixCycles.get(filePath);
85
+ if (cycles === undefined) {
86
+ cycles = new Set();
87
+ fileFixCycles.set(filePath, cycles);
88
+ }
89
+ cycles.add(currentFixId);
90
+ }
91
+ }
92
+ }
93
+ else {
94
+ codingEditCount++;
95
+ }
96
+ if (typeof filePath === "string") {
97
+ const currentCount = fileEditCounts.get(filePath) ?? 0;
98
+ fileEditCounts.set(filePath, currentCount + 1);
99
+ }
100
+ }
101
+ }
102
+ // filesEditedPerVerification: coding edits / verification count
103
+ const filesEditedPerVerification = verificationCount > 0
104
+ ? Math.round((codingEditCount / verificationCount) * 10) / 10
105
+ : 0;
106
+ // filesChangedPerFix: fix edits / fix count
107
+ const filesChangedPerFix = fixCount > 0
108
+ ? Math.round((fixEditCount / fixCount) * 10) / 10
109
+ : 0;
110
+ // hotFiles: top 5 by total edit count
111
+ const allFileStats = [];
112
+ for (const [filePath, editCount] of fileEditCounts) {
113
+ const fixEdits = fileFixEditCounts.get(filePath) ?? 0;
114
+ allFileStats.push({ filePath, editCount, fixEditCount: fixEdits });
115
+ }
116
+ const hotFiles = [...allFileStats]
117
+ .sort((a, b) => b.editCount - a.editCount)
118
+ .slice(0, 5);
119
+ // problematicFiles: top 5 by fix edit count, only those with fixEditCount > 0
120
+ const problematicFiles = [...allFileStats]
121
+ .filter((f) => f.fixEditCount > 0)
122
+ .sort((a, b) => b.fixEditCount - a.fixEditCount)
123
+ .slice(0, 5);
124
+ // editChurnFiles: files edited in 2+ different fix cycles
125
+ const editChurnFiles = [];
126
+ for (const [filePath, cycles] of fileFixCycles) {
127
+ if (cycles.size >= 2) {
128
+ editChurnFiles.push(filePath);
129
+ }
130
+ }
131
+ return {
132
+ totalFileEdits,
133
+ uniqueFilesEdited,
134
+ filesEditedPerVerification,
135
+ filesChangedPerFix,
136
+ hotFiles,
137
+ problematicFiles,
138
+ editChurnFiles,
139
+ };
140
+ }
141
+ //# sourceMappingURL=code-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-changes.js","sourceRoot":"","sources":["../../src/analysis/code-changes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * IronBee — Cross-Session Analysis
3
+ *
4
+ * Scans all sessions in .ironbee/sessions/ and produces aggregate metrics.
5
+ * Pure logic — no process.exit, no stdin, no side effects.
6
+ */
7
+ export interface SessionSummary {
8
+ sessionId: string;
9
+ timestamp: string;
10
+ duration: number;
11
+ verificationCycles: number;
12
+ fixCycles: number;
13
+ firstPassSuccess: boolean;
14
+ lastVerdictStatus: string | null;
15
+ agentEfficiencyScore: number;
16
+ }
17
+ export interface CrossSessionAnalysis {
18
+ totalSessions: number;
19
+ sessionSummaries: SessionSummary[];
20
+ aggregateFirstPassRate: number;
21
+ aggregateFixSuccessRate: number;
22
+ averageSessionDuration: number;
23
+ averageVerificationCycles: number;
24
+ averageFixCycles: number;
25
+ averageEfficiencyScore: number;
26
+ averageCodeConfidence: number;
27
+ mostProblematicFiles: Array<{
28
+ filePath: string;
29
+ fixEditCount: number;
30
+ }>;
31
+ abandonRate: number;
32
+ }
33
+ export declare function analyzeCrossSessions(sessionsDir: string): CrossSessionAnalysis | null;
34
+ //# sourceMappingURL=cross-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-session.d.ts","sourceRoot":"","sources":["../../src/analysis/cross-session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yBAAyB,EAAE,MAAM,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,WAAW,EAAE,MAAM,CAAC;CACvB;AAiFD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CA2KrF"}
@@ -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"}