@polymorphism-tech/morph-spec 4.3.7 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/.morph/.morphversion +3 -3
  2. package/.morph/analytics/threads-log.jsonl +6 -9
  3. package/.morph/config/config.json +2 -3
  4. package/.morph/framework/standards/STANDARDS.json +812 -0
  5. package/.morph/{standards → framework/standards}/ai-agents/team-orchestration.md +3 -3
  6. package/.morph/{standards → framework/standards}/frontend/nextjs/nextjs-patterns.md +17 -0
  7. package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
  8. package/.morph/{templates → framework/templates}/README.md +17 -17
  9. package/.morph/{templates → framework/templates}/REGISTRY.json +48 -233
  10. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  11. package/.morph/{templates → framework/templates}/context/CONTEXT-FEATURE.md +1 -1
  12. package/.morph/{templates → framework/templates}/context/CONTEXT.md +3 -3
  13. package/.morph/framework/templates/docs/clarifications.md +253 -0
  14. package/.morph/framework/templates/docs/onboarding.md +123 -0
  15. package/.morph/framework/templates/docs/schema-analysis.md +119 -0
  16. package/.morph/{templates → framework/templates}/docs/spec.md +149 -149
  17. package/.morph/framework/templates/docs/ui-components.md +124 -0
  18. package/.morph/framework/templates/docs/ui-design-system.md +76 -0
  19. package/.morph/framework/templates/docs/ui-flows.md +167 -0
  20. package/.morph/framework/templates/docs/ui-mockups.md +98 -0
  21. package/.morph/framework/templates/docs/user-stories.md +34 -0
  22. package/.morph/{templates → framework/templates}/examples/spec-examples.md +1 -1
  23. package/.morph/{templates → framework/templates}/infrastructure/github/README.md +11 -11
  24. package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  25. package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  26. package/.morph/{templates → framework/templates}/meta-prompts/validators/pre-commit-validator.md +1 -1
  27. package/.morph/logs/tool-failures.log +7 -0
  28. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +16 -0
  29. package/.morph/state.json +1 -1
  30. package/CLAUDE.md +77 -155
  31. package/README.md +20 -18
  32. package/bin/detect-agents.js +1 -1
  33. package/bin/morph-spec.js +116 -266
  34. package/bin/task-manager.cjs +2 -2
  35. package/bin/validate.js +1 -1
  36. package/claude-plugin.json +14 -0
  37. package/docs/claude-alignment-report.md +137 -0
  38. package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +512 -0
  39. package/docs/plans/2026-02-22-claude-settings.md +515 -0
  40. package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +728 -0
  41. package/docs/plans/2026-02-22-morph-spec-next.md +478 -0
  42. package/docs/plans/2026-02-22-native-alignment-design.md +199 -0
  43. package/docs/plans/2026-02-22-native-alignment-impl.md +925 -0
  44. package/docs/plans/2026-02-22-native-enrichment-design.md +244 -0
  45. package/docs/plans/2026-02-22-native-enrichment.md +735 -0
  46. package/framework/CLAUDE.md +77 -0
  47. package/framework/{skills/level-2-domains → agents}/ai-agents/ai-system-architect.md +7 -3
  48. package/framework/{skills/level-2-domains → agents}/architecture/po-pm-advisor.md +7 -1
  49. package/framework/{skills/level-2-domains → agents}/architecture/prompt-engineer.md +7 -1
  50. package/framework/{skills/level-2-domains → agents}/architecture/seo-growth-hacker.md +7 -1
  51. package/framework/{skills/level-2-domains → agents}/architecture/standards-architect.md +10 -6
  52. package/framework/agents/backend/api-designer.md +103 -0
  53. package/framework/{skills/level-2-domains → agents}/backend/dotnet-senior.md +7 -1
  54. package/framework/agents/backend/ef-modeler.md +119 -0
  55. package/framework/{skills/level-2-domains → agents}/backend/hangfire-orchestrator.md +8 -4
  56. package/framework/{skills/level-2-domains → agents}/backend/ms-agent-expert.md +7 -3
  57. package/framework/{skills/level-2-domains → agents}/frontend/blazor-builder.md +7 -3
  58. package/framework/{skills/level-2-domains → agents}/frontend/nextjs-expert.md +7 -3
  59. package/framework/{skills/level-2-domains → agents}/frontend/ui-ux-designer.md +8 -2
  60. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-architect.md +7 -1
  61. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-deploy-specialist.md +7 -1
  62. package/framework/{skills/level-2-domains → agents}/infrastructure/bicep-architect.md +7 -3
  63. package/framework/{skills/level-2-domains → agents}/infrastructure/container-specialist.md +7 -3
  64. package/framework/{skills/level-2-domains → agents}/infrastructure/devops-engineer.md +7 -3
  65. package/framework/{skills/level-2-domains → agents}/integrations/asaas-financial.md +7 -3
  66. package/framework/{skills/level-2-domains → agents}/integrations/azure-identity.md +7 -3
  67. package/framework/{skills/level-2-domains → agents}/integrations/clerk-auth.md +7 -3
  68. package/framework/{skills/level-2-domains/integrations/hangfire-orchestrator.md → agents/integrations/hangfire-integration.md} +7 -1
  69. package/framework/{skills/level-2-domains → agents}/integrations/resend-email.md +7 -3
  70. package/framework/{skills/level-2-domains → agents}/quality/code-analyzer.md +9 -5
  71. package/framework/{skills/level-2-domains → agents}/quality/testing-specialist.md +7 -3
  72. package/framework/commands/morph-apply.md +9 -9
  73. package/framework/commands/morph-archive.md +8 -8
  74. package/framework/commands/morph-infra.md +1 -1
  75. package/framework/commands/morph-proposal.md +9 -9
  76. package/framework/commands/morph-status.md +3 -3
  77. package/framework/commands/morph-troubleshoot.md +1 -1
  78. package/framework/hooks/README.md +201 -282
  79. package/framework/hooks/claude-code/notification/approval-reminder.js +52 -0
  80. package/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
  81. package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
  82. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
  83. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
  84. package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
  85. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
  86. package/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
  87. package/framework/hooks/claude-code/statusline.py +538 -0
  88. package/framework/hooks/claude-code/statusline.sh +7 -0
  89. package/framework/hooks/claude-code/stop/validate-completion.js +88 -0
  90. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
  91. package/framework/hooks/shared/hook-response.js +45 -0
  92. package/framework/hooks/shared/phase-utils.js +129 -0
  93. package/framework/hooks/shared/state-reader.js +138 -0
  94. package/framework/hooks/shared/stdin-reader.js +26 -0
  95. package/framework/phases.json +145 -0
  96. package/framework/rules/csharp-standards.md +10 -0
  97. package/framework/rules/frontend-standards.md +14 -0
  98. package/framework/rules/infrastructure-standards.md +13 -0
  99. package/framework/rules/morph-workflow.md +86 -0
  100. package/framework/rules/testing-standards.md +11 -0
  101. package/framework/skills/README.md +66 -0
  102. package/framework/skills/level-0-meta/brainstorming/SKILL.md +135 -0
  103. package/framework/skills/level-0-meta/brainstorming/references/proposal-example.md +138 -0
  104. package/framework/skills/level-0-meta/{code-review.md → code-review/SKILL.md} +13 -4
  105. package/framework/skills/level-0-meta/code-review/references/review-example.md +164 -0
  106. package/framework/skills/level-0-meta/code-review/scripts/scan-csharp.mjs +121 -0
  107. package/framework/skills/level-0-meta/mcp-registry.json +207 -0
  108. package/framework/skills/level-0-meta/{morph-checklist.md → morph-checklist/SKILL.md} +8 -3
  109. package/framework/skills/{level-1-workflows/morph-replicate.md → level-0-meta/morph-replicate/SKILL.md} +13 -6
  110. package/framework/skills/level-0-meta/{simulation-checklist.md → simulation-checklist/SKILL.md} +9 -4
  111. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +334 -0
  112. package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +147 -0
  113. package/framework/skills/level-0-meta/verification-before-completion/scripts/check-phase-outputs.mjs +110 -0
  114. package/framework/skills/level-1-workflows/{phase-clarify.md → phase-clarify/SKILL.md} +65 -4
  115. package/framework/skills/level-1-workflows/phase-clarify/references/clarifications-example.md +117 -0
  116. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -0
  117. package/framework/skills/level-1-workflows/phase-design/SKILL.md +303 -0
  118. package/framework/skills/level-1-workflows/phase-design/references/spec-example.md +253 -0
  119. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -0
  120. package/framework/skills/level-1-workflows/phase-implement/references/recap-example.md +132 -0
  121. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +171 -0
  122. package/framework/skills/level-1-workflows/{phase-tasks.md → phase-tasks/SKILL.md} +89 -7
  123. package/framework/skills/level-1-workflows/phase-tasks/references/tasks-example.md +231 -0
  124. package/framework/skills/level-1-workflows/phase-tasks/scripts/validate-tasks.mjs +112 -0
  125. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -0
  126. package/framework/standards/STANDARDS.json +812 -0
  127. package/framework/standards/ai-agents/team-orchestration.md +3 -3
  128. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -0
  129. package/framework/standards/integration/mcp/mcp-tools.md +384 -0
  130. package/framework/templates/README.md +17 -17
  131. package/framework/templates/REGISTRY.json +48 -233
  132. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  133. package/framework/templates/context/CONTEXT-FEATURE.md +1 -1
  134. package/framework/templates/context/CONTEXT.md +3 -3
  135. package/framework/templates/docs/clarifications.md +253 -0
  136. package/framework/templates/docs/onboarding.md +123 -0
  137. package/framework/templates/docs/schema-analysis.md +119 -0
  138. package/framework/templates/docs/spec.md +149 -149
  139. package/framework/templates/docs/ui-components.md +124 -0
  140. package/framework/templates/docs/ui-design-system.md +76 -0
  141. package/framework/templates/docs/ui-flows.md +167 -0
  142. package/framework/templates/docs/ui-mockups.md +98 -0
  143. package/framework/templates/docs/user-stories.md +34 -0
  144. package/framework/templates/examples/spec-examples.md +1 -1
  145. package/framework/templates/infrastructure/github/README.md +11 -11
  146. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  147. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  148. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +1 -1
  149. package/framework/workflows/configs/express.json +45 -0
  150. package/framework/workflows/configs/spec-only.json +43 -0
  151. package/framework/workflows/docs/enforcement-pipeline.md +8 -8
  152. package/framework/workflows/docs/full-morph.md +3 -3
  153. package/package.json +3 -1
  154. package/scripts/generate-refs.js +336 -0
  155. package/scripts/generate-standards-registry.js +44 -0
  156. package/scripts/validate-real.mjs +255 -0
  157. package/src/commands/feature/create-story.js +362 -361
  158. package/src/commands/feature/shard-spec.js +225 -224
  159. package/src/commands/feature/sprint-status.js +1 -1
  160. package/src/commands/generation/generate-onboarding.js +169 -0
  161. package/src/commands/generation/generate.js +2 -2
  162. package/src/commands/mcp/mcp-setup.js +315 -0
  163. package/src/commands/project/changes.js +66 -0
  164. package/src/commands/project/checkpoint.js +209 -0
  165. package/src/commands/project/cost.js +179 -0
  166. package/src/commands/project/diff.js +278 -0
  167. package/src/commands/project/doctor.js +55 -7
  168. package/src/commands/project/init.js +318 -136
  169. package/src/commands/project/revert.js +173 -0
  170. package/src/commands/project/standards.js +80 -0
  171. package/src/commands/project/status.js +376 -0
  172. package/src/commands/project/update-agents.js +23 -0
  173. package/src/commands/project/update.js +60 -88
  174. package/src/commands/state/advance-phase.js +4 -3
  175. package/src/commands/state/state.js +10 -3
  176. package/src/commands/state/validate-phase.js +19 -2
  177. package/src/commands/templates/template-customize.js +4 -4
  178. package/src/commands/templates/template-render.js +1 -1
  179. package/src/commands/templates/template-show.js +1 -1
  180. package/src/commands/validation/validate-feature.js +359 -0
  181. package/src/core/orchestrator.js +3 -38
  182. package/src/core/paths/output-schema.js +135 -0
  183. package/src/core/state/state-manager.js +831 -592
  184. package/src/core/templates/template-registry.js +2 -2
  185. package/src/core/workflows/workflow-detector.js +17 -1
  186. package/src/lib/agents/micro-agent-factory.js +1 -1
  187. package/src/lib/context/context-bundler.js +2 -1
  188. package/src/lib/detectors/claude-config-detector.js +390 -0
  189. package/src/lib/detectors/conversation-analyzer.js +4 -4
  190. package/src/lib/detectors/design-system-detector.js +6 -5
  191. package/src/lib/detectors/standards-generator.js +2 -2
  192. package/src/lib/generators/context-generator.js +539 -538
  193. package/src/lib/generators/recap-generator.js +1 -1
  194. package/src/lib/generators/settings-generator.js +210 -0
  195. package/src/lib/hooks/hook-executor.js +1 -1
  196. package/src/lib/installers/mcp-installer.js +299 -0
  197. package/src/lib/learning/learning-system.js +3 -3
  198. package/src/lib/orchestration/team-orchestrator.js +1 -1
  199. package/src/lib/standards/standards-context-injector.js +7 -7
  200. package/src/lib/threads/thread-coordinator.js +1 -1
  201. package/src/lib/troubleshooting/troubleshoot-grep.js +1 -1
  202. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -273
  203. package/src/lib/validators/design-system/design-system-validator.js +1 -1
  204. package/src/lib/validators/spec-validator.js +258 -258
  205. package/src/lib/validators/validation-runner.js +270 -269
  206. package/src/utils/agents-installer.js +206 -0
  207. package/src/utils/claude-settings-manager.js +258 -0
  208. package/src/utils/file-copier.js +1 -1
  209. package/src/utils/hooks-installer.js +354 -28
  210. package/src/utils/skills-installer.js +118 -0
  211. package/.morph/project/context/README.md +0 -17
  212. package/.morph/project/context/detection-log.md +0 -16
  213. package/.morph/project/standards/inferred.md +0 -59
  214. package/framework/hooks/agent-stop/validate-and-continue.js +0 -96
  215. package/framework/hooks/agent-stop/validate-checkpoints.js +0 -101
  216. package/framework/hooks/agent-stop/validate-tests.js +0 -109
  217. package/framework/hooks/agent-teams/dispatch.js +0 -67
  218. package/framework/hooks/agent-teams/phase-advanced.js +0 -80
  219. package/framework/hooks/agent-teams/task-completed.js +0 -76
  220. package/framework/hooks/agent-teams/teammate-idle.js +0 -70
  221. package/framework/skills/level-1-workflows/phase-design.md +0 -213
  222. package/framework/skills/level-1-workflows/phase-setup.md +0 -106
  223. package/framework/skills/level-1-workflows/phase-uiux.md +0 -169
  224. package/framework/skills/level-2-domains/backend/api-designer.md +0 -59
  225. package/framework/skills/level-2-domains/backend/ef-modeler.md +0 -58
  226. package/framework/skills/level-3-technologies/README.md +0 -7
  227. package/framework/skills/level-4-patterns/README.md +0 -7
  228. package/src/commands/agents/agents-fuse.js +0 -97
  229. package/src/commands/agents/micro-agent.js +0 -112
  230. package/src/commands/agents/spawn-team.js +0 -237
  231. package/src/commands/agents/squad-template.js +0 -146
  232. package/src/commands/analytics/analytics.js +0 -176
  233. package/src/commands/context/context-prime.js +0 -63
  234. package/src/commands/context/core-four.js +0 -54
  235. package/src/commands/generation/generate-context.js +0 -40
  236. package/src/commands/project/detect-agents.js +0 -207
  237. package/src/commands/project/detect-workflow.js +0 -174
  238. package/src/commands/threads/thread-template.js +0 -103
  239. package/src/commands/threads/threads.js +0 -261
  240. package/src/commands/utils/session-summary.js +0 -291
  241. package/src/llm/analyzer.js +0 -215
  242. package/src/llm/few-shot-examples.js +0 -216
  243. package/src/llm/project-config-schema.json +0 -188
  244. package/src/llm/prompt-builder.js +0 -96
  245. /package/.morph/{config → framework}/agents.json +0 -0
  246. /package/.morph/{standards → framework/standards}/ai-agents/blazor-ui.md +0 -0
  247. /package/.morph/{standards → framework/standards}/ai-agents/production.md +0 -0
  248. /package/.morph/{standards → framework/standards}/ai-agents/setup.md +0 -0
  249. /package/.morph/{standards → framework/standards}/ai-agents/workflows.md +0 -0
  250. /package/.morph/{standards → framework/standards}/architecture/ddd/aggregates.md +0 -0
  251. /package/.morph/{standards → framework/standards}/architecture/ddd/entities.md +0 -0
  252. /package/.morph/{standards → framework/standards}/architecture/ddd/value-objects.md +0 -0
  253. /package/.morph/{standards → framework/standards}/backend/api/minimal-api.md +0 -0
  254. /package/.morph/{standards → framework/standards}/backend/api/rest.md +0 -0
  255. /package/.morph/{standards → framework/standards}/backend/api/validation.md +0 -0
  256. /package/.morph/{standards → framework/standards}/backend/authentication/passkeys.md +0 -0
  257. /package/.morph/{standards → framework/standards}/backend/database/ef-core.md +0 -0
  258. /package/.morph/{standards → framework/standards}/backend/database/migrations.md +0 -0
  259. /package/.morph/{standards → framework/standards}/backend/database/postgresql/database.md +0 -0
  260. /package/.morph/{standards → framework/standards}/backend/database/repository-patterns.md +0 -0
  261. /package/.morph/{standards → framework/standards}/backend/database/vector-search-rag.md +0 -0
  262. /package/.morph/{standards → framework/standards}/backend/dotnet/async.md +0 -0
  263. /package/.morph/{standards → framework/standards}/backend/dotnet/core.md +0 -0
  264. /package/.morph/{standards → framework/standards}/backend/dotnet/di.md +0 -0
  265. /package/.morph/{standards → framework/standards}/backend/dotnet/program-cs-checklist.md +0 -0
  266. /package/.morph/{standards → framework/standards}/backend/integrations/asaas/asaas-api.md +0 -0
  267. /package/.morph/{standards → framework/standards}/backend/integrations/clerk/clerk-auth.md +0 -0
  268. /package/.morph/{standards → framework/standards}/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  269. /package/.morph/{standards → framework/standards}/backend/integrations/resend/resend-email.md +0 -0
  270. /package/.morph/{standards → framework/standards}/context/analytics.md +0 -0
  271. /package/.morph/{standards → framework/standards}/context/bundles.md +0 -0
  272. /package/.morph/{standards → framework/standards}/context/priming.md +0 -0
  273. /package/.morph/{standards → framework/standards}/core/architecture.md +0 -0
  274. /package/.morph/{standards → framework/standards}/core/coding.md +0 -0
  275. /package/.morph/{standards → framework/standards}/core/git-branching-strategy.md +0 -0
  276. /package/.morph/{standards → framework/standards}/core/git.md +0 -0
  277. /package/.morph/{standards → framework/standards}/core/testing.md +0 -0
  278. /package/.morph/{standards → framework/standards}/data/nosql/blob-storage.md +0 -0
  279. /package/.morph/{standards → framework/standards}/data/nosql/cache/redis.md +0 -0
  280. /package/.morph/{standards → framework/standards}/data/nosql/cosmos-db.md +0 -0
  281. /package/.morph/{standards → framework/standards}/data/vector-search/azure-ai-search.md +0 -0
  282. /package/.morph/{standards → framework/standards}/data/vector-search/rag-chunking.md +0 -0
  283. /package/.morph/{standards → framework/standards}/frontend/blazor/design-checklist.md +0 -0
  284. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui-setup.md +0 -0
  285. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui.md +0 -0
  286. /package/.morph/{standards → framework/standards}/frontend/blazor/html-conversion.md +0 -0
  287. /package/.morph/{standards → framework/standards}/frontend/blazor/lifecycle.md +0 -0
  288. /package/.morph/{standards → framework/standards}/frontend/blazor/pitfalls.md +0 -0
  289. /package/.morph/{standards → framework/standards}/frontend/blazor/state.md +0 -0
  290. /package/.morph/{standards → framework/standards}/frontend/design-system/animations.md +0 -0
  291. /package/.morph/{standards → framework/standards}/frontend/design-system/naming.md +0 -0
  292. /package/.morph/{standards → framework/standards}/infrastructure/azure/azure.md +0 -0
  293. /package/.morph/{standards → framework/standards}/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  294. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  295. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/local-development.md +0 -0
  296. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/functions.md +0 -0
  297. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/service-bus.md +0 -0
  298. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/storage.md +0 -0
  299. /package/.morph/{standards → framework/standards}/infrastructure/docker/easypanel-deploy.md +0 -0
  300. /package/.morph/{standards → framework/standards}/infrastructure/supabase/mcp-setup.md +0 -0
  301. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-auth.md +0 -0
  302. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-pgvector.md +0 -0
  303. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-rls.md +0 -0
  304. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-storage.md +0 -0
  305. /package/.morph/{standards → framework/standards}/integration/api/graphql.md +0 -0
  306. /package/.morph/{standards → framework/standards}/integration/api/grpc.md +0 -0
  307. /package/.morph/{standards → framework/standards}/integration/api/rest-design.md +0 -0
  308. /package/.morph/{standards → framework/standards}/integration/event-driven/cqrs.md +0 -0
  309. /package/.morph/{standards → framework/standards}/integration/event-driven/event-sourcing.md +0 -0
  310. /package/.morph/{standards → framework/standards}/integration/event-driven/service-bus.md +0 -0
  311. /package/.morph/{standards → framework/standards}/observability/logging.md +0 -0
  312. /package/.morph/{standards → framework/standards}/observability/metrics.md +0 -0
  313. /package/.morph/{standards → framework/standards}/observability/monitoring.md +0 -0
  314. /package/.morph/{standards → framework/standards}/observability/tracing.md +0 -0
  315. /package/.morph/{standards → framework/standards}/workflows/parallel-execution.md +0 -0
  316. /package/.morph/{standards → framework/standards}/workflows/thread-management.md +0 -0
  317. /package/.morph/{templates → framework/templates}/.idea/morph-templates.xml +0 -0
  318. /package/.morph/{templates → framework/templates}/.vscode/morph-templates.code-snippets +0 -0
  319. /package/.morph/{templates → framework/templates}/IDE-SNIPPETS.md +0 -0
  320. /package/.morph/{templates → framework/templates}/code/dotnet/backend/repository.cs +0 -0
  321. /package/.morph/{templates → framework/templates}/code/dotnet/backend/service.cs +0 -0
  322. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Commands.cs +0 -0
  323. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Entities.cs +0 -0
  324. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Queries.cs +0 -0
  325. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/README.md +0 -0
  326. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/api-contracts.cs +0 -0
  327. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/contracts.cs +0 -0
  328. /package/.morph/{templates → framework/templates}/code/dotnet/database/migration.cs +0 -0
  329. /package/.morph/{templates → framework/templates}/code/dotnet/frontend/component.razor +0 -0
  330. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/agent.cs +0 -0
  331. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/job.cs +0 -0
  332. /package/.morph/{templates → framework/templates}/code/dotnet/test.cs +0 -0
  333. /package/.morph/{templates → framework/templates}/code/sql/rls-policy.sql +0 -0
  334. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.sql +0 -0
  335. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.template.sql +0 -0
  336. /package/.morph/{templates → framework/templates}/code/typescript/contracts.ts +0 -0
  337. /package/.morph/{templates → framework/templates}/docs/proposal.md +0 -0
  338. /package/.morph/{templates → framework/templates}/examples/design-system-examples.md +0 -0
  339. /package/.morph/{templates → framework/templates}/feature/decisions.md +0 -0
  340. /package/.morph/{templates → framework/templates}/feature/recap.md +0 -0
  341. /package/.morph/{templates → framework/templates}/feature/tasks.md +0 -0
  342. /package/.morph/{templates → framework/templates}/infrastructure/azure/Dockerfile.example +0 -0
  343. /package/.morph/{templates → framework/templates}/infrastructure/azure/README.md +0 -0
  344. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-insights.bicep +0 -0
  345. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-service.bicep +0 -0
  346. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app-env.bicep +0 -0
  347. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app.bicep +0 -0
  348. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy-checklist.md +0 -0
  349. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.ps1 +0 -0
  350. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.sh +0 -0
  351. /package/.morph/{templates → framework/templates}/infrastructure/azure/key-vault.bicep +0 -0
  352. /package/.morph/{templates → framework/templates}/infrastructure/azure/main.bicep +0 -0
  353. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.dev.json +0 -0
  354. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.prod.json +0 -0
  355. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.staging.json +0 -0
  356. /package/.morph/{templates → framework/templates}/infrastructure/azure/sql-database.bicep +0 -0
  357. /package/.morph/{templates → framework/templates}/infrastructure/azure/storage.bicep +0 -0
  358. /package/.morph/{templates → framework/templates}/infrastructure/docker/Dockerfile.template +0 -0
  359. /package/.morph/{templates → framework/templates}/infrastructure/docker/docker-compose.template.yml +0 -0
  360. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-api.dockerfile +0 -0
  361. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-web.dockerfile +0 -0
  362. /package/.morph/{templates → framework/templates}/infrastructure/docker/easypanel.template.json +0 -0
  363. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -0
  364. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -0
  365. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/health-check/action.yml.hbs +0 -0
  366. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -0
  367. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -0
  368. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -0
  369. /package/.morph/{templates → framework/templates}/integrations/asaas-client.cs +0 -0
  370. /package/.morph/{templates → framework/templates}/integrations/asaas-webhook.cs +0 -0
  371. /package/.morph/{templates → framework/templates}/integrations/azure-identity-config.cs +0 -0
  372. /package/.morph/{templates → framework/templates}/integrations/clerk-config.cs +0 -0
  373. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-agent.md +0 -0
  374. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-aggregator.md +0 -0
  375. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-retry.md +0 -0
  376. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-validation.md +0 -0
  377. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-wrapper.md +0 -0
  378. /package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-coordinator.md +0 -0
  379. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/backend-squad.md +0 -0
  380. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/frontend-squad.md +0 -0
  381. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/squad-leader.md +0 -0
  382. /package/.morph/{templates → framework/templates}/meta-prompts/validators/checkpoint-validator.md +0 -0
  383. /package/.morph/{templates → framework/templates}/saas/subscription.cs +0 -0
  384. /package/.morph/{templates → framework/templates}/saas/tenant.cs +0 -0
  385. /package/.morph/{templates → framework/templates}/state.template.json +0 -0
  386. /package/.morph/{templates → framework/templates}/ui/FluentDesignTheme.cs +0 -0
  387. /package/.morph/{templates → framework/templates}/ui/MudTheme.cs +0 -0
  388. /package/.morph/{templates → framework/templates}/ui/design-system.css +0 -0
  389. /package/framework/{skills/level-2-domains → agents}/README.md +0 -0
  390. /package/framework/hooks/{commit-msg → git/commit-msg}/conventional-commits.sh +0 -0
  391. /package/framework/hooks/{pre-commit → git/pre-commit}/agents.sh +0 -0
  392. /package/framework/hooks/{pre-commit → git/pre-commit}/orchestrator.sh +0 -0
  393. /package/framework/hooks/{pre-commit → git/pre-commit}/specs.sh +0 -0
  394. /package/framework/hooks/{pre-push → git/pre-push}/run-tests.sh +0 -0
