@context-forge/cli 0.8.3 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/package.json +2 -2
  2. package/dist/commands/arch.d.ts +0 -7
  3. package/dist/commands/arch.d.ts.map +0 -1
  4. package/dist/commands/arch.js +0 -160
  5. package/dist/commands/arch.js.map +0 -1
  6. package/dist/commands/backup.d.ts +0 -3
  7. package/dist/commands/backup.d.ts.map +0 -1
  8. package/dist/commands/backup.js +0 -27
  9. package/dist/commands/backup.js.map +0 -1
  10. package/dist/commands/build.d.ts +0 -24
  11. package/dist/commands/build.d.ts.map +0 -1
  12. package/dist/commands/build.js +0 -146
  13. package/dist/commands/build.js.map +0 -1
  14. package/dist/commands/check.d.ts +0 -3
  15. package/dist/commands/check.d.ts.map +0 -1
  16. package/dist/commands/check.js +0 -211
  17. package/dist/commands/check.js.map +0 -1
  18. package/dist/commands/commandInstaller.d.ts +0 -28
  19. package/dist/commands/commandInstaller.d.ts.map +0 -1
  20. package/dist/commands/commandInstaller.js +0 -136
  21. package/dist/commands/commandInstaller.js.map +0 -1
  22. package/dist/commands/config.d.ts +0 -3
  23. package/dist/commands/config.d.ts.map +0 -1
  24. package/dist/commands/config.js +0 -69
  25. package/dist/commands/config.js.map +0 -1
  26. package/dist/commands/future.d.ts +0 -3
  27. package/dist/commands/future.d.ts.map +0 -1
  28. package/dist/commands/future.js +0 -96
  29. package/dist/commands/future.js.map +0 -1
  30. package/dist/commands/guides.d.ts +0 -9
  31. package/dist/commands/guides.d.ts.map +0 -1
  32. package/dist/commands/guides.js +0 -156
  33. package/dist/commands/guides.js.map +0 -1
  34. package/dist/commands/init.d.ts +0 -3
  35. package/dist/commands/init.d.ts.map +0 -1
  36. package/dist/commands/init.js +0 -124
  37. package/dist/commands/init.js.map +0 -1
  38. package/dist/commands/list.d.ts +0 -3
  39. package/dist/commands/list.d.ts.map +0 -1
  40. package/dist/commands/list.js +0 -93
  41. package/dist/commands/list.js.map +0 -1
  42. package/dist/commands/next.d.ts +0 -3
  43. package/dist/commands/next.d.ts.map +0 -1
  44. package/dist/commands/next.js +0 -51
  45. package/dist/commands/next.js.map +0 -1
  46. package/dist/commands/plan.d.ts +0 -7
  47. package/dist/commands/plan.d.ts.map +0 -1
  48. package/dist/commands/plan.js +0 -102
  49. package/dist/commands/plan.js.map +0 -1
  50. package/dist/commands/project.d.ts +0 -25
  51. package/dist/commands/project.d.ts.map +0 -1
  52. package/dist/commands/project.js +0 -550
  53. package/dist/commands/project.js.map +0 -1
  54. package/dist/commands/prompt.d.ts +0 -3
  55. package/dist/commands/prompt.d.ts.map +0 -1
  56. package/dist/commands/prompt.js +0 -112
  57. package/dist/commands/prompt.js.map +0 -1
  58. package/dist/commands/setup-ide.d.ts +0 -15
  59. package/dist/commands/setup-ide.d.ts.map +0 -1
  60. package/dist/commands/setup-ide.js +0 -250
  61. package/dist/commands/setup-ide.js.map +0 -1
  62. package/dist/commands/slice.d.ts +0 -6
  63. package/dist/commands/slice.d.ts.map +0 -1
  64. package/dist/commands/slice.js +0 -100
  65. package/dist/commands/slice.js.map +0 -1
  66. package/dist/commands/status.d.ts +0 -3
  67. package/dist/commands/status.d.ts.map +0 -1
  68. package/dist/commands/status.js +0 -209
  69. package/dist/commands/status.js.map +0 -1
  70. package/dist/commands/task.d.ts +0 -12
  71. package/dist/commands/task.d.ts.map +0 -1
  72. package/dist/commands/task.js +0 -185
  73. package/dist/commands/task.js.map +0 -1
  74. package/dist/commands/update.d.ts +0 -27
  75. package/dist/commands/update.d.ts.map +0 -1
  76. package/dist/commands/update.js +0 -172
  77. package/dist/commands/update.js.map +0 -1
  78. package/dist/commands/workflow.d.ts +0 -3
  79. package/dist/commands/workflow.d.ts.map +0 -1
  80. package/dist/commands/workflow.js +0 -204
  81. package/dist/commands/workflow.js.map +0 -1
  82. package/dist/commands/worktree.d.ts +0 -3
  83. package/dist/commands/worktree.d.ts.map +0 -1
  84. package/dist/commands/worktree.js +0 -371
  85. package/dist/commands/worktree.js.map +0 -1
  86. package/dist/index.d.ts +0 -3
  87. package/dist/index.d.ts.map +0 -1
  88. package/dist/index.js +0 -167
  89. package/dist/index.js.map +0 -1
  90. package/dist/options.d.ts +0 -16
  91. package/dist/options.d.ts.map +0 -1
  92. package/dist/options.js +0 -29
  93. package/dist/options.js.map +0 -1
  94. package/dist/output/formatter.d.ts +0 -6
  95. package/dist/output/formatter.d.ts.map +0 -1
  96. package/dist/output/formatter.js +0 -9
  97. package/dist/output/formatter.js.map +0 -1
  98. package/dist/output/styles.d.ts +0 -15
  99. package/dist/output/styles.d.ts.map +0 -1
  100. package/dist/output/styles.js +0 -16
  101. package/dist/output/styles.js.map +0 -1
  102. package/dist/output/tables.d.ts +0 -6
  103. package/dist/output/tables.d.ts.map +0 -1
  104. package/dist/output/tables.js +0 -45
  105. package/dist/output/tables.js.map +0 -1
  106. package/dist/utils/breaking-changes.d.ts +0 -14
  107. package/dist/utils/breaking-changes.d.ts.map +0 -1
  108. package/dist/utils/breaking-changes.js +0 -11
  109. package/dist/utils/breaking-changes.js.map +0 -1
  110. package/dist/utils/commandCatalog.d.ts +0 -25
  111. package/dist/utils/commandCatalog.d.ts.map +0 -1
  112. package/dist/utils/commandCatalog.js +0 -32
  113. package/dist/utils/commandCatalog.js.map +0 -1
  114. package/dist/utils/confirm.d.ts +0 -3
  115. package/dist/utils/confirm.d.ts.map +0 -1
  116. package/dist/utils/confirm.js +0 -12
  117. package/dist/utils/confirm.js.map +0 -1
  118. package/dist/utils/errors.d.ts +0 -22
  119. package/dist/utils/errors.d.ts.map +0 -1
  120. package/dist/utils/errors.js +0 -63
  121. package/dist/utils/errors.js.map +0 -1
  122. package/dist/utils/phaseShorthand.d.ts +0 -23
  123. package/dist/utils/phaseShorthand.d.ts.map +0 -1
  124. package/dist/utils/phaseShorthand.js +0 -68
  125. package/dist/utils/phaseShorthand.js.map +0 -1
  126. package/dist/utils/project.d.ts +0 -60
  127. package/dist/utils/project.d.ts.map +0 -1
  128. package/dist/utils/project.js +0 -140
  129. package/dist/utils/project.js.map +0 -1
  130. package/dist/utils/worktree-overlay.d.ts +0 -31
  131. package/dist/utils/worktree-overlay.d.ts.map +0 -1
  132. package/dist/utils/worktree-overlay.js +0 -63
  133. package/dist/utils/worktree-overlay.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-forge/cli",
