@polymorphism-tech/morph-spec 4.6.0 → 4.7.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/README.md +394 -700
- package/docs/ARCHITECTURE.md +331 -0
- package/docs/CHEATSHEET.md +221 -0
- package/docs/COMMAND-FLOWS.md +368 -0
- package/docs/QUICKSTART.md +212 -0
- package/docs/examples/order-management/contracts.cs +84 -0
- package/docs/examples/order-management/proposal.md +24 -0
- package/docs/examples/order-management/spec.md +162 -0
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
- package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
- package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
- package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/nextjs-expert.md +87 -127
- package/framework/agents/infrastructure/azure-architect.md +147 -147
- package/framework/agents/infrastructure/infra-architect.md +45 -0
- package/framework/agents.json +1145 -278
- package/framework/rules/frontend-standards.md +0 -3
- package/framework/rules/nextjs-standards.md +17 -0
- package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
- package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
- package/framework/standards/STANDARDS.json +121 -0
- package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
- package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
- package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
- package/framework/standards/frontend/nextjs/app-router.md +123 -0
- package/framework/standards/frontend/nextjs/components.md +132 -0
- package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
- package/framework/standards/frontend/nextjs/forms.md +128 -0
- package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
- package/framework/standards/frontend/nextjs/project-structure.md +102 -0
- package/framework/standards/frontend/nextjs/state-management.md +72 -0
- package/framework/standards/frontend/nextjs/testing.md +111 -0
- package/framework/templates/REGISTRY.json +538 -142
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
- package/framework/templates/docs/spec.md +49 -0
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
- package/framework/templates/project-structure/dotnet-ddd.md +70 -0
- package/framework/workflows/docs/enforcement-pipeline.md +2 -1
- package/package.json +1 -1
- package/scripts/scan-nextjs.mjs +169 -0
- package/src/commands/project/doctor.js +52 -1
- package/src/commands/project/init.js +15 -1
- package/src/commands/project/update.js +6 -1
- package/src/lib/standards/standards-context-injector.js +5 -0
- package/src/lib/validators/nextjs/index.js +6 -0
- package/src/lib/validators/nextjs/next-component-validator.js +181 -0
- package/src/lib/validators/validation-runner.js +5 -0
- package/src/utils/agents-installer.js +14 -2
- package/.morph/.morphversion +0 -5
- package/.morph/analytics/threads-log.jsonl +0 -6
- package/.morph/config/config.json +0 -8
- package/.morph/framework/agents.json +0 -948
- package/.morph/framework/standards/STANDARDS.json +0 -812
- package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/.morph/framework/standards/ai-agents/production.md +0 -415
- package/.morph/framework/standards/ai-agents/setup.md +0 -418
- package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
- package/.morph/framework/standards/ai-agents/workflows.md +0 -354
- package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
- package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
- package/.morph/framework/standards/backend/api/rest.md +0 -492
- package/.morph/framework/standards/backend/api/validation.md +0 -88
- package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
- package/.morph/framework/standards/backend/database/ef-core.md +0 -199
- package/.morph/framework/standards/backend/database/migrations.md +0 -393
- package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
- package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
- package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
- package/.morph/framework/standards/backend/dotnet/async.md +0 -366
- package/.morph/framework/standards/backend/dotnet/core.md +0 -117
- package/.morph/framework/standards/backend/dotnet/di.md +0 -439
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
- package/.morph/framework/standards/context/analytics.md +0 -96
- package/.morph/framework/standards/context/bundles.md +0 -110
- package/.morph/framework/standards/context/priming.md +0 -78
- package/.morph/framework/standards/core/architecture.md +0 -185
- package/.morph/framework/standards/core/coding.md +0 -214
- package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
- package/.morph/framework/standards/core/git.md +0 -185
- package/.morph/framework/standards/core/testing.md +0 -295
- package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
- package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
- package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/.morph/framework/standards/frontend/blazor/state.md +0 -191
- package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
- package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
- package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/.morph/framework/standards/integration/api/graphql.md +0 -91
- package/.morph/framework/standards/integration/api/grpc.md +0 -114
- package/.morph/framework/standards/integration/api/rest-design.md +0 -95
- package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
- package/.morph/framework/standards/observability/logging.md +0 -131
- package/.morph/framework/standards/observability/metrics.md +0 -121
- package/.morph/framework/standards/observability/monitoring.md +0 -114
- package/.morph/framework/standards/observability/tracing.md +0 -132
- package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
- package/.morph/framework/standards/workflows/thread-management.md +0 -113
- package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
- package/.morph/framework/templates/README.md +0 -814
- package/.morph/framework/templates/REGISTRY.json +0 -1492
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
- package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
- package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
- package/.morph/framework/templates/code/dotnet/test.cs +0 -239
- package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
- package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
- package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
- package/.morph/framework/templates/context/CONTEXT.md +0 -181
- package/.morph/framework/templates/docs/clarifications.md +0 -253
- package/.morph/framework/templates/docs/onboarding.md +0 -123
- package/.morph/framework/templates/docs/proposal.md +0 -182
- package/.morph/framework/templates/docs/schema-analysis.md +0 -119
- package/.morph/framework/templates/docs/spec.md +0 -149
- package/.morph/framework/templates/docs/ui-components.md +0 -124
- package/.morph/framework/templates/docs/ui-design-system.md +0 -76
- package/.morph/framework/templates/docs/ui-flows.md +0 -167
- package/.morph/framework/templates/docs/ui-mockups.md +0 -98
- package/.morph/framework/templates/docs/user-stories.md +0 -34
- package/.morph/framework/templates/examples/design-system-examples.md +0 -357
- package/.morph/framework/templates/examples/spec-examples.md +0 -90
- package/.morph/framework/templates/feature/decisions.md +0 -187
- package/.morph/framework/templates/feature/recap.md +0 -146
- package/.morph/framework/templates/feature/tasks.md +0 -199
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
- package/.morph/framework/templates/infrastructure/github/README.md +0 -593
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
- package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
- package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
- package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
- package/.morph/framework/templates/saas/subscription.cs +0 -347
- package/.morph/framework/templates/saas/tenant.cs +0 -338
- package/.morph/framework/templates/state.template.json +0 -17
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/.morph/framework/templates/ui/MudTheme.cs +0 -281
- package/.morph/framework/templates/ui/design-system.css +0 -226
- package/.morph/logs/tool-failures.log +0 -7
- package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
- package/.morph/state.json +0 -48
- package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
# morph-spec — Command Flow Diagrams
|
|
2
|
+
|
|
3
|
+
> Each diagram shows the sequence of CLI calls and internal function calls for each slash command.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. /morph-proposal
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
flowchart TD
|
|
11
|
+
START(["/morph-proposal FEATURE"]) --> A
|
|
12
|
+
|
|
13
|
+
A["state get FEATURE"] --> B{"Exists?"}
|
|
14
|
+
B -->|yes| C["Identify current phase\nResume from where it stopped"]
|
|
15
|
+
B -->|no| D["Start Phase 0 from scratch"]
|
|
16
|
+
C --> D
|
|
17
|
+
|
|
18
|
+
subgraph P0 ["PHASE 0 — PROPOSAL"]
|
|
19
|
+
D --> E["detect-agents INPUT"]
|
|
20
|
+
E --> E1["loadAgentsConfig() ← agents.json"]
|
|
21
|
+
E1 --> E2["detectAgents() — keyword matching"]
|
|
22
|
+
E2 --> E3["analyzeRequestComplexity()"]
|
|
23
|
+
E3 --> E4["getStandardsListForAgent()\nloadStandardsForAgent()"]
|
|
24
|
+
E4 --> F["Render proposal.md via template"]
|
|
25
|
+
F --> G1["state set FEATURE status draft"]
|
|
26
|
+
G1 --> G2["state set FEATURE phase proposal"]
|
|
27
|
+
G2 --> G3["state mark-output FEATURE proposal"]
|
|
28
|
+
G3 --> G4["state add-agent FEATURE agent-id × N"]
|
|
29
|
+
G4 --> PAUSE0(["⏸ GATE — approve proposal"])
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
PAUSE0 -->|approved| H
|
|
33
|
+
|
|
34
|
+
subgraph P1 ["PHASE 1 — SETUP (auto, no gate)"]
|
|
35
|
+
H["Read .morph/context/"] --> I["Confirm detected stack"]
|
|
36
|
+
I --> J["List active agents"]
|
|
37
|
+
J --> J2["state set FEATURE phase setup"]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
J2 --> UICHECK{"uiux-designer\nin activeAgents?"}
|
|
41
|
+
|
|
42
|
+
subgraph P15 ["PHASE 1.5 — UI/UX (conditional)"]
|
|
43
|
+
UICHECK -->|yes| L["Generate wireframes + design system\n(.claude/skills/phase-uiux/SKILL.md)"]
|
|
44
|
+
L --> PAUSEUI(["⏸ GATE — approve UI/UX"])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
UICHECK -->|no| M
|
|
48
|
+
PAUSEUI -->|approved| M
|
|
49
|
+
|
|
50
|
+
subgraph P2 ["PHASE 2 — DESIGN"]
|
|
51
|
+
M["Generate spec.md\n(.claude/skills/phase-design/SKILL.md)"] --> N["Generate contracts.cs"]
|
|
52
|
+
N --> O["Generate decisions.md with ADRs"]
|
|
53
|
+
O --> P["Estimate costs per resource"]
|
|
54
|
+
P --> Q1["state mark-output FEATURE spec"]
|
|
55
|
+
Q1 --> Q2["state mark-output FEATURE contracts"]
|
|
56
|
+
Q2 --> Q3["state mark-output FEATURE decisions"]
|
|
57
|
+
Q3 --> PAUSE2(["⏸ GATE — approve design"])
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
PAUSE2 -->|approved| R
|
|
61
|
+
|
|
62
|
+
subgraph P3 ["PHASE 3 — CLARIFY"]
|
|
63
|
+
R["Identify ambiguities in spec\n(.claude/skills/phase-clarify/SKILL.md)"] --> S["Generate 3-7 questions"]
|
|
64
|
+
S --> WAIT(["⏳ Waiting for user answers"])
|
|
65
|
+
WAIT -->|answered| T["Update spec with clarifications\nand edge cases"]
|
|
66
|
+
T --> T2["state set FEATURE phase clarify"]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
T2 --> U
|
|
70
|
+
|
|
71
|
+
subgraph P4 ["PHASE 4 — TASKS"]
|
|
72
|
+
U["Break spec into tasks T001-TXXX\n(.claude/skills/phase-tasks/SKILL.md)"] --> V["Define order and dependencies"]
|
|
73
|
+
V --> W["Checkpoints every 3 tasks"]
|
|
74
|
+
W --> X1["state mark-output FEATURE tasks"]
|
|
75
|
+
X1 --> X2["state set FEATURE tasks.total N"]
|
|
76
|
+
X2 --> PAUSE4(["⏸ GATE — approve tasks"])
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
PAUSE4 -->|approved| END(["✅ Planning complete\nRun /morph-apply FEATURE"])
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 2. /morph-apply
|
|
85
|
+
|
|
86
|
+
```mermaid
|
|
87
|
+
flowchart TD
|
|
88
|
+
START(["/morph-apply FEATURE"]) --> A
|
|
89
|
+
|
|
90
|
+
A["state get FEATURE"] --> B{"All phases\ncomplete?"}
|
|
91
|
+
B -->|no| ERR(["❌ ERROR — phase X not complete\nRun /morph-proposal FEATURE"])
|
|
92
|
+
B -->|yes| C
|
|
93
|
+
|
|
94
|
+
subgraph PREP ["INITIALIZATION"]
|
|
95
|
+
C["Read 1-design/spec.md + 3-tasks/tasks.md + 1-design/contracts.cs"] --> D
|
|
96
|
+
D["Read framework/standards/\n.morph/context/"] --> E1
|
|
97
|
+
E1["state set FEATURE phase implement"] --> E2
|
|
98
|
+
E2["state set FEATURE status in_progress"] --> E3
|
|
99
|
+
E3["state set FEATURE tasks.total N"]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
E3 --> LOOP_START
|
|
103
|
+
|
|
104
|
+
subgraph LOOP ["LOOP — For each task in order"]
|
|
105
|
+
LOOP_START["Select next task"] --> F
|
|
106
|
+
F["task start FEATURE task-id"] --> F1
|
|
107
|
+
F1["spawn task-manager.cjs start"] --> G
|
|
108
|
+
G["Implement code\nfollowing contracts.cs + standards"] --> H
|
|
109
|
+
H["task done FEATURE task-id"] --> H1
|
|
110
|
+
H1["spawn task-manager.cjs done"] --> VAL_START
|
|
111
|
+
|
|
112
|
+
subgraph VAL ["Automatic validators (hooks)"]
|
|
113
|
+
VAL_START["security-expert\nSQL injection, XSS, hardcoded secrets"] --> V2
|
|
114
|
+
V2["architecture-expert\nIDbContextFactory, async/await, DI order"] --> V3
|
|
115
|
+
V3["packages-validator\nNuGet conflicts, vulnerabilities"] --> V4
|
|
116
|
+
V4["blazor-concurrency-validator\nLifecycle, thread safety"]
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
V4 --> VRESULT{"Validation\npassed?"}
|
|
120
|
+
VRESULT -->|no| FIX["Fix violations\nDO NOT use --skip-validation"] --> H
|
|
121
|
+
VRESULT -->|yes| CHK{"task_count\nmultiple of 3?"}
|
|
122
|
+
CHK -->|yes| CP["state checkpoint FEATURE\nstate list"]
|
|
123
|
+
CHK -->|no| NEXT
|
|
124
|
+
CP --> NEXT{"Next task\nexists?"}
|
|
125
|
+
NEXT -->|yes| LOOP_START
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
NEXT -->|no| FIN1
|
|
129
|
+
|
|
130
|
+
subgraph FIN ["FINALIZATION"]
|
|
131
|
+
FIN1["generate recap FEATURE"] --> FIN2
|
|
132
|
+
FIN2["extractFeatureMetadata()\nWrites 4-implement/recap.md"] --> FIN3
|
|
133
|
+
FIN3["state set FEATURE status done"] --> FIN4
|
|
134
|
+
FIN4["state mark-output FEATURE recap"] --> FIN5
|
|
135
|
+
FIN5["phase advance FEATURE"]
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
FIN5 --> END(["✅ Feature complete\nRun /morph-archive FEATURE"])
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 3. /morph-status
|
|
144
|
+
|
|
145
|
+
```mermaid
|
|
146
|
+
flowchart TD
|
|
147
|
+
START(["/morph-status"]) --> A
|
|
148
|
+
|
|
149
|
+
A["state list"] --> B
|
|
150
|
+
B["StateManager.getSummary()"] --> C
|
|
151
|
+
C["StateManager.listFeatures()"] --> D
|
|
152
|
+
D["Read .morph/state.json"] --> DASH
|
|
153
|
+
|
|
154
|
+
DASH["Display dashboard\nfeatures | phases | tasks X/Y | agents | costs"] --> EXTRA
|
|
155
|
+
|
|
156
|
+
EXTRA{"Specific feature\nrequested?"} -->|yes| G
|
|
157
|
+
EXTRA -->|no| CHECK
|
|
158
|
+
|
|
159
|
+
G["state get FEATURE"] --> G1["StateManager.getFeature()"] --> CHECK
|
|
160
|
+
|
|
161
|
+
subgraph CHECK_BLOCK ["Additional checks"]
|
|
162
|
+
CHECK["Check .morph/config/config.json"] --> CHECK2
|
|
163
|
+
CHECK2["Check .morph/framework/standards/ present"] --> CHECK3
|
|
164
|
+
CHECK3["Check .morph/archive/\ncompleted features"]
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
CHECK3 --> SUGEST["Suggest next actions\n/morph-proposal | /morph-apply | /morph-archive"]
|
|
168
|
+
|
|
169
|
+
SUGEST --> END(["✅ Dashboard displayed"])
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 4. /morph-archive
|
|
175
|
+
|
|
176
|
+
```mermaid
|
|
177
|
+
flowchart TD
|
|
178
|
+
START(["/morph-archive FEATURE"]) --> A
|
|
179
|
+
|
|
180
|
+
A["Read .morph/features/FEATURE/3-tasks/tasks.md"] --> B
|
|
181
|
+
B{"All tasks\ncomplete?"} -->|no| ERR(["❌ Feature not ready\nFinish pending tasks first"])
|
|
182
|
+
B -->|yes| C
|
|
183
|
+
|
|
184
|
+
C(["Confirm with user\nthat archiving is OK"]) --> D
|
|
185
|
+
|
|
186
|
+
subgraph RECAP ["RECAP"]
|
|
187
|
+
D["Update 4-implement/recap.md"] --> D1
|
|
188
|
+
D1["Fill in final metrics\n(tasks, time, actual vs estimated cost)"] --> D2
|
|
189
|
+
D2["Document lessons learned"]
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
D2 --> E{"Does spec define permanent\nsystem behavior?"}
|
|
193
|
+
|
|
194
|
+
E -->|yes| F["Extract spec → .morph/specs/DOMAIN/\nBecomes the 'current truth' of the system"]
|
|
195
|
+
F --> G
|
|
196
|
+
E -->|no| G
|
|
197
|
+
|
|
198
|
+
subgraph MOVE ["MOVE"]
|
|
199
|
+
G["Move full directory:\n.morph/features/FEATURE/\n→ .morph/archive/FEATURE/"]
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
G --> H
|
|
203
|
+
|
|
204
|
+
subgraph METRICS ["METRICS UPDATE"]
|
|
205
|
+
H["Increment completed features counter"] --> I
|
|
206
|
+
I["Update total accumulated cost"] --> J
|
|
207
|
+
J["Update total time spent"]
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
J --> END(["✅ Feature archived at\n.morph/archive/FEATURE/"])
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 5. /morph-infra
|
|
216
|
+
|
|
217
|
+
```mermaid
|
|
218
|
+
flowchart TD
|
|
219
|
+
START(["/morph-infra ACTION"]) --> ROUTE
|
|
220
|
+
|
|
221
|
+
ROUTE{"Action?"}
|
|
222
|
+
|
|
223
|
+
ROUTE -->|init| INIT_1
|
|
224
|
+
ROUTE -->|validate| VAL_1
|
|
225
|
+
ROUTE -->|plan| PLAN_1
|
|
226
|
+
ROUTE -->|deploy| DEP_1
|
|
227
|
+
ROUTE -->|destroy| DES_1
|
|
228
|
+
|
|
229
|
+
subgraph INIT ["INIT — Initialize IaC"]
|
|
230
|
+
INIT_1["Copy templates from\n.morph/framework/templates/infrastructure/"] --> INIT_2
|
|
231
|
+
INIT_2["Create infra/ structure\nmain.bicep\nparameters.dev.json, parameters.prod.json\nmodules/*.bicep"] --> INIT_3
|
|
232
|
+
INIT_3["Replace placeholders\nAPP_NAME, SUBSCRIPTION_ID\nRESOURCE_GROUP"] --> INIT_4
|
|
233
|
+
INIT_4["Document structure in decisions.md"]
|
|
234
|
+
INIT_4 --> INIT_END(["✅ Done — run /morph-infra validate"])
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
subgraph VALIDATE ["VALIDATE — Validate Templates"]
|
|
238
|
+
VAL_1["az bicep build --file infra/main.bicep"] --> VAL_2
|
|
239
|
+
VAL_2["Check required parameters"] --> VAL_3{"No errors?"}
|
|
240
|
+
VAL_3 -->|yes| VAL_OK(["✅ Templates valid"])
|
|
241
|
+
VAL_3 -->|no| VAL_ERR(["❌ Report syntax errors"])
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
subgraph PLAN ["PLAN — Preview Changes"]
|
|
245
|
+
PLAN_1["az account show"] --> PLAN_2{"Authenticated\nto Azure?"}
|
|
246
|
+
PLAN_2 -->|no| PLAN_ERR(["❌ Run az login"])
|
|
247
|
+
PLAN_2 -->|yes| PLAN_3["az deployment group what-if\n--template-file infra/main.bicep\n--parameters parameters.ENV.json"]
|
|
248
|
+
PLAN_3 --> PLAN_4["Display summary:\nCREATE / MODIFY / DELETE\n+ estimated costs"]
|
|
249
|
+
PLAN_4 --> PLAN_PAUSE(["⏸ GATE — wait for approval\nbefore running deploy"])
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
subgraph DEPLOY ["DEPLOY — Execute Deploy"]
|
|
253
|
+
DEP_1["Verify plan approval"] --> DEP_2
|
|
254
|
+
DEP_2["az group create --name rg-APP-ENV\n--location brazilsouth"] --> DEP_3
|
|
255
|
+
DEP_3["az deployment group create\n--template-file infra/main.bicep\n--parameters parameters.ENV.json"] --> DEP_4
|
|
256
|
+
DEP_4["Capture outputs:\nContainer App URL\nSQL Connection String\nKey Vault URI"] --> DEP_5
|
|
257
|
+
DEP_5["Update documentation\nwith deploy info"]
|
|
258
|
+
DEP_5 --> DEP_END(["✅ Deploy complete"])
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
subgraph DESTROY ["DESTROY — Remove Resources"]
|
|
262
|
+
DES_1(["⚠️ WARNING: irreversible action"]) --> DES_2
|
|
263
|
+
DES_2["List all resources\nthat will be deleted"] --> DES_3
|
|
264
|
+
DES_3(["⏸ GATE — require explicit confirmation\n'yes, delete'"]) --> DES_4
|
|
265
|
+
DES_4["az group delete --name rg-APP-ENV\n--yes --no-wait"]
|
|
266
|
+
DES_4 --> DES_END(["✅ Resources removed"])
|
|
267
|
+
end
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## 6. /morph-preflight
|
|
273
|
+
|
|
274
|
+
```mermaid
|
|
275
|
+
flowchart TD
|
|
276
|
+
START(["/morph-preflight azure"]) --> C1
|
|
277
|
+
|
|
278
|
+
subgraph CHECKS ["7 SEQUENTIAL CHECKS"]
|
|
279
|
+
C1["Check 1 — Package Conflicts\ndotnet restore --verbosity normal\ngrep NU1605 NU1608"] --> R1{"OK?"}
|
|
280
|
+
R1 -->|✅| C2
|
|
281
|
+
R1 -->|❌| FIX1["Fix: declare Azure.Identity\nwith explicit version in .csproj"] --> C2
|
|
282
|
+
|
|
283
|
+
C2["Check 2 — EF Core Migrations\ndotnet ef migrations has-pending-model-changes\n--project src/Infrastructure --startup-project src/Web"] --> R2{"OK?"}
|
|
284
|
+
R2 -->|✅| C3
|
|
285
|
+
R2 -->|❌| FIX2["Fix: dotnet ef migrations add NAME"] --> C3
|
|
286
|
+
|
|
287
|
+
C3["Check 3 — Dockerfile\ndocker build --check .\nVerify multi-stage, EXPOSE, ENTRYPOINT"] --> R3{"Applicable\nand OK?"}
|
|
288
|
+
R3 -->|✅ or N/A| C4
|
|
289
|
+
R3 -->|❌| FIX3["Fix: correct Dockerfile"] --> C4
|
|
290
|
+
|
|
291
|
+
C4["Check 4 — Blazor .NET 10 Assets\ngrep RequiresAspNetWebAssets *.csproj"] --> R4{"OK?"}
|
|
292
|
+
R4 -->|✅ or N/A| C5
|
|
293
|
+
R4 -->|❌| FIX4["Fix: add RequiresAspNetWebAssets=true\nto .csproj"] --> C5
|
|
294
|
+
|
|
295
|
+
C5["Check 5 — Bicep Syntax\naz bicep build --file infra/main.bicep --stdout"] --> R5{"OK?"}
|
|
296
|
+
R5 -->|✅| C6
|
|
297
|
+
R5 -->|❌| FIX5["Fix: correct Bicep syntax errors"] --> C6
|
|
298
|
+
|
|
299
|
+
C6["Check 6 — Key Vault Config\ngrep KeyVaultUri appsettings*.json\ngrep IsDevelopment Program.cs"] --> R6{"OK?"}
|
|
300
|
+
R6 -->|✅| C7
|
|
301
|
+
R6 -->|❌| FIX6["Fix: add KeyVaultUri\nDO NOT gate on IsDevelopment"] --> C7
|
|
302
|
+
|
|
303
|
+
C7["Check 7 — Connection Strings\ngrep 'Password= Pwd= Secret='\nappsettings*.json excluding Development"] --> R7{"OK?"}
|
|
304
|
+
R7 -->|✅| SUM
|
|
305
|
+
R7 -->|⚠️| WARN["Warning: move secrets to Key Vault"] --> SUM
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
SUM["Display summary\nN passed / N failed / N warnings"] --> RESULT
|
|
309
|
+
|
|
310
|
+
RESULT{"Any\nfailures?"} -->|yes| BLOCK(["❌ BLOCKED\nDo not deploy until resolved!"])
|
|
311
|
+
RESULT -->|no| PASS(["✅ Ready to deploy to Azure"])
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 7. /morph-troubleshoot
|
|
317
|
+
|
|
318
|
+
```mermaid
|
|
319
|
+
flowchart TD
|
|
320
|
+
START(["/morph-troubleshoot KEYWORDS"]) --> A
|
|
321
|
+
|
|
322
|
+
A["troubleshootCommand(keywords, options)"] --> LISTCAT
|
|
323
|
+
|
|
324
|
+
LISTCAT{"--list-categories?"} -->|yes| CATS["getCategories()\nList: blazor, efcore, azure, auth, deploy"]
|
|
325
|
+
CATS --> END_CATS(["✅ Categories displayed"])
|
|
326
|
+
|
|
327
|
+
LISTCAT -->|no| L1_START
|
|
328
|
+
|
|
329
|
+
subgraph L1 ["Level 1 — Known Issues Index (Primary)"]
|
|
330
|
+
L1_START["searchIndex(searchTerms, options)"] --> L1A
|
|
331
|
+
L1A["Search JSON database\nof known issues"] --> L1B{"Filter\n--category?"}
|
|
332
|
+
L1B -->|yes| L1C["Filter by category"]
|
|
333
|
+
L1B -->|no| L1D["Match all keywords"]
|
|
334
|
+
L1C --> L1RESULT
|
|
335
|
+
L1D --> L1RESULT["Return matches with score"]
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
L1RESULT --> CHECK1{"Enough\nresults?"}
|
|
339
|
+
CHECK1 -->|yes| FORMAT
|
|
340
|
+
|
|
341
|
+
subgraph L2 ["Level 2 — Grep Standards (Automatic fallback)"]
|
|
342
|
+
CHECK1 -->|no| L2_START["searchGrep(searchTerms, options)"]
|
|
343
|
+
L2_START --> L2A["grep framework/standards/*.md"]
|
|
344
|
+
L2A --> L2B["grep .morph/framework/standards/*.md"]
|
|
345
|
+
L2B --> L2C["Deduplicate against Level 1 results"]
|
|
346
|
+
L2C --> L2D["Merge and limit to 10 results"]
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
L2D --> CHECK2{"Enough\nresults?"}
|
|
350
|
+
CHECK2 -->|yes| FORMAT
|
|
351
|
+
|
|
352
|
+
subgraph L3 ["Level 3 — Web Search (If needed)"]
|
|
353
|
+
CHECK2 -->|no| L3_START["WebSearch — external sources"]
|
|
354
|
+
L3_START --> L3A["site:github.com/dotnet/aspnetcore ERROR\nsite:github.com/dotnet/efcore ERROR"]
|
|
355
|
+
L3_START --> L3B["site:stackoverflow.com blazor ERROR\nsite:stackoverflow.com azure ERROR"]
|
|
356
|
+
L3_START --> L3C["site:learn.microsoft.com ERROR\nsite:learn.microsoft.com/azure ERROR"]
|
|
357
|
+
L3A & L3B & L3C --> L3MERGE["Consolidate relevant links"]
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
L3MERGE --> FORMAT
|
|
361
|
+
|
|
362
|
+
subgraph FMT ["Output Formatting"]
|
|
363
|
+
FORMAT["formatResult(result, verbose)\nRoot cause + Solution + Fix code"] --> FSUM
|
|
364
|
+
FSUM["formatSummary(stats)\nTotal found per level (L1/L2/L3)"]
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
FSUM --> END(["✅ Results displayed\nin standard format"])
|
|
368
|
+
```
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# morph-spec Quick Start
|
|
2
|
+
|
|
3
|
+
## Install
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install -g @polymorphism-tech/morph-spec
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Or use `npx` without a global install:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx @polymorphism-tech/morph-spec init
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
> **Windows / nvm-windows:** Global installs may not appear on PATH. Use `npx` or add the npm prefix to PATH manually: `npm config get prefix`, then add `{prefix}` to your PATH.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Initialize a project
|
|
20
|
+
|
|
21
|
+
Navigate to your project root and run:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
morph-spec init
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`init` does the following:
|
|
28
|
+
- Auto-detects your stack (Blazor, Next.js, Node.js, monorepo)
|
|
29
|
+
- Creates `.morph/` with framework files, standards, and templates
|
|
30
|
+
- Creates `.morph/context/` with inferred project context
|
|
31
|
+
- Installs `.claude/skills/`, `.claude/agents/`, `.claude/rules/`
|
|
32
|
+
- Writes `.claude/settings.local.json` with 11 Claude Code hooks
|
|
33
|
+
- Copies `CLAUDE.md` with runtime instructions
|
|
34
|
+
|
|
35
|
+
Verify the installation:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
morph-spec doctor
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Your first feature
|
|
44
|
+
|
|
45
|
+
Open your project in Claude Code and run:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
/morph-proposal my-feature
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Replace `my-feature` with a short kebab-case name for your feature (e.g., `user-notifications`, `payment-flow`).
|
|
52
|
+
|
|
53
|
+
The proposal pipeline runs phases 0–4 with three approval gates:
|
|
54
|
+
|
|
55
|
+
### Phase 0 — Proposal
|
|
56
|
+
|
|
57
|
+
Claude analyzes your request, detects which agents are relevant, and produces `0-proposal/proposal.md`. You review it and approve (or request changes).
|
|
58
|
+
|
|
59
|
+
### Phase 1 — Setup
|
|
60
|
+
|
|
61
|
+
Loads project context from `.morph/context/`, confirms stack and active agents. No approval needed.
|
|
62
|
+
|
|
63
|
+
### Phase 1.5 — UI/UX (conditional)
|
|
64
|
+
|
|
65
|
+
Only runs if frontend agents are active. Claude generates:
|
|
66
|
+
- `2-ui/design-system.md` — colors, typography, spacing
|
|
67
|
+
- `2-ui/mockups.md` — ASCII wireframes
|
|
68
|
+
- `2-ui/components.md` — component specs
|
|
69
|
+
- `2-ui/flows.md` — user flows and edge cases
|
|
70
|
+
|
|
71
|
+
You approve the UI design before design phase begins.
|
|
72
|
+
|
|
73
|
+
### Phase 2 — Design
|
|
74
|
+
|
|
75
|
+
Claude produces the technical specification:
|
|
76
|
+
- `1-design/spec.md` — full requirements, use cases, validations
|
|
77
|
+
- `1-design/contracts.cs` — C# interfaces, DTOs, enums
|
|
78
|
+
- `1-design/decisions.md` — architectural decision records (ADRs)
|
|
79
|
+
|
|
80
|
+
You review and approve the design.
|
|
81
|
+
|
|
82
|
+
### Phase 3 — Clarify
|
|
83
|
+
|
|
84
|
+
Claude identifies 3–7 ambiguities in the spec, asks you to resolve them, then updates the spec. No gate.
|
|
85
|
+
|
|
86
|
+
### Phase 4 — Tasks
|
|
87
|
+
|
|
88
|
+
Claude breaks the spec into atomic tasks (`T001`, `T002`, …) saved to `3-tasks/tasks.md`. You approve the task list.
|
|
89
|
+
|
|
90
|
+
At this point, planning is complete:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
✅ Planning complete — run /morph-apply my-feature to implement
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Implement
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
/morph-apply my-feature
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Claude reads `spec.md`, `contracts.cs`, and `tasks.md`, then implements task by task:
|
|
105
|
+
- Starts each task, writes the code, marks it done
|
|
106
|
+
- Runs 5 validators automatically after each task: security, architecture, packages, design system, Blazor concurrency
|
|
107
|
+
- Auto-checkpoints every 3 tasks (validates, saves state)
|
|
108
|
+
- Generates `4-implement/recap.md` on completion
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## During development
|
|
113
|
+
|
|
114
|
+
Check feature state:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
morph-spec state get my-feature
|
|
118
|
+
morph-spec status my-feature
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
See what phase the feature is in and which approval gates have been passed:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
morph-spec state show my-feature
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Advance to the next phase manually (when needed):
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
morph-spec phase advance my-feature
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Mark a task complete:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
morph-spec task done my-feature
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Run validators at any time:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
morph-spec validate # all validators
|
|
143
|
+
morph-spec validate architecture # specific validator
|
|
144
|
+
morph-spec validate packages
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Multiple features
|
|
150
|
+
|
|
151
|
+
You can have multiple features in progress simultaneously. Each has its own directory under `.morph/features/`:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
.morph/features/
|
|
155
|
+
├── user-notifications/
|
|
156
|
+
│ ├── 0-proposal/
|
|
157
|
+
│ ├── 1-design/
|
|
158
|
+
│ └── 3-tasks/
|
|
159
|
+
└── payment-flow/
|
|
160
|
+
├── 0-proposal/
|
|
161
|
+
└── 1-design/
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
See all feature states:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
morph-spec state list
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Keeping up to date
|
|
173
|
+
|
|
174
|
+
When a new version of `@polymorphism-tech/morph-spec` is published:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Update the CLI
|
|
178
|
+
npm install -g @polymorphism-tech/morph-spec@latest
|
|
179
|
+
|
|
180
|
+
# Update framework files in your project
|
|
181
|
+
morph-spec update
|
|
182
|
+
|
|
183
|
+
# Verify
|
|
184
|
+
morph-spec doctor
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
`morph-spec update` re-syncs `.morph/framework/`, `.claude/skills/`, `.claude/agents/`, `.claude/rules/`, and `CLAUDE.md`. It does not touch your config, context, or feature outputs.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Tips
|
|
192
|
+
|
|
193
|
+
**Use `/morph-proposal` even for small features.** The proposal phase catches scope creep, identifies the right agents, and generates contracts early — before implementation makes it expensive to change direction.
|
|
194
|
+
|
|
195
|
+
**Approve explicitly at each gate.** The design gate exists to prevent implementing the wrong thing. If something in `spec.md` or `contracts.cs` looks off, say so before approving.
|
|
196
|
+
|
|
197
|
+
**ADRs belong in `decisions.md`.** When Claude makes an architectural choice, it documents it there. Read it after Design completes. Decisions drive the validators that run during implementation.
|
|
198
|
+
|
|
199
|
+
**`morph-spec doctor` is your first debugging step.** If something is behaving unexpectedly, doctor will surface version mismatches, missing files, and hook configuration issues.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Next steps
|
|
204
|
+
|
|
205
|
+
- [CHEATSHEET.md](CHEATSHEET.md) — command reference
|
|
206
|
+
- [ARCHITECTURE.md](ARCHITECTURE.md) — system design and agent hierarchy
|
|
207
|
+
- [CHANGELOG.md](../CHANGELOG.md) — release history
|
|
208
|
+
- `.morph/framework/standards/` — all coding and architecture standards
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
*morph-spec v4.6.0 by Polymorphism Tech*
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// CONTRACTS: Order Management — Level 2 (Business Logic)
|
|
3
|
+
// Example of correctly filled contracts-level2.cs template
|
|
4
|
+
// Feature: order-management | Date: 2026-02-23
|
|
5
|
+
// ============================================================
|
|
6
|
+
|
|
7
|
+
using System;
|
|
8
|
+
using System.Collections.Generic;
|
|
9
|
+
using System.Threading;
|
|
10
|
+
using System.Threading.Tasks;
|
|
11
|
+
using MediatR;
|
|
12
|
+
|
|
13
|
+
// ===== AGGREGATE ROOT =====
|
|
14
|
+
// Implementado em: Domain/Orders/Aggregates/Order.cs
|
|
15
|
+
//
|
|
16
|
+
// Invariants (do spec.md > Aggregate Blueprint):
|
|
17
|
+
// - Confirm() só é válido se Status == Draft E Items.Any()
|
|
18
|
+
// - AddItem() lança DomainException se Status != Draft
|
|
19
|
+
// - Cancel() é válido de Draft ou Confirmed → Cancelled (terminal)
|
|
20
|
+
|
|
21
|
+
namespace ExampleApp.Domain.Orders.Events;
|
|
22
|
+
|
|
23
|
+
// ===== DOMAIN EVENTS =====
|
|
24
|
+
|
|
25
|
+
public record OrderCreatedEvent(Guid OrderId, Guid UserId) : DomainEvent;
|
|
26
|
+
public record OrderConfirmedEvent(Guid OrderId, Guid UserId, decimal Total) : DomainEvent; // Total as decimal for event serialization; Money value object lives inside the Aggregate
|
|
27
|
+
public record OrderCancelledEvent(Guid OrderId, string Reason) : DomainEvent;
|
|
28
|
+
|
|
29
|
+
namespace ExampleApp.Application.Orders.Commands;
|
|
30
|
+
|
|
31
|
+
// ===== COMMANDS (CQRS) =====
|
|
32
|
+
|
|
33
|
+
public record CreateOrderCommand(Guid UserId, List<CreateOrderItemRequest> Items)
|
|
34
|
+
: IRequest<CreateOrderResult>;
|
|
35
|
+
public record CreateOrderResult(Guid OrderId);
|
|
36
|
+
|
|
37
|
+
public record ConfirmOrderCommand(Guid OrderId) : IRequest;
|
|
38
|
+
public record CancelOrderCommand(Guid OrderId, string Reason) : IRequest;
|
|
39
|
+
|
|
40
|
+
namespace ExampleApp.Application.Orders.Queries;
|
|
41
|
+
|
|
42
|
+
// ===== QUERIES =====
|
|
43
|
+
|
|
44
|
+
public record GetOrderQuery(Guid OrderId) : IRequest<OrderDto?>;
|
|
45
|
+
|
|
46
|
+
// PagedResult<T> — defined in Shared/Common/PagedResult.cs (shared framework type)
|
|
47
|
+
public record ListOrdersByUserQuery(Guid UserId, int Page = 1, int PageSize = 20)
|
|
48
|
+
: IRequest<PagedResult<OrderDto>>;
|
|
49
|
+
|
|
50
|
+
namespace ExampleApp.Application.Orders;
|
|
51
|
+
|
|
52
|
+
// ===== DTOs (read models — nunca expõe o Aggregate diretamente) =====
|
|
53
|
+
|
|
54
|
+
public record OrderDto(
|
|
55
|
+
Guid Id,
|
|
56
|
+
Guid UserId,
|
|
57
|
+
string Status,
|
|
58
|
+
decimal Total,
|
|
59
|
+
List<OrderItemDto> Items,
|
|
60
|
+
DateTime CreatedAt,
|
|
61
|
+
DateTime? UpdatedAt
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
public record OrderItemDto(Guid ProductId, int Quantity, decimal UnitPrice, decimal Subtotal);
|
|
65
|
+
|
|
66
|
+
public record CreateOrderItemRequest(Guid ProductId, int Quantity, decimal UnitPrice);
|
|
67
|
+
|
|
68
|
+
namespace ExampleApp.Domain.Orders;
|
|
69
|
+
|
|
70
|
+
// ===== REPOSITORY (um por Aggregate Root) =====
|
|
71
|
+
|
|
72
|
+
public interface IOrderRepository
|
|
73
|
+
{
|
|
74
|
+
Task<Order?> GetAsync(Guid id, CancellationToken ct = default);
|
|
75
|
+
Task<List<Order>> GetByUserAsync(Guid userId, CancellationToken ct = default);
|
|
76
|
+
Task AddAsync(Order order, CancellationToken ct = default);
|
|
77
|
+
Task UpdateAsync(Order order, CancellationToken ct = default);
|
|
78
|
+
Task<bool> ExistsAsync(Guid id, CancellationToken ct = default);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ===== EXCEPTIONS =====
|
|
82
|
+
|
|
83
|
+
public class OrderNotFoundException(Guid id) : DomainException($"Order '{id}' not found.");
|
|
84
|
+
public class OrderInvalidStateException(string message) : DomainException(message);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Proposal: Order Management
|
|
2
|
+
|
|
3
|
+
**Feature:** order-management
|
|
4
|
+
**Type:** Business Logic (Level 2)
|
|
5
|
+
**Stack:** .NET 10 / C# 14, Blazor Server, EF Core, Azure SQL
|
|
6
|
+
|
|
7
|
+
## User Story
|
|
8
|
+
|
|
9
|
+
Como usuário autenticado, quero criar e gerenciar pedidos de compra para que eu possa
|
|
10
|
+
acompanhar o status dos meus pedidos e receber notificações de mudanças.
|
|
11
|
+
|
|
12
|
+
## Acceptance Criteria
|
|
13
|
+
|
|
14
|
+
- [ ] Usuário pode criar um pedido com 1+ itens
|
|
15
|
+
- [ ] Pedido começa no status Draft
|
|
16
|
+
- [ ] Pedido só pode ser Confirmado se tiver pelo menos 1 item
|
|
17
|
+
- [ ] Pedido Confirmado não pode receber mais itens
|
|
18
|
+
- [ ] Total do pedido é calculado automaticamente
|
|
19
|
+
- [ ] Sistema notifica quando pedido é Confirmado
|
|
20
|
+
|
|
21
|
+
## Out of Scope
|
|
22
|
+
|
|
23
|
+
- Pagamento (feature separada)
|
|
24
|
+
- Envio/logística
|