@polymorphism-tech/morph-spec 8.44.0 → 8.46.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/CLAUDE.md +11 -9
- package/README.md +10 -10
- package/bin/morph-spec.js +11 -13
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +2 -4
- package/docs/QUICKSTART.md +6 -6
- package/framework/CLAUDE.md +6 -8
- package/framework/MORPH.md +39 -45
- package/framework/agents.json +8 -9
- package/framework/commands/morph-apply.md +1 -3
- package/framework/commands/morph-hotfix.md +1 -1
- package/framework/commands/morph-proposal.md +2 -2
- package/framework/docs/CLI.md +15 -14
- package/framework/evals/review-checklist.md +90 -0
- package/framework/evals/trace-schema.md +2 -12
- package/framework/hooks/README.md +2 -3
- package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
- package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
- package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
- package/framework/hooks/claude-code/core/validate-completion.js +3 -56
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/build-check.js +1 -1
- package/framework/hooks/shared/comment-scanner.js +1 -1
- package/framework/hooks/shared/phase-utils.js +0 -5
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/phases.json +4 -6
- package/framework/rubrics/backend.json +1 -1
- package/framework/rubrics/default.json +1 -1
- package/framework/rubrics/frontend.json +1 -1
- package/framework/rules/morph-workflow.md +6 -6
- package/framework/schemas/config.schema.json +4 -0
- package/framework/schemas/feature.schema.json +5 -29
- package/framework/schemas/tasks.schema.json +6 -2
- package/framework/skills/README.md +1 -2
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +145 -246
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
- package/framework/skills/core/morph-implement/SKILL.md +101 -201
- package/framework/skills/core/morph-machine/SKILL.md +3 -3
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +171 -287
- package/framework/skills/core/morph-proposal/SKILL.md +4 -5
- package/framework/skills/core/morph-review/SKILL.md +122 -430
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +2 -2
- package/framework/skills/core/morph-uiux/SKILL.md +2 -3
- package/framework/standards/STANDARDS.json +10 -10
- package/framework/standards/ai-agents/agent-archetypes.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/agent-spec.md +1 -1
- package/framework/standards/ai-agents/batching.md +1 -1
- package/framework/standards/ai-agents/context-providers.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
- package/framework/standards/ai-agents/cost-and-budget.md +1 -1
- package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
- package/framework/standards/ai-agents/mcp-server.md +1 -1
- package/framework/standards/ai-agents/mcp-tools.md +1 -1
- package/framework/standards/ai-agents/media-pipeline.md +1 -1
- package/framework/standards/ai-agents/media-video.md +1 -1
- package/framework/standards/ai-agents/middleware-patterns.md +1 -1
- package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
- package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
- package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
- package/framework/standards/ai-agents/modalities-vision.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
- package/framework/standards/ai-agents/observability-patterns.md +3 -3
- package/framework/standards/ai-agents/production.md +2 -2
- package/framework/standards/ai-agents/prompt-sources.md +1 -1
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
- package/framework/standards/ai-agents/service-tier-flex.md +1 -1
- package/framework/standards/ai-agents/setup.md +1 -1
- package/framework/standards/ai-agents/structured-output.md +1 -1
- package/framework/standards/ai-agents/sweet-spot.md +1 -1
- package/framework/standards/ai-agents/testing-ai.md +1 -1
- package/framework/standards/ai-agents/tool-adapters.md +1 -1
- package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/templates/CLAUDE.md.core.template +1 -1
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/README.md +1 -1
- package/framework/templates/REGISTRY.json +0 -81
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/docs/spec.md +19 -205
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +2 -2
- package/src/commands/e2e/e2e.js +1 -1
- package/src/commands/project/heavy.js +1 -1
- package/src/commands/project/status.js +3 -3
- package/src/commands/state/approve.js +7 -49
- package/src/commands/state/gate-check.js +16 -106
- package/src/commands/state/gate-decision.js +1 -1
- package/src/commands/state/report-check.js +42 -17
- package/src/commands/validation/mutate.js +1 -1
- package/src/commands/validation/scout-check.js +28 -0
- package/src/commands/validation/validate-feature.js +5 -32
- package/src/commands/validation/verify.js +98 -48
- package/src/core/paths/output-schema.js +0 -2
- package/src/core/state/state-manager.js +1 -2
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/lib/format.js +5 -0
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
- package/src/dashboard/app/pages/Features.jsx +7 -7
- package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
- package/src/dashboard/app/pages/Rubrics.jsx +7 -11
- package/src/dashboard/scanner/docs-scanner.js +1 -2
- package/src/dashboard/scanner/features-scanner.js +3 -4
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/output-collector.js +0 -1
- package/src/lib/ci/ci-verify.js +118 -0
- package/src/lib/ci/github-ci.js +192 -0
- package/src/lib/ci/workflow-scaffold.js +122 -0
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/evaluator-report.js +52 -334
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/handoff-generator.js +4 -5
- package/src/lib/installers/memory-installer.js +2 -2
- package/src/lib/mutation/manifest.js +8 -2
- package/src/lib/mutation/report.js +5 -3
- package/src/lib/mutation/runner.js +9 -7
- package/src/lib/risk-detector.js +60 -122
- package/src/lib/scout/scout-check.js +293 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/tasks-json-parser.js +7 -5
- package/src/lib/tasks/test-nodes.js +1 -1
- package/src/lib/tasks/test-runner.js +1 -1
- package/src/lib/telemetry/verify-event.js +3 -2
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/reuse/reuse-validator.js +6 -8
- package/src/lib/validators/verify-runner.js +1 -1
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +5 -9
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/hooks-installer.js +3 -10
- package/src/utils/skills-installer.js +1 -1
- package/framework/evals/proof-rubrics/README.md +0 -76
- package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
- package/framework/evals/proof-rubrics/fiacao.md +0 -54
- package/framework/evals/proof-rubrics/guard-cego.md +0 -52
- package/framework/evals/proof-rubrics/media-claims.md +0 -109
- package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
- package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
- package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
- package/framework/evals/rubrics/README.md +0 -45
- package/framework/evals/rubrics/architecture.md +0 -103
- package/framework/evals/rubrics/code-quality.md +0 -98
- package/framework/evals/rubrics/condensed.md +0 -57
- package/framework/evals/rubrics/contracts.md +0 -67
- package/framework/evals/rubrics/test-coverage.md +0 -99
- package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
- package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
- package/framework/evals/suites/standard.yaml +0 -5
- package/framework/hooks/claude-code/__pycache__/statusline.cpython-313.pyc +0 -0
- package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
- package/framework/skills/core/morph-eval/SKILL.md +0 -64
- package/framework/templates/.idea/morph-templates.xml +0 -92
- package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/framework/templates/docs/clarifications.md +0 -253
- package/framework/templates/docs/onboarding.md +0 -122
- package/framework/templates/docs/schema-analysis.md +0 -119
- package/framework/templates/docs/user-stories.md +0 -34
- 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
|
+
}
|