@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,23 +1,166 @@
1
1
  /**
2
- * Claude Code Hooks Installer
2
+ * Claude Code Hooks Installer (v2)
3
3
  *
4
- * Merges the MORPH-SPEC agent-teams PostToolUse hook into
5
- * .claude/settings.local.json without overwriting existing config.
4
+ * Registry-based installer for all MORPH-SPEC Claude Code hooks.
5
+ * Declarative MORPH_HOOKS array defines all hooks.
6
+ * Idempotent merge into .claude/settings.local.json.
6
7
  *
7
8
  * Called by `morph-spec init` and `morph-spec update`.
8
9
  */
9
10
 
10
11
  import { join } from 'path';
11
- import { readFile, writeFile, mkdir } from 'fs/promises';
12
- import { existsSync } from 'fs';
12
+ import { readFile, writeFile, mkdir, copyFile } from 'fs/promises';
13
+ import { existsSync, chmodSync } from 'fs';
14
+ import { homedir } from 'os';
13
15
 
14
- const DISPATCH_COMMAND = 'node framework/hooks/agent-teams/dispatch.js';
16
+ /** Current hooks schema version — bump when hook definitions change */
17
+ const HOOKS_VERSION = '2.4.0';
18
+
19
+ /** Marker for old dispatch.js (v1) */
20
+ const OLD_DISPATCH_COMMAND = 'node framework/hooks/agent-teams/dispatch.js';
21
+
22
+ /**
23
+ * Native permissions.deny entries managed by MORPH-SPEC.
24
+ * These replace the protect-readonly-files.js PreToolUse hook,
25
+ * using Claude Code's built-in permissions system instead.
26
+ */
27
+ const MORPH_PERMISSIONS = [
28
+ 'Write(.morph/state.json)',
29
+ 'Edit(.morph/state.json)',
30
+ 'Write(.morph/framework/**)',
31
+ 'Edit(.morph/framework/**)',
32
+ ];
33
+
34
+ /**
35
+ * All MORPH-SPEC hook definitions.
36
+ * Each entry maps to a Claude Code hook event.
37
+ */
38
+ const MORPH_HOOKS = [
39
+ // === SessionStart ===
40
+ {
41
+ event: 'SessionStart',
42
+ matcher: 'startup|resume|compact',
43
+ hooks: [{
44
+ type: 'command',
45
+ command: 'node framework/hooks/claude-code/session-start/inject-morph-context.js'
46
+ }]
47
+ },
48
+
49
+ // === UserPromptSubmit ===
50
+ {
51
+ event: 'UserPromptSubmit',
52
+ matcher: null,
53
+ hooks: [{
54
+ type: 'command',
55
+ command: 'node framework/hooks/claude-code/user-prompt/enrich-prompt.js'
56
+ }]
57
+ },
58
+
59
+ // === PreToolUse: Write|Edit ===
60
+ {
61
+ event: 'PreToolUse',
62
+ matcher: 'Write|Edit',
63
+ hooks: [
64
+ // Note: protect-readonly-files.js replaced by native permissions.deny (see MORPH_PERMISSIONS)
65
+ // Order matters: cheapest check first
66
+ {
67
+ type: 'command',
68
+ command: 'node framework/hooks/claude-code/pre-tool-use/protect-spec-files.js'
69
+ },
70
+ {
71
+ type: 'command',
72
+ command: 'node framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js'
73
+ }
74
+ ]
75
+ },
76
+
77
+ // === PreToolUse: Bash ===
78
+ {
79
+ event: 'PreToolUse',
80
+ matcher: 'Bash',
81
+ hooks: [{
82
+ type: 'prompt',
83
+ prompt: `You are a guard for a morph-spec project. Read the bash command from the hook input and check:
84
+ 1. Does the command delete .morph/ (e.g. contains "rm" with "-r" or "-rf" and ".morph")? If yes, BLOCK.
85
+ 2. Does the command edit state.json directly via sed, jq, awk, echo, cat, or printf with a shell redirect (>)? If yes, BLOCK.
86
+ 3. Does the command write to .morph/framework/ via a shell redirect (>)? If yes, BLOCK.
87
+ If any condition is true, respond: {"ok": false, "reason": "MORPH-SPEC: <brief explanation and suggested alternative using morph-spec CLI>"}
88
+ Otherwise respond: {"ok": true}`
89
+ }]
90
+ },
91
+
92
+ // === PostToolUse: Bash ===
93
+ {
94
+ event: 'PostToolUse',
95
+ matcher: 'Bash',
96
+ hooks: [{
97
+ type: 'command',
98
+ command: 'node framework/hooks/claude-code/post-tool-use/dispatch.js'
99
+ }]
100
+ },
101
+
102
+ // === Stop ===
103
+ {
104
+ event: 'Stop',
105
+ matcher: null,
106
+ hooks: [{
107
+ type: 'agent',
108
+ prompt: `Check if the active morph-spec feature phase outputs are complete.
109
+ 1. Read the file .morph/state.json to find features with status "in_progress".
110
+ 2. For each in_progress feature, check if required output files for the current phase exist and are non-empty.
111
+ - proposal phase: .morph/features/{feature}/0-proposal/proposal.md
112
+ - design phase: .morph/features/{feature}/1-design/spec.md
113
+ - tasks phase: .morph/features/{feature}/3-tasks/tasks.md
114
+ - implement phase: check tasks.completed vs tasks.total from state.json
115
+ 3. If all required outputs exist and tasks are complete, return {"ok": true}.
116
+ 4. If any required output is missing or empty, return {"ok": false, "reason": "Missing output: <path>"}.
117
+ 5. If state.json does not exist or no feature is in_progress, return {"ok": true}.
118
+ Do NOT modify any files. Read only.`,
119
+ timeout: 60
120
+ }]
121
+ },
122
+
123
+ // === PreCompact ===
124
+ {
125
+ event: 'PreCompact',
126
+ matcher: null,
127
+ hooks: [{
128
+ type: 'command',
129
+ command: 'node framework/hooks/claude-code/pre-compact/save-morph-context.js'
130
+ }]
131
+ },
132
+
133
+ // === PostToolUseFailure ===
134
+ {
135
+ event: 'PostToolUseFailure',
136
+ matcher: null,
137
+ hooks: [{
138
+ type: 'command',
139
+ command: 'node framework/hooks/claude-code/post-tool-use/handle-tool-failure.js',
140
+ timeout: 10000,
141
+ }]
142
+ },
143
+
144
+ // === Notification ===
145
+ {
146
+ event: 'Notification',
147
+ matcher: 'idle_prompt',
148
+ hooks: [{
149
+ type: 'command',
150
+ command: 'node framework/hooks/claude-code/notification/approval-reminder.js'
151
+ }]
152
+ }
153
+ ];
15
154
 
