@polymorphism-tech/morph-spec 8.43.0 → 8.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CLAUDE.md +16 -13
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +10 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +22 -17
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/core/worktree-env-inject.js +1 -4
  24. package/framework/hooks/claude-code/statusline.sh +11 -11
  25. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  26. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  27. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  28. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  29. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  30. package/framework/hooks/shared/build-check.js +1 -1
  31. package/framework/hooks/shared/comment-scanner.js +1 -1
  32. package/framework/hooks/shared/phase-utils.js +0 -5
  33. package/framework/hooks/shared/stdin-reader.js +26 -26
  34. package/framework/phases.json +4 -6
  35. package/framework/rubrics/backend.json +1 -1
  36. package/framework/rubrics/default.json +1 -1
  37. package/framework/rubrics/frontend.json +1 -1
  38. package/framework/rules/ai-agents-standards.md +1 -0
  39. package/framework/rules/morph-workflow.md +6 -6
  40. package/framework/schemas/feature.schema.json +2 -28
  41. package/framework/schemas/tasks.schema.json +6 -2
  42. package/framework/skills/README.md +1 -2
  43. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  44. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  45. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  46. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  47. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  48. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  49. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  50. package/framework/skills/core/morph-media/SKILL.md +1 -1
  51. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  52. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  53. package/framework/skills/core/morph-review/SKILL.md +109 -430
  54. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  55. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  56. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  57. package/framework/standards/STANDARDS.json +54 -10
  58. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  59. package/framework/standards/ai-agents/agent-session.md +1 -1
  60. package/framework/standards/ai-agents/agent-spec.md +1 -1
  61. package/framework/standards/ai-agents/batching.md +1 -1
  62. package/framework/standards/ai-agents/context-providers.md +1 -1
  63. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  64. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  65. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  66. package/framework/standards/ai-agents/guardrails.md +1 -1
  67. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  68. package/framework/standards/ai-agents/mcp-server.md +1 -1
  69. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  70. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  71. package/framework/standards/ai-agents/media-video.md +1 -1
  72. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  73. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  74. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  75. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  76. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  77. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  78. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  79. package/framework/standards/ai-agents/production.md +2 -2
  80. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  81. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  82. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  83. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  84. package/framework/standards/ai-agents/setup.md +1 -1
  85. package/framework/standards/ai-agents/structured-output.md +1 -1
  86. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  87. package/framework/standards/ai-agents/testing-ai.md +1 -1
  88. package/framework/standards/ai-agents/tool-adapters.md +226 -0
  89. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  90. package/framework/standards/ai-agents/workflows.md +1 -1
  91. package/framework/standards/infrastructure/docker/local-compose-isolation.md +11 -1
  92. package/framework/templates/CLAUDE.md.core.template +1 -1
  93. package/framework/templates/IDE-SNIPPETS.md +262 -262
  94. package/framework/templates/README.md +1 -1
  95. package/framework/templates/REGISTRY.json +0 -81
  96. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  97. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  98. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  99. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  100. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  101. package/framework/templates/docs/spec.md +19 -205
  102. package/framework/templates/docs/ui-components.md +52 -52
  103. package/framework/templates/docs/ui-design-system.md +76 -76
  104. package/framework/templates/docs/ui-flows.md +167 -167
  105. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  106. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  107. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  108. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  117. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  118. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  119. package/framework/templates/state.template.json +17 -17
  120. package/framework/templates/ui/design-system.css +226 -226
  121. package/package.json +2 -2
  122. package/src/commands/e2e/e2e.js +1 -1
  123. package/src/commands/project/heavy.js +1 -1
  124. package/src/commands/project/status.js +3 -3
  125. package/src/commands/project/worktree.js +34 -16
  126. package/src/commands/state/approve.js +9 -50
  127. package/src/commands/state/finish.js +4 -0
  128. package/src/commands/state/gate-check.js +18 -107
  129. package/src/commands/state/gate-decision.js +1 -1
  130. package/src/commands/state/report-check.js +42 -17
  131. package/src/commands/validation/mutate.js +1 -1
  132. package/src/commands/validation/scout-check.js +28 -0
  133. package/src/commands/validation/validate-feature.js +5 -32
  134. package/src/commands/validation/verify.js +16 -25
  135. package/src/core/paths/output-schema.js +0 -2
  136. package/src/core/state/state-manager.js +1 -2
  137. package/src/core/templates/template-renderer.js +477 -477
  138. package/src/dashboard/app/lib/format.js +5 -0
  139. package/src/dashboard/app/main.jsx +13 -13
  140. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  141. package/src/dashboard/app/pages/Features.jsx +7 -7
  142. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  143. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  144. package/src/dashboard/scanner/docs-scanner.js +1 -2
  145. package/src/dashboard/scanner/features-scanner.js +3 -4
  146. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  147. package/src/dashboard/vite.config.js +24 -24
  148. package/src/lib/agents/output-collector.js +0 -1
  149. package/src/lib/detectors/design-system-detector.js +188 -188
  150. package/src/lib/e2e/compose-env.js +5 -2
  151. package/src/lib/evaluator-report.js +52 -334
  152. package/src/lib/generators/design-system-generator.js +508 -508
  153. package/src/lib/generators/handoff-generator.js +4 -5
  154. package/src/lib/git/evidence-staleness.js +39 -0
  155. package/src/lib/installers/memory-installer.js +2 -2
  156. package/src/lib/mutation/manifest.js +8 -2
  157. package/src/lib/mutation/report.js +5 -3
  158. package/src/lib/mutation/runner.js +9 -7
  159. package/src/lib/risk-detector.js +63 -125
  160. package/src/lib/scout/scout-check.js +293 -0
  161. package/src/lib/tasks/eval-node.js +4 -34
  162. package/src/lib/tasks/task-classifier.js +30 -30
  163. package/src/lib/tasks/task-parser.js +209 -209
  164. package/src/lib/tasks/tasks-json-parser.js +7 -5
  165. package/src/lib/tasks/test-nodes.js +1 -1
  166. package/src/lib/tasks/test-runner.js +1 -1
  167. package/src/lib/validators/contracts/contract-compliance-validator.js +4 -42
  168. package/src/lib/validators/css/css-validator.js +340 -340
  169. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  170. package/src/lib/validators/verify-runner.js +1 -1
  171. package/src/lib/worktree/env-allocator.js +35 -5
  172. package/src/scripts/setup-infra.js +1 -1
  173. package/src/utils/agent-id-mapper.js +11 -11
  174. package/src/utils/agents-installer.js +5 -9
  175. package/src/utils/claude-settings-manager.js +300 -300
  176. package/src/utils/hooks-installer.js +3 -10
  177. package/src/utils/skills-installer.js +1 -1
  178. package/framework/evals/proof-rubrics/README.md +0 -76
  179. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  180. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  181. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  182. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  183. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  184. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  185. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  186. package/framework/evals/rubrics/README.md +0 -45
  187. package/framework/evals/rubrics/architecture.md +0 -103
  188. package/framework/evals/rubrics/code-quality.md +0 -98
  189. package/framework/evals/rubrics/condensed.md +0 -57
  190. package/framework/evals/rubrics/contracts.md +0 -67
  191. package/framework/evals/rubrics/test-coverage.md +0 -99
  192. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  193. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  194. package/framework/evals/suites/standard.yaml +0 -5
  195. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  196. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  197. package/framework/templates/.idea/morph-templates.xml +0 -92
  198. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  199. package/framework/templates/docs/clarifications.md +0 -253
  200. package/framework/templates/docs/onboarding.md +0 -122
  201. package/framework/templates/docs/schema-analysis.md +0 -119
  202. package/framework/templates/docs/user-stories.md +0 -34
  203. package/src/commands/state/score.js +0 -147
