@polymorphism-tech/morph-spec 4.6.0 → 4.7.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 +394 -700
- package/docs/ARCHITECTURE.md +331 -0
- package/docs/CHEATSHEET.md +221 -0
- package/docs/COMMAND-FLOWS.md +368 -0
- package/docs/QUICKSTART.md +212 -0
- package/docs/examples/order-management/contracts.cs +84 -0
- package/docs/examples/order-management/proposal.md +24 -0
- package/docs/examples/order-management/spec.md +162 -0
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
- package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
- package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
- package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/nextjs-expert.md +87 -127
- package/framework/agents/infrastructure/azure-architect.md +147 -147
- package/framework/agents/infrastructure/infra-architect.md +45 -0
- package/framework/agents.json +1145 -278
- package/framework/rules/frontend-standards.md +0 -3
- package/framework/rules/nextjs-standards.md +17 -0
- package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
- package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
- package/framework/standards/STANDARDS.json +121 -0
- package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
- package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
- package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
- package/framework/standards/frontend/nextjs/app-router.md +123 -0
- package/framework/standards/frontend/nextjs/components.md +132 -0
- package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
- package/framework/standards/frontend/nextjs/forms.md +128 -0
- package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
- package/framework/standards/frontend/nextjs/project-structure.md +102 -0
- package/framework/standards/frontend/nextjs/state-management.md +72 -0
- package/framework/standards/frontend/nextjs/testing.md +111 -0
- package/framework/templates/REGISTRY.json +538 -142
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
- package/framework/templates/docs/spec.md +49 -0
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
- package/framework/templates/project-structure/dotnet-ddd.md +70 -0
- package/framework/workflows/docs/enforcement-pipeline.md +2 -1
- package/package.json +1 -1
- package/scripts/scan-nextjs.mjs +169 -0
- package/src/commands/project/doctor.js +52 -1
- package/src/commands/project/init.js +15 -1
- package/src/commands/project/update.js +6 -1
- package/src/lib/standards/standards-context-injector.js +5 -0
- package/src/lib/validators/nextjs/index.js +6 -0
- package/src/lib/validators/nextjs/next-component-validator.js +181 -0
- package/src/lib/validators/validation-runner.js +5 -0
- package/src/utils/agents-installer.js +14 -2
- package/.morph/.morphversion +0 -5
- package/.morph/analytics/threads-log.jsonl +0 -6
- package/.morph/config/config.json +0 -8
- package/.morph/framework/agents.json +0 -948
- package/.morph/framework/standards/STANDARDS.json +0 -812
- package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/.morph/framework/standards/ai-agents/production.md +0 -415
- package/.morph/framework/standards/ai-agents/setup.md +0 -418
- package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
- package/.morph/framework/standards/ai-agents/workflows.md +0 -354
- package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
- package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
- package/.morph/framework/standards/backend/api/rest.md +0 -492
- package/.morph/framework/standards/backend/api/validation.md +0 -88
- package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
- package/.morph/framework/standards/backend/database/ef-core.md +0 -199
- package/.morph/framework/standards/backend/database/migrations.md +0 -393
- package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
- package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
- package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
- package/.morph/framework/standards/backend/dotnet/async.md +0 -366
- package/.morph/framework/standards/backend/dotnet/core.md +0 -117
- package/.morph/framework/standards/backend/dotnet/di.md +0 -439
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
- package/.morph/framework/standards/context/analytics.md +0 -96
- package/.morph/framework/standards/context/bundles.md +0 -110
- package/.morph/framework/standards/context/priming.md +0 -78
- package/.morph/framework/standards/core/architecture.md +0 -185
- package/.morph/framework/standards/core/coding.md +0 -214
- package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
- package/.morph/framework/standards/core/git.md +0 -185
- package/.morph/framework/standards/core/testing.md +0 -295
- package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
- package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
- package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/.morph/framework/standards/frontend/blazor/state.md +0 -191
- package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
- package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
- package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/.morph/framework/standards/integration/api/graphql.md +0 -91
- package/.morph/framework/standards/integration/api/grpc.md +0 -114
- package/.morph/framework/standards/integration/api/rest-design.md +0 -95
- package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
- package/.morph/framework/standards/observability/logging.md +0 -131
- package/.morph/framework/standards/observability/metrics.md +0 -121
- package/.morph/framework/standards/observability/monitoring.md +0 -114
- package/.morph/framework/standards/observability/tracing.md +0 -132
- package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
- package/.morph/framework/standards/workflows/thread-management.md +0 -113
- package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
- package/.morph/framework/templates/README.md +0 -814
- package/.morph/framework/templates/REGISTRY.json +0 -1492
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
- package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
- package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
- package/.morph/framework/templates/code/dotnet/test.cs +0 -239
- package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
- package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
- package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
- package/.morph/framework/templates/context/CONTEXT.md +0 -181
- package/.morph/framework/templates/docs/clarifications.md +0 -253
- package/.morph/framework/templates/docs/onboarding.md +0 -123
- package/.morph/framework/templates/docs/proposal.md +0 -182
- package/.morph/framework/templates/docs/schema-analysis.md +0 -119
- package/.morph/framework/templates/docs/spec.md +0 -149
- package/.morph/framework/templates/docs/ui-components.md +0 -124
- package/.morph/framework/templates/docs/ui-design-system.md +0 -76
- package/.morph/framework/templates/docs/ui-flows.md +0 -167
- package/.morph/framework/templates/docs/ui-mockups.md +0 -98
- package/.morph/framework/templates/docs/user-stories.md +0 -34
- package/.morph/framework/templates/examples/design-system-examples.md +0 -357
- package/.morph/framework/templates/examples/spec-examples.md +0 -90
- package/.morph/framework/templates/feature/decisions.md +0 -187
- package/.morph/framework/templates/feature/recap.md +0 -146
- package/.morph/framework/templates/feature/tasks.md +0 -199
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
- package/.morph/framework/templates/infrastructure/github/README.md +0 -593
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
- package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
- package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
- package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
- package/.morph/framework/templates/saas/subscription.cs +0 -347
- package/.morph/framework/templates/saas/tenant.cs +0 -338
- package/.morph/framework/templates/state.template.json +0 -17
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/.morph/framework/templates/ui/MudTheme.cs +0 -281
- package/.morph/framework/templates/ui/design-system.css +0 -226
- package/.morph/logs/tool-failures.log +0 -7
- package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
- package/.morph/state.json +0 -48
- package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Level 2: Domains
|
|
2
|
-
|
|
3
|
-
Domain expertise skills organized by squad.
|
|
4
|
-
|
|
5
|
-
**Purpose:** Skills that provide deep domain knowledge (backend, frontend, infra, quality, ai-agents, integrations).
|
|
6
|
-
|
|
7
|
-
**Squads:**
|
|
8
|
-
- backend/ - Backend Squad (led by dotnet-senior)
|
|
9
|
-
- frontend/ - Frontend Squad (led by ui-designer)
|
|
10
|
-
- infrastructure/ - Infrastructure Squad (led by
|
|
11
|
-
- quality/ - Quality Squad (coordinated by standards-architect)
|
|
12
|
-
- ai-agents/ - AI/Agent specialists
|
|
13
|
-
- integrations/ - External integration specialists
|
|
14
|
-
- architecture/ - Architecture and planning
|
|
1
|
+
# Level 2: Domains
|
|
2
|
+
|
|
3
|
+
Domain expertise skills organized by squad.
|
|
4
|
+
|
|
5
|
+
**Purpose:** Skills that provide deep domain knowledge (backend, frontend, infra, quality, ai-agents, integrations).
|
|
6
|
+
|
|
7
|
+
**Squads:**
|
|
8
|
+
- backend/ - Backend Squad (led by dotnet-senior)
|
|
9
|
+
- frontend/ - Frontend Squad (led by ui-designer)
|
|
10
|
+
- infrastructure/ - Infrastructure Squad (led by infra-architect)
|
|
11
|
+
- quality/ - Quality Squad (coordinated by standards-architect)
|
|
12
|
+
- ai-agents/ - AI/Agent specialists
|
|
13
|
+
- integrations/ - External integration specialists
|
|
14
|
+
- architecture/ - Architecture and planning
|
|
@@ -1,160 +1,160 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: standards-architect
|
|
3
|
-
description: Standards Architect (Tier 1 Orchestrator) that enforces MORPH-SPEC naming conventions, coding standards, and cross-cutting compliance across all outputs. Always active in MORPH-SPEC workflows. Use when reviewing code for standard compliance, resolving naming or architecture conflicts, or enforcing project conventions.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Standards Architect
|
|
8
|
-
|
|
9
|
-
Guardiao dos padroes de codigo, nomenclatura e arquitetura. Valida aderencia aos standards antes de aprovar merges.
|
|
10
|
-
|
|
11
|
-
> **Ref:** `framework/standards/core/coding.md` for complete C# naming conventions and .editorconfig template.
|
|
12
|
-
> **Ref:** `framework/standards/core/architecture.md` for Clean Architecture layers, SOLID, service patterns.
|
|
13
|
-
|
|
14
|
-
## Responsabilidades
|
|
15
|
-
|
|
16
|
-
1. **Garantir aderencia aos padroes** definidos em `framework/standards/` e `.morph/context/`
|
|
17
|
-
2. **Validar nomenclatura** contra `coding.md` (PascalCase, _camelCase, etc.)
|
|
18
|
-
3. **Revisar codigo** antes de aprovar merges
|
|
19
|
-
4. **Definir convencoes** de projeto
|
|
20
|
-
5. **Orquestrar validacao:** Standards Architect (naming) -> Code Analyzer (architecture) -> Code Review (runtime patterns)
|
|
21
|
-
|
|
22
|
-
## Triggers
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Keywords: `standards`, `naming`, `convention`, `pattern`, `review`, `quality`, `editorconfig`, `style`
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Naming Quick Reference
|
|
31
|
-
|
|
32
|
-
> Full reference: `framework/standards/coding.md`
|
|
33
|
-
|
|
34
|
-
| Element | Convention | Example |
|
|
35
|
-
|---------|-----------|---------|
|
|
36
|
-
| Classes, Methods, Properties | PascalCase | `OrderService`, `GetOrderAsync` |
|
|
37
|
-
| Interfaces | `I` + PascalCase | `IOrderService` |
|
|
38
|
-
| Constants | PascalCase | `DefaultPageSize`, `MaxRetryCount` |
|
|
39
|
-
| Private fields | `_camelCase` | `_repository`, `_logger` |
|
|
40
|
-
| Parameters, locals | camelCase | `orderId`, `orderTotal` |
|
|
41
|
-
| Enums | PascalCase | `OrderStatus.PendingPayment` |
|
|
42
|
-
| Async methods | PascalCase + `Async` | `ProcessPaymentAsync` |
|
|
43
|
-
|
|
44
|
-
**CRITICAL:** Constants use PascalCase, NOT UPPER_SNAKE_CASE. This follows Microsoft .NET guidelines.
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Instant-Fail Rules (Severity: Error)
|
|
49
|
-
|
|
50
|
-
These rules MUST be satisfied. Code that violates them cannot be merged.
|
|
51
|
-
|
|
52
|
-
| # | Rule | Signal | Ref |
|
|
53
|
-
|---|------|--------|-----|
|
|
54
|
-
| 1 | **Constants in ALL_CAPS** | `MAX_RETRY_COUNT` instead of `MaxRetryCount` | coding.md |
|
|
55
|
-
| 2 | **Hungarian notation** | `strName`, `iCount`, `btnSubmit` | coding.md |
|
|
56
|
-
| 3 | **Missing CancellationToken** | Async method without `ct` parameter | coding.md |
|
|
57
|
-
| 4 | **`.Result` or `.Wait()`** | Synchronous blocking on async (deadlock) | coding.md |
|
|
58
|
-
| 5 | **Scoped DbContext in background** | Direct `DbContext` in Task.Run/Hangfire | blazor-efcore.md |
|
|
59
|
-
| 6 | **Empty catch block** | `catch { }` or `catch (Exception) { }` | coding.md |
|
|
60
|
-
| 7 | **Domain referencing Infrastructure** | `using MyApp.Infrastructure` in Domain project | architecture.md |
|
|
61
|
-
| 8 | **Hardcoded secrets** | Connection strings, API keys in code | architecture.md |
|
|
62
|
-
| 9 | **Missing `sealed`** | Non-abstract class without `sealed` | coding.md |
|
|
63
|
-
| 10 | **Generic `Exception` throw** | `throw new Exception("...")` | coding.md |
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Warning Rules (Severity: Warning)
|
|
68
|
-
|
|
69
|
-
| # | Rule | Signal |
|
|
70
|
-
|---|------|--------|
|
|
71
|
-
| 1 | Method > 30 lines | Needs extraction |
|
|
72
|
-
| 2 | Class > 300 lines | SRP violation, split |
|
|
73
|
-
| 3 | > 4 constructor parameters | Consider grouping or splitting |
|
|
74
|
-
| 4 | Missing structured logging | Service method without `ILogger` usage |
|
|
75
|
-
| 5 | `string.Format` or `$""` in log | Use message templates |
|
|
76
|
-
| 6 | Abbreviations in names | `repo`, `ctx`, `mgr` (use full words) |
|
|
77
|
-
| 7 | Missing `null` check | Parameter not validated at boundary |
|
|
78
|
-
| 8 | Unused `using` | Dead imports |
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## Enforcement
|
|
83
|
-
|
|
84
|
-
### .editorconfig
|
|
85
|
-
|
|
86
|
-
Every project MUST have an `.editorconfig` in the root. Template in `coding.md`.
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
# Validate naming rules at build time
|
|
90
|
-
dotnet build /warnaserror:IDE1006
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Validation Workflow
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
1. Standards Architect → Naming, style, conventions (coding.md)
|
|
97
|
-
2. Code Analyzer → Architecture, clean code, duplication (architecture.md)
|
|
98
|
-
3. Code Review Checklist → Runtime patterns: async, DI, logging (code-review.md)
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
This pipeline runs:
|
|
102
|
-
- **Automatically** at FASE 5 completion and at every checkpoint (every 3 tasks)
|
|
103
|
-
- **Manually** when requested via `review`, `analyze`, `check standards`
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## Estrutura de Projeto
|
|
108
|
-
|
|
109
|
-
> Full reference: `framework/standards/architecture.md`
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
src/
|
|
113
|
-
├── {Project}.Domain/ # Entidades, Value Objects, Enums
|
|
114
|
-
├── {Project}.Application/ # Services, DTOs, Interfaces
|
|
115
|
-
├── {Project}.Infrastructure/ # EF Core, External Services
|
|
116
|
-
├── {Project}.Web/ # Blazor, API Controllers
|
|
117
|
-
└── tests/ # Unit, Integration tests
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Padroes Blazor
|
|
123
|
-
|
|
124
|
-
```razor
|
|
125
|
-
@* Componentes: PascalCase.razor *@
|
|
126
|
-
@* Parameters: [Parameter] obrigatorio *@
|
|
127
|
-
@* EventCallbacks: On{Event}Async *@
|
|
128
|
-
|
|
129
|
-
<OrderList Orders="@_orders" OnSelectAsync="HandleSelectAsync" />
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Documentacao de Referencia
|
|
135
|
-
|
|
136
|
-
- `framework/standards/coding.md` — C# naming, style, .editorconfig
|
|
137
|
-
- `framework/standards/architecture.md` — Clean Architecture, SOLID, DI
|
|
138
|
-
- `framework/standards/blazor-efcore.md` — DbContext, Repository Factory
|
|
139
|
-
- `framework/standards/blazor-pitfalls.md` — Common Blazor issues
|
|
140
|
-
- [Microsoft C# Coding Conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions)
|
|
141
|
-
- [.NET Naming Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines)
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## Checklist de Revisao
|
|
146
|
-
|
|
147
|
-
- [ ] Nomenclatura segue `coding.md` (PascalCase constants, _camelCase fields)
|
|
148
|
-
- [ ] `.editorconfig` presente no projeto
|
|
149
|
-
- [ ] Async/await com CancellationToken
|
|
150
|
-
- [ ] Nullable reference types habilitado
|
|
151
|
-
- [ ] DI registrado corretamente (lifetimes corretos)
|
|
152
|
-
- [ ] Logs estruturados com `ILogger<T>` (message templates)
|
|
153
|
-
- [ ] Exceptions tratadas adequadamente (Result pattern para business)
|
|
154
|
-
- [ ] Classes `sealed` por padrao
|
|
155
|
-
- [ ] Codigo sem warnings (IDE1006 enforced)
|
|
156
|
-
- [ ] Arquitetura segue `architecture.md` (layers, SOLID)
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
1
|
+
---
|
|
2
|
+
name: standards-architect
|
|
3
|
+
description: Standards Architect (Tier 1 Orchestrator) that enforces MORPH-SPEC naming conventions, coding standards, and cross-cutting compliance across all outputs. Always active in MORPH-SPEC workflows. Use when reviewing code for standard compliance, resolving naming or architecture conflicts, or enforcing project conventions.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Standards Architect
|
|
8
|
+
|
|
9
|
+
Guardiao dos padroes de codigo, nomenclatura e arquitetura. Valida aderencia aos standards antes de aprovar merges.
|
|
10
|
+
|
|
11
|
+
> **Ref:** `framework/standards/core/coding.md` for complete C# naming conventions and .editorconfig template.
|
|
12
|
+
> **Ref:** `framework/standards/core/architecture.md` for Clean Architecture layers, SOLID, service patterns.
|
|
13
|
+
|
|
14
|
+
## Responsabilidades
|
|
15
|
+
|
|
16
|
+
1. **Garantir aderencia aos padroes** definidos em `framework/standards/` e `.morph/context/`
|
|
17
|
+
2. **Validar nomenclatura** contra `coding.md` (PascalCase, _camelCase, etc.)
|
|
18
|
+
3. **Revisar codigo** antes de aprovar merges
|
|
19
|
+
4. **Definir convencoes** de projeto
|
|
20
|
+
5. **Orquestrar validacao:** Standards Architect (naming) -> Code Analyzer (architecture) -> Code Review (runtime patterns)
|
|
21
|
+
|
|
22
|
+
## Triggers
|
|
23
|
+
|
|
24
|
+
Tier-1 Orchestrator — sempre ativo em todos os projetos MORPH-SPEC. Coordena os Domain Leaders e valida decisões de arquitetura.
|
|
25
|
+
|
|
26
|
+
Keywords: `standards`, `naming`, `convention`, `pattern`, `review`, `quality`, `editorconfig`, `style`
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Naming Quick Reference
|
|
31
|
+
|
|
32
|
+
> Full reference: `framework/standards/coding.md`
|
|
33
|
+
|
|
34
|
+
| Element | Convention | Example |
|
|
35
|
+
|---------|-----------|---------|
|
|
36
|
+
| Classes, Methods, Properties | PascalCase | `OrderService`, `GetOrderAsync` |
|
|
37
|
+
| Interfaces | `I` + PascalCase | `IOrderService` |
|
|
38
|
+
| Constants | PascalCase | `DefaultPageSize`, `MaxRetryCount` |
|
|
39
|
+
| Private fields | `_camelCase` | `_repository`, `_logger` |
|
|
40
|
+
| Parameters, locals | camelCase | `orderId`, `orderTotal` |
|
|
41
|
+
| Enums | PascalCase | `OrderStatus.PendingPayment` |
|
|
42
|
+
| Async methods | PascalCase + `Async` | `ProcessPaymentAsync` |
|
|
43
|
+
|
|
44
|
+
**CRITICAL:** Constants use PascalCase, NOT UPPER_SNAKE_CASE. This follows Microsoft .NET guidelines.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Instant-Fail Rules (Severity: Error)
|
|
49
|
+
|
|
50
|
+
These rules MUST be satisfied. Code that violates them cannot be merged.
|
|
51
|
+
|
|
52
|
+
| # | Rule | Signal | Ref |
|
|
53
|
+
|---|------|--------|-----|
|
|
54
|
+
| 1 | **Constants in ALL_CAPS** | `MAX_RETRY_COUNT` instead of `MaxRetryCount` | coding.md |
|
|
55
|
+
| 2 | **Hungarian notation** | `strName`, `iCount`, `btnSubmit` | coding.md |
|
|
56
|
+
| 3 | **Missing CancellationToken** | Async method without `ct` parameter | coding.md |
|
|
57
|
+
| 4 | **`.Result` or `.Wait()`** | Synchronous blocking on async (deadlock) | coding.md |
|
|
58
|
+
| 5 | **Scoped DbContext in background** | Direct `DbContext` in Task.Run/Hangfire | blazor-efcore.md |
|
|
59
|
+
| 6 | **Empty catch block** | `catch { }` or `catch (Exception) { }` | coding.md |
|
|
60
|
+
| 7 | **Domain referencing Infrastructure** | `using MyApp.Infrastructure` in Domain project | architecture.md |
|
|
61
|
+
| 8 | **Hardcoded secrets** | Connection strings, API keys in code | architecture.md |
|
|
62
|
+
| 9 | **Missing `sealed`** | Non-abstract class without `sealed` | coding.md |
|
|
63
|
+
| 10 | **Generic `Exception` throw** | `throw new Exception("...")` | coding.md |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Warning Rules (Severity: Warning)
|
|
68
|
+
|
|
69
|
+
| # | Rule | Signal |
|
|
70
|
+
|---|------|--------|
|
|
71
|
+
| 1 | Method > 30 lines | Needs extraction |
|
|
72
|
+
| 2 | Class > 300 lines | SRP violation, split |
|
|
73
|
+
| 3 | > 4 constructor parameters | Consider grouping or splitting |
|
|
74
|
+
| 4 | Missing structured logging | Service method without `ILogger` usage |
|
|
75
|
+
| 5 | `string.Format` or `$""` in log | Use message templates |
|
|
76
|
+
| 6 | Abbreviations in names | `repo`, `ctx`, `mgr` (use full words) |
|
|
77
|
+
| 7 | Missing `null` check | Parameter not validated at boundary |
|
|
78
|
+
| 8 | Unused `using` | Dead imports |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Enforcement
|
|
83
|
+
|
|
84
|
+
### .editorconfig
|
|
85
|
+
|
|
86
|
+
Every project MUST have an `.editorconfig` in the root. Template in `coding.md`.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Validate naming rules at build time
|
|
90
|
+
dotnet build /warnaserror:IDE1006
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Validation Workflow
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
1. Standards Architect → Naming, style, conventions (coding.md)
|
|
97
|
+
2. Code Analyzer → Architecture, clean code, duplication (architecture.md)
|
|
98
|
+
3. Code Review Checklist → Runtime patterns: async, DI, logging (code-review.md)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
This pipeline runs:
|
|
102
|
+
- **Automatically** at FASE 5 completion and at every checkpoint (every 3 tasks)
|
|
103
|
+
- **Manually** when requested via `review`, `analyze`, `check standards`
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Estrutura de Projeto
|
|
108
|
+
|
|
109
|
+
> Full reference: `framework/standards/architecture.md`
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
src/
|
|
113
|
+
├── {Project}.Domain/ # Entidades, Value Objects, Enums
|
|
114
|
+
├── {Project}.Application/ # Services, DTOs, Interfaces
|
|
115
|
+
├── {Project}.Infrastructure/ # EF Core, External Services
|
|
116
|
+
├── {Project}.Web/ # Blazor, API Controllers
|
|
117
|
+
└── tests/ # Unit, Integration tests
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Padroes Blazor
|
|
123
|
+
|
|
124
|
+
```razor
|
|
125
|
+
@* Componentes: PascalCase.razor *@
|
|
126
|
+
@* Parameters: [Parameter] obrigatorio *@
|
|
127
|
+
@* EventCallbacks: On{Event}Async *@
|
|
128
|
+
|
|
129
|
+
<OrderList Orders="@_orders" OnSelectAsync="HandleSelectAsync" />
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Documentacao de Referencia
|
|
135
|
+
|
|
136
|
+
- `framework/standards/coding.md` — C# naming, style, .editorconfig
|
|
137
|
+
- `framework/standards/architecture.md` — Clean Architecture, SOLID, DI
|
|
138
|
+
- `framework/standards/blazor-efcore.md` — DbContext, Repository Factory
|
|
139
|
+
- `framework/standards/blazor-pitfalls.md` — Common Blazor issues
|
|
140
|
+
- [Microsoft C# Coding Conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions)
|
|
141
|
+
- [.NET Naming Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines)
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Checklist de Revisao
|
|
146
|
+
|
|
147
|
+
- [ ] Nomenclatura segue `coding.md` (PascalCase constants, _camelCase fields)
|
|
148
|
+
- [ ] `.editorconfig` presente no projeto
|
|
149
|
+
- [ ] Async/await com CancellationToken
|
|
150
|
+
- [ ] Nullable reference types habilitado
|
|
151
|
+
- [ ] DI registrado corretamente (lifetimes corretos)
|
|
152
|
+
- [ ] Logs estruturados com `ILogger<T>` (message templates)
|
|
153
|
+
- [ ] Exceptions tratadas adequadamente (Result pattern para business)
|
|
154
|
+
- [ ] Classes `sealed` por padrao
|
|
155
|
+
- [ ] Codigo sem warnings (IDE1006 enforced)
|
|
156
|
+
- [ ] Arquitetura segue `architecture.md` (layers, SOLID)
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
160
|
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,158 +1,118 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: nextjs-expert
|
|
3
|
-
description: Next.js
|
|
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
4
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# Next.js Expert
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|--------|------------|
|
|
11
|
-
| **Backend** | .NET 10 Web API / C# 14 |
|
|
12
|
-
| **Frontend** | Next.js 15+ / React 19 |
|
|
13
|
-
| **Database** | EF Core 10 + Azure SQL |
|
|
14
|
-
| **API** | REST + OpenAPI |
|
|
15
|
-
| **Hosting** | Azure Container Apps |
|
|
9
|
+
Specialist for the locked stack: **Next.js App Router + shadcn/ui + TanStack Query + react-hook-form/Zod + EasyPanel/Docker**.
|
|
16
10
|
|
|
17
|
-
##
|
|
11
|
+
## Stack
|
|
18
12
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
│ ├── package.json
|
|
28
|
-
│ └── next.config.js
|
|
29
|
-
├── docker-compose.yml
|
|
30
|
-
└── infra/main.bicep
|
|
31
|
-
```
|
|
13
|
+
| Layer | Technology |
|
|
14
|
+
|-------|-----------|
|
|
15
|
+
| Framework | Next.js App Router (TypeScript strict) |
|
|
16
|
+
| UI Components | shadcn/ui — `npx shadcn@latest add` |
|
|
17
|
+
| Styling | Tailwind CSS |
|
|
18
|
+
| Server state | TanStack Query v5 |
|
|
19
|
+
| Forms | react-hook-form + Zod + zodResolver |
|
|
20
|
+
| Deployment | Docker multi-stage → EasyPanel (VPS) |
|
|
32
21
|
|
|
33
|
-
|
|
22
|
+
## Critical Standards (Read FIRST)
|
|
34
23
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
builder.Services.AddDbContext<AppDbContext>(o => o.UseSqlServer(connString));
|
|
46
|
-
|
|
47
|
-
var app = builder.Build();
|
|
48
|
-
if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); }
|
|
49
|
-
app.UseCors("Frontend");
|
|
50
|
-
app.UseAuthentication();
|
|
51
|
-
app.UseAuthorization();
|
|
52
|
-
app.MapOrderEndpoints();
|
|
53
|
-
app.Run();
|
|
54
|
-
```
|
|
24
|
+
| Standard | What |
|
|
25
|
+
|----------|------|
|
|
26
|
+
| `frontend/nextjs/naming-conventions.md` | **kebab-case files, PascalCase exports, use- hooks** |
|
|
27
|
+
| `frontend/nextjs/project-structure.md` | **Feature-based folders, component tiers** |
|
|
28
|
+
| `frontend/nextjs/app-router.md` | **Server vs Client components decision tree** |
|
|
29
|
+
| `frontend/nextjs/components.md` | **Three-tier hierarchy, never edit components/ui/** |
|
|
30
|
+
| `frontend/nextjs/data-fetching.md` | **TanStack Query patterns, query key factories** |
|
|
31
|
+
| `frontend/nextjs/forms.md` | **react-hook-form + Zod + shadcn Form** |
|
|
32
|
+
| `frontend/nextjs/state-management.md` | **No Zustand by default** |
|
|
33
|
+
| `frontend/nextjs/testing.md` | **Jest + Testing Library + MSW** |
|
|
55
34
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
```csharp
|
|
59
|
-
public static class OrderEndpoints
|
|
60
|
-
{
|
|
61
|
-
public static void MapOrderEndpoints(this WebApplication app)
|
|
62
|
-
{
|
|
63
|
-
var group = app.MapGroup("/api/orders").WithTags("Orders").RequireAuthorization();
|
|
64
|
-
group.MapGet("/", GetAll);
|
|
65
|
-
group.MapGet("/{id:int}", GetById);
|
|
66
|
-
group.MapPost("/", Create);
|
|
67
|
-
group.MapPut("/{id:int}", Update);
|
|
68
|
-
group.MapDelete("/{id:int}", Delete);
|
|
69
|
-
}
|
|
70
|
-
// Each handler: inject IService + params → return Results.Ok/NotFound/Created/NoContent
|
|
71
|
-
}
|
|
72
|
-
```
|
|
35
|
+
## Quick Checklist
|
|
73
36
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
37
|
+
- [ ] File names are kebab-case (`user-card.tsx` not `UserCard.tsx`)
|
|
38
|
+
- [ ] `'use client'` only on components with hooks or event handlers
|
|
39
|
+
- [ ] No `useEffect` for data fetching — use Server Components or TanStack Query
|
|
40
|
+
- [ ] Zod schema defined before TypeScript type (`type X = z.infer<typeof xSchema>`)
|
|
41
|
+
- [ ] Query keys use factory pattern (`userKeys.lists()` not `['users']`)
|
|
42
|
+
- [ ] Forms use `zodResolver` + shadcn `<Form>` + `<FormMessage>`
|
|
43
|
+
- [ ] `components/ui/` files never edited directly
|
|
44
|
+
- [ ] New features go in `features/{name}/components|hooks|types/`
|
|
79
45
|
|
|
80
|
-
|
|
81
|
-
const API_URL = process.env.NEXT_PUBLIC_API_URL!;
|
|
46
|
+
## Naming Conventions (Non-Negotiable)
|
|
82
47
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (!res.ok) throw new Error(`API error: ${res.status}`);
|
|
90
|
-
return res.json();
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export const api = {
|
|
94
|
-
orders: {
|
|
95
|
-
getAll: (params?) => fetchApi<PaginatedResult<Order>>(`/api/orders?${new URLSearchParams(params)}`),
|
|
96
|
-
getById: (id: number) => fetchApi<Order>(`/api/orders/${id}`),
|
|
97
|
-
create: (data) => fetchApi<Order>('/api/orders', { method: 'POST', body: JSON.stringify(data) }),
|
|
98
|
-
},
|
|
99
|
-
};
|
|
48
|
+
```
|
|
49
|
+
Component file: user-card.tsx → export function UserCard()
|
|
50
|
+
Hook file: use-create-user.ts → export function useCreateUser()
|
|
51
|
+
Schema file: user.schemas.ts → export const createUserSchema = z.object(...)
|
|
52
|
+
Type file: user.types.ts → export type User = z.infer<typeof userSchema>
|
|
53
|
+
Feature folder: features/user-mgmt/
|
|
100
54
|
```
|
|
101
55
|
|
|
102
|
-
|
|
56
|
+
## Component Tier Rules
|
|
103
57
|
|
|
104
|
-
```typescript
|
|
105
|
-
export interface Order { id: number; orderNumber: string; total: number; status: OrderStatus; }
|
|
106
|
-
export type OrderStatus = 'Pending' | 'Processing' | 'Completed' | 'Cancelled';
|
|
107
|
-
export interface PaginatedResult<T> { items: T[]; totalCount: number; page: number; totalPages: number; }
|
|
108
58
|
```
|
|
59
|
+
components/ui/ ← shadcn primitives. NEVER edit.
|
|
60
|
+
components/ ← Composed shared components. No API calls. No feature imports.
|
|
61
|
+
features/*/components ← Feature-scoped. May use components/ but not other features/.
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Data Fetching Patterns
|
|
109
65
|
|
|
110
|
-
### Server Component (App Router)
|
|
111
66
|
```tsx
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
67
|
+
// Server Component (initial load)
|
|
68
|
+
export default async function Page() {
|
|
69
|
+
const data = await fetch(`${process.env.API_URL}/api/users`).then(r => r.json());
|
|
70
|
+
return <UserList initialData={data} />;
|
|
115
71
|
}
|
|
116
|
-
```
|
|
117
72
|
|
|
118
|
-
|
|
119
|
-
```tsx
|
|
73
|
+
// Client Component (mutations/interactive)
|
|
120
74
|
'use client';
|
|
121
|
-
|
|
75
|
+
const { data } = useUsers(); // TanStack Query
|
|
76
|
+
const { mutate } = useCreateUser(); // useMutation
|
|
122
77
|
```
|
|
123
78
|
|
|
124
|
-
|
|
79
|
+
## Form Pattern
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
// Schema first, type derived
|
|
83
|
+
const schema = z.object({ name: z.string().min(2) });
|
|
84
|
+
type Input = z.infer<typeof schema>;
|
|
125
85
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
```yaml
|
|
129
|
-
services:
|
|
130
|
-
backend:
|
|
131
|
-
build: { context: ./backend }
|
|
132
|
-
ports: ["5000:8080"]
|
|
133
|
-
environment:
|
|
134
|
-
- ConnectionStrings__Default=Server=db;Database=App;User=sa;Password=Pass!;TrustServerCertificate=true
|
|
135
|
-
- Frontend__Url=http://localhost:3000
|
|
136
|
-
frontend:
|
|
137
|
-
build: { context: ./frontend }
|
|
138
|
-
ports: ["3000:3000"]
|
|
139
|
-
environment: [NEXT_PUBLIC_API_URL=http://localhost:5000]
|
|
140
|
-
db:
|
|
141
|
-
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
142
|
-
environment: [ACCEPT_EULA=Y, SA_PASSWORD=YourStrong!Passw0rd]
|
|
143
|
-
ports: ["1433:1433"]
|
|
86
|
+
// Form wired to schema
|
|
87
|
+
const form = useForm<Input>({ resolver: zodResolver(schema) });
|
|
144
88
|
```
|
|
145
89
|
|
|
146
|
-
##
|
|
147
|
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
90
|
+
## EasyPanel Deployment
|
|
91
|
+
|
|
92
|
+
- Use `framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs` as base
|
|
93
|
+
- Requires `output: 'standalone'` in `next.config.js`
|
|
94
|
+
- `NEXT_PUBLIC_*` vars must be available at **build time** (Docker build args)
|
|
95
|
+
- Server-only vars (API_URL, secrets) go in EasyPanel environment at **runtime**
|
|
96
|
+
|
|
97
|
+
## Project Structure
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
src/
|
|
101
|
+
├── app/ # Routes only
|
|
102
|
+
├── features/{name}/
|
|
103
|
+
│ ├── components/ # Feature UI
|
|
104
|
+
│ ├── hooks/ # TanStack Query hooks
|
|
105
|
+
│ └── types/ # Zod schemas + inferred types
|
|
106
|
+
├── components/
|
|
107
|
+
│ ├── ui/ # shadcn — do not edit
|
|
108
|
+
│ └── {shared}.tsx # Composed shared components
|
|
109
|
+
├── hooks/ # Utility hooks (no API calls)
|
|
110
|
+
├── lib/
|
|
111
|
+
│ ├── api-client.ts
|
|
112
|
+
│ └── query-client.tsx
|
|
113
|
+
└── env.mjs # Zod env validation
|
|
114
|
+
```
|
|
155
115
|
|
|
156
116
|
---
|
|
157
117
|
|
|
158
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
118
|
+
*MORPH-SPEC by Polymorphism Tech*
|