@context-forge/cli 0.8.5 → 0.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/commands/arch.d.ts +7 -0
  2. package/dist/commands/arch.d.ts.map +1 -0
  3. package/dist/commands/arch.js +160 -0
  4. package/dist/commands/arch.js.map +1 -0
  5. package/dist/commands/backup.d.ts +3 -0
  6. package/dist/commands/backup.d.ts.map +1 -0
  7. package/dist/commands/backup.js +27 -0
  8. package/dist/commands/backup.js.map +1 -0
  9. package/dist/commands/build.d.ts +24 -0
  10. package/dist/commands/build.d.ts.map +1 -0
  11. package/dist/commands/build.js +146 -0
  12. package/dist/commands/build.js.map +1 -0
  13. package/dist/commands/check.d.ts +3 -0
  14. package/dist/commands/check.d.ts.map +1 -0
  15. package/dist/commands/check.js +211 -0
  16. package/dist/commands/check.js.map +1 -0
  17. package/dist/commands/commandInstaller.d.ts +28 -0
  18. package/dist/commands/commandInstaller.d.ts.map +1 -0
  19. package/dist/commands/commandInstaller.js +136 -0
  20. package/dist/commands/commandInstaller.js.map +1 -0
  21. package/dist/commands/config.d.ts +3 -0
  22. package/dist/commands/config.d.ts.map +1 -0
  23. package/dist/commands/config.js +69 -0
  24. package/dist/commands/config.js.map +1 -0
  25. package/dist/commands/future.d.ts +3 -0
  26. package/dist/commands/future.d.ts.map +1 -0
  27. package/dist/commands/future.js +96 -0
  28. package/dist/commands/future.js.map +1 -0
  29. package/dist/commands/guides.d.ts +9 -0
  30. package/dist/commands/guides.d.ts.map +1 -0
  31. package/dist/commands/guides.js +156 -0
  32. package/dist/commands/guides.js.map +1 -0
  33. package/dist/commands/init.d.ts +3 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +124 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/list.d.ts +3 -0
  38. package/dist/commands/list.d.ts.map +1 -0
  39. package/dist/commands/list.js +93 -0
  40. package/dist/commands/list.js.map +1 -0
  41. package/dist/commands/next.d.ts +3 -0
  42. package/dist/commands/next.d.ts.map +1 -0
  43. package/dist/commands/next.js +51 -0
  44. package/dist/commands/next.js.map +1 -0
  45. package/dist/commands/plan.d.ts +7 -0
  46. package/dist/commands/plan.d.ts.map +1 -0
  47. package/dist/commands/plan.js +102 -0
  48. package/dist/commands/plan.js.map +1 -0
  49. package/dist/commands/project.d.ts +25 -0
  50. package/dist/commands/project.d.ts.map +1 -0
  51. package/dist/commands/project.js +550 -0
  52. package/dist/commands/project.js.map +1 -0
  53. package/dist/commands/prompt.d.ts +3 -0
  54. package/dist/commands/prompt.d.ts.map +1 -0
  55. package/dist/commands/prompt.js +112 -0
  56. package/dist/commands/prompt.js.map +1 -0
  57. package/dist/commands/setup-ide.d.ts +15 -0
  58. package/dist/commands/setup-ide.d.ts.map +1 -0
  59. package/dist/commands/setup-ide.js +250 -0
  60. package/dist/commands/setup-ide.js.map +1 -0
  61. package/dist/commands/slice.d.ts +6 -0
  62. package/dist/commands/slice.d.ts.map +1 -0
  63. package/dist/commands/slice.js +100 -0
  64. package/dist/commands/slice.js.map +1 -0
  65. package/dist/commands/status.d.ts +3 -0
  66. package/dist/commands/status.d.ts.map +1 -0
  67. package/dist/commands/status.js +209 -0
  68. package/dist/commands/status.js.map +1 -0
  69. package/dist/commands/task.d.ts +12 -0
  70. package/dist/commands/task.d.ts.map +1 -0
  71. package/dist/commands/task.js +185 -0
  72. package/dist/commands/task.js.map +1 -0
  73. package/dist/commands/update.d.ts +27 -0
  74. package/dist/commands/update.d.ts.map +1 -0
  75. package/dist/commands/update.js +172 -0
  76. package/dist/commands/update.js.map +1 -0
  77. package/dist/commands/workflow.d.ts +3 -0
  78. package/dist/commands/workflow.d.ts.map +1 -0
  79. package/dist/commands/workflow.js +204 -0
  80. package/dist/commands/workflow.js.map +1 -0
  81. package/dist/commands/worktree.d.ts +3 -0
  82. package/dist/commands/worktree.d.ts.map +1 -0
  83. package/dist/commands/worktree.js +371 -0
  84. package/dist/commands/worktree.js.map +1 -0
  85. package/dist/index.d.ts +3 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +167 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/options.d.ts +16 -0
  90. package/dist/options.d.ts.map +1 -0
  91. package/dist/options.js +29 -0
  92. package/dist/options.js.map +1 -0
  93. package/dist/output/formatter.d.ts +6 -0
  94. package/dist/output/formatter.d.ts.map +1 -0
  95. package/dist/output/formatter.js +9 -0
  96. package/dist/output/formatter.js.map +1 -0
  97. package/dist/output/styles.d.ts +15 -0
  98. package/dist/output/styles.d.ts.map +1 -0
  99. package/dist/output/styles.js +16 -0
  100. package/dist/output/styles.js.map +1 -0
  101. package/dist/output/tables.d.ts +6 -0
  102. package/dist/output/tables.d.ts.map +1 -0
  103. package/dist/output/tables.js +45 -0
  104. package/dist/output/tables.js.map +1 -0
  105. package/dist/utils/breaking-changes.d.ts +14 -0
  106. package/dist/utils/breaking-changes.d.ts.map +1 -0
  107. package/dist/utils/breaking-changes.js +11 -0
  108. package/dist/utils/breaking-changes.js.map +1 -0
  109. package/dist/utils/commandCatalog.d.ts +25 -0
  110. package/dist/utils/commandCatalog.d.ts.map +1 -0
  111. package/dist/utils/commandCatalog.js +32 -0
  112. package/dist/utils/commandCatalog.js.map +1 -0
  113. package/dist/utils/confirm.d.ts +3 -0
  114. package/dist/utils/confirm.d.ts.map +1 -0
  115. package/dist/utils/confirm.js +12 -0
  116. package/dist/utils/confirm.js.map +1 -0
  117. package/dist/utils/errors.d.ts +22 -0
  118. package/dist/utils/errors.d.ts.map +1 -0
  119. package/dist/utils/errors.js +63 -0
  120. package/dist/utils/errors.js.map +1 -0
  121. package/dist/utils/phaseShorthand.d.ts +23 -0
  122. package/dist/utils/phaseShorthand.d.ts.map +1 -0
  123. package/dist/utils/phaseShorthand.js +68 -0
  124. package/dist/utils/phaseShorthand.js.map +1 -0
  125. package/dist/utils/project.d.ts +60 -0
  126. package/dist/utils/project.d.ts.map +1 -0
  127. package/dist/utils/project.js +140 -0
  128. package/dist/utils/project.js.map +1 -0
  129. package/dist/utils/worktree-overlay.d.ts +31 -0
  130. package/dist/utils/worktree-overlay.d.ts.map +1 -0
  131. package/dist/utils/worktree-overlay.js +63 -0
  132. package/dist/utils/worktree-overlay.js.map +1 -0
  133. 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,6 @@
