@polymorphism-tech/morph-spec 8.37.1 → 8.40.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 (317) hide show
  1. package/CLAUDE.md +37 -13
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +75 -49
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +1 -1
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/CLAUDE.md +6 -5
  8. package/framework/MORPH.md +25 -22
  9. package/framework/agents.json +96 -36
  10. package/framework/docs/CLI.md +54 -17
  11. package/framework/evals/rubrics/code-quality.md +5 -0
  12. package/framework/evals/rubrics/condensed.md +6 -2
  13. package/framework/evals/rubrics/contracts.md +20 -0
  14. package/framework/evals/rubrics/test-coverage.md +17 -6
  15. package/framework/hooks/README.md +9 -3
  16. package/framework/hooks/claude-code/core/graph-refresh-kick.js +52 -0
  17. package/framework/hooks/claude-code/core/telemetry-log.js +172 -87
  18. package/framework/hooks/claude-code/core/validate-completion.js +16 -90
  19. package/framework/hooks/claude-code/core/worktree-context.js +10 -0
  20. package/framework/hooks/shared/command-tokens.js +96 -0
  21. package/framework/hooks/shared/git-exclude.js +44 -0
  22. package/framework/hooks/shared/git-paths.js +52 -0
  23. package/framework/hooks/shared/graph-freshness.js +380 -0
  24. package/framework/hooks/shared/graph-refresh.js +416 -0
  25. package/framework/hooks/shared/morph-cli.js +17 -5
  26. package/framework/hooks/shared/redact-secrets.js +55 -0
  27. package/framework/hooks/shared/telemetry-logger.js +25 -2
  28. package/framework/hooks/shared/transcript-usage.js +80 -0
  29. package/framework/mcp/registry.json +33 -2
  30. package/framework/rubrics/backend.json +2 -2
  31. package/framework/rubrics/default.json +2 -2
  32. package/framework/rubrics/frontend.json +2 -2
  33. package/framework/rules/csharp-standards.md +1 -0
  34. package/framework/rules/infrastructure-standards.md +0 -1
  35. package/framework/rules/morph-workflow.md +10 -4
  36. package/framework/rules/nextjs-standards.md +1 -0
  37. package/framework/schemas/config.schema.json +41 -1
  38. package/framework/schemas/feature.schema.json +5 -1
  39. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  40. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  41. package/framework/skills/core/morph-apply/SKILL.md +40 -11
  42. package/framework/skills/core/morph-brainstorming/SKILL.md +16 -7
  43. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  44. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  45. package/framework/skills/core/morph-implement/SKILL.md +44 -10
  46. package/framework/skills/core/morph-media/SKILL.md +1 -1
  47. package/framework/skills/core/morph-plan/SKILL.md +73 -15
  48. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  49. package/framework/skills/core/morph-review/SKILL.md +51 -13
  50. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  51. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  52. package/framework/skills/core/morph-uiux/SKILL.md +39 -13
  53. package/framework/standards/STANDARDS.json +189 -14
  54. package/framework/standards/ai-agents/context-providers.md +16 -26
  55. package/framework/standards/ai-agents/durable-workflows-hitl.md +15 -21
  56. package/framework/standards/ai-agents/modalities-image-gen.md +21 -25
  57. package/framework/standards/ai-agents/modalities-speech-to-text.md +4 -15
  58. package/framework/standards/ai-agents/modalities-text-to-speech.md +2 -11
  59. package/framework/standards/ai-agents/modalities-vision.md +1 -18
  60. package/framework/standards/ai-agents/prompt-sources.md +0 -4
  61. package/framework/standards/ai-agents/testing-ai.md +2 -1
  62. package/framework/standards/architecture/code-comments.md +100 -0
  63. package/framework/standards/backend/dotnet/testing.md +22 -0
  64. package/framework/standards/backend/integrations/neon-auth/neon-auth.md +63 -50
  65. package/framework/standards/frontend/admin-app/data-table.md +562 -0
  66. package/framework/standards/frontend/admin-app/feedback.md +236 -0
  67. package/framework/standards/frontend/admin-app/forms.md +232 -0
  68. package/framework/standards/frontend/admin-app/page-structure.md +203 -0
  69. package/framework/standards/frontend/design-system/ai-image-generation.md +5 -5
  70. package/framework/standards/frontend/nextjs/components.md +37 -58
  71. package/framework/standards/frontend/nextjs/data-fetching.md +1 -0
  72. package/framework/standards/frontend/nextjs/forms.md +31 -30
  73. package/framework/standards/frontend/nextjs/state-management.md +2 -1
  74. package/framework/standards/frontend/nextjs/testing.md +18 -0
  75. package/framework/standards/integration/mcp/mcp-tools.md +48 -117
  76. package/framework/templates/code/dotnet/abstractions/result.cs +0 -2
  77. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +26 -39
  78. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +28 -68
  79. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +99 -117
  80. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +2 -44
  81. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +40 -61
  82. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +54 -107
  83. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +53 -58
  84. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +192 -281
  85. package/framework/templates/code/dotnet/database/migration.cs +49 -83
  86. package/framework/templates/code/dotnet/database/vector-entity.cs +2 -46
  87. package/framework/templates/code/dotnet/extensions/result-extensions.cs +0 -2
  88. package/framework/templates/code/dotnet/feature/validator.cs.hbs +11 -15
  89. package/framework/templates/code/dotnet/jobs/agent.cs +3 -51
  90. package/framework/templates/code/dotnet/jobs/job.cs +2 -97
  91. package/framework/templates/code/dotnet/test.cs +2 -87
  92. package/framework/templates/code/typescript/contracts.ts +140 -167
  93. package/framework/templates/context/design-system.md +3 -3
  94. package/framework/templates/docs/proposal.md +11 -0
  95. package/framework/templates/docs/spec.md +15 -0
  96. package/framework/templates/docs/ui-mockups.md +115 -98
  97. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +1 -48
  98. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +3 -79
  99. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +1 -70
  100. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +1 -47
  101. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +2 -99
  102. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +0 -6
  103. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +3 -88
  104. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +1 -41
  105. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +0 -21
  106. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +1 -25
  107. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +2 -63
  108. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +0 -30
  109. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +1 -52
  110. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +3 -78
  111. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +4 -109
  112. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +0 -22
  113. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +1 -36
  114. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +2 -57
  115. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +0 -75
  116. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +2 -59
  117. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +4 -111
  118. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +0 -34
  119. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +1 -57
  120. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +0 -19
  121. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +2 -74
  122. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +2 -33
  123. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +1 -43
  124. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +1 -96
  125. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +0 -13
  126. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +0 -27
  127. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +0 -33
  128. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +0 -31
  129. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +3 -75
  130. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +0 -42
  131. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +0 -39
  132. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +1 -55
  133. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +3 -59
  134. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +0 -46
  135. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +3 -28
  136. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +7 -61
  137. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +2 -37
  138. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +1 -23
  139. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +2 -82
  140. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +1 -68
  141. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +1 -62
  142. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +2 -62
  143. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +1 -25
  144. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +0 -124
  145. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +1 -73
  146. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +1 -66
  147. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +0 -41
  148. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +2 -112
  149. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +2 -43
  150. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +5 -110
  151. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +7 -103
  152. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +1 -42
  153. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +1 -30
  154. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +1 -19
  155. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +0 -48
  156. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +1 -29
  157. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +2 -38
  158. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +1 -14
  159. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +4 -69
  160. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +1 -10
  161. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +1 -57
  162. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +0 -26
  163. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +1 -19
  164. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +0 -32
  165. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +0 -14
  166. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +0 -24
  167. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +0 -32
  168. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +0 -37
  169. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +0 -24
  170. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +0 -78
  171. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +0 -53
  172. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +0 -44
  173. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +0 -44
  174. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +0 -19
  175. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +0 -24
  176. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +6 -48
  177. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +1 -13
  178. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +2 -71
  179. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +5 -100
  180. package/framework/templates/feature/decisions.md +124 -122
  181. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +39 -43
  182. package/framework/templates/frontend/nextjs/env.mjs.hbs +29 -32
  183. package/framework/templates/frontend/nextjs/page.tsx.hbs +21 -22
  184. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +42 -54
  185. package/framework/templates/integrations/asaas-client.cs +332 -387
  186. package/framework/templates/integrations/asaas-webhook.cs +290 -351
  187. package/framework/templates/integrations/neon-auth-config.cs +9 -105
  188. package/framework/templates/project/validate.js +97 -120
  189. package/package.json +2 -2
  190. package/src/commands/dashboard/dashboard.js +80 -53
  191. package/src/commands/graph/affected.js +4 -3
  192. package/src/commands/graph/build.js +109 -18
  193. package/src/commands/graph/explain.js +8 -5
  194. package/src/commands/graph/status.js +14 -8
  195. package/src/commands/mcp/mcp-setup.js +37 -9
  196. package/src/commands/observability/cost.js +148 -18
  197. package/src/commands/project/doctor.js +85 -15
  198. package/src/commands/project/init.js +6 -3
  199. package/src/commands/project/install-plugin-cmd.js +1 -1
  200. package/src/commands/project/update.js +30 -0
  201. package/src/commands/project/worktree.js +73 -90
  202. package/src/commands/state/advance.js +18 -0
  203. package/src/commands/state/approve.js +15 -0
  204. package/src/commands/state/archive.js +62 -9
  205. package/src/commands/state/finish.js +62 -14
  206. package/src/commands/state/gate-check.js +8 -1
  207. package/src/commands/state/gate-decision.js +8 -4
  208. package/src/commands/state/report-check.js +90 -9
  209. package/src/commands/state/usecase.js +66 -0
  210. package/src/commands/tasks/dag.js +17 -2
  211. package/src/commands/validation/validate-feature.js +6 -1
  212. package/src/commands/validation/verify.js +20 -1
  213. package/src/dashboard/app/App.jsx +80 -16
  214. package/src/dashboard/app/components/ActivityFeed.jsx +172 -0
  215. package/src/dashboard/app/components/CommandPalette.jsx +155 -0
  216. package/src/dashboard/app/components/DetailPanel.jsx +47 -11
  217. package/src/dashboard/app/components/EntityLink.jsx +55 -0
  218. package/src/dashboard/app/components/ErrorBoundary.jsx +54 -0
  219. package/src/dashboard/app/components/FlowGraph.jsx +19 -17
  220. package/src/dashboard/app/components/KnowledgeMarkdown.jsx +53 -0
  221. package/src/dashboard/app/components/Markdown.jsx +47 -0
  222. package/src/dashboard/app/components/PhaseRail.jsx +111 -0
  223. package/src/dashboard/app/components/SearchFilter.jsx +40 -22
  224. package/src/dashboard/app/components/Sidebar.jsx +146 -37
  225. package/src/dashboard/app/hooks/useMorphQuery.js +54 -0
  226. package/src/dashboard/app/hooks/usePref.js +38 -0
  227. package/src/dashboard/app/lib/format.js +69 -0
  228. package/src/dashboard/app/lib/phases.js +56 -0
  229. package/src/dashboard/app/lib/project.js +50 -0
  230. package/src/dashboard/app/pages/Activity.jsx +24 -0
  231. package/src/dashboard/app/pages/AgentMap.jsx +371 -370
  232. package/src/dashboard/app/pages/FeatureDetail.jsx +604 -0
  233. package/src/dashboard/app/pages/Features.jsx +400 -0
  234. package/src/dashboard/app/pages/Guide.jsx +146 -0
  235. package/src/dashboard/app/pages/HookInspector.jsx +357 -322
  236. package/src/dashboard/app/pages/PhasePipeline.jsx +277 -408
  237. package/src/dashboard/app/pages/Portfolio.jsx +156 -0
  238. package/src/dashboard/app/pages/Rubrics.jsx +101 -0
  239. package/src/dashboard/app/pages/RulesMap.jsx +300 -273
  240. package/src/dashboard/app/pages/SkillsLibrary.jsx +483 -366
  241. package/src/dashboard/app/pages/Standards.jsx +407 -332
  242. package/src/dashboard/app/styles/index.css +187 -47
  243. package/src/dashboard/index.html +14 -12
  244. package/src/dashboard/package.json +32 -24
  245. package/src/dashboard/scanner/activity-scanner.js +351 -0
  246. package/src/dashboard/scanner/agents-scanner.js +63 -1
  247. package/src/dashboard/scanner/docs-scanner.js +59 -0
  248. package/src/dashboard/scanner/feature-status.js +10 -0
  249. package/src/dashboard/scanner/features-scanner.js +360 -0
  250. package/src/dashboard/scanner/hooks-scanner.js +8 -1
  251. package/src/dashboard/scanner/index.js +14 -7
  252. package/src/dashboard/scanner/phases-scanner.js +14 -15
  253. package/src/dashboard/scanner/portfolio.js +153 -0
  254. package/src/dashboard/scanner/project-api.js +195 -0
  255. package/src/dashboard/scanner/rules-scanner.js +42 -37
  256. package/src/dashboard/scanner/skills-scanner.js +105 -43
  257. package/src/dashboard/scanner/standards-scanner.js +4 -1
  258. package/src/dashboard/vite-plugin-morph-data.js +134 -17
  259. package/src/lib/ai/comment-stripper.js +101 -4
  260. package/src/lib/detectors/claude-config-detector.js +2 -7
  261. package/src/lib/detectors/index.js +5 -1
  262. package/src/lib/evaluator-report.js +47 -0
  263. package/src/lib/generators/handoff-generator.js +4 -18
  264. package/src/lib/generators/settings-generator.js +208 -209
  265. package/src/lib/git/default-branch.js +52 -0
  266. package/src/lib/git/tree-fingerprint.js +58 -0
  267. package/src/lib/git/tree-state.js +167 -0
  268. package/src/lib/graph/god-nodes.js +12 -3
  269. package/src/lib/graph/graph-health.js +48 -2
  270. package/src/lib/graph/graph-loader.js +99 -25
  271. package/src/lib/graph/graphifyignore.js +145 -28
  272. package/src/lib/graph/sanitize.js +117 -11
  273. package/src/lib/installers/mcp-installer.js +724 -719
  274. package/src/lib/installers/memory-installer.js +1 -2
  275. package/src/lib/projects/registry.js +154 -0
  276. package/src/lib/risk-detector.js +90 -0
  277. package/src/lib/specs/acervo-format.js +70 -0
  278. package/src/lib/specs/acervo-lifecycle.js +264 -0
  279. package/src/lib/specs/adr-index.js +169 -0
  280. package/src/lib/specs/revocations.js +156 -0
  281. package/src/lib/specs/screen-checklist.js +357 -0
  282. package/src/lib/specs/usecase-check.js +20 -16
  283. package/src/lib/specs/usecase-promoter.js +103 -38
  284. package/src/lib/specs/usecase-registry.js +7 -7
  285. package/src/lib/tasks/tasks-json-parser.js +2 -3
  286. package/src/lib/telemetry/metrics.js +386 -0
  287. package/src/lib/telemetry/telemetry-reader.js +161 -51
  288. package/src/lib/telemetry/verify-event.js +79 -0
  289. package/src/lib/validators/code-budget/code-budget-validator.js +200 -0
  290. package/src/lib/validators/code-budget/comment-scanner.js +75 -0
  291. package/src/lib/validators/code-budget/index.js +9 -0
  292. package/src/lib/validators/reuse/reuse-validator.js +4 -2
  293. package/src/lib/validators/reuse/symbol-scanner.js +27 -22
  294. package/src/lib/validators/validation-runner.js +21 -5
  295. package/src/lib/validators/verify-runner.js +11 -0
  296. package/src/lib/worktree/finish-backup.js +739 -0
  297. package/src/lib/worktree/ignored-triage.js +15 -8
  298. package/src/lib/worktree/worktree-audit.js +5 -0
  299. package/src/scripts/install-plugin.js +1 -1
  300. package/src/scripts/setup-infra.js +31 -22
  301. package/src/utils/agents-installer.js +338 -24
  302. package/src/utils/banner.js +1 -1
  303. package/src/utils/hooks-installer.js +75 -15
  304. package/src/commands/index.js +0 -13
  305. package/src/commands/project/checkpoint.js +0 -209
  306. package/src/core/state/phase-state-machine.js +0 -197
  307. package/src/dashboard/app/hooks/useDetailPanel.js +0 -15
  308. package/src/dashboard/app/pages/LiveState.jsx +0 -206
  309. package/src/dashboard/scanner/squads-scanner.js +0 -13
  310. package/src/dashboard/scanner/state-scanner.js +0 -85
  311. package/src/lib/generators/index.js +0 -10
  312. package/src/lib/hooks/hook-executor.js +0 -167
  313. package/src/lib/validators/checkpoint-persistence.js +0 -39
  314. package/src/lib/validators/shared/emit-validator-dispatch.js +0 -14
  315. package/src/lib/validators/shared/index.js +0 -12
  316. package/src/lib/validators/shared/issue-counter.js +0 -14
  317. package/src/lib/validators/shared/result-formatter.js +0 -124
