@polymorphism-tech/morph-spec 4.11.1 → 4.13.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 +21 -29
- package/bin/morph-spec.js +41 -24
- package/bin/task-manager.js +962 -1341
- package/bin/validate.js +1 -1
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +10 -11
- package/docs/QUICKSTART.md +15 -15
- package/framework/CLAUDE.md +5 -2
- package/framework/agents/README.md +3 -4
- package/framework/agents/ai-agents/ai-system-architect.md +6 -10
- package/framework/agents/architecture/seo-growth-hacker.md +166 -326
- package/framework/agents/architecture/standards-architect.md +21 -31
- package/framework/agents/backend/dotnet-senior.md +160 -86
- package/framework/agents/backend/ef-modeler.md +2 -6
- package/framework/agents/backend/hangfire-orchestrator.md +8 -9
- package/framework/agents/backend/ms-agent-expert.md +1 -1
- package/framework/agents/frontend/nextjs-expert.md +198 -133
- package/framework/agents/frontend/ui-ux-designer.md +226 -267
- package/framework/agents/infrastructure/infra-architect.md +191 -27
- package/framework/agents/integrations/clerk-auth.md +19 -26
- package/framework/agents/integrations/hangfire-integration.md +1 -4
- package/framework/agents.json +226 -1454
- package/framework/commands/morph-apply.md +4 -4
- package/framework/commands/morph-preflight.md +4 -26
- package/framework/commands/morph-proposal.md +19 -19
- package/framework/commands/morph-status.md +2 -2
- package/framework/commands/morph-troubleshoot.md +6 -13
- package/framework/hooks/README.md +1 -6
- package/framework/hooks/claude-code/post-tool-use/agent-complete.js +122 -0
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
- package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
- package/framework/hooks/claude-code/statusline.py +4 -5
- package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
- package/framework/hooks/shared/compact-restore.js +28 -5
- package/framework/hooks/shared/dispatch-helpers.js +17 -0
- package/framework/hooks/shared/phase-utils.js +4 -8
- package/framework/hooks/shared/state-reader.js +34 -3
- package/framework/phases.json +7 -45
- package/framework/rules/ai-agents-standards.md +15 -0
- package/framework/rules/asaas-standards.md +13 -0
- package/framework/rules/clerk-standards.md +13 -0
- package/framework/rules/csharp-standards.md +8 -4
- package/framework/rules/data-standards.md +18 -0
- package/framework/rules/dotnet-templates.md +87 -0
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/hangfire-standards.md +13 -0
- package/framework/rules/infrastructure-standards.md +27 -16
- package/framework/rules/morph-workflow.md +73 -13
- package/framework/rules/nextjs-standards.md +1 -0
- package/framework/rules/nextjs-templates.md +40 -0
- package/framework/rules/resend-standards.md +12 -0
- package/framework/rules/supabase-standards.md +29 -0
- package/framework/skills/README.md +6 -8
- package/framework/skills/level-0-meta/mcp-registry.json +21 -99
- package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
- package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
- package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
- package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
- package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
- package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
- package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
- package/framework/skills/level-1-workflows/README.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +58 -124
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
- package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -2
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +275 -61
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/squad-templates/backend-only.json +6 -6
- package/framework/squad-templates/frontend-only.json +17 -8
- package/framework/squad-templates/full-stack.json +29 -24
- package/framework/standards/STANDARDS.json +1021 -2338
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
- package/framework/standards/backend/dotnet/result-pattern.md +213 -0
- package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
- package/framework/standards/backend/dotnet/scrutor.md +158 -0
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
- package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
- package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
- package/framework/standards/integration/mcp/mcp-tools.md +91 -77
- package/framework/templates/IDE-SNIPPETS.md +2 -6
- package/framework/templates/README.md +709 -814
- package/framework/templates/REGISTRY.json +223 -762
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
- package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
- package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
- package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
- package/framework/templates/code/dotnet/backend/repository.cs +148 -141
- package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
- package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
- package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
- package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
- package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
- package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
- package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
- package/framework/templates/code/dotnet/jobs/job.cs +21 -17
- package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
- package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
- package/framework/templates/code/dotnet/test.cs +192 -106
- package/framework/templates/context/ARCHITECTURE.md +89 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
- package/framework/templates/context/CONTEXT.md +180 -181
- package/framework/templates/context/design-system.md +342 -211
- package/framework/templates/docs/onboarding.md +2 -3
- package/framework/templates/docs/proposal.md +171 -182
- package/framework/templates/docs/spec.md +1 -3
- package/framework/templates/docs/ui-components.md +0 -72
- package/framework/templates/examples/design-system-examples.md +4 -4
- package/framework/templates/feature/decisions.md +0 -66
- package/framework/templates/feature/recap.md +1 -2
- package/framework/templates/infrastructure/github/README.md +56 -593
- package/framework/templates/integrations/clerk-config.cs +0 -41
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
- package/framework/templates/project/validate.js +2 -4
- package/framework/templates/ui/design-system.css +1 -1
- package/framework/workflows/README.md +8 -8
- package/framework/workflows/configs/fast-track.json +51 -0
- package/framework/workflows/configs/full.json +68 -0
- package/framework/workflows/configs/standard.json +7 -3
- package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
- package/framework/workflows/docs/enforcement-pipeline.md +18 -19
- package/framework/workflows/docs/full-morph.md +69 -76
- package/framework/workflows/docs/standard.md +49 -44
- package/framework/workflows/docs/ui-refresh.md +1 -1
- package/package.json +3 -3
- package/src/commands/agents/dispatch-agents.js +55 -116
- package/src/commands/context/context-refresh.js +79 -0
- package/src/commands/mcp/mcp-setup.js +28 -6
- package/src/commands/phase/phase-reset.js +1 -1
- package/src/commands/project/doctor.js +10 -32
- package/src/commands/project/init.js +32 -1
- package/src/commands/project/status.js +6 -12
- package/src/commands/scaffold/scaffold.js +131 -0
- package/src/commands/scope/escalate.js +1 -1
- package/src/commands/state/advance-phase.js +15 -29
- package/src/commands/state/state.js +20 -5
- package/src/commands/tasks/task.js +0 -30
- package/src/commands/validation/validate-feature.js +3 -10
- package/src/core/paths/output-schema.js +12 -13
- package/src/core/state/phase-state-machine.js +211 -217
- package/src/core/state/state-manager.js +9 -9
- package/src/lib/agents/agents-manager.js +2 -2
- package/src/lib/agents/output-collector.js +1 -2
- package/src/lib/detectors/design-system-detector.js +4 -4
- package/src/lib/detectors/index.js +1 -11
- package/src/lib/generators/architecture-scanner.js +640 -0
- package/src/lib/generators/context-generator.js +3 -3
- package/src/lib/generators/design-system-generator.js +508 -298
- package/src/lib/generators/index.js +12 -10
- package/src/lib/generators/metadata-extractor.js +386 -387
- package/src/lib/generators/recap-generator.js +4 -4
- package/src/lib/generators/scaffold-generator.js +317 -0
- package/src/lib/generators/settings-generator.js +0 -1
- package/src/lib/phase-chain/phase-validator.js +64 -42
- package/src/lib/stack/stack-profile.js +2 -2
- package/src/lib/standards/digest-builder.js +72 -285
- package/src/lib/tasks/task-parser.js +11 -5
- package/src/lib/validators/architecture/architecture-validator.js +259 -387
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/css/css-validator.js +340 -352
- package/src/lib/validators/design-system/design-system-validator.js +11 -5
- package/src/lib/validators/packages/package-validator.js +347 -360
- package/src/lib/validators/shared/issue-counter.js +14 -18
- package/src/lib/validators/validation-runner.js +3 -19
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agents-installer.js +24 -3
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +21 -19
- package/src/utils/skills-installer.js +178 -178
- package/framework/agents/architecture/prompt-engineer.md +0 -195
- package/framework/agents/backend/api-designer.md +0 -106
- package/framework/agents/frontend/blazor-builder.md +0 -229
- package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
- package/framework/agents/infrastructure/azure-architect.md +0 -150
- package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
- package/framework/agents/infrastructure/bicep-architect.md +0 -132
- package/framework/agents/infrastructure/container-specialist.md +0 -137
- package/framework/agents/infrastructure/devops-engineer.md +0 -126
- package/framework/agents/integrations/azure-identity.md +0 -148
- package/framework/agents/quality/code-analyzer.md +0 -239
- package/framework/agents/quality/testing-specialist.md +0 -130
- package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
- package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
- package/framework/index/troubleshooting-index.json +0 -184
- package/framework/rules/testing-standards.md +0 -14
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
- package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
- package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
- package/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/framework/standards/architecture/ddd/entities.md +0 -99
- package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/framework/standards/backend/api/minimal-api.md +0 -494
- package/framework/standards/backend/api/rest.md +0 -492
- package/framework/standards/backend/authentication/passkeys.md +0 -428
- package/framework/standards/backend/database/ef-core.md +0 -199
- package/framework/standards/backend/database/migrations.md +0 -393
- package/framework/standards/backend/database/repository-patterns.md +0 -528
- package/framework/standards/backend/dotnet/async.md +0 -366
- package/framework/standards/backend/dotnet/core.md +0 -117
- package/framework/standards/backend/dotnet/di.md +0 -439
- package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/framework/standards/context/analytics.md +0 -96
- package/framework/standards/context/bundles.md +0 -110
- package/framework/standards/context/priming.md +0 -78
- package/framework/standards/core/architecture.md +0 -185
- package/framework/standards/core/coding.md +0 -214
- package/framework/standards/core/git-branching-strategy.md +0 -403
- package/framework/standards/core/git.md +0 -185
- package/framework/standards/core/testing.md +0 -295
- package/framework/standards/data/nosql/blob-storage.md +0 -102
- package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/framework/standards/frontend/blazor/state.md +0 -191
- package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -213
- package/framework/standards/infrastructure/azure/azure.md +0 -624
- package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
- package/framework/standards/integration/api/graphql.md +0 -91
- package/framework/standards/integration/api/grpc.md +0 -114
- package/framework/standards/integration/api/rest-design.md +0 -95
- package/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/framework/standards/observability/logging.md +0 -131
- package/framework/standards/observability/metrics.md +0 -121
- package/framework/standards/observability/monitoring.md +0 -114
- package/framework/standards/observability/tracing.md +0 -132
- package/framework/standards/workflows/parallel-execution.md +0 -112
- package/framework/standards/workflows/thread-management.md +0 -113
- package/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/framework/templates/infrastructure/azure/README.md +0 -286
- package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/framework/templates/saas/subscription.cs +0 -347
- package/framework/templates/saas/tenant.cs +0 -338
- package/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/framework/templates/ui/MudTheme.cs +0 -281
- package/framework/workflows/configs/nodejs-cli.json +0 -40
- package/src/commands/standards/context-budget.js +0 -89
- package/src/lib/standards/index.js +0 -7
- package/src/lib/standards/standards-context-injector.js +0 -302
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
- package/src/lib/validators/blazor/blazor-validator.js +0 -369
- package/src/lib/validators/blazor/index.js +0 -9
|
@@ -1,86 +1,160 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dotnet-senior
|
|
3
|
-
description: Senior .NET engineer and Backend Squad Leader for
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- dotnet
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
**
|
|
13
|
-
**
|
|
14
|
-
**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
framework/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
1
|
+
---
|
|
2
|
+
name: dotnet-senior
|
|
3
|
+
description: Senior .NET engineer and Backend Squad Leader for VSA (Vertical Slice Architecture), Minimal APIs, IHandler/Result<T> patterns, Scrutor DI, and async patterns. Use when implementing .NET/C# services, designing backend architecture, implementing async operations with CancellationToken, or coordinating backend domain specialists.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
+
stacks:
|
|
6
|
+
- dotnet
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# .NET Senior Engineer
|
|
10
|
+
|
|
11
|
+
**Tier:** 2 (Domain Leader)
|
|
12
|
+
**Always Active:** Yes
|
|
13
|
+
**Reports to:** standards-architect
|
|
14
|
+
**Coordinates:** ef-modeler, hangfire-orchestrator, ms-agent-expert
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Role
|
|
19
|
+
|
|
20
|
+
Senior .NET engineer and Backend Squad Leader. Writes production-quality C# code using Vertical Slice Architecture (VSA) and coordinates backend domain specialists for all .NET implementation tasks.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Standards Applied
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
framework/standards/backend/api/rest.md
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Code Templates
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
.morph/framework/templates/code/dotnet/feature/
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## VSA Patterns (Vertical Slice Architecture)
|
|
39
|
+
|
|
40
|
+
### IHandler Pattern
|
|
41
|
+
|
|
42
|
+
Every feature is a vertical slice with its own handler:
|
|
43
|
+
|
|
44
|
+
```csharp
|
|
45
|
+
public interface IHandler<TRequest, TResponse>
|
|
46
|
+
{
|
|
47
|
+
Task<Result<TResponse>> HandleAsync(TRequest request, CancellationToken ct);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Result<T> Pattern
|
|
52
|
+
|
|
53
|
+
All handlers return `Result<T>` — never throw for business errors:
|
|
54
|
+
|
|
55
|
+
```csharp
|
|
56
|
+
public sealed class Result<T>
|
|
57
|
+
{
|
|
58
|
+
public bool IsSuccess { get; }
|
|
59
|
+
public T? Value { get; }
|
|
60
|
+
public Error? Error { get; }
|
|
61
|
+
|
|
62
|
+
public static Result<T> Success(T value) => new(value);
|
|
63
|
+
public static Result<T> Failure(Error error) => new(error);
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Scrutor DI Registration
|
|
68
|
+
|
|
69
|
+
Auto-register handlers and services by convention:
|
|
70
|
+
|
|
71
|
+
```csharp
|
|
72
|
+
builder.Services.Scan(scan => scan
|
|
73
|
+
.FromAssemblyOf<Program>()
|
|
74
|
+
.AddClasses(c => c.AssignableTo(typeof(IHandler<,>)))
|
|
75
|
+
.AsImplementedInterfaces()
|
|
76
|
+
.WithScopedLifetime());
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### IApiEndpoint Pattern
|
|
80
|
+
|
|
81
|
+
Feature endpoints self-register:
|
|
82
|
+
|
|
83
|
+
```csharp
|
|
84
|
+
public interface IApiEndpoint
|
|
85
|
+
{
|
|
86
|
+
static abstract void Map(IEndpointRouteBuilder app);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Usage in each feature:
|
|
90
|
+
public sealed class CreateOrder : IApiEndpoint
|
|
91
|
+
{
|
|
92
|
+
public static void Map(IEndpointRouteBuilder app) =>
|
|
93
|
+
app.MapPost("/api/orders", HandleAsync)
|
|
94
|
+
.WithTags("Orders")
|
|
95
|
+
.Produces<OrderResponse>(201);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Minimal API Endpoint Patterns
|
|
100
|
+
|
|
101
|
+
```csharp
|
|
102
|
+
// Group endpoints by feature
|
|
103
|
+
var orders = app.MapGroup("/api/orders").WithTags("Orders");
|
|
104
|
+
orders.MapGet("/", GetAllAsync);
|
|
105
|
+
orders.MapGet("/{id:guid}", GetByIdAsync);
|
|
106
|
+
orders.MapPost("/", CreateAsync);
|
|
107
|
+
orders.MapPut("/{id:guid}", UpdateAsync);
|
|
108
|
+
orders.MapDelete("/{id:guid}", DeleteAsync);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Responsibilities
|
|
114
|
+
|
|
115
|
+
- Lead backend implementation (services, handlers, business logic)
|
|
116
|
+
- Coordinate backend squad (ef-modeler, hangfire-orchestrator, ms-agent-expert)
|
|
117
|
+
- Ensure code follows VSA patterns and all .NET standards
|
|
118
|
+
- Design Minimal API endpoints with IApiEndpoint pattern
|
|
119
|
+
- Implement async patterns with CancellationToken
|
|
120
|
+
- Apply dependency injection correctly (Scrutor conventions)
|
|
121
|
+
- Write unit and integration tests
|
|
122
|
+
- API design: endpoint contracts, request/response DTOs, validation
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## When to Use
|
|
127
|
+
|
|
128
|
+
- Any .NET/C# code implementation
|
|
129
|
+
- Backend service layer development
|
|
130
|
+
- Minimal API endpoint implementation
|
|
131
|
+
- Business logic and handler implementation
|
|
132
|
+
- Complex architectural decisions (Ultrathink mode)
|
|
133
|
+
- API contract design and endpoint patterns
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Ultrathink Mode
|
|
138
|
+
|
|
139
|
+
**Trigger:** Keywords like "ultrathink", "deep-think", "analyze deeply", "complex decision"
|
|
140
|
+
|
|
141
|
+
**Use for:**
|
|
142
|
+
- Technology/library selection
|
|
143
|
+
- Architecture pattern decisions (CQRS vs simple VSA)
|
|
144
|
+
- Performance optimization strategy
|
|
145
|
+
- Migration planning
|
|
146
|
+
- Multi-system integration design
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Collaborates With
|
|
151
|
+
|
|
152
|
+
- **ef-modeler** - Database/EF Core layer
|
|
153
|
+
- **infra-architect** - Infrastructure provisioning (Docker/EasyPanel)
|
|
154
|
+
- **nextjs-expert** - Backend API consumed by frontend
|
|
155
|
+
- **hangfire-orchestrator** - Background job coordination
|
|
156
|
+
- **ms-agent-expert** - AI agent integration
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -12,10 +12,7 @@ Entity Framework Core specialist for database modeling, entities, configurations
|
|
|
12
12
|
|
|
13
13
|
## Standards
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
- `framework/standards/backend/database/migrations.md`
|
|
17
|
-
- `framework/standards/backend/database/repository-patterns.md`
|
|
18
|
-
- `framework/standards/core/coding.md`
|
|
15
|
+
*(No external standard files — patterns are embedded in this agent prompt.)*
|
|
19
16
|
|
|
20
17
|
---
|
|
21
18
|
|
|
@@ -113,8 +110,7 @@ public class PhotoProcessingJob(IDbContextFactory<AppDbContext> dbFactory)
|
|
|
113
110
|
## Collaborates With
|
|
114
111
|
|
|
115
112
|
- **dotnet-senior** — service layer consuming repositories
|
|
116
|
-
- **
|
|
117
|
-
- **azure-architect** — Azure SQL / Cosmos DB provisioning
|
|
113
|
+
- **infra-architect** — Database provisioning (Docker/EasyPanel)
|
|
118
114
|
|
|
119
115
|
---
|
|
120
116
|
|
|
@@ -13,14 +13,15 @@ Especialista em background jobs, tarefas agendadas e processamento assíncrono c
|
|
|
13
13
|
## .NET 10 Compatibility
|
|
14
14
|
- Hangfire.AspNetCore: **>= 1.8.22** (required for .NET 10)
|
|
15
15
|
|
|
16
|
-
## Why Hangfire
|
|
16
|
+
## Why Hangfire
|
|
17
17
|
|
|
18
|
-
| Aspect |
|
|
19
|
-
|
|
20
|
-
| Cost | Free (in-process
|
|
21
|
-
| Dashboard | Built-in
|
|
22
|
-
| Debugging | Local
|
|
23
|
-
| Complexity | Low
|
|
18
|
+
| Aspect | Benefit |
|
|
19
|
+
|--------|---------|
|
|
20
|
+
| Cost | Free (in-process, no external service) |
|
|
21
|
+
| Dashboard | Built-in web UI |
|
|
22
|
+
| Debugging | Local debugging, no emulator needed |
|
|
23
|
+
| Complexity | Low — runs inside your .NET app |
|
|
24
|
+
| Deployment | Works with any hosting (Docker, EasyPanel, VPS) |
|
|
24
25
|
|
|
25
26
|
---
|
|
26
27
|
|
|
@@ -68,8 +69,6 @@ app.UseHangfireDashboard("/hangfire", new DashboardOptions
|
|
|
68
69
|
|
|
69
70
|
## CRITICAL: Scoped Repository Pattern
|
|
70
71
|
|
|
71
|
-
> **Ref:** `framework/standards/backend/database/ef-core.md` — Repository Factory pattern
|
|
72
|
-
|
|
73
72
|
**Hangfire jobs run OUTSIDE the HTTP request.** The scoped DbContext does NOT exist.
|
|
74
73
|
|
|
75
74
|
```csharp
|
|
@@ -1,133 +1,198 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: nextjs-expert
|
|
3
|
-
description: Next.js specialist for App Router, shadcn/ui, TanStack Query, react-hook-form/Zod, and EasyPanel deployment. Use when building Next.js pages or components, implementing forms, setting up data fetching from a .NET API, or configuring TypeScript/Docker for Next.js.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- nextjs
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Next.js Expert
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
|
27
|
-
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
- Use `
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
1
|
+
---
|
|
2
|
+
name: nextjs-expert
|
|
3
|
+
description: Next.js specialist and Frontend Squad Leader for App Router, shadcn/ui, TanStack Query, react-hook-form/Zod, Framer Motion, design tokens, and EasyPanel deployment. Use when building Next.js pages or components, implementing forms, animations, theming, setting up data fetching from a .NET API, or configuring TypeScript/Docker for Next.js.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
+
stacks:
|
|
6
|
+
- nextjs
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Next.js Expert
|
|
10
|
+
|
|
11
|
+
Frontend Squad Leader for the locked stack: **Next.js App Router + shadcn/ui + TanStack Query + react-hook-form/Zod + Framer Motion + EasyPanel/Docker**.
|
|
12
|
+
|
|
13
|
+
## Code Templates
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
.morph/framework/templates/frontend/nextjs/
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Stack
|
|
20
|
+
|
|
21
|
+
| Layer | Technology |
|
|
22
|
+
|-------|-----------|
|
|
23
|
+
| Framework | Next.js App Router (TypeScript strict) |
|
|
24
|
+
| UI Components | shadcn/ui — `npx shadcn@latest add` |
|
|
25
|
+
| Styling | Tailwind CSS |
|
|
26
|
+
| Theming | shadcn theme config + CSS custom properties (design tokens) |
|
|
27
|
+
| Server state | TanStack Query v5 |
|
|
28
|
+
| Forms | react-hook-form + Zod + zodResolver |
|
|
29
|
+
| Animation | Framer Motion |
|
|
30
|
+
| Deployment | Docker multi-stage → EasyPanel (VPS) |
|
|
31
|
+
|
|
32
|
+
## Critical Standards (Read FIRST)
|
|
33
|
+
|
|
34
|
+
| Standard | What |
|
|
35
|
+
|----------|------|
|
|
36
|
+
| `frontend/nextjs/naming-conventions.md` | **kebab-case files, PascalCase exports, use- hooks** |
|
|
37
|
+
| `frontend/nextjs/project-structure.md` | **Feature-based folders, component tiers** |
|
|
38
|
+
| `frontend/nextjs/app-router.md` | **Server vs Client components decision tree** |
|
|
39
|
+
| `frontend/nextjs/components.md` | **Three-tier hierarchy, never edit components/ui/** |
|
|
40
|
+
| `frontend/nextjs/data-fetching.md` | **TanStack Query patterns, query key factories** |
|
|
41
|
+
| `frontend/nextjs/forms.md` | **react-hook-form + Zod + shadcn Form** |
|
|
42
|
+
| `frontend/nextjs/state-management.md` | **No Zustand by default** |
|
|
43
|
+
| `frontend/nextjs/testing.md` | **Jest + Testing Library + MSW** |
|
|
44
|
+
|
|
45
|
+
## Mandatory Design System Protocol
|
|
46
|
+
|
|
47
|
+
**Before any UI implementation:**
|
|
48
|
+
|
|
49
|
+
1. **READ** `.morph/context/design-system.md`
|
|
50
|
+
2. **Use EXCLUSIVELY** the tokens defined there — never hardcode hex values, pixel values, or durations
|
|
51
|
+
3. **If a token is missing:** add it to `design-system.md` in the correct section before using it
|
|
52
|
+
4. **Register in Changelog:** add `- YYYY-MM-DD [nextjs-expert] Description of addition`
|
|
53
|
+
|
|
54
|
+
## shadcn Theming
|
|
55
|
+
|
|
56
|
+
- All theme customization via `tailwind.config.ts` and CSS custom properties
|
|
57
|
+
- Never override shadcn component internals in `components/ui/`
|
|
58
|
+
- Use `cn()` utility for conditional class merging
|
|
59
|
+
- Design tokens flow: `design-system.md` → CSS variables → Tailwind config → components
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
// Theme-aware component example
|
|
63
|
+
<Card className="bg-card text-card-foreground border-border">
|
|
64
|
+
<CardHeader className="text-primary">Title</CardHeader>
|
|
65
|
+
</Card>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Framer Motion Patterns
|
|
69
|
+
|
|
70
|
+
### Page Transitions
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
<motion.div
|
|
74
|
+
initial={{ opacity: 0, y: 20 }}
|
|
75
|
+
animate={{ opacity: 1, y: 0 }}
|
|
76
|
+
exit={{ opacity: 0, y: -20 }}
|
|
77
|
+
transition={{ duration: 0.3, ease: 'easeOut' }}
|
|
78
|
+
>
|
|
79
|
+
{children}
|
|
80
|
+
</motion.div>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Component Animations
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
// Stagger children
|
|
87
|
+
const container = { hidden: {}, visible: { transition: { staggerChildren: 0.1 } } };
|
|
88
|
+
const item = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0 } };
|
|
89
|
+
|
|
90
|
+
<motion.ul variants={container} initial="hidden" animate="visible">
|
|
91
|
+
{items.map(i => <motion.li key={i.id} variants={item}>{i.name}</motion.li>)}
|
|
92
|
+
</motion.ul>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### WCAG Motion Compliance
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
// Always respect prefers-reduced-motion
|
|
99
|
+
const prefersReducedMotion = useReducedMotion();
|
|
100
|
+
|
|
101
|
+
<motion.div
|
|
102
|
+
animate={{ scale: prefersReducedMotion ? 1 : 1.05 }}
|
|
103
|
+
transition={prefersReducedMotion ? { duration: 0 } : { duration: 0.2 }}
|
|
104
|
+
/>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- Use `useReducedMotion()` hook from Framer Motion
|
|
108
|
+
- Provide `duration: 0` fallback for users who prefer reduced motion
|
|
109
|
+
- Never use motion as the only indicator of state change
|
|
110
|
+
|
|
111
|
+
## Quick Checklist
|
|
112
|
+
|
|
113
|
+
- [ ] Read `.morph/context/design-system.md` before any UI work
|
|
114
|
+
- [ ] No hardcoded colors — all use CSS token variables (e.g., `var(--color-primary)`)
|
|
115
|
+
- [ ] File names are kebab-case (`user-card.tsx` not `UserCard.tsx`)
|
|
116
|
+
- [ ] `'use client'` only on components with hooks or event handlers
|
|
117
|
+
- [ ] No `useEffect` for data fetching — use Server Components or TanStack Query
|
|
118
|
+
- [ ] Zod schema defined before TypeScript type (`type X = z.infer<typeof xSchema>`)
|
|
119
|
+
- [ ] Query keys use factory pattern (`userKeys.lists()` not `['users']`)
|
|
120
|
+
- [ ] Forms use `zodResolver` + shadcn `<Form>` + `<FormMessage>`
|
|
121
|
+
- [ ] `components/ui/` files never edited directly
|
|
122
|
+
- [ ] New features go in `features/{name}/components|hooks|types/`
|
|
123
|
+
- [ ] Framer Motion animations respect `prefers-reduced-motion`
|
|
124
|
+
- [ ] shadcn theme tokens used instead of hardcoded Tailwind colors
|
|
125
|
+
|
|
126
|
+
## Naming Conventions (Non-Negotiable)
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
Component file: user-card.tsx → export function UserCard()
|
|
130
|
+
Hook file: use-create-user.ts → export function useCreateUser()
|
|
131
|
+
Schema file: user.schemas.ts → export const createUserSchema = z.object(...)
|
|
132
|
+
Type file: user.types.ts → export type User = z.infer<typeof userSchema>
|
|
133
|
+
Feature folder: features/user-mgmt/
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Component Tier Rules
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
components/ui/ ← shadcn primitives. NEVER edit.
|
|
140
|
+
components/ ← Composed shared components. No API calls. No feature imports.
|
|
141
|
+
features/*/components ← Feature-scoped. May use components/ but not other features/.
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Data Fetching Patterns
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
// Server Component (initial load)
|
|
148
|
+
export default async function Page() {
|
|
149
|
+
const data = await fetch(`${process.env.API_URL}/api/users`).then(r => r.json());
|
|
150
|
+
return <UserList initialData={data} />;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Client Component (mutations/interactive)
|
|
154
|
+
'use client';
|
|
155
|
+
const { data } = useUsers(); // TanStack Query
|
|
156
|
+
const { mutate } = useCreateUser(); // useMutation
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Form Pattern
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
// Schema first, type derived
|
|
163
|
+
const schema = z.object({ name: z.string().min(2) });
|
|
164
|
+
type Input = z.infer<typeof schema>;
|
|
165
|
+
|
|
166
|
+
// Form wired to schema
|
|
167
|
+
const form = useForm<Input>({ resolver: zodResolver(schema) });
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## EasyPanel Deployment
|
|
171
|
+
|
|
172
|
+
- Use `framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs` as base
|
|
173
|
+
- Requires `output: 'standalone'` in `next.config.js`
|
|
174
|
+
- `NEXT_PUBLIC_*` vars must be available at **build time** (Docker build args)
|
|
175
|
+
- Server-only vars (API_URL, secrets) go in EasyPanel environment at **runtime**
|
|
176
|
+
|
|
177
|
+
## Project Structure
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
src/
|
|
181
|
+
├── app/ # Routes only
|
|
182
|
+
├── features/{name}/
|
|
183
|
+
│ ├── components/ # Feature UI
|
|
184
|
+
│ ├── hooks/ # TanStack Query hooks
|
|
185
|
+
│ └── types/ # Zod schemas + inferred types
|
|
186
|
+
├── components/
|
|
187
|
+
│ ├── ui/ # shadcn — do not edit
|
|
188
|
+
│ └── {shared}.tsx # Composed shared components
|
|
189
|
+
├── hooks/ # Utility hooks (no API calls)
|
|
190
|
+
├── lib/
|
|
191
|
+
│ ├── api-client.ts
|
|
192
|
+
│ └── query-client.tsx
|
|
193
|
+
└── env.mjs # Zod env validation
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
*MORPH-SPEC by Polymorphism Tech*
|