@polymorphism-tech/morph-spec 3.0.1 → 3.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 +52 -88
- package/LICENSE +72 -72
- package/README.md +198 -76
- package/bin/detect-agents.js +3 -1
- package/bin/morph-spec.js +10 -0
- package/bin/render-template.js +5 -4
- package/bin/semantic-detect-agents.js +2 -1
- package/bin/{task-manager.js → task-manager.cjs} +12 -1
- 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/examples.md +328 -328
- package/docs/getting-started.md +3 -3
- package/docs/templates.md +418 -418
- package/package.json +3 -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/analyze-blazor-concurrency.js +193 -193
- 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 +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/task.js +1 -1
- package/src/commands/troubleshoot.js +222 -222
- 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/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/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/mockup-generator.js +366 -366
- package/src/lib/stack-resolver.js +148 -0
- package/src/lib/standards-context-injector.js +4 -3
- package/src/lib/team-orchestrator.js +2 -1
- 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/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/file-copier.js +3 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- 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,231 @@
|
|
|
1
|
+
# Feature Specification: {{FEATURE_NAME_TITLE}}
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| **ID** | {{FEATURE_NAME}} |
|
|
6
|
+
| **Status** | Draft / In Review / Approved / In Progress / Done |
|
|
7
|
+
| **Created** | {{DATE}} |
|
|
8
|
+
| **Stack** | Next.js + Supabase + .NET API |
|
|
9
|
+
| **Complexity** | Low / Medium / High |
|
|
10
|
+
| **Estimated Cost** | $X/month |
|
|
11
|
+
| **Agents** | Core: All / Specialists: {list} |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
**Problem:** {What problem this feature solves}
|
|
18
|
+
|
|
19
|
+
**Solution:** {High-level solution}
|
|
20
|
+
|
|
21
|
+
**Success Criteria:**
|
|
22
|
+
- [ ] {Criterion 1}
|
|
23
|
+
- [ ] {Criterion 2}
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Requirements
|
|
28
|
+
|
|
29
|
+
### Functional Requirements
|
|
30
|
+
|
|
31
|
+
| ID | Description | Priority |
|
|
32
|
+
|----|-------------|----------|
|
|
33
|
+
| FR1 | {requirement} | Must |
|
|
34
|
+
| FR2 | {requirement} | Must |
|
|
35
|
+
| FR3 | {requirement} | Should |
|
|
36
|
+
|
|
37
|
+
### Non-Functional Requirements
|
|
38
|
+
|
|
39
|
+
| ID | Category | Target |
|
|
40
|
+
|----|----------|--------|
|
|
41
|
+
| NFR1 | Performance | {e.g., API response < 200ms p95} |
|
|
42
|
+
| NFR2 | Reliability | {e.g., 99.9% uptime} |
|
|
43
|
+
| NFR3 | Security | {e.g., All data access via RLS} |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Technical Architecture
|
|
48
|
+
|
|
49
|
+
### Stack
|
|
50
|
+
|
|
51
|
+
| Component | Technology | Purpose |
|
|
52
|
+
|-----------|-----------|---------|
|
|
53
|
+
| Database | Supabase PostgreSQL | Data storage, RLS, Auth |
|
|
54
|
+
| Storage | Supabase Storage | File uploads |
|
|
55
|
+
| Realtime | Supabase Realtime | Live updates |
|
|
56
|
+
| Backend API | .NET 10 Minimal API | Business logic, integrations |
|
|
57
|
+
| Frontend | Next.js 15 (App Router) | SSR, UI, client interactions |
|
|
58
|
+
| Auth | Supabase Auth (@supabase/ssr) | Authentication, JWT |
|
|
59
|
+
| UI | shadcn/ui + Tailwind CSS | Components, styling |
|
|
60
|
+
| Deployment | EasyPanel + Docker | Hosting, SSL |
|
|
61
|
+
|
|
62
|
+
### Architecture Diagram
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
[Browser] --HTTPS--> [Next.js (SSR)]
|
|
66
|
+
|
|
|
67
|
+
[Supabase Client] --RLS--> [Supabase PostgreSQL]
|
|
68
|
+
| |
|
|
69
|
+
[.NET API] ---service_role----> [Supabase]
|
|
70
|
+
|
|
|
71
|
+
[External Services]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Data Model (Supabase)
|
|
77
|
+
|
|
78
|
+
### {TableName}
|
|
79
|
+
|
|
80
|
+
| Column | Type | Constraints | Default |
|
|
81
|
+
|--------|------|-------------|---------|
|
|
82
|
+
| id | uuid | PK | gen_random_uuid() |
|
|
83
|
+
| user_id | uuid | FK -> auth.users(id), NOT NULL | |
|
|
84
|
+
| {column} | {type} | {constraints} | {default} |
|
|
85
|
+
| created_at | timestamptz | NOT NULL | now() |
|
|
86
|
+
| updated_at | timestamptz | | |
|
|
87
|
+
|
|
88
|
+
### RLS Policies
|
|
89
|
+
|
|
90
|
+
| Table | Policy | Operation | Rule |
|
|
91
|
+
|-------|--------|-----------|------|
|
|
92
|
+
| {table} | Users read own | SELECT | auth.uid() = user_id |
|
|
93
|
+
| {table} | Users insert own | INSERT | auth.uid() = user_id |
|
|
94
|
+
| {table} | Users update own | UPDATE | auth.uid() = user_id |
|
|
95
|
+
|
|
96
|
+
### Indexes
|
|
97
|
+
|
|
98
|
+
| Table | Columns | Type | Purpose |
|
|
99
|
+
|-------|---------|------|---------|
|
|
100
|
+
| {table} | user_id | btree | Filter by owner |
|
|
101
|
+
| {table} | created_at | btree | Sort by date |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## API Design (.NET Minimal API)
|
|
106
|
+
|
|
107
|
+
### Endpoints
|
|
108
|
+
|
|
109
|
+
| Method | Path | Description | Auth |
|
|
110
|
+
|--------|------|-------------|------|
|
|
111
|
+
| GET | /api/{{FEATURE_NAME}}/{id} | Get by ID | Required |
|
|
112
|
+
| GET | /api/{{FEATURE_NAME}} | List (paginated) | Required |
|
|
113
|
+
| POST | /api/{{FEATURE_NAME}} | Create | Required |
|
|
114
|
+
| PUT | /api/{{FEATURE_NAME}}/{id} | Update | Required |
|
|
115
|
+
| DELETE | /api/{{FEATURE_NAME}}/{id} | Delete | Required |
|
|
116
|
+
|
|
117
|
+
### Request/Response Examples
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
// POST /api/{{FEATURE_NAME}}
|
|
121
|
+
// Request
|
|
122
|
+
{
|
|
123
|
+
"name": "Example",
|
|
124
|
+
"description": "Example description"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Response 201
|
|
128
|
+
{
|
|
129
|
+
"id": "uuid",
|
|
130
|
+
"name": "Example",
|
|
131
|
+
"description": "Example description",
|
|
132
|
+
"createdAt": "2026-01-01T00:00:00Z"
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Frontend Design (Next.js)
|
|
139
|
+
|
|
140
|
+
### Pages
|
|
141
|
+
|
|
142
|
+
| Route | Type | Description |
|
|
143
|
+
|-------|------|-------------|
|
|
144
|
+
| /{{FEATURE_NAME}} | Server | List page with SSR |
|
|
145
|
+
| /{{FEATURE_NAME}}/[id] | Server | Detail page |
|
|
146
|
+
| /{{FEATURE_NAME}}/new | Client | Create form |
|
|
147
|
+
|
|
148
|
+
### Components
|
|
149
|
+
|
|
150
|
+
| Component | Type | Props |
|
|
151
|
+
|-----------|------|-------|
|
|
152
|
+
| {{FEATURE_NAME_PASCAL}}List | Client | initialData, pagination |
|
|
153
|
+
| {{FEATURE_NAME_PASCAL}}Form | Client | onSuccess, defaultValues? |
|
|
154
|
+
| {{FEATURE_NAME_PASCAL}}Card | Server | item |
|
|
155
|
+
|
|
156
|
+
### State Management
|
|
157
|
+
|
|
158
|
+
| State | Location | Strategy |
|
|
159
|
+
|-------|----------|----------|
|
|
160
|
+
| Server data | React Query | Cache + invalidation |
|
|
161
|
+
| Form state | react-hook-form | Local |
|
|
162
|
+
| Auth state | Supabase client | Cookie-based session |
|
|
163
|
+
| Realtime | Supabase channel | Invalidate query on change |
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Infrastructure (EasyPanel)
|
|
168
|
+
|
|
169
|
+
### Services
|
|
170
|
+
|
|
171
|
+
| Service | Image | Port | Resources |
|
|
172
|
+
|---------|-------|------|-----------|
|
|
173
|
+
| api | Custom (.NET) | 8080 | 256MB / 0.25 CPU |
|
|
174
|
+
| web | Custom (Next.js) | 3000 | 256MB / 0.25 CPU |
|
|
175
|
+
|
|
176
|
+
### Environment Variables
|
|
177
|
+
|
|
178
|
+
| Variable | Service | Source |
|
|
179
|
+
|----------|---------|--------|
|
|
180
|
+
| SUPABASE_URL | api, web | EasyPanel secrets |
|
|
181
|
+
| SUPABASE_ANON_KEY | web | EasyPanel secrets |
|
|
182
|
+
| SUPABASE_SERVICE_KEY | api | EasyPanel secrets |
|
|
183
|
+
| SUPABASE_JWT_SECRET | api | EasyPanel secrets |
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Packages
|
|
188
|
+
|
|
189
|
+
### Backend (.NET)
|
|
190
|
+
|
|
191
|
+
| Package | Version | Purpose |
|
|
192
|
+
|---------|---------|---------|
|
|
193
|
+
| Npgsql | latest | PostgreSQL driver |
|
|
194
|
+
| Dapper | latest | Micro-ORM |
|
|
195
|
+
| Microsoft.AspNetCore.Authentication.JwtBearer | 10.0.x | JWT auth |
|
|
196
|
+
|
|
197
|
+
### Frontend (npm)
|
|
198
|
+
|
|
199
|
+
| Package | Version | Purpose |
|
|
200
|
+
|---------|---------|---------|
|
|
201
|
+
| @supabase/ssr | latest | Supabase SSR client |
|
|
202
|
+
| @tanstack/react-query | ^5 | Data fetching |
|
|
203
|
+
| react-hook-form | ^7 | Form management |
|
|
204
|
+
| zod | ^3 | Validation |
|
|
205
|
+
| @hookform/resolvers | latest | Zod integration |
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Security
|
|
210
|
+
|
|
211
|
+
| Action | Required Policy |
|
|
212
|
+
|--------|-----------------|
|
|
213
|
+
| View | RLS: auth.uid() = user_id |
|
|
214
|
+
| Create | RLS: auth.uid() = user_id |
|
|
215
|
+
| Update | RLS: auth.uid() = user_id |
|
|
216
|
+
| Delete | RLS: auth.uid() = user_id |
|
|
217
|
+
| Admin | .NET API with service_role key |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Definition of Done
|
|
222
|
+
|
|
223
|
+
- [ ] Database migrations applied
|
|
224
|
+
- [ ] RLS policies tested
|
|
225
|
+
- [ ] API endpoints implemented and tested
|
|
226
|
+
- [ ] Frontend pages and components built
|
|
227
|
+
- [ ] Auth flow working (login, signup, protected routes)
|
|
228
|
+
- [ ] Tests > 80% coverage
|
|
229
|
+
- [ ] Docker images building successfully
|
|
230
|
+
- [ ] Deploy to EasyPanel verified
|
|
231
|
+
- [ ] Recap.md generated
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- Migration: {{FEATURE_NAME_TITLE}}
|
|
3
|
+
-- Stack: Next.js + Supabase
|
|
4
|
+
-- Generated by MORPH Framework
|
|
5
|
+
-- Date: {{DATE}}
|
|
6
|
+
-- Run: supabase db push
|
|
7
|
+
-- ============================================================
|
|
8
|
+
|
|
9
|
+
-- ============================================================
|
|
10
|
+
-- 1. TABLE CREATION
|
|
11
|
+
-- ============================================================
|
|
12
|
+
|
|
13
|
+
create table if not exists public.{{TABLE_NAME}} (
|
|
14
|
+
id uuid primary key default gen_random_uuid(),
|
|
15
|
+
user_id uuid not null references auth.users(id) on delete cascade,
|
|
16
|
+
name text not null,
|
|
17
|
+
status text not null default 'draft'
|
|
18
|
+
check (status in ('draft', 'active', 'completed', 'archived', 'failed', 'cancelled')),
|
|
19
|
+
-- Add feature-specific columns here
|
|
20
|
+
metadata jsonb default '{}'::jsonb,
|
|
21
|
+
created_at timestamptz not null default now(),
|
|
22
|
+
updated_at timestamptz
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
-- Comment on table
|
|
26
|
+
comment on table public.{{TABLE_NAME}} is '{{FEATURE_NAME_TITLE}} - managed by MORPH Framework';
|
|
27
|
+
|
|
28
|
+
-- ============================================================
|
|
29
|
+
-- 2. INDEXES
|
|
30
|
+
-- ============================================================
|
|
31
|
+
|
|
32
|
+
-- Index for filtering by owner
|
|
33
|
+
create index if not exists idx_{{TABLE_NAME}}_user_id
|
|
34
|
+
on public.{{TABLE_NAME}} (user_id);
|
|
35
|
+
|
|
36
|
+
-- Index for filtering by status
|
|
37
|
+
create index if not exists idx_{{TABLE_NAME}}_status
|
|
38
|
+
on public.{{TABLE_NAME}} (status);
|
|
39
|
+
|
|
40
|
+
-- Index for sorting by creation date
|
|
41
|
+
create index if not exists idx_{{TABLE_NAME}}_created_at
|
|
42
|
+
on public.{{TABLE_NAME}} (created_at desc);
|
|
43
|
+
|
|
44
|
+
-- ============================================================
|
|
45
|
+
-- 3. UPDATED_AT TRIGGER
|
|
46
|
+
-- ============================================================
|
|
47
|
+
|
|
48
|
+
-- Function to auto-update updated_at
|
|
49
|
+
create or replace function public.update_updated_at_column()
|
|
50
|
+
returns trigger as $$
|
|
51
|
+
begin
|
|
52
|
+
new.updated_at = now();
|
|
53
|
+
return new;
|
|
54
|
+
end;
|
|
55
|
+
$$ language plpgsql;
|
|
56
|
+
|
|
57
|
+
-- Trigger for auto-updating updated_at
|
|
58
|
+
create trigger set_{{TABLE_NAME}}_updated_at
|
|
59
|
+
before update on public.{{TABLE_NAME}}
|
|
60
|
+
for each row execute function public.update_updated_at_column();
|
|
61
|
+
|
|
62
|
+
-- ============================================================
|
|
63
|
+
-- 4. ROW LEVEL SECURITY
|
|
64
|
+
-- ============================================================
|
|
65
|
+
|
|
66
|
+
-- Enable RLS
|
|
67
|
+
alter table public.{{TABLE_NAME}} enable row level security;
|
|
68
|
+
|
|
69
|
+
-- Users can read their own rows
|
|
70
|
+
create policy "Users can read own {{TABLE_NAME}}"
|
|
71
|
+
on public.{{TABLE_NAME}}
|
|
72
|
+
for select
|
|
73
|
+
using (auth.uid() = user_id);
|
|
74
|
+
|
|
75
|
+
-- Users can insert rows for themselves
|
|
76
|
+
create policy "Users can insert own {{TABLE_NAME}}"
|
|
77
|
+
on public.{{TABLE_NAME}}
|
|
78
|
+
for insert
|
|
79
|
+
with check (auth.uid() = user_id);
|
|
80
|
+
|
|
81
|
+
-- Users can update their own rows
|
|
82
|
+
create policy "Users can update own {{TABLE_NAME}}"
|
|
83
|
+
on public.{{TABLE_NAME}}
|
|
84
|
+
for update
|
|
85
|
+
using (auth.uid() = user_id)
|
|
86
|
+
with check (auth.uid() = user_id);
|
|
87
|
+
|
|
88
|
+
-- Users can delete their own rows
|
|
89
|
+
create policy "Users can delete own {{TABLE_NAME}}"
|
|
90
|
+
on public.{{TABLE_NAME}}
|
|
91
|
+
for delete
|
|
92
|
+
using (auth.uid() = user_id);
|
|
93
|
+
|
|
94
|
+
-- ============================================================
|
|
95
|
+
-- 5. GRANTS
|
|
96
|
+
-- ============================================================
|
|
97
|
+
|
|
98
|
+
-- Grant access to authenticated users (via Supabase API)
|
|
99
|
+
grant select, insert, update, delete on public.{{TABLE_NAME}} to authenticated;
|
|
100
|
+
grant usage on schema public to authenticated;
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Tasks - {{FEATURE_NAME_TITLE}}
|
|
2
|
+
|
|
3
|
+
> Implementation checklist for the feature.
|
|
4
|
+
> Update status as you progress.
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
| Metric | Value |
|
|
9
|
+
|--------|-------|
|
|
10
|
+
| **Total Tasks** | 0 |
|
|
11
|
+
| **Completed** | 0 |
|
|
12
|
+
| **In Progress** | 0 |
|
|
13
|
+
| **Pending** | 0 |
|
|
14
|
+
| **Estimated** | 0h |
|
|
15
|
+
| **Actual** | 0h |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Task Granularity
|
|
20
|
+
|
|
21
|
+
### Ideal Task
|
|
22
|
+
- 15-60 minutes of implementation
|
|
23
|
+
- 1-5 files modified
|
|
24
|
+
- Testable in isolation
|
|
25
|
+
- Independent commit possible
|
|
26
|
+
|
|
27
|
+
### Signs of Too Broad (Split)
|
|
28
|
+
**Bad example:** "Implement document upload"
|
|
29
|
+
**Split into:**
|
|
30
|
+
- T001: Create Supabase migration for documents table + RLS
|
|
31
|
+
- T002: Create .NET DTOs and service interface
|
|
32
|
+
- T003: Implement Dapper repository
|
|
33
|
+
- T004: Create API endpoints
|
|
34
|
+
- T005: Build Next.js upload form component
|
|
35
|
+
|
|
36
|
+
### Signs of Too Granular (Merge)
|
|
37
|
+
**Bad example:** "Create title field", "Create content field"
|
|
38
|
+
**Merge into:** "Create documents table with all columns"
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Checkpoints
|
|
43
|
+
|
|
44
|
+
| After | Type | Description | Status |
|
|
45
|
+
|-------|------|-------------|--------|
|
|
46
|
+
| T003 | Review | Review database schema and RLS policies | Pending |
|
|
47
|
+
| T006 | Review | Review API implementation | Pending |
|
|
48
|
+
| T009 | Approval | Approve UI before testing | Pending |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Phase 1: Database & Migrations
|
|
53
|
+
|
|
54
|
+
### T001: Create Supabase migration
|
|
55
|
+
- **Type:** Database
|
|
56
|
+
- **Priority:** 1
|
|
57
|
+
- **Estimate:** 30min
|
|
58
|
+
- **Status:** [ ] Pending
|
|
59
|
+
|
|
60
|
+
**Description:**
|
|
61
|
+
Create migration with table definition, indexes, RLS policies.
|
|
62
|
+
|
|
63
|
+
**Files:**
|
|
64
|
+
- [ ] Create: `supabase/migrations/{timestamp}_create_{feature}_table.sql`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### T002: Create RLS policies
|
|
69
|
+
- **Type:** Security
|
|
70
|
+
- **Priority:** 1
|
|
71
|
+
- **Estimate:** 20min
|
|
72
|
+
- **Status:** [ ] Pending
|
|
73
|
+
- **Dependencies:** T001
|
|
74
|
+
|
|
75
|
+
**Description:**
|
|
76
|
+
Define row-level security policies for all CRUD operations.
|
|
77
|
+
|
|
78
|
+
**Files:**
|
|
79
|
+
- [ ] Modify: `supabase/migrations/{timestamp}_create_{feature}_table.sql`
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### T003: Generate TypeScript types
|
|
84
|
+
- **Type:** Contract
|
|
85
|
+
- **Priority:** 1
|
|
86
|
+
- **Estimate:** 15min
|
|
87
|
+
- **Status:** [ ] Pending
|
|
88
|
+
- **Dependencies:** T001
|
|
89
|
+
- **Checkpoint:** Review after this task
|
|
90
|
+
|
|
91
|
+
**Description:**
|
|
92
|
+
Run `supabase gen types typescript` and update Database type.
|
|
93
|
+
|
|
94
|
+
**Files:**
|
|
95
|
+
- [ ] Modify: `frontend/src/types/database.ts`
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Phase 2: Backend API (.NET)
|
|
100
|
+
|
|
101
|
+
### T004: Define contracts (interfaces + DTOs)
|
|
102
|
+
- **Type:** Contract
|
|
103
|
+
- **Priority:** 1
|
|
104
|
+
- **Estimate:** 30min
|
|
105
|
+
- **Status:** [ ] Pending
|
|
106
|
+
|
|
107
|
+
**Description:**
|
|
108
|
+
Create service interface with all required methods. DTOs as records.
|
|
109
|
+
|
|
110
|
+
**Files:**
|
|
111
|
+
- [ ] Create: `backend/src/Application/Features/{Feature}/I{Feature}Service.cs`
|
|
112
|
+
- [ ] Create: `backend/src/Application/Features/{Feature}/{Feature}Dtos.cs`
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### T005: Implement Dapper repository
|
|
117
|
+
- **Type:** Infrastructure
|
|
118
|
+
- **Priority:** 2
|
|
119
|
+
- **Estimate:** 45min
|
|
120
|
+
- **Status:** [ ] Pending
|
|
121
|
+
- **Dependencies:** T001, T004
|
|
122
|
+
|
|
123
|
+
**Description:**
|
|
124
|
+
Implement data access with Dapper + NpgsqlDataSource.
|
|
125
|
+
|
|
126
|
+
**Files:**
|
|
127
|
+
- [ ] Create: `backend/src/Infrastructure/Repositories/{Feature}Repository.cs`
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### T006: Create Minimal API endpoints
|
|
132
|
+
- **Type:** API
|
|
133
|
+
- **Priority:** 2
|
|
134
|
+
- **Estimate:** 45min
|
|
135
|
+
- **Status:** [ ] Pending
|
|
136
|
+
- **Dependencies:** T004, T005
|
|
137
|
+
- **Checkpoint:** Review after this task
|
|
138
|
+
|
|
139
|
+
**Description:**
|
|
140
|
+
Map endpoints with auth, validation, and proper HTTP status codes.
|
|
141
|
+
|
|
142
|
+
**Files:**
|
|
143
|
+
- [ ] Create: `backend/src/Api/Endpoints/{Feature}Endpoints.cs`
|
|
144
|
+
- [ ] Modify: `backend/src/Api/Program.cs`
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Phase 3: Frontend (Next.js)
|
|
149
|
+
|
|
150
|
+
### T007: Create React Query hooks
|
|
151
|
+
- **Type:** Frontend
|
|
152
|
+
- **Priority:** 2
|
|
153
|
+
- **Estimate:** 30min
|
|
154
|
+
- **Status:** [ ] Pending
|
|
155
|
+
- **Dependencies:** T003
|
|
156
|
+
|
|
157
|
+
**Description:**
|
|
158
|
+
Create hooks for data fetching with Supabase client or API.
|
|
159
|
+
|
|
160
|
+
**Files:**
|
|
161
|
+
- [ ] Create: `frontend/src/hooks/use-{feature}.ts`
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### T008: Create list page (Server Component)
|
|
166
|
+
- **Type:** UI
|
|
167
|
+
- **Priority:** 2
|
|
168
|
+
- **Estimate:** 45min
|
|
169
|
+
- **Status:** [ ] Pending
|
|
170
|
+
- **Dependencies:** T007
|
|
171
|
+
|
|
172
|
+
**Description:**
|
|
173
|
+
Server-rendered list page with initial data fetch.
|
|
174
|
+
|
|
175
|
+
**Files:**
|
|
176
|
+
- [ ] Create: `frontend/src/app/{feature}/page.tsx`
|
|
177
|
+
- [ ] Create: `frontend/src/components/{feature}/{feature}-list.tsx`
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### T009: Create form component (Client Component)
|
|
182
|
+
- **Type:** UI
|
|
183
|
+
- **Priority:** 2
|
|
184
|
+
- **Estimate:** 1h
|
|
185
|
+
- **Status:** [ ] Pending
|
|
186
|
+
- **Dependencies:** T007
|
|
187
|
+
- **Checkpoint:** Approval after this task
|
|
188
|
+
|
|
189
|
+
**Description:**
|
|
190
|
+
Form with react-hook-form + zod validation.
|
|
191
|
+
|
|
192
|
+
**Files:**
|
|
193
|
+
- [ ] Create: `frontend/src/app/{feature}/new/page.tsx`
|
|
194
|
+
- [ ] Create: `frontend/src/components/{feature}/{feature}-form.tsx`
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Phase 4: Testing
|
|
199
|
+
|
|
200
|
+
### T010: Write backend unit tests
|
|
201
|
+
- **Type:** Test
|
|
202
|
+
- **Priority:** 2
|
|
203
|
+
- **Estimate:** 1h
|
|
204
|
+
- **Status:** [ ] Pending
|
|
205
|
+
- **Dependencies:** T006
|
|
206
|
+
|
|
207
|
+
**Description:**
|
|
208
|
+
Unit tests for service layer and endpoints.
|
|
209
|
+
|
|
210
|
+
**Files:**
|
|
211
|
+
- [ ] Create: `backend/tests/Unit/{Feature}ServiceTests.cs`
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
### T011: Write frontend tests
|
|
216
|
+
- **Type:** Test
|
|
217
|
+
- **Priority:** 3
|
|
218
|
+
- **Estimate:** 45min
|
|
219
|
+
- **Status:** [ ] Pending
|
|
220
|
+
- **Dependencies:** T009
|
|
221
|
+
|
|
222
|
+
**Description:**
|
|
223
|
+
Component tests with testing-library.
|
|
224
|
+
|
|
225
|
+
**Files:**
|
|
226
|
+
- [ ] Create: `frontend/src/components/{feature}/__tests__/{feature}-form.test.tsx`
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Phase 5: Deployment
|
|
231
|
+
|
|
232
|
+
### T012: Create Dockerfiles
|
|
233
|
+
- **Type:** Infra
|
|
234
|
+
- **Priority:** 2
|
|
235
|
+
- **Estimate:** 30min
|
|
236
|
+
- **Status:** [ ] Pending
|
|
237
|
+
- **Dependencies:** T006, T009
|
|
238
|
+
|
|
239
|
+
**Description:**
|
|
240
|
+
Multi-stage Dockerfiles for API and Web.
|
|
241
|
+
|
|
242
|
+
**Files:**
|
|
243
|
+
- [ ] Create: `backend/Dockerfile`
|
|
244
|
+
- [ ] Create: `frontend/Dockerfile`
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Status Legend
|
|
249
|
+
|
|
250
|
+
- [ ] Pending
|
|
251
|
+
- [~] In Progress
|
|
252
|
+
- [x] Completed
|
|
253
|
+
- [!] Blocked
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
*Generated by MORPH Framework*
|