@@ -5,6 +5,7 @@
5
5
  "context7": {
6
6
  "phases": ["proposal", "plan", "implement"],
7
7
  "tools": ["resolve-library-id", "query-docs"],
8
+ "serverNames": ["context7", "plugin_context7_context7"],
8
9
  "detection": "enabledPlugins includes context7 or mcpServers includes context7",
9
10
  "fallback": "WebSearch + WebFetch for library documentation",
10
11
  "usage": "Library documentation lookups, API reference, implementation patterns",
@@ -33,7 +34,8 @@
33
34
  "playwright": {
34
35
  "phases": ["uiux", "implement"],
35
36
  "tools": ["browser_navigate", "browser_snapshot", "browser_take_screenshot", "browser_console_messages", "browser_click", "browser_resize"],
36
- "detection": "mcpServers includes playwright",
37
+ "serverNames": ["playwright", "plugin_playwright_playwright"],
38
+ "detection": "mcpServers includes playwright or enabledPlugins includes playwright",
37
39
  "fallback": "WebFetch for read-only page content, manual testing",
38
40
  "usage": "UI preview, smoke testing, page inspection, responsive testing, screenshot capture",
39
41
  "healthCheck": {
@@ -168,6 +170,7 @@
168
170
  "gemini-image": {
169
171
  "phases": ["uiux", "implement"],
170
172
  "tools": ["generate_image", "edit_image", "continue_editing", "list_images", "get_image_info", "get_configuration_status"],
173
+ "serverNames": ["gemini-image", "gemini-image-mcp"],
171
174
  "detection": "mcpServers includes gemini-image-mcp",
172
175
  "fallback": "Manual image creation, stock photos, or placeholder divs",
173
176
  "usage": "AI image generation for project assets (heroes, illustrations, brand images) using Gemini models",
@@ -285,9 +288,37 @@
285
288
  ],
286
289
  "setupGuide": null
287
290
  }
291
+ },
292
+ "neon": {
293
+ "phases": ["plan", "implement"],
294
+ "tools": ["list_projects", "describe_table_schema", "get_database_tables", "run_sql", "explain_sql_statement", "prepare_database_migration", "complete_database_migration", "compare_database_schema", "create_branch", "list_branches", "get_connection_string"],
295
+ "serverNames": ["neon", "Neon"],
296
+ "detection": "mcpServers includes neon (case-insensitive)",
297
+ "fallback": "SQL via the connection string (psql / dotnet ef) and the neonctl CLI for branches",
298
+ "usage": "Schema inspection, migration dry-run on a throwaway branch (prepare_database_migration → complete_database_migration), query tuning. The server exposes DESTRUCTIVE tools (delete_branch, delete_project, reset_from_parent): never call one without explicit human confirmation",
299
+ "healthCheck": {
300
+ "toolPattern": "neon",
301
+ "testCall": "Call list_projects with limit 1",
302
+ "testParams": { "limit": 1 },
303
+ "successIndicator": "Returns the project list (possibly empty)",
304
+ "failureHint": "Neon MCP not responding. Re-run the OAuth flow: claude mcp add --transport http neon https://mcp.neon.tech/mcp"
305
+ },
306
+ "install": {
307
+ "autoInstall": false,
308
+ "transport": "http",
309
+ "config": {
310
+ "type": "http",
311
+ "url": "https://mcp.neon.tech/mcp"
312
+ },
313
+ "credentials": [],
314
+ "prerequisites": [],
315
+ "stackRelevance": ["neon"],
316
+ "warnings": ["OAuth against your Neon account on first use. The server can delete branches and projects: keep destructive calls behind a human."],
317
+ "setupGuide": "Run: claude mcp add --transport http neon https://mcp.neon.tech/mcp"
318
+ }
288
319
  }
289
320
  },
