@polymorphism-tech/morph-spec 3.2.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -14
- package/bin/detect-agents.js +1 -1
- package/bin/morph-spec.js +403 -40
- package/bin/validate.js +5 -5
- package/docs/getting-started.md +0 -5
- package/docs/next-generation/AGENTS.md +521 -0
- package/docs/next-generation/ANALYSIS.md +555 -0
- package/docs/next-generation/ARCHITECTURE.md +436 -0
- package/docs/next-generation/CONTEXT-OPTIMIZATION.md +267 -0
- package/docs/next-generation/EXECUTION-FLOW.md +274 -0
- package/docs/next-generation/FEATURES.md +688 -0
- package/docs/next-generation/META-PROMPTS.md +235 -0
- package/docs/next-generation/MIGRATION-GUIDE.md +253 -0
- package/docs/next-generation/README.md +231 -0
- package/docs/next-generation/ROADMAP.md +801 -0
- package/docs/next-generation/THREAD-MANAGEMENT.md +240 -0
- package/docs/validation-checklist.md +0 -1
- package/package.json +5 -5
- package/src/commands/agents/agents-fuse.js +96 -0
- package/src/commands/agents/index.js +4 -0
- package/src/commands/agents/micro-agent.js +112 -0
- package/src/commands/{spawn-team.js → agents/spawn-team.js} +237 -172
- package/src/commands/agents/squad-template.js +146 -0
- package/src/commands/analytics/analytics.js +176 -0
- package/src/commands/context/context-prime.js +63 -0
- package/src/commands/context/core-four.js +54 -0
- package/src/commands/{create-story.js → feature/create-story.js} +357 -354
- package/src/commands/feature/index.js +6 -0
- package/src/commands/{shard-spec.js → feature/shard-spec.js} +2 -2
- package/src/commands/{sprint-status.js → feature/sprint-status.js} +1 -1
- package/src/commands/{generate-context.js → generation/generate-context.js} +40 -40
- package/src/commands/{generate.js → generation/generate.js} +4 -4
- package/src/commands/generation/index.js +5 -0
- package/src/commands/index.js +16 -0
- package/src/commands/{capture-pattern.js → learning/capture-pattern.js} +121 -121
- package/src/commands/learning/index.js +5 -0
- package/src/commands/mcp/mcp.js +102 -0
- package/src/commands/{detect-agents.js → project/detect-agents.js} +178 -178
- package/src/commands/project/detect-workflow.js +174 -0
- package/src/commands/{detect.js → project/detect.js} +104 -104
- package/src/commands/{doctor.js → project/doctor.js} +221 -4
- package/src/commands/project/index.js +10 -0
- package/src/commands/{init.js → project/init.js} +305 -295
- package/src/commands/{sync.js → project/sync.js} +167 -167
- package/src/commands/{update.js → project/update.js} +240 -240
- package/src/commands/{advance-phase.js → state/advance-phase.js} +101 -25
- package/src/commands/{approve.js → state/approve.js} +221 -221
- package/src/commands/state/index.js +8 -0
- package/src/commands/{rollback-phase.js → state/rollback-phase.js} +185 -185
- package/src/commands/{state.js → state/state.js} +334 -334
- package/src/commands/{validate-phase.js → state/validate-phase.js} +221 -221
- package/src/commands/tasks/index.js +4 -0
- package/src/commands/{task.js → tasks/task.js} +78 -78
- package/src/commands/templates/index.js +8 -0
- package/src/commands/templates/template-customize.js +101 -0
- package/src/commands/templates/template-list.js +128 -0
- package/src/commands/templates/template-render.js +174 -0
- package/src/commands/templates/template-show.js +131 -0
- package/src/commands/templates/template-validate.js +91 -0
- package/src/commands/threads/thread-template.js +103 -0
- package/src/commands/threads/threads.js +261 -0
- package/src/commands/trust/trust.js +205 -0
- package/src/commands/utils/index.js +7 -0
- package/src/commands/{session-summary.js → utils/session-summary.js} +291 -291
- package/src/commands/{troubleshoot.js → utils/troubleshoot.js} +222 -222
- package/src/commands/{analyze-blazor-concurrency.js → validation/analyze-blazor-concurrency.js} +193 -193
- package/src/commands/validation/index.js +8 -0
- package/src/commands/{lint-fluent.js → validation/lint-fluent.js} +352 -352
- package/src/commands/{validate-blazor-state.js → validation/validate-blazor-state.js} +210 -210
- package/src/commands/{validate-blazor.js → validation/validate-blazor.js} +156 -156
- package/src/commands/{validate-css.js → validation/validate-css.js} +84 -84
- package/src/core/index.js +10 -0
- package/src/{orchestrator.js → core/orchestrator.js} +8 -8
- package/src/core/registry/command-registry.js +302 -0
- package/src/core/registry/index.js +8 -0
- package/src/core/registry/validator-registry.js +204 -0
- package/src/core/state/index.js +8 -0
- package/src/{lib → core/state}/phase-state-machine.js +214 -214
- package/src/{lib → core/state}/state-manager.js +588 -534
- package/src/core/templates/index.js +9 -0
- package/src/core/templates/template-registry.js +335 -0
- package/src/core/templates/template-renderer.js +477 -0
- package/src/core/templates/template-validator.js +296 -0
- package/src/core/workflows/index.js +7 -0
- package/src/core/workflows/workflow-detector.js +452 -0
- package/src/lib/agents/micro-agent-factory.js +161 -0
- package/src/lib/{complexity-analyzer.js → analysis/complexity-analyzer.js} +441 -441
- package/src/lib/analysis/index.js +7 -0
- package/src/lib/analytics/analytics-engine.js +345 -0
- package/src/lib/{checkpoint-hooks.js → checkpoints/checkpoint-hooks.js} +35 -0
- package/src/lib/checkpoints/index.js +7 -0
- package/src/lib/context/context-bundler.js +240 -0
- package/src/lib/context/context-optimizer.js +212 -0
- package/src/lib/context/context-tracker.js +273 -0
- package/src/lib/context/core-four-tracker.js +201 -0
- package/src/lib/context/mcp-optimizer.js +200 -0
- package/src/lib/detectors/config-detector.js +223 -223
- package/src/lib/detectors/conversation-analyzer.js +163 -163
- package/src/lib/{design-system-detector.js → detectors/design-system-detector.js} +187 -187
- package/src/lib/detectors/index.js +87 -84
- package/src/lib/detectors/standards-generator.js +275 -275
- package/src/lib/detectors/structure-detector.js +245 -245
- package/src/lib/execution/fusion-executor.js +304 -0
- package/src/lib/execution/parallel-executor.js +270 -0
- package/src/lib/{context-generator.js → generators/context-generator.js} +526 -516
- package/src/lib/generators/index.js +10 -0
- package/src/lib/{metadata-extractor.js → generators/metadata-extractor.js} +387 -380
- package/src/lib/{recap-generator.js → generators/recap-generator.js} +205 -205
- package/src/lib/hooks/hook-executor.js +169 -0
- package/src/lib/hooks/stop-hook-executor.js +286 -0
- package/src/lib/hops/hop-composer.js +221 -0
- package/src/lib/learning/index.js +7 -0
- package/src/lib/orchestration/index.js +7 -0
- package/src/lib/{team-orchestrator.js → orchestration/team-orchestrator.js} +323 -323
- package/src/lib/stacks/index.js +7 -0
- package/src/lib/{stack-resolver.js → stacks/stack-resolver.js} +180 -148
- package/src/lib/standards/index.js +7 -0
- package/src/lib/{standards-context-injector.js → standards/standards-context-injector.js} +298 -288
- package/src/lib/threads/thread-coordinator.js +238 -0
- package/src/lib/threads/thread-manager.js +317 -0
- package/src/lib/tracking/artifact-trail.js +202 -0
- package/src/lib/troubleshooting/index.js +8 -0
- package/src/lib/{troubleshoot-grep.js → troubleshooting/troubleshoot-grep.js} +204 -204
- package/src/lib/{troubleshoot-index.js → troubleshooting/troubleshoot-index.js} +144 -144
- package/src/lib/trust/trust-manager.js +269 -0
- package/src/lib/validators/{architecture-validator.js → architecture/architecture-validator.js} +8 -8
- package/src/lib/validators/architecture/index.js +7 -0
- package/src/lib/{blazor-concurrency-analyzer.js → validators/blazor/blazor-concurrency-analyzer.js} +277 -288
- package/src/lib/{blazor-state-validator.js → validators/blazor/blazor-state-validator.js} +279 -291
- package/src/lib/{blazor-validator.js → validators/blazor/blazor-validator.js} +369 -374
- package/src/lib/validators/blazor/index.js +9 -0
- package/src/lib/validators/{content-validator.js → content/content-validator.js} +351 -351
- package/src/lib/validators/content/index.js +7 -0
- package/src/lib/validators/{contract-compliance-validator.js → contracts/contract-compliance-validator.js} +273 -273
- package/src/lib/validators/contracts/index.js +7 -0
- package/src/lib/{css-validator.js → validators/css/css-validator.js} +352 -352
- package/src/lib/validators/css/index.js +7 -0
- package/src/lib/validators/{design-system-validator.js → design-system/design-system-validator.js} +231 -231
- package/src/lib/validators/design-system/index.js +7 -0
- package/src/lib/validators/packages/index.js +7 -0
- package/src/lib/validators/shared/index.js +12 -0
- package/src/lib/validators/shared/issue-counter.js +18 -0
- package/src/lib/validators/shared/result-formatter.js +124 -0
- package/src/lib/{spec-validator.js → validators/spec-validator.js} +258 -258
- package/src/lib/validators/ui/index.js +7 -0
- package/src/lib/{validation-runner.js → validators/validation-runner.js} +286 -284
- package/src/ui/wizard-questions.js +0 -2
- package/src/utils/color-utils.js +70 -0
- package/src/utils/file-copier.js +188 -189
- package/src/utils/process-handler.js +97 -0
- package/stacks/blazor-azure/.morph/config/agents.json +948 -764
- package/stacks/blazor-azure/.morph/hooks/{pre-commit-tests.sh → pre-commit/tests-csharp.sh} +3 -2
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +41 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +24 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +23 -0
- package/stacks/nextjs-supabase/.morph/config/agents.json +345 -345
- package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +61 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +22 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +22 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +35 -0
- package/stacks/nextjs-supabase/README.md +6 -15
- package/CLAUDE.md +0 -648
- package/bin/render-template.js +0 -349
- package/bin/semantic-detect-agents.js +0 -247
- package/bin/validate-agents-skills.js +0 -257
- package/bin/validate-agents.js +0 -70
- package/bin/validate-phase.js +0 -263
- package/docs/examples.md +0 -328
- package/docs/llm-interaction-config.md +0 -735
- package/scripts/reorganize-skills.cjs +0 -175
- package/scripts/validate-agents-structure.cjs +0 -52
- package/scripts/validate-skills.cjs +0 -180
- package/src/commands/deploy.js +0 -780
- package/src/commands/migrate-state.js +0 -158
- package/src/commands/upgrade.js +0 -346
- package/src/lib/continuous-validator.js +0 -421
- package/src/lib/decision-constraint-loader.js +0 -109
- package/src/lib/design-system-scaffolder.js +0 -299
- package/src/lib/hook-executor.js +0 -257
- package/src/lib/mockup-generator.js +0 -366
- package/src/lib/ui-detector.js +0 -350
- package/src/llm/schema-validator.js +0 -121
- package/src/sanitizer/.gitkeep +0 -0
- package/src/scanner/.gitkeep +0 -0
- package/src/types/index.js +0 -477
- package/src/ui/.gitkeep +0 -0
- package/src/writer/.gitkeep +0 -0
- package/stacks/blazor-azure/.azure/README.md +0 -293
- package/stacks/blazor-azure/.azure/docs/azure-devops-setup.md +0 -454
- package/stacks/blazor-azure/.azure/docs/branch-strategy.md +0 -398
- package/stacks/blazor-azure/.azure/docs/local-development.md +0 -515
- package/stacks/blazor-azure/.azure/pipelines/pipeline-variables.yml +0 -34
- package/stacks/blazor-azure/.azure/pipelines/prod-pipeline.yml +0 -319
- package/stacks/blazor-azure/.azure/pipelines/staging-pipeline.yml +0 -234
- package/stacks/blazor-azure/.azure/pipelines/templates/build-dotnet.yml +0 -75
- package/stacks/blazor-azure/.azure/pipelines/templates/deploy-app-service.yml +0 -94
- package/stacks/blazor-azure/.azure/pipelines/templates/deploy-container-app.yml +0 -120
- package/stacks/blazor-azure/.azure/pipelines/templates/infra-deploy.yml +0 -90
- package/stacks/blazor-azure/.claude/commands/morph-apply.md +0 -221
- package/stacks/blazor-azure/.claude/commands/morph-archive.md +0 -79
- package/stacks/blazor-azure/.claude/commands/morph-deploy.md +0 -529
- package/stacks/blazor-azure/.claude/commands/morph-infra.md +0 -209
- package/stacks/blazor-azure/.claude/commands/morph-preflight.md +0 -227
- package/stacks/blazor-azure/.claude/commands/morph-proposal.md +0 -122
- package/stacks/blazor-azure/.claude/commands/morph-status.md +0 -86
- package/stacks/blazor-azure/.claude/commands/morph-troubleshoot.md +0 -122
- package/stacks/blazor-azure/.claude/settings.local.json +0 -15
- package/stacks/blazor-azure/.claude/skills/level-0-meta/README.md +0 -7
- package/stacks/blazor-azure/.claude/skills/level-0-meta/code-review.md +0 -226
- package/stacks/blazor-azure/.claude/skills/level-0-meta/morph-checklist.md +0 -117
- package/stacks/blazor-azure/.claude/skills/level-0-meta/simulation-checklist.md +0 -77
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/README.md +0 -7
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/morph-replicate.md +0 -213
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-clarify.md +0 -131
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-design.md +0 -213
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-setup.md +0 -106
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-tasks.md +0 -164
- package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-uiux.md +0 -169
- package/stacks/blazor-azure/.claude/skills/level-2-domains/README.md +0 -14
- package/stacks/blazor-azure/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -192
- package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -197
- package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/prompt-engineer.md +0 -189
- package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/seo-growth-hacker.md +0 -320
- package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -156
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -287
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -113
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -126
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -109
- package/stacks/blazor-azure/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -210
- package/stacks/blazor-azure/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -154
- package/stacks/blazor-azure/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -191
- package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -142
- package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +0 -699
- package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -126
- package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -131
- package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -119
- package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -130
- package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -142
- package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -108
- package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/resend-email.md +0 -119
- package/stacks/blazor-azure/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -235
- package/stacks/blazor-azure/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -126
- package/stacks/blazor-azure/.claude/skills/level-3-technologies/README.md +0 -7
- package/stacks/blazor-azure/.claude/skills/level-4-patterns/README.md +0 -7
- package/stacks/blazor-azure/.morph/archive/.gitkeep +0 -25
- package/stacks/blazor-azure/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -392
- package/stacks/blazor-azure/.morph/docs/workflows/design-impl.md +0 -37
- package/stacks/blazor-azure/.morph/docs/workflows/enforcement-pipeline.md +0 -668
- package/stacks/blazor-azure/.morph/docs/workflows/fast-track.md +0 -29
- package/stacks/blazor-azure/.morph/docs/workflows/full-morph.md +0 -76
- package/stacks/blazor-azure/.morph/docs/workflows/standard.md +0 -44
- package/stacks/blazor-azure/.morph/docs/workflows/ui-refresh.md +0 -39
- package/stacks/blazor-azure/.morph/examples/api-nextjs/README.md +0 -241
- package/stacks/blazor-azure/.morph/examples/api-nextjs/contracts.ts +0 -307
- package/stacks/blazor-azure/.morph/examples/api-nextjs/spec.md +0 -399
- package/stacks/blazor-azure/.morph/examples/api-nextjs/tasks.md +0 -168
- package/stacks/blazor-azure/.morph/examples/micro-saas/README.md +0 -125
- package/stacks/blazor-azure/.morph/examples/micro-saas/contracts.cs +0 -358
- package/stacks/blazor-azure/.morph/examples/micro-saas/decisions.md +0 -246
- package/stacks/blazor-azure/.morph/examples/micro-saas/spec.md +0 -236
- package/stacks/blazor-azure/.morph/examples/micro-saas/tasks.md +0 -150
- package/stacks/blazor-azure/.morph/examples/multi-agent/README.md +0 -309
- package/stacks/blazor-azure/.morph/examples/multi-agent/contracts.cs +0 -433
- package/stacks/blazor-azure/.morph/examples/multi-agent/spec.md +0 -479
- package/stacks/blazor-azure/.morph/examples/multi-agent/tasks.md +0 -185
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/decisions.md +0 -158
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/proposal.md +0 -95
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/spec.md +0 -267
- package/stacks/blazor-azure/.morph/examples/state-v3.json +0 -188
- package/stacks/blazor-azure/.morph/features/.gitkeep +0 -25
- package/stacks/blazor-azure/.morph/hooks/README.md +0 -348
- package/stacks/blazor-azure/.morph/hooks/pre-commit-agents.sh +0 -24
- package/stacks/blazor-azure/.morph/hooks/pre-commit-all.sh +0 -48
- package/stacks/blazor-azure/.morph/hooks/pre-commit-specs.sh +0 -49
- package/stacks/blazor-azure/.morph/hooks/task-completed.js +0 -73
- package/stacks/blazor-azure/.morph/hooks/teammate-idle.js +0 -68
- package/stacks/blazor-azure/.morph/schemas/agent.schema.json +0 -296
- package/stacks/blazor-azure/.morph/schemas/tasks.schema.json +0 -220
- package/stacks/blazor-azure/.morph/specs/.gitkeep +0 -20
- package/stacks/blazor-azure/.morph/standards/agent-framework-blazor-ui.md +0 -359
- package/stacks/blazor-azure/.morph/standards/agent-framework-production.md +0 -410
- package/stacks/blazor-azure/.morph/standards/agent-framework-setup.md +0 -413
- package/stacks/blazor-azure/.morph/standards/agent-framework-workflows.md +0 -349
- package/stacks/blazor-azure/.morph/standards/agent-teams-workflow.md +0 -474
- package/stacks/blazor-azure/.morph/standards/architecture.md +0 -325
- package/stacks/blazor-azure/.morph/standards/azure.md +0 -605
- package/stacks/blazor-azure/.morph/standards/coding.md +0 -377
- package/stacks/blazor-azure/.morph/standards/dotnet10-migration.md +0 -520
- package/stacks/blazor-azure/.morph/standards/fluent-ui-setup.md +0 -590
- package/stacks/blazor-azure/.morph/standards/migration-guide.md +0 -514
- package/stacks/blazor-azure/.morph/standards/passkeys-auth.md +0 -423
- package/stacks/blazor-azure/.morph/standards/vector-search-rag.md +0 -536
- package/stacks/blazor-azure/.morph/templates/CONTEXT-FEATURE.md +0 -276
- package/stacks/blazor-azure/.morph/templates/CONTEXT.md +0 -170
- package/stacks/blazor-azure/.morph/templates/FluentDesignTheme.cs +0 -149
- package/stacks/blazor-azure/.morph/templates/MudTheme.cs +0 -281
- package/stacks/blazor-azure/.morph/templates/agent.cs +0 -163
- package/stacks/blazor-azure/.morph/templates/clarify-questions.md +0 -159
- package/stacks/blazor-azure/.morph/templates/component.razor +0 -239
- package/stacks/blazor-azure/.morph/templates/contracts/Commands.cs +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts/Entities.cs +0 -25
- package/stacks/blazor-azure/.morph/templates/contracts/Queries.cs +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts/README.md +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts.cs +0 -217
- package/stacks/blazor-azure/.morph/templates/decisions.md +0 -123
- package/stacks/blazor-azure/.morph/templates/design-system.css +0 -226
- package/stacks/blazor-azure/.morph/templates/infra/.dockerignore.example +0 -89
- package/stacks/blazor-azure/.morph/templates/infra/Dockerfile.example +0 -82
- package/stacks/blazor-azure/.morph/templates/infra/README.md +0 -286
- package/stacks/blazor-azure/.morph/templates/infra/app-insights.bicep +0 -63
- package/stacks/blazor-azure/.morph/templates/infra/app-service.bicep +0 -164
- package/stacks/blazor-azure/.morph/templates/infra/azure-pipelines-deploy.yml +0 -480
- package/stacks/blazor-azure/.morph/templates/infra/container-app-env.bicep +0 -49
- package/stacks/blazor-azure/.morph/templates/infra/container-app.bicep +0 -156
- package/stacks/blazor-azure/.morph/templates/infra/deploy-checklist.md +0 -426
- package/stacks/blazor-azure/.morph/templates/infra/deploy.ps1 +0 -229
- package/stacks/blazor-azure/.morph/templates/infra/deploy.sh +0 -208
- package/stacks/blazor-azure/.morph/templates/infra/key-vault.bicep +0 -91
- package/stacks/blazor-azure/.morph/templates/infra/main.bicep +0 -189
- package/stacks/blazor-azure/.morph/templates/infra/parameters.dev.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/parameters.prod.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/parameters.staging.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/sql-database.bicep +0 -103
- package/stacks/blazor-azure/.morph/templates/infra/storage.bicep +0 -106
- package/stacks/blazor-azure/.morph/templates/integrations/asaas-client.cs +0 -387
- package/stacks/blazor-azure/.morph/templates/integrations/asaas-webhook.cs +0 -351
- package/stacks/blazor-azure/.morph/templates/integrations/azure-identity-config.cs +0 -288
- package/stacks/blazor-azure/.morph/templates/integrations/clerk-config.cs +0 -258
- package/stacks/blazor-azure/.morph/templates/job.cs +0 -171
- package/stacks/blazor-azure/.morph/templates/migration.cs +0 -83
- package/stacks/blazor-azure/.morph/templates/proposal.md +0 -141
- package/stacks/blazor-azure/.morph/templates/recap.md +0 -94
- package/stacks/blazor-azure/.morph/templates/repository.cs +0 -141
- package/stacks/blazor-azure/.morph/templates/saas/subscription.cs +0 -347
- package/stacks/blazor-azure/.morph/templates/saas/tenant.cs +0 -338
- package/stacks/blazor-azure/.morph/templates/service.cs +0 -139
- package/stacks/blazor-azure/.morph/templates/simulation.md +0 -353
- package/stacks/blazor-azure/.morph/templates/spec.md +0 -149
- package/stacks/blazor-azure/.morph/templates/sprint-status.yaml +0 -68
- package/stacks/blazor-azure/.morph/templates/state.template.json +0 -222
- package/stacks/blazor-azure/.morph/templates/story.md +0 -143
- package/stacks/blazor-azure/.morph/templates/tasks.md +0 -257
- package/stacks/blazor-azure/.morph/templates/test.cs +0 -239
- package/stacks/blazor-azure/.morph/templates/ui-components.md +0 -362
- package/stacks/blazor-azure/.morph/templates/ui-design-system.md +0 -286
- package/stacks/blazor-azure/.morph/templates/ui-flows.md +0 -336
- package/stacks/blazor-azure/.morph/templates/ui-mockups.md +0 -133
- package/stacks/blazor-azure/.morph/test-infra/example.bicep +0 -59
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +0 -244
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +0 -335
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +0 -189
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +0 -170
- package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +0 -169
- package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +0 -247
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +0 -697
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +0 -85
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +0 -86
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +0 -498
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +0 -121
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +0 -138
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +0 -162
- package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +0 -191
- package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +0 -193
- package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +0 -171
- package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +0 -164
- package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +0 -179
- package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +0 -148
- package/stacks/nextjs-supabase/.morph/templates/contracts.cs +0 -173
- package/stacks/nextjs-supabase/.morph/templates/contracts.ts +0 -168
- package/stacks/nextjs-supabase/.morph/templates/decisions.md +0 -115
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +0 -38
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +0 -48
- package/stacks/nextjs-supabase/.morph/templates/proposal.md +0 -145
- package/stacks/nextjs-supabase/.morph/templates/recap.md +0 -134
- package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +0 -57
- package/stacks/nextjs-supabase/.morph/templates/spec.md +0 -231
- package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +0 -100
- package/stacks/nextjs-supabase/.morph/templates/tasks.md +0 -257
- /package/src/commands/{search-patterns.js → learning/search-patterns.js} +0 -0
- /package/src/{lib → core/templates}/template-data-sources.js +0 -0
- /package/src/lib/{design-system-generator.js → generators/design-system-generator.js} +0 -0
- /package/src/lib/{learning-system.js → learning/learning-system.js} +0 -0
- /package/src/lib/validators/{package-validator.js → packages/package-validator.js} +0 -0
- /package/src/lib/validators/{ui-contrast-validator.js → ui/ui-contrast-validator.js} +0 -0
- /package/{src/generator → stacks/blazor-azure/.morph/templates}/.gitkeep +0 -0
- /package/{src/llm → stacks/nextjs-supabase/.morph/templates}/.gitkeep +0 -0
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# UI Mockups - {{FEATURE_NAME_TITLE}}
|
|
2
|
-
|
|
3
|
-
> Wireframes ASCII e descrições de cada tela/componente da feature.
|
|
4
|
-
> Este arquivo documenta VISUALMENTE como o usuário interagirá com o sistema.
|
|
5
|
-
> Generated: {{DATE}}
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Tela 1: {Nome da Tela}
|
|
10
|
-
|
|
11
|
-
### Wireframe
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
┌─────────────────────────────────────────────────────────┐
|
|
15
|
-
│ [{≡}] {Título da Página} [🔔] [👤] [⚙] │
|
|
16
|
-
├─────────────────────────────────────────────────────────┤
|
|
17
|
-
│ │
|
|
18
|
-
│ {Desenhe o wireframe ASCII aqui} │
|
|
19
|
-
│ │
|
|
20
|
-
│ Dicas: │
|
|
21
|
-
│ - Use ┌─┐└┘├┤ para bordas │
|
|
22
|
-
│ - Use │ para separadores verticais │
|
|
23
|
-
│ - Use ─ para separadores horizontais │
|
|
24
|
-
│ - Use [...] para botões │
|
|
25
|
-
│ - Use [{x}] para checkboxes/toggles │
|
|
26
|
-
│ - Use emojis para ícones (🔍 📊 ⚙ 👤 etc) │
|
|
27
|
-
│ │
|
|
28
|
-
└─────────────────────────────────────────────────────────┘
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Descrição
|
|
32
|
-
|
|
33
|
-
- **Propósito**: {O que o usuário pode fazer nesta tela? Qual problema resolve?}
|
|
34
|
-
- **Componentes Principais**:
|
|
35
|
-
- {Componente 1}: {Descrição breve}
|
|
36
|
-
- {Componente 2}: {Descrição breve}
|
|
37
|
-
- {Componente 3}: {Descrição breve}
|
|
38
|
-
- **Interações**:
|
|
39
|
-
- **Click em {elemento}**: {O que acontece}
|
|
40
|
-
- **Hover em {elemento}**: {Feedback visual}
|
|
41
|
-
- **Submit form**: {Ação realizada}
|
|
42
|
-
- **Estados**:
|
|
43
|
-
- **Default**: {Aparência inicial}
|
|
44
|
-
- **Loading**: {Como mostra carregamento? Skeleton? Spinner?}
|
|
45
|
-
- **Error**: {Como mostra erros? Toast? Message bar?}
|
|
46
|
-
- **Empty**: {Mensagem quando não há dados? CTA para criar?}
|
|
47
|
-
- **Success**: {Feedback de sucesso?}
|
|
48
|
-
|
|
49
|
-
### Responsividade
|
|
50
|
-
|
|
51
|
-
- **Desktop (> 1024px)**: {Descrição do layout desktop}
|
|
52
|
-
- **Tablet (768px - 1024px)**: {Mudanças no layout}
|
|
53
|
-
- **Mobile (< 768px)**: {Layout mobile - stack vertical? Menu hamburger?}
|
|
54
|
-
|
|
55
|
-
### Navegação
|
|
56
|
-
|
|
57
|
-
- **De**: {Tela/componente anterior}
|
|
58
|
-
- **Para**: {Próximas telas possíveis}
|
|
59
|
-
- **Ações**:
|
|
60
|
-
- [{Botão}]: Navega para {tela}
|
|
61
|
-
- [{Link}]: Abre {modal/página}
|
|
62
|
-
|
|
63
|
-
### Acessibilidade
|
|
64
|
-
|
|
65
|
-
- **Foco inicial**: {Onde o cursor deve iniciar?}
|
|
66
|
-
- **Tab order**: {Ordem lógica de navegação}
|
|
67
|
-
- **Screen reader**: {Principais ARIA labels}
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## Tela 2: {Nome da Próxima Tela}
|
|
72
|
-
|
|
73
|
-
{Repita a estrutura acima para cada tela}
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## Componentes Reutilizáveis
|
|
78
|
-
|
|
79
|
-
### {Nome do Componente}
|
|
80
|
-
|
|
81
|
-
**Wireframe:**
|
|
82
|
-
```
|
|
83
|
-
{ASCII art do componente isolado}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**Uso:**
|
|
87
|
-
- Aparece em: {Lista de telas onde este componente aparece}
|
|
88
|
-
- Variantes: {Diferentes versões/estados do componente}
|
|
89
|
-
- Props: {Parâmetros que o componente recebe}
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Fluxo de Navegação (Overview)
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
[Tela Inicial]
|
|
97
|
-
│
|
|
98
|
-
├─[Ação 1]──▶ [Tela A]
|
|
99
|
-
│ │
|
|
100
|
-
│ └─[Voltar]──▶ [Tela Inicial]
|
|
101
|
-
│
|
|
102
|
-
├─[Ação 2]──▶ [Tela B]
|
|
103
|
-
│ │
|
|
104
|
-
│ ├─[Próximo]──▶ [Tela C]
|
|
105
|
-
│ │
|
|
106
|
-
│ └─[Cancelar]──▶ [Tela Inicial]
|
|
107
|
-
│
|
|
108
|
-
└─[Ação 3]──▶ [Tela D]
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Notas de Design
|
|
114
|
-
|
|
115
|
-
### Paleta de Cores
|
|
116
|
-
- **Primária**: {Cor principal da interface}
|
|
117
|
-
- **Secundária**: {Cor para ações secundárias}
|
|
118
|
-
- **Sucesso**: {Verde para feedback positivo}
|
|
119
|
-
- **Erro**: {Vermelho para erros}
|
|
120
|
-
- **Warning**: {Amarelo para alertas}
|
|
121
|
-
|
|
122
|
-
### Tipografia
|
|
123
|
-
- **Títulos**: {Font, tamanho}
|
|
124
|
-
- **Corpo**: {Font, tamanho}
|
|
125
|
-
- **Labels**: {Font, tamanho}
|
|
126
|
-
|
|
127
|
-
### Espaçamento
|
|
128
|
-
- **Padding padrão**: {16px, 24px, etc}
|
|
129
|
-
- **Gap entre elementos**: {8px, 12px, etc}
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
*Template MORPH-SPEC v2.1.0 by Polymorphism Tech*
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// Example Bicep file for testing cost calculator
|
|
2
|
-
|
|
3
|
-
param location string = 'eastus2'
|
|
4
|
-
param environment string = 'dev'
|
|
5
|
-
|
|
6
|
-
// Azure SQL Database - Basic tier ($4.99/month)
|
|
7
|
-
resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-05-01-preview' = {
|
|
8
|
-
name: 'sqldb-myapp-${environment}'
|
|
9
|
-
location: location
|
|
10
|
-
sku: {
|
|
11
|
-
name: 'Basic'
|
|
12
|
-
tier: 'Basic'
|
|
13
|
-
}
|
|
14
|
-
properties: {
|
|
15
|
-
collation: 'SQL_Latin1_General_CP1_CI_AS'
|
|
16
|
-
maxSizeBytes: 2147483648 // 2 GB
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Container App - Scale-to-zero ($0/month)
|
|
21
|
-
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
|
|
22
|
-
name: 'ca-myapp-${environment}'
|
|
23
|
-
location: location
|
|
24
|
-
properties: {
|
|
25
|
-
configuration: {
|
|
26
|
-
ingress: {
|
|
27
|
-
external: true
|
|
28
|
-
targetPort: 8080
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
template: {
|
|
32
|
-
containers: [
|
|
33
|
-
{
|
|
34
|
-
name: 'main'
|
|
35
|
-
image: 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
|
|
36
|
-
}
|
|
37
|
-
]
|
|
38
|
-
scale: {
|
|
39
|
-
minReplicas: 0 // Scale-to-zero = FREE
|
|
40
|
-
maxReplicas: 2
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Application Insights - Free tier ($0/month)
|
|
47
|
-
resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
|
|
48
|
-
name: 'appi-myapp-${environment}'
|
|
49
|
-
location: location
|
|
50
|
-
kind: 'web'
|
|
51
|
-
properties: {
|
|
52
|
-
Application_Type: 'web'
|
|
53
|
-
}
|
|
54
|
-
sku: {
|
|
55
|
-
name: 'Free'
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Total: $4.99/month (within $10 limit)
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
# .NET + Supabase Backend
|
|
2
|
-
|
|
3
|
-
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** dotnet, supabase, npgsql, dapper, jwt, minimal-api, postgresql
|
|
4
|
-
|
|
5
|
-
## Identity
|
|
6
|
-
|
|
7
|
-
Backend specialist for .NET Minimal API with Supabase (PostgreSQL). Uses Npgsql for connections, Dapper for data access with records, JWT middleware for Supabase Auth token validation, and typed Minimal API endpoints. No EF Core -- direct SQL with Dapper for maximum control over Supabase's PostgreSQL.
|
|
8
|
-
|
|
9
|
-
## Domains
|
|
10
|
-
|
|
11
|
-
- data-access
|
|
12
|
-
- auth-middleware
|
|
13
|
-
- api-endpoints
|
|
14
|
-
|
|
15
|
-
## Standards
|
|
16
|
-
|
|
17
|
-
- coding.md -- C# naming, sealed classes, CancellationToken, Result pattern
|
|
18
|
-
- architecture.md -- Layer boundaries (API -> Application -> Domain)
|
|
19
|
-
|
|
20
|
-
## Patterns
|
|
21
|
-
|
|
22
|
-
### Npgsql Connection Setup
|
|
23
|
-
|
|
24
|
-
```csharp
|
|
25
|
-
// Program.cs
|
|
26
|
-
builder.Services.AddSingleton<NpgsqlDataSource>(sp =>
|
|
27
|
-
{
|
|
28
|
-
var connectionString = builder.Configuration.GetConnectionString("Supabase")
|
|
29
|
-
?? throw new InvalidOperationException("Supabase connection string not configured");
|
|
30
|
-
var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString);
|
|
31
|
-
dataSourceBuilder.UseVector(); // pgvector support
|
|
32
|
-
return dataSourceBuilder.Build();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
// appsettings.json
|
|
36
|
-
{
|
|
37
|
-
"ConnectionStrings": {
|
|
38
|
-
"Supabase": "Host=db.xxx.supabase.co;Port=5432;Database=postgres;Username=postgres;Password=${DB_PASSWORD};SSL Mode=Require;Trust Server Certificate=true"
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Dapper Queries with Records
|
|
44
|
-
|
|
45
|
-
```csharp
|
|
46
|
-
namespace MyApp.Infrastructure.Repositories;
|
|
47
|
-
|
|
48
|
-
public sealed class DocumentRepository(NpgsqlDataSource dataSource) : IDocumentRepository
|
|
49
|
-
{
|
|
50
|
-
public async Task<DocumentDto?> GetByIdAsync(Guid id, CancellationToken ct = default)
|
|
51
|
-
{
|
|
52
|
-
await using var connection = await dataSource.OpenConnectionAsync(ct);
|
|
53
|
-
return await connection.QueryFirstOrDefaultAsync<DocumentDto>(
|
|
54
|
-
"""
|
|
55
|
-
SELECT id, title, content, user_id AS UserId, created_at AS CreatedAt
|
|
56
|
-
FROM documents
|
|
57
|
-
WHERE id = @Id
|
|
58
|
-
""",
|
|
59
|
-
new { Id = id });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
public async Task<PagedResult<DocumentDto>> GetPagedAsync(
|
|
63
|
-
PaginationQuery query,
|
|
64
|
-
Guid userId,
|
|
65
|
-
CancellationToken ct = default)
|
|
66
|
-
{
|
|
67
|
-
await using var connection = await dataSource.OpenConnectionAsync(ct);
|
|
68
|
-
|
|
69
|
-
var count = await connection.ExecuteScalarAsync<int>(
|
|
70
|
-
"SELECT count(*) FROM documents WHERE user_id = @UserId",
|
|
71
|
-
new { UserId = userId });
|
|
72
|
-
|
|
73
|
-
var items = await connection.QueryAsync<DocumentDto>(
|
|
74
|
-
"""
|
|
75
|
-
SELECT id, title, content, user_id AS UserId, created_at AS CreatedAt
|
|
76
|
-
FROM documents
|
|
77
|
-
WHERE user_id = @UserId
|
|
78
|
-
ORDER BY created_at DESC
|
|
79
|
-
LIMIT @PageSize OFFSET @Offset
|
|
80
|
-
""",
|
|
81
|
-
new { UserId = userId, query.PageSize, Offset = (query.Page - 1) * query.PageSize });
|
|
82
|
-
|
|
83
|
-
return new PagedResult<DocumentDto>(items.ToList(), count, query.Page, query.PageSize);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public async Task<Guid> CreateAsync(CreateDocumentRequest request, Guid userId, CancellationToken ct = default)
|
|
87
|
-
{
|
|
88
|
-
await using var connection = await dataSource.OpenConnectionAsync(ct);
|
|
89
|
-
return await connection.ExecuteScalarAsync<Guid>(
|
|
90
|
-
"""
|
|
91
|
-
INSERT INTO documents (title, content, user_id)
|
|
92
|
-
VALUES (@Title, @Content, @UserId)
|
|
93
|
-
RETURNING id
|
|
94
|
-
""",
|
|
95
|
-
new { request.Title, request.Content, UserId = userId });
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### JWT Middleware Setup (Supabase Auth)
|
|
101
|
-
|
|
102
|
-
```csharp
|
|
103
|
-
// Program.cs
|
|
104
|
-
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
105
|
-
.AddJwtBearer(options =>
|
|
106
|
-
{
|
|
107
|
-
var supabaseUrl = builder.Configuration["Supabase:Url"]
|
|
108
|
-
?? throw new InvalidOperationException("Supabase:Url not configured");
|
|
109
|
-
var jwtSecret = builder.Configuration["Supabase:JwtSecret"]
|
|
110
|
-
?? throw new InvalidOperationException("Supabase:JwtSecret not configured");
|
|
111
|
-
|
|
112
|
-
options.TokenValidationParameters = new TokenValidationParameters
|
|
113
|
-
{
|
|
114
|
-
ValidateIssuer = true,
|
|
115
|
-
ValidIssuer = $"{supabaseUrl}/auth/v1",
|
|
116
|
-
ValidateAudience = true,
|
|
117
|
-
ValidAudience = "authenticated",
|
|
118
|
-
ValidateIssuerSigningKey = true,
|
|
119
|
-
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),
|
|
120
|
-
ValidateLifetime = true,
|
|
121
|
-
ClockSkew = TimeSpan.FromSeconds(30)
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
builder.Services.AddAuthorization();
|
|
126
|
-
app.UseAuthentication();
|
|
127
|
-
app.UseAuthorization();
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### User ID Extraction
|
|
131
|
-
|
|
132
|
-
```csharp
|
|
133
|
-
// Extension method for ClaimsPrincipal
|
|
134
|
-
public static class ClaimsPrincipalExtensions
|
|
135
|
-
{
|
|
136
|
-
public static Guid GetUserId(this ClaimsPrincipal user)
|
|
137
|
-
{
|
|
138
|
-
var sub = user.FindFirstValue(ClaimTypes.NameIdentifier)
|
|
139
|
-
?? throw new UnauthorizedAccessException("User ID claim not found");
|
|
140
|
-
return Guid.Parse(sub);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Minimal API Endpoints
|
|
146
|
-
|
|
147
|
-
```csharp
|
|
148
|
-
namespace MyApp.Api.Endpoints;
|
|
149
|
-
|
|
150
|
-
public static class DocumentEndpoints
|
|
151
|
-
{
|
|
152
|
-
public static void MapDocumentEndpoints(this WebApplication app)
|
|
153
|
-
{
|
|
154
|
-
var group = app.MapGroup("/api/documents")
|
|
155
|
-
.WithTags("Documents")
|
|
156
|
-
.RequireAuthorization();
|
|
157
|
-
|
|
158
|
-
group.MapGet("/", GetAllAsync);
|
|
159
|
-
group.MapGet("/{id:guid}", GetByIdAsync);
|
|
160
|
-
group.MapPost("/", CreateAsync);
|
|
161
|
-
group.MapPut("/{id:guid}", UpdateAsync);
|
|
162
|
-
group.MapDelete("/{id:guid}", DeleteAsync);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
private static async Task<IResult> GetAllAsync(
|
|
166
|
-
[AsParameters] PaginationQuery query,
|
|
167
|
-
ClaimsPrincipal user,
|
|
168
|
-
IDocumentService service,
|
|
169
|
-
CancellationToken ct)
|
|
170
|
-
{
|
|
171
|
-
var userId = user.GetUserId();
|
|
172
|
-
var result = await service.GetPagedAsync(query, userId, ct);
|
|
173
|
-
return Results.Ok(result);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
private static async Task<IResult> CreateAsync(
|
|
177
|
-
CreateDocumentRequest request,
|
|
178
|
-
ClaimsPrincipal user,
|
|
179
|
-
IDocumentService service,
|
|
180
|
-
CancellationToken ct)
|
|
181
|
-
{
|
|
182
|
-
var userId = user.GetUserId();
|
|
183
|
-
var result = await service.CreateAsync(request, userId, ct);
|
|
184
|
-
return result.IsSuccess
|
|
185
|
-
? Results.Created($"/api/documents/{result.Value.Id}", result.Value)
|
|
186
|
-
: Results.BadRequest(result.Error);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Supabase Client Wrapper (for Storage/Auth Admin)
|
|
192
|
-
|
|
193
|
-
```csharp
|
|
194
|
-
namespace MyApp.Infrastructure.Supabase;
|
|
195
|
-
|
|
196
|
-
public sealed class SupabaseAdmin(HttpClient httpClient, IOptions<SupabaseOptions> options)
|
|
197
|
-
{
|
|
198
|
-
private readonly string _serviceKey = options.Value.ServiceRoleKey;
|
|
199
|
-
|
|
200
|
-
public async Task<string> UploadFileAsync(
|
|
201
|
-
string bucket,
|
|
202
|
-
string path,
|
|
203
|
-
Stream content,
|
|
204
|
-
string contentType,
|
|
205
|
-
CancellationToken ct = default)
|
|
206
|
-
{
|
|
207
|
-
using var request = new HttpRequestMessage(HttpMethod.Post,
|
|
208
|
-
$"{options.Value.Url}/storage/v1/object/{bucket}/{path}");
|
|
209
|
-
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _serviceKey);
|
|
210
|
-
request.Headers.Add("apikey", _serviceKey);
|
|
211
|
-
request.Content = new StreamContent(content);
|
|
212
|
-
request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
|
|
213
|
-
|
|
214
|
-
var response = await httpClient.SendAsync(request, ct);
|
|
215
|
-
response.EnsureSuccessStatusCode();
|
|
216
|
-
|
|
217
|
-
var result = await response.Content.ReadFromJsonAsync<StorageUploadResult>(ct);
|
|
218
|
-
return $"{options.Value.Url}/storage/v1/object/public/{bucket}/{result?.Key}";
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
public sealed record SupabaseOptions
|
|
223
|
-
{
|
|
224
|
-
public required string Url { get; init; }
|
|
225
|
-
public required string AnonKey { get; init; }
|
|
226
|
-
public required string ServiceRoleKey { get; init; }
|
|
227
|
-
public required string JwtSecret { get; init; }
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## Checklist
|
|
232
|
-
|
|
233
|
-
- [ ] NpgsqlDataSource registered as Singleton (connection pooling)
|
|
234
|
-
- [ ] Dapper queries use parameterized SQL (never string interpolation)
|
|
235
|
-
- [ ] JWT middleware validates issuer, audience, signing key, and lifetime
|
|
236
|
-
- [ ] service_role key stored in environment variables (not appsettings)
|
|
237
|
-
- [ ] All async methods accept CancellationToken
|
|
238
|
-
- [ ] All DTOs are records (not classes)
|
|
239
|
-
- [ ] Endpoints use RequireAuthorization()
|
|
240
|
-
- [ ] User ID extracted from JWT claims (not request body)
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
*MORPH-SPEC by Polymorphism Tech*
|