@polymorphism-tech/morph-spec 4.12.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/README.md +21 -29
  2. package/bin/morph-spec.js +41 -24
  3. package/bin/task-manager.js +962 -1341
  4. package/bin/validate.js +1 -1
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +10 -11
  7. package/docs/QUICKSTART.md +15 -15
  8. package/framework/CLAUDE.md +5 -2
  9. package/framework/agents/README.md +3 -4
  10. package/framework/agents/ai-agents/ai-system-architect.md +6 -10
  11. package/framework/agents/architecture/seo-growth-hacker.md +166 -326
  12. package/framework/agents/architecture/standards-architect.md +21 -31
  13. package/framework/agents/backend/dotnet-senior.md +160 -86
  14. package/framework/agents/backend/ef-modeler.md +2 -6
  15. package/framework/agents/backend/hangfire-orchestrator.md +8 -9
  16. package/framework/agents/backend/ms-agent-expert.md +1 -1
  17. package/framework/agents/frontend/nextjs-expert.md +198 -133
  18. package/framework/agents/frontend/ui-ux-designer.md +226 -267
  19. package/framework/agents/infrastructure/infra-architect.md +191 -27
  20. package/framework/agents/integrations/clerk-auth.md +19 -26
  21. package/framework/agents/integrations/hangfire-integration.md +1 -4
  22. package/framework/agents.json +215 -1453
  23. package/framework/commands/morph-apply.md +4 -4
  24. package/framework/commands/morph-preflight.md +4 -26
  25. package/framework/commands/morph-proposal.md +19 -19
  26. package/framework/commands/morph-status.md +2 -2
  27. package/framework/commands/morph-troubleshoot.md +6 -13
  28. package/framework/hooks/README.md +1 -6
  29. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
  30. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
  31. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
  32. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
  33. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
  34. package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
  35. package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
  36. package/framework/hooks/claude-code/statusline.py +4 -5
  37. package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
  38. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
  39. package/framework/hooks/shared/compact-restore.js +28 -5
  40. package/framework/hooks/shared/phase-utils.js +4 -8
  41. package/framework/hooks/shared/state-reader.js +34 -3
  42. package/framework/phases.json +7 -45
  43. package/framework/rules/ai-agents-standards.md +15 -0
  44. package/framework/rules/asaas-standards.md +13 -0
  45. package/framework/rules/clerk-standards.md +13 -0
  46. package/framework/rules/csharp-standards.md +8 -4
  47. package/framework/rules/data-standards.md +18 -0
  48. package/framework/rules/dotnet-templates.md +87 -0
  49. package/framework/rules/frontend-standards.md +13 -13
  50. package/framework/rules/hangfire-standards.md +13 -0
  51. package/framework/rules/infrastructure-standards.md +27 -16
  52. package/framework/rules/morph-workflow.md +73 -13
  53. package/framework/rules/nextjs-standards.md +1 -0
  54. package/framework/rules/nextjs-templates.md +40 -0
  55. package/framework/rules/resend-standards.md +12 -0
  56. package/framework/rules/supabase-standards.md +29 -0
  57. package/framework/skills/README.md +6 -8
  58. package/framework/skills/level-0-meta/mcp-registry.json +21 -99
  59. package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
  60. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
  61. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
  62. package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
  63. package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
  64. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
  65. package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
  66. package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
  67. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
  68. package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
  69. package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
  70. package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
  71. package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
  72. package/framework/skills/level-1-workflows/README.md +1 -1
  73. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
  74. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +58 -124
  75. package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
  76. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
  77. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
  78. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
  79. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
  80. package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
  81. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
  82. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
  83. package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -2
  84. package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
  85. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
  86. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  87. package/framework/squad-templates/backend-only.json +6 -6
  88. package/framework/squad-templates/frontend-only.json +17 -8
  89. package/framework/squad-templates/full-stack.json +29 -24
  90. package/framework/standards/STANDARDS.json +1021 -2369
  91. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
  92. package/framework/standards/backend/dotnet/result-pattern.md +213 -0
  93. package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
  94. package/framework/standards/backend/dotnet/scrutor.md +158 -0
  95. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
  96. package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
  97. package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
  98. package/framework/standards/integration/mcp/mcp-tools.md +91 -77
  99. package/framework/templates/IDE-SNIPPETS.md +2 -6
  100. package/framework/templates/README.md +709 -814
  101. package/framework/templates/REGISTRY.json +223 -762
  102. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
  103. package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
  104. package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
  105. package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
  106. package/framework/templates/code/dotnet/backend/repository.cs +148 -141
  107. package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
  108. package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
  109. package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
  110. package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
  111. package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
  112. package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
  113. package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
  114. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
  115. package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
  116. package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
  117. package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
  118. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
  119. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
  120. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
  121. package/framework/templates/code/dotnet/jobs/job.cs +21 -17
  122. package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
  123. package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
  124. package/framework/templates/code/dotnet/test.cs +192 -106
  125. package/framework/templates/context/ARCHITECTURE.md +89 -0
  126. package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
  127. package/framework/templates/context/CONTEXT.md +180 -181
  128. package/framework/templates/context/design-system.md +1 -5
  129. package/framework/templates/docs/onboarding.md +2 -3
  130. package/framework/templates/docs/proposal.md +171 -182
  131. package/framework/templates/docs/spec.md +1 -3
  132. package/framework/templates/docs/ui-components.md +0 -72
  133. package/framework/templates/examples/design-system-examples.md +4 -4
  134. package/framework/templates/feature/decisions.md +0 -66
  135. package/framework/templates/feature/recap.md +1 -2
  136. package/framework/templates/infrastructure/github/README.md +56 -593
  137. package/framework/templates/integrations/clerk-config.cs +0 -41
  138. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  139. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
  140. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
  141. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
  142. package/framework/templates/project/validate.js +2 -4
  143. package/framework/templates/ui/design-system.css +1 -1
  144. package/framework/workflows/README.md +8 -8
  145. package/framework/workflows/configs/fast-track.json +51 -0
  146. package/framework/workflows/configs/full.json +68 -0
  147. package/framework/workflows/configs/standard.json +7 -3
  148. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
  149. package/framework/workflows/docs/enforcement-pipeline.md +18 -19
  150. package/framework/workflows/docs/full-morph.md +69 -76
  151. package/framework/workflows/docs/standard.md +49 -44
  152. package/framework/workflows/docs/ui-refresh.md +1 -1
  153. package/package.json +3 -3
  154. package/src/commands/agents/dispatch-agents.js +55 -116
  155. package/src/commands/context/context-refresh.js +79 -0
  156. package/src/commands/phase/phase-reset.js +1 -1
  157. package/src/commands/project/doctor.js +10 -32
  158. package/src/commands/project/init.js +12 -0
  159. package/src/commands/project/status.js +6 -12
  160. package/src/commands/scaffold/scaffold.js +131 -0
  161. package/src/commands/scope/escalate.js +1 -1
  162. package/src/commands/state/advance-phase.js +15 -29
  163. package/src/commands/state/state.js +20 -5
  164. package/src/commands/tasks/task.js +0 -30
  165. package/src/commands/validation/validate-feature.js +3 -10
  166. package/src/core/paths/output-schema.js +12 -13
  167. package/src/core/state/phase-state-machine.js +211 -217
  168. package/src/core/state/state-manager.js +9 -9
  169. package/src/lib/agents/agents-manager.js +2 -2
  170. package/src/lib/agents/output-collector.js +1 -2
  171. package/src/lib/detectors/design-system-detector.js +4 -4
  172. package/src/lib/detectors/index.js +1 -11
  173. package/src/lib/generators/architecture-scanner.js +640 -0
  174. package/src/lib/generators/context-generator.js +3 -3
  175. package/src/lib/generators/design-system-generator.js +508 -587
  176. package/src/lib/generators/index.js +12 -10
  177. package/src/lib/generators/metadata-extractor.js +386 -387
  178. package/src/lib/generators/recap-generator.js +4 -4
  179. package/src/lib/generators/scaffold-generator.js +317 -0
  180. package/src/lib/generators/settings-generator.js +0 -1
  181. package/src/lib/phase-chain/phase-validator.js +64 -42
  182. package/src/lib/stack/stack-profile.js +2 -2
  183. package/src/lib/standards/digest-builder.js +72 -285
  184. package/src/lib/tasks/task-parser.js +11 -5
  185. package/src/lib/validators/architecture/architecture-validator.js +259 -387
  186. package/src/lib/validators/content/content-validator.js +287 -287
  187. package/src/lib/validators/css/css-validator.js +340 -352
  188. package/src/lib/validators/packages/package-validator.js +347 -360
  189. package/src/lib/validators/shared/issue-counter.js +14 -18
  190. package/src/lib/validators/validation-runner.js +3 -19
  191. package/src/scripts/setup-infra.js +1 -1
  192. package/src/utils/agents-installer.js +24 -3
  193. package/src/utils/file-copier.js +1 -0
  194. package/src/utils/hooks-installer.js +11 -19
  195. package/src/utils/skills-installer.js +178 -178
  196. package/framework/agents/architecture/prompt-engineer.md +0 -195
  197. package/framework/agents/backend/api-designer.md +0 -106
  198. package/framework/agents/frontend/blazor-builder.md +0 -229
  199. package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
  200. package/framework/agents/infrastructure/azure-architect.md +0 -150
  201. package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
  202. package/framework/agents/infrastructure/bicep-architect.md +0 -132
  203. package/framework/agents/infrastructure/container-specialist.md +0 -137
  204. package/framework/agents/infrastructure/devops-engineer.md +0 -126
  205. package/framework/agents/integrations/azure-identity.md +0 -148
  206. package/framework/agents/quality/code-analyzer.md +0 -239
  207. package/framework/agents/quality/testing-specialist.md +0 -130
  208. package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
  209. package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
  210. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
  211. package/framework/index/troubleshooting-index.json +0 -184
  212. package/framework/rules/testing-standards.md +0 -14
  213. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
  214. package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
  215. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
  216. package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
  217. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
  218. package/framework/standards/ai-agents/blazor-ui.md +0 -364
  219. package/framework/standards/architecture/ddd/aggregates.md +0 -120
  220. package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
  221. package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
  222. package/framework/standards/architecture/ddd/entities.md +0 -99
  223. package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
  224. package/framework/standards/architecture/ddd/value-objects.md +0 -124
  225. package/framework/standards/backend/api/minimal-api.md +0 -494
  226. package/framework/standards/backend/api/rest.md +0 -492
  227. package/framework/standards/backend/authentication/passkeys.md +0 -428
  228. package/framework/standards/backend/database/ef-core.md +0 -199
  229. package/framework/standards/backend/database/migrations.md +0 -393
  230. package/framework/standards/backend/database/repository-patterns.md +0 -528
  231. package/framework/standards/backend/dotnet/async.md +0 -366
  232. package/framework/standards/backend/dotnet/core.md +0 -117
  233. package/framework/standards/backend/dotnet/di.md +0 -439
  234. package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  235. package/framework/standards/context/analytics.md +0 -96
  236. package/framework/standards/context/bundles.md +0 -110
  237. package/framework/standards/context/priming.md +0 -78
  238. package/framework/standards/core/architecture.md +0 -185
  239. package/framework/standards/core/coding.md +0 -214
  240. package/framework/standards/core/git-branching-strategy.md +0 -403
  241. package/framework/standards/core/git.md +0 -185
  242. package/framework/standards/core/testing.md +0 -295
  243. package/framework/standards/data/nosql/blob-storage.md +0 -102
  244. package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  245. package/framework/standards/frontend/blazor/design-checklist.md +0 -222
  246. package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  247. package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  248. package/framework/standards/frontend/blazor/html-conversion.md +0 -184
  249. package/framework/standards/frontend/blazor/lifecycle.md +0 -195
  250. package/framework/standards/frontend/blazor/pitfalls.md +0 -198
  251. package/framework/standards/frontend/blazor/state.md +0 -191
  252. package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
  253. package/framework/standards/frontend/design-system/design-trends.md +0 -171
  254. package/framework/standards/infrastructure/azure/azure.md +0 -624
  255. package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  256. package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  257. package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  258. package/framework/standards/infrastructure/azure/services/functions.md +0 -486
  259. package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  260. package/framework/standards/infrastructure/azure/services/storage.md +0 -407
  261. package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
  262. package/framework/standards/integration/api/graphql.md +0 -91
  263. package/framework/standards/integration/api/grpc.md +0 -114
  264. package/framework/standards/integration/api/rest-design.md +0 -95
  265. package/framework/standards/integration/event-driven/cqrs.md +0 -101
  266. package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  267. package/framework/standards/integration/event-driven/service-bus.md +0 -95
  268. package/framework/standards/observability/logging.md +0 -131
  269. package/framework/standards/observability/metrics.md +0 -121
  270. package/framework/standards/observability/monitoring.md +0 -114
  271. package/framework/standards/observability/tracing.md +0 -132
  272. package/framework/standards/workflows/parallel-execution.md +0 -112
  273. package/framework/standards/workflows/thread-management.md +0 -113
  274. package/framework/templates/code/dotnet/backend/service.cs +0 -139
  275. package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  276. package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  277. package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  278. package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  279. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
  280. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
  281. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
  282. package/framework/templates/code/dotnet/frontend/component.razor +0 -239
  283. package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  284. package/framework/templates/infrastructure/azure/README.md +0 -286
  285. package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  286. package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  287. package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  288. package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  289. package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  290. package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  291. package/framework/templates/infrastructure/azure/deploy.sh +0 -208
  292. package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  293. package/framework/templates/infrastructure/azure/main.bicep +0 -189
  294. package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  295. package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  296. package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  297. package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  298. package/framework/templates/infrastructure/azure/storage.bicep +0 -106
  299. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  300. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  301. package/framework/templates/integrations/azure-identity-config.cs +0 -288
  302. package/framework/templates/project-structure/dotnet-ddd.md +0 -70
  303. package/framework/templates/saas/subscription.cs +0 -347
  304. package/framework/templates/saas/tenant.cs +0 -338
  305. package/framework/templates/ui/FluentDesignTheme.cs +0 -149
  306. package/framework/templates/ui/MudTheme.cs +0 -281
  307. package/framework/workflows/configs/nodejs-cli.json +0 -40
  308. package/src/commands/standards/context-budget.js +0 -89
  309. package/src/lib/standards/index.js +0 -7
  310. package/src/lib/standards/standards-context-injector.js +0 -302
  311. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
  312. package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
  313. package/src/lib/validators/blazor/blazor-validator.js +0 -369
  314. package/src/lib/validators/blazor/index.js +0 -9
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * SessionStart Hook: Resume Context Orientation
5
+ *
6
+ * Event: SessionStart | Matcher: resume
7
+ *
8
+ * Fires ONLY when a session resumes via /resume.
9
+ * Injects a brief orientation message so Claude immediately knows
10
+ * the active feature, phase, in-progress tasks, and last checkpoint.
11
+ *
12
+ * Fail-open: exits 0 on any error.
13
+ */
14
+
15
+ import { existsSync, readFileSync } from 'fs';
16
+ import { join } from 'path';
17
+ import {
18
+ stateExists, getActiveFeature, derivePhaseForFeature,
19
+ } from '../../shared/state-reader.js';
20
+ import { injectContext, pass } from '../../shared/hook-response.js';
21
+ import { logHookActivity } from '../../shared/activity-logger.js';
22
+ import { SPEC_SUMMARY_MAX_CHARS } from '../../shared/compact-restore.js';
23
+
24
+ try {
25
+ if (!stateExists()) pass();
26
+
27
+ const active = getActiveFeature();
28
+ if (!active) pass();
29
+
30
+ const { name, feature } = active;
31
+ const phase = derivePhaseForFeature(name);
32
+ const cwd = process.cwd();
33
+
34
+ const lines = [
35
+ `🔄 RESUME — Você está continuando a feature "${name}" na fase ${phase}.`,
36
+ ];
37
+
38
+ // In-progress tasks
39
+ const taskList = Array.isArray(feature.taskList) ? feature.taskList : [];
40
+ const inProg = taskList.filter(t => t.status === 'in_progress');
41
+ if (inProg.length > 0) {
42
+ const ids = inProg.map(t => t.id).join(', ');
43
+ lines.push(`Tasks em progresso: ${ids}`);
44
+ }
45
+
46
+ // Task progress summary
47
+ const tasks = feature.tasks || {};
48
+ if (tasks.total > 0) {
49
+ lines.push(`Progresso: ${tasks.completed || 0}/${tasks.total} tasks concluídas`);
50
+ }
51
+
52
+ // Last checkpoint
53
+ const checkpoints = Array.isArray(feature.checkpoints) ? feature.checkpoints : [];
54
+ if (checkpoints.length > 0) {
55
+ const last = checkpoints[checkpoints.length - 1];
56
+ lines.push(`Último checkpoint: #${last.checkpointNum} (${last.passed ? 'passed' : 'failed'})`);
57
+ }
58
+
59
+ // Spec summary (truncated)
60
+ const specPath = join(cwd, `.morph/features/${name}/2-design/spec.md`);
61
+ if (existsSync(specPath)) {
62
+ try {
63
+ const raw = readFileSync(specPath, 'utf-8');
64
+ const summary = raw.length > SPEC_SUMMARY_MAX_CHARS
65
+ ? raw.slice(0, SPEC_SUMMARY_MAX_CHARS) + '\n[... truncated]'
66
+ : raw;
67
+ lines.push('');
68
+ lines.push('Spec summary:');
69
+ lines.push(summary);
70
+ } catch { /* non-blocking */ }
71
+ }
72
+
73
+ logHookActivity('resume-context', 'SessionStart', 'resume_injected');
74
+ injectContext(lines.join('\n'));
75
+ } catch {
76
+ process.exit(0);
77
+ }
@@ -37,19 +37,18 @@ _CREATE_NO_WINDOW = 0x08000000 if os.name == 'nt' else 0
37
37
  # ── MORPH framework constants (derived from phases.json / trust-manager.js) ──
