@polymorphism-tech/morph-spec 4.7.2 → 4.8.1

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 (346) hide show
  1. package/.morph/analytics/threads-log.jsonl +54 -5
  2. package/.morph/state.json +152 -2
  3. package/LICENSE +1 -2
  4. package/README.md +379 -414
  5. package/bin/morph-spec.js +57 -394
  6. package/bin/validate.js +2 -26
  7. package/claude-plugin.json +2 -2
  8. package/docs/ARCHITECTURE.md +43 -46
  9. package/docs/CHEATSHEET.md +203 -221
  10. package/docs/COMMAND-FLOWS.md +319 -289
  11. package/docs/QUICKSTART.md +2 -8
  12. package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +2 -0
  13. package/docs/plans/2026-02-22-claude-settings.md +2 -0
  14. package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +2 -0
  15. package/docs/plans/2026-02-22-morph-spec-next.md +2 -0
  16. package/docs/plans/2026-02-22-native-alignment-design.md +2 -0
  17. package/docs/plans/2026-02-22-native-alignment-impl.md +2 -0
  18. package/docs/plans/2026-02-22-native-enrichment-design.md +2 -0
  19. package/docs/plans/2026-02-22-native-enrichment.md +2 -0
  20. package/docs/plans/2026-02-23-ddd-architecture-refactor.md +2 -0
  21. package/docs/plans/2026-02-23-ddd-nextsteps.md +2 -0
  22. package/docs/plans/2026-02-23-infra-architect-refactor.md +2 -0
  23. package/docs/plans/2026-02-23-nextjs-code-review-design.md +2 -1
  24. package/docs/plans/2026-02-23-nextjs-code-review-impl.md +2 -0
  25. package/docs/plans/2026-02-23-nextjs-standards-design.md +2 -1
  26. package/docs/plans/2026-02-23-nextjs-standards-impl.md +2 -0
  27. package/docs/plans/2026-02-24-cli-radical-simplification.md +592 -0
  28. package/docs/plans/2026-02-24-framework-failure-points.md +125 -0
  29. package/docs/plans/2026-02-24-morph-init-design.md +337 -0
  30. package/docs/plans/2026-02-24-morph-init-impl.md +1269 -0
  31. package/docs/plans/2026-02-24-tutorial-command-design.md +71 -0
  32. package/docs/plans/2026-02-24-tutorial-command.md +298 -0
  33. package/framework/CLAUDE.md +1 -1
  34. package/framework/commands/morph-proposal.md +3 -3
  35. package/framework/hooks/README.md +2 -5
  36. package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +4 -55
  37. package/framework/hooks/claude-code/session-start/inject-morph-context.js +20 -5
  38. package/framework/hooks/claude-code/statusline.py +6 -1
  39. package/framework/hooks/dev/check-sync-health.js +117 -0
  40. package/framework/hooks/dev/guard-version-numbers.js +57 -0
  41. package/framework/hooks/dev/sync-standards-registry.js +60 -0
  42. package/framework/hooks/dev/sync-template-registry.js +60 -0
  43. package/framework/hooks/dev/validate-skill-format.js +70 -0
  44. package/framework/hooks/dev/validate-standard-format.js +73 -0
  45. package/framework/hooks/shared/payload-utils.js +39 -0
  46. package/framework/hooks/shared/state-reader.js +25 -1
  47. package/framework/rules/morph-workflow.md +1 -1
  48. package/framework/skills/level-0-meta/morph-init/SKILL.md +216 -0
  49. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +4 -4
  50. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +4 -4
  51. package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +1 -1
  52. package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +192 -191
  53. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -180
  54. package/framework/skills/level-1-workflows/phase-design/SKILL.md +339 -338
  55. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -253
  56. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +168 -170
  57. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +284 -283
  58. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -245
  59. package/framework/templates/examples/design-system-examples.md +1 -1
  60. package/framework/templates/ui/FluentDesignTheme.cs +1 -1
  61. package/framework/templates/ui/MudTheme.cs +1 -1
  62. package/framework/templates/ui/design-system.css +1 -1
  63. package/package.json +4 -2
  64. package/scripts/bump-version.js +248 -0
  65. package/scripts/install-dev-hooks.js +138 -0
  66. package/src/commands/agents/index.js +1 -2
  67. package/src/commands/index.js +13 -16
  68. package/src/commands/project/doctor.js +100 -14
  69. package/src/commands/project/index.js +7 -10
  70. package/src/commands/project/init.js +398 -528
  71. package/src/commands/project/install-plugin-cmd.js +28 -0
  72. package/src/commands/project/setup-infra-cmd.js +12 -0
  73. package/src/commands/project/tutorial.js +115 -0
  74. package/src/commands/state/approve.js +213 -221
  75. package/src/commands/state/index.js +0 -1
  76. package/src/commands/state/state.js +337 -365
  77. package/src/commands/templates/index.js +0 -4
  78. package/src/commands/trust/trust.js +1 -93
  79. package/src/commands/utils/index.js +1 -5
  80. package/src/commands/validation/index.js +1 -5
  81. package/src/core/registry/command-registry.js +11 -285
  82. package/src/core/state/state-manager.js +5 -2
  83. package/src/lib/detectors/index.js +81 -87
  84. package/src/lib/detectors/structure-detector.js +275 -273
  85. package/src/lib/generators/recap-generator.js +232 -225
  86. package/src/scripts/global-install.js +34 -0
  87. package/src/scripts/install-plugin.js +126 -0
  88. package/src/scripts/setup-infra.js +203 -0
  89. package/src/utils/agents-installer.js +10 -1
  90. package/src/utils/hooks-installer.js +66 -3
  91. package/.morph/.morphversion +0 -5
  92. package/.morph/config/config.json +0 -8
  93. package/.morph/framework/agents.json +0 -1815
  94. package/.morph/framework/hooks/README.md +0 -205
  95. package/.morph/framework/hooks/claude-code/notification/approval-reminder.js +0 -54
  96. package/.morph/framework/hooks/claude-code/post-tool-use/dispatch.js +0 -83
  97. package/.morph/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +0 -42
  98. package/.morph/framework/hooks/claude-code/pre-compact/save-morph-context.js +0 -61
  99. package/.morph/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +0 -71
  100. package/.morph/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +0 -58
  101. package/.morph/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +0 -64
  102. package/.morph/framework/hooks/claude-code/session-start/inject-morph-context.js +0 -94
  103. package/.morph/framework/hooks/claude-code/statusline.py +0 -538
  104. package/.morph/framework/hooks/claude-code/statusline.sh +0 -7
  105. package/.morph/framework/hooks/claude-code/stop/validate-completion.js +0 -88
  106. package/.morph/framework/hooks/claude-code/user-prompt/enrich-prompt.js +0 -91
  107. package/.morph/framework/hooks/git/commit-msg/conventional-commits.sh +0 -33
  108. package/.morph/framework/hooks/git/pre-commit/agents.sh +0 -25
  109. package/.morph/framework/hooks/git/pre-commit/orchestrator.sh +0 -64
  110. package/.morph/framework/hooks/git/pre-commit/specs.sh +0 -50
  111. package/.morph/framework/hooks/git/pre-push/run-tests.sh +0 -44
  112. package/.morph/framework/hooks/shared/hook-response.js +0 -45
  113. package/.morph/framework/hooks/shared/phase-utils.js +0 -129
  114. package/.morph/framework/hooks/shared/state-reader.js +0 -138
  115. package/.morph/framework/hooks/shared/stdin-reader.js +0 -26
  116. package/.morph/framework/standards/STANDARDS.json +0 -933
  117. package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
  118. package/.morph/framework/standards/ai-agents/production.md +0 -415
  119. package/.morph/framework/standards/ai-agents/setup.md +0 -418
  120. package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
  121. package/.morph/framework/standards/ai-agents/workflows.md +0 -354
  122. package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
  123. package/.morph/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
  124. package/.morph/framework/standards/architecture/ddd/complexity-levels.md +0 -108
  125. package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
  126. package/.morph/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
  127. package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
  128. package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
  129. package/.morph/framework/standards/backend/api/rest.md +0 -492
  130. package/.morph/framework/standards/backend/api/validation.md +0 -88
  131. package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
  132. package/.morph/framework/standards/backend/database/ef-core.md +0 -199
  133. package/.morph/framework/standards/backend/database/migrations.md +0 -393
  134. package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
  135. package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
  136. package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
  137. package/.morph/framework/standards/backend/dotnet/async.md +0 -366
  138. package/.morph/framework/standards/backend/dotnet/core.md +0 -117
  139. package/.morph/framework/standards/backend/dotnet/di.md +0 -439
  140. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  141. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
  142. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  143. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  144. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
  145. package/.morph/framework/standards/context/analytics.md +0 -96
  146. package/.morph/framework/standards/context/bundles.md +0 -110
  147. package/.morph/framework/standards/context/priming.md +0 -78
  148. package/.morph/framework/standards/core/architecture.md +0 -185
  149. package/.morph/framework/standards/core/coding.md +0 -214
  150. package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
  151. package/.morph/framework/standards/core/git.md +0 -185
  152. package/.morph/framework/standards/core/testing.md +0 -295
  153. package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
  154. package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
  155. package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
  156. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  157. package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
  158. package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
  159. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  160. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  161. package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
  162. package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
  163. package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
  164. package/.morph/framework/standards/frontend/blazor/state.md +0 -191
  165. package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
  166. package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
  167. package/.morph/framework/standards/frontend/nextjs/app-router.md +0 -123
  168. package/.morph/framework/standards/frontend/nextjs/components.md +0 -132
  169. package/.morph/framework/standards/frontend/nextjs/data-fetching.md +0 -126
  170. package/.morph/framework/standards/frontend/nextjs/forms.md +0 -128
  171. package/.morph/framework/standards/frontend/nextjs/naming-conventions.md +0 -67
  172. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
  173. package/.morph/framework/standards/frontend/nextjs/project-structure.md +0 -102
  174. package/.morph/framework/standards/frontend/nextjs/state-management.md +0 -72
  175. package/.morph/framework/standards/frontend/nextjs/testing.md +0 -111
  176. package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
  177. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  178. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  179. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  180. package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
  181. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  182. package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
  183. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  184. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
  185. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
  186. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  187. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
  188. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
  189. package/.morph/framework/standards/integration/api/graphql.md +0 -91
  190. package/.morph/framework/standards/integration/api/grpc.md +0 -114
  191. package/.morph/framework/standards/integration/api/rest-design.md +0 -95
  192. package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
  193. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  194. package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
  195. package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
  196. package/.morph/framework/standards/observability/logging.md +0 -131
  197. package/.morph/framework/standards/observability/metrics.md +0 -121
  198. package/.morph/framework/standards/observability/monitoring.md +0 -114
  199. package/.morph/framework/standards/observability/tracing.md +0 -132
  200. package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
  201. package/.morph/framework/standards/workflows/thread-management.md +0 -113
  202. package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
  203. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  204. package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
  205. package/.morph/framework/templates/README.md +0 -814
  206. package/.morph/framework/templates/REGISTRY.json +0 -1888
  207. package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
  208. package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
  209. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  210. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  211. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  212. package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
  213. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  214. package/.morph/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
  215. package/.morph/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
  216. package/.morph/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
  217. package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
  218. package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
  219. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
  220. package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
  221. package/.morph/framework/templates/code/dotnet/test.cs +0 -239
  222. package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
  223. package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
  224. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
  225. package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
  226. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
  227. package/.morph/framework/templates/context/CONTEXT.md +0 -181
  228. package/.morph/framework/templates/docs/clarifications.md +0 -253
  229. package/.morph/framework/templates/docs/onboarding.md +0 -123
  230. package/.morph/framework/templates/docs/proposal.md +0 -182
  231. package/.morph/framework/templates/docs/schema-analysis.md +0 -119
  232. package/.morph/framework/templates/docs/spec.md +0 -198
  233. package/.morph/framework/templates/docs/ui-components.md +0 -124
  234. package/.morph/framework/templates/docs/ui-design-system.md +0 -76
  235. package/.morph/framework/templates/docs/ui-flows.md +0 -167
  236. package/.morph/framework/templates/docs/ui-mockups.md +0 -98
  237. package/.morph/framework/templates/docs/user-stories.md +0 -34
  238. package/.morph/framework/templates/examples/design-system-examples.md +0 -357
  239. package/.morph/framework/templates/examples/spec-examples.md +0 -90
  240. package/.morph/framework/templates/feature/decisions.md +0 -187
  241. package/.morph/framework/templates/feature/recap.md +0 -146
  242. package/.morph/framework/templates/feature/tasks.md +0 -199
  243. package/.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +0 -43
  244. package/.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs +0 -26
  245. package/.morph/framework/templates/frontend/nextjs/env.mjs.hbs +0 -32
  246. package/.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs +0 -56
  247. package/.morph/framework/templates/frontend/nextjs/page.tsx.hbs +0 -22
  248. package/.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs +0 -26
  249. package/.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs +0 -54
  250. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  251. package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
  252. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  253. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  254. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  255. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  256. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  257. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  258. package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
  259. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  260. package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
  261. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  262. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  263. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  264. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  265. package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
  266. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
  267. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
  268. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
  269. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
  270. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
  271. package/.morph/framework/templates/infrastructure/github/README.md +0 -593
  272. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  273. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
  274. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
  275. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  276. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
  277. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
  278. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
  279. package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
  280. package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
  281. package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
  282. package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
  283. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
  284. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
  285. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  286. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  287. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  288. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  289. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  290. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
  291. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
  292. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
  293. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
  294. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
  295. package/.morph/framework/templates/project-structure/dotnet-ddd.md +0 -70
  296. package/.morph/framework/templates/saas/subscription.cs +0 -347
  297. package/.morph/framework/templates/saas/tenant.cs +0 -338
  298. package/.morph/framework/templates/state.template.json +0 -17
  299. package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
  300. package/.morph/framework/templates/ui/MudTheme.cs +0 -281
  301. package/.morph/framework/templates/ui/design-system.css +0 -226
  302. package/.morph/logs/tool-failures.log +0 -17
  303. package/.morph/memory/pre-compact-2026-02-24T17-43-30-049Z.json +0 -16
  304. package/.morph/plans/eager-watching-bunny.md +0 -105
  305. package/.morph/plans/temporal-seeking-nebula.md +0 -45
  306. package/CLAUDE.md +0 -77
  307. package/docs/claude-alignment-report.md +0 -137
  308. package/docs/examples/order-management/contracts.cs +0 -84
  309. package/docs/examples/order-management/proposal.md +0 -24
  310. package/docs/examples/order-management/spec.md +0 -162
  311. package/src/commands/feature/create-story.js +0 -362
  312. package/src/commands/feature/index.js +0 -6
  313. package/src/commands/feature/shard-spec.js +0 -225
  314. package/src/commands/feature/sprint-status.js +0 -250
  315. package/src/commands/generation/generate-onboarding.js +0 -169
  316. package/src/commands/generation/generate.js +0 -276
  317. package/src/commands/generation/index.js +0 -5
  318. package/src/commands/learning/capture-pattern.js +0 -121
  319. package/src/commands/learning/index.js +0 -5
  320. package/src/commands/learning/search-patterns.js +0 -126
  321. package/src/commands/mcp/mcp.js +0 -102
  322. package/src/commands/project/changes.js +0 -66
  323. package/src/commands/project/cost.js +0 -179
  324. package/src/commands/project/diff.js +0 -278
  325. package/src/commands/project/revert.js +0 -173
  326. package/src/commands/project/standards.js +0 -80
  327. package/src/commands/project/sync.js +0 -167
  328. package/src/commands/project/update-agents.js +0 -23
  329. package/src/commands/state/rollback-phase.js +0 -185
  330. package/src/commands/templates/template-customize.js +0 -87
  331. package/src/commands/templates/template-list.js +0 -114
  332. package/src/commands/templates/template-show.js +0 -129
  333. package/src/commands/templates/template-validate.js +0 -91
  334. package/src/commands/utils/troubleshoot.js +0 -222
  335. package/src/commands/validation/analyze-blazor-concurrency.js +0 -193
  336. package/src/commands/validation/lint-fluent.js +0 -352
  337. package/src/commands/validation/validate-blazor-state.js +0 -210
  338. package/src/commands/validation/validate-blazor.js +0 -156
  339. package/src/commands/validation/validate-css.js +0 -84
  340. package/src/lib/detectors/conversation-analyzer.js +0 -163
  341. package/src/lib/learning/index.js +0 -7
  342. package/src/lib/learning/learning-system.js +0 -520
  343. package/src/lib/troubleshooting/index.js +0 -8
  344. package/src/lib/troubleshooting/troubleshoot-grep.js +0 -198
  345. package/src/lib/troubleshooting/troubleshoot-index.js +0 -144
  346. package/src/llm/environment-detector.js +0 -43