290
- "_phaseMatrixNote": "Keys must be the v5 phases from framework/phases.json. The v4 keys 'design' and 'tasks' both collapsed into 'plan'; 'review' was absent entirely, so a project in review resolved to undefined. Stack-scoped MCPs (asaas) stay out of this matrix on purpose — only universal ones are listed.",
321
+ "_phaseMatrixNote": "Keys must be the v5 phases from framework/phases.json. The v4 keys 'design' and 'tasks' both collapsed into 'plan'; 'review' was absent entirely, so a project in review resolved to undefined. Stack-scoped MCPs (asaas, neon) stay out of this matrix on purpose — only universal ones are listed.",
291
322
  "phaseMatrix": {
292
323
  "proposal": ["context7", "graphify"],
293
324
  "uiux": ["playwright", "context7", "stitch", "gemini-image", "seedance"],
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "code_quality": {
12
12
  "weight": 0.25,
13
- "validators": ["architecture", "reuse"],
14
- "description": "Architecture patterns, dependency direction, code structure, and reuse of what the codebase already has"
13
+ "validators": ["architecture", "reuse", "code-budget"],
14
+ "description": "Architecture patterns, dependency direction, code structure, reuse of what the codebase already has, and comment and test budget"
15
15
  },
16
16
  "design_ui": {
17
17
  "weight": 0.05,
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "code_quality": {
12
12
  "weight": 0.25,
13
- "validators": ["architecture", "reuse"],
14
- "description": "Architecture patterns, code structure, and reuse of what the codebase already has"
13
+ "validators": ["architecture", "reuse", "code-budget"],
14
+ "description": "Architecture patterns, code structure, reuse of what the codebase already has, and comment and test budget"
15
15
  },
16
16
  "design_ui": {
17
17
  "weight": 0.15,
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "code_quality": {
12
12
  "weight": 0.15,
13
- "validators": ["architecture", "reuse"],
14
- "description": "Architecture patterns, code structure, and reuse of what the codebase already has"
13
+ "validators": ["architecture", "reuse", "code-budget"],
14
+ "description": "Architecture patterns, code structure, reuse of what the codebase already has, and comment and test budget"
15
15
  },
16
16
  "design_ui": {
17
17
  "weight": 0.35,
@@ -15,3 +15,4 @@ stacks:
15
15
  @.morph/framework/standards/backend/dotnet/scrutor.md
16
16
  @.morph/framework/standards/backend/dotnet/scalar-ui.md
17
17
  @.morph/framework/standards/backend/api/validation.md
18
+ @.morph/framework/standards/architecture/code-comments.md
@@ -12,7 +12,6 @@ stacks:
12
12
 
13
13
  @.morph/framework/standards/infrastructure/docker/coolify-deploy.md
14
14
  @.morph/framework/standards/infrastructure/docker/local-compose-isolation.md
15
- @.morph/framework/standards/infrastructure/docker/local-compose-isolation.md
16
15
 
17
16
  ## Infrastructure Templates
18
17
 
@@ -156,6 +156,7 @@ Do not modify test files to make a failing test pass when the implementation is
156
156
 
157
157
  After making structural changes (new packages, dependencies, project config changes), update the project context:
158
158
  - Edit `.morph/context/README.md` — update Tech Stack, Architecture, Key Integrations sections
159
+ - Any `.morph/context/*.md`: **rewrite the body, never stack** — the section that described the old fact now describes the new one (a value that still holds somewhere says where); a changelog keeps only date and reason
159
160
  - Update `.morph/config/config.json` — update stack, architecture, integrations, paths
160
161
  - Structural changes include: package.json, .csproj, next.config.*, tsconfig.json, docker-compose.yml
161
162
 
@@ -191,16 +192,21 @@ Every task in `tasks.json` MUST reference its FR(s) in the `description` field s
191
192
 
192
193
  ## Debugging
193
194
 
194
- When a bug or unexpected behavior shows up mid-task, invoke `superpowers:systematic-debugging`
195
- with the `Skill()` tool **before proposing a fix** — root cause first, never a patch on the
196
- symptom. This is MANDATORY; do NOT skip it.
195
+ When a bug or unexpected behavior shows up mid-task, find the **root cause before proposing a
196
+ fix** — never a patch on the symptom. This is MANDATORY:
197
+
198
+ 1. Reproduce it and read the full error, not the first line.
199
+ 2. For a known .NET/Next.js error, run `/morph-troubleshoot <keywords>` first.
200
+ 3. One hypothesis at a time, each tested by the smallest check that could refute it.
201
+ 4. After three failed fixes, stop and question the design instead of trying a fourth.
202
+ 5. Confirm the fix with the same check that reproduced the bug; add a test only when no existing one covers that behavior.
197
203
 
198
204
  Everything else that a rule like this might list is owned by the flow itself, and duplicating it
199
205
  here would put a second, staler copy in permanent context:
200
206
 
201
207
  | Concern | Where it actually lives |
202
208
  |---------|-------------------------|
203
- | TDD before writing code | The feature's `mandate.md` (TDD is built in) — the resident `.claude/CLAUDE.md` says to prefer `morph-*` over the generic `superpowers:*` equivalents |
209
+ | How many tests to write | The test budget copied into the feature's `mandate.md`: one test per postcondition, same-behavior cases in one table, no test that only pins text |
204
210
  | Verifying a task before `status: "done"` | `morph-spec verify {feature} [task]` (build + tests + validators + e2e), then the `morph-eval` skill for the 0-10 score |
205
211
  | Parallel dispatch | `morph-spec dag {feature}` decides sequential vs parallel; execution and isolation rules are in `morph-apply` §2/§3b |
206
212
  | Closing the phase / opening the PR | `morph-review` for Gate 3, then `morph-spec finish {feature} --pr\|--merge` |
@@ -18,3 +18,4 @@ stacks:
18
18
  @.morph/framework/standards/frontend/nextjs/testing.md
19
19
  @.morph/framework/standards/frontend/nextjs/nextjs-patterns.md
20
20
  @.morph/framework/standards/frontend/nextjs/motion-patterns.md
21
+ @.morph/framework/standards/architecture/code-comments.md
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "MORPH-SPEC .morph/config/config.json",
4
- "description": "Describes ONLY project.tests[] — the plural declaration of the project's test suites. Everything else in config.json is deliberately left open (additionalProperties: true) so that configs already in the field never break on a key this schema has not heard of. The authority at runtime is validateTestNodes() in src/lib/tasks/test-nodes.js: a schema nothing calls is decoration.",
4
+ "description": "Describes project.tests[] — the plural declaration of the project's test suites — and finishBackup.retention. Everything else in config.json is deliberately left open (additionalProperties: true) so that configs already in the field never break on a key this schema has not heard of. The authorities at runtime are validateTestNodes() in src/lib/tasks/test-nodes.js and resolveBackupRetention() in src/lib/worktree/finish-backup.js: a schema nothing calls is decoration.",
5
5
  "type": "object",
6
6
  "additionalProperties": true,
7
7
  "properties": {
@@ -109,6 +109,46 @@
109
109
  }
110
110
  }
111
111
  }
112
+ },
113
+ "finishBackup": {
114
+ "type": "object",
115
+ "additionalProperties": true,
116
+ "description": "The backups `finish` and `worktree remove` write to .git/morph-spec/finish-backup/ before deleting a file that exists nowhere else.",
117
+ "properties": {
118
+ "retention": {
119
+ "description": "How long a backup lives. ON by default: a config without this key gets the defaults below - the maxCount newest backups of each namespace always stay, at any age (no age cut unless maxAgeDays is set), and .env* files inside a backup go after secretMaxAgeDays. One finish is one backup, even when it writes two folders (same stamp). Applied after every finish and every `worktree remove` that wrote a backup, and on demand by `morph-spec doctor --worktrees --prune`. A backup without its {folder}.manifest.json was written before this retention: the automatic prune never deletes it, never strips it and gives it no place in the count (it reports legacyPending); only the explicit `doctor --worktrees --prune` prunes it, counting it with the rest, and writes a manifest into every one it keeps. Only `false` turns retention off. Anything else it cannot read - an unknown key, a value that is not an integer >= 1, a retention that is neither `false` nor this object, a finishBackup that is not an object, a config.json that does not parse - SKIPS the prune for that run, with the reason in the output: never the defaults, because the operation deletes. The backup the running command just wrote is never pruned by it, and a backup stamped in the future is kept without taking a place in the count.",
120
+ "oneOf": [
121
+ {
122
+ "const": false,
123
+ "description": "Retention off: no backup and no .env* inside one is ever deleted."
124
+ },
125
+ {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "properties": {
129
+ "maxCount": {
130
+ "type": "integer",
131
+ "minimum": 1,
132
+ "default": 20,
133
+ "description": "Backups kept per namespace (the top level, and task/ for task isolation trees), newest first."
134
+ },
135
+ "maxAgeDays": {
136
+ "type": ["integer", "null"],
137
+ "minimum": 1,
138
+ "default": null,
139
+ "description": "Optional age cut: when set, no backup older than this survives, whatever the count. Absent or null (the default) means no age cut - a quiet period never empties the backups of the last features closed."
140
+ },
141
+ "secretMaxAgeDays": {
142
+ "type": "integer",
143
+ "minimum": 1,
144
+ "default": 7,
145
+ "description": "Files named .env* are deleted from a backup older than this; the rest of it stays, and its manifest keeps the names."
146
+ }
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ }
112
152
  }
113
153
  }
114
154
  }
@@ -60,7 +60,11 @@
60
60
  "description": "Risk signals evaluated (free-form): taskCount, evalScore, standardsViolations, designSystemDivergence..."
61
61
  },
62
62
  "trust": { "type": "string", "enum": ["auto", "manual"] },
63
- "decidedAt": { "type": "string", "format": "date-time" }
63
+ "decidedAt": { "type": "string", "format": "date-time" },
64
+ "mockupsHash": {
65
+ "type": ["string", "null"],
66
+ "description": "uiux only: hash of the 1-design/mockups.md the decision saw (null = no mockup). A pause:false unlocks the auto signature only while the mockup is still this one."
67
+ }
64
68
  },
65
69
  "additionalProperties": false
66
70
  }
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invokable: true
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
6
6
  user-invokable: true
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
4
4
  version: core
