sdd-pipeline 1.0.2 → 1.2.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 +376 -95
- package/bin/sdd.js +14 -6
- package/lib/bmad/agents/architect.js +96 -0
- package/lib/bmad/agents/pm.js +67 -0
- package/lib/bmad/agents/ux.js +103 -0
- package/lib/bmad/confidence.js +129 -0
- package/lib/bmad/index.js +140 -0
- package/lib/bmad/problem-first.js +85 -0
- package/lib/bmad/questions.js +110 -0
- package/lib/bmad/synthesis.js +109 -0
- package/lib/bmad.js +45 -51
- package/lib/bundle/.claude/commands/sdd-bmad.md +360 -20
- package/lib/bundle/.claude/commands/sdd-converge.md +21 -7
- package/lib/bundle/.claude/commands/sdd-cook.md +335 -0
- package/lib/bundle/.claude/commands/sdd-init.md +71 -13
- package/lib/bundle/.claude/commands/sdd-spec.md +103 -35
- package/lib/bundle/.claude/commands/sdd-task-status.md +95 -0
- package/lib/bundle/.claude/commands/sdd-tasks.md +100 -17
- package/lib/bundle/.claude/commands/sdd.md +48 -8
- package/lib/bundle/.sdd/config.json +2 -2
- package/lib/bundle/CLAUDE.md +6 -4
- package/lib/bundle/commands/sdd-status.ps1 +40 -6
- package/lib/bundle/commands/sdd-task-status.ps1 +78 -0
- package/lib/bundle/run-converge.ps1 +84 -23
- package/lib/bundle/skills/sdd-cook/SKILL.md +381 -0
- package/lib/bundle/skills/sdd-cook/references/intent-detection.md +67 -0
- package/lib/bundle/skills/sdd-cook/references/subagent-patterns.md +352 -0
- package/lib/bundle/skills/sdd-cook/references/subagent-prompts.md +346 -0
- package/lib/bundle/skills/sdd-cook/references/task-execution.md +259 -0
- package/lib/bundle/skills/sdd-cook/references/workflow-steps.md +215 -0
- package/lib/bundle/templates/BMAD-brief.template.md +75 -14
- package/lib/bundle/templates/SPEC.template.md +193 -20
- package/lib/bundle/templates/TASKS.template.md +32 -13
- package/lib/bundle/templates/task-detail.template.md +40 -0
- package/lib/bundle/templates/task-master.template.md +41 -0
- package/lib/converge-task.ps1 +260 -0
- package/lib/init.js +2 -0
- package/lib/output-dirs.ps1 +461 -0
- package/lib/sdd-check.ps1 +130 -0
- package/lib/shared-converge.ps1 +270 -0
- package/lib/verify-patterns.ps1 +208 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,95 +1,376 @@
|
|
|
1
|
-
# XDM Method —
|
|
2
|
-
|
|
3
|
-
Spec-Driven Development pipeline
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
```powershell
|
|
8
|
-
# Install globally (once)
|
|
9
|
-
npm install -g sdd-pipeline
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
claude "/sdd
|
|
23
|
-
claude "/sdd
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
1
|
+
# XDM Method — Spec-Driven Development Pipeline
|
|
2
|
+
|
|
3
|
+
**Spec-Driven Development pipeline for Claude Code CLI.** Transforms raw feature requests into validated, shipped code through a self-correcting converge loop.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```powershell
|
|
8
|
+
# 1. Install globally (once)
|
|
9
|
+
npm install -g sdd-pipeline
|
|
10
|
+
|
|
11
|
+
# 2. Navigate to your project
|
|
12
|
+
cd my-project
|
|
13
|
+
|
|
14
|
+
# 3. Initialize pipeline
|
|
15
|
+
claude "/sdd init"
|
|
16
|
+
|
|
17
|
+
# 4. Start with a feature (interactive 9-question interview)
|
|
18
|
+
claude "/sdd-bmad landing page for my SaaS"
|
|
19
|
+
|
|
20
|
+
# 5. Use Claude Code for full pipeline
|
|
21
|
+
claude "/sdd-spec" # Generate SPEC.md
|
|
22
|
+
claude "/sdd-tasks" # Generate tasks
|
|
23
|
+
claude "/sdd-cook" # Implement tasks
|
|
24
|
+
|
|
25
|
+
# 6. Validate
|
|
26
|
+
pwsh run-converge.ps1 -Url 'http://localhost:3000' -Strict
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> **Important:** Always use `claude "/sdd-<cmd>"` format for interactive commands.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Output Directory Structure
|
|
34
|
+
|
|
35
|
+
All generated artifacts are organized in the `sdd/` directory (v1.1.0+):
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
project/
|
|
39
|
+
├── sdd/ # All generated artifacts
|
|
40
|
+
│ ├── brief.md # Phase 0: BMAD brief
|
|
41
|
+
│ ├── SPEC.md # Phase 2: Specification
|
|
42
|
+
│ ├── PLAN.md # Phase 3: Implementation plan
|
|
43
|
+
│ ├── tasks/ # Phase 3: Task directories
|
|
44
|
+
│ │ └── task-260829-1700-feature/
|
|
45
|
+
│ │ ├── MASTER-TASKS.md
|
|
46
|
+
│ │ └── T-001-*.md
|
|
47
|
+
│ └── converge/ # Phase 5: Validation reports
|
|
48
|
+
│ ├── validation.md # Full project converge
|
|
49
|
+
│ └── task-T-001/
|
|
50
|
+
│ └── report.md # Per-task converge
|
|
51
|
+
├── .sdd/config.json # Pipeline state & config
|
|
52
|
+
├── templates/ # SDD templates
|
|
53
|
+
└── .claude/commands/ # Claude Code commands
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Key features:**
|
|
57
|
+
- All artifacts in one place (`sdd/`)
|
|
58
|
+
- Easy cleanup: delete `sdd/` to reset
|
|
59
|
+
- Configurable via `.sdd/config.json`
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Pipeline Phases
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Raw Idea
|
|
67
|
+
│
|
|
68
|
+
├── claude "/sdd-bmad" → sdd/brief.md (Phase 0)
|
|
69
|
+
├── claude "/sdd-spec" → sdd/SPEC.md (Phase 2)
|
|
70
|
+
├── claude "/sdd-tasks" → sdd/tasks/ (Phase 3)
|
|
71
|
+
├── claude "/sdd-cook" → Implementation (Phase 4)
|
|
72
|
+
│
|
|
73
|
+
└── claude "/sdd-converge" → sdd/converge/ (Phase 5)
|
|
74
|
+
│
|
|
75
|
+
├── PASS → Merge / Deploy
|
|
76
|
+
└── FAIL → Fix → Re-enter
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
| Phase | Command | Output | Gate |
|
|
80
|
+
|-------|---------|--------|------|
|
|
81
|
+
| 0 | `claude "/sdd-bmad <desc>"` | `sdd/brief.md` | None |
|
|
82
|
+
| 2 | `claude "/sdd-spec"` | `sdd/SPEC.md` | Requires `sdd/brief.md` + confidence ≥20 |
|
|
83
|
+
| 3 | `claude "/sdd-tasks"` | `sdd/tasks/task-*/` | Requires `sdd/SPEC.md` |
|
|
84
|
+
| 4 | `claude "/sdd-cook"` | Code | Requires task files |
|
|
85
|
+
| 5 | `pwsh run-converge.ps1` | `sdd/converge/` | All phases |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Commands Reference
|
|
90
|
+
|
|
91
|
+
### Core Pipeline Commands
|
|
92
|
+
|
|
93
|
+
| Command | Phase | Output | Description |
|
|
94
|
+
|---------|-------|--------|-------------|
|
|
95
|
+
| `claude "/sdd init"` | — | `.sdd/`, `templates/`, `sdd/` | Initialize SDD pipeline. Creates directory structure. Run once per project. |
|
|
96
|
+
| `claude "/sdd-bmad <desc>"` | 0 | `sdd/brief.md` | Interactive brainstorm. Asks 9 discovery questions, generates confidence-scored brief. |
|
|
97
|
+
| `claude "/sdd-spec"` | 2 | `sdd/SPEC.md` | Generate SPEC.md from brief. Validates confidence ≥20/100 + expiry check. |
|
|
98
|
+
| `claude "/sdd-tasks"` | 3 | `sdd/tasks/task-*/` | Break SPEC.md into tasks (≤2 hours each). Creates MASTER-TASKS.md + T-XXX-*.md files. |
|
|
99
|
+
| `claude "/sdd-cook"` | 4 | Code | Execute tasks. Args: `[--all \| --task T-XXX]`. |
|
|
100
|
+
| `claude "/sdd-converge"` | 5 | `sdd/converge/` | Validate implementation. Self-correcting loop. |
|
|
101
|
+
|
|
102
|
+
### Utility Commands
|
|
103
|
+
|
|
104
|
+
| Command | Description |
|
|
105
|
+
|---------|-------------|
|
|
106
|
+
| `/sdd status` | Show pipeline phase status. Displays current phase, completed phases, next command. |
|
|
107
|
+
| `/sdd check <file>` | Real-time validation. Check file(s) against SPEC.md clauses ([SC-xxx], [AC-xxx]). |
|
|
108
|
+
| `/sdd task-status T-XXX <status>` | Update task status. Args: `pending \| in-progress \| completed`. |
|
|
109
|
+
|
|
110
|
+
### Shell CLI (npm global)
|
|
111
|
+
|
|
112
|
+
```powershell
|
|
113
|
+
sdd init # Initialize pipeline
|
|
114
|
+
sdd bmad <desc> # Non-interactive brief (low confidence)
|
|
115
|
+
sdd status # Show pipeline status
|
|
116
|
+
sdd help # Show help
|
|
117
|
+
|
|
118
|
+
# For interactive commands, use Claude Code
|
|
119
|
+
claude "/sdd bmad <desc>" # Interactive 9-question interview
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Usage Examples
|
|
125
|
+
|
|
126
|
+
### Example 1: Landing Page
|
|
127
|
+
|
|
128
|
+
```powershell
|
|
129
|
+
cd my-saas-project
|
|
130
|
+
|
|
131
|
+
# Initialize
|
|
132
|
+
claude "/sdd init"
|
|
133
|
+
|
|
134
|
+
# Start with feature description (interactive)
|
|
135
|
+
claude "/sdd-bmad landing page for my SaaS product"
|
|
136
|
+
|
|
137
|
+
# Generate SPEC.md
|
|
138
|
+
claude "/sdd-spec"
|
|
139
|
+
|
|
140
|
+
# Break into tasks
|
|
141
|
+
claude "/sdd-tasks"
|
|
142
|
+
|
|
143
|
+
# Implement tasks
|
|
144
|
+
claude "/sdd-cook --task T-001"
|
|
145
|
+
claude "/sdd-cook --task T-002"
|
|
146
|
+
claude "/sdd-cook --task T-003"
|
|
147
|
+
|
|
148
|
+
# Validate (with dev server running)
|
|
149
|
+
claude "/sdd-converge"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Example 2: API Feature
|
|
153
|
+
|
|
154
|
+
```powershell
|
|
155
|
+
cd my-api-project
|
|
156
|
+
claude "/sdd init"
|
|
157
|
+
|
|
158
|
+
# Set domain to API
|
|
159
|
+
# Edit .sdd/config.json: set project.domain = "api"
|
|
160
|
+
|
|
161
|
+
claude "/sdd-bmad user authentication with JWT tokens"
|
|
162
|
+
claude "/sdd-spec"
|
|
163
|
+
claude "/sdd-tasks"
|
|
164
|
+
claude "/sdd-cook --all"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Example 3: Real-Time Validation
|
|
168
|
+
|
|
169
|
+
```powershell
|
|
170
|
+
# During implementation, check your work
|
|
171
|
+
claude "/sdd check src/components/Button.tsx"
|
|
172
|
+
|
|
173
|
+
# Result:
|
|
174
|
+
# ✅ SC-001: "Start Free Trial" found
|
|
175
|
+
# ✅ SC-COLOR-001: #22c55e found
|
|
176
|
+
# ❌ SC-002: "Get Started" NOT FOUND
|
|
177
|
+
|
|
178
|
+
# Fix the issue, then continue
|
|
179
|
+
claude "/sdd-cook --task T-002"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Phase Gates
|
|
185
|
+
|
|
186
|
+
Phase gates enforce deliberate progress. Commands fail if prerequisites are missing:
|
|
187
|
+
|
|
188
|
+
| Command | Gate | If Missing |
|
|
189
|
+
|---------|------|------------|
|
|
190
|
+
| `claude "/sdd-spec"` | sdd/brief.md | ERROR: Phase 0 not complete. Run `claude "/sdd-bmad"` first. |
|
|
191
|
+
| `claude "/sdd-spec"` | Confidence ≥20 | WARNING: Confidence is Weak. Spec may be incomplete. |
|
|
192
|
+
| `claude "/sdd-tasks"` | sdd/SPEC.md | ERROR: SPEC.md not found. Run `claude "/sdd-spec"` first. |
|
|
193
|
+
| `claude "/sdd-converge"` | All artifacts | ERROR: Missing artifacts. Run full pipeline first. |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## BMAD Confidence Score
|
|
198
|
+
|
|
199
|
+
BMAD calculates a 0-100 confidence score before generating SPEC.md:
|
|
200
|
+
|
|
201
|
+
| Score | Level | Action |
|
|
202
|
+
|-------|-------|--------|
|
|
203
|
+
| <20 | None | `claude "/sdd-spec"` BLOCKED. Re-run BMAD with more detail. |
|
|
204
|
+
| 20-49 | Weak | WARNING. Proceed with caution — spec may need iteration. |
|
|
205
|
+
| 50-69 | Medium | Acceptable. Answer more questions for better spec. |
|
|
206
|
+
| ≥70 | Strong | Full confidence. Proceed to spec. |
|
|
207
|
+
|
|
208
|
+
**Scoring factors:**
|
|
209
|
+
- Input quality (0-30 pts) — more detail = higher score
|
|
210
|
+
- Interview completion (0-30 pts) — more answers = higher score
|
|
211
|
+
- Problem clarity (0-20 pts) — specific, measurable = higher score
|
|
212
|
+
- Technical awareness (0-20 pts) — stack/integration detail = higher score
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Task Format
|
|
217
|
+
|
|
218
|
+
Each task in MASTER-TASKS.md:
|
|
219
|
+
- Takes ≤2 hours
|
|
220
|
+
- Independently verifiable
|
|
221
|
+
- Has frontmatter with `depends_on`, `spec_sections`
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
task-260829-1657-landing-page/
|
|
225
|
+
├── MASTER-TASKS.md # Task index, phases, status
|
|
226
|
+
├── T-001-html-structure.md
|
|
227
|
+
├── T-002-mobile-css.md
|
|
228
|
+
├── T-003-desktop-css.md
|
|
229
|
+
└── ...
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Extension System
|
|
235
|
+
|
|
236
|
+
Domain-specific templates activate via `.sdd/config.json`:
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"project": {
|
|
241
|
+
"domain": "frontend"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
| Domain | Adds |
|
|
247
|
+
|--------|------|
|
|
248
|
+
| `general` | Base pipeline only |
|
|
249
|
+
| `api` | OpenAPI spec, endpoint validation, API checklist |
|
|
250
|
+
| `frontend` | Design system prompts, Lighthouse targets, UX checklist |
|
|
251
|
+
| `backend` | Data models, security requirements, backend checklist |
|
|
252
|
+
|
|
253
|
+
Extensions are **additive** — base pipeline always works.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Security
|
|
258
|
+
|
|
259
|
+
| Layer | Protection |
|
|
260
|
+
|-------|-----------|
|
|
261
|
+
| Input | Sanitize regex blocks prompt injection patterns |
|
|
262
|
+
| URL | SSRF prevention — blocks private IPs, localhost |
|
|
263
|
+
| npm | `--ignore-scripts` on global installs |
|
|
264
|
+
| GitHub Actions | Least-privilege permissions block |
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Architecture
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
Two Interfaces (same logic):
|
|
272
|
+
|
|
273
|
+
Shell CLI: sdd bmad "feature" → bin/sdd.js
|
|
274
|
+
Claude Code: /sdd bmad "feature" → .claude/commands/sdd.md
|
|
275
|
+
|
|
276
|
+
Pipeline files:
|
|
277
|
+
├── .sdd/config.json # Phase tracking, template versions
|
|
278
|
+
├── templates/ # SDD artifact templates
|
|
279
|
+
├── .claude/commands/ # Claude Code slash commands
|
|
280
|
+
├── commands/ # Standalone CLI scripts
|
|
281
|
+
├── run-converge.ps1 # Converge automation
|
|
282
|
+
└── extensions/ # Domain-specific (api/frontend/backend)
|
|
283
|
+
|
|
284
|
+
npm package (sdd-pipeline):
|
|
285
|
+
├── bin/sdd.js # CLI entry
|
|
286
|
+
├── lib/init.js # Extract pipeline
|
|
287
|
+
├── lib/bmad/ # BMAD orchestrator (8 modules)
|
|
288
|
+
└── lib/bundle/ # 31 pipeline files for distribution
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Requirements
|
|
294
|
+
|
|
295
|
+
- Windows 11 + PowerShell (primary), Bash (fallback)
|
|
296
|
+
- Git 2.52+
|
|
297
|
+
- Node.js 18+ + npm 9+
|
|
298
|
+
- Claude Code CLI (`npx @anthropic-ai/claude-code`)
|
|
299
|
+
|
|
300
|
+
## CI/CD
|
|
301
|
+
|
|
302
|
+
GitHub Actions workflow runs converge on push/PR:
|
|
303
|
+
|
|
304
|
+
```yaml
|
|
305
|
+
on: [push, pull_request]
|
|
306
|
+
jobs:
|
|
307
|
+
converge:
|
|
308
|
+
runs-on: windows-latest
|
|
309
|
+
steps:
|
|
310
|
+
- uses: actions/checkout@v4
|
|
311
|
+
- run: pwsh run-converge.ps1 -Url '${{ env.DEV_URL }}' -Strict
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
On failure: artifacts uploaded + GitHub Issue created with fix recommendations.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## File Structure
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
project/
|
|
322
|
+
├── .sdd/config.json # Pipeline state
|
|
323
|
+
├── BMAD-brief.md # Phase 0 output
|
|
324
|
+
├── SPEC.md # Phase 2 output
|
|
325
|
+
├── task-*/ # Phase 3 output
|
|
326
|
+
│ ├── MASTER-TASKS.md
|
|
327
|
+
│ └── T-XXX-*.md
|
|
328
|
+
├── converge/ # Phase 5 output
|
|
329
|
+
│ └── validation.md
|
|
330
|
+
└── .claude/commands/ # SDD commands
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## Status
|
|
334
|
+
|
|
335
|
+
```powershell
|
|
336
|
+
sdd status # Quick status (npm package)
|
|
337
|
+
pwsh commands/sdd-status.ps1 --Verify # Full verification
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## npm Package
|
|
343
|
+
|
|
344
|
+
| Field | Value |
|
|
345
|
+
|-------|-------|
|
|
346
|
+
| Name | `sdd-pipeline` |
|
|
347
|
+
| Version | `1.1.0` |
|
|
348
|
+
| Registry | npmjs.com |
|
|
349
|
+
| CLI command | `sdd` |
|
|
350
|
+
| Claude Code command | `/sdd` |
|
|
351
|
+
| Install | `npm install -g sdd-pipeline` |
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## Key Features
|
|
356
|
+
|
|
357
|
+
- **Phase gates** — `/sdd spec` fails if BMAD-brief.md missing — no bypass
|
|
358
|
+
- **Confidence scoring** — BMAD quantifies spec readiness before implementation
|
|
359
|
+
- **Problem-first** — Solution→problem inversion surfaces actual user needs
|
|
360
|
+
- **Self-correcting converge** — Loop back to appropriate phase on failure
|
|
361
|
+
- **Domain extensions** — API, frontend, backend — set via config
|
|
362
|
+
- **SSRF protection** — URL validation blocks private IPs, localhost
|
|
363
|
+
- **GitHub Actions CI** — Runs converge on push/PR, creates Issue on failure
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Documentation
|
|
368
|
+
|
|
369
|
+
| Document | Purpose |
|
|
370
|
+
|----------|---------|
|
|
371
|
+
| `docs/project-overview-pdr.md` | Project overview, problem statement, solution |
|
|
372
|
+
| `docs/system-architecture.md` | System architecture, component map, CI/CD flow |
|
|
373
|
+
| `docs/spec-pipeline-synthesis.md` | Full pipeline specification (1,200+ lines) |
|
|
374
|
+
| `docs/codebase-summary.md` | Codebase overview, file inventory, key contracts |
|
|
375
|
+
| `docs/deployment-guide.md` | Deployment instructions |
|
|
376
|
+
| `docs/project-roadmap.md` | Future plans |
|
package/bin/sdd.js
CHANGED
|
@@ -37,15 +37,23 @@ switch (cmd) {
|
|
|
37
37
|
console.log(`
|
|
38
38
|
sdd — Spec-Driven Development CLI
|
|
39
39
|
|
|
40
|
+
Output Structure:
|
|
41
|
+
sdd/ # All generated artifacts
|
|
42
|
+
brief.md # Phase 0: BMAD brief
|
|
43
|
+
SPEC.md # Phase 2: Specification
|
|
44
|
+
tasks/ # Phase 3: Task directories
|
|
45
|
+
converge/ # Phase 5: Validation reports
|
|
46
|
+
|
|
40
47
|
Usage:
|
|
41
|
-
sdd init Initialize SDD pipeline
|
|
42
|
-
sdd bmad <
|
|
43
|
-
sdd status Show pipeline
|
|
48
|
+
sdd init Initialize SDD pipeline
|
|
49
|
+
sdd bmad <desc> Phase 0: Interactive brainstorm
|
|
50
|
+
sdd status Show pipeline status
|
|
44
51
|
sdd help Show this help
|
|
45
52
|
|
|
46
53
|
Full pipeline (requires Claude Code):
|
|
47
|
-
claude "/sdd-spec" Generate SPEC.md
|
|
48
|
-
claude "/sdd-tasks" Generate
|
|
49
|
-
|
|
54
|
+
claude "/sdd-spec" Phase 2: Generate SPEC.md
|
|
55
|
+
claude "/sdd-tasks" Phase 3: Generate tasks
|
|
56
|
+
claude "/sdd-cook" Phase 4: Execute tasks
|
|
57
|
+
pwsh run-converge.ps1 Phase 5: Validate
|
|
50
58
|
`)
|
|
51
59
|
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BMAD Architect Agent — Technical Architect perspective
|
|
3
|
+
* Analyzes from a feasibility, risk, and technical constraints lens.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param {object} state - BMAD interview state
|
|
8
|
+
* @returns {{ section: string, confidence: string }}
|
|
9
|
+
*/
|
|
10
|
+
function analyze(state) {
|
|
11
|
+
const input = state.input || ''
|
|
12
|
+
const answers = state.answers || {}
|
|
13
|
+
|
|
14
|
+
// Architect key questions: q4, q5, q6
|
|
15
|
+
const q4 = answers.q4 || ''
|
|
16
|
+
const q5 = answers.q5 || ''
|
|
17
|
+
const q6 = answers.q6 || ''
|
|
18
|
+
|
|
19
|
+
const mvp = q4 || inferMvp(input)
|
|
20
|
+
const risks = parseRisks(q6)
|
|
21
|
+
const integrations = parseIntegrations(q5)
|
|
22
|
+
|
|
23
|
+
const section = `## Architect Perspective
|
|
24
|
+
**Minimum viable approach:** ${mvp}
|
|
25
|
+
|
|
26
|
+
**Required integrations:** ${integrations}
|
|
27
|
+
|
|
28
|
+
**Technical risks:**
|
|
29
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
30
|
+
|------|-----------|--------|------------|
|
|
31
|
+
${risks}
|
|
32
|
+
|
|
33
|
+
**Tech constraints:**
|
|
34
|
+
- ${inferConstraints(input)}
|
|
35
|
+
|
|
36
|
+
**Done criteria (technical):** ${inferDoneCriteria(input, mvp)}
|
|
37
|
+
`
|
|
38
|
+
|
|
39
|
+
const confidence = inferConfidence(q4, q5, q6)
|
|
40
|
+
return { section, confidence }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function inferMvp(input) {
|
|
44
|
+
if (!input) return '[one paragraph — what is the simplest thing that works?]'
|
|
45
|
+
return `Deliver: ${input.trim()}. No optional features in v1.`
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function parseRisks(q6) {
|
|
49
|
+
if (!q6 || q6.trim().length < 10) {
|
|
50
|
+
return '| [Risk 1] | [H/M/L] | [H/M/L] | [Mitigation] |\n| [Risk 2] | [H/M/L] | [H/M/L] | [Mitigation] |'
|
|
51
|
+
}
|
|
52
|
+
// Best-effort parse — user provides structured answer or free text
|
|
53
|
+
const lines = q6.split('\n').filter((l) => l.trim())
|
|
54
|
+
if (lines.length >= 2) {
|
|
55
|
+
return lines
|
|
56
|
+
.slice(0, 3)
|
|
57
|
+
.map((line) => {
|
|
58
|
+
const parts = line.split(/[,;]/).map((p) => p.trim())
|
|
59
|
+
return `| ${parts[0] || 'Risk'} | ${parts[1] || 'M'} | ${parts[2] || 'M'} | ${parts.slice(3).join(', ') || 'TBD'} |`
|
|
60
|
+
})
|
|
61
|
+
.join('\n')
|
|
62
|
+
}
|
|
63
|
+
const risk1 = q6.split(/[.,\n]/)[0].trim() || 'Risk'
|
|
64
|
+
return `| ${risk1} | M | M | [Provide mitigation] |\n| [Risk 2] | [H/M/L] | [H/M/L] | [Mitigation] |`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function parseIntegrations(q5) {
|
|
68
|
+
if (!q5 || q5.trim().length < 5) return '[from Q5 — list required integrations or "None for MVP"]'
|
|
69
|
+
return q5.split(/[,;\n]/).filter((i) => i.trim()).slice(0, 5).join(', ')
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function inferConstraints(input) {
|
|
73
|
+
const lower = (input || '').toLowerCase()
|
|
74
|
+
if (lower.includes('frontend') || lower.includes('website') || lower.includes('landing page'))
|
|
75
|
+
return 'Performance budget: Lighthouse ≥90, mobile-first CSS, no layout shift'
|
|
76
|
+
if (lower.includes('api') || lower.includes('backend') || lower.includes('service'))
|
|
77
|
+
return 'API: REST preferred, versioned endpoints, error responses must be structured'
|
|
78
|
+
if (lower.includes('mobile') || lower.includes('ios') || lower.includes('android'))
|
|
79
|
+
return 'Native build targets: latest OS version, accessibility support required'
|
|
80
|
+
return 'Technology choices constrained by existing project stack — do not introduce new dependencies without approval'
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function inferDoneCriteria(input, mvp) {
|
|
84
|
+
if (!mvp) return '[define what "done" looks like technically — measurable conditions]'
|
|
85
|
+
return `MVP (${mvp.slice(0, 50)}...) is functional, tested, and meets non-functional requirements`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function inferConfidence(q4, q5, q6) {
|
|
89
|
+
const filled = [q4, q5, q6].filter((a) => a.trim().length > 10).length
|
|
90
|
+
if (filled >= 3) return 'High'
|
|
91
|
+
if (filled >= 2) return 'Medium'
|
|
92
|
+
if (filled >= 1) return 'Low'
|
|
93
|
+
return 'None'
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
module.exports = { analyze }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BMAD PM Agent — Product Manager perspective
|
|
3
|
+
* Analyzes user input and interview answers from a PM lens.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param {object} state - BMAD interview state (input, answers, inversion)
|
|
8
|
+
* @returns {{ section: string, confidence: string }}
|
|
9
|
+
*/
|
|
10
|
+
function analyze(state) {
|
|
11
|
+
const input = state.input || ''
|
|
12
|
+
const answers = state.answers || {}
|
|
13
|
+
const inversion = state.inversion || {}
|
|
14
|
+
|
|
15
|
+
// PM key questions: q1, q2, q3
|
|
16
|
+
const q1 = answers.q1 || inversion.problem || ''
|
|
17
|
+
const q2 = answers.q2 || ''
|
|
18
|
+
const q3 = answers.q3 || ''
|
|
19
|
+
|
|
20
|
+
// Synthesize PM perspective
|
|
21
|
+
const targetUser = q2.split(/[,.\n]/)[0].trim() || '[from Q2 — who is the user?]'
|
|
22
|
+
const primaryAction = inferPrimaryAction(input, q1)
|
|
23
|
+
const topNeeds = extractNeeds(q1, q3)
|
|
24
|
+
|
|
25
|
+
const section = `## PM Perspective
|
|
26
|
+
**Target user:** ${targetUser}
|
|
27
|
+
**User needs:** ${topNeeds}
|
|
28
|
+
**Primary conversion action:** ${primaryAction}
|
|
29
|
+
**Success metric (90-day):** ${q3 || '[from Q3 — what measurable outcome?]'}
|
|
30
|
+
|
|
31
|
+
**Problem framing:** ${q1 || '[from Q1 — the problem being solved]'}
|
|
32
|
+
`
|
|
33
|
+
|
|
34
|
+
const confidence = inferConfidence(q1, q2, q3)
|
|
35
|
+
return { section, confidence }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function inferPrimaryAction(input, q1) {
|
|
39
|
+
const lower = (input + ' ' + q1).toLowerCase()
|
|
40
|
+
if (lower.includes('signup') || lower.includes('register') || lower.includes('sign up'))
|
|
41
|
+
return 'Sign up / create account'
|
|
42
|
+
if (lower.includes('purchase') || lower.includes('buy') || lower.includes('checkout'))
|
|
43
|
+
return 'Complete purchase'
|
|
44
|
+
if (lower.includes('download')) return 'Download content or file'
|
|
45
|
+
if (lower.includes('subscribe')) return 'Subscribe to plan'
|
|
46
|
+
if (lower.includes('contact') || lower.includes('demo')) return 'Request demo or contact'
|
|
47
|
+
if (lower.includes('share') || lower.includes('invite')) return 'Share or invite'
|
|
48
|
+
return '[to be determined — what does the user do that matters to business?]'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function extractNeeds(q1, q3) {
|
|
52
|
+
if (!q1) return '[List top 3 needs this feature addresses]'
|
|
53
|
+
// Extract first 3 sentences or items
|
|
54
|
+
const sentences = q1.split(/[.\n]/).filter((s) => s.trim().length > 5).slice(0, 3)
|
|
55
|
+
if (sentences.length === 0) return '[List top 3 needs this feature addresses]'
|
|
56
|
+
return sentences.map((s) => `• ${s.trim()}`).join('\n')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function inferConfidence(q1, q2, q3) {
|
|
60
|
+
const filled = [q1, q2, q3].filter((a) => a.trim().length > 10).length
|
|
61
|
+
if (filled >= 3) return 'High'
|
|
62
|
+
if (filled >= 2) return 'Medium'
|
|
63
|
+
if (filled >= 1) return 'Low'
|
|
64
|
+
return 'None'
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = { analyze }
|