@@ -1,96 +0,0 @@
1
- # Context Standard: Context Analytics
2
-
3
- ## Overview
4
- Context analytics tracks token usage, identifies optimization opportunities, and monitors session efficiency.
5
-
6
- ## Metrics Collected
7
-
8
- ### Session Metrics
9
- - Session ID, start time, feature, agent
10
- - Token usage at session start vs end
11
- - Optimization actions taken
12
- - Files read (and token cost per file)
13
-
14
- ### Context Efficiency Score
15
- ```
16
- Efficiency = 1 - (contextTokens / totalContextCapacity)
17
- Target: > 0.6 (60% of context available for work)
18
- Warning: < 0.4 (less than 40% available)
19
- Critical: < 0.2 (less than 20% available)
20
- ```
21
-
22
- ## Viewing Analytics
23
-
24
- ### Feature Analytics
25
- ```bash
26
- morph-spec analytics feature morph-next-gen
27
-
28
- # Context Usage — morph-next-gen
29
- # ─────────────────────────────────────
30
- # Sessions: 12
31
- # Avg session tokens: 45,200
32
- # Total tokens used: 542,400
33
- #
34
- # Efficiency distribution:
35
- # Excellent (>0.8) ████████░░ 8/12 (67%)
36
- # Good (0.6-0.8) ██░░░░░░░░ 2/12 (17%)
37
- # Poor (<0.6) ██░░░░░░░░ 2/12 (17%)
38
- #
39
- # Top token consumers:
40
- # CLAUDE.md 23,000 tokens (42%)
41
- # standards/coding.md 2,100 tokens (4%)
42
- # spec.md 1,800 tokens (3%)
43
- #
44
- # Optimizations recommended:
45
- # → Replace CLAUDE.md with priming file (save ~22,500 tokens)
46
- # → Use context bundle for resume sessions
47
- ```
48
-
49
- ### Context Dashboard
50
- ```bash
51
- morph-spec analytics context
52
-
53
- # Core Four Status
54
- # ─────────────────────────────────────
55
- # Context: [████████░░░░░░░░░░░░] 41% (82,000/200,000 tokens)
56
- # Model: claude-sonnet-4-6
57
- # Prompt: 3,200 tokens (current turn)
58
- # Tools: 12 tools active
59
- ```
60
-
61
- ## Optimization Triggers
62
-
63
- | Condition | Trigger | Action |
64
- |-----------|---------|--------|
65
- | Context > 75% | Warning | Suggest bundle creation |
66
- | Context > 90% | Critical | Auto-suggest micro-agent split |
67
- | CLAUDE.md loaded | Info | Suggest priming file |
68
- | > 5 standards loaded | Info | Suggest standards subset |
69
- | Unused MCP servers | Warning | Suggest MCP hygiene |
70
-
71
- ## Analytics Storage
72
- Events stored in JSONL format at `.morph/analytics/`:
73
- - `threads-log.jsonl` — thread lifecycle events
74
- - `context-log.jsonl` — context optimization events
75
- - `trust-log.jsonl` — trust/approval events
76
-
77
- Each event:
78
- ```json
79
- {
80
- "timestamp": "2026-02-19T00:00:00Z",
81
- "type": "context_warning",
82
- "feature": "morph-next-gen",
83
- "data": {
84
- "contextPercent": 82,
85
- "tokensUsed": 164000,
86
- "totalCapacity": 200000,
87
- "recommendation": "CREATE_BUNDLE"
88
- }
89
- }
90
- ```
91
-
92
- ## Pruning
93
- Analytics auto-prune after 90 days. Manual prune:
94
- ```bash
95
- morph-spec analytics project --prune 30
96
- ```
@@ -1,110 +0,0 @@
1
- # Context Standard: Context Bundles
2
-
3
- ## Overview
4
- Context bundles are compressed snapshots of feature state for resuming long-running sessions without re-reading all files.
5
-
6
- ## What a Bundle Contains
7
-
8
- ```json
9
- {
10
- "bundleId": "morph-next-gen-20260219-001",
11
- "feature": "morph-next-gen",
12
- "createdAt": "2026-02-19T00:00:00Z",
13
- "tokensEstimated": 14800,
14
- "compressionRatio": 0.12,
15
-
16
- "spec": {
17
- "problem": "1-2 sentence problem statement",
18
- "solution": "1-2 sentence solution approach",
19
- "keyRequirements": ["REQ1", "REQ2", "REQ3"],
20
- "dataModel": ["Entity1 (fields)", "Entity2 (fields)"]
21
- },
22
-
23
- "decisions": [
24
- { "id": "ADR-001", "summary": "Chose X over Y because Z", "fullPath": "decisions.md#adr-001" }
25
- ],
26
-
27
- "tasks": {
28
- "completed": ["T001", "T002", "T003"],
29
- "inProgress": "T004",
30
- "pending": ["T005", "T006"],
31
- "total": 10,
32
- "progress": "30%"
33
- },
34
-
35
- "checkpoints": [
36
- { "num": 1, "passed": true, "validatorsRun": ["architecture", "security"] }
37
- ],
38
-
39
- "agents": ["dotnet-senior", "ef-modeler"],
40
-
41
- "resumeHints": [
42
- "Currently implementing: T004 - Create UserService",
43
- "Last file modified: Services/UserService.cs",
44
- "Pending issue: DbContext injection pattern needs review"
45
- ]
46
- }
47
- ```
48
-
49
- ## Creating and Using Bundles
50
-
51
- ### Create a Bundle (auto or manual)
52
- ```bash
53
- # Auto-created on task completion (configured in llm-interaction.json)
54
- # Manual creation:
55
- morph-spec bundle create morph-next-gen
56
-
57
- # Output:
58
- # ✅ Bundle created: .morph/bundles/morph-next-gen-20260219-001.json
59
- # Original context: ~180,000 tokens
60
- # Bundle: ~15,000 tokens (compression: 92%)
61
- ```
62
-
63
- ### Load Bundle for Resume
64
- ```bash
65
- # Load latest bundle for feature
66
- morph-spec bundle load morph-next-gen
67
-
68
- # Generates resume context to stdout:
69
- # "You are resuming the morph-next-gen feature. Current phase: implement.
70
- # Last completed: T003. Next task: T004 (Create UserService)..."
71
- ```
72
-
73
- ### List Bundles
74
- ```bash
75
- morph-spec bundle list morph-next-gen
76
-
77
- # ID Created Tokens Compression
78
- # morph-next-gen-20260219-001 2026-02-19 14,800 92%
79
- # morph-next-gen-20260218-001 2026-02-18 12,400 94%
80
- ```
81
-
82
- ## Bundle vs Full Context
83
-
84
- | Scenario | Use |
85
- |----------|-----|
86
- | Starting fresh implementation | Full spec + tasks + standards |
87
- | Resuming mid-session | Bundle (loads in seconds) |
88
- | Micro-agent handoff | Bundle with agent-specific slice |
89
- | Cross-day resume | Bundle + load specific changed files |
90
-
91
- ## Auto-Bundle Configuration
92
- ```json
93
- // .morph/config/llm-interaction.json
94
- {
95
- "contextOptimization": {
96
- "bundles": {
97
- "enabled": true,
98
- "directory": ".morph/bundles/",
99
- "createOnTaskDone": true,
100
- "maxBundles": 10
101
- }
102
- }
103
- }
104
- ```
105
-
106
- ## Bundle Lifecycle
107
- - Created: on task completion (if auto-enabled)
108
- - Retained: last 10 bundles per feature
109
- - Invalidated: when spec.md is modified (decisions changed)
110
- - Deleted: when feature is archived
@@ -1,78 +0,0 @@
1
- # Context Standard: Priming Files
2
-
3
- ## Overview
4
- Priming files are ~500-token summaries replacing the full CLAUDE.md (23K tokens) for focused work sessions.
5
-
6
- ## When to Use Priming Files
7
- - Starting a new task where full CLAUDE.md is unnecessary
8
- - Micro-agent sessions with narrow scope
9
- - Parallel workers that only need domain-specific context
10
-
11
- ## Available Priming Files
12
-
13
- | File | Focus | When to Use |
14
- |------|-------|-------------|
15
- | `.morph/context/feature-prime.md` | Feature implementation | Implementing a new feature |
16
- | `.morph/context/bug-prime.md` | Bug fixing | Fixing a reported bug |
17
- | `.morph/context/refactor-prime.md` | Refactoring | Code improvement without behavior change |
18
- | `.morph/context/design-prime.md` | Design phase | Creating spec.md, decisions.md |
19
- | `.morph/context/infra-prime.md` | Infrastructure | Bicep, Docker, deployment |
20
-
21
- ## Loading a Priming File
22
- ```bash
23
- # Load priming file into context
24
- morph-spec prime feature
25
-
26
- # Output: contents of feature-prime.md to stdout
27
- # AI should read this instead of full CLAUDE.md
28
-
29
- # For micro-agents:
30
- morph-spec micro-agent create bug-fixer \
31
- --prime bug \
32
- --standards "core/coding.md"
33
- ```
34
-
35
- ## Creating Custom Priming Files
36
-
37
- Keep priming files under 600 tokens (≈3000 characters):
38
- ```markdown
39
- # {Context Name} — Quick Reference
40
-
41
- ## Stack
42
- - Backend: .NET 10 Blazor Server
43
- - DB: Azure SQL (EF Core)
44
- - Deploy: Azure Container Apps
45
-
46
- ## Key Patterns
47
- - Use IDbContextFactory<> (not DbContext directly)
48
- - Async/await throughout
49
- - DI order: DbContext → Services → Controllers
50
-
51
- ## Current Feature
52
- {Feature summary in 2-3 sentences}
53
-
54
- ## Critical Files
55
- - spec.md: [path]
56
- - contracts.cs: [path]
57
- - tasks.json: [path]
58
-
59
- ## Do Not Touch
60
- - [files to avoid]
61
- ```
62
-
63
- ## Token Budget Guidelines
64
-
65
- | Context Type | Tokens | Use Case |
66
- |--------------|--------|----------|
67
- | Full CLAUDE.md | ~23,000 | Full orchestrator session |
68
- | Priming file | ~500 | Focused task session |
69
- | Context bundle | ~15,000 | Feature resume (compressed) |
70
- | Standards subset | ~2,000/file | Domain specialist |
71
- | Agent prompt | ~1,000 | Micro-agent task |
72
-
73
- ## Optimization Flow
74
- 1. Start with priming file (500 tokens)
75
- 2. Load relevant standards (2,000 tokens/file, max 3 files)
76
- 3. Load spec summary from metadata.json (not full spec.md)
77
- 4. Load tasks.json for current phase only
78
- 5. Total budget: target < 8,000 tokens for routine tasks
@@ -1,185 +0,0 @@
1
- # Architecture Standards
2
-
3
- > **Scope:** universal
4
- > **Layer:** 0 (always load)
5
- > **Keywords:** architecture, clean, solid, layers, di, separation of concerns
6
- > **Load When:** always
7
-
8
- Architecture patterns, layer responsibilities, and structural rules.
9
-
10
- ---
11
-
12
- ## Clean Architecture Layers
13
-
14
- ```
15
- ┌───────────────────────────────────────┐
16
- │ Web (Blazor/NextJS, API) │ ← Entry, UI, controllers
17
- │ ┌─────────────────────────────────┐ │
18
- │ │ Infrastructure (EF, External) │ │ ← Data, services
19
- │ │ ┌───────────────────────────┐ │ │
20
- │ │ │ Application (Services) │ │ │ ← Business logic
21
- │ │ │ ┌───────────────────┐ │ │ │
22
- │ │ │ │ Domain (Entities) │ │ │ │ ← Core
23
- │ │ │ └───────────────────┘ │ │ │
24
- │ │ └───────────────────────────┘ │ │
25
- │ └─────────────────────────────────┘ │
26
- └───────────────────────────────────────┘
27
- ```
28
-
29
- **Dependency Rule:** Inner layers NEVER reference outer layers.
30
-
31
- ---
32
-
33
- ## Layer Responsibilities
34
-
35
- | Layer | Contains | References | Key Packages |
36
- |-------|----------|------------|--------------|
37
- | **Domain** | Entities, Value Objects, Enums, Interfaces | None | None (pure C#) |
38
- | **Application** | Services, DTOs, Validators | Domain | FluentValidation, MediatR |
39
- | **Infrastructure** | DbContext, Repositories, External clients | Domain, Application | EF Core, HttpClient |
40
- | **Web** | Pages, Components, Controllers, Program.cs | All | Blazor, Fluent UI |
41
-
42
- ---
43
-
44
- ## Project Structure
45
-
46
- ```
47
- src/{App}.Domain/
48
- Entities/ Order.cs, Customer.cs
49
- ValueObjects/ Money.cs, Address.cs
50
- Enums/ OrderStatus.cs
51
- Interfaces/ IOrderRepository.cs
52
-
53
- src/{App}.Application/
54
- Services/ OrderService.cs
55
- DTOs/ OrderResponse.cs
56
- Validators/ CreateOrderValidator.cs
57
-
58
- src/{App}.Infrastructure/
59
- Data/
60
- AppDbContext.cs
61
- Configurations/ OrderConfiguration.cs
62
- Repositories/ OrderRepository.cs
63
- Services/ AsaasPaymentService.cs
64
-
65
- src/{App}.Web/
66
- Components/
67
- Layout/ MainLayout.razor
68
- Pages/ Orders.razor
69
- wwwroot/
70
- Program.cs
71
- ```
72
-
73
- ---
74
-
75
- ## File Organization
76
-
77
- | Rule | Description |
78
- |------|-------------|
79
- | One class per file | `OrderService.cs` for `OrderService` |
80
- | Folder = namespace | `Entities/Order.cs` → `MyApp.Domain.Entities` |
81
- | No nested classes | Except private helpers |
82
- | Extensions per layer | `ServiceCollectionExtensions.cs` in each project |
83
-
84
- ---
85
-
86
- ## SOLID Quick Reference
87
-
88
- | Principle | Rule | Signal |
89
- |-----------|------|--------|
90
- | **S** Single Responsibility | One reason to change | Class > 300 lines? Mix DB + email + validation? Split. |
91
- | **O** Open/Closed | Extend via new classes | `switch` on type? Use polymorphism. |
92
- | **L** Liskov Substitution | Subtypes substitutable | Override throws `NotSupportedException`? Violation. |
93
- | **I** Interface Segregation | Small interfaces | Interface with 10+ methods? Split. |
94
- | **D** Dependency Inversion | Depend on abstractions | Concrete class in constructor? Use interface. |
95
-
96
- ---
97
-
98
- ## Service Patterns
99
-
100
- | Pattern | When | Complexity |
101
- |---------|------|-----------|
102
- | Direct DbContext | Simple CRUD, < 3 entities | Low |
103
- | Repository | Data abstraction, testability | Medium |
104
- | Repository Factory | Background ops, Hangfire | Medium |
105
- | CQRS | Read/write models differ | Medium-High |
106
- | MediatR | Decouple handlers, pipelines | Medium |
107
-
108
- ```csharp
109
- public sealed class OrderService(IOrderRepository repository, ILogger<OrderService> logger) : IOrderService
110
- {
111
- public async Task<Result<OrderResponse>> CreateAsync(CreateOrderRequest request, CancellationToken ct = default)
112
- {
113
- logger.LogInformation("Creating order for {CustomerId}", request.CustomerId);
114
- if (request.Items.Count == 0)
115
- return Result.Failure<OrderResponse>("Order must have items");
116
-
117
- var order = Order.Create(request.CustomerId, request.Items);
118
- await repository.AddAsync(order, ct);
119
- await repository.SaveChangesAsync(ct);
120
- return Result.Success(order.ToResponse());
121
- }
122
- }
123
- ```
124
-
125
- ---
126
-
127
- ## DI Registration Pattern
128
-
129
- ```csharp
130
- // Program.cs
131
- builder.Services
132
- .AddApplication()
133
- .AddInfrastructure(builder.Configuration)
134
- .AddWeb();
135
-
136
- // Application/Extensions/ServiceCollectionExtensions.cs
137
- public static IServiceCollection AddApplication(this IServiceCollection services)
138
- {
139
- services.AddScoped<IOrderService, OrderService>();
140
- services.AddValidatorsFromAssemblyContaining<CreateOrderValidator>();
141
- return services;
142
- }
143
-
144
- // Infrastructure/Extensions/ServiceCollectionExtensions.cs
145
- public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration config)
146
- {
147
- var conn = config.GetConnectionString("Default");
148
- services.AddDbContext<AppDbContext>(o => o.UseSqlServer(conn));
149
- services.AddDbContextFactory<AppDbContext>(o => o.UseSqlServer(conn));
150
- services.AddScoped<IOrderRepository, OrderRepository>();
151
- return services;
152
- }
153
- ```
154
-
155
- ---
156
-
157
- ## Architecture Smells
158
-
159
- | Smell | Signal | Fix |
160
- |-------|--------|-----|
161
- | Circular dependency | A refs B, B refs A | Extract shared interface to lower layer |
162
- | Fat controller/page | Page > 50 lines logic | Extract to service |
163
- | Anemic domain | Entities data-only | Move behavior into entities |
164
- | God class | > 500 lines, 10+ deps | Split by responsibility |
165
- | Service locator | `IServiceProvider.GetService<T>()` | Constructor injection |
166
- | Over-abstraction | Interface, one impl, never mocked | Use concrete class |
167
- | Under-abstraction | External service called directly | Extract interface |
168
- | Leaking infrastructure | `DbContext` in Web layer | Route through Application |
169
-
170
- ---
171
-
172
- ## Checklist
173
-
174
- - [ ] No circular references (`dotnet build` clean)
175
- - [ ] Domain has zero NuGet packages
176
- - [ ] No unused project references
177
- - [ ] Every interface has consumer (no "just in case")
178
- - [ ] External services through interfaces
179
- - [ ] Configuration via Options pattern
180
- - [ ] No hardcoded secrets in code
181
- - [ ] All secrets in Key Vault or user-secrets
182
-
183
- ---
184
-
185
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,214 +0,0 @@
1
- # C# Coding Standards
2
-
3
- > **Scope:** universal
4
- > **Layer:** 0 (always load)
5
- > **Keywords:** coding, naming, async, style, conventions, csharp
6
- > **Load When:** always
7
-
8
- Single source of truth for C# naming conventions, code style, and enforcement.
9
- Based on [Microsoft C# Coding Conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions) and [.NET Naming Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines).
10
-
11
- ---
12
-
13
- ## Naming Conventions
14
-
15
- | Element | Convention | Example |
16
- |---------|-----------|---------|
17
- | Classes | PascalCase | `OrderService` |
18
- | Interfaces | `I` + PascalCase | `IOrderService` |
19
- | Methods | PascalCase | `GetOrderAsync` |
20
- | Async methods | + `Async` suffix | `ProcessPaymentAsync` |
21
- | Properties | PascalCase | `OrderTotal` |
22
- | Constants | PascalCase | `DefaultPageSize` **NOT** `DEFAULT_PAGE_SIZE` |
23
- | Enums / Members | PascalCase | `OrderStatus.PendingPayment` **NOT** `PENDING_PAYMENT` |
24
- | Namespaces | PascalCase | `MyApp.Domain` |
25
- | Type parameters | `T` + PascalCase | `TEntity`, `TResult` |
26
- | Private fields | `_camelCase` | `_orderRepository` |
27
- | Static private | `s_camelCase` | `s_instance` |
28
- | Thread-static | `t_camelCase` | `t_contextId` |
29
- | Locals / Params | camelCase | `orderId`, `orderTotal` |
30
-
31
- ### Acronyms
32
-
33
- | Length | Rule | Example |
34
- |--------|------|---------|
35
- | 2 chars | Both uppercase | `IO`, `UI` |
36
- | 3+ chars | PascalCase | `Html`, `Xml`, `Http` |
37
-
38
- ### DON'T
39
-
40
- | Wrong | Right |
41
- |-------|-------|
42
- | `strName`, `iCount` | `name`, `count` |
43
- | `MAX_RETRY_COUNT` | `MaxRetryCount` |
44
- | `btnSubmit`, `lblName` | `submitButton`, `nameLabel` |
45
- | `order_total`, `get_order` | `orderTotal`, `GetOrder` |
46
- | `repo`, `ctx`, `mgr`, `svc` | `repository`, `context`, `manager`, `service` |
47
- | `Int32 count`, `String name` | `int count`, `string name` |
48
-
49
- ---
50
-
51
- ## Code Style
52
-
53
- ### Modern C# (10+)
54
-
55
- ```csharp
56
- namespace MyApp.Application.Services; // File-scoped
57
-
58
- public sealed class OrderService(IOrderRepository repository) : IOrderService
59
- {
60
- public async Task<Result<Order>> GetByIdAsync(int id, CancellationToken ct = default)
61
- {
62
- var order = await repository.GetByIdAsync(id, ct);
63
- return order is null
64
- ? Result.Failure<Order>("Not found")
65
- : Result.Success(order);
66
- }
67
- }
68
- ```
69
-
70
- ### Style Rules
71
-
72
- | Rule | Wrong | Right |
73
- |------|-------|-------|
74
- | `var` when obvious | `OrderDto order = new OrderDto()` | `var order = new OrderDto()` |
75
- | Target-typed `new` | `OrderDto order = new OrderDto()` | `OrderDto order = new()` |
76
- | Null checks | `== null`, `!= null` | `is null`, `is not null` |
77
- | Collections | `new List<int> { 1, 2 }` | `List<int> items = [1, 2]` |
78
- | Expression body | `{ return _name; }` | `=> _name;` |
79
- | Nullable refs | Disabled | `<Nullable>enable</Nullable>` |
80
- | Pattern matching | `if (x is int)` then cast | `if (x is int value)` |
81
- | Default `sealed` | Unsealed classes | `sealed` unless inheritance needed |
82
-
83
- ### Complexity Thresholds
84
-
85
- | Metric | Limit |
86
- |--------|-------|
87
- | Method length | < 30 lines (prefer < 20) |
88
- | Method parameters | ≤ 4 (use record for more) |
89
- | Class length | < 300 lines |
90
- | Nesting depth | ≤ 3 levels |
91
- | Cyclomatic complexity | < 10 per method |
92
-
93
- ---
94
-
95
- ## Async Conventions
96
-
97
- ```csharp
98
- // ALWAYS: Async suffix + CancellationToken
99
- public async Task<Order> GetOrderAsync(int id, CancellationToken ct = default)
100
-
101
- // NEVER: .Result or .Wait() (deadlock risk in Blazor Server)
102
- var order = await service.GetOrderAsync(id, ct); // Correct
103
- var order = service.GetOrderAsync(id).Result; // DEADLOCK
104
-
105
- // NEVER: async void (except event handlers)
106
- public async Task HandleClickAsync() { } // Correct
107
- public async void HandleClick() { } // exceptions lost
108
- ```
109
-
110
- ---
111
-
112
- ## Dependency Injection
113
-
114
- | Lifetime | When | Example |
115
- |----------|------|---------|
116
- | **Scoped** | DbContext, per-request | `AddScoped<IOrderService, OrderService>()` |
117
- | **Singleton** | Factories, caches | `AddSingleton<IRepositoryFactory>()` |
118
- | **Transient** | Lightweight, stateless | `AddTransient<IValidator<Order>>()` |
119
-
120
- ```csharp
121
- // Constructor injection with interfaces
122
- public sealed class OrderService(IOrderRepository repository, ILogger<OrderService> logger)
123
-
124
- // Service Locator anti-pattern
125
- var service = serviceProvider.GetService<IOrderService>();
126
- ```
127
-
128
- ---
129
-
130
- ## Logging
131
-
132
- ```csharp
133
- // Structured logging with message templates
134
- logger.LogInformation("Processing order {OrderId} for {CustomerId}", orderId, customerId);
135
-
136
- // String interpolation defeats structured logging
137
- logger.LogInformation($"Processing order {orderId}"); // WRONG
138
-
139
- // Include correlation IDs
140
- logger.LogError(ex, "Failed to process order {OrderId}", orderId);
141
- ```
142
-
143
- | Level | When |
144
- |-------|------|
145
- | `Trace` | Fine-grained diagnostic (dev only) |
146
- | `Debug` | Internal state, troubleshooting |
147
- | `Information` | Normal operations (start, complete, key decisions) |
148
- | `Warning` | Unexpected but recoverable (retry, fallback) |
149
- | `Error` | Failure requiring attention |
150
- | `Critical` | System-level failure (app crash, data corruption) |
151
-
152
- ---
153
-
154
- ## Error Handling
155
-
156
- ```csharp
157
- // Result pattern for business errors
158
- public async Task<Result<Order>> ProcessAsync(Guid id, CancellationToken ct)
159
- {
160
- var order = await _repository.GetByIdAsync(id, ct);
161
- if (order is null) return Result.Failure<Order>("Not found");
162
- if (order.Status >= OrderStatus.Completed)
163
- return Result.Failure<Order>("Already completed");
164
- return Result.Success(order);
165
- }
166
-
167
- // Exceptions for infrastructure errors only
168
- // NEVER: empty catch or swallowed exceptions
169
- try { await _client.SendAsync(request, ct); }
170
- catch (Exception) { } // WRONG
171
-
172
- // ALWAYS: preserve inner exception
173
- catch (HttpRequestException ex)
174
- {
175
- throw new PaymentGatewayException("Payment failed", ex);
176
- }
177
-
178
- // ALWAYS: specific exception types
179
- catch (DbUpdateConcurrencyException ex) { /* handle */ }
180
- catch (Exception ex) { /* log and rethrow */ throw; }
181
- ```
182
-
183
- ---
184
-
185
- ## .editorconfig Template
186
-
187
- Minimal `.editorconfig` for enforcement:
188
-
189
- ```ini
190
- [*.cs]
191
- # Naming
192
- dotnet_naming_rule.interfaces.severity = error
193
- dotnet_naming_rule.interfaces.symbols = interface
194
- dotnet_naming_rule.interfaces.style = begins_with_i
195
-
196
- # File-scoped namespaces
197
- csharp_style_namespace_declarations = file_scoped:warning
198
-
199
- # var preferences
200
- csharp_style_var_when_type_is_apparent = true:suggestion
201
-
202
- # Null checks
203
- dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
204
-
205
- # Async suffix
206
- dotnet_naming_rule.async_methods.severity = warning
207
- dotnet_naming_rule.async_methods.required_suffix = Async
208
- ```
209
-
210
- Full template: `.editorconfig` in project root.
211
-
212
- ---
213
-
214
- *MORPH-SPEC by Polymorphism Tech*