@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
|
@@ -165,7 +165,7 @@ If `services` section is present:
|
|
|
165
165
|
|
|
166
166
|
**2. Route to service** — if active domain matches a key in `services`:
|
|
167
167
|
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
168
|
-
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
168
|
+
- 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.
|
|
169
169
|
- Store `active_service` = `services.{domain}.path`
|
|
170
170
|
- Store `active_service_module` = `services.{domain}.module`
|
|
171
171
|
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
@@ -177,7 +177,7 @@ If `services` section is present:
|
|
|
177
177
|
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
178
178
|
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
179
179
|
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
180
|
-
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **
|
|
180
|
+
- 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.)*
|
|
181
181
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
182
182
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
183
183
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
@@ -208,7 +208,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
|
|
|
208
208
|
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
209
209
|
|
|
210
210
|
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
211
|
-
- Shell commands (`/run-
|
|
211
|
+
- Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
|
|
212
212
|
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
213
213
|
|
|
214
214
|
**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).
|
|
@@ -223,19 +223,41 @@ If the file does not exist → skip silently.
|
|
|
223
223
|
|
|
224
224
|
---
|
|
225
225
|
|
|
226
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
226
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
227
227
|
|
|
228
228
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
229
229
|
|
|
230
|
-
|
|
230
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
231
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
232
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
233
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
234
|
+
|
|
235
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
236
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
237
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
238
|
+
single-service mode) the project's only architecture + coding standards.
|
|
239
|
+
|
|
240
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
241
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
242
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
243
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
244
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
245
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
246
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
247
|
+
|
|
248
|
+
From the **merged** result, extract and store:
|
|
231
249
|
|
|
232
250
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
233
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
234
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
235
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
236
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
251
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
252
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
253
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
254
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
237
255
|
|
|
238
|
-
|
|
256
|
+
**Resolution rules:**
|
|
257
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
258
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
259
|
+
- 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).
|
|
260
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
239
261
|
|
|
240
262
|
---
|
|
241
263
|
|
|
@@ -301,7 +323,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
|
301
323
|
|
|
302
324
|
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
303
325
|
|
|
304
|
-
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (
|
|
326
|
+
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).
|
|
305
327
|
|
|
306
328
|
---
|
|
307
329
|
|
|
@@ -335,7 +357,8 @@ Output exactly this block:
|
|
|
335
357
|
[CTX LOADED]
|
|
336
358
|
Stack : {language} / {framework} / {database}
|
|
337
359
|
Platform : {active_module} ({platform_type})
|
|
338
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
360
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
361
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
339
362
|
Ticket : {ticket_prefix}-
|
|
340
363
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
341
364
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -376,8 +399,12 @@ Check whether `services` array exists in `project-context.yaml`.
|
|
|
376
399
|
- Use `services[N].trace_dir` if explicitly set
|
|
377
400
|
- Otherwise default to `{services[N].path}/.trace`
|
|
378
401
|
- Set `all_trace_dirs = [ dir1, dir2, ... ]` — one per service
|
|
379
|
-
- Set `umbrella_root_trace = ".trace"` (at umbrella workspace root)
|
|
380
402
|
- Step 1 will read TSVs from ALL dirs in `all_trace_dirs`, tagged by service name
|
|
403
|
+
- **Resolve the Living Docs home (canonical report location):**
|
|
404
|
+
- If `setup.spec_source` is set → `living_docs_dir = {spec_source}/.living-docs`
|
|
405
|
+
*(the shared specs module — mounted inside every service/umbrella workspace, so the panel resolves it no matter which submodule the dev is standing in)*
|
|
406
|
+
- Else (umbrella without a separate spec repo) → `living_docs_dir = .living-docs` at umbrella root
|
|
407
|
+
- **Resolve the panel mirror:** `panel_mirror = ./.trace` at the **current workspace root** (wherever this command runs). The VS Code panel reads `.trace/trace-report.json` from the open workspace — writing the merged report here is what makes the view non-empty when a dev opens a service submodule directly.
|
|
381
408
|
|
|
382
409
|
**If no `services` key (single-service mode):**
|
|
383
410
|
- Set `all_trace_dirs = [ {paths.trace_dir} ]`
|
|
@@ -440,6 +467,7 @@ If code was generated from an older revision → flag `TECHDOC_DRIFT`.
|
|
|
440
467
|
*Skip this step if no TSV files existed (handled by Step 1 no-TSV path).*
|
|
441
468
|
|
|
442
469
|
For each `.tsv` file processed: write updated `spec_ver`, `status`, `last_updated` back to disk.
|
|
470
|
+
Do **not** modify `dev_selftest`/`dev_selftest_at` (owned by `/dev-run-test`) or `qc_status`/`qc_run_at` (owned by `/qc-run-test`); this command only reads them for the report.
|
|
443
471
|
|
|
444
472
|
### Step 7 — Compute dashboard aggregates
|
|
445
473
|
|
|
@@ -455,6 +483,17 @@ test_coverage = rows where test_count > 0 / total_scs
|
|
|
455
483
|
drift_count = rows where status == DRIFT
|
|
456
484
|
untracked_count = rows where status == UNTRACKED
|
|
457
485
|
gap_count = rows where status == GAP
|
|
486
|
+
dev_selftest_passing = rows where dev_selftest == pass
|
|
487
|
+
dev_selftest_failing = rows where dev_selftest == fail
|
|
488
|
+
dev_selftest_not_run = rows where dev_selftest in (not_run, —)
|
|
489
|
+
# NOTE: dev_selftest is the DEV self-check signal (did the dev run their own smoke tests),
|
|
490
|
+
# NOT official coverage — keep it labeled as such on the dashboard.
|
|
491
|
+
qc_passing = rows where qc_status == pass
|
|
492
|
+
qc_failing = rows where qc_status == fail
|
|
493
|
+
qc_skipped = rows where qc_status == skip
|
|
494
|
+
qc_not_run = rows where qc_status in (not_run, —)
|
|
495
|
+
# qc_status is the OFFICIAL QC automation result (set by /qc-run-test),
|
|
496
|
+
# shown alongside — never merged with — dev_selftest.
|
|
458
497
|
tech_docs_count = count .md files in {paths.tech_docs_dir}/{domain}/
|
|
459
498
|
```
|
|
460
499
|
|
|
@@ -482,6 +521,13 @@ Schema:
|
|
|
482
521
|
"drift_count": 0,
|
|
483
522
|
"gap_count": 0,
|
|
484
523
|
"untracked_count": 0,
|
|
524
|
+
"dev_selftest_passing": 0,
|
|
525
|
+
"dev_selftest_failing": 0,
|
|
526
|
+
"dev_selftest_not_run": 0,
|
|
527
|
+
"qc_passing": 0,
|
|
528
|
+
"qc_failing": 0,
|
|
529
|
+
"qc_skipped": 0,
|
|
530
|
+
"qc_not_run": 0,
|
|
485
531
|
"tech_docs_count": 0
|
|
486
532
|
},
|
|
487
533
|
"prds": [
|
|
@@ -507,6 +553,10 @@ Schema:
|
|
|
507
553
|
"implemented_by": "<ClassName.method or null>",
|
|
508
554
|
"test_count": 0,
|
|
509
555
|
"test_classes": ["<TestClass1>", "<TestClass2>"],
|
|
556
|
+
"dev_selftest": "pass | fail | not_run",
|
|
557
|
+
"dev_selftest_at": "<YYYY-MM-DD or null>",
|
|
558
|
+
"qc_status": "pass | fail | skip | not_run",
|
|
559
|
+
"qc_run_at": "<YYYY-MM-DD or null>",
|
|
510
560
|
"prd_version": "<prd version when BDD was generated>",
|
|
511
561
|
"bdd_version": "<bdd version when code was generated>",
|
|
512
562
|
"tech_doc_revision": 0,
|
|
@@ -533,7 +583,7 @@ Schema:
|
|
|
533
583
|
"sc_id": "<SC-ID>",
|
|
534
584
|
"sc_title": "<title>",
|
|
535
585
|
"implemented_by": "<method>",
|
|
536
|
-
"fix": "/
|
|
586
|
+
"fix": "/dev-gen-test <UC-ID>"
|
|
537
587
|
}
|
|
538
588
|
],
|
|
539
589
|
"untracked": [
|
|
@@ -571,37 +621,40 @@ Schema:
|
|
|
571
621
|
- `tech_doc_revision`: use integer; `0` if not yet generated
|
|
572
622
|
- `code_coverage_pct` / `test_coverage_pct`: round to nearest integer (0–100)
|
|
573
623
|
- Always write to `{paths.trace_dir}/trace-report.json` regardless of domain filter — if a domain filter was applied, include only those PRDs in `prds[]` but note the domain in the `domain` field
|
|
574
|
-
- **TSV `"—"` mapping**: when reading TSV files, map dash values to JSON types: `implemented_by: "—"` → `null`; `test_count: "—"` → `0`; `test_classes: "—"` → `[]`; `tech_doc_revision: "—"` → `0`
|
|
624
|
+
- **TSV `"—"` mapping**: when reading TSV files, map dash values to JSON types: `implemented_by: "—"` → `null`; `test_count: "—"` → `0`; `test_classes: "—"` → `[]`; `tech_doc_revision: "—"` → `0`; `dev_selftest: "—"` → `"not_run"`; `dev_selftest_at: "—"` → `null`; `qc_status: "—"` → `"not_run"`; `qc_run_at: "—"` → `null`
|
|
575
625
|
|
|
576
|
-
### Step 8b —
|
|
626
|
+
### Step 8b — Living Docs Sync *(umbrella mode only)*
|
|
577
627
|
|
|
578
628
|
*Skip this step in single-service mode.*
|
|
579
629
|
|
|
580
|
-
|
|
630
|
+
Authoritative trace state stays in each service submodule's `.trace/` (committed there).
|
|
631
|
+
This step publishes the merged report to the **canonical Living Docs home** (the specs
|
|
632
|
+
module) and drops a local mirror so the panel is never empty.
|
|
581
633
|
|
|
582
|
-
1.
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
```
|
|
588
|
-
Overwrite if exists. Do not delete files in `.trace/` that no longer have a service source — they may be from a previous run.
|
|
634
|
+
1. **Write canonical merged report** to `{living_docs_dir}/` (`mkdir -p` it first):
|
|
635
|
+
- `{living_docs_dir}/trace-report.json` — merge every per-service `trace-report.json`
|
|
636
|
+
into one document, add a `"service"` field per scenario row, recalc summary aggregates.
|
|
637
|
+
- `{living_docs_dir}/{service-name}/{UC-ID}.tsv` — copy each service's TSVs, namespaced
|
|
638
|
+
by service. Overwrite; don't delete TSVs whose service source is gone (prior runs).
|
|
589
639
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
640
|
+
2. **Mirror to the panel location** `{panel_mirror}` (`./.trace` at the current workspace
|
|
641
|
+
root) so a dev who opened *this* repo (umbrella **or** a single service submodule) sees
|
|
642
|
+
data immediately: copy `{living_docs_dir}/trace-report.json` → `{panel_mirror}/trace-report.json`
|
|
643
|
+
(and the namespaced TSVs). If `panel_mirror` already resolves to `living_docs_dir`, skip.
|
|
594
644
|
|
|
595
|
-
|
|
645
|
+
3. **Print sync summary:**
|
|
596
646
|
```
|
|
597
|
-
|
|
598
|
-
user-service : {N} TSV files
|
|
599
|
-
order-service : {N} TSV files
|
|
647
|
+
Living Docs → {living_docs_dir}/ (canonical, in specs module)
|
|
648
|
+
user-service : {N} TSV files
|
|
649
|
+
order-service : {N} TSV files
|
|
600
650
|
trace-report.json: merged ({total} scenarios across {S} services)
|
|
601
|
-
|
|
651
|
+
Panel mirror → {panel_mirror}/trace-report.json (current workspace)
|
|
602
652
|
```
|
|
603
653
|
|
|
604
|
-
> **Note
|
|
654
|
+
> **Note — both locations are generated, gitignored mirrors.** Add `.living-docs/` to the
|
|
655
|
+
> **specs module's** `.gitignore` and `.trace/` to the current repo's `.gitignore`. The only
|
|
656
|
+
> committed, authoritative trace state is each service submodule's own `.trace/`. The report
|
|
657
|
+
> is regenerated by `/validate-traces` or `/sync` — never commit it.
|
|
605
658
|
|
|
606
659
|
## Output
|
|
607
660
|
|
|
@@ -641,15 +694,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
641
694
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
642
695
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
643
696
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
697
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
698
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
699
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
700
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
701
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
702
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
703
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
644
704
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
645
705
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
646
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
647
|
-
| /
|
|
648
|
-
| /run-
|
|
649
|
-
| /run-
|
|
650
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
651
|
-
| /smoke-test | Create PR and link to ticket |
|
|
652
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
706
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
707
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
708
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
709
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
710
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
711
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
712
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
653
713
|
| /fix-bug | Create PR and link to ticket |
|
|
654
714
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
655
715
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
@@ -702,11 +762,12 @@ Tech-Doc Revision Drift:
|
|
|
702
762
|
|
|
703
763
|
Recommendations:
|
|
704
764
|
- /generate-code {UC-ID} for DRIFT and UNTRACKED scenarios
|
|
705
|
-
- /
|
|
765
|
+
- /dev-gen-test {UC-ID} for GAP (missing tests)
|
|
706
766
|
- /generate-bdd {prd-file} for PRD version drift
|
|
707
767
|
|
|
708
768
|
[Umbrella mode only]
|
|
709
|
-
Living Docs
|
|
710
|
-
|
|
711
|
-
|
|
769
|
+
Living Docs canonical → {living_docs_dir}/ (specs module — shared, gitignored)
|
|
770
|
+
Panel mirror → {panel_mirror}/trace-report.json (current workspace)
|
|
771
|
+
Tip: run /validate-traces (or /sync) after each codegen session to refresh the panel.
|
|
772
|
+
Both are generated mirrors — do not commit (.living-docs/ + .trace/ in .gitignore).
|
|
712
773
|
```
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# QC automation module — Python + pytest-playwright + Page Object
|
|
2
|
+
# Used by the /qc-* commands (the official QC automation pipeline ported from the QC team).
|
|
3
|
+
# This is the QC test-authoring/execution stack, independent of the dev implementation
|
|
4
|
+
# module (java-spring, react, flutter, …). Selected via tech_stack.qc_module or per /qc-* run.
|
|
5
|
+
|
|
6
|
+
build:
|
|
7
|
+
test: "python3 -m pytest"
|
|
8
|
+
e2e: "python3 -m pytest -m e2e"
|
|
9
|
+
report: "python3 -m pytest --html=reports/<feature>/report.html --self-contained-html"
|
|
10
|
+
show_trace: "python3 -m playwright show-trace <test-results/<nodeid>/trace.zip>"
|
|
11
|
+
|
|
12
|
+
architecture:
|
|
13
|
+
style: "Page Object Model over pytest-playwright — Markdown test-case first, Python second"
|
|
14
|
+
key_rules:
|
|
15
|
+
- "Markdown-first: never generate Python until a reviewed .Test.md exists for the feature"
|
|
16
|
+
- "No Allure, no hand-written dashboard, no record_video — use Playwright Trace + pytest-html"
|
|
17
|
+
- "No hard-coded URL/credential/timeout — read from Env.* and CONFIG[...]"
|
|
18
|
+
- "No time.sleep() — use Playwright auto-wait / expect()"
|
|
19
|
+
- "Each test independent via pytest-playwright fixtures (page / logged_in_page / …)"
|
|
20
|
+
- "Page Object extends slim BasePage; split 3 layers: locators _x(), actions verb_noun(), assertions assert_x() using expect()"
|
|
21
|
+
- "Locator priority: data-testid → role → label/text → CSS → avoid XPath"
|
|
22
|
+
- "Group tests by (role, account) so login/logout never interleaves across roles"
|
|
23
|
+
- "Cover 100% of TCs in the .Test.md — every TC ends Pass/Fail/Skip, none left Draft"
|
|
24
|
+
folder_structure: |
|
|
25
|
+
docs/<project>/<feature>/ ← test-case Markdown (.Test.md) — source of truth
|
|
26
|
+
pages/ ← Page Object Model
|
|
27
|
+
│ ├── base_page.py ← slim BasePage (click/fill/wait/screenshot)
|
|
28
|
+
│ └── <feature>_page.py
|
|
29
|
+
tests/ ← pytest scripts, 1-1 with docs/
|
|
30
|
+
│ ├── conftest.py ← fixtures: browser, page, logged_in_page, tracing
|
|
31
|
+
│ └── <project>/test_<feature>.py
|
|
32
|
+
utils/ ← config_loader, logger, steps, test_ordering, report helpers
|
|
33
|
+
test_data/ ← JSON datasets
|
|
34
|
+
config/config.yaml ← browser, timeout, video/screenshot/trace toggles
|
|
35
|
+
reports/ test-results/ ← generated (gitignored): html report, trace.zip, screenshots
|
|
36
|
+
|
|
37
|
+
coding_standards:
|
|
38
|
+
naming:
|
|
39
|
+
test_case_id: "TC_<FEATURE>_<NNN>"
|
|
40
|
+
test_class: "TestFeatureHappyCase"
|
|
41
|
+
test_function: "test_TC<NNN>_<snake_case>"
|
|
42
|
+
page_object: "<feature>_page.py with <Feature>Page class extending BasePage"
|
|
43
|
+
files:
|
|
44
|
+
test_case_md: "docs/<project>/<feature>/TC_<FEATURE>.Test.md"
|
|
45
|
+
page_object: "pages/<feature>_page.py"
|
|
46
|
+
test_script: "tests/<project>/test_<feature>.py"
|
|
47
|
+
patterns:
|
|
48
|
+
steps: "wrap steps with `with step(\"…\")` (from utils.steps import step)"
|
|
49
|
+
assertions: "Playwright expect() — never bare assert on dynamic UI"
|
|
50
|
+
fixtures: "auth fixtures register via register_auth_fixtures([...]) in project conftest"
|
|
51
|
+
fail_triage: "classify each FAIL as script-bug (fix selector/logic) vs product-gap (keep FAIL + evidence, never fake-pass)"
|
|
52
|
+
|
|
53
|
+
testing:
|
|
54
|
+
layers: "functional (gui-screen / gui-feature / api), integration (api/db/gui/kafka), e2e (journey), non-functional, exploratory"
|
|
55
|
+
runner: "pytest-playwright; trace via context.tracing.start in conftest"
|
|
56
|
+
report: "pytest-html (--html ... --self-contained-html) + Playwright Trace viewer"
|
|
57
|
+
|
|
58
|
+
trace_tags:
|
|
59
|
+
# QC tests map back to the framework's scenarios — drives qc_status in the trace TSV.
|
|
60
|
+
verifies: "# @trace.verifies={UC-ID}-SC{N}"
|
|
61
|
+
source: "# @trace.source=<official .feature path>"
|
|
62
|
+
test_type: "# @trace.test_type=functional|integration|e2e|non-functional"
|
|
63
|
+
|
|
64
|
+
# qc_status: /qc-run-test writes pass|fail|skip|not_run + qc_run_at into {trace_dir}/{UC-ID}.tsv
|
|
65
|
+
# (parallel to dev_selftest), surfaced in Living Docs as the OFFICIAL QC automation result.
|
|
@@ -190,7 +190,7 @@ If `services` section is present:
|
|
|
190
190
|
|
|
191
191
|
**2. Route to service** — if active domain matches a key in `services`:
|
|
192
192
|
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
193
|
-
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
193
|
+
- 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.
|
|
194
194
|
- Store `active_service` = `services.{domain}.path`
|
|
195
195
|
- Store `active_service_module` = `services.{domain}.module`
|
|
196
196
|
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
@@ -202,7 +202,7 @@ If `services` section is present:
|
|
|
202
202
|
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
203
203
|
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
204
204
|
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
205
|
-
- Override `paths.tech_docs_dir` → `{spec_source}/specs/tech-docs` — **
|
|
205
|
+
- 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.)*
|
|
206
206
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
207
207
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
208
208
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
@@ -233,7 +233,7 @@ When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-
|
|
|
233
233
|
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
234
234
|
|
|
235
235
|
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
236
|
-
- Shell commands (`/run-
|
|
236
|
+
- Shell commands (`/dev-run-test`, `/dev-gen-test`) run **from within** `service_root`
|
|
237
237
|
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
238
238
|
|
|
239
239
|
**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).
|
|
@@ -248,19 +248,41 @@ If the file does not exist → skip silently.
|
|
|
248
248
|
|
|
249
249
|
---
|
|
250
250
|
|
|
251
|
-
## Step 3 — [CRITICAL] Load CLAUDE.md
|
|
251
|
+
## Step 3 — [CRITICAL] Load CLAUDE.md (layered: root + service overlay)
|
|
252
252
|
|
|
253
253
|
*This is the highest-priority context — it defines HOW to write code and documents for this project.*
|
|
254
254
|
|
|
255
|
-
|
|
255
|
+
CLAUDE.md is loaded in **two layers** so umbrella-wide rules and service-specific
|
|
256
|
+
architecture/coding standards compose correctly. The agent always sits at the umbrella
|
|
257
|
+
root, but the implementation code lives in a service submodule with its OWN stack,
|
|
258
|
+
architecture, and conventions — so the service's CLAUDE.md must win for code generation.
|
|
259
|
+
|
|
260
|
+
**Layer 1 — [BASE] Root CLAUDE.md (umbrella-wide).**
|
|
261
|
+
Read `CLAUDE.md` at the repo root. Treat its contents as the **shared baseline** for the
|
|
262
|
+
whole umbrella — git conventions, data-protection posture, cross-cutting rules, and (in
|
|
263
|
+
single-service mode) the project's only architecture + coding standards.
|
|
264
|
+
|
|
265
|
+
**Layer 2 — [OVERLAY] Service CLAUDE.md (umbrella mode only).**
|
|
266
|
+
*Run only if `service_root` was set in Step 1.6 (i.e. a real service was routed to).*
|
|
267
|
+
Read `{service_root}/CLAUDE.md`. This file defines the architecture + coding standards of
|
|
268
|
+
the **actual stack being implemented** (e.g. `user-service` = java-spring, `web` = nextjs).
|
|
269
|
+
Overlay it on top of Layer 1: **on any conflict, the service value WINS** for architecture,
|
|
270
|
+
coding standards, and error handling. Layer-1 values that the service does not redefine
|
|
271
|
+
(e.g. git conventions, banned patterns shared org-wide) remain in effect.
|
|
272
|
+
|
|
273
|
+
From the **merged** result, extract and store:
|
|
256
274
|
|
|
257
275
|
- **§1 Project Overview** → project name, language, framework, build/test commands, domains
|
|
258
|
-
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules
|
|
259
|
-
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns
|
|
260
|
-
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name
|
|
261
|
-
- **§7 Git Conventions** → branch naming pattern, commit message format
|
|
276
|
+
- **§2 Architecture** → layer order (e.g., Controller → Facade → Service → Repository), architectural rules — *service overlay wins*
|
|
277
|
+
- **§3 Coding Standards** → naming conventions (classes, methods), response wrapper type, forbidden patterns — *service overlay wins*
|
|
278
|
+
- **§5 Error Handling** → exception types, HTTP status code mapping, not-found exception class name — *service overlay wins*
|
|
279
|
+
- **§7 Git Conventions** → branch naming pattern, commit message format — *root baseline unless service redefines*
|
|
262
280
|
|
|
263
|
-
|
|
281
|
+
**Resolution rules:**
|
|
282
|
+
- If both layers exist → merge as above; record `claude_md_source = root + {service_root}`.
|
|
283
|
+
- If only the service overlay exists (no root CLAUDE.md) → use the service file alone; `claude_md_source = {service_root}`.
|
|
284
|
+
- 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).
|
|
285
|
+
- If neither exists → note CLAUDE.md as missing and continue with project-context.yaml data only.
|
|
264
286
|
|
|
265
287
|
---
|
|
266
288
|
|
|
@@ -326,7 +348,7 @@ active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
|
326
348
|
|
|
327
349
|
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
328
350
|
|
|
329
|
-
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (
|
|
351
|
+
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).
|
|
330
352
|
|
|
331
353
|
---
|
|
332
354
|
|
|
@@ -360,7 +382,8 @@ Output exactly this block:
|
|
|
360
382
|
[CTX LOADED]
|
|
361
383
|
Stack : {language} / {framework} / {database}
|
|
362
384
|
Platform : {active_module} ({platform_type})
|
|
363
|
-
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
385
|
+
Layers : {layer order from merged CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
386
|
+
CLAUDE.md : {root + {service_root} | {service_root} only | root only | ⚠️ service overlay MISSING — using root | missing}
|
|
364
387
|
Ticket : {ticket_prefix}-
|
|
365
388
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
366
389
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
@@ -504,15 +527,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
504
527
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
505
528
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
506
529
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
530
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
531
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
532
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
533
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
534
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
535
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
536
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
507
537
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
508
538
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
509
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
510
|
-
| /
|
|
511
|
-
| /run-
|
|
512
|
-
| /run-
|
|
513
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
514
|
-
| /smoke-test | Create PR and link to ticket |
|
|
515
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
539
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
540
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
541
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
542
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
543
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
544
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
545
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
516
546
|
| /fix-bug | Create PR and link to ticket |
|
|
517
547
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
518
548
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
@@ -622,15 +652,22 @@ Suggest the logical next command based on workflow phase:
|
|
|
622
652
|
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
623
653
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
624
654
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
655
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (resolve 🔴 blocker gaps first) |
|
|
656
|
+
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
657
|
+
| /qc-design-test | `/qc-review {UC-ID}` (test-case review) |
|
|
658
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` if APPROVED; fix TCs if NEEDS_FIX |
|
|
659
|
+
| /qc-run-test | `/qc-report {UC-ID}` then `/qc-review {UC-ID}` (script review) |
|
|
660
|
+
| /qc-review (script) | `/qc-report {UC-ID}` then create PR if APPROVED |
|
|
661
|
+
| /qc-report | `/validate-traces {UC-ID}` to refresh Living Docs (qc_status) |
|
|
625
662
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
626
663
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
627
|
-
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/
|
|
628
|
-
| /
|
|
629
|
-
| /run-
|
|
630
|
-
| /run-
|
|
631
|
-
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
632
|
-
| /smoke-test | Create PR and link to ticket |
|
|
633
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/
|
|
664
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/dev-gen-test {UC-ID}` |
|
|
665
|
+
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
666
|
+
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
667
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
668
|
+
| /review-code | `/dev-smoke-test {UC-ID}` or create PR |
|
|
669
|
+
| /dev-smoke-test | Create PR and link to ticket |
|
|
670
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; all OK → create PR |
|
|
634
671
|
| /fix-bug | Create PR and link to ticket |
|
|
635
672
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
636
673
|
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|