@anhth2/spec-driven-dev-plugin 0.6.0 → 0.8.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/bin/index.js +285 -11
- package/commands/debug.md +233 -11
- package/commands/debug.tmpl +170 -6
- package/commands/define-product.md +68 -6
- package/commands/define-product.tmpl +5 -1
- package/commands/fix-bug.md +111 -11
- package/commands/fix-bug.tmpl +48 -6
- package/commands/generate-bdd.md +86 -9
- package/commands/generate-bdd.tmpl +23 -4
- package/commands/generate-code.md +146 -19
- package/commands/generate-code.tmpl +83 -14
- package/commands/generate-design-spec.md +754 -0
- package/commands/generate-design-spec.tmpl +399 -0
- package/commands/generate-prd.md +91 -7
- package/commands/generate-prd.tmpl +28 -2
- package/commands/generate-spec-manifest.md +519 -0
- package/commands/generate-spec-manifest.tmpl +164 -0
- package/commands/generate-tech-docs.md +122 -9
- package/commands/generate-tech-docs.tmpl +59 -4
- package/commands/generate-tests.md +491 -37
- package/commands/generate-tests.tmpl +428 -32
- package/commands/refine-prd.md +76 -8
- package/commands/refine-prd.tmpl +13 -3
- package/commands/review-code.md +94 -6
- package/commands/review-code.tmpl +31 -1
- package/commands/review-context.md +118 -12
- package/commands/review-context.tmpl +55 -7
- package/commands/review-tech-docs.md +76 -9
- package/commands/review-tech-docs.tmpl +13 -4
- package/commands/run-tests.md +196 -18
- package/commands/run-tests.tmpl +133 -13
- package/commands/setup-ai-first.md +192 -6
- package/commands/setup-ai-first.tmpl +136 -5
- package/commands/smoke-test.md +228 -22
- package/commands/smoke-test.tmpl +165 -17
- package/commands/validate-traces.md +77 -8
- package/commands/validate-traces.tmpl +14 -3
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +233 -11
- package/core/commands/define-product.md +68 -6
- package/core/commands/fix-bug.md +111 -11
- package/core/commands/generate-bdd.md +86 -9
- package/core/commands/generate-code.md +146 -19
- package/core/commands/generate-design-spec.md +754 -0
- package/core/commands/generate-prd.md +91 -7
- package/core/commands/generate-spec-manifest.md +519 -0
- package/core/commands/generate-tech-docs.md +122 -9
- package/core/commands/generate-tests.md +491 -37
- package/core/commands/refine-prd.md +76 -8
- package/core/commands/review-code.md +94 -6
- package/core/commands/review-context.md +118 -12
- package/core/commands/review-tech-docs.md +76 -9
- package/core/commands/run-tests.md +196 -18
- package/core/commands/setup-ai-first.md +192 -6
- package/core/commands/smoke-test.md +228 -22
- package/core/commands/validate-traces.md +77 -8
- package/core/skills/code/SKILL.md +68 -8
- package/core/skills/debug/SKILL.md +72 -10
- package/core/skills/design-spec/SKILL.md +450 -0
- package/core/skills/discovery/SKILL.md +62 -4
- package/core/skills/prd/SKILL.md +12 -8
- package/core/skills/setup-ai-first/SKILL.md +5 -3
- package/core/skills/spec/SKILL.md +11 -7
- package/core/skills/test/SKILL.md +130 -12
- package/core/steps/context-loader.md +57 -1
- package/core/steps/gate.md +1 -1
- package/core/steps/report-footer.md +5 -3
- package/core/steps/spawn-agent.md +3 -1
- package/core/templates/design-spec.template.md +209 -0
- package/core/templates/project-context.yaml +29 -0
- package/package.json +1 -1
- package/skills/code/SKILL.md +68 -8
- package/skills/debug/SKILL.md +72 -10
- package/skills/design-spec/SKILL.md +450 -0
- package/skills/design-spec/SKILL.tmpl +95 -0
- package/skills/discovery/SKILL.md +62 -4
- package/skills/prd/SKILL.md +12 -8
- package/skills/setup-ai-first/SKILL.md +5 -3
- package/skills/spec/SKILL.md +11 -7
- package/skills/test/SKILL.md +130 -12
- package/steps/context-loader.md +57 -1
- package/steps/gate.md +1 -1
- package/steps/report-footer.md +5 -3
- package/steps/spawn-agent.md +3 -1
- package/templates/design-spec.template.md +209 -0
- package/templates/project-context.yaml +29 -0
|
@@ -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 |
|
|
@@ -48,6 +48,9 @@ paths:
|
|
|
48
48
|
# Tech Docs
|
|
49
49
|
tech_docs_dir: "tech-docs"
|
|
50
50
|
|
|
51
|
+
# Design Specs (FE/App platforms only — web, app)
|
|
52
|
+
design_spec_dir: "specs/design-spec"
|
|
53
|
+
|
|
51
54
|
# Trace
|
|
52
55
|
trace_dir: ".trace"
|
|
53
56
|
|
|
@@ -69,6 +72,32 @@ domains:
|
|
|
69
72
|
- "{{DOMAIN_1}}"
|
|
70
73
|
# - "{{DOMAIN_2}}"
|
|
71
74
|
|
|
75
|
+
# ----- Multi-Service / Umbrella Setup -----
|
|
76
|
+
# Fill this section ONLY if this is an UMBRELLA repo that contains multiple
|
|
77
|
+
# service submodules. Leave commented out for single-service projects.
|
|
78
|
+
#
|
|
79
|
+
# setup:
|
|
80
|
+
# mode: umbrella # "umbrella" | "single" (default: single)
|
|
81
|
+
# spec_source: "{{SPEC_SUBMODULE_PATH}}" # path to PO spec submodule, e.g. "free-trial-specs"
|
|
82
|
+
#
|
|
83
|
+
# When spec_source is set, context-loader auto-derives:
|
|
84
|
+
# prd_dir → {spec_source}/specs/prd
|
|
85
|
+
# design_spec_dir → {spec_source}/specs/design-spec
|
|
86
|
+
# domain_knowledge_dir → {spec_source}/specs/domain-knowledge
|
|
87
|
+
# (You can still override these manually in paths: section below.)
|
|
88
|
+
#
|
|
89
|
+
# services: # domain → service submodule routing
|
|
90
|
+
# {{DOMAIN_1}}: # must match @trace.domain in PRD files
|
|
91
|
+
# path: "{{SERVICE_SUBMODULE_DIR}}" # relative path to service submodule
|
|
92
|
+
# module: "{{STACK_MODULE}}" # e.g., java-spring, nextjs, flutter
|
|
93
|
+
# specs_dir: "{{SERVICE_SUBMODULE_DIR}}/specs/bdd"
|
|
94
|
+
# tech_docs_dir: "{{SERVICE_SUBMODULE_DIR}}/specs/tech-docs"
|
|
95
|
+
# {{DOMAIN_2}}:
|
|
96
|
+
# path: "{{SERVICE_2_DIR}}"
|
|
97
|
+
# module: "{{STACK_MODULE}}"
|
|
98
|
+
# specs_dir: "{{SERVICE_2_DIR}}/specs/bdd"
|
|
99
|
+
# tech_docs_dir: "{{SERVICE_2_DIR}}/specs/tech-docs"
|
|
100
|
+
|
|
72
101
|
# ----- Architecture -----
|
|
73
102
|
architecture:
|
|
74
103
|
style: "{{ARCH_STYLE}}" # e.g., Layered / Clean / Hexagonal
|
package/package.json
CHANGED
package/skills/code/SKILL.md
CHANGED
|
@@ -43,7 +43,7 @@ Display and wait for response:
|
|
|
43
43
|
```
|
|
44
44
|
⚙️ MODEL CHECK
|
|
45
45
|
──────────────────────────────────────────────────────────────────
|
|
46
|
-
Recommended : claude-opus-4
|
|
46
|
+
Recommended : claude-opus-4 (or latest Opus model)
|
|
47
47
|
Why needed : Spec analysis, architecture review, code generation
|
|
48
48
|
require deep reasoning. Smaller models miss edge cases.
|
|
49
49
|
|
|
@@ -158,6 +158,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
158
158
|
- `paths.core_entities` → path to core-entities.md
|
|
159
159
|
- `paths.tech_docs_dir` → technical documentation root
|
|
160
160
|
- `paths.trace_dir` → trace state directory
|
|
161
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
161
162
|
|
|
162
163
|
If `paths` section is absent, use these defaults:
|
|
163
164
|
- `specs_dir` = `specs/bdd`
|
|
@@ -167,13 +168,46 @@ If `paths` section is absent, use these defaults:
|
|
|
167
168
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
168
169
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
169
170
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
170
|
-
- `tech_docs_dir` = `tech-docs`
|
|
171
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
171
172
|
- `trace_dir` = `.trace`
|
|
173
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
172
174
|
|
|
173
175
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
174
176
|
|
|
175
177
|
---
|
|
176
178
|
|
|
179
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
180
|
+
|
|
181
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
182
|
+
|
|
183
|
+
If `services` section is present:
|
|
184
|
+
|
|
185
|
+
**1. Detect active domain** (in priority order):
|
|
186
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
187
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
188
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
189
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
190
|
+
|
|
191
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
192
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
193
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
194
|
+
- Store `active_service` = `services.{domain}.path`
|
|
195
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
196
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
197
|
+
|
|
198
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
199
|
+
- Keep default paths from Step 1
|
|
200
|
+
- Set `active_service = unresolved`
|
|
201
|
+
|
|
202
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
203
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
204
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
205
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
206
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
207
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
177
211
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
178
212
|
|
|
179
213
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -244,6 +278,26 @@ If the file does not exist → skip silently.
|
|
|
244
278
|
|
|
245
279
|
---
|
|
246
280
|
|
|
281
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
282
|
+
|
|
283
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
| `platform_type` | Modules |
|
|
290
|
+
|---|---|
|
|
291
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
292
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
293
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
294
|
+
|
|
295
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
296
|
+
|
|
297
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
247
301
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
248
302
|
|
|
249
303
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -254,10 +308,12 @@ Output exactly this block:
|
|
|
254
308
|
```
|
|
255
309
|
[CTX LOADED]
|
|
256
310
|
Stack : {language} / {framework} / {database}
|
|
311
|
+
Platform : {active_module} ({platform_type})
|
|
257
312
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
258
313
|
Ticket : {ticket_prefix}-
|
|
259
314
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
260
315
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
316
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
261
317
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
262
318
|
```
|
|
263
319
|
|
|
@@ -387,21 +443,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
387
443
|
|
|
388
444
|
| Current command | Suggest next |
|
|
389
445
|
|-------------------------|-----------------------------------------------|
|
|
446
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
390
447
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
391
448
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
392
449
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
393
|
-
| /review-context (PRD) | `/generate-
|
|
450
|
+
| /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 |
|
|
451
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
394
452
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
395
453
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
396
454
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
397
455
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
398
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
456
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
399
457
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
400
458
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
401
459
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
402
460
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
403
461
|
| /smoke-test | Create PR and link to ticket |
|
|
404
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
462
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
405
463
|
| /fix-bug | Create PR and link to ticket |
|
|
406
464
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
407
465
|
|
|
@@ -498,21 +556,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
498
556
|
|
|
499
557
|
| Current command | Suggest next |
|
|
500
558
|
|-------------------------|-----------------------------------------------|
|
|
559
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
501
560
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
502
561
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
503
562
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
504
|
-
| /review-context (PRD) | `/generate-
|
|
563
|
+
| /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 |
|
|
564
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
505
565
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
506
566
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
507
567
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
508
568
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
509
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
569
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
510
570
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
511
571
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
512
572
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
513
573
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
514
574
|
| /smoke-test | Create PR and link to ticket |
|
|
515
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
575
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
516
576
|
| /fix-bug | Create PR and link to ticket |
|
|
517
577
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
518
578
|
|
package/skills/debug/SKILL.md
CHANGED
|
@@ -73,6 +73,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
73
73
|
- `paths.core_entities` → path to core-entities.md
|
|
74
74
|
- `paths.tech_docs_dir` → technical documentation root
|
|
75
75
|
- `paths.trace_dir` → trace state directory
|
|
76
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
76
77
|
|
|
77
78
|
If `paths` section is absent, use these defaults:
|
|
78
79
|
- `specs_dir` = `specs/bdd`
|
|
@@ -82,13 +83,46 @@ If `paths` section is absent, use these defaults:
|
|
|
82
83
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
83
84
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
84
85
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
85
|
-
- `tech_docs_dir` = `tech-docs`
|
|
86
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
86
87
|
- `trace_dir` = `.trace`
|
|
88
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
87
89
|
|
|
88
90
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
89
91
|
|
|
90
92
|
---
|
|
91
93
|
|
|
94
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
95
|
+
|
|
96
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
97
|
+
|
|
98
|
+
If `services` section is present:
|
|
99
|
+
|
|
100
|
+
**1. Detect active domain** (in priority order):
|
|
101
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
102
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
103
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
104
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
105
|
+
|
|
106
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
107
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
108
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
109
|
+
- Store `active_service` = `services.{domain}.path`
|
|
110
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
111
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
112
|
+
|
|
113
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
114
|
+
- Keep default paths from Step 1
|
|
115
|
+
- Set `active_service = unresolved`
|
|
116
|
+
|
|
117
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
118
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
119
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
120
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
121
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
122
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
92
126
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
93
127
|
|
|
94
128
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -159,6 +193,26 @@ If the file does not exist → skip silently.
|
|
|
159
193
|
|
|
160
194
|
---
|
|
161
195
|
|
|
196
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
197
|
+
|
|
198
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
| `platform_type` | Modules |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
207
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
208
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
209
|
+
|
|
210
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
211
|
+
|
|
212
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
162
216
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
163
217
|
|
|
164
218
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -169,10 +223,12 @@ Output exactly this block:
|
|
|
169
223
|
```
|
|
170
224
|
[CTX LOADED]
|
|
171
225
|
Stack : {language} / {framework} / {database}
|
|
226
|
+
Platform : {active_module} ({platform_type})
|
|
172
227
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
173
228
|
Ticket : {ticket_prefix}-
|
|
174
229
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
175
230
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
231
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
176
232
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
177
233
|
```
|
|
178
234
|
|
|
@@ -325,21 +381,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
325
381
|
|
|
326
382
|
| Current command | Suggest next |
|
|
327
383
|
|-------------------------|-----------------------------------------------|
|
|
384
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
328
385
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
329
386
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
330
387
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
331
|
-
| /review-context (PRD) | `/generate-
|
|
388
|
+
| /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 |
|
|
389
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
332
390
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
333
391
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
334
392
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
335
393
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
336
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
394
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
337
395
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
338
396
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
339
397
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
340
398
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
341
399
|
| /smoke-test | Create PR and link to ticket |
|
|
342
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
400
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
343
401
|
| /fix-bug | Create PR and link to ticket |
|
|
344
402
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
345
403
|
|
|
@@ -462,21 +520,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
462
520
|
|
|
463
521
|
| Current command | Suggest next |
|
|
464
522
|
|-------------------------|-----------------------------------------------|
|
|
523
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
465
524
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
466
525
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
467
526
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
468
|
-
| /review-context (PRD) | `/generate-
|
|
527
|
+
| /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 |
|
|
528
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
469
529
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
470
530
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
471
531
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
472
532
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
473
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
533
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
474
534
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
475
535
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
476
536
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
477
537
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
478
538
|
| /smoke-test | Create PR and link to ticket |
|
|
479
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
539
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
480
540
|
| /fix-bug | Create PR and link to ticket |
|
|
481
541
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
482
542
|
|
|
@@ -556,21 +616,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
556
616
|
|
|
557
617
|
| Current command | Suggest next |
|
|
558
618
|
|-------------------------|-----------------------------------------------|
|
|
619
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
559
620
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
560
621
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
561
622
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
562
|
-
| /review-context (PRD) | `/generate-
|
|
623
|
+
| /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 |
|
|
624
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
563
625
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
564
626
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
565
627
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
566
628
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
567
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
629
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
568
630
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
569
631
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
570
632
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
571
633
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
572
634
|
| /smoke-test | Create PR and link to ticket |
|
|
573
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
635
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
574
636
|
| /fix-bug | Create PR and link to ticket |
|
|
575
637
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
576
638
|
|