@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,112 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { FileProjectStore, SystemPromptParser } from '@context-forge/core/node';
|
|
3
|
+
import { PROMPT_FILE_RELATIVE_PATH, applyWorktreeOverlay } from '@context-forge/core';
|
|
4
|
+
import { resolveProjectWorktree } from '../utils/project.js';
|
|
5
|
+
import { resolveOperationPath } from '../utils/worktree-overlay.js';
|
|
6
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
7
|
+
import { withJsonOption, withProjectOption, withRawOption } from '../options.js';
|
|
8
|
+
import { printJson, printRaw } from '../output/formatter.js';
|
|
9
|
+
import { renderTable } from '../output/tables.js';
|
|
10
|
+
import { getPhaseShorthands, resolvePhaseInput } from '../utils/phaseShorthand.js';
|
|
11
|
+
/**
|
|
12
|
+
* Substitute project variables into template content.
|
|
13
|
+
* Unresolvable variables are preserved as-is.
|
|
14
|
+
*/
|
|
15
|
+
function substituteVariables(content, project) {
|
|
16
|
+
const vars = {
|
|
17
|
+
'project': project.name,
|
|
18
|
+
'slice': project.fileSlice,
|
|
19
|
+
'task-file': project.fileTasks,
|
|
20
|
+
'fileArch': project.fileArch,
|
|
21
|
+
'fileHLD': project.fileHLD,
|
|
22
|
+
'fileSpec': project.fileSpec,
|
|
23
|
+
'development-phase': project.developmentPhase,
|
|
24
|
+
};
|
|
25
|
+
return content.replace(/\{(\w[\w-]*)}/g, (_match, varName) => {
|
|
26
|
+
const value = vars[varName];
|
|
27
|
+
return value !== undefined ? value : `{${varName}}`;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export function registerPromptCommand(program) {
|
|
31
|
+
const cmd = program
|
|
32
|
+
.command('prompt')
|
|
33
|
+
.description('Access prompt templates with variable substitution');
|
|
34
|
+
const listCmd = cmd.command('list').description('List available prompt templates');
|
|
35
|
+
withJsonOption(listCmd);
|
|
36
|
+
withProjectOption(listCmd);
|
|
37
|
+
listCmd.action(async (opts) => {
|
|
38
|
+
try {
|
|
39
|
+
const store = new FileProjectStore();
|
|
40
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
41
|
+
const project = await store.getById(id);
|
|
42
|
+
if (!project) {
|
|
43
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
44
|
+
}
|
|
45
|
+
const opPath = resolveOperationPath(project, worktreeId);
|
|
46
|
+
if (!opPath) {
|
|
47
|
+
throw new UserError(`Project '${project.name}' has no projectPath configured.\n` +
|
|
48
|
+
' cf project set projectPath /path/to/project');
|
|
49
|
+
}
|
|
50
|
+
const promptFilePath = path.join(opPath, PROMPT_FILE_RELATIVE_PATH);
|
|
51
|
+
const parser = new SystemPromptParser(promptFilePath);
|
|
52
|
+
const prompts = await parser.getAllPrompts();
|
|
53
|
+
// Build shorthand map for display
|
|
54
|
+
const shorthands = await getPhaseShorthands(opPath);
|
|
55
|
+
const shorthandReverse = new Map();
|
|
56
|
+
for (const [key, name] of shorthands) {
|
|
57
|
+
shorthandReverse.set(name.toLowerCase(), key);
|
|
58
|
+
}
|
|
59
|
+
const templates = prompts.map((p) => {
|
|
60
|
+
const shorthand = shorthandReverse.get(p.name.replace(/\s*\(Phase \d+(?:\.\d+)?\)\s*/, '').toLowerCase()) ?? '';
|
|
61
|
+
return {
|
|
62
|
+
name: p.name,
|
|
63
|
+
key: p.key,
|
|
64
|
+
shorthand,
|
|
65
|
+
parameterCount: p.parameters.length,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
if (opts.json) {
|
|
69
|
+
printJson(templates);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const rows = templates.map((t) => [t.name, t.key, t.shorthand]);
|
|
73
|
+
console.log(renderTable(['Name', 'Key', 'Shorthand'], rows));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
handleError(err);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const getCmd = cmd.command('get <phase>').description('Get a prompt template with project variables substituted');
|
|
80
|
+
withProjectOption(getCmd);
|
|
81
|
+
withRawOption(getCmd);
|
|
82
|
+
getCmd.action(async (phase, opts) => {
|
|
83
|
+
try {
|
|
84
|
+
const store = new FileProjectStore();
|
|
85
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
86
|
+
const project = await store.getById(id);
|
|
87
|
+
if (!project) {
|
|
88
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
89
|
+
}
|
|
90
|
+
const opPath = resolveOperationPath(project, worktreeId);
|
|
91
|
+
if (!opPath) {
|
|
92
|
+
throw new UserError(`Project '${project.name}' has no projectPath configured.\n` +
|
|
93
|
+
' cf project set projectPath /path/to/project');
|
|
94
|
+
}
|
|
95
|
+
// Resolve shorthand or name to instruction key
|
|
96
|
+
const resolvedPhase = await resolvePhaseInput(phase, opPath);
|
|
97
|
+
const promptFilePath = path.join(opPath, PROMPT_FILE_RELATIVE_PATH);
|
|
98
|
+
const parser = new SystemPromptParser(promptFilePath);
|
|
99
|
+
const prompt = await parser.getPromptForInstruction(resolvedPhase);
|
|
100
|
+
if (!prompt) {
|
|
101
|
+
throw new UserError(`No prompt found for '${phase}'. Run cf prompt list to see available templates.`);
|
|
102
|
+
}
|
|
103
|
+
const resolved = worktreeId ? applyWorktreeOverlay(project, worktreeId) : project;
|
|
104
|
+
const output = opts.raw ? prompt.content : substituteVariables(prompt.content, resolved);
|
|
105
|
+
printRaw(output);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
handleError(err);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/** Returns true if the file contains the context-forge managed marker in the first 20 lines. */
|
|
3
|
+
export declare function isManagedClaudeMd(filePath: string): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Returns true if the Copilot IDE install is managed by context-forge.
|
|
6
|
+
* Checks the first 20 lines of .github/copilot-instructions.md and AGENTS.md.
|
|
7
|
+
* Returns true if at least one of those files exists and contains the marker.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isManagedCopilotFiles(projectPath: string): boolean;
|
|
10
|
+
/** Run IDE setup for a project. Errors propagate to the caller. */
|
|
11
|
+
export declare function setupIdeAction(projectPath: string, target: string, opts?: {
|
|
12
|
+
yes?: boolean;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function registerSetupIdeCommand(program: Command): void;
|
|
15
|
+
//# sourceMappingURL=setup-ide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-ide.d.ts","sourceRoot":"","sources":["../../src/commands/setup-ide.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,gGAAgG;AAChG,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI3D;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBlE;AAED,mEAAmE;AACnE,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAuGf;AAmFD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC9D"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as readline from 'node:readline';
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
|
+
import { FileProjectStore, GuideDetector, GUIDE_RELATIVE_PATH } from '@context-forge/core/node';
|
|
6
|
+
import { resolveProjectId } from '../utils/project.js';
|
|
7
|
+
import { withProjectOption, withYesOption } from '../options.js';
|
|
8
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
9
|
+
const VALID_TARGETS = ['claude', 'copilot'];
|
|
10
|
+
/** Prompt user for y/N confirmation via stdin. Returns true if confirmed. */
|
|
11
|
+
function askConfirmation(prompt) {
|
|
12
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
rl.question(prompt, (answer) => {
|
|
15
|
+
rl.close();
|
|
16
|
+
resolve(answer.trim().toLowerCase() === 'y');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** Returns true if the file contains the context-forge managed marker in the first 20 lines. */
|
|
21
|
+
export function isManagedClaudeMd(filePath) {
|
|
22
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
23
|
+
const lines = content.split('\n').slice(0, 20);
|
|
24
|
+
return lines.some((line) => line.trim() === '[//]: # (context-forge:managed)');
|
|
25
|
+
}
|
|
26
|
+
const COPILOT_MANAGED_MARKER = '[//]: # (context-forge:managed)';
|
|
27
|
+
/**
|
|
28
|
+
* Returns true if the Copilot IDE install is managed by context-forge.
|
|
29
|
+
* Checks the first 20 lines of .github/copilot-instructions.md and AGENTS.md.
|
|
30
|
+
* Returns true if at least one of those files exists and contains the marker.
|
|
31
|
+
*/
|
|
32
|
+
export function isManagedCopilotFiles(projectPath) {
|
|
33
|
+
const filesToCheck = [
|
|
34
|
+
path.join(projectPath, '.github', 'copilot-instructions.md'),
|
|
35
|
+
path.join(projectPath, 'AGENTS.md'),
|
|
36
|
+
];
|
|
37
|
+
for (const filePath of filesToCheck) {
|
|
38
|
+
if (!fs.existsSync(filePath))
|
|
39
|
+
continue;
|
|
40
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
41
|
+
const lines = content.split('\n').slice(0, 20);
|
|
42
|
+
if (lines.some((line) => line.trim() === COPILOT_MANAGED_MARKER)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/** Run IDE setup for a project. Errors propagate to the caller. */
|
|
49
|
+
export async function setupIdeAction(projectPath, target, opts) {
|
|
50
|
+
// Validate target
|
|
51
|
+
if (!VALID_TARGETS.includes(target)) {
|
|
52
|
+
throw new UserError(`Invalid target '${target}'. Valid targets: ${VALID_TARGETS.join(', ')}`);
|
|
53
|
+
}
|
|
54
|
+
// Check guide installation
|
|
55
|
+
const detector = new GuideDetector();
|
|
56
|
+
const guideInfo = await detector.detect(projectPath);
|
|
57
|
+
if (!guideInfo.installed) {
|
|
58
|
+
throw new UserError("Guides are not installed. Run 'cf guides install' first.");
|
|
59
|
+
}
|
|
60
|
+
// Locate setup-ide script
|
|
61
|
+
const guideDir = path.join(projectPath, GUIDE_RELATIVE_PATH);
|
|
62
|
+
const scriptPath = path.join(guideDir, 'scripts/setup-ide');
|
|
63
|
+
if (!fs.existsSync(scriptPath)) {
|
|
64
|
+
throw new UserError(`setup-ide script not found at ${scriptPath}. Your guides installation may be incomplete — try 'cf guides update'.`);
|
|
65
|
+
}
|
|
66
|
+
// CLAUDE.md safety check
|
|
67
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
68
|
+
const claudeMdBakPath = path.join(projectPath, 'CLAUDE.md.bak');
|
|
69
|
+
if (target === 'claude') {
|
|
70
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
71
|
+
if (isManagedClaudeMd(claudeMdPath)) {
|
|
72
|
+
// Managed file — skip backup silently
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Not managed — possibly prompt, then backup logic
|
|
76
|
+
if (!opts?.yes) {
|
|
77
|
+
console.error('Warning: CLAUDE.md already exists and will be overwritten.');
|
|
78
|
+
const confirmed = await askConfirmation('Continue? (y/N) ');
|
|
79
|
+
if (!confirmed) {
|
|
80
|
+
console.error('Aborted.');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!fs.existsSync(claudeMdBakPath)) {
|
|
85
|
+
fs.copyFileSync(claudeMdPath, claudeMdBakPath);
|
|
86
|
+
console.log('Backed up CLAUDE.md → CLAUDE.md.bak');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log('existing backup preserved at CLAUDE.md.bak');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (target === 'copilot') {
|
|
95
|
+
// Copilot safety check: only prompt when unmanaged files exist
|
|
96
|
+
if (!isManagedCopilotFiles(projectPath)) {
|
|
97
|
+
const copilotInstructionsPath = path.join(projectPath, '.github', 'copilot-instructions.md');
|
|
98
|
+
const agentsMdPath = path.join(projectPath, 'AGENTS.md');
|
|
99
|
+
const eitherExists = fs.existsSync(copilotInstructionsPath) || fs.existsSync(agentsMdPath);
|
|
100
|
+
if (eitherExists) {
|
|
101
|
+
if (!opts?.yes) {
|
|
102
|
+
console.error('Warning: Copilot IDE files already exist and will be overwritten.');
|
|
103
|
+
const confirmed = await askConfirmation('Continue? (y/N) ');
|
|
104
|
+
if (!confirmed) {
|
|
105
|
+
console.error('Aborted.');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Backup each file if it exists and no .bak already present
|
|
110
|
+
for (const [src, bak] of [
|
|
111
|
+
[copilotInstructionsPath, `${copilotInstructionsPath}.bak`],
|
|
112
|
+
[agentsMdPath, `${agentsMdPath}.bak`],
|
|
113
|
+
]) {
|
|
114
|
+
if (fs.existsSync(src)) {
|
|
115
|
+
if (!fs.existsSync(bak)) {
|
|
116
|
+
fs.copyFileSync(src, bak);
|
|
117
|
+
console.log(`Backed up ${path.relative(projectPath, src)} → ${path.relative(projectPath, bak)}`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
console.log(`existing backup preserved at ${path.relative(projectPath, bak)}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Managed or no files: proceed silently
|
|
127
|
+
}
|
|
128
|
+
// Run the setup-ide script
|
|
129
|
+
try {
|
|
130
|
+
execFileSync('bash', [scriptPath, target], {
|
|
131
|
+
cwd: projectPath,
|
|
132
|
+
stdio: 'inherit',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const code = err.status ?? 'unknown';
|
|
137
|
+
throw new UserError(`setup-ide exited with code ${code}. Check the output above for details.`);
|
|
138
|
+
}
|
|
139
|
+
console.error(`IDE setup complete for ${target}.`);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Propagate IDE-generated files from the project root to all registered worktrees.
|
|
143
|
+
*
|
|
144
|
+
* The setup-ide script always writes to the project root (its find_project_root()
|
|
145
|
+
* walks up to the nearest directory containing project-documents/, which is always
|
|
146
|
+
* the root). Worktrees share the same guides submodule source but have independent
|
|
147
|
+
* working trees, so without propagation their CLAUDE.md and .claude/ config files
|
|
148
|
+
* go stale after every root setup-ide run.
|
|
149
|
+
*
|
|
150
|
+
* Files propagated (claude target):
|
|
151
|
+
* CLAUDE.md — compiled from alwaysApply rules
|
|
152
|
+
* .claude/rules/ — modular (non-alwaysApply) rule files
|
|
153
|
+
* .claude/agents/ — agent definition files
|
|
154
|
+
* .claude/skills/ — skill definition files
|
|
155
|
+
*
|
|
156
|
+
* Files intentionally NOT propagated:
|
|
157
|
+
* .claude/settings.local.json — worktree-specific user settings
|
|
158
|
+
* .claude/worktrees/ — cf worktree registry, root-only
|
|
159
|
+
*/
|
|
160
|
+
function propagateToWorktrees(project, target) {
|
|
161
|
+
const worktrees = (project.worktrees ?? []).filter((wt) => wt.worktreePath && fs.existsSync(wt.worktreePath));
|
|
162
|
+
if (worktrees.length === 0)
|
|
163
|
+
return;
|
|
164
|
+
const rootPath = project.projectPath;
|
|
165
|
+
for (const wt of worktrees) {
|
|
166
|
+
const wtPath = wt.worktreePath;
|
|
167
|
+
console.log(` → propagating to worktree: ${wt.name ?? wt.id} (${wtPath})`);
|
|
168
|
+
if (target === 'claude') {
|
|
169
|
+
// CLAUDE.md
|
|
170
|
+
const srcMd = path.join(rootPath, 'CLAUDE.md');
|
|
171
|
+
if (fs.existsSync(srcMd)) {
|
|
172
|
+
fs.copyFileSync(srcMd, path.join(wtPath, 'CLAUDE.md'));
|
|
173
|
+
}
|
|
174
|
+
// .claude/{rules,agents,skills}
|
|
175
|
+
for (const dir of ['rules', 'agents', 'skills']) {
|
|
176
|
+
const srcDir = path.join(rootPath, '.claude', dir);
|
|
177
|
+
const dstDir = path.join(wtPath, '.claude', dir);
|
|
178
|
+
if (!fs.existsSync(srcDir))
|
|
179
|
+
continue;
|
|
180
|
+
fs.mkdirSync(dstDir, { recursive: true });
|
|
181
|
+
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
182
|
+
if (entry.isFile()) {
|
|
183
|
+
fs.copyFileSync(path.join(srcDir, entry.name), path.join(dstDir, entry.name));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (target === 'copilot') {
|
|
189
|
+
// AGENTS.md
|
|
190
|
+
const srcAgents = path.join(rootPath, 'AGENTS.md');
|
|
191
|
+
if (fs.existsSync(srcAgents)) {
|
|
192
|
+
fs.copyFileSync(srcAgents, path.join(wtPath, 'AGENTS.md'));
|
|
193
|
+
}
|
|
194
|
+
// .github/copilot-instructions.md
|
|
195
|
+
const srcInstructions = path.join(rootPath, '.github', 'copilot-instructions.md');
|
|
196
|
+
if (fs.existsSync(srcInstructions)) {
|
|
197
|
+
fs.mkdirSync(path.join(wtPath, '.github'), { recursive: true });
|
|
198
|
+
fs.copyFileSync(srcInstructions, path.join(wtPath, '.github', 'copilot-instructions.md'));
|
|
199
|
+
}
|
|
200
|
+
// .github/instructions/ and .github/prompts/
|
|
201
|
+
for (const dir of ['instructions', 'prompts']) {
|
|
202
|
+
const srcDir = path.join(rootPath, '.github', dir);
|
|
203
|
+
const dstDir = path.join(wtPath, '.github', dir);
|
|
204
|
+
if (!fs.existsSync(srcDir))
|
|
205
|
+
continue;
|
|
206
|
+
fs.mkdirSync(dstDir, { recursive: true });
|
|
207
|
+
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
208
|
+
if (entry.isFile()) {
|
|
209
|
+
fs.copyFileSync(path.join(srcDir, entry.name), path.join(dstDir, entry.name));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Future targets (cursor, windsurf) would propagate their own dirs here.
|
|
215
|
+
}
|
|
216
|
+
console.log(` Propagated to ${worktrees.length} worktree${worktrees.length !== 1 ? 's' : ''}.`);
|
|
217
|
+
}
|
|
218
|
+
export function registerSetupIdeCommand(program) {
|
|
219
|
+
const ideCmd = program
|
|
220
|
+
.command('setup-ide')
|
|
221
|
+
.description('Configure IDE-specific AI integration files for the current project')
|
|
222
|
+
.argument('<target>', 'IDE target: claude, copilot');
|
|
223
|
+
withProjectOption(ideCmd);
|
|
224
|
+
withYesOption(ideCmd);
|
|
225
|
+
ideCmd.action(async (target, opts) => {
|
|
226
|
+
try {
|
|
227
|
+
// Validate target early (before project resolution for fast failure)
|
|
228
|
+
if (!VALID_TARGETS.includes(target)) {
|
|
229
|
+
throw new UserError(`Invalid target '${target}'. Valid targets: ${VALID_TARGETS.join(', ')}`);
|
|
230
|
+
}
|
|
231
|
+
// Resolve project
|
|
232
|
+
const store = new FileProjectStore();
|
|
233
|
+
const { id } = await resolveProjectId(opts.project, store);
|
|
234
|
+
const project = await store.getById(id);
|
|
235
|
+
if (!project) {
|
|
236
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
237
|
+
}
|
|
238
|
+
if (!project.projectPath) {
|
|
239
|
+
throw new UserError(`Project '${project.name}' has no configured project path.\n` +
|
|
240
|
+
' Run cf init in the project directory to set the path.');
|
|
241
|
+
}
|
|
242
|
+
await setupIdeAction(project.projectPath, target, { yes: opts.yes });
|
|
243
|
+
propagateToWorktrees(project, target);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
handleError(err);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=setup-ide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-ide.js","sourceRoot":"","sources":["../../src/commands/setup-ide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAcA,2EAA2E;AAC3E,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmKnH"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { FileProjectStore, ArtifactIntrospector, resolveArtifactPath, resolveSlicePlanPathByIndex } from '@context-forge/core/node';
|
|
3
|
+
import { extractSliceIndex } from '@context-forge/core/node';
|
|
4
|
+
import { resolveProjectWorktree } from '../utils/project.js';
|
|
5
|
+
import { resolveProject, deriveEntryStatus, normalizeStatus, STATUS } from '@context-forge/core';
|
|
6
|
+
import { resolveOperationPath, getWorktreeIndexRange, isInIndexRange } from '../utils/worktree-overlay.js';
|
|
7
|
+
import { UserError } from '../utils/errors.js';
|
|
8
|
+
import { parseArchIndex } from '../utils/archIndex.js';
|
|
9
|
+
import { printJson } from '../output/formatter.js';
|
|
10
|
+
import { renderTable } from '../output/tables.js';
|
|
11
|
+
import { label, success, dim } from '../output/styles.js';
|
|
12
|
+
import { renderEntryStatus } from '../output/entryStatusDisplay.js';
|
|
13
|
+
/** Shared action handler for listing slices from the active slice plan. */
|
|
14
|
+
export async function sliceListAction(opts) {
|
|
15
|
+
const store = new FileProjectStore();
|
|
16
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
17
|
+
const rawProject = await store.getById(id);
|
|
18
|
+
if (!rawProject) {
|
|
19
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
20
|
+
}
|
|
21
|
+
const project = await resolveProject(store, id, worktreeId);
|
|
22
|
+
if (!project) {
|
|
23
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
24
|
+
}
|
|
25
|
+
if (!project.projectPath) {
|
|
26
|
+
throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
|
|
27
|
+
}
|
|
28
|
+
const operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
|
|
29
|
+
const introspector = new ArtifactIntrospector();
|
|
30
|
+
let planPath;
|
|
31
|
+
let filteredEntries;
|
|
32
|
+
let planResult;
|
|
33
|
+
if (opts.archIndex !== undefined) {
|
|
34
|
+
// An explicit index request is an intentional cross-initiative look — it
|
|
35
|
+
// always shows the full target plan and never touches project state.
|
|
36
|
+
const archIndex = parseArchIndex(opts.archIndex);
|
|
37
|
+
const resolvedPath = await resolveSlicePlanPathByIndex(operationPath, archIndex);
|
|
38
|
+
if (!resolvedPath) {
|
|
39
|
+
throw new UserError(`No slice plan found for index '${archIndex}' (searched project-documents/user/architecture/).`);
|
|
40
|
+
}
|
|
41
|
+
planPath = resolvedPath;
|
|
42
|
+
planResult = await introspector.parseSlicePlan(planPath);
|
|
43
|
+
filteredEntries = planResult.entries;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
if (!project.fileSlicePlan) {
|
|
47
|
+
throw new UserError('No slice plan configured. Set one with: cf set slicePlan <path>');
|
|
48
|
+
}
|
|
49
|
+
const indexRange = getWorktreeIndexRange(rawProject, worktreeId);
|
|
50
|
+
const planRelPath = resolveArtifactPath('fileSlicePlan', project.fileSlicePlan);
|
|
51
|
+
if (!planRelPath) {
|
|
52
|
+
throw new UserError('Could not resolve slice plan path.');
|
|
53
|
+
}
|
|
54
|
+
planPath = join(operationPath, planRelPath);
|
|
55
|
+
planResult = await introspector.parseSlicePlan(planPath);
|
|
56
|
+
// Filter entries by worktree index range — but skip filtering when the plan itself
|
|
57
|
+
// is outside the range (user explicitly switched to a different initiative)
|
|
58
|
+
const planBaseIndex = /^(\d+)-/.exec(project.fileSlicePlan ?? '')?.[1];
|
|
59
|
+
const planOutsideRange = planBaseIndex && indexRange && !isInIndexRange(parseInt(planBaseIndex, 10), indexRange);
|
|
60
|
+
filteredEntries = planOutsideRange
|
|
61
|
+
? planResult.entries
|
|
62
|
+
: planResult.entries.filter((e) => isInIndexRange(e.index, indexRange));
|
|
63
|
+
}
|
|
64
|
+
// Determine active slice index
|
|
65
|
+
const activeIndex = extractSliceIndex(project.fileSlice);
|
|
66
|
+
// Check for design files, task files, and derived status per entry.
|
|
67
|
+
// TD-2a: a signal that exists but fails to resolve (task file present but
|
|
68
|
+
// unreadable, frontmatter status present but unrecognized) is rendered with
|
|
69
|
+
// a distinct degraded indicator rather than silently falling through to the
|
|
70
|
+
// checkbox — this must not abort the whole listing for one bad entry.
|
|
71
|
+
const entries = await Promise.all(filteredEntries.map(async (entry) => {
|
|
72
|
+
let designFile = null;
|
|
73
|
+
let derivedStatus = entry.isChecked ? STATUS.Complete : STATUS.NotStarted;
|
|
74
|
+
try {
|
|
75
|
+
const docs = await introspector.detectDocuments(operationPath, entry.index);
|
|
76
|
+
designFile = docs.sliceDesign;
|
|
77
|
+
let taskInferredStatus;
|
|
78
|
+
let taskResolutionFailed = false;
|
|
79
|
+
if (docs.taskFile) {
|
|
80
|
+
const taskPaths = docs.taskFile.map((p) => join(operationPath, p));
|
|
81
|
+
try {
|
|
82
|
+
const taskResult = await introspector.parseTaskFile(taskPaths);
|
|
83
|
+
taskInferredStatus = taskResult.inferredStatus;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
taskResolutionFailed = true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
let frontmatterStatus;
|
|
90
|
+
let frontmatterResolutionFailed = false;
|
|
91
|
+
if (docs.sliceDesign) {
|
|
92
|
+
const fm = await introspector.parseFrontmatter(join(operationPath, docs.sliceDesign));
|
|
93
|
+
if (fm.found) {
|
|
94
|
+
const normalized = normalizeStatus(fm.data.status);
|
|
95
|
+
if (normalized === undefined) {
|
|
96
|
+
frontmatterResolutionFailed = true;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
frontmatterStatus = normalized;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
derivedStatus = taskResolutionFailed || frontmatterResolutionFailed
|
|
104
|
+
? 'degraded'
|
|
105
|
+
: deriveEntryStatus({ frontmatterStatus, taskInferredStatus, isChecked: entry.isChecked });
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
derivedStatus = 'degraded';
|
|
109
|
+
}
|
|
110
|
+
const isActive = activeIndex !== null && entry.index === activeIndex;
|
|
111
|
+
const isNext = !isActive && derivedStatus !== STATUS.Complete && derivedStatus !== STATUS.Deprecated && activeIndex === null;
|
|
112
|
+
return { ...entry, designFile, derivedStatus, isActive, isNext };
|
|
113
|
+
}));
|
|
114
|
+
// Mark first not-complete entry as next if no active match
|
|
115
|
+
if (!entries.some((e) => e.isActive)) {
|
|
116
|
+
const firstNotComplete = entries.find((e) => e.derivedStatus !== STATUS.Complete && e.derivedStatus !== STATUS.Deprecated);
|
|
117
|
+
if (firstNotComplete) {
|
|
118
|
+
firstNotComplete.isNext = true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const planName = (planPath.split('/').pop() ?? planPath).replace(/\.md$/, '');
|
|
122
|
+
if (opts.json) {
|
|
123
|
+
printJson({
|
|
124
|
+
slicePlan: planName,
|
|
125
|
+
total: planResult.totalSlices,
|
|
126
|
+
completed: planResult.completedSlices,
|
|
127
|
+
entries: entries.map((e) => ({
|
|
128
|
+
index: e.index,
|
|
129
|
+
name: e.name,
|
|
130
|
+
isChecked: e.isChecked,
|
|
131
|
+
designFile: e.designFile,
|
|
132
|
+
status: e.derivedStatus,
|
|
133
|
+
isActive: e.isActive,
|
|
134
|
+
isNext: e.isNext,
|
|
135
|
+
})),
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Render table
|
|
140
|
+
console.log(label(`\nSlice Plan: ${planName}`));
|
|
141
|
+
const rows = entries.map((e) => {
|
|
142
|
+
const status = renderEntryStatus(e.derivedStatus, e.isChecked);
|
|
143
|
+
const file = e.designFile
|
|
144
|
+
? dim(e.designFile.split('/').pop() ?? e.designFile)
|
|
145
|
+
: dim('—');
|
|
146
|
+
const indicator = e.isActive ? success(' ← active') : e.isNext ? dim(' ← next') : '';
|
|
147
|
+
return [String(e.index), e.name, status, file + indicator];
|
|
148
|
+
});
|
|
149
|
+
console.log(renderTable(['#', 'Slice', 'Status', 'File'], rows));
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwK5D"}
|