@zigrivers/scaffold 3.10.0 → 3.11.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 +3 -2
- package/content/knowledge/core/multi-model-research-dispatch.md +208 -0
- package/content/knowledge/game/game-ideation.md +100 -0
- package/content/knowledge/product/ideation-craft.md +209 -0
- package/content/methodology/game-overlay.yml +2 -0
- package/content/pipeline/foundation/tech-stack.md +1 -0
- package/content/pipeline/vision/create-vision.md +43 -0
- package/content/tools/prompt-pipeline.md +1 -0
- package/content/tools/spark.md +337 -0
- package/dist/cli/commands/adopt.cli-flags.test.d.ts +2 -0
- package/dist/cli/commands/adopt.cli-flags.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.cli-flags.test.js +165 -0
- package/dist/cli/commands/adopt.cli-flags.test.js.map +1 -0
- package/dist/cli/commands/adopt.config-resolution.test.d.ts +2 -0
- package/dist/cli/commands/adopt.config-resolution.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.config-resolution.test.js +217 -0
- package/dist/cli/commands/adopt.config-resolution.test.js.map +1 -0
- package/dist/cli/commands/adopt.config-write-integration.test.d.ts +2 -0
- package/dist/cli/commands/adopt.config-write-integration.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.config-write-integration.test.js +138 -0
- package/dist/cli/commands/adopt.config-write-integration.test.js.map +1 -0
- package/dist/cli/commands/adopt.d.ts +2 -0
- package/dist/cli/commands/adopt.d.ts.map +1 -1
- package/dist/cli/commands/adopt.js +5 -4
- package/dist/cli/commands/adopt.js.map +1 -1
- package/dist/cli/commands/adopt.result-shape.test.d.ts +2 -0
- package/dist/cli/commands/adopt.result-shape.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.result-shape.test.js +166 -0
- package/dist/cli/commands/adopt.result-shape.test.js.map +1 -0
- package/dist/cli/commands/adopt.serialization.test.d.ts +2 -0
- package/dist/cli/commands/adopt.serialization.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.serialization.test.js +228 -0
- package/dist/cli/commands/adopt.serialization.test.js.map +1 -0
- package/dist/cli/commands/adopt.test.js +8 -9
- package/dist/cli/commands/adopt.test.js.map +1 -1
- package/dist/cli/commands/adopt.windows-crlf.test.d.ts +2 -0
- package/dist/cli/commands/adopt.windows-crlf.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.windows-crlf.test.js +102 -0
- package/dist/cli/commands/adopt.windows-crlf.test.js.map +1 -0
- package/dist/project/detectors/library.d.ts.map +1 -1
- package/dist/project/detectors/library.js +6 -1
- package/dist/project/detectors/library.js.map +1 -1
- package/dist/project/detectors/library.test.js +22 -0
- package/dist/project/detectors/library.test.js.map +1 -1
- package/dist/types/config.d.ts +9 -9
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spark
|
|
3
|
+
description: Explore a raw project idea through Socratic questioning and research
|
|
4
|
+
summary: "Takes a vague idea and turns it into a well-formed idea brief through probing questions, competitive research, and innovation expansion. At higher depths, dispatches multi-model research and adversarial stress-testing. Feeds directly into create-vision."
|
|
5
|
+
phase: null
|
|
6
|
+
order: null
|
|
7
|
+
dependencies: []
|
|
8
|
+
outputs: [docs/spark-brief.md]
|
|
9
|
+
conditional: null
|
|
10
|
+
stateless: true
|
|
11
|
+
category: tool
|
|
12
|
+
knowledge-base: [ideation-craft, multi-model-research-dispatch]
|
|
13
|
+
argument-hint: "<idea or blank for interactive>"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
Turn a vague project idea into a well-formed idea brief through Socratic
|
|
19
|
+
questioning and active research. Spark is two things in one: an interviewer
|
|
20
|
+
that asks hard questions AND a research companion that explores the problem
|
|
21
|
+
space and brings back insights the user hasn't considered.
|
|
22
|
+
|
|
23
|
+
The output (`docs/spark-brief.md`) feeds into `create-vision` as optional
|
|
24
|
+
upstream context, accelerating the vision step without replacing it.
|
|
25
|
+
|
|
26
|
+
**Prerequisite:** Requires `scaffold init` to have been run first.
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
- User's idea (provided via `$ARGUMENTS` or interactively)
|
|
30
|
+
- Existing `docs/spark-brief.md` (if rerunning — triggers update/fresh choice)
|
|
31
|
+
- Web search results (depth 2+, if available on the platform)
|
|
32
|
+
- External model responses (depth 4+, if Codex/Gemini CLI available)
|
|
33
|
+
|
|
34
|
+
## Expected Outputs
|
|
35
|
+
- `docs/spark-brief.md` — directional idea brief with 8 sections
|
|
36
|
+
|
|
37
|
+
## Rerun Detection
|
|
38
|
+
|
|
39
|
+
Before starting, check if `docs/spark-brief.md` already exists:
|
|
40
|
+
|
|
41
|
+
**If the file exists:**
|
|
42
|
+
1. Read the existing brief and present a 2-3 sentence summary to the user.
|
|
43
|
+
2. Ask: "Update this brief or start fresh?"
|
|
44
|
+
3. **Update mode**: Use the existing brief as a starting point. Preserve content
|
|
45
|
+
that is still relevant. Focus on deepening, expanding, or revising specific
|
|
46
|
+
sections. Increment the tracking comment version (e.g., `v1` → `v2`).
|
|
47
|
+
4. **Fresh mode**: Overwrite the brief entirely. Start from Phase 1.
|
|
48
|
+
|
|
49
|
+
**If the file does NOT exist:** Proceed to Phase 1.
|
|
50
|
+
|
|
51
|
+
## Instructions
|
|
52
|
+
|
|
53
|
+
### Phase 1: Seed
|
|
54
|
+
|
|
55
|
+
Capture and clarify the raw idea.
|
|
56
|
+
|
|
57
|
+
**If `$ARGUMENTS` is provided:** Use it as the starting idea. Confirm your
|
|
58
|
+
understanding with the user before proceeding.
|
|
59
|
+
|
|
60
|
+
**If `$ARGUMENTS` is blank:** Ask: "What idea do you want to explore?"
|
|
61
|
+
|
|
62
|
+
Clarify the basics through progressive questioning. Batch 2-3 related
|
|
63
|
+
questions per turn:
|
|
64
|
+
|
|
65
|
+
**Turn 1** — What are you building? Who is it for? What problem does it solve?
|
|
66
|
+
|
|
67
|
+
**Turn 2** — How do people solve this today? What's painful about that? How
|
|
68
|
+
often do they experience this pain?
|
|
69
|
+
|
|
70
|
+
**Turn 3** — Describe the person who needs this most. What are they doing the
|
|
71
|
+
moment before they reach for your product? What does "success" look like for them?
|
|
72
|
+
|
|
73
|
+
**Turn 4+** — Follow the gaps. If the audience is unclear, pull on that. If the
|
|
74
|
+
problem is well-defined but the solution is vague, focus there. Don't follow
|
|
75
|
+
a script — follow what's missing.
|
|
76
|
+
|
|
77
|
+
**Exit condition:** You can articulate the idea back to the user in 2-3
|
|
78
|
+
sentences and the user confirms "yes, that's it."
|
|
79
|
+
|
|
80
|
+
After Phase 1 completes, assess adaptive heuristics (see Adaptive Behavior
|
|
81
|
+
section below) to calibrate Phases 2-4 intensity.
|
|
82
|
+
|
|
83
|
+
### Phase 2: Research
|
|
84
|
+
|
|
85
|
+
Ground the idea in reality through competitive and market research.
|
|
86
|
+
Thoroughness scales with the project's configured depth.
|
|
87
|
+
|
|
88
|
+
**Depth 1:** Knowledge-based reasoning only. No web search. Draw on training
|
|
89
|
+
data to identify the most obvious competitors and alternatives.
|
|
90
|
+
|
|
91
|
+
**Depth 2:** 1-2 quick web searches for the most obvious competitors +
|
|
92
|
+
knowledge-based reasoning.
|
|
93
|
+
|
|
94
|
+
**Depth 3:** 2-3 targeted searches — direct competitors, market size, and
|
|
95
|
+
technology landscape.
|
|
96
|
+
|
|
97
|
+
**Depth 4:** Comprehensive research + dispatch to 1 external model for
|
|
98
|
+
independent competitive research.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Check Codex or Gemini availability (see multi-model-research-dispatch knowledge)
|
|
102
|
+
# Prefer Gemini for research (Google search built-in)
|
|
103
|
+
# If unavailable, primary model does enhanced research with explicit
|
|
104
|
+
# competitor-analysis framing
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Depth 5:** Comprehensive research + multi-model dispatch with reconciliation.
|
|
108
|
+
Dispatch to both Codex AND Gemini for diverse perspectives. Reconcile:
|
|
109
|
+
2+ agree = consensus. Disagree = divergent — always present minority views.
|
|
110
|
+
Single model (fallback) = skip reconciliation labels.
|
|
111
|
+
|
|
112
|
+
**At all depths:** Bring findings INTO the conversation. Don't dump raw results —
|
|
113
|
+
synthesize: "I found 4 apps in this space — here's what they do well and
|
|
114
|
+
where they fall short."
|
|
115
|
+
|
|
116
|
+
**Exit condition (by depth):**
|
|
117
|
+
- Depth 1-2: At least 2 alternatives named (competitor, "do nothing," or
|
|
118
|
+
adjacent). User acknowledges the landscape.
|
|
119
|
+
- Depth 3: Direct competitors and at least 1 indirect alternative researched
|
|
120
|
+
with strengths/weaknesses. User acknowledges.
|
|
121
|
+
- Depth 4-5: Comprehensive landscape including direct, indirect, and emerging
|
|
122
|
+
threats. If multi-model dispatched, perspectives synthesized. User acknowledges.
|
|
123
|
+
|
|
124
|
+
### Phase 3: Expand
|
|
125
|
+
|
|
126
|
+
Surface opportunities the user hasn't considered. Use the lightweight
|
|
127
|
+
expansion patterns from ideation-craft knowledge:
|
|
128
|
+
|
|
129
|
+
- Adjacent market: "Your users also need X — have you considered that?"
|
|
130
|
+
- Ecosystem play: "If you solve A, you're the natural place for B and C."
|
|
131
|
+
- Contrarian angle: "Everyone does X. What if you did the opposite?"
|
|
132
|
+
- Technology enabler: "A new capability makes Y possible — could that reshape
|
|
133
|
+
your approach?"
|
|
134
|
+
- AI-native rethinking: "If AI could handle Z, how would that change the product?"
|
|
135
|
+
|
|
136
|
+
**Depth scaling:**
|
|
137
|
+
- Depth 1-2: 1-2 expansion suggestions with brief rationale.
|
|
138
|
+
- Depth 3: 3-5 ideas with rationale.
|
|
139
|
+
- Depth 4-5: Full expansion pass leveraging Phase 2 research. Generate ideas
|
|
140
|
+
from existing data — no new searches in this phase.
|
|
141
|
+
|
|
142
|
+
Tag all expansion ideas as **preliminary** — the pipeline's `innovate-vision`
|
|
143
|
+
step does comprehensive strategic expansion later.
|
|
144
|
+
|
|
145
|
+
**Exit condition:** Present each expansion idea to the user. Each gets an
|
|
146
|
+
explicit disposition: **accept** (include in brief), **defer** (note as open
|
|
147
|
+
question), or **reject** (drop).
|
|
148
|
+
|
|
149
|
+
### Phase 4: Challenge
|
|
150
|
+
|
|
151
|
+
Converge. Challenge every assumption surfaced in Phases 1-3, including
|
|
152
|
+
accepted expansion ideas.
|
|
153
|
+
|
|
154
|
+
**What to challenge:**
|
|
155
|
+
- **Feasibility**: Can this actually be built with the stated resources/timeline?
|
|
156
|
+
- **Scope**: Is this too broad? "If you could only ship ONE feature, what is it?"
|
|
157
|
+
- **Technical reality**: Are there hard technical constraints being glossed over?
|
|
158
|
+
- **Positioning**: "Three competitors already do this. What's your genuine
|
|
159
|
+
differentiator?"
|
|
160
|
+
- **Accepted expansions**: Phase 3 accepts are baseline intent. Phase 4 may
|
|
161
|
+
scope down or reject accepted ideas if they critically fail feasibility or
|
|
162
|
+
technical reality checks. Don't re-litigate the value of ideas the user
|
|
163
|
+
accepted — but DO challenge whether they're buildable and whether the overall
|
|
164
|
+
positioning holds against the competitive landscape.
|
|
165
|
+
|
|
166
|
+
**Exit condition:** Each challenged assumption is confirmed or revised by the
|
|
167
|
+
user. Core scope is explicitly locked — the user knows what's in and what's out.
|
|
168
|
+
|
|
169
|
+
### Phase 5: Synthesize
|
|
170
|
+
|
|
171
|
+
Write `docs/spark-brief.md`. Create the `docs/` directory if it doesn't exist.
|
|
172
|
+
|
|
173
|
+
The brief is intentionally shallow — directional hypotheses, not validated
|
|
174
|
+
conclusions. Target 2-4 sentences or concise bullet points per section.
|
|
175
|
+
Sections may state "None identified" if inapplicable.
|
|
176
|
+
|
|
177
|
+
**At depth 1-3:** Present the brief to the user for final approval. Write the
|
|
178
|
+
file to disk after approval. This is the terminal phase — spark is complete.
|
|
179
|
+
|
|
180
|
+
**At depth 4+:** Generate the draft brief in conversation (not yet written to
|
|
181
|
+
disk). Present to the user for awareness: "Here's what I have before we
|
|
182
|
+
stress-test it." Then proceed to Phase 6.
|
|
183
|
+
|
|
184
|
+
Use the template in the Spark Brief Template section below.
|
|
185
|
+
|
|
186
|
+
### Phase 6: Red-Team (depth 4+ only)
|
|
187
|
+
|
|
188
|
+
Send the draft spark brief to available external models as adversarial
|
|
189
|
+
reviewers.
|
|
190
|
+
|
|
191
|
+
**Depth 4:** Dispatch to 1 external model.
|
|
192
|
+
**Depth 5:** Dispatch to both Codex AND Gemini with reconciliation.
|
|
193
|
+
|
|
194
|
+
**Red-team prompt for external models:**
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
You are an adversarial reviewer stress-testing a product idea brief.
|
|
198
|
+
Your job is to find weaknesses, challenge assumptions, and surface missed
|
|
199
|
+
opportunities.
|
|
200
|
+
|
|
201
|
+
SPARK BRIEF:
|
|
202
|
+
[Full content of the draft spark-brief.md]
|
|
203
|
+
|
|
204
|
+
CHALLENGE INSTRUCTIONS:
|
|
205
|
+
1. For each section, identify the weakest assumption and explain why it might
|
|
206
|
+
be wrong.
|
|
207
|
+
2. What competitors or market dynamics does the brief underestimate?
|
|
208
|
+
3. What technical feasibility risks are glossed over?
|
|
209
|
+
4. What user segments or use cases are missing?
|
|
210
|
+
5. If you could only flag ONE critical risk, what would it be?
|
|
211
|
+
|
|
212
|
+
Be constructive but ruthless. Respond in structured markdown.
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Execution:**
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# Codex
|
|
219
|
+
codex exec --skip-git-repo-check -s read-only --ephemeral "RED_TEAM_PROMPT" 2>&1
|
|
220
|
+
|
|
221
|
+
# Gemini
|
|
222
|
+
NO_BROWSER=true gemini -p "RED_TEAM_PROMPT" --output-format json --approval-mode yolo 2>/dev/null
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**If no external models available:** Fall back to primary model with distinct
|
|
226
|
+
"red team" system prompt. Use the three-perspective approach from
|
|
227
|
+
multi-model-research-dispatch knowledge (VC, competitor PM, skeptical user).
|
|
228
|
+
|
|
229
|
+
**Processing challenges:**
|
|
230
|
+
- Present each challenge to the user one at a time.
|
|
231
|
+
- For each: **accept** (update the brief), **dismiss** (explain why), or
|
|
232
|
+
**defer** (note as open question).
|
|
233
|
+
- Update the brief based on accepted challenges.
|
|
234
|
+
|
|
235
|
+
**Exit condition:** User reviews all red-team findings and gives final approval.
|
|
236
|
+
Write the updated brief to disk.
|
|
237
|
+
|
|
238
|
+
### Adaptive Behavior
|
|
239
|
+
|
|
240
|
+
Assess these heuristics continuously, beginning in Phase 1. Use the idea's
|
|
241
|
+
characteristics to calibrate behavior across all phases:
|
|
242
|
+
|
|
243
|
+
- **Well-formed idea** → Phase 1 is brief. Move to research quickly.
|
|
244
|
+
- **Crowded space** → Phases 3 and 4 intensify. More expansion ideas to
|
|
245
|
+
differentiate, more competitive positioning challenges.
|
|
246
|
+
- **Novel idea (no competitors)** → Phase 2 shifts to adjacent-space and
|
|
247
|
+
analogous-system research. Phase 4 focuses on market-existence risk.
|
|
248
|
+
|
|
249
|
+
Phase transitions use natural conversational pivots, not mechanical
|
|
250
|
+
announcements. ("Now that I understand the core idea, let me research what
|
|
251
|
+
else is out there...")
|
|
252
|
+
|
|
253
|
+
## Methodology Scaling
|
|
254
|
+
|
|
255
|
+
| Depth | Phase 1 (Seed) | Phase 2 (Research) | Phase 3 (Expand) | Phase 4 (Challenge) | Phase 5 (Synthesize) | Phase 6 (Red-Team) |
|
|
256
|
+
|-------|----------------|-------------------|-------------------|--------------------|--------------------|-------------------|
|
|
257
|
+
| 1 | 2-3 questions | Knowledge only, no search | 1 suggestion | Light — 1-2 key challenges | Brief, terminal | Skip |
|
|
258
|
+
| 2 | 2-3 questions | 1-2 quick searches + knowledge | 1-2 suggestions | Light challenge | Brief, terminal | Skip |
|
|
259
|
+
| 3 | 5-8 questions | 2-3 targeted searches | 3-5 ideas | Full challenge | Brief, terminal | Skip |
|
|
260
|
+
| 4 | 5-8 questions | Comprehensive + 1 external model | Full expansion | Full challenge | Draft, continue | 1 external model |
|
|
261
|
+
| 5 | 8-12 questions | Comprehensive + multi-model w/ reconciliation | Full expansion | Full challenge | Draft, continue | Multi-model + reconciliation |
|
|
262
|
+
|
|
263
|
+
**Presets:** mvp = Depth 1 | deep = Depth 5 | custom = user-specified
|
|
264
|
+
|
|
265
|
+
## Spark Brief Template
|
|
266
|
+
|
|
267
|
+
When writing `docs/spark-brief.md`, use this exact structure:
|
|
268
|
+
|
|
269
|
+
```markdown
|
|
270
|
+
<!-- scaffold:spark-brief v1 YYYY-MM-DD deep -->
|
|
271
|
+
|
|
272
|
+
# Spark Brief: [Idea Name]
|
|
273
|
+
|
|
274
|
+
> Generated by `scaffold run spark` — directional hypotheses, not validated
|
|
275
|
+
> conclusions. This document feeds into `create-vision` as a starting point,
|
|
276
|
+
> not a replacement.
|
|
277
|
+
|
|
278
|
+
## Idea & Problem Space
|
|
279
|
+
[What the user wants to build, the core problem it solves, who it's for
|
|
280
|
+
and why they need it — from Phase 1]
|
|
281
|
+
|
|
282
|
+
## Landscape
|
|
283
|
+
[Key competitors/alternatives with strengths/weaknesses, positioning,
|
|
284
|
+
market context — from Phase 2]
|
|
285
|
+
|
|
286
|
+
## Expansion Ideas
|
|
287
|
+
[Accepted expansion ideas tagged as preliminary, deferred ideas noted —
|
|
288
|
+
from Phase 3]
|
|
289
|
+
|
|
290
|
+
## Constraints & Scope
|
|
291
|
+
[Confirmed assumptions, scope boundaries, what's in and what's out,
|
|
292
|
+
locked decisions — from Phase 4]
|
|
293
|
+
|
|
294
|
+
## Technology Opportunities
|
|
295
|
+
[Relevant tech enablers surfaced during research/expansion]
|
|
296
|
+
|
|
297
|
+
## Open Questions
|
|
298
|
+
[Unresolved items flagged during conversation that need answers before building]
|
|
299
|
+
|
|
300
|
+
## Risks
|
|
301
|
+
[Market, technical, and feasibility risks identified during challenge —
|
|
302
|
+
from Phase 4 and Phase 6 if red-teamed]
|
|
303
|
+
|
|
304
|
+
## Session Metadata
|
|
305
|
+
- **Depth**: [1-5]
|
|
306
|
+
- **Red-teamed**: [yes/no]
|
|
307
|
+
- **Models consulted**: [list if multi-model, or "primary only"]
|
|
308
|
+
- **Date**: [YYYY-MM-DD]
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Tracking comment format:** `<!-- scaffold:spark-brief v[N] YYYY-MM-DD [methodology] -->` where:
|
|
312
|
+
- `v[N]` increments on each update (v1, v2, v3...)
|
|
313
|
+
- `YYYY-MM-DD` is the session date
|
|
314
|
+
- `[methodology]` is the active methodology preset (e.g., `deep`, `mvp`, `custom`)
|
|
315
|
+
|
|
316
|
+
**Idea identity:** The idea name is captured in the `# Spark Brief: [Idea Name]` heading, not in the tracking comment. For identity matching, create-vision compares the heading's idea name against `$ARGUMENTS`.
|
|
317
|
+
|
|
318
|
+
## How to Work With Me
|
|
319
|
+
- I'm your co-founder for the next few minutes. I'll challenge you AND do homework on your behalf.
|
|
320
|
+
- I'll ask hard questions. That's the point — weak assumptions caught now save months later.
|
|
321
|
+
- I'll research while we talk. When I find something relevant, I'll bring it into the conversation.
|
|
322
|
+
- Don't hold back on vague ideas. "Something with recipes" is a perfectly fine starting point.
|
|
323
|
+
- Tell me if I'm going down the wrong path. This is a conversation, not a lecture.
|
|
324
|
+
|
|
325
|
+
## After This Step
|
|
326
|
+
|
|
327
|
+
When spark is complete, tell the user:
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
**Spark complete** — `docs/spark-brief.md` created.
|
|
331
|
+
|
|
332
|
+
**Next:** Run `scaffold run create-vision` — the vision step will detect your
|
|
333
|
+
spark brief and use it as a starting point, accelerating the discovery process.
|
|
334
|
+
|
|
335
|
+
**Pipeline reference:** `scaffold run prompt-pipeline`
|
|
336
|
+
|
|
337
|
+
---
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.cli-flags.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/adopt.cli-flags.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Hoisted mocks — needed because runAdoption calls detectProjectMode and
|
|
7
|
+
// discoverMetaPrompts. We mock at the paths that adopt.ts imports from.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
vi.mock('../../project/detector.js', () => ({
|
|
10
|
+
detectProjectMode: vi.fn(() => ({
|
|
11
|
+
mode: 'brownfield',
|
|
12
|
+
signals: [],
|
|
13
|
+
methodologySuggestion: 'deep',
|
|
14
|
+
sourceFileCount: 10,
|
|
15
|
+
})),
|
|
16
|
+
}));
|
|
17
|
+
vi.mock('../../core/assembly/meta-prompt-loader.js', () => ({
|
|
18
|
+
discoverMetaPrompts: vi.fn(() => new Map()),
|
|
19
|
+
}));
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Imports (after mocks)
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
import { runAdoption } from '../../project/adopt.js';
|
|
24
|
+
import { buildFlagOverrides, applyFlagFamilyValidation } from '../init-flag-families.js';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Helpers
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
function makeTmpProject(files) {
|
|
29
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'adopt-flags-'));
|
|
30
|
+
for (const [rel, content] of Object.entries(files)) {
|
|
31
|
+
const full = path.join(dir, rel);
|
|
32
|
+
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
33
|
+
fs.writeFileSync(full, content);
|
|
34
|
+
}
|
|
35
|
+
return dir;
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Tests
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
describe('adopt CLI flag integration', () => {
|
|
41
|
+
let tmpDirs;
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
tmpDirs = [];
|
|
44
|
+
});
|
|
45
|
+
afterEach(() => {
|
|
46
|
+
for (const d of tmpDirs) {
|
|
47
|
+
fs.rmSync(d, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
function tracked(dir) {
|
|
51
|
+
tmpDirs.push(dir);
|
|
52
|
+
return dir;
|
|
53
|
+
}
|
|
54
|
+
// -------------------------------------------------------------------------
|
|
55
|
+
// buildFlagOverrides unit-level integration
|
|
56
|
+
// -------------------------------------------------------------------------
|
|
57
|
+
it('buildFlagOverrides returns undefined when no family flags present', () => {
|
|
58
|
+
expect(buildFlagOverrides({})).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
it('--backend-api-style graphql produces correct override shape', () => {
|
|
61
|
+
const overrides = buildFlagOverrides({ 'backend-api-style': 'graphql' });
|
|
62
|
+
expect(overrides?.type).toBe('backend');
|
|
63
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ apiStyle: 'graphql' }));
|
|
64
|
+
});
|
|
65
|
+
it('--web-rendering ssr produces web-app override with renderingStrategy', () => {
|
|
66
|
+
const overrides = buildFlagOverrides({ 'web-rendering': 'ssr' });
|
|
67
|
+
expect(overrides?.type).toBe('web-app');
|
|
68
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ renderingStrategy: 'ssr' }));
|
|
69
|
+
});
|
|
70
|
+
it('--engine unity produces game override with engine', () => {
|
|
71
|
+
const overrides = buildFlagOverrides({ engine: 'unity' });
|
|
72
|
+
expect(overrides?.type).toBe('game');
|
|
73
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ engine: 'unity' }));
|
|
74
|
+
});
|
|
75
|
+
it('--ml-phase training produces ml override with projectPhase', () => {
|
|
76
|
+
const overrides = buildFlagOverrides({ 'ml-phase': 'training' });
|
|
77
|
+
expect(overrides?.type).toBe('ml');
|
|
78
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ projectPhase: 'training' }));
|
|
79
|
+
});
|
|
80
|
+
it('--mobile-platform ios produces mobile-app override', () => {
|
|
81
|
+
const overrides = buildFlagOverrides({ 'mobile-platform': 'ios' });
|
|
82
|
+
expect(overrides?.type).toBe('mobile-app');
|
|
83
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ platform: 'ios' }));
|
|
84
|
+
});
|
|
85
|
+
it('--ext-manifest 3 produces browser-extension override', () => {
|
|
86
|
+
const overrides = buildFlagOverrides({ 'ext-manifest': '3' });
|
|
87
|
+
expect(overrides?.type).toBe('browser-extension');
|
|
88
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ manifestVersion: '3' }));
|
|
89
|
+
});
|
|
90
|
+
it('--pipeline-processing streaming produces data-pipeline override', () => {
|
|
91
|
+
const overrides = buildFlagOverrides({ 'pipeline-processing': 'streaming' });
|
|
92
|
+
expect(overrides?.type).toBe('data-pipeline');
|
|
93
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ processingModel: 'streaming' }));
|
|
94
|
+
});
|
|
95
|
+
it('--lib-visibility public produces library override', () => {
|
|
96
|
+
const overrides = buildFlagOverrides({ 'lib-visibility': 'public' });
|
|
97
|
+
expect(overrides?.type).toBe('library');
|
|
98
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ visibility: 'public' }));
|
|
99
|
+
});
|
|
100
|
+
it('--cli-interactivity hybrid produces cli override', () => {
|
|
101
|
+
const overrides = buildFlagOverrides({ 'cli-interactivity': 'hybrid' });
|
|
102
|
+
expect(overrides?.type).toBe('cli');
|
|
103
|
+
expect(overrides?.partial).toEqual(expect.objectContaining({ interactivity: 'hybrid' }));
|
|
104
|
+
});
|
|
105
|
+
// -------------------------------------------------------------------------
|
|
106
|
+
// Validation — mixed families and project-type mismatches
|
|
107
|
+
// -------------------------------------------------------------------------
|
|
108
|
+
it('mixed family flags throw during validation', () => {
|
|
109
|
+
const argv = { 'web-rendering': 'ssr', 'backend-api-style': 'rest' };
|
|
110
|
+
expect(() => applyFlagFamilyValidation(argv)).toThrow(/Cannot mix flags/);
|
|
111
|
+
});
|
|
112
|
+
it('--web-rendering with --project-type backend throws', () => {
|
|
113
|
+
const argv = { 'project-type': 'backend', 'web-rendering': 'ssr' };
|
|
114
|
+
expect(() => applyFlagFamilyValidation(argv)).toThrow(/--web-\* flags require --project-type web-app/);
|
|
115
|
+
});
|
|
116
|
+
it('--backend-api-style with --project-type web-app throws', () => {
|
|
117
|
+
const argv = { 'project-type': 'web-app', 'backend-api-style': 'rest' };
|
|
118
|
+
expect(() => applyFlagFamilyValidation(argv)).toThrow(/--backend-\* flags require --project-type backend/);
|
|
119
|
+
});
|
|
120
|
+
it('game flags with --project-type cli throws', () => {
|
|
121
|
+
const argv = { 'project-type': 'cli', engine: 'unity' };
|
|
122
|
+
expect(() => applyFlagFamilyValidation(argv)).toThrow(/Game flags .* require --project-type game/);
|
|
123
|
+
});
|
|
124
|
+
// -------------------------------------------------------------------------
|
|
125
|
+
// Flag overrides flow through runAdoption
|
|
126
|
+
// -------------------------------------------------------------------------
|
|
127
|
+
it('--engine unity override flows through to runAdoption result', async () => {
|
|
128
|
+
const dir = tracked(makeTmpProject({
|
|
129
|
+
'Assets/foo.meta': '',
|
|
130
|
+
}));
|
|
131
|
+
const overrides = buildFlagOverrides({ engine: 'godot' });
|
|
132
|
+
const result = await runAdoption({
|
|
133
|
+
projectRoot: dir,
|
|
134
|
+
metaPromptDir: path.join(dir, '.scaffold'),
|
|
135
|
+
methodology: 'deep',
|
|
136
|
+
dryRun: true,
|
|
137
|
+
auto: true,
|
|
138
|
+
force: true,
|
|
139
|
+
verbose: false,
|
|
140
|
+
explicitProjectType: 'game',
|
|
141
|
+
flagOverrides: overrides,
|
|
142
|
+
});
|
|
143
|
+
// Detection finds unity (Assets/.meta) but flag override says godot
|
|
144
|
+
expect(result.projectType).toBe('game');
|
|
145
|
+
expect(result.detectedConfig?.config?.engine).toBe('godot');
|
|
146
|
+
});
|
|
147
|
+
it('--backend-api-style graphql with --project-type backend sets apiStyle', async () => {
|
|
148
|
+
const dir = tracked(makeTmpProject({}));
|
|
149
|
+
const overrides = buildFlagOverrides({ 'backend-api-style': 'graphql' });
|
|
150
|
+
const result = await runAdoption({
|
|
151
|
+
projectRoot: dir,
|
|
152
|
+
metaPromptDir: path.join(dir, '.scaffold'),
|
|
153
|
+
methodology: 'deep',
|
|
154
|
+
dryRun: true,
|
|
155
|
+
auto: true,
|
|
156
|
+
force: true,
|
|
157
|
+
verbose: false,
|
|
158
|
+
explicitProjectType: 'backend',
|
|
159
|
+
flagOverrides: overrides,
|
|
160
|
+
});
|
|
161
|
+
expect(result.projectType).toBe('backend');
|
|
162
|
+
expect(result.detectedConfig?.config?.apiStyle).toBe('graphql');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=adopt.cli-flags.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.cli-flags.test.js","sourceRoot":"","sources":["../../../src/cli/commands/adopt.cli-flags.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.config-resolution.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/adopt.config-resolution.test.ts"],"names":[],"mappings":""}
|