@polymorphism-tech/morph-spec 8.47.0 → 9.0.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 (222) hide show
  1. package/CLAUDE.md +48 -39
  2. package/README.md +3 -4
  3. package/bin/morph-spec.js +37 -51
  4. package/bin/validate.js +3 -111
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/CLAUDE.md +41 -101
  9. package/framework/MORPH.md +95 -252
  10. package/framework/agents.json +75 -18
  11. package/framework/commands/morph-apply.md +5 -28
  12. package/framework/commands/morph-archive.md +1 -1
  13. package/framework/commands/morph-hotfix.md +8 -8
  14. package/framework/commands/morph-infra.md +1 -1
  15. package/framework/commands/morph-preflight.md +2 -3
  16. package/framework/commands/morph-proposal.md +2 -50
  17. package/framework/commands/morph-status.md +3 -3
  18. package/framework/docs/CLI.md +585 -286
  19. package/framework/evals/review-checklist.md +82 -41
  20. package/framework/hooks/README.md +10 -11
  21. package/framework/hooks/claude-code/core/comment-guard.js +1 -1
  22. package/framework/hooks/claude-code/core/denylist.json +33 -3
  23. package/framework/hooks/claude-code/core/enforce-phase-writes.js +16 -20
  24. package/framework/hooks/claude-code/core/gate-guard.js +2 -11
  25. package/framework/hooks/claude-code/core/pre-bash-denylist.js +38 -0
  26. package/framework/hooks/claude-code/core/protect-spec-files.js +30 -242
  27. package/framework/hooks/claude-code/core/state-sync.js +7 -21
  28. package/framework/hooks/claude-code/core/telemetry-log.js +3 -3
  29. package/framework/hooks/claude-code/core/validate-completion.js +33 -97
  30. package/framework/hooks/claude-code/core/warn-bash-source-write.js +31 -0
  31. package/framework/hooks/claude-code/core/worktree-context.js +5 -4
  32. package/framework/hooks/claude-code/statusline.py +55 -41
  33. package/framework/hooks/package.json +3 -0
  34. package/framework/hooks/shared/activity-logger.js +1 -1
  35. package/framework/hooks/shared/build-check.js +10 -6
  36. package/framework/hooks/shared/command-tokens.js +169 -0
  37. package/framework/hooks/shared/comment-rules.js +1 -1
  38. package/framework/hooks/shared/comment-scanner.js +10 -23
  39. package/framework/hooks/shared/comment-stripper.js +1 -1
  40. package/framework/hooks/shared/e2e-check.js +64 -27
  41. package/framework/hooks/shared/errata.js +72 -0
  42. package/framework/hooks/shared/feature-locator.js +1 -1
  43. package/framework/hooks/shared/frontend-locations.js +6 -0
  44. package/framework/hooks/shared/gate-question.js +18 -0
  45. package/framework/hooks/shared/phase-utils.js +15 -32
  46. package/framework/hooks/shared/slice-progress.js +118 -0
  47. package/framework/hooks/shared/spawn-command.js +23 -0
  48. package/framework/hooks/shared/state-reader.js +61 -87
  49. package/framework/hooks/shared/state-writer.js +2 -3
  50. package/framework/mcp/registry.json +3 -4
  51. package/framework/phases.json +23 -39
  52. package/framework/schemas/config.schema.json +14 -9
  53. package/framework/schemas/feature.schema.json +15 -50
  54. package/framework/skills/README.md +3 -4
  55. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  56. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  57. package/framework/skills/core/morph-apply/SKILL.md +149 -222
  58. package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
  59. package/framework/skills/core/morph-machine/SKILL.md +2 -2
  60. package/framework/skills/core/morph-media/SKILL.md +1 -1
  61. package/framework/skills/core/morph-plan/SKILL.md +137 -299
  62. package/framework/skills/core/morph-review/SKILL.md +111 -136
  63. package/framework/skills/core/morph-standards/SKILL.md +27 -39
  64. package/framework/skills/core/morph-uiux/SKILL.md +77 -152
  65. package/framework/standards/STANDARDS.json +86 -1218
  66. package/framework/standards/STANDARDS.meta.json +1305 -0
  67. package/framework/standards/ai-agents/evals-with-cache.md +1 -2
  68. package/framework/standards/ai-agents/setup.md +1 -1
  69. package/framework/standards/architecture/code-comments.md +6 -6
  70. package/framework/standards/integration/mcp/mcp-tools.md +7 -7
  71. package/framework/templates/README.md +2 -3
  72. package/framework/templates/REGISTRY.json +6 -170
  73. package/framework/templates/docs/plan.md +72 -0
  74. package/framework/templates/dotnet/ai-kit/README.md +1 -9
  75. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
  76. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
  77. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  78. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
  79. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
  80. package/package.json +1 -1
  81. package/src/commands/e2e/e2e.js +2 -2
  82. package/src/commands/observability/cost.js +18 -60
  83. package/src/commands/project/doctor-procs.js +1 -1
  84. package/src/commands/project/doctor.js +9 -9
  85. package/src/commands/project/fleet.js +4 -4
  86. package/src/commands/project/heavy.js +3 -3
  87. package/src/commands/project/init.js +4 -0
  88. package/src/commands/project/setup-infra-cmd.js +2 -1
  89. package/src/commands/project/stack-scan.js +58 -0
  90. package/src/commands/project/standards.js +79 -25
  91. package/src/commands/project/status.js +29 -69
  92. package/src/commands/project/update.js +17 -1
  93. package/src/commands/project/worktree.js +1 -1
  94. package/src/commands/state/advance.js +62 -46
  95. package/src/commands/state/approve.js +81 -141
  96. package/src/commands/state/archive.js +20 -84
  97. package/src/commands/state/auto-approval.js +68 -0
  98. package/src/commands/state/create.js +28 -1
  99. package/src/commands/state/delete.js +1 -1
  100. package/src/commands/state/finish.js +11 -23
  101. package/src/commands/state/gate-check.js +85 -84
  102. package/src/commands/state/gate-decision.js +6 -4
  103. package/src/commands/state/handoff.js +1 -1
  104. package/src/commands/state/list.js +9 -9
  105. package/src/commands/state/report-check.js +157 -311
  106. package/src/commands/state/retype.js +9 -3
  107. package/src/commands/validation/mutate.js +77 -14
  108. package/src/commands/validation/plan-check.js +81 -0
  109. package/src/commands/validation/validate-feature.js +60 -135
  110. package/src/commands/validation/verify.js +40 -72
  111. package/src/core/paths/output-schema.js +19 -66
  112. package/src/core/state/gate-order.js +5 -6
  113. package/src/core/state/lifecycle-audit.js +2 -2
  114. package/src/core/state/state-manager.js +17 -98
  115. package/src/core/templates/template-registry.js +2 -2
  116. package/src/core/templates/template-seed.js +22 -0
  117. package/src/core/work-types.js +10 -10
  118. package/src/dashboard/app/components/ActivityFeed.jsx +2 -3
  119. package/src/dashboard/app/components/CommandPalette.jsx +5 -5
  120. package/src/dashboard/app/components/EntityLink.jsx +1 -1
  121. package/src/dashboard/app/hooks/useMorphQuery.js +1 -1
  122. package/src/dashboard/app/lib/phases.js +2 -4
  123. package/src/dashboard/app/pages/Activity.jsx +1 -1
  124. package/src/dashboard/app/pages/FeatureDetail.jsx +139 -129
  125. package/src/dashboard/app/pages/Features.jsx +9 -9
  126. package/src/dashboard/app/pages/Guide.jsx +2 -2
  127. package/src/dashboard/app/pages/PhasePipeline.jsx +3 -4
  128. package/src/dashboard/app/pages/Standards.jsx +1 -1
  129. package/src/dashboard/scanner/activity-scanner.js +5 -15
  130. package/src/dashboard/scanner/agents-scanner.js +1 -1
  131. package/src/dashboard/scanner/docs-scanner.js +2 -2
  132. package/src/dashboard/scanner/features-scanner.js +95 -60
  133. package/src/dashboard/scanner/project-api.js +1 -1
  134. package/src/dashboard/scanner/standards-scanner.js +2 -1
  135. package/src/lib/ci/ci-verify.js +17 -1
  136. package/src/lib/ci/github-ci.js +1 -1
  137. package/src/lib/detectors/index.js +3 -8
  138. package/src/lib/generators/handoff-generator.js +34 -65
  139. package/src/lib/generators/settings-generator.js +11 -89
  140. package/src/lib/git/evidence-staleness.js +1 -1
  141. package/src/lib/git/tree-fingerprint.js +19 -7
  142. package/src/lib/git/tree-state.js +2 -2
  143. package/src/lib/heavy/cleanup.js +1 -5
  144. package/src/lib/installers/memory-installer.js +6 -8
  145. package/src/lib/mutation/commands.js +3 -2
  146. package/src/lib/{tasks/dotnet-test-introspection.js → mutation/dotnet-introspection.js} +17 -282
  147. package/src/lib/mutation/plan.js +14 -6
  148. package/src/lib/mutation/runner.js +1 -1
  149. package/src/lib/mutation/subset.js +46 -9
  150. package/src/lib/plan/artifact-vocabulary.js +60 -0
  151. package/src/lib/plan/checks.js +234 -0
  152. package/src/lib/plan/plan-parser.js +209 -0
  153. package/src/lib/plan/plan-template.js +18 -0
  154. package/src/lib/review-reports.js +222 -0
  155. package/src/lib/risk-detector.js +131 -140
  156. package/src/lib/specs/adr-index.js +50 -69
  157. package/src/lib/specs/design-seed.js +18 -0
  158. package/src/lib/specs/frontmatter.js +44 -0
  159. package/src/lib/specs/gfm-table.js +17 -0
  160. package/src/lib/specs/old-format.js +68 -0
  161. package/src/lib/specs/revocations.js +37 -95
  162. package/src/lib/specs/screen-checklist.js +18 -17
  163. package/src/lib/stack/dotnet-build-ignores.js +47 -0
  164. package/src/lib/stack/stack-scan.js +267 -0
  165. package/src/lib/standards/registry.js +43 -0
  166. package/src/lib/standards/sections.js +58 -0
  167. package/src/lib/tasks/eval-node.js +4 -12
  168. package/src/lib/tasks/test-nodes.js +1 -74
  169. package/src/lib/tasks/test-runner.js +75 -117
  170. package/src/lib/telemetry/metrics.js +8 -69
  171. package/src/lib/telemetry/telemetry-reader.js +5 -118
  172. package/src/lib/telemetry/verify-event.js +5 -7
  173. package/src/lib/validators/code-budget/code-budget-validator.js +1 -1
  174. package/src/lib/validators/contracts/contract-compliance-validator.js +2 -2
  175. package/src/lib/validators/reuse/reuse-validator.js +22 -45
  176. package/src/lib/validators/traceability-check.js +85 -129
  177. package/src/lib/validators/verify-runner.js +118 -235
  178. package/src/lib/worktree/docker-audit.js +1 -2
  179. package/src/lib/worktree/fleet-scanner.js +25 -38
  180. package/src/scripts/setup-infra.js +9 -0
  181. package/src/utils/agents-installer.js +76 -9
  182. package/src/utils/claude-settings-manager.js +0 -35
  183. package/src/utils/file-copier.js +27 -1
  184. package/src/utils/hooks-installer.js +16 -9
  185. package/src/utils/skills-installer.js +1 -2
  186. package/framework/evals/trace-schema.md +0 -67
  187. package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
  188. package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
  189. package/framework/hooks/git/pre-commit/specs.sh +0 -50
  190. package/framework/hooks/shared/tasks-validator.js +0 -111
  191. package/framework/rules/morph-task-tracking.md +0 -54
  192. package/framework/rules/morph-workflow.md +0 -244
  193. package/framework/schemas/tasks.schema.json +0 -79
  194. package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
  195. package/framework/skills/core/morph-implement/SKILL.md +0 -194
  196. package/framework/skills/core/morph-proposal/SKILL.md +0 -152
  197. package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
  198. package/framework/templates/docs/proposal.md +0 -192
  199. package/framework/templates/docs/spec.md +0 -57
  200. package/framework/templates/docs/ui-components.md +0 -52
  201. package/framework/templates/docs/ui-design-system.md +0 -76
  202. package/framework/templates/docs/ui-flows.md +0 -167
  203. package/framework/templates/examples/spec-examples.md +0 -91
  204. package/framework/templates/feature/decisions.md +0 -124
  205. package/framework/templates/feature/recap.md +0 -145
  206. package/framework/templates/tasks.template.json +0 -17
  207. package/src/commands/state/usecase.js +0 -143
  208. package/src/commands/tasks/dag.js +0 -181
  209. package/src/lib/agents/output-collector.js +0 -76
  210. package/src/lib/evaluator-report.js +0 -104
  211. package/src/lib/specs/acervo-format.js +0 -70
  212. package/src/lib/specs/acervo-lifecycle.js +0 -264
  213. package/src/lib/specs/done-criteria-check.js +0 -200
  214. package/src/lib/specs/usecase-check.js +0 -301
  215. package/src/lib/specs/usecase-promoter.js +0 -301
  216. package/src/lib/specs/usecase-registry.js +0 -237
  217. package/src/lib/tasks/dispatch-planner.js +0 -319
  218. package/src/lib/tasks/mermaid-renderer.js +0 -132
  219. package/src/lib/tasks/task-classifier.js +0 -30
  220. package/src/lib/tasks/task-parser.js +0 -209
  221. package/src/lib/tasks/tasks-json-parser.js +0 -296
  222. package/src/lib/tasks/test-scope.js +0 -597
