@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.
Files changed (239) hide show
  1. package/README.md +394 -700
  2. package/docs/ARCHITECTURE.md +331 -0
  3. package/docs/CHEATSHEET.md +221 -0
  4. package/docs/COMMAND-FLOWS.md +368 -0
  5. package/docs/QUICKSTART.md +212 -0
  6. package/docs/examples/order-management/contracts.cs +84 -0
  7. package/docs/examples/order-management/proposal.md +24 -0
  8. package/docs/examples/order-management/spec.md +162 -0
  9. package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
  10. package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
  11. package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
  12. package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
  13. package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
  14. package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
  15. package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
  16. package/framework/agents/README.md +14 -14
  17. package/framework/agents/architecture/standards-architect.md +159 -159
  18. package/framework/agents/frontend/nextjs-expert.md +87 -127
  19. package/framework/agents/infrastructure/azure-architect.md +147 -147
  20. package/framework/agents/infrastructure/infra-architect.md +45 -0
  21. package/framework/agents.json +1145 -278
  22. package/framework/rules/frontend-standards.md +0 -3
  23. package/framework/rules/nextjs-standards.md +17 -0
  24. package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
  25. package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
  26. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
  27. package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
  28. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
  29. package/framework/standards/STANDARDS.json +121 -0
  30. package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
  31. package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
  32. package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
  33. package/framework/standards/frontend/nextjs/app-router.md +123 -0
  34. package/framework/standards/frontend/nextjs/components.md +132 -0
  35. package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
  36. package/framework/standards/frontend/nextjs/forms.md +128 -0
  37. package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
  38. package/framework/standards/frontend/nextjs/project-structure.md +102 -0
  39. package/framework/standards/frontend/nextjs/state-management.md +72 -0
  40. package/framework/standards/frontend/nextjs/testing.md +111 -0
  41. package/framework/templates/REGISTRY.json +538 -142
  42. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
  43. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
  44. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
  45. package/framework/templates/docs/spec.md +49 -0
  46. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
  47. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
  48. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
  49. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
  50. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
  51. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
  52. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
  53. package/framework/templates/project-structure/dotnet-ddd.md +70 -0
  54. package/framework/workflows/docs/enforcement-pipeline.md +2 -1
  55. package/package.json +1 -1
  56. package/scripts/scan-nextjs.mjs +169 -0
  57. package/src/commands/project/doctor.js +52 -1
  58. package/src/commands/project/init.js +15 -1
  59. package/src/commands/project/update.js +6 -1
  60. package/src/lib/standards/standards-context-injector.js +5 -0
  61. package/src/lib/validators/nextjs/index.js +6 -0
  62. package/src/lib/validators/nextjs/next-component-validator.js +181 -0
  63. package/src/lib/validators/validation-runner.js +5 -0
  64. package/src/utils/agents-installer.js +14 -2
  65. package/.morph/.morphversion +0 -5
  66. package/.morph/analytics/threads-log.jsonl +0 -6
  67. package/.morph/config/config.json +0 -8
  68. package/.morph/framework/agents.json +0 -948
  69. package/.morph/framework/standards/STANDARDS.json +0 -812
  70. package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
  71. package/.morph/framework/standards/ai-agents/production.md +0 -415
  72. package/.morph/framework/standards/ai-agents/setup.md +0 -418
  73. package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
  74. package/.morph/framework/standards/ai-agents/workflows.md +0 -354
  75. package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
  76. package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
  77. package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
  78. package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
  79. package/.morph/framework/standards/backend/api/rest.md +0 -492
  80. package/.morph/framework/standards/backend/api/validation.md +0 -88
  81. package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
  82. package/.morph/framework/standards/backend/database/ef-core.md +0 -199
  83. package/.morph/framework/standards/backend/database/migrations.md +0 -393
  84. package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
  85. package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
  86. package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
  87. package/.morph/framework/standards/backend/dotnet/async.md +0 -366
  88. package/.morph/framework/standards/backend/dotnet/core.md +0 -117
  89. package/.morph/framework/standards/backend/dotnet/di.md +0 -439
  90. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  91. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
  92. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  93. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  94. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
  95. package/.morph/framework/standards/context/analytics.md +0 -96
  96. package/.morph/framework/standards/context/bundles.md +0 -110
  97. package/.morph/framework/standards/context/priming.md +0 -78
  98. package/.morph/framework/standards/core/architecture.md +0 -185
  99. package/.morph/framework/standards/core/coding.md +0 -214
  100. package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
  101. package/.morph/framework/standards/core/git.md +0 -185
  102. package/.morph/framework/standards/core/testing.md +0 -295
  103. package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
  104. package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
  105. package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
  106. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  107. package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
  108. package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
  109. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  110. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  111. package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
  112. package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
  113. package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
  114. package/.morph/framework/standards/frontend/blazor/state.md +0 -191
  115. package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
  116. package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
  117. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
  118. package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
  119. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  120. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  121. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  122. package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
  123. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  124. package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
  125. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  126. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
  127. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
  128. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  129. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
  130. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
  131. package/.morph/framework/standards/integration/api/graphql.md +0 -91
  132. package/.morph/framework/standards/integration/api/grpc.md +0 -114
  133. package/.morph/framework/standards/integration/api/rest-design.md +0 -95
  134. package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
  135. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  136. package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
  137. package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
  138. package/.morph/framework/standards/observability/logging.md +0 -131
  139. package/.morph/framework/standards/observability/metrics.md +0 -121
  140. package/.morph/framework/standards/observability/monitoring.md +0 -114
  141. package/.morph/framework/standards/observability/tracing.md +0 -132
  142. package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
  143. package/.morph/framework/standards/workflows/thread-management.md +0 -113
  144. package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
  145. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  146. package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
  147. package/.morph/framework/templates/README.md +0 -814
  148. package/.morph/framework/templates/REGISTRY.json +0 -1492
  149. package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
  150. package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
  151. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  152. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  153. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  154. package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
  155. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  156. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  157. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
  158. package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
  159. package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
  160. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
  161. package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
  162. package/.morph/framework/templates/code/dotnet/test.cs +0 -239
  163. package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
  164. package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
  165. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
  166. package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
  167. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
  168. package/.morph/framework/templates/context/CONTEXT.md +0 -181
  169. package/.morph/framework/templates/docs/clarifications.md +0 -253
  170. package/.morph/framework/templates/docs/onboarding.md +0 -123
  171. package/.morph/framework/templates/docs/proposal.md +0 -182
  172. package/.morph/framework/templates/docs/schema-analysis.md +0 -119
  173. package/.morph/framework/templates/docs/spec.md +0 -149
  174. package/.morph/framework/templates/docs/ui-components.md +0 -124
  175. package/.morph/framework/templates/docs/ui-design-system.md +0 -76
  176. package/.morph/framework/templates/docs/ui-flows.md +0 -167
  177. package/.morph/framework/templates/docs/ui-mockups.md +0 -98
  178. package/.morph/framework/templates/docs/user-stories.md +0 -34
  179. package/.morph/framework/templates/examples/design-system-examples.md +0 -357
  180. package/.morph/framework/templates/examples/spec-examples.md +0 -90
  181. package/.morph/framework/templates/feature/decisions.md +0 -187
  182. package/.morph/framework/templates/feature/recap.md +0 -146
  183. package/.morph/framework/templates/feature/tasks.md +0 -199
  184. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  185. package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
  186. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  187. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  188. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  189. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  190. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  191. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  192. package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
  193. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  194. package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
  195. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  196. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  197. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  198. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  199. package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
  200. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
  201. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
  202. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
  203. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
  204. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
  205. package/.morph/framework/templates/infrastructure/github/README.md +0 -593
  206. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  207. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
  208. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
  209. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  210. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
  211. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
  212. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
  213. package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
  214. package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
  215. package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
  216. package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
  217. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
  218. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
  219. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  220. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  221. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  222. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  223. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  224. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
  225. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
  226. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
  227. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
  228. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
  229. package/.morph/framework/templates/saas/subscription.cs +0 -347
  230. package/.morph/framework/templates/saas/tenant.cs +0 -338
  231. package/.morph/framework/templates/state.template.json +0 -17
  232. package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
  233. package/.morph/framework/templates/ui/MudTheme.cs +0 -281
  234. package/.morph/framework/templates/ui/design-system.css +0 -226
  235. package/.morph/logs/tool-failures.log +0 -7
  236. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
  237. package/.morph/state.json +0 -48
  238. package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  239. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
