@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.
Files changed (156) hide show
  1. package/dist/commands/activate.d.ts.map +1 -1
  2. package/dist/commands/activate.js +94 -26
  3. package/dist/commands/activate.js.map +1 -1
  4. package/dist/commands/ci.d.ts +16 -0
  5. package/dist/commands/ci.d.ts.map +1 -0
  6. package/dist/commands/ci.js +323 -0
  7. package/dist/commands/ci.js.map +1 -0
  8. package/dist/commands/commit-msg.d.ts +58 -0
  9. package/dist/commands/commit-msg.d.ts.map +1 -0
  10. package/dist/commands/commit-msg.js +461 -0
  11. package/dist/commands/commit-msg.js.map +1 -0
  12. package/dist/commands/compare.d.ts.map +1 -1
  13. package/dist/commands/compare.js +8 -0
  14. package/dist/commands/compare.js.map +1 -1
  15. package/dist/commands/context.d.ts +17 -0
  16. package/dist/commands/context.d.ts.map +1 -0
  17. package/dist/commands/context.js +687 -0
  18. package/dist/commands/context.js.map +1 -0
  19. package/dist/commands/doctor.d.ts.map +1 -1
  20. package/dist/commands/doctor.js +65 -0
  21. package/dist/commands/doctor.js.map +1 -1
  22. package/dist/commands/enable.d.ts +7 -0
  23. package/dist/commands/enable.d.ts.map +1 -0
  24. package/dist/commands/enable.js +75 -0
  25. package/dist/commands/enable.js.map +1 -0
  26. package/dist/commands/features.d.ts +2 -0
  27. package/dist/commands/features.d.ts.map +1 -0
  28. package/dist/commands/features.js +182 -0
  29. package/dist/commands/features.js.map +1 -0
  30. package/dist/commands/init.d.ts.map +1 -1
  31. package/dist/commands/init.js +22 -1
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/intent.d.ts +5 -3
  34. package/dist/commands/intent.d.ts.map +1 -1
  35. package/dist/commands/intent.js +135 -4
  36. package/dist/commands/intent.js.map +1 -1
  37. package/dist/commands/ledger.d.ts +14 -0
  38. package/dist/commands/ledger.d.ts.map +1 -0
  39. package/dist/commands/ledger.js +128 -0
  40. package/dist/commands/ledger.js.map +1 -0
  41. package/dist/commands/license.d.ts +45 -0
  42. package/dist/commands/license.d.ts.map +1 -0
  43. package/dist/commands/license.js +240 -0
  44. package/dist/commands/license.js.map +1 -0
  45. package/dist/commands/orchestrate.d.ts +12 -0
  46. package/dist/commands/orchestrate.d.ts.map +1 -0
  47. package/dist/commands/orchestrate.js +119 -0
  48. package/dist/commands/orchestrate.js.map +1 -0
  49. package/dist/commands/policy-simulate.d.ts +9 -0
  50. package/dist/commands/policy-simulate.d.ts.map +1 -0
  51. package/dist/commands/policy-simulate.js +46 -0
  52. package/dist/commands/policy-simulate.js.map +1 -0
  53. package/dist/commands/pr-summary.d.ts +59 -0
  54. package/dist/commands/pr-summary.d.ts.map +1 -0
  55. package/dist/commands/pr-summary.js +524 -0
  56. package/dist/commands/pr-summary.js.map +1 -0
  57. package/dist/commands/provenance.d.ts +10 -0
  58. package/dist/commands/provenance.d.ts.map +1 -0
  59. package/dist/commands/provenance.js +87 -0
  60. package/dist/commands/provenance.js.map +1 -0
  61. package/dist/commands/replay.d.ts +2 -0
  62. package/dist/commands/replay.d.ts.map +1 -0
  63. package/dist/commands/replay.js +181 -0
  64. package/dist/commands/replay.js.map +1 -0
  65. package/dist/commands/serve.d.ts +3 -0
  66. package/dist/commands/serve.d.ts.map +1 -1
  67. package/dist/commands/serve.js +73 -1
  68. package/dist/commands/serve.js.map +1 -1
  69. package/dist/commands/session-cleanup.js +1 -0
  70. package/dist/commands/session-cleanup.js.map +1 -1
  71. package/dist/commands/session-summary.d.ts.map +1 -1
  72. package/dist/commands/session-summary.js +180 -3
  73. package/dist/commands/session-summary.js.map +1 -1
  74. package/dist/commands/setup-ci.d.ts +17 -1
  75. package/dist/commands/setup-ci.d.ts.map +1 -1
  76. package/dist/commands/setup-ci.js +202 -51
  77. package/dist/commands/setup-ci.js.map +1 -1
  78. package/dist/commands/share.js +1 -1
  79. package/dist/commands/share.js.map +1 -1
  80. package/dist/commands/stats.d.ts +8 -0
  81. package/dist/commands/stats.d.ts.map +1 -0
  82. package/dist/commands/stats.js +164 -0
  83. package/dist/commands/stats.js.map +1 -0
  84. package/dist/commands/team-ledger.d.ts +11 -0
  85. package/dist/commands/team-ledger.d.ts.map +1 -0
  86. package/dist/commands/team-ledger.js +74 -0
  87. package/dist/commands/team-ledger.js.map +1 -0
  88. package/dist/commands/team-metrics.d.ts +8 -0
  89. package/dist/commands/team-metrics.d.ts.map +1 -0
  90. package/dist/commands/team-metrics.js +57 -0
  91. package/dist/commands/team-metrics.js.map +1 -0
  92. package/dist/commands/upgrade.d.ts +6 -0
  93. package/dist/commands/upgrade.d.ts.map +1 -0
  94. package/dist/commands/upgrade.js +39 -0
  95. package/dist/commands/upgrade.js.map +1 -0
  96. package/dist/commands/verify.d.ts.map +1 -1
  97. package/dist/commands/verify.js +35 -3
  98. package/dist/commands/verify.js.map +1 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +256 -36
  101. package/dist/index.js.map +1 -1
  102. package/dist/intent/extractor.d.ts +15 -0
  103. package/dist/intent/extractor.d.ts.map +1 -0
  104. package/dist/intent/extractor.js +149 -0
  105. package/dist/intent/extractor.js.map +1 -0
  106. package/dist/intent/fetcher.d.ts +33 -0
  107. package/dist/intent/fetcher.d.ts.map +1 -0
  108. package/dist/intent/fetcher.js +364 -0
  109. package/dist/intent/fetcher.js.map +1 -0
  110. package/dist/intent/loader.d.ts +26 -0
  111. package/dist/intent/loader.d.ts.map +1 -0
  112. package/dist/intent/loader.js +80 -0
  113. package/dist/intent/loader.js.map +1 -0
  114. package/dist/intent/types.d.ts +33 -0
  115. package/dist/intent/types.d.ts.map +1 -0
  116. package/dist/intent/types.js +9 -0
  117. package/dist/intent/types.js.map +1 -0
  118. package/dist/project-config.d.ts +38 -0
  119. package/dist/project-config.d.ts.map +1 -0
  120. package/dist/project-config.js +206 -0
  121. package/dist/project-config.js.map +1 -0
  122. package/dist/review-intelligence/detectors/architecture-graph.d.ts +18 -0
  123. package/dist/review-intelligence/detectors/architecture-graph.d.ts.map +1 -0
  124. package/dist/review-intelligence/detectors/architecture-graph.js +73 -0
  125. package/dist/review-intelligence/detectors/architecture-graph.js.map +1 -0
  126. package/dist/review-intelligence/detectors/pack-rules.d.ts +16 -0
  127. package/dist/review-intelligence/detectors/pack-rules.d.ts.map +1 -0
  128. package/dist/review-intelligence/detectors/pack-rules.js +107 -0
  129. package/dist/review-intelligence/detectors/pack-rules.js.map +1 -0
  130. package/dist/review-intelligence/fixes/index.d.ts +18 -0
  131. package/dist/review-intelligence/fixes/index.d.ts.map +1 -1
  132. package/dist/review-intelligence/fixes/index.js +198 -9
  133. package/dist/review-intelligence/fixes/index.js.map +1 -1
  134. package/dist/review-intelligence/index.d.ts +4 -1
  135. package/dist/review-intelligence/index.d.ts.map +1 -1
  136. package/dist/review-intelligence/index.js +20 -3
  137. package/dist/review-intelligence/index.js.map +1 -1
  138. package/dist/review-intelligence/invariants.d.ts +15 -0
  139. package/dist/review-intelligence/invariants.d.ts.map +1 -1
  140. package/dist/review-intelligence/invariants.js +36 -5
  141. package/dist/review-intelligence/invariants.js.map +1 -1
  142. package/dist/review-intelligence/types.d.ts +16 -12
  143. package/dist/review-intelligence/types.d.ts.map +1 -1
  144. package/dist/review-intelligence/types.js +9 -1
  145. package/dist/review-intelligence/types.js.map +1 -1
  146. package/dist/templates/claude-md.d.ts.map +1 -1
  147. package/dist/templates/claude-md.js +32 -127
  148. package/dist/templates/claude-md.js.map +1 -1
  149. package/dist/templates/config.js +4 -4
  150. package/dist/templates/config.js.map +1 -1
  151. package/dist/templates/hooks.d.ts +3 -1
  152. package/dist/templates/hooks.d.ts.map +1 -1
  153. package/dist/templates/hooks.js +101 -2
  154. package/dist/templates/hooks.js.map +1 -1
  155. package/package.json +11 -10
  156. package/LICENSE +0 -27
@@ -0,0 +1,2 @@
1
+ export declare function runReplay(cwd: string, flags: Record<string, string>): Promise<void>;
2
+ //# sourceMappingURL=replay.d.ts.map
@@ -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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"}
@@ -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":"AAIA;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
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"}
@@ -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, { error: 'Not found', endpoints: ['/health', '/verify', '/bundle'] });
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":"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"}
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":"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"}
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,CA2If"}
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 — lead with the miss, suppress reduction stat
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
- lines.push(` The bundle was not useful for this task.`);
253
- lines.push(` Tip: Re-run "codeledger activate --task ${prefillTask ? `"${s.task}"` : '...'}" with a more specific task description.`);
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`;