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.
Files changed (42) hide show
  1. package/README.md +376 -95
  2. package/bin/sdd.js +14 -6
  3. package/lib/bmad/agents/architect.js +96 -0
  4. package/lib/bmad/agents/pm.js +67 -0
  5. package/lib/bmad/agents/ux.js +103 -0
  6. package/lib/bmad/confidence.js +129 -0
  7. package/lib/bmad/index.js +140 -0
  8. package/lib/bmad/problem-first.js +85 -0
  9. package/lib/bmad/questions.js +110 -0
  10. package/lib/bmad/synthesis.js +109 -0
  11. package/lib/bmad.js +45 -51
  12. package/lib/bundle/.claude/commands/sdd-bmad.md +360 -20
  13. package/lib/bundle/.claude/commands/sdd-converge.md +21 -7
  14. package/lib/bundle/.claude/commands/sdd-cook.md +335 -0
  15. package/lib/bundle/.claude/commands/sdd-init.md +71 -13
  16. package/lib/bundle/.claude/commands/sdd-spec.md +103 -35
  17. package/lib/bundle/.claude/commands/sdd-task-status.md +95 -0
  18. package/lib/bundle/.claude/commands/sdd-tasks.md +100 -17
  19. package/lib/bundle/.claude/commands/sdd.md +48 -8
  20. package/lib/bundle/.sdd/config.json +2 -2
  21. package/lib/bundle/CLAUDE.md +6 -4
  22. package/lib/bundle/commands/sdd-status.ps1 +40 -6
  23. package/lib/bundle/commands/sdd-task-status.ps1 +78 -0
  24. package/lib/bundle/run-converge.ps1 +84 -23
  25. package/lib/bundle/skills/sdd-cook/SKILL.md +381 -0
  26. package/lib/bundle/skills/sdd-cook/references/intent-detection.md +67 -0
  27. package/lib/bundle/skills/sdd-cook/references/subagent-patterns.md +352 -0
  28. package/lib/bundle/skills/sdd-cook/references/subagent-prompts.md +346 -0
  29. package/lib/bundle/skills/sdd-cook/references/task-execution.md +259 -0
  30. package/lib/bundle/skills/sdd-cook/references/workflow-steps.md +215 -0
  31. package/lib/bundle/templates/BMAD-brief.template.md +75 -14
  32. package/lib/bundle/templates/SPEC.template.md +193 -20
  33. package/lib/bundle/templates/TASKS.template.md +32 -13
  34. package/lib/bundle/templates/task-detail.template.md +40 -0
  35. package/lib/bundle/templates/task-master.template.md +41 -0
  36. package/lib/converge-task.ps1 +260 -0
  37. package/lib/init.js +2 -0
  38. package/lib/output-dirs.ps1 +461 -0
  39. package/lib/sdd-check.ps1 +130 -0
  40. package/lib/shared-converge.ps1 +270 -0
  41. package/lib/verify-patterns.ps1 +208 -0
  42. package/package.json +2 -2
package/README.md CHANGED
@@ -1,95 +1,376 @@
1
- # XDM Method — SDD Pipeline for Claude Code
2
-
3
- Spec-Driven Development pipeline that transforms raw feature requests into validated, shipped code through a self-correcting converge loop.
4
-
5
- ## Quick Start
6
-
7
- ```powershell
8
- # Install globally (once)
9
- npm install -g sdd-pipeline
10
-
11
- # In any new project directory:
12
- sdd init # Initialize pipeline
13
- sdd bmad "todo app" # Generate BMAD brief
14
- sdd status # Check pipeline phases
15
- ```
16
-
17
- ## Unified Command
18
-
19
- Use `/sdd` in Claude Code for the full pipeline:
20
-
21
- ```powershell
22
- claude "/sdd init"
23
- claude "/sdd bmad landing page for my SaaS"
24
- claude "/sdd spec"
25
- claude "/sdd tasks"
26
- claude "/sdd converge"
27
- claude "/sdd status"
28
- ```
29
-
30
- ## Pipeline Phases
31
-
32
- | Phase | Command | Output |
33
- |-------|---------|--------|
34
- | 0: BMAD | `/sdd bmad` | BMAD-brief.md |
35
- | 2: Spec | `/sdd spec` | SPEC.md |
36
- | 3: Tasks | `/sdd tasks` | TASKS.md |
37
- | 5: Converge | `/sdd converge` | converge/validation.md |
38
-
39
- Individual commands also available: `/sdd-bmad`, `/sdd-spec`, `/sdd-tasks`, `/sdd-converge`.
40
-
41
- ## Key Features
42
-
43
- - **Phase gates:** `/sdd spec` fails if BMAD-brief.md missing — no bypass
44
- - **Prompt injection protection:** All user input sanitized
45
- - **SSRF protection:** URL validation blocks private IPs, localhost
46
- - **Dev server health check:** 60s timeout before Lighthouse runs
47
- - **GitHub Actions CI:** Runs converge on push/PR, creates Issue on failure
48
- - **Domain extensions:** API, frontend, backend — set via `.sdd/config.json`
49
-
50
- ## Status
51
-
52
- ```powershell
53
- sdd status # Quick status (npm package)
54
- pwsh commands/sdd-status.ps1 --Verify # Full verification
55
- ```
56
-
57
- ## Architecture
58
-
59
- ```
60
- Raw Idea -> /sdd bmad -> BMAD-brief.md
61
- -> /sdd spec -> SPEC.md
62
- -> /sdd tasks -> TASKS.md
63
- -> Implement
64
- -> /sdd converge
65
- -> pwsh run-converge.ps1 -> converge/validation.md
66
- |
67
- +-- PASS: merge
68
- +-- FAIL: fix -> re-enter
69
- ```
70
-
71
- ## Files
72
-
73
- | Path | Purpose |
74
- |------|---------|
75
- | `.sdd/config.json` | Pipeline state, template versions |
76
- | `templates/` | SDD artifact templates |
77
- | `.claude/commands/` | Claude Code slash commands |
78
- | `run-converge.ps1` | Converge validation script |
79
- | `.github/workflows/converge.yml` | CI/CD pipeline |
80
- | `extensions/` | Domain-specific extensions |
81
-
82
- ## Extensions
83
-
84
- Enable via `.sdd/config.json` `project.domain`:
85
- - `api` OpenAPI spec, endpoint validation
86
- - `frontend` — design system, Lighthouse targets
87
- - `backend` — data models, security requirements
88
-
89
- ## Requirements
90
-
91
- - Windows 11 + PowerShell (primary), Bash (fallback)
92
- - Git, Node.js, npm
93
- - Claude Code CLI
94
-
95
- See [docs/spec-pipeline-synthesis.md](docs/spec-pipeline-synthesis.md) for full pipeline specification.
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 in current directory
42
- sdd bmad <description> Generate BMAD brief
43
- sdd status Show pipeline phase status
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 TASKS.md
49
- pwsh run-converge.ps1 Run converge validation
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 }