@anhth2/spec-driven-dev-plugin 0.7.0 → 0.9.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 (96) hide show
  1. package/ARCHITECTURE.md +6 -2
  2. package/bin/index.js +105 -0
  3. package/commands/debug.md +189 -1
  4. package/commands/debug.tmpl +16 -0
  5. package/commands/define-product.md +94 -1
  6. package/commands/fix-bug.md +190 -1
  7. package/commands/fix-bug.tmpl +17 -0
  8. package/commands/generate-bdd.md +314 -14
  9. package/commands/generate-bdd.tmpl +220 -13
  10. package/commands/generate-code.md +191 -3
  11. package/commands/generate-code.tmpl +97 -2
  12. package/commands/generate-design-spec.md +811 -0
  13. package/commands/generate-design-spec.tmpl +399 -0
  14. package/commands/generate-prd.md +133 -1
  15. package/commands/generate-prd.tmpl +39 -0
  16. package/commands/generate-spec-manifest.md +576 -0
  17. package/commands/generate-spec-manifest.tmpl +164 -0
  18. package/commands/generate-tech-docs.md +116 -2
  19. package/commands/generate-tech-docs.tmpl +22 -1
  20. package/commands/generate-tests.md +94 -1
  21. package/commands/learn.md +554 -0
  22. package/commands/learn.tmpl +63 -0
  23. package/commands/propose-scenario.md +521 -0
  24. package/commands/propose-scenario.tmpl +109 -0
  25. package/commands/refine-prd.md +94 -1
  26. package/commands/report-bug.md +543 -0
  27. package/commands/report-bug.tmpl +131 -0
  28. package/commands/review-code.md +190 -1
  29. package/commands/review-code.tmpl +17 -0
  30. package/commands/review-context.md +134 -1
  31. package/commands/review-context.tmpl +40 -0
  32. package/commands/review-tech-docs.md +176 -5
  33. package/commands/review-tech-docs.tmpl +82 -4
  34. package/commands/run-tests.md +119 -1
  35. package/commands/run-tests.tmpl +25 -0
  36. package/commands/setup-ai-first.md +142 -4
  37. package/commands/setup-ai-first.tmpl +135 -3
  38. package/commands/smoke-test.md +94 -1
  39. package/commands/sync.md +405 -0
  40. package/commands/sync.tmpl +345 -0
  41. package/commands/update-framework.md +211 -0
  42. package/commands/update-framework.tmpl +151 -0
  43. package/commands/validate-traces.md +152 -3
  44. package/commands/validate-traces.tmpl +58 -2
  45. package/core/FRAMEWORK_VERSION +1 -1
  46. package/core/commands/debug.md +189 -1
  47. package/core/commands/define-product.md +94 -1
  48. package/core/commands/fix-bug.md +190 -1
  49. package/core/commands/generate-bdd.md +314 -14
  50. package/core/commands/generate-code.md +191 -3
  51. package/core/commands/generate-design-spec.md +811 -0
  52. package/core/commands/generate-prd.md +133 -1
  53. package/core/commands/generate-spec-manifest.md +576 -0
  54. package/core/commands/generate-tech-docs.md +116 -2
  55. package/core/commands/generate-tests.md +94 -1
  56. package/core/commands/learn.md +554 -0
  57. package/core/commands/propose-scenario.md +521 -0
  58. package/core/commands/refine-prd.md +94 -1
  59. package/core/commands/report-bug.md +543 -0
  60. package/core/commands/review-code.md +190 -1
  61. package/core/commands/review-context.md +134 -1
  62. package/core/commands/review-tech-docs.md +176 -5
  63. package/core/commands/run-tests.md +119 -1
  64. package/core/commands/setup-ai-first.md +142 -4
  65. package/core/commands/smoke-test.md +94 -1
  66. package/core/commands/sync.md +405 -0
  67. package/core/commands/update-framework.md +211 -0
  68. package/core/commands/validate-traces.md +152 -3
  69. package/core/skills/code/SKILL.md +101 -2
  70. package/core/skills/debug/SKILL.md +108 -3
  71. package/core/skills/design-spec/SKILL.md +507 -0
  72. package/core/skills/discovery/SKILL.md +94 -1
  73. package/core/skills/prd/SKILL.md +14 -2
  74. package/core/skills/setup-ai-first/SKILL.md +7 -1
  75. package/core/skills/spec/SKILL.md +14 -2
  76. package/core/skills/test/SKILL.md +195 -3
  77. package/core/steps/capture-lesson.md +79 -0
  78. package/core/steps/context-loader.md +87 -0
  79. package/core/steps/report-footer.md +7 -1
  80. package/core/templates/design-spec.template.md +209 -0
  81. package/core/templates/project-context.yaml +40 -0
  82. package/package.json +1 -1
  83. package/skills/code/SKILL.md +101 -2
  84. package/skills/debug/SKILL.md +108 -3
  85. package/skills/design-spec/SKILL.md +507 -0
  86. package/skills/design-spec/SKILL.tmpl +95 -0
  87. package/skills/discovery/SKILL.md +94 -1
  88. package/skills/prd/SKILL.md +14 -2
  89. package/skills/setup-ai-first/SKILL.md +7 -1
  90. package/skills/spec/SKILL.md +14 -2
  91. package/skills/test/SKILL.md +195 -3
  92. package/steps/capture-lesson.md +79 -0
  93. package/steps/context-loader.md +87 -0
  94. package/steps/report-footer.md +7 -1
  95. package/templates/design-spec.template.md +209 -0
  96. package/templates/project-context.yaml +40 -0