16
155
  /**
17
- * Install or update the MORPH-SPEC PostToolUse hook in .claude/settings.local.json.
156
+ * Install or update all MORPH-SPEC hooks in .claude/settings.local.json.
157
+ *
158
+ * - Idempotent: safe to call multiple times
159
+ * - Removes old v1 dispatch.js entry if present
160
+ * - Tracks installed version via _morph_managed.hooks_version
18
161
  *
19
162
  * @param {string} targetPath - Project root directory
20
- * @returns {boolean} true if the hook was newly added, false if it was already present
163
+ * @returns {Promise<{ installed: number, updated: boolean }>}
21
164
  */
22
165
  export async function installClaudeHooks(targetPath) {
23
166
  const claudeDir = join(targetPath, '.claude');
@@ -29,35 +172,89 @@ export async function installClaudeHooks(targetPath) {
29
172
  try {
30
173
  settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
31
174
  } catch {
32
- // Malformed JSON — start fresh to avoid corrupting the file
33
175
  settings = {};
34
176
  }
35
177
  }
36
178
 
37
- // Ensure hooks.PostToolUse array exists
38
179
  settings.hooks = settings.hooks || {};
39
- settings.hooks.PostToolUse = settings.hooks.PostToolUse || [];
40
180
 
41
- // Check if dispatch.js is already registered (avoid duplicate entries)
42
- const alreadyRegistered = settings.hooks.PostToolUse.some(entry =>
43
- Array.isArray(entry.hooks) &&
44
- entry.hooks.some(h => h.command === DISPATCH_COMMAND)
181
+ // Check if already at current version
182
+ const managed = settings._morph_managed || {};
183
+ const alreadyCurrent = managed.hooks_version === HOOKS_VERSION;
184
+
185
+ // Remove old v1 dispatch.js entry
186
+ removeOldDispatch(settings);
187
+
188
+ // Remove all morph-managed hooks (clean slate for idempotent update)
189
+ removeMorphHooks(settings);
190
+
191
+ // Install all hooks from the registry
192
+ let installed = 0;
193
+ for (const hookDef of MORPH_HOOKS) {
194
+ const { event, matcher, hooks } = hookDef;
195
+
196
+ if (!settings.hooks[event]) {
197
+ settings.hooks[event] = [];
198
+ }
199
+
200
+ const entry = { _morph: true };
201
+ if (matcher) {
202
+ entry.matcher = matcher;
203
+ }
204
+ entry.hooks = hooks.map(h => {
205
+ // Agent and prompt hooks: pass through as-is (no command path transform)
206
+ if (h.type === 'agent' || h.type === 'prompt') {
207
+ const agentHook = { type: h.type, prompt: h.prompt };
208
+ if (h.timeout !== undefined) agentHook.timeout = h.timeout;
209
+ return agentHook;
210
+ }
211
+ // Command hooks: transform path to use $CLAUDE_PROJECT_DIR
212
+ return {
213
+ type: h.type,
214
+ command: `node "$CLAUDE_PROJECT_DIR/framework/hooks/claude-code/${getHookSubpath(h.command)}"`,
215
+ ...(h.timeout !== undefined ? { timeout: h.timeout } : {})
216
+ };
217
+ });
218
+
219
+ settings.hooks[event].push(entry);
220
+ installed++;
221
+ }
222
+
223
+ // Install native permissions.deny entries (idempotent)
224
+ settings.permissions = settings.permissions || {};
225
+ settings.permissions.deny = settings.permissions.deny || [];
226
+ // Remove previously managed permissions to avoid duplicates on re-install
227
+ settings.permissions.deny = settings.permissions.deny.filter(
228
+ p => !MORPH_PERMISSIONS.includes(p)
45
229
  );
230
+ for (const perm of MORPH_PERMISSIONS) {
231
+ settings.permissions.deny.push(perm);
232
+ }
233
+
234
+ // JSON Schema for IDE auto-complete and validation
235
+ settings['$schema'] = 'https://json.schemastore.org/claude-code-settings.json';
46
236
 
47
- if (alreadyRegistered) {
48
- return false;
237
+ // Environment variables — always set MORPH_SPEC_ACTIVE, preserve user additions
238
+ settings.env = { ...settings.env, MORPH_SPEC_ACTIVE: 'true' };
239
+
240
+ // Attribution — only set if not already customized by user
241
+ if (!settings.attribution) {
242
+ settings.attribution = {
243
+ commit: '🤖 Co-authored by MORPH-SPEC',
244
+ pr: '',
245
+ };
49
246
  }
50
247
 
51
- // Add the agent-teams dispatch hook
52
- settings.hooks.PostToolUse.push({
53
- matcher: 'Bash',
54
- hooks: [
55
- {
56
- type: 'command',
57
- command: DISPATCH_COMMAND
58
- }
59
- ]
60
- });
248
+ // Plans directory for Claude Code plan mode
249
+ if (!settings.plansDirectory) {
250
+ settings.plansDirectory = '.morph/plans';
251
+ }
252
+
253
+ // Track installed hooks version
254
+ settings._morph_managed = settings._morph_managed || {};
255
+ settings._morph_managed.hooks_version = HOOKS_VERSION;
256
+ settings._morph_managed.hooks_installed = [...new Set(MORPH_HOOKS.map(h => h.event))];
257
+ settings._morph_managed.generated_at = new Date().toISOString();
61
258
 
62
259
  // Ensure .claude directory exists
63
260
  if (!existsSync(claudeDir)) {
@@ -65,5 +262,134 @@ export async function installClaudeHooks(targetPath) {
65
262
  }
66
263
 
67
264
  await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
68
- return true;
265
+ return { installed, updated: !alreadyCurrent };
266
+ }
267
+
268
+ /**
269
+ * Install the morph-spec statusline globally into ~/.claude/.
270
+ *
271
+ * Copies statusline.sh and statusline.py to ~/.claude/ and registers
272
+ * the statusLine config in ~/.claude/settings.json so it applies to
273
+ * every Claude Code session, not just morph-spec projects.
274
+ *
275
+ * Python 3 must be available as `python3` on PATH (global prerequisite).
276
+ *
277
+ * @param {string} hooksSourceDir - Path to framework/hooks/claude-code/
278
+ * @param {string} [globalClaudeDirOverride] - Override ~/.claude/ (for testing)
279
+ * @returns {Promise<{ installed: boolean, globalDir: string }>}
280
+ */
281
+ export async function installGlobalStatusline(hooksSourceDir, globalClaudeDirOverride = null) {
282
+ const globalDir = globalClaudeDirOverride || join(homedir(), '.claude');
283
+ await mkdir(globalDir, { recursive: true });
284
+
285
+ // Copy statusline scripts to ~/.claude/
286
+ const scripts = ['statusline.sh', 'statusline.py'];
287
+ for (const fname of scripts) {
288
+ const src = join(hooksSourceDir, fname);
289
+ if (existsSync(src)) {
290
+ await copyFile(src, join(globalDir, fname));
291
+ if (process.platform !== 'win32') {
292
+ try { chmodSync(join(globalDir, fname), 0o755); } catch { /* non-critical */ }
293
+ }
294
+ }
295
+ }
296
+
297
+ // Register statusLine in ~/.claude/settings.json (global user settings)
298
+ const settingsPath = join(globalDir, 'settings.json');
299
+ let settings = {};
300
+ if (existsSync(settingsPath)) {
301
+ try {
302
+ settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
303
+ } catch {
304
+ settings = {};
305
+ }
306
+ }
307
+
308
+ settings.statusLine = {
309
+ type: 'command',
310
+ command: join(globalDir, 'statusline.sh').replace(/\\/g, '/'),
311
+ padding: 2
312
+ };
313
+
314
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
315
+ return { installed: true, globalDir };
316
+ }
317
+
318
+ /**
319
+ * Remove old v1 agent-teams/dispatch.js hook entries.
320
+ * @param {Object} settings
321
+ */
322
+ function removeOldDispatch(settings) {
323
+ if (!settings.hooks?.PostToolUse) return;
324
+
325
+ settings.hooks.PostToolUse = settings.hooks.PostToolUse.filter(entry => {
326
+ if (!Array.isArray(entry.hooks)) return true;
327
+ return !entry.hooks.some(h =>
328
+ h.command === OLD_DISPATCH_COMMAND ||
329
+ (typeof h.command === 'string' && h.command.includes('agent-teams/dispatch.js'))
330
+ );
331
+ });
332
+
333
+ if (settings.hooks.PostToolUse.length === 0) {
334
+ delete settings.hooks.PostToolUse;
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Remove all morph-managed hook entries.
340
+ * Uses _morph:true marker (v2.2+) with legacy path-pattern fallback.
341
+ * Preserves any user-added hooks.
342
+ * @param {Object} settings
343
+ */
344
+ function removeMorphHooks(settings) {
345
+ const morphPathPattern = /framework\/hooks\/claude-code\//;
346
+
347
+ for (const [event, entries] of Object.entries(settings.hooks)) {
348
+ if (!Array.isArray(entries)) continue;
349
+
350
+ settings.hooks[event] = entries.filter(entry => {
351
+ // Remove if explicitly marked as morph-managed
352
+ if (entry._morph === true) return false;
353
+
354
+ if (!Array.isArray(entry.hooks)) return true;
355
+ // Legacy path-pattern detection: remove if all hooks are morph command hooks
356
+ // Note: legacy path only covers command-type hooks (those with a path-matching command).
357
+ // Agent/prompt hooks without _morph marker are NOT removed by this fallback.
358
+ // This is acceptable since all morph hooks since v2.2.0 carry the _morph marker.
359
+ const nonMorphHooks = entry.hooks.filter(h =>
360
+ typeof h.command !== 'string' || !morphPathPattern.test(h.command)
361
+ );
362
+ return nonMorphHooks.length > 0;
363
+ });
364
+
365
+ if (settings.hooks[event].length === 0) {
366
+ delete settings.hooks[event];
367
+ }
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Extract hook subpath from a full command string.
373
+ * @param {string} command - e.g., 'node framework/hooks/claude-code/stop/validate-completion.js'
374
+ * @returns {string} e.g., 'stop/validate-completion.js'
375
+ */
376
+ function getHookSubpath(command) {
377
+ const match = command.match(/claude-code\/(.+)$/);
378
+ return match ? match[1] : command;
379
+ }
380
+
381
+ /**
382
+ * Get the current hooks version.
383
+ * @returns {string}
384
+ */
385
+ export function getHooksVersion() {
386
+ return HOOKS_VERSION;
387
+ }
388
+
389
+ /**
390
+ * Get the list of hook definitions (for testing/inspection).
391
+ * @returns {Array}
392
+ */
393
+ export function getHookDefinitions() {
394
+ return MORPH_HOOKS;
69
395
  }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Skills Installer
3
+ *
4
+ * Copies framework skills to .claude/skills/ during morph-spec init.
5
+ * Installs level-0-meta, level-1-workflows, and level-2-domains skills using
6
+ * the native Claude Code subdirectory format: .claude/skills/{skill-name}/SKILL.md
7
+ * so Claude Code can discover them via /<skill-name> syntax.
8
+ * Level-3 and level-4 only contain README.md placeholder files and
9
+ * are intentionally skipped.
10
+ */
11
+
12
+ import { mkdirSync, copyFileSync, existsSync, readdirSync, statSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { fileURLToPath } from 'url';
15
+
16
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
17
+ const FRAMEWORK_SKILLS_DIR = join(__dirname, '..', '..', 'framework', 'skills');
18
+
19
+ /**
20
+ * Skill levels to install in .claude/skills/.
21
+ * Level-0 meta skills (planning, reviewing) and level-1 workflow skills
22
+ * (phase-design, phase-implement, etc.) are installed. Level-2 domain
23
+ * specialists are installed as native subagents via installDomainAgents()
24
+ * instead. Level-3 and level-4 are skipped (no content yet).
25
+ */
26
+ const SKILL_LEVELS_TO_INSTALL = ['level-0-meta', 'level-1-workflows'];
27
+
28
+ /**
29
+ * Recursively walk srcDir and install each .md skill file (excluding README.md)
30
+ * into destDir using the native Claude Code subdirectory format:
31
+ * destDir/{skill-name}/SKILL.md
32
+ *
33
+ * Each skill file must have a unique name across all subdirectories;
34
+ * duplicate filenames would cause silent overwrites of the SKILL.md inside
35
+ * the subdirectory.
36
+ *
37
+ * @param {string} srcDir - Source directory to walk recursively
38
+ * @param {string} destDir - Destination base directory (.claude/skills/)
39
+ */
40
+ function installSkillsFromDir(srcDir, destDir) {
41
+ const entries = readdirSync(srcDir);
42
+ for (const entry of entries) {
43
+ const srcPath = join(srcDir, entry);
44
+ const stat = statSync(srcPath);
45
+
46
+ if (stat.isDirectory()) {
47
+ installSkillsFromDir(srcPath, destDir);
48
+ } else if (entry.endsWith('.md') && entry !== 'README.md') {
49
+ const skillName = entry.slice(0, -3); // strip .md
50
+ const skillDir = join(destDir, skillName);
51
+ mkdirSync(skillDir, { recursive: true });
52
+ copyFileSync(srcPath, join(skillDir, 'SKILL.md'));
53
+ }
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Install morph framework skills to .claude/skills/ in the target project.
59
+ * Skills are copied into subdirectories as SKILL.md files so Claude Code can
60
+ * discover them natively via /<skill-name> syntax (e.g., /phase-design,
61
+ * /blazor-builder).
62
+ *
63
+ * @param {string} projectDir - Target project root directory
64
+ */
65
+ export async function installSkills(projectDir) {
66
+ const claudeSkillsDir = join(projectDir, '.claude', 'skills');
67
+ mkdirSync(claudeSkillsDir, { recursive: true });
68
+
69
+ for (const level of SKILL_LEVELS_TO_INSTALL) {
70
+ const levelDir = join(FRAMEWORK_SKILLS_DIR, level);
71
+ if (!existsSync(levelDir)) continue;
72
+ installSkillsFromDir(levelDir, claudeSkillsDir);
73
+ }
74
+ }
@@ -1,16 +0,0 @@
1
- ## Detection Summary
2
-
3
- ### Stack
4
- - **Type**: nodejs
5
- - **Architecture**: cli-library
6
-
7
- ### Technologies
8
- - **Language**: javascript
9
- - **Version**: >=18.0.0
10
- - **Package Manager**: npm
11
-
12
- ### Patterns Detected
13
- - API Routes
14
- - Unit Tests
15
-
16
- ### Recommendations
@@ -1,59 +0,0 @@
1
- # Inferred Standards (Auto-generated)
2
-
3
- > ⚠️ This file is auto-generated by MORPH-SPEC detection system.
4
- > Manual edits will be overwritten. Create custom standards in `overrides.md`.
5
-
6
- **Generated:** 2026-02-19T22:12:05.727Z
7
-
8
- ---
9
-
10
- ## 🎯 Project Stack
11
-
12
- - **Type**: nodejs
13
- - **Language**: javascript
14
- - **Version**: >=18.0.0
15
- - **Architecture**: cli-library
16
-
17
- ## 📐 Patterns in Use
18
-
19
- - API Routes
20
- - Unit Tests
21
-
22
- ## 💻 Inferred Coding Standards
23
-
24
- ### JavaScript / TypeScript Conventions
25
-
26
- Based on detected patterns in your codebase:
27
-
28
- - **Package Manager**: npm
29
-
30
- **Recommendation**: Refer to framework standards for JavaScript best practices.
31
-
32
- ## 🏗️ Architecture Pattern
33
-
34
- ### CLI / Library Architecture
35
-
36
- Your project follows a CLI/Library pattern:
37
-
38
- - ✅ **bin/** entry points detected
39
- - ✅ **src/** source directory detected
40
- - ✅ **package.json** present
41
-
42
- **Key principles**:
43
- - Commands exposed via bin/
44
- - Core logic in src/commands/ and src/lib/
45
- - Public API exported from src/index.js
46
-
47
- ## 📦 Key Dependencies
48
-
49
- - @polymorphism-tech/morph-spec
50
- - ajv
51
- - ajv-formats
52
- - chalk
53
- - commander
54
- - diff
55
- - fs-extra
56
- - glob
57
- - handlebars
58
- - inquirer
59
- - ... and 6 more
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Stop Hook: validate-and-continue
4
- *
5
- * Runs architecture and security validators.
6
- * Writes structured JSON to stdout for stop-hook-executor to parse.
7
- *
8
- * Output format:
9
- * {
10
- * "passed": boolean,
11
- * "issues": [{ "message": string, "severity": "error"|"warning" }],
12
- * "suggestions": [string],
13
- * "error": string | null
14
- * }
15
- */
16
-
17
- import { execSync } from 'child_process';
18
- import { existsSync } from 'fs';
19
- import { join } from 'path';
20
-
21
- const VALIDATORS = ['architecture', 'security'];
22
- const cwd = process.cwd();
23
-
24
- async function runValidators() {
25
- const issues = [];
26
- const suggestions = [];
27
- let allPassed = true;
28
-
29
- for (const validator of VALIDATORS) {
30
- try {
31
- const validateBin = join(cwd, 'bin/validate.js');
32
- if (!existsSync(validateBin)) {
33
- // Validator binary not found — skip gracefully
34
- suggestions.push(`Install morph-spec validator: bin/validate.js not found`);
35
- continue;
36
- }
37
-
38
- const result = execSync(
39
- `node "${validateBin}" ${validator} --json --quiet`,
40
- { encoding: 'utf8', stdio: 'pipe', cwd, timeout: 60000 }
41
- );
42
-
43
- const parsed = JSON.parse(result);
44
- if (parsed.errors > 0) {
45
- allPassed = false;
46
- (parsed.issues || []).forEach(issue => {
47
- if (issue.severity === 'error') {
48
- issues.push({ message: `[${validator}] ${issue.message}`, severity: 'error' });
49
- }
50
- });
51
- }
52
-
53
- if (parsed.warnings > 0) {
54
- (parsed.issues || []).forEach(issue => {
55
- if (issue.severity === 'warning') {
56
- issues.push({ message: `[${validator}] ${issue.message}`, severity: 'warning' });
57
- }
58
- });
59
- }
60
- } catch (err) {
61
- // If validator fails to run, report as warning but don't block
62
- issues.push({
63
- message: `[${validator}] Validator execution failed: ${err.message}`,
64
- severity: 'warning'
65
- });
66
- suggestions.push(`Run manually: node bin/validate.js ${validator}`);
67
- }
68
- }
69
-
70
- if (!allPassed && issues.some(i => i.severity === 'error')) {
71
- suggestions.push('Fix architecture and security violations before continuing');
72
- suggestions.push('See framework/standards/architecture.md for patterns');
73
- }
74
-
75
- const output = {
76
- passed: allPassed,
77
- validatorsRun: VALIDATORS,
78
- issues,
79
- suggestions,
80
- timestamp: new Date().toISOString(),
81
- error: null
82
- };
83
-
84
- process.stdout.write(JSON.stringify(output));
85
- process.exit(allPassed ? 0 : 1);
86
- }
87
-
88
- runValidators().catch(err => {
89
- process.stdout.write(JSON.stringify({
90
- passed: false,
91
- issues: [{ message: err.message, severity: 'error' }],
92
- suggestions: [],
93
- error: err.message
94
- }));
95
- process.exit(1);
96
- });