@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.
Files changed (141) 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 +169 -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 +250 -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 +116 -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 +97 -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 +52 -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 +7 -0
  62. package/dist/commands/slice.d.ts.map +1 -0
  63. package/dist/commands/slice.js +151 -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 +210 -0
  68. package/dist/commands/status.js.map +1 -0
  69. package/dist/commands/task.d.ts +13 -0
  70. package/dist/commands/task.d.ts.map +1 -0
  71. package/dist/commands/task.js +207 -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/entryStatusDisplay.d.ts +12 -0
  94. package/dist/output/entryStatusDisplay.d.ts.map +1 -0
  95. package/dist/output/entryStatusDisplay.js +24 -0
  96. package/dist/output/entryStatusDisplay.js.map +1 -0
  97. package/dist/output/formatter.d.ts +6 -0
  98. package/dist/output/formatter.d.ts.map +1 -0
  99. package/dist/output/formatter.js +9 -0
  100. package/dist/output/formatter.js.map +1 -0
  101. package/dist/output/styles.d.ts +15 -0
  102. package/dist/output/styles.d.ts.map +1 -0
  103. package/dist/output/styles.js +16 -0
  104. package/dist/output/styles.js.map +1 -0
  105. package/dist/output/tables.d.ts +6 -0
  106. package/dist/output/tables.d.ts.map +1 -0
  107. package/dist/output/tables.js +45 -0
  108. package/dist/output/tables.js.map +1 -0
  109. package/dist/utils/archIndex.d.ts +7 -0
  110. package/dist/utils/archIndex.d.ts.map +1 -0
  111. package/dist/utils/archIndex.js +14 -0
  112. package/dist/utils/archIndex.js.map +1 -0
  113. package/dist/utils/breaking-changes.d.ts +14 -0
  114. package/dist/utils/breaking-changes.d.ts.map +1 -0
  115. package/dist/utils/breaking-changes.js +11 -0
  116. package/dist/utils/breaking-changes.js.map +1 -0
  117. package/dist/utils/commandCatalog.d.ts +25 -0
  118. package/dist/utils/commandCatalog.d.ts.map +1 -0
  119. package/dist/utils/commandCatalog.js +32 -0
  120. package/dist/utils/commandCatalog.js.map +1 -0
  121. package/dist/utils/confirm.d.ts +3 -0
  122. package/dist/utils/confirm.d.ts.map +1 -0
  123. package/dist/utils/confirm.js +12 -0
  124. package/dist/utils/confirm.js.map +1 -0
  125. package/dist/utils/errors.d.ts +22 -0
  126. package/dist/utils/errors.d.ts.map +1 -0
  127. package/dist/utils/errors.js +63 -0
  128. package/dist/utils/errors.js.map +1 -0
  129. package/dist/utils/phaseShorthand.d.ts +23 -0
  130. package/dist/utils/phaseShorthand.d.ts.map +1 -0
  131. package/dist/utils/phaseShorthand.js +68 -0
  132. package/dist/utils/phaseShorthand.js.map +1 -0
  133. package/dist/utils/project.d.ts +60 -0
  134. package/dist/utils/project.d.ts.map +1 -0
  135. package/dist/utils/project.js +140 -0
  136. package/dist/utils/project.js.map +1 -0
  137. package/dist/utils/worktree-overlay.d.ts +31 -0
  138. package/dist/utils/worktree-overlay.d.ts.map +1 -0
  139. package/dist/utils/worktree-overlay.js +63 -0
  140. package/dist/utils/worktree-overlay.js.map +1 -0
  141. package/package.json +2 -2
