@polymorphism-tech/morph-spec 4.3.6 → 4.5.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 (375) hide show
  1. package/.morph/.morphversion +3 -3
  2. package/.morph/analytics/threads-log.jsonl +44 -9
  3. package/.morph/config/config.json +2 -3
  4. package/.morph/framework/standards/STANDARDS.json +812 -0
  5. package/.morph/{standards → framework/standards}/ai-agents/team-orchestration.md +3 -3
  6. package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
  7. package/.morph/{templates → framework/templates}/README.md +17 -17
  8. package/.morph/{templates → framework/templates}/REGISTRY.json +48 -233
  9. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  10. package/.morph/{templates → framework/templates}/context/CONTEXT-FEATURE.md +1 -1
  11. package/.morph/{templates → framework/templates}/context/CONTEXT.md +3 -3
  12. package/.morph/framework/templates/docs/clarifications.md +253 -0
  13. package/.morph/framework/templates/docs/onboarding.md +123 -0
  14. package/.morph/framework/templates/docs/schema-analysis.md +119 -0
  15. package/.morph/{templates → framework/templates}/docs/spec.md +149 -149
  16. package/.morph/framework/templates/docs/ui-components.md +124 -0
  17. package/.morph/framework/templates/docs/ui-design-system.md +76 -0
  18. package/.morph/framework/templates/docs/ui-flows.md +167 -0
  19. package/.morph/framework/templates/docs/ui-mockups.md +98 -0
  20. package/.morph/{templates → framework/templates}/examples/spec-examples.md +1 -1
  21. package/.morph/{templates → framework/templates}/infrastructure/github/README.md +11 -11
  22. package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  23. package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  24. package/.morph/{templates → framework/templates}/meta-prompts/validators/pre-commit-validator.md +1 -1
  25. package/.morph/logs/tool-failures.log +51 -0
  26. package/.morph/memory/pre-compact-2026-02-22T17-01-01-658Z.json +16 -0
  27. package/.morph/state.json +1 -1
  28. package/CLAUDE.md +20 -119
  29. package/README.md +20 -18
  30. package/bin/detect-agents.js +1 -1
  31. package/bin/morph-spec.js +116 -266
  32. package/bin/task-manager.cjs +2 -2
  33. package/bin/validate.js +1 -1
  34. package/claude-plugin.json +14 -0
  35. package/docs/claude-alignment-report.md +137 -0
  36. package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +512 -0
  37. package/docs/plans/2026-02-22-claude-settings.md +515 -0
  38. package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +728 -0
  39. package/docs/plans/2026-02-22-morph-spec-next.md +478 -0
  40. package/docs/plans/2026-02-22-native-alignment-design.md +199 -0
  41. package/docs/plans/2026-02-22-native-alignment-impl.md +925 -0
  42. package/docs/plans/2026-02-22-native-enrichment-design.md +244 -0
  43. package/docs/plans/2026-02-22-native-enrichment.md +735 -0
  44. package/framework/CLAUDE.md +77 -0
  45. package/framework/commands/morph-apply.md +9 -9
  46. package/framework/commands/morph-archive.md +8 -8
  47. package/framework/commands/morph-infra.md +1 -1
  48. package/framework/commands/morph-proposal.md +9 -9
  49. package/framework/commands/morph-status.md +3 -3
  50. package/framework/commands/morph-troubleshoot.md +1 -1
  51. package/framework/hooks/README.md +201 -282
  52. package/framework/hooks/claude-code/notification/approval-reminder.js +52 -0
  53. package/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
  54. package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
  55. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
  56. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
  57. package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
  58. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
  59. package/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
  60. package/framework/hooks/claude-code/statusline.py +239 -0
  61. package/framework/hooks/claude-code/statusline.sh +7 -0
  62. package/framework/hooks/claude-code/stop/validate-completion.js +88 -0
  63. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
  64. package/framework/hooks/shared/hook-response.js +45 -0
  65. package/framework/hooks/shared/phase-utils.js +129 -0
  66. package/framework/hooks/shared/state-reader.js +138 -0
  67. package/framework/hooks/shared/stdin-reader.js +26 -0
  68. package/framework/phases.json +145 -0
  69. package/framework/rules/csharp-standards.md +10 -0
  70. package/framework/rules/frontend-standards.md +14 -0
  71. package/framework/rules/infrastructure-standards.md +13 -0
  72. package/framework/rules/morph-workflow.md +86 -0
  73. package/framework/rules/testing-standards.md +11 -0
  74. package/framework/skills/level-0-meta/brainstorming.md +133 -0
  75. package/framework/skills/level-0-meta/code-review.md +12 -4
  76. package/framework/skills/level-0-meta/mcp-registry.json +207 -0
  77. package/framework/skills/level-0-meta/morph-checklist.md +9 -1
  78. package/framework/skills/level-0-meta/simulation-checklist.md +9 -1
  79. package/framework/skills/level-0-meta/tool-usage-guide.md +335 -0
  80. package/framework/skills/level-0-meta/verification-before-completion.md +145 -0
  81. package/framework/skills/level-1-workflows/morph-replicate.md +9 -1
  82. package/framework/skills/level-1-workflows/phase-clarify.md +65 -4
  83. package/framework/skills/level-1-workflows/phase-codebase-analysis.md +182 -0
  84. package/framework/skills/level-1-workflows/phase-design.md +342 -80
  85. package/framework/skills/level-1-workflows/phase-implement.md +254 -0
  86. package/framework/skills/level-1-workflows/phase-setup.md +76 -10
  87. package/framework/skills/level-1-workflows/phase-tasks.md +88 -7
  88. package/framework/skills/level-1-workflows/phase-uiux.md +95 -17
  89. package/framework/skills/level-2-domains/ai-agents/ai-system-architect.md +8 -1
  90. package/framework/skills/level-2-domains/architecture/po-pm-advisor.md +8 -1
  91. package/framework/skills/level-2-domains/architecture/prompt-engineer.md +8 -1
  92. package/framework/skills/level-2-domains/architecture/seo-growth-hacker.md +8 -1
  93. package/framework/skills/level-2-domains/architecture/standards-architect.md +11 -4
  94. package/framework/skills/level-2-domains/backend/api-designer.md +8 -1
  95. package/framework/skills/level-2-domains/backend/dotnet-senior.md +8 -1
  96. package/framework/skills/level-2-domains/backend/ef-modeler.md +8 -1
  97. package/framework/skills/level-2-domains/backend/hangfire-orchestrator.md +9 -2
  98. package/framework/skills/level-2-domains/backend/ms-agent-expert.md +8 -1
  99. package/framework/skills/level-2-domains/frontend/blazor-builder.md +8 -1
  100. package/framework/skills/level-2-domains/frontend/nextjs-expert.md +8 -1
  101. package/framework/skills/level-2-domains/frontend/ui-ux-designer.md +9 -2
  102. package/framework/skills/level-2-domains/infrastructure/azure-architect.md +8 -1
  103. package/framework/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +8 -1
  104. package/framework/skills/level-2-domains/infrastructure/bicep-architect.md +8 -1
  105. package/framework/skills/level-2-domains/infrastructure/container-specialist.md +8 -1
  106. package/framework/skills/level-2-domains/infrastructure/devops-engineer.md +8 -1
  107. package/framework/skills/level-2-domains/integrations/asaas-financial.md +8 -1
  108. package/framework/skills/level-2-domains/integrations/azure-identity.md +8 -1
  109. package/framework/skills/level-2-domains/integrations/clerk-auth.md +8 -1
  110. package/framework/skills/level-2-domains/integrations/{hangfire-orchestrator.md → hangfire-integration.md} +8 -1
  111. package/framework/skills/level-2-domains/integrations/resend-email.md +8 -1
  112. package/framework/skills/level-2-domains/quality/code-analyzer.md +10 -3
  113. package/framework/skills/level-2-domains/quality/testing-specialist.md +8 -1
  114. package/framework/standards/STANDARDS.json +812 -0
  115. package/framework/standards/ai-agents/team-orchestration.md +3 -3
  116. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -0
  117. package/framework/standards/integration/mcp/mcp-tools.md +384 -0
  118. package/framework/templates/README.md +17 -17
  119. package/framework/templates/REGISTRY.json +48 -233
  120. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  121. package/framework/templates/context/CONTEXT-FEATURE.md +1 -1
  122. package/framework/templates/context/CONTEXT.md +3 -3
  123. package/framework/templates/docs/clarifications.md +253 -0
  124. package/framework/templates/docs/onboarding.md +123 -0
  125. package/framework/templates/docs/schema-analysis.md +119 -0
  126. package/framework/templates/docs/spec.md +149 -149
  127. package/framework/templates/docs/ui-components.md +124 -0
  128. package/framework/templates/docs/ui-design-system.md +76 -0
  129. package/framework/templates/docs/ui-flows.md +167 -0
  130. package/framework/templates/docs/ui-mockups.md +98 -0
  131. package/framework/templates/docs/user-stories.md +34 -0
  132. package/framework/templates/examples/spec-examples.md +1 -1
  133. package/framework/templates/infrastructure/github/README.md +11 -11
  134. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  135. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  136. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +1 -1
  137. package/framework/workflows/configs/express.json +45 -0
  138. package/framework/workflows/configs/spec-only.json +43 -0
  139. package/framework/workflows/docs/enforcement-pipeline.md +8 -8
  140. package/framework/workflows/docs/full-morph.md +3 -3
  141. package/package.json +3 -2
  142. package/scripts/generate-refs.js +336 -0
  143. package/scripts/generate-standards-registry.js +44 -0
  144. package/scripts/validate-real.mjs +255 -0
  145. package/src/commands/feature/create-story.js +362 -361
  146. package/src/commands/feature/shard-spec.js +225 -224
  147. package/src/commands/feature/sprint-status.js +1 -1
  148. package/src/commands/generation/generate-onboarding.js +169 -0
  149. package/src/commands/generation/generate.js +2 -2
  150. package/src/commands/mcp/mcp-setup.js +315 -0
  151. package/src/commands/project/changes.js +66 -0
  152. package/src/commands/project/checkpoint.js +209 -0
  153. package/src/commands/project/cost.js +179 -0
  154. package/src/commands/project/diff.js +278 -0
  155. package/src/commands/project/doctor.js +55 -7
  156. package/src/commands/project/init.js +318 -76
  157. package/src/commands/project/revert.js +173 -0
  158. package/src/commands/project/standards.js +80 -0
  159. package/src/commands/project/status.js +376 -0
  160. package/src/commands/project/update-agents.js +23 -0
  161. package/src/commands/project/update.js +63 -30
  162. package/src/commands/state/advance-phase.js +4 -3
  163. package/src/commands/state/state.js +10 -3
  164. package/src/commands/state/validate-phase.js +19 -2
  165. package/src/commands/templates/template-customize.js +4 -4
  166. package/src/commands/templates/template-render.js +1 -1
  167. package/src/commands/templates/template-show.js +1 -1
  168. package/src/commands/validation/validate-feature.js +359 -0
  169. package/src/core/orchestrator.js +3 -38
  170. package/src/core/paths/output-schema.js +135 -0
  171. package/src/core/state/state-manager.js +831 -592
  172. package/src/core/templates/template-registry.js +2 -2
  173. package/src/core/workflows/workflow-detector.js +17 -1
  174. package/src/lib/agents/micro-agent-factory.js +1 -1
  175. package/src/lib/context/context-bundler.js +2 -1
  176. package/src/lib/detectors/claude-config-detector.js +392 -0
  177. package/src/lib/detectors/conversation-analyzer.js +4 -4
  178. package/src/lib/detectors/design-system-detector.js +6 -5
  179. package/src/lib/detectors/standards-generator.js +2 -2
  180. package/src/lib/generators/context-generator.js +539 -538
  181. package/src/lib/generators/recap-generator.js +1 -1
  182. package/src/lib/generators/settings-generator.js +210 -0
  183. package/src/lib/hooks/hook-executor.js +1 -1
  184. package/src/lib/installers/mcp-installer.js +299 -0
  185. package/src/lib/learning/learning-system.js +3 -3
  186. package/src/lib/orchestration/team-orchestrator.js +1 -1
  187. package/src/lib/standards/standards-context-injector.js +7 -7
  188. package/src/lib/threads/thread-coordinator.js +1 -1
  189. package/src/lib/troubleshooting/troubleshoot-grep.js +1 -1
  190. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -273
  191. package/src/lib/validators/design-system/design-system-validator.js +1 -1
  192. package/src/lib/validators/spec-validator.js +258 -258
  193. package/src/lib/validators/validation-runner.js +270 -269
  194. package/src/utils/agents-installer.js +206 -0
  195. package/src/utils/claude-settings-manager.js +258 -0
  196. package/src/utils/file-copier.js +1 -1
  197. package/src/utils/hooks-installer.js +354 -28
  198. package/src/utils/skills-installer.js +74 -0
  199. package/.morph/project/context/detection-log.md +0 -16
  200. package/.morph/project/standards/inferred.md +0 -59
  201. package/framework/hooks/agent-stop/validate-and-continue.js +0 -96
  202. package/framework/hooks/agent-stop/validate-checkpoints.js +0 -101
  203. package/framework/hooks/agent-stop/validate-tests.js +0 -109
  204. package/framework/hooks/agent-teams/dispatch.js +0 -67
  205. package/framework/hooks/agent-teams/phase-advanced.js +0 -80
  206. package/framework/hooks/agent-teams/task-completed.js +0 -76
  207. package/framework/hooks/agent-teams/teammate-idle.js +0 -70
  208. package/src/commands/agents/agents-fuse.js +0 -97
  209. package/src/commands/agents/micro-agent.js +0 -112
  210. package/src/commands/agents/spawn-team.js +0 -237
  211. package/src/commands/agents/squad-template.js +0 -146
  212. package/src/commands/analytics/analytics.js +0 -176
  213. package/src/commands/context/context-prime.js +0 -63
  214. package/src/commands/context/core-four.js +0 -54
  215. package/src/commands/generation/generate-context.js +0 -40
  216. package/src/commands/project/detect-agents.js +0 -207
  217. package/src/commands/project/detect-workflow.js +0 -174
  218. package/src/commands/threads/thread-template.js +0 -103
  219. package/src/commands/threads/threads.js +0 -261
  220. package/src/commands/utils/session-summary.js +0 -291
  221. package/src/llm/analyzer.js +0 -215
  222. package/src/llm/few-shot-examples.js +0 -216
  223. package/src/llm/project-config-schema.json +0 -188
  224. package/src/llm/prompt-builder.js +0 -96
  225. /package/.morph/{project/context → context}/README.md +0 -0
  226. /package/.morph/{config → framework}/agents.json +0 -0
  227. /package/.morph/{standards → framework/standards}/ai-agents/blazor-ui.md +0 -0
  228. /package/.morph/{standards → framework/standards}/ai-agents/production.md +0 -0
  229. /package/.morph/{standards → framework/standards}/ai-agents/setup.md +0 -0
  230. /package/.morph/{standards → framework/standards}/ai-agents/workflows.md +0 -0
  231. /package/.morph/{standards → framework/standards}/architecture/ddd/aggregates.md +0 -0
  232. /package/.morph/{standards → framework/standards}/architecture/ddd/entities.md +0 -0
  233. /package/.morph/{standards → framework/standards}/architecture/ddd/value-objects.md +0 -0
  234. /package/.morph/{standards → framework/standards}/backend/api/minimal-api.md +0 -0
  235. /package/.morph/{standards → framework/standards}/backend/api/rest.md +0 -0
  236. /package/.morph/{standards → framework/standards}/backend/api/validation.md +0 -0
  237. /package/.morph/{standards → framework/standards}/backend/authentication/passkeys.md +0 -0
  238. /package/.morph/{standards → framework/standards}/backend/database/ef-core.md +0 -0
  239. /package/.morph/{standards → framework/standards}/backend/database/migrations.md +0 -0
  240. /package/.morph/{standards → framework/standards}/backend/database/postgresql/database.md +0 -0
  241. /package/.morph/{standards → framework/standards}/backend/database/repository-patterns.md +0 -0
  242. /package/.morph/{standards → framework/standards}/backend/database/vector-search-rag.md +0 -0
  243. /package/.morph/{standards → framework/standards}/backend/dotnet/async.md +0 -0
  244. /package/.morph/{standards → framework/standards}/backend/dotnet/core.md +0 -0
  245. /package/.morph/{standards → framework/standards}/backend/dotnet/di.md +0 -0
  246. /package/.morph/{standards → framework/standards}/backend/dotnet/program-cs-checklist.md +0 -0
  247. /package/.morph/{standards → framework/standards}/backend/integrations/asaas/asaas-api.md +0 -0
  248. /package/.morph/{standards → framework/standards}/backend/integrations/clerk/clerk-auth.md +0 -0
  249. /package/.morph/{standards → framework/standards}/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  250. /package/.morph/{standards → framework/standards}/backend/integrations/resend/resend-email.md +0 -0
  251. /package/.morph/{standards → framework/standards}/context/analytics.md +0 -0
  252. /package/.morph/{standards → framework/standards}/context/bundles.md +0 -0
  253. /package/.morph/{standards → framework/standards}/context/priming.md +0 -0
  254. /package/.morph/{standards → framework/standards}/core/architecture.md +0 -0
  255. /package/.morph/{standards → framework/standards}/core/coding.md +0 -0
  256. /package/.morph/{standards → framework/standards}/core/git-branching-strategy.md +0 -0
  257. /package/.morph/{standards → framework/standards}/core/git.md +0 -0
  258. /package/.morph/{standards → framework/standards}/core/testing.md +0 -0
  259. /package/.morph/{standards → framework/standards}/data/nosql/blob-storage.md +0 -0
  260. /package/.morph/{standards → framework/standards}/data/nosql/cache/redis.md +0 -0
  261. /package/.morph/{standards → framework/standards}/data/nosql/cosmos-db.md +0 -0
  262. /package/.morph/{standards → framework/standards}/data/vector-search/azure-ai-search.md +0 -0
  263. /package/.morph/{standards → framework/standards}/data/vector-search/rag-chunking.md +0 -0
  264. /package/.morph/{standards → framework/standards}/frontend/blazor/design-checklist.md +0 -0
  265. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui-setup.md +0 -0
  266. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui.md +0 -0
  267. /package/.morph/{standards → framework/standards}/frontend/blazor/html-conversion.md +0 -0
  268. /package/.morph/{standards → framework/standards}/frontend/blazor/lifecycle.md +0 -0
  269. /package/.morph/{standards → framework/standards}/frontend/blazor/pitfalls.md +0 -0
  270. /package/.morph/{standards → framework/standards}/frontend/blazor/state.md +0 -0
  271. /package/.morph/{standards → framework/standards}/frontend/design-system/animations.md +0 -0
  272. /package/.morph/{standards → framework/standards}/frontend/design-system/naming.md +0 -0
  273. /package/.morph/{standards → framework/standards}/frontend/nextjs/nextjs-patterns.md +0 -0
  274. /package/.morph/{standards → framework/standards}/infrastructure/azure/azure.md +0 -0
  275. /package/.morph/{standards → framework/standards}/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  276. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  277. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/local-development.md +0 -0
  278. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/functions.md +0 -0
  279. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/service-bus.md +0 -0
  280. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/storage.md +0 -0
  281. /package/.morph/{standards → framework/standards}/infrastructure/docker/easypanel-deploy.md +0 -0
  282. /package/.morph/{standards → framework/standards}/infrastructure/supabase/mcp-setup.md +0 -0
  283. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-auth.md +0 -0
  284. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-pgvector.md +0 -0
  285. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-rls.md +0 -0
  286. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-storage.md +0 -0
  287. /package/.morph/{standards → framework/standards}/integration/api/graphql.md +0 -0
  288. /package/.morph/{standards → framework/standards}/integration/api/grpc.md +0 -0
  289. /package/.morph/{standards → framework/standards}/integration/api/rest-design.md +0 -0
  290. /package/.morph/{standards → framework/standards}/integration/event-driven/cqrs.md +0 -0
  291. /package/.morph/{standards → framework/standards}/integration/event-driven/event-sourcing.md +0 -0
  292. /package/.morph/{standards → framework/standards}/integration/event-driven/service-bus.md +0 -0
  293. /package/.morph/{standards → framework/standards}/observability/logging.md +0 -0
  294. /package/.morph/{standards → framework/standards}/observability/metrics.md +0 -0
  295. /package/.morph/{standards → framework/standards}/observability/monitoring.md +0 -0
  296. /package/.morph/{standards → framework/standards}/observability/tracing.md +0 -0
  297. /package/.morph/{standards → framework/standards}/workflows/parallel-execution.md +0 -0
  298. /package/.morph/{standards → framework/standards}/workflows/thread-management.md +0 -0
  299. /package/.morph/{templates → framework/templates}/.idea/morph-templates.xml +0 -0
  300. /package/.morph/{templates → framework/templates}/.vscode/morph-templates.code-snippets +0 -0
  301. /package/.morph/{templates → framework/templates}/IDE-SNIPPETS.md +0 -0
  302. /package/.morph/{templates → framework/templates}/code/dotnet/backend/repository.cs +0 -0
  303. /package/.morph/{templates → framework/templates}/code/dotnet/backend/service.cs +0 -0
  304. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Commands.cs +0 -0
  305. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Entities.cs +0 -0
  306. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Queries.cs +0 -0
  307. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/README.md +0 -0
  308. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/api-contracts.cs +0 -0
  309. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/contracts.cs +0 -0
  310. /package/.morph/{templates → framework/templates}/code/dotnet/database/migration.cs +0 -0
  311. /package/.morph/{templates → framework/templates}/code/dotnet/frontend/component.razor +0 -0
  312. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/agent.cs +0 -0
  313. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/job.cs +0 -0
  314. /package/.morph/{templates → framework/templates}/code/dotnet/test.cs +0 -0
  315. /package/.morph/{templates → framework/templates}/code/sql/rls-policy.sql +0 -0
  316. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.sql +0 -0
  317. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.template.sql +0 -0
  318. /package/.morph/{templates → framework/templates}/code/typescript/contracts.ts +0 -0
  319. /package/.morph/{templates → framework/templates}/docs/proposal.md +0 -0
  320. /package/.morph/{templates → framework/templates}/examples/design-system-examples.md +0 -0
  321. /package/.morph/{templates → framework/templates}/feature/decisions.md +0 -0
  322. /package/.morph/{templates → framework/templates}/feature/recap.md +0 -0
  323. /package/.morph/{templates → framework/templates}/feature/tasks.md +0 -0
  324. /package/.morph/{templates → framework/templates}/infrastructure/azure/Dockerfile.example +0 -0
  325. /package/.morph/{templates → framework/templates}/infrastructure/azure/README.md +0 -0
  326. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-insights.bicep +0 -0
  327. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-service.bicep +0 -0
  328. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app-env.bicep +0 -0
  329. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app.bicep +0 -0
  330. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy-checklist.md +0 -0
  331. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.ps1 +0 -0
  332. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.sh +0 -0
  333. /package/.morph/{templates → framework/templates}/infrastructure/azure/key-vault.bicep +0 -0
  334. /package/.morph/{templates → framework/templates}/infrastructure/azure/main.bicep +0 -0
  335. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.dev.json +0 -0
  336. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.prod.json +0 -0
  337. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.staging.json +0 -0
  338. /package/.morph/{templates → framework/templates}/infrastructure/azure/sql-database.bicep +0 -0
  339. /package/.morph/{templates → framework/templates}/infrastructure/azure/storage.bicep +0 -0
  340. /package/.morph/{templates → framework/templates}/infrastructure/docker/Dockerfile.template +0 -0
  341. /package/.morph/{templates → framework/templates}/infrastructure/docker/docker-compose.template.yml +0 -0
  342. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-api.dockerfile +0 -0
  343. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-web.dockerfile +0 -0
  344. /package/.morph/{templates → framework/templates}/infrastructure/docker/easypanel.template.json +0 -0
  345. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -0
  346. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -0
  347. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/health-check/action.yml.hbs +0 -0
  348. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -0
  349. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -0
  350. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -0
  351. /package/.morph/{templates → framework/templates}/integrations/asaas-client.cs +0 -0
  352. /package/.morph/{templates → framework/templates}/integrations/asaas-webhook.cs +0 -0
  353. /package/.morph/{templates → framework/templates}/integrations/azure-identity-config.cs +0 -0
  354. /package/.morph/{templates → framework/templates}/integrations/clerk-config.cs +0 -0
  355. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-agent.md +0 -0
  356. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-aggregator.md +0 -0
  357. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-retry.md +0 -0
  358. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-validation.md +0 -0
  359. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-wrapper.md +0 -0
  360. /package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-coordinator.md +0 -0
  361. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/backend-squad.md +0 -0
  362. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/frontend-squad.md +0 -0
  363. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/squad-leader.md +0 -0
  364. /package/.morph/{templates → framework/templates}/meta-prompts/validators/checkpoint-validator.md +0 -0
  365. /package/.morph/{templates → framework/templates}/saas/subscription.cs +0 -0
  366. /package/.morph/{templates → framework/templates}/saas/tenant.cs +0 -0
  367. /package/.morph/{templates → framework/templates}/state.template.json +0 -0
  368. /package/.morph/{templates → framework/templates}/ui/FluentDesignTheme.cs +0 -0
  369. /package/.morph/{templates → framework/templates}/ui/MudTheme.cs +0 -0
  370. /package/.morph/{templates → framework/templates}/ui/design-system.css +0 -0
  371. /package/framework/hooks/{commit-msg → git/commit-msg}/conventional-commits.sh +0 -0
  372. /package/framework/hooks/{pre-commit → git/pre-commit}/agents.sh +0 -0
  373. /package/framework/hooks/{pre-commit → git/pre-commit}/orchestrator.sh +0 -0
  374. /package/framework/hooks/{pre-commit → git/pre-commit}/specs.sh +0 -0
  375. /package/framework/hooks/{pre-push → git/pre-push}/run-tests.sh +0 -0
