@polymorphism-tech/morph-spec 4.3.7 → 4.6.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 (394) hide show
  1. package/.morph/.morphversion +3 -3
  2. package/.morph/analytics/threads-log.jsonl +6 -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/{standards → framework/standards}/frontend/nextjs/nextjs-patterns.md +17 -0
  7. package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
  8. package/.morph/{templates → framework/templates}/README.md +17 -17
  9. package/.morph/{templates → framework/templates}/REGISTRY.json +48 -233
  10. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  11. package/.morph/{templates → framework/templates}/context/CONTEXT-FEATURE.md +1 -1
  12. package/.morph/{templates → framework/templates}/context/CONTEXT.md +3 -3
  13. package/.morph/framework/templates/docs/clarifications.md +253 -0
  14. package/.morph/framework/templates/docs/onboarding.md +123 -0
  15. package/.morph/framework/templates/docs/schema-analysis.md +119 -0
  16. package/.morph/{templates → framework/templates}/docs/spec.md +149 -149
  17. package/.morph/framework/templates/docs/ui-components.md +124 -0
  18. package/.morph/framework/templates/docs/ui-design-system.md +76 -0
  19. package/.morph/framework/templates/docs/ui-flows.md +167 -0
  20. package/.morph/framework/templates/docs/ui-mockups.md +98 -0
  21. package/.morph/framework/templates/docs/user-stories.md +34 -0
  22. package/.morph/{templates → framework/templates}/examples/spec-examples.md +1 -1
  23. package/.morph/{templates → framework/templates}/infrastructure/github/README.md +11 -11
  24. package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  25. package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  26. package/.morph/{templates → framework/templates}/meta-prompts/validators/pre-commit-validator.md +1 -1
  27. package/.morph/logs/tool-failures.log +7 -0
  28. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +16 -0
  29. package/.morph/state.json +1 -1
  30. package/CLAUDE.md +77 -155
  31. package/README.md +20 -18
  32. package/bin/detect-agents.js +1 -1
  33. package/bin/morph-spec.js +116 -266
  34. package/bin/task-manager.cjs +2 -2
  35. package/bin/validate.js +1 -1
  36. package/claude-plugin.json +14 -0
  37. package/docs/claude-alignment-report.md +137 -0
  38. package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +512 -0
  39. package/docs/plans/2026-02-22-claude-settings.md +515 -0
  40. package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +728 -0
  41. package/docs/plans/2026-02-22-morph-spec-next.md +478 -0
  42. package/docs/plans/2026-02-22-native-alignment-design.md +199 -0
  43. package/docs/plans/2026-02-22-native-alignment-impl.md +925 -0
  44. package/docs/plans/2026-02-22-native-enrichment-design.md +244 -0
  45. package/docs/plans/2026-02-22-native-enrichment.md +735 -0
  46. package/framework/CLAUDE.md +77 -0
  47. package/framework/{skills/level-2-domains → agents}/ai-agents/ai-system-architect.md +7 -3
  48. package/framework/{skills/level-2-domains → agents}/architecture/po-pm-advisor.md +7 -1
  49. package/framework/{skills/level-2-domains → agents}/architecture/prompt-engineer.md +7 -1
  50. package/framework/{skills/level-2-domains → agents}/architecture/seo-growth-hacker.md +7 -1
  51. package/framework/{skills/level-2-domains → agents}/architecture/standards-architect.md +10 -6
  52. package/framework/agents/backend/api-designer.md +103 -0
  53. package/framework/{skills/level-2-domains → agents}/backend/dotnet-senior.md +7 -1
  54. package/framework/agents/backend/ef-modeler.md +119 -0
  55. package/framework/{skills/level-2-domains → agents}/backend/hangfire-orchestrator.md +8 -4
  56. package/framework/{skills/level-2-domains → agents}/backend/ms-agent-expert.md +7 -3
  57. package/framework/{skills/level-2-domains → agents}/frontend/blazor-builder.md +7 -3
  58. package/framework/{skills/level-2-domains → agents}/frontend/nextjs-expert.md +7 -3
  59. package/framework/{skills/level-2-domains → agents}/frontend/ui-ux-designer.md +8 -2
  60. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-architect.md +7 -1
  61. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-deploy-specialist.md +7 -1
  62. package/framework/{skills/level-2-domains → agents}/infrastructure/bicep-architect.md +7 -3
  63. package/framework/{skills/level-2-domains → agents}/infrastructure/container-specialist.md +7 -3
  64. package/framework/{skills/level-2-domains → agents}/infrastructure/devops-engineer.md +7 -3
  65. package/framework/{skills/level-2-domains → agents}/integrations/asaas-financial.md +7 -3
  66. package/framework/{skills/level-2-domains → agents}/integrations/azure-identity.md +7 -3
  67. package/framework/{skills/level-2-domains → agents}/integrations/clerk-auth.md +7 -3
  68. package/framework/{skills/level-2-domains/integrations/hangfire-orchestrator.md → agents/integrations/hangfire-integration.md} +7 -1
  69. package/framework/{skills/level-2-domains → agents}/integrations/resend-email.md +7 -3
  70. package/framework/{skills/level-2-domains → agents}/quality/code-analyzer.md +9 -5
  71. package/framework/{skills/level-2-domains → agents}/quality/testing-specialist.md +7 -3
  72. package/framework/commands/morph-apply.md +9 -9
  73. package/framework/commands/morph-archive.md +8 -8
  74. package/framework/commands/morph-infra.md +1 -1
  75. package/framework/commands/morph-proposal.md +9 -9
  76. package/framework/commands/morph-status.md +3 -3
  77. package/framework/commands/morph-troubleshoot.md +1 -1
  78. package/framework/hooks/README.md +201 -282
  79. package/framework/hooks/claude-code/notification/approval-reminder.js +52 -0
  80. package/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
  81. package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
  82. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
  83. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
  84. package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
  85. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
  86. package/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
  87. package/framework/hooks/claude-code/statusline.py +538 -0
  88. package/framework/hooks/claude-code/statusline.sh +7 -0
  89. package/framework/hooks/claude-code/stop/validate-completion.js +88 -0
  90. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
  91. package/framework/hooks/shared/hook-response.js +45 -0
  92. package/framework/hooks/shared/phase-utils.js +129 -0
  93. package/framework/hooks/shared/state-reader.js +138 -0
  94. package/framework/hooks/shared/stdin-reader.js +26 -0
  95. package/framework/phases.json +145 -0
  96. package/framework/rules/csharp-standards.md +10 -0
  97. package/framework/rules/frontend-standards.md +14 -0
  98. package/framework/rules/infrastructure-standards.md +13 -0
  99. package/framework/rules/morph-workflow.md +86 -0
  100. package/framework/rules/testing-standards.md +11 -0
  101. package/framework/skills/README.md +66 -0
  102. package/framework/skills/level-0-meta/brainstorming/SKILL.md +135 -0
  103. package/framework/skills/level-0-meta/brainstorming/references/proposal-example.md +138 -0
  104. package/framework/skills/level-0-meta/{code-review.md → code-review/SKILL.md} +13 -4
  105. package/framework/skills/level-0-meta/code-review/references/review-example.md +164 -0
  106. package/framework/skills/level-0-meta/code-review/scripts/scan-csharp.mjs +121 -0
  107. package/framework/skills/level-0-meta/mcp-registry.json +207 -0
  108. package/framework/skills/level-0-meta/{morph-checklist.md → morph-checklist/SKILL.md} +8 -3
  109. package/framework/skills/{level-1-workflows/morph-replicate.md → level-0-meta/morph-replicate/SKILL.md} +13 -6
  110. package/framework/skills/level-0-meta/{simulation-checklist.md → simulation-checklist/SKILL.md} +9 -4
  111. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +334 -0
  112. package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +147 -0
  113. package/framework/skills/level-0-meta/verification-before-completion/scripts/check-phase-outputs.mjs +110 -0
  114. package/framework/skills/level-1-workflows/{phase-clarify.md → phase-clarify/SKILL.md} +65 -4
  115. package/framework/skills/level-1-workflows/phase-clarify/references/clarifications-example.md +117 -0
  116. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -0
  117. package/framework/skills/level-1-workflows/phase-design/SKILL.md +303 -0
  118. package/framework/skills/level-1-workflows/phase-design/references/spec-example.md +253 -0
  119. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -0
  120. package/framework/skills/level-1-workflows/phase-implement/references/recap-example.md +132 -0
  121. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +171 -0
  122. package/framework/skills/level-1-workflows/{phase-tasks.md → phase-tasks/SKILL.md} +89 -7
  123. package/framework/skills/level-1-workflows/phase-tasks/references/tasks-example.md +231 -0
  124. package/framework/skills/level-1-workflows/phase-tasks/scripts/validate-tasks.mjs +112 -0
  125. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -0
  126. package/framework/standards/STANDARDS.json +812 -0
  127. package/framework/standards/ai-agents/team-orchestration.md +3 -3
  128. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -0
  129. package/framework/standards/integration/mcp/mcp-tools.md +384 -0
  130. package/framework/templates/README.md +17 -17
  131. package/framework/templates/REGISTRY.json +48 -233
  132. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  133. package/framework/templates/context/CONTEXT-FEATURE.md +1 -1
  134. package/framework/templates/context/CONTEXT.md +3 -3
  135. package/framework/templates/docs/clarifications.md +253 -0
  136. package/framework/templates/docs/onboarding.md +123 -0
  137. package/framework/templates/docs/schema-analysis.md +119 -0
  138. package/framework/templates/docs/spec.md +149 -149
  139. package/framework/templates/docs/ui-components.md +124 -0
  140. package/framework/templates/docs/ui-design-system.md +76 -0
  141. package/framework/templates/docs/ui-flows.md +167 -0
  142. package/framework/templates/docs/ui-mockups.md +98 -0
  143. package/framework/templates/docs/user-stories.md +34 -0
  144. package/framework/templates/examples/spec-examples.md +1 -1
  145. package/framework/templates/infrastructure/github/README.md +11 -11
  146. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  147. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  148. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +1 -1
  149. package/framework/workflows/configs/express.json +45 -0
  150. package/framework/workflows/configs/spec-only.json +43 -0
  151. package/framework/workflows/docs/enforcement-pipeline.md +8 -8
  152. package/framework/workflows/docs/full-morph.md +3 -3
  153. package/package.json +3 -1
  154. package/scripts/generate-refs.js +336 -0
  155. package/scripts/generate-standards-registry.js +44 -0
  156. package/scripts/validate-real.mjs +255 -0
  157. package/src/commands/feature/create-story.js +362 -361
  158. package/src/commands/feature/shard-spec.js +225 -224
  159. package/src/commands/feature/sprint-status.js +1 -1
  160. package/src/commands/generation/generate-onboarding.js +169 -0
  161. package/src/commands/generation/generate.js +2 -2
  162. package/src/commands/mcp/mcp-setup.js +315 -0
  163. package/src/commands/project/changes.js +66 -0
  164. package/src/commands/project/checkpoint.js +209 -0
  165. package/src/commands/project/cost.js +179 -0
  166. package/src/commands/project/diff.js +278 -0
  167. package/src/commands/project/doctor.js +55 -7
  168. package/src/commands/project/init.js +318 -136
  169. package/src/commands/project/revert.js +173 -0
  170. package/src/commands/project/standards.js +80 -0
  171. package/src/commands/project/status.js +376 -0
  172. package/src/commands/project/update-agents.js +23 -0
  173. package/src/commands/project/update.js +60 -88
  174. package/src/commands/state/advance-phase.js +4 -3
  175. package/src/commands/state/state.js +10 -3
  176. package/src/commands/state/validate-phase.js +19 -2
  177. package/src/commands/templates/template-customize.js +4 -4
  178. package/src/commands/templates/template-render.js +1 -1
  179. package/src/commands/templates/template-show.js +1 -1
  180. package/src/commands/validation/validate-feature.js +359 -0
  181. package/src/core/orchestrator.js +3 -38
  182. package/src/core/paths/output-schema.js +135 -0
  183. package/src/core/state/state-manager.js +831 -592
  184. package/src/core/templates/template-registry.js +2 -2
  185. package/src/core/workflows/workflow-detector.js +17 -1
  186. package/src/lib/agents/micro-agent-factory.js +1 -1
  187. package/src/lib/context/context-bundler.js +2 -1
  188. package/src/lib/detectors/claude-config-detector.js +390 -0
  189. package/src/lib/detectors/conversation-analyzer.js +4 -4
  190. package/src/lib/detectors/design-system-detector.js +6 -5
  191. package/src/lib/detectors/standards-generator.js +2 -2
  192. package/src/lib/generators/context-generator.js +539 -538
  193. package/src/lib/generators/recap-generator.js +1 -1
  194. package/src/lib/generators/settings-generator.js +210 -0
  195. package/src/lib/hooks/hook-executor.js +1 -1
  196. package/src/lib/installers/mcp-installer.js +299 -0
  197. package/src/lib/learning/learning-system.js +3 -3
  198. package/src/lib/orchestration/team-orchestrator.js +1 -1
  199. package/src/lib/standards/standards-context-injector.js +7 -7
  200. package/src/lib/threads/thread-coordinator.js +1 -1
  201. package/src/lib/troubleshooting/troubleshoot-grep.js +1 -1
  202. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -273
  203. package/src/lib/validators/design-system/design-system-validator.js +1 -1
  204. package/src/lib/validators/spec-validator.js +258 -258
  205. package/src/lib/validators/validation-runner.js +270 -269
  206. package/src/utils/agents-installer.js +206 -0
  207. package/src/utils/claude-settings-manager.js +258 -0
  208. package/src/utils/file-copier.js +1 -1
  209. package/src/utils/hooks-installer.js +354 -28
  210. package/src/utils/skills-installer.js +118 -0
  211. package/.morph/project/context/README.md +0 -17
  212. package/.morph/project/context/detection-log.md +0 -16
  213. package/.morph/project/standards/inferred.md +0 -59
  214. package/framework/hooks/agent-stop/validate-and-continue.js +0 -96
  215. package/framework/hooks/agent-stop/validate-checkpoints.js +0 -101
  216. package/framework/hooks/agent-stop/validate-tests.js +0 -109
  217. package/framework/hooks/agent-teams/dispatch.js +0 -67
  218. package/framework/hooks/agent-teams/phase-advanced.js +0 -80
  219. package/framework/hooks/agent-teams/task-completed.js +0 -76
  220. package/framework/hooks/agent-teams/teammate-idle.js +0 -70
  221. package/framework/skills/level-1-workflows/phase-design.md +0 -213
  222. package/framework/skills/level-1-workflows/phase-setup.md +0 -106
  223. package/framework/skills/level-1-workflows/phase-uiux.md +0 -169
  224. package/framework/skills/level-2-domains/backend/api-designer.md +0 -59
  225. package/framework/skills/level-2-domains/backend/ef-modeler.md +0 -58
  226. package/framework/skills/level-3-technologies/README.md +0 -7
  227. package/framework/skills/level-4-patterns/README.md +0 -7
  228. package/src/commands/agents/agents-fuse.js +0 -97
  229. package/src/commands/agents/micro-agent.js +0 -112
  230. package/src/commands/agents/spawn-team.js +0 -237
  231. package/src/commands/agents/squad-template.js +0 -146
  232. package/src/commands/analytics/analytics.js +0 -176
  233. package/src/commands/context/context-prime.js +0 -63
  234. package/src/commands/context/core-four.js +0 -54
  235. package/src/commands/generation/generate-context.js +0 -40
  236. package/src/commands/project/detect-agents.js +0 -207
  237. package/src/commands/project/detect-workflow.js +0 -174
  238. package/src/commands/threads/thread-template.js +0 -103
  239. package/src/commands/threads/threads.js +0 -261
  240. package/src/commands/utils/session-summary.js +0 -291
  241. package/src/llm/analyzer.js +0 -215
  242. package/src/llm/few-shot-examples.js +0 -216
  243. package/src/llm/project-config-schema.json +0 -188
  244. package/src/llm/prompt-builder.js +0 -96
  245. /package/.morph/{config → framework}/agents.json +0 -0
  246. /package/.morph/{standards → framework/standards}/ai-agents/blazor-ui.md +0 -0
  247. /package/.morph/{standards → framework/standards}/ai-agents/production.md +0 -0
  248. /package/.morph/{standards → framework/standards}/ai-agents/setup.md +0 -0
  249. /package/.morph/{standards → framework/standards}/ai-agents/workflows.md +0 -0
  250. /package/.morph/{standards → framework/standards}/architecture/ddd/aggregates.md +0 -0
  251. /package/.morph/{standards → framework/standards}/architecture/ddd/entities.md +0 -0
  252. /package/.morph/{standards → framework/standards}/architecture/ddd/value-objects.md +0 -0
  253. /package/.morph/{standards → framework/standards}/backend/api/minimal-api.md +0 -0
  254. /package/.morph/{standards → framework/standards}/backend/api/rest.md +0 -0
  255. /package/.morph/{standards → framework/standards}/backend/api/validation.md +0 -0
  256. /package/.morph/{standards → framework/standards}/backend/authentication/passkeys.md +0 -0
  257. /package/.morph/{standards → framework/standards}/backend/database/ef-core.md +0 -0
  258. /package/.morph/{standards → framework/standards}/backend/database/migrations.md +0 -0
  259. /package/.morph/{standards → framework/standards}/backend/database/postgresql/database.md +0 -0
  260. /package/.morph/{standards → framework/standards}/backend/database/repository-patterns.md +0 -0
  261. /package/.morph/{standards → framework/standards}/backend/database/vector-search-rag.md +0 -0
  262. /package/.morph/{standards → framework/standards}/backend/dotnet/async.md +0 -0
  263. /package/.morph/{standards → framework/standards}/backend/dotnet/core.md +0 -0
  264. /package/.morph/{standards → framework/standards}/backend/dotnet/di.md +0 -0
  265. /package/.morph/{standards → framework/standards}/backend/dotnet/program-cs-checklist.md +0 -0
  266. /package/.morph/{standards → framework/standards}/backend/integrations/asaas/asaas-api.md +0 -0
  267. /package/.morph/{standards → framework/standards}/backend/integrations/clerk/clerk-auth.md +0 -0
  268. /package/.morph/{standards → framework/standards}/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  269. /package/.morph/{standards → framework/standards}/backend/integrations/resend/resend-email.md +0 -0
  270. /package/.morph/{standards → framework/standards}/context/analytics.md +0 -0
  271. /package/.morph/{standards → framework/standards}/context/bundles.md +0 -0
  272. /package/.morph/{standards → framework/standards}/context/priming.md +0 -0
  273. /package/.morph/{standards → framework/standards}/core/architecture.md +0 -0
  274. /package/.morph/{standards → framework/standards}/core/coding.md +0 -0
  275. /package/.morph/{standards → framework/standards}/core/git-branching-strategy.md +0 -0
  276. /package/.morph/{standards → framework/standards}/core/git.md +0 -0
  277. /package/.morph/{standards → framework/standards}/core/testing.md +0 -0
  278. /package/.morph/{standards → framework/standards}/data/nosql/blob-storage.md +0 -0
  279. /package/.morph/{standards → framework/standards}/data/nosql/cache/redis.md +0 -0
  280. /package/.morph/{standards → framework/standards}/data/nosql/cosmos-db.md +0 -0
  281. /package/.morph/{standards → framework/standards}/data/vector-search/azure-ai-search.md +0 -0
  282. /package/.morph/{standards → framework/standards}/data/vector-search/rag-chunking.md +0 -0
  283. /package/.morph/{standards → framework/standards}/frontend/blazor/design-checklist.md +0 -0
  284. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui-setup.md +0 -0
  285. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui.md +0 -0
  286. /package/.morph/{standards → framework/standards}/frontend/blazor/html-conversion.md +0 -0
  287. /package/.morph/{standards → framework/standards}/frontend/blazor/lifecycle.md +0 -0
  288. /package/.morph/{standards → framework/standards}/frontend/blazor/pitfalls.md +0 -0
  289. /package/.morph/{standards → framework/standards}/frontend/blazor/state.md +0 -0
  290. /package/.morph/{standards → framework/standards}/frontend/design-system/animations.md +0 -0
  291. /package/.morph/{standards → framework/standards}/frontend/design-system/naming.md +0 -0
  292. /package/.morph/{standards → framework/standards}/infrastructure/azure/azure.md +0 -0
  293. /package/.morph/{standards → framework/standards}/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  294. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  295. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/local-development.md +0 -0
  296. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/functions.md +0 -0
  297. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/service-bus.md +0 -0
  298. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/storage.md +0 -0
  299. /package/.morph/{standards → framework/standards}/infrastructure/docker/easypanel-deploy.md +0 -0
  300. /package/.morph/{standards → framework/standards}/infrastructure/supabase/mcp-setup.md +0 -0
  301. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-auth.md +0 -0
  302. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-pgvector.md +0 -0
  303. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-rls.md +0 -0
  304. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-storage.md +0 -0
  305. /package/.morph/{standards → framework/standards}/integration/api/graphql.md +0 -0
  306. /package/.morph/{standards → framework/standards}/integration/api/grpc.md +0 -0
  307. /package/.morph/{standards → framework/standards}/integration/api/rest-design.md +0 -0
  308. /package/.morph/{standards → framework/standards}/integration/event-driven/cqrs.md +0 -0
  309. /package/.morph/{standards → framework/standards}/integration/event-driven/event-sourcing.md +0 -0
  310. /package/.morph/{standards → framework/standards}/integration/event-driven/service-bus.md +0 -0
  311. /package/.morph/{standards → framework/standards}/observability/logging.md +0 -0
  312. /package/.morph/{standards → framework/standards}/observability/metrics.md +0 -0
  313. /package/.morph/{standards → framework/standards}/observability/monitoring.md +0 -0
  314. /package/.morph/{standards → framework/standards}/observability/tracing.md +0 -0
  315. /package/.morph/{standards → framework/standards}/workflows/parallel-execution.md +0 -0
  316. /package/.morph/{standards → framework/standards}/workflows/thread-management.md +0 -0
  317. /package/.morph/{templates → framework/templates}/.idea/morph-templates.xml +0 -0
  318. /package/.morph/{templates → framework/templates}/.vscode/morph-templates.code-snippets +0 -0
  319. /package/.morph/{templates → framework/templates}/IDE-SNIPPETS.md +0 -0
  320. /package/.morph/{templates → framework/templates}/code/dotnet/backend/repository.cs +0 -0
  321. /package/.morph/{templates → framework/templates}/code/dotnet/backend/service.cs +0 -0
  322. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Commands.cs +0 -0
  323. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Entities.cs +0 -0
  324. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Queries.cs +0 -0
  325. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/README.md +0 -0
  326. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/api-contracts.cs +0 -0
  327. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/contracts.cs +0 -0
  328. /package/.morph/{templates → framework/templates}/code/dotnet/database/migration.cs +0 -0
  329. /package/.morph/{templates → framework/templates}/code/dotnet/frontend/component.razor +0 -0
  330. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/agent.cs +0 -0
  331. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/job.cs +0 -0
  332. /package/.morph/{templates → framework/templates}/code/dotnet/test.cs +0 -0
  333. /package/.morph/{templates → framework/templates}/code/sql/rls-policy.sql +0 -0
  334. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.sql +0 -0
  335. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.template.sql +0 -0
  336. /package/.morph/{templates → framework/templates}/code/typescript/contracts.ts +0 -0
  337. /package/.morph/{templates → framework/templates}/docs/proposal.md +0 -0
  338. /package/.morph/{templates → framework/templates}/examples/design-system-examples.md +0 -0
  339. /package/.morph/{templates → framework/templates}/feature/decisions.md +0 -0
  340. /package/.morph/{templates → framework/templates}/feature/recap.md +0 -0
  341. /package/.morph/{templates → framework/templates}/feature/tasks.md +0 -0
  342. /package/.morph/{templates → framework/templates}/infrastructure/azure/Dockerfile.example +0 -0
  343. /package/.morph/{templates → framework/templates}/infrastructure/azure/README.md +0 -0
  344. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-insights.bicep +0 -0
  345. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-service.bicep +0 -0
  346. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app-env.bicep +0 -0
  347. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app.bicep +0 -0
  348. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy-checklist.md +0 -0
  349. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.ps1 +0 -0
  350. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.sh +0 -0
  351. /package/.morph/{templates → framework/templates}/infrastructure/azure/key-vault.bicep +0 -0
  352. /package/.morph/{templates → framework/templates}/infrastructure/azure/main.bicep +0 -0
  353. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.dev.json +0 -0
  354. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.prod.json +0 -0
  355. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.staging.json +0 -0
  356. /package/.morph/{templates → framework/templates}/infrastructure/azure/sql-database.bicep +0 -0
  357. /package/.morph/{templates → framework/templates}/infrastructure/azure/storage.bicep +0 -0
  358. /package/.morph/{templates → framework/templates}/infrastructure/docker/Dockerfile.template +0 -0
  359. /package/.morph/{templates → framework/templates}/infrastructure/docker/docker-compose.template.yml +0 -0
  360. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-api.dockerfile +0 -0
  361. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-web.dockerfile +0 -0
  362. /package/.morph/{templates → framework/templates}/infrastructure/docker/easypanel.template.json +0 -0
  363. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -0
  364. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -0
  365. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/health-check/action.yml.hbs +0 -0
  366. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -0
  367. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -0
  368. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -0
  369. /package/.morph/{templates → framework/templates}/integrations/asaas-client.cs +0 -0
  370. /package/.morph/{templates → framework/templates}/integrations/asaas-webhook.cs +0 -0
  371. /package/.morph/{templates → framework/templates}/integrations/azure-identity-config.cs +0 -0
  372. /package/.morph/{templates → framework/templates}/integrations/clerk-config.cs +0 -0
  373. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-agent.md +0 -0
  374. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-aggregator.md +0 -0
  375. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-retry.md +0 -0
  376. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-validation.md +0 -0
  377. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-wrapper.md +0 -0
  378. /package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-coordinator.md +0 -0
  379. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/backend-squad.md +0 -0
  380. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/frontend-squad.md +0 -0
  381. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/squad-leader.md +0 -0
  382. /package/.morph/{templates → framework/templates}/meta-prompts/validators/checkpoint-validator.md +0 -0
  383. /package/.morph/{templates → framework/templates}/saas/subscription.cs +0 -0
  384. /package/.morph/{templates → framework/templates}/saas/tenant.cs +0 -0
  385. /package/.morph/{templates → framework/templates}/state.template.json +0 -0
  386. /package/.morph/{templates → framework/templates}/ui/FluentDesignTheme.cs +0 -0
  387. /package/.morph/{templates → framework/templates}/ui/MudTheme.cs +0 -0
  388. /package/.morph/{templates → framework/templates}/ui/design-system.css +0 -0
  389. /package/framework/{skills/level-2-domains → agents}/README.md +0 -0
  390. /package/framework/hooks/{commit-msg → git/commit-msg}/conventional-commits.sh +0 -0
  391. /package/framework/hooks/{pre-commit → git/pre-commit}/agents.sh +0 -0
  392. /package/framework/hooks/{pre-commit → git/pre-commit}/orchestrator.sh +0 -0
  393. /package/framework/hooks/{pre-commit → git/pre-commit}/specs.sh +0 -0
  394. /package/framework/hooks/{pre-push → git/pre-push}/run-tests.sh +0 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * MORPH-SPEC Cost Tracking Command
