@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
@@ -42,6 +42,7 @@ Read `.agent/project-context.yaml`. Extract and store:
42
42
  - `paths.core_entities` → path to core-entities.md
43
43
  - `paths.tech_docs_dir` → technical documentation root
44
44
  - `paths.trace_dir` → trace state directory
45
+ - `paths.design_spec_dir` → Design Spec documents root (FE/App only)
45
46
 
46
47
  If `paths` section is absent, use these defaults:
47
48
  - `specs_dir` = `specs/bdd`
@@ -53,11 +54,75 @@ If `paths` section is absent, use these defaults:
53
54
  - `core_entities` = `specs/domain-knowledge/core-entities.md`
54
55
  - `tech_docs_dir` = `specs/tech-docs`
55
56
  - `trace_dir` = `.trace`
57
+ - `design_spec_dir` = `specs/design-spec`
56
58
 
57
59
  If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
58
60
 
59
61
  ---
60
62
 
63
+ ## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
64
+
65
+ *Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
66
+
67
+ If `services` section is present:
68
+
69
+ **1. Detect active domain** (in priority order):
70
+ - Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
71
+ - Extract from target file path: segment immediately after `prd_dir` base path
72
+ *(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
73
+ - If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
74
+
75
+ **2. Route to service** — if active domain matches a key in `services`:
76
+ - Override `paths.specs_dir` → `services.{domain}.specs_dir`
77
+ - Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
78
+ - Store `active_service` = `services.{domain}.path`
79
+ - Store `active_service_module` = `services.{domain}.module`
80
+ - If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
81
+
82
+ **3. Fallback** — if domain not detected or no matching service key:
83
+ - Keep default paths from Step 1
84
+ - Set `active_service = unresolved`
85
+
86
+ **4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
87
+ - Override `paths.prd_dir` → `{spec_source}/specs/prd`
88
+ - Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
89
+ - Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
90
+ - Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
91
+ - Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
92
+ - Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
93
+ - Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
94
+
95
+ > **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.
96
+
97
+ ---
98
+
99
+ ## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
100
+
101
+ *Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
102
+
103
+ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
104
+
105
+ **1. Locate service config** — try in priority order:
106
+ - `{active_service}/.agent/project-context.yaml`
107
+ - `{active_service}/project-context.yaml`
108
+
109
+ **2. If found, override with service-specific values:**
110
+
111
+ | Variable | Source |
112
+ |----------|--------|
113
+ | `conventions.test_command` | service's `conventions.test_command` |
114
+ | `conventions.build_command` | service's `conventions.build_command` |
115
+ | `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
116
+ | `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
117
+
118
+ **3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
119
+ - Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
120
+ - File write operations (test files, trace TSVs) use paths **relative to** `service_root`
121
+
122
+ **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).
123
+
124
+ ---
125
+
61
126
  ## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
62
127
 
63
128
  If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
@@ -148,6 +213,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
148
213
 
149
214
  ---
150
215
 
216
+ ## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
217
+
218
+ *Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
219
+ or accepted during `/review-code`, `/fix-bug`, `/debug`.*
220
+
221
+ Resolve the lessons file path:
222
+ - Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
223
+ - Else default `specs/domain-knowledge/lessons-learned.md`
224
+ - In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
225
+
226
+ If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
227
+ - Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
228
+ - 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).
229
+ - If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
230
+
231
+ If the file does not exist → skip silently (no lessons captured yet).
232
+
233
+ ---
234
+
151
235
  ## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
152
236
 
153
237
  After loading all context, synthesize and output a compact summary block.
@@ -163,6 +247,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
163
247
  Ticket : {ticket_prefix}-
164
248
  Dict : {loaded — N canonical terms, M banned terms | missing}
165
249
  Entities : {loaded — EntityA, EntityB, EntityC | missing}
250
+ Lessons : {loaded — N guardrails | none yet}
251
+ Service : {active_service} ({active_service_module}) | single-service
252
+ Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
166
253
  Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
167
254
  ```
168
255
 
@@ -30,7 +30,8 @@ Suggest the logical next command based on workflow phase:
30
30
  | /define-product | `/generate-prd {product-definition-file}` |
31
31
  | /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
32
32
  | /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
33
- | /review-context (PRD) | `/generate-bdd {prd-file}` if APPROVED; fix PRD if NEEDS_FIX |
33
+ | /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 |
34
+ | /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
34
35
  | /generate-bdd | `/review-context {feature-file}` to verify coverage |
35
36
  | /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
36
37
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
@@ -44,6 +45,11 @@ Suggest the logical next command based on workflow phase:
44
45
  | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
45
46
  | /fix-bug | Create PR and link to ticket |
46
47
  | /debug | `/fix-bug {ticket-id}` if fix needed |
48
+ | /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
49
+ | /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
50
+ | /learn | Continue working — lesson applies on next command |
51
+ | /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
52
+ | /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
47
53
 
48
54
  Format the footer as:
49
55
  ```
