@codeledger/cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +27 -0
  2. package/dist/commands/activate.d.ts +18 -0
  3. package/dist/commands/activate.d.ts.map +1 -0
  4. package/dist/commands/activate.js +326 -0
  5. package/dist/commands/activate.js.map +1 -0
  6. package/dist/commands/bundle.d.ts +2 -0
  7. package/dist/commands/bundle.d.ts.map +1 -0
  8. package/dist/commands/bundle.js +144 -0
  9. package/dist/commands/bundle.js.map +1 -0
  10. package/dist/commands/clean.d.ts +2 -0
  11. package/dist/commands/clean.d.ts.map +1 -0
  12. package/dist/commands/clean.js +28 -0
  13. package/dist/commands/clean.js.map +1 -0
  14. package/dist/commands/compare.d.ts +2 -0
  15. package/dist/commands/compare.d.ts.map +1 -0
  16. package/dist/commands/compare.js +216 -0
  17. package/dist/commands/compare.js.map +1 -0
  18. package/dist/commands/init.d.ts +2 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +135 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/run.d.ts +2 -0
  23. package/dist/commands/run.d.ts.map +1 -0
  24. package/dist/commands/run.js +57 -0
  25. package/dist/commands/run.js.map +1 -0
  26. package/dist/commands/scan.d.ts +2 -0
  27. package/dist/commands/scan.d.ts.map +1 -0
  28. package/dist/commands/scan.js +27 -0
  29. package/dist/commands/scan.js.map +1 -0
  30. package/dist/commands/session-cleanup.d.ts +11 -0
  31. package/dist/commands/session-cleanup.d.ts.map +1 -0
  32. package/dist/commands/session-cleanup.js +81 -0
  33. package/dist/commands/session-cleanup.js.map +1 -0
  34. package/dist/commands/session-init.d.ts +10 -0
  35. package/dist/commands/session-init.d.ts.map +1 -0
  36. package/dist/commands/session-init.js +46 -0
  37. package/dist/commands/session-init.js.map +1 -0
  38. package/dist/commands/session-progress.d.ts +12 -0
  39. package/dist/commands/session-progress.d.ts.map +1 -0
  40. package/dist/commands/session-progress.js +259 -0
  41. package/dist/commands/session-progress.js.map +1 -0
  42. package/dist/commands/session-summary.d.ts +14 -0
  43. package/dist/commands/session-summary.d.ts.map +1 -0
  44. package/dist/commands/session-summary.js +287 -0
  45. package/dist/commands/session-summary.js.map +1 -0
  46. package/dist/commands/sessions.d.ts +9 -0
  47. package/dist/commands/sessions.d.ts.map +1 -0
  48. package/dist/commands/sessions.js +60 -0
  49. package/dist/commands/sessions.js.map +1 -0
  50. package/dist/commands/share.d.ts +9 -0
  51. package/dist/commands/share.d.ts.map +1 -0
  52. package/dist/commands/share.js +275 -0
  53. package/dist/commands/share.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +150 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/session-id.d.ts +22 -0
  59. package/dist/session-id.d.ts.map +1 -0
  60. package/dist/session-id.js +49 -0
  61. package/dist/session-id.js.map +1 -0
  62. package/dist/session-paths.d.ts +23 -0
  63. package/dist/session-paths.d.ts.map +1 -0
  64. package/dist/session-paths.js +44 -0
  65. package/dist/session-paths.js.map +1 -0
  66. package/dist/session-registry.d.ts +19 -0
  67. package/dist/session-registry.d.ts.map +1 -0
  68. package/dist/session-registry.js +180 -0
  69. package/dist/session-registry.js.map +1 -0
  70. package/dist/templates/claude-md.d.ts +10 -0
  71. package/dist/templates/claude-md.d.ts.map +1 -0
  72. package/dist/templates/claude-md.js +107 -0
  73. package/dist/templates/claude-md.js.map +1 -0
  74. package/dist/templates/config.d.ts +3 -0
  75. package/dist/templates/config.d.ts.map +1 -0
  76. package/dist/templates/config.js +82 -0
  77. package/dist/templates/config.js.map +1 -0
  78. package/dist/templates/harness-pack.d.ts +3 -0
  79. package/dist/templates/harness-pack.d.ts.map +1 -0
  80. package/dist/templates/harness-pack.js +26 -0
  81. package/dist/templates/harness-pack.js.map +1 -0
  82. package/dist/templates/hooks.d.ts +34 -0
  83. package/dist/templates/hooks.d.ts.map +1 -0
  84. package/dist/templates/hooks.js +149 -0
  85. package/dist/templates/hooks.js.map +1 -0
  86. package/dist/templates/scenarios.d.ts +3 -0
  87. package/dist/templates/scenarios.d.ts.map +1 -0
  88. package/dist/templates/scenarios.js +335 -0
  89. package/dist/templates/scenarios.js.map +1 -0
  90. package/dist/version.d.ts +2 -0
  91. package/dist/version.d.ts.map +1 -0
  92. package/dist/version.js +5 -0
  93. package/dist/version.js.map +1 -0
  94. package/package.json +45 -0
