@polymorphism-tech/morph-spec 8.47.0 → 9.1.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 +51 -43
- package/README.md +39 -38
- package/bin/morph-spec.js +41 -113
- package/bin/validate.js +1 -147
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +41 -101
- package/framework/MORPH.md +95 -252
- package/framework/agents.json +86 -21
- package/framework/commands/morph-apply.md +5 -28
- package/framework/commands/morph-archive.md +1 -1
- package/framework/commands/morph-hotfix.md +8 -8
- package/framework/commands/morph-infra.md +1 -1
- package/framework/commands/morph-preflight.md +2 -3
- package/framework/commands/morph-status.md +4 -4
- package/framework/docs/CLI.md +574 -286
- package/framework/evals/review-checklist.md +82 -41
- package/framework/hooks/README.md +10 -11
- package/framework/hooks/claude-code/core/block-destructive-worktree-removal.js +6 -49
- package/framework/hooks/claude-code/core/block-raw-worktree-add.js +2 -35
- package/framework/hooks/claude-code/core/chain.js +4 -65
- package/framework/hooks/claude-code/core/comment-guard.js +3 -17
- package/framework/hooks/claude-code/core/denylist.json +33 -3
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +15 -63
- package/framework/hooks/claude-code/core/gate-guard.js +9 -78
- package/framework/hooks/claude-code/core/graph-refresh-kick.js +3 -24
- package/framework/hooks/claude-code/core/heavy-gate.js +3 -21
- package/framework/hooks/claude-code/core/heavy-release.js +2 -13
- package/framework/hooks/claude-code/core/loop-detect.js +2 -31
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +36 -2
- package/framework/hooks/claude-code/core/protect-spec-files.js +25 -297
- package/framework/hooks/claude-code/core/state-sync.js +15 -85
- package/framework/hooks/claude-code/core/telemetry-log.js +15 -96
- package/framework/hooks/claude-code/core/validate-completion.js +37 -147
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +23 -0
- package/framework/hooks/claude-code/core/worktree-context.js +15 -114
- package/framework/hooks/claude-code/core/worktree-create.js +6 -70
- package/framework/hooks/claude-code/core/worktree-env-inject.js +5 -56
- package/framework/hooks/claude-code/core/worktree-remove.js +5 -31
- package/framework/hooks/claude-code/statusline.py +55 -41
- package/framework/hooks/package.json +3 -0
- package/framework/hooks/shared/activity-logger.js +9 -89
- package/framework/hooks/shared/agent-reap.js +2 -17
- package/framework/hooks/shared/build-check.js +11 -76
- package/framework/hooks/shared/claim-registry.js +9 -119
- package/framework/hooks/shared/command-tokens.js +168 -44
- package/framework/hooks/shared/comment-rules.js +5 -20
- package/framework/hooks/shared/comment-scanner.js +11 -43
- package/framework/hooks/shared/comment-stripper.js +11 -85
- package/framework/hooks/shared/e2e-check.js +0 -0
- package/framework/hooks/shared/errata.js +59 -0
- package/framework/hooks/shared/feature-locator.js +11 -95
- package/framework/hooks/shared/frontend-locations.js +4 -0
- package/framework/hooks/shared/gate-question.js +12 -0
- package/framework/hooks/shared/git-exclude.js +3 -20
- package/framework/hooks/shared/git-paths.js +8 -104
- package/framework/hooks/shared/graph-freshness.js +22 -166
- package/framework/hooks/shared/graph-refresh.js +21 -149
- package/framework/hooks/shared/heavy-command.js +4 -12
- package/framework/hooks/shared/hook-response.js +8 -83
- package/framework/hooks/shared/morph-cli.js +8 -52
- package/framework/hooks/shared/payload-utils.js +10 -132
- package/framework/hooks/shared/phase-utils.js +14 -72
- package/framework/hooks/shared/redact-secrets.js +4 -15
- package/framework/hooks/shared/reparse-scan.js +6 -66
- package/framework/hooks/shared/slice-progress.js +99 -0
- package/framework/hooks/shared/source-files.js +4 -17
- package/framework/hooks/shared/spawn-command.js +23 -0
- package/framework/hooks/shared/state-reader.js +51 -247
- package/framework/hooks/shared/state-writer.js +9 -54
- package/framework/hooks/shared/stdin-reader.js +1 -11
- package/framework/hooks/shared/telemetry-logger.js +7 -67
- package/framework/hooks/shared/transcript-usage.js +7 -29
- package/framework/hooks/shared/worktree-root.js +7 -29
- package/framework/mcp/registry.json +3 -4
- package/framework/phases.json +23 -39
- package/framework/rules/csharp-standards.md +1 -1
- package/framework/rules/frontend-standards.md +1 -0
- package/framework/rules/hangfire-standards.md +1 -1
- package/framework/rules/neon-standards.md +1 -1
- package/framework/schemas/config.schema.json +14 -9
- package/framework/schemas/feature.schema.json +15 -50
- package/framework/skills/README.md +3 -4
- 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 +149 -222
- package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
- package/framework/skills/core/morph-machine/SKILL.md +2 -2
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +137 -299
- package/framework/skills/core/morph-review/SKILL.md +111 -136
- package/framework/skills/core/morph-standards/SKILL.md +27 -39
- package/framework/skills/core/morph-uiux/SKILL.md +94 -152
- package/framework/standards/STANDARDS.json +109 -1219
- package/framework/standards/STANDARDS.meta.json +1319 -0
- package/framework/standards/ai-agents/agent-archetypes.md +2 -2
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +4 -4
- package/framework/standards/ai-agents/durable-workflows-hitl.md +3 -3
- package/framework/standards/ai-agents/evals-with-cache.md +1 -2
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +2 -2
- package/framework/standards/ai-agents/observability-patterns.md +1 -1
- package/framework/standards/ai-agents/production.md +1 -1
- package/framework/standards/ai-agents/prompt-sources.md +2 -2
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +2 -2
- package/framework/standards/ai-agents/setup.md +3 -3
- package/framework/standards/ai-agents/sweet-spot.md +2 -2
- package/framework/standards/ai-agents/tool-adapters.md +0 -2
- package/framework/standards/ai-agents/vector-data-extensions.md +4 -4
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/standards/architecture/code-comments.md +7 -7
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +1 -1
- package/framework/standards/backend/api/validation.md +1 -1
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +5 -5
- package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +1 -1
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -2
- package/framework/standards/data/nosql/cache/redis.md +1 -1
- package/framework/standards/data/nosql/cosmos-db.md +3 -3
- package/framework/standards/frontend/admin-app/forms.md +1 -1
- package/framework/standards/frontend/design-system/art-direction.md +88 -0
- package/framework/standards/frontend/design-system/premium-finish.md +77 -2
- package/framework/standards/infrastructure/neon/neon-pgvector.md +5 -5
- package/framework/standards/integration/mcp/mcp-tools.md +7 -7
- package/framework/templates/CLAUDE.md.core.template +3 -3
- package/framework/templates/README.md +2 -3
- package/framework/templates/REGISTRY.json +15 -179
- package/framework/templates/docs/plan.md +72 -0
- package/framework/templates/docs/ui-mockups.md +4 -0
- package/framework/templates/dotnet/ai-kit/README.md +1 -9
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
- package/package.json +1 -1
- package/src/commands/context/context-refresh.js +0 -16
- package/src/commands/dashboard/dashboard.js +2 -8
- package/src/commands/e2e/e2e.js +18 -105
- package/src/commands/graph/affected.js +0 -14
- package/src/commands/graph/build.js +11 -50
- package/src/commands/graph/explain.js +0 -16
- package/src/commands/graph/status.js +1 -12
- package/src/commands/mcp/mcp-setup.js +4 -62
- package/src/commands/observability/cost.js +17 -111
- package/src/commands/observability/telemetry.js +1 -14
- package/src/commands/project/branch.js +4 -45
- package/src/commands/project/claim.js +4 -48
- package/src/commands/project/doctor-procs.js +1 -1
- package/src/commands/project/doctor.js +53 -307
- package/src/commands/project/env.js +1 -27
- package/src/commands/project/fleet.js +6 -35
- package/src/commands/project/heavy.js +3 -3
- package/src/commands/project/init.js +8 -68
- package/src/commands/project/install-plugin-cmd.js +0 -1
- package/src/commands/project/setup-infra-cmd.js +2 -1
- package/src/commands/project/stack-scan.js +58 -0
- package/src/commands/project/standards.js +65 -72
- package/src/commands/project/status.js +28 -121
- package/src/commands/project/update.js +31 -223
- package/src/commands/project/worktree.js +109 -883
- package/src/commands/scaffold/scaffold.js +0 -25
- package/src/commands/state/advance.js +65 -120
- package/src/commands/state/approve.js +87 -229
- package/src/commands/state/archive.js +23 -139
- package/src/commands/state/auto-approval.js +65 -0
- package/src/commands/state/create.js +49 -109
- package/src/commands/state/delete.js +11 -63
- package/src/commands/state/finish.js +105 -494
- package/src/commands/state/gate-check.js +74 -183
- package/src/commands/state/gate-decision.js +8 -42
- package/src/commands/state/handoff.js +4 -31
- package/src/commands/state/list.js +21 -91
- package/src/commands/state/report-check.js +134 -338
- package/src/commands/state/retype.js +12 -28
- package/src/commands/validation/index.js +0 -3
- package/src/commands/validation/mutate.js +79 -19
- package/src/commands/validation/plan-check.js +81 -0
- package/src/commands/validation/validate-feature.js +52 -216
- package/src/commands/validation/verify.js +45 -160
- package/src/core/paths/output-schema.js +9 -155
- package/src/core/state/feature-identity.js +1 -25
- package/src/core/state/gate-order.js +2 -30
- package/src/core/state/lifecycle-audit.js +8 -100
- package/src/core/state/state-manager.js +32 -395
- package/src/core/templates/template-registry.js +2 -97
- package/src/core/templates/template-renderer.js +13 -93
- package/src/core/templates/template-seed.js +21 -0
- package/src/core/work-types.js +10 -45
- package/src/dashboard/app/App.jsx +1 -8
- package/src/dashboard/app/components/ActivityFeed.jsx +2 -8
- package/src/dashboard/app/components/CommandPalette.jsx +4 -11
- package/src/dashboard/app/components/DetailPanel.jsx +1 -5
- package/src/dashboard/app/components/EntityLink.jsx +0 -12
- package/src/dashboard/app/components/ErrorBoundary.jsx +1 -8
- package/src/dashboard/app/components/KnowledgeMarkdown.jsx +0 -11
- package/src/dashboard/app/components/Markdown.jsx +0 -9
- package/src/dashboard/app/components/PhaseRail.jsx +0 -11
- package/src/dashboard/app/components/SearchFilter.jsx +0 -4
- package/src/dashboard/app/components/Sidebar.jsx +0 -5
- package/src/dashboard/app/hooks/useMorphQuery.js +1 -11
- package/src/dashboard/app/hooks/usePref.js +1 -5
- package/src/dashboard/app/lib/format.js +0 -2
- package/src/dashboard/app/lib/phases.js +3 -9
- package/src/dashboard/app/lib/project.js +0 -12
- package/src/dashboard/app/pages/Activity.jsx +1 -1
- package/src/dashboard/app/pages/AgentMap.jsx +1 -8
- package/src/dashboard/app/pages/FeatureDetail.jsx +139 -133
- package/src/dashboard/app/pages/Features.jsx +9 -16
- package/src/dashboard/app/pages/Guide.jsx +2 -3
- package/src/dashboard/app/pages/HookInspector.jsx +2 -23
- package/src/dashboard/app/pages/PhasePipeline.jsx +3 -7
- package/src/dashboard/app/pages/Portfolio.jsx +0 -1
- package/src/dashboard/app/pages/RulesMap.jsx +1 -16
- package/src/dashboard/app/pages/SkillsLibrary.jsx +1 -16
- package/src/dashboard/app/pages/Standards.jsx +2 -17
- package/src/dashboard/scanner/activity-scanner.js +14 -83
- package/src/dashboard/scanner/agents-scanner.js +1 -23
- package/src/dashboard/scanner/docs-scanner.js +1 -7
- package/src/dashboard/scanner/feature-status.js +2 -5
- package/src/dashboard/scanner/features-scanner.js +92 -113
- package/src/dashboard/scanner/hooks-scanner.js +5 -28
- package/src/dashboard/scanner/index.js +0 -4
- package/src/dashboard/scanner/portfolio.js +5 -29
- package/src/dashboard/scanner/project-api.js +8 -54
- package/src/dashboard/scanner/rules-scanner.js +1 -2
- package/src/dashboard/scanner/skills-scanner.js +2 -12
- package/src/dashboard/scanner/standards-scanner.js +4 -7
- package/src/dashboard/vite-plugin-morph-data.js +5 -19
- package/src/lib/ai/ai-checks.js +7 -52
- package/src/lib/ai/ai-project-scan.js +14 -108
- package/src/lib/ai/code-audit.js +7 -63
- package/src/lib/ai/pin-drift.js +8 -51
- package/src/lib/ai/registry-audit.js +11 -90
- package/src/lib/ci/ci-verify.js +14 -13
- package/src/lib/ci/github-ci.js +9 -37
- package/src/lib/ci/workflow-scaffold.js +2 -10
- package/src/lib/detectors/claude-config-detector.js +13 -74
- package/src/lib/detectors/index.js +8 -59
- package/src/lib/e2e/compose-env.js +5 -66
- package/src/lib/e2e/stack-teardown.js +6 -40
- package/src/lib/generators/architecture-scanner.js +18 -156
- package/src/lib/generators/handoff-generator.js +37 -112
- package/src/lib/generators/scaffold-generator.js +5 -101
- package/src/lib/generators/settings-generator.js +11 -122
- package/src/lib/git/branch-classifier.js +11 -84
- package/src/lib/git/default-branch.js +14 -169
- package/src/lib/git/evidence-staleness.js +2 -1
- package/src/lib/git/gh.js +2 -17
- package/src/lib/git/pending-prs.js +6 -37
- package/src/lib/git/pr-files.js +3 -28
- package/src/lib/git/pr-index.js +3 -34
- package/src/lib/git/tree-fingerprint.js +17 -17
- package/src/lib/git/tree-state.js +6 -33
- package/src/lib/graph/god-nodes.js +2 -22
- package/src/lib/graph/graph-health.js +3 -24
- package/src/lib/graph/graph-loader.js +5 -56
- package/src/lib/graph/graphify-runtime.js +7 -37
- package/src/lib/graph/graphifyignore.js +8 -74
- package/src/lib/graph/sanitize.js +16 -136
- package/src/lib/heavy/cleanup.js +2 -6
- package/src/lib/installers/effects.js +8 -93
- package/src/lib/installers/mcp-installer.js +9 -169
- package/src/lib/installers/memory-installer.js +8 -33
- package/src/lib/installers/templates-reconcile.js +5 -60
- package/src/lib/mutation/commands.js +3 -2
- package/src/lib/mutation/dotnet-introspection.js +281 -0
- package/src/lib/mutation/plan.js +14 -6
- package/src/lib/mutation/runner.js +1 -1
- package/src/lib/mutation/subset.js +47 -13
- package/src/lib/plan/artifact-vocabulary.js +40 -0
- package/src/lib/plan/checks.js +208 -0
- package/src/lib/plan/plan-parser.js +204 -0
- package/src/lib/plan/plan-template.js +18 -0
- package/src/lib/projects/registry.js +7 -44
- package/src/lib/review-reports.js +204 -0
- package/src/lib/risk-detector.js +131 -274
- package/src/lib/specs/adr-index.js +38 -85
- package/src/lib/specs/design-seed.js +18 -0
- package/src/lib/specs/frontmatter.js +31 -0
- package/src/lib/specs/gfm-table.js +11 -0
- package/src/lib/specs/revocations.js +31 -102
- package/src/lib/specs/screen-checklist.js +56 -132
- package/src/lib/stack/dotnet-build-ignores.js +43 -0
- package/src/lib/stack/stack-profile.js +1 -28
- package/src/lib/stack/stack-scan.js +260 -0
- package/src/lib/stack-filter.js +4 -27
- package/src/lib/standards/registry.js +37 -0
- package/src/lib/standards/sections.js +47 -0
- package/src/lib/standards/verified-against.js +19 -191
- package/src/lib/tasks/eval-node.js +23 -179
- package/src/lib/tasks/linux-runner.js +18 -142
- package/src/lib/tasks/test-nodes.js +43 -313
- package/src/lib/tasks/test-runner.js +107 -447
- package/src/lib/telemetry/metrics.js +13 -103
- package/src/lib/telemetry/telemetry-reader.js +13 -238
- package/src/lib/telemetry/verify-event.js +4 -34
- package/src/lib/validators/code-budget/code-budget-validator.js +4 -44
- package/src/lib/validators/code-budget/index.js +0 -7
- package/src/lib/validators/contracts/contract-compliance-validator.js +4 -26
- package/src/lib/validators/contracts/index.js +0 -6
- package/src/lib/validators/nextjs/index.js +0 -5
- package/src/lib/validators/nextjs/next-component-validator.js +4 -81
- package/src/lib/validators/packages/index.js +0 -6
- package/src/lib/validators/packages/package-validator.js +6 -56
- package/src/lib/validators/reuse/index.js +0 -8
- package/src/lib/validators/reuse/reuse-validator.js +24 -137
- package/src/lib/validators/reuse/symbol-scanner.js +6 -62
- package/src/lib/validators/traceability-check.js +54 -156
- package/src/lib/validators/validation-runner.js +20 -125
- package/src/lib/validators/verify-runner.js +152 -575
- package/src/lib/work-type-detector.js +5 -67
- package/src/lib/worktree/docker-audit.js +17 -137
- package/src/lib/worktree/env-allocator.js +10 -98
- package/src/lib/worktree/feature-truth.js +12 -115
- package/src/lib/worktree/finish-backup.js +32 -242
- package/src/lib/worktree/fleet-scanner.js +31 -126
- package/src/lib/worktree/ignored-triage.js +15 -91
- package/src/lib/worktree/vscode-settings.js +2 -3
- package/src/lib/worktree/worktree-audit.js +21 -213
- package/src/lib/worktree/worktree-include.js +3 -5
- package/src/scripts/global-install.js +3 -9
- package/src/scripts/install-plugin.js +1 -13
- package/src/scripts/setup-infra.js +17 -138
- package/src/utils/agents-installer.js +92 -272
- package/src/utils/banner.js +4 -25
- package/src/utils/claude-md-injector.js +1 -37
- package/src/utils/claude-settings-manager.js +1 -87
- package/src/utils/file-copier.js +32 -90
- package/src/utils/hooks-installer.js +26 -296
- package/src/utils/skills-installer.js +4 -102
- package/src/utils/version-checker.js +4 -83
- package/framework/commands/morph-proposal.md +0 -57
- package/framework/evals/trace-schema.md +0 -67
- package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
- package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
- package/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/framework/hooks/shared/tasks-validator.js +0 -111
- package/framework/rules/morph-task-tracking.md +0 -54
- package/framework/rules/morph-workflow.md +0 -244
- package/framework/schemas/tasks.schema.json +0 -79
- package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
- package/framework/skills/core/morph-implement/SKILL.md +0 -194
- package/framework/skills/core/morph-proposal/SKILL.md +0 -152
- package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
- package/framework/templates/docs/proposal.md +0 -192
- package/framework/templates/docs/spec.md +0 -57
- package/framework/templates/docs/ui-components.md +0 -52
- package/framework/templates/docs/ui-design-system.md +0 -76
- package/framework/templates/docs/ui-flows.md +0 -167
- package/framework/templates/examples/spec-examples.md +0 -91
- package/framework/templates/feature/decisions.md +0 -124
- package/framework/templates/feature/recap.md +0 -145
- package/framework/templates/tasks.template.json +0 -17
- package/src/commands/state/usecase.js +0 -143
- package/src/commands/tasks/dag.js +0 -181
- package/src/commands/utils/index.js +0 -3
- package/src/lib/agents/output-collector.js +0 -76
- package/src/lib/detectors/design-system-detector.js +0 -188
- package/src/lib/evaluator-report.js +0 -104
- package/src/lib/generators/design-system-generator.js +0 -508
- package/src/lib/specs/acervo-format.js +0 -70
- package/src/lib/specs/acervo-lifecycle.js +0 -264
- package/src/lib/specs/done-criteria-check.js +0 -200
- package/src/lib/specs/usecase-check.js +0 -301
- package/src/lib/specs/usecase-promoter.js +0 -301
- package/src/lib/specs/usecase-registry.js +0 -237
- package/src/lib/tasks/dispatch-planner.js +0 -319
- package/src/lib/tasks/dotnet-test-introspection.js +0 -632
- package/src/lib/tasks/mermaid-renderer.js +0 -132
- package/src/lib/tasks/task-classifier.js +0 -30
- package/src/lib/tasks/task-parser.js +0 -209
- package/src/lib/tasks/tasks-json-parser.js +0 -296
- package/src/lib/tasks/test-scope.js +0 -597
- package/src/utils/agent-id-mapper.js +0 -11
|
@@ -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*
|