@@ -131,6 +131,7 @@ Read `.agent/project-context.yaml`. Extract and store:
131
131
  - `paths.core_entities` → path to core-entities.md
132
132
  - `paths.tech_docs_dir` → technical documentation root
133
133
  - `paths.trace_dir` → trace state directory
134
+ - `paths.design_spec_dir` → Design Spec documents root (FE/App only)
134
135
 
135
136
  If `paths` section is absent, use these defaults:
136
137
  - `specs_dir` = `specs/bdd`
@@ -142,11 +143,75 @@ If `paths` section is absent, use these defaults:
142
143
  - `core_entities` = `specs/domain-knowledge/core-entities.md`
143
144
  - `tech_docs_dir` = `specs/tech-docs`
144
145
  - `trace_dir` = `.trace`
146
+ - `design_spec_dir` = `specs/design-spec`
145
147
 
146
148
  If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
147
149
 
148
150
  ---
149
151
 
152
+ ## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
153
+
154
+ *Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
155
+
156
+ If `services` section is present:
157
+
158
+ **1. Detect active domain** (in priority order):
159
+ - Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
160
+ - Extract from target file path: segment immediately after `prd_dir` base path
161
+ *(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
162
+ - If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
163
+
164
+ **2. Route to service** — if active domain matches a key in `services`:
165
+ - Override `paths.specs_dir` → `services.{domain}.specs_dir`
166
+ - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
167
+ - Store `active_service` = `services.{domain}.path`
168
+ - Store `active_service_module` = `services.{domain}.module`
169
+ - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
170
+
171
+ **3. Fallback** — if domain not detected or no matching service key:
172
+ - Keep default paths from Step 1
173
+ - Set `active_service = unresolved`
174
+
175
+ **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
176
+ - Override `paths.prd_dir` → `{spec_source}/specs/prd`
177
+ - Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
178
+ - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
179
+ - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
180
+ - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
181
+ - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
182
+ - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
183
+
184
+ > **Why under `spec_source`:** tester feedback (`/report-bug`, `/propose-scenario`) must land in the **shared spec repo** so PO/Dev see it when they `/sync`. In single-service mode (no `spec_source`), these default to `feedback/bug-reports` and `feedback/bdd-proposals` at repo root — still shared, same repo.
185
+
186
+ ---
187
+
188
+ ## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
189
+
190
+ *Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
191
+
192
+ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
193
+
194
+ **1. Locate service config** — try in priority order:
195
+ - `{active_service}/.agent/project-context.yaml`
196
+ - `{active_service}/project-context.yaml`
197
+
198
+ **2. If found, override with service-specific values:**
199
+
200
+ | Variable | Source |
201
+ |----------|--------|
202
+ | `conventions.test_command` | service's `conventions.test_command` |
203
+ | `conventions.build_command` | service's `conventions.build_command` |
204
+ | `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
205
+ | `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
206
+
207
+ **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
208
+ - Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
209
+ - File write operations (test files, trace TSVs) use paths **relative to** `service_root`
210
+
211
+ **4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
212
+
213
+ ---
214
+
150
215
  ## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
151
216
 
152
217
  If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
@@ -237,6 +302,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
237
302
 
238
303
  ---
239
304
 
305
+ ## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
306
+
307
+ *Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
308
+ or accepted during `/review-code`, `/fix-bug`, `/debug`.*
309
+
310
+ Resolve the lessons file path:
311
+ - Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
312
+ - Else default `specs/domain-knowledge/lessons-learned.md`
313
+ - In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
314
+
315
+ If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
316
+ - Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
317
+ - Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
318
+ - If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
319
+
320
+ If the file does not exist → skip silently (no lessons captured yet).
321
+
322
+ ---
323
+
240
324
  ## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
241
325
 
242
326
  After loading all context, synthesize and output a compact summary block.
@@ -252,6 +336,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
252
336
  Ticket : {ticket_prefix}-
253
337
  Dict : {loaded — N canonical terms, M banned terms | missing}
254
338
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
339
+ Lessons : {loaded — N guardrails | none yet}
340
+ Service : {active_service} ({active_service_module}) | single-service
341
+ Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
255
342
  Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
256
343
  ```
257
344
 
@@ -375,6 +462,101 @@ git commit -m "fix({TICKET_ID}): {description}"
375
462
  git push -u origin fix/{TICKET_ID}-{slug}
376
463
  ```
377
464
 
465
+ ## Phase 6 — Offer to Record a Lesson (optional)
466
+
467
+ If the root cause was a **mistake the AI made during generation and could repeat**
468
+ (e.g. it generated code that skipped a layer, missed a null guard, used a wrong pattern —
469
+ NOT an external cause like a third-party outage or bad input data), ask:
470
+
471
+ ```
472
+ This root cause looks like a repeatable AI mistake.
473
+ Record it as a project lesson so it isn't generated again? (Y/N)
474
+ ```
475
+
476
+ If `Y` → run the capture procedure below with `source=/fix-bug {TICKET_ID}`, an appropriate
477
+ `category` (usually `code-gen`), and `scope` = the affected domain or file glob.
478
+
479
+ # Capture Lesson — Record a Recurring Mistake as a Guardrail
480
+
481
+ Reusable procedure to persist a "lesson" so the AI does not repeat a mistake in this project.
482
+ Used by `/learn` (manual) and offered by `/review-code`, `/fix-bug`, `/debug` (auto).
483
+
484
+ > **Project memory, not model training.** A lesson is plain text injected into context at the
485
+ > start of every command (context-loader Step 6.7). Functionally this stops the repeat — the AI
486
+ > sees the guardrail before it generates. No model weights change.
487
+
488
+ ## L1 — Resolve the lessons file
489
+
490
+ Resolve `lessons_path` in this order:
491
+ 1. `paths.lessons_file` from loaded context (may be service-overridden in umbrella mode, Step 1.6)
492
+ 2. Default `specs/domain-knowledge/lessons-learned.md` (single-service)
493
+ 3. In umbrella/service mode (when `service_root` is set) default `{service_root}/.agent/project-lessons.md`
494
+
495
+ ## L2 — Build the lesson
496
+
497
+ Gather these fields — from `$ARGUMENTS` (for `/learn`) or from the calling command's findings
498
+ (for `/review-code`, `/fix-bug`, `/debug`):
499
+
500
+ | Field | Meaning |
501
+ |-------|---------|
502
+ | `category` | one of: `code-gen` \| `bdd` \| `tech-docs` \| `tests` \| `prd` \| `general` |
503
+ | `title` | short phrase naming the mistake |
504
+ | `mistake` | concretely, what the AI did wrong |
505
+ | `rule` | imperative correction — "Always …" / "Never …" — testable, not vague |
506
+ | `scope` | where it applies: a domain, a file glob (e.g. `*Controller.*`), or `all` |
507
+ | `source` | how captured: `/learn` \| `/review-code {UC-ID}` \| `/fix-bug {TICKET}` \| `/debug` |
508
+
509
+ If `rule` is vague (e.g. "be careful"), rewrite it into a concrete, checkable instruction before saving.
510
+
511
+ ## L3 — De-duplicate
512
+
513
+ Read existing lessons in `lessons_path`. If one already covers the same mistake:
514
+ - **Refine** that entry (tighten the Rule, widen/narrow Scope, bump Date, append the new Source) — do NOT add a duplicate.
515
+
516
+ Otherwise assign the next id `L-{NNN}` = (highest existing number + 1), zero-padded to 3 digits.
517
+
518
+ ## L4 — Write
519
+
520
+ If `lessons_path` does not exist, create it with this header first:
521
+
522
+ ```markdown
523
+ # Project Lessons — Learned Guardrails
524
+
525
+ > Mistakes the AI must NOT repeat in this project. Loaded by context-loader at the start of
526
+ > every command and treated as hard constraints (same priority as CLAUDE.md coding standards).
527
+ > Add with /learn, or accept the prompt during /review-code, /fix-bug, /debug.
528
+ > Commit this file so the whole team shares the guardrails.
529
+
530
+ | Category | Applies to |
531
+ |----------|-----------|
532
+ | code-gen | /generate-code output |
533
+ | bdd | /generate-bdd output |
534
+ | tech-docs | /generate-tech-docs output |
535
+ | tests | /generate-tests output |
536
+ | prd | /generate-prd, /refine-prd output |
537
+ | general | every command |
538
+
539
+ ---
540
+ ```
541
+
542
+ Insert the new lesson directly under the `---` separator (**newest first**), in this exact shape:
543
+
544
+ ```markdown
545
+ ### L-{NNN} — [{category}] {title}
546
+ - **Date**: {today YYYY-MM-DD}
547
+ - **Scope**: {scope}
548
+ - **Mistake**: {mistake}
549
+ - **Rule**: {rule}
550
+ - **Source**: {source}
551
+
552
+ ```
553
+
554
+ ## L5 — Confirm
555
+
556
+ Print: `📝 Lesson {id} recorded → {lessons_path} ([{category}] {title})`
557
+ Then remind: `Commit {lessons_path} so the team shares this guardrail.`
558
+
559
+
378
560
  ## Output
379
561
 
380
562
  # Report Footer — Standard Command Output Format
@@ -409,7 +591,8 @@ Suggest the logical next command based on workflow phase:
409
591
  | /define-product | `/generate-prd {product-definition-file}` |
410
592
  | /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
411
593
  | /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
412
- | /review-context (PRD) | `/generate-bdd {prd-file}` if APPROVED; fix PRD if NEEDS_FIX |
594
+ | /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
595
+ | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
413
596
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
414
597
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
415
598
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
@@ -423,6 +606,11 @@ Suggest the logical next command based on workflow phase:
423
606
  | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
424
607
  | /fix-bug | Create PR and link to ticket |
425
608
  | /debug | `/fix-bug {ticket-id}` if fix needed |
609
+ | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
610
+ | /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
611
+ | /learn | Continue working — lesson applies on next command |
612
+ | /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
613
+ | /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
426
614
 
427
615
  Format the footer as:
428
616
  ```
@@ -438,6 +626,7 @@ Next : {suggested command with example arguments}
438
626
  Root Cause: {analysis}
439
627
  Changes: {list}
440
628
  ✅ Regression test added | ✅ Build: SUCCESS
629
+ {📝 Lesson L-NNN recorded (if captured)}
441
630
  Branch: fix/{TICKET_ID}-{slug}
442
631
  Next: Create PR and link to ticket.
443
632
  ```
@@ -110,6 +110,22 @@ git commit -m "fix({TICKET_ID}): {description}"
110
110
  git push -u origin fix/{TICKET_ID}-{slug}
111
111
  ```
112
112
 
113
+ ## Phase 6 — Offer to Record a Lesson (optional)
114
+
115
+ If the root cause was a **mistake the AI made during generation and could repeat**
116
+ (e.g. it generated code that skipped a layer, missed a null guard, used a wrong pattern —
117
+ NOT an external cause like a third-party outage or bad input data), ask:
118
+
119
+ ```
120
+ This root cause looks like a repeatable AI mistake.
121
+ Record it as a project lesson so it isn't generated again? (Y/N)
122
+ ```
123
+
124
+ If `Y` → run the capture procedure below with `source=/fix-bug {TICKET_ID}`, an appropriate
125
+ `category` (usually `code-gen`), and `scope` = the affected domain or file glob.
126
+
127
+ {{include:steps/capture-lesson.md}}
128
+
113
129
  ## Output
114
130
 
115
131
  {{include:steps/report-footer.md}}
@@ -119,6 +135,7 @@ git push -u origin fix/{TICKET_ID}-{slug}
119
135
  Root Cause: {analysis}
120
136
  Changes: {list}
121
137
  ✅ Regression test added | ✅ Build: SUCCESS
138
+ {📝 Lesson L-NNN recorded (if captured)}
122
139
  Branch: fix/{TICKET_ID}-{slug}
123
140
  Next: Create PR and link to ticket.
124
141
  ```