@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,194 +0,0 @@
1
- ---
2
- name: morph-implement
3
- description: Guia a execução de cada tarefa de implementação com standard e persona adequados
4
- version: core
5
- when_to_use: Use quando for iniciar cada task de implementação listada em tasks.json
6
- user-invocable: false
7
- cliVersion: "8.47.0"
8
- ---
9
-
10
- # morph-implement
11
-
12
- ## Objetivo
13
- Executar uma task com o standard e a persona certos, até o `doneCriteria` valer e o
14
- `verify` da task ficar verde, e registrar o resultado no recap.
15
-
16
- ## Quando invocar
17
- Ao iniciar cada task de `tasks.json`, antes de escrever código. Normalmente chamada pela
18
- `morph-apply`, que passa a task atual.
19
-
20
- ## O que fazer
21
-
22
- 1. **Contexto, uma vez por sessão.** Na primeira task da sessão (ou depois de um `/compact`), Read
23
- em `2-plan/spec.md`, nos use cases que a task referencia (`2-plan/usecases/UC-*.md`) e em
24
- `2-plan/decisions.md`. Nas tasks seguintes, **não releia por padrão**: o contrato do plano está
25
- congelado desde o Gate 2. Releia só o trecho que falta para a task corrente.
26
-
27
- **Correção** (a `morph-apply` devolveu a task com o `feedback` do verify vermelho ou com critério
28
- não atendido): corrija esses pontos no código existente — não reimplemente.
29
-
30
- 2. **Standard.** `morph-spec standards --find "<domínio da task>"` devolve `id · path · digest`.
31
- O digest decide; Read só no `.md` escolhido. Task MAF: os `standards/ai-agents/*.md` relevantes
32
- valem mesmo com docs externas consultadas. Nenhum standard cobre: registre em `decisions.md` e
33
- siga o critério mais conservador.
34
-
35
- 3. **Persona.** `task.agent` e `task.standards` (carimbados pelo `morph-plan`). Plano legado sem
36
- `agent`: Read em `.morph/framework/agents.json` e escolha por `domains`. O `**Persona:**` do recap
37
- registra o mecanismo real: `morph-{id}`, `general-purpose (fallback: {id})` ou `inline ({id})`.
38
-
39
- 4. **Despachar ou não.** Despache (`subagent_type: "morph-{id}"`) quando a task muda de domínio,
40
- tem effort L/XL, já falhou 3 correções no mesmo ponto, exige ler arquivo > 500 linhas, ou repete
41
- um padrão > 3 vezes. Inline só para S/M no domínio já carregado. O DAG da `morph-apply` decide
42
- quantas tasks rodam ao mesmo tempo; este passo decide quem executa cada uma.
43
-
44
- Tipo `morph-{id}` não registrado: `general-purpose` com o campo `persona` colado no prompt, e
45
- `dispatch-fallback: general-purpose ({id} não registrado)` nas `notes` da task.
46
- Template do prompt para `subagent_type: "morph-{id}"` — cole literal, só os campos entre colchetes mudam:
47
- ```
48
- Implementar [ID]: [title da task]
49
-
50
- Spec: [description completa do tasks.json]
51
- Standards: [por standard: `id` + o digest do `standards --find` + as 3-8 regras
52
- do .md que ESTA task aplica, coladas. O path vai junto só para consulta
53
- pontual — o sub-agente não relê standards inteiros]
54
- Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
55
- — é por aqui que o código existente chega ao sub-agente, que trabalha em
56
- contexto fresco. O que você já leu entra como `arquivo:linhas` + o trecho]
57
- Reuso: [task.reuse — `CONCEITO: VEREDITO → alvo`, uma linha por conceito]
58
- Done quando: [doneCriteria do tasks.json]
59
-
60
- Antes de criar tipo, componente, hook ou serviço NOVO, verifique se já
61
- existe: `morph-spec graph explain <nome>` e `graph affected <conceito>
62
- --uses-only`. Sem grafo (`no-graph`), caia para `grep -rn "<nome>"` e siga —
63
- a ausência de grafo nunca bloqueia. Se algo cobre o caso, reuse ou estenda;
64
- se criar mesmo assim, diga por que em uma linha no relatório.
65
-
66
- Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
67
- turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
68
- turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
69
- Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
70
- `ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
71
- acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
72
- se lê pelo `Grep` do erro, não inteiro.
73
-
74
- Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
75
- shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
76
- `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
77
- (`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
78
- (`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
79
-
80
- Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
81
- `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
82
- da task. Só o porquê que o código não mostra, em uma linha
83
- (`architecture-code-comments`). O elo com a pós-condição vai no nome do
84
- teste. O hook `comment-guard` bloqueia a edição que adiciona história,
85
- banner ou bloco longo.
86
-
87
- Contrato do relatório final:
88
- 1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
89
- encerrar — é o retorno autoritativo, não a sua mensagem final. NÃO chame
90
- SendMessage.
91
- 2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
92
- — todo estado é gravado exclusivamente pelo orquestrador.
93
- 3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
94
- logo depois do seu retorno), não sua. Escreva os testes pelo orçamento:
95
- um por pós-condição, um de regressão por bug, variantes numa tabela
96
- (`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
97
- red→green: escreva código e testes, compile, e rode SÓ o filtro dos seus
98
- testes UMA vez, em primeiro plano, antes do relatório; se falhar, corrija e rode só os que falharam. Grave a
99
- saída em arquivo (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
100
- e leia o arquivo — um pipe troca o exit do teste pelo do último comando.
101
- Em batch paralelo SEM isolamento, só compile. Com `isolation: "worktree"`,
102
- o mesmo vale no seu worktree, e o último ato é o commit na branch dele.
103
- 4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
104
- volta — fatie antes, não depois.
105
- 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
106
- corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
107
- uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
108
- (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
109
- A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
110
- na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
111
- siga ou pare, por decisão sua; o relatório final substitui o parcial.
112
- 6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
113
- sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
114
- suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
115
- plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
116
- nem espere em laço — diga no relatório o que não rodou.
117
- 7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
118
- substituto do relatório e não deve ser chamado.
119
- 8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
120
- um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
121
- checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
122
-
123
- Formato do relatório:
124
- (1) o que foi feito, em 2-3 frases;
125
- **Arquivos:** um item `- \`path\`` por arquivo criado ou modificado;
126
- **Critérios:** cada doneCriteria — atendido (o teste ou `arquivo:linha` que o
127
- prova) ou não atendido (por quê);
128
- (4) problemas encontrados e como foram resolvidos.
129
- ```
130
- **Passo pós-dispatch (seu, ao retomar o controle):** `morph-spec report-check {feature} {taskId} --json`. O veredito do
131
- relatório e o bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostram o disco que o agente
132
- deixou. Árvore suja sem explicação ou `markers` não vazio: registre no recap. Com
133
- `isolation: "worktree"`, depois de ler o relatório rode `morph-spec worktree reap --json`.
134
-
135
- **Leia `3-implement/reports/[ID].md`** — a mensagem de texto do agente é atalho, nunca a fonte.
136
- Arquivo ausente é falha de protocolo: registre e complete a partir do que ficou no disco.
137
-
138
- **`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
139
- Retome o MESMO agente por `SendMessage`,
140
- colando `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do
141
- último `wip`. Nunca marque `done` sobre um parcial.
142
-
143
- 5. **Implementação inline.** Siga o standard e a persona. Ambiguidade não coberta pelo plano:
144
- registre em `decisions.md` e resolva pelo lado conservador, sem pausar. Testes: as cláusulas 3 e 8
145
- do template valem para você também.
146
-
147
- **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM): rode o
148
- eval antes do `done`, e só ele. Com nó `runner: "evals"`:
149
- `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist` — escopo de
150
- feature porque no de task o nó `evals` é pulado; `--skip-e2e` porque o stack subiria;
151
- `--no-persist` porque esta execução é sonda, não prova de gate. Sem nó `evals`, rode o eval direto
152
- e registre "nenhum nó — execução manual". O arquivo traz: o critério (literal), o nó e o cenário,
153
- o modelo efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado
154
- pessoal, e o veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o agente fez; este
155
- prova, rodando, que a saída atende ao critério.
156
-
157
- 6. **Recap.** Append em `3-implement/recap.md`:
158
- ```markdown
159
- ## T{N} — {title}
160
-
161
- **Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
162
- **Persona:** {`morph-{id}` | `general-purpose (fallback: {id})` | `inline ({id})`}
163
- **Files:**
164
- - `{path}`
165
-
166
- {2-3 frases}
167
- ```
168
- Sem standard que cubra: `Standard: ad-hoc (see decisions.md ADR-{N})`. O `validate-completion`
169
- cobra o bloco.
170
-
171
- 7. **Audite antes do `done`:** `morph-spec report-check {feature} {taskId} --json`. `report-stale` =
172
- relatório completo e velho (a task seguiu escrevendo depois dele): **não re-despache** — leia
173
- `observed` (escritas reais, do `events.jsonl`) e atualize o relatório. Demais vereditos:
174
- `MORPH.md` §6.
175
-
176
- 8. Atualizar `tasks.json` marcando a task como `done` (Edit, só campos mutáveis):
177
- - `status`: `pending` | `in_progress` | `done` | `skipped` | `blocked`.
178
- - `outputs` DEVE listar TODO arquivo criado ou modificado pela task, inclusive artefato auxiliar
179
- fora do plano (factory, seed, config gerada). Arquivo em produção sem dono em `outputs` é falha de
180
- protocolo que o Gate 3 aponta. Deleções vão em `notes` (string única), nunca em `outputs`.
181
- - Divergiu do planejado: o porquê em `notes` na mesma edição — o hook exige.
182
-
183
- 9. Quando invocada por `morph-apply`, devolva o controle a ela e não rode a suíte do projeto: o `verify {feature} {task}` é do orquestrador. **Única exceção:** a execução de evidência do passo 5, filtrada ao nó `evals`, com `--skip-e2e` e `--no-persist`. No loop por task o recorte é automático (o `group` escolhe as suítes, os testes de `outputs` estreitam o comando; `--filter` só força a escolha de suítes, `--full` desliga o recorte); a suíte inteira roda no Gate 3 e no CI, sem filtro. Invocada manualmente: siga para a próxima task ready.
184
-
185
- ## Output esperado
186
- - Código conforme o standard; `3-implement/reports/{taskId}.md` quando despachada
187
- - `3-implement/evidencias/{taskId}.md` na task que o lista em `outputs`
188
- - `recap.md` com o bloco da task; `tasks.json` com a task `done`
189
- - `decisions.md` quando houve decisão não trivial
190
-
191
- ## Referências
192
- - `morph-spec standards --find` — passo 2
193
- - `.morph/framework/MORPH.md` §6 — dispatch e contrato do relatório
194
- - `.morph/framework/CLI.md`, seção "Suítes de teste" — recorte por task
@@ -1,152 +0,0 @@
1
- ---
2
- name: morph-proposal
3
- description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encadeia morph-brainstorming (Gate 1) e morph-plan (Gate 2). Em trust:auto pula gates sem sinais de risco.
4
- version: core
5
- when_to_use: Use quando o usuário pedir "use /morph-proposal" ou ao iniciar uma nova feature
6
- user-invocable: true
7
- cliVersion: "8.47.0"
8
- ---
9
-
10
- # morph-proposal
11
-
12
- ## Objetivo
13
-
14
- Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem intervenção do usuário entre os gates quando `trust: "auto"` e sem sinais de risco.
15
-
16
- ## Quando invocar
17
-
18
- - Usuário pede "use /morph-proposal {feature}" ou "vamos planejar {feature}".
19
- - Início de qualquer feature nova num projeto morph-spec.
20
- - Em sessões retomadas, antes de continuar uma feature em progresso, verificar via `.morph/features/{feature-name}/feature.json` (estado autoritativo da feature) se ela já passou pelos Gates.
21
-
22
- ## Argumentos
23
-
24
- - `{feature-name}` — nome em kebab-case da feature. Se ausente, perguntar via `AskUserQuestion`.
25
-
26
- ## Pré-condições
27
-
28
- - `.morph/config/config.json` existe (rode `morph-spec init` antes).
29
- - Stack está definido (padrão: VSA + .NET 10 + MAF + Next.js + Neon).
30
-
31
- ## Fluxo
32
-
33
- ### 0. Roteamento por tipo de trabalho
34
-
35
- Antes de qualquer trabalho de negócio, classifique o pedido. Se `{feature-name}` ainda não foi determinado, pergunte via `AskUserQuestion` antes desta chamada (ver Argumentos):
36
-
37
- ```
38
- morph-spec create {feature-name} --request "<pedido do usuário>"
39
- ```
40
-
41
- (ou `--type <tipo> --description "<o quê/porquê>"` diretamente quando o tipo é óbvio pelo pedido — ex.: o usuário já diz "isso é um hotfix"). O `--request` **serve de semente da descrição**: toda feature nasce com `name` (o slug) e `description` (obrigatória) carimbados. Sem `--request` nem `--description`, o `create` recusa — nada de scaffolds anônimos.
42
-
43
- - **Classificação `high` confidence** — a feature nasce com o `workType` decidido pelo detector determinístico (keywords: `hotfix` — "produção caiu/urgente/incident/p0"; `bug` — "bug/corrigir/exception/regressão"; `chore` — "typo/rename/bump/config/docs/cleanup"). Prossiga para o branch correspondente abaixo.
44
- - **Exit 2** (empate `tie` ou nenhum sinal `none`) — o comando sai sem criar a feature e imprime `{ needsDecision, candidates, matched }`. **Você é o roteador**: decida o tipo entre os candidatos e re-rode com `morph-spec create {feature-name} --type <tipo> --request "<pedido do usuário>"` (o `--request` re-passado carimba a descrição). Só use `AskUserQuestion` para o usuário quando o pedido for genuinamente indeterminado — a maioria dos empates o roteador resolve sozinho pelo contexto da conversa.
45
-
46
- **Branches por tipo** (dimensionamento completo em `MORPH.md` §2.1):
47
-
48
- - **`hotfix`** → invoque `Skill(morph-hotfix)` passando `{feature-name}` e **ENCERRE** — não siga o restante deste fluxo. A skill cuida de scout, brief, fix cirúrgico, test loop e Gate 3 (sempre humano).
49
- - **`chore`** → fast-track: os Gates 1 e 2 já nasceram carimbados `policy:chore` no `create`. Escreva um `2-plan/tasks.json` mínimo (1-3 tasks) e invoque `Skill(morph-apply)` diretamente — **exceção documentada** à regra do passo 7 ("não despachar `morph-apply` automaticamente"): não pausar numa mudança óbvia é exatamente o valor do fast-track.
50
- - **`bug`** → siga para `Skill(morph-brainstorming)` em modo **bug-lean**: produz um `proposal.md` enxuto (repro / diagnóstico / root cause / escopo do fix — não a proposta completa de uma feature nova; **sem critérios de aceite**, que moram na pós-condição do use case) e depois um plano enxuto via `Skill(morph-plan)`. Gates 1 e 2 continuam trust-aware (passos 3 e 6) — só o conteúdo dos artefatos é mais curto.
51
- - **`feature`** (default — inclui features criadas antes do v8 sem `workType`) → siga o fluxo completo abaixo (passos 1-7): brainstorming → Gate 1 → plan → Gate 2.
52
-
53
- ### 1. Determinar feature name e estado
54
-
55
- - Se argumento ausente: perguntar via `AskUserQuestion` (1 pergunta, header "Feature").
56
- - Verificar `.morph/features/{feature-name}/`:
57
- - Se `0-proposal/proposal.md` existe e tem conteúdo: pular para passo 3.
58
- - Caso contrário: rode `morph-spec create {feature-name} --description "<resumo do pedido do usuário>"` — cria `.morph/features/{feature-name}/0-proposal/` e o `feature.json` canônico (shape em `.morph/framework/schemas/feature.schema.json`) num passo só, server-side, com `name`+`description` carimbados. A `--description` é **obrigatória** no nascimento (ou `--request`, que a semeia). Não crie a estrutura à mão nem dependa do nascimento implícito via hook no primeiro Write. Depois siga o passo 2.
59
-
60
- ### 2. Invocar `Skill(morph-brainstorming)`
61
-
62
- Passa o nome da feature. A skill é a **dona da fase de entendimento** — não re-descreva o comportamento dela aqui. Em resumo: varre o ambiente antes de perguntar qualquer coisa (`Skill(morph-stack-scan)` + contexto do projeto + acervo de use cases), monta a **árvore de decisões abertas**, abre com a escolha de **modo de descoberta** (entrevista ou automático — só `feature` e `bug`), detecta divergência entre fontes de design-system (`signals.designSystemDivergence`) e produz `proposal.md` em `.morph/features/{feature}/0-proposal/`. Detalhes em `.claude/skills/morph-brainstorming/SKILL.md`.
63
-
64
- No **modo entrevista** o Gate 1 pausa sempre — a confirmação do entendimento compartilhado é o gate. O modo escolhido chega ao passo 3 em `gateDecisions.proposal.signals.discoveryMode`.
65
-
66
- ### 3. Gate 1 (trust-aware)
67
-
68
- A decisão de pausa já foi tomada e persistida pela `morph-brainstorming` (Parte 4): `morph-spec gate-check {feature} proposal` no caminho comum (`shouldPauseGate`; divergência de design-system detectada entra via `--signals`), ou `gate-decision` manual quando `discoveryMode: "interview"` — o único sinal que `shouldPauseGate` não representa. Leia `gateDecisions.proposal` em `feature.json` (ou o output do comando) para `pause`/`reason`.
69
-
70
- **Se `pause === true`**, apresentar via `AskUserQuestion`:
71
-
72
- ```
73
- question: "Gate 1 — Proposta de {feature} aprovada? Sinal de risco: {reason}"
74
- options:
75
- - { label: "aprovado, prosseguir", description: "Aceitar a proposta e avançar para o planejamento" }
76
- - { label: "preciso ajustar", description: "Apontar mudanças necessárias na proposta" }
77
- - { label: "cancelar feature", description: "Abortar — feature não vai avançar" }
78
- header: "Gate 1"
79
- ```
80
-
81
- Aguardar resposta. Se "preciso ajustar", aplicar ajustes e reapresentar o gate.
82
-
83
- **Se `pause === false`**, exibir summary curto e prosseguir:
84
-
85
- ```
86
- ## Gate 1 (auto-aprovado)
87
- Feature: {nome}
88
- Problema: {1 frase}
89
- Escopo: {incluído} | Excluído: {exclusões}
90
- Stack: {compliance}
91
- ```
92
-
93
- No caminho manual, o hook `state-sync.js` registra a aprovação automaticamente via PostToolUse quando a `AskUserQuestion` é respondida com "aprovado" (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`) — **atribuindo pela feature nomeada na pergunta**; sem o nome, e com mais de uma feature na árvore, ele recusa a gravar e avisa (aprove então por `morph-spec approve {feature} <gate>`). Em `trust: auto` (sem AskUserQuestion), **aprove via CLI — nunca via Edit à mão de state.json**:
94
-
95
- ```
96
- morph-spec approve {feature} proposal --mode auto
97
- # ou, para já aprovar o Gate 1 e criar a pasta 2-plan/ num passo só:
98
- morph-spec advance {feature}
99
- ```
100
-
101
- ### 3a. Roteamento uiux (após o Gate 1)
102
-
103
- Critério objetivo em `MORPH.md` §2.1: a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação)?
104
-
105
- - **Sim** → em vez do `advance {feature}` do passo 3, rode `morph-spec advance {feature} --design` (cria `1-design/`) e invoque `Skill(morph-uiux)`. Ela conduz a fase de design e, com o Gate uiux aprovado, devolve o controle aqui — siga para o passo 4.
106
- - **Não** → nenhuma ação extra; o `advance {feature}` do passo 3 já criou `2-plan/` direto.
107
-
108
- ### 4. Verificar retomada antes de morph-plan
109
-
110
- - Se `.morph/features/{feature}/2-plan/spec.md` já existe: pular para passo 6 (Gate 2).
111
-
112
- ### 5. Invocar `Skill(morph-plan)`
113
-
114
- A skill lê `proposal.md` e produz:
115
- - `usecases/UC-*.md` — o comportamento, com pós-condições testáveis
116
- - `spec.md` — especificação técnica, com a seção `## Contrato de implementação`
117
- - `tasks.json` — task breakdown estruturado validado contra `.morph/framework/schemas/tasks.schema.json`
118
- - `decisions.md` — apenas se houver decisões não triviais
119
-
120
- ### 6. Gate 2 (trust-aware)
121
-
122
- Mesma mecânica do passo 3: a decisão já foi tomada e persistida pela `morph-plan` (passo 6) — `morph-spec gate-check {feature} plan` no caminho comum (`shouldPauseGate` sobre `taskCount` do disco; `designSystemDivergence`/`standardsViolations` via `--signals` quando aplicável — não são herdados automaticamente entre gates), ou `gate-decision` manual para risco que nenhuma dessas chaves representa. Leia `gateDecisions.plan` para `pause`/`reason` e apresente com o mesmo template (AskUserQuestion ou auto-aprovação) do passo 3.
123
-
124
- ### 7. Conclusão
125
-
126
- - Sinalizar ao usuário: "Plano aprovado. Rode `/morph-apply {feature}` (ou peça 'implementar {feature}') para iniciar a execução."
127
- - Não dispachar `morph-apply` automaticamente — usuário decide quando começar.
128
-
129
- ## Anti-padrões
130
-
131
- - Não pular o Gate 1 mesmo em trust:auto se houver divergência detectada.
132
- - Não escrever código nesta fase — apenas artefatos de planejamento.
133
- - Não perguntar sobre stack — o stack padrão está em MORPH.md.
134
- - Não rodar o pipeline completo de 5 fases num `chore` ou `bug` óbvio — o Passo 0 existe para dimensionar o trabalho pelo `workType`, não para ser pulado "para simplificar".
135
-
136
- ## Output esperado
137
-
138
- - `.morph/features/{feature}/0-proposal/proposal.md`
139
- - `.morph/features/{feature}/1-design/` (se o ramo uiux — passo 3a — foi tomado)
140
- - `.morph/features/{feature}/2-plan/spec.md`
141
- - `.morph/features/{feature}/2-plan/tasks.json`
142
- - Gates 1 e 2 registrados aprovados em `.morph/features/{feature}/feature.json` (autoritativo) — via `morph-spec approve`/`morph-spec advance` em auto, ou via hook state-sync no caminho manual.
143
-
144
- ## Referências
145
-
146
- - `.morph/framework/MORPH.md` — charter NLH completo
147
- - `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho (Passo 0)
148
- - `.claude/skills/morph-brainstorming/SKILL.md`
149
- - `.claude/skills/morph-uiux/SKILL.md` — invocada no passo 3a quando a feature toma o ramo uiux
150
- - `.claude/skills/morph-plan/SKILL.md`
151
- - `.claude/skills/morph-hotfix/SKILL.md` — pipeline invocado pelo branch `hotfix` do Passo 0
152
- - `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
@@ -1,145 +0,0 @@
1
- ---
2
- name: morph-stack-scan
3
- description: Varre o codebase existente, detecta stack atual, compara com o stack padrão e registra desvios em stack-scan.md
4
- version: core
5
- when_to_use: Use quando uma feature começar em projeto brownfield (codebase já existente)
6
- user-invocable: true
7
- cliVersion: "8.47.0"
8
- ---
9
-
10
- # morph-stack-scan
11
-
12
- ## Objetivo
13
- Identificar o estado real do codebase antes de planejar qualquer feature — garantindo que a implementação não adicione inconsistência a um projeto já existente.
14
-
15
- ## Quando invocar
16
- Quando o projeto já tem código existente e você precisa entender o estado atual antes de propor uma feature. Normalmente invocado pelo morph-brainstorming, mas pode ser invocado diretamente.
17
-
18
- ## Stack padrão de referência
19
-
20
- O "Esperado" da comparação do passo 2 é o stack baked-in (runtime .NET 10 + VSA, EF Core/Neon, `Guid.CreateVersion7()`, `sealed`, result pattern, MAF, Next.js/Tailwind/Shadcn, Hangfire) e a lista de padrões proibidos (`Guid.NewGuid()`, classes não-sealed, Service/Manager layer, repository genérico, SQL cru sem justificativa) — regra canônica em `MORPH.md` § "Stack baked-in". Os templates de `stack-scan.md` abaixo (greenfield e brownfield) escrevem essa lista por extenso no artefato da feature, para que quem ler o `stack-scan.md` depois não precise reabrir o `MORPH.md`.
21
-
22
- ## Greenfield short-circuit
23
-
24
- Antes de despachar Explore, verifique se o projeto é greenfield:
25
-
26
- 1. Use `Glob` para detectar presença de qualquer um destes:
27
- - `**/*.csproj`
28
- - `**/*.sln`
29
- - `package.json` (na raiz)
30
- - `src/**/*.cs` ou `src/**/*.ts` ou `src/**/*.tsx`
31
- - `migrations/**/*`
32
-
33
- 2. Se **nenhum** for encontrado, o projeto é greenfield. Produza este `stack-scan.md` em `.morph/features/{feature}/0-proposal/` e retorne sem chamar Explore:
34
-
35
- ```markdown
36
- # Stack Scan — {feature}
37
-
38
- **Status:** GREENFIELD (sem código source detectado)
39
-
40
- ## Stack
41
- Project empty. Aplicar stack padrão de MORPH.md:
42
- - Backend: .NET 10 + VSA + EF Core + Neon
43
- - Frontend: Next.js App Router + Tailwind + Shadcn + Framer Motion
44
- - IA: MAF (quando aplicável à feature)
45
- - Jobs: Hangfire (apenas se necessário)
46
-
47
- ## Padrões obrigatórios
48
- - IDs: `Guid.CreateVersion7()`
49
- - Classes: `sealed` por padrão
50
- - Erros: Result pattern (`result.Match()`)
51
-
52
- ## Padrões proibidos
53
- `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados em VSA: `ApplicationDbContext` direto no slice (`DbSet<T>` já é repository, `DbContext` já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em `decisions.md`.
54
-
55
- ## Recomendação
56
- Compliance trivial (greenfield). Prosseguir para morph-brainstorming.
57
- ```
58
-
59
- 3. Se algum dos arquivos foi encontrado, o projeto é brownfield — siga para o passo seguinte.
60
-
61
- ## O que fazer (brownfield)
62
-
63
- 0. **Se houver grafo, ele responde a pergunta do repository genérico melhor que o grep.**
64
-
65
- ```bash
66
- morph-spec graph status --json # available:false? pule este passo
67
- morph-spec graph affected IRepository --uses-only --json
68
- morph-spec graph explain IRepository --json # o registro no DI aparece aqui
69
- ```
70
-
71
- A pergunta do passo 1 é *"quantos CONSUMIDORES REAIS"*, e é exatamente aí que o grep erra: no ProspectPRO ele aponta **23 arquivos**, mas 20 são interfaces filhas **herdando** o contrato e só **2** são uso real. Quem lê 23 conclui "está em uso, não é código morto" — e a conclusão certa é a oposta. `--uses-only` exclui `inherits`/`implements`/`extends` e devolve os 2. O `explain` do mesmo símbolo entrega de brinde a outra metade da pergunta: onde ele está registrado no DI.
72
-
73
- **Fallback:** grafo ausente (`no-graph`), símbolo não encontrado ou ambíguo — siga com o `Explore` e o grep do passo 1, e **registre no `stack-scan.md` que a contagem veio do grep**, que superestima consumidores por não separar herança de uso.
74
-
75
- 1. Despache um `Explore` subagent para varrer o codebase:
76
-
77
- ```
78
- Varredura de stack compliance — morph-stack-scan.
79
-
80
- Leia os seguintes arquivos/pastas e reporte o que encontrar:
81
-
82
- BACKEND:
83
- - Todos os .csproj: qual TargetFramework? Quais PackageReferences relevantes?
84
- - Procure por: Guid.NewGuid() vs Guid.CreateVersion7(), sealed classes, result pattern vs exceptions
85
- - Estrutura de src/: segue feature-folder (VSA)? Tem Controllers? Tem repository genérico (IRepository<T>/IUnitOfWork)? Se tiver, reporte como código morto: liste onde está registrado no DI e quantos consumidores reais existem em src/ e tests/
86
- - Migrations/: qual ORM? Neon/Postgres ou outro banco?
87
- - Microsoft.Agents.* ou Microsoft.Extensions.AI nos PackageReferences?
88
-
89
- FRONTEND:
90
- - package.json: Next.js? Tailwind? Framer Motion? Shadcn/ui?
91
- - Estrutura de app/ ou pages/: App Router ou Pages Router?
92
-
93
- JOBS:
94
- - Hangfire nos PackageReferences?
95
-
96
- Para cada item acima, responda: presente/ausente, e se presente qual versão ou padrão.
97
- Não faça sugestões — apenas reporte o que existe.
98
- ```
99
-
100
- 2. Com os resultados da varredura, compare com o stack padrão item por item e classifique cada desvio:
101
-
102
- | Severidade | Critério |
103
- |------------|---------|
104
- | **Bloqueante** | Runtime diferente (.NET 8 ou anterior), ORM diferente (Dapper puro sem EF Core), banco diferente (MySQL, SQL Server) |
105
- | **Alto** | `Guid.NewGuid()` generalizado, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`) presente — código morto: migração é deletar a pasta `Repository/` + as 2 linhas de DI, SQL cru generalizado, exceptions como fluxo de controle |
106
- | **Médio** | Classes não-sealed, Pages Router em vez de App Router, biblioteca de UI diferente |
107
- | **Baixo** | Versões de pacotes desatualizadas mas compatíveis |
108
-
109
- 3. Produza `stack-scan.md` em `.morph/features/{feature}/0-proposal/`:
110
-
111
- ```markdown
112
- # Stack Scan — {feature}
113
-
114
- ## Resultado
115
- {Em compliance / Desvios detectados}
116
-
117
- ## Stack detectado
118
- | Camada | Detectado | Esperado | Status |
119
- |--------|-----------|----------|--------|
120
- | Runtime | .NET X | .NET 10 | ✓ / ✗ |
121
- ...
122
-
123
- ## Desvios (ordenados por severidade)
124
- ### Bloqueantes
125
- - {desvio}: {onde foi encontrado} — impacto: {o que quebra se não migrar} — esforço: {estimativa}
126
-
127
- ### Não bloqueantes
128
- - {desvio}: {onde foi encontrado} — migração: {como resolver} — esforço: {estimativa}
129
-
130
- ## Recomendação
131
- {Em compliance — prosseguir para morph-brainstorming}
132
- {ou: Migração necessária antes de prosseguir — ver Desvios acima}
133
- ```
134
-
135
- 4. Se houver desvios bloqueantes ou altos, pergunte via `AskUserQuestion`: "Esta migração deve ser incluída na feature atual ou tratada numa feature separada?" A resposta é decisão humana — registre-a na seção "Compliance de stack" do `proposal.md` (produzido pela `morph-brainstorming`), não num artefato novo: a lista de desvios com impacto/esforço já vive no `stack-scan.md` acima.
136
-
137
- 5. Se não houver desvios (ou apenas baixos): informe "codebase em compliance com o stack padrão" e prossiga para morph-brainstorming ou morph-plan conforme o contexto.
138
-
139
- ## Output esperado
140
- - `.morph/features/{feature}/0-proposal/stack-scan.md` — resultado da varredura, com desvios ordenados por severidade e esforço estimado
141
- - Decisão documentada: incluir migração nesta feature ou separar (registrada no proposal.md pela morph-brainstorming)
142
-
143
- ## Referências
144
- - `.morph/framework/MORPH.md` — seção 4 (Standards), seção 2 (Fases)
145
- - `.claude/skills/morph-brainstorming/SKILL.md` — fluxo greenfield/brownfield