@@ -0,0 +1,216 @@
1
+ import { writeFileSync, mkdirSync, existsSync, chmodSync, readFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { compareScenario } from '@codeledger/harness';
5
+ /**
6
+ * Detect if we're running inside an AI agent session that would cause
7
+ * nested API call issues when spawning agent subprocesses.
8
+ *
9
+ * Uses two strategies:
10
+ * 1. Environment variables (set by well-known agents)
11
+ * 2. Process-tree fallback: check parent process names for known agents
12
+ */
13
+ function isInsideAgentSession() {
14
+ // Strategy 1: environment variables
15
+ if (process.env['CLAUDE_CODE_SESSION'])
16
+ return 'Claude Code';
17
+ if (process.env['CLAUDE_CODE'])
18
+ return 'Claude Code';
19
+ if (process.env['CURSOR_SESSION'])
20
+ return 'Cursor';
21
+ if (process.env['CODEX_SESSION'])
22
+ return 'Codex';
23
+ if (process.env['AI_AGENT_SESSION'])
24
+ return process.env['AI_AGENT_SESSION'];
25
+ // Strategy 2: process-tree heuristic (Linux/macOS)
26
+ // Walk up parent PIDs looking for known agent process names.
27
+ try {
28
+ const procTree = getParentProcessNames();
29
+ if (procTree.some((name) => name.includes('claude')))
30
+ return 'Claude Code';
31
+ if (procTree.some((name) => name.includes('cursor')))
32
+ return 'Cursor';
33
+ if (procTree.some((name) => name.includes('codex')))
34
+ return 'Codex';
35
+ }
36
+ catch {
37
+ // Non-fatal: skip if /proc or ps not available
38
+ }
39
+ return null;
40
+ }
41
+ /** Walk up the process tree and collect parent process names. */
42
+ function getParentProcessNames() {
43
+ const names = [];
44
+ let pid = process.ppid;
45
+ for (let i = 0; i < 5 && pid > 1; i++) {
46
+ try {
47
+ // Fast path: /proc (Linux)
48
+ const cmdline = readFileSync(`/proc/${pid}/cmdline`, 'utf-8')
49
+ .replace(/\0/g, ' ')
50
+ .trim()
51
+ .toLowerCase();
52
+ names.push(cmdline);
53
+ const status = readFileSync(`/proc/${pid}/status`, 'utf-8');
54
+ const ppidMatch = /PPid:\s+(\d+)/.exec(status);
55
+ pid = ppidMatch ? parseInt(ppidMatch[1], 10) : 0;
56
+ }
57
+ catch {
58
+ // Fallback: ps (macOS)
59
+ try {
60
+ const comm = execSync(`ps -o comm= -p ${pid}`, {
61
+ encoding: 'utf-8',
62
+ timeout: 1000,
63
+ stdio: ['pipe', 'pipe', 'pipe'],
64
+ }).trim().toLowerCase();
65
+ if (comm)
66
+ names.push(comm);
67
+ const ppidStr = execSync(`ps -o ppid= -p ${pid}`, {
68
+ encoding: 'utf-8',
69
+ timeout: 1000,
70
+ stdio: ['pipe', 'pipe', 'pipe'],
71
+ }).trim();
72
+ pid = parseInt(ppidStr, 10) || 0;
73
+ }
74
+ catch {
75
+ break;
76
+ }
77
+ }
78
+ }
79
+ return names;
80
+ }
81
+ export async function runCompare(cwd, flags) {
82
+ const scenarioPath = flags['scenario'];
83
+ if (!scenarioPath) {
84
+ console.error('āŒ --scenario is required. Usage: codeledger compare --scenario <path>');
85
+ process.exit(1);
86
+ }
87
+ const repeats = flags['repeats'] ? parseInt(flags['repeats'], 10) : 3;
88
+ // ── Session-aware execution ─────────────────────────────────────────────
89
+ // If running inside an agent session, spawning nested agent processes will
90
+ // cause API queueing and timeouts. Offer a deferred mode instead.
91
+ const nestedAgent = isInsideAgentSession();
92
+ const forceInline = flags['force-inline'] === 'true';
93
+ if (nestedAgent && !forceInline) {
94
+ // Auto-generate deferred script (no need for the user to add --deferred)
95
+ const scriptPath = writeDeferredScript(cwd, flags, scenarioPath, repeats);
96
+ console.log(`Detected nested ${nestedAgent} session.`);
97
+ console.log('');
98
+ console.log('Running codeledger compare from inside an AI agent session would');
99
+ console.log('cause the spawned agent subprocesses to queue behind this session.');
100
+ console.log('');
101
+ console.log('A ready-to-run script has been generated. Copy and paste this into');
102
+ console.log('a separate terminal:');
103
+ console.log('');
104
+ console.log(` bash ${scriptPath}`);
105
+ console.log('');
106
+ console.log('Or to force inline execution (may timeout): add --force-inline');
107
+ return;
108
+ }
109
+ console.log('šŸ“Š Running A/B comparison...\n');
110
+ console.log(` Scenario: ${scenarioPath}`);
111
+ console.log(` Repeats: ${repeats}`);
112
+ console.log('');
113
+ const report = await compareScenario({
114
+ scenarioPath,
115
+ cwd,
116
+ repeats,
117
+ agentCmd: flags['agentCmd'],
118
+ agentCmdWithout: flags['agentCmdWithout'],
119
+ agentCmdWith: flags['agentCmdWith'],
120
+ guided: flags['guided'] === 'true',
121
+ force: flags['force'] === 'true',
122
+ useWorktree: flags['useWorktree'] !== 'false',
123
+ keepWorktree: flags['keepWorktree'] === 'true',
124
+ worktreeRoot: flags['worktreeRoot'],
125
+ injectionOverride: flags['injection'],
126
+ guidedTimeoutSec: flags['guided-timeout']
127
+ ? parseInt(flags['guided-timeout'], 10)
128
+ : undefined,
129
+ });
130
+ // Write report
131
+ const reportsDir = join(cwd, '.codeledger', 'reports', report.scenario_id);
132
+ if (!existsSync(reportsDir)) {
133
+ mkdirSync(reportsDir, { recursive: true });
134
+ }
135
+ const reportJsonPath = join(reportsDir, 'report.json');
136
+ writeFileSync(reportJsonPath, JSON.stringify(report, null, 2) + '\n');
137
+ // Print summary
138
+ console.log('\n' + '═'.repeat(60));
139
+ console.log('COMPARISON RESULTS');
140
+ console.log('═'.repeat(60));
141
+ console.log(`\n Scenario: ${report.scenario_id}`);
142
+ console.log(` Repo: ${report.repo.name} @ ${report.repo.git_ref}`);
143
+ console.log(` Total runs: ${report.runs.length}`);
144
+ const d = report.aggregate.delta;
145
+ // Headline summary — the number people screenshot
146
+ if (Number.isFinite(d.duration_sec_pct) && d.duration_sec_pct < 0) {
147
+ console.log(`\n šŸš€ CodeLedger reduced duration by ${Math.abs(d.duration_sec_pct)}%\n`);
148
+ }
149
+ console.log(' Delta (with_codeledger vs without):');
150
+ console.log(` Duration: ${formatDelta(d.duration_sec_pct)}%`);
151
+ console.log(` Files read: ${formatDelta(d.files_read_pct)}%`);
152
+ console.log(` Iterations: ${formatDelta(d.iterations_pct)}%`);
153
+ console.log(` Token usage: ${formatDelta(d.token_estimate_pct)}%`);
154
+ console.log(` Success rate: ${d.success_rate_delta >= 0 ? '+' : ''}${d.success_rate_delta}`);
155
+ const o = report.aggregate.outcomes;
156
+ if (o) {
157
+ console.log('\n Outcomes:');
158
+ console.log(` Acceptance rate: ${o.acceptance_rate_without}% -> ${o.acceptance_rate_with}% (${o.acceptance_rate_uplift_pct >= 0 ? '+' : ''}${o.acceptance_rate_uplift_pct}pp)`);
159
+ if (o.median_time_to_acceptance_ms_without !== null && o.median_time_to_acceptance_ms_with !== null) {
160
+ console.log(` Time to acceptance: ${(o.median_time_to_acceptance_ms_without / 1000).toFixed(1)}s -> ${(o.median_time_to_acceptance_ms_with / 1000).toFixed(1)}s`);
161
+ }
162
+ if (o.attempts_until_success_without !== null && o.attempts_until_success_with !== null) {
163
+ console.log(` Attempts: ${o.attempts_until_success_without} -> ${o.attempts_until_success_with}`);
164
+ }
165
+ }
166
+ console.log('\n' + '─'.repeat(60));
167
+ console.log(` Full report: ${reportsDir}/`);
168
+ console.log('');
169
+ }
170
+ function formatDelta(pct) {
171
+ if (!Number.isFinite(pct))
172
+ return 'N/A';
173
+ const sign = pct >= 0 ? '+' : '';
174
+ return `${sign}${pct}`;
175
+ }
176
+ function writeDeferredScript(cwd, flags, scenarioPath, repeats) {
177
+ // Reconstruct the compare command without --deferred, adding --force-inline
178
+ const parts = ['npx codeledger compare'];
179
+ parts.push(`--scenario ${quote(resolve(cwd, scenarioPath))}`);
180
+ parts.push(`--repeats ${repeats}`);
181
+ if (flags['agentCmd'])
182
+ parts.push(`--agentCmd ${quote(flags['agentCmd'])}`);
183
+ if (flags['agentCmdWithout'])
184
+ parts.push(`--agentCmdWithout ${quote(flags['agentCmdWithout'])}`);
185
+ if (flags['agentCmdWith'])
186
+ parts.push(`--agentCmdWith ${quote(flags['agentCmdWith'])}`);
187
+ if (flags['guided'] === 'true')
188
+ parts.push('--guided');
189
+ if (flags['force'] === 'true')
190
+ parts.push('--force');
191
+ if (flags['injection'])
192
+ parts.push(`--injection ${flags['injection']}`);
193
+ if (flags['guided-timeout'])
194
+ parts.push(`--guided-timeout ${flags['guided-timeout']}`);
195
+ const script = `#!/usr/bin/env bash
196
+ # CodeLedger deferred benchmark — generated ${new Date().toISOString()}
197
+ # Run this from a plain terminal (not inside an AI agent session).
198
+ set -euo pipefail
199
+ cd ${quote(cwd)}
200
+ ${parts.join(' \\\n ')}
201
+ `;
202
+ const scriptsDir = join(cwd, '.codeledger', 'scripts');
203
+ if (!existsSync(scriptsDir)) {
204
+ mkdirSync(scriptsDir, { recursive: true });
205
+ }
206
+ const scriptPath = join(scriptsDir, `compare-${Date.now()}.sh`);
207
+ writeFileSync(scriptPath, script);
208
+ chmodSync(scriptPath, 0o755);
209
+ return scriptPath;
210
+ }
211
+ function quote(s) {
212
+ if (/^[a-zA-Z0-9_./-]+$/.test(s))
213
+ return s;
214
+ return `'${s.replace(/'/g, "'\\''")}'`;
215
+ }
216
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runInit(cwd: string, flags?: Record<string, string>): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G5F"}
@@ -0,0 +1,135 @@
1
+ import { writeFileSync, readFileSync, mkdirSync, existsSync, rmSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { defaultConfig } from '../templates/config.js';
4
+ import { defaultHarnessPack } from '../templates/harness-pack.js';
5
+ import { starterScenarios } from '../templates/scenarios.js';
6
+ import { claudeMdSection } from '../templates/claude-md.js';
7
+ import { defaultHooks } from '../templates/hooks.js';
8
+ import { CLI_VERSION } from '../version.js';
9
+ export async function runInit(cwd, flags = {}) {
10
+ console.log(`CodeLedger v${CLI_VERSION}\n`);
11
+ const base = join(cwd, '.codeledger');
12
+ if (existsSync(base)) {
13
+ const force = flags['force'] === 'true';
14
+ if (!force) {
15
+ console.error('āš ļø .codeledger/ already exists. Use --force to overwrite.');
16
+ return;
17
+ }
18
+ rmSync(base, { recursive: true, force: true });
19
+ console.log(' 🧹 Removed existing .codeledger/ (forced overwrite)');
20
+ }
21
+ // Create directory structure
22
+ const dirs = [
23
+ base,
24
+ join(base, 'cache'),
25
+ join(base, 'artifacts'),
26
+ join(base, 'artifacts', 'bundles'),
27
+ join(base, 'reports'),
28
+ join(base, 'worktrees'),
29
+ join(base, 'harness'),
30
+ join(base, 'harness', 'scenarios'),
31
+ ];
32
+ for (const dir of dirs) {
33
+ mkdirSync(dir, { recursive: true });
34
+ }
35
+ // Write config
36
+ const config = defaultConfig();
37
+ writeFileSync(join(base, 'config.json'), JSON.stringify(config, null, 2) + '\n');
38
+ console.log(' āœ… Created .codeledger/config.json');
39
+ // Write harness pack
40
+ const pack = defaultHarnessPack();
41
+ writeFileSync(join(base, 'harness', 'pack.json'), JSON.stringify(pack, null, 2) + '\n');
42
+ console.log(' āœ… Created .codeledger/harness/pack.json');
43
+ // Write starter scenarios
44
+ const scenarios = starterScenarios();
45
+ for (let i = 0; i < scenarios.length; i++) {
46
+ const scenario = scenarios[i];
47
+ const filename = pack.scenarios[i];
48
+ writeFileSync(join(base, 'harness', 'scenarios', filename), JSON.stringify(scenario, null, 2) + '\n');
49
+ }
50
+ console.log(` āœ… Created ${scenarios.length} starter scenarios`);
51
+ const force = flags['force'] === 'true';
52
+ // Write or update CLAUDE.md section
53
+ const claudeMdPath = join(cwd, 'CLAUDE.md');
54
+ const section = claudeMdSection();
55
+ const marker = '## CodeLedger Integration';
56
+ if (existsSync(claudeMdPath)) {
57
+ const existing = readFileSync(claudeMdPath, 'utf-8');
58
+ if (existing.includes(marker)) {
59
+ if (force) {
60
+ // Replace the old CodeLedger section with the new one
61
+ const updated = replaceSection(existing, marker, section);
62
+ writeFileSync(claudeMdPath, updated);
63
+ console.log(' āœ… Updated CodeLedger section in CLAUDE.md');
64
+ }
65
+ else {
66
+ console.log(' ā­ļø CLAUDE.md already contains CodeLedger section — skipped (use --force to overwrite)');
67
+ }
68
+ }
69
+ else {
70
+ writeFileSync(claudeMdPath, existing.trimEnd() + '\n\n' + section);
71
+ console.log(' āœ… Appended CodeLedger section to CLAUDE.md');
72
+ }
73
+ }
74
+ else {
75
+ writeFileSync(claudeMdPath, '# ' + (guessProjectName(cwd) || 'Project') + '\n\n' + section);
76
+ console.log(' āœ… Created CLAUDE.md with CodeLedger section');
77
+ }
78
+ // Write or merge .claude/hooks.json
79
+ const claudeDir = join(cwd, '.claude');
80
+ const hooksPath = join(claudeDir, 'hooks.json');
81
+ const hooks = defaultHooks();
82
+ if (existsSync(hooksPath) && !force) {
83
+ console.log(' ā­ļø .claude/hooks.json already exists — skipped (use --force to overwrite)');
84
+ }
85
+ else {
86
+ mkdirSync(claudeDir, { recursive: true });
87
+ writeFileSync(hooksPath, JSON.stringify(hooks, null, 2) + '\n');
88
+ const verb = existsSync(hooksPath) ? 'Updated' : 'Created';
89
+ console.log(` āœ… ${verb} .claude/hooks.json (auto-summary on commit, session hooks)`);
90
+ }
91
+ console.log('\nāœ… CodeLedger initialized. Next steps:\n');
92
+ console.log(' 1. Activate for your first task:');
93
+ console.log(' codeledger activate --task "describe your task here"\n');
94
+ console.log(' 2. Start your agent — it will read .codeledger/active-bundle.md');
95
+ console.log(' for the most relevant files.\n');
96
+ console.log(' 3. (Optional) Review .codeledger/config.json to tune weights or budget.');
97
+ console.log(' 4. (Optional) Run: codeledger bundle --task "..." --explain');
98
+ console.log(' to see the per-file scoring breakdown.\n');
99
+ console.log(' Verify: codeledger --version');
100
+ }
101
+ /**
102
+ * Replace the CodeLedger section in an existing CLAUDE.md, preserving
103
+ * everything before and after it. The section starts at `marker` and ends
104
+ * at the next `## ` heading (or EOF).
105
+ */
106
+ function replaceSection(content, marker, newSection) {
107
+ const start = content.indexOf(marker);
108
+ if (start === -1)
109
+ return content;
110
+ // Find the next ## heading after the marker (the start of the next section)
111
+ const afterMarker = content.indexOf('\n## ', start + marker.length);
112
+ const before = content.slice(0, start);
113
+ const after = afterMarker !== -1 ? content.slice(afterMarker + 1) : '';
114
+ // Ensure clean join: no excess blank lines
115
+ const trimmedBefore = before.trimEnd();
116
+ const result = after
117
+ ? trimmedBefore + '\n\n' + newSection + '\n' + after
118
+ : trimmedBefore + '\n\n' + newSection;
119
+ return result;
120
+ }
121
+ function guessProjectName(cwd) {
122
+ try {
123
+ const pkgPath = join(cwd, 'package.json');
124
+ if (existsSync(pkgPath)) {
125
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
126
+ if (pkg.name)
127
+ return pkg.name;
128
+ }
129
+ }
130
+ catch {
131
+ // ignore
132
+ }
133
+ return null;
134
+ }
135
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runRun(cwd: string, flags: Record<string, string>): Promise<void>;
2
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Df"}
@@ -0,0 +1,57 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { runScenario } from '@codeledger/harness';
4
+ export async function runRun(cwd, flags) {
5
+ const scenarioPath = flags['scenario'];
6
+ if (!scenarioPath) {
7
+ console.error('āŒ --scenario is required. Usage: codeledger run --scenario <path>');
8
+ process.exit(1);
9
+ }
10
+ console.log('šŸš€ Running scenario...\n');
11
+ const runs = await runScenario({
12
+ scenarioPath,
13
+ cwd,
14
+ agentCmd: flags['agentCmd'],
15
+ guided: flags['guided'] === 'true',
16
+ force: flags['force'] === 'true',
17
+ useWorktree: flags['useWorktree'] !== 'false',
18
+ keepWorktree: flags['keepWorktree'] === 'true',
19
+ worktreeRoot: flags['worktreeRoot'],
20
+ injectionOverride: flags['injection'],
21
+ guidedTimeoutSec: flags['guided-timeout']
22
+ ? parseInt(flags['guided-timeout'], 10)
23
+ : undefined,
24
+ });
25
+ // Write basic report
26
+ const reportsDir = join(cwd, '.codeledger', 'reports');
27
+ if (!existsSync(reportsDir)) {
28
+ mkdirSync(reportsDir, { recursive: true });
29
+ }
30
+ const reportPath = join(reportsDir, `run-${Date.now()}.json`);
31
+ writeFileSync(reportPath, JSON.stringify({ runs }, null, 2) + '\n');
32
+ // Print inline results — don't make the user open a file
33
+ console.log('\n' + '═'.repeat(60));
34
+ console.log('RUN RESULTS');
35
+ console.log('═'.repeat(60));
36
+ for (const run of runs) {
37
+ console.log(`\n Mode: ${run.mode}${run.injection ? ` (${run.injection.mode})` : ' (baseline)'}`);
38
+ console.log(` Duration: ${run.metrics.duration_sec}s`);
39
+ console.log(` Files read: ${run.metrics.files_read_count} | Files changed: ${run.metrics.files_changed_count}`);
40
+ console.log(` Iterations: ${run.metrics.iterations} | Reverts: ${run.metrics.reverts}`);
41
+ console.log(` Token estimate: ~${run.metrics.token_estimate}`);
42
+ console.log(` Accepted: ${run.metrics.accepted ? 'YES' : 'NO'}`);
43
+ const cmds = Object.entries(run.metrics.commands);
44
+ if (cmds.length > 0) {
45
+ for (const [name, result] of cmds) {
46
+ console.log(` ${name}: ${result.pass ? 'PASS' : 'FAIL'}`);
47
+ }
48
+ }
49
+ if (run.injection) {
50
+ console.log(` Bundle: ${run.injection.bundle_id} (${run.injection.selected_files} files, ~${run.injection.bundle_tokens} tokens)`);
51
+ }
52
+ }
53
+ console.log('\n' + '─'.repeat(60));
54
+ console.log(` Full report: ${reportPath}`);
55
+ console.log('');
56
+ }
57
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runScan(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBxD"}
@@ -0,0 +1,27 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { buildRepoIndex } from '@codeledger/repo';
4
+ export async function runScan(cwd) {
5
+ const configPath = join(cwd, '.codeledger', 'config.json');
6
+ if (!existsSync(configPath)) {
7
+ console.error('āŒ No .codeledger/config.json found. Run "codeledger init" first.');
8
+ process.exit(1);
9
+ }
10
+ let config;
11
+ try {
12
+ config = JSON.parse(readFileSync(configPath, 'utf-8'));
13
+ }
14
+ catch {
15
+ console.error('Failed to parse .codeledger/config.json. Check for syntax errors.');
16
+ process.exit(1);
17
+ }
18
+ const outputPath = join(cwd, config.workspace.cache_dir, 'repo-index.json');
19
+ console.log('šŸ” Scanning repository...\n');
20
+ buildRepoIndex({
21
+ root: cwd,
22
+ repoConfig: config.repo,
23
+ outputPath,
24
+ });
25
+ console.log('\nāœ… Scan complete. Run "codeledger bundle --task ..." next.');
26
+ }
27
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAqB,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,cAAc,CAAC;QACb,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `codeledger session-cleanup [--session <id>]`
3
+ *
4
+ * Per-session teardown:
5
+ * 1. Deregisters from registry
6
+ * 2. Removes the session directory
7
+ * 3. Removes PID-tagged marker file
8
+ * 4. If this was the last active session, cleans up the fallback active-bundle.md
9
+ */
10
+ export declare function runSessionCleanup(cwd: string, flags: Record<string, string>): Promise<void>;
11
+ //# sourceMappingURL=session-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/session-cleanup.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,81 @@
1
+ import { rmSync, readFileSync, existsSync, readdirSync, unlinkSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { resolveSessionId } from '../session-id.js';
4
+ import { sessionDir, legacyBundlePath } from '../session-paths.js';
5
+ import { deregisterSession, getActiveSessions } from '../session-registry.js';
6
+ /**
7
+ * `codeledger session-cleanup [--session <id>]`
8
+ *
9
+ * Per-session teardown:
10
+ * 1. Deregisters from registry
11
+ * 2. Removes the session directory
12
+ * 3. Removes PID-tagged marker file
13
+ * 4. If this was the last active session, cleans up the fallback active-bundle.md
14
+ */
15
+ export async function runSessionCleanup(cwd, flags) {
16
+ const sessionId = resolveSessionId({ session: flags['session'] });
17
+ if (!sessionId) {
18
+ // No session to clean up — legacy mode, clean the old refs
19
+ cleanLegacyRefs(cwd);
20
+ return;
21
+ }
22
+ // Deregister from the session registry
23
+ deregisterSession(cwd, sessionId);
24
+ // Remove the session directory
25
+ const dir = sessionDir(cwd, sessionId);
26
+ if (existsSync(dir)) {
27
+ rmSync(dir, { recursive: true, force: true });
28
+ }
29
+ // Remove PID-tagged marker files for this session
30
+ cleanPidMarkers(cwd, sessionId);
31
+ // If no active sessions remain, clean up the fallback bundle
32
+ const remaining = getActiveSessions(cwd);
33
+ if (remaining.length === 0) {
34
+ const fallback = legacyBundlePath(cwd);
35
+ if (existsSync(fallback)) {
36
+ unlinkSync(fallback);
37
+ }
38
+ }
39
+ }
40
+ function cleanPidMarkers(cwd, sessionId) {
41
+ const codeledgerDir = join(cwd, '.codeledger');
42
+ if (!existsSync(codeledgerDir))
43
+ return;
44
+ try {
45
+ const entries = readdirSync(codeledgerDir);
46
+ for (const entry of entries) {
47
+ if (entry.startsWith('.current-session-pid-')) {
48
+ const markerPath = join(codeledgerDir, entry);
49
+ try {
50
+ const content = readFileSync(markerPath, 'utf-8').trim();
51
+ if (content === sessionId) {
52
+ unlinkSync(markerPath);
53
+ }
54
+ }
55
+ catch {
56
+ // Best-effort cleanup
57
+ }
58
+ }
59
+ }
60
+ }
61
+ catch {
62
+ // Non-fatal
63
+ }
64
+ }
65
+ function cleanLegacyRefs(cwd) {
66
+ const paths = [
67
+ join(cwd, '.codeledger', '.hook-reminded'),
68
+ join(cwd, '.codeledger', '.session-start-ref'),
69
+ join(cwd, '.codeledger', '.activate-ref'),
70
+ join(cwd, '.codeledger', 'session-progress.md'),
71
+ ];
72
+ for (const p of paths) {
73
+ if (existsSync(p)) {
74
+ try {
75
+ unlinkSync(p);
76
+ }
77
+ catch { /* best-effort */ }
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=session-cleanup.js.map
@@ -0,0 +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;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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `codeledger session-init`
3
+ *
4
+ * Lightweight command to establish a new session identity.
5
+ * Called from the SessionStart hook to generate a session ID, create
6
+ * the session directory, and register the session. Prints the session
7
+ * ID to stdout for capture in the hook script.
8
+ */
9
+ export declare function runSessionInit(cwd: string, flags: Record<string, string>): Promise<void>;
10
+ //# sourceMappingURL=session-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-init.d.ts","sourceRoot":"","sources":["../../src/commands/session-init.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmCf"}