@zigrivers/scaffold 3.13.0 → 3.14.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/README.md +1 -1
- package/dist/cli/commands/adopt.d.ts.map +1 -1
- package/dist/cli/commands/adopt.js +8 -7
- package/dist/cli/commands/adopt.js.map +1 -1
- package/dist/cli/commands/adopt.serialization.test.js +8 -0
- package/dist/cli/commands/adopt.serialization.test.js.map +1 -1
- package/dist/cli/commands/adopt.test.js +8 -0
- package/dist/cli/commands/adopt.test.js.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +191 -180
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/complete.d.ts.map +1 -1
- package/dist/cli/commands/complete.js +16 -12
- package/dist/cli/commands/complete.js.map +1 -1
- package/dist/cli/commands/complete.test.js +14 -5
- package/dist/cli/commands/complete.test.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +43 -49
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +33 -27
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/reset.d.ts.map +1 -1
- package/dist/cli/commands/reset.js +44 -40
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/reset.test.js +42 -20
- package/dist/cli/commands/reset.test.js.map +1 -1
- package/dist/cli/commands/rework.d.ts.map +1 -1
- package/dist/cli/commands/rework.js +16 -12
- package/dist/cli/commands/rework.js.map +1 -1
- package/dist/cli/commands/rework.test.js +12 -3
- package/dist/cli/commands/rework.test.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +318 -298
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/run.test.js +92 -120
- package/dist/cli/commands/run.test.js.map +1 -1
- package/dist/cli/commands/skip.d.ts.map +1 -1
- package/dist/cli/commands/skip.js +19 -15
- package/dist/cli/commands/skip.js.map +1 -1
- package/dist/cli/commands/skip.test.js +22 -11
- package/dist/cli/commands/skip.test.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +3 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/update.test.js +8 -4
- package/dist/cli/commands/update.test.js.map +1 -1
- package/dist/cli/commands/version.d.ts.map +1 -1
- package/dist/cli/commands/version.js +3 -1
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/commands/version.test.js +9 -5
- package/dist/cli/commands/version.test.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output/interactive.d.ts +1 -0
- package/dist/cli/output/interactive.d.ts.map +1 -1
- package/dist/cli/output/interactive.js +5 -0
- package/dist/cli/output/interactive.js.map +1 -1
- package/dist/cli/shutdown.d.ts +51 -0
- package/dist/cli/shutdown.d.ts.map +1 -0
- package/dist/cli/shutdown.js +199 -0
- package/dist/cli/shutdown.js.map +1 -0
- package/dist/cli/shutdown.test.d.ts +2 -0
- package/dist/cli/shutdown.test.d.ts.map +1 -0
- package/dist/cli/shutdown.test.js +316 -0
- package/dist/cli/shutdown.test.js.map +1 -0
- package/dist/e2e/init.test.js +5 -4
- package/dist/e2e/init.test.js.map +1 -1
- package/dist/state/lock-manager.d.ts +1 -0
- package/dist/state/lock-manager.d.ts.map +1 -1
- package/dist/state/lock-manager.js +1 -1
- package/dist/state/lock-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,6 +13,7 @@ import { buildIndexWithOverrides, loadFullEntries } from '../../core/assembly/kn
|
|
|
13
13
|
import { createAdapter } from '../../core/adapters/adapter.js';
|
|
14
14
|
import { ensureScaffoldGitignore, findLegacyGeneratedOutputs } from '../../project/gitignore.js';
|
|
15
15
|
import fs from 'node:fs';
|
|
16
|
+
import { shutdown } from '../shutdown.js';
|
|
16
17
|
const buildCommand = {
|
|
17
18
|
command: 'build',
|
|
18
19
|
describe: 'Generate platform adapter output files',
|
|
@@ -35,188 +36,198 @@ const buildCommand = {
|
|
|
35
36
|
},
|
|
36
37
|
};
|
|
37
38
|
export async function runBuild(argv, options = {}) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
'
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return { exitCode: 0, data: validationResult };
|
|
93
|
-
}
|
|
94
|
-
// Step 9: Load knowledge index
|
|
95
|
-
const kbIndex = buildIndexWithOverrides(projectRoot, getPackageKnowledgeDir(projectRoot));
|
|
96
|
-
// Step 9.5: Ensure .gitignore and warn about legacy root output
|
|
97
|
-
const gitignoreResult = ensureScaffoldGitignore(projectRoot);
|
|
98
|
-
for (const warning of gitignoreResult.warnings) {
|
|
99
|
-
output.warn(warning);
|
|
100
|
-
}
|
|
101
|
-
const legacyOutputs = findLegacyGeneratedOutputs(projectRoot);
|
|
102
|
-
if (legacyOutputs.length > 0) {
|
|
103
|
-
output.warn({
|
|
104
|
-
code: 'LEGACY_GENERATED_OUTPUTS_PRESENT',
|
|
105
|
-
message: [
|
|
106
|
-
`Legacy root Scaffold outputs still exist: ${legacyOutputs.join(', ')}.`,
|
|
107
|
-
'See README migration instructions.',
|
|
108
|
-
].join(' '),
|
|
109
|
-
context: { count: legacyOutputs.length },
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
// Step 10: Build reverse dependency map (step → steps that come after it)
|
|
113
|
-
const forwardDeps = new Map();
|
|
114
|
-
for (const [stepName, _node] of graph.nodes) {
|
|
115
|
-
// Find steps that list this step as a dependency
|
|
116
|
-
const dependents = [];
|
|
117
|
-
for (const [otherName, _otherNode] of graph.nodes) {
|
|
118
|
-
if (otherName === stepName)
|
|
119
|
-
continue;
|
|
120
|
-
const otherMeta = metaPrompts.get(otherName);
|
|
121
|
-
if (otherMeta?.frontmatter.dependencies.includes(stepName)) {
|
|
122
|
-
dependents.push(otherName);
|
|
39
|
+
return shutdown.withContext('Cancelled. Partial output may exist. Run `scaffold build` to regenerate.', async () => {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
// Step 1: Resolve project root
|
|
42
|
+
const projectRoot = argv.root ?? findProjectRoot(process.cwd());
|
|
43
|
+
if (!projectRoot) {
|
|
44
|
+
process.stderr.write('\u2717 error [PROJECT_NOT_INITIALIZED]: No .scaffold/ directory found\n' +
|
|
45
|
+
' Fix: Run `scaffold init` to initialize a project\n');
|
|
46
|
+
return { exitCode: 1 };
|
|
47
|
+
}
|
|
48
|
+
const outputMode = resolveOutputMode(argv);
|
|
49
|
+
const output = options.output ?? createOutputContext(outputMode);
|
|
50
|
+
// Step 2: Load config
|
|
51
|
+
const { config, errors: configErrors } = loadConfig(projectRoot, []);
|
|
52
|
+
if (configErrors.length > 0) {
|
|
53
|
+
displayErrors(configErrors, [], output);
|
|
54
|
+
return { exitCode: 1, errors: configErrors };
|
|
55
|
+
}
|
|
56
|
+
if (!config) {
|
|
57
|
+
output.error('Config not found');
|
|
58
|
+
return { exitCode: 1 };
|
|
59
|
+
}
|
|
60
|
+
// Step 3: Discover meta-prompts from both pipeline/ and tools/ directories
|
|
61
|
+
const metaPrompts = discoverAllMetaPrompts(getPackagePipelineDir(projectRoot), getPackageToolsDir(projectRoot));
|
|
62
|
+
const stepNames = [...metaPrompts.keys()];
|
|
63
|
+
// Step 4: Load presets (optional — failures are non-fatal)
|
|
64
|
+
try {
|
|
65
|
+
const methodologyDir = getPackageMethodologyDir(projectRoot);
|
|
66
|
+
loadAllPresets(methodologyDir, stepNames);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
process.stderr.write(`[scaffold] Warning: could not load methodology presets: ${err.message}\n`);
|
|
70
|
+
}
|
|
71
|
+
// Step 5: Build dependency graph
|
|
72
|
+
const graph = buildGraph([...metaPrompts.values()].map(m => m.frontmatter), new Map());
|
|
73
|
+
// Step 6: Detect cycles
|
|
74
|
+
const cycles = detectCycles(graph);
|
|
75
|
+
if (cycles.length > 0) {
|
|
76
|
+
displayErrors(cycles, [], output);
|
|
77
|
+
return { exitCode: 1, errors: cycles };
|
|
78
|
+
}
|
|
79
|
+
// Step 7: Topological sort (pipeline steps only — tools are excluded from graph)
|
|
80
|
+
const sorted = topologicalSort(graph);
|
|
81
|
+
// Append tools (category: 'tool') after pipeline steps — they aren't in the graph
|
|
82
|
+
const toolSteps = [...metaPrompts.values()]
|
|
83
|
+
.filter(m => m.frontmatter.category === 'tool')
|
|
84
|
+
.map(m => m.frontmatter.name)
|
|
85
|
+
.sort();
|
|
86
|
+
const enabledSteps = [...sorted, ...toolSteps];
|
|
87
|
+
// Step 8: Handle --validate-only
|
|
88
|
+
if (argv['validate-only']) {
|
|
89
|
+
const validationResult = { valid: true, stepCount: stepNames.length, cycles: 0 };
|
|
90
|
+
output.success(`Validation passed: ${stepNames.length} steps, no cycles`);
|
|
91
|
+
if (outputMode === 'json' && !options.suppressFinalResult) {
|
|
92
|
+
output.result(validationResult);
|
|
123
93
|
}
|
|
94
|
+
return { exitCode: 0, data: validationResult };
|
|
124
95
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
//
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
results
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
96
|
+
// Step 9: Load knowledge index
|
|
97
|
+
const kbIndex = buildIndexWithOverrides(projectRoot, getPackageKnowledgeDir(projectRoot));
|
|
98
|
+
// Step 9.5: Ensure .gitignore and warn about legacy root output
|
|
99
|
+
const gitignoreResult = ensureScaffoldGitignore(projectRoot);
|
|
100
|
+
for (const warning of gitignoreResult.warnings) {
|
|
101
|
+
output.warn(warning);
|
|
102
|
+
}
|
|
103
|
+
const legacyOutputs = findLegacyGeneratedOutputs(projectRoot);
|
|
104
|
+
if (legacyOutputs.length > 0) {
|
|
105
|
+
output.warn({
|
|
106
|
+
code: 'LEGACY_GENERATED_OUTPUTS_PRESENT',
|
|
107
|
+
message: [
|
|
108
|
+
`Legacy root Scaffold outputs still exist: ${legacyOutputs.join(', ')}.`,
|
|
109
|
+
'See README migration instructions.',
|
|
110
|
+
].join(' '),
|
|
111
|
+
context: { count: legacyOutputs.length },
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Step 10: Build reverse dependency map (step → steps that come after it)
|
|
115
|
+
const forwardDeps = new Map();
|
|
116
|
+
for (const [stepName, _node] of graph.nodes) {
|
|
117
|
+
// Find steps that list this step as a dependency
|
|
118
|
+
const dependents = [];
|
|
119
|
+
for (const [otherName, _otherNode] of graph.nodes) {
|
|
120
|
+
if (otherName === stepName)
|
|
121
|
+
continue;
|
|
122
|
+
const otherMeta = metaPrompts.get(otherName);
|
|
123
|
+
if (otherMeta?.frontmatter.dependencies.includes(stepName)) {
|
|
124
|
+
dependents.push(otherName);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
forwardDeps.set(stepName, dependents);
|
|
128
|
+
}
|
|
129
|
+
// Step 11: Create adapters and generate
|
|
130
|
+
const configuredPlatforms = config.platforms ?? ['claude-code'];
|
|
131
|
+
const platforms = [...new Set([...configuredPlatforms, 'universal'])];
|
|
132
|
+
const allOutputFiles = [];
|
|
133
|
+
for (const platformId of platforms) {
|
|
134
|
+
const adapter = createAdapter(platformId);
|
|
135
|
+
adapter.initialize({
|
|
136
|
+
projectRoot,
|
|
137
|
+
methodology: config.methodology ?? 'deep',
|
|
138
|
+
allSteps: stepNames,
|
|
139
|
+
});
|
|
140
|
+
const results = [];
|
|
141
|
+
for (const stepSlug of enabledSteps) {
|
|
142
|
+
const meta = metaPrompts.get(stepSlug);
|
|
143
|
+
if (!meta)
|
|
144
|
+
continue;
|
|
145
|
+
// Load full knowledge entries (Summary + Deep Guidance) for self-contained commands
|
|
146
|
+
const kbNames = meta.frontmatter.knowledgeBase ?? [];
|
|
147
|
+
const { entries: kbEntries } = loadFullEntries(kbIndex, kbNames);
|
|
148
|
+
// Build long description: prefer summary, then Purpose section first line, then description
|
|
149
|
+
const purposeSection = meta.sections['Purpose'] ?? '';
|
|
150
|
+
const longDescription = meta.frontmatter.summary
|
|
151
|
+
?? purposeSection.split('\n')[0]?.trim()
|
|
152
|
+
?? meta.frontmatter.description;
|
|
153
|
+
const input = {
|
|
154
|
+
slug: stepSlug,
|
|
155
|
+
description: meta.frontmatter.description,
|
|
156
|
+
phase: meta.frontmatter.phase,
|
|
157
|
+
dependsOn: forwardDeps.get(stepSlug) ?? [],
|
|
158
|
+
produces: meta.frontmatter.outputs,
|
|
159
|
+
pipelineIndex: enabledSteps.indexOf(stepSlug),
|
|
160
|
+
body: meta.body,
|
|
161
|
+
sections: meta.sections,
|
|
162
|
+
knowledgeEntries: kbEntries.map(e => ({
|
|
163
|
+
name: e.name,
|
|
164
|
+
description: e.description,
|
|
165
|
+
content: e.content,
|
|
166
|
+
})),
|
|
167
|
+
conditional: meta.frontmatter.conditional,
|
|
168
|
+
longDescription,
|
|
169
|
+
};
|
|
170
|
+
const stepResult = adapter.generateStepWrapper(input);
|
|
171
|
+
results.push(stepResult);
|
|
172
|
+
allOutputFiles.push(...stepResult.files);
|
|
173
|
+
}
|
|
174
|
+
const finalizeResult = adapter.finalize({ results });
|
|
175
|
+
allOutputFiles.push(...finalizeResult.files);
|
|
176
|
+
}
|
|
177
|
+
// Step 12: Write output files
|
|
178
|
+
let generatedCount = 0;
|
|
179
|
+
for (const file of allOutputFiles) {
|
|
180
|
+
if (shutdown.isShuttingDown)
|
|
181
|
+
break;
|
|
182
|
+
const fullPath = path.join(projectRoot, file.relativePath);
|
|
183
|
+
const dir = path.dirname(fullPath);
|
|
184
|
+
if (!fs.existsSync(dir)) {
|
|
185
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
186
|
+
}
|
|
187
|
+
atomicWriteFile(fullPath, file.content);
|
|
188
|
+
generatedCount++;
|
|
189
|
+
}
|
|
190
|
+
// Step 12.5: Generate resolved skills for plugin auto-discovery
|
|
191
|
+
const skillTemplateDir = path.join(getPackageRoot(), 'content', 'skills');
|
|
192
|
+
const skillOutputDir = path.join(getPackageRoot(), 'skills');
|
|
193
|
+
if (fs.existsSync(skillTemplateDir)) {
|
|
194
|
+
const claudeVars = { INSTRUCTIONS_FILE: 'CLAUDE.md' };
|
|
195
|
+
for (const skillName of fs.readdirSync(skillTemplateDir)) {
|
|
196
|
+
if (shutdown.isShuttingDown)
|
|
197
|
+
break;
|
|
198
|
+
const templatePath = path.join(skillTemplateDir, skillName, 'SKILL.md');
|
|
199
|
+
if (!fs.existsSync(templatePath))
|
|
200
|
+
continue;
|
|
201
|
+
const template = fs.readFileSync(templatePath, 'utf8');
|
|
202
|
+
const resolved = template.replace(/\{\{(\w+)\}\}/g, (match, key) => claudeVars[key] ?? match);
|
|
203
|
+
const outDir = path.join(skillOutputDir, skillName);
|
|
204
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
205
|
+
fs.writeFileSync(path.join(outDir, 'SKILL.md'), resolved, 'utf8');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Step 13: Report build stats
|
|
209
|
+
const buildResult = {
|
|
210
|
+
stepsTotal: stepNames.length,
|
|
211
|
+
stepsEnabled: enabledSteps.length,
|
|
212
|
+
platforms,
|
|
213
|
+
generatedFiles: generatedCount,
|
|
214
|
+
buildTimeMs: Date.now() - startTime,
|
|
215
|
+
};
|
|
216
|
+
// If shutdown interrupted the build, return early without success message
|
|
217
|
+
if (shutdown.isShuttingDown) {
|
|
218
|
+
return { exitCode: 1, data: buildResult };
|
|
219
|
+
}
|
|
220
|
+
if (outputMode === 'json') {
|
|
221
|
+
if (!options.suppressFinalResult) {
|
|
222
|
+
output.result(buildResult);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
output.success(`Build complete: ${generatedCount} files generated for ${enabledSteps.length} steps`);
|
|
227
|
+
output.info(`Platforms: ${platforms.join(', ')}`);
|
|
228
|
+
}
|
|
229
|
+
return { exitCode: 0, data: buildResult };
|
|
230
|
+
}); // end withContext
|
|
220
231
|
}
|
|
221
232
|
export default buildCommand;
|
|
222
233
|
//# sourceMappingURL=build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAA;AAClF,OAAO,EACL,qBAAqB,EAAE,wBAAwB,EAC/C,sBAAsB,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,GAC5E,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAE9D,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAChG,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/complete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/complete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAW1C,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,QAAA,MAAM,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CA4GzE,CAAA;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -2,10 +2,11 @@ import { findProjectRoot } from '../middleware/project-root.js';
|
|
|
2
2
|
import { resolveOutputMode } from '../middleware/output-mode.js';
|
|
3
3
|
import { createOutputContext } from '../output/context.js';
|
|
4
4
|
import { StateManager } from '../../state/state-manager.js';
|
|
5
|
-
import { acquireLock, releaseLock } from '../../state/lock-manager.js';
|
|
5
|
+
import { acquireLock, getLockPath, releaseLock } from '../../state/lock-manager.js';
|
|
6
6
|
import { findClosestMatch } from '../../utils/levenshtein.js';
|
|
7
7
|
import { loadPipelineContext } from '../../core/pipeline/context.js';
|
|
8
8
|
import { resolvePipeline } from '../../core/pipeline/resolver.js';
|
|
9
|
+
import { shutdown } from '../shutdown.js';
|
|
9
10
|
const completeCommand = {
|
|
10
11
|
command: 'complete <step>',
|
|
11
12
|
describe: 'Mark a step as completed (for steps executed outside scaffold run)',
|
|
@@ -34,10 +35,18 @@ const completeCommand = {
|
|
|
34
35
|
else {
|
|
35
36
|
output.warn('Lock is held by another process');
|
|
36
37
|
}
|
|
37
|
-
process.
|
|
38
|
+
process.exitCode = 3;
|
|
38
39
|
return;
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
+
if (lockResult.acquired) {
|
|
42
|
+
shutdown.registerLockOwnership(getLockPath(projectRoot));
|
|
43
|
+
}
|
|
44
|
+
await shutdown.withResource('lock', () => {
|
|
45
|
+
if (lockResult.acquired) {
|
|
46
|
+
releaseLock(projectRoot);
|
|
47
|
+
shutdown.releaseLockOwnership();
|
|
48
|
+
}
|
|
49
|
+
}, async () => {
|
|
41
50
|
const context = loadPipelineContext(projectRoot);
|
|
42
51
|
const pipeline = resolvePipeline(context);
|
|
43
52
|
const stateManager = new StateManager(projectRoot, pipeline.computeEligible);
|
|
@@ -54,7 +63,7 @@ const completeCommand = {
|
|
|
54
63
|
exitCode: 2,
|
|
55
64
|
recovery: 'Run `scaffold list` to see available steps',
|
|
56
65
|
});
|
|
57
|
-
process.
|
|
66
|
+
process.exitCode = 2;
|
|
58
67
|
return;
|
|
59
68
|
}
|
|
60
69
|
const stepEntry = state.steps[argv.step];
|
|
@@ -66,7 +75,7 @@ const completeCommand = {
|
|
|
66
75
|
else {
|
|
67
76
|
output.info(`Step '${argv.step}' is already completed`);
|
|
68
77
|
}
|
|
69
|
-
process.
|
|
78
|
+
process.exitCode = 0;
|
|
70
79
|
return;
|
|
71
80
|
}
|
|
72
81
|
const previousStatus = stepEntry.status;
|
|
@@ -94,13 +103,8 @@ const completeCommand = {
|
|
|
94
103
|
output.success(`Step '${argv.step}' marked as completed (was ${previousStatus})`);
|
|
95
104
|
output.info('Run `scaffold next` to see eligible steps');
|
|
96
105
|
}
|
|
97
|
-
process.
|
|
98
|
-
}
|
|
99
|
-
finally {
|
|
100
|
-
if (lockResult.acquired) {
|
|
101
|
-
releaseLock(projectRoot);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
106
|
+
process.exitCode = 0;
|
|
107
|
+
});
|
|
104
108
|
},
|
|
105
109
|
};
|
|
106
110
|
export default completeCommand;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/cli/commands/complete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/cli/commands/complete.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,16 @@ vi.mock('../middleware/output-mode.js', () => ({
|
|
|
13
13
|
}));
|
|
14
14
|
vi.mock('../../state/lock-manager.js', () => ({
|
|
15
15
|
acquireLock: vi.fn(() => ({ acquired: true })),
|
|
16
|
+
getLockPath: vi.fn(() => '/mock/.scaffold/lock.json'),
|
|
16
17
|
releaseLock: vi.fn(),
|
|
17
18
|
}));
|
|
19
|
+
vi.mock('../shutdown.js', () => ({
|
|
20
|
+
shutdown: {
|
|
21
|
+
registerLockOwnership: vi.fn(),
|
|
22
|
+
releaseLockOwnership: vi.fn(),
|
|
23
|
+
withResource: vi.fn(async (_name, _cleanup, fn) => fn()),
|
|
24
|
+
},
|
|
25
|
+
}));
|
|
18
26
|
// ---------------------------------------------------------------------------
|
|
19
27
|
// Imports (after mocks)
|
|
20
28
|
// ---------------------------------------------------------------------------
|
|
@@ -48,6 +56,7 @@ describe('complete command', () => {
|
|
|
48
56
|
mockResolveOutputMode.mockReturnValue('auto');
|
|
49
57
|
});
|
|
50
58
|
afterEach(() => {
|
|
59
|
+
process.exitCode = undefined;
|
|
51
60
|
vi.restoreAllMocks();
|
|
52
61
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
53
62
|
});
|
|
@@ -79,28 +88,28 @@ describe('complete command', () => {
|
|
|
79
88
|
it('exits 2 when step not found in state', async () => {
|
|
80
89
|
writeState({ 'some-other-step': { status: 'pending', source: 'pipeline' } });
|
|
81
90
|
await completeCommand.handler(defaultArgv({ step: 'nonexistent' }));
|
|
82
|
-
expect(
|
|
91
|
+
expect(process.exitCode).toBe(2);
|
|
83
92
|
});
|
|
84
93
|
it('marks in_progress step as completed', async () => {
|
|
85
94
|
writeState({ 'review-testing': { status: 'in_progress', source: 'pipeline' } });
|
|
86
95
|
await completeCommand.handler(defaultArgv());
|
|
87
96
|
const state = JSON.parse(fs.readFileSync(path.join(tempDir, '.scaffold', 'state.json'), 'utf8'));
|
|
88
97
|
expect(state.steps['review-testing'].status).toBe('completed');
|
|
89
|
-
expect(
|
|
98
|
+
expect(process.exitCode).toBe(0);
|
|
90
99
|
});
|
|
91
100
|
it('marks pending step as completed', async () => {
|
|
92
101
|
writeState({ 'review-testing': { status: 'pending', source: 'pipeline' } });
|
|
93
102
|
await completeCommand.handler(defaultArgv());
|
|
94
103
|
const state = JSON.parse(fs.readFileSync(path.join(tempDir, '.scaffold', 'state.json'), 'utf8'));
|
|
95
104
|
expect(state.steps['review-testing'].status).toBe('completed');
|
|
96
|
-
expect(
|
|
105
|
+
expect(process.exitCode).toBe(0);
|
|
97
106
|
});
|
|
98
107
|
it('reports already completed step without error', async () => {
|
|
99
108
|
writeState({ 'review-testing': { status: 'completed', source: 'pipeline' } });
|
|
100
109
|
await completeCommand.handler(defaultArgv());
|
|
101
110
|
const allOutput = writtenLines.join('');
|
|
102
111
|
expect(allOutput).toContain('already completed');
|
|
103
|
-
expect(
|
|
112
|
+
expect(process.exitCode).toBe(0);
|
|
104
113
|
});
|
|
105
114
|
it('clears in_progress record when completing that step', async () => {
|
|
106
115
|
const state = {
|
|
@@ -130,7 +139,7 @@ describe('complete command', () => {
|
|
|
130
139
|
await completeCommand.handler(defaultArgv({ step: 'review-testin' }));
|
|
131
140
|
const allOutput = writtenLines.join('');
|
|
132
141
|
expect(allOutput).toContain('review-testing');
|
|
133
|
-
expect(
|
|
142
|
+
expect(process.exitCode).toBe(2);
|
|
134
143
|
});
|
|
135
144
|
});
|
|
136
145
|
//# sourceMappingURL=complete.test.js.map
|