@ironbee-ai/cli 0.2.1 → 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 +31 -3
- package/README.md +118 -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 +1 -1
- package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-start.js +10 -1
- 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.d.ts +1 -1
- package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.js +3 -3
- 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 +1 -1
- package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/session-start.js +6 -1
- 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.d.ts +1 -1
- package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.js +3 -3
- 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 +81 -2
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +3 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +3 -1
- package/dist/commands/uninstall.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 +2 -1
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +38 -28
- 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 +2 -2
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +28 -33
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/telemetry.d.ts +23 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +265 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +7 -0
- package/dist/scripts/postinstall.d.ts.map +1 -0
- package/dist/scripts/postinstall.js +12 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/scripts/preuninstall.d.ts +8 -0
- package/dist/scripts/preuninstall.d.ts.map +1 -0
- package/dist/scripts/preuninstall.js +13 -0
- package/dist/scripts/preuninstall.js.map +1 -0
- package/package.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,37 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.4.0 (2026-03-22)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### Features
|
|
6
6
|
|
|
7
|
-
|
|
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))
|
|
8
8
|
|
|
9
9
|
All notable changes to this project will be documented in this file.
|
|
10
|
+
|
|
11
|
+
## [0.3.0](https://github.com/ironbee-ai/ironbee-cli/compare/v0.2.1...v0.3.0) (2026-03-17)
|
|
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)
|
|
18
|
+
|
|
19
|
+
### Refactors
|
|
20
|
+
|
|
21
|
+
* **banner:** update banner for the terminals without color support ([3865968](https://github.com/ironbee-ai/ironbee-cli/commit/3865968))
|
|
22
|
+
|
|
23
|
+
## [0.2.0](https://github.com/ironbee-ai/ironbee-cli/compare/v0.1.1...v0.2.0) (2026-03-16)
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
* **cursor:** initial impl ([#2](https://github.com/ironbee-ai/ironbee-cli/issues/2)) ([872a91e](https://github.com/ironbee-ai/ironbee-cli/commit/872a91e))
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* **readme:** fix license and CI badges ([42ea61c](https://github.com/ironbee-ai/ironbee-cli/commit/42ea61c))
|
|
32
|
+
|
|
33
|
+
## [0.1.1](https://github.com/ironbee-ai/ironbee-cli/compare/v0.1.0...v0.1.1) (2026-03-14)
|
|
34
|
+
|
|
35
|
+
### Features
|
|
36
|
+
|
|
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> —
|
|
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,125 @@ 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 #
|
|
170
|
-
|
|
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
|
+
|
|
277
|
+
## Telemetry
|
|
278
|
+
|
|
279
|
+
IronBee collects anonymous usage data to help improve the product. No source code, file contents, or personally identifiable information is ever sent.
|
|
280
|
+
|
|
281
|
+
Events collected: install/uninstall, session start, verdict submissions (pass/fail status only), and verification gate decisions.
|
|
282
|
+
|
|
283
|
+
To opt out, set the environment variable:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
export IRONBEE_TELEMETRY=false
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Or set `telemetryEnabled: false` in `~/.ironbee/telemetry.json`.
|
|
290
|
+
|
|
176
291
|
## Development
|
|
177
292
|
|
|
178
293
|
```bash
|
|
@@ -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
|