38
38
 
39
39
  PHASE_POSITIONS = {
40
- 'proposal': 1, 'setup': 1,
40
+ 'proposal': 1,
41
41
  'uiux': 2, 'design': 2,
42
- 'clarify': 3,
42
+ 'plan': 3,
43
43
  'tasks': 4,
44
44
  'implement': 5, 'sync': 5,
45
45
  }
46
46
  PHASE_LABELS = {
47
47
  'proposal': 'proposal',
48
- 'setup': 'setup',
49
48
  'uiux': 'UI/UX',
50
49
  'design': 'design',
51
- 'clarify': 'refinement',
52
- 'tasks': 'planning',
50
+ 'plan': 'planning',
51
+ 'tasks': 'tasks',
53
52
  'implement': 'implement',
54
53
  'sync': 'sync',
55
54
  }
@@ -30,7 +30,7 @@ import { logHookActivity } from '../../shared/activity-logger.js';
30
30
  const COMPACT_TRIGGER_PHASES = new Set(['implement']);
31
31
 
32
32
  // Phases where compaction is suggested when arriving from a heavy spec phase
33
- const HEAVY_SOURCE_PHASES = new Set(['tasks', 'design', 'clarify', 'uiux']);
33
+ const HEAVY_SOURCE_PHASES = new Set(['tasks', 'design', 'uiux']);
34
34
 