@@ -0,0 +1,173 @@
1
+ /**
2
+ * MORPH-SPEC Revert Command
3
+ *
4
+ * Revert a feature to a previous phase, optionally deleting later-phase outputs.
5
+ *
6
+ * Usage:
7
+ * morph-spec revert <feature-name> --to <phase>
8
+ * morph-spec revert <feature-name> --to design
9
+ * morph-spec revert <feature-name> --to design --delete-outputs
10
+ */
11
+
12
+ import fs from 'fs';
13
+ import path from 'path';
14
+ import chalk from 'chalk';
15
+ import { loadState, saveState, getFeature } from '../../core/state/state-manager.js';
16
+
17
+ /**
18
+ * Phase order for revert logic
19
+ */
20
+ const PHASE_ORDER = [
21
+ { key: 'proposal', order: 0, outputs: ['proposal.md'] },
22
+ { key: 'setup', order: 1, outputs: [] },
23
+ { key: 'uiux', order: 2, outputs: ['ui-design-system.md', 'ui-mockups.md', 'ui-components.md', 'ui-flows.md'] },
24
+ { key: 'design', order: 3, outputs: ['spec.md', 'schema-analysis.md', 'contracts.cs', 'decisions.md'] },
25
+ { key: 'clarify', order: 4, outputs: ['clarifications.md'] },
26
+ { key: 'tasks', order: 5, outputs: ['tasks.md', 'tasks.json'] },
27
+ { key: 'implement', order: 6, outputs: ['recap.md'] },
28
+ { key: 'sync', order: 7, outputs: [] }
29
+ ];
30
+
31
+ /**
32
+ * Get outputs that would be affected by reverting to a phase
33
+ */
34
+ function getAffectedOutputs(targetPhase) {
35
+ const targetOrder = PHASE_ORDER.find(p => p.key === targetPhase)?.order ?? -1;
36
+ const affected = [];
37
+
38
+ for (const phase of PHASE_ORDER) {
39
+ if (phase.order > targetOrder) {
40
+ affected.push(...phase.outputs.map(o => ({ phase: phase.key, file: o })));
41
+ }
42
+ }
43
+
44
+ return affected;
45
+ }
46
+
47
+ /**
48
+ * Main revert command
49
+ */
50
+ export async function revertCommand(featureName, options = {}) {
51
+ if (!featureName) {
52
+ console.error(chalk.red('Error: Feature name required'));
53
+ console.error(chalk.gray('Usage: morph-spec revert <feature-name> --to <phase>'));
54
+ process.exit(1);
55
+ }
56
+
57
+ const targetPhase = options.to;
58
+ if (!targetPhase) {
59
+ console.error(chalk.red('Error: Target phase required (--to <phase>)'));
60
+ console.error(chalk.gray(`Valid phases: ${PHASE_ORDER.map(p => p.key).join(', ')}`));
61
+ process.exit(1);
62
+ }
63
+
64
+ const targetDef = PHASE_ORDER.find(p => p.key === targetPhase);
65
+ if (!targetDef) {
66
+ console.error(chalk.red(`Error: Unknown phase: ${targetPhase}`));
67
+ console.error(chalk.gray(`Valid phases: ${PHASE_ORDER.map(p => p.key).join(', ')}`));
68
+ process.exit(1);
69
+ }
70
+
71
+ const feature = getFeature(featureName);
72
+ if (!feature) {
73
+ console.error(chalk.red(`Error: Feature '${featureName}' not found`));
74
+ process.exit(1);
75
+ }
76
+
77
+ const currentDef = PHASE_ORDER.find(p => p.key === feature.phase);
78
+ if (currentDef && targetDef.order >= currentDef.order) {
79
+ console.error(chalk.red(`Error: Cannot revert forward. Current phase: ${feature.phase}, target: ${targetPhase}`));
80
+ process.exit(1);
81
+ }
82
+
83
+ // Get affected outputs
84
+ const affected = getAffectedOutputs(targetPhase);
85
+ const outputDir = path.join(process.cwd(), '.morph/features', featureName);
86
+ const existingAffected = affected.filter(a =>
87
+ fs.existsSync(path.join(outputDir, a.file))
88
+ );
89
+
90
+ // Show what will happen
91
+ console.log(chalk.cyan('\n┌────────────────────────────────────────────────────────────┐'));
92
+ console.log(chalk.cyan('│ MORPH-SPEC REVERT │'));
93
+ console.log(chalk.cyan('└────────────────────────────────────────────────────────────┘\n'));
94
+
95
+ console.log(chalk.white.bold(`Feature: ${featureName}`));
96
+ console.log(chalk.gray(`Current phase: ${feature.phase} → Reverting to: ${targetPhase}\n`));
97
+
98
+ if (existingAffected.length > 0) {
99
+ if (options.deleteOutputs) {
100
+ console.log(chalk.yellow('The following files will be DELETED:'));
101
+ } else {
102
+ console.log(chalk.yellow('The following outputs will be marked as draft (files preserved):'));
103
+ }
104
+ for (const item of existingAffected) {
105
+ console.log(chalk.gray(` - ${item.file} (from ${item.phase} phase)`));
106
+ }
107
+ console.log('');
108
+ }
109
+
110
+ // Update state
111
+ const state = loadState();
112
+ const stateFeature = state.features[featureName];
113
+
114
+ // Revert phase
115
+ stateFeature.phase = targetPhase;
116
+ stateFeature.updatedAt = new Date().toISOString();
117
+
118
+ // Mark affected outputs as not created in state
119
+ const outputKeyMap = {
120
+ 'proposal.md': 'proposal',
121
+ 'spec.md': 'spec',
122
+ 'schema-analysis.md': 'schemaAnalysis',
123
+ 'contracts.cs': 'contracts',
124
+ 'decisions.md': 'decisions',
125
+ 'clarifications.md': 'clarifications',
126
+ 'tasks.md': 'tasks',
127
+ 'tasks.json': 'tasks',
128
+ 'ui-design-system.md': 'uiDesignSystem',
129
+ 'ui-mockups.md': 'uiMockups',
130
+ 'ui-components.md': 'uiComponents',
131
+ 'ui-flows.md': 'uiFlows',
132
+ 'recap.md': 'recap'
133
+ };
134
+
135
+ for (const item of affected) {
136
+ const key = outputKeyMap[item.file];
137
+ if (key && stateFeature.outputs[key]) {
138
+ stateFeature.outputs[key].created = false;
139
+ }
140
+ }
141
+
142
+ // Reset approval gates for later phases
143
+ for (const phase of PHASE_ORDER) {
144
+ if (phase.order > targetDef.order && stateFeature.approvalGates?.[phase.key]) {
145
+ stateFeature.approvalGates[phase.key].approved = false;
146
+ stateFeature.approvalGates[phase.key].timestamp = null;
147
+ stateFeature.approvalGates[phase.key].approvedBy = null;
148
+ }
149
+ }
150
+
151
+ // Reset tasks if reverting before tasks phase
152
+ if (targetDef.order < 5) {
153
+ stateFeature.tasks = { total: 0, completed: 0, inProgress: 0, pending: 0 };
154
+ }
155
+
156
+ saveState(state);
157
+
158
+ // Delete files if requested
159
+ if (options.deleteOutputs && existingAffected.length > 0) {
160
+ for (const item of existingAffected) {
161
+ const filePath = path.join(outputDir, item.file);
162
+ if (fs.existsSync(filePath)) {
163
+ fs.unlinkSync(filePath);
164
+ }
165
+ }
166
+ console.log(chalk.yellow(`Deleted ${existingAffected.length} file(s).`));
167
+ }
168
+
169
+ console.log(chalk.green(`✓ Feature '${featureName}' reverted to phase: ${targetPhase}`));
170
+ console.log(chalk.gray(` State updated. Run 'morph-spec status ${featureName}' to see current status.\n`));
171
+ }
172
+
173
+ export default revertCommand;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Standards CLI Commands
3
+ *
4
+ * Provides browsable access to the framework standards registry.
5
+ * Usage:
6
+ * morph-spec standards --list
7
+ * morph-spec standards --search <query>
8
+ * morph-spec standards --show <id>
9
+ * morph-spec standards --category <cat>
10
+ */
11
+
12
+ import { readFileSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { fileURLToPath } from 'url';
15
+ import { logger } from '../../utils/logger.js';
16
+
17
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
18
+ const REGISTRY_PATH = join(__dirname, '..', '..', '..', 'framework', 'standards', 'STANDARDS.json');
19
+
20
+ function loadRegistry() {
21
+ return JSON.parse(readFileSync(REGISTRY_PATH, 'utf8')).standards;
22
+ }
23
+
24
+ /**
25
+ * List all standards, optionally filtered by category.
26
+ * @param {{ json?: boolean, category?: string }} opts
27
+ * @returns {Promise<Array>}
28
+ */
29
+ export async function listStandards({ json, category } = {}) {
30
+ let standards = loadRegistry();
31
+ if (category) {
32
+ standards = standards.filter(s => s.category === category);
33
+ }
34
+ if (json) return standards;
35
+ standards.forEach(s =>
36
+ logger.info(`${s.id.padEnd(55)} ${s.category}`)
37
+ );
38
+ return standards;
39
+ }
40
+
41
+ /**
42
+ * Search standards by query string (matches id, name, or tags).
43
+ * @param {string} query
44
+ * @param {{ json?: boolean }} opts
45
+ * @returns {Promise<Array>}
46
+ */
47
+ export async function searchStandards(query, { json } = {}) {
48
+ const q = query.toLowerCase();
49
+ const results = loadRegistry().filter(s =>
50
+ s.name.toLowerCase().includes(q) ||
51
+ s.id.toLowerCase().includes(q) ||
52
+ s.tags.some(t => t.toLowerCase().includes(q))
53
+ );
54
+ if (json) return results;
55
+ if (results.length === 0) {
56
+ logger.warn(`No standards found matching "${query}"`);
57
+ } else {
58
+ results.forEach(s => logger.info(`${s.id}: ${s.name} [${s.category}]`));
59
+ }
60
+ return results;
61
+ }
62
+
63
+ /**
64
+ * Show the full content of a standard by its id.
65
+ * @param {string} id
66
+ * @returns {Promise<string|null>}
67
+ */
68
+ export async function showStandard(id) {
69
+ const standard = loadRegistry().find(s => s.id === id);
70
+ if (!standard) {
71
+ logger.error(`Standard '${id}' not found. Use --list to see available standards.`);
72
+ return null;
73
+ }
74
+ const content = readFileSync(
75
+ join(__dirname, '..', '..', '..', 'framework', 'standards', standard.path),
76
+ 'utf8'
77
+ );
78
+ logger.info(content);
79
+ return content;
80
+ }
@@ -0,0 +1,376 @@
1
+ /**
2
+ * MORPH-SPEC Feature Status Command
3
+ *
4
+ * Displays a comprehensive dashboard showing feature progress, phase status,
5
+ * outputs, tasks, approvals, and next steps.
6
+ *
7
+ * Usage:
8
+ * morph-spec status <feature-name>
9
+ * morph-spec status <feature-name> --json
10
+ *
11
+ * Example:
12
+ * morph-spec status user-portal
13
+ */
14
+
15
+ import chalk from 'chalk';
16
+ import { loadState, getFeature, derivePhase, deriveOutputs } from '../../core/state/state-manager.js';
17
+ import { PHASES } from '../state/validate-phase.js';
18
+
19
+ /**
20
+ * Phase symbols for visual representation
21
+ */
22
+ const PHASE_SYMBOLS = {
23
+ completed: '✅',
24
+ current: '⏸️',
25
+ pending: '⬜',
26
+ skipped: '⊘'
27
+ };
28
+
29
+ /**
30
+ * Phase definitions with order
31
+ */
32
+ const PHASE_ORDER = [
33
+ { key: 'proposal', name: 'FASE 0: PROPOSAL', order: 0 },
34
+ { key: 'setup', name: 'FASE 1: SETUP', order: 1 },
35
+ { key: 'uiux', name: 'FASE 1.5: UI/UX', order: 2, optional: true },
36
+ { key: 'design', name: 'FASE 2: DESIGN', order: 3 },
37
+ { key: 'clarify', name: 'FASE 3: CLARIFY', order: 4 },
38
+ { key: 'tasks', name: 'FASE 4: TASKS', order: 5 },
39
+ { key: 'implement', name: 'FASE 5: IMPLEMENT', order: 6 },
40
+ { key: 'sync', name: 'FASE 6: SYNC', order: 7, optional: true }
41
+ ];
42
+
43
+ /**
44
+ * Calculate phase status (completed, current, pending, skipped)
45
+ */
46
+ function getPhaseStatus(phaseKey, currentPhase, feature) {
47
+ const phase = PHASE_ORDER.find(p => p.key === phaseKey);
48
+ const current = PHASE_ORDER.find(p => p.key === currentPhase);
49
+
50
+ if (!phase || !current) return 'pending';
51
+
52
+ // Check if phase was skipped (optional phases)
53
+ if (phase.optional && phase.order < current.order) {
54
+ // Check if any outputs were created for this phase
55
+ const hasOutputs = checkPhaseOutputs(phaseKey, feature);
56
+ if (!hasOutputs) return 'skipped';
57
+ }
58
+
59
+ if (phase.order < current.order) return 'completed';
60
+ if (phase.order === current.order) return 'current';
61
+ return 'pending';
62
+ }
63
+
64
+ /**
65
+ * Check if phase has any outputs created
66
+ */
67
+ function checkPhaseOutputs(phaseKey, feature) {
68
+ const phaseOutputMap = {
69
+ proposal: ['proposal'],
70
+ uiux: ['uiDesignSystem', 'uiMockups', 'uiComponents', 'uiFlows'],
71
+ design: ['spec', 'contracts', 'schemaAnalysis', 'decisions'],
72
+ clarify: ['clarifications'],
73
+ tasks: ['tasks']
74
+ };
75
+
76
+ const outputs = phaseOutputMap[phaseKey] || [];
77
+ return outputs.some(output => feature.outputs[output]?.created);
78
+ }
79
+
80
+ /**
81
+ * Format phase display with symbol and status
82
+ */
83
+ function formatPhase(phaseKey, currentPhase, feature, options = {}) {
84
+ const phase = PHASE_ORDER.find(p => p.key === phaseKey);
85
+ const status = getPhaseStatus(phaseKey, currentPhase, feature);
86
+ const symbol = PHASE_SYMBOLS[status];
87
+
88
+ let display = `${symbol} ${phase.name}`;
89
+
90
+ if (phase.optional) {
91
+ display += ` ${chalk.gray('(optional)')}`;
92
+ }
93
+
94
+ if (status === 'current') {
95
+ display = chalk.cyan(display) + chalk.cyan(' ← CURRENT');
96
+ } else if (status === 'completed') {
97
+ display = chalk.green(display);
98
+ } else if (status === 'skipped') {
99
+ display = chalk.gray(display + ' (skipped)');
100
+ } else {
101
+ display = chalk.gray(display);
102
+ }
103
+
104
+ // Add output files if verbose
105
+ if (options.verbose && status !== 'pending' && status !== 'skipped') {
106
+ const phaseOutputMap = {
107
+ proposal: ['proposal'],
108
+ uiux: ['uiDesignSystem', 'uiMockups', 'uiComponents', 'uiFlows'],
109
+ design: ['spec', 'contracts', 'schemaAnalysis', 'decisions'],
110
+ clarify: ['clarifications'],
111
+ tasks: ['tasks'],
112
+ implement: ['recap']
113
+ };
114
+
115
+ const outputs = phaseOutputMap[phaseKey] || [];
116
+ const created = outputs.filter(o => feature.outputs[o]?.created);
117
+ if (created.length > 0) {
118
+ display += chalk.gray(`\n Files: ${created.length}/${outputs.length}`);
119
+ }
120
+ }
121
+
122
+ return display;
123
+ }
124
+
125
+ /**
126
+ * Calculate completion percentage
127
+ */
128
+ function calculateCompletionPercentage(feature) {
129
+ const totalPhases = PHASE_ORDER.filter(p => !p.optional).length; // 6 required phases
130
+ const completedPhases = PHASE_ORDER.filter(p => {
131
+ if (p.optional) return false;
132
+ const status = getPhaseStatus(p.key, feature.phase, feature);
133
+ return status === 'completed';
134
+ }).length;
135
+
136
+ return Math.round((completedPhases / totalPhases) * 100);
137
+ }
138
+
139
+ /**
140
+ * Get next steps based on current phase
141
+ */
142
+ function getNextSteps(feature) {
143
+ const steps = [];
144
+
145
+ // Check for pending approvals relevant to current phase
146
+ const phaseApprovalMap = {
147
+ proposal: 'proposal',
148
+ setup: 'proposal',
149
+ uiux: 'uiux',
150
+ design: 'design',
151
+ clarify: 'design',
152
+ tasks: 'tasks',
153
+ implement: 'tasks'
154
+ };
155
+
156
+ const relevantGate = phaseApprovalMap[feature.phase];
157
+ const approvalGates = feature.approvalGates || {};
158
+
159
+ if (relevantGate && approvalGates[relevantGate] && !approvalGates[relevantGate].approved) {
160
+ steps.push({
161
+ type: 'approval',
162
+ message: `Approve ${relevantGate} to advance`,
163
+ command: `morph-spec approve ${feature.name || 'feature'} ${relevantGate}`
164
+ });
165
+ }
166
+
167
+ // Check for missing outputs in current phase
168
+ const phaseOutputMap = {
169
+ proposal: ['proposal'],
170
+ design: ['spec', 'contracts'],
171
+ clarify: ['clarifications'],
172
+ tasks: ['tasks'],
173
+ implement: ['recap']
174
+ };
175
+
176
+ const requiredOutputs = phaseOutputMap[feature.phase] || [];
177
+ const missingOutputs = requiredOutputs.filter(o => !feature.outputs[o]?.created);
178
+
179
+ if (missingOutputs.length > 0) {
180
+ steps.push({
181
+ type: 'output',
182
+ message: `Create missing outputs: ${missingOutputs.join(', ')}`,
183
+ command: null
184
+ });
185
+ }
186
+
187
+ // Suggest next phase if current is complete
188
+ const hasApprovalPending = relevantGate && approvalGates[relevantGate] && !approvalGates[relevantGate].approved;
189
+ if (missingOutputs.length === 0 && !hasApprovalPending) {
190
+ const currentPhaseIndex = PHASE_ORDER.findIndex(p => p.key === feature.phase);
191
+ if (currentPhaseIndex >= 0 && currentPhaseIndex < PHASE_ORDER.length - 1) {
192
+ const nextPhase = PHASE_ORDER[currentPhaseIndex + 1];
193
+ steps.push({
194
+ type: 'advance',
195
+ message: `Advance to ${nextPhase.name}`,
196
+ command: `morph-spec phase advance ${feature.name || 'feature'}`
197
+ });
198
+ } else if (currentPhaseIndex === PHASE_ORDER.length - 1) {
199
+ steps.push({
200
+ type: 'complete',
201
+ message: 'Feature complete! Consider archiving.',
202
+ command: null
203
+ });
204
+ }
205
+ }
206
+
207
+ return steps;
208
+ }
209
+
210
+ /**
211
+ * Estimate remaining time based on tasks
212
+ */
213
+ function estimateRemainingTime(feature) {
214
+ if (!feature.tasks || feature.tasks.total === 0) {
215
+ return 'Not estimated';
216
+ }
217
+
218
+ const remaining = feature.tasks.total - feature.tasks.completed;
219
+ const avgHoursPerTask = 2; // Configurable estimate
220
+ const hours = remaining * avgHoursPerTask;
221
+
222
+ if (hours < 1) return '< 1 hour';
223
+ if (hours === 1) return '1 hour';
224
+ if (hours < 8) return `${hours} hours`;
225
+ const days = Math.ceil(hours / 8);
226
+ return `~${days} day${days > 1 ? 's' : ''} (${hours}h)`;
227
+ }
228
+
229
+ /**
230
+ * Main status command
231
+ */
232
+ export async function statusCommand(featureName, options = {}) {
233
+ if (!featureName) {
234
+ console.error(chalk.red('✗ Error: Feature name required'));
235
+ console.error(chalk.gray('Usage: morph-spec status <feature-name>'));
236
+ process.exit(1);
237
+ }
238
+
239
+ const feature = getFeature(featureName);
240
+ if (!feature) {
241
+ console.error(chalk.red(`✗ Error: Feature '${featureName}' not found`));
242
+ console.error(chalk.gray(`Run 'morph-spec state get ${featureName}' to check if feature exists`));
243
+ process.exit(1);
244
+ }
245
+
246
+ // Derive phase and outputs from filesystem if not stored in state (v5.0.0+)
247
+ const { join } = await import('path');
248
+ const featurePath = join(process.cwd(), '.morph', 'features', featureName);
249
+ if (!feature.phase) {
250
+ feature.phase = derivePhase(featurePath);
251
+ }
252
+ if (!feature.outputs) {
253
+ feature.outputs = deriveOutputs(featureName, process.cwd());
254
+ }
255
+
256
+ // JSON output mode
257
+ if (options.json) {
258
+ const status = {
259
+ feature: featureName,
260
+ phase: feature.phase,
261
+ status: feature.status,
262
+ workflow: feature.workflow,
263
+ completion: calculateCompletionPercentage(feature),
264
+ phases: PHASE_ORDER.map(p => ({
265
+ key: p.key,
266
+ name: p.name,
267
+ status: getPhaseStatus(p.key, feature.phase, feature),
268
+ optional: p.optional || false
269
+ })),
270
+ outputs: Object.entries(feature.outputs).map(([key, output]) => ({
271
+ type: key,
272
+ created: output.created,
273
+ path: output.path
274
+ })),
275
+ tasks: feature.tasks || { total: 0, completed: 0, inProgress: 0, pending: 0 },
276
+ approvals: feature.approvalGates || {},
277
+ nextSteps: getNextSteps(feature),
278
+ estimatedTimeRemaining: estimateRemainingTime(feature)
279
+ };
280
+
281
+ console.log(JSON.stringify(status, null, 2));
282
+ return;
283
+ }
284
+
285
+ // Visual dashboard output
286
+ console.log(chalk.cyan('\n┌────────────────────────────────────────────────────────────┐'));
287
+ console.log(chalk.cyan('│ MORPH-SPEC STATUS │'));
288
+ console.log(chalk.cyan('└────────────────────────────────────────────────────────────┘\n'));
289
+
290
+ // Feature info
291
+ console.log(chalk.white.bold(`Feature: ${featureName}`));
292
+ console.log(chalk.gray(`Status: ${feature.status || 'unknown'}`));
293
+ console.log(chalk.gray(`Workflow: ${feature.workflow || 'auto'}`));
294
+ console.log(chalk.gray(`Completion: ${calculateCompletionPercentage(feature)}%`));
295
+ console.log('');
296
+
297
+ // Phase progression
298
+ console.log(chalk.white.bold('Phases:'));
299
+ console.log(chalk.cyan('├─────────────────────────────────────────────────────────────┤'));
300
+ PHASE_ORDER.forEach(phase => {
301
+ console.log(`│ ${formatPhase(phase.key, feature.phase, feature, options)}`);
302
+ });
303
+ console.log(chalk.cyan('└─────────────────────────────────────────────────────────────┘'));
304
+ console.log('');
305
+
306
+ // Outputs summary
307
+ const totalOutputs = Object.keys(feature.outputs).length;
308
+ const createdOutputs = Object.values(feature.outputs).filter(o => o.created).length;
309
+ console.log(chalk.white.bold(`Outputs: ${createdOutputs}/${totalOutputs} complete`));
310
+
311
+ if (options.verbose) {
312
+ console.log(chalk.gray('Output files:'));
313
+ Object.entries(feature.outputs).forEach(([key, output]) => {
314
+ const symbol = output.created ? '✅' : '⬜';
315
+ const display = output.created ? chalk.green(key) : chalk.gray(key);
316
+ console.log(` ${symbol} ${display}`);
317
+ });
318
+ }
319
+ console.log('');
320
+
321
+ // Tasks progress
322
+ if (feature.tasks && feature.tasks.total > 0) {
323
+ console.log(chalk.white.bold('Tasks Progress:'));
324
+ const { total, completed, inProgress, pending } = feature.tasks;
325
+ const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
326
+
327
+ console.log(` Total: ${total}`);
328
+ console.log(chalk.green(` ✓ Completed: ${completed} (${percentage}%)`));
329
+ if (inProgress > 0) console.log(chalk.cyan(` ▶ In Progress: ${inProgress}`));
330
+ if (pending > 0) console.log(chalk.gray(` ⬜ Pending: ${pending}`));
331
+ console.log(` Estimated time remaining: ${estimateRemainingTime(feature)}`);
332
+ console.log('');
333
+ }
334
+
335
+ // Approval gates
336
+ if (feature.approvalGates) {
337
+ const gates = Object.entries(feature.approvalGates);
338
+ const approved = gates.filter(([_, g]) => g.approved).length;
339
+ console.log(chalk.white.bold(`Approval Gates: ${approved}/${gates.length} approved`));
340
+
341
+ if (options.verbose) {
342
+ gates.forEach(([gate, info]) => {
343
+ const symbol = info.approved ? '✅' : '⬜';
344
+ const display = info.approved ? chalk.green(gate) : chalk.gray(gate);
345
+ let extra = '';
346
+ if (info.approved && info.approvedBy) {
347
+ extra = chalk.gray(` (by ${info.approvedBy})`);
348
+ }
349
+ console.log(` ${symbol} ${display}${extra}`);
350
+ });
351
+ }
352
+ console.log('');
353
+ }
354
+
355
+ // Next steps
356
+ const nextSteps = getNextSteps(feature);
357
+ if (nextSteps.length > 0) {
358
+ console.log(chalk.white.bold('Next Steps:'));
359
+ nextSteps.forEach((step, index) => {
360
+ console.log(chalk.yellow(` ${index + 1}. ${step.message}`));
361
+ if (step.command) {
362
+ console.log(chalk.gray(` → ${step.command}`));
363
+ }
364
+ });
365
+ console.log('');
366
+ } else {
367
+ console.log(chalk.green('✓ All tasks complete!\n'));
368
+ }
369
+
370
+ // Footer
371
+ console.log(chalk.gray('─'.repeat(60)));
372
+ console.log(chalk.gray('Run with --verbose for detailed output'));
373
+ console.log(chalk.gray('Run with --json for JSON output\n'));
374
+ }
375
+
376
+ export default statusCommand;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * update-agents command
3
+ *
4
+ * Refreshes .claude/agents/ with the latest tier-1 and tier-2 MORPH agents
5
+ * from the framework. Useful after upgrading morph-spec to pick up new or
6
+ * updated agent definitions without re-running full init.
7
+ */
8
+
9
+ import { join, dirname } from 'path';
10
+ import { fileURLToPath } from 'url';
11
+ import { installAgents } from '../../utils/agents-installer.js';
12
+ import { logger } from '../../utils/logger.js';
13
+
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const FRAMEWORK_DIR = join(__dirname, '..', '..', '..', 'framework');
16
+
17
+ export async function updateAgentsCommand(args, options) {
18
+ const projectDir = process.cwd();
19
+
20
+ logger.info('Updating native subagents in .claude/agents/...');
21
+ await installAgents(projectDir, FRAMEWORK_DIR);
22
+ logger.success('Native subagents updated. Claude Code will discover them on next session start.');
23
+ }