@polymorphism-tech/morph-spec 8.47.0 → 9.1.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 (377) hide show
  1. package/CLAUDE.md +51 -43
  2. package/README.md +39 -38
  3. package/bin/morph-spec.js +41 -113
  4. package/bin/validate.js +1 -147
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/CLAUDE.md +41 -101
  9. package/framework/MORPH.md +95 -252
  10. package/framework/agents.json +86 -21
  11. package/framework/commands/morph-apply.md +5 -28
  12. package/framework/commands/morph-archive.md +1 -1
  13. package/framework/commands/morph-hotfix.md +8 -8
  14. package/framework/commands/morph-infra.md +1 -1
  15. package/framework/commands/morph-preflight.md +2 -3
  16. package/framework/commands/morph-status.md +4 -4
  17. package/framework/docs/CLI.md +574 -286
  18. package/framework/evals/review-checklist.md +82 -41
  19. package/framework/hooks/README.md +10 -11
  20. package/framework/hooks/claude-code/core/block-destructive-worktree-removal.js +6 -49
  21. package/framework/hooks/claude-code/core/block-raw-worktree-add.js +2 -35
  22. package/framework/hooks/claude-code/core/chain.js +4 -65
  23. package/framework/hooks/claude-code/core/comment-guard.js +3 -17
  24. package/framework/hooks/claude-code/core/denylist.json +33 -3
  25. package/framework/hooks/claude-code/core/enforce-phase-writes.js +15 -63
  26. package/framework/hooks/claude-code/core/gate-guard.js +9 -78
  27. package/framework/hooks/claude-code/core/graph-refresh-kick.js +3 -24
  28. package/framework/hooks/claude-code/core/heavy-gate.js +3 -21
  29. package/framework/hooks/claude-code/core/heavy-release.js +2 -13
  30. package/framework/hooks/claude-code/core/loop-detect.js +2 -31
  31. package/framework/hooks/claude-code/core/pre-bash-denylist.js +36 -2
  32. package/framework/hooks/claude-code/core/protect-spec-files.js +25 -297
  33. package/framework/hooks/claude-code/core/state-sync.js +15 -85
  34. package/framework/hooks/claude-code/core/telemetry-log.js +15 -96
  35. package/framework/hooks/claude-code/core/validate-completion.js +37 -147
  36. package/framework/hooks/claude-code/core/warn-bash-source-write.js +23 -0
  37. package/framework/hooks/claude-code/core/worktree-context.js +15 -114
  38. package/framework/hooks/claude-code/core/worktree-create.js +6 -70
  39. package/framework/hooks/claude-code/core/worktree-env-inject.js +5 -56
  40. package/framework/hooks/claude-code/core/worktree-remove.js +5 -31
  41. package/framework/hooks/claude-code/statusline.py +55 -41
  42. package/framework/hooks/package.json +3 -0
  43. package/framework/hooks/shared/activity-logger.js +9 -89
  44. package/framework/hooks/shared/agent-reap.js +2 -17
  45. package/framework/hooks/shared/build-check.js +11 -76
  46. package/framework/hooks/shared/claim-registry.js +9 -119
  47. package/framework/hooks/shared/command-tokens.js +168 -44
  48. package/framework/hooks/shared/comment-rules.js +5 -20
  49. package/framework/hooks/shared/comment-scanner.js +11 -43
  50. package/framework/hooks/shared/comment-stripper.js +11 -85
  51. package/framework/hooks/shared/e2e-check.js +0 -0
  52. package/framework/hooks/shared/errata.js +59 -0
  53. package/framework/hooks/shared/feature-locator.js +11 -95
  54. package/framework/hooks/shared/frontend-locations.js +4 -0
  55. package/framework/hooks/shared/gate-question.js +12 -0
  56. package/framework/hooks/shared/git-exclude.js +3 -20
  57. package/framework/hooks/shared/git-paths.js +8 -104
  58. package/framework/hooks/shared/graph-freshness.js +22 -166
  59. package/framework/hooks/shared/graph-refresh.js +21 -149
  60. package/framework/hooks/shared/heavy-command.js +4 -12
  61. package/framework/hooks/shared/hook-response.js +8 -83
  62. package/framework/hooks/shared/morph-cli.js +8 -52
  63. package/framework/hooks/shared/payload-utils.js +10 -132
  64. package/framework/hooks/shared/phase-utils.js +14 -72
  65. package/framework/hooks/shared/redact-secrets.js +4 -15
  66. package/framework/hooks/shared/reparse-scan.js +6 -66
  67. package/framework/hooks/shared/slice-progress.js +99 -0
  68. package/framework/hooks/shared/source-files.js +4 -17
  69. package/framework/hooks/shared/spawn-command.js +23 -0
  70. package/framework/hooks/shared/state-reader.js +51 -247
  71. package/framework/hooks/shared/state-writer.js +9 -54
  72. package/framework/hooks/shared/stdin-reader.js +1 -11
  73. package/framework/hooks/shared/telemetry-logger.js +7 -67
  74. package/framework/hooks/shared/transcript-usage.js +7 -29
  75. package/framework/hooks/shared/worktree-root.js +7 -29
  76. package/framework/mcp/registry.json +3 -4
  77. package/framework/phases.json +23 -39
  78. package/framework/rules/csharp-standards.md +1 -1
  79. package/framework/rules/frontend-standards.md +1 -0
  80. package/framework/rules/hangfire-standards.md +1 -1
  81. package/framework/rules/neon-standards.md +1 -1
  82. package/framework/schemas/config.schema.json +14 -9
  83. package/framework/schemas/feature.schema.json +15 -50
  84. package/framework/skills/README.md +3 -4
  85. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  86. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  87. package/framework/skills/core/morph-apply/SKILL.md +149 -222
  88. package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
  89. package/framework/skills/core/morph-machine/SKILL.md +2 -2
  90. package/framework/skills/core/morph-media/SKILL.md +1 -1
  91. package/framework/skills/core/morph-plan/SKILL.md +137 -299
  92. package/framework/skills/core/morph-review/SKILL.md +111 -136
  93. package/framework/skills/core/morph-standards/SKILL.md +27 -39
  94. package/framework/skills/core/morph-uiux/SKILL.md +94 -152
  95. package/framework/standards/STANDARDS.json +109 -1219
  96. package/framework/standards/STANDARDS.meta.json +1319 -0
  97. package/framework/standards/ai-agents/agent-archetypes.md +2 -2
  98. package/framework/standards/ai-agents/agent-session.md +1 -1
  99. package/framework/standards/ai-agents/conversational-agent-with-phases.md +4 -4
  100. package/framework/standards/ai-agents/durable-workflows-hitl.md +3 -3
  101. package/framework/standards/ai-agents/evals-with-cache.md +1 -2
  102. package/framework/standards/ai-agents/guardrails.md +1 -1
  103. package/framework/standards/ai-agents/multi-agent-patterns.md +2 -2
  104. package/framework/standards/ai-agents/observability-patterns.md +1 -1
  105. package/framework/standards/ai-agents/production.md +1 -1
  106. package/framework/standards/ai-agents/prompt-sources.md +2 -2
  107. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  108. package/framework/standards/ai-agents/rag-custom-pgvector.md +2 -2
  109. package/framework/standards/ai-agents/setup.md +3 -3
  110. package/framework/standards/ai-agents/sweet-spot.md +2 -2
  111. package/framework/standards/ai-agents/tool-adapters.md +0 -2
  112. package/framework/standards/ai-agents/vector-data-extensions.md +4 -4
  113. package/framework/standards/ai-agents/workflows.md +1 -1
  114. package/framework/standards/architecture/code-comments.md +7 -7
  115. package/framework/standards/architecture/vertical-slice/vertical-slice.md +1 -1
  116. package/framework/standards/backend/api/validation.md +1 -1
  117. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +5 -5
  118. package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +1 -1
  119. package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -2
  120. package/framework/standards/data/nosql/cache/redis.md +1 -1
  121. package/framework/standards/data/nosql/cosmos-db.md +3 -3
  122. package/framework/standards/frontend/admin-app/forms.md +1 -1
  123. package/framework/standards/frontend/design-system/art-direction.md +88 -0
  124. package/framework/standards/frontend/design-system/premium-finish.md +77 -2
  125. package/framework/standards/infrastructure/neon/neon-pgvector.md +5 -5
  126. package/framework/standards/integration/mcp/mcp-tools.md +7 -7
  127. package/framework/templates/CLAUDE.md.core.template +3 -3
  128. package/framework/templates/README.md +2 -3
  129. package/framework/templates/REGISTRY.json +15 -179
  130. package/framework/templates/docs/plan.md +72 -0
  131. package/framework/templates/docs/ui-mockups.md +4 -0
  132. package/framework/templates/dotnet/ai-kit/README.md +1 -9
  133. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
  134. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
  135. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  136. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
  137. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
  138. package/package.json +1 -1
  139. package/src/commands/context/context-refresh.js +0 -16
  140. package/src/commands/dashboard/dashboard.js +2 -8
  141. package/src/commands/e2e/e2e.js +18 -105
  142. package/src/commands/graph/affected.js +0 -14
  143. package/src/commands/graph/build.js +11 -50
  144. package/src/commands/graph/explain.js +0 -16
  145. package/src/commands/graph/status.js +1 -12
  146. package/src/commands/mcp/mcp-setup.js +4 -62
  147. package/src/commands/observability/cost.js +17 -111
  148. package/src/commands/observability/telemetry.js +1 -14
  149. package/src/commands/project/branch.js +4 -45
  150. package/src/commands/project/claim.js +4 -48
  151. package/src/commands/project/doctor-procs.js +1 -1
  152. package/src/commands/project/doctor.js +53 -307
  153. package/src/commands/project/env.js +1 -27
  154. package/src/commands/project/fleet.js +6 -35
  155. package/src/commands/project/heavy.js +3 -3
  156. package/src/commands/project/init.js +8 -68
  157. package/src/commands/project/install-plugin-cmd.js +0 -1
  158. package/src/commands/project/setup-infra-cmd.js +2 -1
  159. package/src/commands/project/stack-scan.js +58 -0
  160. package/src/commands/project/standards.js +65 -72
  161. package/src/commands/project/status.js +28 -121
  162. package/src/commands/project/update.js +31 -223
  163. package/src/commands/project/worktree.js +109 -883
  164. package/src/commands/scaffold/scaffold.js +0 -25
  165. package/src/commands/state/advance.js +65 -120
  166. package/src/commands/state/approve.js +87 -229
  167. package/src/commands/state/archive.js +23 -139
  168. package/src/commands/state/auto-approval.js +65 -0
  169. package/src/commands/state/create.js +49 -109
  170. package/src/commands/state/delete.js +11 -63
  171. package/src/commands/state/finish.js +105 -494
  172. package/src/commands/state/gate-check.js +74 -183
  173. package/src/commands/state/gate-decision.js +8 -42
  174. package/src/commands/state/handoff.js +4 -31
  175. package/src/commands/state/list.js +21 -91
  176. package/src/commands/state/report-check.js +134 -338
  177. package/src/commands/state/retype.js +12 -28
  178. package/src/commands/validation/index.js +0 -3
  179. package/src/commands/validation/mutate.js +79 -19
  180. package/src/commands/validation/plan-check.js +81 -0
  181. package/src/commands/validation/validate-feature.js +52 -216
  182. package/src/commands/validation/verify.js +45 -160
  183. package/src/core/paths/output-schema.js +9 -155
  184. package/src/core/state/feature-identity.js +1 -25
  185. package/src/core/state/gate-order.js +2 -30
  186. package/src/core/state/lifecycle-audit.js +8 -100
  187. package/src/core/state/state-manager.js +32 -395
  188. package/src/core/templates/template-registry.js +2 -97
  189. package/src/core/templates/template-renderer.js +13 -93
  190. package/src/core/templates/template-seed.js +21 -0
  191. package/src/core/work-types.js +10 -45
  192. package/src/dashboard/app/App.jsx +1 -8
  193. package/src/dashboard/app/components/ActivityFeed.jsx +2 -8
  194. package/src/dashboard/app/components/CommandPalette.jsx +4 -11
  195. package/src/dashboard/app/components/DetailPanel.jsx +1 -5
  196. package/src/dashboard/app/components/EntityLink.jsx +0 -12
  197. package/src/dashboard/app/components/ErrorBoundary.jsx +1 -8
  198. package/src/dashboard/app/components/KnowledgeMarkdown.jsx +0 -11
  199. package/src/dashboard/app/components/Markdown.jsx +0 -9
  200. package/src/dashboard/app/components/PhaseRail.jsx +0 -11
  201. package/src/dashboard/app/components/SearchFilter.jsx +0 -4
  202. package/src/dashboard/app/components/Sidebar.jsx +0 -5
  203. package/src/dashboard/app/hooks/useMorphQuery.js +1 -11
  204. package/src/dashboard/app/hooks/usePref.js +1 -5
  205. package/src/dashboard/app/lib/format.js +0 -2
  206. package/src/dashboard/app/lib/phases.js +3 -9
  207. package/src/dashboard/app/lib/project.js +0 -12
  208. package/src/dashboard/app/pages/Activity.jsx +1 -1
  209. package/src/dashboard/app/pages/AgentMap.jsx +1 -8
  210. package/src/dashboard/app/pages/FeatureDetail.jsx +139 -133
  211. package/src/dashboard/app/pages/Features.jsx +9 -16
  212. package/src/dashboard/app/pages/Guide.jsx +2 -3
  213. package/src/dashboard/app/pages/HookInspector.jsx +2 -23
  214. package/src/dashboard/app/pages/PhasePipeline.jsx +3 -7
  215. package/src/dashboard/app/pages/Portfolio.jsx +0 -1
  216. package/src/dashboard/app/pages/RulesMap.jsx +1 -16
  217. package/src/dashboard/app/pages/SkillsLibrary.jsx +1 -16
  218. package/src/dashboard/app/pages/Standards.jsx +2 -17
  219. package/src/dashboard/scanner/activity-scanner.js +14 -83
  220. package/src/dashboard/scanner/agents-scanner.js +1 -23
  221. package/src/dashboard/scanner/docs-scanner.js +1 -7
  222. package/src/dashboard/scanner/feature-status.js +2 -5
  223. package/src/dashboard/scanner/features-scanner.js +92 -113
  224. package/src/dashboard/scanner/hooks-scanner.js +5 -28
  225. package/src/dashboard/scanner/index.js +0 -4
  226. package/src/dashboard/scanner/portfolio.js +5 -29
  227. package/src/dashboard/scanner/project-api.js +8 -54
  228. package/src/dashboard/scanner/rules-scanner.js +1 -2
  229. package/src/dashboard/scanner/skills-scanner.js +2 -12
  230. package/src/dashboard/scanner/standards-scanner.js +4 -7
  231. package/src/dashboard/vite-plugin-morph-data.js +5 -19
  232. package/src/lib/ai/ai-checks.js +7 -52
  233. package/src/lib/ai/ai-project-scan.js +14 -108
  234. package/src/lib/ai/code-audit.js +7 -63
  235. package/src/lib/ai/pin-drift.js +8 -51
  236. package/src/lib/ai/registry-audit.js +11 -90
  237. package/src/lib/ci/ci-verify.js +14 -13
  238. package/src/lib/ci/github-ci.js +9 -37
  239. package/src/lib/ci/workflow-scaffold.js +2 -10
  240. package/src/lib/detectors/claude-config-detector.js +13 -74
  241. package/src/lib/detectors/index.js +8 -59
  242. package/src/lib/e2e/compose-env.js +5 -66
  243. package/src/lib/e2e/stack-teardown.js +6 -40
  244. package/src/lib/generators/architecture-scanner.js +18 -156
  245. package/src/lib/generators/handoff-generator.js +37 -112
  246. package/src/lib/generators/scaffold-generator.js +5 -101
  247. package/src/lib/generators/settings-generator.js +11 -122
  248. package/src/lib/git/branch-classifier.js +11 -84
  249. package/src/lib/git/default-branch.js +14 -169
  250. package/src/lib/git/evidence-staleness.js +2 -1
  251. package/src/lib/git/gh.js +2 -17
  252. package/src/lib/git/pending-prs.js +6 -37
  253. package/src/lib/git/pr-files.js +3 -28
  254. package/src/lib/git/pr-index.js +3 -34
  255. package/src/lib/git/tree-fingerprint.js +17 -17
  256. package/src/lib/git/tree-state.js +6 -33
  257. package/src/lib/graph/god-nodes.js +2 -22
  258. package/src/lib/graph/graph-health.js +3 -24
  259. package/src/lib/graph/graph-loader.js +5 -56
  260. package/src/lib/graph/graphify-runtime.js +7 -37
  261. package/src/lib/graph/graphifyignore.js +8 -74
  262. package/src/lib/graph/sanitize.js +16 -136
  263. package/src/lib/heavy/cleanup.js +2 -6
  264. package/src/lib/installers/effects.js +8 -93
  265. package/src/lib/installers/mcp-installer.js +9 -169
  266. package/src/lib/installers/memory-installer.js +8 -33
  267. package/src/lib/installers/templates-reconcile.js +5 -60
  268. package/src/lib/mutation/commands.js +3 -2
  269. package/src/lib/mutation/dotnet-introspection.js +281 -0
  270. package/src/lib/mutation/plan.js +14 -6
  271. package/src/lib/mutation/runner.js +1 -1
  272. package/src/lib/mutation/subset.js +47 -13
  273. package/src/lib/plan/artifact-vocabulary.js +40 -0
  274. package/src/lib/plan/checks.js +208 -0
  275. package/src/lib/plan/plan-parser.js +204 -0
  276. package/src/lib/plan/plan-template.js +18 -0
  277. package/src/lib/projects/registry.js +7 -44
  278. package/src/lib/review-reports.js +204 -0
  279. package/src/lib/risk-detector.js +131 -274
  280. package/src/lib/specs/adr-index.js +38 -85
  281. package/src/lib/specs/design-seed.js +18 -0
  282. package/src/lib/specs/frontmatter.js +31 -0
  283. package/src/lib/specs/gfm-table.js +11 -0
  284. package/src/lib/specs/revocations.js +31 -102
  285. package/src/lib/specs/screen-checklist.js +56 -132
  286. package/src/lib/stack/dotnet-build-ignores.js +43 -0
  287. package/src/lib/stack/stack-profile.js +1 -28
  288. package/src/lib/stack/stack-scan.js +260 -0
  289. package/src/lib/stack-filter.js +4 -27
  290. package/src/lib/standards/registry.js +37 -0
  291. package/src/lib/standards/sections.js +47 -0
  292. package/src/lib/standards/verified-against.js +19 -191
  293. package/src/lib/tasks/eval-node.js +23 -179
  294. package/src/lib/tasks/linux-runner.js +18 -142
  295. package/src/lib/tasks/test-nodes.js +43 -313
  296. package/src/lib/tasks/test-runner.js +107 -447
  297. package/src/lib/telemetry/metrics.js +13 -103
  298. package/src/lib/telemetry/telemetry-reader.js +13 -238
  299. package/src/lib/telemetry/verify-event.js +4 -34
  300. package/src/lib/validators/code-budget/code-budget-validator.js +4 -44
  301. package/src/lib/validators/code-budget/index.js +0 -7
  302. package/src/lib/validators/contracts/contract-compliance-validator.js +4 -26
  303. package/src/lib/validators/contracts/index.js +0 -6
  304. package/src/lib/validators/nextjs/index.js +0 -5
  305. package/src/lib/validators/nextjs/next-component-validator.js +4 -81
  306. package/src/lib/validators/packages/index.js +0 -6
  307. package/src/lib/validators/packages/package-validator.js +6 -56
  308. package/src/lib/validators/reuse/index.js +0 -8
  309. package/src/lib/validators/reuse/reuse-validator.js +24 -137
  310. package/src/lib/validators/reuse/symbol-scanner.js +6 -62
  311. package/src/lib/validators/traceability-check.js +54 -156
  312. package/src/lib/validators/validation-runner.js +20 -125
  313. package/src/lib/validators/verify-runner.js +152 -575
  314. package/src/lib/work-type-detector.js +5 -67
  315. package/src/lib/worktree/docker-audit.js +17 -137
  316. package/src/lib/worktree/env-allocator.js +10 -98
  317. package/src/lib/worktree/feature-truth.js +12 -115
  318. package/src/lib/worktree/finish-backup.js +32 -242
  319. package/src/lib/worktree/fleet-scanner.js +31 -126
  320. package/src/lib/worktree/ignored-triage.js +15 -91
  321. package/src/lib/worktree/vscode-settings.js +2 -3
  322. package/src/lib/worktree/worktree-audit.js +21 -213
  323. package/src/lib/worktree/worktree-include.js +3 -5
  324. package/src/scripts/global-install.js +3 -9
  325. package/src/scripts/install-plugin.js +1 -13
  326. package/src/scripts/setup-infra.js +17 -138
  327. package/src/utils/agents-installer.js +92 -272
  328. package/src/utils/banner.js +4 -25
  329. package/src/utils/claude-md-injector.js +1 -37
  330. package/src/utils/claude-settings-manager.js +1 -87
  331. package/src/utils/file-copier.js +32 -90
  332. package/src/utils/hooks-installer.js +26 -296
  333. package/src/utils/skills-installer.js +4 -102
  334. package/src/utils/version-checker.js +4 -83
  335. package/framework/commands/morph-proposal.md +0 -57
  336. package/framework/evals/trace-schema.md +0 -67
  337. package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
  338. package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
  339. package/framework/hooks/git/pre-commit/specs.sh +0 -50
  340. package/framework/hooks/shared/tasks-validator.js +0 -111
  341. package/framework/rules/morph-task-tracking.md +0 -54
  342. package/framework/rules/morph-workflow.md +0 -244
  343. package/framework/schemas/tasks.schema.json +0 -79
  344. package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
  345. package/framework/skills/core/morph-implement/SKILL.md +0 -194
  346. package/framework/skills/core/morph-proposal/SKILL.md +0 -152
  347. package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
  348. package/framework/templates/docs/proposal.md +0 -192
  349. package/framework/templates/docs/spec.md +0 -57
  350. package/framework/templates/docs/ui-components.md +0 -52
  351. package/framework/templates/docs/ui-design-system.md +0 -76
  352. package/framework/templates/docs/ui-flows.md +0 -167
  353. package/framework/templates/examples/spec-examples.md +0 -91
  354. package/framework/templates/feature/decisions.md +0 -124
  355. package/framework/templates/feature/recap.md +0 -145
  356. package/framework/templates/tasks.template.json +0 -17
  357. package/src/commands/state/usecase.js +0 -143
  358. package/src/commands/tasks/dag.js +0 -181
  359. package/src/commands/utils/index.js +0 -3
  360. package/src/lib/agents/output-collector.js +0 -76
  361. package/src/lib/detectors/design-system-detector.js +0 -188
  362. package/src/lib/evaluator-report.js +0 -104
  363. package/src/lib/generators/design-system-generator.js +0 -508
  364. package/src/lib/specs/acervo-format.js +0 -70
  365. package/src/lib/specs/acervo-lifecycle.js +0 -264
  366. package/src/lib/specs/done-criteria-check.js +0 -200
  367. package/src/lib/specs/usecase-check.js +0 -301
  368. package/src/lib/specs/usecase-promoter.js +0 -301
  369. package/src/lib/specs/usecase-registry.js +0 -237
  370. package/src/lib/tasks/dispatch-planner.js +0 -319
  371. package/src/lib/tasks/dotnet-test-introspection.js +0 -632
  372. package/src/lib/tasks/mermaid-renderer.js +0 -132
  373. package/src/lib/tasks/task-classifier.js +0 -30
  374. package/src/lib/tasks/task-parser.js +0 -209
  375. package/src/lib/tasks/tasks-json-parser.js +0 -296
  376. package/src/lib/tasks/test-scope.js +0 -597
  377. package/src/utils/agent-id-mapper.js +0 -11
