@polymorphism-tech/morph-spec 8.34.2 → 8.35.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 +20 -3
- 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 +234 -9
- 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/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/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 +140 -5
- package/src/commands/project/update.js +469 -153
- package/src/commands/project/worktree.js +8 -1
- 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 +333 -21
- 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/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
package/claude-plugin.json
CHANGED
package/docs/CHEATSHEET.md
CHANGED
|
@@ -59,11 +59,11 @@ morph-spec approve {feature} {gate} [--mode auto] [--approver name] [--notes tex
|
|
|
59
59
|
morph-spec advance {feature} [--design] # approve current gate + scaffold next phase folder in one step
|
|
60
60
|
morph-spec approval-status {feature} [--json]
|
|
61
61
|
morph-spec unapprove {feature} {gate} [--reason text] # recovery only
|
|
62
|
-
morph-spec finish {feature} --pr|--merge [--keep] [--force] [--discard-ignored] # normal close: archive + integrate + teardown
|
|
62
|
+
morph-spec finish {feature} --pr|--merge [--push] [--keep] [--force] [--discard-ignored] # normal close: archive + integrate + teardown
|
|
63
63
|
morph-spec archive {feature} [--force] [--no-git] # archive WITHOUT integrating (legacy feature / cleanup)
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
`finish` is the normal way to close a feature (both the worktree flow and the common flow): it archives (committing the move inside `morph/{feature}`), then integrates — `--merge` merges `--no-ff` into the default branch locally (no push); `--pr` pushes `morph/{feature}` + `gh pr create` (needs `origin` + authenticated `gh`). It then tears down the worktree and releases the port block. `archive` alone is reserved for legacy features (no `morph/{feature}` branch) and cleanup.
|
|
66
|
+
`finish` is the normal way to close a feature (both the worktree flow and the common flow): it archives (committing the move inside `morph/{feature}`), then integrates — `--merge` merges `--no-ff` into the default branch locally (no push); `--pr` pushes `morph/{feature}` + `gh pr create` (needs `origin` + authenticated `gh`). After a `--merge` the output reports how many commits the default branch is ahead of `origin/{default}` and the exact `git push origin {default}` that publishes them (in every `--merge` output, `--keep` included); `--push` runs that push for you. It then tears down the worktree and releases the port block. `archive` alone is reserved for legacy features (no `morph/{feature}` branch) and cleanup.
|
|
67
67
|
|
|
68
68
|
---
|
|
69
69
|
|
|
@@ -84,7 +84,8 @@ morph-spec retype {feature} {newType} # change type mid-flig
|
|
|
84
84
|
## CLI — state (server-side, timestamped)
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
|
-
morph-spec score {feature} {task}
|
|
87
|
+
morph-spec score {feature} {task} [score] [--dims "9.5,9,9,9"] # writes taskScores — {task} must match T<n> and {score} must be a number 0-10
|
|
88
|
+
# a blank/missing score or a dotted taskId is REFUSED (exit 1), never recorded as a fabricated 0
|
|
88
89
|
morph-spec gate-decision {feature} {gate} --pause <bool> [--reason] [--signals json] # writes gateDecisions
|
|
89
90
|
```
|
|
90
91
|
|
|
@@ -186,4 +187,4 @@ Never edited directly — go through CLI commands or `morph-spec update` instead
|
|
|
186
187
|
|
|
187
188
|
---
|
|
188
189
|
|
|
189
|
-
*morph-spec v8.
|
|
190
|
+
*morph-spec v8.35.0 by Polymorphism Tech*
|
package/docs/QUICKSTART.md
CHANGED
package/framework/MORPH.md
CHANGED
|
@@ -205,7 +205,7 @@ O agente responsável por um domínio está em `.morph/framework/agents.json` (f
|
|
|
205
205
|
|
|
206
206
|
## 5. Gates de Aprovação (Trust Mode)
|
|
207
207
|
|
|
208
|
-
Gates são pontos de **pausa potencial**. Em `trust: "auto"` (default), auto-passam sem sinal de risco — só exibem summary curto. Em `trust: "manual"` OU com sinal de risco,
|
|
208
|
+
Gates são pontos de **pausa potencial**. Em `trust: "auto"` (default), auto-passam sem sinal de risco — só exibem summary curto. Em `trust: "manual"` OU com sinal de risco, pausam via `AskUserQuestion` com options padrão:
|
|
209
209
|
|
|
210
210
|
```
|
|
211
211
|
- "aprovado, prosseguir"
|
|
@@ -219,31 +219,33 @@ Gates são pontos de **pausa potencial**. Em `trust: "auto"` (default), auto-pas
|
|
|
219
219
|
| ------- | ----------- | --------------- |
|
|
220
220
|
| `designSystemDivergence` | true | Brainstorming detecta fontes conflitantes (spec antigo vs bundle local) |
|
|
221
221
|
| `standardsViolations` | array.length > 0 | Mandate ou implementation viola padrões proibidos |
|
|
222
|
-
| `evalScore` | < 9 | score composto da feature (
|
|
223
|
-
| `verificationStatus` | === 'fail' | `
|
|
224
|
-
| `verificationStale` | true | Stamp do `verify` com sha != HEAD: o verde não cobre mais o código. Só no **ship**
|
|
225
|
-
| `
|
|
226
|
-
| `
|
|
222
|
+
| `evalScore` | < 9 | score composto da feature (morph-review) abaixo do mínimo |
|
|
223
|
+
| `verificationStatus` | === 'fail' | `verify` vermelho — build, testes, validadores **ou e2e** (a app não sobe / as specs não passam). Vale em **qualquer** gate |
|
|
224
|
+
| `verificationStale` | true | Stamp do `verify` com sha != HEAD: o verde não cobre mais o código. Só no **ship** |
|
|
225
|
+
| `e2eSkipClass` (derivada) | environment/requested/unknown | e2e pulou sem dispensa legítima (só `project`/`scope`, e só em stamp de escopo `feature`). Só no **ship** |
|
|
226
|
+
| `mutationProof` | seção ausente | Relatório do avaliador sem `## Mutações` numa feature com código de produção. Só no **ship** |
|
|
227
|
+
| `taskCount` | > 20 | Escopo grande — vale revisar antes de implementar |
|
|
228
|
+
| `workType` | === 'hotfix' | Gate 3 pausa SEMPRE (ver "Gates por tipo de trabalho") |
|
|
227
229
|
|
|
228
230
|
| Gate | Sinais | Skill responsável |
|
|
229
231
|
| ------ | -------- | -------------------- |
|
|
230
232
|
| 1 — Proposta | `designSystemDivergence`, `standardsViolations` (improvável) | `morph-brainstorming` |
|
|
231
233
|
| 2 — Plano | Gate 1 + `taskCount`, `standardsViolations` em mandate | `morph-plan` |
|
|
232
|
-
| 3 — Review | `evalScore` composite, `standardsViolations` em implementation, `verificationStale` | `morph-review` |
|
|
234
|
+
| 3 — Review | `evalScore` composite, `standardsViolations` em implementation, `verificationStale`, `e2eSkipClass`, `mutationProof` | `morph-review` |
|
|
233
235
|
|
|
234
|
-
`verificationStatus`
|
|
236
|
+
`verificationStatus` fica fora da tabela por gate porque vale em todos.
|
|
235
237
|
|
|
236
238
|
**Gates por tipo de trabalho:** `chore`/`hotfix` pulam Gates 1 e 2 — carimbados por política no nascimento (`approvedBy: "policy:{tipo}"`, nunca `"auto"`, para não colidir com o gate-guard); a barra do morph-eval e o Gate 3 valem para todos os tipos. `hotfix`: Gate 3 **sempre humano** (mesmo em `trust: auto` — `morph-hotfix` pausa via `AskUserQuestion`, o `risk-detector` força, o backstop server-side recusa `approve ... review --mode auto`) e exige `4-review/review-report.md` em vez de `evaluator-report.md`. Demais tipos exigem `evaluator-report.md`, **enforced server-side** (`morph-spec approve {feature} review` recusa exit 1 sem ele; `--force` não dispensa) — ou `--self-assessed` registrado (`approvalGates.review.selfAssessed`, marcado no `morph-spec list`).
|
|
237
239
|
|
|
238
|
-
Para alterar o modo:
|
|
240
|
+
Para alterar o modo: `.morph/config/config.json → trust` (`"auto"` ou `"manual"`; campo ausente = `"auto"`).
|
|
239
241
|
|
|
240
|
-
**Comportamento padrão fora de gate:** autonomia total — gates só existem nestes três pontos. Não pause
|
|
242
|
+
**Comportamento padrão fora de gate:** autonomia total — gates só existem nestes três pontos. Não pause durante a implementação salvo ambiguidade de escopo que o mandate não cobre — registre em decisions.md, resolva conservadoramente, sinalize na entrega da task.
|
|
241
243
|
|
|
242
|
-
**A aprovação de gate é unificada nos comandos da CLI — nunca edite o estado à mão.** Em `trust: "auto"` (sem `AskUserQuestion`): `morph-spec approve <feature> <gate> --mode auto`; `morph-spec advance <feature>` aprova o gate corrente **e**
|
|
244
|
+
**A aprovação de gate é unificada nos comandos da CLI — nunca edite o estado à mão.** Em `trust: "auto"` (sem `AskUserQuestion`): `morph-spec approve <feature> <gate> --mode auto`; `morph-spec advance <feature>` aprova o gate corrente **e** cria a pasta da próxima fase (`--design` = ramo opcional de uiux). Scores por task: `morph-spec score <feature> <task> <score> [--dims a,c,q,t]` — nunca edite `taskScores` à mão. **O hook state-sync.js** cobre o caminho manual: `AskUserQuestion` respondida com label "aprovado" → registra o gate no `feature.json` autoritativo com `approvedBy: "manual"`. **A feature é identificada pelo nome que a pergunta cita** — grava na árvore que a possui (raiz ou worktree), nunca na "feature ativa" de quem rodou a sessão. Pergunta sem nome numa árvore com mais de uma feature: o hook **recusa gravar** e avisa — aprove por `morph-spec approve`. Gate sempre gravado em `.morph/features/{feature}/feature.json` — nunca via Edit de `state.json`.
|
|
243
245
|
|
|
244
|
-
**Registre quem aprovou (`approvedBy`):** objeto `{ approved, timestamp, approvedBy }`. `"auto"` — política `trust: auto` sem decisão humana. `"manual"` — humano aprovou explicitamente (via `AskUserQuestion`, ou, sem ela em headless,
|
|
246
|
+
**Registre quem aprovou (`approvedBy`):** objeto `{ approved, timestamp, approvedBy }`. `"auto"` — política `trust: auto` sem decisão humana. `"manual"` — humano aprovou explicitamente (via `AskUserQuestion`, ou, sem ela em headless, texto começando em "aprovado"); em `trust: manual` todo gate é `"manual"` — nunca grave `"auto"` num gate que um humano aprovou. Mantém o audit trail honesto em headless (CI, `claude -p`), onde mais importa.
|
|
245
247
|
|
|
246
|
-
**O hook gate-guard.js** confere, sem bloquear, se a ação tomada num gate (pausar vs auto-aprovar) bateu com a decisão persistida. **Default:** `gate-check <feature> <gate> [--signals <json>] [--json]` decide via `shouldPauseGate`; `--signals` sobrescreve só o que o disco não expõe sozinho (`designSystemDivergence`, `standardsViolations`, `evalScore`). **Escape manual** (sinal que `shouldPauseGate` nem representa, ex.: modo de descoberta): `gate-decision <feature> <gate> --pause <bool> [--reason <txt>] [--signals <json>]`. Ambos gravam `gateDecisions[gate] = { pause, reason, signals, trust, decidedAt }` server-side (shape em `.morph/framework/schemas/feature.schema.json`). **Nunca edite `gateDecisions` à mão** — colide com state-sync. Divergência → o guard injeta aviso no contexto; cada conferência registra `coherent`/`divergent` em `.morph/logs/activity.json
|
|
248
|
+
**O hook gate-guard.js** confere, sem bloquear, se a ação tomada num gate (pausar vs auto-aprovar) bateu com a decisão persistida. **Default:** `gate-check <feature> <gate> [--signals <json>] [--json]` decide via `shouldPauseGate`; `--signals` sobrescreve só o que o disco não expõe sozinho (`designSystemDivergence`, `standardsViolations`, `evalScore`). **Escape manual** (sinal que `shouldPauseGate` nem representa, ex.: modo de descoberta): `gate-decision <feature> <gate> --pause <bool> [--reason <txt>] [--signals <json>]`. Ambos gravam `gateDecisions[gate] = { pause, reason, signals, trust, decidedAt }` server-side (shape em `.morph/framework/schemas/feature.schema.json`). **Nunca edite `gateDecisions` à mão** — colide com state-sync. Divergência → o guard injeta aviso no contexto; cada conferência registra `coherent`/`divergent` em `.morph/logs/activity.json`.
|
|
247
249
|
|
|
248
250
|
---
|
|
249
251
|
|
|
@@ -311,10 +313,7 @@ aceito em silêncio. Segunda ausência sem trabalho entregue é falha real: esca
|
|
|
311
313
|
- Problemas encontrados e como foram resolvidos
|
|
312
314
|
- Auto-score 0-10 com justificativa em uma linha
|
|
313
315
|
|
|
314
|
-
**Contrato do relatório final
|
|
315
|
-
1. **GRAVE o relatório no arquivo canônico ANTES de encerrar**, com os 4 itens acima — é o retorno autoritativo, não a sua última mensagem (cortesia best-effort, pode não chegar inteira). Ausente/oco/incompleto é **falha de protocolo** — registrada no recap. **Não chame `SendMessage`**: gera um evento a mais além da notificação de término.
|
|
316
|
-
2. Não tocar em `tasks.json`, `feature.json`, `state.json` nem no board de sessão — todo estado é do orquestrador.
|
|
317
|
-
3. **Verificação condicional ao isolamento:** **sem isolamento** → não rode build/test compartilhado, verificação é do orquestrador pós-batch. **Com `isolation: "worktree"`** (`dag` recomenda por colisão de `outputs`) → build/test **dentro do worktree**, commite na branch como último ato, reporte a branch, **nunca** faça merge.
|
|
316
|
+
**Contrato do relatório final:** as sete cláusulas que todo prompt de dispatch inclui vivem nos DOIS templates — `morph-implement` §4 e `morph-apply` §3b — e não são repetidas aqui: duas cópias da mesma regra divergem, e quem manda é a que o sub-agent recebe. **4-7** (escopo, sobrevivência, processos, retorno) são idênticas **palavra por palavra**, e um canário as compara; **1-3** (relatório, estado, verificação) dizem o mesmo na redação de cada template.
|
|
318
317
|
|
|
319
318
|
Sub-agent deve ser autossuficiente com o que você passou — se precisar de mais contexto, a tarefa não estava bem especificada; refine antes de despachar.
|
|
320
319
|
|
package/framework/agents.json
CHANGED
|
@@ -8,13 +8,30 @@
|
|
|
8
8
|
"title": ".NET Senior Engineer",
|
|
9
9
|
"icon": "🔷",
|
|
10
10
|
"color": "blue",
|
|
11
|
-
"domains": [
|
|
11
|
+
"domains": [
|
|
12
|
+
"backend",
|
|
13
|
+
"backend-api",
|
|
14
|
+
"architecture"
|
|
15
|
+
],
|
|
12
16
|
"keywords": [
|
|
13
|
-
"backend",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
17
|
+
"backend",
|
|
18
|
+
"api",
|
|
19
|
+
"dotnet",
|
|
20
|
+
".net",
|
|
21
|
+
"csharp",
|
|
22
|
+
"c#",
|
|
23
|
+
"minimal api",
|
|
24
|
+
"vertical slice",
|
|
25
|
+
"vsa",
|
|
26
|
+
"result pattern",
|
|
27
|
+
"feature slice",
|
|
28
|
+
"endpoint",
|
|
29
|
+
"handler",
|
|
30
|
+
"validator"
|
|
31
|
+
],
|
|
32
|
+
"stack": [
|
|
33
|
+
"dotnet"
|
|
16
34
|
],
|
|
17
|
-
"stack": ["dotnet"],
|
|
18
35
|
"standards": [
|
|
19
36
|
"architecture-vertical-slice-vertical-slice",
|
|
20
37
|
"backend-dotnet-result-pattern",
|
|
@@ -23,7 +40,9 @@
|
|
|
23
40
|
"backend-dotnet-testing",
|
|
24
41
|
"backend-integrations-neon-auth-neon-auth"
|
|
25
42
|
],
|
|
26
|
-
"mcp": [
|
|
43
|
+
"mcp": [
|
|
44
|
+
"context7"
|
|
45
|
+
],
|
|
27
46
|
"model": "sonnet",
|
|
28
47
|
"persona": "Você é um engenheiro .NET sênior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados: ApplicationDbContext injetado direto no slice (DbSet<T> já é repository, DbContext já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em decisions.md; nunca uma camada de Service/Manager; nunca repository genérico (IRepository<T>/IUnitOfWork). Não usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parâmetros. REUSO ANTES DE CRIAR: antes de declarar record/class/interface novo, rode `morph-spec graph explain <Nome>` e `graph affected <Conceito> --uses-only` (sem grafo: `grep -rn`); se já existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim diga por que em uma linha no relatório da task."
|
|
29
48
|
},
|
|
@@ -31,18 +50,33 @@
|
|
|
31
50
|
"title": "EF Core / Database Modeler",
|
|
32
51
|
"icon": "🗄️",
|
|
33
52
|
"color": "cyan",
|
|
34
|
-
"domains": [
|
|
53
|
+
"domains": [
|
|
54
|
+
"database",
|
|
55
|
+
"data-modeling",
|
|
56
|
+
"migrations"
|
|
57
|
+
],
|
|
35
58
|
"keywords": [
|
|
36
|
-
"ef core",
|
|
37
|
-
"
|
|
59
|
+
"ef core",
|
|
60
|
+
"entity framework",
|
|
61
|
+
"neon",
|
|
62
|
+
"postgres",
|
|
63
|
+
"postgresql",
|
|
64
|
+
"migration",
|
|
65
|
+
"dbcontext",
|
|
66
|
+
"navigation property",
|
|
67
|
+
"configuration"
|
|
68
|
+
],
|
|
69
|
+
"stack": [
|
|
70
|
+
"dotnet"
|
|
38
71
|
],
|
|
39
|
-
"stack": ["dotnet"],
|
|
40
72
|
"standards": [
|
|
41
73
|
"backend-database-postgresql-database",
|
|
42
74
|
"infrastructure-neon-setup",
|
|
43
75
|
"infrastructure-neon-pgvector"
|
|
44
76
|
],
|
|
45
|
-
"mcp": [
|
|
77
|
+
"mcp": [
|
|
78
|
+
"context7"
|
|
79
|
+
],
|
|
46
80
|
"model": "sonnet",
|
|
47
81
|
"persona": "Você é um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explícitas, configurações fluentes, navigation properties bem nomeadas, índices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler. REUSO ANTES DE CRIAR: antes de declarar entidade, configuração ou value object novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) — entidade duplicada vira migration divergente; se criar mesmo assim, justifique em uma linha no relatório da task."
|
|
48
82
|
},
|
|
@@ -50,38 +84,82 @@
|
|
|
50
84
|
"title": "Microsoft Agent Framework Expert",
|
|
51
85
|
"icon": "🤖",
|
|
52
86
|
"color": "purple",
|
|
53
|
-
"domains": [
|
|
87
|
+
"domains": [
|
|
88
|
+
"ai-agents",
|
|
89
|
+
"ai-orchestration"
|
|
90
|
+
],
|
|
54
91
|
"keywords": [
|
|
55
|
-
"agent",
|
|
56
|
-
"
|
|
57
|
-
"
|
|
92
|
+
"agent",
|
|
93
|
+
"ai agent",
|
|
94
|
+
"maf",
|
|
95
|
+
"microsoft agent framework",
|
|
96
|
+
"tool",
|
|
97
|
+
"tool calling",
|
|
98
|
+
"rag",
|
|
99
|
+
"vector search",
|
|
100
|
+
"llm",
|
|
101
|
+
"orchestration",
|
|
102
|
+
"multi-agent",
|
|
103
|
+
"responses api",
|
|
104
|
+
"structured output",
|
|
105
|
+
"guardrail",
|
|
106
|
+
"prompt"
|
|
107
|
+
],
|
|
108
|
+
"stack": [
|
|
109
|
+
"dotnet"
|
|
58
110
|
],
|
|
59
|
-
"stack": ["dotnet"],
|
|
60
111
|
"standards": [
|
|
61
112
|
"ai-agents-setup",
|
|
62
113
|
"ai-agents-sweet-spot",
|
|
63
114
|
"ai-agents-providers-model-registry",
|
|
64
115
|
"ai-agents-structured-output",
|
|
65
|
-
"ai-agents-
|
|
116
|
+
"ai-agents-prompt-sources",
|
|
66
117
|
"ai-agents-rag-custom-pgvector",
|
|
67
118
|
"ai-agents-middleware-patterns",
|
|
68
119
|
"ai-agents-observability-patterns",
|
|
69
|
-
"ai-agents-multi-agent-patterns"
|
|
120
|
+
"ai-agents-multi-agent-patterns",
|
|
121
|
+
"ai-agents-evals-with-cache",
|
|
122
|
+
"ai-agents-agent-archetypes",
|
|
123
|
+
"ai-agents-agent-spec",
|
|
124
|
+
"ai-agents-llm-runtime-defaults",
|
|
125
|
+
"ai-agents-conversational-agent-with-phases",
|
|
126
|
+
"ai-agents-cost-and-budget",
|
|
127
|
+
"ai-agents-guardrails",
|
|
128
|
+
"ai-agents-testing-ai",
|
|
129
|
+
"ai-agents-context-providers",
|
|
130
|
+
"ai-agents-agent-session",
|
|
131
|
+
"ai-agents-durable-workflows-hitl"
|
|
132
|
+
],
|
|
133
|
+
"mcp": [
|
|
134
|
+
"context7"
|
|
70
135
|
],
|
|
71
|
-
"mcp": ["context7"],
|
|
72
136
|
"model": "sonnet",
|
|
73
|
-
"persona": "Você é especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) — nunca hosted agent service. Não usa Semantic Kernel nem Workflows como default — só quando fan-in/out genuíno aparece. Telemetria via AgentOpenTelemetryConsts.
|
|
137
|
+
"persona": "Você é especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) — nunca hosted agent service. Não usa Semantic Kernel nem Workflows como default — só quando fan-in/out genuíno aparece. Telemetria via UseOpenTelemetry(sourceName, configure) no builder, nos DOIS níveis (agente e chat client), com EnableSensitiveData desligado fora de dev — AgentOpenTelemetryConsts e agent.WithOpenTelemetry() NÃO existem no pin (medido por reflexão); os nomes de ActivitySource, span e métrica estão no standard ai-agents-observability-patterns, não os deduza. Para OpenAI o caminho default é a Responses API (GetResponsesClient() + AsAIAgent); no Model Registry, alias que OMITE `api` significa `responses` — Chat Completions é opt-in declarado, nunca suposição. HISTÓRICO DE CONVERSA: conversa própria como default (tabela/jsonb do projeto exposta por um ChatHistoryProvider seu, com store: false), nunca o AgentSession — o AgentSession com provider embutido só é a fonte certa quando o histórico é SÓ a lista de mensagens, sem campo de negócio e sem leitura fora do agente; retry, remontagem e auditoria exigem histórico visível e manipulável. INSTRUÇÕES E TOOLS POR FASE: compositor determinístico em C# testável (um record Instructions + Tools escolhido por switch antes de montar ChatOptions), nem context provider nem tool — AIContext.Tools ACRESCENTA tools e nunca remove, então só o código consegue tirar uma tool da mesa. DESCOBERTA DE STANDARD: a lista acima é o que se cola em todo dispatch, não o catálogo — antes de concluir que um assunto não tem standard, rode `morph-spec standards --find \"<tema>\" --category ai-agents`. REUSO ANTES DE CRIAR: antes de escrever tool, contrato ou serviço de agente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`); se já existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim justifique em uma linha no relatório da task."
|
|
74
138
|
},
|
|
75
139
|
"nextjs-expert": {
|
|
76
140
|
"title": "Next.js / React Expert",
|
|
77
141
|
"icon": "⚛️",
|
|
78
142
|
"color": "green",
|
|
79
|
-
"domains": [
|
|
143
|
+
"domains": [
|
|
144
|
+
"frontend",
|
|
145
|
+
"ui",
|
|
146
|
+
"react",
|
|
147
|
+
"nextjs"
|
|
148
|
+
],
|
|
80
149
|
"keywords": [
|
|
81
|
-
"nextjs",
|
|
82
|
-
"
|
|
150
|
+
"nextjs",
|
|
151
|
+
"next.js",
|
|
152
|
+
"react",
|
|
153
|
+
"app router",
|
|
154
|
+
"server component",
|
|
155
|
+
"client component",
|
|
156
|
+
"tailwind",
|
|
157
|
+
"framer motion",
|
|
158
|
+
"shadcn"
|
|
159
|
+
],
|
|
160
|
+
"stack": [
|
|
161
|
+
"nextjs"
|
|
83
162
|
],
|
|
84
|
-
"stack": ["nextjs"],
|
|
85
163
|
"standards": [
|
|
86
164
|
"frontend-nextjs-app-router",
|
|
87
165
|
"frontend-nextjs-components",
|
|
@@ -90,7 +168,9 @@
|
|
|
90
168
|
"frontend-nextjs-state-management",
|
|
91
169
|
"backend-integrations-neon-auth-neon-auth"
|
|
92
170
|
],
|
|
93
|
-
"mcp": [
|
|
171
|
+
"mcp": [
|
|
172
|
+
"context7"
|
|
173
|
+
],
|
|
94
174
|
"model": "sonnet",
|
|
95
175
|
"persona": "Você escreve Next.js App Router idiomático. Server Components por padrão, Client Components apenas quando há interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido. REUSO ANTES DE CRIAR: antes de declarar tipo, hook ou componente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) — o tipo local redeclarado em cada arquivo é o defeito mais comum aqui; reuse ou estenda o que existe, e se criar mesmo assim justifique em uma linha no relatório da task."
|
|
96
176
|
},
|
|
@@ -98,13 +178,34 @@
|
|
|
98
178
|
"title": "UI/UX Designer",
|
|
99
179
|
"icon": "🎨",
|
|
100
180
|
"color": "magenta",
|
|
101
|
-
"domains": [
|
|
181
|
+
"domains": [
|
|
182
|
+
"ui",
|
|
183
|
+
"ux",
|
|
184
|
+
"design-system",
|
|
185
|
+
"accessibility"
|
|
186
|
+
],
|
|
102
187
|
"keywords": [
|
|
103
|
-
"design",
|
|
104
|
-
"
|
|
105
|
-
"
|
|
188
|
+
"design",
|
|
189
|
+
"ui",
|
|
190
|
+
"ux",
|
|
191
|
+
"design system",
|
|
192
|
+
"tokens",
|
|
193
|
+
"wcag",
|
|
194
|
+
"accessibility",
|
|
195
|
+
"mockup",
|
|
196
|
+
"flow",
|
|
197
|
+
"shadcn",
|
|
198
|
+
"tailwind",
|
|
199
|
+
"motion",
|
|
200
|
+
"scroll",
|
|
201
|
+
"scrub",
|
|
202
|
+
"gsap",
|
|
203
|
+
"lenis",
|
|
204
|
+
"seo"
|
|
205
|
+
],
|
|
206
|
+
"stack": [
|
|
207
|
+
"*"
|
|
106
208
|
],
|
|
107
|
-
"stack": ["*"],
|
|
108
209
|
"standards": [
|
|
109
210
|
"frontend-design-system-naming",
|
|
110
211
|
"frontend-design-system-animations",
|
|
@@ -121,7 +222,13 @@
|
|
|
121
222
|
"frontend-gsap-plugins"
|
|
122
223
|
],
|
|
123
224
|
"tools": "Read, Write, Edit, Glob, Grep",
|
|
124
|
-
"mcp": [
|
|
225
|
+
"mcp": [
|
|
226
|
+
"context7",
|
|
227
|
+
"stitch",
|
|
228
|
+
"gemini-image",
|
|
229
|
+
"playwright",
|
|
230
|
+
"seedance"
|
|
231
|
+
],
|
|
125
232
|
"model": "sonnet",
|
|
126
233
|
"persona": "Você desenha sistemas, não telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizáveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediário. REUSO ANTES DE CRIAR: componente reutilizável se BUSCA antes de se escrever — rode `morph-spec graph explain <Nome>` e confira `.morph/context/design-system.md` (sem grafo: `grep -rn`); criar um novo exige justificativa em uma linha no relatório da task, a mesma regra que já vale para token de design."
|
|
127
234
|
},
|
|
@@ -129,20 +236,37 @@
|
|
|
129
236
|
"title": "Infrastructure / Jobs Engineer",
|
|
130
237
|
"icon": "⚙️",
|
|
131
238
|
"color": "yellow",
|
|
132
|
-
"domains": [
|
|
239
|
+
"domains": [
|
|
240
|
+
"infrastructure",
|
|
241
|
+
"jobs",
|
|
242
|
+
"deployment",
|
|
243
|
+
"observability"
|
|
244
|
+
],
|
|
133
245
|
"keywords": [
|
|
134
|
-
"hangfire",
|
|
135
|
-
"
|
|
246
|
+
"hangfire",
|
|
247
|
+
"background job",
|
|
248
|
+
"queue",
|
|
249
|
+
"deployment",
|
|
250
|
+
"docker",
|
|
251
|
+
"ci/cd",
|
|
252
|
+
"telemetry",
|
|
253
|
+
"logging",
|
|
254
|
+
"monitoring"
|
|
255
|
+
],
|
|
256
|
+
"stack": [
|
|
257
|
+
"dotnet"
|
|
136
258
|
],
|
|
137
|
-
"stack": ["dotnet"],
|
|
138
259
|
"standards": [
|
|
139
260
|
"backend-integrations-hangfire-hangfire-jobs",
|
|
140
261
|
"infrastructure-docker-coolify-deploy",
|
|
141
262
|
"infrastructure-docker-local-compose-isolation",
|
|
142
263
|
"backend-dotnet-scrutor",
|
|
143
|
-
"ai-agents-observability-patterns"
|
|
264
|
+
"ai-agents-observability-patterns",
|
|
265
|
+
"ai-agents-cost-and-budget"
|
|
266
|
+
],
|
|
267
|
+
"mcp": [
|
|
268
|
+
"context7"
|
|
144
269
|
],
|
|
145
|
-
"mcp": ["context7"],
|
|
146
270
|
"model": "sonnet",
|
|
147
271
|
"persona": "Você cuida de infra: jobs assíncronos com Hangfire (apenas quando há razão real), deployment, observabilidade. Pensa em retry, idempotência, dead-letter, métricas. Não inventa infra — usa o que o stack já oferece. Operações no GitHub (issues, PRs, releases, Actions) sempre via `gh` CLI no Bash — o morph-spec não usa MCP do GitHub. Coolify sempre via SSH + curl na API local — não há MCP nem CLI."
|
|
148
272
|
},
|
|
@@ -150,14 +274,27 @@
|
|
|
150
274
|
"title": "Code & Architecture Evaluator",
|
|
151
275
|
"icon": "🔍",
|
|
152
276
|
"color": "red",
|
|
153
|
-
"domains": [
|
|
277
|
+
"domains": [
|
|
278
|
+
"evaluation",
|
|
279
|
+
"review",
|
|
280
|
+
"quality"
|
|
281
|
+
],
|
|
154
282
|
"keywords": [
|
|
155
|
-
"review",
|
|
283
|
+
"review",
|
|
284
|
+
"eval",
|
|
285
|
+
"score",
|
|
286
|
+
"rubric",
|
|
287
|
+
"audit",
|
|
288
|
+
"quality"
|
|
289
|
+
],
|
|
290
|
+
"stack": [
|
|
291
|
+
"*"
|
|
156
292
|
],
|
|
157
|
-
"stack": ["*"],
|
|
158
293
|
"standards": [],
|
|
159
294
|
"tools": "Read, Glob, Grep, Bash",
|
|
160
|
-
"mcp": [
|
|
295
|
+
"mcp": [
|
|
296
|
+
"playwright"
|
|
297
|
+
],
|
|
161
298
|
"model": "opus",
|
|
162
299
|
"persona": "Você aplica as rubricas em .morph/framework/evals/rubrics/. Você não participou da implementação — avalia o mandate, o diff e a saída real dos testes, com contexto fresco. O orquestrador anexa o resultado do `morph-spec verify`, mas você tem Bash para conferir por conta própria: rode `morph-spec verify {feature} [task]`, testes/build do stack, `git log/diff/show` — nunca confie cegamente no que foi reportado. Bash é só para verificação: NUNCA para modificar código-fonte, tasks.json, feature.json ou o board de sessão — quem faz isso é o loop de correção, não você. Você também tem Playwright: quando o nó `e2e` do verify subiu o stack, NAVEGUE a aplicação como um usuário faria e percorra os fluxos da feature — ler o diff prova que o código existe, usar a aplicação prova que ela funciona. Confira console e network atrás de erro que nenhum teste cobre. Quem sobe e derruba o stack é o `morph-spec verify`/`morph-spec e2e`, não você: se ele não subiu, isso é um achado de infra a reportar, não um defeito de implementação a pontuar. Se um fluxo que você exercitou merece virar regressão, recomende a spec Playwright no relatório — recomendar é seu papel, escrever não. Quando o que você avalia é uma CORREÇÃO (rodada do loop, fix de achado seu ou de outrem), pergunte sempre O QUE ESSA CORREÇÃO ABRIU: que comportamento antes correto pode ter regredido, e se há teste que pegaria isso. Um fix que fecha um defeito e abre outro pontua alto em toda dimensão e mesmo assim piorou o produto — e re-execute os seus próprios probes da rodada anterior em vez de aceitar 'agora tem teste' como fechamento. Não reescreve código — produz scores 0-10 por dimensão (architecture, contracts, code-quality, test-coverage), feedback priorizado acionável, e ação clara (aprovado em >=9 / feedback para o loop de correção em <9). Silêncio em scores ≥ 9 é o sinal correto."
|
|
163
300
|
},
|
|
@@ -165,9 +302,25 @@
|
|
|
165
302
|
"title": "Codebase Scout",
|
|
166
303
|
"icon": "🔦",
|
|
167
304
|
"color": "gray",
|
|
168
|
-
"domains": [
|
|
169
|
-
|
|
170
|
-
|
|
305
|
+
"domains": [
|
|
306
|
+
"scouting",
|
|
307
|
+
"diagnosis",
|
|
308
|
+
"code-search"
|
|
309
|
+
],
|
|
310
|
+
"keywords": [
|
|
311
|
+
"scout",
|
|
312
|
+
"diagnose",
|
|
313
|
+
"root cause",
|
|
314
|
+
"blast radius",
|
|
315
|
+
"search",
|
|
316
|
+
"map",
|
|
317
|
+
"investigate",
|
|
318
|
+
"locate",
|
|
319
|
+
"trace"
|
|
320
|
+
],
|
|
321
|
+
"stack": [
|
|
322
|
+
"*"
|
|
323
|
+
],
|
|
171
324
|
"standards": [],
|
|
172
325
|
"tools": "Read, Glob, Grep, Bash",
|
|
173
326
|
"model": "haiku",
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./schemas/ai-pin.schema.json",
|
|
3
|
+
"pinnedAt": "2026-09-08",
|
|
4
|
+
"source": "https://api.nuget.org/v3/registration5-semver1/{id}/index.json",
|
|
5
|
+
"targetFramework": "net10.0",
|
|
6
|
+
"sdk": "10.0.100",
|
|
7
|
+
"packages": {
|
|
8
|
+
"Microsoft.Agents.AI": { "version": "1.20.0", "published": "2026-08-31", "role": "maf-core" },
|
|
9
|
+
"Microsoft.Extensions.AI": { "version": "10.9.0", "published": "2026-08-11", "role": "chat-abstractions" },
|
|
10
|
+
"OpenAI": { "version": "2.13.0", "published": "2026-08-10", "role": "provider" },
|
|
11
|
+
"Google.GenAI": { "version": "1.21.0", "published": "2026-08-31", "role": "provider" },
|
|
12
|
+
"ModelContextProtocol": { "version": "2.2.0", "published": "2026-08-13", "role": "mcp" },
|
|
13
|
+
"Microsoft.Extensions.AI.Evaluation": { "version": "10.9.0", "published": "2026-08-11", "role": "evals" },
|
|
14
|
+
"Microsoft.Extensions.AI.Evaluation.Quality": { "version": "10.9.0", "published": "2026-08-11", "role": "evals" },
|
|
15
|
+
"Microsoft.Extensions.AI.Evaluation.Reporting": { "version": "10.9.0", "published": "2026-08-11", "role": "evals" }
|
|
16
|
+
},
|
|
17
|
+
"toolchain": {
|
|
18
|
+
"Microsoft.NET.Test.Sdk": { "version": "18.9.0" },
|
|
19
|
+
"xunit.v3": { "version": "4.0.0" },
|
|
20
|
+
"xunit.runner.visualstudio": { "version": "4.0.0" }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Conduz a autoria de mídia gerada por IA — escolher o modelo pelo trabalho, montar o prompt como spec versionada, encadear a partir de um herói aprovado, subir a escada de custo e conduzir o gate humano de escolha entre N candidatas.
|
|
3
|
+
argument-hint: [o que gerar]
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /morph-media — Autoria de mídia gerada
|
|
8
|
+
|
|
9
|
+
Conduz a produção de uma imagem ou vídeo por IA, do "precisamos de uma foto do sofá em verde" até um
|
|
10
|
+
arquivo aprovado, com o menor gasto possível e sem claim visual falso.
|
|
11
|
+
|
|
12
|
+
**Implementação:** este slash command é um atalho. O agente deve invocar `Skill(morph-media)` com o
|
|
13
|
+
pedido (se fornecido). A skill escolhe o modelo pelo trabalho, monta o prompt pela estrutura fixa,
|
|
14
|
+
sobe a escada de custo (N candidatas em qualidade baixa → gate humano → a vencedora em alta) e fecha
|
|
15
|
+
com nome, marcação e proveniência.
|
|
16
|
+
|
|
17
|
+
## Argumentos
|
|
18
|
+
|
|
19
|
+
`[o que gerar]` — descrição do pedido (opcional; sem ela, a skill pergunta).
|
|
20
|
+
|
|
21
|
+
## Quando NÃO usar
|
|
22
|
+
|
|
23
|
+
Quando o pedido é **implementar** o subsistema de mídia num projeto .NET. Isso é uma feature normal,
|
|
24
|
+
e o insumo são os três standards de `ai-agents/` abaixo — não esta skill.
|
|
25
|
+
|
|
26
|
+
## Anti-padrões
|
|
27
|
+
|
|
28
|
+
- Gerar tudo em alta qualidade "para já sair pronto" — multiplica a conta e ainda exige escolha.
|
|
29
|
+
- Gerar as derivadas antes de aprovar o herói — elas herdam o erro que ninguém viu ainda.
|
|
30
|
+
- Aprovar vídeo por um frame parado: um still não prova movimento.
|
|
31
|
+
- Pinar um alias sem abrir a tabela de deprecações do standard da modalidade.
|
|
32
|
+
- Recriar por IA o render ou a foto real do cliente — inventa o que já existe e vira claim falso.
|
|
33
|
+
- **Gerar mídia dentro de um turno de conversa.** O turno enfileira e confirma; a mídia volta depois,
|
|
34
|
+
revisada.
|
|
35
|
+
|
|
36
|
+
## Referências
|
|
37
|
+
|
|
38
|
+
- `.claude/skills/morph-media/SKILL.md`
|
|
39
|
+
- `.morph/framework/standards/ai-agents/modalities-image-gen.md`
|
|
40
|
+
- `.morph/framework/standards/ai-agents/media-video.md`
|
|
41
|
+
- `.morph/framework/standards/ai-agents/media-pipeline.md`
|
|
42
|
+
- `.morph/framework/standards/frontend/design-system/ai-image-generation.md`
|
|
43
|
+
- `.morph/framework/standards/frontend/design-system/ai-video-generation.md`
|
|
44
|
+
|
|
45
|
+
**Pedido:** $ARGUMENTS
|