@@ -0,0 +1,209 @@
1
+ # {TICKET-ID} {Feature Name} — Design Spec [{Platform}]
2
+
3
+ <!--
4
+ Template này được sử dụng bởi /generate-design-spec.
5
+ Platform = web | app | app-ios | app-android
6
+
7
+ PLATFORM SECTIONS:
8
+ - Section 3A + 4A: chỉ dành cho web (react/nextjs/vue/angular). Xóa C khi dùng cho web.
9
+ - Section 3C + 4B: chỉ dành cho app (flutter/react-native/ios/android). Xóa A+B khi dùng cho app.
10
+
11
+ COMPONENT MAPPING (bắt buộc):
12
+ - Mọi component trong Component Inventory PHẢI được map với figma-components/{module}.md
13
+ - ✅ Matched → dùng Code Component và Import Path từ catalog
14
+ - ⚠️ TODO → đánh dấu [TODO — chưa implement]
15
+ - ❌ Chưa có → đánh dấu [NEW — cần confirm với designer]
16
+
17
+ SCREEN STATES (bắt buộc mỗi màn):
18
+ - Tối thiểu: default, loading, error
19
+ - Thêm "empty" nếu màn có thể hiển thị trạng thái không có dữ liệu
20
+ - Thêm "success" nếu action tạo ra trạng thái xác nhận riêng biệt
21
+ -->
22
+
23
+ ---
24
+
25
+ ## Metadata
26
+
27
+ | Field | Value |
28
+ |--------------------|---------------------------------------------------------------|
29
+ | **Spec ID** | {TICKET-ID}-DS-{platform} |
30
+ | **Version** | 1.0 |
31
+ | **Status** | draft / approved |
32
+ | **Platform** | {web \| app \| app-ios \| app-android} |
33
+ | **Module** | {active_module} |
34
+ | **Service** | {active_service} |
35
+ | **Domain** | {domain} |
36
+ | **Business PRD** | [{TICKET-ID}](./{TICKET-ID}-slug.md) |
37
+ | **Figma** | {figma_url or TBD} |
38
+ | **Author** | {PO name or "AI-assisted"} |
39
+ | **Created** | {YYYY-MM-DD} |
40
+ | **Updated** | {YYYY-MM-DD} |
41
+
42
+ ---
43
+
44
+ # 1. Screen Inventory
45
+
46
+ | # | Screen Name | Entry Point | Figma Frame | Notes |
47
+ |---|-------------|-------------|-------------|-------|
48
+ | 1 | {Screen 1} | {how user arrives} | [Frame]({figma_url}) | |
49
+ | 2 | {Screen 2} | {entry point} | [Frame]({figma_url}) | |
50
+
51
+ ---
52
+
53
+ # 2. Screen Specs
54
+
55
+ ## Screen 1: {Screen Name}
56
+
57
+ **Figma**: [{Frame name}]({figma_frame_url})
58
+
59
+ ### Layout
60
+
61
+ {Grid / max-width / padding / spacing — reference design tokens where applicable}
62
+
63
+ ### Component Inventory
64
+
65
+ | Component (Figma) | Code Component | Import Path | States | Notes |
66
+ |------------------------|----------------|------------------------|---------------------------------|---------|
67
+ | {Figma/Button/Primary} | Button | @/components/ui/Button | default, loading, disabled | |
68
+ | {Figma/Input/Text} | TextInput | @/components/ui/Input | default, focus, error, disabled | |
69
+
70
+ ### Screen States
71
+
72
+ | State | Trigger | UI Behavior |
73
+ |-----------|----------------------------------|----------------------------------------------------------|
74
+ | default | Screen loaded, data available | {Describe full rendered appearance} |
75
+ | loading | API call in flight | {Skeleton / spinner position and style} |
76
+ | error | API failure / validation error | {Toast / inline error / error screen + recovery CTA} |
77
+ | empty | No data returned | {Illustration + CTA — e.g., "No items yet. Add one →"} |
78
+ | success | Action completed (if applicable) | {Confirmation toast / navigation / visual change} |
79
+
80
+ ### Actions & Navigation
81
+
82
+ | Action | Trigger | Result |
83
+ |-----------------|---------------------------|---------------------------------------------------|
84
+ | {Action name} | Tap/click {element} | Navigate to {Screen N} / Open {Modal name} |
85
+ | {Back/Cancel} | Back gesture / button | Return to {previous screen} without saving |
86
+
87
+ ---
88
+
89
+ <!-- Repeat ## Screen N for each additional screen -->
90
+
91
+ ---
92
+
93
+ # 3. Interaction Patterns
94
+
95
+ <!-- === WEB ONLY — delete this section for app === -->
96
+
97
+ ## A. Responsive Behavior *(web)*
98
+
99
+ | Breakpoint | Width | Layout Changes |
100
+ |------------|------------|---------------------------------------------|
101
+ | Mobile | < 768px | {Single column, bottom nav, full-width CTA} |
102
+ | Tablet | 768–1279px | {2-col grid, sidebar collapsed} |
103
+ | Desktop | ≥ 1280px | {Full layout, max-width 1440px} |
104
+
105
+ ## B. Hover / Focus / Keyboard *(web)*
106
+
107
+ | Element | Hover | Focus | Keyboard |
108
+ |----------------|-------------------------------|---------------------------------|---------------|
109
+ | Primary button | Background → {color.hover} | Outline 2px {color.focus} | Enter / Space |
110
+ | Text input | Border → {color.border.hover} | Border → {color.primary} | Tab to focus |
111
+
112
+ <!-- === APP ONLY — delete sections A+B for app === -->
113
+
114
+ ## C. Gestures & Navigation *(app)*
115
+
116
+ | Gesture | Screen / Element | Behavior |
117
+ |----------------------|---------------------|---------------------------------------------|
118
+ | Back gesture | All screens | {Return / show "Discard changes?" dialog} |
119
+ | Pull-to-refresh | {Screen names} | Refresh data, spinner at top |
120
+ | Swipe left on row | {List item} | Reveal {Delete / Archive} action |
121
+
122
+ ### Navigation Stack *(app)*
123
+
124
+ ```
125
+ {e.g., BottomTab(Home) → ListPage → DetailPage → EditPage}
126
+ ```
127
+
128
+ ### Platform Conventions *(app)*
129
+
130
+ | Aspect | iOS | Android |
131
+ |------------------|-------------------------------------------|-------------------------------------|
132
+ | Navigation bar | Back button top-left, title centered | Up arrow, title left-aligned |
133
+ | Bottom sheet | UISheetPresentation, grabber visible | BottomSheet, drag handle |
134
+ | Dialog | Actions right-aligned | Actions left-aligned |
135
+
136
+ ---
137
+
138
+ # 4. Platform Considerations
139
+
140
+ <!-- === WEB ONLY === -->
141
+
142
+ ## A. Accessibility *(web)*
143
+
144
+ - [ ] All interactive elements reachable by Tab key — no keyboard traps
145
+ - [ ] Focus trap inside modals
146
+ - [ ] Icon-only buttons have `aria-label`
147
+ - [ ] Dynamic content announces via `aria-live`
148
+ - [ ] WCAG AA contrast: text ≥ 4.5:1, large text ≥ 3:1
149
+ - [ ] Form inputs have visible labels (not placeholder-only)
150
+
151
+ <!-- === APP ONLY === -->
152
+
153
+ ## B. Device & OS *(app)*
154
+
155
+ - [ ] Safe area insets applied (top + bottom) on all screens
156
+ - [ ] Minimum touch target: 44×44pt (iOS) / 48×48dp (Android)
157
+ - [ ] Tested on 375pt (iPhone SE) and 360dp (small Android)
158
+ - [ ] Deep link: `{scheme}://{host}/{path}` → {screen name}
159
+ - [ ] Permissions: {Camera / Location / Notification} — rationale copy TBD
160
+ - [ ] Offline: {screen name} shows cached data + banner; {action} disabled with tooltip
161
+ - [ ] Dark mode tested — no hardcoded colors
162
+
163
+ ---
164
+
165
+ # 5. AC-UI — Design Acceptance Criteria
166
+
167
+ > Reviewed and signed off by **PO + Designer** before BDD generation.
168
+ > Complements business-level AC in [Business PRD](./{TICKET-ID}-slug.md).
169
+
170
+ | ID | Acceptance Criterion | Verified by |
171
+ |--------|--------------------------------------------------------------------------|-----------------|
172
+ | AC-UI1 | All screens match approved Figma frames within design-system tolerances | Designer |
173
+ | AC-UI2 | Loading state appears within 200ms of any API call initiation | QA |
174
+ | AC-UI3 | All error messages are visible, descriptive, and include a recovery CTA | PO |
175
+ | AC-UI4 | Empty states include illustration and call-to-action | PO + Designer |
176
+ | AC-UI5 | {Platform-specific criterion} | QA |
177
+
178
+ ---
179
+
180
+ # Appendix
181
+
182
+ ## Figma Summary
183
+
184
+ | Screen | Figma Frame | Status |
185
+ |------------|----------------------|--------------------------------|
186
+ | {Screen 1} | [Link]({url}) | ✅ Ready / ⏳ WIP / ❌ Missing |
187
+
188
+ ## Design Tokens Referenced
189
+
190
+ | Token | Value | Used in |
191
+ |-------------------|----------|----------------------------|
192
+ | `color.primary` | {#hex} | Buttons, links |
193
+ | `spacing.md` | {16px} | Standard vertical gap |
194
+
195
+ ## References
196
+
197
+ - [{TICKET-ID}](./{TICKET-ID}-slug.md) — Business PRD
198
+
199
+ ## AI Assumptions
200
+
201
+ - {Assumption — [AI DRAFT]}
202
+
203
+ ---
204
+
205
+ ## Changelog
206
+
207
+ | Version | Date | Changes |
208
+ |---------|--------------|-----------------|
209
+ | 1.0 | {YYYY-MM-DD} | Initial version |
@@ -45,12 +45,26 @@ paths:
45
45
  business_dictionary: "specs/domain-knowledge/business-dictionary.md"
46
46
  core_entities: "specs/domain-knowledge/core-entities.md"
47
47
 
48
+ # Project Lessons (guardrails accumulated via /learn — loaded by context-loader Step 6.7)
49
+ # Single-service default below. In umbrella/service mode, set this in each service's
50
+ # .agent/project-context.yaml to ".agent/project-lessons.md" (resolved per service_root).
51
+ lessons_file: "specs/domain-knowledge/lessons-learned.md"
52
+
48
53
  # Tech Docs
49
54
  tech_docs_dir: "tech-docs"
50
55
 
56
+ # Design Specs (FE/App platforms only — web, app)
57
+ design_spec_dir: "specs/design-spec"
58
+
51
59
  # Trace
52
60
  trace_dir: ".trace"
53
61
 
62
+ # Tester feedback (written by /report-bug and /propose-scenario).
63
+ # These live in the SHARED spec repo so PO/Dev see them on their next /sync.
64
+ # In umbrella mode, context-loader auto-resolves them under {spec_source}/feedback/.
65
+ bug_reports_dir: "feedback/bug-reports"
66
+ bdd_proposals_dir: "feedback/bdd-proposals"
67
+
54
68
  tech_stack:
55
69
  language: "{{LANGUAGE}}" # e.g., Java 17 / TypeScript / C# / Go
56
70
  framework: "{{FRAMEWORK}}" # e.g., Spring Boot 3.2 / Angular 17 / .NET 8
@@ -69,6 +83,32 @@ domains:
69
83
  - "{{DOMAIN_1}}"
70
84
  # - "{{DOMAIN_2}}"
71
85
 
86
+ # ----- Multi-Service / Umbrella Setup -----
87
+ # Fill this section ONLY if this is an UMBRELLA repo that contains multiple
88
+ # service submodules. Leave commented out for single-service projects.
89
+ #
90
+ # setup:
91
+ # mode: umbrella # "umbrella" | "single" (default: single)
92
+ # spec_source: "{{SPEC_SUBMODULE_PATH}}" # path to PO spec submodule, e.g. "free-trial-specs"
93
+ #
94
+ # When spec_source is set, context-loader auto-derives:
95
+ # prd_dir → {spec_source}/specs/prd
96
+ # design_spec_dir → {spec_source}/specs/design-spec
97
+ # domain_knowledge_dir → {spec_source}/specs/domain-knowledge
98
+ # (You can still override these manually in paths: section below.)
99
+ #
100
+ # services: # domain → service submodule routing
101
+ # {{DOMAIN_1}}: # must match @trace.domain in PRD files
102
+ # path: "{{SERVICE_SUBMODULE_DIR}}" # relative path to service submodule
103
+ # module: "{{STACK_MODULE}}" # e.g., java-spring, nextjs, flutter
104
+ # specs_dir: "{{SERVICE_SUBMODULE_DIR}}/specs/bdd"
105
+ # tech_docs_dir: "{{SERVICE_SUBMODULE_DIR}}/specs/tech-docs"
106
+ # {{DOMAIN_2}}:
107
+ # path: "{{SERVICE_2_DIR}}"
108
+ # module: "{{STACK_MODULE}}"
109
+ # specs_dir: "{{SERVICE_2_DIR}}/specs/bdd"
110
+ # tech_docs_dir: "{{SERVICE_2_DIR}}/specs/tech-docs"
111
+
72
112
  # ----- Architecture -----
73
113
  architecture:
74
114
  style: "{{ARCH_STYLE}}" # e.g., Layered / Clean / Hexagonal