@edupia-tutor/spec-driven-docs 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build.js +230 -0
- package/bin/index.js +598 -0
- package/commands/debug.md +830 -0
- package/commands/debug.tmpl +257 -0
- package/commands/define-product.md +652 -0
- package/commands/define-product.tmpl +158 -0
- package/commands/dev-gen-test.md +1010 -0
- package/commands/dev-gen-test.tmpl +490 -0
- package/commands/dev-run-test.md +744 -0
- package/commands/dev-run-test.tmpl +224 -0
- package/commands/dev-smoke-test.md +711 -0
- package/commands/dev-smoke-test.tmpl +217 -0
- package/commands/fix-bug.md +744 -0
- package/commands/fix-bug.tmpl +171 -0
- package/commands/generate-bdd.md +1054 -0
- package/commands/generate-bdd.tmpl +534 -0
- package/commands/generate-code.md +869 -0
- package/commands/generate-code.tmpl +349 -0
- package/commands/generate-design-spec.md +958 -0
- package/commands/generate-design-spec.tmpl +464 -0
- package/commands/generate-prd.md +748 -0
- package/commands/generate-prd.tmpl +254 -0
- package/commands/generate-spec-manifest.md +658 -0
- package/commands/generate-spec-manifest.tmpl +164 -0
- package/commands/generate-tech-docs.md +849 -0
- package/commands/generate-tech-docs.tmpl +355 -0
- package/commands/learn.md +636 -0
- package/commands/learn.tmpl +63 -0
- package/commands/map-testids.md +575 -0
- package/commands/map-testids.tmpl +81 -0
- package/commands/propose-scenario.md +623 -0
- package/commands/propose-scenario.tmpl +129 -0
- package/commands/qc-analyze.md +580 -0
- package/commands/qc-analyze.tmpl +86 -0
- package/commands/qc-design-test.md +562 -0
- package/commands/qc-design-test.tmpl +68 -0
- package/commands/qc-plan.md +543 -0
- package/commands/qc-plan.tmpl +49 -0
- package/commands/qc-report.md +554 -0
- package/commands/qc-report.tmpl +60 -0
- package/commands/qc-review.md +547 -0
- package/commands/qc-review.tmpl +53 -0
- package/commands/qc-run-test.md +604 -0
- package/commands/qc-run-test.tmpl +84 -0
- package/commands/refine-prd.md +772 -0
- package/commands/refine-prd.tmpl +140 -0
- package/commands/report-bug.md +639 -0
- package/commands/report-bug.tmpl +145 -0
- package/commands/review-code.md +677 -0
- package/commands/review-code.tmpl +104 -0
- package/commands/review-context.md +1047 -0
- package/commands/review-context.tmpl +415 -0
- package/commands/review-tech-docs.md +811 -0
- package/commands/review-tech-docs.tmpl +317 -0
- package/commands/setup-ai-first.md +545 -0
- package/commands/setup-ai-first.tmpl +358 -0
- package/commands/sync.md +451 -0
- package/commands/sync.tmpl +351 -0
- package/commands/update-framework.md +251 -0
- package/commands/update-framework.tmpl +151 -0
- package/commands/validate-traces.md +842 -0
- package/commands/validate-traces.tmpl +348 -0
- package/core/FRAMEWORK_VERSION +1 -0
- package/core/commands/debug.md +830 -0
- package/core/commands/define-product.md +652 -0
- package/core/commands/dev-gen-test.md +1010 -0
- package/core/commands/dev-run-test.md +744 -0
- package/core/commands/dev-smoke-test.md +711 -0
- package/core/commands/fix-bug.md +744 -0
- package/core/commands/generate-bdd.md +1054 -0
- package/core/commands/generate-code.md +869 -0
- package/core/commands/generate-design-spec.md +958 -0
- package/core/commands/generate-prd.md +748 -0
- package/core/commands/generate-spec-manifest.md +658 -0
- package/core/commands/generate-tech-docs.md +849 -0
- package/core/commands/learn.md +636 -0
- package/core/commands/map-testids.md +575 -0
- package/core/commands/propose-scenario.md +623 -0
- package/core/commands/qc-analyze.md +580 -0
- package/core/commands/qc-design-test.md +562 -0
- package/core/commands/qc-plan.md +543 -0
- package/core/commands/qc-report.md +554 -0
- package/core/commands/qc-review.md +547 -0
- package/core/commands/qc-run-test.md +604 -0
- package/core/commands/refine-prd.md +772 -0
- package/core/commands/report-bug.md +639 -0
- package/core/commands/review-code.md +677 -0
- package/core/commands/review-context.md +1047 -0
- package/core/commands/review-tech-docs.md +811 -0
- package/core/commands/setup-ai-first.md +545 -0
- package/core/commands/sync.md +451 -0
- package/core/commands/update-framework.md +251 -0
- package/core/commands/validate-traces.md +842 -0
- package/core/hooks/data-guard.js +141 -0
- package/core/hooks/settings.json +18 -0
- package/core/modules/android-compose/module.yaml +13 -0
- package/core/modules/android-compose/stack-profile.yaml +57 -0
- package/core/modules/angular/architecture-snippets/component-patterns.md +187 -0
- package/core/modules/angular/module.yaml +6 -0
- package/core/modules/angular/stack-profile.yaml +38 -0
- package/core/modules/context-engineering/architecture-snippets/context-design.md +119 -0
- package/core/modules/context-engineering/module.yaml +9 -0
- package/core/modules/context-engineering/stack-profile.yaml +61 -0
- package/core/modules/dotnet/architecture-snippets/clean-arch.md +160 -0
- package/core/modules/dotnet/module.yaml +6 -0
- package/core/modules/dotnet/stack-profile.yaml +50 -0
- package/core/modules/flutter/module.yaml +14 -0
- package/core/modules/flutter/stack-profile.yaml +59 -0
- package/core/modules/golang/architecture-snippets/domain-layout.md +283 -0
- package/core/modules/golang/module.yaml +6 -0
- package/core/modules/golang/stack-profile.yaml +40 -0
- package/core/modules/ios-swiftui/module.yaml +13 -0
- package/core/modules/ios-swiftui/stack-profile.yaml +55 -0
- package/core/modules/java-spring/architecture-snippets/layered-arch.md +201 -0
- package/core/modules/java-spring/module.yaml +15 -0
- package/core/modules/java-spring/stack-profile.yaml +28 -0
- package/core/modules/nextjs/architecture-snippets/app-router-patterns.md +269 -0
- package/core/modules/nextjs/module.yaml +14 -0
- package/core/modules/nextjs/stack-profile.yaml +74 -0
- package/core/modules/nuxt/module.yaml +14 -0
- package/core/modules/nuxt/stack-profile.yaml +58 -0
- package/core/modules/php-laravel/architecture-snippets/service-repository.md +302 -0
- package/core/modules/php-laravel/module.yaml +15 -0
- package/core/modules/php-laravel/stack-profile.yaml +56 -0
- package/core/modules/qc-playwright/stack-profile.yaml +66 -0
- package/core/modules/react/architecture-snippets/hooks-query-patterns.md +254 -0
- package/core/modules/react/module.yaml +14 -0
- package/core/modules/react/stack-profile.yaml +63 -0
- package/core/modules/react-native/module.yaml +14 -0
- package/core/modules/react-native/stack-profile.yaml +56 -0
- package/core/modules/vue/module.yaml +14 -0
- package/core/modules/vue/stack-profile.yaml +65 -0
- package/core/rules/data-protection.md +80 -0
- package/core/rules/workflow.md +44 -0
- package/core/skills/code/SKILL.md +770 -0
- package/core/skills/debug/SKILL.md +869 -0
- package/core/skills/design-spec/SKILL.md +589 -0
- package/core/skills/discovery/SKILL.md +554 -0
- package/core/skills/prd/SKILL.md +562 -0
- package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/core/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/core/skills/qc/qa-analyst/business-rules.md +59 -0
- package/core/skills/qc/qa-analyst/data-flow.md +64 -0
- package/core/skills/qc/qa-analyst/spec-breakdown.md +61 -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 +216 -0
- package/core/skills/spec/SKILL.md +461 -0
- package/core/skills/test/SKILL.md +1297 -0
- package/core/steps/capture-lesson.md +79 -0
- package/core/steps/context-loader.md +307 -0
- package/core/steps/gate.md +87 -0
- package/core/steps/report-footer.md +100 -0
- package/core/steps/review-fanout.md +138 -0
- package/core/steps/spawn-agent.md +124 -0
- package/core/steps/trace-mirror.md +26 -0
- package/core/templates/architecture.template.md +113 -0
- package/core/templates/design-spec.template.md +217 -0
- package/core/templates/feature.template +259 -0
- package/core/templates/platform-guide.template.md +145 -0
- package/core/templates/prd.template.md +327 -0
- package/core/templates/product-definition.template.md +168 -0
- package/core/templates/project-context.yaml +161 -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 +156 -0
- package/docs/01-getting-started/quickstart.md +85 -0
- package/docs/02-guides/README.md +26 -0
- package/docs/02-guides/developer/README.md +46 -0
- package/docs/02-guides/developer/bdd-and-trace.md +125 -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 +460 -0
- package/docs/02-guides/developer/workflow.md +121 -0
- package/docs/02-guides/product-owner/README.md +79 -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 +436 -0
- package/docs/02-guides/tester/README.md +75 -0
- package/docs/02-guides/tester/bug-reporting.md +117 -0
- package/docs/02-guides/tester/qc-automation.md +165 -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 +130 -0
- package/docs/02-guides/tester/test-checklist.md +31 -0
- package/docs/02-guides/tester/workflow.md +77 -0
- package/docs/03-concepts/README.md +19 -0
- package/docs/03-concepts/architecture.md +248 -0
- package/docs/03-concepts/pipeline.md +274 -0
- package/docs/03-concepts/traceability.md +149 -0
- package/docs/04-operations/README.md +33 -0
- package/docs/04-operations/bug-flow.md +362 -0
- package/docs/04-operations/publishing.md +137 -0
- package/docs/04-operations/sync-and-update.md +522 -0
- package/docs/05-reference/README.md +32 -0
- package/docs/05-reference/command-cheatsheet.md +147 -0
- package/docs/05-reference/commands.md +232 -0
- package/docs/05-reference/modules.md +110 -0
- package/docs/05-reference/trace-schema.md +153 -0
- package/docs/README.md +49 -0
- package/hooks/data-guard.js +141 -0
- package/hooks/settings.json +18 -0
- package/modules/android-compose/module.yaml +13 -0
- package/modules/android-compose/stack-profile.yaml +57 -0
- package/modules/angular/architecture-snippets/component-patterns.md +187 -0
- package/modules/angular/module.yaml +6 -0
- package/modules/angular/stack-profile.yaml +38 -0
- package/modules/context-engineering/architecture-snippets/context-design.md +119 -0
- package/modules/context-engineering/module.yaml +9 -0
- package/modules/context-engineering/stack-profile.yaml +61 -0
- package/modules/dotnet/architecture-snippets/clean-arch.md +160 -0
- package/modules/dotnet/module.yaml +6 -0
- package/modules/dotnet/stack-profile.yaml +50 -0
- package/modules/flutter/module.yaml +14 -0
- package/modules/flutter/stack-profile.yaml +59 -0
- package/modules/golang/architecture-snippets/domain-layout.md +283 -0
- package/modules/golang/module.yaml +6 -0
- package/modules/golang/stack-profile.yaml +40 -0
- package/modules/ios-swiftui/module.yaml +13 -0
- package/modules/ios-swiftui/stack-profile.yaml +55 -0
- package/modules/java-spring/architecture-snippets/layered-arch.md +201 -0
- package/modules/java-spring/module.yaml +15 -0
- package/modules/java-spring/stack-profile.yaml +28 -0
- package/modules/nextjs/architecture-snippets/app-router-patterns.md +269 -0
- package/modules/nextjs/module.yaml +14 -0
- package/modules/nextjs/stack-profile.yaml +74 -0
- package/modules/nuxt/module.yaml +14 -0
- package/modules/nuxt/stack-profile.yaml +58 -0
- package/modules/php-laravel/architecture-snippets/service-repository.md +302 -0
- package/modules/php-laravel/module.yaml +15 -0
- package/modules/php-laravel/stack-profile.yaml +56 -0
- package/modules/qc-playwright/stack-profile.yaml +66 -0
- package/modules/react/architecture-snippets/hooks-query-patterns.md +254 -0
- package/modules/react/module.yaml +14 -0
- package/modules/react/stack-profile.yaml +63 -0
- package/modules/react-native/module.yaml +14 -0
- package/modules/react-native/stack-profile.yaml +56 -0
- package/modules/vue/module.yaml +14 -0
- package/modules/vue/stack-profile.yaml +65 -0
- package/package.json +49 -0
- package/rules/data-protection.md +80 -0
- package/rules/workflow.md +44 -0
- package/scripts/init.sh +49 -0
- package/scripts/migrate-specs.js +256 -0
- package/scripts/upgrade.sh +94 -0
- package/skills/code/SKILL.md +770 -0
- package/skills/code/SKILL.tmpl +176 -0
- package/skills/debug/SKILL.md +869 -0
- package/skills/debug/SKILL.tmpl +262 -0
- package/skills/design-spec/SKILL.md +589 -0
- package/skills/design-spec/SKILL.tmpl +95 -0
- package/skills/discovery/SKILL.md +554 -0
- package/skills/discovery/SKILL.tmpl +147 -0
- package/skills/prd/SKILL.md +562 -0
- package/skills/prd/SKILL.tmpl +188 -0
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/skills/qc/qa-analyst/business-rules.md +59 -0
- package/skills/qc/qa-analyst/data-flow.md +64 -0
- package/skills/qc/qa-analyst/spec-breakdown.md +61 -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 +216 -0
- package/skills/setup-ai-first/SKILL.tmpl +116 -0
- package/skills/spec/SKILL.md +461 -0
- package/skills/spec/SKILL.tmpl +174 -0
- package/skills/test/SKILL.md +1297 -0
- package/skills/test/SKILL.tmpl +296 -0
- package/steps/capture-lesson.md +79 -0
- package/steps/context-loader.md +307 -0
- package/steps/gate.md +87 -0
- package/steps/report-footer.md +100 -0
- package/steps/review-fanout.md +138 -0
- package/steps/spawn-agent.md +124 -0
- package/steps/trace-mirror.md +26 -0
- package/templates/architecture.template.md +113 -0
- package/templates/design-spec.template.md +217 -0
- package/templates/feature.template +259 -0
- package/templates/platform-guide.template.md +145 -0
- package/templates/prd.template.md +327 -0
- package/templates/product-definition.template.md +168 -0
- package/templates/project-context.yaml +161 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
# /generate-design-spec — Generate Design Specification (FE / App)
|
|
2
|
+
|
|
3
|
+
## Gate
|
|
4
|
+
{{include:steps/gate.md}}
|
|
5
|
+
|
|
6
|
+
*Note: For this command, the target file is a Business PRD (`prd.md`) under `{paths.specs_dir}/{domain}/{prd-slug}/`. Resolve from `$ARGUMENTS` or list the directory and ask. Only FE and mobile PRDs are supported — BE PRDs will be rejected at the Platform Check step.*
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
{{include:steps/context-loader.md}}
|
|
10
|
+
|
|
11
|
+
*Additional context for this command: Read the full target PRD. Extract: **TICKET-ID**, **domain**, **feature name**, **Service** and **Module** from PRD metadata (rows `| **Service** |` and `| **Module** |`), User Flow (Section 4a), and Wireframe screen names (Section 4b).*
|
|
12
|
+
|
|
13
|
+
*Service extraction rules (same as /generate-prd):*
|
|
14
|
+
- *If PRD metadata has `| **Service** |` → use as `active_service` and `| **Module** |` as `active_module`.*
|
|
15
|
+
- *If absent AND `services` defined in `project-context.yaml` → ask: "Which service is this Design Spec for?" (list FE/App services only, wait for selection).*
|
|
16
|
+
- *If single-service project → `active_service = "default"`, `active_module = tech_stack.module`.*
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Platform Check
|
|
21
|
+
|
|
22
|
+
Using `active_module` and `platform_type` derived from context loading:
|
|
23
|
+
|
|
24
|
+
1. If `platform_type = "backend"` → **STOP**. Output:
|
|
25
|
+
```
|
|
26
|
+
❌ Design Spec is only for FE and mobile platforms.
|
|
27
|
+
For BE services, API contracts belong in the Business PRD (Use Case → Business Logic section).
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
2. If `platform_type = "web-frontend"` → set `active_platform = "web"`.
|
|
31
|
+
|
|
32
|
+
3. If `platform_type = "mobile"`:
|
|
33
|
+
- `flutter` or `react-native` → set `active_platform = "app"`
|
|
34
|
+
- `ios-swiftui` → set `active_platform = "app-ios"`
|
|
35
|
+
- `android-compose` → set `active_platform = "app-android"`
|
|
36
|
+
|
|
37
|
+
4. If `platform_type = "unknown"` → ask: "Which platform is this Design Spec for?"
|
|
38
|
+
```
|
|
39
|
+
Options:
|
|
40
|
+
1 — web (React / Next.js / Vue / Angular)
|
|
41
|
+
2 — app (Flutter / React Native)
|
|
42
|
+
3 — app-ios (iOS SwiftUI)
|
|
43
|
+
4 — app-android (Android Compose)
|
|
44
|
+
```
|
|
45
|
+
Wait for selection. Map choice to `active_platform` and infer `active_module` if possible.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Screen Discovery
|
|
50
|
+
|
|
51
|
+
From the PRD's Section 4 (User Flow + Wireframe), extract all screen / page / modal names mentioned.
|
|
52
|
+
|
|
53
|
+
Present the list and ask PO to confirm:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Screens detected from PRD:
|
|
57
|
+
1. {Screen name 1}
|
|
58
|
+
2. {Screen name 2}
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
Are these all the screens for the {active_platform} platform?
|
|
62
|
+
Add any missing, remove any that don't apply, or confirm with Y.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Wait for confirmation. Store the confirmed list as `screen_list`.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Figma Frame Links *(mandatory — one readable node-level link per screen)*
|
|
70
|
+
|
|
71
|
+
A Design Spec is only as good as the design it points to. The AI **cannot read a plain
|
|
72
|
+
file link** (`figma.com/design/{fileKey}/...` with no `node-id`) — it needs a
|
|
73
|
+
**node-level link to each specific frame** so it can fetch that frame's real layout,
|
|
74
|
+
components, and tokens via the Figma MCP. So collect one link **per screen**, not one
|
|
75
|
+
link for the whole feature.
|
|
76
|
+
|
|
77
|
+
**Ask the PO, listing every screen in `screen_list`:**
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Paste the Figma frame link for each screen below.
|
|
81
|
+
|
|
82
|
+
In Figma: select the frame → right-click → "Copy link to selection"
|
|
83
|
+
(the URL must contain ?node-id=... — that is the per-frame link the AI can read)
|
|
84
|
+
|
|
85
|
+
1. {Screen 1} : ____
|
|
86
|
+
2. {Screen 2} : ____
|
|
87
|
+
...
|
|
88
|
+
|
|
89
|
+
If a screen has no design yet, type none for that screen.
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**For each answer:**
|
|
93
|
+
|
|
94
|
+
1. **Validate format** — the URL must match `figma.com/design/{fileKey}/...?node-id={nodeId}`.
|
|
95
|
+
- Valid → store as `figma_frames[{screen}] = {url}`, parse out `fileKey` + `nodeId`.
|
|
96
|
+
- A file link with **no `node-id`** → reject it: "This link points to the whole file, not a frame. Re-copy via right-click → Copy link to selection." Re-ask for that screen.
|
|
97
|
+
- `none` → `figma_frames[{screen}] = "TBD"`, mark that screen ❌ Missing.
|
|
98
|
+
|
|
99
|
+
2. **Fetch the frame via Figma MCP** (only for valid links) — call `get_design_context`
|
|
100
|
+
(and `get_screenshot` when useful) with the parsed `fileKey` + `nodeId` to read the
|
|
101
|
+
real layout, component names, and design tokens. Ground every Screen Spec in this
|
|
102
|
+
fetched data; do **not** invent layout the frame does not show. If a fetch fails
|
|
103
|
+
(permission / not found) → treat that screen as ❌ Missing and note the fetch error.
|
|
104
|
+
|
|
105
|
+
3. Derive the feature-level `figma_url` = the file link (without `node-id`) shared by the
|
|
106
|
+
frames, for the Metadata row. If frames span multiple files, list each.
|
|
107
|
+
|
|
108
|
+
**Mandatory gate (does not abort — produces a draft):**
|
|
109
|
+
- If **any** screen is ❌ Missing → the spec is generated as a **draft** with those screens
|
|
110
|
+
flagged, but `Status` stays `draft` and **sign-off / `/generate-bdd` is blocked** until
|
|
111
|
+
every screen has a readable, fetched frame link. Record `missing_frames = [screens]`.
|
|
112
|
+
- Add one AI Assumption per missing screen: "No readable Figma frame for {screen} — spec
|
|
113
|
+
for this screen is text-only and must not be signed off until a `node-id` link is added."
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## CHECKPOINT
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
CHECKPOINT — Design Spec
|
|
121
|
+
-------------------------
|
|
122
|
+
Target PRD : {prd-file-path}
|
|
123
|
+
Platform : {active_platform}
|
|
124
|
+
Module : {active_module}
|
|
125
|
+
Service : {active_service}
|
|
126
|
+
Domain : {domain}
|
|
127
|
+
Screens : {N} — {comma-separated screen_list}
|
|
128
|
+
Figma : {linked}/{N} screens have readable frame links{; missing: comma-separated missing_frames}
|
|
129
|
+
Output path : {paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md
|
|
130
|
+
|
|
131
|
+
{If missing_frames non-empty}:
|
|
132
|
+
⚠️ {count} screen(s) without a readable Figma frame link — these will be generated as
|
|
133
|
+
text-only drafts and the spec cannot be signed off until their node-id links are added.
|
|
134
|
+
|
|
135
|
+
Generate? (Y/N)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Wait for explicit Y before proceeding.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Generation Rules
|
|
143
|
+
|
|
144
|
+
Apply these rules consistently when generating all sections:
|
|
145
|
+
|
|
146
|
+
**Component mapping (C.M — mandatory):**
|
|
147
|
+
- For each component referenced, check `figma-components/{active_module}.md` (loaded in context).
|
|
148
|
+
- ✅ Matched → use the exact `Code Component` and `Import Path` from the catalog.
|
|
149
|
+
- ⚠️ Matched but `[TODO]` → mark the component cell as `[TODO — implementation pending]`.
|
|
150
|
+
- ❌ Not in catalog → mark as `[NEW — confirm with designer before generating code]`.
|
|
151
|
+
- Never invent component names or import paths.
|
|
152
|
+
|
|
153
|
+
**Platform-adaptive sections:**
|
|
154
|
+
- Section 3 (Interaction Patterns) and Section 4 (Platform Considerations) adapt to `active_platform`:
|
|
155
|
+
- `web` → include responsive breakpoints, hover/focus states, keyboard navigation, accessibility.
|
|
156
|
+
- `app` / `app-ios` / `app-android` → include gestures, safe area, minimum touch targets, navigation pattern, deep links, permissions, offline behavior.
|
|
157
|
+
- Only generate the section relevant to `active_platform`. Omit the other platform's section entirely.
|
|
158
|
+
|
|
159
|
+
**Figma grounding (mandatory):**
|
|
160
|
+
- For every screen with a fetched frame (`figma_frames[screen]` is a valid link), base the
|
|
161
|
+
Layout, Component Inventory, and Screen States on the **fetched Figma data** — real
|
|
162
|
+
component names, real tokens, real frame structure. Do not contradict or invent layout.
|
|
163
|
+
- Use the exact per-screen `figma_frames[screen]` URL in the Screen Inventory, each Screen
|
|
164
|
+
Spec header, and the Figma Summary — never a synthetic `{figma_url}#screen1` fragment.
|
|
165
|
+
- For ❌ Missing screens: generate a text-only draft from the PRD, prefix the Screen Spec
|
|
166
|
+
with `> [DRAFT — no Figma frame; do not sign off]`, and leave the Figma cell as ❌ Missing.
|
|
167
|
+
|
|
168
|
+
**Screen states (mandatory per screen):**
|
|
169
|
+
- Every screen must document at minimum: `default`, `loading`, `error`.
|
|
170
|
+
- Add `empty` when the screen can display zero-data state.
|
|
171
|
+
- Add `success` when a completed action produces a distinct confirmation state.
|
|
172
|
+
- If a state does not apply → mark `N/A` with a short reason.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Generate
|
|
177
|
+
|
|
178
|
+
Write `{paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md`:
|
|
179
|
+
|
|
180
|
+
````markdown
|
|
181
|
+
# {TICKET-ID} {Feature Name} — Design Spec [{active_platform}]
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Metadata
|
|
186
|
+
|
|
187
|
+
| Field | Value |
|
|
188
|
+
|--------------------|---------------------------------------------------------------|
|
|
189
|
+
| **Spec ID** | {TICKET-ID}-DS-{active_platform} |
|
|
190
|
+
| **Version** | 1.0 |
|
|
191
|
+
| **Status** | draft |
|
|
192
|
+
| **Platform** | {active_platform} |
|
|
193
|
+
| **Module** | {active_module} |
|
|
194
|
+
| **Service** | {active_service} |
|
|
195
|
+
| **Domain** | {domain} |
|
|
196
|
+
| **Business PRD** | [{TICKET-ID}]({relative-path-to-prd.md}) |
|
|
197
|
+
| **Figma** | {figma_url — feature file link} ({linked}/{N} frames linked) |
|
|
198
|
+
| **Author** | {PO name or "AI-assisted"} |
|
|
199
|
+
| **Created** | {YYYY-MM-DD} |
|
|
200
|
+
| **Updated** | {YYYY-MM-DD} |
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
# 1. Screen Inventory
|
|
205
|
+
|
|
206
|
+
| # | Screen Name | Entry Point | Figma Frame | Notes |
|
|
207
|
+
|---|-------------|-------------|-------------|-------|
|
|
208
|
+
| 1 | {Screen 1} | {how user arrives — e.g., tap CTA on Home} | [Frame]({figma_frames[Screen 1]}) | |
|
|
209
|
+
| 2 | {Screen 2} | {entry point} | [Frame]({figma_frames[Screen 2]}) / ❌ Missing | |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
# 2. Screen Specs
|
|
214
|
+
|
|
215
|
+
<!--
|
|
216
|
+
Repeat this block for every screen in the Screen Inventory.
|
|
217
|
+
Each screen must have: Layout, Component Inventory, Screen States, Actions & Navigation.
|
|
218
|
+
-->
|
|
219
|
+
|
|
220
|
+
## Screen 1: {Screen Name}
|
|
221
|
+
|
|
222
|
+
**Figma**: [{Frame name}]({figma_frames[Screen 1]}) <!-- ❌ Missing → prefix this screen with `> [DRAFT — no Figma frame; do not sign off]` -->
|
|
223
|
+
|
|
224
|
+
### Layout
|
|
225
|
+
|
|
226
|
+
{Describe the layout: grid columns, max-width container, section order, padding, key spacing values.
|
|
227
|
+
Reference design tokens where applicable (e.g., `spacing.md = 16px`, `color.surface`).}
|
|
228
|
+
|
|
229
|
+
### Component Inventory
|
|
230
|
+
|
|
231
|
+
| Component (Figma) | Code Component | Import Path | States | Notes |
|
|
232
|
+
|---------------------|-----------------|------------------------|---------------------------------|--------------------|
|
|
233
|
+
| {Figma/Button/Primary} | Button | @/components/ui/Button | default, loading, disabled | |
|
|
234
|
+
| {Figma/Input/Text} | TextInput | @/components/ui/Input | default, focus, error, disabled | |
|
|
235
|
+
| {Figma/Card/Order} | OrderCard | @/features/{domain}/components/OrderCard | default, skeleton | |
|
|
236
|
+
|
|
237
|
+
### Screen States
|
|
238
|
+
|
|
239
|
+
| State | Trigger | UI Behavior |
|
|
240
|
+
|-----------|-------------------------------------|--------------------------------------------------------------|
|
|
241
|
+
| default | Screen loaded, data available | {Describe full rendered appearance} |
|
|
242
|
+
| loading | API call in flight | {Skeleton layout / spinner position — reference component} |
|
|
243
|
+
| error | API failure or validation error | {Toast / inline message / error screen — exact copy TBD} |
|
|
244
|
+
| empty | API returns empty list / no data | {Empty state illustration + CTA text — e.g., "No orders yet. Start shopping →"} |
|
|
245
|
+
| success | Action completed (if applicable) | {Confirmation message / navigation / state change} |
|
|
246
|
+
|
|
247
|
+
### Actions & Navigation
|
|
248
|
+
|
|
249
|
+
| Action | Trigger | Result |
|
|
250
|
+
|-----------------|--------------------------------|-------------------------------------------------|
|
|
251
|
+
| {Action name} | Tap/click {element name} | Navigate to {Screen N} / Open {Modal name} |
|
|
252
|
+
| {Action name} | Swipe left on {list item} | Show delete confirmation |
|
|
253
|
+
| {Back / Cancel} | Back gesture / Cancel button | Return to {previous screen} without saving |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
<!-- Repeat ## Screen N block for each additional screen -->
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
# 3. Interaction Patterns
|
|
262
|
+
|
|
263
|
+
<!--
|
|
264
|
+
Web platform: include sections A + B. Remove section C.
|
|
265
|
+
App platform: include section C. Remove sections A + B.
|
|
266
|
+
-->
|
|
267
|
+
|
|
268
|
+
<!-- ═══════════════════════════ WEB ONLY ═══════════════════════════ -->
|
|
269
|
+
|
|
270
|
+
## A. Responsive Behavior *(web only)*
|
|
271
|
+
|
|
272
|
+
| Breakpoint | Width | Layout Changes |
|
|
273
|
+
|------------|------------|----------------------------------------------------|
|
|
274
|
+
| Mobile | < 768px | {Single column, bottom navigation bar, CTA full-width} |
|
|
275
|
+
| Tablet | 768–1279px | {2-column grid, sidebar collapsed, tab navigation} |
|
|
276
|
+
| Desktop | ≥ 1280px | {Full layout, sidebar visible, max-width 1440px} |
|
|
277
|
+
|
|
278
|
+
## B. Hover / Focus / Keyboard *(web only)*
|
|
279
|
+
|
|
280
|
+
| Element | Hover state | Focus state | Keyboard shortcut |
|
|
281
|
+
|----------------|-------------------------------|---------------------------------|-------------------|
|
|
282
|
+
| Primary button | Background → {color.hover} | Outline 2px {color.focus} | Enter / Space |
|
|
283
|
+
| Text input | Border → {color.border.hover} | Border → {color.primary}, label floats | Tab to focus |
|
|
284
|
+
| Dropdown | Background highlight | Same as hover + ring | Arrow keys to navigate |
|
|
285
|
+
|
|
286
|
+
<!-- ═══════════════════════════ APP ONLY ═══════════════════════════ -->
|
|
287
|
+
|
|
288
|
+
## C. Gestures & Navigation *(app only)*
|
|
289
|
+
|
|
290
|
+
| Gesture | Screen / Element | Behavior |
|
|
291
|
+
|-------------------|---------------------------|-------------------------------------------------------|
|
|
292
|
+
| Back gesture (iOS swipe-right / Android back) | All screens | {Return to previous screen / Show "Discard changes?" dialog} |
|
|
293
|
+
| Pull-to-refresh | {Screen names} | Refresh data, spinner at top |
|
|
294
|
+
| Swipe left on row | {List item name} | Reveal {Delete / Archive} action |
|
|
295
|
+
| Long press | {Element name} | {Context menu / selection mode} |
|
|
296
|
+
| Pinch / zoom | {Image viewer} | Scale image, double-tap to reset |
|
|
297
|
+
|
|
298
|
+
### Navigation Pattern *(app only)*
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
{Draw the navigation stack for this feature, e.g.:
|
|
302
|
+
BottomTab(Home) → FeatureListPage → FeatureDetailPage → EditPage
|
|
303
|
+
BottomTab(Home) → FeatureListPage ↘ (modal) CreatePage
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Entry: {how the user enters this feature — tab / deeplink / push from another screen}
|
|
308
|
+
Exit: {how the user leaves — back stack / tab switch / deeplink out}
|
|
309
|
+
|
|
310
|
+
### Platform Conventions *(app only)*
|
|
311
|
+
|
|
312
|
+
| Aspect | iOS behavior | Android behavior |
|
|
313
|
+
|--------------------------|-----------------------------------------|-----------------------------------------|
|
|
314
|
+
| Navigation bar | {Back button top-left, title centered} | {Up arrow top-left, title left-aligned} |
|
|
315
|
+
| Sheet / bottom modal | {UISheetPresentation, grabber visible} | {BottomSheet, drag handle} |
|
|
316
|
+
| Alert / confirm dialog | {UIAlertController, actions right-aligned} | {Material AlertDialog, actions left-aligned} |
|
|
317
|
+
| Loading indicator | {UIActivityIndicatorView, center} | {CircularProgressIndicator} |
|
|
318
|
+
| Toast / snackbar | {Custom toast, bottom center} | {Material Snackbar, bottom} |
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
# 4. Platform Considerations
|
|
323
|
+
|
|
324
|
+
<!--
|
|
325
|
+
Web: include section A. App: include section B. Remove the non-applicable section.
|
|
326
|
+
-->
|
|
327
|
+
|
|
328
|
+
<!-- ═══════════════════════════ WEB ONLY ═══════════════════════════ -->
|
|
329
|
+
|
|
330
|
+
## A. Accessibility *(web only)*
|
|
331
|
+
|
|
332
|
+
- [ ] All interactive elements reachable via Tab key — no keyboard traps
|
|
333
|
+
- [ ] Focus trap inside modal dialogs (Tab cycles within modal only)
|
|
334
|
+
- [ ] Icon-only buttons have `aria-label` describing the action
|
|
335
|
+
- [ ] Dynamic content updates (loading → loaded) announce via `aria-live`
|
|
336
|
+
- [ ] Color contrast meets WCAG AA: text ≥ 4.5:1, large text ≥ 3:1
|
|
337
|
+
- [ ] Form inputs have visible labels (not placeholder-only)
|
|
338
|
+
- [ ] Error messages linked to inputs via `aria-describedby`
|
|
339
|
+
|
|
340
|
+
<!-- ═══════════════════════════ APP ONLY ═══════════════════════════ -->
|
|
341
|
+
|
|
342
|
+
## B. Device & OS *(app only)*
|
|
343
|
+
|
|
344
|
+
- [ ] Safe area insets applied on all screens — top (status bar) and bottom (home indicator)
|
|
345
|
+
- [ ] Minimum touch target: 44×44pt (iOS) / 48×48dp (Android)
|
|
346
|
+
- [ ] Tested on small screen: 375pt wide (iPhone SE) / 360dp wide (common Android)
|
|
347
|
+
- [ ] Deep link entry: `{scheme}://{host}/{path}` → lands on {screen name} with {param} pre-filled
|
|
348
|
+
- [ ] Permission gates: {list permissions needed — Camera / Location / Notification}
|
|
349
|
+
- {Permission}: requested on {screen name} with rationale copy: "{copy TBD}"
|
|
350
|
+
- [ ] Offline / no-network behavior:
|
|
351
|
+
- {Screen name}: show cached data + offline banner
|
|
352
|
+
- {Action name}: disable button, show tooltip "Requires connection"
|
|
353
|
+
- [ ] Dark mode: all screens tested in dark mode — no hardcoded colors
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
# 5. AC-UI — Design Acceptance Criteria
|
|
358
|
+
|
|
359
|
+
> Reviewed and signed off by **PO + Designer** together before BDD generation.
|
|
360
|
+
> These complement (not replace) the business-level AC in the [Business PRD]({prd-path}).
|
|
361
|
+
|
|
362
|
+
| ID | Acceptance Criterion | Verified by |
|
|
363
|
+
|--------|--------------------------------------------------------------------------------|-----------------|
|
|
364
|
+
| AC-UI1 | All screens match approved Figma frames within design-system tolerances | Designer |
|
|
365
|
+
| AC-UI2 | Loading skeleton/spinner appears within 200ms of initiating any API call | QA |
|
|
366
|
+
| AC-UI3 | All error messages are visible, descriptive, and include a recovery action | PO |
|
|
367
|
+
| AC-UI4 | Empty states include an illustration and a clear call-to-action | PO + Designer |
|
|
368
|
+
| AC-UI5 | {Platform-specific — e.g., web: "All screens pass WCAG AA contrast check"} | QA |
|
|
369
|
+
| AC-UI6 | {Platform-specific — e.g., app: "Back gesture on all screens returns to correct previous screen"} | QA |
|
|
370
|
+
| AC-UI7 | {Feature-specific UI criterion from Business PRD wireframe section} | PO |
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
# Appendix
|
|
375
|
+
|
|
376
|
+
## Figma Summary
|
|
377
|
+
|
|
378
|
+
| Screen | Figma Frame | Link / Fetch Status |
|
|
379
|
+
|-----------------|--------------------------------------|--------------------------------------|
|
|
380
|
+
| {Screen 1} | [Link]({figma_frames[Screen 1]}) | ✅ Linked & fetched |
|
|
381
|
+
| {Screen 2} | — | ❌ Missing — no node-id link provided |
|
|
382
|
+
|
|
383
|
+
## Design Tokens Referenced
|
|
384
|
+
|
|
385
|
+
| Token | Value | Used in |
|
|
386
|
+
|-----------------------|---------------|---------------------------------|
|
|
387
|
+
| `color.primary` | {#hex} | Primary buttons, links, active states |
|
|
388
|
+
| `color.surface` | {#hex} | Card backgrounds |
|
|
389
|
+
| `spacing.md` | {16px / 4} | Standard vertical gap |
|
|
390
|
+
| `typography.heading2` | {font/size} | Screen titles |
|
|
391
|
+
|
|
392
|
+
## References
|
|
393
|
+
|
|
394
|
+
- [{TICKET-ID}]({prd-path}) — Business PRD (source of AC, UC, BR)
|
|
395
|
+
- {[Other Design Spec](./other-ds.md) — if this feature shares screens}
|
|
396
|
+
|
|
397
|
+
## AI Assumptions
|
|
398
|
+
|
|
399
|
+
> Each assumption below was made because PO input was incomplete.
|
|
400
|
+
> PO must review and confirm before sign-off.
|
|
401
|
+
|
|
402
|
+
- {Assumption 1 — [AI DRAFT]}
|
|
403
|
+
- {One per ❌ Missing screen: "No readable Figma frame for {screen} — text-only draft; blocks sign-off until a node-id link is added."}
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## Changelog
|
|
408
|
+
|
|
409
|
+
| Version | Date | Changes |
|
|
410
|
+
|---------|--------------|-----------------|
|
|
411
|
+
| 1.0 | {YYYY-MM-DD} | Initial version |
|
|
412
|
+
|
|
413
|
+
<!--
|
|
414
|
+
NEXT STEPS:
|
|
415
|
+
1. Fill any ❌ Missing Figma frame links (node-id links) — re-run to fetch & ground them.
|
|
416
|
+
2. Share with Designer — verify Figma links, update component inventory.
|
|
417
|
+
3. PO + Designer sign off: change Status → "approved" (only allowed when 0 screens are ❌ Missing).
|
|
418
|
+
4. Run /generate-bdd "{prd-file}" — BDD uses AC-UI from this spec for FE scenarios.
|
|
419
|
+
-->
|
|
420
|
+
````
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Quality Checklist *(verify before writing)*
|
|
425
|
+
|
|
426
|
+
- [ ] Every screen in Screen Inventory has a complete Screen Spec in Section 2
|
|
427
|
+
- [ ] Every screen has at minimum: default, loading, error states defined
|
|
428
|
+
- [ ] All Figma components mapped in Component Inventory — unmapped flagged as `[NEW]` or `[TODO]`
|
|
429
|
+
- [ ] Only the platform-relevant section generated in Section 3 (no web section in app docs, and vice versa)
|
|
430
|
+
- [ ] Only the platform-relevant section generated in Section 4
|
|
431
|
+
- [ ] AC-UI items are testable (clear pass/fail, not "looks good")
|
|
432
|
+
- [ ] Business PRD cross-reference link is valid relative path
|
|
433
|
+
- [ ] Every screen has a node-level Figma frame link (`?node-id=`) — and screens with a link were fetched via Figma MCP and used to ground the spec
|
|
434
|
+
- [ ] Each ❌ Missing screen is flagged in-spec (`> [DRAFT — no Figma frame...]`), listed in Figma Summary, and has an AI Assumption
|
|
435
|
+
- [ ] If any screen is ❌ Missing → Status stays `draft` and the Output below blocks `/generate-bdd`
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Output
|
|
440
|
+
|
|
441
|
+
{{include:steps/report-footer.md}}
|
|
442
|
+
|
|
443
|
+
{If missing_frames is empty}:
|
|
444
|
+
```
|
|
445
|
+
/generate-design-spec Complete — {TICKET-ID} [{active_platform}]
|
|
446
|
+
---
|
|
447
|
+
Status : ✅ Complete — all {N} screens linked & fetched from Figma
|
|
448
|
+
Output Artifacts:
|
|
449
|
+
created {paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md (v1.0)
|
|
450
|
+
Next : Share with Designer → PO + Designer sign-off (Status: approved)
|
|
451
|
+
→ /generate-bdd {prd-file} (generates BDD per service; reads AC-UI from Design Spec)
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
{If missing_frames is non-empty}:
|
|
455
|
+
```
|
|
456
|
+
/generate-design-spec Complete (DRAFT) — {TICKET-ID} [{active_platform}]
|
|
457
|
+
---
|
|
458
|
+
Status : ⚠️ Warnings — {count} screen(s) without a readable Figma frame: {comma-separated missing_frames}
|
|
459
|
+
Output Artifacts:
|
|
460
|
+
created {paths.specs_dir}/{domain}/{prd-slug}/design-spec/{TICKET-ID}-design-spec-{active_platform}-{slug}.md (v1.0, draft)
|
|
461
|
+
Next : 🔒 Sign-off & /generate-bdd are BLOCKED until every screen has a node-id Figma link.
|
|
462
|
+
1. In Figma: select each missing frame → right-click → Copy link to selection
|
|
463
|
+
2. Re-run /generate-design-spec {prd-file} → AI fetches & grounds the new frames
|
|
464
|
+
```
|