@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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|