@@ -0,0 +1,96 @@
1
+ import { FileProjectStore, FutureWorkCollector } from '@context-forge/core/node';
2
+ import { resolveProjectWorktree } from '../utils/project.js';
3
+ import { resolveOperationPath, getWorktreeIndexRange, isInIndexRange, resolveAllOperationPaths } from '../utils/worktree-overlay.js';
4
+ import { handleError, UserError } from '../utils/errors.js';
5
+ import { withJsonOption, withAllOption, withProjectOption } from '../options.js';
6
+ import { printJson } from '../output/formatter.js';
7
+ import { label, value as valueStyle, dim, success } from '../output/styles.js';
8
+ export function registerFutureCommand(program) {
9
+ const futureCmd = program
10
+ .command('future')
11
+ .description('Show consolidated future work across slice plans');
12
+ withJsonOption(futureCmd);
13
+ withAllOption(futureCmd);
14
+ withProjectOption(futureCmd);
15
+ futureCmd.option('--status <filter>', 'Filter by status: all, pending, completed', 'all');
16
+ futureCmd.action(async (opts) => {
17
+ try {
18
+ const store = new FileProjectStore();
19
+ const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
20
+ const project = await store.getById(id);
21
+ if (!project) {
22
+ throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
23
+ }
24
+ const statusFilter = opts.status;
25
+ const collector = new FutureWorkCollector();
26
+ let result;
27
+ if (opts.all && project.worktrees?.length) {
28
+ const paths = resolveAllOperationPaths(project);
29
+ // Collect from all paths, merge results (deduplicate by initiative name)
30
+ const results = await Promise.all(paths.map((p) => collector.collect(p, statusFilter).catch(() => null)));
31
+ const validResults = results.filter((r) => r !== null);
32
+ if (validResults.length === 0) {
33
+ throw new UserError('No future work found across any worktree path.');
34
+ }
35
+ // Merge: deduplicate groups by initiativeName (first wins)
36
+ const seenGroups = new Set();
37
+ const mergedGroups = [];
38
+ for (const r of validResults) {
39
+ for (const g of r.groups) {
40
+ if (!seenGroups.has(g.initiativeName)) {
41
+ seenGroups.add(g.initiativeName);
42
+ mergedGroups.push(g);
43
+ }
44
+ }
45
+ }
46
+ result = {
47
+ ...validResults[0],
48
+ groups: mergedGroups,
49
+ totalItems: mergedGroups.reduce((sum, g) => sum + g.totalItems, 0),
50
+ completedItems: mergedGroups.reduce((sum, g) => sum + g.completedItems, 0),
51
+ pendingItems: 0,
52
+ markdown: '',
53
+ };
54
+ result.pendingItems = result.totalItems - result.completedItems;
55
+ }
56
+ else {
57
+ const operationPath = resolveOperationPath(project, worktreeId);
58
+ if (!operationPath) {
59
+ throw new UserError(`Project '${project.name}' has no projectPath configured.\n` +
60
+ ' cf project set projectPath /path/to/project');
61
+ }
62
+ const indexRange = getWorktreeIndexRange(project, worktreeId);
63
+ result = await collector.collect(operationPath, statusFilter);
64
+ // Filter groups by index range
65
+ if (indexRange) {
66
+ result.groups = result.groups.filter((g) => {
67
+ const m = /^(\d+)/.exec(g.initiativeName);
68
+ return m ? isInIndexRange(parseInt(m[1], 10), indexRange) : true;
69
+ });
70
+ result.totalItems = result.groups.reduce((sum, g) => sum + g.totalItems, 0);
71
+ result.completedItems = result.groups.reduce((sum, g) => sum + g.completedItems, 0);
72
+ result.pendingItems = result.totalItems - result.completedItems;
73
+ }
74
+ }
75
+ if (opts.json) {
76
+ printJson(result);
77
+ return;
78
+ }
79
+ // Terminal output: grouped by initiative
80
+ for (const group of result.groups) {
81
+ console.log(label(`\n${group.initiativeName}`));
82
+ for (const item of group.items) {
83
+ const marker = item.done ? success('[x]') : dim('[ ]');
84
+ console.log(` ${marker} ${item.name}`);
85
+ }
86
+ console.log(dim(` ${group.completedItems}/${group.totalItems} complete`));
87
+ }
88
+ console.log('');
89
+ console.log(valueStyle(`Total: ${result.totalItems} items, ${result.pendingItems} pending`));
90
+ }
91
+ catch (err) {
92
+ handleError(err);
93
+ }
94
+ });
95
+ }
96
+ //# sourceMappingURL=future.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"future.js","sourceRoot":"","sources":["../../src/commands/future.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ import type { GuideMethod } from '@context-forge/core';
3
+ /** Install guides for a project. Errors propagate to the caller. */
4
+ export declare function guidesInstallAction(projectPath: string, opts?: {
5
+ strategy?: GuideMethod;
6
+ source?: string;
7
+ }): Promise<void>;
8
+ export declare function registerGuidesCommand(program: Command): void;
9
+ //# sourceMappingURL=guides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../src/commands/guides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAsEvD,oEAAoE;AACpE,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8F5D"}
@@ -0,0 +1,156 @@
1
+ import { Command } from 'commander';
2
+ import { FileProjectStore, GuideManager, ConfigManager } from '@context-forge/core/node';
3
+ import { resolveProjectWorktree } from '../utils/project.js';
4
+ import { withJsonOption, withProjectOption } from '../options.js';
5
+ import { handleError, UserError } from '../utils/errors.js';
6
+ import { printJson } from '../output/formatter.js';
7
+ import { label, value as valueStyle, dim, success, warn } from '../output/styles.js';
8
+ /** Resolve project and worktree context for guide operations */
9
+ async function getGuideContext(projectOpt) {
10
+ const store = new FileProjectStore();
11
+ const { id, worktreeId } = await resolveProjectWorktree({ project: projectOpt }, store);
12
+ const project = await store.getById(id);
13
+ if (!project) {
14
+ throw new UserError(`Project not found: '${id}'.`);
15
+ }
16
+ if (!project.projectPath) {
17
+ throw new UserError(`Project '${project.name}' has no configured project path.\n` +
18
+ ' Run cf init in the project directory to set the path.');
19
+ }
20
+ let operationPath = project.projectPath;
21
+ if (worktreeId && project.worktrees) {
22
+ const wt = project.worktrees.find((w) => w.id === worktreeId);
23
+ if (wt?.worktreePath) {
24
+ operationPath = wt.worktreePath;
25
+ }
26
+ }
27
+ return { projectPath: project.projectPath, operationPath, worktreeId };
28
+ }
29
+ /** Show guide status */
30
+ async function showStatus(opts) {
31
+ const ctx = await getGuideContext(opts.project);
32
+ const cm = new ConfigManager(ctx.projectPath);
33
+ const manager = new GuideManager(ctx.projectPath, cm, ctx.operationPath);
34
+ const info = await manager.status();
35
+ if (opts.json) {
36
+ printJson(info);
37
+ return;
38
+ }
39
+ console.log(label('Guide Status'));
40
+ console.log(` ${label('Installed:')} ${info.installed ? valueStyle('yes') : dim('no')}`);
41
+ if (info.installed) {
42
+ console.log(` ${label('Method:')} ${valueStyle(info.method ?? 'unknown')}`);
43
+ console.log(` ${label('Version:')} ${valueStyle(info.version ?? 'unknown')}`);
44
+ console.log(` ${label('Path:')} ${dim(info.path)}`);
45
+ if (info.updateAvailable) {
46
+ console.log(` ${label('Update:')} ${warn(`${info.latestVersion} available`)}`);
47
+ }
48
+ }
49
+ else {
50
+ console.log(` ${label('Guides:')} ${dim('not installed (required for context generation)')}`);
51
+ console.log(` ${dim(' Run cf guides install to install guides.')}`);
52
+ }
53
+ if (info.latestVersion) {
54
+ console.log(` ${label('Latest:')} ${dim(info.latestVersion)}`);
55
+ }
56
+ }
57
+ /** Install guides for a project. Errors propagate to the caller. */
58
+ export async function guidesInstallAction(projectPath, opts) {
59
+ const cm = new ConfigManager(projectPath);
60
+ const manager = new GuideManager(projectPath, cm);
61
+ const result = await manager.install(opts?.strategy, opts?.source);
62
+ console.log(success('Guide installed successfully.'));
63
+ console.log(` ${label('Version:')} ${valueStyle(result.version ?? 'unknown')}`);
64
+ console.log(` ${label('Method:')} ${valueStyle(result.method)}`);
65
+ console.log(` ${label('Path:')} ${dim(result.path)}`);
66
+ }
67
+ export function registerGuidesCommand(program) {
68
+ const cmd = program
69
+ .command('guides')
70
+ .description('Manage AI project guide installation and updates');
71
+ // cf guides info (also the default for bare `cf guides`)
72
+ const infoCmd = new Command('info')
73
+ .description('Show guide installation status (default)');
74
+ withJsonOption(infoCmd);
75
+ withProjectOption(infoCmd);
76
+ infoCmd.action(async (opts) => {
77
+ try {
78
+ await showStatus(opts);
79
+ }
80
+ catch (err) {
81
+ handleError(err);
82
+ }
83
+ });
84
+ cmd.addCommand(infoCmd, { isDefault: true });
85
+ // cf guides install
86
+ const installCmd = cmd
87
+ .command('install')
88
+ .description('Install the AI project guide')
89
+ .option('--strategy <method>', 'Installation strategy: submodule, clone, or manual')
90
+ .option('--source <url>', 'Source repository URL');
91
+ withProjectOption(installCmd);
92
+ installCmd.action(async (opts) => {
93
+ try {
94
+ const ctx = await getGuideContext(opts.project);
95
+ await guidesInstallAction(ctx.projectPath, { strategy: opts.strategy, source: opts.source });
96
+ }
97
+ catch (err) {
98
+ handleError(err);
99
+ }
100
+ });
101
+ // cf guides uninstall
102
+ const uninstallCmd = cmd
103
+ .command('uninstall')
104
+ .description('Uninstall the AI project guide (deinits submodule if applicable)');
105
+ withProjectOption(uninstallCmd);
106
+ uninstallCmd.action(async (opts) => {
107
+ try {
108
+ const ctx = await getGuideContext(opts.project);
109
+ const cm = new ConfigManager(ctx.projectPath);
110
+ const manager = new GuideManager(ctx.projectPath, cm, ctx.operationPath);
111
+ const result = await manager.uninstall();
112
+ const isWorktree = ctx.operationPath !== ctx.projectPath;
113
+ if (isWorktree) {
114
+ console.log(success('Guide deinited from worktree.'));
115
+ console.log(dim(` You can now run: git worktree remove --force ${ctx.operationPath}`));
116
+ }
117
+ else {
118
+ console.log(success('Guide uninstalled successfully.'));
119
+ }
120
+ console.log(` ${label('Version:')} ${valueStyle(result.version ?? 'unknown')}`);
121
+ console.log(` ${label('Method:')} ${valueStyle(result.method)}`);
122
+ if (!isWorktree && result.method === 'submodule') {
123
+ console.log(dim(' Note: submodule removal affects all worktrees. Run cf guides install to reinstall.'));
124
+ }
125
+ }
126
+ catch (err) {
127
+ handleError(err);
128
+ }
129
+ });
130
+ // cf guides update
131
+ const updateCmd = cmd
132
+ .command('update')
133
+ .description('Update an existing guide installation');
134
+ withProjectOption(updateCmd);
135
+ updateCmd.action(async (opts) => {
136
+ try {
137
+ const ctx = await getGuideContext(opts.project);
138
+ const cm = new ConfigManager(ctx.projectPath);
139
+ const manager = new GuideManager(ctx.projectPath, cm, ctx.operationPath);
140
+ const result = await manager.update();
141
+ if (result.previousVersion === result.newVersion) {
142
+ console.log(success('Guide is already at the latest version.'));
143
+ console.log(` ${label('Version:')} ${valueStyle(result.newVersion ?? 'unknown')}`);
144
+ }
145
+ else {
146
+ console.log(success('Guide updated successfully.'));
147
+ console.log(` ${label('Version:')} ${dim(result.previousVersion ?? 'unknown')} → ${valueStyle(result.newVersion ?? 'unknown')}`);
148
+ console.log(` ${label('Method:')} ${valueStyle(result.method)}`);
149
+ }
150
+ }
151
+ catch (err) {
152
+ handleError(err);
153
+ }
154
+ });
155
+ }
156
+ //# sourceMappingURL=guides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/commands/guides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF1D"}
@@ -0,0 +1,124 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { FileProjectStore } from '@context-forge/core/node';
5
+ import { buildProjectCreationDefaults } from '@context-forge/core';
6
+ import { handleError } from '../utils/errors.js';
7
+ import { success, warn, dim } from '../output/styles.js';
8
+ import { guidesInstallAction } from './guides.js';
9
+ import { setupIdeAction } from './setup-ide.js';
10
+ import { installCommandsAction } from './commandInstaller.js';
11
+ /**
12
+ * Returns true if the cwd is a git worktree whose main worktree is already
13
+ * registered as a CF project.
14
+ */
15
+ function isGitWorktreeOf(cwd, registeredPaths) {
16
+ try {
17
+ const output = execFileSync('git', ['worktree', 'list', '--porcelain'], {
18
+ cwd,
19
+ encoding: 'utf8',
20
+ });
21
+ const worktreePaths = [];
22
+ for (const line of output.split('\n')) {
23
+ if (line.startsWith('worktree ')) {
24
+ worktreePaths.push(line.slice('worktree '.length).trim());
25
+ }
26
+ }
27
+ const mainWorktreePath = worktreePaths[0];
28
+ if (!mainWorktreePath)
29
+ return false;
30
+ return registeredPaths.includes(mainWorktreePath) && mainWorktreePath !== cwd;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export function registerInitCommand(program) {
37
+ program
38
+ .command('init')
39
+ .description('Initialize a Context Forge project in the current directory')
40
+ .option('--name <name>', 'Project name (defaults to directory basename)')
41
+ .option('--lite', 'Create project entry only, skip guides/commands/IDE setup')
42
+ .option('--ide <target>', 'IDE target for setup (default: claude)')
43
+ .option('--no-ide', 'Skip IDE configuration step')
44
+ .action(async (opts) => {
45
+ try {
46
+ const cwd = path.resolve(process.cwd());
47
+ const store = new FileProjectStore();
48
+ const all = await store.getAll();
49
+ // Detection 1: No .git directory → git init
50
+ if (!fs.existsSync(path.join(cwd, '.git'))) {
51
+ try {
52
+ execFileSync('git', ['init'], { cwd, stdio: 'inherit' });
53
+ console.log(success('git initialized'));
54
+ }
55
+ catch {
56
+ console.log(warn('git init failed, continuing without git'));
57
+ }
58
+ }
59
+ // Detection 2: CF project already registered at CWD — skip creation but continue setup
60
+ const existing = all.find((p) => p.projectPath === cwd);
61
+ if (existing) {
62
+ console.log(dim(`Project '${existing.name}' already registered — running setup steps`));
63
+ }
64
+ else {
65
+ // Detection 3: Git worktree of a registered project
66
+ const registeredPaths = all
67
+ .filter((p) => p.projectPath)
68
+ .map((p) => p.projectPath);
69
+ if (isGitWorktreeOf(cwd, registeredPaths)) {
70
+ console.log(warn('This looks like a worktree. Run cf worktree init instead.'));
71
+ return;
72
+ }
73
+ // Create project
74
+ const projectName = opts.name || path.basename(cwd);
75
+ await store.create(buildProjectCreationDefaults({
76
+ name: projectName,
77
+ projectPath: cwd,
78
+ }));
79
+ console.log(success(`Project '${projectName}' registered`));
80
+ }
81
+ if (!opts.lite) {
82
+ // Step 2: Install guides
83
+ try {
84
+ await guidesInstallAction(cwd);
85
+ console.log(success('Guides installed'));
86
+ }
87
+ catch (err) {
88
+ const msg = err.message ?? '';
89
+ if (msg.toLowerCase().includes('already installed')) {
90
+ console.log(dim(' Guides already installed — skipping'));
91
+ }
92
+ else {
93
+ console.log(warn(`Guides install failed: ${msg}`));
94
+ }
95
+ }
96
+ // Step 3: Install commands
97
+ try {
98
+ installCommandsAction();
99
+ console.log(success('Commands installed'));
100
+ }
101
+ catch (err) {
102
+ console.log(warn(`Commands install failed: ${err.message}`));
103
+ }
104
+ // Step 4: IDE setup (--no-ide sets opts.ide to false via commander negation)
105
+ if (opts.ide !== false) {
106
+ const ideTarget = typeof opts.ide === 'string' ? opts.ide : 'claude';
107
+ try {
108
+ await setupIdeAction(cwd, ideTarget, { yes: true });
109
+ console.log(success(`IDE configured for ${ideTarget}`));
110
+ }
111
+ catch (err) {
112
+ console.log(warn(`IDE setup failed: ${err.message}`));
113
+ }
114
+ }
115
+ }
116
+ console.log(dim('──────────────────────────────────────'));
117
+ console.log('Your project is ready. Run cf next to see recommended next steps.');
118
+ }
119
+ catch (err) {
120
+ handleError(err);
121
+ }
122
+ });
123
+ }
124
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerListCommand(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF1D"}
@@ -0,0 +1,97 @@
1
+ import { projectListAction } from './project.js';
2
+ import { archListAction } from './arch.js';
3
+ import { planListAction } from './plan.js';
4
+ import { sliceListAction } from './slice.js';
5
+ import { taskListAction, taskItemsAction } from './task.js';
6
+ import { handleError } from '../utils/errors.js';
7
+ import { withJsonOption, withAllOption, withProjectOption } from '../options.js';
8
+ export function registerListCommand(program) {
9
+ const cmd = program
10
+ .command('list')
11
+ .description('List project artifacts');
12
+ const projectsCmd = cmd.command('projects').description('List all projects');
13
+ withJsonOption(projectsCmd);
14
+ projectsCmd.action(async (opts) => {
15
+ try {
16
+ await projectListAction(opts);
17
+ }
18
+ catch (err) {
19
+ handleError(err);
20
+ }
21
+ });
22
+ const initiativesCmd = cmd.command('initiatives').description('List architecture initiatives');
23
+ withJsonOption(initiativesCmd);
24
+ withAllOption(initiativesCmd);
25
+ withProjectOption(initiativesCmd);
26
+ initiativesCmd.action(async (opts) => {
27
+ try {
28
+ await archListAction(opts);
29
+ }
30
+ catch (err) {
31
+ handleError(err);
32
+ }
33
+ });
34
+ const archCmd = cmd.command('arch').description('Alias for "cf list initiatives"');
35
+ withJsonOption(archCmd);
36
+ withAllOption(archCmd);
37
+ withProjectOption(archCmd);
38
+ archCmd.action(async (opts) => {
39
+ try {
40
+ await archListAction(opts);
41
+ }
42
+ catch (err) {
43
+ handleError(err);
44
+ }
45
+ });
46
+ const plansCmd = cmd.command('plans').description('List slice plan files');
47
+ withJsonOption(plansCmd);
48
+ withAllOption(plansCmd);
49
+ withProjectOption(plansCmd);
50
+ plansCmd.action(async (opts) => {
51
+ try {
52
+ await planListAction(opts);
53
+ }
54
+ catch (err) {
55
+ handleError(err);
56
+ }
57
+ });
58
+ const slicesCmd = cmd.command('slices')
59
+ .description('List slices from active plan')
60
+ .argument('[archIndex]', 'Architecture index to target a non-active slice plan (no state mutation)');
61
+ withJsonOption(slicesCmd);
62
+ withProjectOption(slicesCmd);
63
+ slicesCmd.action(async (archIndex, opts) => {
64
+ try {
65
+ await sliceListAction({ ...opts, archIndex });
66
+ }
67
+ catch (err) {
68
+ handleError(err);
69
+ }
70
+ });
71
+ const tasksCmd = cmd.command('tasks')
72
+ .description('List task files from plan')
73
+ .argument('[archIndex]', 'Architecture index to target a non-active slice plan (no state mutation)');
74
+ withJsonOption(tasksCmd);
75
+ withAllOption(tasksCmd);
76
+ withProjectOption(tasksCmd);
77
+ tasksCmd.action(async (archIndex, opts) => {
78
+ try {
79
+ await taskListAction({ ...opts, archIndex });
80
+ }
81
+ catch (err) {
82
+ handleError(err);
83
+ }
84
+ });
85
+ const itemsCmd = cmd.command('items').description('Show items from active task file');
86
+ withJsonOption(itemsCmd);
87
+ withProjectOption(itemsCmd);
88
+ itemsCmd.action(async (opts) => {
89
+ try {
90
+ await taskItemsAction(opts);
91
+ }
92
+ catch (err) {
93
+ handleError(err);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerNextCommand(program: Command): void;
3
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/commands/next.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8C1D"}
@@ -0,0 +1,52 @@
1
+ import { FileProjectStore, WorkflowNavigator, ConfigManager } from '@context-forge/core/node';
2
+ import { resolveProject } from '@context-forge/core';
3
+ import { resolveProjectWorktree } from '../utils/project.js';
4
+ import { handleError, UserError } from '../utils/errors.js';
5
+ import { withJsonOption, withProjectOption } from '../options.js';
6
+ import { printJson } from '../output/formatter.js';
7
+ import { label, value as valueStyle, dim, warn } from '../output/styles.js';
8
+ export function registerNextCommand(program) {
9
+ const nextCmd = program
10
+ .command('next')
11
+ .description('Show recommended next action for the active project');
12
+ withJsonOption(nextCmd);
13
+ withProjectOption(nextCmd);
14
+ nextCmd.action(async (opts) => {
15
+ try {
16
+ const store = new FileProjectStore();
17
+ const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
18
+ const project = await resolveProject(store, id, worktreeId);
19
+ if (!project) {
20
+ throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
21
+ }
22
+ const config = new ConfigManager(project.projectPath);
23
+ const nav = new WorkflowNavigator(config);
24
+ const result = await nav.getNext(project);
25
+ if (opts.json) {
26
+ printJson(result);
27
+ return;
28
+ }
29
+ if (result.warnings?.length) {
30
+ for (const w of result.warnings) {
31
+ console.log(warn('Warning: ') + dim(w));
32
+ }
33
+ console.log('');
34
+ }
35
+ console.log(label('Next: ') + valueStyle(result.recommendation));
36
+ if (result.slice) {
37
+ console.log(label('Slice: ') + valueStyle(result.slice));
38
+ }
39
+ if (result.phase) {
40
+ console.log(label('Phase: ') + valueStyle(result.phase));
41
+ }
42
+ console.log(label('Rationale: ') + dim(result.rationale));
43
+ if (result.suggestedCommand) {
44
+ console.log(label('Run: ') + valueStyle(result.suggestedCommand));
45
+ }
46
+ }
47
+ catch (err) {
48
+ handleError(err);
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/commands/next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Shared action handler for listing slice plans. */
2
+ export declare function planListAction(opts: {
3
+ json?: boolean;
4
+ all?: boolean;
5
+ project?: string;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAcA,qDAAqD;AACrD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuG7G"}