@context-forge/cli 0.2.2
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/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/commands/build.d.ts +3 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +51 -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 +13 -0
- package/dist/commands/check.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 +82 -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 +49 -0
- package/dist/commands/future.js.map +1 -0
- package/dist/commands/guides.d.ts +3 -0
- package/dist/commands/guides.d.ts.map +1 -0
- package/dist/commands/guides.js +116 -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 +36 -0
- package/dist/commands/init.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 +80 -0
- package/dist/commands/next.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +239 -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 +111 -0
- package/dist/commands/prompt.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 +79 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.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 +42 -0
- package/dist/output/tables.js.map +1 -0
- package/dist/utils/errors.d.ts +13 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +27 -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 +28 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +81 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { FileProjectStore, ArtifactIntrospector } from '@context-forge/core/node';
|
|
2
|
+
import { resolveProjectId } from '../utils/project.js';
|
|
3
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
4
|
+
import { printJson } from '../output/formatter.js';
|
|
5
|
+
import { label, value as valueStyle, dim } from '../output/styles.js';
|
|
6
|
+
/**
|
|
7
|
+
* Derive a basic "next action" recommendation from project data and introspection.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: This is a provisional implementation. Full workflow navigation
|
|
10
|
+
* (WorkflowNavigator.getNext()) depends on slice 165, which is not yet complete.
|
|
11
|
+
* This version uses ArtifactIntrospector to provide basic guidance.
|
|
12
|
+
*/
|
|
13
|
+
function deriveRecommendation(project, introspection) {
|
|
14
|
+
const phase = project.developmentPhase ?? 'Not set';
|
|
15
|
+
const slice = project.fileSlice;
|
|
16
|
+
if (introspection?.currentTasks) {
|
|
17
|
+
const { completedTasks, totalTasks, inferredStatus } = introspection.currentTasks;
|
|
18
|
+
if (inferredStatus === 'complete') {
|
|
19
|
+
return {
|
|
20
|
+
recommendation: 'Advance to next phase or slice',
|
|
21
|
+
slice,
|
|
22
|
+
phase,
|
|
23
|
+
rationale: `All ${totalTasks} tasks complete in current task file.`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const remaining = totalTasks - completedTasks;
|
|
27
|
+
return {
|
|
28
|
+
recommendation: 'Continue current tasks',
|
|
29
|
+
slice,
|
|
30
|
+
phase,
|
|
31
|
+
rationale: `${remaining} of ${totalTasks} tasks remaining in ${project.fileTasks}.`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
recommendation: 'Review project configuration',
|
|
36
|
+
slice,
|
|
37
|
+
phase,
|
|
38
|
+
rationale: 'No task file data available. Verify fileTasks and projectPath are set.',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function registerNextCommand(program) {
|
|
42
|
+
program
|
|
43
|
+
.command('next')
|
|
44
|
+
.description('Show recommended next action for the active project')
|
|
45
|
+
.option('--json', 'Output as JSON')
|
|
46
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
47
|
+
.action(async (opts) => {
|
|
48
|
+
try {
|
|
49
|
+
const store = new FileProjectStore();
|
|
50
|
+
const { id } = await resolveProjectId(opts.project, store);
|
|
51
|
+
const project = await store.getById(id);
|
|
52
|
+
if (!project) {
|
|
53
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
54
|
+
}
|
|
55
|
+
let introspection;
|
|
56
|
+
if (project.projectPath) {
|
|
57
|
+
try {
|
|
58
|
+
const introspector = new ArtifactIntrospector();
|
|
59
|
+
introspection = await introspector.summarize(project);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Graceful degradation
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const result = deriveRecommendation(project, introspection);
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
printJson(result);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(label('Next: ') + valueStyle(result.recommendation));
|
|
71
|
+
console.log(label('Slice: ') + valueStyle(result.slice));
|
|
72
|
+
console.log(label('Phase: ') + valueStyle(result.phase));
|
|
73
|
+
console.log(label('Rationale: ') + dim(result.rationale));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
handleError(err);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# 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":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4M7D"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import * as os from 'node:os';
|
|
2
|
+
import * as readline from 'node:readline';
|
|
3
|
+
import { FileProjectStore, ConfigManager } from '@context-forge/core/node';
|
|
4
|
+
import { resolveFieldName, resolvePhaseValue, validateFieldValue, PROJECT_FIELDS, FIELD_GROUPS, } from '@context-forge/core';
|
|
5
|
+
import { resolveProjectId, findByNameOrId } from '../utils/project.js';
|
|
6
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
7
|
+
import { printJson } from '../output/formatter.js';
|
|
8
|
+
import { renderTable } from '../output/tables.js';
|
|
9
|
+
import { label, value as valueStyle, success, dim } from '../output/styles.js';
|
|
10
|
+
/** Shorten an absolute path by replacing the home directory with ~. */
|
|
11
|
+
function shortenPath(p) {
|
|
12
|
+
const home = os.homedir();
|
|
13
|
+
if (p === home)
|
|
14
|
+
return '~';
|
|
15
|
+
if (p.startsWith(home + '/'))
|
|
16
|
+
return '~' + p.slice(home.length);
|
|
17
|
+
return p;
|
|
18
|
+
}
|
|
19
|
+
/** Display the project schema grouped by category. */
|
|
20
|
+
function displaySchema() {
|
|
21
|
+
const groupLabels = {
|
|
22
|
+
identity: 'Identity',
|
|
23
|
+
artifacts: 'Artifacts',
|
|
24
|
+
workflow: 'Workflow',
|
|
25
|
+
metadata: 'Metadata',
|
|
26
|
+
};
|
|
27
|
+
console.log(label('\nProject Schema'));
|
|
28
|
+
console.log('══════════════');
|
|
29
|
+
for (const group of FIELD_GROUPS) {
|
|
30
|
+
const groupFields = PROJECT_FIELDS.filter((f) => f.group === group);
|
|
31
|
+
console.log(`\n${label(groupLabels[group])}`);
|
|
32
|
+
for (const f of groupFields) {
|
|
33
|
+
const flags = [];
|
|
34
|
+
if (f.required)
|
|
35
|
+
flags.push('required');
|
|
36
|
+
if (f.readonly)
|
|
37
|
+
flags.push('readonly');
|
|
38
|
+
const flagStr = flags.length > 0 ? ` (${flags.join(', ')})` : '';
|
|
39
|
+
console.log(` ${f.field.padEnd(18)}${f.type.padEnd(10)}${flagStr} ${f.description}`);
|
|
40
|
+
if (f.aliases.length > 0) {
|
|
41
|
+
console.log(`${''.padEnd(20)}Aliases: ${f.aliases.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
if (f.enumValues) {
|
|
44
|
+
console.log(`${''.padEnd(20)}Values: ${f.enumValues.join(', ')}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function registerProjectCommand(program) {
|
|
50
|
+
const cmd = program
|
|
51
|
+
.command('project')
|
|
52
|
+
.description('Manage Context Forge projects')
|
|
53
|
+
.option('--schema', 'Display project field schema')
|
|
54
|
+
.action((opts) => {
|
|
55
|
+
if (opts.schema) {
|
|
56
|
+
displaySchema();
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(`Usage: ${label('cf project')} [options] [command] — run ${dim('cf project --help')} for details`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
cmd
|
|
63
|
+
.command('list')
|
|
64
|
+
.description('List all projects')
|
|
65
|
+
.option('--json', 'Output as JSON')
|
|
66
|
+
.action(async (opts) => {
|
|
67
|
+
try {
|
|
68
|
+
const store = new FileProjectStore();
|
|
69
|
+
const projects = await store.getAll();
|
|
70
|
+
// Read default_project config to determine which project is the default
|
|
71
|
+
const cm = new ConfigManager();
|
|
72
|
+
const defaultRef = (await cm.get('default_project')).value;
|
|
73
|
+
let defaultProject = null;
|
|
74
|
+
if (defaultRef) {
|
|
75
|
+
defaultProject = await findByNameOrId(defaultRef, store);
|
|
76
|
+
}
|
|
77
|
+
if (opts.json) {
|
|
78
|
+
printJson(projects.map((p) => ({
|
|
79
|
+
id: p.id,
|
|
80
|
+
name: p.name,
|
|
81
|
+
projectPath: p.projectPath,
|
|
82
|
+
fileSlice: p.fileSlice,
|
|
83
|
+
isDefault: defaultProject?.id === p.id,
|
|
84
|
+
})));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const rows = projects.map((p) => [
|
|
88
|
+
p.name,
|
|
89
|
+
shortenPath(p.projectPath ?? ''),
|
|
90
|
+
p.fileSlice,
|
|
91
|
+
defaultProject?.id === p.id ? '●' : '',
|
|
92
|
+
]);
|
|
93
|
+
console.log(renderTable(['Name', 'Path', 'Slice', 'Default'], rows));
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
handleError(err);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
cmd
|
|
100
|
+
.command('get')
|
|
101
|
+
.description('Get details for the active project')
|
|
102
|
+
.option('--json', 'Output as JSON')
|
|
103
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
104
|
+
.action(async (opts) => {
|
|
105
|
+
try {
|
|
106
|
+
const store = new FileProjectStore();
|
|
107
|
+
const { id } = await resolveProjectId(opts.project, store);
|
|
108
|
+
const project = await store.getById(id);
|
|
109
|
+
if (!project) {
|
|
110
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
111
|
+
}
|
|
112
|
+
if (opts.json) {
|
|
113
|
+
printJson(project);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Grouped display — iterate by group, skip empty groups
|
|
117
|
+
const groupLabels = {
|
|
118
|
+
identity: 'Identity',
|
|
119
|
+
artifacts: 'Artifacts',
|
|
120
|
+
workflow: 'Workflow',
|
|
121
|
+
metadata: 'Metadata',
|
|
122
|
+
};
|
|
123
|
+
const projectRecord = project;
|
|
124
|
+
for (const group of FIELD_GROUPS) {
|
|
125
|
+
const groupFields = PROJECT_FIELDS.filter((f) => f.group === group);
|
|
126
|
+
const populated = groupFields.filter((f) => {
|
|
127
|
+
const val = projectRecord[f.field];
|
|
128
|
+
return val !== undefined && val !== null && val !== '';
|
|
129
|
+
});
|
|
130
|
+
if (populated.length === 0)
|
|
131
|
+
continue;
|
|
132
|
+
console.log(`\n${label(groupLabels[group])}`);
|
|
133
|
+
for (const f of populated) {
|
|
134
|
+
const val = String(projectRecord[f.field]);
|
|
135
|
+
console.log(` ${label(`${f.label}:`.padEnd(16))}${valueStyle(val)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Display customData sub-fields if populated
|
|
139
|
+
const custom = project.customData;
|
|
140
|
+
if (custom) {
|
|
141
|
+
const customEntries = [
|
|
142
|
+
['Recent Events', custom.recentEvents ?? ''],
|
|
143
|
+
['Notes', custom.additionalNotes ?? ''],
|
|
144
|
+
['Tools', custom.availableTools ?? ''],
|
|
145
|
+
];
|
|
146
|
+
const populated = customEntries.filter(([, v]) => v);
|
|
147
|
+
if (populated.length > 0) {
|
|
148
|
+
console.log(`\n${label('Custom Data')}`);
|
|
149
|
+
for (const [k, v] of populated) {
|
|
150
|
+
console.log(` ${label(`${k}:`.padEnd(16))}${valueStyle(v)}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
handleError(err);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
cmd
|
|
160
|
+
.command('set <field> <value>')
|
|
161
|
+
.description('Update a field on the active project')
|
|
162
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
163
|
+
.action(async (field, val, opts) => {
|
|
164
|
+
try {
|
|
165
|
+
const resolvedField = resolveFieldName(field);
|
|
166
|
+
if (!resolvedField) {
|
|
167
|
+
throw new UserError(`Unknown field: '${field}'. Run 'cf project --schema' to see available fields.`);
|
|
168
|
+
}
|
|
169
|
+
const fieldDef = PROJECT_FIELDS.find((f) => f.field === resolvedField);
|
|
170
|
+
if (fieldDef?.readonly) {
|
|
171
|
+
throw new UserError(`Field '${resolvedField}' is read-only and cannot be set.`);
|
|
172
|
+
}
|
|
173
|
+
// Resolve phase/instruction values (number, short name, or full string)
|
|
174
|
+
let resolvedValue = val;
|
|
175
|
+
if (resolvedField === 'developmentPhase' || resolvedField === 'instruction') {
|
|
176
|
+
const phaseVal = resolvePhaseValue(val);
|
|
177
|
+
if (!phaseVal) {
|
|
178
|
+
const allowed = fieldDef?.enumValues?.join(', ') ?? '';
|
|
179
|
+
throw new UserError(`Invalid value "${val}" for field "${resolvedField}". Allowed values: ${allowed}`);
|
|
180
|
+
}
|
|
181
|
+
resolvedValue = phaseVal;
|
|
182
|
+
}
|
|
183
|
+
// Validate against enum constraints
|
|
184
|
+
const validation = validateFieldValue(resolvedField, resolvedValue);
|
|
185
|
+
if (!validation.valid) {
|
|
186
|
+
throw new UserError(validation.error);
|
|
187
|
+
}
|
|
188
|
+
const store = new FileProjectStore();
|
|
189
|
+
const { id } = await resolveProjectId(opts.project, store);
|
|
190
|
+
const existing = await store.getById(id);
|
|
191
|
+
if (!existing) {
|
|
192
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
193
|
+
}
|
|
194
|
+
await store.update(id, { [resolvedField]: resolvedValue });
|
|
195
|
+
console.log(success(`Updated ${resolvedField} = ${resolvedValue} on project ${existing.name}`));
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
handleError(err);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
cmd
|
|
202
|
+
.command('rm [nameOrId]')
|
|
203
|
+
.description('Remove a project from Context Forge (files on disk are not deleted)')
|
|
204
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
205
|
+
.option('--yes', 'Skip confirmation prompt')
|
|
206
|
+
.action(async (nameOrId, opts) => {
|
|
207
|
+
try {
|
|
208
|
+
const store = new FileProjectStore();
|
|
209
|
+
const { id } = await resolveProjectId(nameOrId ?? opts.project, store);
|
|
210
|
+
const project = await store.getById(id);
|
|
211
|
+
if (!project) {
|
|
212
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
213
|
+
}
|
|
214
|
+
if (!opts.yes) {
|
|
215
|
+
const answer = await askConfirmation(`Remove project '${project.name}' at ${project.projectPath ?? 'unknown'} from Context Forge? (files on disk will not be deleted) [y/N] `);
|
|
216
|
+
if (!answer) {
|
|
217
|
+
console.log('Cancelled.');
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
await store.delete(id);
|
|
222
|
+
console.log(success(`Project '${project.name}' removed.`));
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
handleError(err);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
/** Prompt user for y/N confirmation via stdin. Returns true if confirmed. */
|
|
230
|
+
function askConfirmation(prompt) {
|
|
231
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
232
|
+
return new Promise((resolve) => {
|
|
233
|
+
rl.question(prompt, (answer) => {
|
|
234
|
+
rl.close();
|
|
235
|
+
resolve(answer.trim().toLowerCase() === 'y');
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmG5D"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { FileProjectStore, SystemPromptParser } from '@context-forge/core/node';
|
|
3
|
+
import { PROMPT_FILE_RELATIVE_PATH } from '@context-forge/core';
|
|
4
|
+
import { resolveProjectId } from '../utils/project.js';
|
|
5
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
6
|
+
import { printJson, printRaw } from '../output/formatter.js';
|
|
7
|
+
import { renderTable } from '../output/tables.js';
|
|
8
|
+
import { getPhaseShorthands, resolvePhaseInput } from '../utils/phaseShorthand.js';
|
|
9
|
+
/**
|
|
10
|
+
* Substitute project variables into template content.
|
|
11
|
+
* Unresolvable variables are preserved as-is.
|
|
12
|
+
*/
|
|
13
|
+
function substituteVariables(content, project) {
|
|
14
|
+
const vars = {
|
|
15
|
+
'project': project.name,
|
|
16
|
+
'slice': project.fileSlice,
|
|
17
|
+
'task-file': project.fileTasks,
|
|
18
|
+
'fileArch': project.fileArch,
|
|
19
|
+
'fileHLD': project.fileHLD,
|
|
20
|
+
'fileSpec': project.fileSpec,
|
|
21
|
+
'development-phase': project.developmentPhase,
|
|
22
|
+
};
|
|
23
|
+
return content.replace(/\{(\w[\w-]*)}/g, (_match, varName) => {
|
|
24
|
+
const value = vars[varName];
|
|
25
|
+
return value !== undefined ? value : `{${varName}}`;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function registerPromptCommand(program) {
|
|
29
|
+
const cmd = program
|
|
30
|
+
.command('prompt')
|
|
31
|
+
.description('Access prompt templates with variable substitution');
|
|
32
|
+
cmd
|
|
33
|
+
.command('list')
|
|
34
|
+
.description('List available prompt templates')
|
|
35
|
+
.option('--json', 'Output as JSON')
|
|
36
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
37
|
+
.action(async (opts) => {
|
|
38
|
+
try {
|
|
39
|
+
const store = new FileProjectStore();
|
|
40
|
+
const { id } = await resolveProjectId(opts.project, store);
|
|
41
|
+
const project = await store.getById(id);
|
|
42
|
+
if (!project) {
|
|
43
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
44
|
+
}
|
|
45
|
+
if (!project.projectPath) {
|
|
46
|
+
throw new UserError(`Project '${project.name}' has no projectPath configured.\n` +
|
|
47
|
+
' cf project set projectPath /path/to/project');
|
|
48
|
+
}
|
|
49
|
+
const promptFilePath = path.join(project.projectPath, PROMPT_FILE_RELATIVE_PATH);
|
|
50
|
+
const parser = new SystemPromptParser(promptFilePath);
|
|
51
|
+
const prompts = await parser.getAllPrompts();
|
|
52
|
+
// Build shorthand map for display
|
|
53
|
+
const shorthands = await getPhaseShorthands(project.projectPath);
|
|
54
|
+
const shorthandReverse = new Map();
|
|
55
|
+
for (const [key, name] of shorthands) {
|
|
56
|
+
shorthandReverse.set(name.toLowerCase(), key);
|
|
57
|
+
}
|
|
58
|
+
const templates = prompts.map((p) => {
|
|
59
|
+
const shorthand = shorthandReverse.get(p.name.replace(/\s*\(Phase \d+(?:\.\d+)?\)\s*/, '').toLowerCase()) ?? '';
|
|
60
|
+
return {
|
|
61
|
+
name: p.name,
|
|
62
|
+
key: p.key,
|
|
63
|
+
shorthand,
|
|
64
|
+
parameterCount: p.parameters.length,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
printJson(templates);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const rows = templates.map((t) => [t.name, t.key, t.shorthand]);
|
|
72
|
+
console.log(renderTable(['Name', 'Key', 'Shorthand'], rows));
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
handleError(err);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
cmd
|
|
79
|
+
.command('get <phase>')
|
|
80
|
+
.description('Get a prompt template with project variables substituted')
|
|
81
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
82
|
+
.option('--raw', 'Output raw template without variable substitution')
|
|
83
|
+
.action(async (phase, opts) => {
|
|
84
|
+
try {
|
|
85
|
+
const store = new FileProjectStore();
|
|
86
|
+
const { id } = await resolveProjectId(opts.project, store);
|
|
87
|
+
const project = await store.getById(id);
|
|
88
|
+
if (!project) {
|
|
89
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
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
|
+
// Resolve shorthand or name to instruction key
|
|
96
|
+
const resolvedPhase = await resolvePhaseInput(phase, project.projectPath);
|
|
97
|
+
const promptFilePath = path.join(project.projectPath, PROMPT_FILE_RELATIVE_PATH);
|
|
98
|
+
const parser = new SystemPromptParser(promptFilePath);
|
|
99
|
+
const prompt = await parser.getPromptForInstruction(resolvedPhase);
|
|
100
|
+
if (!prompt) {
|
|
101
|
+
throw new UserError(`No prompt found for '${phase}'. Run cf prompt list to see available templates.`);
|
|
102
|
+
}
|
|
103
|
+
const output = opts.raw ? prompt.content : substituteVariables(prompt.content, project);
|
|
104
|
+
printRaw(output);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
handleError(err);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8E5D"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { FileProjectStore, ArtifactIntrospector } from '@context-forge/core/node';
|
|
2
|
+
import { resolveProjectId } from '../utils/project.js';
|
|
3
|
+
import { handleError, UserError } from '../utils/errors.js';
|
|
4
|
+
import { printJson } from '../output/formatter.js';
|
|
5
|
+
import { label, value as valueStyle, dim } from '../output/styles.js';
|
|
6
|
+
export function registerStatusCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('status')
|
|
9
|
+
.description('Show workflow status for the active project')
|
|
10
|
+
.option('--json', 'Output as JSON')
|
|
11
|
+
.option('--project <id>', 'Project ID (overrides default)')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
try {
|
|
14
|
+
const store = new FileProjectStore();
|
|
15
|
+
const { id, source } = await resolveProjectId(opts.project, store);
|
|
16
|
+
const project = await store.getById(id);
|
|
17
|
+
if (!project) {
|
|
18
|
+
throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
|
|
19
|
+
}
|
|
20
|
+
// Gather introspection data when projectPath is available
|
|
21
|
+
let introspection;
|
|
22
|
+
if (project.projectPath) {
|
|
23
|
+
try {
|
|
24
|
+
const introspector = new ArtifactIntrospector();
|
|
25
|
+
introspection = await introspector.summarize(project);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Graceful degradation — show project data without introspection
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const sourceLabels = {
|
|
32
|
+
flag: '(--project flag)',
|
|
33
|
+
cwd: '(from CWD)',
|
|
34
|
+
default: '(default)',
|
|
35
|
+
none: '',
|
|
36
|
+
};
|
|
37
|
+
const statusData = {
|
|
38
|
+
project: project.name,
|
|
39
|
+
resolutionSource: source,
|
|
40
|
+
phase: project.developmentPhase ?? 'Not set',
|
|
41
|
+
slice: project.fileSlice,
|
|
42
|
+
tasks: project.fileTasks,
|
|
43
|
+
workType: project.workType ?? 'Not set',
|
|
44
|
+
slicePlan: introspection?.slicePlan ?? null,
|
|
45
|
+
currentTasks: introspection?.currentTasks ?? null,
|
|
46
|
+
artifacts: introspection?.artifacts ?? null,
|
|
47
|
+
};
|
|
48
|
+
if (opts.json) {
|
|
49
|
+
printJson(statusData);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const sourceLabel = sourceLabels[source];
|
|
53
|
+
const projectLine = sourceLabel
|
|
54
|
+
? `${valueStyle(statusData.project)} ${dim(sourceLabel)}`
|
|
55
|
+
: valueStyle(statusData.project);
|
|
56
|
+
console.log(label('Project: ') + projectLine);
|
|
57
|
+
console.log(label('Phase: ') + valueStyle(statusData.phase));
|
|
58
|
+
console.log(label('Slice: ') + valueStyle(statusData.slice));
|
|
59
|
+
console.log(label('Tasks: ') + valueStyle(statusData.tasks));
|
|
60
|
+
if (statusData.currentTasks) {
|
|
61
|
+
const { completedTasks, totalTasks, inferredStatus } = statusData.currentTasks;
|
|
62
|
+
console.log(label('Progress: ') + valueStyle(`${completedTasks}/${totalTasks} tasks (${inferredStatus})`));
|
|
63
|
+
}
|
|
64
|
+
if (statusData.slicePlan) {
|
|
65
|
+
const { completedSlices, totalSlices, summary } = statusData.slicePlan;
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(label('Slice Plan'));
|
|
68
|
+
console.log(dim(` ${completedSlices}/${totalSlices} slices complete`));
|
|
69
|
+
if (summary) {
|
|
70
|
+
console.log(dim(` ${summary}`));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
handleError(err);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { registerConfigCommand } from './commands/config.js';
|
|
6
|
+
import { registerProjectCommand } from './commands/project.js';
|
|
7
|
+
import { registerStatusCommand } from './commands/status.js';
|
|
8
|
+
import { registerNextCommand } from './commands/next.js';
|
|
9
|
+
import { registerBuildCommand } from './commands/build.js';
|
|
10
|
+
import { registerFutureCommand } from './commands/future.js';
|
|
11
|
+
import { registerCheckCommand } from './commands/check.js';
|
|
12
|
+
import { registerPromptCommand } from './commands/prompt.js';
|
|
13
|
+
import { registerInitCommand } from './commands/init.js';
|
|
14
|
+
import { registerGuidesCommand } from './commands/guides.js';
|
|
15
|
+
import { handleError } from './utils/errors.js';
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
const { version } = require('../package.json');
|
|
18
|
+
const program = new Command();
|
|
19
|
+
program
|
|
20
|
+
.name('cf')
|
|
21
|
+
.version(version)
|
|
22
|
+
.description('Context Forge CLI — terminal access to context assembly, project management, and workflow navigation')
|
|
23
|
+
.configureHelp({
|
|
24
|
+
styleTitle: (str) => chalk.bold(str),
|
|
25
|
+
styleCommandText: (str) => chalk.yellow(str),
|
|
26
|
+
styleSubcommandText: (str) => chalk.yellow(str),
|
|
27
|
+
styleOptionText: (str) => chalk.cyan(str),
|
|
28
|
+
styleArgumentText: (str) => chalk.magenta(str),
|
|
29
|
+
styleDescriptionText: (str) => str,
|
|
30
|
+
subcommandTerm: (cmd) => cmd.name(),
|
|
31
|
+
})
|
|
32
|
+
.addHelpText('after', `\n${chalk.bold('Common options')} (available on most commands):\n ${chalk.cyan('--project <name|id>')} Project name or ID (overrides default_project config)\n ${chalk.cyan('--json')} Output as JSON (not applicable to build/prompt get)`);
|
|
33
|
+
registerConfigCommand(program);
|
|
34
|
+
registerProjectCommand(program);
|
|
35
|
+
registerStatusCommand(program);
|
|
36
|
+
registerNextCommand(program);
|
|
37
|
+
registerBuildCommand(program);
|
|
38
|
+
registerFutureCommand(program);
|
|
39
|
+
registerCheckCommand(program);
|
|
40
|
+
registerPromptCommand(program);
|
|
41
|
+
registerInitCommand(program);
|
|
42
|
+
registerGuidesCommand(program);
|
|
43
|
+
// Catch unhandled errors at top level
|
|
44
|
+
process.on('uncaughtException', handleError);
|
|
45
|
+
process.on('unhandledRejection', handleError);
|
|
46
|
+
program.parse();
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sGAAsG,CAAC;KACnH,aAAa,CAAC;IACb,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACpC,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5C,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACzC,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IAC9C,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG;IAClC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;CACpC,CAAC;KACD,WAAW,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,qCAAqC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,8DAA8D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,oEAAoE,CAAC,CAAC;AAEvR,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,sCAAsC;AACtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAC7C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;AAE9C,OAAO,CAAC,KAAK,EAAE,CAAC"}
|