@zigrivers/scaffold 2.45.0 → 3.0.1
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 +25 -8
- package/dist/cli/commands/build.d.ts +8 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +166 -145
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/build.test.js +111 -26
- package/dist/cli/commands/build.test.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +20 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +39 -4
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/core/adapters/claude-code.js +1 -1
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/claude-code.test.js +2 -2
- package/dist/core/adapters/claude-code.test.js.map +1 -1
- package/dist/core/adapters/codex.js +1 -1
- package/dist/core/adapters/codex.js.map +1 -1
- package/dist/core/adapters/codex.test.js +3 -3
- package/dist/core/adapters/codex.test.js.map +1 -1
- package/dist/core/adapters/universal.js +1 -1
- package/dist/core/adapters/universal.js.map +1 -1
- package/dist/core/adapters/universal.test.js +3 -3
- package/dist/core/adapters/universal.test.js.map +1 -1
- package/dist/e2e/init.test.js +24 -0
- package/dist/e2e/init.test.js.map +1 -1
- package/dist/e2e/knowledge.test.js +70 -2
- package/dist/e2e/knowledge.test.js.map +1 -1
- package/dist/project/gitignore.d.ts +9 -0
- package/dist/project/gitignore.d.ts.map +1 -0
- package/dist/project/gitignore.js +103 -0
- package/dist/project/gitignore.js.map +1 -0
- package/dist/project/gitignore.test.d.ts +2 -0
- package/dist/project/gitignore.test.d.ts.map +1 -0
- package/dist/project/gitignore.test.js +96 -0
- package/dist/project/gitignore.test.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -164,7 +164,7 @@ Or: `/plugin marketplace update zigrivers-scaffold`
|
|
|
164
164
|
|
|
165
165
|
### Existing projects
|
|
166
166
|
|
|
167
|
-
After upgrading the CLI, existing projects
|
|
167
|
+
After upgrading the CLI, existing projects still get automatic state migrations. Run `scaffold status` in your project directory — the state manager detects and renames old step keys, removes retired steps, normalizes artifact paths, and persists the changes atomically. No manual editing of `.scaffold/state.json` is needed.
|
|
168
168
|
|
|
169
169
|
**Step migrations handled automatically:**
|
|
170
170
|
- `add-playwright` / `add-maestro` → `add-e2e-testing`
|
|
@@ -176,6 +176,23 @@ After upgrading the CLI, existing projects migrate automatically. Run `scaffold
|
|
|
176
176
|
|
|
177
177
|
The PRD is always created as `docs/plan.md`. If you have a legacy `docs/prd.md` from an older version, the context gatherer resolves aliased paths so downstream steps find your PRD regardless.
|
|
178
178
|
|
|
179
|
+
### Generated output layout
|
|
180
|
+
|
|
181
|
+
Fresh `scaffold init` now creates committed project state under `.scaffold/` and auto-runs `scaffold build`, which writes inspectable adapter artifacts under `.scaffold/generated/`. Scaffold also manages a dedicated block in `.gitignore` so generated output, `.scaffold/lock.json`, and Scaffold temp files stay out of version control by default.
|
|
182
|
+
|
|
183
|
+
The canonical execution entrypoints are still `scaffold run <step>` and the installed Scaffold plugin. Files under `.scaffold/generated/` are internal build artifacts, not root-level project files.
|
|
184
|
+
|
|
185
|
+
### Migration for older projects
|
|
186
|
+
|
|
187
|
+
This release is a clean breaking change for generated adapter output. To migrate an existing project:
|
|
188
|
+
|
|
189
|
+
1. Upgrade Scaffold.
|
|
190
|
+
2. Remove old root-level generated Scaffold output if present: `commands/`, `prompts/`, `codex-prompts/`, and root `AGENTS.md` only if it was Scaffold-generated.
|
|
191
|
+
3. Run `scaffold build`.
|
|
192
|
+
4. Review the Scaffold-managed block in `.gitignore`.
|
|
193
|
+
5. Commit `.gitignore` plus the intended committed `.scaffold/` state files (`config.yml`, `state.json`, `decisions.jsonl`, `instructions/`).
|
|
194
|
+
6. Do not commit `.scaffold/generated/` or `.scaffold/lock.json`.
|
|
195
|
+
|
|
179
196
|
## Quick Start
|
|
180
197
|
|
|
181
198
|
The fastest way to use Scaffold is through natural language inside Claude Code. The Scaffold Runner skill handles pipeline navigation, surfaces decision points before Claude picks defaults, and tracks your progress automatically. The examples below show what you'd type in a Claude Code session.
|
|
@@ -362,7 +379,7 @@ Claude researches and documents your technology choices (language, framework, da
|
|
|
362
379
|
|
|
363
380
|
| Step | What It Does |
|
|
364
381
|
|------|-------------|
|
|
365
|
-
| `beads` | Sets up Beads task tracking with a lessons-learned file for cross-session learning, and creates the initial CLAUDE.md skeleton with core principles and workflow conventions. *(
|
|
382
|
+
| `beads` | Sets up optional Beads task tracking for downstream projects Scaffold generates, with a lessons-learned file for cross-session learning, and creates the initial CLAUDE.md skeleton with core principles and workflow conventions. *(This is not Scaffold's own issue-tracking workflow.)* |
|
|
366
383
|
| `tech-stack` | Claude researches technology options for your project — language, framework, database, hosting, auth — evaluates each against your requirements, and documents every choice with rationale and alternatives considered. |
|
|
367
384
|
| `coding-standards` | Claude creates coding standards tailored to your tech stack — naming conventions, error handling patterns, import organization, AI-specific rules — and generates working linter and formatter config files. |
|
|
368
385
|
| `tdd` | Claude defines your testing approach — which types of tests to write at each layer, coverage targets, what to mock and what not to, test data patterns — so agents write the right tests from the start. |
|
|
@@ -579,14 +596,14 @@ You can change methodology mid-pipeline with `scaffold init --methodology <prese
|
|
|
579
596
|
|
|
580
597
|
| Command | What It Does |
|
|
581
598
|
|---------|-------------|
|
|
582
|
-
| `scaffold init` | Initialize `.scaffold/`
|
|
599
|
+
| `scaffold init` | Initialize `.scaffold/` state, then auto-build hidden adapter artifacts |
|
|
583
600
|
| `scaffold run <step>` | Execute a pipeline step (assembles and outputs the full prompt) |
|
|
584
|
-
| `scaffold build` | Generate
|
|
601
|
+
| `scaffold build` | Generate hidden adapter output under `.scaffold/generated/` and update the managed `.gitignore` block |
|
|
585
602
|
| `scaffold adopt` | Bootstrap state from existing artifacts (brownfield projects) |
|
|
586
603
|
| `scaffold skip <step> [<step2>...]` | Skip one or more steps with a reason |
|
|
587
604
|
| `scaffold complete <step>` | Mark a step as completed (for steps executed outside `scaffold run`) |
|
|
588
605
|
| `scaffold reset <step>` | Reset a step back to pending |
|
|
589
|
-
| `scaffold status [--compact]` | Show pipeline progress (`--compact` shows only remaining work). Warns if
|
|
606
|
+
| `scaffold status [--compact]` | Show pipeline progress (`--compact` shows only remaining work). Warns if generated adapter output is stale. |
|
|
590
607
|
| `scaffold next` | List next unblocked step(s) |
|
|
591
608
|
| `scaffold check <step>` | Check if a conditional step applies to this project |
|
|
592
609
|
| `scaffold validate` | Validate meta-prompts, config, state, and dependency graph |
|
|
@@ -725,7 +742,7 @@ Claude analyzes your commits since the last release, suggests whether this is a
|
|
|
725
742
|
1. Running your project's tests
|
|
726
743
|
2. Updating the version number in your project files
|
|
727
744
|
3. Generating a changelog entry
|
|
728
|
-
4. Creating a Git tag and
|
|
745
|
+
4. Creating a Git tag, GitHub release, and npm publish
|
|
729
746
|
|
|
730
747
|
Options: `--dry-run` to preview, `minor`/`major`/`patch` to specify the bump, `current` to release an already-bumped version, `rollback` to undo.
|
|
731
748
|
|
|
@@ -828,7 +845,7 @@ src/
|
|
|
828
845
|
- **Assembly engine** (`src/core/assembly/engine.ts`) — Pure orchestrator with no I/O. Constructs 7-section prompts from meta-prompt + knowledge + context + methodology + instructions + depth guidance.
|
|
829
846
|
- **State manager** (`src/state/state-manager.ts`) — Atomic writes via tmp + `fs.renameSync()`. Tracks step status, in-progress records, and next-eligible cache. Includes migration system for step renames and retired steps.
|
|
830
847
|
- **Dependency graph** (`src/core/dependency/`) — Kahn's algorithm topological sort with phase-aware ordering and cycle detection.
|
|
831
|
-
- **Platform adapters** (`src/core/adapters/`) — 3-step lifecycle (initialize → generateStepWrapper → finalize) producing
|
|
848
|
+
- **Platform adapters** (`src/core/adapters/`) — 3-step lifecycle (initialize → generateStepWrapper → finalize) producing hidden adapter artifacts under `.scaffold/generated/claude-code/`, `.scaffold/generated/codex/`, and `.scaffold/generated/universal/`.
|
|
832
849
|
- **Project detector** (`src/project/detector.ts`) — Scans for file system signals to classify projects as greenfield, brownfield, or v1-migration.
|
|
833
850
|
- **Check command** (`src/cli/commands/check.ts`) — Applicability detection for conditional steps (platform detection, GitHub remote detection, CLI availability).
|
|
834
851
|
|
|
@@ -855,7 +872,7 @@ skills/ # 3 Claude Code skills (pipeline reference, runner, multi-
|
|
|
855
872
|
### Contributing
|
|
856
873
|
|
|
857
874
|
1. Meta-prompt content lives in `pipeline/` — edit the relevant `.md` file
|
|
858
|
-
2.
|
|
875
|
+
2. If you changed adapter behavior, run `scaffold build` in a test project and inspect the generated artifacts under `.scaffold/generated/`.
|
|
859
876
|
3. Run `make check-all` (lint + type-check + test + evals) before submitting
|
|
860
877
|
4. Knowledge entries live in `knowledge/` — follow the existing frontmatter schema
|
|
861
878
|
5. ADRs documenting architectural decisions are in `docs/v2/adrs/`
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { CommandModule } from 'yargs';
|
|
2
|
-
|
|
2
|
+
import type { OutputContext } from '../output/context.js';
|
|
3
|
+
import type { CommandResult } from '../../types/index.js';
|
|
4
|
+
export interface BuildArgs {
|
|
3
5
|
'validate-only': boolean;
|
|
4
6
|
force: boolean;
|
|
5
7
|
format?: string;
|
|
@@ -7,6 +9,11 @@ interface BuildArgs {
|
|
|
7
9
|
verbose?: boolean;
|
|
8
10
|
root?: string;
|
|
9
11
|
}
|
|
12
|
+
interface RunBuildOptions {
|
|
13
|
+
output?: OutputContext;
|
|
14
|
+
suppressFinalResult?: boolean;
|
|
15
|
+
}
|
|
10
16
|
declare const buildCommand: CommandModule<Record<string, unknown>, BuildArgs>;
|
|
17
|
+
export declare function runBuild(argv: BuildArgs, options?: RunBuildOptions): Promise<CommandResult>;
|
|
11
18
|
export default buildCommand;
|
|
12
19
|
//# sourceMappingURL=build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAQ,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAQ,MAAM,OAAO,CAAA;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAgBzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,QAAA,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAoBnE,CAAA;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwMrG;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -11,6 +11,7 @@ import { detectCycles, topologicalSort } from '../../core/dependency/dependency.
|
|
|
11
11
|
import { displayErrors } from '../../cli/output/error-display.js';
|
|
12
12
|
import { buildIndexWithOverrides, loadFullEntries } from '../../core/assembly/knowledge-loader.js';
|
|
13
13
|
import { createAdapter } from '../../core/adapters/adapter.js';
|
|
14
|
+
import { ensureScaffoldGitignore, findLegacyGeneratedOutputs } from '../../project/gitignore.js';
|
|
14
15
|
import fs from 'node:fs';
|
|
15
16
|
const buildCommand = {
|
|
16
17
|
command: 'build',
|
|
@@ -29,157 +30,177 @@ const buildCommand = {
|
|
|
29
30
|
});
|
|
30
31
|
},
|
|
31
32
|
handler: async (argv) => {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
return;
|
|
33
|
+
const result = await runBuild(argv);
|
|
34
|
+
process.exit(result.exitCode);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
export async function runBuild(argv, options = {}) {
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
// Step 1: Resolve project root
|
|
40
|
+
const projectRoot = argv.root ?? findProjectRoot(process.cwd());
|
|
41
|
+
if (!projectRoot) {
|
|
42
|
+
process.stderr.write('\u2717 error [PROJECT_NOT_INITIALIZED]: No .scaffold/ directory found\n' +
|
|
43
|
+
' Fix: Run `scaffold init` to initialize a project\n');
|
|
44
|
+
return { exitCode: 1 };
|
|
45
|
+
}
|
|
46
|
+
const outputMode = resolveOutputMode(argv);
|
|
47
|
+
const output = options.output ?? createOutputContext(outputMode);
|
|
48
|
+
// Step 2: Load config
|
|
49
|
+
const { config, errors: configErrors } = loadConfig(projectRoot, []);
|
|
50
|
+
if (configErrors.length > 0) {
|
|
51
|
+
displayErrors(configErrors, [], output);
|
|
52
|
+
return { exitCode: 1, errors: configErrors };
|
|
53
|
+
}
|
|
54
|
+
if (!config) {
|
|
55
|
+
output.error('Config not found');
|
|
56
|
+
return { exitCode: 1 };
|
|
57
|
+
}
|
|
58
|
+
// Step 3: Discover meta-prompts from both pipeline/ and tools/ directories
|
|
59
|
+
const metaPrompts = discoverAllMetaPrompts(getPackagePipelineDir(projectRoot), getPackageToolsDir(projectRoot));
|
|
60
|
+
const stepNames = [...metaPrompts.keys()];
|
|
61
|
+
// Step 4: Load presets (optional — failures are non-fatal)
|
|
62
|
+
try {
|
|
63
|
+
const methodologyDir = getPackageMethodologyDir(projectRoot);
|
|
64
|
+
loadAllPresets(methodologyDir, stepNames);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
process.stderr.write(`[scaffold] Warning: could not load methodology presets: ${err.message}\n`);
|
|
68
|
+
}
|
|
69
|
+
// Step 5: Build dependency graph
|
|
70
|
+
const graph = buildGraph([...metaPrompts.values()].map(m => m.frontmatter), new Map());
|
|
71
|
+
// Step 6: Detect cycles
|
|
72
|
+
const cycles = detectCycles(graph);
|
|
73
|
+
if (cycles.length > 0) {
|
|
74
|
+
displayErrors(cycles, [], output);
|
|
75
|
+
return { exitCode: 1, errors: cycles };
|
|
76
|
+
}
|
|
77
|
+
// Step 7: Topological sort (pipeline steps only — tools are excluded from graph)
|
|
78
|
+
const sorted = topologicalSort(graph);
|
|
79
|
+
// Append tools (category: 'tool') after pipeline steps — they aren't in the graph
|
|
80
|
+
const toolSteps = [...metaPrompts.values()]
|
|
81
|
+
.filter(m => m.frontmatter.category === 'tool')
|
|
82
|
+
.map(m => m.frontmatter.name)
|
|
83
|
+
.sort();
|
|
84
|
+
const enabledSteps = [...sorted, ...toolSteps];
|
|
85
|
+
// Step 8: Handle --validate-only
|
|
86
|
+
if (argv['validate-only']) {
|
|
87
|
+
const validationResult = { valid: true, stepCount: stepNames.length, cycles: 0 };
|
|
88
|
+
output.success(`Validation passed: ${stepNames.length} steps, no cycles`);
|
|
89
|
+
if (outputMode === 'json' && !options.suppressFinalResult) {
|
|
90
|
+
output.result(validationResult);
|
|
91
91
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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);
|
|
106
123
|
}
|
|
107
|
-
forwardDeps.set(stepName, dependents);
|
|
108
124
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
125
|
+
forwardDeps.set(stepName, dependents);
|
|
126
|
+
}
|
|
127
|
+
// Step 11: Create adapters and generate
|
|
128
|
+
const configuredPlatforms = config.platforms ?? ['claude-code'];
|
|
129
|
+
const platforms = [...new Set([...configuredPlatforms, 'universal'])];
|
|
130
|
+
const allOutputFiles = [];
|
|
131
|
+
for (const platformId of platforms) {
|
|
132
|
+
const adapter = createAdapter(platformId);
|
|
133
|
+
adapter.initialize({
|
|
134
|
+
projectRoot,
|
|
135
|
+
methodology: config.methodology ?? 'deep',
|
|
136
|
+
allSteps: stepNames,
|
|
137
|
+
});
|
|
138
|
+
const results = [];
|
|
139
|
+
for (const stepSlug of enabledSteps) {
|
|
140
|
+
const meta = metaPrompts.get(stepSlug);
|
|
141
|
+
if (!meta)
|
|
142
|
+
continue;
|
|
143
|
+
// Load full knowledge entries (Summary + Deep Guidance) for self-contained commands
|
|
144
|
+
const kbNames = meta.frontmatter.knowledgeBase ?? [];
|
|
145
|
+
const { entries: kbEntries } = loadFullEntries(kbIndex, kbNames);
|
|
146
|
+
// Build long description: prefer summary, then Purpose section first line, then description
|
|
147
|
+
const purposeSection = meta.sections['Purpose'] ?? '';
|
|
148
|
+
const longDescription = meta.frontmatter.summary
|
|
149
|
+
?? purposeSection.split('\n')[0]?.trim()
|
|
150
|
+
?? meta.frontmatter.description;
|
|
151
|
+
const input = {
|
|
152
|
+
slug: stepSlug,
|
|
153
|
+
description: meta.frontmatter.description,
|
|
154
|
+
phase: meta.frontmatter.phase,
|
|
155
|
+
dependsOn: forwardDeps.get(stepSlug) ?? [],
|
|
156
|
+
produces: meta.frontmatter.outputs,
|
|
157
|
+
pipelineIndex: enabledSteps.indexOf(stepSlug),
|
|
158
|
+
body: meta.body,
|
|
159
|
+
sections: meta.sections,
|
|
160
|
+
knowledgeEntries: kbEntries.map(e => ({
|
|
161
|
+
name: e.name,
|
|
162
|
+
description: e.description,
|
|
163
|
+
content: e.content,
|
|
164
|
+
})),
|
|
165
|
+
conditional: meta.frontmatter.conditional,
|
|
166
|
+
longDescription,
|
|
167
|
+
};
|
|
168
|
+
const stepResult = adapter.generateStepWrapper(input);
|
|
169
|
+
results.push(stepResult);
|
|
170
|
+
allOutputFiles.push(...stepResult.files);
|
|
154
171
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
172
|
+
const finalizeResult = adapter.finalize({ results });
|
|
173
|
+
allOutputFiles.push(...finalizeResult.files);
|
|
174
|
+
}
|
|
175
|
+
// Step 12: Write output files
|
|
176
|
+
let generatedCount = 0;
|
|
177
|
+
for (const file of allOutputFiles) {
|
|
178
|
+
const fullPath = path.join(projectRoot, file.relativePath);
|
|
179
|
+
const dir = path.dirname(fullPath);
|
|
180
|
+
if (!fs.existsSync(dir)) {
|
|
181
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
165
182
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
183
|
+
atomicWriteFile(fullPath, file.content);
|
|
184
|
+
generatedCount++;
|
|
185
|
+
}
|
|
186
|
+
// Step 13: Report build stats
|
|
187
|
+
const buildResult = {
|
|
188
|
+
stepsTotal: stepNames.length,
|
|
189
|
+
stepsEnabled: enabledSteps.length,
|
|
190
|
+
platforms,
|
|
191
|
+
generatedFiles: generatedCount,
|
|
192
|
+
buildTimeMs: Date.now() - startTime,
|
|
193
|
+
};
|
|
194
|
+
if (outputMode === 'json') {
|
|
195
|
+
if (!options.suppressFinalResult) {
|
|
175
196
|
output.result(buildResult);
|
|
176
197
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
output.success(`Build complete: ${generatedCount} files generated for ${enabledSteps.length} steps`);
|
|
201
|
+
output.info(`Platforms: ${platforms.join(', ')}`);
|
|
202
|
+
}
|
|
203
|
+
return { exitCode: 0, data: buildResult };
|
|
204
|
+
}
|
|
184
205
|
export default buildCommand;
|
|
185
206
|
//# 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;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|