3
- "version": "0.8.3",
3
+ "version": "0.8.5",
4
4
  "description": "CLI for Context Forge — terminal access to context assembly, project management, workflow navigation, and configuration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "chalk": "^5.4.1",
34
34
  "commander": "^13.1.0",
35
- "@context-forge/core": "0.8.3"
35
+ "@context-forge/core": "0.8.5"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^25.3.0",
@@ -1,7 +0,0 @@
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>;
7
- //# sourceMappingURL=arch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arch.d.ts","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"AAuBA,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,CAyC7G"}
@@ -1,160 +0,0 @@
1
- import { join } from 'node:path';
2
- import { readdir } from 'node:fs/promises';
3
- import { FileProjectStore, ArtifactIntrospector, buildModel, mergeProjectModels, resolveInitiativePlanPath, } from '@context-forge/core/node';
4
- import { extractSliceIndex } from '@context-forge/core/node';
5
- import { resolveProjectWorktree } from '../utils/project.js';
6
- import { resolveProject } from '@context-forge/core';
7
- import { resolveOperationPath, getWorktreeIndexRange, isInIndexRange, resolveAllOperationPaths, } from '../utils/worktree-overlay.js';
8
- import { UserError } from '../utils/errors.js';
9
- import { printJson } from '../output/formatter.js';
10
- import { renderTable } from '../output/tables.js';
11
- import { label, success, dim } from '../output/styles.js';
12
- /** Shared action handler for listing architecture initiatives. */
13
- export async function archListAction(opts) {
14
- const store = new FileProjectStore();
15
- const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
16
- const rawProject = await store.getById(id);
17
- if (!rawProject) {
18
- throw new UserError(`Project not found: '${id}'.`);
19
- }
20
- const project = await resolveProject(store, id, worktreeId);
21
- if (!project) {
22
- throw new UserError(`Project not found: '${id}'.`);
23
- }
24
- if (!project.projectPath) {
25
- throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
26
- }
27
- let indexRange;
28
- let operationPath;
29
- if (opts.all && rawProject.worktrees?.length) {
30
- operationPath = project.projectPath;
31
- // No index filtering in --all mode
32
- }
33
- else {
34
- operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
35
- indexRange = getWorktreeIndexRange(rawProject, worktreeId);
36
- }
37
- // Attempt initiative-plan-driven listing first
38
- const initiativePlanPath = await resolveInitiativePlanPath(operationPath);
39
- if (initiativePlanPath) {
40
- await archListFromPlan(initiativePlanPath, operationPath, project, indexRange, opts);
41
- return;
42
- }
43
- // Fallback: filesystem-scan based listing (legacy buildModel behavior)
44
- await archListFromModel(opts, project, rawProject, operationPath, indexRange);
45
- }
46
- /** List initiatives driven from the initiative plan file (primary path). */
47
- async function archListFromPlan(initiativePlanPath, operationPath, project, indexRange, opts) {
48
- const introspector = new ArtifactIntrospector();
49
- const planResult = await introspector.parseSlicePlan(initiativePlanPath);
50
- const filteredEntries = planResult.entries.filter((e) => isInIndexRange(e.index, indexRange));
51
- if (filteredEntries.length === 0) {
52
- console.log(dim('No initiatives found in initiative plan.'));
53
- return;
54
- }
55
- // Active arch index — compare against fileArch on the project
56
- const activeArchIndex = extractSliceIndex(project.fileArch);
57
- // Resolve per-entry arch file existence
58
- const entries = await Promise.all(filteredEntries.map(async (entry) => {
59
- let archFile = null;
60
- try {
61
- const archDir = join(operationPath, 'project-documents/user/architecture');
62
- const files = await readdir(archDir);
63
- const pattern = new RegExp(`^${entry.index}-arch\\.`, 'i');
64
- const found = files.find((f) => pattern.test(f));
65
- if (found) {
66
- archFile = found;
67
- }
68
- }
69
- catch {
70
- // directory missing or unreadable — leave archFile null
71
- }
72
- const status = entry.isChecked
73
- ? 'complete'
74
- : archFile
75
- ? 'in_progress'
76
- : 'not_started';
77
- const isActive = activeArchIndex !== null && entry.index === activeArchIndex;
78
- return {
79
- index: entry.index,
80
- name: entry.name,
81
- status,
82
- archFile,
83
- isActive,
84
- };
85
- }));
86
- if (opts.json) {
87
- printJson(entries);
88
- return;
89
- }
90
- const planName = initiativePlanPath.split('/').pop() ?? initiativePlanPath;
91
- console.log(label(`\nArchitecture Initiatives: ${planName}`));
92
- const rows = entries.map((e) => {
93
- const statusLabel = e.status === 'complete'
94
- ? success('✓ complete')
95
- : e.status === 'in_progress'
96
- ? dim('◑ in progress')
97
- : dim('○ not started');
98
- const file = e.archFile ? dim(e.archFile) : dim('—');
99
- const indicator = e.isActive ? success(' ← active') : '';
100
- return [String(e.index), e.name, statusLabel, file + indicator];
101
- });
102
- console.log(renderTable(['#', 'Initiative', 'Status', 'Arch File'], rows));
103
- }
104
- /** Fallback: list initiatives from buildModel filesystem scan. */
105
- async function archListFromModel(opts, project, rawProject, operationPath, indexRange) {
106
- let model;
107
- if (opts.all && rawProject?.worktrees?.length) {
108
- const paths = resolveAllOperationPaths(rawProject);
109
- const models = (await Promise.all(paths.map((p) => buildModel(p).catch(() => null)))).filter((m) => m !== null);
110
- model = mergeProjectModels(models);
111
- }
112
- else {
113
- model = await buildModel(operationPath);
114
- }
115
- const initiativeKeys = Object.keys(model.initiatives)
116
- .filter((key) => isInIndexRange(parseInt(key, 10), indexRange))
117
- .sort((a, b) => parseInt(a, 10) - parseInt(b, 10));
118
- if (initiativeKeys.length === 0) {
119
- console.log(dim('No initiatives found in project.'));
120
- return;
121
- }
122
- const activeIndex = extractSliceIndex(project.fileSlice);
123
- const entries = initiativeKeys.map((key) => {
124
- const init = model.initiatives[key];
125
- const archName = init.arch?.name ?? '—';
126
- const planName = init.slicePlan?.name ?? '—';
127
- const completedSlices = init.slices.filter((s) => s.status === 'complete').length;
128
- const totalSlices = init.slices.length;
129
- const progress = totalSlices > 0 ? `${completedSlices}/${totalSlices}` : '—';
130
- const isActive = activeIndex !== null && init.slices.some((s) => parseInt(s.index, 10) === activeIndex);
131
- return {
132
- index: key,
133
- baseIndex: parseInt(key, 10),
134
- name: init.name,
135
- archDoc: archName,
136
- slicePlan: planName,
137
- progress,
138
- completedSlices,
139
- totalSlices,
140
- isActive,
141
- };
142
- });
143
- if (opts.json) {
144
- printJson(entries);
145
- return;
146
- }
147
- console.log(label('\nArchitecture Initiatives'));
148
- const rows = entries.map((e) => {
149
- const indicator = e.isActive ? success(' ← active') : '';
150
- return [
151
- e.index,
152
- e.name,
153
- dim(e.archDoc),
154
- dim(e.slicePlan),
155
- e.progress + indicator,
156
- ];
157
- });
158
- console.log(renderTable(['Index', 'Initiative', 'Arch Doc', 'Slice Plan', 'Progress'], rows));
159
- }
160
- //# sourceMappingURL=arch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arch.js","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerBackupCommand(program: Command): void;
3
- //# sourceMappingURL=backup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB5D"}
@@ -1,27 +0,0 @@
1
- import { getStoragePath, createVersionedBackup } from '@context-forge/core/node';
2
- import { handleError } from '../utils/errors.js';
3
- import { success, dim, label } from '../output/styles.js';
4
- /** Files to include in versioned backup. */
5
- const BACKUP_FILES = ['projects.json'];
6
- export function registerBackupCommand(program) {
7
- program
8
- .command('backup')
9
- .description('Create a versioned backup of project data (keeps last 10)')
10
- .action(async () => {
11
- try {
12
- const storagePath = getStoragePath();
13
- console.log(label('Creating versioned backup...'));
14
- console.log(dim(` Storage: ${storagePath}`));
15
- for (const file of BACKUP_FILES) {
16
- await createVersionedBackup(storagePath, file);
17
- console.log(success(` ✓ ${file}`));
18
- }
19
- console.log('');
20
- console.log(success('Backup complete.'));
21
- }
22
- catch (err) {
23
- handleError(err);
24
- }
25
- });
26
- }
27
- //# sourceMappingURL=backup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE1D,4CAA4C;AAC5C,MAAM,YAAY,GAAG,CAAC,eAAe,CAAU,CAAC;AAEhD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC,CAAC;YAE9C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,24 +0,0 @@
1
- import { Command } from 'commander';
2
- interface BuildAndPrintOpts {
3
- project?: string;
4
- phase?: string;
5
- slice?: string;
6
- json?: boolean;
7
- embed?: boolean;
8
- }
9
- /**
10
- * Core build logic: resolves project, generates context.
11
- *
12
- * Output modes:
13
- * - `--json`: JSON object to stdout with project, phase, and context fields
14
- * - bare CLI: help message to stderr, nothing to stdout
15
- *
16
- * Slash commands call the CLI, which outputs to stdout — the slash command
17
- * wrapper captures and frames it as working context. Since bare CLI now shows
18
- * a help message instead of raw prompt, slash commands use `--json` implicitly
19
- * (the `!` backtick syntax in the .md file captures stdout).
20
- */
21
- export declare function buildAndPrint(opts: BuildAndPrintOpts): Promise<void>;
22
- export declare function registerBuildCommand(program: Command): void;
23
- export {};
24
- //# sourceMappingURL=build.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D1E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqF3D"}
@@ -1,146 +0,0 @@
1
- import { FileProjectStore, createContextPipeline, embedReferencedFiles } from '@context-forge/core/node';
2
- import { resolvePhaseValue } from '@context-forge/core';
3
- import { resolveProject } from '@context-forge/core';
4
- import { resolveProjectWorktree } from '../utils/project.js';
5
- import { withJsonOption, withProjectOption } from '../options.js';
6
- import { handleError, UserError } from '../utils/errors.js';
7
- import { printJson } from '../output/formatter.js';
8
- /**
9
- * Core build logic: resolves project, generates context.
10
- *
11
- * Output modes:
12
- * - `--json`: JSON object to stdout with project, phase, and context fields
13
- * - bare CLI: help message to stderr, nothing to stdout
14
- *
15
- * Slash commands call the CLI, which outputs to stdout — the slash command
16
- * wrapper captures and frames it as working context. Since bare CLI now shows
17
- * a help message instead of raw prompt, slash commands use `--json` implicitly
18
- * (the `!` backtick syntax in the .md file captures stdout).
19
- */
20
- export async function buildAndPrint(opts) {
21
- const store = new FileProjectStore();
22
- const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
23
- const project = await resolveProject(store, id, worktreeId);
24
- if (!project) {
25
- throw new UserError(`Project not found: '${id}'.`, 'PROJECT_NOT_FOUND', `Run cf project list to see available projects.`);
26
- }
27
- if (!project.projectPath) {
28
- throw new UserError(`Project '${project.name}' has no projectPath configured.`, 'MISSING_CONFIG', `Run: cf project set projectPath /path/to/project`);
29
- }
30
- // Status message goes to stderr so stdout stays clean for piping
31
- process.stderr.write(`Building context for ${project.name}...\n`);
32
- // Apply overrides to a working copy
33
- const workingCopy = { ...project };
34
- if (opts.phase) {
35
- const resolved = resolvePhaseValue(opts.phase);
36
- if (!resolved) {
37
- process.stderr.write(`Warning: '${opts.phase}' is not a recognized phase. Use a number (0-7), name (implementation), or shorthand (P6).\n`);
38
- }
39
- const phaseValue = resolved ?? opts.phase;
40
- workingCopy.developmentPhase = phaseValue;
41
- workingCopy.instruction = phaseValue;
42
- }
43
- if (opts.slice)
44
- workingCopy.fileSlice = opts.slice;
45
- const { integrator } = createContextPipeline(workingCopy.projectPath);
46
- let contextString = await integrator.generateContextFromProject(workingCopy, worktreeId);
47
- if (opts.embed) {
48
- contextString = await embedReferencedFiles(workingCopy, workingCopy.projectPath, contextString);
49
- }
50
- if (opts.json) {
51
- // --json mode: structured output to stdout
52
- printJson({
53
- project: project.name,
54
- phase: workingCopy.developmentPhase ?? null,
55
- context: contextString,
56
- });
57
- }
58
- else {
59
- // Bare CLI: help message to stderr, nothing to stdout
60
- const sliceInfo = workingCopy.fileSlice ? `, slice ${workingCopy.fileSlice}` : '';
61
- const phaseInfo = workingCopy.developmentPhase ?? 'no phase set';
62
- process.stderr.write(`\nContext built for ${project.name} (${phaseInfo}${sliceInfo}).\n\n` +
63
- `To use this context:\n` +
64
- ` /cf:build — load as working context in Claude Code\n` +
65
- ` cf build --json — output as JSON for pipelines\n`);
66
- }
67
- }
68
- export function registerBuildCommand(program) {
69
- const buildCmd = program
70
- .command('build')
71
- .description('Generate a context prompt');
72
- withProjectOption(buildCmd);
73
- buildCmd
74
- .option('--phase <phase>', 'Override development phase')
75
- .option('--slice <slice>', 'Override slice name')
76
- .option('--instruction <instruction>', 'Override instruction type')
77
- .option('--instruction-type <type>', 'Override instruction type for profile lookup (without persisting)')
78
- .option('--it <type>', 'Shorthand for --instruction-type')
79
- .option('--tasks <tasks>', 'Override task file name')
80
- .option('--additional <text>', 'Additional instructions to append')
81
- .option('--embed', 'Inline referenced file contents for models without file-read access');
82
- withJsonOption(buildCmd);
83
- buildCmd.action(async (opts) => {
84
- try {
85
- const store = new FileProjectStore();
86
- const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
87
- const project = await resolveProject(store, id, worktreeId);
88
- if (!project) {
89
- throw new UserError(`Project not found: '${id}'.`, 'PROJECT_NOT_FOUND', `Run cf project list to see available projects.`);
90
- }
91
- if (!project.projectPath) {
92
- throw new UserError(`Project '${project.name}' has no projectPath configured.\n` +
93
- ' cf project set projectPath /path/to/project');
94
- }
95
- // Status message goes to stderr so stdout stays clean for piping
96
- process.stderr.write(`Building context for ${project.name}...\n`);
97
- // Apply overrides to a working copy
98
- const workingCopy = { ...project };
99
- if (opts.phase) {
100
- const resolved = resolvePhaseValue(opts.phase);
101
- if (!resolved) {
102
- process.stderr.write(`Warning: '${opts.phase}' is not a recognized phase. Use a number (0-7), name (implementation), or shorthand (P6).\n`);
103
- }
104
- const phaseValue = resolved ?? opts.phase;
105
- workingCopy.developmentPhase = phaseValue;
106
- workingCopy.instruction = phaseValue;
107
- }
108
- if (opts.slice)
109
- workingCopy.fileSlice = opts.slice;
110
- if (opts.instruction)
111
- workingCopy.instruction = opts.instruction;
112
- const instructionTypeOverride = opts.instructionType ?? opts.it;
113
- if (instructionTypeOverride)
114
- workingCopy.instruction = instructionTypeOverride;
115
- if (opts.tasks)
116
- workingCopy.fileTasks = opts.tasks;
117
- const { integrator } = createContextPipeline(workingCopy.projectPath);
118
- let contextString = await integrator.generateContextFromProject(workingCopy, worktreeId);
119
- if (opts.additional) {
120
- contextString = `${contextString}\n\n${opts.additional}`;
121
- }
122
- if (opts.embed) {
123
- contextString = await embedReferencedFiles(workingCopy, workingCopy.projectPath, contextString);
124
- }
125
- if (opts.json) {
126
- printJson({
127
- project: project.name,
128
- phase: workingCopy.developmentPhase ?? null,
129
- context: contextString,
130
- });
131
- }
132
- else {
133
- const sliceInfo = workingCopy.fileSlice ? `, slice ${workingCopy.fileSlice}` : '';
134
- const phaseInfo = workingCopy.developmentPhase ?? 'no phase set';
135
- process.stderr.write(`\nContext built for ${project.name} (${phaseInfo}${sliceInfo}).\n\n` +
136
- `To use this context:\n` +
137
- ` /cf:build $ARGUMENTS — load as working context in Claude Code\n` +
138
- ` cf build --json — output as JSON for pipelines\n`);
139
- }
140
- }
141
- catch (err) {
142
- handleError(err);
143
- }
144
- });
145
- }
146
- //# sourceMappingURL=build.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerCheckCommand(program: Command): void;
3
- //# sourceMappingURL=check.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgHpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgG3D"}
@@ -1,211 +0,0 @@
1
- import * as readline from 'node:readline';
2
- import { FileProjectStore, ArtifactIntrospector, ConsistencyChecker, ConfigManager, } from '@context-forge/core/node';
3
- import { resolveProjectWorktree } from '../utils/project.js';
4
- import { withJsonOption, withProjectOption, withYesOption, withFixOption } from '../options.js';
5
- import { applyWorktreeOverlay } from '../utils/worktree-overlay.js';
6
- import { handleError, UserError } from '../utils/errors.js';
7
- import { printJson } from '../output/formatter.js';
8
- import { label, dim, error as errorStyle, warn as warnStyle } from '../output/styles.js';
9
- const SEVERITY_ICON = {
10
- error: '✗',
11
- warning: '⚠',
12
- info: 'ℹ',
13
- };
14
- /** Prompt user for y/N confirmation via stdin. Returns true if confirmed. */
15
- function askConfirmation(prompt) {
16
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
17
- return new Promise((resolve) => {
18
- rl.question(prompt, (answer) => {
19
- rl.close();
20
- resolve(answer.trim().toLowerCase() === 'y');
21
- });
22
- });
23
- }
24
- function isFixResult(result) {
25
- return 'fixLog' in result;
26
- }
27
- /** Merge findings from multiple checkAll runs, deduplicating by rule+location+description. */
28
- function mergeCheckResults(results) {
29
- if (results.length === 1)
30
- return results[0];
31
- const seen = new Set();
32
- const allFindings = [];
33
- for (const result of results) {
34
- for (const finding of result.findings) {
35
- const key = `${finding.rule}|${finding.location}|${finding.description}`;
36
- if (!seen.has(key)) {
37
- seen.add(key);
38
- allFindings.push(finding);
39
- }
40
- }
41
- }
42
- const projectPath = results[0].projectPath;
43
- const errors = allFindings.filter((f) => f.severity === 'error').length;
44
- const warnings = allFindings.filter((f) => f.severity === 'warning').length;
45
- const infos = allFindings.filter((f) => f.severity === 'info').length;
46
- const total = allFindings.length;
47
- const parts = [];
48
- if (errors > 0)
49
- parts.push(`${errors} error${errors !== 1 ? 's' : ''}`);
50
- if (warnings > 0)
51
- parts.push(`${warnings} warning${warnings !== 1 ? 's' : ''}`);
52
- if (infos > 0)
53
- parts.push(`${infos} info${infos !== 1 ? 's' : ''}`);
54
- const summary = total === 0 ? 'No inconsistencies found' : `${total} finding${total !== 1 ? 's' : ''}: ${parts.join(', ')}`;
55
- return { projectPath, findings: allFindings, totalFindings: total, errors, warnings, infos, summary };
56
- }
57
- function formatFinding(finding, fixResult) {
58
- const icon = SEVERITY_ICON[finding.severity] ?? '?';
59
- const colorFn = finding.severity === 'error' ? errorStyle : finding.severity === 'warning' ? warnStyle : dim;
60
- const lines = [];
61
- lines.push(colorFn(` ${icon} ${finding.description}`));
62
- if (fixResult && finding.fixable) {
63
- const logEntry = fixResult.fixLog.find((e) => e.rule === finding.rule);
64
- if (logEntry) {
65
- lines.push(dim(` → Fixed: ${logEntry.before} → ${logEntry.after} in ${logEntry.filePath}`));
66
- }
67
- }
68
- else {
69
- lines.push(dim(` → ${finding.suggestedFix}`));
70
- }
71
- return lines.join('\n');
72
- }
73
- /** Extract slice index prefix from a finding description like "[175] ..." */
74
- function extractFindingSliceIndex(description) {
75
- const match = /^\[(\d+)\]\s/.exec(description);
76
- return match ? match[1] : null;
77
- }
78
- /** Group findings by slice index prefix, with non-prefixed in a "Project-level" group */
79
- function groupFindings(findings) {
80
- const groups = new Map();
81
- for (const finding of findings) {
82
- const idx = extractFindingSliceIndex(finding.description);
83
- const key = idx ?? 'project';
84
- const group = groups.get(key) ?? [];
85
- group.push(finding);
86
- groups.set(key, group);
87
- }
88
- return groups;
89
- }
90
- export function registerCheckCommand(program) {
91
- const checkCmd = program
92
- .command('check')
93
- .description('Run consistency checks on project artifacts');
94
- withJsonOption(checkCmd);
95
- withProjectOption(checkCmd);
96
- withFixOption(checkCmd);
97
- checkCmd.option('--slice <index>', 'Check only a specific slice by index');
98
- withYesOption(checkCmd);
99
- checkCmd.action(async (opts) => {
100
- try {
101
- const store = new FileProjectStore();
102
- const { id } = await resolveProjectWorktree({ project: opts.project }, store);
103
- const project = await store.getById(id);
104
- if (!project) {
105
- throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
106
- }
107
- const introspector = new ArtifactIntrospector();
108
- const checker = new ConsistencyChecker(introspector);
109
- // Determine fix mode: explicit flag > config key > false
110
- let fixMode = opts.fix ?? false;
111
- if (!fixMode) {
112
- try {
113
- const cm = new ConfigManager(project.projectPath);
114
- const autoFixResult = await cm.get('workflow.auto_fix');
115
- if (autoFixResult.value === true) {
116
- fixMode = true;
117
- }
118
- }
119
- catch {
120
- // Config read failed — default to check-only
121
- }
122
- }
123
- // Determine scope: --slice narrows to single slice, otherwise all-slices
124
- const singleSlice = opts.slice ? parseInt(opts.slice, 10) : null;
125
- if (singleSlice !== null && isNaN(singleSlice)) {
126
- throw new UserError(`Invalid slice index: '${opts.slice}'`);
127
- }
128
- // Build project views: one per worktree overlay so all workflow fields are visible.
129
- // Findings are merged and deduplicated — aggregate rules (filesystem scan) run per
130
- // view but produce the same results, so deduplication collapses them correctly.
131
- const worktrees = project.worktrees ?? [];
132
- const projectViews = worktrees.length > 0
133
- ? worktrees.map((wt) => applyWorktreeOverlay(project, wt.id))
134
- : [project];
135
- let result;
136
- if (singleSlice !== null) {
137
- // Narrow to single slice — set fileSlice temporarily and use check()
138
- const sliceViews = projectViews.map((v) => ({ ...v, fileSlice: `${singleSlice}-slice` }));
139
- const checkResults = await Promise.all(sliceViews.map((v) => checker.check(v)));
140
- const merged = mergeCheckResults(checkResults);
141
- result = fixMode ? await checker.applyFixes(merged) : merged;
142
- }
143
- else if (fixMode) {
144
- // All-slices fix mode — prompt for confirmation unless --yes
145
- const dryRunResults = await Promise.all(projectViews.map((v) => checker.checkAll(v)));
146
- const dryRun = mergeCheckResults(dryRunResults);
147
- const fixableCount = dryRun.findings.filter((f) => f.fixable).length;
148
- if (fixableCount === 0) {
149
- printCheckOutput(dryRun, project.name, false);
150
- console.log(dim('No fixable findings — nothing to apply.'));
151
- return;
152
- }
153
- else if (!opts.yes) {
154
- printCheckOutput(dryRun, project.name, false);
155
- const confirmed = await askConfirmation(`\nFound ${fixableCount} fixable finding${fixableCount !== 1 ? 's' : ''}. Apply fixes? [y/N] `);
156
- if (!confirmed) {
157
- console.log('Aborted.');
158
- return;
159
- }
160
- result = await checker.applyFixes(dryRun);
161
- }
162
- else {
163
- result = await checker.applyFixes(dryRun);
164
- }
165
- }
166
- else {
167
- const checkResults = await Promise.all(projectViews.map((v) => checker.checkAll(v)));
168
- result = mergeCheckResults(checkResults);
169
- }
170
- if (opts.json) {
171
- printJson(result);
172
- return;
173
- }
174
- printCheckOutput(result, project.name, fixMode);
175
- }
176
- catch (err) {
177
- handleError(err);
178
- }
179
- });
180
- }
181
- function printCheckOutput(result, projectName, fixMode) {
182
- const modeLabel = fixMode ? ' (fix mode)' : '';
183
- console.log(label(`Consistency Check: ${projectName}${modeLabel}`));
184
- console.log('');
185
- if (result.totalFindings === 0) {
186
- console.log(' No inconsistencies found');
187
- return;
188
- }
189
- const fixRes = isFixResult(result) ? result : undefined;
190
- const groups = groupFindings(result.findings);
191
- for (const [key, findings] of groups) {
192
- const groupLabel = key === 'project' ? 'Project-level' : `Slice ${key}`;
193
- console.log(label(` ${groupLabel}`));
194
- for (const finding of findings) {
195
- console.log(formatFinding(finding, fixRes));
196
- }
197
- console.log('');
198
- }
199
- if (fixRes) {
200
- console.log(label(`Fixed ${fixRes.fixed} of ${result.totalFindings} findings`));
201
- if (fixRes.fixErrors.length > 0) {
202
- for (const err of fixRes.fixErrors) {
203
- console.log(errorStyle(` Fix error: ${err}`));
204
- }
205
- }
206
- }
207
- else {
208
- console.log(dim(result.summary));
209
- }
210
- }
211
- //# sourceMappingURL=check.js.map