35
35
  try {
36
36
  // Prevent infinite loop
@@ -78,7 +78,7 @@ try {
78
78
  ` loaded during planning take significant space. A compact now gives`,
79
79
  ` Claude a clean slate focused on writing code.`,
80
80
  ``,
81
- ` After /compact, resume with: morph-spec task next ${name}`,
81
+ ` After /compact, resume with: morph-spec task start ${name} <next-task-id>`,
82
82
  );
83
83
  }
84
84
 
@@ -96,7 +96,7 @@ try {
96
96
  }
97
97
 
98
98
  // Missing outputs in spec phases
99
- if (['proposal', 'design', 'clarify', 'tasks', 'uiux'].includes(currentPhase)) {
99
+ if (['proposal', 'design', 'tasks', 'uiux'].includes(currentPhase)) {
100
100
  const missing = getMissingOutputs(name);
101
101
  if (missing.length > 0) {
102
102
  warnings.push(`Missing outputs for '${name}' (${currentPhase} phase):`);
@@ -124,7 +124,7 @@ try {
124
124
  }
125
125
 
126
126
  // ── MEMORY.md reminder ────────────────────────────────────────────────────
127
- const WORK_PHASES = new Set(['design', 'clarify', 'tasks', 'implement']);
127
+ const WORK_PHASES = new Set(['design', 'tasks', 'implement']);
128
128
  const memoryLines = [];
129
129
  if (WORK_PHASES.has(currentPhase)) {
130
130
  memoryLines.push('📝 Sessão encerrando. Considere salvar no MEMORY.md:');
@@ -39,8 +39,11 @@ try {
39
39
  if (promptLower.includes(featureName.toLowerCase())) {
40
40
  const featurePhase = feature.phase || derivePhaseForFeature(featureName);
41
41
  context.push(`[morph-spec] Feature '${featureName}': phase=${featurePhase}, status=${feature.status}`);
42
- if (feature.tasks?.total > 0) {
43
- context.push(` Tasks: ${feature.tasks.completed || 0}/${feature.tasks.total} completed`);
42
+ const taskList = feature.taskList || [];
43
+ const activeTasks = taskList.filter(t => t.status !== 'expanded');
44
+ if (activeTasks.length > 0) {
45
+ const completed = activeTasks.filter(t => t.status === 'completed').length;
46
+ context.push(` Tasks: ${completed}/${activeTasks.length} completed`);
44
47
  }
45
48
  break; // Only inject for the first matched feature
46
49
  }
@@ -64,15 +67,12 @@ try {
64
67
 
65
68
  // Coding intent during implement phase but no task in_progress
66
69
  if (wantsToCode && activePhase === 'implement') {
67
- let hasActiveTask = feature.tasks?.inProgress > 0;
68
- if (!hasActiveTask && feature.taskList) {
69
- hasActiveTask = feature.taskList.some(t => t.status === 'in_progress');
70
- }
70
+ const hasActiveTask = feature.taskList?.some(t => t.status === 'in_progress') ||
71
+ feature.tasks?.inProgress > 0; // fallback for legacy state
71
72
  if (!hasActiveTask) {
72
73
  context.push(
73
74
  `[morph-spec] REMINDER: No task is currently in_progress for '${name}'.` +
74
75
  ` Start a task before coding:\n` +
75
- ` morph-spec task next ${name} # see what's next\n` +
76
76
  ` morph-spec task start ${name} <id> # mark it in progress`
77
77
  );
78
78
  }
@@ -95,7 +95,7 @@ try {
95
95
  if (promptLower.includes('next task') || promptLower.includes('what\'s next')) {
96
96
  if (activePhase === 'implement') {
97
97
  context.push(
98
- `[morph-spec] Use: morph-spec task next ${name}`
98
+ `[morph-spec] Check tasks.md for the next task, then: morph-spec task start ${name} <id>`
99
99
  );
100
100
  }
101
101
  }
@@ -8,17 +8,19 @@
8
8
  * Pure functions — no I/O.
9
9
  */
10
10
 
11
- export const DECISIONS_MAX_CHARS = 1500;
12
- export const MAX_PENDING_TASKS = 8;
11
+ export const DECISIONS_MAX_CHARS = 3000;
12
+ export const MAX_PENDING_TASKS = 8;
13
+ export const SPEC_SUMMARY_MAX_CHARS = 3000;
13
14
 
14
15
  /**
15
16
  * Build the richContext object to embed in pre-compact memory file.
16
- * @param {Object} feature - Feature state object (tasks, taskList)
17
+ * @param {Object} feature - Feature state object (tasks, taskList, checkpoints)
17
18
  * @param {string} phase - Current derived phase string
18
19
  * @param {string} decisionsContent - Raw text of decisions.md (may be empty string)
20
+ * @param {string} [specContent=''] - Raw text of spec.md (may be empty string)
19
21
  * @returns {Object} richContext
20
22
  */
21
- export function buildRichContext(feature, phase, decisionsContent) {
23
+ export function buildRichContext(feature, phase, decisionsContent, specContent = '') {
22
24
  const taskList = Array.isArray(feature.taskList) ? feature.taskList : [];
23
25
 
24
26
  const inProgress = taskList
@@ -34,12 +36,23 @@ export function buildRichContext(feature, phase, decisionsContent) {
34
36
  ? decisionsContent.slice(0, DECISIONS_MAX_CHARS)
35
37
  : decisionsContent;
36
38
 
39
+ const specSummary = specContent.length > SPEC_SUMMARY_MAX_CHARS
40
+ ? specContent.slice(0, SPEC_SUMMARY_MAX_CHARS)
41
+ : specContent;
42
+
43
+ const checkpoints = Array.isArray(feature.checkpoints) ? feature.checkpoints : [];
44
+ const lastCheckpoint = checkpoints.length > 0
45
+ ? { passed: checkpoints[checkpoints.length - 1].passed, checkpointNum: checkpoints[checkpoints.length - 1].checkpointNum }
46
+ : null;
47
+
37
48
  return {
38
49
  phase,
39
50
  tasks: feature.tasks || {},
40
51
  decisionsSnippet,
41
52
  inProgress,
42
53
  nextPending,
54
+ specSummary,
55
+ lastCheckpoint,
43
56
  };
44
57
  }
45
58
 
@@ -53,7 +66,7 @@ export function buildRestoreBlock(memorySnapshot) {
53
66
  if (!rc) return null;
54
67
 
55
68
  const { timestamp, activeFeature } = memorySnapshot;
56
- const { phase, tasks, decisionsSnippet, inProgress, nextPending } = rc;
69
+ const { phase, tasks, decisionsSnippet, inProgress, nextPending, specSummary, lastCheckpoint } = rc;
57
70
 
58
71
  const done = tasks?.completed ?? '?';
59
72
  const total = tasks?.total ?? '?';
@@ -63,6 +76,16 @@ export function buildRestoreBlock(memorySnapshot) {
63
76
  `Active feature: ${activeFeature} | Phase: ${phase} | Tasks: ${done}/${total}`,
64
77
  ];
65
78
 
79
+ if (lastCheckpoint) {
80
+ lines.push(`Last checkpoint: #${lastCheckpoint.checkpointNum} (${lastCheckpoint.passed ? 'passed' : 'failed'})`);
81
+ }
82
+
83
+ if (specSummary) {
84
+ lines.push('');
85
+ lines.push('Spec summary (at time of compact):');
86
+ lines.push(specSummary);
87
+ }
88
+
66
89
  if (decisionsSnippet) {
67
90
  lines.push('');
68
91
  lines.push('Key decisions (at time of compact):');
@@ -8,15 +8,13 @@
8
8
  */
9
9
 
10
10
  /** Phase order */
11
- export const PHASE_ORDER = ["proposal","setup","uiux","design","clarify","plan","tasks","implement","sync"];
11
+ export const PHASE_ORDER = ["proposal","uiux","design","plan","tasks","implement","sync"];
12
12
 
13
13
  /** Map phase → allowed output subdirectory */
14
14
  export const PHASE_DIRS = {
15
15
  proposal: '0-proposal',
16
- setup: '0-proposal',
17
- uiux: '2-ui',
18
- design: '1-design',
19
- clarify: '1-design',
16
+ uiux: '1-ui',
17
+ design: '2-design',
20
18
  plan: '3-plan',
21
19
  tasks: '4-tasks',
22
20
  implement: '5-implement',
@@ -28,7 +26,6 @@ export const OUTPUT_PHASE_MAP = {
28
26
  proposal: 'proposal',
29
27
  schemaAnalysis: 'design',
30
28
  spec: 'design',
31
- clarifications: 'clarify',
32
29
  contracts: 'design',
33
30
  contractsTs: 'design',
34
31
  contractsVsa: 'design',
@@ -47,7 +44,6 @@ export const FILENAME_TO_OUTPUT = {
47
44
  'proposal.md': 'proposal',
48
45
  'schema-analysis.md': 'schemaAnalysis',
49
46
  'spec.md': 'spec',
50
- 'clarifications.md': 'clarifications',
51
47
  'contracts.cs': 'contracts',
52
48
  'contracts.ts': 'contractsTs',
53
49
  'contracts-vsa.cs': 'contractsVsa',
@@ -90,7 +86,7 @@ export function extractFeatureName(filePath) {
90
86
  /**
91
87
  * Extract phase subdirectory from a .morph/features/{feature}/{phaseDir}/... path
92
88
  * @param {string} filePath - File path to analyze
93
- * @returns {string|null} Phase directory (e.g., '0-proposal', '1-design') or null
89
+ * @returns {string|null} Phase directory (e.g., '0-proposal', '2-design') or null
94
90
  */
95
91
  export function extractPhaseDir(filePath) {
96
92
  const normalized = filePath.replace(/\\/g, '/');
@@ -110,14 +110,14 @@ export function derivePhaseForFeature(featureName, projectPath) {
110
110
  ['5-implement', 'implement'],
111
111
  ['4-tasks', 'tasks'],
112
112
  ['3-plan', 'plan'],
113
- ['2-ui', 'uiux'],
114
- ['1-design', 'design'],
113
+ ['2-design', 'design'],
114
+ ['1-ui', 'uiux'],
115
115
  ['0-proposal', 'proposal'],
116
116
  ];
117
117
  for (const [folder, phase] of phaseMap) {
118
118
  if (existsSync(join(basePath, folder))) return phase;
119
119
  }
120
- return 'setup';
120
+ return 'proposal';
121
121
  }
122
122
 
123
123
  /**
@@ -181,6 +181,37 @@ export function getOutputs(featureName, projectPath) {
181
181
  * @param {string} [projectPath]
182
182
  * @returns {Array<{type: string, path: string}>}
183
183
  */
184
+ /**
185
+ * Get task statistics directly from taskList (preferred over feature.tasks counters).
186
+ * Excludes expanded tasks from counts, matching calculateProgress() behavior.
187
+ *
188
+ * @param {Object} feature - Feature state object
189
+ * @returns {{ total: number, completed: number, inProgress: number, pending: number }}
190
+ */
191
+ export function getTaskStats(feature) {
192
+ const list = feature?.taskList || [];
193
+ if (list.length > 0) {
194
+ const active = list.filter(t => t.status !== 'expanded');
195
+ return {
196
+ total: active.length,
197
+ completed: active.filter(t => t.status === 'completed').length,
198
+ inProgress: active.filter(t => t.status === 'in_progress').length,
199
+ pending: active.filter(t => t.status === 'pending').length,
200
+ };
201
+ }
202
+ // Fallback: read from legacy counter object
203
+ const tasks = feature?.tasks;
204
+ if (tasks && typeof tasks === 'object' && !Array.isArray(tasks)) {
205
+ return {
206
+ total: tasks.total || 0,
207
+ completed: tasks.completed || 0,
208
+ inProgress: tasks.inProgress || 0,
209
+ pending: tasks.pending || 0,
210
+ };
211
+ }
212
+ return { total: 0, completed: 0, inProgress: 0, pending: 0 };
213
+ }
214
+
184
215
  export function getMissingOutputs(featureName, projectPath) {
185
216
  const feature = getFeature(featureName, projectPath);
186
217
  if (!feature?.outputs) return [];
@@ -22,27 +22,10 @@
22
22
  { "trigger": "beforePhaseStart", "skill": "morph-brainstorming" }
23
23
  ]
24
24
  },
25
- "setup": {
26
- "id": "setup",
27
- "index": 1,
28
- "folder": null,
29
- "displayName": "Setup",
30
- "goals": [
31
- "Load project context from .morph/context/",
32
- "Activate relevant agents by tier and keyword",
33
- "Confirm workflow type (fast-track / standard / full-morph)"
34
- ],
35
- "requiredOutputs": [],
36
- "optionalOutputs": [],
37
- "recommendedMCPs": ["github"],
38
- "pausePoints": [],
39
- "agentTiers": [1, 2],
40
- "requiredSkills": []
41
- },
42
25
  "uiux": {
43
26
  "id": "uiux",
44
- "index": 1.5,
45
- "folder": "2-ui",
27
+ "index": 2,
28
+ "folder": "1-ui",
46
29
  "displayName": "UI/UX Design",
47
30
  "optional": true,
48
31
  "goals": [
@@ -59,14 +42,13 @@
59
42
  "agentTiers": [1, 2, 3],
60
43
  "requiredSkills": [
61
44
  { "trigger": "beforeArchitecturalDecision", "skill": "morph-brainstorming" },
62
- { "trigger": "onHTMLPrototypeAvailable", "skill": "morph-replicate" },
63
45
  { "trigger": "beforePhaseComplete", "skill": "morph-frontend-review" }
64
46
  ]
65
47
  },
66
48
  "design": {
67
49
  "id": "design",
68
- "index": 2,
69
- "folder": "1-design",
50
+ "index": 3,
51
+ "folder": "2-design",
70
52
  "displayName": "Technical Design",
71
53
  "goals": [
72
54
  "Write technical specification",
@@ -75,8 +57,8 @@
75
57
  "Document architectural decisions"
76
58
  ],
77
59
  "requiredOutputs": ["spec", "contracts"],
78
- "optionalOutputs": ["schemaAnalysis", "clarifications", "decisions"],
79
- "recommendedMCPs": ["supabase", "context7", "github"],
60
+ "optionalOutputs": ["schemaAnalysis", "decisions"],
61
+ "recommendedMCPs": ["context7", "github"],
80
62
  "pausePoints": [
81
63
  { "id": "design", "label": "Approve Design Spec" }
82
64
  ],
@@ -89,26 +71,6 @@
89
71
  { "trigger": "beforePhaseComplete", "skill": "morph-verification-before-completion" }
90
72
  ]
91
73
  },
92
- "clarify": {
93
- "id": "clarify",
94
- "index": 3,
95
- "folder": "1-design",
96
- "displayName": "Clarification",
97
- "goals": [
98
- "Resolve open questions and ambiguities",
99
- "Update spec with clarification decisions",
100
- "Confirm edge cases are handled"
101
- ],
102
- "requiredOutputs": ["clarifications"],
103
- "optionalOutputs": [],
104
- "recommendedMCPs": ["context7", "github"],
105
- "pausePoints": [],
106
- "agentTiers": [1, 2],
107
- "requiredSkills": [
108
- { "trigger": "beforePhaseStart", "skill": "morph-phase-clarify" },
109
- { "trigger": "beforePhaseComplete", "skill": "morph-verification-before-completion" }
110
- ]
111
- },
112
74
  "plan": {
113
75
  "id": "plan",
114
76
  "index": 5,
@@ -166,7 +128,7 @@
166
128
  ],
167
129
  "requiredOutputs": ["recap"],
168
130
  "optionalOutputs": [],
169
- "recommendedMCPs": ["supabase", "context7", "playwright", "github", "vercel", "docker", "azure"],
131
+ "recommendedMCPs": ["context7", "playwright", "github", "vercel"],
170
132
  "pausePoints": [],
171
133
  "agentTiers": [1, 2, 3, 4],
172
134
  "requiredSkills": [
@@ -0,0 +1,15 @@
1
+ ---
2
+ paths:
3
+ - "**/Agents/**"
4
+ - "**/agents/**"
5
+ - "**/*Agent*.cs"
6
+ stacks:
7
+ - dotnet
8
+ ---
9
+
10
+ # Microsoft Agent Framework Standards
11
+
12
+ @.morph/framework/standards/ai-agents/setup.md
13
+ @.morph/framework/standards/ai-agents/workflows.md
14
+ @.morph/framework/standards/ai-agents/production.md
15
+ @.morph/framework/standards/integration/mcp/mcp-tools.md
@@ -0,0 +1,13 @@
1
+ ---
2
+ paths:
3
+ - "**/Payment*/**"
4
+ - "**/Billing/**"
5
+ - "**/Asaas/**"
6
+ - "**/Financial/**"
7
+ stacks:
8
+ - dotnet
9
+ ---
10
+
11
+ # Asaas Payment Integration Standards
12
+
13
+ @.morph/framework/standards/backend/integrations/asaas/asaas-api.md
@@ -0,0 +1,13 @@
1
+ ---
2
+ paths:
3
+ - "**/Auth/**"
4
+ - "**/auth/**"
5
+ - "**/Identity/**"
6
+ - "**/Clerk/**"
7
+ stacks:
8
+ - dotnet
9
+ ---
10
+
11
+ # Clerk Authentication Standards
12
+
13
+ @.morph/framework/standards/backend/integrations/clerk/clerk-auth.md
@@ -4,10 +4,14 @@ paths:
4
4
  - "**/*.csproj"
5
5
  stacks:
6
6
  - dotnet
7
- - blazor
8
7
  ---
9
8
 
10
- # C# and .NET Standards
9
+ # C# and .NET VSA Standards
11
10
 
12
- @.morph/framework/standards/core/coding.md
13
- @.morph/framework/standards/backend/dotnet/core.md
11
+ @.morph/framework/standards/architecture/vertical-slice/vertical-slice.md
12
+ @.morph/framework/standards/backend/dotnet/vsa-handler-patterns.md
13
+ @.morph/framework/standards/backend/dotnet/result-pattern.md
14
+ @.morph/framework/standards/backend/dotnet/fluent-validation-vsa.md
15
+ @.morph/framework/standards/backend/dotnet/scrutor.md
16
+ @.morph/framework/standards/backend/dotnet/scalar-ui.md
17
+ @.morph/framework/standards/backend/api/validation.md
@@ -0,0 +1,18 @@
1
+ ---
2
+ paths:
3
+ - "**/*Cache*.cs"
4
+ - "**/*Redis*.cs"
5
+ - "**/*Cosmos*.cs"
6
+ - "**/*Vector*.cs"
7
+ - "**/*Embedding*.cs"
8
+ - "**/*Rag*.cs"
9
+ stacks:
10
+ - dotnet
11
+ ---
12
+
13
+ # Data & Cache Standards
14
+
15
+ @.morph/framework/standards/data/nosql/cache/redis.md
16
+ @.morph/framework/standards/data/nosql/cosmos-db.md
17
+ @.morph/framework/standards/data/vector-search/rag-chunking.md
18
+ @.morph/framework/standards/backend/database/vector-search-rag.md
@@ -0,0 +1,87 @@
1
+ ---
2
+ paths:
3
+ - "**/*.cs"
4
+ - "**/*.csproj"
5
+ stacks:
6
+ - dotnet
7
+ ---
8
+
9
+ # .NET Code Templates
10
+
11
+ When implementing .NET features, use these templates as reference patterns.
12
+ Read the template file to see the exact pattern, then generate code following it.
13
+
14
+ ## Scaffold (preferred for new slices)
15
+
16
+ **Always use scaffold for new VSA slices — never create feature files manually.**
17
+
18
+ ```bash
19
+ morph-spec scaffold dotnet <feature> <slice-name> [--namespace <ns>] [--dry-run]
20
+ ```
21
+
22
+ Examples:
23
+ ```bash
24
+ morph-spec scaffold dotnet book create-book
25
+ morph-spec scaffold dotnet book get-book-by-id
26
+ morph-spec scaffold dotnet book update-book
27
+ morph-spec scaffold dotnet book delete-book
28
+ morph-spec scaffold dotnet book get-all-books
29
+ ```
30
+
31
+ Generates 7 files: endpoint, handler, request, response, validator + entity, errors (shared at feature level). Entity/errors auto-skipped if they already exist.
32
+
33
+ **Only use `template render` for individual files when adding to an existing slice.**
34
+
35
+ ## VSA Feature Templates (Vertical Slice Architecture)
36
+
37
+ For each new feature slice, follow the patterns in these templates:
38
+
39
+ | Template | Path | Purpose |
40
+ |----------|------|---------|
41
+ | Endpoint | `.morph/framework/templates/code/dotnet/feature/endpoint.cs.hbs` | IApiEndpoint with MapEndpoint() |
42
+ | Handler | `.morph/framework/templates/code/dotnet/feature/handler.cs.hbs` | IHandler<TRequest, TResponse> |
43
+ | Request | `.morph/framework/templates/code/dotnet/feature/request.cs.hbs` | Sealed record DTO |
44
+ | Response | `.morph/framework/templates/code/dotnet/feature/response.cs.hbs` | Sealed record DTO |
45
+ | Validator | `.morph/framework/templates/code/dotnet/feature/validator.cs.hbs` | FluentValidation AbstractValidator |
46
+ | Entity | `.morph/framework/templates/code/dotnet/feature/entity.cs.hbs` | Domain entity |
47
+ | Errors | `.morph/framework/templates/code/dotnet/feature/errors.cs.hbs` | Error factory |
48
+
49
+ ## Base Abstractions (read once per project setup)
50
+
51
+ | Template | Path | Purpose |
52
+ |----------|------|---------|
53
+ | IHandler | `.morph/framework/templates/code/dotnet/abstractions/handler.cs` | Handler interface |
54
+ | Result<T> | `.morph/framework/templates/code/dotnet/abstractions/result.cs` | Railway-oriented result |
55
+ | Error | `.morph/framework/templates/code/dotnet/abstractions/error.cs` | Error types |
56
+ | IApiEndpoint | `.morph/framework/templates/code/dotnet/abstractions/api-endpoint.cs` | Endpoint interface |
57
+
58
+ ## Extensions & Pipeline (read once per project setup)
59
+
60
+ | Template | Path | Purpose |
61
+ |----------|------|---------|
62
+ | Handler Registration | `.morph/framework/templates/code/dotnet/extensions/handler-registration.cs` | Scrutor auto-discovery |
63
+ | Map Endpoints | `.morph/framework/templates/code/dotnet/extensions/map-endpoints.cs` | IApiEndpoint discovery |
64
+ | Result Extensions | `.morph/framework/templates/code/dotnet/extensions/result-extensions.cs` | Match() pattern |
65
+ | Database Config | `.morph/framework/templates/code/dotnet/extensions/database-extensions.cs` | EF Core + Npgsql |
66
+ | Health Checks | `.morph/framework/templates/code/dotnet/extensions/health-checks.cs` | Health endpoints |
67
+ | Validation Decorator | `.morph/framework/templates/code/dotnet/pipelines/validation-decorator.cs` | FluentValidation pipeline |
68
+ | Logging Decorator | `.morph/framework/templates/code/dotnet/pipelines/logging-decorator.cs` | Duration tracking |
69
+ | Exception Handler | `.morph/framework/templates/code/dotnet/exceptions/exception-handler.cs` | ProblemDetails |
70
+ | API Tags | `.morph/framework/templates/code/dotnet/constants/api-tags.cs` | Scalar/Swagger groups |
71
+
72
+ ## Specialized Templates
73
+
74
+ | Template | Path | Purpose |
75
+ |----------|------|---------|
76
+ | Repository | `.morph/framework/templates/code/dotnet/backend/repository.cs` | EF Core repository |
77
+ | Migration | `.morph/framework/templates/code/dotnet/database/migration.cs` | EF Core migration |
78
+ | Hangfire Job | `.morph/framework/templates/code/dotnet/jobs/job.cs` | Background job |
79
+ | MAF Agent | `.morph/framework/templates/code/dotnet/jobs/agent.cs` | MS Agent Framework |
80
+ | Unit Test | `.morph/framework/templates/code/dotnet/test.cs` | xUnit AAA test |
81
+ | Contracts VSA | `.morph/framework/templates/code/dotnet/contracts/contracts-vsa.cs` | Full slice contracts |
82
+
83
+ ## Usage
84
+
85
+ 1. **Read the template** to see the exact pattern
86
+ 2. **Generate code following the same structure** (naming, namespaces, imports)
87
+ 3. Or render via CLI: `morph-spec template render <id> <output> '<variables>'`
@@ -1,13 +1,13 @@
1
- ---
2
- paths:
3
- - "**/*.razor"
4
- - "**/*.css"
5
- - "**/*.scss"
6
- stacks:
7
- - blazor
8
- ---
9
-
10
- # Frontend Standards
11
-
12
- @.morph/framework/standards/frontend/blazor/design-checklist.md
13
- @.morph/framework/standards/frontend/design-system/naming.md
1
+ ---
2
+ paths:
3
+ - "**/*.tsx"
4
+ - "**/*.css"
5
+ - "**/*.scss"
6
+ stacks:
7
+ - nextjs
8
+ ---
9
+
10
+ # Frontend Standards
11
+
12
+ @.morph/framework/standards/frontend/design-system/naming.md
13
+ @.morph/framework/standards/frontend/design-system/animations.md
@@ -0,0 +1,13 @@
1
+ ---
2
+ paths:
3
+ - "**/Jobs/**"
4
+ - "**/Background/**"
5
+ - "**/Hangfire/**"
6
+ - "**/Recurring/**"
7
+ stacks:
8
+ - dotnet
9
+ ---
10
+
11
+ # Hangfire Background Jobs Standards
12
+
13
+ @.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md