@@ -1,44 +1,16 @@
1
- /**
2
- * Gate monotonicity — single source of truth.
3
- *
4
- * A gate may only be approved once its predecessors are approved. The strict
5
- * chain is proposal → plan → review. uiux is optional: it requires proposal but
6
- * gates nothing downstream, so a feature that skips UI/UX is never blocked.
7
- *
8
- * Policy-stamped gates (approvedBy: "policy:{type}", written at birth by
9
- * `morph-spec create` for a work type's skippedGates) count as approved, so
10
- * chore/hotfix (proposal+plan pre-stamped) satisfy prereqs naturally.
11
- *
12
- * Pure module — no filesystem/CLI side effects. Consumed by
13
- * `approve`/`advance` (refuse), the state-sync hook (warn), and `list`/`doctor`
14
- * (report).
15
- */
16
-
17
1
  export const GATE_PREREQ = {
18
- proposal: [],
19
- uiux: ['proposal'],
20
- plan: ['proposal'],
2
+ plan: [],
3
+ uiux: ['plan'],
21
4
  review: ['plan'],
22
5
  };
23
6
 
24
7
  const isApproved = (gates, name) => gates?.[name]?.approved === true;
25
8
 
26
- /**
27
- * Prerequisite gates NOT yet approved that block approving `gate`.
28
- * @param {string} gate - gate about to be approved
29
- * @param {object} gates - feature.approvalGates
30
- * @returns {string[]} unmet prerequisite gate names (empty = clear to approve)
31
- */
32
9
  export function unmetPrereqs(gate, gates) {
33
10
  const prereqs = GATE_PREREQ[gate] || [];
34
11
  return prereqs.filter((p) => !isApproved(gates, p));
35
12
  }
