@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.
- package/LICENSE +27 -0
- package/dist/commands/activate.d.ts +18 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +326 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/bundle.d.ts +2 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +144 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/clean.d.ts +2 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +28 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/compare.d.ts +2 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +216 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +135 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +57 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +27 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/session-cleanup.d.ts +11 -0
- package/dist/commands/session-cleanup.d.ts.map +1 -0
- package/dist/commands/session-cleanup.js +81 -0
- package/dist/commands/session-cleanup.js.map +1 -0
- package/dist/commands/session-init.d.ts +10 -0
- package/dist/commands/session-init.d.ts.map +1 -0
- package/dist/commands/session-init.js +46 -0
- package/dist/commands/session-init.js.map +1 -0
- package/dist/commands/session-progress.d.ts +12 -0
- package/dist/commands/session-progress.d.ts.map +1 -0
- package/dist/commands/session-progress.js +259 -0
- package/dist/commands/session-progress.js.map +1 -0
- package/dist/commands/session-summary.d.ts +14 -0
- package/dist/commands/session-summary.d.ts.map +1 -0
- package/dist/commands/session-summary.js +287 -0
- package/dist/commands/session-summary.js.map +1 -0
- package/dist/commands/sessions.d.ts +9 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +60 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/share.d.ts +9 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +275 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +150 -0
- package/dist/index.js.map +1 -0
- package/dist/session-id.d.ts +22 -0
- package/dist/session-id.d.ts.map +1 -0
- package/dist/session-id.js +49 -0
- package/dist/session-id.js.map +1 -0
- package/dist/session-paths.d.ts +23 -0
- package/dist/session-paths.d.ts.map +1 -0
- package/dist/session-paths.js +44 -0
- package/dist/session-paths.js.map +1 -0
- package/dist/session-registry.d.ts +19 -0
- package/dist/session-registry.d.ts.map +1 -0
- package/dist/session-registry.js +180 -0
- package/dist/session-registry.js.map +1 -0
- package/dist/templates/claude-md.d.ts +10 -0
- package/dist/templates/claude-md.d.ts.map +1 -0
- package/dist/templates/claude-md.js +107 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/templates/config.d.ts +3 -0
- package/dist/templates/config.d.ts.map +1 -0
- package/dist/templates/config.js +82 -0
- package/dist/templates/config.js.map +1 -0
- package/dist/templates/harness-pack.d.ts +3 -0
- package/dist/templates/harness-pack.d.ts.map +1 -0
- package/dist/templates/harness-pack.js +26 -0
- package/dist/templates/harness-pack.js.map +1 -0
- package/dist/templates/hooks.d.ts +34 -0
- package/dist/templates/hooks.d.ts.map +1 -0
- package/dist/templates/hooks.js +149 -0
- package/dist/templates/hooks.js.map +1 -0
- package/dist/templates/scenarios.d.ts +3 -0
- package/dist/templates/scenarios.d.ts.map +1 -0
- package/dist/templates/scenarios.js +335 -0
- package/dist/templates/scenarios.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- 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 @@
|
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,QAAgC,EAAE;IAC3E,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAEtC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED,6BAA6B;IAC7B,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;KACnC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;IACf,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACvC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,qBAAqB;IACrB,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,EAClC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACrC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,0BAA0B;IAC1B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;QACpC,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,EAC5C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACzC,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAEjE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;IAExC,oCAAoC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,2BAA2B,CAAC;IAE3C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,KAAK,EAAE,CAAC;gBACV,sDAAsD;gBACtD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC1D,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;YAC1G,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,6DAA6D,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,MAAc,EAAE,UAAkB;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjC,4EAA4E;IAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,2CAA2C;IAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK;QAClB,CAAC,CAAC,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,KAAK;QACpD,CAAC,CAAC,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;IAExC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAsB,CAAC;YAC5E,IAAI,GAAG,CAAC,IAAI;gBAAE,OAAO,GAAG,CAAC,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -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":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,GAAW,EACX,KAA6B;IAE7B,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;QAC7B,YAAY;QACZ,GAAG;QACH,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;QAC3B,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM;QAClC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM;QAChC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,OAAO;QAC7C,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,MAAM;QAC9C,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC;QACnC,iBAAiB,EAAE,KAAK,CAAC,WAAW,CAA8B;QAClE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC;YACvC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;YACvC,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9D,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpE,yDAAyD;IACzD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,OAAO,CAAC,gBAAgB,qBAAqB,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACjH,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,OAAO,CAAC,UAAU,eAAe,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAElE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC,cAAc,YAAY,GAAG,CAAC,SAAS,CAAC,aAAa,UAAU,CAAC,CAAC;QACtI,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|