@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
package/LICENSE
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Intelligent Context AI, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Note: This license applies to the CLI wrapper, types, repository scanning,
|
|
26
|
+
instrumentation, harness, and report packages (the "Plugin"). The scoring
|
|
27
|
+
engine (packages/core-engine/bin/) is licensed separately under LICENSE-CORE.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger activate [--task "..."] [--session <id>]`
|
|
3
|
+
*
|
|
4
|
+
* All-in-one command: scan if stale -> generate bundle -> write active-bundle.md.
|
|
5
|
+
* Designed to be called by agent hooks (Claude Code, Cursor, Codex) so that
|
|
6
|
+
* context is ready before the agent starts working on a task.
|
|
7
|
+
*
|
|
8
|
+
* When called without --task (e.g. from SessionStart hook), only scans the
|
|
9
|
+
* repo index so it's warm for future bundle generation. No bundle is written
|
|
10
|
+
* because there's no real task to select context for.
|
|
11
|
+
*
|
|
12
|
+
* Multi-session: when a --session ID is provided (or resolved from env/PID),
|
|
13
|
+
* all state files are written to .codeledger/sessions/{id}/ instead of the
|
|
14
|
+
* shared .codeledger/ root. A copy is also written to the legacy fallback
|
|
15
|
+
* path for non-session-aware agents.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runActivate(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=activate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAyLf"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, statSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { buildBundleViaEngine } from '@codeledger/core-engine';
|
|
5
|
+
import { buildRepoIndex } from '@codeledger/repo';
|
|
6
|
+
import { renderBundleMarkdown } from '@codeledger/harness';
|
|
7
|
+
import { resolveSessionId } from '../session-id.js';
|
|
8
|
+
import { sessionBundlePath, sessionActivateRef, sessionStartRef, legacyBundlePath, } from '../session-paths.js';
|
|
9
|
+
import { updateSession, findOverlappingFiles } from '../session-registry.js';
|
|
10
|
+
/**
|
|
11
|
+
* `codeledger activate [--task "..."] [--session <id>]`
|
|
12
|
+
*
|
|
13
|
+
* All-in-one command: scan if stale -> generate bundle -> write active-bundle.md.
|
|
14
|
+
* Designed to be called by agent hooks (Claude Code, Cursor, Codex) so that
|
|
15
|
+
* context is ready before the agent starts working on a task.
|
|
16
|
+
*
|
|
17
|
+
* When called without --task (e.g. from SessionStart hook), only scans the
|
|
18
|
+
* repo index so it's warm for future bundle generation. No bundle is written
|
|
19
|
+
* because there's no real task to select context for.
|
|
20
|
+
*
|
|
21
|
+
* Multi-session: when a --session ID is provided (or resolved from env/PID),
|
|
22
|
+
* all state files are written to .codeledger/sessions/{id}/ instead of the
|
|
23
|
+
* shared .codeledger/ root. A copy is also written to the legacy fallback
|
|
24
|
+
* path for non-session-aware agents.
|
|
25
|
+
*/
|
|
26
|
+
export async function runActivate(cwd, flags) {
|
|
27
|
+
const task = flags['task'];
|
|
28
|
+
const quiet = flags['quiet'] === 'true';
|
|
29
|
+
const log = quiet ? (..._args) => { } : console.log;
|
|
30
|
+
const sessionId = resolveSessionId({ session: flags['session'] });
|
|
31
|
+
const configPath = join(cwd, '.codeledger', 'config.json');
|
|
32
|
+
if (!existsSync(configPath)) {
|
|
33
|
+
console.error('No .codeledger/config.json found. Run "codeledger init" first.');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
let config;
|
|
37
|
+
try {
|
|
38
|
+
config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
console.error('Failed to parse .codeledger/config.json. Check for syntax errors.');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const indexPath = join(cwd, config.workspace.cache_dir, 'repo-index.json');
|
|
45
|
+
// -- Step 1: Scan if stale ------------------------------------------------
|
|
46
|
+
const staleSec = flags['stale-after']
|
|
47
|
+
? parsePositiveInt(flags['stale-after'], 'stale-after')
|
|
48
|
+
: 3600; // default: re-scan if index is >1 hour old
|
|
49
|
+
if (isIndexStale(indexPath, staleSec)) {
|
|
50
|
+
log('Repo index is stale or missing -- rescanning...');
|
|
51
|
+
buildRepoIndex({
|
|
52
|
+
root: cwd,
|
|
53
|
+
repoConfig: config.repo,
|
|
54
|
+
outputPath: indexPath,
|
|
55
|
+
log,
|
|
56
|
+
});
|
|
57
|
+
log(' Scan complete.');
|
|
58
|
+
}
|
|
59
|
+
// -- Save session start ref for session-progress (full session view) ------
|
|
60
|
+
// Only write if no ref exists yet (first activate of the session)
|
|
61
|
+
saveSessionStartRef(cwd, sessionId);
|
|
62
|
+
// -- Scan-only mode: no task means just warm the index --------------------
|
|
63
|
+
if (!task) {
|
|
64
|
+
log('Index is warm. Run "codeledger activate --task ..." to generate a context bundle.');
|
|
65
|
+
// Write a placeholder active-bundle.md so the agent knows no bundle exists
|
|
66
|
+
const placeholderContent = [
|
|
67
|
+
'# CodeLedger Context Bundle',
|
|
68
|
+
'',
|
|
69
|
+
'No task specified yet. The repo index has been scanned and is ready.',
|
|
70
|
+
'',
|
|
71
|
+
'To generate a context bundle for your task, run:',
|
|
72
|
+
'',
|
|
73
|
+
'```',
|
|
74
|
+
'codeledger activate --task "describe your task here"',
|
|
75
|
+
'```',
|
|
76
|
+
'',
|
|
77
|
+
'The bundle will list the most relevant files ranked by score with',
|
|
78
|
+
'relevance reasons and code excerpts.',
|
|
79
|
+
'',
|
|
80
|
+
].join('\n');
|
|
81
|
+
// Write to session-specific path (or legacy path if no session)
|
|
82
|
+
const bundlePath = sessionBundlePath(cwd, sessionId);
|
|
83
|
+
ensureDir(bundlePath);
|
|
84
|
+
writeFileSync(bundlePath, placeholderContent);
|
|
85
|
+
// Also update the legacy fallback for non-session-aware agents
|
|
86
|
+
if (sessionId) {
|
|
87
|
+
const fallback = legacyBundlePath(cwd);
|
|
88
|
+
ensureDir(fallback);
|
|
89
|
+
writeFileSync(fallback, placeholderContent);
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
let repoIndex;
|
|
94
|
+
try {
|
|
95
|
+
repoIndex = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
console.error('Failed to parse repo index. Try running "codeledger scan" to rebuild it.');
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
// -- Step 2: Generate bundle ----------------------------------------------
|
|
102
|
+
const budgetTokens = flags['budget']
|
|
103
|
+
? parsePositiveInt(flags['budget'], 'budget')
|
|
104
|
+
: config.selector.default_budget.tokens;
|
|
105
|
+
const maxFiles = flags['max-files']
|
|
106
|
+
? parsePositiveInt(flags['max-files'], 'max-files')
|
|
107
|
+
: config.selector.default_budget.max_files;
|
|
108
|
+
// -- Auto-close previous task: print mini-recap before overwriting ref ------
|
|
109
|
+
emitPreviousTaskRecap(cwd, config, sessionId, log);
|
|
110
|
+
// -- Save activate ref for session-summary (per-task scoping) --------------
|
|
111
|
+
saveActivateRef(cwd, sessionId);
|
|
112
|
+
log(`Generating context bundle for: "${truncate(task, 80)}"`);
|
|
113
|
+
const bundle = await buildBundleViaEngine({
|
|
114
|
+
taskText: task,
|
|
115
|
+
repoIndex,
|
|
116
|
+
selectorConfig: config.selector,
|
|
117
|
+
budget: { tokens: budgetTokens, max_files: maxFiles },
|
|
118
|
+
indexPath: indexPath,
|
|
119
|
+
});
|
|
120
|
+
// -- Step 3: Write active-bundle.md ----------------------------------------
|
|
121
|
+
const bundleMd = renderBundleMarkdown(bundle);
|
|
122
|
+
// Write to session-specific path
|
|
123
|
+
const bundlePath = sessionBundlePath(cwd, sessionId);
|
|
124
|
+
ensureDir(bundlePath);
|
|
125
|
+
writeFileSync(bundlePath, bundleMd);
|
|
126
|
+
// Also update the legacy fallback for non-session-aware agents
|
|
127
|
+
if (sessionId) {
|
|
128
|
+
const fallback = legacyBundlePath(cwd);
|
|
129
|
+
ensureDir(fallback);
|
|
130
|
+
writeFileSync(fallback, bundleMd);
|
|
131
|
+
}
|
|
132
|
+
// Also save the JSON artifact
|
|
133
|
+
const bundleDir = join(cwd, config.workspace.artifacts_dir, 'bundles');
|
|
134
|
+
if (!existsSync(bundleDir)) {
|
|
135
|
+
mkdirSync(bundleDir, { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
writeFileSync(join(bundleDir, `${bundle.bundle_id}.json`), JSON.stringify(bundle, null, 2) + '\n');
|
|
138
|
+
// -- Update session registry with task and bundle files --------------------
|
|
139
|
+
if (sessionId) {
|
|
140
|
+
const bundleFiles = bundle.files.map((f) => f.path);
|
|
141
|
+
updateSession(cwd, sessionId, {
|
|
142
|
+
task,
|
|
143
|
+
last_active_at: new Date().toISOString(),
|
|
144
|
+
bundle_files: bundleFiles,
|
|
145
|
+
});
|
|
146
|
+
// -- Conflict detection: check for overlapping files with other sessions --
|
|
147
|
+
emitOverlapWarnings(cwd, sessionId, bundleFiles, log);
|
|
148
|
+
}
|
|
149
|
+
log(`\u{1F4E6} Bundle: ${bundle.files.length} files, ~${bundle.total_tokens} tokens`);
|
|
150
|
+
// Show confidence
|
|
151
|
+
if (bundle.confidence) {
|
|
152
|
+
const c = bundle.confidence;
|
|
153
|
+
const icon = c.level === 'high' ? '\u{1F7E2}' : c.level === 'medium' ? '\u{1F7E1}' : '\u{1F534}';
|
|
154
|
+
log(` Confidence: ${icon} ${c.level.toUpperCase()}`);
|
|
155
|
+
if (c.level === 'low') {
|
|
156
|
+
for (const reason of c.reasons) {
|
|
157
|
+
log(` - ${reason}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const displayPath = sessionId
|
|
162
|
+
? `.codeledger/sessions/${sessionId}/active-bundle.md`
|
|
163
|
+
: config.injection.file_drop_path;
|
|
164
|
+
log(`\u{2705} Active bundle written to ${displayPath}`);
|
|
165
|
+
if (!quiet) {
|
|
166
|
+
const fullFiles = bundle.files.filter((f) => !f.is_stub);
|
|
167
|
+
log('\n Top files:');
|
|
168
|
+
for (const f of fullFiles.slice(0, 5)) {
|
|
169
|
+
log(` ${f.score.toFixed(3)} ${f.path} [${f.reasons.join(', ')}]`);
|
|
170
|
+
}
|
|
171
|
+
if (fullFiles.length > 5) {
|
|
172
|
+
log(` ... and ${fullFiles.length - 5} more`);
|
|
173
|
+
}
|
|
174
|
+
const stubs = bundle.files.filter((f) => f.is_stub);
|
|
175
|
+
if (stubs.length > 0) {
|
|
176
|
+
log(` + ${stubs.length} interface stubs`);
|
|
177
|
+
}
|
|
178
|
+
if (sessionId) {
|
|
179
|
+
log(` Session: ${sessionId}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// โโ Conflict Detection โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
184
|
+
function emitOverlapWarnings(cwd, sessionId, bundleFiles, log) {
|
|
185
|
+
const overlaps = findOverlappingFiles(cwd, sessionId, bundleFiles);
|
|
186
|
+
if (overlaps.size === 0)
|
|
187
|
+
return;
|
|
188
|
+
for (const [otherSessionId, files] of overlaps) {
|
|
189
|
+
const severity = files.length >= 4 ? '\u{1F534}' : '\u{1F7E1}';
|
|
190
|
+
log('');
|
|
191
|
+
log(`${severity} Session ${otherSessionId} has ${files.length} overlapping file${files.length === 1 ? '' : 's'}:`);
|
|
192
|
+
for (const f of files.slice(0, 5)) {
|
|
193
|
+
log(` ${f}`);
|
|
194
|
+
}
|
|
195
|
+
if (files.length > 5) {
|
|
196
|
+
log(` ... and ${files.length - 5} more`);
|
|
197
|
+
}
|
|
198
|
+
if (files.length >= 4) {
|
|
199
|
+
log(' Concurrent edits to these files may cause conflicts.');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// โโ Helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
204
|
+
function ensureDir(filePath) {
|
|
205
|
+
const dir = dirname(filePath);
|
|
206
|
+
if (!existsSync(dir))
|
|
207
|
+
mkdirSync(dir, { recursive: true });
|
|
208
|
+
}
|
|
209
|
+
function isIndexStale(indexPath, maxAgeSec) {
|
|
210
|
+
if (!existsSync(indexPath))
|
|
211
|
+
return true;
|
|
212
|
+
try {
|
|
213
|
+
const stat = statSync(indexPath);
|
|
214
|
+
const ageMs = Date.now() - stat.mtimeMs;
|
|
215
|
+
return ageMs > maxAgeSec * 1000;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function parsePositiveInt(value, flagName) {
|
|
222
|
+
const n = parseInt(value, 10);
|
|
223
|
+
if (Number.isNaN(n) || n <= 0) {
|
|
224
|
+
console.error(`Invalid value for --${flagName}: "${value}" (expected a positive integer)`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
return n;
|
|
228
|
+
}
|
|
229
|
+
function truncate(s, max) {
|
|
230
|
+
return s.length <= max ? s : s.slice(0, max - 3) + '...';
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Save the current HEAD sha for session-progress (full session view).
|
|
234
|
+
* Only writes once per session (first activate call).
|
|
235
|
+
*/
|
|
236
|
+
function saveSessionStartRef(cwd, sessionId) {
|
|
237
|
+
const refPath = sessionStartRef(cwd, sessionId);
|
|
238
|
+
if (existsSync(refPath))
|
|
239
|
+
return; // already saved this session
|
|
240
|
+
try {
|
|
241
|
+
const head = execSync('git rev-parse HEAD', {
|
|
242
|
+
cwd,
|
|
243
|
+
encoding: 'utf-8',
|
|
244
|
+
timeout: 5000,
|
|
245
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
246
|
+
}).trim();
|
|
247
|
+
ensureDir(refPath);
|
|
248
|
+
writeFileSync(refPath, head + '\n');
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// Non-fatal: fresh repo with no commits, or not a git repo
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* If a previous task's `.activate-ref` exists, print a mini-recap before
|
|
256
|
+
* overwriting it. This ensures no task's metrics are silently lost when the
|
|
257
|
+
* developer moves to a new task without manually calling session-summary.
|
|
258
|
+
*/
|
|
259
|
+
function emitPreviousTaskRecap(cwd, config, sessionId, log) {
|
|
260
|
+
const activateRefPath = sessionActivateRef(cwd, sessionId);
|
|
261
|
+
if (!existsSync(activateRefPath))
|
|
262
|
+
return;
|
|
263
|
+
const startRef = readFileSync(activateRefPath, 'utf-8').trim();
|
|
264
|
+
if (!startRef)
|
|
265
|
+
return;
|
|
266
|
+
// Load the latest bundle to get previous task info
|
|
267
|
+
const bundleDir = join(cwd, config.workspace.artifacts_dir, 'bundles');
|
|
268
|
+
if (!existsSync(bundleDir))
|
|
269
|
+
return;
|
|
270
|
+
const bundleFiles = readdirSync(bundleDir)
|
|
271
|
+
.filter((f) => f.endsWith('.json'))
|
|
272
|
+
.map((f) => ({ name: f, mtime: statSync(join(bundleDir, f)).mtimeMs }))
|
|
273
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
274
|
+
if (bundleFiles.length === 0)
|
|
275
|
+
return;
|
|
276
|
+
let bundle;
|
|
277
|
+
try {
|
|
278
|
+
bundle = JSON.parse(readFileSync(join(bundleDir, bundleFiles[0].name), 'utf-8'));
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
// Get files changed since previous activate-ref
|
|
284
|
+
let changedFiles;
|
|
285
|
+
try {
|
|
286
|
+
const diff = execSync(`git diff --name-only ${startRef}..HEAD`, {
|
|
287
|
+
cwd,
|
|
288
|
+
encoding: 'utf-8',
|
|
289
|
+
timeout: 5000,
|
|
290
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
291
|
+
}).trim();
|
|
292
|
+
changedFiles = diff ? diff.split('\n') : [];
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (changedFiles.length === 0)
|
|
298
|
+
return;
|
|
299
|
+
const paths = bundle.files.map((f) => f.path);
|
|
300
|
+
const overlap = changedFiles.filter((f) => paths.includes(f));
|
|
301
|
+
const recall = changedFiles.length > 0 ? overlap.length / changedFiles.length : 0;
|
|
302
|
+
const recallPct = Math.round(recall * 100);
|
|
303
|
+
log('');
|
|
304
|
+
log('-- Previous task recap ----------------------------------------');
|
|
305
|
+
log(` Task: "${truncate(bundle.task, 60)}"`);
|
|
306
|
+
log(` Bundle predicted ${overlap.length}/${changedFiles.length} files changed (${recallPct}% recall)`);
|
|
307
|
+
log('-'.repeat(61));
|
|
308
|
+
log('');
|
|
309
|
+
}
|
|
310
|
+
function saveActivateRef(cwd, sessionId) {
|
|
311
|
+
const refPath = sessionActivateRef(cwd, sessionId);
|
|
312
|
+
try {
|
|
313
|
+
const head = execSync('git rev-parse HEAD', {
|
|
314
|
+
cwd,
|
|
315
|
+
encoding: 'utf-8',
|
|
316
|
+
timeout: 5000,
|
|
317
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
318
|
+
}).trim();
|
|
319
|
+
ensureDir(refPath);
|
|
320
|
+
writeFileSync(refPath, head + '\n');
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
// Non-fatal: fresh repo with no commits, or not a git repo
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=activate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activate.js","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkJf"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync } 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 runBundle(cwd, flags) {
|
|
6
|
+
const task = flags['task'];
|
|
7
|
+
if (!task) {
|
|
8
|
+
console.error('โ --task is required. Usage: codeledger bundle --task "your task description"');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const jsonMode = flags['json'] === 'true';
|
|
12
|
+
// In --json mode, all human-readable output goes to stderr so stdout is pure JSON
|
|
13
|
+
const log = jsonMode
|
|
14
|
+
? (...args) => { console.error(...args); }
|
|
15
|
+
: console.log.bind(console);
|
|
16
|
+
const configPath = join(cwd, '.codeledger', 'config.json');
|
|
17
|
+
if (!existsSync(configPath)) {
|
|
18
|
+
console.error('โ No .codeledger/config.json found. Run "codeledger init" first.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
let config;
|
|
22
|
+
try {
|
|
23
|
+
config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
console.error('Failed to parse .codeledger/config.json. Check for syntax errors.');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const indexPath = join(cwd, config.workspace.cache_dir, 'repo-index.json');
|
|
30
|
+
// Auto-scan if no index
|
|
31
|
+
if (!existsSync(indexPath)) {
|
|
32
|
+
log('โ ๏ธ No repo index found. Running scan first...\n');
|
|
33
|
+
buildRepoIndex({
|
|
34
|
+
root: cwd,
|
|
35
|
+
repoConfig: config.repo,
|
|
36
|
+
outputPath: indexPath,
|
|
37
|
+
log,
|
|
38
|
+
});
|
|
39
|
+
log('');
|
|
40
|
+
}
|
|
41
|
+
let repoIndex;
|
|
42
|
+
try {
|
|
43
|
+
repoIndex = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
console.error('Failed to parse repo index. Try running "codeledger scan" to rebuild it.');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
// Parse budget
|
|
50
|
+
const budgetTokens = flags['budget']
|
|
51
|
+
? parseBudget(flags['budget'])
|
|
52
|
+
: config.selector.default_budget.tokens;
|
|
53
|
+
const maxFiles = flags['max-files']
|
|
54
|
+
? parsePositiveInt(flags['max-files'], 'max-files')
|
|
55
|
+
: config.selector.default_budget.max_files;
|
|
56
|
+
log(`๐ฏ Generating context bundle for: "${task}"\n`);
|
|
57
|
+
log(` Budget: ${budgetTokens ?? 'unlimited'} tokens, ${maxFiles ?? 'unlimited'} max files`);
|
|
58
|
+
log(` Sufficiency threshold: ${config.selector.sufficiency_threshold}\n`);
|
|
59
|
+
const explain = flags['explain'] === 'true';
|
|
60
|
+
const bundle = await buildBundleViaEngine({
|
|
61
|
+
taskText: task,
|
|
62
|
+
repoIndex,
|
|
63
|
+
selectorConfig: config.selector,
|
|
64
|
+
budget: { tokens: budgetTokens, max_files: maxFiles },
|
|
65
|
+
explain,
|
|
66
|
+
indexPath: indexPath,
|
|
67
|
+
});
|
|
68
|
+
// Write bundle artifact to disk
|
|
69
|
+
const bundleDir = join(cwd, config.workspace.artifacts_dir, 'bundles');
|
|
70
|
+
if (!existsSync(bundleDir)) {
|
|
71
|
+
mkdirSync(bundleDir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
const bundlePath = join(bundleDir, `${bundle.bundle_id}.json`);
|
|
74
|
+
writeFileSync(bundlePath, JSON.stringify(bundle, null, 2) + '\n');
|
|
75
|
+
// --json mode: emit pure JSON to stdout and exit
|
|
76
|
+
if (jsonMode) {
|
|
77
|
+
process.stdout.write(JSON.stringify(bundle, null, 2) + '\n');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Print summary
|
|
81
|
+
log(`๐ฆ Bundle: ${bundle.bundle_id}`);
|
|
82
|
+
log(` Files selected: ${bundle.files.length}`);
|
|
83
|
+
log(` Total tokens: ~${bundle.total_tokens}`);
|
|
84
|
+
log(` Cumulative score: ${bundle.cumulative_score}`);
|
|
85
|
+
// Print confidence
|
|
86
|
+
if (bundle.confidence) {
|
|
87
|
+
const c = bundle.confidence;
|
|
88
|
+
const icon = c.level === 'high' ? '๐ข' : c.level === 'medium' ? '๐ก' : '๐ด';
|
|
89
|
+
log(` Confidence: ${icon} ${c.level.toUpperCase()} (${c.score})`);
|
|
90
|
+
if (c.level !== 'high') {
|
|
91
|
+
for (const reason of c.reasons) {
|
|
92
|
+
log(` - ${reason}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
log('');
|
|
97
|
+
// Print stubs count
|
|
98
|
+
const stubs = bundle.files.filter((f) => f.is_stub);
|
|
99
|
+
if (stubs.length > 0) {
|
|
100
|
+
log(` Interface stubs: ${stubs.length} (adjacent dependency signatures)`);
|
|
101
|
+
}
|
|
102
|
+
// Print deprecation warnings count
|
|
103
|
+
const filesWithWarnings = bundle.files.filter((f) => f.deprecation_warnings && f.deprecation_warnings.length > 0);
|
|
104
|
+
if (filesWithWarnings.length > 0) {
|
|
105
|
+
const totalWarnings = filesWithWarnings.reduce((sum, f) => sum + (f.deprecation_warnings?.length ?? 0), 0);
|
|
106
|
+
log(` Deprecation warnings: ${totalWarnings} across ${filesWithWarnings.length} files`);
|
|
107
|
+
}
|
|
108
|
+
log('\n Top files:');
|
|
109
|
+
const top = bundle.files.filter((f) => !f.is_stub).slice(0, 10);
|
|
110
|
+
for (const f of top) {
|
|
111
|
+
const reasons = f.reasons.join(', ');
|
|
112
|
+
log(` ${f.score.toFixed(3)} ${f.path} [${reasons}]`);
|
|
113
|
+
}
|
|
114
|
+
if (bundle.files.length > 10) {
|
|
115
|
+
log(` ... and ${bundle.files.length - 10} more`);
|
|
116
|
+
}
|
|
117
|
+
// Print explain table if requested
|
|
118
|
+
if (explain && bundle.explain) {
|
|
119
|
+
log('\n Scoring Breakdown (--explain):');
|
|
120
|
+
log(' %-40s kw cent churn recnt test szpen succ fail errin', 'File');
|
|
121
|
+
for (const f of bundle.files.filter((bf) => !bf.is_stub)) {
|
|
122
|
+
const feat = bundle.explain[f.path];
|
|
123
|
+
if (!feat)
|
|
124
|
+
continue;
|
|
125
|
+
const name = f.path.length > 40 ? '...' + f.path.slice(-37) : f.path.padEnd(40);
|
|
126
|
+
log(` ${name} ${feat.keyword.toFixed(2)} ${feat.centrality.toFixed(2)} ${feat.churn.toFixed(2)} ${feat.recent_touch.toFixed(2)} ${feat.test_relevance.toFixed(2)} ${feat.size_penalty.toFixed(2)} ${feat.success_prior.toFixed(2)} ${feat.fail_prior.toFixed(2)} ${feat.error_infrastructure.toFixed(2)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
log(`\nโ
Bundle written to ${bundlePath}`);
|
|
130
|
+
}
|
|
131
|
+
function parsePositiveInt(value, flagName) {
|
|
132
|
+
const n = parseInt(value, 10);
|
|
133
|
+
if (Number.isNaN(n) || n <= 0) {
|
|
134
|
+
console.error(`Invalid value for --${flagName}: "${value}" (expected a positive integer)`);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
return n;
|
|
138
|
+
}
|
|
139
|
+
function parseBudget(budgetStr) {
|
|
140
|
+
// Supports: "tokens=6000" or just "6000"
|
|
141
|
+
const match = budgetStr.match(/(?:tokens=)?(\d+)/);
|
|
142
|
+
return match ? parseInt(match[1], 10) : undefined;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAKA,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { cleanupAllWorktrees } from '@codeledger/harness';
|
|
4
|
+
export async function runClean(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 worktreeRoot = join(cwd, config.workspace.worktree_root);
|
|
19
|
+
console.log('๐งน Cleaning up orphaned worktrees...');
|
|
20
|
+
const removed = cleanupAllWorktrees(cwd, worktreeRoot);
|
|
21
|
+
if (removed > 0) {
|
|
22
|
+
console.log(`โ
Removed ${removed} orphaned worktree${removed > 1 ? 's' : ''}.`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.log('โ
No orphaned worktrees found.');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,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;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEvD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,qBAAqB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"AA6EA,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqGf"}
|