36
13
 
37
- /**
38
- * All monotonicity violations currently present in a feature's gates.
39
- * @param {object} gates - feature.approvalGates
40
- * @returns {Array<{gate: string, missing: string[]}>} empty when in order
41
- */
42
14
  export function gateOrderViolations(gates) {
43
15
  if (!gates || typeof gates !== 'object') return [];
44
16
  const out = [];
@@ -1,23 +1,3 @@
1
- /**
2
- * Feature-lifecycle audit — the consolidated inconsistency scanner behind
3
- * `morph-spec doctor`. Read-only, non-throwing: scans `.morph/features/*` and
4
- * the thin root index and reports what's already wrong in the repo, without
5
- * touching state (never calls loadState — a diagnostic must not mutate).
6
- *
7
- * Issue types:
8
- * • gate-order — a gate approved with a predecessor pending (item 4)
9
- * • identity — a feature missing description/name/createdAt (item 3)
10
- * • orphan-folder — a feature folder with no feature.json
11
- * • stale-index — a root-index entry with no feature folder (auto-heals on
12
- * the next loadState, but surfaced so it's not a mystery)
13
- * • branch-drift — the root's copy of a feature.json disagrees with the copy
14
- * committed on `morph/{f}` (B5 — the root's view lags)
15
- * • abandoned-scaffold — an `in_progress` feature that never produced
16
- * anything: no artifacts, no approved gate, and a branch
17
- * with no commit of its own (see abandonedScaffold)
18
- * • corrupt — a feature.json that won't parse
19
- */
20
-
21
1
  import { execFileSync } from 'child_process';
22
2
  import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
23
3
  import { join } from 'path';
@@ -26,40 +6,19 @@ import { missingIdentity } from './feature-identity.js';
26
6
  import { detectDefaultBranch } from '../../lib/git/default-branch.js';
27
7
  import { commitsAhead, resolveBaseRef } from '../../lib/git/branch-classifier.js';
28
8
 
29
- /** The operational truth of a feature.json: its status and which gates are approved. */
30
9
  function operationalShape(fj) {
31
10
  const gates = {};
32
11
  for (const [g, v] of Object.entries(fj?.approvalGates || {})) gates[g] = v?.approved === true;
33
12
  return JSON.stringify({ status: fj?.status ?? null, gates });
34
13
  }
35
14
 
36
- /**
37
- * Does the root's working-tree copy of a feature.json disagree with the copy
38
- * COMMITTED on that feature's own branch?
39
- *
40
- * `.morph/state.json` is gitignored and derived, and every worktree keeps its
41
- * own — so "the index diverges between worktrees" is by design, not a defect to
42
- * fix by making the index authoritative (that would undo the whole per-feature
43
- * state model). The defect is that the divergence was INVISIBLE: since v8.4 the
44
- * authoritative feature.json travels committed on `morph/{f}`, so a primary root
45
- * parked on the default holds a copy that silently lags, and everything derived
46
- * from it (status, gates, and the index rebuilt from it) lags with it.
47
- *
48
- * Comparison is on the OPERATIONAL fields only — status and approved-gate flags
49
- * — not on bytes: reformatting or a timestamp bump is not a divergence anyone
50
- * needs to hear about.
51
- *
52
- * Fail-open at every step: no repo, no branch, no blob, unparseable JSON → no
53
- * issue. A diagnostic that invents problems is worse than one that misses some.
54
- *
55
- * @returns {string|null} the issue detail, or null when the copies agree
56
- */
15
+ // Compares only status and approved gates (bytes and timestamps are not drift).
16
+ // Fail-open: no repo, branch, blob or parseable JSON means no issue.
57
17
  function branchDrift(baseDir, feature, rootFj) {
58
18
  const branch = `morph/${feature}`;
59
19
  try {
60
20
  const current = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: baseDir, stdio: 'pipe' })
61
21
  .toString().trim();
62
- // On the feature's own branch the working tree IS the branch — nothing to compare.
63
22
  if (current === branch) return null;
64
23
 
65
24
  execFileSync('git', ['show-ref', '--verify', '--quiet', `refs/heads/${branch}`], { cwd: baseDir, stdio: 'pipe' });
@@ -77,18 +36,9 @@ function branchDrift(baseDir, feature, rootFj) {
77
36
  }
78
37
  }
