@polymorphism-tech/morph-spec 8.34.2 → 8.35.1
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 +22 -5
- package/README.md +2 -2
- package/bin/morph-spec.js +18 -4
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +5 -4
- package/docs/QUICKSTART.md +1 -1
- package/framework/MORPH.md +16 -17
- package/framework/agents.json +197 -44
- package/framework/ai-pin.json +22 -0
- package/framework/commands/morph-media.md +45 -0
- package/framework/docs/CLI.md +236 -11
- package/framework/evals/proof-rubrics/README.md +76 -0
- package/framework/evals/proof-rubrics/eval-de-modelo.md +64 -0
- package/framework/evals/proof-rubrics/fiacao.md +54 -0
- package/framework/evals/proof-rubrics/guard-cego.md +52 -0
- package/framework/evals/proof-rubrics/media-claims.md +109 -0
- package/framework/evals/proof-rubrics/mutation-proof.md +77 -0
- package/framework/evals/proof-rubrics/observabilidade-genai.md +119 -0
- package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +48 -0
- package/framework/evals/rubrics/architecture.md +30 -0
- package/framework/evals/rubrics/code-quality.md +26 -0
- package/framework/evals/rubrics/test-coverage.md +20 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +41 -4
- package/framework/hooks/claude-code/core/worktree-env-inject.js +43 -0
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/e2e-check.js +135 -22
- package/framework/hooks/shared/payload-utils.js +15 -2
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rules/ai-agents-standards.md +14 -2
- package/framework/schemas/ai-pin.schema.json +97 -0
- package/framework/schemas/config.schema.json +107 -0
- package/framework/schemas/feature.schema.json +23 -4
- 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 +26 -5
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
- package/framework/skills/core/morph-implement/SKILL.md +18 -2
- package/framework/skills/core/morph-media/SKILL.md +215 -0
- package/framework/skills/core/morph-plan/SKILL.md +33 -2
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +166 -9
- 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 +1 -1
- package/framework/standards/PROVENANCE.json +81 -3
- package/framework/standards/STANDARDS.json +1483 -839
- package/framework/standards/ai-agents/agent-archetypes.md +160 -0
- package/framework/standards/ai-agents/agent-session.md +164 -68
- package/framework/standards/ai-agents/agent-spec.md +196 -0
- package/framework/standards/ai-agents/batching.md +61 -37
- package/framework/standards/ai-agents/context-providers.md +97 -24
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +239 -0
- package/framework/standards/ai-agents/cost-and-budget.md +256 -0
- package/framework/standards/ai-agents/durable-workflows-hitl.md +98 -5
- package/framework/standards/ai-agents/evals-with-cache.md +289 -0
- package/framework/standards/ai-agents/guardrails.md +222 -0
- package/framework/standards/ai-agents/llm-runtime-defaults.md +226 -0
- package/framework/standards/ai-agents/mcp-server.md +119 -18
- package/framework/standards/ai-agents/mcp-tools.md +85 -32
- package/framework/standards/ai-agents/media-pipeline.md +352 -0
- package/framework/standards/ai-agents/media-video.md +267 -0
- package/framework/standards/ai-agents/middleware-patterns.md +39 -5
- package/framework/standards/ai-agents/modalities-image-gen.md +354 -105
- package/framework/standards/ai-agents/modalities-speech-to-text.md +8 -2
- package/framework/standards/ai-agents/modalities-text-to-speech.md +10 -2
- package/framework/standards/ai-agents/modalities-vision.md +6 -2
- package/framework/standards/ai-agents/multi-agent-patterns.md +61 -5
- package/framework/standards/ai-agents/observability-patterns.md +227 -17
- package/framework/standards/ai-agents/production.md +38 -9
- package/framework/standards/ai-agents/prompt-sources.md +389 -0
- package/framework/standards/ai-agents/providers/model-registry.md +174 -39
- package/framework/standards/ai-agents/rag-custom-pgvector.md +69 -4
- package/framework/standards/ai-agents/service-tier-flex.md +27 -19
- package/framework/standards/ai-agents/setup.md +166 -50
- package/framework/standards/ai-agents/structured-output.md +34 -3
- package/framework/standards/ai-agents/sweet-spot.md +23 -3
- package/framework/standards/ai-agents/testing-ai.md +236 -0
- package/framework/standards/ai-agents/vector-data-extensions.md +50 -20
- package/framework/standards/ai-agents/workflows.md +27 -7
- package/framework/standards/frontend/design-system/ai-image-generation.md +12 -0
- package/framework/standards/frontend/design-system/ai-video-generation.md +13 -0
- package/framework/standards/infrastructure/docker/local-compose-isolation.md +3 -1
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +13 -0
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +1 -1
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +1 -1
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/dotnet/ai-kit/Directory.Build.props +25 -0
- package/framework/templates/dotnet/ai-kit/Directory.Packages.props +26 -0
- package/framework/templates/dotnet/ai-kit/Morph.AiKit.sln +56 -0
- package/framework/templates/dotnet/ai-kit/NuGet.config +12 -0
- package/framework/templates/dotnet/ai-kit/README.md +128 -0
- package/framework/templates/dotnet/ai-kit/global.json +9 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +65 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +289 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +91 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +91 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +181 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +14 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +174 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +54 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +75 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +71 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +246 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +57 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +78 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +225 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +463 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +32 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +49 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +214 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +168 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +142 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +349 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +42 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +77 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +28 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +107 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +253 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +103 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +259 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +21 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +47 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +102 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +44 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +192 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +94 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +99 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +97 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +133 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +93 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +112 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +288 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +158 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +29 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +208 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +95 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Morph.AiKit.csproj +38 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +119 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +82 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +33 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +267 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +474 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/model-registry.v2.json +87 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +169 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +49 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +495 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +260 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +405 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +379 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +197 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +139 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +157 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +178 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +153 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +194 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +86 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +213 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +95 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +225 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +215 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +33 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +89 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +55 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +60 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +131 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +133 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +127 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +216 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +264 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +148 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +184 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +89 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +98 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +451 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +76 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +33 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +261 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +374 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/.morph-eval-cache.json +12 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/orcamento/acme/a-resposta-estruturada.json +24 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/a-saudacao.json +23 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/b-escalonamento.json +24 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/globex/a-saudacao.json +23 -0
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +3 -3
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/e2e/e2e.js +15 -2
- package/src/commands/index.js +13 -13
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +148 -6
- package/src/commands/project/update.js +469 -153
- package/src/commands/project/worktree.js +76 -4
- package/src/commands/state/advance.js +24 -2
- package/src/commands/state/approve.js +33 -1
- package/src/commands/state/create.js +72 -11
- package/src/commands/state/finish.js +379 -24
- package/src/commands/state/gate-check.js +190 -6
- package/src/commands/state/score.js +36 -1
- package/src/commands/validation/verify.js +134 -25
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/state/state-manager.js +9 -1
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/ai/ai-checks.js +182 -0
- package/src/lib/ai/ai-project-scan.js +347 -0
- package/src/lib/ai/code-audit.js +181 -0
- package/src/lib/ai/comment-stripper.js +184 -0
- package/src/lib/ai/pin-drift.js +138 -0
- package/src/lib/ai/registry-audit.js +285 -0
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/e2e/compose-env.js +50 -4
- package/src/lib/evaluator-report.js +269 -15
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/git/default-branch.js +92 -4
- package/src/lib/git/pr-files.js +56 -0
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/effects.js +193 -0
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/installers/templates-reconcile.js +3 -3
- package/src/lib/risk-detector.js +284 -0
- package/src/lib/standards/verified-against.js +276 -0
- package/src/lib/tasks/eval-node.js +485 -0
- package/src/lib/tasks/linux-runner.js +297 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/test-nodes.js +486 -0
- package/src/lib/tasks/test-runner.js +410 -33
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/verify-runner.js +583 -28
- package/src/lib/worktree/docker-audit.js +287 -0
- package/src/lib/worktree/env-allocator.js +24 -0
- package/src/lib/worktree/worktree-audit.js +30 -1
- package/src/scripts/setup-infra.js +24 -11
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +18 -8
- package/src/utils/claude-md-injector.js +10 -5
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +11 -4
- package/src/utils/hooks-installer.js +29 -26
- package/src/utils/skills-installer.js +36 -29
- package/src/utils/version-checker.js +68 -3
- package/framework/standards/ai-agents/prompts-in-db.md +0 -214
|
@@ -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.35.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
@@ -96,7 +96,10 @@ while (true):
|
|
|
96
96
|
aplicar feedback priorizado da tentativa anterior ao código já implementado
|
|
97
97
|
|
|
98
98
|
// CÓDIGO ANTES DO JUIZ — barreira determinística e barata (build+testes+validadores).
|
|
99
|
-
|
|
99
|
+
// Loop por task: --filter com os ids das suítes do stack que a task tocou
|
|
100
|
+
// (o relógio de uma task não paga a suíte inteira). Sem project.tests[]
|
|
101
|
+
// declarado há um nó só (`default`) e o --filter não tem o que escolher.
|
|
102
|
+
run: morph-spec verify {feature} {task.id} [--filter {ids-do-stack-da-task}] --json
|
|
100
103
|
if verify.status == 'fail':
|
|
101
104
|
// vermelho: feedback determinístico direto ao loop, SEM gastar o juiz LLM.
|
|
102
105
|
feedback = verify.feedback // usado como input do próximo attempt
|
|
@@ -125,7 +128,9 @@ while (true):
|
|
|
125
128
|
options: [aceitar (marca done com ressalva no recap), continuar tentando (+3 tentativas), pular task (marca blocked)]
|
|
126
129
|
```
|
|
127
130
|
|
|
128
|
-
> **
|
|
131
|
+
> **Loop por task filtra; Gate 3 e CI não.** `--filter {ids}` roda só as suítes do stack que a task tocou — os outros nós **aparecem** em `nodes.tests.runs[]` como `skip` nomeando o filtro, em vez de sumir, e um `--filter` que não casa nada é erro de uso (exit 2), nunca um verde. A verificação pós-batch e a do Gate 3 (`morph-spec verify {feature} --json`) rodam **sem filtro**: a prova que o avaliador lê tem de cobrir todos os nós, e o CI idem. Forma de `project.tests[]` e a tabela da divisão: `.morph/framework/CLI.md`, seção "Suítes de teste".
|
|
132
|
+
>
|
|
133
|
+
> **Verify vermelho consome uma tentativa** do loop (≤3) e devolve `feedback[]` acionável (erros de build, falhas de teste — linhas prefixadas por `[tests/{id}]`, que nomeiam a suíte —, issues de validador). O `morph-eval` NUNCA é invocado sobre código que não passou no verify — o juiz julga arquitetura/contratos/qualidade, o que o código determinístico não pega sozinho. Código roda antes, grátis; o juiz gasta tokens só no que sobra.
|
|
129
134
|
|
|
130
135
|
> **Retry sem re-invoke — e a exceção que evita rodar sem a skill.** `skillLoaded` cai de volta para `false` (forçando reinvocação no próximo attempt) se houver `/compact` OU troca de sessão (nova sessão retomando via `handoff.md`) entre a última invocação e o attempt corrente — os dois eventos podem descartar o conteúdo da skill do seu contexto sem avisar. Sem essa exceção, um retry pós-compact aplicaria feedback sem o mandate/standard/persona carregados. Fora desses dois casos, reinvocar a Skill só para aplicar um feedback pontual é exatamente o custo repetido (~13KB por tentativa) que este corte existe para eliminar.
|
|
131
136
|
>
|
|
@@ -178,18 +183,34 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
178
183
|
último ato antes do relatório; reporte a branch — nunca faça merge nem
|
|
179
184
|
toque na árvore principal.
|
|
180
185
|
|
|
186
|
+
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
187
|
+
volta — fatie antes, não depois.
|
|
188
|
+
5. SOBREVIVÊNCIA: commite `wip({taskId})` ao fim de cada task. Se você parar no
|
|
189
|
+
limite de turnos, é o commit que preserva o trabalho — sem ele, a retomada
|
|
190
|
+
recomeça do zero.
|
|
191
|
+
6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
|
|
192
|
+
sessões). Encerre dev server pelo PID que você mesmo subiu.
|
|
193
|
+
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
194
|
+
substituto do relatório e não deve ser chamado.
|
|
195
|
+
|
|
181
196
|
Seu relatório final deve conter APENAS: (1) o que foi feito em 2-3
|
|
182
197
|
frases, (2) arquivos modificados, (3) problemas encontrados e como foram
|
|
183
198
|
resolvidos, (4) auto-score 0-10 com justificativa em uma linha. Relatório
|
|
184
199
|
ausente, oco, ou sem os 4 itens, é falha de protocolo.
|
|
185
200
|
```
|
|
186
201
|
|
|
187
|
-
>
|
|
202
|
+
> **Passo pós-dispatch (do orquestrador, antes de avaliar qualquer relatório):** ao retomar o
|
|
203
|
+
> controle, rode `git status --porcelain src/` e `grep -rn "MUTACAO" src/`. Um sub-agent morto no
|
|
204
|
+
> meio deixa o disco a meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu
|
|
205
|
+
> avalia um estado que ninguém quis. Árvore inesperadamente suja é falha de protocolo: registre no
|
|
206
|
+
> recap antes de pontuar.
|
|
207
|
+
|
|
208
|
+
> 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.
|
|
188
209
|
|
|
189
210
|
> **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.
|
|
190
211
|
|
|
191
212
|
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:
|
|
192
|
-
- **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature) — 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.)
|
|
213
|
+
- **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.)
|
|
193
214
|
- Para cada relatório retornado:
|
|
194
215
|
- Aplicar `Skill(morph-eval)`.
|
|
195
216
|
- Gravar o score: `morph-spec score {feature} {taskId} {score} --dims {a},{c},{q},{t}`.
|
|
@@ -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.35.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-brainstorming
|
|
@@ -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.35.1"
|
|
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.35.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-hotfix
|
|
@@ -43,7 +43,7 @@ subagent_type: "morph-scout"
|
|
|
43
43
|
|
|
44
44
|
**Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback nas notes da task**.
|
|
45
45
|
|
|
46
|
-
Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) — não escreve código. Inclua as
|
|
46
|
+
Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) — não escreve código. Inclua as 7 cláusulas do contrato do relatório final no prompt (template literal em `morph-implement` §4 / `morph-apply` §3b): relatório no arquivo canônico como retorno, sem `SendMessage`; não tocar `tasks.json`/`feature.json`/`state.json` nem o board de sessão; sem build/test da suíte compartilhada em batch paralelo; no máximo 3 tasks por dispatch; commit `wip({taskId})` ao fim de cada task; nunca `taskkill /IM node.exe`.
|
|
47
47
|
|
|
48
48
|
### 3. Hotfix brief (`0-proposal/proposal.md`)
|
|
49
49
|
|
|
@@ -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.35.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-implement
|
|
@@ -87,12 +87,28 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
87
87
|
Worktree não commitado NÃO é removido pelo hook e vira pendência do
|
|
88
88
|
`doctor`; o commit é o que torna o seu trabalho integrável.
|
|
89
89
|
|
|
90
|
+
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
91
|
+
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.
|
|
95
|
+
6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
|
|
96
|
+
sessões). Encerre dev server pelo PID que você mesmo subiu.
|
|
97
|
+
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
98
|
+
substituto do relatório e não deve ser chamado.
|
|
99
|
+
|
|
90
100
|
Seu relatório (no arquivo, e na mensagem final quando ela chega) deve conter
|
|
91
101
|
APENAS: (1) o que foi feito em 2-3 frases, (2) arquivos modificados,
|
|
92
102
|
(3) problemas encontrados e como foram resolvidos, (4) auto-score 0-10 com
|
|
93
103
|
justificativa em uma linha. Relatório ausente, oco, ou sem os 4 itens, é
|
|
94
104
|
falha de protocolo.
|
|
95
105
|
```
|
|
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.
|
|
111
|
+
|
|
96
112
|
Após o retorno do dispatch: **leia primeiro** `.morph/features/{feature}/3-implement/reports/[ID].md`
|
|
97
113
|
— é o valor de retorno autoritativo. Trate a mensagem de texto do sub-agent, se chegou inteira,
|
|
98
114
|
como um atalho que economiza essa leitura — nunca como a única fonte. Arquivo ausente é falha de
|
|
@@ -181,7 +197,7 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
181
197
|
> tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
|
|
182
198
|
> manualmente** — a escrita manual foi removida da cerimônia por task.
|
|
183
199
|
|
|
184
|
-
9. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Não rode a suíte de testes inteira do projeto por conta própria ao fim da task quando invocada pela `morph-apply` — a verificação determinística (`morph-spec verify {feature} {task}`) é do orquestrador, logo após seu retorno (ver morph-apply §3a). Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
|
|
200
|
+
9. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Não rode a suíte de testes inteira do projeto por conta própria ao fim da task quando invocada pela `morph-apply` — a verificação determinística (`morph-spec verify {feature} {task} [--filter {ids-do-stack-da-task}]`) é do orquestrador, logo após seu retorno (ver morph-apply §3a). **A divisão:** no loop por task o `--filter` escolhe as suítes do stack que a task tocou (o relógio de uma task não paga a suíte inteira; um nó não casado aparece como `skip` nomeando o filtro, e um filtro que não casa nada é erro de uso, exit 2); a suíte **inteira** roda no Gate 3 e no CI, sem filtro. A suíte completa de um projeto grande não cabe numa invocação de Bash do harness — rode em background ou por partes, nunca "suba o limite" (não há constante de timeout global no CLI). Detalhe e forma de `project.tests[]`: `.morph/framework/CLI.md`, seção "Suítes de teste". Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
|
|
185
201
|
|
|
186
202
|
## Output esperado
|
|
187
203
|
- Código implementado conforme o standard consultado (direto ou via sub-agent)
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: morph-media
|
|
3
|
+
description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo trabalho, montar o prompt como spec versionada, encadear derivadas a partir de um herói aprovado, subir a escada de custo e conduzir o gate humano de escolha entre N candidatas. É o lado processo; o conhecimento de API, custo e conformidade vive nos standards de mídia.
|
|
4
|
+
version: core
|
|
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
|
+
user-invokable: true
|
|
7
|
+
cliVersion: "8.35.1"
|
|
8
|
+
stacks:
|
|
9
|
+
- dotnet
|
|
10
|
+
- nextjs
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# morph-media
|
|
14
|
+
|
|
15
|
+
## Objetivo
|
|
16
|
+
|
|
17
|
+
Conduzir a **autoria** de mídia gerada: a sequência de decisões humanas que vai de "precisamos de
|
|
18
|
+
uma foto do sofá em verde" até um arquivo aprovado, com o menor gasto possível e sem claim visual
|
|
19
|
+
falso.
|
|
20
|
+
|
|
21
|
+
**Esta skill não ensina API.** O que é `IImageGenerator`, quanto custa cada modelo, que alias está
|
|
22
|
+
desligado e o que a lei exige está escrito, com fonte datada, em:
|
|
23
|
+
|
|
24
|
+
| Standard | O que carrega |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `.morph/framework/standards/ai-agents/modalities-image-gen.md` | Imagem em runtime: a API, os aliases pinados, custo por chamada, deprecações |
|
|
27
|
+
| `.morph/framework/standards/ai-agents/media-video.md` | Vídeo em runtime: Veo por SDK, provedores só-HTTP, custo por segundo, o arquivo que expira |
|
|
28
|
+
| `.morph/framework/standards/ai-agents/media-pipeline.md` | O job, os estados, a revisão humana, a proveniência e a marcação |
|
|
29
|
+
| `.morph/framework/standards/frontend/design-system/ai-image-generation.md` | Autoria de asset de LP via MCP: fidelidade de marca, `assets.md`, `next/image` |
|
|
30
|
+
| `.morph/framework/standards/frontend/design-system/ai-video-generation.md` | Footage direcional para scroll scrub: loop × direcional, `endImage`, moderação E005 |
|
|
31
|
+
|
|
32
|
+
Abra o que a tarefa pede. Esta skill diz **o que fazer com eles**.
|
|
33
|
+
|
|
34
|
+
## Quando invocar
|
|
35
|
+
|
|
36
|
+
Quando alguém disser "gerar imagem do produto", "fazer o vídeo do reel", "criar o hero da LP",
|
|
37
|
+
"variação de cor do móvel", "mockup para a campanha" — ou mencionar `/morph-media`.
|
|
38
|
+
|
|
39
|
+
**Quando NÃO invocar:** quando o pedido é *implementar* o subsistema de mídia num projeto .NET.
|
|
40
|
+
Isso é uma feature normal, e o insumo são os três standards de `ai-agents/` acima.
|
|
41
|
+
|
|
42
|
+
## A regra que atravessa tudo
|
|
43
|
+
|
|
44
|
+
> **Nunca gere mídia dentro de um turno de conversa.** O turno enfileira e confirma; a mídia volta
|
|
45
|
+
> depois, revisada.
|
|
46
|
+
|
|
47
|
+
Ela vale na autoria também, e por outro motivo: dentro de um turno ninguém compara candidatas. A
|
|
48
|
+
escolha entre N opções **é** o gate humano — ver §5.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Passo 1 — Escolher o modelo pelo TRABALHO, não pelo hábito
|
|
53
|
+
|
|
54
|
+
Uma pergunta decide quase tudo: **existe um produto real a preservar?**
|
|
55
|
+
|
|
56
|
+
| Trabalho | Caminho | Por quê |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| Variação sobre foto real de produto | **Edição com referência**, nunca geração do zero | Gerar do zero inventa material, medida e cor que o produto não tem — claim visual falso |
|
|
59
|
+
| Muitas referências do mesmo objeto | Modelo com maior teto de referências | O limite por modelo está no standard de imagem, §Referências de produto |
|
|
60
|
+
| Lote grande e barato (thumbnails, variantes) | O alias de piso da família, com Batch | Batch é −50 %; é a maior alavanca isolada |
|
|
61
|
+
| Texto legível dentro da imagem | Modelo com texto multilíngue, em `medium`/`high` | Texto pequeno em `low` sai errado, e re-render custa mais que ter começado certo |
|
|
62
|
+
| Asset de LP com movimento de scroll | Footage **direcional**, nunca loop | Um loop perfeito parece congelado sob scrub — `ai-video-generation.md` §Section 1 |
|
|
63
|
+
| Vídeo curto de produto em runtime | O caminho com SDK do `media-video.md` | É o único com SDK .NET oficial |
|
|
64
|
+
|
|
65
|
+
**Antes de pinar qualquer alias, abra a tabela de deprecações** do standard da modalidade. Um alias
|
|
66
|
+
desligado não é preferência de estilo: é uma chamada que devolve erro depois de você ter escrito o
|
|
67
|
+
código inteiro em cima dela.
|
|
68
|
+
|
|
69
|
+
## Passo 2 — Montar o prompt como spec versionada
|
|
70
|
+
|
|
71
|
+
Prompt de produção é **template versionado**, nunca string concatenada. A ordem importa, e as duas
|
|
72
|
+
famílias de modelo concordam nela:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
cena/fundo → sujeito → detalhes-chave → restrições
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Seis regras que mudam o resultado mais do que qualquer outra coisa:
|
|
79
|
+
|
|
80
|
+
1. **Descreva em prosa, não em lista de keywords.** "beautiful, stunning, 4k, masterpiece" adiciona
|
|
81
|
+
ruído, não qualidade. Briefe como se briefasse um fotógrafo.
|
|
82
|
+
2. **Seja hiper-específico no sujeito.** "armadura de fantasia" produz genérico; "armadura élfica de
|
|
83
|
+
placas prateadas, gravada com folhas, gola alta, ombreiras em asa de falcão" produz uma imagem.
|
|
84
|
+
3. **Descreva em camadas** — primeiro plano, plano médio, fundo. Descrição plana produz imagem
|
|
85
|
+
plana; camadas produzem profundidade.
|
|
86
|
+
4. **Iluminação é a maior alavanca isolada de qualidade.** Sempre declare, com termos de fotografia,
|
|
87
|
+
e prefira **múltiplas fontes** com direções e temperaturas diferentes. Luz única e frontal é o
|
|
88
|
+
que faz uma imagem parecer amadora.
|
|
89
|
+
5. **Enquadre positivamente.** "rua deserta, completamente parada" funciona; "rua sem carros" não —
|
|
90
|
+
o modelo lida mal com negação.
|
|
91
|
+
6. **Contexto e finalidade entram no prompt.** "logo para uma marca de skincare minimalista premium"
|
|
92
|
+
decide melhor que "faça um logo".
|
|
93
|
+
|
|
94
|
+
**Texto na imagem:** cite literalmente entre aspas e soletre marcas. Erro de grafia é o defeito mais
|
|
95
|
+
comum dessa categoria — **confira lendo a imagem gerada** e corrija com uma edição pontual ("corrija
|
|
96
|
+
a grafia para 'X' exatamente; mantenha o resto"). Duas ou três iterações são normais.
|
|
97
|
+
|
|
98
|
+
**Aspect ratio é decisão, não default.** Escolha pelo destino final (feed, story, banner, impressão).
|
|
99
|
+
|
|
100
|
+
## Passo 3 — Editar é o oposto de gerar
|
|
101
|
+
|
|
102
|
+
| | Gerar | Editar |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| Estratégia | **Profundidade** — composição em camadas, texturas, luz dramática | **Contenção** — 1 a 2 frases, exatamente o que muda |
|
|
105
|
+
| Erro típico | Prompt raso → imagem plana e genérica | Prompt longo → o modelo "re-imagina" tudo e o resultado fica artificial |
|
|
106
|
+
|
|
107
|
+
Padrões de edição que funcionam:
|
|
108
|
+
|
|
109
|
+
- **Acrescentar/remover:** uma frase. Não explique como integrar — o modelo faz isso bem quando você
|
|
110
|
+
não o sufoca.
|
|
111
|
+
- **Trocar o fundo:** diga o fundo novo e pare. Ele casa a iluminação sozinho.
|
|
112
|
+
- **Inpaint:** nomeie o que muda e o que fica. *"Troque o sofá azul por um chesterfield de couro
|
|
113
|
+
marrom. Mantenha o resto."*
|
|
114
|
+
- **"Preserve list" repetida em CADA iteração.** É o que impede o drift de acumular.
|
|
115
|
+
- **Uma mudança por vez.** Refinamentos em série, nunca em bloco.
|
|
116
|
+
- **Ao driftar, recomece** com a descrição completa em vez de empilhar correções.
|
|
117
|
+
|
|
118
|
+
## Passo 4 — Encadear a partir de um herói aprovado
|
|
119
|
+
|
|
120
|
+
A consistência não vem do prompt; vem da **referência**.
|
|
121
|
+
|
|
122
|
+
1. Gere e **aprove** o herói primeiro — a imagem que define paleta, luz e enquadramento.
|
|
123
|
+
2. Use o herói aprovado como **referência** das derivadas. Nunca gere as derivadas em paralelo com o
|
|
124
|
+
herói: elas herdam o erro que ainda não foi visto.
|
|
125
|
+
3. Indexe cada referência no prompt ("image 1 = o sofá; image 2 = o tecido") e diga como interagem.
|
|
126
|
+
4. Imagens que vão virar vídeo são enquadradas **sem rosto** — rosto derruba moderação, e o contorno
|
|
127
|
+
está em `ai-video-generation.md` §Section 3.
|
|
128
|
+
|
|
129
|
+
**O que a IA nunca recria:** render arquitetônico do cliente e foto real de produto. Esses são
|
|
130
|
+
animados ou editados a partir do arquivo real — recriá-los é inventar o que o cliente já tem.
|
|
131
|
+
|
|
132
|
+
## Passo 5 — A escada de custo, e o gate humano que mora nela
|
|
133
|
+
|
|
134
|
+
Os dois são **o mesmo passo**, e é isso que faz a escada ser cumprida em vez de pulada.
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
1. N candidatas na qualidade MAIS BAIXA / menor duração
|
|
138
|
+
↓
|
|
139
|
+
2. GATE: humano escolhe entre as N (ou manda regenerar)
|
|
140
|
+
↓
|
|
141
|
+
3. a VENCEDORA, e só ela, é regerada em alta
|
|
142
|
+
↓
|
|
143
|
+
4. GATE: aprovação final, com marcação e destino
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Mecânica do gate, herdada de um fluxo que já rodou em produção:
|
|
147
|
+
|
|
148
|
+
- **Mostre as N lado a lado.** Uma página local simples com as opções basta; o humano responde "opção 2".
|
|
149
|
+
- **Registre a escolha** (passo, opção, arquivo) num arquivo de decisão. Sem registro, ninguém
|
|
150
|
+
reconstrói por que aquela imagem venceu.
|
|
151
|
+
- **Rejeição volta ao MESMO passo.** Regenere com o feedback e reabra o gate. Nunca avance com "a
|
|
152
|
+
menos ruim".
|
|
153
|
+
- **Para vídeo, mostre MOVIMENTO, nunca um still.** Um frame parado não prova que o scrub funciona —
|
|
154
|
+
o canvas pode estar quebrado e a foto parecer ótima. Apresente o preview navegável ou uma tira de
|
|
155
|
+
frames em posições diferentes.
|
|
156
|
+
- **Juiz LLM é pré-filtro**, para derrubar as obviamente ruins e economizar o tempo do humano. Ele
|
|
157
|
+
não assume a responsabilidade por um claim visual.
|
|
158
|
+
|
|
159
|
+
Sem a escada, a conta de gerar tudo em alta é dezenas de vezes maior — os números estão em
|
|
160
|
+
`modalities-image-gen.md` §Custo por chamada e `media-video.md` §Custo por segundo.
|
|
161
|
+
|
|
162
|
+
## Passo 6 — Fechar: nomear, marcar, registrar
|
|
163
|
+
|
|
164
|
+
- **Nome em kebab-case sem acento**, dizendo o que é: `hero-sofa-verde-01.png`.
|
|
165
|
+
- **Grave os bytes** no repositório do projeto ou no blob próprio. URL de provedor expira — e no
|
|
166
|
+
vídeo, o arquivo do provedor some em dois dias.
|
|
167
|
+
- **Registre a proveniência**: modelo, prompt final, referências, opções, custo estimado. É o que
|
|
168
|
+
responde "de onde veio esta imagem" seis meses depois.
|
|
169
|
+
- **Marque como gerada por IA** quando a imagem puder parecer autêntica sobre produto, pessoa ou
|
|
170
|
+
lugar, registrando **o texto e a superfície** — legenda, sobreposição, texto alternativo, ficha do
|
|
171
|
+
produto. "Marcado" sem dizer ONDE não responde se alguém consegue ver. A obrigação, com a ressalva
|
|
172
|
+
de fonte, está em `media-pipeline.md` §Marcação; quando a mídia nasce em runtime, o ponto de
|
|
173
|
+
publicação **recusa** sem esse par (§Como esta obrigação é presa).
|
|
174
|
+
- **Nunca publique claim visual falso:** material, medida ou cor que o produto não tem. Produto real
|
|
175
|
+
sobre cena gerada é declarado como tal.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Mapa rápido: imagem por fase de um trabalho de marca
|
|
180
|
+
|
|
181
|
+
Quando o trabalho é identidade visual e não catálogo, a lista do que gerar é esta — e o **nível
|
|
182
|
+
mínimo** diz o que não pode faltar:
|
|
183
|
+
|
|
184
|
+
| Fase | Imagens | Nível |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| Estratégia | moodboard estratégico (1) | opcional |
|
|
187
|
+
| Naming / conceito | moodboard de conceito (1) | quando a fase roda |
|
|
188
|
+
| Identidade visual | 2-3 conceitos de logo + 1 swatch de paleta + 1 moodboard fotográfico | **core** |
|
|
189
|
+
| Templates sociais | 1-2 mockups (feed + story) | opcional |
|
|
190
|
+
| Impressos / aplicação | 1-2 mockups (cartão, fachada, tela) | opcional |
|
|
191
|
+
| Brand book | capa (1) | quando o book roda |
|
|
192
|
+
|
|
193
|
+
**Regra de ouro desta trilha:** o modelo gera **conceito e mockup**, nunca o vetor final do logo.
|
|
194
|
+
Diga isso ao usuário com todas as letras — "são conceitos para direção; o logo vetorial final é
|
|
195
|
+
trabalho de design". Tratar a saída como entregável vetorial é o erro clássico aqui.
|
|
196
|
+
|
|
197
|
+
## Anti-patterns
|
|
198
|
+
|
|
199
|
+
| Anti-pattern | Por quê é errado |
|
|
200
|
+
|---|---|
|
|
201
|
+
| Gerar tudo em alta qualidade "para já sair pronto" | Multiplica a conta por dezenas e ainda assim exige escolha |
|
|
202
|
+
| Gerar as derivadas antes de aprovar o herói | Elas herdam o erro que ninguém viu ainda |
|
|
203
|
+
| Prompt de edição longo | O modelo re-imagina a cena e o resultado fica artificial |
|
|
204
|
+
| Aprovar vídeo por um frame parado | Um still não prova movimento |
|
|
205
|
+
| Empilhar correções depois do drift | Recomeçar com descrição completa custa menos |
|
|
206
|
+
| Pinar um alias sem abrir a tabela de deprecações | Código inteiro escrito sobre um endpoint com data de morte |
|
|
207
|
+
| Guardar a URL do provedor | Ela expira; guarde os bytes |
|
|
208
|
+
| Recriar por IA o render ou a foto real do cliente | Inventa o que já existe, e vira claim falso |
|
|
209
|
+
| Tratar conceito de logo como arte final | O vetor é trabalho de design, não de modelo |
|
|
210
|
+
|
|
211
|
+
## Referências
|
|
212
|
+
|
|
213
|
+
- Os cinco standards da tabela do topo — a fonte de API, custo, prazo e conformidade.
|
|
214
|
+
- Proveniência do conhecimento absorvido: `.morph/framework/standards/PROVENANCE.json`
|
|
215
|
+
(`gemini-image`, `cinematic-lp`, `brand-design`).
|
|
@@ -4,7 +4,7 @@ description: Guia a produção dos artefatos de planejamento de uma feature (use
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-plan
|
|
@@ -24,6 +24,13 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
24
24
|
|
|
25
25
|
1. **Garanta que `proposal.md` e `stack-scan.md` estão no seu contexto antes de planejar.** Se não tem o conteúdo atual em contexto (sessão fresca, ou conteúdo possivelmente desatualizado), **use a tool Read para carregá-los** — não confie em cache de turnos anteriores. Na dúvida, Read. `.morph/features/{feature}/0-proposal/proposal.md` (problema, escopo, riscos — o comportamento é destilado aqui no passo 2, não vem pronto do proposal) e `.morph/features/{feature}/0-proposal/stack-scan.md` (contexto técnico detectado: greenfield vs brownfield, stack atual, drift). Em brownfield, o stack-scan informa decisões de spec/mandate — não invente padrões que conflitam com o detectado.
|
|
26
26
|
|
|
27
|
+
**E `.morph/features/{feature}/1-design/*.md`, quando o diretório existe** — os artefatos da fase
|
|
28
|
+
uiux (wireframes, decisões de layout, componentes propostos). Leia TODOS os `.md` de lá: eles
|
|
29
|
+
descrevem comportamento de interface que o `proposal.md` não carrega, e um plano que os ignora
|
|
30
|
+
dimensiona a feature pela metade. **Diretório ausente NÃO é erro** — a fase uiux é opcional
|
|
31
|
+
(MORPH.md §2.1) e a maioria das features não a toma; nesse caso não há passo nenhum a rodar e o
|
|
32
|
+
plano segue idêntico ao de hoje.
|
|
33
|
+
|
|
27
34
|
1b. **Scout — mapa do território antes de planejar (opcional, mas o default em feature grande ou brownfield).** É o call-site do "scout opcional antes do plan" que a MORPH.md promete. Dispare quando a feature toca área que você não tem em contexto, ou quando o `stack-scan.md` acusou brownfield com desvios.
|
|
28
35
|
|
|
29
36
|
```
|
|
@@ -145,9 +152,19 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
145
152
|
dentro de um worktree. Se estiver cravado, **isso é uma task**.
|
|
146
153
|
- **Setup de autenticação**, se a aplicação tem login: `e2e.auth` em `config.json`
|
|
147
154
|
(`mode: seed|storageState|bypass|none`, `seedCommand`, `storageStatePath`, `envFile`), com as
|
|
148
|
-
credenciais num `.env.e2e` **gitignored** — nunca no config commitado.
|
|
155
|
+
credenciais num `.env.e2e` **gitignored** — nunca no config commitado. **`mode` é obrigatório
|
|
156
|
+
sempre que houver `seedCommand`**: com `mode` ausente (ou `"none"`) o seed fica **inerte** — o
|
|
157
|
+
comando está configurado e nunca roda, e o autor acredita que a base é semeada. O `verify`
|
|
158
|
+
avisa (`[e2e] warning: …` nomeando `e2e.auth.seedCommand` e `e2e.auth.mode`), mas um aviso não
|
|
159
|
+
repara um plano: escreva o `mode` no config que a task de setup entrega. **Se a app tem login e
|
|
149
160
|
isso não existe, crie a task de setup**: sem ela a navegação para na tela de login e a
|
|
150
161
|
verificação de runtime vira teatro. É gap de Gate 2, não dispensa de Gate 3.
|
|
162
|
+
- **Baseline de contagem de testes é um COMANDO aqui também:** se o projeto declara
|
|
163
|
+
`project.tests[]`, o `expectedCount` de cada suíte é gravado por `morph-spec verify {feature}
|
|
164
|
+
--record-baseline` a partir de uma execução verde — **nunca digitado no config**. Um número
|
|
165
|
+
inventado **alto demais** deixa o verify vermelho por `count-drop` e trava o próprio comando que
|
|
166
|
+
o consertaria (só sai rebaixando/apagando o número à mão). Forma de `project.tests[]`:
|
|
167
|
+
`.morph/framework/CLI.md`, seção "Suítes de teste".
|
|
151
168
|
- **Quando não se aplica** (biblioteca pura, chore sem runtime), registre a dispensa e o porquê.
|
|
152
169
|
- Checklist de done com critérios verificáveis por tarefa.
|
|
153
170
|
- **Baseline é um COMANDO, nunca um número.** O mandate congela no Gate 2 e é lido por
|
|
@@ -221,6 +238,19 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
221
238
|
|
|
222
239
|
**Preencha `outputs` (paths planejados) em cada task** — o `morph-spec dag` usa os outputs para detectar colisão de arquivos entre fluxos paralelos e recomendar `isolation: "worktree"`. Task sem `outputs` entra como footprint desconhecido (não força isolamento, mas o dag não consegue protegê-la de colisão).
|
|
223
240
|
|
|
241
|
+
**5c. Cross-check do `1-design/` — todo aviso de capacidade tem destino.** Se o diretório existe,
|
|
242
|
+
rode antes de fechar o array `tasks`:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
grep -riE "capacidade nova|precisa de backend|dimensionar junto" .morph/features/{feature}/1-design/
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Cada ocorrência é o designer dizendo que a tela pede algo que ainda não existe. Ela vira **task
|
|
249
|
+
irmã** no `tasks.json` **ou** exclusão registrada em `decisions.md` com o motivo — **nunca fica
|
|
250
|
+
sem destino**. Medido em campo: duas ocorrências dessas passaram batidas em features reais e
|
|
251
|
+
viraram trabalho descoberto na fase implement, quando o escopo já estava aprovado no Gate 2.
|
|
252
|
+
Sem hits, ou sem `1-design/`, o passo é um no-op silencioso.
|
|
253
|
+
|
|
224
254
|
Antes de retornar, valide rodando `morph-spec dag {feature}` — o comando parseia e valida o schema do tasks.json (ids únicos `T\d+`, enums de `status`/`effort`, `dependencies` válidas) e já imprime a análise de DAG que a `/morph-apply` vai usar. Erros de schema abortam com a lista do que corrigir.
|
|
225
255
|
|
|
226
256
|
6. Apresente o Gate 2 segundo trust mode.
|
|
@@ -283,6 +313,7 @@ Ao registrar a aprovação do Gate 2, atualize o frontmatter de cada use case de
|
|
|
283
313
|
- `morph-spec graph explain|affected --uses-only` — "isto já existe?" e "quem usa de verdade" (passo 1c); **sem grafo, o fallback é `grep -rn`**
|
|
284
314
|
- `.morph/context/README.md` — inventário do projeto (entidades, endpoints, componentes com path); insumo declarado do passo 1c, atualizado por `morph-spec context refresh`
|
|
285
315
|
- `.morph/specs/usecases/` — acervo permanente de use cases do projeto (`usecase reserve` já lê antes de numerar; em `bug`, é onde mora o UC a corrigir)
|
|
316
|
+
- `.morph/features/{feature}/1-design/` — artefatos da fase uiux, insumo do passo 1 e do cross-check do passo 5c (ausente não é erro)
|
|
286
317
|
- `.morph/features/{feature}/0-proposal/proposal.md` — escopo da feature
|
|
287
318
|
- `.morph/features/{feature}/0-proposal/stack-scan.md` — contexto técnico detectado
|
|
288
319
|
- `.morph/framework/schemas/tasks.schema.json` — schema e enums de tasks.json
|
|
@@ -4,7 +4,7 @@ description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encad
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-proposal
|