@polymorphism-tech/morph-spec 4.3.7 → 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 -1
  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,63 +0,0 @@
1
- /**
2
- * Context Prime CLI command — Load minimal context priming files
3
- *
4
- * Usage:
5
- * morph-spec prime feature (outputs feature-prime.md to stdout)
6
- * morph-spec prime bug
7
- * morph-spec prime refactor
8
- * morph-spec prime design
9
- * morph-spec prime infra
10
- */
11
-
12
- import chalk from 'chalk';
13
- import { readFileSync, existsSync } from 'fs';
14
- import { join } from 'path';
15
-
16
- const PRIME_FILES = {
17
- feature: '.morph/context/feature-prime.md',
18
- bug: '.morph/context/bug-prime.md',
19
- refactor: '.morph/context/refactor-prime.md',
20
- design: '.morph/context/design-prime.md',
21
- infra: '.morph/context/infra-prime.md'
22
- };
23
-
24
- const PRIME_TYPES = Object.keys(PRIME_FILES);
25
-
26
- export async function contextPrimeCommand(type, options) {
27
- if (!type) {
28
- console.log(chalk.cyan('\n Available prime types:\n'));
29
- for (const [key, path] of Object.entries(PRIME_FILES)) {
30
- const exists = existsSync(join(process.cwd(), path));
31
- const status = exists ? chalk.green('✓') : chalk.red('✗');
32
- console.log(` ${status} ${key.padEnd(10)} → ${path}`);
33
- }
34
- console.log('');
35
- console.log(chalk.gray(' Usage: morph-spec prime <type>'));
36
- console.log(chalk.gray(' Example: morph-spec prime feature\n'));
37
- return;
38
- }
39
-
40
- if (!PRIME_TYPES.includes(type)) {
41
- console.error(chalk.red(`Unknown prime type: ${type}`));
42
- console.error(chalk.gray(`Valid types: ${PRIME_TYPES.join(', ')}`));
43
- process.exit(1);
44
- }
45
-
46
- const filePath = join(process.cwd(), PRIME_FILES[type]);
47
-
48
- if (!existsSync(filePath)) {
49
- console.error(chalk.red(`Prime file not found: ${filePath}`));
50
- console.error(chalk.gray('Run `morph-spec init` to initialize MORPH-SPEC files.'));
51
- process.exit(1);
52
- }
53
-
54
- const content = readFileSync(filePath, 'utf8');
55
-
56
- if (options.json) {
57
- console.log(JSON.stringify({ type, path: filePath, content }));
58
- return;
59
- }
60
-
61
- // Output to stdout — designed to be read into context
62
- console.log(content);
63
- }
@@ -1,54 +0,0 @@
1
- /**
2
- * Core Four CLI command — Context/Model/Prompt/Tools dashboard
3
- *
4
- * Usage:
5
- * morph-spec core-four <feature>
6
- * morph-spec core-four <feature> --json
7
- */
8
-
9
- import chalk from 'chalk';
10
- import { getCoreFour, formatCoreFour, initCoreFour } from '../../lib/context/core-four-tracker.js';
11
- import { loadState } from '../../core/state/state-manager.js';
12
-
13
- export async function coreFourCommand(featureName, options) {
14
- try {
15
- // Initialize with defaults if not already set
16
- initCoreFour({
17
- model: 'claude-sonnet-4-6',
18
- contextWindow: 200000,
19
- feature: featureName
20
- });
21
-
22
- // Try to populate context breakdown from feature state
23
- try {
24
- const state = loadState(false);
25
- if (state?.features?.[featureName]) {
26
- const feature = state.features[featureName];
27
- // Attempt to estimate context breakdown from known files
28
- const breakdown = {
29
- 'CLAUDE.md': 23000,
30
- standards: feature.activeAgents ? feature.activeAgents.length * 500 : 0,
31
- spec: feature.outputs?.includes('spec') ? 8000 : 0,
32
- conversation: 5000,
33
- other: 2000
34
- };
35
- const { updateContextBreakdown } = await import('../../lib/context/core-four-tracker.js');
36
- updateContextBreakdown(breakdown);
37
- }
38
- } catch {
39
- // Best-effort
40
- }
41
-
42
- if (options.json) {
43
- const data = getCoreFour();
44
- console.log(JSON.stringify(data, null, 2));
45
- return;
46
- }
47
-
48
- console.log('\n' + formatCoreFour());
49
- console.log('');
50
- } catch (err) {
51
- console.error(chalk.red(`Error: ${err.message}`));
52
- process.exit(1);
53
- }
54
- }
@@ -1,40 +0,0 @@
1
- /**
2
- * @fileoverview Generate Context Command
3
- *
4
- * CLI: morph-spec generate context [feature]
5
- *
6
- * Generates CONTEXT.md (project-level) or CONTEXT-{feature}.md (feature-level)
7
- * with all relevant project data for Claude's consumption.
8
- *
9
- * @module generate-context
10
- */
11
-
12
- import { generateContext } from '../../lib/generators/context-generator.js';
13
-
14
- /**
15
- * Generate context files
16
- * @param {string} projectPath - Root path of the project
17
- * @param {string} featureName - Optional feature name
18
- * @returns {Promise<void>}
19
- */
20
- export async function generateContextCommand(projectPath, featureName = null) {
21
- console.log('📄 Generating CONTEXT files...\n');
22
-
23
- try {
24
- const results = await generateContext(projectPath, featureName);
25
-
26
- console.log('✅ Generated:');
27
- console.log(` - ${results.projectContext}`);
28
-
29
- if (results.featureContext) {
30
- console.log(` - ${results.featureContext}`);
31
- }
32
-
33
- console.log('\n💡 Use these files to provide full context to Claude Code.');
34
-
35
- } catch (err) {
36
- console.error('❌ Error generating context:');
37
- console.error(` ${err.message}`);
38
- process.exit(1);
39
- }
40
- }
@@ -1,207 +0,0 @@
1
- import { readFileSync } from 'fs';
2
- import { join, dirname } from 'path';
3
- import { fileURLToPath } from 'url';
4
- import chalk from 'chalk';
5
- import { logger } from '../../utils/logger.js';
6
- import { analyzeRequestComplexity } from '../../lib/analysis/complexity-analyzer.js';
7
- import { LearningSystem } from '../../lib/learning/learning-system.js';
8
- import { loadStandardsForAgent, getStandardsListForAgent } from '../../lib/standards/standards-context-injector.js';
9
-
10
- const __dirname = dirname(fileURLToPath(import.meta.url));
11
- const frameworkRoot = join(__dirname, '..', '..', '..');
12
-
13
- function loadAgentsConfig() {
14
- try {
15
- const configPath = join(frameworkRoot, '.morph/config/agents.json');
16
- const content = readFileSync(configPath, 'utf8');
17
- return JSON.parse(content);
18
- } catch (err) {
19
- logger.error(`Failed to load agents config: ${err.message}`);
20
- process.exit(1);
21
- }
22
- }
23
-
24
- function detectAgents(userInput, config) {
25
- const input = userInput.toLowerCase();
26
-
27
- // MORPH 3.0 Hierarchical: agents is a flat object, not arrays
28
- const allAgents = Object.entries(config.agents || {})
29
- .filter(([id]) => !id.startsWith('_comment'))
30
- .map(([id, agent]) => ({ id, ...agent }));
31
-
32
- // Core agents = always_active agents (typically Tier 1)
33
- const coreAgents = allAgents.filter(a => a.always_active === true);
34
- const coreIds = coreAgents.map(a => a.id);
35
-
36
- // Specialist agents = keyword-matched agents
37
- const specialistMatches = [];
38
-
39
- for (const agent of allAgents) {
40
- if (agent.always_active) continue; // Skip core agents
41
-
42
- // MORPH 3.0.1: Check negative keywords first — if any match, skip agent entirely
43
- const negativeKeywords = agent.negativeKeywords || [];
44
- const hasNegativeMatch = negativeKeywords.some(neg =>
45
- input.includes(neg.toLowerCase())
46
- );
47
- if (hasNegativeMatch) continue;
48
-
49
- // MORPH 3.0: keywords is directly on agent, not nested in autoActivation
50
- const keywords = agent.keywords || [];
51
- const matchedKeywords = [];
52
-
53
- for (const keyword of keywords) {
54
- if (input.includes(keyword.toLowerCase())) {
55
- matchedKeywords.push(keyword);
56
- }
57
- }
58
-
59
- if (matchedKeywords.length > 0) {
60
- specialistMatches.push({
61
- id: agent.id,
62
- name: agent.title || agent.id, // Use title as name
63
- emoji: agent.teammate?.icon || '🤖',
64
- matchedKeywords,
65
- matchCount: matchedKeywords.length
66
- });
67
- }
68
- }
69
-
70
- specialistMatches.sort((a, b) => b.matchCount - a.matchCount);
71
-
72
- const specialistIds = specialistMatches.map(m => m.id);
73
- const allIds = [...new Set([...coreIds, ...specialistIds])];
74
-
75
- return {
76
- core: coreIds,
77
- specialists: specialistIds,
78
- all: allIds,
79
- matches: specialistMatches,
80
- input: userInput
81
- };
82
- }
83
-
84
- function formatVerbose(result) {
85
- logger.blank();
86
- logger.header('AGENT DETECTION RESULT');
87
- logger.info(`Input: ${chalk.white(result.input)}`);
88
- logger.blank();
89
-
90
- logger.header('CORE AGENTS (always active)');
91
- result.core.forEach(id => {
92
- logger.info(` ${chalk.green('✓')} ${id}`);
93
- });
94
- logger.blank();
95
-
96
- if (result.matches.length > 0) {
97
- logger.header('SPECIALIST AGENTS (keyword matched)');
98
- result.matches.forEach(match => {
99
- logger.info(` ${match.emoji} ${chalk.yellow(match.name)} (${match.matchCount} matches)`);
100
- logger.dim(` Keywords: ${match.matchedKeywords.join(', ')}`);
101
- });
102
- } else {
103
- logger.dim(' No specialist agents matched');
104
- }
105
-
106
- logger.blank();
107
- logger.info(`Total: ${chalk.cyan(result.all.length)} agents activated`);
108
- logger.blank();
109
- }
110
-
111
- export { detectAgents, loadAgentsConfig };
112
-
113
- export function detectAgentsCommand(input, options) {
114
- const userInput = Array.isArray(input) ? input.join(' ') : input;
115
-
116
- if (!userInput) {
117
- logger.error('User input is required');
118
- logger.dim('Usage: morph-spec detect-agents "your feature description"');
119
- process.exit(1);
120
- }
121
-
122
- const config = loadAgentsConfig();
123
- const result = detectAgents(userInput, config);
124
-
125
- // Stack-aware filtering: penalize stack-mismatched agents
126
- try {
127
- const projectConfigPath = join(process.cwd(), '.morph/config/config.json');
128
- const projectConfig = JSON.parse(readFileSync(projectConfigPath, 'utf8'));
129
- const stack = projectConfig?.project?.stack || projectConfig?.project?.language || '';
130
- const isJsStack = stack === 'nodejs' || stack === 'javascript' || stack === 'nextjs';
131
-
132
- if (isJsStack) {
133
- const dotnetKeywords = ['dotnet', '.net', 'csharp', 'c#', 'blazor', 'razor', 'azure', 'bicep',
134
- 'ef core', 'entity framework', 'hangfire', 'mudblazor', 'fluent ui', 'asp.net'];
135
- const hasExplicitDotnetRequest = dotnetKeywords.some(k => userInput.toLowerCase().includes(k));
136
-
137
- if (!hasExplicitDotnetRequest) {
138
- const dotnetAgents = new Set([
139
- 'dotnet-senior', 'azure-architect', 'ef-modeler', 'bicep-architect',
140
- 'blazor-builder', 'blazor-concurrency-validator', 'hangfire-orchestrator',
141
- 'azure-deploy-specialist'
142
- ]);
143
- result.core = result.core.filter(id => !dotnetAgents.has(id));
144
- result.specialists = result.specialists.filter(id => !dotnetAgents.has(id));
145
- result.all = result.all.filter(id => !dotnetAgents.has(id));
146
- result.matches = result.matches.filter(m => !dotnetAgents.has(m.id));
147
- }
148
- }
149
- } catch {
150
- // Config not found or unreadable — skip stack filtering
151
- }
152
-
153
- // Enrich with complexity analysis
154
- try {
155
- result.complexity = analyzeRequestComplexity(userInput);
156
- result.suggestedWorkflow = result.complexity.workflow;
157
- } catch {
158
- result.complexity = null;
159
- result.suggestedWorkflow = 'standard';
160
- }
161
-
162
- // Enrich with learning suggestions
163
- try {
164
- const learner = new LearningSystem('.');
165
- result.learningSuggestions = learner.getAllSuggestions();
166
- } catch {
167
- result.learningSuggestions = null;
168
- }
169
-
170
- // Enrich with skill paths for each detected agent
171
- const allAgents = Object.entries(config.agents || {})
172
- .filter(([id]) => !id.startsWith('_'))
173
- .map(([id, agent]) => ({ id, ...agent }));
174
- result.skillPaths = result.all
175
- .map(id => {
176
- const agent = allAgents.find(a => a.id === id);
177
- return agent?.skillPath || null;
178
- })
179
- .filter(Boolean);
180
-
181
- // Enrich with standards context when JSON output requested
182
- if (options.json) {
183
- const projectPath = process.cwd();
184
- result.standardsSummary = {};
185
-
186
- for (const agentId of result.all) {
187
- const standardsList = getStandardsListForAgent(agentId);
188
- const { fullContent } = loadStandardsForAgent(agentId, projectPath);
189
-
190
- result.standardsSummary[agentId] = {
191
- standards: standardsList,
192
- fullContent: fullContent,
193
- count: standardsList.length
194
- };
195
- }
196
- }
197
-
198
- if (options.json) {
199
- console.log(JSON.stringify(result, null, 2));
200
- } else if (options.verbose) {
201
- formatVerbose(result);
202
- } else if (options.idsOnly) {
203
- result.all.forEach(id => console.log(id));
204
- } else {
205
- console.log(JSON.stringify(result.all));
206
- }
207
- }
@@ -1,174 +0,0 @@
1
- /**
2
- * MORPH-SPEC Detect Workflow Command
3
- *
4
- * Analyzes a feature request and detects the most appropriate workflow
5
- *
6
- * Usage:
7
- * morph-spec detect-workflow "add pagination to users table"
8
- */
9
-
10
- import chalk from 'chalk';
11
- import { detectWorkflow, getWorkflowConfig } from '../../core/workflows/workflow-detector.js';
12
-
13
- /**
14
- * Main command handler
15
- * @param {Array<string>} input - User request words
16
- * @param {Object} options - Command options
17
- */
18
- export async function detectWorkflowCommand(input, options = {}) {
19
- const userRequest = input.join(' ');
20
-
21
- if (!userRequest || userRequest.trim().length === 0) {
22
- console.log(chalk.red('\n✗ Error: Please provide a feature request'));
23
- console.log(chalk.gray('\nUsage: morph-spec detect-workflow "add pagination to users table"\n'));
24
- process.exit(1);
25
- }
26
-
27
- console.log(chalk.cyan('\n╔════════════════════════════════════════════════╗'));
28
- console.log(chalk.cyan('║ MORPH-SPEC WORKFLOW DETECTION ║'));
29
- console.log(chalk.cyan('╚════════════════════════════════════════════════╝\n'));
30
-
31
- console.log(chalk.gray('Analyzing request:'), `"${userRequest}"`);
32
- console.log('');
33
-
34
- try {
35
- // Detect workflow
36
- const result = await detectWorkflow({
37
- userRequest,
38
- projectPath: options.projectPath || '.'
39
- });
40
-
41
- // Load workflow config for details
42
- const workflowConfig = getWorkflowConfig(result.workflowId);
43
-
44
- if (options.json) {
45
- // JSON output mode
46
- console.log(JSON.stringify({
47
- workflowId: result.workflowId,
48
- workflowName: workflowConfig?.name || result.workflowId,
49
- confidence: result.confidence,
50
- matchedKeywords: result.matchedKeywords,
51
- estimatedComplexity: result.estimatedComplexity,
52
- reasoning: result.reasoning,
53
- alternativeWorkflows: result.alternativeWorkflows,
54
- workflowConfig: workflowConfig
55
- }, null, 2));
56
- return;
57
- }
58
-
59
- // Human-readable output
60
- const confidencePercent = Math.round(result.confidence * 100);
61
- console.log(chalk.green(`✓ Detected Workflow: ${chalk.bold(workflowConfig?.name || result.workflowId)}`));
62
- console.log(chalk.gray(` Confidence: ${confidencePercent}%\n`));
63
-
64
- // Criteria Match
65
- console.log(chalk.cyan('Criteria Match:'));
66
- if (result.matchedKeywords.length > 0) {
67
- console.log(chalk.green(` ✓ Keywords: ${result.matchedKeywords.join(', ')}`));
68
- }
69
- console.log(chalk.gray(` • Estimated complexity: ${result.estimatedComplexity.files} files, ~${result.estimatedComplexity.lines} lines`));
70
- if (result.estimatedComplexity.components > 0) {
71
- console.log(chalk.gray(` • Components: ${result.estimatedComplexity.components}`));
72
- }
73
- if (result.estimatedComplexity.hasInfra) {
74
- console.log(chalk.yellow(` ⚠ Infrastructure keywords detected`));
75
- }
76
- console.log('');
77
-
78
- // Workflow Details
79
- if (workflowConfig) {
80
- console.log(chalk.cyan('Workflow Description:'));
81
- console.log(chalk.gray(` ${workflowConfig.description}\n`));
82
-
83
- // Phases to Run
84
- console.log(chalk.cyan('Phases to Run:'));
85
- const phasesToRun = workflowConfig.phases.run || [];
86
- phasesToRun.forEach((phase, index) => {
87
- const pausePoint = workflowConfig.pausePoints?.find(p => p.phase === phase);
88
- const pauseIndicator = pausePoint ? chalk.yellow(' ⏸️ Pause for approval') : '';
89
- console.log(chalk.white(` ${index + 1}. ${phase.toUpperCase()}${pauseIndicator}`));
90
- if (pausePoint) {
91
- console.log(chalk.gray(` Question: "${pausePoint.question}"`));
92
- }
93
- });
94
- console.log('');
95
-
96
- // Phases Skipped
97
- if (workflowConfig.phases.skip && workflowConfig.phases.skip.length > 0) {
98
- console.log(chalk.cyan('Phases Skipped:'));
99
- workflowConfig.phases.skip.forEach(phase => {
100
- const reason = getSkipReason(phase, workflowConfig);
101
- console.log(chalk.gray(` ✗ ${phase.toUpperCase()}${reason ? ` - ${reason}` : ''}`));
102
- });
103
- console.log('');
104
- }
105
-
106
- // Combined Phases
107
- if (workflowConfig.phases.combined && Object.keys(workflowConfig.phases.combined).length > 0) {
108
- console.log(chalk.cyan('Combined Phases:'));
109
- for (const [combinedName, phases] of Object.entries(workflowConfig.phases.combined)) {
110
- console.log(chalk.gray(` → ${combinedName.toUpperCase()} combines: ${phases.join(', ')}`));
111
- }
112
- console.log('');
113
- }
114
-
115
- // Required Outputs
116
- if (workflowConfig.outputs?.required && workflowConfig.outputs.required.length > 0) {
117
- console.log(chalk.cyan('Required Outputs:'));
118
- workflowConfig.outputs.required.forEach(output => {
119
- console.log(chalk.white(` • ${output}`));
120
- });
121
- console.log('');
122
- }
123
- }
124
-
125
- // Alternative Workflows
126
- if (result.alternativeWorkflows.length > 0) {
127
- console.log(chalk.cyan('Alternative Workflows:'));
128
- result.alternativeWorkflows.forEach(alt => {
129
- const altPercent = Math.round(alt.confidence * 100);
130
- console.log(chalk.gray(` - ${alt.workflowId} (${altPercent}%): ${alt.reason}`));
131
- });
132
- console.log('');
133
- }
134
-
135
- // How to Override
136
- console.log(chalk.cyan('To override detected workflow:'));
137
- console.log(chalk.white(` morph-spec state set <feature-name> workflow <workflow-id>`));
138
- console.log('');
139
-
140
- console.log(chalk.gray('─'.repeat(50)));
141
- console.log(chalk.gray('Available workflows: fast-track, standard, full-morph, design-impl, ui-refresh'));
142
- console.log('');
143
-
144
- } catch (error) {
145
- console.log(chalk.red('\n✗ Workflow detection failed:'));
146
- console.log(chalk.red(error.message));
147
- if (options.verbose) {
148
- console.log(chalk.gray('\nStack trace:'));
149
- console.log(chalk.gray(error.stack));
150
- }
151
- console.log('');
152
- process.exit(1);
153
- }
154
- }
155
-
156
- /**
157
- * Get skip reason for a phase
158
- * @param {string} phase - Phase name
159
- * @param {Object} workflowConfig - Workflow config
160
- * @returns {string} Skip reason
161
- */
162
- function getSkipReason(phase, workflowConfig) {
163
- const reasons = {
164
- 'setup': 'context already loaded',
165
- 'uiux': 'no significant UI changes',
166
- 'clarify': 'spec is clear for this type',
167
- 'sync': 'tactical decisions, not strategic',
168
- 'proposal': 'combined into quick-analysis',
169
- 'design': 'design not needed for visual-only changes',
170
- 'tasks': 'simple enough for direct implementation'
171
- };
172
-
173
- return reasons[phase] || '';
174
- }
@@ -1,103 +0,0 @@
1
- /**
2
- * Thread Template CLI command — Thread type management
3
- *
4
- * Usage:
5
- * morph-spec thread-template list
6
- * morph-spec thread-template use <type> --feature=<feature>
7
- */
8
-
9
- import chalk from 'chalk';
10
- import { THREAD_TYPES } from '../../lib/threads/thread-manager.js';
11
-
12
- const THREAD_TYPE_INFO = {
13
- [THREAD_TYPES.BASE]: {
14
- name: 'B-Thread (Base)',
15
- description: 'Standard single-agent thread. Sequential execution, all approval gates required.',
16
- useCase: 'Default for simple and medium features',
17
- phases: 'All standard phases',
18
- approvalGates: 'Manual (all)',
19
- maxConcurrent: 1
20
- },
21
- [THREAD_TYPES.PARALLEL]: {
22
- name: 'P-Thread (Parallel)',
23
- description: 'Multiple agents run simultaneously on different feature domains.',
24
- useCase: 'Full-stack features with independent backend/frontend/infra work',
25
- phases: 'All phases (parallel IMPLEMENT)',
26
- approvalGates: 'Manual (all)',
27
- maxConcurrent: 5
28
- },
29
- [THREAD_TYPES.FUSION]: {
30
- name: 'F-Thread (Fusion)',
31
- description: 'N agents independently generate solutions; best-of-N result is selected.',
32
- useCase: 'High-uncertainty decisions, critical architecture choices, prototype evaluation',
33
- phases: 'DESIGN → parallel IMPLEMENT → AGGREGATE → SYNC',
34
- approvalGates: 'Manual select (or auto best-of-n)',
35
- maxConcurrent: 3
36
- },
37
- [THREAD_TYPES.LONG_RUNNING]: {
38
- name: 'L-Thread (Long-Running)',
39
- description: 'Autonomous agent with stop hooks every 30 minutes for validation.',
40
- useCase: 'Large scope features (>10 files), autonomous implementation without interruption',
41
- phases: 'IMPLEMENT (continuous) with periodic validation',
42
- approvalGates: 'Auto (stop hooks validate)',
43
- maxConcurrent: 1
44
- },
45
- [THREAD_TYPES.ZERO_TOUCH]: {
46
- name: 'Z-Thread (Zero-Touch)',
47
- description: 'Fully autonomous execution. Auto-approves all gates, auto-commits on success.',
48
- useCase: 'Maximum-trust features with >95% checkpoint pass rate',
49
- phases: 'All phases (auto-approved)',
50
- approvalGates: 'Auto (trust-based)',
51
- maxConcurrent: 1
52
- }
53
- };
54
-
55
- export async function threadTemplateListCommand(options) {
56
- console.log(chalk.cyan('\n Thread Types\n'));
57
- console.log(' ' + '─'.repeat(70));
58
-
59
- for (const [type, info] of Object.entries(THREAD_TYPE_INFO)) {
60
- console.log(`\n ${chalk.bold(info.name)}`);
61
- console.log(` ${info.description}`);
62
- console.log(` ${chalk.gray('Use case:')} ${info.useCase}`);
63
- console.log(` ${chalk.gray('Phases:')} ${info.phases}`);
64
- console.log(` ${chalk.gray('Gates:')} ${info.approvalGates}`);
65
- console.log(` ${chalk.gray('Max concurrent:')} ${info.maxConcurrent}`);
66
- }
67
-
68
- console.log('\n ' + '─'.repeat(70));
69
- console.log(chalk.gray('\n Set thread type: morph-spec thread-template use <type> --feature=<feature>\n'));
70
- }
71
-
72
- export async function threadTemplateUseCommand(type, options) {
73
- if (!options.feature) {
74
- console.error(chalk.red('--feature is required'));
75
- process.exit(1);
76
- }
77
-
78
- if (!THREAD_TYPE_INFO[type]) {
79
- console.error(chalk.red(`Unknown thread type: ${type}`));
80
- console.error(chalk.gray(`Valid types: ${Object.keys(THREAD_TYPE_INFO).join(', ')}`));
81
- process.exit(1);
82
- }
83
-
84
- const info = THREAD_TYPE_INFO[type];
85
-
86
- // Special checks
87
- if (type === THREAD_TYPES.ZERO_TOUCH) {
88
- console.log(chalk.yellow('\n ⚠ Z-Thread requires maximum trust level (>95% checkpoint pass rate)'));
89
- console.log(chalk.gray(' Check trust: morph-spec trust status\n'));
90
- }
91
-
92
- // Update feature state with thread type
93
- try {
94
- const { updateFeature } = await import('../../core/state/state-manager.js');
95
- await updateFeature(options.feature, 'threadType', type);
96
- console.log(chalk.green(`\n ✓ Thread type set: ${type} for feature: ${options.feature}`));
97
- console.log(` ${info.name}: ${info.description}`);
98
- console.log('');
99
- } catch (err) {
100
- console.error(chalk.red(` Error updating state: ${err.message}`));
101
- process.exit(1);
102
- }
103
- }