@@ -1,76 +1,76 @@
1
- # UI Design System: {{titleCase FEATURE_NAME}}
2
-
3
- | Field | Value |
4
- |-------|-------|
5
- | **Feature** | {{FEATURE_NAME}} |
6
- | **Created** | {{DATE}} |
7
- | **Project** | {{PROJECT_NAME}} |
8
-
9
- ---
10
-
11
- ## Color Palette
12
-
13
- ### Primary Colors
14
- | Token | Value | Usage |
15
- |-------|-------|-------|
16
- | `--color-primary` | #0078D4 | Primary actions, links |
17
- | `--color-primary-hover` | #106EBE | Hover states |
18
-
19
- ### Semantic Colors
20
- | Token | Value | Usage |
21
- |-------|-------|-------|
22
- | `--color-success` | #107C10 | Success states |
23
- | `--color-warning` | #F7630C | Warnings |
24
- | `--color-error` | #D13438 | Errors |
25
-
26
- ---
27
-
28
- ## Typography
29
-
30
- | Token | Size | Weight | Usage |
31
- |-------|------|--------|-------|
32
- | `--text-h1` | 24px | 600 | Section headers |
33
- | `--text-body` | 14px | 400 | Body text |
34
- | `--text-caption` | 12px | 400 | Labels |
35
-
36
- ---
37
-
38
- ## Spacing
39
-
40
- | Token | Value | Usage |
41
- |-------|-------|-------|
42
- | `--space-sm` | 8px | Compact spacing |
43
- | `--space-md` | 16px | Standard spacing |
44
- | `--space-lg` | 24px | Wide spacing |
45
-
46
- ---
47
-
48
- ## Components
49
-
50
- ### Buttons
51
- - **Primary**: `--color-primary` background, white text
52
- - **Secondary**: Transparent, `--color-primary` border
53
- - **Sizes**: Small (24px), Medium (32px), Large (40px)
54
-
55
- ### Forms
56
- - **Input height**: 32px
57
- - **Focus**: 2px solid `--color-primary`
58
- - **Error**: 1px solid `--color-error`
59
-
60
- ---
61
-
62
- ## Accessibility
63
- - [ ] 4.5:1 contrast ratio (WCAG AA)
64
- - [ ] Touch targets minimum 44x44px
65
- - [ ] Keyboard navigation supported
66
-
67
- ---
68
-
69
- ## Responsive Breakpoints
70
- - **Mobile**: < 768px
71
- - **Tablet**: 768px - 1199px
72
- - **Desktop**: ≥ 1200px
73
-
74
- ---
75
-
76
- *Generated with MORPH Framework*
1
+ # UI Design System: {{titleCase FEATURE_NAME}}
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | **Feature** | {{FEATURE_NAME}} |
6
+ | **Created** | {{DATE}} |
7
+ | **Project** | {{PROJECT_NAME}} |
8
+
9
+ ---
10
+
11
+ ## Color Palette
12
+
13
+ ### Primary Colors
14
+ | Token | Value | Usage |
15
+ |-------|-------|-------|
16
+ | `--color-primary` | #0078D4 | Primary actions, links |
17
+ | `--color-primary-hover` | #106EBE | Hover states |
18
+
19
+ ### Semantic Colors
20
+ | Token | Value | Usage |
21
+ |-------|-------|-------|
22
+ | `--color-success` | #107C10 | Success states |
23
+ | `--color-warning` | #F7630C | Warnings |
24
+ | `--color-error` | #D13438 | Errors |
25
+
26
+ ---
27
+
28
+ ## Typography
29
+
30
+ | Token | Size | Weight | Usage |
31
+ |-------|------|--------|-------|
32
+ | `--text-h1` | 24px | 600 | Section headers |
33
+ | `--text-body` | 14px | 400 | Body text |
34
+ | `--text-caption` | 12px | 400 | Labels |
35
+
36
+ ---
37
+
38
+ ## Spacing
39
+
40
+ | Token | Value | Usage |
41
+ |-------|-------|-------|
42
+ | `--space-sm` | 8px | Compact spacing |
43
+ | `--space-md` | 16px | Standard spacing |
44
+ | `--space-lg` | 24px | Wide spacing |
45
+
46
+ ---
47
+
48
+ ## Components
49
+
50
+ ### Buttons
51
+ - **Primary**: `--color-primary` background, white text
52
+ - **Secondary**: Transparent, `--color-primary` border
53
+ - **Sizes**: Small (24px), Medium (32px), Large (40px)
54
+
55
+ ### Forms
56
+ - **Input height**: 32px
57
+ - **Focus**: 2px solid `--color-primary`
58
+ - **Error**: 1px solid `--color-error`
59
+
60
+ ---
61
+
62
+ ## Accessibility
63
+ - [ ] 4.5:1 contrast ratio (WCAG AA)
64
+ - [ ] Touch targets minimum 44x44px
65
+ - [ ] Keyboard navigation supported
66
+
67
+ ---
68
+
69
+ ## Responsive Breakpoints
70
+ - **Mobile**: < 768px
71
+ - **Tablet**: 768px - 1199px
72
+ - **Desktop**: ≥ 1200px
73
+
74
+ ---
75
+
76
+ *Generated with MORPH Framework*
@@ -1,167 +1,167 @@
1
- # UI Flows: {{titleCase FEATURE_NAME}}
2
-
3
- | Field | Value |
4
- |-------|-------|
5
- | **Feature** | {{FEATURE_NAME}} |
6
- | **Created** | {{DATE}} |
7
-
8
- ---
9
-
10
- ## User Stories
11
-
12
- ### US001: {Primary User Story}
13
-
14
- **As** a {user type}
15
- **I want** to {capability}
16
- **So that** {benefit}
17
-
18
- **Acceptance Criteria:**
19
- 1. {Criterion 1}
20
- 2. {Criterion 2}
21
-
22
- ---
23
-
24
- ## Flow Inventory
25
-
26
- | Flow ID | Name | Priority |
27
- |---------|------|----------|
28
- | **F001** | Create New Item | High |
29
- | **F002** | Edit Existing Item | High |
30
- | **F003** | Delete Item | Medium |
31
-
32
- ---
33
-
34
- ## F001: Create New Item
35
-
36
- ### Happy Path
37
-
38
- ```
39
- START
40
- ↓
41
- [User clicks "Add New"]
42
- ↓
43
- [Modal opens with form]
44
- ↓
45
- [User fills required fields]
46
- ↓
47
- [User clicks "Submit"]
48
- ↓
49
- [Validation passes] ✓
50
- ↓
51
- [API call: POST /api/items]
52
- ↓
53
- [Success response]
54
- ↓
55
- [Modal closes]
56
- ↓
57
- [Success toast: "Item created"]
58
- ↓
59
- [Table refreshes]
60
- ↓
61
- END
62
- ```
63
-
64
- **Duration:** 15-30 seconds
65
- **Success Rate Target:** 95%
66
-
67
- ---
68
-
69
- ### Alternative Path: Validation Error
70
-
71
- ```
72
- [User clicks "Submit"]
73
- ↓
74
- [Validation fails] ✕
75
- ↓
76
- [Error messages shown inline]
77
- ↓
78
- [User corrects errors]
79
- ↓
80
- [Real-time validation clears errors]
81
- ↓
82
- → Returns to Happy Path
83
- ```
84
-
85
- ---
86
-
87
- ### Edge Cases
88
-
89
- | Scenario | Behavior |
90
- |----------|----------|
91
- | **Duplicate Name** | Show warning, allow submit |
92
- | **Network Error** | Show error toast, preserve data |
93
- | **Session Expired** | Redirect to login |
94
-
95
- ---
96
-
97
- ## F002: Edit Existing Item
98
-
99
- ```
100
- [User clicks "Edit"]
101
- ↓
102
- [Modal opens with pre-filled form]
103
- ↓
104
- [User modifies fields]
105
- ↓
106
- [User clicks "Save"]
107
- ↓
108
- [API call: PUT /api/items/{id}]
109
- ↓
110
- [Success toast]
111
- ↓
112
- [Table refreshes]
113
- END
114
- ```
115
-
116
- ---
117
-
118
- ## F003: Delete Item
119
-
120
- ```
121
- [User clicks "Delete"]
122
- ↓
123
- [Confirmation dialog: "Delete item?"]
124
- ↓
125
- [User confirms]
126
- ↓
127
- [API call: DELETE /api/items/{id}]
128
- ↓
129
- [Success toast]
130
- ↓
131
- [Table refreshes]
132
- END
133
- ```
134
-
135
- ---
136
-
137
- ## Toast Notifications
138
-
139
- | Event | Type | Message | Duration |
140
- |-------|------|---------|----------|
141
- | **Item Created** | Success | "Item created successfully" | 3s |
142
- | **Item Updated** | Success | "Item updated successfully" | 3s |
143
- | **Item Deleted** | Success | "Item deleted successfully" | 3s |
144
- | **Error** | Error | "Something went wrong" | 5s |
145
-
146
- ---
147
-
148
- ## Keyboard Shortcuts
149
-
150
- | Shortcut | Action |
151
- |----------|--------|
152
- | **Ctrl+N** | New Item |
153
- | **Escape** | Close modal |
154
- | **Enter** | Submit form |
155
-
156
- ---
157
-
158
- ## Performance Targets
159
-
160
- | Flow | Target |
161
- |------|--------|
162
- | **Create Item** | < 2s (API response) |
163
- | **Search** | < 500ms |
164
-
165
- ---
166
-
167
- *Generated with MORPH Framework*
1
+ # UI Flows: {{titleCase FEATURE_NAME}}
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | **Feature** | {{FEATURE_NAME}} |
6
+ | **Created** | {{DATE}} |
7
+
8
+ ---
9
+
10
+ ## User Stories
11
+
12
+ ### US001: {Primary User Story}
13
+
14
+ **As** a {user type}
15
+ **I want** to {capability}
16
+ **So that** {benefit}
17
+
18
+ **Acceptance Criteria:**
19
+ 1. {Criterion 1}
20
+ 2. {Criterion 2}
21
+
22
+ ---
23
+
24
+ ## Flow Inventory
25
+
26
+ | Flow ID | Name | Priority |
27
+ |---------|------|----------|
28
+ | **F001** | Create New Item | High |
29
+ | **F002** | Edit Existing Item | High |
30
+ | **F003** | Delete Item | Medium |
31
+
32
+ ---
33
+
34
+ ## F001: Create New Item
35
+
36
+ ### Happy Path
37
+
38
+ ```
39
+ START
40
+ ↓
41
+ [User clicks "Add New"]
42
+ ↓
43
+ [Modal opens with form]
44
+ ↓
45
+ [User fills required fields]
46
+ ↓
47
+ [User clicks "Submit"]
48
+ ↓
49
+ [Validation passes] ✓
50
+ ↓
51
+ [API call: POST /api/items]
52
+ ↓
53
+ [Success response]
54
+ ↓
55
+ [Modal closes]
56
+ ↓
57
+ [Success toast: "Item created"]
58
+ ↓
59
+ [Table refreshes]
60
+ ↓
61
+ END
62
+ ```
63
+
64
+ **Duration:** 15-30 seconds
65
+ **Success Rate Target:** 95%
66
+
67
+ ---
68
+
69
+ ### Alternative Path: Validation Error
70
+
71
+ ```
72
+ [User clicks "Submit"]
73
+ ↓
74
+ [Validation fails] ✕
75
+ ↓
76
+ [Error messages shown inline]
77
+ ↓
78
+ [User corrects errors]
79
+ ↓
80
+ [Real-time validation clears errors]
81
+ ↓
82
+ → Returns to Happy Path
83
+ ```
84
+
85
+ ---
86
+
87
+ ### Edge Cases
88
+
89
+ | Scenario | Behavior |
90
+ |----------|----------|
91
+ | **Duplicate Name** | Show warning, allow submit |
92
+ | **Network Error** | Show error toast, preserve data |
93
+ | **Session Expired** | Redirect to login |
94
+
95
+ ---
96
+
97
+ ## F002: Edit Existing Item
98
+
99
+ ```
100
+ [User clicks "Edit"]
101
+ ↓
102
+ [Modal opens with pre-filled form]
103
+ ↓
104
+ [User modifies fields]
105
+ ↓
106
+ [User clicks "Save"]
107
+ ↓
108
+ [API call: PUT /api/items/{id}]
109
+ ↓
110
+ [Success toast]
111
+ ↓
112
+ [Table refreshes]
113
+ END
114
+ ```
115
+
116
+ ---
117
+
118
+ ## F003: Delete Item
119
+
120
+ ```
121
+ [User clicks "Delete"]
122
+ ↓
123
+ [Confirmation dialog: "Delete item?"]
124
+ ↓
125
+ [User confirms]
126
+ ↓
127
+ [API call: DELETE /api/items/{id}]
128
+ ↓
129
+ [Success toast]
130
+ ↓
131
+ [Table refreshes]
132
+ END
133
+ ```
134
+
135
+ ---
136
+
137
+ ## Toast Notifications
138
+
139
+ | Event | Type | Message | Duration |
140
+ |-------|------|---------|----------|
141
+ | **Item Created** | Success | "Item created successfully" | 3s |
142
+ | **Item Updated** | Success | "Item updated successfully" | 3s |
143
+ | **Item Deleted** | Success | "Item deleted successfully" | 3s |
144
+ | **Error** | Error | "Something went wrong" | 5s |
145
+
146
+ ---
147
+
148
+ ## Keyboard Shortcuts
149
+
150
+ | Shortcut | Action |
151
+ |----------|--------|
152
+ | **Ctrl+N** | New Item |
153
+ | **Escape** | Close modal |
154
+ | **Enter** | Submit form |
155
+
156
+ ---
157
+
158
+ ## Performance Targets
159
+
160
+ | Flow | Target |
161
+ |------|--------|
162
+ | **Create Item** | < 2s (API response) |
163
+ | **Search** | < 500ms |
164
+
165
+ ---
166
+
167
+ *Generated with MORPH Framework*
@@ -1,26 +1,26 @@
1
- // features/{{kebabCase featureName}}/components/{{kebabCase featureName}}-list.tsx
2
- 'use client';
3
-
4
- import { use{{pascalCase featureName}}s } from '@/features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s';
5
- import { DataTable } from '@/components/data-table';
6
- import type { {{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
7
- import type { ColumnDef } from '@tanstack/react-table';
8
-
9
- const columns: ColumnDef<{{pascalCase featureName}}>[] = [
10
- { accessorKey: 'id', header: 'ID' },
11
- { accessorKey: 'name', header: 'Name' },
12
- ];
13
-
14
- interface {{pascalCase featureName}}ListProps {
15
- initialData?: {{pascalCase featureName}}[];
16
- }
17
-
18
- export function {{pascalCase featureName}}List({ initialData }: {{pascalCase featureName}}ListProps) {
19
- const { data = initialData ?? [], isLoading } = use{{pascalCase featureName}}s();
20
-
21
- if (isLoading) {
22
- return <div className="flex items-center justify-center h-32">Loading...</div>;
23
- }
24
-
25
- return <DataTable columns={columns} data={data} />;
26
- }
1
+ // features/{{kebabCase featureName}}/components/{{kebabCase featureName}}-list.tsx
2
+ 'use client';
3
+
4
+ import { use{{pascalCase featureName}}s } from '@/features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s';
5
+ import { DataTable } from '@/components/data-table';
6
+ import type { {{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
7
+ import type { ColumnDef } from '@tanstack/react-table';
8
+
9
+ const columns: ColumnDef<{{pascalCase featureName}}>[] = [
10
+ { accessorKey: 'id', header: 'ID' },
11
+ { accessorKey: 'name', header: 'Name' },
12
+ ];
13
+
14
+ interface {{pascalCase featureName}}ListProps {
15
+ initialData?: {{pascalCase featureName}}[];
16
+ }
17
+
18
+ export function {{pascalCase featureName}}List({ initialData }: {{pascalCase featureName}}ListProps) {
19
+ const { data = initialData ?? [], isLoading } = use{{pascalCase featureName}}s();
20
+
21
+ if (isLoading) {
22
+ return <div className="flex items-center justify-center h-32">Loading...</div>;
23
+ }
24
+
25
+ return <DataTable columns={columns} data={data} />;
26
+ }
@@ -1,56 +1,56 @@
1
- // features/{{kebabCase featureName}}/components/create-{{kebabCase featureName}}-form.tsx
2
- 'use client';
3
-
4
- import { useForm } from 'react-hook-form';
5
- import { zodResolver } from '@hookform/resolvers/zod';
6
- import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
7
- import { Input } from '@/components/ui/input';
8
- import { Button } from '@/components/ui/button';
9
- import { useCreate{{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/hooks/use-create-{{kebabCase featureName}}';
10
- import { create{{pascalCase featureName}}Schema, type Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
11
-
12
- interface Create{{pascalCase featureName}}FormProps {
13
- onSuccess?: () => void;
14
- }
15
-
16
- export function Create{{pascalCase featureName}}Form({ onSuccess }: Create{{pascalCase featureName}}FormProps) {
17
- const form = useForm<Create{{pascalCase featureName}}Input>({
18
- resolver: zodResolver(create{{pascalCase featureName}}Schema),
19
- defaultValues: { name: '' },
20
- });
21
-
22
- const { mutate: create{{pascalCase featureName}}, isPending } = useCreate{{pascalCase featureName}}();
23
-
24
- function onSubmit(values: Create{{pascalCase featureName}}Input) {
25
- create{{pascalCase featureName}}(values, {
26
- onSuccess: () => { form.reset(); onSuccess?.(); },
27
- onError: (error) => { form.setError('root', { message: error.message }); },
28
- });
29
- }
30
-
31
- return (
32
- <Form {...form}>
33
- <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
34
- <FormField
35
- control={form.control}
36
- name="name"
37
- render={({ field }) => (
38
- <FormItem>
39
- <FormLabel>Name</FormLabel>
40
- <FormControl>
41
- <Input placeholder="Enter name" {...field} />
42
- </FormControl>
43
- <FormMessage />
44
- </FormItem>
45
- )}
46
- />
47
- {form.formState.errors.root && (
48
- <p className="text-sm text-destructive">{form.formState.errors.root.message}</p>
49
- )}
50
- <Button type="submit" disabled={isPending}>
51
- {isPending ? 'Creating...' : 'Create {{pascalCase featureName}}'}
52
- </Button>
53
- </form>
54
- </Form>
55
- );
56
- }
1
+ // features/{{kebabCase featureName}}/components/create-{{kebabCase featureName}}-form.tsx
2
+ 'use client';
3
+
4
+ import { useForm } from 'react-hook-form';
5
+ import { zodResolver } from '@hookform/resolvers/zod';
6
+ import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
7
+ import { Input } from '@/components/ui/input';
8
+ import { Button } from '@/components/ui/button';
9
+ import { useCreate{{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/hooks/use-create-{{kebabCase featureName}}';
10
+ import { create{{pascalCase featureName}}Schema, type Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
11
+
12
+ interface Create{{pascalCase featureName}}FormProps {
13
+ onSuccess?: () => void;
14
+ }
15
+
16
+ export function Create{{pascalCase featureName}}Form({ onSuccess }: Create{{pascalCase featureName}}FormProps) {
17
+ const form = useForm<Create{{pascalCase featureName}}Input>({
18
+ resolver: zodResolver(create{{pascalCase featureName}}Schema),
19
+ defaultValues: { name: '' },
20
+ });
21
+
22
+ const { mutate: create{{pascalCase featureName}}, isPending } = useCreate{{pascalCase featureName}}();
23
+
24
+ function onSubmit(values: Create{{pascalCase featureName}}Input) {
25
+ create{{pascalCase featureName}}(values, {
26
+ onSuccess: () => { form.reset(); onSuccess?.(); },
27
+ onError: (error) => { form.setError('root', { message: error.message }); },
28
+ });
29
+ }
30
+
31
+ return (
32
+ <Form {...form}>
33
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
34
+ <FormField
35
+ control={form.control}
36
+ name="name"
37
+ render={({ field }) => (
38
+ <FormItem>
39
+ <FormLabel>Name</FormLabel>
40
+ <FormControl>
41
+ <Input placeholder="Enter name" {...field} />
42
+ </FormControl>
43
+ <FormMessage />
44
+ </FormItem>
45
+ )}
46
+ />
47
+ {form.formState.errors.root && (
48
+ <p className="text-sm text-destructive">{form.formState.errors.root.message}</p>
49
+ )}
50
+ <Button type="submit" disabled={isPending}>
51
+ {isPending ? 'Creating...' : 'Create {{pascalCase featureName}}'}
52
+ </Button>
53
+ </form>
54
+ </Form>
55
+ );
56
+ }