@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.
@@ -1,3 +1,7 @@
1
- import { Command } from 'commander';
2
- export declare function registerArchCommand(program: Command): void;
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsH1D"}
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"}
@@ -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 { handleError, UserError } from '../utils/errors.js';
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
- export function registerArchCommand(program) {
11
- const cmd = program
12
- .command('arch')
13
- .description('Manage architecture');
14
- cmd
15
- .command('list')
16
- .description('List architecture initiatives from the project')
17
- .option('--json', 'Output as JSON')
18
- .option('--all', 'Show initiatives from all worktrees')
19
- .option('--project <name|id>', 'Project name or ID (overrides default)')
20
- .action(async (opts) => {
21
- try {
22
- const store = new FileProjectStore();
23
- const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
24
- const rawProject = await store.getById(id);
25
- if (!rawProject) {
26
- throw new UserError(`Project not found: '${id}'.`);
27
- }
28
- const project = await resolveProject(store, id, worktreeId);
29
- if (!project) {
30
- throw new UserError(`Project not found: '${id}'.`);
31
- }
32
- if (!project.projectPath) {
33
- throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
34
- }
35
- let model;
36
- let indexRange;
37
- if (opts.all && rawProject.worktrees?.length) {
38
- const paths = resolveAllOperationPaths(rawProject);
39
- const models = (await Promise.all(paths.map((p) => buildModel(p).catch(() => null)))).filter((m) => m !== null);
40
- model = mergeProjectModels(models);
41
- // No index filtering in --all mode
42
- }
43
- else {
44
- const operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
45
- indexRange = getWorktreeIndexRange(rawProject, worktreeId);
46
- model = await buildModel(operationPath);
47
- }
48
- const initiativeKeys = Object.keys(model.initiatives)
49
- .filter((key) => isInIndexRange(parseInt(key, 10), indexRange))
50
- .sort((a, b) => parseInt(a, 10) - parseInt(b, 10));
51
- if (initiativeKeys.length === 0) {
52
- console.log(dim('No initiatives found in project.'));
53
- return;
54
- }
55
- const activeIndex = extractSliceIndex(project.fileSlice);
56
- const entries = initiativeKeys.map((key) => {
57
- const init = model.initiatives[key];
58
- const baseIndex = parseInt(key, 10);
59
- const archName = init.arch?.name ?? '—';
60
- const planName = init.slicePlan?.name ?? '—';
61
- const completedSlices = init.slices.filter((s) => s.status === 'complete').length;
62
- const totalSlices = init.slices.length;
63
- const progress = totalSlices > 0
64
- ? `${completedSlices}/${totalSlices}`
65
- : '—';
66
- // Determine if this initiative contains the active slice
67
- const isActive = activeIndex !== null && init.slices.some((s) => parseInt(s.index, 10) === activeIndex);
68
- return {
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":"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"}
1
+ {"version":3,"file":"arch.js","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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,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;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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"}
@@ -1,3 +1,7 @@
1
- import { Command } from 'commander';
2
- export declare function registerPlanCommand(program: Command): void;
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":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuH1D"}
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"}
@@ -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 { handleError, UserError } from '../utils/errors.js';
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
- export function registerPlanCommand(program) {
12
- const cmd = program
13
- .command('plan')
14
- .description('Manage slice plans');
15
- cmd
16
- .command('list')
17
- .description('List slice plan files from the architecture directory')
18
- .option('--json', 'Output as JSON')
19
- .option('--all', 'Show slice plans from all worktrees')
20
- .option('--project <name|id>', 'Project name or ID (overrides default)')
21
- .action(async (opts) => {
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
- const store = new FileProjectStore();
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 (err) {
112
- handleError(err);
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