@polymorphism-tech/morph-spec 3.0.1 → 3.2.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 +561 -63
- package/LICENSE +72 -72
- package/README.md +275 -79
- package/bin/detect-agents.js +3 -1
- package/bin/morph-spec.js +60 -1
- package/bin/render-template.js +61 -14
- package/bin/semantic-detect-agents.js +2 -1
- package/bin/{task-manager.js → task-manager.cjs} +113 -8
- package/bin/validate-agents-skills.js +10 -4
- package/bin/validate-agents.js +4 -3
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/cli-auto-detection.md +219 -0
- package/docs/examples.md +328 -328
- package/docs/getting-started.md +3 -3
- package/docs/llm-interaction-config.md +735 -0
- package/docs/templates.md +418 -418
- package/docs/troubleshooting.md +269 -0
- package/package.json +7 -3
- package/scripts/postinstall.js +132 -132
- package/scripts/reorganize-skills.cjs +1 -1
- package/scripts/validate-agents-structure.cjs +1 -1
- package/scripts/validate-skills.cjs +2 -2
- package/src/commands/advance-phase.js +93 -2
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/approve.js +221 -0
- package/src/commands/capture-pattern.js +121 -0
- package/src/commands/create-story.js +5 -2
- package/src/commands/deploy.js +780 -780
- package/src/commands/detect-agents.js +4 -2
- package/src/commands/generate.js +276 -149
- package/src/commands/init.js +37 -0
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/migrate-state.js +158 -0
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/search-patterns.js +126 -0
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/spawn-team.js +172 -0
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/task.js +3 -3
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/update.js +36 -0
- package/src/commands/upgrade.js +346 -0
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/generator/.gitkeep +0 -0
- package/src/generator/config-generator.js +206 -0
- package/src/generator/templates/config.json.template +40 -0
- package/src/generator/templates/project.md.template +67 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/checkpoint-hooks.js +258 -0
- package/src/lib/context-generator.js +7 -4
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/hook-executor.js +2 -1
- package/src/lib/learning-system.js +520 -520
- package/src/lib/metadata-extractor.js +380 -0
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/phase-state-machine.js +214 -0
- package/src/lib/stack-resolver.js +148 -0
- package/src/lib/standards-context-injector.js +4 -3
- package/src/lib/state-manager.js +120 -0
- package/src/lib/team-orchestrator.js +2 -1
- package/src/lib/template-data-sources.js +325 -0
- package/src/lib/troubleshoot-grep.js +204 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validation-runner.js +2 -1
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/content-validator.js +351 -0
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/llm/.gitkeep +0 -0
- package/src/llm/analyzer.js +215 -0
- package/src/llm/environment-detector.js +43 -0
- package/src/llm/few-shot-examples.js +216 -0
- package/src/llm/project-config-schema.json +188 -0
- package/src/llm/prompt-builder.js +96 -0
- package/src/llm/schema-validator.js +121 -0
- package/src/orchestrator.js +206 -0
- package/src/sanitizer/.gitkeep +0 -0
- package/src/sanitizer/context-sanitizer.js +221 -0
- package/src/sanitizer/patterns.js +163 -0
- package/src/scanner/.gitkeep +0 -0
- package/src/scanner/project-scanner.js +242 -0
- package/src/types/index.js +477 -0
- package/src/ui/.gitkeep +0 -0
- package/src/ui/diff-display.js +91 -0
- package/src/ui/interactive-wizard.js +96 -0
- package/src/ui/user-review.js +211 -0
- package/src/ui/wizard-questions.js +190 -0
- package/src/utils/file-copier.js +3 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- package/src/writer/.gitkeep +0 -0
- package/src/writer/file-writer.js +86 -0
- package/{content → stacks/blazor-azure}/.azure/README.md +2 -2
- package/{content → stacks/blazor-azure}/.azure/pipelines/pipeline-variables.yml +1 -1
- package/{content → stacks/blazor-azure}/.azure/pipelines/prod-pipeline.yml +1 -1
- package/{content → stacks/blazor-azure}/.azure/pipelines/staging-pipeline.yml +1 -1
- package/{content → stacks/blazor-azure}/.claude/commands/morph-preflight.md +227 -227
- package/{content → stacks/blazor-azure}/.claude/commands/morph-troubleshoot.md +122 -122
- package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-setup.md +1 -1
- package/{content → stacks/blazor-azure}/.morph/docs/workflows/enforcement-pipeline.md +3 -3
- package/{content → stacks/blazor-azure}/.morph/hooks/README.md +12 -12
- package/{content → stacks/blazor-azure}/.morph/standards/agent-teams-workflow.md +2 -2
- package/{content → stacks/blazor-azure}/.morph/standards/migration-guide.md +2 -2
- package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy-checklist.md +426 -426
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +244 -0
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +335 -0
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +189 -0
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +170 -0
- package/stacks/nextjs-supabase/.morph/config/agents.json +345 -0
- package/stacks/nextjs-supabase/.morph/config/config.template.json +92 -0
- package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +169 -0
- package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +247 -0
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +697 -0
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +85 -0
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +86 -0
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +498 -0
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +121 -0
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +138 -0
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +162 -0
- package/stacks/nextjs-supabase/.morph/project.md +168 -0
- package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +191 -0
- package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +193 -0
- package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +171 -0
- package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +164 -0
- package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +179 -0
- package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +148 -0
- package/stacks/nextjs-supabase/.morph/templates/contracts.cs +173 -0
- package/stacks/nextjs-supabase/.morph/templates/contracts.ts +168 -0
- package/stacks/nextjs-supabase/.morph/templates/decisions.md +115 -0
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +38 -0
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +48 -0
- package/stacks/nextjs-supabase/.morph/templates/proposal.md +145 -0
- package/stacks/nextjs-supabase/.morph/templates/recap.md +134 -0
- package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +57 -0
- package/stacks/nextjs-supabase/.morph/templates/spec.md +231 -0
- package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +100 -0
- package/stacks/nextjs-supabase/.morph/templates/tasks.md +257 -0
- package/stacks/nextjs-supabase/CLAUDE.md +149 -0
- package/stacks/nextjs-supabase/README.md +112 -0
- /package/{content → stacks/blazor-azure}/.azure/docs/azure-devops-setup.md +0 -0
- /package/{content → stacks/blazor-azure}/.azure/docs/branch-strategy.md +0 -0
- /package/{content → stacks/blazor-azure}/.azure/docs/local-development.md +0 -0
- /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/build-dotnet.yml +0 -0
- /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-app-service.yml +0 -0
- /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-container-app.yml +0 -0
- /package/{content → stacks/blazor-azure}/.azure/pipelines/templates/infra-deploy.yml +0 -0
- /package/{content → stacks/blazor-azure}/.claude/commands/morph-apply.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/commands/morph-archive.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/commands/morph-deploy.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/commands/morph-infra.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/commands/morph-proposal.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/commands/morph-status.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/settings.local.json +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/code-review.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/morph-checklist.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/simulation-checklist.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/morph-replicate.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-clarify.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-design.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-tasks.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-uiux.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/prompt-engineer.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/seo-growth-hacker.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/resend-email.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-3-technologies/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.claude/skills/level-4-patterns/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/.morphversion +0 -0
- /package/{content → stacks/blazor-azure}/.morph/archive/.gitkeep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/config/agents.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/config/config.template.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/docs/workflows/design-impl.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/docs/workflows/fast-track.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/docs/workflows/full-morph.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/docs/workflows/standard.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/docs/workflows/ui-refresh.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/contracts.ts +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/spec.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/tasks.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/contracts.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/decisions.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/spec.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/tasks.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/contracts.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/spec.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/tasks.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/decisions.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/proposal.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/spec.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/examples/state-v3.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/features/.gitkeep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-agents.sh +0 -0
- /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-all.sh +0 -0
- /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-specs.sh +0 -0
- /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-tests.sh +0 -0
- /package/{content → stacks/blazor-azure}/.morph/hooks/task-completed.js +0 -0
- /package/{content → stacks/blazor-azure}/.morph/hooks/teammate-idle.js +0 -0
- /package/{content → stacks/blazor-azure}/.morph/project.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/schemas/agent.schema.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/schemas/tasks.schema.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/specs/.gitkeep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-blazor-ui.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-production.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-setup.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-workflows.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/architecture.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/azure.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/coding.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/dotnet10-migration.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/fluent-ui-setup.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/passkeys-auth.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/standards/vector-search-rag.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/state.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT-FEATURE.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/FluentDesignTheme.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/MudTheme.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/agent.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/clarify-questions.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/component.razor +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Commands.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Entities.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Queries.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/contracts/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/contracts.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/decisions.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/design-system.css +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/.dockerignore.example +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/Dockerfile.example +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/README.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-insights.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/app-service.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/azure-pipelines-deploy.yml +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app-env.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.ps1 +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.sh +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/key-vault.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/main.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.dev.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.prod.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.staging.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/sql-database.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/infra/storage.bicep +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-client.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-webhook.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/integrations/azure-identity-config.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/integrations/clerk-config.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/job.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/migration.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/proposal.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/recap.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/repository.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/saas/subscription.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/saas/tenant.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/service.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/simulation.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/spec.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/sprint-status.yaml +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/state.template.json +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/story.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/tasks.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/test.cs +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/ui-components.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/ui-design-system.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/ui-flows.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/templates/ui-mockups.md +0 -0
- /package/{content → stacks/blazor-azure}/.morph/test-infra/example.bicep +0 -0
- /package/{content → stacks/blazor-azure}/CLAUDE.md +0 -0
- /package/{content → stacks/blazor-azure}/README.md +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// CONTRACTS: {{FEATURE_NAME_TITLE}}
|
|
3
|
+
// Stack: Next.js + Supabase
|
|
4
|
+
// Generated by MORPH Framework
|
|
5
|
+
// Date: {{DATE}}
|
|
6
|
+
// ============================================================
|
|
7
|
+
|
|
8
|
+
// ----- Supabase Config -----
|
|
9
|
+
|
|
10
|
+
export interface SupabaseConfig {
|
|
11
|
+
url: string;
|
|
12
|
+
anonKey: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// ----- API Client Types -----
|
|
16
|
+
|
|
17
|
+
export interface ApiClientConfig {
|
|
18
|
+
baseUrl: string;
|
|
19
|
+
getAccessToken: () => Promise<string | null>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ApiError {
|
|
23
|
+
message: string;
|
|
24
|
+
code: string;
|
|
25
|
+
statusCode: number;
|
|
26
|
+
details?: Record<string, string[]>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type ApiResult<T> =
|
|
30
|
+
| { success: true; data: T }
|
|
31
|
+
| { success: false; error: ApiError };
|
|
32
|
+
|
|
33
|
+
// ----- Pagination -----
|
|
34
|
+
|
|
35
|
+
export interface PaginationQuery {
|
|
36
|
+
page?: number;
|
|
37
|
+
pageSize?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface PagedResult<T> {
|
|
41
|
+
items: T[];
|
|
42
|
+
totalCount: number;
|
|
43
|
+
page: number;
|
|
44
|
+
pageSize: number;
|
|
45
|
+
totalPages: number;
|
|
46
|
+
hasNext: boolean;
|
|
47
|
+
hasPrevious: boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ----- Supabase Client Type Aliases -----
|
|
51
|
+
// Generated by: supabase gen types typescript --project-id <id> > types/database.ts
|
|
52
|
+
|
|
53
|
+
export type Tables<T extends keyof Database["public"]["Tables"]> =
|
|
54
|
+
Database["public"]["Tables"][T]["Row"];
|
|
55
|
+
|
|
56
|
+
export type Insertable<T extends keyof Database["public"]["Tables"]> =
|
|
57
|
+
Database["public"]["Tables"][T]["Insert"];
|
|
58
|
+
|
|
59
|
+
export type Updatable<T extends keyof Database["public"]["Tables"]> =
|
|
60
|
+
Database["public"]["Tables"][T]["Update"];
|
|
61
|
+
|
|
62
|
+
// ----- Database Schema (placeholder - replace with generated types) -----
|
|
63
|
+
|
|
64
|
+
export interface Database {
|
|
65
|
+
public: {
|
|
66
|
+
Tables: {
|
|
67
|
+
{{FEATURE_NAME}}: {
|
|
68
|
+
Row: {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
user_id: string;
|
|
72
|
+
status: {{FEATURE_NAME_PASCAL}}Status;
|
|
73
|
+
created_at: string;
|
|
74
|
+
updated_at: string | null;
|
|
75
|
+
};
|
|
76
|
+
Insert: {
|
|
77
|
+
id?: string;
|
|
78
|
+
name: string;
|
|
79
|
+
user_id?: string;
|
|
80
|
+
status?: {{FEATURE_NAME_PASCAL}}Status;
|
|
81
|
+
created_at?: string;
|
|
82
|
+
updated_at?: string | null;
|
|
83
|
+
};
|
|
84
|
+
Update: {
|
|
85
|
+
id?: string;
|
|
86
|
+
name?: string;
|
|
87
|
+
user_id?: string;
|
|
88
|
+
status?: {{FEATURE_NAME_PASCAL}}Status;
|
|
89
|
+
created_at?: string;
|
|
90
|
+
updated_at?: string | null;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
Views: Record<string, never>;
|
|
95
|
+
Functions: Record<string, never>;
|
|
96
|
+
Enums: {
|
|
97
|
+
{{FEATURE_NAME}}_status: {{FEATURE_NAME_PASCAL}}Status;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ----- Feature Types -----
|
|
103
|
+
|
|
104
|
+
export type {{FEATURE_NAME_PASCAL}}Status =
|
|
105
|
+
| "draft"
|
|
106
|
+
| "active"
|
|
107
|
+
| "completed"
|
|
108
|
+
| "archived"
|
|
109
|
+
| "failed"
|
|
110
|
+
| "cancelled";
|
|
111
|
+
|
|
112
|
+
export interface {{FEATURE_NAME_PASCAL}} {
|
|
113
|
+
id: string;
|
|
114
|
+
name: string;
|
|
115
|
+
userId: string;
|
|
116
|
+
status: {{FEATURE_NAME_PASCAL}}Status;
|
|
117
|
+
createdAt: string;
|
|
118
|
+
updatedAt: string | null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface Create{{FEATURE_NAME_PASCAL}}Input {
|
|
122
|
+
name: string;
|
|
123
|
+
// Add other required fields
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface Update{{FEATURE_NAME_PASCAL}}Input {
|
|
127
|
+
name?: string;
|
|
128
|
+
// Add other updatable fields
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ----- Storage Types -----
|
|
132
|
+
|
|
133
|
+
export interface StorageUpload {
|
|
134
|
+
bucket: string;
|
|
135
|
+
path: string;
|
|
136
|
+
file: File;
|
|
137
|
+
contentType?: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface StorageFile {
|
|
141
|
+
id: string;
|
|
142
|
+
name: string;
|
|
143
|
+
bucket: string;
|
|
144
|
+
path: string;
|
|
145
|
+
publicUrl: string;
|
|
146
|
+
size: number;
|
|
147
|
+
contentType: string;
|
|
148
|
+
createdAt: string;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ----- Auth Types -----
|
|
152
|
+
|
|
153
|
+
export interface AuthUser {
|
|
154
|
+
id: string;
|
|
155
|
+
email: string;
|
|
156
|
+
displayName: string | null;
|
|
157
|
+
avatarUrl: string | null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface AuthSession {
|
|
161
|
+
user: AuthUser;
|
|
162
|
+
accessToken: string;
|
|
163
|
+
expiresAt: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ----- Form Schemas (use with zod) -----
|
|
167
|
+
// Define zod schemas in component files, not here.
|
|
168
|
+
// This file is for type definitions only.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Architecture Decision Records - {{FEATURE_NAME_TITLE}}
|
|
2
|
+
|
|
3
|
+
## ADR-001: {Decision Title}
|
|
4
|
+
|
|
5
|
+
**Date:** {{DATE}}
|
|
6
|
+
**Status:** Proposed | Accepted | Deprecated | Superseded
|
|
7
|
+
**Deciders:** MORPH Agents, Developer
|
|
8
|
+
|
|
9
|
+
### Context
|
|
10
|
+
|
|
11
|
+
{Describe the context and problem that led to this decision}
|
|
12
|
+
|
|
13
|
+
### Decision
|
|
14
|
+
|
|
15
|
+
{Describe the decision made}
|
|
16
|
+
|
|
17
|
+
### Consequences
|
|
18
|
+
|
|
19
|
+
**Pros:**
|
|
20
|
+
- {Positive consequence 1}
|
|
21
|
+
- {Positive consequence 2}
|
|
22
|
+
|
|
23
|
+
**Cons:**
|
|
24
|
+
- {Negative consequence 1}
|
|
25
|
+
|
|
26
|
+
**Risks:**
|
|
27
|
+
- {Identified risk}
|
|
28
|
+
|
|
29
|
+
### Alternatives Considered
|
|
30
|
+
|
|
31
|
+
#### Option A: {Name}
|
|
32
|
+
- Pros: {advantages}
|
|
33
|
+
- Cons: {disadvantages}
|
|
34
|
+
- **Rejected because:** {reason}
|
|
35
|
+
|
|
36
|
+
#### Option B: {Name}
|
|
37
|
+
- Pros: {advantages}
|
|
38
|
+
- Cons: {disadvantages}
|
|
39
|
+
- **Rejected because:** {reason}
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## ADR-002: Database Access Strategy
|
|
44
|
+
|
|
45
|
+
**Date:** {{DATE}}
|
|
46
|
+
**Status:** Accepted
|
|
47
|
+
|
|
48
|
+
### Context
|
|
49
|
+
|
|
50
|
+
Need to decide how the .NET API accesses Supabase PostgreSQL.
|
|
51
|
+
|
|
52
|
+
### Decision
|
|
53
|
+
|
|
54
|
+
Use Dapper with Npgsql for direct SQL queries. No EF Core.
|
|
55
|
+
|
|
56
|
+
### Consequences
|
|
57
|
+
|
|
58
|
+
**Pros:**
|
|
59
|
+
- Full control over SQL queries
|
|
60
|
+
- Better performance (no ORM overhead)
|
|
61
|
+
- Direct access to PostgreSQL features (jsonb, pgvector, functions)
|
|
62
|
+
- RLS policies apply naturally through connection
|
|
63
|
+
|
|
64
|
+
**Cons:**
|
|
65
|
+
- No automatic migrations (use Supabase CLI instead)
|
|
66
|
+
- Manual SQL query writing
|
|
67
|
+
- No change tracking
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## ADR-003: Auth Strategy
|
|
72
|
+
|
|
73
|
+
**Date:** {{DATE}}
|
|
74
|
+
**Status:** Accepted
|
|
75
|
+
|
|
76
|
+
### Context
|
|
77
|
+
|
|
78
|
+
Need authentication for both Next.js frontend and .NET API.
|
|
79
|
+
|
|
80
|
+
### Decision
|
|
81
|
+
|
|
82
|
+
Use Supabase Auth with @supabase/ssr on frontend. Validate JWT tokens in .NET API middleware.
|
|
83
|
+
|
|
84
|
+
### Consequences
|
|
85
|
+
|
|
86
|
+
**Pros:**
|
|
87
|
+
- Single auth provider for both layers
|
|
88
|
+
- RLS policies work automatically with auth.uid()
|
|
89
|
+
- Built-in social login, magic links, email/password
|
|
90
|
+
- No separate auth service to maintain
|
|
91
|
+
|
|
92
|
+
**Cons:**
|
|
93
|
+
- Coupled to Supabase ecosystem
|
|
94
|
+
- JWT secret must be shared with .NET API
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Template for New ADRs
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## ADR-XXX: {Title}
|
|
102
|
+
|
|
103
|
+
**Date:**
|
|
104
|
+
**Status:** Proposed | Accepted | Deprecated | Superseded
|
|
105
|
+
|
|
106
|
+
### Context
|
|
107
|
+
{Why is this decision needed?}
|
|
108
|
+
|
|
109
|
+
### Decision
|
|
110
|
+
{What was decided?}
|
|
111
|
+
|
|
112
|
+
### Consequences
|
|
113
|
+
**Pros:** {list}
|
|
114
|
+
**Cons:** {list}
|
|
115
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# Dockerfile: .NET 10 API ({{FEATURE_NAME_TITLE}})
|
|
3
|
+
# Stack: Next.js + Supabase + .NET API
|
|
4
|
+
# Generated by MORPH Framework
|
|
5
|
+
# ============================================================
|
|
6
|
+
|
|
7
|
+
# Stage 1: Build
|
|
8
|
+
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
9
|
+
WORKDIR /src
|
|
10
|
+
|
|
11
|
+
# Copy project file and restore dependencies
|
|
12
|
+
COPY *.csproj .
|
|
13
|
+
RUN dotnet restore
|
|
14
|
+
|
|
15
|
+
# Copy source code and publish
|
|
16
|
+
COPY . .
|
|
17
|
+
RUN dotnet publish -c Release -o /app/publish --no-restore
|
|
18
|
+
|
|
19
|
+
# Stage 2: Runtime
|
|
20
|
+
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
|
|
23
|
+
# Copy published output
|
|
24
|
+
COPY --from=build /app/publish .
|
|
25
|
+
|
|
26
|
+
# Configuration
|
|
27
|
+
ENV ASPNETCORE_URLS=http://+:8080
|
|
28
|
+
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
29
|
+
|
|
30
|
+
# Expose port
|
|
31
|
+
EXPOSE 8080
|
|
32
|
+
|
|
33
|
+
# Health check
|
|
34
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
35
|
+
CMD curl -f http://localhost:8080/health || exit 1
|
|
36
|
+
|
|
37
|
+
# Entrypoint
|
|
38
|
+
ENTRYPOINT ["dotnet", "Api.dll"]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# Dockerfile: Next.js Frontend ({{FEATURE_NAME_TITLE}})
|
|
3
|
+
# Stack: Next.js + Supabase
|
|
4
|
+
# Generated by MORPH Framework
|
|
5
|
+
# Requires: output: "standalone" in next.config.ts
|
|
6
|
+
# ============================================================
|
|
7
|
+
|
|
8
|
+
# Stage 1: Install dependencies
|
|
9
|
+
FROM node:22-alpine AS deps
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY package.json package-lock.json ./
|
|
12
|
+
RUN npm ci --omit=dev
|
|
13
|
+
|
|
14
|
+
# Stage 2: Build application
|
|
15
|
+
FROM node:22-alpine AS builder
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
18
|
+
COPY . .
|
|
19
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
20
|
+
RUN npm run build
|
|
21
|
+
|
|
22
|
+
# Stage 3: Production runtime
|
|
23
|
+
FROM node:22-alpine AS runner
|
|
24
|
+
WORKDIR /app
|
|
25
|
+
|
|
26
|
+
ENV NODE_ENV=production
|
|
27
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
28
|
+
|
|
29
|
+
# Create non-root user
|
|
30
|
+
RUN addgroup --system --gid 1001 nodejs && \
|
|
31
|
+
adduser --system --uid 1001 nextjs
|
|
32
|
+
|
|
33
|
+
# Copy build output
|
|
34
|
+
COPY --from=builder /app/public ./public
|
|
35
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
36
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
37
|
+
|
|
38
|
+
# Switch to non-root user
|
|
39
|
+
USER nextjs
|
|
40
|
+
|
|
41
|
+
# Expose port
|
|
42
|
+
EXPOSE 3000
|
|
43
|
+
|
|
44
|
+
ENV PORT=3000
|
|
45
|
+
ENV HOSTNAME="0.0.0.0"
|
|
46
|
+
|
|
47
|
+
# Start server
|
|
48
|
+
CMD ["node", "server.js"]
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Feature Proposal: {{FEATURE_NAME_TITLE}}
|
|
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
|
+
| **Stack** | Next.js + Supabase + .NET API |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
{Brief 2-3 sentence summary of the feature}
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Problem Statement
|
|
25
|
+
|
|
26
|
+
### What is the problem?
|
|
27
|
+
|
|
28
|
+
{Describe the problem this feature solves. Be specific.}
|
|
29
|
+
|
|
30
|
+
### Who is affected?
|
|
31
|
+
|
|
32
|
+
{Who suffers from this problem? End users? Developers? Operations?}
|
|
33
|
+
|
|
34
|
+
### What is the impact?
|
|
35
|
+
|
|
36
|
+
{What is the impact of NOT solving this problem?}
|
|
37
|
+
- User productivity loss: {X}
|
|
38
|
+
- Revenue impact: {X}
|
|
39
|
+
- User satisfaction: {X}
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Proposed Solution
|
|
44
|
+
|
|
45
|
+
### Key Features
|
|
46
|
+
|
|
47
|
+
1. **{Feature 1}** - {brief description}
|
|
48
|
+
2. **{Feature 2}** - {brief description}
|
|
49
|
+
3. **{Feature 3}** - {brief description}
|
|
50
|
+
|
|
51
|
+
### Technical Approach
|
|
52
|
+
|
|
53
|
+
| Layer | Technology | Role |
|
|
54
|
+
|-------|-----------|------|
|
|
55
|
+
| **Database** | Supabase (PostgreSQL + RLS) | {tables, policies, storage} |
|
|
56
|
+
| **Backend API** | .NET 10 Minimal API | {endpoints, business logic} |
|
|
57
|
+
| **Frontend** | Next.js 15 (App Router) | {pages, components, auth} |
|
|
58
|
+
| **Infra** | EasyPanel + Docker | {deployment, SSL} |
|
|
59
|
+
|
|
60
|
+
### User Journey
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
1. User {initial action}
|
|
64
|
+
2. System {response}
|
|
65
|
+
3. User {next action}
|
|
66
|
+
4. System {final result}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Cost Estimate
|
|
72
|
+
|
|
73
|
+
| Resource | Provider | Monthly Cost | Notes |
|
|
74
|
+
|----------|----------|-------------|-------|
|
|
75
|
+
| Supabase | Free / Pro | $0 - $25 | {DB, Auth, Storage, Realtime} |
|
|
76
|
+
| VPS (EasyPanel) | {provider} | ${X} | {API + Web containers} |
|
|
77
|
+
| External APIs | {provider} | ${X} | {if applicable} |
|
|
78
|
+
| **Total** | | **${X}/month** | |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Risk Assessment
|
|
83
|
+
|
|
84
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
85
|
+
|------|------------|--------|------------|
|
|
86
|
+
| {Risk 1} | High/Med/Low | High/Med/Low | {mitigation strategy} |
|
|
87
|
+
| {Risk 2} | High/Med/Low | High/Med/Low | {mitigation strategy} |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Scope
|
|
92
|
+
|
|
93
|
+
### In Scope
|
|
94
|
+
|
|
95
|
+
- {Item 1}
|
|
96
|
+
- {Item 2}
|
|
97
|
+
|
|
98
|
+
### Out of Scope
|
|
99
|
+
|
|
100
|
+
- {Item 1}
|
|
101
|
+
- {Item 2}
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Success Metrics
|
|
106
|
+
|
|
107
|
+
| Metric | Current | Target |
|
|
108
|
+
|--------|---------|--------|
|
|
109
|
+
| {Metric 1} | {X} | {Y} |
|
|
110
|
+
| {Metric 2} | {X} | {Y} |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Dependencies
|
|
115
|
+
|
|
116
|
+
- [ ] {Dependency 1} - {status}
|
|
117
|
+
- [ ] {Dependency 2} - {status}
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Estimated Effort
|
|
122
|
+
|
|
123
|
+
| Phase | Estimate |
|
|
124
|
+
|-------|----------|
|
|
125
|
+
| Design & Spec | {X}h |
|
|
126
|
+
| Database & Migrations | {X}h |
|
|
127
|
+
| Backend API | {X}h |
|
|
128
|
+
| Frontend | {X}h |
|
|
129
|
+
| Testing | {X}h |
|
|
130
|
+
| **Total** | **{X}h** |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Next Steps
|
|
135
|
+
|
|
136
|
+
Once approved:
|
|
137
|
+
1. Create detailed `spec.md` with technical design
|
|
138
|
+
2. Define contracts (`contracts.cs` + `contracts.ts`)
|
|
139
|
+
3. Record decisions in `decisions.md`
|
|
140
|
+
4. Break down into `tasks.md`
|
|
141
|
+
5. Begin implementation
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
*Created with MORPH Framework*
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Feature Recap: {{FEATURE_NAME_TITLE}}
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
| Field | Value |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **Feature ID** | {{FEATURE_NAME}} |
|
|
8
|
+
| **Completed** | {{DATE}} |
|
|
9
|
+
| **Total Tasks** | {X} |
|
|
10
|
+
| **Time Spent** | {X}h |
|
|
11
|
+
| **Agents Used** | {list} |
|
|
12
|
+
| **Stack** | Next.js + Supabase + .NET API |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Tasks Completed
|
|
17
|
+
|
|
18
|
+
| ID | Title | Category | Duration |
|
|
19
|
+
|----|-------|----------|----------|
|
|
20
|
+
| T001 | {title} | Database | {X}min |
|
|
21
|
+
| T002 | {title} | Backend | {X}min |
|
|
22
|
+
| T003 | {title} | Frontend | {X}min |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Validation Results
|
|
27
|
+
|
|
28
|
+
| Validator | Status | Details |
|
|
29
|
+
|-----------|--------|---------|
|
|
30
|
+
| contract-compliance | Pass/Fail | {details} |
|
|
31
|
+
| architecture | Pass/Fail | {details} |
|
|
32
|
+
| design-system | Pass/Fail | {details} |
|
|
33
|
+
| coding-standards | Pass/Fail | {details} |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## What Was Delivered
|
|
38
|
+
|
|
39
|
+
### Functionality
|
|
40
|
+
- {Functionality 1 delivered}
|
|
41
|
+
- {Functionality 2 delivered}
|
|
42
|
+
- {Functionality 3 delivered}
|
|
43
|
+
|
|
44
|
+
### Database (Supabase)
|
|
45
|
+
- Tables: {list}
|
|
46
|
+
- RLS Policies: {count} policies
|
|
47
|
+
- Migrations: {count} files
|
|
48
|
+
|
|
49
|
+
### Backend API (.NET)
|
|
50
|
+
- Endpoints: {count} endpoints
|
|
51
|
+
- Services: {list}
|
|
52
|
+
|
|
53
|
+
### Frontend (Next.js)
|
|
54
|
+
- Pages: {list}
|
|
55
|
+
- Components: {list}
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Files Created
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
supabase/migrations/{files}
|
|
63
|
+
backend/src/{files}
|
|
64
|
+
frontend/src/{files}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Files Modified
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
{list of modified files}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Architecture Decisions
|
|
76
|
+
|
|
77
|
+
| Decision | Rationale |
|
|
78
|
+
|----------|-----------|
|
|
79
|
+
| {Decision 1} | {Reason} |
|
|
80
|
+
| {Decision 2} | {Reason} |
|
|
81
|
+
|
|
82
|
+
See full ADRs in `decisions.md`
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Test Coverage
|
|
87
|
+
|
|
88
|
+
| Type | Files | Coverage |
|
|
89
|
+
|------|-------|----------|
|
|
90
|
+
| Backend Unit | {X} | {X}% |
|
|
91
|
+
| Frontend Component | {X} | {X}% |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Lessons Learned
|
|
96
|
+
|
|
97
|
+
### What Went Well
|
|
98
|
+
- {Positive point 1}
|
|
99
|
+
- {Positive point 2}
|
|
100
|
+
|
|
101
|
+
### What Could Be Improved
|
|
102
|
+
- {Improvement point 1}
|
|
103
|
+
- {Improvement point 2}
|
|
104
|
+
|
|
105
|
+
### Recommendations for Future
|
|
106
|
+
- {Recommendation 1}
|
|
107
|
+
- {Recommendation 2}
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Metrics
|
|
112
|
+
|
|
113
|
+
| Metric | Value |
|
|
114
|
+
|--------|-------|
|
|
115
|
+
| Tasks Completed | {X}/{X} |
|
|
116
|
+
| Checkpoints Passed | {X} |
|
|
117
|
+
| Validation Passes | {X}/{X} |
|
|
118
|
+
| Bugs Found | {X} |
|
|
119
|
+
| Bugs Fixed | {X} |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Related Resources
|
|
124
|
+
|
|
125
|
+
- **Proposal:** `proposal.md`
|
|
126
|
+
- **Spec:** `spec.md`
|
|
127
|
+
- **Contracts (.NET):** `contracts.cs`
|
|
128
|
+
- **Contracts (TS):** `contracts.ts`
|
|
129
|
+
- **Tasks:** `tasks.md`
|
|
130
|
+
- **Decisions:** `decisions.md`
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
*Generated by MORPH Framework on {{DATE}}*
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- RLS Policy: {{FEATURE_NAME_TITLE}}
|
|
3
|
+
-- Stack: Next.js + Supabase
|
|
4
|
+
-- Generated by MORPH Framework
|
|
5
|
+
-- Date: {{DATE}}
|
|
6
|
+
-- ============================================================
|
|
7
|
+
|
|
8
|
+
-- Enable RLS on table
|
|
9
|
+
alter table public.{{TABLE_NAME}} enable row level security;
|
|
10
|
+
|
|
11
|
+
-- Force RLS for table owner (prevents bypassing)
|
|
12
|
+
alter table public.{{TABLE_NAME}} force row level security;
|
|
13
|
+
|
|
14
|
+
-- Policy: {{POLICY_NAME}}
|
|
15
|
+
-- Operation: {{OPERATION}} (SELECT | INSERT | UPDATE | DELETE | ALL)
|
|
16
|
+
|
|
17
|
+
-- SELECT policy: users can read their own rows
|
|
18
|
+
create policy "{{POLICY_NAME}}_select"
|
|
19
|
+
on public.{{TABLE_NAME}}
|
|
20
|
+
for select
|
|
21
|
+
using ({{USING_EXPRESSION}});
|
|
22
|
+
|
|
23
|
+
-- INSERT policy: users can insert rows for themselves
|
|
24
|
+
create policy "{{POLICY_NAME}}_insert"
|
|
25
|
+
on public.{{TABLE_NAME}}
|
|
26
|
+
for insert
|
|
27
|
+
with check ({{WITH_CHECK_EXPRESSION}});
|
|
28
|
+
|
|
29
|
+
-- UPDATE policy: users can update their own rows
|
|
30
|
+
create policy "{{POLICY_NAME}}_update"
|
|
31
|
+
on public.{{TABLE_NAME}}
|
|
32
|
+
for update
|
|
33
|
+
using ({{USING_EXPRESSION}})
|
|
34
|
+
with check ({{WITH_CHECK_EXPRESSION}});
|
|
35
|
+
|
|
36
|
+
-- DELETE policy: users can delete their own rows
|
|
37
|
+
create policy "{{POLICY_NAME}}_delete"
|
|
38
|
+
on public.{{TABLE_NAME}}
|
|
39
|
+
for delete
|
|
40
|
+
using ({{USING_EXPRESSION}});
|
|
41
|
+
|
|
42
|
+
-- ============================================================
|
|
43
|
+
-- Common USING / WITH CHECK expressions:
|
|
44
|
+
--
|
|
45
|
+
-- Owner-based:
|
|
46
|
+
-- auth.uid() = user_id
|
|
47
|
+
--
|
|
48
|
+
-- Role-based:
|
|
49
|
+
-- auth.jwt() ->> 'role' = 'admin'
|
|
50
|
+
--
|
|
51
|
+
-- Organization-based:
|
|
52
|
+
-- org_id in (select org_id from public.org_members where user_id = auth.uid())
|
|
53
|
+
--
|
|
54
|
+
-- Public read, owner write:
|
|
55
|
+
-- SELECT using (true)
|
|
56
|
+
-- INSERT/UPDATE/DELETE using (auth.uid() = user_id)
|
|
57
|
+
-- ============================================================
|