@@ -1,282 +1,201 @@
1
- # MORPH-SPEC Hooks Architecture
2
-
3
- Git hooks and Agent Teams event handlers for automated validation.
4
-
5
- ## Architecture
6
-
7
- ```
8
- framework/hooks/ # Universal hooks (all stacks share)
9
- ├── pre-commit/
10
- │ ├── agents.sh # Validates agents.json Schema
11
- ├── specs.sh # Validates spec.md sections
12
- └── orchestrator.sh # Calls framework + stack hooks
13
- ├── commit-msg/
14
- └── conventional-commits.sh # Enforces Conventional Commits format
15
- ├── pre-push/
16
- └── run-tests.sh # Runs test suite before push
17
- ├── agent-teams/
18
- │ ├── teammate-idle.js # Agent Teams idle event
19
- │ ├── task-completed.js # Task completion validation
20
- │ └── phase-advanced.js # Phase advancement validation
21
- └── README.md # This file
22
-
23
- .morph/hooks/ # Project-specific hooks (optional)
24
- └── pre-commit/
25
- └── tests-{lang}.sh # Language-specific test coverage
26
- ```
27
-
28
- ## Hook Types
29
-
30
- ### Pre-Commit Hooks (Bash)
31
-
32
- **Universal (framework/hooks/pre-commit/):**
33
- - `agents.sh` - Validates agents.json with JSON Schema (BLOCKING)
34
- - `specs.sh` - Validates spec.md required sections (BLOCKING)
35
- - `orchestrator.sh` - Master hook that calls all hooks (BLOCKING)
36
-
37
- **Project-Specific (.morph/hooks/pre-commit/):**
38
- - `tests-csharp.sh` - C# test coverage (WARNING ONLY)
39
- - `tests-typescript.sh` - TypeScript test coverage (WARNING ONLY)
40
-
41
- ### Commit Message Hook (Bash)
42
-
43
- **Universal (framework/hooks/commit-msg/):**
44
- - `conventional-commits.sh` - Enforces Conventional Commits format (BLOCKING)
45
- - Validates: `<type>(<scope>): <description>` format
46
- - Allowed types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert
47
-
48
- ### Pre-Push Hook (Bash)
49
-
50
- **Universal (framework/hooks/pre-push/):**
51
- - `run-tests.sh` - Runs full test suite before push (BLOCKING)
52
- - Auto-detects .NET (`dotnet test`) or Node.js (`npm test`) projects
53
-
54
- ### Agent Teams Hooks (JavaScript)
55
-
56
- **Universal (framework/hooks/agent-teams/):**
57
- - `teammate-idle.js` - Triggered when teammate is idle, validates recent work
58
- - `task-completed.js` - Triggered when task marked complete, validates deliverables
59
- - `phase-advanced.js` - Triggered when advancing phases, validates outputs and deliverables
60
-
61
- ## Installation
62
-
63
- ### Git Hooks (Pre-Commit, Commit-Msg, Pre-Push)
64
-
65
- ```bash
66
- # In your project root (.git/hooks directory)
67
- cd .git/hooks
68
-
69
- # Pre-commit hook (validates agents.json, spec.md, runs stack tests)
70
- ln -sf ../../framework/hooks/pre-commit/orchestrator.sh pre-commit
71
- chmod +x pre-commit
72
-
73
- # Commit-msg hook (enforces Conventional Commits format)
74
- ln -sf ../../framework/hooks/commit-msg/conventional-commits.sh commit-msg
75
- chmod +x commit-msg
76
-
77
- # Pre-push hook (runs test suite before push)
78
- ln -sf ../../framework/hooks/pre-push/run-tests.sh pre-push
79
- chmod +x pre-push
80
- ```
81
-
82
- ### Agent Teams Hooks
83
-
84
- Add to `.claude/settings.local.json`:
85
-
86
- ```json
87
- {
88
- "hooks": {
89
- "TeammateIdle": "node framework/hooks/agent-teams/teammate-idle.js {feature}",
90
- "TaskCompleted": "node framework/hooks/agent-teams/task-completed.js {feature} {taskId}",
91
- "PhaseAdvanced": "node framework/hooks/agent-teams/phase-advanced.js {feature} {fromPhase} {toPhase}"
92
- }
93
- }
94
- ```
95
-
96
- ## How It Works
97
-
98
- ### Pre-Commit Flow
99
-
100
- ```
101
- git commit -m "message"
102
-
103
- .git/hooks/pre-commit executes
104
-
105
- framework/hooks/pre-commit/orchestrator.sh
106
- ├─ Runs framework hooks (agents.sh, specs.sh)
107
- └─ Runs stack hooks (.morph/hooks/pre-commit/*.sh)
108
-
109
- If ANY FAILS COMMIT BLOCKED
110
- If ALL PASS → COMMIT ALLOWED
111
- ```
112
-
113
- ### Agent Teams Flow
114
-
115
- ```
116
- Teammate becomes idle
117
-
118
- Claude Code triggers "TeammateIdle" event
119
-
120
- framework/hooks/agent-teams/teammate-idle.js
121
- ├─ Loads agents.json
122
- ├─ Filters validators with hook_triggers: ["TeammateIdle"]
123
- ├─ Executes validators via hook-executor.js
124
- └─ Formats results
125
-
126
- If BLOCKEDShow errors, prevent teammate from proceeding
127
- If PASSEDAllow teammate to continue
128
- ```
129
-
130
- ## Configuring Validators
131
-
132
- Validators register for hook events in `agents.json`:
133
-
134
- ```json
135
- {
136
- "security-expert": {
137
- "tier": 4,
138
- "role": "validator",
139
- "relationships": {
140
- "runs_in": "hooks",
141
- "hook_triggers": ["TeammateIdle", "TaskCompleted"]
142
- },
143
- "hook_behavior": {
144
- "validates": ["SQL injection", "XSS", "Secrets"],
145
- "severity": "error",
146
- "blocks_on_fail": true
147
- }
148
- }
149
- }
150
- ```
151
-
152
- ## Testing Hooks
153
-
154
- ### Pre-Commit Hooks
155
-
156
- ```bash
157
- # Test orchestrator
158
- bash framework/hooks/pre-commit/orchestrator.sh
159
-
160
- # Test individual hook
161
- bash framework/hooks/pre-commit/agents.sh
162
- ```
163
-
164
- ### Git Hooks
165
-
166
- ```bash
167
- # Test pre-commit orchestrator
168
- bash framework/hooks/pre-commit/orchestrator.sh
169
-
170
- # Test individual framework hooks
171
- bash framework/hooks/pre-commit/agents.sh
172
- bash framework/hooks/pre-commit/specs.sh
173
-
174
- # Test commit-msg hook (pass test message as argument)
175
- echo "feat(test): add new feature" > /tmp/test-msg.txt
176
- bash framework/hooks/commit-msg/conventional-commits.sh /tmp/test-msg.txt
177
-
178
- # Test pre-push hook
179
- bash framework/hooks/pre-push/run-tests.sh
180
- ```
181
-
182
- ### Agent Teams Hooks
183
-
184
- ```bash
185
- # Simulate TeammateIdle event
186
- node framework/hooks/agent-teams/teammate-idle.js test-feature --verbose --dry-run
187
-
188
- # Simulate TaskCompleted event
189
- node framework/hooks/agent-teams/task-completed.js test-feature T001 --verbose --dry-run
190
-
191
- # Simulate PhaseAdvanced event
192
- node framework/hooks/agent-teams/phase-advanced.js test-feature design clarify --verbose --dry-run
193
- ```
194
-
195
- ## Bypassing Hooks
196
-
197
- ```bash
198
- # Skip pre-commit hooks (NOT RECOMMENDED)
199
- git commit --no-verify
200
-
201
- # Skip commit-msg hook (NOT RECOMMENDED)
202
- git commit --no-verify
203
-
204
- # Skip pre-push hook (NOT RECOMMENDED)
205
- git push --no-verify
206
-
207
- # Skip task completion validation (NOT RECOMMENDED)
208
- morph-spec task done feature-name task-id --skip-validation
209
- ```
210
-
211
- ## Creating Custom Hooks
212
-
213
- ### Stack-Specific Pre-Commit Hook
214
-
215
- Create `.morph/hooks/pre-commit/my-hook.sh`:
216
-
217
- ```bash
218
- #!/bin/bash
219
- # Scope: my-stack | Custom validation
220
- echo "🎯 Running custom validation..."
221
-
222
- # Your validation logic here
223
-
224
- exit 0
225
- ```
226
-
227
- The orchestrator will automatically detect and run it.
228
-
229
- ### New Hook Event Type
230
-
231
- Add to `framework/hooks/agent-teams/`:
232
-
233
- ```javascript
234
- #!/usr/bin/env node
235
- // Scope: universal | My custom event
236
-
237
- import { executeHook, formatHookResults } from '../../src/lib/hooks/hook-executor.js';
238
-
239
- // Your hook logic here
240
- ```
241
-
242
- Register in `agents.json`:
243
-
244
- ```json
245
- {
246
- "hook_triggers": ["MyCustomEvent"]
247
- }
248
- ```
249
-
250
- ## Troubleshooting
251
-
252
- ### Pre-Commit Hook Not Running
253
-
254
- ```bash
255
- # Check if hook exists
256
- ls -la .git/hooks/pre-commit
257
-
258
- # Recreate symlink
259
- cd .git/hooks
260
- ln -sf ../../framework/hooks/pre-commit/orchestrator.sh pre-commit
261
- chmod +x pre-commit
262
- ```
263
-
264
- ### Agent Teams Hook Failing
265
-
266
- ```bash
267
- # Test manually with verbose output
268
- node framework/hooks/agent-teams/teammate-idle.js my-feature --verbose
269
-
270
- # Check agents.json configuration
271
- npx morph-spec validate-agents-skills
272
- ```
273
-
274
- ## References
275
-
276
- - Hook executor: `src/lib/hooks/hook-executor.js`
277
- - Checkpoint hooks: `src/lib/checkpoints/checkpoint-hooks.js`
278
- - Agents configuration: `.morph/config/agents.json`
279
-
280
- ---
281
-
282
- *MORPH-SPEC v4.0.0 - Hooks Architecture*
1
+ # MORPH-SPEC Hooks Architecture (v2)
2
+
3
+ Comprehensive hooks system for enforcing spec-driven development at the Claude Code level.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ framework/hooks/
9
+ ├── claude-code/ # Claude Code native hooks
10
+ │ ├── session-start/
11
+ │ └── inject-morph-context.js # Inject state summary on session start
12
+ ├── user-prompt/
13
+ │ │ └── enrich-prompt.js # Context-aware prompt enrichment
14
+ ├── pre-tool-use/
15
+ │ │ ├── protect-readonly-files.js # Block edits to state.json & framework/
16
+ │ ├── protect-spec-files.js # Block edits to approved spec artifacts
17
+ │ │ └── enforce-phase-writes.js # Enforce writes to correct phase dir
18
+ │ ├── post-tool-use/
19
+ ├── track-output-creation.js # Auto-mark outputs as created
20
+ └── dispatch.js # Dispatch on CLI commands
21
+ │ ├── stop/
22
+ │ │ └── validate-completion.js # Advisory: warn about incomplete work
23
+ │ ├── pre-compact/
24
+ │ │ └── save-morph-context.js # Snapshot state before compaction
25
+ └── notification/
26
+ │ └── approval-reminder.js # Remind about pending approvals
27
+ ├── shared/ # Reusable utilities for all hooks
28
+ │ ├── state-reader.js # Read-only state.json accessor
29
+ │ ├── phase-utils.js # Phase constants and path utilities
30
+ │ ├── hook-response.js # JSON response builders
31
+ │ └── stdin-reader.js # Stdin JSON reader
32
+ ├── git/ # Git hooks (Bash)
33
+ │ ├── pre-commit/
34
+ │ │ ├── orchestrator.sh # Master hook dispatcher
35
+ │ │ ├── agents.sh # Validates agents.json schema
36
+ │ │ └── specs.sh # Validates spec.md sections
37
+ │ ├── commit-msg/
38
+ │ │ └── conventional-commits.sh # Enforces conventional commits
39
+ │ └── pre-push/
40
+ │ └── run-tests.sh # Runs test suite before push
41
+ └── README.md # This file
42
+ ```
43
+
44
+ ## Hook Events
45
+
46
+ | Event | Hook | Type | Purpose |
47
+ |-------|------|------|---------|
48
+ | **SessionStart** | inject-morph-context.js | Inject context | Shows active feature, phase, pending approvals |
49
+ | **UserPromptSubmit** | enrich-prompt.js | Inject context | Warns about wrong-phase work, injects commands |
50
+ | **PreToolUse** (Write\|Edit) | protect-readonly-files.js | Block | Blocks edits to state.json and .morph/framework/ |
51
+ | **PreToolUse** (Write\|Edit) | protect-spec-files.js | Block | Blocks edits to spec files after approval |
52
+ | **PreToolUse** (Write\|Edit) | enforce-phase-writes.js | Block | Ensures writes go to current phase directory |
53
+ | **PreToolUse** (Bash) | _(prompt-type inline guard)_ | Block | Blocks `rm -rf .morph/` and direct state edits via Claude's reasoning |
54
+ | **PostToolUse** (Write) | track-output-creation.js | Auto-state | Marks outputs as created when files are written |
55
+ | **PostToolUse** (Bash) | dispatch.js | Dispatch | Triggers checkpoints on task completion |
56
+ | **Stop** | validate-completion.js | Advisory | Warns about incomplete tasks/outputs |
57
+ | **PreCompact** | save-morph-context.js | Snapshot | Saves state to .morph/memory/ before compaction |
58
+ | **Notification** | approval-reminder.js | Advisory | Reminds about pending approval gates |
59
+
60
+ ## Design Principles
61
+
62
+ 1. **Fail-open**: All hooks catch exceptions and `exit 0` — never accidentally block legitimate work
63
+ 2. **Non-morph projects**: Every hook checks for `.morph/state.json` first and exits silently if missing
64
+ 3. **Performance**: PreToolUse hooks use synchronous state reads for <100ms execution
65
+ 4. **Cross-platform**: All hooks use `path.join()`/`path.resolve()`, no hardcoded path separators
66
+ 5. **Node.js only**: All hooks use `node` as executor (no PowerShell/bash dependency)
67
+
68
+ ## Installation
69
+
70
+ Hooks are automatically installed by `morph-spec init` and updated by `morph-spec update`.
71
+
72
+ The installer writes to `.claude/settings.local.json`:
73
+
74
+ ```json
75
+ {
76
+ "hooks": {
77
+ "SessionStart": [{ "matcher": "startup|resume|compact", "hooks": [...] }],
78
+ "UserPromptSubmit": [{ "hooks": [...] }],
79
+ "PreToolUse": [
80
+ { "matcher": "Write|Edit", "hooks": [...] },
81
+ { "matcher": "Bash", "hooks": [...] }
82
+ ],
83
+ "PostToolUse": [
84
+ { "matcher": "Write", "hooks": [...] },
85
+ { "matcher": "Bash", "hooks": [...] }
86
+ ],
87
+ "Stop": [{ "hooks": [...] }],
88
+ "PreCompact": [{ "hooks": [...] }],
89
+ "Notification": [{ "matcher": "idle_prompt", "hooks": [...] }]
90
+ }
91
+ }
92
+ ```
93
+
94
+ ### Git Hooks
95
+
96
+ ```bash
97
+ # In your project root
98
+ cd .git/hooks
99
+ ln -sf ../../framework/hooks/git/pre-commit/orchestrator.sh pre-commit
100
+ ln -sf ../../framework/hooks/git/commit-msg/conventional-commits.sh commit-msg
101
+ ln -sf ../../framework/hooks/git/pre-push/run-tests.sh pre-push
102
+ chmod +x pre-commit commit-msg pre-push
103
+ ```
104
+
105
+ ## Shared Utilities
106
+
107
+ All Claude Code hooks import from `framework/hooks/shared/`:
108
+
109
+ | Module | Purpose |
110
+ |--------|---------|
111
+ | `state-reader.js` | `loadState()`, `getActiveFeature()`, `getFeaturePhase()`, `isGateApproved()`, `getPendingGates()`, `getMissingOutputs()` |
112
+ | `phase-utils.js` | Phase constants, path extraction, file classification |
113
+ | `hook-response.js` | `block(reason)`, `approve(context)`, `injectContext(text)`, `pass()` |
114
+ | `stdin-reader.js` | `readStdin()` — Promise-based stdin JSON reader |
115
+
116
+ ## How Hooks Work
117
+
118
+ ### PreToolUse (Write|Edit) Flow
119
+
120
+ ```
121
+ Claude calls Write/Edit tool
122
+
123
+ Claude Code sends JSON to stdin: { tool_input: { file_path: "..." } }
124
+
125
+ protect-readonly-files.js
126
+ ├── Is .morph/state.json? BLOCK (use CLI)
127
+ ├── Is .morph/framework/**? BLOCK (read-only)
128
+ └── Other → pass
129
+
130
+ protect-spec-files.js
131
+ ├── Is in .morph/features/{feature}/?
132
+ │ ├── Is spec.md and design gate approved? → BLOCK
133
+ │ ├── Is tasks.md and tasks gate approved? → BLOCK
134
+ │ └── Gate not approved → pass
135
+ └── Not a feature file → pass
136
+
137
+ enforce-phase-writes.js
138
+ ├── Is in .morph/features/{feature}/?
139
+ │ ├── Phase is implement → pass (unrestricted)
140
+ │ ├── Target dir matches phase dir → pass
141
+ │ └── Target dir doesn't match → BLOCK
142
+ └── Not a feature file → pass
143
+ ```
144
+
145
+ ### SessionStart Flow
146
+
147
+ ```
148
+ Session starts/resumes/compacts
149
+
150
+ inject-morph-context.js
151
+ ├── No state.json → silent exit
152
+ ├── Has active feature → inject summary:
153
+ │ "MORPH-SPEC Status:
154
+ │ - Active feature: my-feature (phase: implement)
155
+ │ - Tasks: 3/10 completed
156
+ │ - Pending approvals: design, tasks"
157
+ └── No active feature → inject feature list
158
+ ```
159
+
160
+ ## Testing
161
+
162
+ ```bash
163
+ # Run hook tests
164
+ npm test -- test/hooks/
165
+
166
+ # Run shared utilities tests
167
+ npm test -- test/hooks/shared-utils.test.js
168
+
169
+ # Run installer tests
170
+ npm test -- test/hooks/hooks-installer.test.js
171
+ ```
172
+
173
+ ## Troubleshooting
174
+
175
+ ### Hooks Not Running
176
+
177
+ ```bash
178
+ # Check if hooks are installed
179
+ cat .claude/settings.local.json | jq '.hooks'
180
+
181
+ # Reinstall hooks
182
+ morph-spec update
183
+ ```
184
+
185
+ ### Hook Blocking Legitimate Work
186
+
187
+ All hooks are fail-open. If a hook is incorrectly blocking:
188
+
189
+ 1. The hook catches its own errors and exits 0
190
+ 2. If truly stuck, remove the specific hook from `.claude/settings.local.json`
191
+ 3. Report the issue so the hook logic can be fixed
192
+
193
+ ### Resetting All Morph Hooks
194
+
195
+ ```bash
196
+ morph-spec doctor --reset
197
+ ```
198
+
199
+ ---
200
+
201
+ *MORPH-SPEC v4.3.7 Hooks Architecture v2*
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Notification Hook: Approval Reminder on Idle
5
+ *
6
+ * Event: Notification | Matcher: idle_prompt
7
+ *
8
+ * When Claude is idle, checks for pending approval gates and reminds the user.
9
+ *
10
+ * Fail-open: exits 0 on any error.
11
+ */
12
+
13
+ import { stateExists, getActiveFeature, getPendingGates } from '../../shared/state-reader.js';
14
+ import { injectContext, pass } from '../../shared/hook-response.js';
15
+
16
+ try {
17
+ if (!stateExists()) pass();
18
+
19
+ const active = getActiveFeature();
20
+ if (!active) pass();
21
+
22
+ const { name, feature } = active;
23
+ const pending = getPendingGates(name);
24
+
25
+ if (pending.length === 0) pass();
26
+
27
+ // Only remind about gates relevant to the current phase
28
+ const phaseGateRelevance = {
29
+ design: ['design'],
30
+ clarify: ['design'],
31
+ tasks: ['design', 'tasks'],
32
+ uiux: ['uiux'],
33
+ implement: ['design', 'tasks']
34
+ };
35
+
36
+ const relevantGates = phaseGateRelevance[feature.phase] || [];
37
+ const pendingRelevant = pending.filter(g => relevantGates.includes(g));
38
+
39
+ if (pendingRelevant.length === 0) pass();
40
+
41
+ const reminders = pendingRelevant.map(gate =>
42
+ ` morph-spec approve ${name} ${gate}`
43
+ );
44
+
45
+ injectContext(
46
+ `MORPH-SPEC: Feature '${name}' has pending approval(s) that may be blocking progress:\n` +
47
+ reminders.join('\n')
48
+ );
49
+ } catch {
50
+ // Fail-open
51
+ process.exit(0);
52
+ }
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * PostToolUse Hook: Improved Dispatch
5
+ *
6
+ * Event: PostToolUse | Matcher: Bash
7
+ *
8
+ * Replaces the old agent-teams/dispatch.js with:
9
+ * - Reads state BEFORE dispatching to pass correct from/to phases
10
+ * - Handles more CLI commands: approve, state init, checkpoint commands
11
+ * - Triggers checkpoint validation on task completion when count % 3 === 0
12
+ *
13
+ * Fail-open: exits 0 on any error.
14
+ */
15
+
16
+ import { execSync } from 'child_process';
17
+ import { readStdin } from '../../shared/stdin-reader.js';
18
+ import { stateExists, getFeature } from '../../shared/state-reader.js';
19
+ import { pass } from '../../shared/hook-response.js';
20
+
21
+ try {
22
+ if (!stateExists()) pass();
23
+
24
+ const payload = await readStdin();
25
+ if (!payload) pass();
26
+
27
+ const command = payload?.tool_input?.command || '';
28
+ if (!command) pass();
29
+
30
+ dispatch(command);
31
+ } catch {
32
+ // Fail-open
33
+ process.exit(0);
34
+ }
35
+
36
+ function dispatch(command) {
37
+ // morph-spec task done <feature> <taskId> [--skip-validation]
38
+ const taskDoneMatch = command.match(/morph-spec\s+task\s+done\s+(\S+)\s+(\S+)/);
39
+ if (taskDoneMatch) {
40
+ const [, featureName, taskId] = taskDoneMatch;
41
+
42
+ // Check if checkpoint should run (every 3 tasks)
43
+ try {
44
+ const feature = getFeature(featureName);
45
+ if (feature?.tasks) {
46
+ const completed = (feature.tasks.completed || 0) + 1; // +1 because task-done hasn't executed yet
47
+ if (completed > 0 && completed % 3 === 0) {
48
+ const checkpointNum = Math.floor(completed / 3);
49
+ run(`node bin/morph-spec.js checkpoint-save ${featureName} --note "Auto-checkpoint #${checkpointNum} at task ${completed}"`);
50
+ }
51
+ }
52
+ } catch {
53
+ // Non-blocking
54
+ }
55
+
56
+ pass();
57
+ }
58
+
59
+ // morph-spec phase advance <feature>
60
+ const phaseAdvanceMatch = command.match(/morph-spec\s+phase\s+advance\s+(\S+)/);
61
+ if (phaseAdvanceMatch) {
62
+ // Phase advancement hooks are handled internally by advance-phase.js
63
+ pass();
64
+ }
65
+
66
+ // morph-spec approve <feature> <gate>
67
+ const approveMatch = command.match(/morph-spec\s+approve\s+(\S+)\s+(\S+)/);
68
+ if (approveMatch) {
69
+ // Approval handled by CLI — just pass through
70
+ pass();
71
+ }
72
+
73
+ // No match — exit cleanly
74
+ pass();
75
+ }
76
+
77
+ function run(cmd) {
78
+ try {
79
+ execSync(cmd, { stdio: 'pipe', cwd: process.cwd(), timeout: 30000 });
80
+ } catch {
81
+ // Non-blocking
82
+ }
83
+ }
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * PostToolUseFailure Hook: Log Tool Failures
5
+ *
6
+ * Event: PostToolUseFailure
7
+ *
8
+ * Runs when any tool fails. Appends a structured JSON entry to
9
+ * .morph/logs/tool-failures.log for debugging and pattern analysis.
10
+ *
11
+ * Fail-open: exits 0 on any error.
12
+ */
13
+
14
+ import { appendFileSync, mkdirSync } from 'fs';
15
+ import { join } from 'path';
16
+ import { readStdin } from '../../shared/stdin-reader.js';
17
+ import { stateExists } from '../../shared/state-reader.js';
18
+
19
+ try {
20
+ // Only log in morph-spec projects
21
+ if (!stateExists()) {
22
+ process.exit(0);
23
+ }
24
+
25
+ const input = await readStdin();
26
+
27
+ const logDir = join(process.cwd(), '.morph', 'logs');
28
+ mkdirSync(logDir, { recursive: true });
29
+
30
+ const entry = {
31
+ timestamp: new Date().toISOString(),
32
+ tool: input?.tool_name ?? 'unknown',
33
+ error: input?.error ?? null,
34
+ input: input?.tool_input ?? null,
35
+ };
36
+
37
+ appendFileSync(join(logDir, 'tool-failures.log'), JSON.stringify(entry) + '\n');
38
+ } catch {
39
+ // Fail-open: logging is non-critical
40
+ }
41
+
42
+ process.exit(0);