79
38
 
80
- /**
81
- * How long a scaffold has to sit untouched before it counts as abandoned.
82
- *
83
- * A dead scaffold and a feature born five minutes ago have the SAME shape:
84
- * `create` forks `morph/{f}` off the default branch without committing, so at
85
- * birth the branch has no commit of its own and the folder holds nothing but
86
- * `feature.json`. Only elapsed time separates the two — and a check that fires
87
- * on every fresh `create` is one people learn to scroll past.
88
- */
39
+ // A dead scaffold and a feature born minutes ago have the same shape; only age tells them apart.
89
40
  const ABANDONED_SCAFFOLD_MIN_AGE_MS = 24 * 60 * 60 * 1000;
90
41
 
91
- /** Newest timestamp the feature carries, in ms; falls back to the folder's mtime. */
92
42
  function lastTouched(fdir, fj) {
93
43
  let newest = 0;
94
44
  for (const ts of [fj?.updatedAt, fj?.createdAt]) {
@@ -99,12 +49,7 @@ function lastTouched(fdir, fj) {
99
49
  try { return statSync(fdir).mtimeMs; } catch { return 0; }
100
50
  }
101
51
 
102
- /**
103
- * Does the feature dir hold any FILE other than its own `feature.json`?
104
- *
105
- * Files, not entries: `create` scaffolds the phase folders empty, so an empty
106
- * `0-proposal/` is the absence of work, not evidence of it.
107
- */
52
+ // Files, not entries: `create` scaffolds the phase folders empty.
108
53
  function hasArtifacts(fdir) {
109
54
  let entries;
110
55
  try { entries = readdirSync(fdir, { withFileTypes: true }); } catch { return false; }
@@ -119,22 +64,7 @@ function hasArtifacts(fdir) {
119
64
  return false;
120
65
  }
121
66
 
122
- /**
123
- * Commits on the feature's branch that the base does not already contain, or
124
- * `null` when git cannot answer (no repo, no resolvable base, no branch, no
125
- * rev-list). "Cannot prove" must never read as "proved zero" — the predicate
126
- * below hinges on this number, so an unanswerable repo has to stay silent.
127
- *
128
- * The counting itself is `branch-classifier.js`'s `commitsAhead` against its
129
- * `resolveBaseRef`, NOT a second copy: `origin/{default}` is the authority on
130
- * what actually landed, and two drifting answers to "does this branch carry
131
- * anything of its own?" is exactly what the `doctor`/`branch prune` split was
132
- * unified to avoid.
133
- *
134
- * Note the field evidence this exists for: the branch pointed at the merge
135
- * commit of somebody else's PR. That is the base's own tip — reachable from
136
- * the base, and therefore zero commits of its own.
137
- */
67
+ // `null` when git cannot answer: "cannot prove" must never read as "proved zero".
138
68
  function ownCommitCount(baseDir, branch) {
139
69
  try {
140
70
  execFileSync('git', ['rev-parse', '--git-dir'], { cwd: baseDir, stdio: 'pipe' });
@@ -146,31 +76,15 @@ function ownCommitCount(baseDir, branch) {
146
76
  try {
147
77
  execFileSync('git', ['show-ref', '--verify', '--quiet', `refs/heads/${branch}`], { cwd: baseDir, stdio: 'pipe' });
148
78
  } catch {
149
- return 0; // the branch never existed — nothing was ever committed for it
79
+ return 0; // the branch never existed: nothing was committed on it
150
80
  }
151
81
  return commitsAhead(baseRef, branch, baseDir);
152
82
  }
153
83
 
154
- /**
155
- * The orphan skeleton `create --worktree` can leave behind: a feature.json on
156
- * its own, `status: in_progress`, no tasks, no gates, and a branch parked on
157
- * somebody else's commit. Every one of those alone is normal at some point in
158
- * a feature's life; together, and only after the feature has gone stale, they
159
- * mean nobody ever came back to it.
160
- *
161
- * The artifact test is deliberately broader than the "0 tasks" the report
162
- * named: a proposal drafted and waiting on Gate 1 also has zero tasks and is
163
- * very much alive. What a dead scaffold has is NOTHING — checked in the root
164
- * and, if the feature registered one, in its worktree, where uncommitted work
165
- * would otherwise be invisible to both the disk scan and `rev-list`.
166
- *
167
- * @returns {string|null} the issue detail, or null when the feature is alive
168
- */
169
84
  function abandonedScaffold(baseDir, feature, fdir, fj) {
170
85
  if (fj?.status !== 'in_progress') return null;
171
86
 
172
- // "0 gates": a gate stamped `policy:{workType}` at birth (chore/hotfix) was
173
- // never a decision anyone took, so it must not read as progress.
87
+ // A gate stamped `policy:{workType}` at birth was never a decision, so it is not progress.
174
88
  const decided = Object.values(fj.approvalGates || {}).some(
175
89
  (g) => g?.approved === true && !String(g?.approvedBy ?? '').startsWith('policy:'),
176
90
  );
@@ -185,8 +99,6 @@ function abandonedScaffold(baseDir, feature, fdir, fj) {
185
99
  const age = Date.now() - lastTouched(fdir, fj);
186
100
  if (age < ABANDONED_SCAFFOLD_MIN_AGE_MS) return null;
187
101
 
188
- // The registered branch when the feature has one, `morph/{f}` otherwise —
189
- // same name `branchDrift` above assumes.
190
102
  const branch = fj.worktree?.branch || `morph/${feature}`;
191
103
  if (ownCommitCount(baseDir, branch) !== 0) return null;
192
104
 
@@ -196,10 +108,6 @@ function abandonedScaffold(baseDir, feature, fdir, fj) {
196
108
  + 'ou retome a feature';
197
109
  }
198
110
 
199
- /**
200
- * @param {string} [baseDir] - project root (defaults to cwd)
201
- * @returns {Array<{ feature: string, type: string, detail: string }>} issues
202
- */
203
111
  export function auditFeatureLifecycle(baseDir = process.cwd()) {
204
112
  const issues = [];
205
113
  const featuresDir = join(baseDir, '.morph', 'features');
@@ -256,7 +164,7 @@ export function auditFeatureLifecycle(baseDir = process.cwd()) {
256
164
  issues.push({ feature: name, type: 'stale-index', detail: 'in state.json index but no feature folder' });
257
165
  }
258
166
  }
259
- } catch { /* index is derivable — non-fatal */ }
167
+ } catch { }
260
168
  }
261
169
 
262
170
  return issues;