@context-forge/cli 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/arch.d.ts +7 -0
- package/dist/commands/arch.d.ts.map +1 -0
- package/dist/commands/arch.js +169 -0
- package/dist/commands/arch.js.map +1 -0
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +27 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/build.d.ts +24 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +146 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +250 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/commandInstaller.d.ts +28 -0
- package/dist/commands/commandInstaller.d.ts.map +1 -0
- package/dist/commands/commandInstaller.js +136 -0
- package/dist/commands/commandInstaller.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +116 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/future.d.ts +3 -0
- package/dist/commands/future.d.ts.map +1 -0
- package/dist/commands/future.js +96 -0
- package/dist/commands/future.js.map +1 -0
- package/dist/commands/guides.d.ts +9 -0
- package/dist/commands/guides.d.ts.map +1 -0
- package/dist/commands/guides.js +156 -0
- package/dist/commands/guides.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +124 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +97 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/next.d.ts +3 -0
- package/dist/commands/next.d.ts.map +1 -0
- package/dist/commands/next.js +52 -0
- package/dist/commands/next.js.map +1 -0
- package/dist/commands/plan.d.ts +7 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +102 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/project.d.ts +25 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +550 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/prompt.d.ts +3 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +112 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/setup-ide.d.ts +15 -0
- package/dist/commands/setup-ide.d.ts.map +1 -0
- package/dist/commands/setup-ide.js +250 -0
- package/dist/commands/setup-ide.js.map +1 -0
- package/dist/commands/slice.d.ts +7 -0
- package/dist/commands/slice.d.ts.map +1 -0
- package/dist/commands/slice.js +151 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +210 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/task.d.ts +13 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +207 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/update.d.ts +27 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +172 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +204 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/commands/worktree.d.ts +3 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +371 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +16 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +29 -0
- package/dist/options.js.map +1 -0
- package/dist/output/entryStatusDisplay.d.ts +12 -0
- package/dist/output/entryStatusDisplay.d.ts.map +1 -0
- package/dist/output/entryStatusDisplay.js +24 -0
- package/dist/output/entryStatusDisplay.js.map +1 -0
- package/dist/output/formatter.d.ts +6 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +9 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/styles.d.ts +15 -0
- package/dist/output/styles.d.ts.map +1 -0
- package/dist/output/styles.js +16 -0
- package/dist/output/styles.js.map +1 -0
- package/dist/output/tables.d.ts +6 -0
- package/dist/output/tables.d.ts.map +1 -0
- package/dist/output/tables.js +45 -0
- package/dist/output/tables.js.map +1 -0
- package/dist/utils/archIndex.d.ts +7 -0
- package/dist/utils/archIndex.d.ts.map +1 -0
- package/dist/utils/archIndex.js +14 -0
- package/dist/utils/archIndex.js.map +1 -0
- package/dist/utils/breaking-changes.d.ts +14 -0
- package/dist/utils/breaking-changes.d.ts.map +1 -0
- package/dist/utils/breaking-changes.js +11 -0
- package/dist/utils/breaking-changes.js.map +1 -0
- package/dist/utils/commandCatalog.d.ts +25 -0
- package/dist/utils/commandCatalog.d.ts.map +1 -0
- package/dist/utils/commandCatalog.js +32 -0
- package/dist/utils/commandCatalog.js.map +1 -0
- package/dist/utils/confirm.d.ts +3 -0
- package/dist/utils/confirm.d.ts.map +1 -0
- package/dist/utils/confirm.js +12 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/errors.d.ts +22 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +63 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/phaseShorthand.d.ts +23 -0
- package/dist/utils/phaseShorthand.d.ts.map +1 -0
- package/dist/utils/phaseShorthand.js +68 -0
- package/dist/utils/phaseShorthand.js.map +1 -0
- package/dist/utils/project.d.ts +60 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +140 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/worktree-overlay.d.ts +31 -0
- package/dist/utils/worktree-overlay.d.ts.map +1 -0
- package/dist/utils/worktree-overlay.js +63 -0
- package/dist/utils/worktree-overlay.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import * as readline from 'node:readline';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { FileProjectStore, ArtifactIntrospector, ConsistencyChecker, ConfigManager, detectDocuments, updateFrontmatterField, } from '@context-forge/core/node';
|
|
4
|
+
import { resolveProjectWorktree } from '../utils/project.js';
|
|
5
|
+
import { withJsonOption, withProjectOption, withYesOption, withFixOption } from '../options.js';
|
|
6
|
+
import { applyWorktreeOverlay } from '../utils/worktree-overlay.js';
|
|
7
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
8
|
+
import { printJson } from '../output/formatter.js';
|
|
9
|
+
import { label, dim, error as errorStyle, warn as warnStyle } from '../output/styles.js';
|
|
10
|
+
const SEVERITY_ICON = {
|
|
11
|
+
error: '✗',
|
|
12
|
+
warning: '⚠',
|
|
13
|
+
info: 'ℹ',
|
|
14
|
+
};
|
|
15
|
+
/** Prompt user for y/N confirmation via stdin. Returns true if confirmed. */
|
|
16
|
+
function askConfirmation(prompt) {
|
|
17
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
rl.question(prompt, (answer) => {
|
|
20
|
+
rl.close();
|
|
21
|
+
resolve(answer.trim().toLowerCase() === 'y');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function isFixResult(result) {
|
|
26
|
+
return 'fixLog' in result;
|
|
27
|
+
}
|
|
28
|
+
/** Merge findings from multiple checkAll runs, deduplicating by rule+location+description. */
|
|
29
|
+
function mergeCheckResults(results) {
|
|
30
|
+
if (results.length === 1)
|
|
31
|
+
return results[0];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const allFindings = [];
|
|
34
|
+
for (const result of results) {
|
|
35
|
+
for (const finding of result.findings) {
|
|
36
|
+
const key = `${finding.rule}|${finding.location}|${finding.description}`;
|
|
37
|
+
if (!seen.has(key)) {
|
|
38
|
+
seen.add(key);
|
|
39
|
+
allFindings.push(finding);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const projectPath = results[0].projectPath;
|
|
44
|
+
const errors = allFindings.filter((f) => f.severity === 'error').length;
|
|
45
|
+
const warnings = allFindings.filter((f) => f.severity === 'warning').length;
|
|
46
|
+
const infos = allFindings.filter((f) => f.severity === 'info').length;
|
|
47
|
+
const total = allFindings.length;
|
|
48
|
+
const parts = [];
|
|
49
|
+
if (errors > 0)
|
|
50
|
+
parts.push(`${errors} error${errors !== 1 ? 's' : ''}`);
|
|
51
|
+
if (warnings > 0)
|
|
52
|
+
parts.push(`${warnings} warning${warnings !== 1 ? 's' : ''}`);
|
|
53
|
+
if (infos > 0)
|
|
54
|
+
parts.push(`${infos} info${infos !== 1 ? 's' : ''}`);
|
|
55
|
+
const summary = total === 0 ? 'No inconsistencies found' : `${total} finding${total !== 1 ? 's' : ''}: ${parts.join(', ')}`;
|
|
56
|
+
return { projectPath, findings: allFindings, totalFindings: total, errors, warnings, infos, summary };
|
|
57
|
+
}
|
|
58
|
+
function formatFinding(finding, fixResult) {
|
|
59
|
+
const icon = SEVERITY_ICON[finding.severity] ?? '?';
|
|
60
|
+
const colorFn = finding.severity === 'error' ? errorStyle : finding.severity === 'warning' ? warnStyle : dim;
|
|
61
|
+
const lines = [];
|
|
62
|
+
lines.push(colorFn(` ${icon} ${finding.description}`));
|
|
63
|
+
if (fixResult && finding.fixable) {
|
|
64
|
+
const logEntry = fixResult.fixLog.find((e) => e.rule === finding.rule);
|
|
65
|
+
if (logEntry) {
|
|
66
|
+
lines.push(dim(` → Fixed: ${logEntry.before} → ${logEntry.after} in ${logEntry.filePath}`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
lines.push(dim(` → ${finding.suggestedFix}`));
|
|
71
|
+
}
|
|
72
|
+
return lines.join('\n');
|
|
73
|
+
}
|
|
74
|
+
/** Extract slice index prefix from a finding description like "[175] ..." */
|
|
75
|
+
function extractFindingSliceIndex(description) {
|
|
76
|
+
const match = /^\[(\d+)\]\s/.exec(description);
|
|
77
|
+
return match ? match[1] : null;
|
|
78
|
+
}
|
|
79
|
+
/** Group findings by slice index prefix, with non-prefixed in a "Project-level" group */
|
|
80
|
+
function groupFindings(findings) {
|
|
81
|
+
const groups = new Map();
|
|
82
|
+
for (const finding of findings) {
|
|
83
|
+
const idx = extractFindingSliceIndex(finding.description);
|
|
84
|
+
const key = idx ?? 'project';
|
|
85
|
+
const group = groups.get(key) ?? [];
|
|
86
|
+
group.push(finding);
|
|
87
|
+
groups.set(key, group);
|
|
88
|
+
}
|
|
89
|
+
return groups;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Declare a slice docs-only (#57): writes codeReview: none to its slice-design
|
|
93
|
+
* frontmatter, so evaluateReviewGate() skips the pre-advance code-review gate
|
|
94
|
+
* for it. A direct, single-purpose mutation — not part of the check/fix
|
|
95
|
+
* pipeline, since it doesn't depend on any finding having been detected first.
|
|
96
|
+
*/
|
|
97
|
+
async function setReviewNoneAction(indexArg, opts) {
|
|
98
|
+
const index = parseInt(indexArg, 10);
|
|
99
|
+
if (isNaN(index)) {
|
|
100
|
+
throw new UserError(`Invalid slice index: '${indexArg}'`);
|
|
101
|
+
}
|
|
102
|
+
const store = new FileProjectStore();
|
|
103
|
+
const { id } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
104
|
+
const project = await store.getById(id);
|
|
105
|
+
if (!project) {
|
|
106
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
107
|
+
}
|
|
108
|
+
if (!project.projectPath) {
|
|
109
|
+
throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
|
|
110
|
+
}
|
|
111
|
+
const docs = await detectDocuments(project.projectPath, index);
|
|
112
|
+
if (!docs.sliceDesign) {
|
|
113
|
+
throw new UserError(`No slice-design file found for slice ${index}. codeReview: none is set on the slice design, not the task file.`);
|
|
114
|
+
}
|
|
115
|
+
const filePath = join(project.projectPath, docs.sliceDesign);
|
|
116
|
+
const entry = await updateFrontmatterField(filePath, 'codeReview', 'none');
|
|
117
|
+
if (opts.json) {
|
|
118
|
+
printJson({ slice: index, filePath: docs.sliceDesign, field: 'codeReview', before: entry.before, after: entry.after });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
console.log(label(`Set codeReview: none on slice ${index}`));
|
|
122
|
+
console.log(dim(` ${docs.sliceDesign}`));
|
|
123
|
+
}
|
|
124
|
+
export function registerCheckCommand(program) {
|
|
125
|
+
const checkCmd = program
|
|
126
|
+
.command('check')
|
|
127
|
+
.description('Run consistency checks on project artifacts');
|
|
128
|
+
withJsonOption(checkCmd);
|
|
129
|
+
withProjectOption(checkCmd);
|
|
130
|
+
withFixOption(checkCmd);
|
|
131
|
+
checkCmd.option('--slice <index>', 'Check only a specific slice by index');
|
|
132
|
+
checkCmd.option('--set-review-none <index>', 'Declare a slice docs-only (writes codeReview: none to its slice design)');
|
|
133
|
+
withYesOption(checkCmd);
|
|
134
|
+
checkCmd.action(async (opts) => {
|
|
135
|
+
try {
|
|
136
|
+
if (opts.setReviewNone !== undefined) {
|
|
137
|
+
await setReviewNoneAction(opts.setReviewNone, opts);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const store = new FileProjectStore();
|
|
141
|
+
const { id } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
142
|
+
const project = await store.getById(id);
|
|
143
|
+
if (!project) {
|
|
144
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
145
|
+
}
|
|
146
|
+
const introspector = new ArtifactIntrospector();
|
|
147
|
+
const config = new ConfigManager(project.projectPath);
|
|
148
|
+
const checker = new ConsistencyChecker(introspector, config);
|
|
149
|
+
// Determine fix mode: explicit flag > config key > false
|
|
150
|
+
let fixMode = opts.fix ?? false;
|
|
151
|
+
if (!fixMode) {
|
|
152
|
+
try {
|
|
153
|
+
const autoFixResult = await config.get('workflow.auto_fix');
|
|
154
|
+
if (autoFixResult.value === true) {
|
|
155
|
+
fixMode = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Config read failed — default to check-only
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Determine scope: --slice narrows to single slice, otherwise all-slices
|
|
163
|
+
const singleSlice = opts.slice ? parseInt(opts.slice, 10) : null;
|
|
164
|
+
if (singleSlice !== null && isNaN(singleSlice)) {
|
|
165
|
+
throw new UserError(`Invalid slice index: '${opts.slice}'`);
|
|
166
|
+
}
|
|
167
|
+
// Build project views: one per worktree overlay so all workflow fields are visible.
|
|
168
|
+
// Findings are merged and deduplicated — aggregate rules (filesystem scan) run per
|
|
169
|
+
// view but produce the same results, so deduplication collapses them correctly.
|
|
170
|
+
const worktrees = project.worktrees ?? [];
|
|
171
|
+
const projectViews = worktrees.length > 0
|
|
172
|
+
? worktrees.map((wt) => applyWorktreeOverlay(project, wt.id))
|
|
173
|
+
: [project];
|
|
174
|
+
let result;
|
|
175
|
+
if (singleSlice !== null) {
|
|
176
|
+
// Narrow to single slice — set fileSlice temporarily and use check()
|
|
177
|
+
const sliceViews = projectViews.map((v) => ({ ...v, fileSlice: `${singleSlice}-slice` }));
|
|
178
|
+
const checkResults = await Promise.all(sliceViews.map((v) => checker.check(v)));
|
|
179
|
+
const merged = mergeCheckResults(checkResults);
|
|
180
|
+
result = fixMode ? await checker.applyFixes(merged) : merged;
|
|
181
|
+
}
|
|
182
|
+
else if (fixMode) {
|
|
183
|
+
// All-slices fix mode — prompt for confirmation unless --yes
|
|
184
|
+
const dryRunResults = await Promise.all(projectViews.map((v) => checker.checkAll(v)));
|
|
185
|
+
const dryRun = mergeCheckResults(dryRunResults);
|
|
186
|
+
const fixableCount = dryRun.findings.filter((f) => f.fixable).length;
|
|
187
|
+
if (fixableCount === 0) {
|
|
188
|
+
printCheckOutput(dryRun, project.name, false);
|
|
189
|
+
console.log(dim('No fixable findings — nothing to apply.'));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
else if (!opts.yes) {
|
|
193
|
+
printCheckOutput(dryRun, project.name, false);
|
|
194
|
+
const confirmed = await askConfirmation(`\nFound ${fixableCount} fixable finding${fixableCount !== 1 ? 's' : ''}. Apply fixes? [y/N] `);
|
|
195
|
+
if (!confirmed) {
|
|
196
|
+
console.log('Aborted.');
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
result = await checker.applyFixes(dryRun);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
result = await checker.applyFixes(dryRun);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const checkResults = await Promise.all(projectViews.map((v) => checker.checkAll(v)));
|
|
207
|
+
result = mergeCheckResults(checkResults);
|
|
208
|
+
}
|
|
209
|
+
if (opts.json) {
|
|
210
|
+
printJson(result);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
printCheckOutput(result, project.name, fixMode);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
handleError(err);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
function printCheckOutput(result, projectName, fixMode) {
|
|
221
|
+
const modeLabel = fixMode ? ' (fix mode)' : '';
|
|
222
|
+
console.log(label(`Consistency Check: ${projectName}${modeLabel}`));
|
|
223
|
+
console.log('');
|
|
224
|
+
if (result.totalFindings === 0) {
|
|
225
|
+
console.log(' No inconsistencies found');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const fixRes = isFixResult(result) ? result : undefined;
|
|
229
|
+
const groups = groupFindings(result.findings);
|
|
230
|
+
for (const [key, findings] of groups) {
|
|
231
|
+
const groupLabel = key === 'project' ? 'Project-level' : `Slice ${key}`;
|
|
232
|
+
console.log(label(` ${groupLabel}`));
|
|
233
|
+
for (const finding of findings) {
|
|
234
|
+
console.log(formatFinding(finding, fixRes));
|
|
235
|
+
}
|
|
236
|
+
console.log('');
|
|
237
|
+
}
|
|
238
|
+
if (fixRes) {
|
|
239
|
+
console.log(label(`Fixed ${fixRes.fixed} of ${result.totalFindings} findings`));
|
|
240
|
+
if (fixRes.fixErrors.length > 0) {
|
|
241
|
+
for (const err of fixRes.fixErrors) {
|
|
242
|
+
console.log(errorStyle(` Fix error: ${err}`));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
console.log(dim(result.summary));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/** Resolve the bundled commands/ directory relative to this script's location. */
|
|
3
|
+
export declare function getSourceCommandsDir(): string;
|
|
4
|
+
/**
|
|
5
|
+
* Copy command files from the bundled commands/cf/ directory to the target.
|
|
6
|
+
* Creates directories as needed. Overwrites existing files (idempotent).
|
|
7
|
+
* Removes stale .md files in the target that no longer exist in the source.
|
|
8
|
+
*
|
|
9
|
+
* @returns Object with installed and removed filenames.
|
|
10
|
+
*/
|
|
11
|
+
export declare function installCommands(targetDir: string): {
|
|
12
|
+
installed: string[];
|
|
13
|
+
removed: string[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Remove managed command files from the target.
|
|
17
|
+
* "Managed" = any .md file that exists in the bundled source directory.
|
|
18
|
+
* Preserves user-added files not in the source. Removes cf/ if empty.
|
|
19
|
+
* No error if files or directory don't exist (idempotent).
|
|
20
|
+
*
|
|
21
|
+
* @returns List of removed filenames.
|
|
22
|
+
*/
|
|
23
|
+
export declare function uninstallCommands(targetDir: string): string[];
|
|
24
|
+
/** Install commands to the target directory (defaults to ~/.claude/commands). Errors propagate. */
|
|
25
|
+
export declare function installCommandsAction(targetDir?: string): void;
|
|
26
|
+
export declare function registerInstallCommandsCommand(program: Command): void;
|
|
27
|
+
export declare function registerUninstallCommandsCommand(program: Command): void;
|
|
28
|
+
//# sourceMappingURL=commandInstaller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandInstaller.d.ts","sourceRoot":"","sources":["../../src/commands/commandInstaller.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,kFAAkF;AAClF,wBAAgB,oBAAoB,IAAI,MAAM,CAU7C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAwB7F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB7D;AAOD,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAU9D;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBrE;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBvE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { success, dim } from '../output/styles.js';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
/** Resolve the bundled commands/ directory relative to this script's location. */
|
|
9
|
+
export function getSourceCommandsDir() {
|
|
10
|
+
// In dist: dist/commands/commandInstaller.js → ../../commands/
|
|
11
|
+
const resolved = path.resolve(__dirname, '..', '..', 'commands');
|
|
12
|
+
if (!fs.existsSync(resolved)) {
|
|
13
|
+
throw new Error(`Cannot locate bundled commands directory at ${resolved}. ` +
|
|
14
|
+
'Ensure the package includes a commands/ directory.');
|
|
15
|
+
}
|
|
16
|
+
return resolved;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Copy command files from the bundled commands/cf/ directory to the target.
|
|
20
|
+
* Creates directories as needed. Overwrites existing files (idempotent).
|
|
21
|
+
* Removes stale .md files in the target that no longer exist in the source.
|
|
22
|
+
*
|
|
23
|
+
* @returns Object with installed and removed filenames.
|
|
24
|
+
*/
|
|
25
|
+
export function installCommands(targetDir) {
|
|
26
|
+
const sourceDir = path.join(getSourceCommandsDir(), 'cf');
|
|
27
|
+
const targetCfDir = path.join(targetDir, 'cf');
|
|
28
|
+
fs.mkdirSync(targetCfDir, { recursive: true });
|
|
29
|
+
const sourceFiles = new Set(fs.readdirSync(sourceDir).filter((f) => f.endsWith('.md')));
|
|
30
|
+
// Install current files
|
|
31
|
+
for (const file of sourceFiles) {
|
|
32
|
+
fs.copyFileSync(path.join(sourceDir, file), path.join(targetCfDir, file));
|
|
33
|
+
}
|
|
34
|
+
// Remove stale files (exist in target but not in source)
|
|
35
|
+
const removed = [];
|
|
36
|
+
const targetFiles = fs.readdirSync(targetCfDir).filter((f) => f.endsWith('.md'));
|
|
37
|
+
for (const file of targetFiles) {
|
|
38
|
+
if (!sourceFiles.has(file)) {
|
|
39
|
+
fs.rmSync(path.join(targetCfDir, file));
|
|
40
|
+
removed.push(file);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { installed: [...sourceFiles], removed };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Remove managed command files from the target.
|
|
47
|
+
* "Managed" = any .md file that exists in the bundled source directory.
|
|
48
|
+
* Preserves user-added files not in the source. Removes cf/ if empty.
|
|
49
|
+
* No error if files or directory don't exist (idempotent).
|
|
50
|
+
*
|
|
51
|
+
* @returns List of removed filenames.
|
|
52
|
+
*/
|
|
53
|
+
export function uninstallCommands(targetDir) {
|
|
54
|
+
const sourceDir = path.join(getSourceCommandsDir(), 'cf');
|
|
55
|
+
const managedFiles = fs.readdirSync(sourceDir).filter((f) => f.endsWith('.md'));
|
|
56
|
+
const targetCfDir = path.join(targetDir, 'cf');
|
|
57
|
+
const removed = [];
|
|
58
|
+
for (const file of managedFiles) {
|
|
59
|
+
const filePath = path.join(targetCfDir, file);
|
|
60
|
+
if (fs.existsSync(filePath)) {
|
|
61
|
+
fs.rmSync(filePath);
|
|
62
|
+
removed.push(file);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Remove cf/ directory if it exists and is now empty
|
|
66
|
+
if (fs.existsSync(targetCfDir)) {
|
|
67
|
+
const remaining = fs.readdirSync(targetCfDir);
|
|
68
|
+
if (remaining.length === 0) {
|
|
69
|
+
fs.rmdirSync(targetCfDir);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return removed;
|
|
73
|
+
}
|
|
74
|
+
/** Default target directory for command installation. */
|
|
75
|
+
function defaultTarget() {
|
|
76
|
+
return path.join(os.homedir(), '.claude', 'commands');
|
|
77
|
+
}
|
|
78
|
+
/** Install commands to the target directory (defaults to ~/.claude/commands). Errors propagate. */
|
|
79
|
+
export function installCommandsAction(targetDir) {
|
|
80
|
+
const target = targetDir ?? defaultTarget();
|
|
81
|
+
const { installed, removed } = installCommands(target);
|
|
82
|
+
console.log(success(`Installed ${installed.length} commands to ${target}/cf/`));
|
|
83
|
+
for (const file of installed) {
|
|
84
|
+
console.log(` ${dim('/cf:' + file.replace('.md', ''))}`);
|
|
85
|
+
}
|
|
86
|
+
if (removed.length > 0) {
|
|
87
|
+
console.log(dim(`Removed ${removed.length} stale command(s): ${removed.map((f) => f.replace('.md', '')).join(', ')}`));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function registerInstallCommandsCommand(program) {
|
|
91
|
+
program
|
|
92
|
+
.command('install-commands')
|
|
93
|
+
.description('Install Claude Code slash commands for Context Forge')
|
|
94
|
+
.option('--target <dir>', 'Target directory', defaultTarget())
|
|
95
|
+
.action((opts) => {
|
|
96
|
+
try {
|
|
97
|
+
const { installed, removed } = installCommands(opts.target);
|
|
98
|
+
console.log(success(`Installed ${installed.length} commands to ${opts.target}/cf/`));
|
|
99
|
+
for (const file of installed) {
|
|
100
|
+
console.log(` ${dim('/cf:' + file.replace('.md', ''))}`);
|
|
101
|
+
}
|
|
102
|
+
if (removed.length > 0) {
|
|
103
|
+
console.log(dim(`Removed ${removed.length} stale command(s): ${removed.map((f) => f.replace('.md', '')).join(', ')}`));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error(`Error: ${err.message}`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export function registerUninstallCommandsCommand(program) {
|
|
113
|
+
program
|
|
114
|
+
.command('uninstall-commands')
|
|
115
|
+
.description('Remove Claude Code slash commands for Context Forge')
|
|
116
|
+
.option('--target <dir>', 'Target directory', defaultTarget())
|
|
117
|
+
.action((opts) => {
|
|
118
|
+
try {
|
|
119
|
+
const removed = uninstallCommands(opts.target);
|
|
120
|
+
if (removed.length === 0) {
|
|
121
|
+
console.log(dim('No commands found to remove.'));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log(success(`Removed ${removed.length} commands from ${opts.target}/cf/`));
|
|
125
|
+
for (const file of removed) {
|
|
126
|
+
console.log(` ${dim('/cf:' + file.replace('.md', ''))}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
console.error(`Error: ${err.message}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=commandInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandInstaller.js","sourceRoot":"","sources":["../../src/commands/commandInstaller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwCpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E5D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { ConfigManager, FileProjectStore, CONFIG_KEYS } from '@context-forge/core/node';
|
|
3
|
+
import { resolveProject } from '@context-forge/core';
|
|
4
|
+
import { resolveProjectWorktree } from '../utils/project.js';
|
|
5
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
6
|
+
import { withJsonOption, withProjectOption } from '../options.js';
|
|
7
|
+
import { printJson } from '../output/formatter.js';
|
|
8
|
+
import { label, value as valueStyle, dim, success } from '../output/styles.js';
|
|
9
|
+
/**
|
|
10
|
+
* Resolves --project to the project's actual projectPath, so ConfigManager reads/writes
|
|
11
|
+
* the real .context-forge.toml at the project root rather than treating a bare registered
|
|
12
|
+
* project name as a literal directory (the bug this fixes). Tries registry resolution
|
|
13
|
+
* (name/id, then CWD) first; if that fails and the value is itself an existing directory,
|
|
14
|
+
* falls back to using it directly — config is the one CLI surface that supports pointing
|
|
15
|
+
* at an unregistered scratch directory, unlike next/status which require a full ProjectData.
|
|
16
|
+
* Returns undefined (user-scope config) when no project can be resolved and none was requested.
|
|
17
|
+
*/
|
|
18
|
+
async function resolveConfigProjectPath(project) {
|
|
19
|
+
try {
|
|
20
|
+
const store = new FileProjectStore();
|
|
21
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project }, store);
|
|
22
|
+
const resolved = await resolveProject(store, id, worktreeId);
|
|
23
|
+
if (resolved?.projectPath)
|
|
24
|
+
return resolved.projectPath;
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
// resolveProjectWorktree throws UserError when no project matches — expected when
|
|
28
|
+
// --project is a raw directory rather than a registered name; fall through to the
|
|
29
|
+
// raw-path fallback below. Any other error (e.g. a corrupt project store) propagates.
|
|
30
|
+
if (!(err instanceof UserError))
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
if (project && existsSync(project) && statSync(project).isDirectory()) {
|
|
34
|
+
return project;
|
|
35
|
+
}
|
|
36
|
+
if (project) {
|
|
37
|
+
throw new Error(`Project '${project}' not found and is not an existing directory.`);
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
export function registerConfigCommand(program) {
|
|
42
|
+
const cmd = program
|
|
43
|
+
.command('config')
|
|
44
|
+
.description('Manage Context Forge configuration (get, set)');
|
|
45
|
+
const getCmd = cmd.command('get [key]').description('Get a configuration key, or show all keys if none specified');
|
|
46
|
+
withJsonOption(getCmd);
|
|
47
|
+
withProjectOption(getCmd);
|
|
48
|
+
getCmd.action(async (key, opts) => {
|
|
49
|
+
try {
|
|
50
|
+
const projectPath = await resolveConfigProjectPath(opts.project);
|
|
51
|
+
const cm = new ConfigManager(projectPath);
|
|
52
|
+
if (!key) {
|
|
53
|
+
// No key — show all config keys
|
|
54
|
+
const entries = await cm.list();
|
|
55
|
+
if (opts.json) {
|
|
56
|
+
printJson(entries);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const maxKey = Math.max(...entries.map((e) => e.key.length));
|
|
60
|
+
const maxVal = Math.max(...entries.map((e) => String(e.value ?? '').length), 5);
|
|
61
|
+
for (const e of entries) {
|
|
62
|
+
const val = String(e.value ?? '');
|
|
63
|
+
console.log(` ${e.key.padEnd(maxKey)} ${valueStyle(val.padEnd(maxVal))} ${dim(e.source)}`);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const result = await cm.get(key);
|
|
68
|
+
if (opts.json) {
|
|
69
|
+
printJson(result);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
console.log(`${label('Key:')} ${result.key}`);
|
|
73
|
+
console.log(`${label('Value:')} ${valueStyle(String(result.value ?? ''))}`);
|
|
74
|
+
console.log(`${label('Source:')} ${result.source}`);
|
|
75
|
+
if (result.description) {
|
|
76
|
+
console.log(`${label('About:')} ${result.description}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
handleError(err);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const setCmd = cmd.command('set <key> <value>').description('Set a configuration value');
|
|
84
|
+
withProjectOption(setCmd);
|
|
85
|
+
setCmd.action(async (key, val, opts) => {
|
|
86
|
+
try {
|
|
87
|
+
const scope = opts.project ? 'project' : 'user';
|
|
88
|
+
const projectPath = await resolveConfigProjectPath(opts.project);
|
|
89
|
+
const cm = new ConfigManager(projectPath);
|
|
90
|
+
// Coerce the raw string argument to the key's declared type. The shell
|
|
91
|
+
// strips quotes, so an all-digit string like a YYYYMMDD date reaches us
|
|
92
|
+
// indistinguishable from a numeric literal — blind Number() coercion would
|
|
93
|
+
// reject it against a string-typed key. Consult the registry and coerce
|
|
94
|
+
// only toward the declared type. Unknown keys are left as-is so cm.set
|
|
95
|
+
// produces its normal "unknown key" error rather than a mis-coerced value.
|
|
96
|
+
const declaredType = CONFIG_KEYS[key]?.type;
|
|
97
|
+
let coerced = val;
|
|
98
|
+
if (declaredType === 'boolean') {
|
|
99
|
+
if (val === 'true')
|
|
100
|
+
coerced = true;
|
|
101
|
+
else if (val === 'false')
|
|
102
|
+
coerced = false;
|
|
103
|
+
}
|
|
104
|
+
else if (declaredType === 'number') {
|
|
105
|
+
if (/^\d+(\.\d+)?$/.test(val))
|
|
106
|
+
coerced = Number(val);
|
|
107
|
+
}
|
|
108
|
+
await cm.set(key, coerced, scope);
|
|
109
|
+
console.log(success(`Set ${key} = ${String(coerced)} (${scope})`));
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
handleError(err);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"future.d.ts","sourceRoot":"","sources":["../../src/commands/future.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmG5D"}
|