@@ -1,192 +0,0 @@
1
- # Feature Proposal: {{titleCase FEATURE_NAME}}
2
-
3
- > Proposal for a new feature. This document describes WHAT and WHY.
4
- > For technical details, see `spec.md`.
5
-
6
- ## Metadata
7
-
8
- | Field | Value |
9
- |-------|-------|
10
- | **Proposed** | {{DATE}} |
11
- | **Author** | {{AUTHOR}} |
12
- | **Status** | Draft / Under Review / Approved / Rejected |
13
- | **Priority** | High / Medium / Low |
14
- {{#if STACK}}| **Stack** | {{STACK}} |{{/if}}
15
-
16
- ---
17
-
18
- ## Overview
19
-
20
- {Brief 2-3 sentence summary of the feature}
21
-
22
- ---
23
-
24
- ## Acceptance Criteria
25
-
26
- Verifiable conditions that mean this feature is done:
27
-
28
- - [ ] {Criterion 1 — observable / testable}
29
- - [ ] {Criterion 2}
30
- - [ ] {Criterion 3}
31
-
32
- ---
33
-
34
- ## Problem Statement
35
-
36
- ### What is the problem?
37
-
38
- {Describe the problem this feature solves. Be specific.}
39
-
40
- ### Who is affected?
41
-
42
- {Who suffers from this problem? End users? Developers? Operations?}
43
-
44
- ### What is the impact?
45
-
46
- {What is the impact of NOT solving this problem?}
47
- - User productivity loss: {X}
48
- - Revenue/Cost impact: {X}
49
- - User satisfaction: {X}
50
-
51
- ---
52
-
53
- ## Proposed Solution
54
-
55
- ### Overview
56
-
57
- {Describe the proposed solution in 2-3 paragraphs}
58
-
59
- ### Key Features
60
-
61
- 1. **{Feature 1}** - {brief description}
62
- 2. **{Feature 2}** - {brief description}
63
- 3. **{Feature 3}** - {brief description}
64
-
65
- {{#if (eq STACK "nextjs-neon")}}
66
- ### Technical Approach
67
-
68
- | Layer | Technology | Role |
69
- |-------|-----------|------|
70
- | **Database** | Neon (PostgreSQL + RLS) | {tables, policies, storage} |
71
- | **Backend API** | .NET 10 Minimal API | {endpoints, business logic} |
72
- | **Frontend** | Next.js 15 (App Router) | {pages, components, auth} |
73
- | **Infra** | Coolify + Docker | {deployment, SSL} |
74
- {{/if}}
75
-
76
- ### User Journey
77
-
78
- ```
79
- 1. User {initial action}
80
- 2. System {response}
81
- 3. User {next action}
82
- 4. System {final result}
83
- ```
84
-
85
- ---
86
-
87
- {{#if (eq STACK "nextjs-neon")}}
88
- ## Cost Estimate
89
-
90
- | Resource | Provider | Monthly Cost | Notes |
91
- |----------|----------|-------------|-------|
92
- | Neon | Free / Launch | $0 - $19 | {DB, Connection Pooling, Branching} |
93
- | VPS (Coolify) | {provider} | ${X} | {API + Web containers} |
94
- | External APIs | {provider} | ${X} | {if applicable} |
95
- | **Total** | | **${X}/month** | |
96
-
97
- ---
98
-
99
- {{/if}}
100
- ## Success Metrics
101
-
102
- How will we know this feature is successful?
103
-
104
- | Metric | Current | Target |
105
- |--------|---------|--------|
106
- | {Metric 1} | {X} | {Y} |
107
- | {Metric 2} | {X} | {Y} |
108
-
109
- ---
110
-
111
- ## Scope
112
-
113
- ### In Scope
114
-
115
- - {Item 1 that is included}
116
- - {Item 2 that is included}
117
- - {Item 3 that is included}
118
-
119
- ### Out of Scope
120
-
121
- - {Item 1 that is NOT included}
122
- - {Item 2 that is NOT included}
123
-
124
- ### Future Considerations
125
-
126
- - {Item that could be added later}
127
-
128
- ---
129
-
130
- ## Risks & Concerns
131
-
132
- | Risk | Likelihood | Impact | Mitigation |
133
- |------|------------|--------|------------|
134
- | {Risk 1} | High/Med/Low | High/Med/Low | {mitigation strategy} |
135
- | {Risk 2} | High/Med/Low | High/Med/Low | {mitigation strategy} |
136
-
137
- ---
138
-
139
- ## Conflitos com o acervo
140
-
141
- UCs (`.morph/specs/usecases/`), ADRs ativos (`.morph/specs/adrs/`) and `.morph/context/*.md` that
142
- this request contradicts. `Nenhum conflito encontrado.` when there is none — the section is always present.
143
-
144
- | Fonte | O que diz hoje | O que o pedido muda | Decisão |
145
- |-------|----------------|---------------------|---------|
146
- | {UC-133} | {Public Sans + Lora em toda a interface} | {admin passa a Geist} | {vale o novo no admin; a vitrine mantém o antigo — decisions.md ADR-001} |
147
-
148
- ---
149
-
150
- ## Dependencies
151
-
152
- - [ ] {Dependency 1} - {status}
153
- - [ ] {Dependency 2} - {status}
154
-
155
- ---
156
-
157
- ## Estimated Effort
158
-
159
- | Phase | Estimate |
160
- |-------|----------|
161
- | Design & Spec | {X}h |
162
- {{#if (eq STACK "nextjs-neon")}}| Database & Migrations | {X}h |
163
- | Backend API | {X}h |
164
- | Frontend | {X}h |
165
- {{else}}| Implementation | {X}h |
166
- {{/if}}| Testing | {X}h |
167
- | **Total** | **{X}h** |
168
-
169
- ---
170
-
171
- ## Questions & Clarifications
172
-
173
- 1. {Question 1 that needs answering}
174
- 2. {Question 2 that needs answering}
175
-
176
- ---
177
-
178
- ## Next Steps
179
-
180
- Once approved:
181
- 1. Create detailed `spec.md` with technical design
182
- {{#if (eq STACK "nextjs-neon")}}2. Define contracts (`contracts.cs` + `contracts.ts`)
183
- 3. Record decisions in `decisions.md`
184
- 4. Break down into `tasks.json`
185
- 5. Begin implementation
186
- {{else}}2. Break down into `tasks.json`
187
- 3. Begin implementation
188
- {{/if}}
189
-
190
- ---
191
-
192
- *Created with MORPH Framework*
@@ -1,57 +0,0 @@
1
- # Feature Specification: {{titleCase FEATURE_NAME}}
2
-
3
- | Field | Value |
4
- |-------|-------|
5
- | **ID** | {{FEATURE_NAME}} |
6
- | **Created** | {{DATE}} |
7
- | **Stack** | {{STACK}} |
8
-
9
- > Behavior lives in the use cases (`2-plan/usecases/UC-*.md`). This file says HOW they are realized —
10
- > do not repeat postconditions here.
11
-
12
- ## Architecture
13
-
14
- {Components, how they connect, main data flows. Enough to implement without basic questions.}
15
-
16
- ### Data Model
17
-
18
- | Entity | Field | Type | Notes |
19
- |--------|-------|------|-------|
20
- | {Entity} | {field} | {type} | {constraint, index, relation} |
21
-
22
- ### Contracts
23
-
24
- ```
25
- {METHOD} /api/{route}
26
- Request: { ... }
27
- Response: { ... } | ProblemDetails 400/404/409
28
- ```
29
-
30
- ## Technical edge cases
31
-
32
- - {Edge case} → {how it is handled}
33
-
34
- ## UCs e ADRs que esta feature altera ou revoga
35
-
36
- > Read by `morph-spec finish`: in the archive commit, each row marks the project acervo — a UC turns
37
- > `status: superseded` + `superseded_by` (+ `scope` when partial); an ADR leaves `.morph/specs/adrs/`
38
- > (total) or keeps its file with the scope where it still holds (partial). Columns are positional.
39
- > `morph-spec usecase check {feature}` reports a bad row while this file can still change (it freezes at Gate 2).
40
- > Nothing revoked → replace the table with `Nenhum.`
41
-
42
- | Id | Mudança | Substituto | Escopo em que o antigo ainda vale |
43
- |----|---------|------------|-----------------------------------|
44
- | UC-{nn} | parcial | UC-{nn} | {where the old one still holds} |
45
- | {feature}/ADR-{nnn} | total | — | — |
46
-
47
- ## Contrato de implementação
48
-
49
- - **Standards:** {ids from `morph-spec standards --find`, plus `architecture-code-comments` and the stack's test standard}
50
- - **Proibições desta feature:** {beyond MORPH.md "Stack baked-in", or "nenhuma"}
51
- - **Verificação de runtime:** {how the stack comes up (`morph-spec e2e up {feature}`), which flows the evaluator navigates, which become Playwright specs, auth setup — or why it does not apply}
52
- - **Baseline:** {the COMMAND that measures it — `dotnet test`, `npm test` — never a number}
53
- - **Pré-requisito:** {a PREDICATE — `git merge-base --is-ancestor origin/main HEAD` exits 0 — never a SHA}
54
-
55
- ## Out of Scope
56
-
57
- - {Item}
@@ -1,52 +0,0 @@
1
- # UI Components: {{titleCase FEATURE_NAME}}
2
-
3
- | Field | Value |
4
- |-------|-------|
5
- | **Feature** | {{FEATURE_NAME}} |
6
- | **Created** | {{DATE}} |
7
- | **Stack** | {{STACK}} |
8
-
9
- ---
10
-
11
- {{#if (eq STACK "nextjs-neon")}}
12
- ## Component Library: shadcn/ui
13
-
14
- ### C001: Button
15
-
16
- ```tsx
17
- import { Button } from '@/components/ui/button';
18
-
19
- <Button onClick={handleSave} disabled={!isValid}>
20
- Save
21
- </Button>
22
- ```
23
-
24
- ### C002: Data Table
25
-
26
- ```tsx
27
- import { DataTable } from '@/components/ui/data-table';
28
-
29
- <DataTable columns={columns} data={items} />
30
- ```
31
-
32
- {{/if}}
33
-
34
- ---
35
-
36
- ## Form Validation
37
-
38
- | Field | Rule | Error Message |
39
- |-------|------|---------------|
40
- | **Name** | Required, max 100 | "Name is required" |
41
- | **Email** | Valid email | "Invalid email" |
42
-
43
- ---
44
-
45
- ## Accessibility
46
- - [ ] All inputs have labels
47
- - [ ] Error messages announced
48
- - [ ] Keyboard navigation works
49
-
50
- ---
51
-
52
- *Generated with MORPH Framework*
@@ -1,76 +0,0 @@
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 +0,0 @@
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,91 +0,0 @@
1
- # Spec Template Reference
2
-
3
- > **Layer:** 3 | **Load:** on-demand | **Keywords:** spec, specification, template
4
-
5
- **The canonical template is `docs/spec.md` of the template system** (REGISTRY id `spec`),
6
- resolved from the installed package — see `framework/templates/README.md`.
7
-
8
- This file contains extended examples for each spec section.
9
-
10
- ---
11
-
12
- ## Example: Entity (Pseudo-code)
13
-
14
- ```csharp
15
- class ProcessingJob {
16
- Guid Id
17
- string OriginalPhotoUrl // Azure Blob URL, max 500 chars
18
- string? ProcessedPhotoUrl // Nullable, populated after processing
19
- ProcessingStatus Status // Enum: Pending, Processing, Completed, Failed
20
- DateTime CreatedAt
21
- ICollection<ExecutionLog> Logs // 1:N relationship
22
- }
23
-
24
- enum ProcessingStatus {
25
- Pending = 0, Processing = 1, Completed = 2, // Normal flow
26
- Failed = 100 // Error states (high values)
27
- }
28
- ```
29
-
30
- ## Example: Command (Pseudo-code)
31
-
32
- ```csharp
33
- UploadPhotoCommand {
34
- Input: IFormFile photo, string? email
35
- Output: Guid jobId
36
-
37
- Handler:
38
- 1. Validate file (size <= 10MB, type in [.jpg, .png])
39
- 2. Upload to Azure Blob Storage
40
- 3. Create ProcessingJob entity (status = Pending)
41
- 4. Enqueue Hangfire background job
42
- 5. Return jobId
43
- }
44
- ```
45
-
46
- ## Example: API Endpoints
47
-
48
- ```csharp
49
- PhotoProcessingController {
50
- POST /api/upload → multipart/form-data → { jobId: Guid }
51
- GET /api/status/{id} → jobId → { status, progress, createdAt }
52
- GET /api/download/{id} → jobId → Redirect to Blob URL or 404
53
- }
54
- ```
55
-
56
- ## Example: Flow
57
-
58
- ```
59
- Upload Flow (Actor: User)
60
- 1. User selects photo → System validates (size, type) → If invalid: show error
61
- 2. User sees preview → clicks "Upload"
62
- 3. System creates ProcessingJob → uploads to Blob → enqueues Hangfire job → returns jobId
63
- 4. System navigates to /processing/{jobId} → polls every 5s
64
- End State: User on progress page, job processing in background
65
- ```
66
-
67
- ## Example: ADR
68
-
69
- ### ADR-001: Use Hangfire for Background Jobs
70
- **Status:** Accepted
71
- **Context:** Need background processing for AI photo transformation (30-120s).
72
- **Decision:** Hangfire (self-hosted).
73
- **Alternatives:**
74
- 1. Azure Functions — serverless, auto-scaling, but cold start + $10/mo for 50k jobs
75
- 2. Hangfire — zero cost, simpler, but scales with app
76
- 3. Quartz.NET — more features, but steeper learning curve
77
- **Trade-offs:** Simplicity vs Features (Hangfire sufficient for MVP)
78
-
79
- ## Example: Cost Estimate
80
-
81
- | Resource | SKU | Monthly | Justification |
82
- |----------|-----|---------|---------------|
83
- | Blob Storage | LRS | $0.02 | Store photos, low redundancy OK |
84
- | Azure SQL | Basic | $4.99 | < 100k jobs/month |
85
- | Container App | Consumption | $0.49 | Scale to zero |
86
- | Hangfire | Self-hosted | $0.00 | In-process |
87
- | **Total** | | **~$5.50** | |
88
-
89
- ---
90
-
91
- *MORPH-SPEC by Polymorphism Tech*