5
5
  when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
6
6
  user-invokable: true
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
@@ -159,8 +159,9 @@ while (true):
159
159
  ```
160
160
  dispatch Agent (subagent_type: "morph-{id}") with prompt:
161
161
  contexto: spec.md, mandate.md, task description completa, doneCriteria,
162
- task.reuse (veredito REUSAR/ESTENDER/CRIAR por conceito) e os paths
163
- dos alvos de reuso
162
+ task.reuse (veredito REUSAR/ESTENDER/CRIAR por conceito), os paths
163
+ dos alvos de reuso e o que você já leu para a task (`arquivo:linhas`
164
+ + o trecho)
164
165
  standard: <path(s) .md do(s) standard(s) do domínio — leia-o(s) antes de implementar>
165
166
  instrução: |
166
167
  Leia o(s) standard(s) indicado(s) antes de escrever código.
@@ -172,6 +173,13 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
172
173
  (`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
173
174
  nunca bloqueia. Se algo cobre o caso, reuse ou estenda; se criar mesmo
174
175
  assim, diga por que em uma linha no relatório.
176
+ Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
177
+ acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
178
+ dependem uma da outra vão no mesmo turno, em paralelo.
179
+ Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
180
+ `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
181
+ da task. Só o porquê que o código não mostra, em uma linha
182
+ (`architecture-code-comments`).
175
183
  Não modifique spec.md, mandate.md.
176
184
 
177
185
  Contrato do relatório final:
@@ -192,12 +200,23 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
192
200
  DENTRO do seu worktree; commite seu trabalho na branch do worktree como
193
201
  último ato antes do relatório; reporte a branch — nunca faça merge nem
194
202
  toque na árvore principal.
203
+ - Ao rodar teste: compile uma vez e rode sem recompilar (`dotnet test
204
+ --no-build`); só os testes que a mudança toca (`--filter`) e, depois de
205
+ uma falha, só os que falharam. Grave a saída em arquivo uma vez
206
+ (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
207
+ rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
208
+ linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
195
209
 
196
210
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
197
211
  volta — fatie antes, não depois.
198
- 5. SOBREVIVÊNCIA: commite `wip({taskId})` ao fim de cada task. Se você parar no
199
- limite de turnos, é o commit que preserva o trabalho — sem ele, a retomada
200
- recomeça do zero.
212
+ 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
213
+ corta sem aviso: commite `wip({taskId})` a cada marco (arquivo que
214
+ compila, teste que passa), não só ao fim da task — e só os seus arquivos
215
+ (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
216
+ A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
217
+ na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
218
+ por decisão sua; ao concluir, o relatório final substitui o parcial, sem o
219
+ `PARCIAL`. Sem limite declarado, bastam os commits por marco.
201
220
  6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
202
221
  sessões). Encerre dev server pelo PID que você mesmo subiu.
203
222
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
@@ -210,16 +229,25 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
210
229
  ```