1
+ /** Shared action handler for listing slices from the active slice plan. */
2
+ export declare function sliceListAction(opts: {
3
+ json?: boolean;
4
+ project?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAWA,2EAA2E;AAC3E,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G/F"}
@@ -0,0 +1,100 @@
1
+ import { join } from 'node:path';
2
+ import { FileProjectStore, ArtifactIntrospector, resolveArtifactPath } from '@context-forge/core/node';
3
+ import { extractSliceIndex } from '@context-forge/core/node';
4
+ import { resolveProjectWorktree } from '../utils/project.js';
5
+ import { resolveProject } from '@context-forge/core';
6
+ import { resolveOperationPath, getWorktreeIndexRange, isInIndexRange } from '../utils/worktree-overlay.js';
7
+ import { UserError } from '../utils/errors.js';
8
+ import { printJson } from '../output/formatter.js';
9
+ import { renderTable } from '../output/tables.js';
10
+ import { label, success, dim } from '../output/styles.js';
11
+ /** Shared action handler for listing slices from the active slice plan. */
12
+ export async function sliceListAction(opts) {
13
+ const store = new FileProjectStore();
14
+ const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
15
+ const rawProject = await store.getById(id);
16
+ if (!rawProject) {
17
+ throw new UserError(`Project not found: '${id}'.`);
18
+ }
19
+ const project = await resolveProject(store, id, worktreeId);
20
+ if (!project) {
21
+ throw new UserError(`Project not found: '${id}'.`);
22
+ }
23
+ if (!project.fileSlicePlan) {
24
+ throw new UserError('No slice plan configured. Set one with: cf set slicePlan <path>');
25
+ }
26
+ if (!project.projectPath) {
27
+ throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
28
+ }
29
+ const operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
30
+ const indexRange = getWorktreeIndexRange(rawProject, worktreeId);
31
+ const planRelPath = resolveArtifactPath('fileSlicePlan', project.fileSlicePlan);
32
+ if (!planRelPath) {
33
+ throw new UserError('Could not resolve slice plan path.');
34
+ }
35
+ const planPath = join(operationPath, planRelPath);
36
+ const introspector = new ArtifactIntrospector();
37
+ const planResult = await introspector.parseSlicePlan(planPath);
38
+ // Determine active slice index
39
+ const activeIndex = extractSliceIndex(project.fileSlice);
40
+ // Filter entries by worktree index range — but skip filtering when the plan itself
41
+ // is outside the range (user explicitly switched to a different initiative)
42
+ const planBaseIndex = /^(\d+)-/.exec(project.fileSlicePlan ?? '')?.[1];
43
+ const planOutsideRange = planBaseIndex && indexRange && !isInIndexRange(parseInt(planBaseIndex, 10), indexRange);
44
+ const filteredEntries = planOutsideRange
45
+ ? planResult.entries
46
+ : planResult.entries.filter((e) => isInIndexRange(e.index, indexRange));
47
+ // Check for design files per entry
48
+ const entries = await Promise.all(filteredEntries.map(async (entry) => {
49
+ let designFile = null;
50
+ try {
51
+ const docs = await introspector.detectDocuments(operationPath, entry.index);
52
+ designFile = docs.sliceDesign;
53
+ }
54
+ catch {
55
+ // skip
56
+ }
57
+ const isActive = activeIndex !== null && entry.index === activeIndex;
58
+ const isNext = !isActive && !entry.isChecked && activeIndex === null;
59
+ return { ...entry, designFile, isActive, isNext };
60
+ }));
61
+ // Mark first unchecked as next if no active match
62
+ if (!entries.some((e) => e.isActive)) {
63
+ const firstUnchecked = entries.find((e) => !e.isChecked);
64
+ if (firstUnchecked) {
65
+ firstUnchecked.isNext = true;
66
+ }
67
+ }
68
+ if (opts.json) {
69
+ const planName = project.fileSlicePlan.split('/').pop() ?? project.fileSlicePlan;
70
+ printJson({
71
+ slicePlan: planName,
72
+ total: planResult.totalSlices,
73
+ completed: planResult.completedSlices,
74
+ entries: entries.map((e) => ({
75
+ index: e.index,
76
+ name: e.name,
77
+ isChecked: e.isChecked,
78
+ designFile: e.designFile,
79
+ isActive: e.isActive,
80
+ isNext: e.isNext,
81
+ })),
82
+ });
83
+ return;
84
+ }
85
+ // Render table
86
+ const planName = project.fileSlicePlan.split('/').pop() ?? project.fileSlicePlan;
87
+ console.log(label(`\nSlice Plan: ${planName}`));
88
+ const rows = entries.map((e) => {
89
+ const status = e.isChecked
90
+ ? success('✓ complete')
91
+ : dim('○ not started');
92
+ const file = e.designFile
93
+ ? dim(e.designFile.split('/').pop() ?? e.designFile)
94
+ : dim('—');
95
+ const indicator = e.isActive ? success(' ← active') : e.isNext ? dim(' ← next') : '';
96
+ return [String(e.index), e.name, status, file + indicator];
97
+ });
98
+ console.log(renderTable(['#', 'Slice', 'Status', 'File'], rows));
99
+ }
100
+ //# 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -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,CAuK5D"}