@context-forge/cli 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/arch.d.ts +7 -0
- package/dist/commands/arch.d.ts.map +1 -0
- package/dist/commands/arch.js +169 -0
- package/dist/commands/arch.js.map +1 -0
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +27 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/build.d.ts +24 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +146 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +250 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/commandInstaller.d.ts +28 -0
- package/dist/commands/commandInstaller.d.ts.map +1 -0
- package/dist/commands/commandInstaller.js +136 -0
- package/dist/commands/commandInstaller.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +116 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/future.d.ts +3 -0
- package/dist/commands/future.d.ts.map +1 -0
- package/dist/commands/future.js +96 -0
- package/dist/commands/future.js.map +1 -0
- package/dist/commands/guides.d.ts +9 -0
- package/dist/commands/guides.d.ts.map +1 -0
- package/dist/commands/guides.js +156 -0
- package/dist/commands/guides.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +124 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +97 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/next.d.ts +3 -0
- package/dist/commands/next.d.ts.map +1 -0
- package/dist/commands/next.js +52 -0
- package/dist/commands/next.js.map +1 -0
- package/dist/commands/plan.d.ts +7 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +102 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/project.d.ts +25 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +550 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/prompt.d.ts +3 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +112 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/setup-ide.d.ts +15 -0
- package/dist/commands/setup-ide.d.ts.map +1 -0
- package/dist/commands/setup-ide.js +250 -0
- package/dist/commands/setup-ide.js.map +1 -0
- package/dist/commands/slice.d.ts +7 -0
- package/dist/commands/slice.d.ts.map +1 -0
- package/dist/commands/slice.js +151 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +210 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/task.d.ts +13 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +207 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/update.d.ts +27 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +172 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +204 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/commands/worktree.d.ts +3 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +371 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +16 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +29 -0
- package/dist/options.js.map +1 -0
- package/dist/output/entryStatusDisplay.d.ts +12 -0
- package/dist/output/entryStatusDisplay.d.ts.map +1 -0
- package/dist/output/entryStatusDisplay.js +24 -0
- package/dist/output/entryStatusDisplay.js.map +1 -0
- package/dist/output/formatter.d.ts +6 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +9 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/styles.d.ts +15 -0
- package/dist/output/styles.d.ts.map +1 -0
- package/dist/output/styles.js +16 -0
- package/dist/output/styles.js.map +1 -0
- package/dist/output/tables.d.ts +6 -0
- package/dist/output/tables.d.ts.map +1 -0
- package/dist/output/tables.js +45 -0
- package/dist/output/tables.js.map +1 -0
- package/dist/utils/archIndex.d.ts +7 -0
- package/dist/utils/archIndex.d.ts.map +1 -0
- package/dist/utils/archIndex.js +14 -0
- package/dist/utils/archIndex.js.map +1 -0
- package/dist/utils/breaking-changes.d.ts +14 -0
- package/dist/utils/breaking-changes.d.ts.map +1 -0
- package/dist/utils/breaking-changes.js +11 -0
- package/dist/utils/breaking-changes.js.map +1 -0
- package/dist/utils/commandCatalog.d.ts +25 -0
- package/dist/utils/commandCatalog.d.ts.map +1 -0
- package/dist/utils/commandCatalog.js +32 -0
- package/dist/utils/commandCatalog.js.map +1 -0
- package/dist/utils/confirm.d.ts +3 -0
- package/dist/utils/confirm.d.ts.map +1 -0
- package/dist/utils/confirm.js +12 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/errors.d.ts +22 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +63 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/phaseShorthand.d.ts +23 -0
- package/dist/utils/phaseShorthand.d.ts.map +1 -0
- package/dist/utils/phaseShorthand.js +68 -0
- package/dist/utils/phaseShorthand.js.map +1 -0
- package/dist/utils/project.d.ts +60 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +140 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/worktree-overlay.d.ts +31 -0
- package/dist/utils/worktree-overlay.d.ts.map +1 -0
- package/dist/utils/worktree-overlay.js +63 -0
- package/dist/utils/worktree-overlay.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arch.d.ts","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"AAwBA,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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
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, deriveEntryStatus, normalizeStatus, STATUS } 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
|
+
import { renderEntryStatus } from '../output/entryStatusDisplay.js';
|
|
13
|
+
/** Shared action handler for listing architecture initiatives. */
|
|
14
|
+
export async function archListAction(opts) {
|
|
15
|
+
const store = new FileProjectStore();
|
|
16
|
+
const { id, worktreeId } = await resolveProjectWorktree({ project: opts.project }, store);
|
|
17
|
+
const rawProject = await store.getById(id);
|
|
18
|
+
if (!rawProject) {
|
|
19
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
20
|
+
}
|
|
21
|
+
const project = await resolveProject(store, id, worktreeId);
|
|
22
|
+
if (!project) {
|
|
23
|
+
throw new UserError(`Project not found: '${id}'.`);
|
|
24
|
+
}
|
|
25
|
+
if (!project.projectPath) {
|
|
26
|
+
throw new UserError('No projectPath configured. Set one with: cf set projectPath /path/to/project');
|
|
27
|
+
}
|
|
28
|
+
let indexRange;
|
|
29
|
+
let operationPath;
|
|
30
|
+
if (opts.all && rawProject.worktrees?.length) {
|
|
31
|
+
operationPath = project.projectPath;
|
|
32
|
+
// No index filtering in --all mode
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
operationPath = resolveOperationPath(project, worktreeId) ?? project.projectPath;
|
|
36
|
+
indexRange = getWorktreeIndexRange(rawProject, worktreeId);
|
|
37
|
+
}
|
|
38
|
+
// Attempt initiative-plan-driven listing first
|
|
39
|
+
const initiativePlanPath = await resolveInitiativePlanPath(operationPath);
|
|
40
|
+
if (initiativePlanPath) {
|
|
41
|
+
await archListFromPlan(initiativePlanPath, operationPath, project, indexRange, opts);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Fallback: filesystem-scan based listing (legacy buildModel behavior)
|
|
45
|
+
await archListFromModel(opts, project, rawProject, operationPath, indexRange);
|
|
46
|
+
}
|
|
47
|
+
/** List initiatives driven from the initiative plan file (primary path). */
|
|
48
|
+
async function archListFromPlan(initiativePlanPath, operationPath, project, indexRange, opts) {
|
|
49
|
+
const introspector = new ArtifactIntrospector();
|
|
50
|
+
const planResult = await introspector.parseSlicePlan(initiativePlanPath);
|
|
51
|
+
const filteredEntries = planResult.entries.filter((e) => isInIndexRange(e.index, indexRange));
|
|
52
|
+
if (filteredEntries.length === 0) {
|
|
53
|
+
console.log(dim('No initiatives found in initiative plan.'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Active arch index — compare against fileArch on the project
|
|
57
|
+
const activeArchIndex = extractSliceIndex(project.fileArch);
|
|
58
|
+
// Resolve per-entry arch file existence and derived status. Arch entries have
|
|
59
|
+
// no task file, so taskInferredStatus is always absent here — only
|
|
60
|
+
// frontmatterStatus (from the arch file, if found) and isChecked feed the
|
|
61
|
+
// lattice. Per TD-2a: frontmatterStatus is the only non-checkbox signal
|
|
62
|
+
// available, so a resolution failure on it (unrecognized status value) must
|
|
63
|
+
// not silently fall through to the checkbox — it renders as degraded instead.
|
|
64
|
+
const entries = await Promise.all(filteredEntries.map(async (entry) => {
|
|
65
|
+
let archFile = null;
|
|
66
|
+
let status = entry.isChecked ? STATUS.Complete : STATUS.NotStarted;
|
|
67
|
+
try {
|
|
68
|
+
const archDir = join(operationPath, 'project-documents/user/architecture');
|
|
69
|
+
const files = await readdir(archDir);
|
|
70
|
+
const pattern = new RegExp(`^${entry.index}-arch\\.`, 'i');
|
|
71
|
+
const found = files.find((f) => pattern.test(f));
|
|
72
|
+
if (found) {
|
|
73
|
+
archFile = found;
|
|
74
|
+
const fm = await introspector.parseFrontmatter(join(archDir, found));
|
|
75
|
+
if (fm.found) {
|
|
76
|
+
const normalized = normalizeStatus(fm.data.status);
|
|
77
|
+
status = normalized === undefined
|
|
78
|
+
? 'degraded'
|
|
79
|
+
: deriveEntryStatus({ frontmatterStatus: normalized, isChecked: entry.isChecked });
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
status = deriveEntryStatus({ isChecked: entry.isChecked });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// directory missing or unreadable — leave archFile null, status as checkbox default
|
|
88
|
+
}
|
|
89
|
+
const isActive = activeArchIndex !== null && entry.index === activeArchIndex;
|
|
90
|
+
return {
|
|
91
|
+
index: entry.index,
|
|
92
|
+
name: entry.name,
|
|
93
|
+
status,
|
|
94
|
+
archFile,
|
|
95
|
+
isActive,
|
|
96
|
+
isChecked: entry.isChecked,
|
|
97
|
+
};
|
|
98
|
+
}));
|
|
99
|
+
if (opts.json) {
|
|
100
|
+
printJson(entries);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const planName = initiativePlanPath.split('/').pop() ?? initiativePlanPath;
|
|
104
|
+
console.log(label(`\nArchitecture Initiatives: ${planName}`));
|
|
105
|
+
const rows = entries.map((e) => {
|
|
106
|
+
const statusLabel = renderEntryStatus(e.status, e.isChecked);
|
|
107
|
+
const file = e.archFile ? dim(e.archFile) : dim('—');
|
|
108
|
+
const indicator = e.isActive ? success(' ← active') : '';
|
|
109
|
+
return [String(e.index), e.name, statusLabel, file + indicator];
|
|
110
|
+
});
|
|
111
|
+
console.log(renderTable(['#', 'Initiative', 'Status', 'Arch File'], rows));
|
|
112
|
+
}
|
|
113
|
+
/** Fallback: list initiatives from buildModel filesystem scan. */
|
|
114
|
+
async function archListFromModel(opts, project, rawProject, operationPath, indexRange) {
|
|
115
|
+
let model;
|
|
116
|
+
if (opts.all && rawProject?.worktrees?.length) {
|
|
117
|
+
const paths = resolveAllOperationPaths(rawProject);
|
|
118
|
+
const models = (await Promise.all(paths.map((p) => buildModel(p).catch(() => null)))).filter((m) => m !== null);
|
|
119
|
+
model = mergeProjectModels(models);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
model = await buildModel(operationPath);
|
|
123
|
+
}
|
|
124
|
+
const initiativeKeys = Object.keys(model.initiatives)
|
|
125
|
+
.filter((key) => isInIndexRange(parseInt(key, 10), indexRange))
|
|
126
|
+
.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));
|
|
127
|
+
if (initiativeKeys.length === 0) {
|
|
128
|
+
console.log(dim('No initiatives found in project.'));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const activeIndex = extractSliceIndex(project.fileSlice);
|
|
132
|
+
const entries = initiativeKeys.map((key) => {
|
|
133
|
+
const init = model.initiatives[key];
|
|
134
|
+
const archName = init.arch?.name ?? '—';
|
|
135
|
+
const planName = init.slicePlan?.name ?? '—';
|
|
136
|
+
const completedSlices = init.slices.filter((s) => s.status === 'complete').length;
|
|
137
|
+
const totalSlices = init.slices.length;
|
|
138
|
+
const progress = totalSlices > 0 ? `${completedSlices}/${totalSlices}` : '—';
|
|
139
|
+
const isActive = activeIndex !== null && init.slices.some((s) => parseInt(s.index, 10) === activeIndex);
|
|
140
|
+
return {
|
|
141
|
+
index: key,
|
|
142
|
+
baseIndex: parseInt(key, 10),
|
|
143
|
+
name: init.name,
|
|
144
|
+
archDoc: archName,
|
|
145
|
+
slicePlan: planName,
|
|
146
|
+
progress,
|
|
147
|
+
completedSlices,
|
|
148
|
+
totalSlices,
|
|
149
|
+
isActive,
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
if (opts.json) {
|
|
153
|
+
printJson(entries);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
console.log(label('\nArchitecture Initiatives'));
|
|
157
|
+
const rows = entries.map((e) => {
|
|
158
|
+
const indicator = e.isActive ? success(' ← active') : '';
|
|
159
|
+
return [
|
|
160
|
+
e.index,
|
|
161
|
+
e.name,
|
|
162
|
+
dim(e.archDoc),
|
|
163
|
+
dim(e.slicePlan),
|
|
164
|
+
e.progress + indicator,
|
|
165
|
+
];
|
|
166
|
+
});
|
|
167
|
+
console.log(renderTable(['Index', 'Initiative', 'Arch Doc', 'Slice Plan', 'Progress'], rows));
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=arch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../src/commands/arch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2JpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG3D"}
|