211
230
 
212
231
  > **Passo pós-dispatch (do orquestrador, antes de avaliar qualquer relatório):** ao retomar o
213
- > controle, rode `git status --porcelain src/` e `grep -rn "MUTACAO" src/`. Um sub-agent morto no
214
- > meio deixa o disco a meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu
215
- > avalia um estado que ninguém quis. Árvore inesperadamente suja é falha de protocolo: registre no
216
- > recap antes de pontuar.
232
+ > controle, a auditoria do batch abaixo (`report-check` com os ids do batch) traz, no bloco `tree`,
233
+ > o que está não commitado fora de `.morph/` (`dirty`, `diffstat`), os commits sobre a default
234
+ > (`commits`) e os marcadores `MUTACAO` esquecidos (`markers`) — sem `git status`, `git diff` e
235
+ > `grep` à parte. Um sub-agent morto no meio deixa o disco a meio caminho — e um relatório lido
236
+ > sobre uma árvore que ninguém conferiu avalia um estado que ninguém quis. Árvore inesperadamente
237
+ > suja ou `markers` não vazio é falha de protocolo: registre no recap antes de pontuar.
238
+
239
+ > **Relatório com `PARCIAL` na 1ª linha = a task não está pronta**: o sub-agent parou antes do fim
240
+ > (limite de turnos, cláusula 5). O `report-check` o acusa como `report-incomplete`, e aqui a ação é
241
+ > retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
242
+ > `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
243
+ > re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
244
+ > parcial.
217
245
 
218
246
  > Este template é deliberadamente paritário com o template sequencial em `morph-implement` §4: ambos despacham o **subagent registrado do domínio (`morph-{id}`)** com standard escopado e as **mesmas 7 cláusulas** do contrato do relatório final (as 3 do relatório + escopo, sobrevivência, processos e retorno) e os mesmos 4 itens de relatório — racional completo em `MORPH.md` §6. A única diferença é que aqui múltiplos agentes rodam ao mesmo tempo, um por fluxo independente.
219
247
 
220
248
  > **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): siga a §3b-w abaixo em vez desta seção — despache com `isolation: "worktree"`, cada agente trabalha numa working tree própria e o orquestrador integra ao final.
221
249
 
222
- Aguardar todos os agentes terminarem, depois **auditar os relatórios contra o trabalho** com `morph-spec report-check {feature} --json` — determinístico e independente da palavra dos agentes; é o passo que pega tanto o relatório ausente quanto o `report-stale` (completo, porém gravado antes do fim do trabalho: o agente relatou cedo e continuou escrevendo). Em `report-stale`, **não re-despache** — leia o campo `observed` (writes reais do `events.jsonl`) e atualize o relatório a partir dele. Vereditos e ações: `MORPH.md` §6. Em seguida **ler** `.morph/features/{feature}/3-implement/reports/{taskId}.md` de cada task — é o valor de retorno autoritativo; a mensagem de texto do dispatch, se chegou inteira, é só um atalho que economiza essa leitura. Depois, sequencialmente:
250
+ Aguardar todos os agentes terminarem, depois **auditar os relatórios contra o trabalho** com `morph-spec report-check {feature} {T1} {T2} … --json` (os ids do batch: sem eles o modo feature só audita tasks já `done`, e as do batch ainda não estão) — determinístico e independente da palavra dos agentes; é o passo que pega tanto o relatório ausente quanto o `report-stale` (completo, porém gravado antes do fim do trabalho: o agente relatou cedo e continuou escrevendo). Em `report-stale`, **não re-despache** — leia o campo `observed` (writes reais do `events.jsonl`) e atualize o relatório a partir dele. Vereditos e ações: `MORPH.md` §6. Em seguida **ler** `.morph/features/{feature}/3-implement/reports/{taskId}.md` de cada task — é o valor de retorno autoritativo; a mensagem de texto do dispatch, se chegou inteira, é só um atalho que economiza essa leitura. Depois, sequencialmente:
223
251
  - **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature, **sem `--filter`**) — os agentes não a rodaram (cláusula 3). Vermelho: use `verify.feedback` para corrigir/redespachar ANTES de qualquer morph-eval. (Com isolamento por worktree, cada agente já rodou o verify dentro do seu worktree; o orquestrador roda o verify compartilhado UMA vez após o merge — ver §3b-w.)
224
252
  - Para cada relatório retornado:
225
253
  - Aplicar `Skill(morph-eval)`.
@@ -258,6 +286,7 @@ re-apresente o gate**: siga direto para o encerramento (§6) conforme a decisão
258
286
  ### 6. Pós Gate 3 — encerramento
259
287
 
260
288
  - Aprovar o Gate 3: em auto, `morph-spec approve {feature} review --mode auto`; em manual, o hook state-sync registra a resposta "aprovado" em `AskUserQuestion` — **desde que a pergunta nomeie a feature** (senão aprove via `morph-spec approve`).
289
+ - **Antes do `finish`, reescreva o contexto que a feature mudou.** Todo `.morph/context/*.md` que descreve um fato que esta feature alterou (fonte, token, fluxo, integração) tem o **corpo** reescrito — a seção que descrevia o antigo passa a descrever o novo, e o que ainda vale num escopo diz o escopo. O changelog do documento guarda só data e motivo, nunca o valor novo: um agente que lê só o corpo precisa receber a resposta de hoje. Commite na branch da feature — o `finish` exige a árvore limpa. UCs e ADRs não entram aqui: o `finish` aplica ao acervo o que o `spec.md` declarou revogar (`morph-plan` §3) e reporta em `supersededUseCases`/`adrIndex`/`revocationProblems`.
261
290
  - **Fechar a feature** com `morph-spec finish {feature} --pr|--merge`, modo escolhido via `AskUserQuestion` (header `"Integração"`): `--pr` (push + PR, review antes do merge) vs `--merge` (integra local, single-user direto). Não integre automaticamente sem essa escolha. Mecânica completa (o que cada modo faz, feature legada sem `morph/{f}`): `MORPH.md` §2.1/§2.2.
262
291
  - **`--pr` não encerra a feature; quem encerra é o merge.** O comando arquiva e termina (`finished: true`) nos dois modos, mas só `--merge` integra na hora (`integrated: true`); `--pr` sai com `integrated: false`, `awaiting: "merge"` e `pr: {number, url}` — o archive viaja no diff do PR e só chega na branch default quando alguém mergeia. Até lá a feature aparece em `morph-spec list`/`fleet` como `aguardando-merge`, sem cópia local. Nunca registre a feature como entregue só porque `finish --pr` retornou `finished: true`.
263
292
 
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
4
4
  version: core
5
5
  when-to-invoke: ao receber um novo request de feature, antes de morph-plan
6
6
  user-invokable: true
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -21,7 +21,7 @@ O harness conhece o stack por padrão (backend .NET 10 + VSA + EF Core/Neon, IA
21
21
 
22
22
  ## Modo bug-lean (`workType: bug`)
23
23
 
24
- Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix**, sem as seções de negócio completas.
24
+ Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Conflitos com o acervo**, sem as seções de negócio completas.
25
25
 
26
26
  Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
27
27
 
@@ -36,11 +36,18 @@ Fato não se pergunta. Antes de levar a primeira pergunta ao usuário, levante o
36
36
  - Em brownfield, varre stack atual (.csproj, package.json, migrations), padrões (Guid.NewGuid vs Guid.CreateVersion7, sealed, result pattern), features existentes.
37
37
  - Produz `.morph/features/{feature}/0-proposal/stack-scan.md`.
38
38
 
39
- 2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/` e o **acervo de use cases** em `.morph/specs/usecases/`. O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
39
+ 2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/`, o **acervo de use cases** em `.morph/specs/usecases/` e o **índice de ADRs ativos** em `.morph/specs/adrs/` (um arquivo por ADR, se existir). O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
40
40
 
41
- 3. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, atualize `.morph/context/design-system.md` com a fonte escolhida + entrada de changelog (data, motivo).
41
+ O acervo tem ciclo de vida: UC com `status: superseded` **não é o comportamento vigente** — o vigente é o `superseded_by`, e `scope` (quando existe) diz onde o antigo ainda vale. Decisão vigente é a do índice; os `decisions.md` de `.morph/archive/` são **história, não instrução** — abra um só para entender por que algo é como é, nunca para decidir.
42
42
 
43
- 4. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
43
+ 3. **Conflitos com o acervo — avise, não entreviste.** Para cada UC vigente, ADR do índice ou documento de `.morph/context/` que o pedido novo **contradiz**:
44
+ - **Avise o usuário** — uma linha por conflito no resumo que abre a Parte 2 (fonte, o que ela diz, o que o pedido muda). Aviso, não pergunta.
45
+ - **Pedido explícito sobre o ponto → vale o mais novo.** Registre a escolha na coluna **Decisão** da seção de conflitos (o que muda, o que o antigo ainda cobre) e siga. Só entra na árvore (Parte 1) o conflito que o pedido deixa **ambíguo** — "o admin passa a Geist" não diz nada sobre a vitrine, então a vitrine é decisão; o admin não é.
46
+ - Todo conflito vai para a seção **Conflitos com o acervo** do `proposal.md` (Parte 4). A `2-plan/` só abre depois do Gate 1, então é a `morph-plan` que transforma cada decisão pelo novo em ADR no `decisions.md` e em linha de revogação no `spec.md` (§3) — é essa linha que o `finish` aplica ao acervo.
47
+
48
+ 4. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, **reescreva o corpo** de `.morph/context/design-system.md` com a fonte escolhida — a seção que descrevia a antiga passa a descrever a nova, e o valor que ainda vale num escopo diz o escopo. O changelog guarda **só data e motivo**, nunca o valor novo: quem lê só o corpo precisa receber a resposta de hoje.
49
+
50
+ 5. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
44
51
 
45
52
  ### Parte 1 — Árvore de decisões abertas
46
53
 
@@ -93,10 +100,11 @@ options:
93
100
  - **Stack:** confirme o stack padrão ou documente desvios aprovados
94
101
  - **Riscos e dependências:** o que pode dar errado, o que esta feature depende
95
102
  - **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
103
+ - **Conflitos com o acervo:** os conflitos da Parte 0 (passo 3), numa tabela `Fonte | O que diz hoje | O que o pedido muda | Decisão` — ou `Nenhum conflito encontrado.`. A seção existe sempre, também no bug-lean: ausente, ela diz que a checagem não rodou (o `validate-feature` avisa)
96
104
 
97
105
  **Não escreva critérios de aceite aqui.** O comportamento verificável mora nos **use cases**, destilados pela `morph-plan` na fase seguinte (`2-plan/usecases/UC-{nn}-{slug}.md`), onde cada pós-condição precisa ser observável em teste e chega literal ao `doneCriteria` das tasks. O `proposal.md` responde **o quê e por quê**; os use cases respondem **como o sistema se comporta**. Duplicar aqui produz duas fontes que divergem no primeiro ajuste.
98
106
 
99
- **Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável** e **Escopo do fix** (o que muda, o que fica de fora) — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
107
+ **Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável**, **Escopo do fix** (o que muda, o que fica de fora) e **Conflitos com o acervo** — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
100
108
 
101
109
  Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
102
110
 
@@ -142,7 +150,7 @@ options:
142
150
  No caminho manual, o hook state-sync.js detecta a aprovação automaticamente (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} proposal`). Em modo auto sem AskUserQuestion, aprove via `morph-spec approve {feature} proposal --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta 2-plan/) — nunca via Edit à mão de state.json.
143
151
 
144
152
  ## Output esperado
145
- - `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack"
153
+ - `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack" e os conflitos com o acervo listados em "Conflitos com o acervo"
146
154
  - Gate 1 apresentado e aprovado
147
155
 
148
156
  ## Referências
@@ -150,3 +158,4 @@ options:
150
158
  - `morph-spec standards --find "<query>"` — para referência de standards relevantes à stack (ver `morph-standards`)
151
159
  - `.claude/skills/morph-stack-scan/SKILL.md` — invocada na Parte 0 (varredura), antes de qualquer pergunta
152
160
  - `.morph/framework/MORPH.md` §5 — regras de pausa do Gate 1 (trust mode)
161
+ - `.morph/specs/usecases/` e `.morph/specs/adrs/` — o acervo vigente (UC `superseded` e `decisions.md` arquivado não são instrução); lidos na Parte 0
@@ -4,7 +4,7 @@ description: Avalia a qualidade de uma tarefa ou fase com rubricas graduadas 0-1
4
4
  version: core
5
5
  when-to-invoke: ao completar uma tarefa ou ao finalizar uma fase de implementação
6
6
  user-invokable: false
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -4,7 +4,7 @@ description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de prod
4
4
  version: core
5
5
  when-to-invoke: ao receber "/morph-hotfix {feature}", quando a morph-proposal classifica o pedido como workType hotfix (Passo 0), ou o usuário diz "produção caiu / hotfix / urgente"
6
6
  user-invokable: true
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -4,7 +4,7 @@ description: Guia a execução de cada tarefa de implementação com standard e
4
4
  version: core
5
5
  when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
6
6
  user-invokable: false
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -62,7 +62,8 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
62
62
  Standard: [path do .md do standard identificado no passo 2]
63
63
  Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
64
64
  — este campo não é decorativo: é por ele que o código já existente chega
65
- ao sub-agente, que trabalha em contexto fresco e não conhece o projeto]
65
+ ao sub-agente, que trabalha em contexto fresco e não conhece o projeto.
66
+ O que você já leu para esta task entra como `arquivo:linhas` + o trecho]
66
67
  Reuso: [task.reuse do tasks.json — `CONCEITO: VEREDITO → alvo`, uma linha por
67
68
  conceito; ausente numa task que não introduz conceito]
68
69
  Done quando: [doneCriteria do tasks.json]
@@ -73,6 +74,15 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
73
74
  a ausência de grafo nunca bloqueia. Se algo cobre o caso, reuse ou estenda;
74
75
  se criar mesmo assim, diga por que em uma linha no relatório.
75
76
 
77
+ Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
78
+ acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
79
+ dependem uma da outra vão no mesmo turno, em paralelo.
80
+
81
+ Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
82
+ `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
83
+ da task. Só o porquê que o código não mostra, em uma linha
84
+ (`architecture-code-comments`).
85
+
76
86
  Contrato do relatório final:
77
87
  1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
78
88
  encerrar — é o retorno autoritativo, não a sua mensagem final (que é
@@ -86,12 +96,23 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
86
96
  branch do worktree como último ato antes do relatório — nunca faça merge.
87
97
  Worktree não commitado NÃO é removido pelo hook e vira pendência do
88
98
  `doctor`; o commit é o que torna o seu trabalho integrável.
99
+ Ao rodar teste: compile uma vez e rode sem recompilar (`dotnet test
100
+ --no-build`); só os testes que a mudança toca (`--filter`) e, depois de
101
+ uma falha, só os que falharam. Grave a saída em arquivo uma vez
102
+ (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
103
+ rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
104
+ linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
89
105
 
90
106
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
91
107
  volta — fatie antes, não depois.
92
- 5. SOBREVIVÊNCIA: commite `wip({taskId})` ao fim de cada task. Se você parar no
93
- limite de turnos, é o commit que preserva o trabalho — sem ele, a retomada
94
- recomeça do zero.
108
+ 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
109
+ corta sem aviso: commite `wip({taskId})` a cada marco (arquivo que
110
+ compila, teste que passa), não só ao fim da task — e só os seus arquivos
111
+ (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
112
+ A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
113
+ na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
114
+ por decisão sua; ao concluir, o relatório final substitui o parcial, sem o
115
+ `PARCIAL`. Sem limite declarado, bastam os commits por marco.
95
116
  6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
96
117
  sessões). Encerre dev server pelo PID que você mesmo subiu.
97
118
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
@@ -103,11 +124,15 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
103
124
  justificativa em uma linha. Relatório ausente, oco, ou sem os 4 itens, é
104
125
  falha de protocolo.
105
126
  ```
106
- **Passo pós-dispatch (seu, antes de avaliar o relatório):** rode `git status --porcelain src/`
107
- e `grep -rn "MUTACAO" src/` ao retomar o controle. Um sub-agent morto no meio deixa o disco a
108
- meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu avalia um estado que
109
- ninguém quis. Árvore inesperadamente suja é falha de protocolo: registre no recap antes de
110
- pontuar.
127
+ **Passo pós-dispatch (seu, antes de avaliar o relatório):** rode
128
+ `morph-spec report-check {feature} {taskId} --json` ao retomar o controle. Além do veredito do
129
+ relatório, o bloco `tree` traz o que está não commitado fora de `.morph/` (`dirty`, `diffstat`),
130
+ os commits sobre a default (`commits`) e os marcadores `MUTACAO` esquecidos (`markers`) — a
131
+ conferência de `git status`, `git diff` e `grep`, numa chamada só. Um sub-agent morto no meio
132
+ deixa o disco a meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu avalia
133
+ um estado que ninguém quis. Árvore inesperadamente suja ou `markers` não vazio é falha de
134
+ protocolo: registre no recap antes de pontuar. Essa saída serve ao passo 7 enquanto a árvore
135
+ não mudar; depois de uma correção sua, rode de novo.
111
136
 
112
137
  Após o retorno do dispatch: **leia primeiro** `.morph/features/{feature}/3-implement/reports/[ID].md`
113
138
  — é o valor de retorno autoritativo. Trate a mensagem de texto do sub-agent, se chegou inteira,
@@ -119,11 +144,20 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
119
144
  para o passo 7 — se a task deve evidência de runtime (`evidencias/` em `outputs`), confira o
120
145
  arquivo como manda o passo 5 antes do `done`.
121
146
 
147
+ **Relatório com `PARCIAL` na 1ª linha = a task não está pronta**: o sub-agent parou antes do fim
148
+ (limite de turnos, cláusula 5). O `report-check` o acusa como `report-incomplete`, e aqui a ação é
149
+ retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
150
+ `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
151
+ re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
152
+ parcial.
153
+
122
154
  **Se não — siga para o passo 5.**
123
155
 
124
156
  5. Implemente a tarefa seguindo o standard e a persona identificados.
125
157
  Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
126
158
  e resolva da forma mais conservadora — não pause para perguntar, a menos que seja bloqueante.
159
+ Testes rodados durante a implementação inline seguem o mesmo loop da cláusula 3 do template
160
+ do passo 4 (compilar uma vez, `--filter`, saída em arquivo).
127
161
 
128
162
  **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM —
129
163
  `morph-plan` §5): rode o eval ANTES de marcar `done` — e só o eval. Com nó `runner: "evals"`
@@ -4,7 +4,7 @@ description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo
4
4
  version: core
5
5
  when-to-invoke: quando a tarefa é PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisa decidir modelo, prompt e aprovação
6
6
  user-invokable: true
7
- cliVersion: "8.37.1"
7
+ cliVersion: "8.40.0"
8
8
  stacks:
9
9
  - dotnet
10
10
  - nextjs