@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,101 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Stop Hook: validate-checkpoints
4
- *
5
- * Checks that the last 3 tasks passed their checkpoints.
6
- * Reads from state.json checkpoint history.
7
- *
8
- * Output format: { passed, issues, suggestions, checkpointSummary, error }
9
- */
10
-
11
- import { readFileSync, existsSync } from 'fs';
12
- import { join } from 'path';
13
-
14
- const cwd = process.cwd();
15
- const REQUIRED_PASSING = 3;
16
-
17
- function validateCheckpoints() {
18
- const statePath = join(cwd, '.morph/state.json');
19
-
20
- if (!existsSync(statePath)) {
21
- process.stdout.write(JSON.stringify({
22
- passed: true,
23
- issues: [],
24
- suggestions: ['State file not found — checkpoint validation skipped'],
25
- checkpointSummary: null,
26
- error: null
27
- }));
28
- process.exit(0);
29
- }
30
-
31
- let state;
32
- try {
33
- state = JSON.parse(readFileSync(statePath, 'utf8'));
34
- } catch (err) {
35
- process.stdout.write(JSON.stringify({
36
- passed: false,
37
- issues: [{ message: `Failed to read state.json: ${err.message}`, severity: 'error' }],
38
- suggestions: [],
39
- error: err.message
40
- }));
41
- process.exit(1);
42
- }
43
-
44
- // Find all features with checkpoints
45
- const features = Object.entries(state.features || {});
46
- const issues = [];
47
- const suggestions = [];
48
- let allPassed = true;
49
-
50
- for (const [featureName, feature] of features) {
51
- if (feature.phase !== 'implement') continue;
52
-
53
- const checkpoints = feature.checkpoints || [];
54
- const recentCheckpoints = checkpoints.slice(-REQUIRED_PASSING);
55
-
56
- if (recentCheckpoints.length === 0) {
57
- // No checkpoints yet — pass
58
- continue;
59
- }
60
-
61
- const failedRecent = recentCheckpoints.filter(c => c.passed === false);
62
- if (failedRecent.length > 0) {
63
- allPassed = false;
64
- issues.push({
65
- message: `Feature ${featureName}: ${failedRecent.length} recent checkpoint(s) failed`,
66
- severity: 'error'
67
- });
68
- suggestions.push(`Review checkpoint failures in ${featureName} before continuing`);
69
- }
70
- }
71
-
72
- const checkpointSummary = features.map(([name, f]) => ({
73
- feature: name,
74
- totalCheckpoints: f.checkpoints?.length || 0,
75
- recentPassed: (f.checkpoints || []).slice(-3).filter(c => c.passed !== false).length
76
- }));
77
-
78
- const output = {
79
- passed: allPassed,
80
- issues,
81
- suggestions,
82
- checkpointSummary,
83
- timestamp: new Date().toISOString(),
84
- error: null
85
- };
86
-
87
- process.stdout.write(JSON.stringify(output));
88
- process.exit(allPassed ? 0 : 1);
89
- }
90
-
91
- try {
92
- validateCheckpoints();
93
- } catch (err) {
94
- process.stdout.write(JSON.stringify({
95
- passed: false,
96
- issues: [{ message: err.message, severity: 'error' }],
97
- suggestions: [],
98
- error: err.message
99
- }));
100
- process.exit(1);
101
- }
@@ -1,109 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Stop Hook: validate-tests
4
- *
5
- * Runs the project test suite (if available) and returns results.
6
- * Gracefully handles projects without tests.
7
- *
8
- * Output format: { passed, issues, suggestions, testResults, error }
9
- */
10
-
11
- import { execSync } from 'child_process';
12
- import { existsSync, readFileSync } from 'fs';
13
- import { join } from 'path';
14
-
15
- const cwd = process.cwd();
16
-
17
- function validateTests() {
18
- // Check if test runner is configured
19
- let pkgJson;
20
- try {
21
- pkgJson = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
22
- } catch {
23
- process.stdout.write(JSON.stringify({
24
- passed: true,
25
- issues: [],
26
- suggestions: ['No package.json found — test validation skipped'],
27
- testResults: null,
28
- error: null
29
- }));
30
- process.exit(0);
31
- }
32
-
33
- const hasTestScript = pkgJson.scripts?.test && !pkgJson.scripts.test.includes('no test specified');
34
- const hasVitest = pkgJson.dependencies?.vitest || pkgJson.devDependencies?.vitest;
35
- const hasJest = pkgJson.dependencies?.jest || pkgJson.devDependencies?.jest;
36
-
37
- if (!hasTestScript && !hasVitest && !hasJest) {
38
- process.stdout.write(JSON.stringify({
39
- passed: true,
40
- issues: [],
41
- suggestions: ['No test runner configured — consider adding vitest or jest'],
42
- testResults: { skipped: true, reason: 'No test runner found' },
43
- error: null
44
- }));
45
- process.exit(0);
46
- }
47
-
48
- try {
49
- const testCmd = hasVitest ? 'npx vitest run' : (hasJest ? 'npx jest' : 'npm test');
50
- const output = execSync(`${testCmd} --passWithNoTests`, {
51
- encoding: 'utf8',
52
- stdio: 'pipe',
53
- cwd,
54
- timeout: 300000 // 5 minutes for tests
55
- });
56
-
57
- // Parse test results from output
58
- const passedMatch = output.match(/(\d+)\s+passed/);
59
- const failedMatch = output.match(/(\d+)\s+failed/);
60
- const skippedMatch = output.match(/(\d+)\s+skipped/);
61
-
62
- const testResults = {
63
- passed: parseInt(passedMatch?.[1] || '0'),
64
- failed: parseInt(failedMatch?.[1] || '0'),
65
- skipped: parseInt(skippedMatch?.[1] || '0'),
66
- rawOutput: output.substring(0, 500) // First 500 chars
67
- };
68
-
69
- process.stdout.write(JSON.stringify({
70
- passed: testResults.failed === 0,
71
- issues: testResults.failed > 0
72
- ? [{ message: `${testResults.failed} test(s) failed`, severity: 'error' }]
73
- : [],
74
- suggestions: testResults.failed > 0
75
- ? ['Fix failing tests before continuing implementation']
76
- : [],
77
- testResults,
78
- timestamp: new Date().toISOString(),
79
- error: null
80
- }));
81
- process.exit(testResults.failed === 0 ? 0 : 1);
82
- } catch (err) {
83
- // Extract test failure count from error output
84
- const output = err.stdout || err.stderr || err.message;
85
- const failedMatch = output.match(/(\d+)\s+failed/);
86
- const failed = parseInt(failedMatch?.[1] || '1');
87
-
88
- process.stdout.write(JSON.stringify({
89
- passed: false,
90
- issues: [{ message: `Test suite failed with ${failed} failure(s)`, severity: 'error' }],
91
- suggestions: ['Review test output and fix failing tests', 'Run: npm test locally'],
92
- testResults: { failed, rawOutput: output.substring(0, 500) },
93
- error: null
94
- }));
95
- process.exit(1);
96
- }
97
- }
98
-
99
- try {
100
- validateTests();
101
- } catch (err) {
102
- process.stdout.write(JSON.stringify({
103
- passed: false,
104
- issues: [{ message: err.message, severity: 'error' }],
105
- suggestions: [],
106
- error: err.message
107
- }));
108
- process.exit(1);
109
- }
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Agent Teams Hook Dispatcher
5
- *
6
- * Reads Claude Code PostToolUse JSON from stdin and dispatches to the
7
- * appropriate agent-teams hook based on the Bash command content.
8
- *
9
- * Wired via .claude/settings.local.json:
10
- * "PostToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "node framework/hooks/agent-teams/dispatch.js" }] }]
11
- *
12
- * Dispatches:
13
- * morph-spec task done <feature> <taskId> → task-completed.js <feature> <taskId>
14
- * morph-spec phase advance <feature> → phase-advanced.js <feature> <from> <to>
15
- */
16
-
17
- import { execSync } from 'child_process';
18
- import { readFileSync } from 'fs';
19
- import { join, dirname } from 'path';
20
- import { fileURLToPath } from 'url';
21
-
22
- const __dirname = dirname(fileURLToPath(import.meta.url));
23
-
24
- let input = '';
25
- process.stdin.setEncoding('utf-8');
26
- process.stdin.on('data', chunk => { input += chunk; });
27
- process.stdin.on('end', () => {
28
- try {
29
- const payload = JSON.parse(input || '{}');
30
- const command = payload?.tool_input?.command || '';
31
- dispatch(command);
32
- } catch {
33
- // Non-JSON or empty stdin — ignore silently
34
- process.exit(0);
35
- }
36
- });
37
-
38
- function dispatch(command) {
39
- // morph-spec task done <feature> <taskId> [--skip-validation]
40
- const taskDoneMatch = command.match(/morph-spec\s+task\s+done\s+(\S+)\s+(\S+)/);
41
- if (taskDoneMatch) {
42
- const [, feature, taskId] = taskDoneMatch;
43
- run(`node "${join(__dirname, 'task-completed.js')}" ${feature} ${taskId}`);
44
- return;
45
- }
46
-
47
- // morph-spec phase advance <feature>
48
- const phaseAdvanceMatch = command.match(/morph-spec\s+phase\s+advance\s+(\S+)/);
49
- if (phaseAdvanceMatch) {
50
- const [, feature] = phaseAdvanceMatch;
51
- // from/to phases not available at PostToolUse time — use placeholder
52
- run(`node "${join(__dirname, 'phase-advanced.js')}" ${feature} unknown advanced`);
53
- return;
54
- }
55
-
56
- // No match — exit cleanly
57
- process.exit(0);
58
- }
59
-
60
- function run(cmd) {
61
- try {
62
- execSync(cmd, { stdio: 'inherit', cwd: join(__dirname, '../../..') });
63
- } catch {
64
- // Hook failures are non-blocking for the dispatch layer
65
- }
66
- process.exit(0);
67
- }
@@ -1,80 +0,0 @@
1
- #!/usr/bin/env node
2
- // Scope: universal | Validates feature outputs when phase is advanced
3
- // MORPH-SPEC Agent Teams Hook: PhaseAdvanced Event
4
-
5
- import { executeHook, formatHookResults } from '../../../src/lib/hooks/hook-executor.js';
6
- import { join, dirname } from 'path';
7
- import { fileURLToPath } from 'url';
8
-
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = dirname(__filename);
11
-
12
- // Parse arguments
13
- const args = process.argv.slice(2);
14
- const [featureName, fromPhase, toPhase] = args.filter(arg => !arg.startsWith('--'));
15
-
16
- if (!featureName || !fromPhase || !toPhase) {
17
- console.error('Usage: phase-advanced.js <feature> <from-phase> <to-phase> [--dry-run] [--verbose]');
18
- console.error('');
19
- console.error('Example:');
20
- console.error(' node phase-advanced.js user-auth design clarify');
21
- process.exit(2);
22
- }
23
-
24
- const dryRun = args.includes('--dry-run');
25
- const verbose = args.includes('--verbose');
26
-
27
- // Project path is 3 levels up from framework/hooks/agent-teams/
28
- const projectPath = join(__dirname, '../../..');
29
-
30
- async function main() {
31
- if (verbose) {
32
- console.log(`🔍 PhaseAdvanced Hook triggered:`);
33
- console.log(` Feature: ${featureName}`);
34
- console.log(` Transition: ${fromPhase} → ${toPhase}`);
35
- console.log(` Mode: ${dryRun ? 'DRY RUN' : 'LIVE'}`);
36
- console.log('');
37
- }
38
-
39
- try {
40
- const results = await executeHook(projectPath, featureName, 'PhaseAdvanced', {
41
- fromPhase,
42
- toPhase,
43
- dryRun,
44
- verbose
45
- });
46
-
47
- const output = formatHookResults(results, 'PhaseAdvanced');
48
- console.log(output);
49
-
50
- if (results.blocked) {
51
- console.error('');
52
- console.error('❌ Cannot advance phase - fix errors above');
53
- console.error('');
54
- console.error('To override (not recommended):');
55
- console.error(` npx morph-spec advance-phase ${featureName} ${toPhase} --skip-validation`);
56
- process.exit(1);
57
- }
58
-
59
- if (verbose) {
60
- console.log('');
61
- console.log('✅ Phase advancement validated successfully');
62
- }
63
-
64
- process.exit(0);
65
- } catch (error) {
66
- console.error('');
67
- console.error('❌ Hook execution failed:');
68
- console.error(` ${error.message}`);
69
-
70
- if (verbose && error.stack) {
71
- console.error('');
72
- console.error('Stack trace:');
73
- console.error(error.stack);
74
- }
75
-
76
- process.exit(1);
77
- }
78
- }
79
-
80
- main();
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // Scope: universal | Task completion validation
4
-
5
- /**
6
- * TaskCompleted Hook - Claude Code Agent Teams
7
- *
8
- * Triggered when a task is marked as completed.
9
- * Validates the task deliverables before allowing the task to be marked done.
10
- *
11
- * Usage (from Claude Code hooks):
12
- * task-completed.js <feature-name> <task-id> [--dry-run] [--verbose]
13
- *
14
- * Exit codes:
15
- * 0 - All validators passed
16
- * 1 - Validation failed and blocked
17
- * 2 - Configuration error
18
- */
19
-
20
- import { executeHook, formatHookResults } from '../../../src/lib/hooks/hook-executor.js';
21
- import { fileURLToPath } from 'url';
22
- import { dirname, join } from 'path';
23
-
24
- const __filename = fileURLToPath(import.meta.url);
25
- const __dirname = dirname(__filename);
26
-
27
- // Get project root (3 levels up from framework/hooks/agent-teams/)
28
- const projectPath = join(__dirname, '../../..');
29
-
30
- async function main() {
31
- const args = process.argv.slice(2);
32
-
33
- if (args.length < 2) {
34
- console.error('Usage: task-completed.js <feature-name> <task-id> [--dry-run] [--verbose]');
35
- process.exit(2);
36
- }
37
-
38
- const featureName = args[0];
39
- const taskId = args[1];
40
- const dryRun = args.includes('--dry-run');
41
- const verbose = args.includes('--verbose');
42
-
43
- console.log('🔔 TaskCompleted Hook Triggered');
44
- console.log(` Feature: ${featureName}`);
45
- console.log(` Task: ${taskId}`);
46
- console.log(` Event: Task marked complete, validating deliverables...\n`);
47
-
48
- try {
49
- const results = await executeHook(projectPath, featureName, 'TaskCompleted', {
50
- dryRun,
51
- verbose,
52
- taskId
53
- });
54
-
55
- const output = formatHookResults(results, 'TaskCompleted');
56
- console.log(output);
57
-
58
- if (results.blocked) {
59
- console.log('\n💡 TIP: Fix the errors above before the task can be marked complete.');
60
- console.log(` Run: morph-spec task done ${featureName} ${taskId} --skip-validation`);
61
- console.log(' (Not recommended - only use if you know what you\'re doing)');
62
- process.exit(1);
63
- }
64
-
65
- console.log('\n✅ Task deliverables validated successfully.');
66
- process.exit(0);
67
- } catch (err) {
68
- console.error(`\n❌ Hook execution error: ${err.message}`);
69
- if (verbose) {
70
- console.error(err.stack);
71
- }
72
- process.exit(2);
73
- }
74
- }
75
-
76
- main();
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // Scope: universal | Agent Teams idle event validation
4
-
5
- /**
6
- * TeammateIdle Hook - Claude Code Agent Teams
7
- *
8
- * Triggered when a teammate is idle and waiting for next instructions.
9
- * Validates the teammate's recent work before allowing them to proceed.
10
- *
11
- * Usage (from Claude Code hooks):
12
- * teammate-idle.js <feature-name> [--dry-run] [--verbose]
13
- *
14
- * Exit codes:
15
- * 0 - All validators passed
16
- * 1 - Validation failed and blocked
17
- * 2 - Configuration error
18
- */
19
-
20
- import { executeHook, formatHookResults } from '../../../src/lib/hooks/hook-executor.js';
21
- import { fileURLToPath } from 'url';
22
- import { dirname, join } from 'path';
23
-
24
- const __filename = fileURLToPath(import.meta.url);
25
- const __dirname = dirname(__filename);
26
-
27
- // Get project root (3 levels up from framework/hooks/agent-teams/)
28
- const projectPath = join(__dirname, '../../..');
29
-
30
- async function main() {
31
- const args = process.argv.slice(2);
32
-
33
- if (args.length === 0) {
34
- console.error('Usage: teammate-idle.js <feature-name> [--dry-run] [--verbose]');
35
- process.exit(2);
36
- }
37
-
38
- const featureName = args[0];
39
- const dryRun = args.includes('--dry-run');
40
- const verbose = args.includes('--verbose');
41
-
42
- console.log('🔔 TeammateIdle Hook Triggered');
43
- console.log(` Feature: ${featureName}`);
44
- console.log(` Event: Teammate is idle, validating recent work...\n`);
45
-
46
- try {
47
- const results = await executeHook(projectPath, featureName, 'TeammateIdle', {
48
- dryRun,
49
- verbose
50
- });
51
-
52
- const output = formatHookResults(results, 'TeammateIdle');
53
- console.log(output);
54
-
55
- if (results.blocked) {
56
- console.log('\n💡 TIP: Fix the errors above before the teammate can proceed.');
57
- process.exit(1);
58
- }
59
-
60
- process.exit(0);
61
- } catch (err) {
62
- console.error(`\n❌ Hook execution error: ${err.message}`);
63
- if (verbose) {
64
- console.error(err.stack);
65
- }
66
- process.exit(2);
67
- }
68
- }
69
-
70
- main();
@@ -1,97 +0,0 @@
1
- /**
2
- * Agents Fuse CLI command — F-Thread fusion execution
3
- *
4
- * Usage:
5
- * morph-spec agents fuse --prompt "..." --count=3 --strategy=best-of-n [--feature=<f>]
6
- * morph-spec agents review aggregate <feature> --agents=a1,a2,a3
7
- */
8
-
9
- import chalk from 'chalk';
10
- import { runFusion, aggregateResults, displayFusionSummary } from '../../lib/execution/fusion-executor.js';
11
-
12
- export async function agentsFuseCommand(options) {
13
- if (!options.prompt) {
14
- console.error(chalk.red('--prompt is required'));
15
- process.exit(1);
16
- }
17
-
18
- const count = parseInt(options.count || '3', 10);
19
- const strategy = options.strategy || 'best-of-n';
20
- const feature = options.feature || 'fusion-session';
21
- const agents = options.agents ? options.agents.split(',').map(a => a.trim()) : null;
22
-
23
- console.log(chalk.cyan(`\n F-Thread Fusion Execution\n`));
24
- console.log(` Strategy: ${strategy}`);
25
- console.log(` Agents: ${count}`);
26
- console.log(` Feature: ${feature}`);
27
- console.log(` Prompt: ${options.prompt.substring(0, 80)}${options.prompt.length > 80 ? '...' : ''}`);
28
- console.log('');
29
-
30
- try {
31
- const fusionSession = await runFusion(options.prompt, {
32
- feature,
33
- count,
34
- strategy,
35
- agents
36
- });
37
-
38
- console.log(chalk.cyan(` ${fusionSession.threads.length} fusion threads spawned:\n`));
39
- for (let i = 0; i < fusionSession.threads.length; i++) {
40
- const thread = fusionSession.threads[i];
41
- const agent = fusionSession.agentConfigs[i];
42
- console.log(` ${chalk.gray(thread.id.substring(0, 8))} — Agent: ${agent.agentId} (${thread.status})`);
43
- }
44
-
45
- console.log(chalk.yellow('\n ⚠ Fusion threads spawned. To aggregate results:'));
46
- console.log(chalk.gray(' 1. Execute each thread using the Task tool with the agent configs'));
47
- console.log(chalk.gray(' 2. Collect results from each agent'));
48
- console.log(chalk.gray(' 3. Run: morph-spec agents fuse-aggregate --results=<file> --strategy=' + strategy));
49
- console.log('');
50
-
51
- if (options.json) {
52
- console.log(JSON.stringify({
53
- threads: fusionSession.threads.map(t => ({ id: t.id, agent: t.agent, status: t.status })),
54
- agentConfigs: fusionSession.agentConfigs,
55
- strategy,
56
- feature
57
- }, null, 2));
58
- }
59
- } catch (err) {
60
- console.error(chalk.red(`Error: ${err.message}`));
61
- process.exit(1);
62
- }
63
- }
64
-
65
- export async function agentsReviewAggregateCommand(feature, options) {
66
- if (!options.agents) {
67
- console.error(chalk.red('--agents is required (comma-separated list)'));
68
- process.exit(1);
69
- }
70
-
71
- const agentList = options.agents.split(',').map(a => a.trim());
72
- const strategy = options.strategy || 'best-of-n';
73
-
74
- console.log(chalk.yellow('\n ⚠ [STUB] This command returns mock data. Real aggregation not yet implemented.\n'));
75
- console.log(chalk.cyan(` Aggregate Reviews — ${feature}\n`));
76
- console.log(` Agents: ${agentList.join(', ')}`);
77
- console.log(` Strategy: ${strategy}`);
78
- console.log('');
79
-
80
- // Mock results for demo — in real usage, results come from agent output files
81
- const mockResults = agentList.map((agentId, i) => ({
82
- agentId,
83
- content: `Agent ${agentId} review for ${feature}`,
84
- checkpointsPassed: Math.floor(Math.random() * 3) + 2,
85
- checkpointsFailed: Math.floor(Math.random() * 2),
86
- errors: Math.floor(Math.random() * 2),
87
- warnings: Math.floor(Math.random() * 3)
88
- }));
89
-
90
- try {
91
- const aggregated = aggregateResults(mockResults, strategy);
92
- displayFusionSummary(aggregated);
93
- } catch (err) {
94
- console.error(chalk.red(`Error: ${err.message}`));
95
- process.exit(1);
96
- }
97
- }