3
+ *
4
+ * Track and estimate costs (token usage, Azure resources) across phases.
5
+ *
6
+ * Usage:
7
+ * morph-spec cost <feature-name>
8
+ * morph-spec cost <feature-name> --json
9
+ */
10
+
11
+ import chalk from 'chalk';
12
+ import { getFeature, loadState, saveState } from '../../core/state/state-manager.js';
13
+
14
+ /**
15
+ * Phase cost weights (relative token usage)
16
+ */
17
+ const PHASE_COST_WEIGHTS = {
18
+ proposal: 5,
19
+ setup: 3,
20
+ uiux: 12,
21
+ design: 18,
22
+ clarify: 20,
23
+ tasks: 17,
24
+ implement: 80
25
+ };
26
+
27
+ /**
28
+ * Cost per 1K tokens (approximate for Claude models)
29
+ */
30
+ const COST_PER_1K_INPUT = 0.003;
31
+ const COST_PER_1K_OUTPUT = 0.015;
32
+
33
+ /**
34
+ * Record token usage for a phase
35
+ */
36
+ export function recordPhaseUsage(featureName, phase, inputTokens, outputTokens) {
37
+ const state = loadState();
38
+ const feature = state.features[featureName];
39
+ if (!feature) return;
40
+
41
+ if (!feature.costs) {
42
+ feature.costs = { phases: {}, estimated: 0, approved: false };
43
+ }
44
+
45
+ if (!feature.costs.phases[phase]) {
46
+ feature.costs.phases[phase] = { inputTokens: 0, outputTokens: 0, usd: 0 };
47
+ }
48
+
49
+ feature.costs.phases[phase].inputTokens += inputTokens;
50
+ feature.costs.phases[phase].outputTokens += outputTokens;
51
+ feature.costs.phases[phase].usd =
52
+ (feature.costs.phases[phase].inputTokens / 1000 * COST_PER_1K_INPUT) +
53
+ (feature.costs.phases[phase].outputTokens / 1000 * COST_PER_1K_OUTPUT);
54
+
55
+ saveState(state);
56
+ }
57
+
58
+ /**
59
+ * Calculate estimated remaining cost
60
+ */
61
+ function estimateRemaining(feature) {
62
+ const currentPhaseIndex = Object.keys(PHASE_COST_WEIGHTS).indexOf(feature.phase);
63
+ const completedWeight = Object.entries(PHASE_COST_WEIGHTS)
64
+ .filter(([_, __], i) => i <= currentPhaseIndex)
65
+ .reduce((sum, [_, w]) => sum + w, 0);
66
+
67
+ const totalWeight = Object.values(PHASE_COST_WEIGHTS).reduce((a, b) => a + b, 0);
68
+ const remainingWeight = totalWeight - completedWeight;
69
+
70
+ // Estimate based on actual usage so far
71
+ const actualSpent = Object.values(feature.costs?.phases || {})
72
+ .reduce((sum, p) => sum + p.usd, 0);
73
+
74
+ if (completedWeight === 0 || actualSpent === 0) {
75
+ // No data yet, use default estimates
76
+ const estimatedTokens = remainingWeight * 1000;
77
+ return (estimatedTokens / 1000 * COST_PER_1K_INPUT) + (estimatedTokens / 1000 * COST_PER_1K_OUTPUT);
78
+ }
79
+
80
+ const costPerWeight = actualSpent / completedWeight;
81
+ return costPerWeight * remainingWeight;
82
+ }
83
+
84
+ /**
85
+ * Main cost command
86
+ */
87
+ export async function costCommand(featureName, options = {}) {
88
+ if (!featureName) {
89
+ console.error(chalk.red('Error: Feature name required'));
90
+ console.error(chalk.gray('Usage: morph-spec cost <feature-name>'));
91
+ process.exit(1);
92
+ }
93
+
94
+ const feature = getFeature(featureName);
95
+ if (!feature) {
96
+ console.error(chalk.red(`Error: Feature '${featureName}' not found`));
97
+ process.exit(1);
98
+ }
99
+
100
+ const costs = feature.costs || { phases: {} };
101
+ const totalSpent = Object.values(costs.phases)
102
+ .reduce((sum, p) => sum + (p.usd || 0), 0);
103
+ const estimatedRemaining = estimateRemaining(feature);
104
+ const totalTokens = Object.values(costs.phases)
105
+ .reduce((sum, p) => sum + (p.inputTokens || 0) + (p.outputTokens || 0), 0);
106
+
107
+ // JSON output
108
+ if (options.json) {
109
+ const output = {
110
+ feature: featureName,
111
+ currentPhase: feature.phase,
112
+ totalTokens,
113
+ totalSpentUsd: Math.round(totalSpent * 100) / 100,
114
+ estimatedRemainingUsd: Math.round(estimatedRemaining * 100) / 100,
115
+ estimatedTotalUsd: Math.round((totalSpent + estimatedRemaining) * 100) / 100,
116
+ phases: Object.entries(costs.phases).map(([phase, data]) => ({
117
+ phase,
118
+ inputTokens: data.inputTokens,
119
+ outputTokens: data.outputTokens,
120
+ usd: Math.round(data.usd * 100) / 100
121
+ })),
122
+ infraCosts: {
123
+ estimated: costs.estimated || 0,
124
+ approved: costs.approved || false
125
+ }
126
+ };
127
+ console.log(JSON.stringify(output, null, 2));
128
+ return;
129
+ }
130
+
131
+ // Visual output
132
+ console.log(chalk.cyan('\n┌────────────────────────────────────────────────────────────┐'));
133
+ console.log(chalk.cyan('│ MORPH-SPEC COST TRACKER │'));
134
+ console.log(chalk.cyan('└────────────────────────────────────────────────────────────┘\n'));
135
+
136
+ console.log(chalk.white.bold(`Feature: ${featureName}`));
137
+ console.log(chalk.gray(`Current Phase: ${feature.phase}\n`));
138
+
139
+ console.log(chalk.white.bold('Token usage by phase:'));
140
+
141
+ const allPhases = Object.keys(PHASE_COST_WEIGHTS);
142
+ for (const phase of allPhases) {
143
+ const data = costs.phases[phase];
144
+ const weight = PHASE_COST_WEIGHTS[phase];
145
+ const phaseIndex = allPhases.indexOf(phase);
146
+ const currentIndex = allPhases.indexOf(feature.phase);
147
+ const isLast = phaseIndex === allPhases.length - 1;
148
+ const prefix = isLast ? '└─' : '├─';
149
+
150
+ if (data) {
151
+ const tokens = (data.inputTokens || 0) + (data.outputTokens || 0);
152
+ const usd = Math.round((data.usd || 0) * 100) / 100;
153
+ const tokensStr = tokens >= 1000 ? `${Math.round(tokens / 1000)}k` : `${tokens}`;
154
+ console.log(`${prefix} ${phase.toUpperCase()}: ${chalk.white(tokensStr)} tokens ${chalk.gray(`($${usd})`)}`);
155
+ } else if (phaseIndex <= currentIndex) {
156
+ console.log(`${prefix} ${phase.toUpperCase()}: ${chalk.gray('(no data recorded)')}`);
157
+ } else {
158
+ console.log(`${prefix} ${phase.toUpperCase()}: ${chalk.gray(`~${weight}k tokens (estimated)`)}`);
159
+ }
160
+ }
161
+
162
+ console.log('');
163
+ console.log(chalk.gray('─'.repeat(60)));
164
+
165
+ const totalTokensStr = totalTokens >= 1000 ? `${Math.round(totalTokens / 1000)}k` : `${totalTokens}`;
166
+ console.log(chalk.white(`Total spent: ${totalTokensStr} tokens ($${Math.round(totalSpent * 100) / 100})`));
167
+ console.log(chalk.yellow(`Estimated remaining: ~$${Math.round(estimatedRemaining * 100) / 100}`));
168
+ console.log(chalk.white.bold(`Estimated total: ~$${Math.round((totalSpent + estimatedRemaining) * 100) / 100}`));
169
+
170
+ // Infrastructure costs
171
+ if (costs.estimated > 0) {
172
+ console.log(chalk.white(`\nInfra costs (monthly): $${costs.estimated}`));
173
+ console.log(costs.approved ? chalk.green(' ✓ Approved') : chalk.yellow(' ⚠ Not yet approved'));
174
+ }
175
+
176
+ console.log('');
177
+ }
178
+
179
+ export default costCommand;
@@ -0,0 +1,278 @@
1
+ /**
2
+ * MORPH-SPEC Diff Command
3
+ *
4
+ * Track changes to specifications since last approval.
5
+ * Shows added/removed functional requirements, entity changes, and new decisions.
6
+ *
7
+ * Usage:
8
+ * morph-spec diff <feature-name> [output-file]
9
+ * morph-spec diff <feature-name> spec.md
10
+ * morph-spec diff <feature-name> --json
11
+ */
12
+
13
+ import fs from 'fs';
14
+ import path from 'path';
15
+ import chalk from 'chalk';
16
+ import { getFeature } from '../../core/state/state-manager.js';
17
+
18
+ /**
19
+ * Load snapshot from checkpoints directory
20
+ */
21
+ function loadSnapshot(featureName, outputFile) {
22
+ const snapshotDir = path.join(process.cwd(), '.morph/checkpoints', featureName);
23
+ const snapshotPath = path.join(snapshotDir, outputFile);
24
+
25
+ if (!fs.existsSync(snapshotPath)) {
26
+ return null;
27
+ }
28
+
29
+ return fs.readFileSync(snapshotPath, 'utf8');
30
+ }
31
+
32
+ /**
33
+ * Load current version of output file
34
+ */
35
+ function loadCurrent(featureName, outputFile) {
36
+ const currentPath = path.join(process.cwd(), '.morph/features', featureName, outputFile);
37
+
38
+ if (!fs.existsSync(currentPath)) {
39
+ return null;
40
+ }
41
+
42
+ return fs.readFileSync(currentPath, 'utf8');
43
+ }
44
+
45
+ /**
46
+ * Extract functional requirements from spec content
47
+ */
48
+ function extractRequirements(content) {
49
+ const requirements = [];
50
+ const regex = /###\s+(FR[-_]?\d+):?\s*(.+)/gi;
51
+ let match;
52
+ while ((match = regex.exec(content)) !== null) {
53
+ requirements.push({ id: match[1], title: match[2].trim() });
54
+ }
55
+ return requirements;
56
+ }
57
+
58
+ /**
59
+ * Extract entities from spec or contracts
60
+ */
61
+ function extractEntities(content) {
62
+ const entities = [];
63
+ // Markdown entities
64
+ const mdRegex = /###\s+(?:Entity|Table):?\s*(.+)/gi;
65
+ let match;
66
+ while ((match = mdRegex.exec(content)) !== null) {
67
+ entities.push(match[1].trim());
68
+ }
69
+ // C# records
70
+ const csRegex = /public\s+record\s+(\w+)/g;
71
+ while ((match = csRegex.exec(content)) !== null) {
72
+ entities.push(match[1]);
73
+ }
74
+ return entities;
75
+ }
76
+
77
+ /**
78
+ * Extract ADRs from decisions
79
+ */
80
+ function extractDecisions(content) {
81
+ const decisions = [];
82
+ const regex = /###\s+ADR[-_]?\d*:?\s*(.+)/gi;
83
+ let match;
84
+ while ((match = regex.exec(content)) !== null) {
85
+ decisions.push(match[1].trim());
86
+ }
87
+ return decisions;
88
+ }
89
+
90
+ /**
91
+ * Compute diff between two content versions
92
+ */
93
+ function computeDiff(oldContent, newContent, outputFile) {
94
+ const diff = {
95
+ file: outputFile,
96
+ added: [],
97
+ removed: [],
98
+ modified: []
99
+ };
100
+
101
+ if (!oldContent) {
102
+ diff.added.push('(entire file is new)');
103
+ return diff;
104
+ }
105
+
106
+ if (!newContent) {
107
+ diff.removed.push('(file was deleted)');
108
+ return diff;
109
+ }
110
+
111
+ // Compare requirements
112
+ if (outputFile.endsWith('spec.md')) {
113
+ const oldReqs = extractRequirements(oldContent);
114
+ const newReqs = extractRequirements(newContent);
115
+
116
+ const oldIds = new Set(oldReqs.map(r => r.id));
117
+ const newIds = new Set(newReqs.map(r => r.id));
118
+
119
+ for (const req of newReqs) {
120
+ if (!oldIds.has(req.id)) {
121
+ diff.added.push(`${req.id}: ${req.title}`);
122
+ }
123
+ }
124
+ for (const req of oldReqs) {
125
+ if (!newIds.has(req.id)) {
126
+ diff.removed.push(`${req.id}: ${req.title}`);
127
+ }
128
+ }
129
+
130
+ // Compare entities
131
+ const oldEntities = new Set(extractEntities(oldContent));
132
+ const newEntities = new Set(extractEntities(newContent));
133
+
134
+ for (const entity of newEntities) {
135
+ if (!oldEntities.has(entity)) {
136
+ diff.added.push(`Entity: ${entity}`);
137
+ }
138
+ }
139
+ for (const entity of oldEntities) {
140
+ if (!newEntities.has(entity)) {
141
+ diff.removed.push(`Entity: ${entity}`);
142
+ }
143
+ }
144
+ }
145
+
146
+ // Compare decisions
147
+ if (outputFile.endsWith('decisions.md')) {
148
+ const oldDecisions = new Set(extractDecisions(oldContent));
149
+ const newDecisions = new Set(extractDecisions(newContent));
150
+
151
+ for (const decision of newDecisions) {
152
+ if (!oldDecisions.has(decision)) {
153
+ diff.added.push(`ADR: ${decision}`);
154
+ }
155
+ }
156
+ for (const decision of oldDecisions) {
157
+ if (!newDecisions.has(decision)) {
158
+ diff.removed.push(`ADR: ${decision}`);
159
+ }
160
+ }
161
+ }
162
+
163
+ // Line count change
164
+ const oldLines = oldContent.split('\n').length;
165
+ const newLines = newContent.split('\n').length;
166
+ if (oldLines !== newLines) {
167
+ const delta = newLines - oldLines;
168
+ diff.modified.push(`${delta > 0 ? '+' : ''}${delta} lines (${oldLines} → ${newLines})`);
169
+ }
170
+
171
+ return diff;
172
+ }
173
+
174
+ /**
175
+ * Save current version as snapshot for future diffs
176
+ */
177
+ export function saveSnapshot(featureName) {
178
+ const outputDir = path.join(process.cwd(), '.morph/features', featureName);
179
+ const snapshotDir = path.join(process.cwd(), '.morph/checkpoints', featureName);
180
+
181
+ if (!fs.existsSync(outputDir)) return;
182
+
183
+ fs.mkdirSync(snapshotDir, { recursive: true });
184
+
185
+ const files = fs.readdirSync(outputDir).filter(f => f.endsWith('.md') || f.endsWith('.cs') || f.endsWith('.json'));
186
+ for (const file of files) {
187
+ const src = path.join(outputDir, file);
188
+ const dest = path.join(snapshotDir, file);
189
+ fs.copyFileSync(src, dest);
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Main diff command
195
+ */
196
+ export async function diffCommand(featureName, outputFile, options = {}) {
197
+ if (!featureName) {
198
+ console.error(chalk.red('Error: Feature name required'));
199
+ console.error(chalk.gray('Usage: morph-spec diff <feature-name> [output-file]'));
200
+ process.exit(1);
201
+ }
202
+
203
+ const outputDir = path.join(process.cwd(), '.morph/features', featureName);
204
+ if (!fs.existsSync(outputDir)) {
205
+ console.error(chalk.red(`Error: Feature directory not found: ${outputDir}`));
206
+ process.exit(1);
207
+ }
208
+
209
+ // Determine which files to diff
210
+ let files;
211
+ if (outputFile) {
212
+ files = [outputFile];
213
+ } else {
214
+ files = fs.readdirSync(outputDir).filter(f => f.endsWith('.md') || f.endsWith('.cs'));
215
+ }
216
+
217
+ const diffs = files.map(file => {
218
+ const oldContent = loadSnapshot(featureName, file);
219
+ const newContent = loadCurrent(featureName, file);
220
+ return computeDiff(oldContent, newContent, file);
221
+ }).filter(d => d.added.length > 0 || d.removed.length > 0 || d.modified.length > 0);
222
+
223
+ // JSON output
224
+ if (options.json) {
225
+ console.log(JSON.stringify({ feature: featureName, diffs }, null, 2));
226
+ return;
227
+ }
228
+
229
+ // Visual output
230
+ console.log(chalk.cyan('\n┌────────────────────────────────────────────────────────────┐'));
231
+ console.log(chalk.cyan('│ MORPH-SPEC DIFF │'));
232
+ console.log(chalk.cyan('└────────────────────────────────────────────────────────────┘\n'));
233
+
234
+ console.log(chalk.white.bold(`Feature: ${featureName}`));
235
+ console.log(chalk.gray('Changes since last snapshot:\n'));
236
+
237
+ if (diffs.length === 0) {
238
+ console.log(chalk.green(' No changes detected since last snapshot.'));
239
+ console.log(chalk.gray(' Run "morph-spec diff-save <feature>" to create a snapshot.\n'));
240
+ return;
241
+ }
242
+
243
+ for (const diff of diffs) {
244
+ console.log(chalk.white.bold(` ${diff.file}:`));
245
+
246
+ for (const item of diff.added) {
247
+ console.log(chalk.green(` + ${item}`));
248
+ }
249
+ for (const item of diff.removed) {
250
+ console.log(chalk.red(` - ${item}`));
251
+ }
252
+ for (const item of diff.modified) {
253
+ console.log(chalk.yellow(` ~ ${item}`));
254
+ }
255
+ console.log('');
256
+ }
257
+
258
+ const totalAdded = diffs.reduce((sum, d) => sum + d.added.length, 0);
259
+ const totalRemoved = diffs.reduce((sum, d) => sum + d.removed.length, 0);
260
+ console.log(chalk.gray('─'.repeat(60)));
261
+ console.log(chalk.gray(`${totalAdded} addition(s), ${totalRemoved} removal(s) across ${diffs.length} file(s)\n`));
262
+ }
263
+
264
+ /**
265
+ * Save snapshot command
266
+ */
267
+ export async function diffSaveCommand(featureName) {
268
+ if (!featureName) {
269
+ console.error(chalk.red('Error: Feature name required'));
270
+ process.exit(1);
271
+ }
272
+
273
+ saveSnapshot(featureName);
274
+ console.log(chalk.green(`✓ Snapshot saved for '${featureName}'`));
275
+ console.log(chalk.gray(' Future "morph-spec diff" will compare against this snapshot.\n'));
276
+ }
277
+
278
+ export default diffCommand;
@@ -10,6 +10,7 @@ import {
10
10
  checkProjectOutdated,
11
11
  getInstalledCLIVersion
12
12
  } from '../../utils/version-checker.js';
13
+ import { resetMorphSettings } from '../../utils/claude-settings-manager.js';
13
14
 
14
15
  const isWindows = platform() === 'win32';
15
16
 
@@ -65,7 +66,7 @@ const REQUIRED_LIB_FILES = [
65
66
  'src/lib/context/mcp-optimizer.js',
66
67
  'src/lib/agents/micro-agent-factory.js',
67
68
  'src/lib/execution/parallel-executor.js',
68
- 'src/lib/hooks/stop-hook-executor.js',
69
+ 'src/lib/hooks/stop-hook-executor.js', // Legacy — retained for backward compat
69
70
  'src/lib/threads/thread-coordinator.js',
70
71
  'src/lib/threads/thread-manager.js',
71
72
  'src/lib/trust/trust-manager.js'
@@ -198,8 +199,8 @@ async function doctorFullCommand(frameworkRoot) {
198
199
  missingStds.length > 0 ? `missing: ${missingStds.join(', ')}` : '');
199
200
 
200
201
  // ── 5. Required Agents in agents.json ───────────────────────────────────
201
- console.log(chalk.cyan(`\n .morph/config/agents.json — Required Agents (${REQUIRED_AGENTS.length})`));
202
- const agentsPath = join(frameworkRoot, '.morph/config/agents.json');
202
+ console.log(chalk.cyan(`\n .morph/framework/agents.json — Required Agents (${REQUIRED_AGENTS.length})`));
203
+ const agentsPath = join(frameworkRoot, '.morph/framework/agents.json');
203
204
  if (await pathExists(agentsPath)) {
204
205
  try {
205
206
  const agentsConfig = JSON.parse(await fs.readFile(agentsPath, 'utf8'));
@@ -264,6 +265,31 @@ async function doctorFullCommand(frameworkRoot) {
264
265
  }
265
266
 
266
267
  export async function doctorCommand(options = {}) {
268
+ // Reset mode: remove morph-managed settings entries
269
+ if (options.reset) {
270
+ const targetPath = process.cwd();
271
+ logger.header('MORPH-SPEC Settings Reset');
272
+
273
+ const result = await resetMorphSettings(targetPath);
274
+
275
+ if (!result.removed) {
276
+ logger.warn(`Nothing to reset: ${result.reason}`);
277
+ return;
278
+ }
279
+
280
+ logger.success('Morph-managed settings removed.');
281
+ if (result.permissionsRemoved?.length > 0) {
282
+ logger.dim(` Permissions removed: ${result.permissionsRemoved.join(', ')}`);
283
+ }
284
+ if (result.envRemoved?.length > 0) {
285
+ logger.dim(` Env vars removed: ${result.envRemoved.join(', ')}`);
286
+ }
287
+ if (result.backupPath) {
288
+ logger.dim(` Backup saved: ${result.backupPath}`);
289
+ }
290
+ return;
291
+ }
292
+
267
293
  // full health check mode
268
294
  if (options.full) {
269
295
  const frameworkRoot = process.cwd();
@@ -383,7 +409,7 @@ export async function doctorCommand(options = {}) {
383
409
  }
384
410
 
385
411
  // Check agents.json
386
- const agentsPath = join(morphPath, 'config', 'agents.json');
412
+ const agentsPath = join(morphPath, 'framework', 'agents.json');
387
413
  if (await pathExists(agentsPath)) {
388
414
  checks.push({ name: 'agents.json', status: 'ok' });
389
415
  } else {
@@ -391,8 +417,8 @@ export async function doctorCommand(options = {}) {
391
417
  hasErrors = true;
392
418
  }
393
419
 
394
- // Check standards (either in project .morph/standards/ or in framework package)
395
- const standardsPath = join(morphPath, 'standards');
420
+ // Check standards (either in project .morph/framework/standards/ or in framework package)
421
+ const standardsPath = join(morphPath, 'framework', 'standards');
396
422
  const frameworkStdsRoot = join(import.meta.dirname, '..', '..', '..', 'framework', 'standards');
397
423
  if (await pathExists(standardsPath)) {
398
424
  // Check for core standards in hierarchy (copied by init) or flat layout
@@ -416,7 +442,7 @@ export async function doctorCommand(options = {}) {
416
442
  }
417
443
 
418
444
  // Check templates
419
- const templatesPath = join(morphPath, 'templates');
445
+ const templatesPath = join(morphPath, 'framework', 'templates');
420
446
  if (await pathExists(templatesPath)) {
421
447
  checks.push({ name: 'templates/', status: 'ok' });
422
448
  } else {
@@ -459,6 +485,28 @@ export async function doctorCommand(options = {}) {
459
485
  hasWarnings = true;
460
486
  }
461
487
  }
488
+
489
+ // Check .claude/rules/
490
+ const rulesPath = join(claudePath, 'rules');
491
+ if (await pathExists(rulesPath)) {
492
+ const ruleFiles = await fs.readdir(rulesPath);
493
+ const mdRules = ruleFiles.filter(f => f.endsWith('.md'));
494
+ checks.push({ name: '.claude/rules/', status: 'ok', msg: `${mdRules.length} rules` });
495
+ } else {
496
+ checks.push({ name: '.claude/rules/', status: 'warn', msg: 'missing — run morph-spec update' });
497
+ hasWarnings = true;
498
+ }
499
+
500
+ // Check .claude/agents/
501
+ const agentsPath = join(claudePath, 'agents');
502
+ if (await pathExists(agentsPath)) {
503
+ const agentFiles = await fs.readdir(agentsPath);
504
+ const morphAgents = agentFiles.filter(f => f.startsWith('morph-') && f.endsWith('.md'));
505
+ checks.push({ name: '.claude/agents/', status: 'ok', msg: `${morphAgents.length} agents` });
506
+ } else {
507
+ checks.push({ name: '.claude/agents/', status: 'warn', msg: 'missing — run morph-spec update' });
508
+ hasWarnings = true;
509
+ }
462
510
  } else {
463
511
  checks.push({ name: '.claude/', status: 'warn', msg: 'incomplete structure' });
464
512
  }