@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
@@ -1,224 +1,225 @@
1
- /**
2
- * MORPH-SPEC Document Sharding
3
- * Splits large spec.md files into manageable shards (BMAD-inspired)
4
- * Achieves 90% token savings by loading only relevant sections
5
- */
6
-
7
- import fs from 'fs';
8
- import path from 'path';
9
- import ora from 'ora';
10
- import chalk from 'chalk';
11
- import { logger } from '../../utils/logger.js';
12
- import { ensureDir, writeFile } from '../../utils/file-copier.js';
13
-
14
- // ============================================================================
15
- // Helper Functions
16
- // ============================================================================
17
-
18
- function parseSpec(specContent) {
19
- const sections = [];
20
- const lines = specContent.split('\n');
21
-
22
- let currentSection = null;
23
- let currentContent = [];
24
-
25
- for (const line of lines) {
26
- // Detect level 2 heading (## Heading)
27
- if (line.match(/^## /)) {
28
- // Save previous section
29
- if (currentSection) {
30
- sections.push({
31
- title: currentSection,
32
- slug: toSlug(currentSection),
33
- content: currentContent.join('\n').trim(),
34
- });
35
- }
36
-
37
- // Start new section
38
- currentSection = line.replace(/^## /, '').trim();
39
- currentContent = [line]; // Include heading in content
40
- } else {
41
- currentContent.push(line);
42
- }
43
- }
44
-
45
- // Save last section
46
- if (currentSection) {
47
- sections.push({
48
- title: currentSection,
49
- slug: toSlug(currentSection),
50
- content: currentContent.join('\n').trim(),
51
- });
52
- }
53
-
54
- return sections;
55
- }
56
-
57
- function toSlug(title) {
58
- return title
59
- .toLowerCase()
60
- .replace(/[^a-z0-9]+/g, '-')
61
- .replace(/^-|-$/g, '');
62
- }
63
-
64
- function generateIndex(sections, featureName) {
65
- let index = `# ${toTitleCase(featureName)} - Technical Specification\n\n`;
66
- index += `> **Sharded Spec:** This spec has been split into sections for optimal token usage\n`;
67
- index += `> **BMAD Pattern:** Load only the section you need during implementation\n\n`;
68
- index += `---\n\n`;
69
- index += `## 📋 Table of Contents\n\n`;
70
-
71
- sections.forEach((section, i) => {
72
- index += `${i + 1}. **[${section.title}](${section.slug}.md)**\n`;
73
-
74
- // Add first 100 chars as description
75
- const firstLine = section.content.split('\n').find(l => l.trim() && !l.startsWith('#'));
76
- const description = firstLine ? firstLine.substring(0, 100) + '...' : 'See section for details';
77
- index += ` > ${description}\n\n`;
78
- });
79
-
80
- index += `---\n\n`;
81
- index += `## 💡 How to Use Sharded Specs\n\n`;
82
- index += `### In Planning Phases (1-3)\n`;
83
- index += `Load **all sections** to get complete context:\n`;
84
- index += `\`\`\`bash\n`;
85
- index += `# Read index.md + all section files\n`;
86
- index += `\`\`\`\n\n`;
87
-
88
- index += `### In Implementation Phase (4)\n`;
89
- index += `Load **only the relevant section** for your current story:\n`;
90
- index += `\`\`\`bash\n`;
91
- index += `# Example: Working on entity design story\n`;
92
- index += `# Read: spec/index.md + spec/entity-design.md (not the other 10 sections!)\n`;
93
- index += `\`\`\`\n\n`;
94
-
95
- index += `**Token Savings:** For a 10-section spec (30k tokens), selective loading = **90% savings**\n\n`;
96
- index += `---\n\n`;
97
- index += `*Generated by MORPH-SPEC Framework - Document Sharding*\n`;
98
- index += `*Inspired by BMAD Method: 90% token reduction for large specs*\n`;
99
-
100
- return index;
101
- }
102
-
103
- function toTitleCase(str) {
104
- return str
105
- .split('-')
106
- .map(word => word.charAt(0).toUpperCase() + word.slice(1))
107
- .join(' ');
108
- }
109
-
110
- function estimateTokens(text) {
111
- // Rough estimate: 1 token ≈ 4 characters
112
- return Math.ceil(text.length / 4);
113
- }
114
-
115
- // ============================================================================
116
- // Command Function
117
- // ============================================================================
118
-
119
- export async function shardSpecCommand(feature, options) {
120
- logger.header('MORPH-SPEC Document Sharding');
121
- logger.dim(`Feature: ${feature}`);
122
- logger.blank();
123
-
124
- const spinner = ora('Analyzing spec.md...').start();
125
-
126
- try {
127
- // Find spec.md
128
- const specPath = path.join(process.cwd(), `.morph/project/outputs/${feature}/spec.md`);
129
- if (!fs.existsSync(specPath)) {
130
- throw new Error(`Spec not found: ${specPath}`);
131
- }
132
-
133
- // Read spec content
134
- const specContent = fs.readFileSync(specPath, 'utf-8');
135
- const totalTokens = estimateTokens(specContent);
136
-
137
- spinner.info(`Original spec.md: ~${totalTokens.toLocaleString()} tokens`);
138
- logger.blank();
139
-
140
- // Parse into sections
141
- const sections = parseSpec(specContent);
142
-
143
- if (sections.length < 3) {
144
- spinner.warn(`Spec has only ${sections.length} sections - sharding not recommended`);
145
- logger.dim(' Sharding is most beneficial for specs with 5+ sections');
146
- return;
147
- }
148
-
149
- spinner.succeed(`Detected ${sections.length} sections`);
150
- logger.blank();
151
-
152
- // Generate index
153
- const indexContent = generateIndex(sections, feature);
154
-
155
- // Calculate savings
156
- const avgShardTokens = sections.reduce((sum, s) => sum + estimateTokens(s.content), 0) / sections.length;
157
- const savingsPercent = Math.round(((totalTokens - avgShardTokens) / totalTokens) * 100);
158
-
159
- logger.header('Token Savings (selective load):');
160
- logger.info(` ${chalk.green(`~${savingsPercent}%`)} reduction`);
161
- logger.dim(` - Full load: ~${totalTokens.toLocaleString()} tokens`);
162
- logger.dim(` - Selective load: ~${Math.round(avgShardTokens).toLocaleString()} tokens (index + 1 shard)`);
163
- logger.blank();
164
-
165
- if (options.verbose) {
166
- logger.header('Shard Details:');
167
- logger.blank();
168
- sections.forEach((section, i) => {
169
- const tokens = estimateTokens(section.content);
170
- logger.dim(` ${i + 1}. ${section.title}`);
171
- logger.dim(` File: ${section.slug}.md`);
172
- logger.dim(` Tokens: ~${tokens.toLocaleString()}`);
173
- logger.blank();
174
- });
175
- }
176
-
177
- // Output
178
- const outputDir = path.join(process.cwd(), `.morph/project/outputs/${feature}/spec`);
179
-
180
- if (options.dryRun) {
181
- logger.header('DRY RUN - Would create:');
182
- logger.dim(` ${outputDir}/index.md`);
183
- sections.forEach(s => logger.dim(` ${outputDir}/${s.slug}.md`));
184
- logger.blank();
185
- logger.success('Run without --dry-run to create files');
186
- } else {
187
- const createSpinner = ora('Creating sharded spec files...').start();
188
-
189
- // Create directory
190
- await ensureDir(outputDir);
191
-
192
- // Write index
193
- await writeFile(path.join(outputDir, 'index.md'), indexContent);
194
- createSpinner.text = 'Created index.md';
195
-
196
- // Write shards
197
- for (const section of sections) {
198
- const shardPath = path.join(outputDir, `${section.slug}.md`);
199
- await writeFile(shardPath, section.content);
200
- createSpinner.text = `Created ${section.slug}.md`;
201
- }
202
-
203
- createSpinner.succeed('Sharded spec created!');
204
- logger.blank();
205
-
206
- // Archive original spec.md
207
- const archivePath = specPath.replace('.md', '.original.md');
208
- fs.renameSync(specPath, archivePath);
209
- logger.dim(' Archived original: spec.original.md');
210
- logger.blank();
211
-
212
- logger.header('Next steps:');
213
- logger.dim(` 1. Review sharded spec in .morph/project/outputs/${feature}/spec/`);
214
- logger.dim(` 2. Create stories: morph-spec story create ${feature} SR-001`);
215
- logger.dim(' 3. Stories will auto-load only relevant shards (90% token savings)');
216
- logger.blank();
217
- }
218
-
219
- } catch (error) {
220
- spinner.fail('Sharding failed');
221
- logger.error(error.message);
222
- process.exit(1);
223
- }
224
- }
1
+ /**
2
+ * MORPH-SPEC Document Sharding
3
+ * Splits large spec.md files into manageable shards (BMAD-inspired)
4
+ * Achieves 90% token savings by loading only relevant sections
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import ora from 'ora';
10
+ import chalk from 'chalk';
11
+ import { getAbsoluteOutputPath } from '../../core/paths/output-schema.js';
12
+ import { logger } from '../../utils/logger.js';
13
+ import { ensureDir, writeFile } from '../../utils/file-copier.js';
14
+
15
+ // ============================================================================
16
+ // Helper Functions
17
+ // ============================================================================
18
+
19
+ function parseSpec(specContent) {
20
+ const sections = [];
21
+ const lines = specContent.split('\n');
22
+
23
+ let currentSection = null;
24
+ let currentContent = [];
25
+
26
+ for (const line of lines) {
27
+ // Detect level 2 heading (## Heading)
28
+ if (line.match(/^## /)) {
29
+ // Save previous section
30
+ if (currentSection) {
31
+ sections.push({
32
+ title: currentSection,
33
+ slug: toSlug(currentSection),
34
+ content: currentContent.join('\n').trim(),
35
+ });
36
+ }
37
+
38
+ // Start new section
39
+ currentSection = line.replace(/^## /, '').trim();
40
+ currentContent = [line]; // Include heading in content
41
+ } else {
42
+ currentContent.push(line);
43
+ }
44
+ }
45
+
46
+ // Save last section
47
+ if (currentSection) {
48
+ sections.push({
49
+ title: currentSection,
50
+ slug: toSlug(currentSection),
51
+ content: currentContent.join('\n').trim(),
52
+ });
53
+ }
54
+
55
+ return sections;
56
+ }
57
+
58
+ function toSlug(title) {
59
+ return title
60
+ .toLowerCase()
61
+ .replace(/[^a-z0-9]+/g, '-')
62
+ .replace(/^-|-$/g, '');
63
+ }
64
+
65
+ function generateIndex(sections, featureName) {
66
+ let index = `# ${toTitleCase(featureName)} - Technical Specification\n\n`;
67
+ index += `> **Sharded Spec:** This spec has been split into sections for optimal token usage\n`;
68
+ index += `> **BMAD Pattern:** Load only the section you need during implementation\n\n`;
69
+ index += `---\n\n`;
70
+ index += `## 📋 Table of Contents\n\n`;
71
+
72
+ sections.forEach((section, i) => {
73
+ index += `${i + 1}. **[${section.title}](${section.slug}.md)**\n`;
74
+
75
+ // Add first 100 chars as description
76
+ const firstLine = section.content.split('\n').find(l => l.trim() && !l.startsWith('#'));
77
+ const description = firstLine ? firstLine.substring(0, 100) + '...' : 'See section for details';
78
+ index += ` > ${description}\n\n`;
79
+ });
80
+
81
+ index += `---\n\n`;
82
+ index += `## 💡 How to Use Sharded Specs\n\n`;
83
+ index += `### In Planning Phases (1-3)\n`;
84
+ index += `Load **all sections** to get complete context:\n`;
85
+ index += `\`\`\`bash\n`;
86
+ index += `# Read index.md + all section files\n`;
87
+ index += `\`\`\`\n\n`;
88
+
89
+ index += `### In Implementation Phase (4)\n`;
90
+ index += `Load **only the relevant section** for your current story:\n`;
91
+ index += `\`\`\`bash\n`;
92
+ index += `# Example: Working on entity design story\n`;
93
+ index += `# Read: spec/index.md + spec/entity-design.md (not the other 10 sections!)\n`;
94
+ index += `\`\`\`\n\n`;
95
+
96
+ index += `**Token Savings:** For a 10-section spec (30k tokens), selective loading = **90% savings**\n\n`;
97
+ index += `---\n\n`;
98
+ index += `*Generated by MORPH-SPEC Framework - Document Sharding*\n`;
99
+ index += `*Inspired by BMAD Method: 90% token reduction for large specs*\n`;
100
+
101
+ return index;
102
+ }
103
+
104
+ function toTitleCase(str) {
105
+ return str
106
+ .split('-')
107
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
108
+ .join(' ');
109
+ }
110
+
111
+ function estimateTokens(text) {
112
+ // Rough estimate: 1 token ≈ 4 characters
113
+ return Math.ceil(text.length / 4);
114
+ }
115
+
116
+ // ============================================================================
117
+ // Command Function
118
+ // ============================================================================
119
+
120
+ export async function shardSpecCommand(feature, options) {
121
+ logger.header('MORPH-SPEC Document Sharding');
122
+ logger.dim(`Feature: ${feature}`);
123
+ logger.blank();
124
+
125
+ const spinner = ora('Analyzing spec.md...').start();
126
+
127
+ try {
128
+ // Find spec.md
129
+ const specPath = getAbsoluteOutputPath(process.cwd(), feature, 'spec');
130
+ if (!fs.existsSync(specPath)) {
131
+ throw new Error(`Spec not found: ${specPath}`);
132
+ }
133
+
134
+ // Read spec content
135
+ const specContent = fs.readFileSync(specPath, 'utf-8');
136
+ const totalTokens = estimateTokens(specContent);
137
+
138
+ spinner.info(`Original spec.md: ~${totalTokens.toLocaleString()} tokens`);
139
+ logger.blank();
140
+
141
+ // Parse into sections
142
+ const sections = parseSpec(specContent);
143
+
144
+ if (sections.length < 3) {
145
+ spinner.warn(`Spec has only ${sections.length} sections - sharding not recommended`);
146
+ logger.dim(' Sharding is most beneficial for specs with 5+ sections');
147
+ return;
148
+ }
149
+
150
+ spinner.succeed(`Detected ${sections.length} sections`);
151
+ logger.blank();
152
+
153
+ // Generate index
154
+ const indexContent = generateIndex(sections, feature);
155
+
156
+ // Calculate savings
157
+ const avgShardTokens = sections.reduce((sum, s) => sum + estimateTokens(s.content), 0) / sections.length;
158
+ const savingsPercent = Math.round(((totalTokens - avgShardTokens) / totalTokens) * 100);
159
+
160
+ logger.header('Token Savings (selective load):');
161
+ logger.info(` ${chalk.green(`~${savingsPercent}%`)} reduction`);
162
+ logger.dim(` - Full load: ~${totalTokens.toLocaleString()} tokens`);
163
+ logger.dim(` - Selective load: ~${Math.round(avgShardTokens).toLocaleString()} tokens (index + 1 shard)`);
164
+ logger.blank();
165
+
166
+ if (options.verbose) {
167
+ logger.header('Shard Details:');
168
+ logger.blank();
169
+ sections.forEach((section, i) => {
170
+ const tokens = estimateTokens(section.content);
171
+ logger.dim(` ${i + 1}. ${section.title}`);
172
+ logger.dim(` File: ${section.slug}.md`);
173
+ logger.dim(` Tokens: ~${tokens.toLocaleString()}`);
174
+ logger.blank();
175
+ });
176
+ }
177
+
178
+ // Output
179
+ const outputDir = path.join(process.cwd(), `.morph/features/${feature}/1-design/spec`);
180
+
181
+ if (options.dryRun) {
182
+ logger.header('DRY RUN - Would create:');
183
+ logger.dim(` ${outputDir}/index.md`);
184
+ sections.forEach(s => logger.dim(` ${outputDir}/${s.slug}.md`));
185
+ logger.blank();
186
+ logger.success('Run without --dry-run to create files');
187
+ } else {
188
+ const createSpinner = ora('Creating sharded spec files...').start();
189
+
190
+ // Create directory
191
+ await ensureDir(outputDir);
192
+
193
+ // Write index
194
+ await writeFile(path.join(outputDir, 'index.md'), indexContent);
195
+ createSpinner.text = 'Created index.md';
196
+
197
+ // Write shards
198
+ for (const section of sections) {
199
+ const shardPath = path.join(outputDir, `${section.slug}.md`);
200
+ await writeFile(shardPath, section.content);
201
+ createSpinner.text = `Created ${section.slug}.md`;
202
+ }
203
+
204
+ createSpinner.succeed('Sharded spec created!');
205
+ logger.blank();
206
+
207
+ // Archive original spec.md
208
+ const archivePath = specPath.replace('.md', '.original.md');
209
+ fs.renameSync(specPath, archivePath);
210
+ logger.dim(' Archived original: spec.original.md');
211
+ logger.blank();
212
+
213
+ logger.header('Next steps:');
214
+ logger.dim(` 1. Review sharded spec in .morph/features/${feature}/1-design/spec/`);
215
+ logger.dim(` 2. Create stories: morph-spec story create ${feature} SR-001`);
216
+ logger.dim(' 3. Stories will auto-load only relevant shards (90% token savings)');
217
+ logger.blank();
218
+ }
219
+
220
+ } catch (error) {
221
+ spinner.fail('Sharding failed');
222
+ logger.error(error.message);
223
+ process.exit(1);
224
+ }
225
+ }
@@ -15,7 +15,7 @@ import { logger } from '../../utils/logger.js';
15
15
  // ============================================================================
16
16
 
17
17
  function loadSprintStatus(featureName) {
18
- const statusPath = path.join(process.cwd(), `.morph/project/outputs/${featureName}/sprint-status.yaml`);
18
+ const statusPath = path.join(process.cwd(), `.morph/features/${featureName}/sprint-status.yaml`);
19
19
 
20
20
  if (!fs.existsSync(statusPath)) {
21
21
  throw new Error(`Sprint status not found: ${statusPath}\n\n💡 Create a sprint status file first:\n morph-spec story create ${featureName} STORY-001`);
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Generate Onboarding Command
3
+ *
4
+ * Reads project context and renders the onboarding template
5
+ * with detected MCPs, agents, standards, and workflow info.
6
+ */
7
+
8
+ import { join } from 'path';
9
+ import { existsSync, readFileSync, readdirSync } from 'fs';
10
+ import chalk from 'chalk';
11
+ import { logger } from '../../utils/logger.js';
12
+ import { pathExists, readJson, writeFile, ensureDir } from '../../utils/file-copier.js';
13
+ import { getInstalledCLIVersion } from '../../utils/version-checker.js';
14
+
15
+ export async function generateOnboardingCommand(options = {}) {
16
+ const targetPath = process.cwd();
17
+ const configPath = join(targetPath, '.morph', 'config', 'config.json');
18
+ const integrationsPath = join(targetPath, '.morph', 'config', 'integrations.json');
19
+ const agentsPath = join(targetPath, '.morph', 'config', 'agents.json');
20
+
21
+ logger.header('Generating Onboarding Guide');
22
+
23
+ // Load config
24
+ if (!(await pathExists(configPath))) {
25
+ logger.error('Project not initialized. Run "morph-spec init" first.');
26
+ process.exit(1);
27
+ }
28
+
29
+ const config = await readJson(configPath);
30
+ const integrations = await pathExists(integrationsPath) ? await readJson(integrationsPath) : null;
31
+
32
+ // Build template variables
33
+ const projectName = config?.project?.name || 'Unknown Project';
34
+ const stack = config?.project?.stack || config?.project?.architecture || 'not detected';
35
+ const architecture = config?.project?.architecture || 'not detected';
36
+ const version = getInstalledCLIVersion();
37
+ const date = new Date().toISOString().split('T')[0];
38
+
39
+ // Build agents list
40
+ let agentsList = 'No agents configuration found. Run `morph-spec init` to set up.';
41
+ if (await pathExists(agentsPath)) {
42
+ try {
43
+ const agentsConfig = await readJson(agentsPath);
44
+ const agents = agentsConfig.agents || {};
45
+ const lines = [];
46
+ for (const [id, agent] of Object.entries(agents)) {
47
+ const emoji = agent.emoji || '';
48
+ const tier = agent.tier ? `Tier ${agent.tier}` : '';
49
+ lines.push(`- ${emoji} **${agent.name || id}** (${tier}) — ${agent.role || agent.responsibilities?.[0] || ''}`);
50
+ }
51
+ if (lines.length > 0) {
52
+ agentsList = lines.join('\n');
53
+ }
54
+ } catch {
55
+ // Use default
56
+ }
57
+ }
58
+
59
+ // Build MCPs summary
60
+ let availableMcps = 'No MCPs detected. Install MCP servers and run `morph-spec init --force` to detect.';
61
+ if (integrations) {
62
+ const lines = [];
63
+
64
+ if (integrations.plugins?.length > 0) {
65
+ lines.push('**Plugins:**');
66
+ for (const p of integrations.plugins) {
67
+ const ver = p.version ? ` v${p.version}` : '';
68
+ lines.push(`- ${p.name}${ver}`);
69
+ }
70
+ }
71
+
72
+ if (integrations.mcpServers?.length > 0) {
73
+ lines.push('');
74
+ lines.push('**MCP Servers:**');
75
+
76
+ const phaseMap = {
77
+ context7: 'proposal, design, tasks, implement',
78
+ supabase: 'design, implement',
79
+ playwright: 'UI/UX, implement',
80
+ github: 'setup, tasks, implement',
81
+ figma: 'UI/UX'
82
+ };
83
+
84
+ for (const s of integrations.mcpServers) {
85
+ const name = s.name.toLowerCase();
86
+ const phases = Object.entries(phaseMap).find(([k]) => name.includes(k));
87
+ const phaseStr = phases ? ` (phases: ${phases[1]})` : '';
88
+ lines.push(`- **${s.name}** (${s.source})${phaseStr}`);
89
+ }
90
+ }
91
+
92
+ if (integrations.superpowers?.installed) {
93
+ lines.push('');
94
+ lines.push(`**Superpowers:** installed (${integrations.superpowers.skills?.length || 0} skills)`);
95
+ }
96
+
97
+ if (lines.length > 0) {
98
+ availableMcps = lines.join('\n');
99
+ }
100
+ }
101
+
102
+ // Build standards summary
103
+ let standardsSummary = 'Using morph-spec defaults.';
104
+ const standardsDir = join(targetPath, '.morph', 'standards');
105
+ if (existsSync(standardsDir)) {
106
+ try {
107
+ const standards = collectStandards(standardsDir);
108
+ if (standards.length > 0) {
109
+ standardsSummary = standards.map(s => `- ${s}`).join('\n');
110
+ }
111
+ } catch {
112
+ // Use default
113
+ }
114
+ }
115
+
116
+ // Build workflow summary
117
+ const workflowSummary = 'Workflow is **auto-detected** from your feature request. The framework analyzes keywords and complexity to choose the best workflow.';
118
+
119
+ // Read template
120
+ const templatePath = join(import.meta.dirname, '..', '..', '..', 'framework', 'templates', 'docs', 'onboarding.md');
121
+ let template;
122
+ if (existsSync(templatePath)) {
123
+ template = readFileSync(templatePath, 'utf-8');
124
+ } else {
125
+ logger.error('Onboarding template not found.');
126
+ process.exit(1);
127
+ }
128
+
129
+ // Replace placeholders
130
+ let content = template
131
+ .replace(/\{\{PROJECT_NAME\}\}/g, projectName)
132
+ .replace(/\{\{STACK\}\}/g, stack)
133
+ .replace(/\{\{ARCHITECTURE\}\}/g, architecture)
134
+ .replace(/\{\{DATE\}\}/g, date)
135
+ .replace(/\{\{VERSION\}\}/g, version)
136
+ .replace(/\{\{AGENTS_LIST\}\}/g, agentsList)
137
+ .replace(/\{\{AVAILABLE_MCPS\}\}/g, availableMcps)
138
+ .replace(/\{\{STANDARDS_SUMMARY\}\}/g, standardsSummary)
139
+ .replace(/\{\{WORKFLOW_SUMMARY\}\}/g, workflowSummary);
140
+
141
+ // Write output
142
+ const outputDir = join(targetPath, '.morph', 'project', 'outputs');
143
+ await ensureDir(outputDir);
144
+ const outputPath = join(outputDir, 'onboarding.md');
145
+ await writeFile(outputPath, content);
146
+
147
+ logger.success(`Onboarding guide generated: ${outputPath}`);
148
+ logger.dim('Share this file with new team members.');
149
+ }
150
+
151
+ /**
152
+ * Collect standard file names from directory tree
153
+ */
154
+ function collectStandards(dir, prefix = '') {
155
+ const results = [];
156
+ try {
157
+ const entries = readdirSync(dir, { withFileTypes: true });
158
+ for (const entry of entries) {
159
+ if (entry.isDirectory()) {
160
+ results.push(...collectStandards(join(dir, entry.name), `${prefix}${entry.name}/`));
161
+ } else if (entry.name.endsWith('.md') && entry.name !== 'README.md') {
162
+ results.push(`${prefix}${entry.name.replace('.md', '')}`);
163
+ }
164
+ }
165
+ } catch {
166
+ // Permission errors
167
+ }
168
+ return results;
169
+ }
@@ -27,7 +27,7 @@ export async function generateDesignSystemCommand(designSystemPath, options) {
27
27
  logger.dim(' Usage: morph-spec generate design-system <ui-design-system.md>');
28
28
  logger.blank();
29
29
  logger.dim(' Example:');
30
- logger.dim(' morph-spec generate design-system .morph/project/outputs/my-feature/ui-design-system.md');
30
+ logger.dim(' morph-spec generate design-system .morph/features/my-feature/2-ui/design-system.md');
31
31
  process.exit(1);
32
32
  }
33
33
 
@@ -205,7 +205,7 @@ export async function generateMetadataCommand(featureName, options) {
205
205
 
206
206
  // Determine output path
207
207
  const outputPath = options.output ||
208
- join(process.cwd(), `.morph/project/outputs/${featureName}/metadata.json`);
208
+ join(process.cwd(), `.morph/features/${featureName}/metadata.json`);
209
209
 
210
210
  // Write metadata
211
211
  const writeSpinner = ora('Writing metadata.json...').start();