@context-forge/cli 0.6.21 → 0.6.22
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 +6 -2
- package/dist/commands/arch.d.ts.map +1 -1
- package/dist/commands/arch.js +76 -91
- package/dist/commands/arch.js.map +1 -1
- package/dist/commands/build.d.ts +6 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +31 -0
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +106 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/plan.d.ts +6 -2
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +86 -101
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/project.d.ts +4 -0
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +37 -33
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/slice.d.ts +5 -2
- package/dist/commands/slice.d.ts.map +1 -1
- package/dist/commands/slice.js +80 -94
- package/dist/commands/slice.js.map +1 -1
- package/dist/commands/task.d.ts +11 -2
- package/dist/commands/task.d.ts.map +1 -1
- package/dist/commands/task.js +39 -63
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +185 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/arch.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function
|
|
1
|
+
/** Shared action handler for listing architecture initiatives. */
|
|
2
|
+
export declare function archListAction(opts: {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
all?: boolean;
|
|
5
|
+
project?: string;
|
|
6
|
+
}): Promise<void>;
|
|
3
7
|
//# sourceMappingURL=arch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch.d.ts","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arch.d.ts","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"AAUA,kEAAkE;AAClE,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,CAsG7G"}
|
package/dist/commands/arch.js
CHANGED
|
@@ -3,100 +3,85 @@ import { extractSliceIndex } from '@context-forge/core/node';
|
|
|
3
3
|
import { resolveProjectWorktree } from '../utils/project.js';
|
|
4
4
|
import { resolveProject } from '@context-forge/core';
|
|
5
5
|
import { resolveOperationPath, getWorktreeIndexRange, isInIndexRange, resolveAllOperationPaths } from '../utils/worktree-overlay.js';
|
|
6
|
-
import {
|
|
6
|
+
import { UserError } from '../utils/errors.js';
|
|
7
7
|
import { printJson } from '../output/formatter.js';
|
|
8
8
|
import { renderTable } from '../output/tables.js';
|
|
9
9
|
import { label, success, dim } from '../output/styles.js';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
index: key,
|
|
70
|
-
baseIndex,
|
|
71
|
-
name: init.name,
|
|
72
|
-
archDoc: archName,
|
|
73
|
-
slicePlan: planName,
|
|
74
|
-
progress,
|
|
75
|
-
completedSlices,
|
|
76
|
-
totalSlices,
|
|
77
|
-
isActive,
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
if (opts.json) {
|
|
81
|
-
printJson(entries);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
console.log(label('\nArchitecture Initiatives'));
|
|
85
|
-
const rows = entries.map((e) => {
|
|
86
|
-
const indicator = e.isActive ? success(' ← active') : '';
|
|
87
|
-
return [
|
|
88
|
-
e.index,
|
|
89
|
-
e.name,
|
|
90
|
-
dim(e.archDoc),
|
|
91
|
-
dim(e.slicePlan),
|
|
92
|
-
e.progress + indicator,
|
|
93
|
-
];
|
|
94
|
-
});
|
|
95
|
-
console.log(renderTable(['Index', 'Initiative', 'Arch Doc', 'Slice Plan', 'Progress'], rows));
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
handleError(err);
|
|
99
|
-
}
|
|
10
|
+
/** Shared action handler for listing architecture initiatives. */
|
|
11
|
+
export async function archListAction(opts) {
|
|
12
|
+
const store = new FileProjectStore();
|
|
13
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
14
|
+
const rawProject = await store.getById(id);
|
|
15
|
+
if (!rawProject) {
|
|
16
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
17
|
+
}
|
|
18
|
+
const project = await resolveProject(store, id, worktreeId);
|
|
19
|
+
if (!project) {
|
|
20
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
21
|
+
}
|
|
22
|
+
if (!project.projectPath) {
|
|
23
|
+
throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
|
|
24
|
+
}
|
|
25
|
+
let model;
|
|
26
|
+
let indexRange;
|
|
27
|
+
if (opts.all && rawProject.worktrees?.length) {
|
|
28
|
+
const paths = resolveAllOperationPaths(rawProject);
|
|
29
|
+
const models = (await Promise.all(paths.map((p) => buildModel(p).catch(() => null)))).filter((m) => m !== null);
|
|
30
|
+
model = mergeProjectModels(models);
|
|
31
|
+
// No index filtering in --all mode
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
|
|
35
|
+
indexRange = getWorktreeIndexRange(rawProject, worktreeId);
|
|
36
|
+
model = await buildModel(operationPath);
|
|
37
|
+
}
|
|
38
|
+
const initiativeKeys = Object.keys(model.initiatives)
|
|
39
|
+
.filter((key) => isInIndexRange(parseInt(key, 10), indexRange))
|
|
40
|
+
.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));
|
|
41
|
+
if (initiativeKeys.length === 0) {
|
|
42
|
+
console.log(dim('No initiatives found in project.'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const activeIndex = extractSliceIndex(project.fileSlice);
|
|
46
|
+
const entries = initiativeKeys.map((key) => {
|
|
47
|
+
const init = model.initiatives[key];
|
|
48
|
+
const baseIndex = parseInt(key, 10);
|
|
49
|
+
const archName = init.arch?.name ?? '—';
|
|
50
|
+
const planName = init.slicePlan?.name ?? '—';
|
|
51
|
+
const completedSlices = init.slices.filter((s) => s.status === 'complete').length;
|
|
52
|
+
const totalSlices = init.slices.length;
|
|
53
|
+
const progress = totalSlices > 0
|
|
54
|
+
? `${completedSlices}/${totalSlices}`
|
|
55
|
+
: '—';
|
|
56
|
+
// Determine if this initiative contains the active slice
|
|
57
|
+
const isActive = activeIndex !== null && init.slices.some((s) => parseInt(s.index, 10) === activeIndex);
|
|
58
|
+
return {
|
|
59
|
+
index: key,
|
|
60
|
+
baseIndex,
|
|
61
|
+
name: init.name,
|
|
62
|
+
archDoc: archName,
|
|
63
|
+
slicePlan: planName,
|
|
64
|
+
progress,
|
|
65
|
+
completedSlices,
|
|
66
|
+
totalSlices,
|
|
67
|
+
isActive,
|
|
68
|
+
};
|
|
100
69
|
});
|
|
70
|
+
if (opts.json) {
|
|
71
|
+
printJson(entries);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
console.log(label('\nArchitecture Initiatives'));
|
|
75
|
+
const rows = entries.map((e) => {
|
|
76
|
+
const indicator = e.isActive ? success(' ← active') : '';
|
|
77
|
+
return [
|
|
78
|
+
e.index,
|
|
79
|
+
e.name,
|
|
80
|
+
dim(e.archDoc),
|
|
81
|
+
dim(e.slicePlan),
|
|
82
|
+
e.progress + indicator,
|
|
83
|
+
];
|
|
84
|
+
});
|
|
85
|
+
console.log(renderTable(['Index', 'Initiative', 'Arch Doc', 'Slice Plan', 'Progress'], rows));
|
|
101
86
|
}
|
|
102
87
|
//# sourceMappingURL=arch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/build.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/** Core build logic: resolves project, generates context, prints to stdout. */
|
|
3
|
+
export declare function buildAndPrint(opts: {
|
|
4
|
+
project?: string;
|
|
5
|
+
phase?: string;
|
|
6
|
+
slice?: string;
|
|
7
|
+
}): Promise<void>;
|
|
2
8
|
export declare function registerBuildCommand(program: Command): void;
|
|
3
9
|
//# sourceMappingURL=build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D3D"}
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC7G;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D3D"}
|
package/dist/commands/build.js
CHANGED
|
@@ -4,6 +4,37 @@ import { resolveProject } from '@context-forge/core';
|
|
|
4
4
|
import { resolveProjectWorktree } from '../utils/project.js';
|
|
5
5
|
import { handleError, UserError } from '../utils/errors.js';
|
|
6
6
|
import { printRaw } from '../output/formatter.js';
|
|
7
|
+
/** Core build logic: resolves project, generates context, prints to stdout. */
|
|
8
|
+
export async function buildAndPrint(opts) {
|
|
9
|
+
const store = new FileProjectStore();
|
|
10
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
11
|
+
const project = await resolveProject(store, id, worktreeId);
|
|
12
|
+
if (!project) {
|
|
13
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
14
|
+
}
|
|
15
|
+
if (!project.projectPath) {
|
|
16
|
+
throw new UserError(`Project '${project.name}' has no projectPath configured.\n` +
|
|
17
|
+
' cf project set projectPath /path/to/project');
|
|
18
|
+
}
|
|
19
|
+
// Status message goes to stderr so stdout stays clean for piping
|
|
20
|
+
process.stderr.write(`Building context for ${project.name}...\n`);
|
|
21
|
+
// Apply overrides to a working copy
|
|
22
|
+
const workingCopy = { ...project };
|
|
23
|
+
if (opts.phase) {
|
|
24
|
+
const resolved = resolvePhaseValue(opts.phase);
|
|
25
|
+
if (!resolved) {
|
|
26
|
+
process.stderr.write(`Warning: '${opts.phase}' is not a recognized phase. Use a number (0-7), name (implementation), or shorthand (P6).\n`);
|
|
27
|
+
}
|
|
28
|
+
const phaseValue = resolved ?? opts.phase;
|
|
29
|
+
workingCopy.developmentPhase = phaseValue;
|
|
30
|
+
workingCopy.instruction = phaseValue;
|
|
31
|
+
}
|
|
32
|
+
if (opts.slice)
|
|
33
|
+
workingCopy.fileSlice = opts.slice;
|
|
34
|
+
const { integrator } = createContextPipeline(workingCopy.projectPath);
|
|
35
|
+
const contextString = await integrator.generateContextFromProject(workingCopy, worktreeId);
|
|
36
|
+
printRaw(contextString);
|
|
37
|
+
}
|
|
7
38
|
export function registerBuildCommand(program) {
|
|
8
39
|
program
|
|
9
40
|
.command('build')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.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;AAQpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkG1D"}
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
export function registerListCommand(program) {
|
|
8
|
+
const cmd = program
|
|
9
|
+
.command('list')
|
|
10
|
+
.description('List project artifacts');
|
|
11
|
+
cmd
|
|
12
|
+
.command('projects')
|
|
13
|
+
.description('List all projects')
|
|
14
|
+
.option('--json', 'Output as JSON')
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
try {
|
|
17
|
+
await projectListAction(opts);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
handleError(err);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
cmd
|
|
24
|
+
.command('initiatives')
|
|
25
|
+
.description('List architecture initiatives')
|
|
26
|
+
.option('--json', 'Output as JSON')
|
|
27
|
+
.option('--all', 'Show initiatives from all worktrees')
|
|
28
|
+
.option('--project <name|id>', 'Project name or ID (overrides default)')
|
|
29
|
+
.action(async (opts) => {
|
|
30
|
+
try {
|
|
31
|
+
await archListAction(opts);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
handleError(err);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
cmd
|
|
38
|
+
.command('arch')
|
|
39
|
+
.description('Alias for "cf list initiatives"')
|
|
40
|
+
.option('--json', 'Output as JSON')
|
|
41
|
+
.option('--all', 'Show initiatives from all worktrees')
|
|
42
|
+
.option('--project <name|id>', 'Project name or ID (overrides default)')
|
|
43
|
+
.action(async (opts) => {
|
|
44
|
+
try {
|
|
45
|
+
await archListAction(opts);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
handleError(err);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
cmd
|
|
52
|
+
.command('plans')
|
|
53
|
+
.description('List slice plan files')
|
|
54
|
+
.option('--json', 'Output as JSON')
|
|
55
|
+
.option('--all', 'Show slice plans from all worktrees')
|
|
56
|
+
.option('--project <name|id>', 'Project name or ID (overrides default)')
|
|
57
|
+
.action(async (opts) => {
|
|
58
|
+
try {
|
|
59
|
+
await planListAction(opts);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
handleError(err);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
cmd
|
|
66
|
+
.command('slices')
|
|
67
|
+
.description('List slices from active plan')
|
|
68
|
+
.option('--json', 'Output as JSON')
|
|
69
|
+
.option('--project <name|id>', 'Project name or ID (overrides default)')
|
|
70
|
+
.action(async (opts) => {
|
|
71
|
+
try {
|
|
72
|
+
await sliceListAction(opts);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
handleError(err);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
cmd
|
|
79
|
+
.command('tasks')
|
|
80
|
+
.description('List task files from plan')
|
|
81
|
+
.option('--json', 'Output as JSON')
|
|
82
|
+
.option('--all', 'Show task files from all worktrees')
|
|
83
|
+
.option('--project <name|id>', 'Project name or ID (overrides default)')
|
|
84
|
+
.action(async (opts) => {
|
|
85
|
+
try {
|
|
86
|
+
await taskListAction(opts);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
handleError(err);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
cmd
|
|
93
|
+
.command('items')
|
|
94
|
+
.description('Show items from active task file')
|
|
95
|
+
.option('--json', 'Output as JSON')
|
|
96
|
+
.option('--project <name|id>', 'Project name or ID (overrides default)')
|
|
97
|
+
.action(async (opts) => {
|
|
98
|
+
try {
|
|
99
|
+
await taskItemsAction(opts);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
handleError(err);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# 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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"}
|
package/dist/commands/plan.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function
|
|
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>;
|
|
3
7
|
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/plan.js
CHANGED
|
@@ -4,113 +4,98 @@ import { FileProjectStore, parseSlicePlan, } from '@context-forge/core/node';
|
|
|
4
4
|
import { resolveProjectWorktree } from '../utils/project.js';
|
|
5
5
|
import { resolveProject } from '@context-forge/core';
|
|
6
6
|
import { resolveOperationPath, getWorktreeIndexRange, isInIndexRange, resolveAllOperationPaths } from '../utils/worktree-overlay.js';
|
|
7
|
-
import {
|
|
7
|
+
import { UserError } from '../utils/errors.js';
|
|
8
8
|
import { printJson } from '../output/formatter.js';
|
|
9
9
|
import { renderTable } from '../output/tables.js';
|
|
10
10
|
import { label, success, dim } from '../output/styles.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
/** Shared action handler for listing slice plans. */
|
|
12
|
+
export async function planListAction(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.projectPath) {
|
|
24
|
+
throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
|
|
25
|
+
}
|
|
26
|
+
let scanPaths;
|
|
27
|
+
let indexRange;
|
|
28
|
+
if (opts.all && rawProject.worktrees?.length) {
|
|
29
|
+
scanPaths = resolveAllOperationPaths(rawProject);
|
|
30
|
+
// No index filtering in --all mode
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
|
|
34
|
+
scanPaths = [operationPath];
|
|
35
|
+
indexRange = getWorktreeIndexRange(rawProject, worktreeId);
|
|
36
|
+
}
|
|
37
|
+
// Collect plan files from all scan paths, deduplicate by filename
|
|
38
|
+
const seen = new Set();
|
|
39
|
+
const planFiles = [];
|
|
40
|
+
for (const sp of scanPaths) {
|
|
41
|
+
const archDir = join(sp, 'project-documents/user/architecture');
|
|
42
|
+
let files;
|
|
22
43
|
try {
|
|
23
|
-
|
|
24
|
-
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
25
|
-
const rawProject = await store.getById(id);
|
|
26
|
-
if (!rawProject) {
|
|
27
|
-
throw new UserError(`Project not found: '${id}'.`);
|
|
28
|
-
}
|
|
29
|
-
const project = await resolveProject(store, id, worktreeId);
|
|
30
|
-
if (!project) {
|
|
31
|
-
throw new UserError(`Project not found: '${id}'.`);
|
|
32
|
-
}
|
|
33
|
-
if (!project.projectPath) {
|
|
34
|
-
throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
|
|
35
|
-
}
|
|
36
|
-
let scanPaths;
|
|
37
|
-
let indexRange;
|
|
38
|
-
if (opts.all && rawProject.worktrees?.length) {
|
|
39
|
-
scanPaths = resolveAllOperationPaths(rawProject);
|
|
40
|
-
// No index filtering in --all mode
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
const operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
|
|
44
|
-
scanPaths = [operationPath];
|
|
45
|
-
indexRange = getWorktreeIndexRange(rawProject, worktreeId);
|
|
46
|
-
}
|
|
47
|
-
// Collect plan files from all scan paths, deduplicate by filename
|
|
48
|
-
const seen = new Set();
|
|
49
|
-
const planFiles = [];
|
|
50
|
-
for (const sp of scanPaths) {
|
|
51
|
-
const archDir = join(sp, 'project-documents/user/architecture');
|
|
52
|
-
let files;
|
|
53
|
-
try {
|
|
54
|
-
files = await readdir(archDir);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
for (const f of files) {
|
|
60
|
-
if (!/^\d+-slices\..*\.md$/.test(f))
|
|
61
|
-
continue;
|
|
62
|
-
const m = /^(\d+)-/.exec(f);
|
|
63
|
-
if (m && !isInIndexRange(parseInt(m[1], 10), indexRange))
|
|
64
|
-
continue;
|
|
65
|
-
if (!seen.has(f)) {
|
|
66
|
-
seen.add(f);
|
|
67
|
-
planFiles.push({ filename: f, archDir });
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
planFiles.sort((a, b) => a.filename.localeCompare(b.filename));
|
|
72
|
-
if (scanPaths.length > 0 && planFiles.length === 0 && !seen.size) {
|
|
73
|
-
throw new UserError('Architecture directory not found: project-documents/user/architecture/');
|
|
74
|
-
}
|
|
75
|
-
if (planFiles.length === 0) {
|
|
76
|
-
console.log(dim('No slice plans found in project.'));
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
// Determine active plan stem (without .md)
|
|
80
|
-
const activeStem = project.fileSlicePlan ?? null;
|
|
81
|
-
const entries = await Promise.all(planFiles.map(async ({ filename, archDir }) => {
|
|
82
|
-
const stem = filename.replace(/\.md$/, '');
|
|
83
|
-
const indexMatch = /^(\d+)-/.exec(filename);
|
|
84
|
-
const index = indexMatch ? indexMatch[1] : '—';
|
|
85
|
-
const planPath = join(archDir, filename);
|
|
86
|
-
const result = await parseSlicePlan(planPath);
|
|
87
|
-
const isActive = stem === activeStem;
|
|
88
|
-
return {
|
|
89
|
-
index,
|
|
90
|
-
file: stem,
|
|
91
|
-
completed: result.completedSlices,
|
|
92
|
-
total: result.totalSlices,
|
|
93
|
-
isActive,
|
|
94
|
-
};
|
|
95
|
-
}));
|
|
96
|
-
if (opts.json) {
|
|
97
|
-
printJson(entries);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
console.log(label('\nSlice Plans'));
|
|
101
|
-
const rows = entries.map((e) => {
|
|
102
|
-
const progress = e.total > 0
|
|
103
|
-
? `${e.completed}/${e.total}`
|
|
104
|
-
: '—';
|
|
105
|
-
const active = e.isActive ? success(' ← active') : '';
|
|
106
|
-
const icon = e.total > 0 && e.completed === e.total ? success('✓') : dim('○');
|
|
107
|
-
return [e.index, icon + ' ' + e.file, progress + active];
|
|
108
|
-
});
|
|
109
|
-
console.log(renderTable(['#', 'Plan', 'Progress'], rows));
|
|
44
|
+
files = await readdir(archDir);
|
|
110
45
|
}
|
|
111
|
-
catch
|
|
112
|
-
|
|
46
|
+
catch {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
for (const f of files) {
|
|
50
|
+
if (!/^\d+-slices\..*\.md$/.test(f))
|
|
51
|
+
continue;
|
|
52
|
+
const m = /^(\d+)-/.exec(f);
|
|
53
|
+
if (m && !isInIndexRange(parseInt(m[1], 10), indexRange))
|
|
54
|
+
continue;
|
|
55
|
+
if (!seen.has(f)) {
|
|
56
|
+
seen.add(f);
|
|
57
|
+
planFiles.push({ filename: f, archDir });
|
|
58
|
+
}
|
|
113
59
|
}
|
|
60
|
+
}
|
|
61
|
+
planFiles.sort((a, b) => a.filename.localeCompare(b.filename));
|
|
62
|
+
if (scanPaths.length > 0 && planFiles.length === 0 && !seen.size) {
|
|
63
|
+
throw new UserError('Architecture directory not found: project-documents/user/architecture/');
|
|
64
|
+
}
|
|
65
|
+
if (planFiles.length === 0) {
|
|
66
|
+
console.log(dim('No slice plans found in project.'));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Determine active plan stem (without .md)
|
|
70
|
+
const activeStem = project.fileSlicePlan ?? null;
|
|
71
|
+
const entries = await Promise.all(planFiles.map(async ({ filename, archDir }) => {
|
|
72
|
+
const stem = filename.replace(/\.md$/, '');
|
|
73
|
+
const indexMatch = /^(\d+)-/.exec(filename);
|
|
74
|
+
const index = indexMatch ? indexMatch[1] : '—';
|
|
75
|
+
const planPath = join(archDir, filename);
|
|
76
|
+
const result = await parseSlicePlan(planPath);
|
|
77
|
+
const isActive = stem === activeStem;
|
|
78
|
+
return {
|
|
79
|
+
index,
|
|
80
|
+
file: stem,
|
|
81
|
+
completed: result.completedSlices,
|
|
82
|
+
total: result.totalSlices,
|
|
83
|
+
isActive,
|
|
84
|
+
};
|
|
85
|
+
}));
|
|
86
|
+
if (opts.json) {
|
|
87
|
+
printJson(entries);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
console.log(label('\nSlice Plans'));
|
|
91
|
+
const rows = entries.map((e) => {
|
|
92
|
+
const progress = e.total > 0
|
|
93
|
+
? `${e.completed}/${e.total}`
|
|
94
|
+
: '—';
|
|
95
|
+
const active = e.isActive ? success(' ← active') : '';
|
|
96
|
+
const icon = e.total > 0 && e.completed === e.total ? success('✓') : dim('○');
|
|
97
|
+
return [e.index, icon + ' ' + e.file, progress + active];
|
|
114
98
|
});
|
|
99
|
+
console.log(renderTable(['#', 'Plan', 'Progress'], rows));
|
|
115
100
|
}
|
|
116
101
|
//# sourceMappingURL=plan.js.map
|