@@ -0,0 +1,437 @@
1
+ # infra-architect Refactor Implementation Plan
2
+
3
+ > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
4
+
5
+ **Goal:** Introduce a cloud-agnostic `infra-architect` tier-2 squad leader, demote `azure-architect` to tier-3 specialist, and update all references so non-Azure projects aren't burdened with an always-active Azure agent.
6
+
7
+ **Architecture:** Add a new `infra-architect` agent (tier 2, always_active: true) that owns infrastructure coordination regardless of cloud provider. `azure-architect` becomes a tier-3 specialist under it (always_active: false), activated only when Azure infra work is needed. `bicep-architect` stays tier-3 (already always_active: false... wait, it IS true — fix that too).
8
+
9
+ **Tech Stack:** Node.js/ESM, `framework/agents.json`, `.claude/agents/`, `src/lib/standards/standards-context-injector.js`, `test/utils/agents-installer.test.js`
10
+
11
+ ---
12
+
13
+ ## Scope Summary
14
+
15
+ | File | Action |
16
+ |------|--------|
17
+ | `framework/agents.json` | Add `infra-architect` (tier-2), demote `azure-architect` (tier-3), fix `bicep-architect` always_active, update refs, update counts |
18
+ | `framework/agents/infrastructure/infra-architect.md` | CREATE cloud-agnostic squad leader spec |
19
+ | `framework/agents/infrastructure/azure-architect.md` | Remove "always active Core Agent" trigger text |
20
+ | `framework/agents/README.md` | Update squad leader reference |
21
+ | `.claude/agents/morph-azure-architect.md` | DELETE (no longer tier-2, installAgents won't generate it) |
22
+ | `.claude/agents/morph-infra-architect.md` | CREATE new squad leader agent file |
23
+ | `src/lib/standards/standards-context-injector.js` | Add `infra-architect` entry, keep `azure-architect` entry |
24
+ | `test/utils/agents-installer.test.js` | Replace `morph-azure-architect.md` check → `morph-infra-architect.md` |
25
+
26
+ ---
27
+
28
+ ### Task 1: Update `framework/agents.json` — add infra-architect, demote azure-architect
29
+
30
+ **Files:**
31
+ - Modify: `framework/agents.json`
32
+
33
+ **Step 1: Add the `infra-architect` agent entry in the tier-2 section (after `dotnet-senior`, before `azure-architect` current slot)**
34
+
35
+ Insert before the `"azure-architect"` key:
36
+
37
+ ```json
38
+ "infra-architect": {
39
+ "tier": 2,
40
+ "role": "domain-leader",
41
+ "title": "Infrastructure Squad Leader",
42
+ "domains": ["infrastructure"],
43
+ "keywords": ["infrastructure", "infra", "cloud", "deployment", "hosting", "ci/cd", "container", "iac", "pipeline"],
44
+ "always_active": true,
45
+ "validators": ["architecture"],
46
+ "relationships": {
47
+ "reports_to": "standards-architect",
48
+ "coordinates": ["azure-architect", "bicep-architect", "devops-engineer", "container-specialist", "observability-expert", "azure-identity"],
49
+ "escalates_to": "standards-architect",
50
+ "collaborates_with": ["dotnet-senior", "ui-designer"],
51
+ "team_role": "domain_leader"
52
+ },
53
+ "standards": ["core/coding.md", "core/architecture.md"],
54
+ "teammate": {
55
+ "role": "Infrastructure Squad Leader",
56
+ "icon": "🏗️",
57
+ "spawn_prompt": "You are the Infrastructure Squad Leader. Coordinate infra specialists regardless of cloud provider (azure-architect, devops-engineer, container-specialist, observability-expert). Focus on IaC, CI/CD, containerization, cost optimization. Delegate to azure-architect for Azure-specific work. Escalate to standards-architect on conflicts."
58
+ }
59
+ },
60
+ ```
61
+
62
+ **Step 2: Demote `azure-architect` from tier-2 to tier-3**
63
+
64
+ In the `azure-architect` entry change:
65
+ - `"tier": 2` → `"tier": 3`
66
+ - `"role": "domain-leader"` → `"role": "specialist"`
67
+ - `"always_active": true` → `"always_active": false`
68
+ - `"relationships.reports_to": "standards-architect"` → `"infra-architect"`
69
+ - `"relationships.escalates_to": "standards-architect"` → `"infra-architect"`
70
+ - Remove `"collaborates_with": ["dotnet-senior", "blazor-builder", "nextjs-expert"]` (now a specialist, not a leader)
71
+ - Remove `"team_role": "domain_leader"` → `"team_role": "specialist"`
72
+ - Add `"collaborates_with": ["bicep-architect", "devops-engineer", "container-specialist"]`
73
+
74
+ **Step 3: Fix `bicep-architect` — set `always_active: false`**
75
+
76
+ `bicep-architect` is currently `always_active: true`, which is wrong (it's Azure Bicep-specific). Change to `false`.
77
+
78
+ **Step 4: Update tier counts and cross-references**
79
+
80
+ - `"total_agents": 37` → `38` (infra-architect is new)
81
+ - `"tier_2_leaders": 3` stays at `3` (azure-architect leaves, infra-architect joins — net zero)
82
+ - `"tier_3_specialists": 26` → `27` (azure-architect joins tier-3)
83
+ - `standards-architect.relationships.coordinates`: replace `"azure-architect"` → `"infra-architect"`
84
+ - `dotnet-senior.relationships.collaborates_with`: replace `"azure-architect"` → `"infra-architect"`
85
+ - `event-architect.relationships.collaborates_with`: replace `"azure-architect"` → `"infra-architect"`
86
+ - `nosql-cache-expert.relationships.collaborates_with`: check and replace `"azure-architect"` → `"infra-architect"` if present
87
+ - `blazor-builder.relationships.collaborates_with`: replace `"azure-architect"` → `"infra-architect"` if present
88
+ - `nextjs-expert.relationships.collaborates_with`: replace `"azure-architect"` → `"infra-architect"` if present
89
+ - `hangfire-orchestrator.relationships.collaborates_with`: replace `"azure-architect"` → `"infra-architect"` if present
90
+ - `devops-engineer`, `container-specialist`, `observability-expert`, `azure-identity`: change `reports_to`/`escalates_to` from `"azure-architect"` → stays as `"azure-architect"` IF they are Azure-specific; OR change to `"infra-architect"` since the squad leader is now `infra-architect`
91
+ - Decision: `devops-engineer`, `container-specialist`, `observability-expert`, `azure-identity` are still sub-specialties that `azure-architect` may coordinate. But the squad leader is `infra-architect`. Change their `reports_to`/`escalates_to` → `"infra-architect"`.
92
+ - `bicep-architect` stays `reports_to: "azure-architect"` (Bicep is Azure-specific, azure-architect coordinates it)
93
+
94
+ **Step 5: Validate JSON is well-formed**
95
+
96
+ Run: `node -e "JSON.parse(require('fs').readFileSync('framework/agents.json','utf8')); console.log('OK')"`
97
+ Expected: `OK`
98
+
99
+ **Step 6: Verify counts**
100
+
101
+ Run: `node -e "const d=JSON.parse(require('fs').readFileSync('framework/agents.json','utf8')); const agents=Object.entries(d.agents).filter(([k])=>!k.startsWith('_comment')); const t2=agents.filter(([,v])=>v.tier===2); const t3=agents.filter(([,v])=>v.tier===3); console.log('total',agents.length,'t2',t2.length,'t3',t3.length,'always_active',agents.filter(([,v])=>v.always_active).map(([k])=>k).join(','));"`
102
+
103
+ Expected: `total 38 t2 3 t3 27 always_active standards-architect,dotnet-senior,infra-architect,...` (azure-architect and bicep-architect should NOT be in the always_active list)
104
+
105
+ **Step 7: Commit**
106
+
107
+ ```bash
108
+ git add framework/agents.json
109
+ git commit -m "refactor(agents): introduce infra-architect tier-2 squad leader, demote azure-architect to tier-3 specialist"
110
+ ```
111
+
112
+ ---
113
+
114
+ ### Task 2: Create `framework/agents/infrastructure/infra-architect.md`
115
+
116
+ **Files:**
117
+ - Create: `framework/agents/infrastructure/infra-architect.md`
118
+
119
+ **Step 1: Write the new agent spec file**
120
+
121
+ ```markdown
122
+ ---
123
+ name: infra-architect
124
+ description: Infrastructure Squad Leader for cloud-agnostic infrastructure coordination. Use when planning deployments, provisioning any cloud resources, setting up CI/CD pipelines, containerizing applications, or designing infrastructure architecture regardless of cloud provider.
125
+ allowed-tools: Read, Write, Edit, Bash, Glob, Grep
126
+ ---
127
+
128
+ # Infrastructure Squad Leader
129
+
130
+ Cloud-agnostic infrastructure coordinator. Delegates to cloud-specific specialists.
131
+
132
+ ## Responsabilidades
133
+
134
+ 1. **Coordenar especialistas de infra** (azure-architect, devops-engineer, container-specialist, observability-expert)
135
+ 2. **Decidir stack de infra** com base no config do projeto (cloud: azure | aws | gcp | self-hosted)
136
+ 3. **Garantir IaC** — tudo via código, nada manual
137
+ 4. **CI/CD** — pipelines para todos os ambientes
138
+
139
+ ## Quando ativar sub-especialistas
140
+
141
+ | Cenário | Especialista |
142
+ |---------|-------------|
143
+ | Deploy em Azure | azure-architect |
144
+ | Templates Bicep | bicep-architect (via azure-architect) |
145
+ | Pipelines CI/CD | devops-engineer |
146
+ | Docker / containers | container-specialist |
147
+ | Logs / métricas | observability-expert |
148
+ | Auth Microsoft/Entra | azure-identity |
149
+
150
+ ## Princípio: Infrastructure as Code
151
+
152
+ > Nunca criar recursos de infra manualmente. Toda infra via código (Bicep, Terraform, Pulumi, Compose).
153
+
154
+ ## Checklist de Infra
155
+
156
+ - [ ] Cloud provider definido em config.json
157
+ - [ ] IaC templates criados e validados
158
+ - [ ] Ambientes dev/staging/prod separados
159
+ - [ ] Secrets nunca hardcoded
160
+ - [ ] CI/CD pipeline configurado
161
+ - [ ] Observability básica (logs + métricas)
162
+ - [ ] Estimativa de custos documentada
163
+
164
+ ---
165
+
166
+ *MORPH-SPEC by Polymorphism Tech*
167
+ ```
168
+
169
+ **Step 2: Commit**
170
+
171
+ ```bash
172
+ git add framework/agents/infrastructure/infra-architect.md
173
+ git commit -m "feat(agents): add infra-architect cloud-agnostic squad leader spec"
174
+ ```
175
+
176
+ ---
177
+
178
+ ### Task 3: Update `framework/agents/infrastructure/azure-architect.md`
179
+
180
+ **Files:**
181
+ - Modify: `framework/agents/infrastructure/azure-architect.md`
182
+
183
+ **Step 1: Remove "always active" claim from Triggers section**
184
+
185
+ Find and replace:
186
+ ```
187
+ ## Triggers
188
+
189
+ Ativado automaticamente em todo projeto MORPH-SPEC (Core Agent).
190
+ ```
191
+
192
+ ```
193
+ ## Triggers
194
+
195
+ Ativado quando o projeto usa Azure como provedor de cloud. Coordenado pelo `infra-architect`.
196
+ ```
197
+
198
+ **Step 2: Verify the file looks correct**
199
+
200
+ Read the file and confirm the Triggers section no longer claims it's always-on.
201
+
202
+ **Step 3: Commit**
203
+
204
+ ```bash
205
+ git add framework/agents/infrastructure/azure-architect.md
206
+ git commit -m "fix(agents): azure-architect is no longer always-active, ativado apenas em projetos Azure"
207
+ ```
208
+
209
+ ---
210
+
211
+ ### Task 4: Update `framework/agents/README.md`
212
+
213
+ **Files:**
214
+ - Modify: `framework/agents/README.md`
215
+
216
+ **Step 1: Update squad leader reference**
217
+
218
+ Change:
219
+ ```
220
+ - infrastructure/ - Infrastructure Squad (led by azure-architect)
221
+ ```
222
+
223
+ ```
224
+ - infrastructure/ - Infrastructure Squad (led by infra-architect)
225
+ ```
226
+
227
+ **Step 2: Commit**
228
+
229
+ ```bash
230
+ git add framework/agents/README.md
231
+ git commit -m "docs(agents): update infra squad leader reference to infra-architect"
232
+ ```
233
+
234
+ ---
235
+
236
+ ### Task 5: Update `.claude/agents/` installed agent files
237
+
238
+ **Files:**
239
+ - Delete: `.claude/agents/morph-azure-architect.md`
240
+ - Create: `.claude/agents/morph-infra-architect.md`
241
+
242
+ **Step 1: Delete the old tier-2 azure-architect agent file**
243
+
244
+ `azure-architect` is no longer tier-2, so `installAgents()` won't generate `morph-azure-architect.md`. Delete the stale file.
245
+
246
+ ```bash
247
+ rm ".claude/agents/morph-azure-architect.md"
248
+ ```
249
+
250
+ **Step 2: Create the new infra-architect agent file**
251
+
252
+ ```markdown
253
+ ---
254
+ name: Infrastructure Squad Leader
255
+ description: Infrastructure Squad Leader
256
+ model: inherit
257
+ tools: Read, Grep, Glob, Bash
258
+ maxTurns: 20
259
+ skills:
260
+ - morph-checklist
261
+ memory: local
262
+ ---
263
+
264
+ You are the Infrastructure Squad Leader. Coordinate infra specialists regardless of cloud provider (azure-architect, devops-engineer, container-specialist, observability-expert). Focus on IaC, CI/CD, containerization, and cost optimization. Delegate to azure-architect for Azure-specific work. Escalate to standards-architect on conflicts.
265
+
266
+ ## Standards to Reference
267
+ - core/coding.md
268
+ - core/architecture.md
269
+ ```
270
+
271
+ **Step 3: Verify the correct files exist**
272
+
273
+ Run: `ls ".claude/agents/" | grep -E "morph-(infra|azure)" `
274
+ Expected: `morph-domain-azure-architect.md`, `morph-infra-architect.md` — no `morph-azure-architect.md`
275
+
276
+ **Step 4: Commit**
277
+
278
+ ```bash
279
+ git add ".claude/agents/morph-infra-architect.md"
280
+ git rm ".claude/agents/morph-azure-architect.md"
281
+ git commit -m "fix(agents): replace morph-azure-architect with morph-infra-architect as tier-2 squad leader"
282
+ ```
283
+
284
+ ---
285
+
286
+ ### Task 6: Update `src/lib/standards/standards-context-injector.js`
287
+
288
+ **Files:**
289
+ - Modify: `src/lib/standards/standards-context-injector.js:47`
290
+
291
+ **Step 1: Add `infra-architect` entry and rename existing entry**
292
+
293
+ The current entry at line 47:
294
+ ```js
295
+ 'azure-architect': [
296
+ 'infrastructure/azure/azure', // Stack-specific
297
+ 'core/architecture',
298
+ 'backend/dotnet/core'
299
+ ],
300
+ ```
301
+
302
+ **After** the `ui-designer` entry (end of tier-2 section), add:
303
+ ```js
304
+ 'infra-architect': [
305
+ 'core/architecture',
306
+ 'core/coding'
307
+ ],
308
+ ```
309
+
310
+ Keep the existing `'azure-architect'` entry as-is (it's now a tier-3 specialist entry, still valid).
311
+
312
+ **Step 2: Add a comment clarifying the section**
313
+
314
+ Above `'azure-architect'`: add `// Tier 3: Specialists - Infrastructure Squad`
315
+
316
+ **Step 3: Verify no syntax errors**
317
+
318
+ Run: `node -e "require('./src/lib/standards/standards-context-injector.js'); console.log('OK')"`
319
+ Expected: `OK`
320
+
321
+ **Step 4: Commit**
322
+
323
+ ```bash
324
+ git add src/lib/standards/standards-context-injector.js
325
+ git commit -m "feat(standards): add infra-architect to standards context injector"
326
+ ```
327
+
328
+ ---
329
+
330
+ ### Task 7: Update `test/utils/agents-installer.test.js`
331
+
332
+ **Files:**
333
+ - Modify: `test/utils/agents-installer.test.js`
334
+
335
+ **Step 1: Find and update the tier-2 file check**
336
+
337
+ Current (around line 101-105):
338
+ ```js
339
+ // Find a tier-2 file (dotnet-senior, azure-architect, or ui-designer)
340
+ ...
341
+ f === 'morph-azure-architect.md' ||
342
+ ```
343
+
344
+ Change `morph-azure-architect.md` → `morph-infra-architect.md`
345
+
346
+ **Step 2: Run the test suite to verify**
347
+
348
+ Run: `node --test test/utils/agents-installer.test.js`
349
+ Expected: All tests pass (no failures)
350
+
351
+ **Step 3: Run the full test suite**
352
+
353
+ Run: `npm test`
354
+ Expected: Same pass count as before (or +0 failures)
355
+
356
+ **Step 4: Commit**
357
+
358
+ ```bash
359
+ git add test/utils/agents-installer.test.js
360
+ git commit -m "test(agents-installer): update tier-2 file check to morph-infra-architect"
361
+ ```
362
+
363
+ ---
364
+
365
+ ### Task 8: Update agents-installer.js to regenerate correctly
366
+
367
+ **Files:**
368
+ - Modify: `src/utils/agents-installer.js` (only if the installer hardcodes azure-architect anywhere)
369
+
370
+ **Step 1: Check for hardcoded references**
371
+
372
+ Run: `grep -n "azure-architect\|infra-architect" src/utils/agents-installer.js`
373
+
374
+ If only data-driven (reads from agents.json) — no changes needed.
375
+ If hardcoded references exist — update them to use `infra-architect`.
376
+
377
+ **Step 2: Verify installAgents() generates the right files by dry-running**
378
+
379
+ Run: `node -e "
380
+ const {installAgents} = require('./src/utils/agents-installer.js');
381
+ const path = require('path');
382
+ const os = require('os');
383
+ const tmp = require('fs').mkdtempSync(path.join(os.tmpdir(), 'morph-test-'));
384
+ installAgents(process.cwd(), tmp).then(r => { console.log(r.installed); require('fs').rmdirSync(tmp, {recursive:true}); });
385
+ "`
386
+ Expected: Output includes `morph-infra-architect` but NOT `morph-azure-architect` in the tier-1/2 installed list.
387
+
388
+ **Step 3: Commit if changes were needed**
389
+
390
+ ```bash
391
+ git add src/utils/agents-installer.js
392
+ git commit -m "fix(agents-installer): update hardcoded azure-architect references if present"
393
+ ```
394
+
395
+ ---
396
+
397
+ ### Task 9: Final verification
398
+
399
+ **Step 1: Run the full test suite**
400
+
401
+ Run: `npm test`
402
+ Expected: All previously passing tests still pass. No new failures.
403
+
404
+ **Step 2: Verify always_active agents are correct**
405
+
406
+ Run: `node -e "
407
+ const d = JSON.parse(require('fs').readFileSync('framework/agents.json', 'utf8'));
408
+ const always = Object.entries(d.agents)
409
+ .filter(([k, v]) => !k.startsWith('_comment') && v.always_active)
410
+ .map(([k, v]) => k + ' (tier ' + v.tier + ')');
411
+ console.log('Always active:', always.join(', '));
412
+ "`
413
+ Expected: `infra-architect` is listed, `azure-architect` and `bicep-architect` are NOT listed.
414
+
415
+ **Step 3: Final commit (version bump if needed)**
416
+
417
+ The change is a `refactor` — no version bump required unless maintainer decides otherwise.
418
+
419
+ ```bash
420
+ git log --oneline -8
421
+ ```
422
+
423
+ ---
424
+
425
+ ## Files Changed Summary
426
+
427
+ | File | Type |
428
+ |------|------|
429
+ | `framework/agents.json` | Modified |
430
+ | `framework/agents/infrastructure/infra-architect.md` | Created |
431
+ | `framework/agents/infrastructure/azure-architect.md` | Modified |
432
+ | `framework/agents/README.md` | Modified |
433
+ | `.claude/agents/morph-azure-architect.md` | Deleted |
434
+ | `.claude/agents/morph-infra-architect.md` | Created |
435
+ | `src/lib/standards/standards-context-injector.js` | Modified |
436
+ | `test/utils/agents-installer.test.js` | Modified |
437
+ | `src/utils/agents-installer.js` | Modified only if hardcoded refs found |
@@ -0,0 +1,156 @@
1
+ # Next.js Code Review & Scan — Design Doc
2
+
3
+ > **Date:** 2026-02-23
4
+ > **Status:** Approved
5
+ > **Approach:** Approach 1 — Trio completo (wire + scan script + skill)
6
+
7
+ ---
8
+
9
+ ## Problem
10
+
11
+ The MORPH-SPEC framework has a two-layer validation architecture for .NET/Blazor (programmatic validators + `code-review` skill) but Next.js is severely under-covered:
12
+
13
+ - `nextjs-expert.validators = ["packages"]` — only 1 validator; blazor-builder has 6
14
+ - `next-component-validator.js` was created but **never wired** into agents.json
15
+ - No `code-review-nextjs` skill exists
16
+ - `scripts/scan-csharp.mjs` referenced in `code-review` skill but doesn't exist
17
+ - The `scan-nextjs.mjs` would be the **first scan script** in the framework
18
+
19
+ ## Design
20
+
21
+ ### Three layers (full parity with intended .NET design)
22
+
23
+ ```
24
+ Layer 1 (auto) agents.json → validation-runner.js → validators/*.js
25
+ Layer 2 (CLI) scripts/scan-nextjs.mjs → validateNextComponent() + additional checks
26
+ Layer 3 (LLM) code-review-nextjs skill → scan script first, then manual checklist
27
+ ```
28
+
29
+ ---
30
+
31
+ ## Layer 1: Wire `nextjs-component` validator
32
+
33
+ **Change:** `agents.json` — `nextjs-expert.validators`
34
+
35
+ ```json
36
+ // Before
37
+ "validators": ["packages"]
38
+
39
+ // After
40
+ "validators": ["packages", "nextjs-component"]
41
+ ```
42
+
43
+ **Also register** the validator key in `validation-runner.js`'s validator registry so `nextjs-component` maps to `next-component-validator.js`.
44
+
45
+ ---
46
+
47
+ ## Layer 2: `scripts/scan-nextjs.mjs`
48
+
49
+ CLI scan script for CRITICAL/HIGH violation detection before manual review.
50
+
51
+ **Interface:**
52
+ ```bash
53
+ node scripts/scan-nextjs.mjs [path] # defaults to src/
54
+ node scripts/scan-nextjs.mjs src/features/ # specific dir
55
+ node scripts/scan-nextjs.mjs --json # JSON output for CI
56
+ ```
57
+
58
+ **What it checks (delegates to `validateNextComponent` + adds):**
59
+ 1. `'use client'` without interactivity (warning → HIGH)
60
+ 2. React hooks without `'use client'` (error → CRITICAL)
61
+ 3. PascalCase `.tsx` file names (warning → HIGH)
62
+ 4. `useEffect` used for data fetching (`useEffect(() => { fetch(...)` pattern) → CRITICAL
63
+ 5. Default exports on non-special files (should use named exports) → MEDIUM
64
+ 6. Deep path imports instead of feature index (`from '@/features/users/components/x'` instead of `from '@/features/users'`) → MEDIUM
65
+
66
+ **Output format** (mirrors intended `scan-csharp.mjs` style):
67
+ ```
68
+ 🔍 Scanning src/ (42 files)...
69
+
70
+ CRITICAL (1)
71
+ components/UserCard.tsx:1 — React hooks used (useState) without 'use client'
72
+
73
+ HIGH (2)
74
+ components/UserList.tsx — 'use client' with no interactivity detected
75
+ components/UserCard.tsx — PascalCase filename (should be user-card.tsx)
76
+
77
+ ✅ No issues found in 39 files
78
+
79
+ Summary: 42 files scanned | 3 issues (1 critical, 2 high, 0 medium)
80
+ Exit code: 1 (errors found)
81
+ ```
82
+
83
+ **Exit codes:** `0` = clean, `1` = errors, `2` = scan failed
84
+
85
+ ---
86
+
87
+ ## Layer 3: `code-review-nextjs` skill
88
+
89
+ Skill file: `framework/skills/level-0-meta/code-review-nextjs/SKILL.md`
90
+ Reference: `framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md`
91
+
92
+ **Structure mirrors `code-review.md`:**
93
+
94
+ 1. Run scan script first (automated CRITICAL/HIGH)
95
+ 2. Naming & Style checklist (8 standards ref)
96
+ 3. Component Architecture checklist (tier violations, use client discipline)
97
+ 4. Data Fetching checklist (TanStack Query v5, no useEffect fetch)
98
+ 5. Forms checklist (zodResolver, schema-first, shadcn Form)
99
+ 6. State Management checklist (no unnecessary Zustand/Context for server state)
100
+ 7. TypeScript checklist (no `any`, z.infer<> usage)
101
+ 8. Structure checklist (feature boundary rules, index imports)
102
+ 9. Testing checklist (userEvent over fireEvent, MSW over mock fetch)
103
+ 10. Quick Pre-Merge Checklist
104
+
105
+ **Severity levels:**
106
+ - `[CRITICAL]` — breaks app or violates core Next.js rules
107
+ - `[HIGH]` — significant pattern violation, reviewer must fix before merge
108
+ - `[MEDIUM]` — best practice violation, should fix
109
+ - `[LOW]` — style/consistency, nice to fix
110
+
111
+ ---
112
+
113
+ ## Testing Strategy
114
+
115
+ **End-to-end tests using real temp directory user cases** (not mocks):
116
+
117
+ ### Test cases for `scan-nextjs.mjs`:
118
+ 1. **Clean project** — a `src/` with properly written components → 0 issues, exit 0
119
+ 2. **Component with `useState` but no `'use client'`** → CRITICAL finding
120
+ 3. **Unnecessary `'use client'`** on static component → HIGH finding
121
+ 4. **PascalCase filename** `UserCard.tsx` → HIGH finding
122
+ 5. **`useEffect` for fetch** → CRITICAL finding
123
+ 6. **Mixed project** — some clean, some violations → correct counts, exit 1
124
+ 7. **`--json` flag** → valid JSON output with `{ files, issues, exitCode }`
125
+ 8. **Empty directory** → 0 files, exit 0
126
+ 9. **Non-existent path** → graceful error, exit 2
127
+
128
+ ### Test cases for validation-runner wiring:
129
+ 10. **Feature with `nextjs-expert` active** → `nextjs-component` validator runs
130
+ 11. **Feature without `nextjs-expert` active** → `nextjs-component` validator doesn't run
131
+
132
+ ---
133
+
134
+ ## Artifacts
135
+
136
+ | File | Type | Notes |
137
+ |------|------|-------|
138
+ | `framework/agents.json` | Modified | Add `nextjs-component` to validators |
139
+ | `src/lib/validators/validation-runner.js` | Modified | Register `nextjs-component` key |
140
+ | `scripts/scan-nextjs.mjs` | New | CLI scan script |
141
+ | `test/scripts/scan-nextjs.test.mjs` | New | E2E tests with real temp dirs |
142
+ | `framework/skills/level-0-meta/code-review-nextjs/SKILL.md` | New | Code review skill |
143
+ | `framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md` | New | Filled review example |
144
+ | `.claude/skills/code-review-nextjs.md` | Installed | Via installSkills() |
145
+
146
+ ---
147
+
148
+ ## Out of Scope
149
+
150
+ - `scan-csharp.mjs` — exists conceptually, not implemented. Follow-up task.
151
+ - AST-based analysis — regex is sufficient for the current check set
152
+ - IDE integration — out of scope for this iteration
153
+
154
+ ---
155
+
156
+ *MORPH-SPEC by Polymorphism Tech*