@codeledger/cli 0.6.8 → 0.7.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/dist/commands/activate.d.ts.map +1 -1
- package/dist/commands/activate.js +94 -26
- package/dist/commands/activate.js.map +1 -1
- package/dist/commands/ci.d.ts +16 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +323 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/commit-msg.d.ts +58 -0
- package/dist/commands/commit-msg.d.ts.map +1 -0
- package/dist/commands/commit-msg.js +461 -0
- package/dist/commands/commit-msg.js.map +1 -0
- package/dist/commands/compare.d.ts.map +1 -1
- package/dist/commands/compare.js +8 -0
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/context.d.ts +17 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +687 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +65 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/enable.d.ts +7 -0
- package/dist/commands/enable.d.ts.map +1 -0
- package/dist/commands/enable.js +75 -0
- package/dist/commands/enable.js.map +1 -0
- package/dist/commands/features.d.ts +2 -0
- package/dist/commands/features.d.ts.map +1 -0
- package/dist/commands/features.js +182 -0
- package/dist/commands/features.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/intent.d.ts +5 -3
- package/dist/commands/intent.d.ts.map +1 -1
- package/dist/commands/intent.js +135 -4
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/ledger.d.ts +14 -0
- package/dist/commands/ledger.d.ts.map +1 -0
- package/dist/commands/ledger.js +128 -0
- package/dist/commands/ledger.js.map +1 -0
- package/dist/commands/license.d.ts +45 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +240 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +12 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +119 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/policy-simulate.d.ts +9 -0
- package/dist/commands/policy-simulate.d.ts.map +1 -0
- package/dist/commands/policy-simulate.js +46 -0
- package/dist/commands/policy-simulate.js.map +1 -0
- package/dist/commands/pr-summary.d.ts +59 -0
- package/dist/commands/pr-summary.d.ts.map +1 -0
- package/dist/commands/pr-summary.js +524 -0
- package/dist/commands/pr-summary.js.map +1 -0
- package/dist/commands/provenance.d.ts +10 -0
- package/dist/commands/provenance.d.ts.map +1 -0
- package/dist/commands/provenance.js +87 -0
- package/dist/commands/provenance.js.map +1 -0
- package/dist/commands/replay.d.ts +2 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +181 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +73 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-cleanup.js +1 -0
- package/dist/commands/session-cleanup.js.map +1 -1
- package/dist/commands/session-summary.d.ts.map +1 -1
- package/dist/commands/session-summary.js +180 -3
- package/dist/commands/session-summary.js.map +1 -1
- package/dist/commands/setup-ci.d.ts +17 -1
- package/dist/commands/setup-ci.d.ts.map +1 -1
- package/dist/commands/setup-ci.js +202 -51
- package/dist/commands/setup-ci.js.map +1 -1
- package/dist/commands/share.js +1 -1
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/stats.d.ts +8 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +164 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/team-ledger.d.ts +11 -0
- package/dist/commands/team-ledger.d.ts.map +1 -0
- package/dist/commands/team-ledger.js +74 -0
- package/dist/commands/team-ledger.js.map +1 -0
- package/dist/commands/team-metrics.d.ts +8 -0
- package/dist/commands/team-metrics.d.ts.map +1 -0
- package/dist/commands/team-metrics.js +57 -0
- package/dist/commands/team-metrics.js.map +1 -0
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +39 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +35 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +256 -36
- package/dist/index.js.map +1 -1
- package/dist/intent/extractor.d.ts +15 -0
- package/dist/intent/extractor.d.ts.map +1 -0
- package/dist/intent/extractor.js +149 -0
- package/dist/intent/extractor.js.map +1 -0
- package/dist/intent/fetcher.d.ts +33 -0
- package/dist/intent/fetcher.d.ts.map +1 -0
- package/dist/intent/fetcher.js +364 -0
- package/dist/intent/fetcher.js.map +1 -0
- package/dist/intent/loader.d.ts +26 -0
- package/dist/intent/loader.d.ts.map +1 -0
- package/dist/intent/loader.js +80 -0
- package/dist/intent/loader.js.map +1 -0
- package/dist/intent/types.d.ts +33 -0
- package/dist/intent/types.d.ts.map +1 -0
- package/dist/intent/types.js +9 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/project-config.d.ts +38 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +206 -0
- package/dist/project-config.js.map +1 -0
- package/dist/review-intelligence/detectors/architecture-graph.d.ts +18 -0
- package/dist/review-intelligence/detectors/architecture-graph.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/architecture-graph.js +73 -0
- package/dist/review-intelligence/detectors/architecture-graph.js.map +1 -0
- package/dist/review-intelligence/detectors/pack-rules.d.ts +16 -0
- package/dist/review-intelligence/detectors/pack-rules.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/pack-rules.js +107 -0
- package/dist/review-intelligence/detectors/pack-rules.js.map +1 -0
- package/dist/review-intelligence/fixes/index.d.ts +18 -0
- package/dist/review-intelligence/fixes/index.d.ts.map +1 -1
- package/dist/review-intelligence/fixes/index.js +198 -9
- package/dist/review-intelligence/fixes/index.js.map +1 -1
- package/dist/review-intelligence/index.d.ts +4 -1
- package/dist/review-intelligence/index.d.ts.map +1 -1
- package/dist/review-intelligence/index.js +20 -3
- package/dist/review-intelligence/index.js.map +1 -1
- package/dist/review-intelligence/invariants.d.ts +15 -0
- package/dist/review-intelligence/invariants.d.ts.map +1 -1
- package/dist/review-intelligence/invariants.js +36 -5
- package/dist/review-intelligence/invariants.js.map +1 -1
- package/dist/review-intelligence/types.d.ts +16 -12
- package/dist/review-intelligence/types.d.ts.map +1 -1
- package/dist/review-intelligence/types.js +9 -1
- package/dist/review-intelligence/types.js.map +1 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +32 -127
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/templates/config.js +4 -4
- package/dist/templates/config.js.map +1 -1
- package/dist/templates/hooks.d.ts +3 -1
- package/dist/templates/hooks.d.ts.map +1 -1
- package/dist/templates/hooks.js +101 -2
- package/dist/templates/hooks.js.map +1 -1
- package/package.json +11 -10
- package/LICENSE +0 -27
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0IzF"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { buildBundleViaEngine } from '@codeledger/core-engine';
|
|
4
|
+
import { buildRepoIndex } from '@codeledger/repo';
|
|
5
|
+
export async function runReplay(cwd, flags) {
|
|
6
|
+
const task = flags['task'];
|
|
7
|
+
if (!task || task.trim() === '') {
|
|
8
|
+
console.error('Usage: codeledger replay --task "describe the task"');
|
|
9
|
+
console.error('Reconstructs the context bundle for a task and compares to the original run.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const configPath = join(cwd, '.codeledger', 'config.json');
|
|
13
|
+
if (!existsSync(configPath)) {
|
|
14
|
+
console.error('No .codeledger/config.json found. Run "codeledger init" first.');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
let config;
|
|
18
|
+
try {
|
|
19
|
+
config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
console.error('Failed to parse .codeledger/config.json.');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const json = flags['json'] === 'true';
|
|
26
|
+
// Step 1: Rebuild the repo index (always fresh for deterministic replay)
|
|
27
|
+
if (!json)
|
|
28
|
+
console.log('Replaying context selection...\n');
|
|
29
|
+
const indexPath = join(cwd, '.codeledger', 'cache', 'repo-index.json');
|
|
30
|
+
const repoIndex = buildRepoIndex({
|
|
31
|
+
root: cwd,
|
|
32
|
+
repoConfig: config.repo,
|
|
33
|
+
outputPath: indexPath,
|
|
34
|
+
});
|
|
35
|
+
// Step 2: Build bundle with same algorithm
|
|
36
|
+
const budget = {
|
|
37
|
+
tokens: config.selector.default_budget?.tokens ?? 8000,
|
|
38
|
+
max_files: config.selector.default_budget?.max_files ?? 25,
|
|
39
|
+
};
|
|
40
|
+
const replayBundle = await buildBundleViaEngine({
|
|
41
|
+
taskText: task,
|
|
42
|
+
repoIndex,
|
|
43
|
+
selectorConfig: config.selector,
|
|
44
|
+
budget,
|
|
45
|
+
explain: true,
|
|
46
|
+
indexPath,
|
|
47
|
+
});
|
|
48
|
+
// Step 3: Find original bundle for comparison
|
|
49
|
+
const originalBundle = findOriginalBundle(cwd, task);
|
|
50
|
+
if (json) {
|
|
51
|
+
const result = {
|
|
52
|
+
task,
|
|
53
|
+
replay: {
|
|
54
|
+
files: replayBundle.files.map((f) => ({
|
|
55
|
+
path: f.path,
|
|
56
|
+
score: f.score,
|
|
57
|
+
reasons: f.reasons,
|
|
58
|
+
})),
|
|
59
|
+
total_tokens: replayBundle.total_tokens,
|
|
60
|
+
confidence: replayBundle.confidence,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
if (originalBundle) {
|
|
64
|
+
result['original'] = {
|
|
65
|
+
bundle_id: originalBundle.bundle_id,
|
|
66
|
+
files: originalBundle.files.map((f) => ({
|
|
67
|
+
path: f.path,
|
|
68
|
+
score: f.score,
|
|
69
|
+
reasons: f.reasons,
|
|
70
|
+
})),
|
|
71
|
+
total_tokens: originalBundle.total_tokens,
|
|
72
|
+
};
|
|
73
|
+
result['diff'] = computeDiff(originalBundle, replayBundle);
|
|
74
|
+
}
|
|
75
|
+
console.log(JSON.stringify(result, null, 2));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Human-readable output
|
|
79
|
+
console.log(` Task: "${task}"\n`);
|
|
80
|
+
console.log(' Replayed Bundle:');
|
|
81
|
+
console.log(` Files: ${replayBundle.files.length} | Tokens: ~${replayBundle.total_tokens}`);
|
|
82
|
+
if (replayBundle.confidence) {
|
|
83
|
+
console.log(` Confidence: ${replayBundle.confidence.level.toUpperCase()} (${replayBundle.confidence.score.toFixed(3)})`);
|
|
84
|
+
}
|
|
85
|
+
console.log('');
|
|
86
|
+
// Show file ranking
|
|
87
|
+
console.log(' File Ranking:');
|
|
88
|
+
for (const f of replayBundle.files.filter((f) => !f.is_stub)) {
|
|
89
|
+
console.log(` ${f.score.toFixed(3)} ${f.path}`);
|
|
90
|
+
if (f.reasons.length > 0) {
|
|
91
|
+
console.log(` [${f.reasons.join(', ')}]`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Show ISC / CCS if available
|
|
95
|
+
if (replayBundle.confidence) {
|
|
96
|
+
console.log('\n Context Confidence Score (CCS):');
|
|
97
|
+
console.log(` Overall: ${replayBundle.confidence.score.toFixed(3)} (${replayBundle.confidence.level})`);
|
|
98
|
+
if (replayBundle.confidence.reasons.length > 0) {
|
|
99
|
+
for (const r of replayBundle.confidence.reasons) {
|
|
100
|
+
console.log(` - ${r}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Compare to original if found
|
|
105
|
+
if (originalBundle) {
|
|
106
|
+
console.log('\n Comparison to Original Run:');
|
|
107
|
+
console.log(` Original bundle: ${originalBundle.bundle_id}`);
|
|
108
|
+
const diff = computeDiff(originalBundle, replayBundle);
|
|
109
|
+
if (diff.added.length === 0 && diff.removed.length === 0 && diff.scoreChanged.length === 0) {
|
|
110
|
+
console.log(' Result: IDENTICAL — deterministic selection confirmed');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
if (diff.added.length > 0) {
|
|
114
|
+
console.log(` Added (${diff.added.length}):`);
|
|
115
|
+
for (const f of diff.added)
|
|
116
|
+
console.log(` + ${f}`);
|
|
117
|
+
}
|
|
118
|
+
if (diff.removed.length > 0) {
|
|
119
|
+
console.log(` Removed (${diff.removed.length}):`);
|
|
120
|
+
for (const f of diff.removed)
|
|
121
|
+
console.log(` - ${f}`);
|
|
122
|
+
}
|
|
123
|
+
if (diff.scoreChanged.length > 0) {
|
|
124
|
+
console.log(` Score changed (${diff.scoreChanged.length}):`);
|
|
125
|
+
for (const sc of diff.scoreChanged) {
|
|
126
|
+
console.log(` ~ ${sc.path}: ${sc.oldScore.toFixed(3)} -> ${sc.newScore.toFixed(3)} (${sc.delta > 0 ? '+' : ''}${sc.delta.toFixed(3)})`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
console.log(`\n Overlap: ${diff.overlapCount}/${originalBundle.files.length} files match`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log('\n No original bundle found for comparison.');
|
|
134
|
+
console.log(' Run "codeledger activate --task ..." first, then replay to compare.');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function findOriginalBundle(cwd, task) {
|
|
138
|
+
const bundleDir = join(cwd, '.codeledger', 'artifacts', 'bundles');
|
|
139
|
+
if (!existsSync(bundleDir))
|
|
140
|
+
return null;
|
|
141
|
+
try {
|
|
142
|
+
const files = readdirSync(bundleDir).filter((f) => f.endsWith('.json')).sort().reverse();
|
|
143
|
+
for (const file of files) {
|
|
144
|
+
const content = readFileSync(join(bundleDir, file), 'utf-8');
|
|
145
|
+
const bundle = JSON.parse(content);
|
|
146
|
+
if (bundle.task && bundle.task.toLowerCase().includes(task.toLowerCase().slice(0, 40))) {
|
|
147
|
+
return bundle;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch { /* ignore */ }
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
function computeDiff(original, replay) {
|
|
155
|
+
const origPaths = new Map(original.files.map((f) => [f.path, f.score]));
|
|
156
|
+
const replayPaths = new Map(replay.files.map((f) => [f.path, f.score]));
|
|
157
|
+
const added = [];
|
|
158
|
+
const removed = [];
|
|
159
|
+
const scoreChanged = [];
|
|
160
|
+
let overlapCount = 0;
|
|
161
|
+
for (const [path, score] of replayPaths) {
|
|
162
|
+
if (!origPaths.has(path)) {
|
|
163
|
+
added.push(path);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
overlapCount++;
|
|
167
|
+
const origScore = origPaths.get(path);
|
|
168
|
+
const delta = score - origScore;
|
|
169
|
+
if (Math.abs(delta) > 0.005) {
|
|
170
|
+
scoreChanged.push({ path, oldScore: origScore, newScore: score, delta });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const path of origPaths.keys()) {
|
|
175
|
+
if (!replayPaths.has(path)) {
|
|
176
|
+
removed.push(path);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return { added, removed, scoreChanged, overlapCount };
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/serve.d.ts
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* GET /health → { status: "ok", version: "..." }
|
|
9
9
|
* POST /verify → JSON verify result (body: { task, flags? })
|
|
10
10
|
* POST /bundle → JSON bundle result (body: { task, flags? })
|
|
11
|
+
* GET /metrics → team-metrics JSON (if team-ledger exists)
|
|
12
|
+
* GET /provenance → provenance graph JSON
|
|
13
|
+
* GET /policy → policy evaluation results
|
|
11
14
|
*/
|
|
12
15
|
export declare function runServe(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
13
16
|
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA2Df"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
2
4
|
import { runBundle } from './bundle.js';
|
|
3
5
|
import { runVerify } from './verify.js';
|
|
4
6
|
/**
|
|
@@ -11,6 +13,9 @@ import { runVerify } from './verify.js';
|
|
|
11
13
|
* GET /health → { status: "ok", version: "..." }
|
|
12
14
|
* POST /verify → JSON verify result (body: { task, flags? })
|
|
13
15
|
* POST /bundle → JSON bundle result (body: { task, flags? })
|
|
16
|
+
* GET /metrics → team-metrics JSON (if team-ledger exists)
|
|
17
|
+
* GET /provenance → provenance graph JSON
|
|
18
|
+
* GET /policy → policy evaluation results
|
|
14
19
|
*/
|
|
15
20
|
export async function runServe(cwd, flags) {
|
|
16
21
|
const port = parseInt(flags['port'] ?? '7400', 10);
|
|
@@ -39,8 +44,20 @@ export async function runServe(cwd, flags) {
|
|
|
39
44
|
else if (url === '/bundle' && req.method === 'POST') {
|
|
40
45
|
await handleBundle(req, res, cwd);
|
|
41
46
|
}
|
|
47
|
+
else if (url === '/metrics' && req.method === 'GET') {
|
|
48
|
+
await handleMetrics(res, cwd);
|
|
49
|
+
}
|
|
50
|
+
else if (url === '/provenance' && req.method === 'GET') {
|
|
51
|
+
await handleProvenance(res, cwd);
|
|
52
|
+
}
|
|
53
|
+
else if (url === '/policy' && req.method === 'GET') {
|
|
54
|
+
await handlePolicy(res, cwd);
|
|
55
|
+
}
|
|
42
56
|
else {
|
|
43
|
-
sendJson(res, 404, {
|
|
57
|
+
sendJson(res, 404, {
|
|
58
|
+
error: 'Not found',
|
|
59
|
+
endpoints: ['/health', '/verify', '/bundle', '/metrics', '/provenance', '/policy'],
|
|
60
|
+
});
|
|
44
61
|
}
|
|
45
62
|
}
|
|
46
63
|
catch (err) {
|
|
@@ -55,6 +72,9 @@ export async function runServe(cwd, flags) {
|
|
|
55
72
|
console.log(` GET http://localhost:${port}/health`);
|
|
56
73
|
console.log(` POST http://localhost:${port}/verify { "task": "..." }`);
|
|
57
74
|
console.log(` POST http://localhost:${port}/bundle { "task": "..." }`);
|
|
75
|
+
console.log(` GET http://localhost:${port}/metrics`);
|
|
76
|
+
console.log(` GET http://localhost:${port}/provenance`);
|
|
77
|
+
console.log(` GET http://localhost:${port}/policy`);
|
|
58
78
|
console.log('');
|
|
59
79
|
console.log('Press Ctrl+C to stop.');
|
|
60
80
|
});
|
|
@@ -104,6 +124,58 @@ async function handleBundle(req, res, cwd) {
|
|
|
104
124
|
const result = await captureOutput(() => runBundle(cwd, bundleFlags));
|
|
105
125
|
sendJsonRaw(res, 200, result.stdout);
|
|
106
126
|
}
|
|
127
|
+
async function handleMetrics(res, cwd) {
|
|
128
|
+
try {
|
|
129
|
+
const { computeTeamMetrics } = await import('@codeledger/engine');
|
|
130
|
+
// computeTeamMetrics requires (repoRoot, snapshots[]) — pass empty for API summary
|
|
131
|
+
const metrics = computeTeamMetrics(cwd, []);
|
|
132
|
+
sendJson(res, 200, metrics);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
const metricsPath = join(cwd, '.codeledger', 'team-ledger', 'entries.jsonl');
|
|
136
|
+
if (!existsSync(metricsPath)) {
|
|
137
|
+
sendJson(res, 200, { score: 0, sessionCount: 0, message: 'No team-ledger data yet. Run: codeledger team-ledger sync' });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
141
|
+
sendJson(res, 500, { error: 'Failed to compute metrics', message });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function handleProvenance(res, cwd) {
|
|
146
|
+
try {
|
|
147
|
+
const { loadGraph } = await import('@codeledger/engine');
|
|
148
|
+
const graph = loadGraph(cwd);
|
|
149
|
+
sendJson(res, 200, graph);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
const provPath = join(cwd, '.codeledger', 'provenance');
|
|
153
|
+
if (!existsSync(provPath)) {
|
|
154
|
+
sendJson(res, 200, { nodes: [], edges: [], message: 'No provenance data yet.' });
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
158
|
+
sendJson(res, 500, { error: 'Failed to load provenance graph', message });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function handlePolicy(res, cwd) {
|
|
163
|
+
try {
|
|
164
|
+
const { loadTeamPolicy } = await import('@codeledger/engine');
|
|
165
|
+
const policy = loadTeamPolicy(cwd);
|
|
166
|
+
sendJson(res, 200, { policy, rules: policy.rules.length });
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
const policyPath = join(cwd, '.codeledger', 'team-policy.json');
|
|
170
|
+
if (!existsSync(policyPath)) {
|
|
171
|
+
sendJson(res, 200, { policy: null, message: 'No team policy configured. Run: codeledger policy' });
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
175
|
+
sendJson(res, 500, { error: 'Failed to load policy', message });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
107
179
|
// ─── Utilities ────────────────────────────────────────────────────────────────
|
|
108
180
|
function sendJson(res, status, data) {
|
|
109
181
|
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,7 @@ function cleanPidMarkers(cwd, sessionId) {
|
|
|
65
65
|
function cleanLegacyRefs(cwd) {
|
|
66
66
|
const paths = [
|
|
67
67
|
join(cwd, '.codeledger', '.hook-reminded'),
|
|
68
|
+
join(cwd, '.codeledger', '.out-of-bundle-edits'),
|
|
68
69
|
join(cwd, '.codeledger', '.session-start-ref'),
|
|
69
70
|
join(cwd, '.codeledger', '.activate-ref'),
|
|
70
71
|
join(cwd, '.codeledger', '.task-history.jsonl'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-cleanup.js","sourceRoot":"","sources":["../../src/commands/session-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EACX,KAA6B;IAE7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,2DAA2D;QAC3D,eAAe,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAElC,+BAA+B;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,kDAAkD;IAClD,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAEhC,6DAA6D;IAC7D,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,SAAiB;IACrD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO;IAEvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;gBAC9C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1B,UAAU,CAAC,UAAU,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,sBAAsB;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,gBAAgB,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,oBAAoB,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,eAAe,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,qBAAqB,CAAC;QAC/C,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,qBAAqB,CAAC;KAChD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"session-cleanup.js","sourceRoot":"","sources":["../../src/commands/session-cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-summary.d.ts","sourceRoot":"","sources":["../../src/commands/session-summary.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"session-summary.d.ts","sourceRoot":"","sources":["../../src/commands/session-summary.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Jf"}
|
|
@@ -50,12 +50,18 @@ export async function runSessionSummary(cwd, flags) {
|
|
|
50
50
|
// ── Compute overlap metrics ─────────────────────────────────────────────
|
|
51
51
|
const bundleFiles = bundle.files.map((f) => f.path);
|
|
52
52
|
const overlap = filesChanged.filter((f) => bundleFiles.includes(f));
|
|
53
|
+
const regretFiles = filesChanged.filter((f) => !bundleFiles.includes(f));
|
|
53
54
|
const recall = filesChanged.length > 0
|
|
54
55
|
? overlap.length / filesChanged.length
|
|
55
56
|
: 0;
|
|
56
57
|
const precision = bundleFiles.length > 0
|
|
57
58
|
? overlap.length / bundleFiles.length
|
|
58
59
|
: 0;
|
|
60
|
+
// ── Split recall: edit-recall vs creation-recall ──────────────────────
|
|
61
|
+
// Files that existed before the session (edits) vs files that were created
|
|
62
|
+
// during the session (new). Only edit-recall is meaningful — bundles
|
|
63
|
+
// can't predict files that don't exist yet.
|
|
64
|
+
const { editedFiles, createdFiles } = classifyEditedVsCreated(cwd, filesChanged, sessionId);
|
|
59
65
|
// ── Estimate repo-wide token count for context reduction ────────────────
|
|
60
66
|
const repoTokens = estimateRepoTokens(cwd, config);
|
|
61
67
|
const reductionPct = repoTokens > 0
|
|
@@ -98,6 +104,11 @@ export async function runSessionSummary(cwd, flags) {
|
|
|
98
104
|
// Non-fatal: review coverage is optional enrichment
|
|
99
105
|
}
|
|
100
106
|
}
|
|
107
|
+
// Compute edit-recall: recall only over files that existed pre-session
|
|
108
|
+
const editOverlap = editedFiles.filter((f) => bundleFiles.includes(f));
|
|
109
|
+
const editRecall = editedFiles.length > 0
|
|
110
|
+
? editOverlap.length / editedFiles.length
|
|
111
|
+
: 0;
|
|
101
112
|
const summary = {
|
|
102
113
|
bundle_id: bundle.bundle_id,
|
|
103
114
|
task: bundle.task,
|
|
@@ -106,6 +117,8 @@ export async function runSessionSummary(cwd, flags) {
|
|
|
106
117
|
files_overlapping: overlap,
|
|
107
118
|
recall,
|
|
108
119
|
precision,
|
|
120
|
+
edit_recall: editRecall,
|
|
121
|
+
created_file_count: createdFiles.length,
|
|
109
122
|
bundle_tokens: bundle.total_tokens,
|
|
110
123
|
repo_total_tokens: repoTokens,
|
|
111
124
|
context_reduction_pct: reductionPct,
|
|
@@ -118,6 +131,8 @@ export async function runSessionSummary(cwd, flags) {
|
|
|
118
131
|
checkpoint_count: checkpointCount > 0 ? checkpointCount : undefined,
|
|
119
132
|
bundle_invalidation: bundleInvalidation ?? undefined,
|
|
120
133
|
review_coverage: reviewCoverage,
|
|
134
|
+
regret_files: regretFiles.length > 0 ? regretFiles : undefined,
|
|
135
|
+
regret_ratio: filesChanged.length > 0 ? regretFiles.length / filesChanged.length : undefined,
|
|
121
136
|
};
|
|
122
137
|
// ── Intent drift evaluation ───────────────────────────────────────────
|
|
123
138
|
const intentDrift = evaluateDrift(cwd, sessionId);
|
|
@@ -246,17 +261,46 @@ function printRecap(s, intentDrift, scopeDriftFiles, prefillTask, shadowFiles, t
|
|
|
246
261
|
lines.push(` Task breadth: ${s.files_changed.length} files touched`);
|
|
247
262
|
}
|
|
248
263
|
else if (f1 < 0.3) {
|
|
249
|
-
// Bundle was not useful —
|
|
264
|
+
// Bundle was not useful — diagnose why
|
|
250
265
|
lines.push(` Bundle missed: predicted ${s.files_overlapping.length}/${s.files_changed.length} files you changed (${recallPct}% recall)`);
|
|
251
266
|
lines.push(` Bundle accuracy: ${s.files_overlapping.length}/${s.bundle_files.length} bundled files were relevant (${precisionPct}% precision)`);
|
|
252
|
-
|
|
253
|
-
|
|
267
|
+
// Classify the session pattern to give actionable advice
|
|
268
|
+
const sessionPattern = classifySessionPattern(s.files_changed);
|
|
269
|
+
if (sessionPattern.isInfrastructure) {
|
|
270
|
+
lines.push(` Pattern: infrastructure/ops session — ${sessionPattern.infraFileCount} of ${s.files_changed.length} files are infra (migrations, docker, scripts, k8s, terraform).`);
|
|
271
|
+
lines.push(` Assessment: Bundle recall is not meaningful for infrastructure tasks. Bundles target source code edits.`);
|
|
272
|
+
}
|
|
273
|
+
else if (sessionPattern.newFileRatio > 0.5) {
|
|
274
|
+
lines.push(` Pattern: exploratory session — ${sessionPattern.newFileCount} of ${s.files_changed.length} files were created (not predictable).`);
|
|
275
|
+
lines.push(` Tip: Bundles work best for focused edits to existing code. For scaffolding/new-file tasks, low recall is expected.`);
|
|
276
|
+
}
|
|
277
|
+
else if (s.files_changed.length > 50) {
|
|
278
|
+
lines.push(` Pattern: broad session (${s.files_changed.length} files touched). Bundle targets focused tasks.`);
|
|
279
|
+
lines.push(` Tip: For multi-phase work, refresh the bundle between phases: "codeledger activate --task \\"...\\"".`);
|
|
280
|
+
}
|
|
281
|
+
else if (s.recall === 0 && s.precision > 0) {
|
|
282
|
+
// Zero recall but bundle had files — work diverged from task
|
|
283
|
+
lines.push(` Pattern: work diverged from task — none of the ${s.files_changed.length} files you touched were in the bundle.`);
|
|
284
|
+
lines.push(` This often means the task changed mid-session. The bundle may have been correct for the original intent.`);
|
|
285
|
+
lines.push(` Tip: Refresh with "codeledger activate --task \\"your current goal\\"" when changing direction.`);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
lines.push(` The bundle was not useful for this task.`);
|
|
289
|
+
lines.push(` Tip: Re-run "codeledger activate --task ${prefillTask ? `"${s.task}"` : '...'}" with a more specific task description.`);
|
|
290
|
+
}
|
|
254
291
|
}
|
|
255
292
|
else if (s.recall < 0.5) {
|
|
256
293
|
// Bundle was partially useful — show all stats but highlight room to improve
|
|
257
294
|
lines.push(` Bundle predicted ${s.files_overlapping.length}/${s.files_changed.length} files you changed (${recallPct}% recall)`);
|
|
258
295
|
lines.push(` Bundle accuracy: ${s.files_overlapping.length}/${s.bundle_files.length} bundled files were relevant (${precisionPct}% precision)`);
|
|
259
296
|
lines.push(` Context: ~${fmtTokens(s.bundle_tokens)} tokens vs ~${fmtTokens(s.repo_total_tokens)} full repo (${reductionPct}% reduction)`);
|
|
297
|
+
const tokensSavedPartial = s.repo_total_tokens - s.bundle_tokens;
|
|
298
|
+
if (tokensSavedPartial > 0) {
|
|
299
|
+
const dollarsSavedPartial = (tokensSavedPartial / 1_000_000) * 3;
|
|
300
|
+
if (dollarsSavedPartial >= 0.01) {
|
|
301
|
+
lines.push(` Est. savings: ~$${dollarsSavedPartial.toFixed(2)} per task (at $3/M input tokens)`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
260
304
|
lines.push(` Tip: A more specific task description may improve recall.`);
|
|
261
305
|
}
|
|
262
306
|
else {
|
|
@@ -264,6 +308,30 @@ function printRecap(s, intentDrift, scopeDriftFiles, prefillTask, shadowFiles, t
|
|
|
264
308
|
lines.push(` Bundle predicted ${s.files_overlapping.length}/${s.files_changed.length} files you changed (${recallPct}% recall)`);
|
|
265
309
|
lines.push(` Bundle accuracy: ${s.files_overlapping.length}/${s.bundle_files.length} bundled files were relevant (${precisionPct}% precision)`);
|
|
266
310
|
lines.push(` Context: ~${fmtTokens(s.bundle_tokens)} tokens vs ~${fmtTokens(s.repo_total_tokens)} full repo (${reductionPct}% reduction)`);
|
|
311
|
+
const tokensSaved = s.repo_total_tokens - s.bundle_tokens;
|
|
312
|
+
if (tokensSaved > 0) {
|
|
313
|
+
const dollarsSaved = (tokensSaved / 1_000_000) * 3;
|
|
314
|
+
if (dollarsSaved >= 0.01) {
|
|
315
|
+
lines.push(` Est. savings: ~$${dollarsSaved.toFixed(2)} per task (at $3/M input tokens)`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// ── Split recall annotation ─────────────────────────────────────────
|
|
320
|
+
// When files were created during the session, show edit-recall separately
|
|
321
|
+
// since bundle recall for new files is inherently 0%.
|
|
322
|
+
// Lead with edit-recall when new files significantly impact raw recall.
|
|
323
|
+
if (s.created_file_count !== undefined && s.created_file_count > 0 && !isRepoScan) {
|
|
324
|
+
const editRecallPct = s.edit_recall !== undefined ? Math.round(s.edit_recall * 100) : recallPct;
|
|
325
|
+
const editedCount = s.files_changed.length - s.created_file_count;
|
|
326
|
+
const creationRatio = s.created_file_count / s.files_changed.length;
|
|
327
|
+
if (creationRatio >= 0.3) {
|
|
328
|
+
// New files significantly drag down raw recall — highlight edit-recall as primary metric
|
|
329
|
+
lines.push(` >> Edit-recall: ${editRecallPct}% (${editedCount} existing files) — this is the meaningful metric`);
|
|
330
|
+
lines.push(` ${s.created_file_count} new file${s.created_file_count === 1 ? ' was' : 's were'} created (bundles cannot predict files that don't exist yet)`);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
lines.push(` Edit-recall: ${editRecallPct}% (${editedCount} existing files) | ${s.created_file_count} new file${s.created_file_count === 1 ? '' : 's'} created (not predictable)`);
|
|
334
|
+
}
|
|
267
335
|
}
|
|
268
336
|
// ── Debt injection section ───────────────────────────────────────────
|
|
269
337
|
if (s.debt && s.debt.total_suppressions > 0) {
|
|
@@ -307,6 +375,16 @@ function printRecap(s, intentDrift, scopeDriftFiles, prefillTask, shadowFiles, t
|
|
|
307
375
|
}
|
|
308
376
|
}
|
|
309
377
|
}
|
|
378
|
+
// ── Regret metric (missed files) ────────────────────────────────
|
|
379
|
+
if (s.regret_files && s.regret_files.length > 0 && !isRepoScan && s.recall < 0.9) {
|
|
380
|
+
lines.push(` Missed files: ${s.regret_files.length} file${s.regret_files.length === 1 ? '' : 's'} changed but not in bundle`);
|
|
381
|
+
for (const f of s.regret_files.slice(0, 5)) {
|
|
382
|
+
lines.push(` - ${f}`);
|
|
383
|
+
}
|
|
384
|
+
if (s.regret_files.length > 5) {
|
|
385
|
+
lines.push(` ... and ${s.regret_files.length - 5} more`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
310
388
|
// ── Conflict zone touches section ─────────────────────────────────
|
|
311
389
|
if (s.conflict_zone_touches !== undefined && s.conflict_zone_touches > 0) {
|
|
312
390
|
lines.push(` Conflict zones: ${s.conflict_zone_touches} contested file${s.conflict_zone_touches === 1 ? '' : 's'} were modified`);
|
|
@@ -361,6 +439,105 @@ function printRecap(s, intentDrift, scopeDriftFiles, prefillTask, shadowFiles, t
|
|
|
361
439
|
lines.push('');
|
|
362
440
|
console.log(lines.join('\n'));
|
|
363
441
|
}
|
|
442
|
+
function classifySessionPattern(filesChanged) {
|
|
443
|
+
// Detect new files by checking git status for untracked/newly added
|
|
444
|
+
let newFileCount = 0;
|
|
445
|
+
try {
|
|
446
|
+
const untrackedRaw = execSync('git ls-files --others --exclude-standard', {
|
|
447
|
+
encoding: 'utf-8',
|
|
448
|
+
timeout: 5000,
|
|
449
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
450
|
+
}).trim();
|
|
451
|
+
const untracked = new Set(untrackedRaw ? untrackedRaw.split('\n') : []);
|
|
452
|
+
// Also check for files that were added in commits (new file mode)
|
|
453
|
+
const addedRaw = execSync('git diff --diff-filter=A --name-only HEAD~20..HEAD 2>/dev/null || echo ""', {
|
|
454
|
+
encoding: 'utf-8',
|
|
455
|
+
timeout: 5000,
|
|
456
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
457
|
+
}).trim();
|
|
458
|
+
const added = new Set(addedRaw ? addedRaw.split('\n') : []);
|
|
459
|
+
for (const f of filesChanged) {
|
|
460
|
+
if (untracked.has(f) || added.has(f)) {
|
|
461
|
+
newFileCount++;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// Non-fatal — fall back to 0 new files
|
|
467
|
+
}
|
|
468
|
+
const newFileRatio = filesChanged.length > 0 ? newFileCount / filesChanged.length : 0;
|
|
469
|
+
// Detect infrastructure-heavy sessions by checking if changed files are
|
|
470
|
+
// predominantly config/migration/infra files rather than source code.
|
|
471
|
+
// Infrastructure file patterns — match directory names and filenames, not
|
|
472
|
+
// substrings, to avoid false positives (e.g. "src/docker-utils.ts" is NOT infra).
|
|
473
|
+
const infraPatterns = [
|
|
474
|
+
/migrations?\//i, /\.sql$/i, /\.env(\.|$)/i,
|
|
475
|
+
/(?:^|\/)dockerfile/i, /(?:^|\/)docker-compose/i,
|
|
476
|
+
/(?:^|\/)makefile$/i, /\.sh$/i,
|
|
477
|
+
/(?:^|\/)k8s\//i, /(?:^|\/)kubernetes\//i, /(?:^|\/)helm\//i,
|
|
478
|
+
/(?:^|\/)terraform\//i, /\.tf$/i, /\.tfvars$/i,
|
|
479
|
+
/(?:^|\/)deploy\//i, /(?:^|\/)infra\//i, /(?:^|\/)infrastructure\//i,
|
|
480
|
+
/(?:^|\/)scripts?\//i, /\.github\//i, /ci\.ya?ml$/i,
|
|
481
|
+
];
|
|
482
|
+
const infraFileCount = filesChanged.filter((f) => infraPatterns.some((pat) => pat.test(f))).length;
|
|
483
|
+
const infraRatio = filesChanged.length > 0 ? infraFileCount / filesChanged.length : 0;
|
|
484
|
+
const isInfrastructure = infraRatio > 0.5 || (filesChanged.length <= 3 && infraFileCount > 0);
|
|
485
|
+
return {
|
|
486
|
+
newFileCount,
|
|
487
|
+
newFileRatio,
|
|
488
|
+
isExploratory: newFileRatio > 0.5,
|
|
489
|
+
isBroad: filesChanged.length > 50,
|
|
490
|
+
isInfrastructure,
|
|
491
|
+
infraFileCount,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Classify changed files into edits (pre-existing files modified) vs creations
|
|
496
|
+
* (new files added during the session). This allows split recall reporting:
|
|
497
|
+
* edit-recall measures bundle accuracy for predictable changes, while
|
|
498
|
+
* creation-recall is always 0 (bundles can't predict files that don't exist).
|
|
499
|
+
*/
|
|
500
|
+
function classifyEditedVsCreated(cwd, filesChanged, sessionId) {
|
|
501
|
+
const createdPaths = new Set();
|
|
502
|
+
try {
|
|
503
|
+
// Untracked files = definitely created this session
|
|
504
|
+
const untrackedRaw = execSync('git ls-files --others --exclude-standard', {
|
|
505
|
+
cwd,
|
|
506
|
+
encoding: 'utf-8',
|
|
507
|
+
timeout: 5000,
|
|
508
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
509
|
+
}).trim();
|
|
510
|
+
if (untrackedRaw) {
|
|
511
|
+
for (const f of untrackedRaw.split('\n'))
|
|
512
|
+
createdPaths.add(f);
|
|
513
|
+
}
|
|
514
|
+
// Files added in commits since session start
|
|
515
|
+
const activateRefPath = sessionActivateRef(cwd, sessionId);
|
|
516
|
+
const sessionRefPath = sessionStartRef(cwd, sessionId);
|
|
517
|
+
const refPath = existsSync(activateRefPath) ? activateRefPath : sessionRefPath;
|
|
518
|
+
if (existsSync(refPath)) {
|
|
519
|
+
const startRef = readFileSync(refPath, 'utf-8').trim();
|
|
520
|
+
if (startRef) {
|
|
521
|
+
try {
|
|
522
|
+
const addedRaw = execSync(`git diff --diff-filter=A --name-only ${startRef}..HEAD`, { cwd, encoding: 'utf-8', timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
523
|
+
if (addedRaw) {
|
|
524
|
+
for (const f of addedRaw.split('\n'))
|
|
525
|
+
createdPaths.add(f);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
catch {
|
|
529
|
+
// Non-fatal: ref may not be valid
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
catch {
|
|
535
|
+
// Non-fatal: fall back to treating all files as edits
|
|
536
|
+
}
|
|
537
|
+
const editedFiles = filesChanged.filter((f) => !createdPaths.has(f));
|
|
538
|
+
const createdFiles = filesChanged.filter((f) => createdPaths.has(f));
|
|
539
|
+
return { editedFiles, createdFiles };
|
|
540
|
+
}
|
|
364
541
|
function fmtTokens(n) {
|
|
365
542
|
if (n >= 1000)
|
|
366
543
|
return `${(n / 1000).toFixed(1)}k`;
|