@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.
- package/CLAUDE.md +37 -13
- package/README.md +2 -2
- package/bin/morph-spec.js +75 -49
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +6 -5
- package/framework/MORPH.md +25 -22
- package/framework/agents.json +96 -36
- package/framework/docs/CLI.md +54 -17
- package/framework/evals/rubrics/code-quality.md +5 -0
- package/framework/evals/rubrics/condensed.md +6 -2
- package/framework/evals/rubrics/contracts.md +20 -0
- package/framework/evals/rubrics/test-coverage.md +17 -6
- package/framework/hooks/README.md +9 -3
- package/framework/hooks/claude-code/core/graph-refresh-kick.js +52 -0
- package/framework/hooks/claude-code/core/telemetry-log.js +172 -87
- package/framework/hooks/claude-code/core/validate-completion.js +16 -90
- package/framework/hooks/claude-code/core/worktree-context.js +10 -0
- package/framework/hooks/shared/command-tokens.js +96 -0
- package/framework/hooks/shared/git-exclude.js +44 -0
- package/framework/hooks/shared/git-paths.js +52 -0
- package/framework/hooks/shared/graph-freshness.js +380 -0
- package/framework/hooks/shared/graph-refresh.js +416 -0
- package/framework/hooks/shared/morph-cli.js +17 -5
- package/framework/hooks/shared/redact-secrets.js +55 -0
- package/framework/hooks/shared/telemetry-logger.js +25 -2
- package/framework/hooks/shared/transcript-usage.js +80 -0
- package/framework/mcp/registry.json +33 -2
- package/framework/rubrics/backend.json +2 -2
- package/framework/rubrics/default.json +2 -2
- package/framework/rubrics/frontend.json +2 -2
- package/framework/rules/csharp-standards.md +1 -0
- package/framework/rules/infrastructure-standards.md +0 -1
- package/framework/rules/morph-workflow.md +10 -4
- package/framework/rules/nextjs-standards.md +1 -0
- package/framework/schemas/config.schema.json +41 -1
- package/framework/schemas/feature.schema.json +5 -1
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +40 -11
- package/framework/skills/core/morph-brainstorming/SKILL.md +16 -7
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
- package/framework/skills/core/morph-implement/SKILL.md +44 -10
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +73 -15
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +51 -13
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +39 -13
- package/framework/standards/STANDARDS.json +189 -14
- package/framework/standards/ai-agents/context-providers.md +16 -26
- package/framework/standards/ai-agents/durable-workflows-hitl.md +15 -21
- package/framework/standards/ai-agents/modalities-image-gen.md +21 -25
- package/framework/standards/ai-agents/modalities-speech-to-text.md +4 -15
- package/framework/standards/ai-agents/modalities-text-to-speech.md +2 -11
- package/framework/standards/ai-agents/modalities-vision.md +1 -18
- package/framework/standards/ai-agents/prompt-sources.md +0 -4
- package/framework/standards/ai-agents/testing-ai.md +2 -1
- package/framework/standards/architecture/code-comments.md +100 -0
- package/framework/standards/backend/dotnet/testing.md +22 -0
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +63 -50
- package/framework/standards/frontend/admin-app/data-table.md +562 -0
- package/framework/standards/frontend/admin-app/feedback.md +236 -0
- package/framework/standards/frontend/admin-app/forms.md +232 -0
- package/framework/standards/frontend/admin-app/page-structure.md +203 -0
- package/framework/standards/frontend/design-system/ai-image-generation.md +5 -5
- package/framework/standards/frontend/nextjs/components.md +37 -58
- package/framework/standards/frontend/nextjs/data-fetching.md +1 -0
- package/framework/standards/frontend/nextjs/forms.md +31 -30
- package/framework/standards/frontend/nextjs/state-management.md +2 -1
- package/framework/standards/frontend/nextjs/testing.md +18 -0
- package/framework/standards/integration/mcp/mcp-tools.md +48 -117
- package/framework/templates/code/dotnet/abstractions/result.cs +0 -2
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +26 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +28 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +99 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +2 -44
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +40 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +54 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +53 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +192 -281
- package/framework/templates/code/dotnet/database/migration.cs +49 -83
- package/framework/templates/code/dotnet/database/vector-entity.cs +2 -46
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +0 -2
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +11 -15
- package/framework/templates/code/dotnet/jobs/agent.cs +3 -51
- package/framework/templates/code/dotnet/jobs/job.cs +2 -97
- package/framework/templates/code/dotnet/test.cs +2 -87
- package/framework/templates/code/typescript/contracts.ts +140 -167
- package/framework/templates/context/design-system.md +3 -3
- package/framework/templates/docs/proposal.md +11 -0
- package/framework/templates/docs/spec.md +15 -0
- package/framework/templates/docs/ui-mockups.md +115 -98
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +1 -48
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +3 -79
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +1 -70
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +1 -47
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +2 -99
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +0 -6
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +3 -88
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +1 -41
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +0 -21
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +1 -25
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +2 -63
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +0 -30
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +1 -52
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +3 -78
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +4 -109
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +0 -22
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +1 -36
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +2 -57
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +0 -75
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +2 -59
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +4 -111
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +0 -34
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +1 -57
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +0 -19
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +2 -74
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +2 -33
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +1 -43
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +1 -96
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +0 -13
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +0 -27
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +0 -33
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +0 -31
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +3 -75
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +0 -42
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +0 -39
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +1 -55
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +3 -59
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +0 -46
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +3 -28
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +7 -61
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +2 -37
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +1 -23
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +2 -82
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +1 -68
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +1 -62
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +2 -62
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +1 -25
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +0 -124
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +1 -73
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +1 -66
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +0 -41
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +2 -112
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +2 -43
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +5 -110
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +7 -103
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +1 -42
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +1 -30
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +1 -19
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +0 -48
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +1 -29
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +2 -38
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +1 -14
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +4 -69
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +1 -10
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +1 -57
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +0 -26
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +1 -19
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +0 -32
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +0 -14
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +0 -24
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +0 -32
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +0 -37
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +0 -24
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +0 -78
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +0 -53
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +0 -44
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +0 -44
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +0 -19
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +0 -24
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +6 -48
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +1 -13
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +2 -71
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +5 -100
- package/framework/templates/feature/decisions.md +124 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +39 -43
- package/framework/templates/frontend/nextjs/env.mjs.hbs +29 -32
- package/framework/templates/frontend/nextjs/page.tsx.hbs +21 -22
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +42 -54
- package/framework/templates/integrations/asaas-client.cs +332 -387
- package/framework/templates/integrations/asaas-webhook.cs +290 -351
- package/framework/templates/integrations/neon-auth-config.cs +9 -105
- package/framework/templates/project/validate.js +97 -120
- package/package.json +2 -2
- package/src/commands/dashboard/dashboard.js +80 -53
- package/src/commands/graph/affected.js +4 -3
- package/src/commands/graph/build.js +109 -18
- package/src/commands/graph/explain.js +8 -5
- package/src/commands/graph/status.js +14 -8
- package/src/commands/mcp/mcp-setup.js +37 -9
- package/src/commands/observability/cost.js +148 -18
- package/src/commands/project/doctor.js +85 -15
- package/src/commands/project/init.js +6 -3
- package/src/commands/project/install-plugin-cmd.js +1 -1
- package/src/commands/project/update.js +30 -0
- package/src/commands/project/worktree.js +73 -90
- package/src/commands/state/advance.js +18 -0
- package/src/commands/state/approve.js +15 -0
- package/src/commands/state/archive.js +62 -9
- package/src/commands/state/finish.js +62 -14
- package/src/commands/state/gate-check.js +8 -1
- package/src/commands/state/gate-decision.js +8 -4
- package/src/commands/state/report-check.js +90 -9
- package/src/commands/state/usecase.js +66 -0
- package/src/commands/tasks/dag.js +17 -2
- package/src/commands/validation/validate-feature.js +6 -1
- package/src/commands/validation/verify.js +20 -1
- package/src/dashboard/app/App.jsx +80 -16
- package/src/dashboard/app/components/ActivityFeed.jsx +172 -0
- package/src/dashboard/app/components/CommandPalette.jsx +155 -0
- package/src/dashboard/app/components/DetailPanel.jsx +47 -11
- package/src/dashboard/app/components/EntityLink.jsx +55 -0
- package/src/dashboard/app/components/ErrorBoundary.jsx +54 -0
- package/src/dashboard/app/components/FlowGraph.jsx +19 -17
- package/src/dashboard/app/components/KnowledgeMarkdown.jsx +53 -0
- package/src/dashboard/app/components/Markdown.jsx +47 -0
- package/src/dashboard/app/components/PhaseRail.jsx +111 -0
- package/src/dashboard/app/components/SearchFilter.jsx +40 -22
- package/src/dashboard/app/components/Sidebar.jsx +146 -37
- package/src/dashboard/app/hooks/useMorphQuery.js +54 -0
- package/src/dashboard/app/hooks/usePref.js +38 -0
- package/src/dashboard/app/lib/format.js +69 -0
- package/src/dashboard/app/lib/phases.js +56 -0
- package/src/dashboard/app/lib/project.js +50 -0
- package/src/dashboard/app/pages/Activity.jsx +24 -0
- package/src/dashboard/app/pages/AgentMap.jsx +371 -370
- package/src/dashboard/app/pages/FeatureDetail.jsx +604 -0
- package/src/dashboard/app/pages/Features.jsx +400 -0
- package/src/dashboard/app/pages/Guide.jsx +146 -0
- package/src/dashboard/app/pages/HookInspector.jsx +357 -322
- package/src/dashboard/app/pages/PhasePipeline.jsx +277 -408
- package/src/dashboard/app/pages/Portfolio.jsx +156 -0
- package/src/dashboard/app/pages/Rubrics.jsx +101 -0
- package/src/dashboard/app/pages/RulesMap.jsx +300 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +483 -366
- package/src/dashboard/app/pages/Standards.jsx +407 -332
- package/src/dashboard/app/styles/index.css +187 -47
- package/src/dashboard/index.html +14 -12
- package/src/dashboard/package.json +32 -24
- package/src/dashboard/scanner/activity-scanner.js +351 -0
- package/src/dashboard/scanner/agents-scanner.js +63 -1
- package/src/dashboard/scanner/docs-scanner.js +59 -0
- package/src/dashboard/scanner/feature-status.js +10 -0
- package/src/dashboard/scanner/features-scanner.js +360 -0
- package/src/dashboard/scanner/hooks-scanner.js +8 -1
- package/src/dashboard/scanner/index.js +14 -7
- package/src/dashboard/scanner/phases-scanner.js +14 -15
- package/src/dashboard/scanner/portfolio.js +153 -0
- package/src/dashboard/scanner/project-api.js +195 -0
- package/src/dashboard/scanner/rules-scanner.js +42 -37
- package/src/dashboard/scanner/skills-scanner.js +105 -43
- package/src/dashboard/scanner/standards-scanner.js +4 -1
- package/src/dashboard/vite-plugin-morph-data.js +134 -17
- package/src/lib/ai/comment-stripper.js +101 -4
- package/src/lib/detectors/claude-config-detector.js +2 -7
- package/src/lib/detectors/index.js +5 -1
- package/src/lib/evaluator-report.js +47 -0
- package/src/lib/generators/handoff-generator.js +4 -18
- package/src/lib/generators/settings-generator.js +208 -209
- package/src/lib/git/default-branch.js +52 -0
- package/src/lib/git/tree-fingerprint.js +58 -0
- package/src/lib/git/tree-state.js +167 -0
- package/src/lib/graph/god-nodes.js +12 -3
- package/src/lib/graph/graph-health.js +48 -2
- package/src/lib/graph/graph-loader.js +99 -25
- package/src/lib/graph/graphifyignore.js +145 -28
- package/src/lib/graph/sanitize.js +117 -11
- package/src/lib/installers/mcp-installer.js +724 -719
- package/src/lib/installers/memory-installer.js +1 -2
- package/src/lib/projects/registry.js +154 -0
- package/src/lib/risk-detector.js +90 -0
- package/src/lib/specs/acervo-format.js +70 -0
- package/src/lib/specs/acervo-lifecycle.js +264 -0
- package/src/lib/specs/adr-index.js +169 -0
- package/src/lib/specs/revocations.js +156 -0
- package/src/lib/specs/screen-checklist.js +357 -0
- package/src/lib/specs/usecase-check.js +20 -16
- package/src/lib/specs/usecase-promoter.js +103 -38
- package/src/lib/specs/usecase-registry.js +7 -7
- package/src/lib/tasks/tasks-json-parser.js +2 -3
- package/src/lib/telemetry/metrics.js +386 -0
- package/src/lib/telemetry/telemetry-reader.js +161 -51
- package/src/lib/telemetry/verify-event.js +79 -0
- package/src/lib/validators/code-budget/code-budget-validator.js +200 -0
- package/src/lib/validators/code-budget/comment-scanner.js +75 -0
- package/src/lib/validators/code-budget/index.js +9 -0
- package/src/lib/validators/reuse/reuse-validator.js +4 -2
- package/src/lib/validators/reuse/symbol-scanner.js +27 -22
- package/src/lib/validators/validation-runner.js +21 -5
- package/src/lib/validators/verify-runner.js +11 -0
- package/src/lib/worktree/finish-backup.js +739 -0
- package/src/lib/worktree/ignored-triage.js +15 -8
- package/src/lib/worktree/worktree-audit.js +5 -0
- package/src/scripts/install-plugin.js +1 -1
- package/src/scripts/setup-infra.js +31 -22
- package/src/utils/agents-installer.js +338 -24
- package/src/utils/banner.js +1 -1
- package/src/utils/hooks-installer.js +75 -15
- package/src/commands/index.js +0 -13
- package/src/commands/project/checkpoint.js +0 -209
- package/src/core/state/phase-state-machine.js +0 -197
- package/src/dashboard/app/hooks/useDetailPanel.js +0 -15
- package/src/dashboard/app/pages/LiveState.jsx +0 -206
- package/src/dashboard/scanner/squads-scanner.js +0 -13
- package/src/dashboard/scanner/state-scanner.js +0 -85
- package/src/lib/generators/index.js +0 -10
- package/src/lib/hooks/hook-executor.js +0 -167
- package/src/lib/validators/checkpoint-persistence.js +0 -39
- package/src/lib/validators/shared/emit-validator-dispatch.js +0 -14
- package/src/lib/validators/shared/index.js +0 -12
- package/src/lib/validators/shared/issue-counter.js +0 -14
- 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
|
-
"
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
@@ -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,
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
|
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` |
|
|
@@ -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
|
|
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.
|
|
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.
|
|
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.
|
|
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)
|
|
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:
|
|
199
|
-
|
|
200
|
-
|
|
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,
|
|
214
|
-
>
|
|
215
|
-
>
|
|
216
|
-
>
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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.
|
|
7
|
+
cliVersion: "8.40.0"
|
|
8
8
|
stacks:
|
|
9
9
|
- dotnet
|
|
10
10
|
- nextjs
|