@anhth2/spec-driven-dev-plugin 0.9.2 → 0.11.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/commands/debug.md +50 -20
- package/commands/define-product.md +49 -19
- package/commands/{generate-tests.md → dev-gen-test.md} +85 -23
- package/commands/{generate-tests.tmpl → dev-gen-test.tmpl} +18 -4
- package/{core/commands/run-tests.md → commands/dev-run-test.md} +102 -21
- package/commands/{run-tests.tmpl → dev-run-test.tmpl} +35 -2
- package/commands/{smoke-test.md → dev-smoke-test.md} +54 -24
- package/commands/{smoke-test.tmpl → dev-smoke-test.tmpl} +5 -5
- package/commands/fix-bug.md +50 -20
- package/commands/generate-bdd.md +78 -21
- package/commands/generate-bdd.tmpl +11 -2
- package/commands/generate-code.md +123 -23
- package/commands/generate-code.tmpl +56 -4
- package/commands/generate-design-spec.md +142 -47
- package/commands/generate-design-spec.tmpl +93 -28
- package/commands/generate-prd.md +49 -19
- package/commands/generate-spec-manifest.md +49 -19
- package/commands/generate-tech-docs.md +50 -20
- package/commands/generate-tech-docs.tmpl +1 -1
- package/commands/learn.md +50 -20
- package/commands/propose-scenario.md +50 -20
- package/commands/propose-scenario.tmpl +1 -1
- package/commands/qc-analyze.md +514 -0
- package/commands/qc-analyze.tmpl +71 -0
- package/commands/qc-design-test.md +510 -0
- package/commands/qc-design-test.tmpl +67 -0
- package/commands/qc-plan.md +492 -0
- package/commands/qc-plan.tmpl +49 -0
- package/commands/qc-report.md +491 -0
- package/commands/qc-report.tmpl +48 -0
- package/commands/qc-review.md +496 -0
- package/commands/qc-review.tmpl +53 -0
- package/commands/qc-run-test.md +538 -0
- package/commands/qc-run-test.tmpl +77 -0
- package/commands/refine-prd.md +203 -24
- package/commands/refine-prd.tmpl +16 -5
- package/commands/report-bug.md +49 -19
- package/commands/review-code.md +51 -21
- package/commands/review-code.tmpl +1 -1
- package/commands/review-context.md +198 -20
- package/commands/review-context.tmpl +11 -1
- package/commands/review-tech-docs.md +49 -19
- package/commands/setup-ai-first.md +14 -7
- package/commands/sync.md +30 -20
- package/commands/sync.tmpl +16 -13
- package/commands/update-framework.md +14 -7
- package/commands/validate-traces.md +106 -45
- package/commands/validate-traces.tmpl +57 -26
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +50 -20
- package/core/commands/define-product.md +49 -19
- package/core/commands/{generate-tests.md → dev-gen-test.md} +85 -23
- package/{commands/run-tests.md → core/commands/dev-run-test.md} +102 -21
- package/core/commands/{smoke-test.md → dev-smoke-test.md} +54 -24
- package/core/commands/fix-bug.md +50 -20
- package/core/commands/generate-bdd.md +78 -21
- package/core/commands/generate-code.md +123 -23
- package/core/commands/generate-design-spec.md +142 -47
- package/core/commands/generate-prd.md +49 -19
- package/core/commands/generate-spec-manifest.md +49 -19
- package/core/commands/generate-tech-docs.md +50 -20
- package/core/commands/learn.md +50 -20
- package/core/commands/propose-scenario.md +50 -20
- package/core/commands/qc-analyze.md +514 -0
- package/core/commands/qc-design-test.md +510 -0
- package/core/commands/qc-plan.md +492 -0
- package/core/commands/qc-report.md +491 -0
- package/core/commands/qc-review.md +496 -0
- package/core/commands/qc-run-test.md +538 -0
- package/core/commands/refine-prd.md +203 -24
- package/core/commands/report-bug.md +49 -19
- package/core/commands/review-code.md +51 -21
- package/core/commands/review-context.md +198 -20
- package/core/commands/review-tech-docs.md +49 -19
- package/core/commands/setup-ai-first.md +14 -7
- package/core/commands/sync.md +30 -20
- package/core/commands/update-framework.md +14 -7
- package/core/commands/validate-traces.md +106 -45
- package/core/modules/qc-playwright/stack-profile.yaml +65 -0
- package/core/skills/code/SKILL.md +63 -26
- package/core/skills/debug/SKILL.md +78 -34
- package/core/skills/design-spec/SKILL.md +49 -19
- package/core/skills/discovery/SKILL.md +49 -19
- package/core/skills/prd/SKILL.md +28 -14
- package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/core/skills/qc/qa-analyst/acceptance-criteria.md +56 -0
- package/core/skills/qc/qa-analyst/business-rules.md +55 -0
- package/core/skills/qc/qa-analyst/data-flow.md +60 -0
- package/core/skills/qc/qa-analyst/spec-breakdown.md +57 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/core/skills/qc/qa-designer/functional/api.md +45 -0
- package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/core/skills/qc/qa-designer/integration/api.md +42 -0
- package/core/skills/qc/qa-designer/integration/db.md +39 -0
- package/core/skills/qc/qa-designer/integration/gui.md +40 -0
- package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/core/skills/qc/qa-designer/non-functional.md +40 -0
- package/core/skills/qc/qa-planner/test-plan.md +120 -0
- package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/core/skills/qc/qa-runner/e2e.md +49 -0
- package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/core/skills/qc/qa-runner/functional/api.md +35 -0
- package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/core/skills/qc/qa-runner/integration.md +47 -0
- package/core/skills/qc/qa-runner/non-functional.md +49 -0
- package/core/skills/qc/qa-runner/report/report.md +37 -0
- package/core/skills/setup-ai-first/SKILL.md +14 -7
- package/core/skills/spec/SKILL.md +28 -14
- package/core/skills/test/SKILL.md +121 -54
- package/core/steps/capture-lesson.md +1 -1
- package/core/steps/context-loader.md +35 -12
- package/core/steps/report-footer.md +14 -7
- package/core/steps/review-fanout.md +138 -0
- package/core/steps/spawn-agent.md +1 -1
- package/core/steps/trace-mirror.md +18 -0
- package/core/templates/design-spec.template.md +16 -8
- package/core/templates/project-context.yaml +8 -0
- package/docs/01-getting-started/README.md +19 -0
- package/docs/01-getting-started/core-concepts.md +102 -0
- package/docs/01-getting-started/installation.md +154 -0
- package/docs/01-getting-started/quickstart.md +85 -0
- package/docs/02-guides/README.md +27 -0
- package/docs/02-guides/developer/README.md +46 -0
- package/docs/02-guides/developer/bdd-and-trace.md +123 -0
- package/docs/02-guides/developer/commands.md +76 -0
- package/docs/02-guides/developer/pr-checklist.md +15 -0
- package/docs/02-guides/developer/scenarios.md +448 -0
- package/docs/02-guides/developer/workflow.md +59 -0
- package/docs/02-guides/product-owner/README.md +77 -0
- package/docs/02-guides/product-owner/commands.md +30 -0
- package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
- package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
- package/docs/02-guides/product-owner/scenarios.md +357 -0
- package/docs/02-guides/qc-automation.md +92 -0
- package/docs/02-guides/tester/README.md +72 -0
- package/docs/02-guides/tester/bug-reporting.md +117 -0
- package/docs/02-guides/tester/reading-specs.md +79 -0
- package/docs/02-guides/tester/scenarios.md +186 -0
- package/docs/02-guides/tester/spec-manifest.md +124 -0
- package/docs/02-guides/tester/test-checklist.md +31 -0
- package/docs/02-guides/tester/workflow.md +79 -0
- package/docs/03-concepts/README.md +19 -0
- package/docs/03-concepts/architecture.md +243 -0
- package/docs/03-concepts/pipeline.md +249 -0
- package/docs/03-concepts/traceability.md +148 -0
- package/docs/04-operations/README.md +33 -0
- package/docs/04-operations/bug-flow.md +321 -0
- package/docs/04-operations/publishing.md +137 -0
- package/docs/04-operations/sync-and-update.md +328 -0
- package/docs/05-reference/README.md +29 -0
- package/docs/05-reference/commands.md +229 -0
- package/docs/05-reference/modules.md +110 -0
- package/docs/05-reference/trace-schema.md +146 -0
- package/docs/README.md +51 -0
- package/modules/qc-playwright/stack-profile.yaml +65 -0
- package/package.json +2 -2
- package/skills/code/SKILL.md +63 -26
- package/skills/debug/SKILL.md +78 -34
- package/skills/debug/SKILL.tmpl +1 -1
- package/skills/design-spec/SKILL.md +49 -19
- package/skills/discovery/SKILL.md +49 -19
- package/skills/prd/SKILL.md +28 -14
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/skills/qc/qa-analyst/acceptance-criteria.md +56 -0
- package/skills/qc/qa-analyst/business-rules.md +55 -0
- package/skills/qc/qa-analyst/data-flow.md +60 -0
- package/skills/qc/qa-analyst/spec-breakdown.md +57 -0
- package/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/skills/qc/qa-designer/functional/api.md +45 -0
- package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/skills/qc/qa-designer/integration/api.md +42 -0
- package/skills/qc/qa-designer/integration/db.md +39 -0
- package/skills/qc/qa-designer/integration/gui.md +40 -0
- package/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/skills/qc/qa-designer/non-functional.md +40 -0
- package/skills/qc/qa-planner/test-plan.md +120 -0
- package/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/skills/qc/qa-runner/e2e.md +49 -0
- package/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/skills/qc/qa-runner/functional/api.md +35 -0
- package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/skills/qc/qa-runner/integration.md +47 -0
- package/skills/qc/qa-runner/non-functional.md +49 -0
- package/skills/qc/qa-runner/report/report.md +37 -0
- package/skills/setup-ai-first/SKILL.md +14 -7
- package/skills/spec/SKILL.md +28 -14
- package/skills/test/SKILL.md +121 -54
- package/skills/test/SKILL.tmpl +9 -9
- package/steps/capture-lesson.md +1 -1
- package/steps/context-loader.md +35 -12
- package/steps/report-footer.md +14 -7
- package/steps/review-fanout.md +138 -0
- package/steps/spawn-agent.md +1 -1
- package/steps/trace-mirror.md +18 -0
- package/templates/design-spec.template.md +16 -8
- package/templates/project-context.yaml +8 -0
- package/ARCHITECTURE.md +0 -247
package/commands/generate-prd.md
CHANGED
|
@@ -163,7 +163,7 @@ If `services` section is present:
|
|
|
163
163
|
|
|
164
164
|
**2. Route to service** — if active domain matches a key in `services`:
|
|
165
165
|
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
166
|
-
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
166
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
|
|
167
167
|
- Store `active_service` = `services.{domain}.path`
|
|
168
168
|
- Store `active_service_module` = `services.{domain}.module`
|
|
169
169
|
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
@@ -175,7 +175,7 @@ If `services` section is present:
|
|
|
175
175
|
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
176
176
|
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
177
177
|
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
178
|
-
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **
|
|
178
|
+
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
|
|
179
179
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
180
180
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
181
181
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
@@ -206,7 +206,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
|
|
|
206
206
|
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
207
207
|
|
|
208
208
|
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
209
|
-
- Shell commands (`/run-
|
|
209
|
+
- Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
|
|
210
210
|
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
211
211
|
|
|
212
212
|
**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).
|
|
@@ -221,19 +221,41 @@ If the file does not exist → skip silently.
|
|
|
221
221
|
|
|
222
222
|
---
|
|
223
223
|
|
|
224
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
224
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
225
225
|
|
|
226
226
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
227
227
|
|
|
228
|
-
|
|
228
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
229
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
230
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
231
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
232
|
+
|
|
233
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
234
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
235
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
236
|
+
single-service mode) the project's only architecture + coding standards.
|
|
237
|
+
|
|
238
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
239
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
240
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
241
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
242
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
243
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
244
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
245
|
+
|
|
246
|
+
From the **merged** result, extract and store:
|
|
229
247
|
|
|
230
248
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
231
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
232
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
233
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
234
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
249
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
250
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
251
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
252
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
235
253
|
|
|
236
|
-
|
|
254
|
+
**Resolution rules:**
|
|
255
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
256
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
257
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
258
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
237
259
|
|
|
238
260
|
---
|
|
239
261
|
|
|
@@ -299,7 +321,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
|
299
321
|
|
|
300
322
|
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
301
323
|
|
|
302
|
-
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (
|
|
324
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
|
|
303
325
|
|
|
304
326
|
---
|
|
305
327
|
|
|
@@ -333,7 +355,8 @@ Output exactly this block:
|
|
|
333
355
|
[CTX LOADED]
|
|
334
356
|
Stack : {language} / {framework} / {database}
|
|
335
357
|
Platform : {active_module} ({platform_type})
|
|
336
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
358
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
359
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
337
360
|
Ticket : {ticket_prefix}-
|
|
338
361
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
339
362
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -630,15 +653,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
630
653
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
631
654
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
632
655
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
656
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
657
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
658
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
659
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
660
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
661
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
662
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
633
663
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
634
664
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
635
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
636
|
-
| /
|
|
637
|
-
| /run-
|
|
638
|
-
| /run-
|
|
639
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
640
|
-
| /smoke-test | Create PR and link to ticket |
|
|
641
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
665
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
666
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
667
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
668
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
669
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
670
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
671
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
642
672
|
| /fix-bug | Create PR and link to ticket |
|
|
643
673
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
644
674
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
@@ -168,7 +168,7 @@ If `services` section is present:
|
|
|
168
168
|
|
|
169
169
|
**2. Route to service** — if active domain matches a key in `services`:
|
|
170
170
|
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
171
|
-
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
171
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
|
|
172
172
|
- Store `active_service` = `services.{domain}.path`
|
|
173
173
|
- Store `active_service_module` = `services.{domain}.module`
|
|
174
174
|
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
@@ -180,7 +180,7 @@ If `services` section is present:
|
|
|
180
180
|
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
181
181
|
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
182
182
|
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
183
|
-
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **
|
|
183
|
+
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
|
|
184
184
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
185
185
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
186
186
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
@@ -211,7 +211,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
|
|
|
211
211
|
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
212
212
|
|
|
213
213
|
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
214
|
-
- Shell commands (`/run-
|
|
214
|
+
- Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
|
|
215
215
|
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
216
216
|
|
|
217
217
|
**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).
|
|
@@ -226,19 +226,41 @@ If the file does not exist → skip silently.
|
|
|
226
226
|
|
|
227
227
|
---
|
|
228
228
|
|
|
229
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
229
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
230
230
|
|
|
231
231
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
232
232
|
|
|
233
|
-
|
|
233
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
234
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
235
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
236
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
237
|
+
|
|
238
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
239
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
240
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
241
|
+
single-service mode) the project's only architecture + coding standards.
|
|
242
|
+
|
|
243
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
244
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
245
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
246
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
247
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
248
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
249
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
250
|
+
|
|
251
|
+
From the **merged** result, extract and store:
|
|
234
252
|
|
|
235
253
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
236
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
237
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
238
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
239
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
254
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
255
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
256
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
257
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
240
258
|
|
|
241
|
-
|
|
259
|
+
**Resolution rules:**
|
|
260
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
261
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
262
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
263
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
242
264
|
|
|
243
265
|
---
|
|
244
266
|
|
|
@@ -304,7 +326,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
|
304
326
|
|
|
305
327
|
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
306
328
|
|
|
307
|
-
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (
|
|
329
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
|
|
308
330
|
|
|
309
331
|
---
|
|
310
332
|
|
|
@@ -338,7 +360,8 @@ Output exactly this block:
|
|
|
338
360
|
[CTX LOADED]
|
|
339
361
|
Stack : {language} / {framework} / {database}
|
|
340
362
|
Platform : {active_module} ({platform_type})
|
|
341
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
363
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
364
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
342
365
|
Ticket : {ticket_prefix}-
|
|
343
366
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
344
367
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -527,15 +550,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
527
550
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
528
551
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
529
552
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
553
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
554
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
555
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
556
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
557
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
558
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
559
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
530
560
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
531
561
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
532
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
533
|
-
| /
|
|
534
|
-
| /run-
|
|
535
|
-
| /run-
|
|
536
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
537
|
-
| /smoke-test | Create PR and link to ticket |
|
|
538
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
562
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
563
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
564
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
565
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
566
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
567
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
568
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
539
569
|
| /fix-bug | Create PR and link to ticket |
|
|
540
570
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
541
571
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
@@ -184,7 +184,7 @@ If `services` section is present:
|
|
|
184
184
|
|
|
185
185
|
**2. Route to service** — if active domain matches a key in `services`:
|
|
186
186
|
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
187
|
-
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
187
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
|
|
188
188
|
- Store `active_service` = `services.{domain}.path`
|
|
189
189
|
- Store `active_service_module` = `services.{domain}.module`
|
|
190
190
|
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
@@ -196,7 +196,7 @@ If `services` section is present:
|
|
|
196
196
|
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
197
197
|
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
198
198
|
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
199
|
-
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **
|
|
199
|
+
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
|
|
200
200
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
201
201
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
202
202
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
@@ -227,7 +227,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
|
|
|
227
227
|
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
228
228
|
|
|
229
229
|
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
230
|
-
- Shell commands (`/run-
|
|
230
|
+
- Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
|
|
231
231
|
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
232
232
|
|
|
233
233
|
**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).
|
|
@@ -242,19 +242,41 @@ If the file does not exist → skip silently.
|
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
245
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
246
246
|
|
|
247
247
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
248
248
|
|
|
249
|
-
|
|
249
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
250
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
251
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
252
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
253
|
+
|
|
254
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
255
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
256
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
257
|
+
single-service mode) the project's only architecture + coding standards.
|
|
258
|
+
|
|
259
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
260
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
261
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
262
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
263
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
264
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
265
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
266
|
+
|
|
267
|
+
From the **merged** result, extract and store:
|
|
250
268
|
|
|
251
269
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
252
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
253
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
254
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
255
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
270
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
271
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
272
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
273
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
256
274
|
|
|
257
|
-
|
|
275
|
+
**Resolution rules:**
|
|
276
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
277
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
278
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
279
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
258
280
|
|
|
259
281
|
---
|
|
260
282
|
|
|
@@ -320,7 +342,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
|
320
342
|
|
|
321
343
|
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
322
344
|
|
|
323
|
-
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (
|
|
345
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
|
|
324
346
|
|
|
325
347
|
---
|
|
326
348
|
|
|
@@ -354,7 +376,8 @@ Output exactly this block:
|
|
|
354
376
|
[CTX LOADED]
|
|
355
377
|
Stack : {language} / {framework} / {database}
|
|
356
378
|
Platform : {active_module} ({platform_type})
|
|
357
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
379
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
380
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
358
381
|
Ticket : {ticket_prefix}-
|
|
359
382
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
360
383
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -518,7 +541,7 @@ cd -
|
|
|
518
541
|
git add {spec_source} && git commit -m "chore: bump spec pointer ({UC-ID} tech design)"
|
|
519
542
|
```
|
|
520
543
|
|
|
521
|
-
If `tech_docs_dir` is **local** (single-
|
|
544
|
+
If `tech_docs_dir` is **local** — i.e. no `setup.spec_source` (single-repo, or a pure multi-service BE repo with no shared spec module) — skip this; no cross-repo publish needed. Whenever `spec_source` is set, tech-docs route to the spec submodule and this publish step applies.
|
|
522
545
|
|
|
523
546
|
## Output
|
|
524
547
|
|
|
@@ -558,15 +581,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
558
581
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
559
582
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
560
583
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
584
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
585
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
586
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
587
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
588
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
589
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
590
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
561
591
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
562
592
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
563
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
564
|
-
| /
|
|
565
|
-
| /run-
|
|
566
|
-
| /run-
|
|
567
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
568
|
-
| /smoke-test | Create PR and link to ticket |
|
|
569
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
593
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
594
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
595
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
596
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
597
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
598
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
599
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
570
600
|
| /fix-bug | Create PR and link to ticket |
|
|
571
601
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
572
602
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
@@ -165,7 +165,7 @@ cd -
|
|
|
165
165
|
git add {spec_source} && git commit -m "chore: bump spec pointer ({UC-ID} tech design)"
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
-
If `tech_docs_dir` is **local** (single-
|
|
168
|
+
If `tech_docs_dir` is **local** — i.e. no `setup.spec_source` (single-repo, or a pure multi-service BE repo with no shared spec module) — skip this; no cross-repo publish needed. Whenever `spec_source` is set, tech-docs route to the spec submodule and this publish step applies.
|
|
169
169
|
|
|
170
170
|
## Output
|
|
171
171
|
|
package/commands/learn.md
CHANGED
|
@@ -172,7 +172,7 @@ If `services` section is present:
|
|
|
172
172
|
|
|
173
173
|
**2. Route to service** — if active domain matches a key in `services`:
|
|
174
174
|
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
175
|
-
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
175
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir` — **only if `setup.spec_source` is NOT set.** When `spec_source` IS set, the tech-design (API contract) is a cross-team artifact and must live in the shared spec repo (handled in step 4), so leave `tech_docs_dir` for step 4 to route — do NOT pin it per-service here.
|
|
176
176
|
- Store `active_service` = `services.{domain}.path`
|
|
177
177
|
- Store `active_service_module` = `services.{domain}.module`
|
|
178
178
|
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
@@ -184,7 +184,7 @@ If `services` section is present:
|
|
|
184
184
|
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
185
185
|
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
186
186
|
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
187
|
-
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **
|
|
187
|
+
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **always when `spec_source` is set** (step 2 no longer pins tech-docs per-service in this case). The tech-design IS the cross-team API contract: BE authors it here, and FE/App read it from the same spec submodule at `/generate-code --phase=integration`. *(Per-service tech-docs only happen when there is no `spec_source` — a pure multi-service BE repo with no shared spec module.)*
|
|
188
188
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
189
189
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
190
190
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
@@ -215,7 +215,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
|
|
|
215
215
|
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
216
216
|
|
|
217
217
|
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
218
|
-
- Shell commands (`/run-
|
|
218
|
+
- Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
|
|
219
219
|
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
220
220
|
|
|
221
221
|
**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).
|
|
@@ -230,19 +230,41 @@ If the file does not exist → skip silently.
|
|
|
230
230
|
|
|
231
231
|
---
|
|
232
232
|
|
|
233
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
233
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
234
234
|
|
|
235
235
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
236
236
|
|
|
237
|
-
|
|
237
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
238
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
239
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
240
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
241
|
+
|
|
242
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
243
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
244
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
245
|
+
single-service mode) the project's only architecture + coding standards.
|
|
246
|
+
|
|
247
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
248
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
249
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
250
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
251
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
252
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
253
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
254
|
+
|
|
255
|
+
From the **merged** result, extract and store:
|
|
238
256
|
|
|
239
257
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
240
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
241
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
242
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
243
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
258
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
259
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
260
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
261
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
244
262
|
|
|
245
|
-
|
|
263
|
+
**Resolution rules:**
|
|
264
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
265
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
266
|
+
- If `service_root` is set but `{service_root}/CLAUDE.md` is **missing** → fall back to root CLAUDE.md and flag ⚠️ in the Step 7 recap (the service has no architecture/coding-standards definition — code generation will use umbrella defaults, which may be the wrong stack).
|
|
267
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
246
268
|
|
|
247
269
|
---
|
|
248
270
|
|
|
@@ -308,7 +330,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
|
308
330
|
|
|
309
331
|
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
310
332
|
|
|
311
|
-
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (
|
|
333
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (dev-gen-test, debug, fix-bug, dev-smoke-test).
|
|
312
334
|
|
|
313
335
|
---
|
|
314
336
|
|
|
@@ -342,7 +364,8 @@ Output exactly this block:
|
|
|
342
364
|
[CTX LOADED]
|
|
343
365
|
Stack : {language} / {framework} / {database}
|
|
344
366
|
Platform : {active_module} ({platform_type})
|
|
345
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
367
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
368
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
346
369
|
Ticket : {ticket_prefix}-
|
|
347
370
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
348
371
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -446,7 +469,7 @@ If `lessons_path` does not exist, create it with this header first:
|
|
|
446
469
|
| code-gen | /generate-code output |
|
|
447
470
|
| bdd | /generate-bdd output |
|
|
448
471
|
| tech-docs | /generate-tech-docs output |
|
|
449
|
-
| tests | /
|
|
472
|
+
| tests | /dev-gen-test output |
|
|
450
473
|
| prd | /generate-prd, /refine-prd output |
|
|
451
474
|
| general | every command |
|
|
452
475
|
|
|
@@ -511,15 +534,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
511
534
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
512
535
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
513
536
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
537
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
538
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
539
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
540
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
541
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
542
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
543
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
514
544
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
515
545
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
516
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
517
|
-
| /
|
|
518
|
-
| /run-
|
|
519
|
-
| /run-
|
|
520
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
521
|
-
| /smoke-test | Create PR and link to ticket |
|
|
522
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
546
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
547
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
548
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
549
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
550
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
551
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
552
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
523
553
|
| /fix-bug | Create PR and link to ticket |
|
|
524
554
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
525
555
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|