@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
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
namespace Morph.AiKit.Rag;
|
|
2
|
+
|
|
3
|
+
/// <summary>
|
|
4
|
+
/// Erro de <b>entrada</b> do <see cref="DeltaIngest"/>: a mesma lookup-key apareceu duas
|
|
5
|
+
/// vezes na mesma remessa.
|
|
6
|
+
/// </summary>
|
|
7
|
+
/// <remarks>
|
|
8
|
+
/// <para>
|
|
9
|
+
/// Nao e fluxo de controle e nao e recuperavel no lugar: com a chave repetida, "o que esta
|
|
10
|
+
/// no acervo" deixa de ter resposta unica e o plano vira nao-deterministico — qual dos dois
|
|
11
|
+
/// itens venceu passa a depender da ordem de enumeracao. Silenciar (ficar com o ultimo)
|
|
12
|
+
/// gravaria um dos dois ao acaso; deduplicar por conta propria esconderia um defeito da
|
|
13
|
+
/// origem, que e onde ele tem conserto.
|
|
14
|
+
/// </para>
|
|
15
|
+
/// <para>
|
|
16
|
+
/// Os dois indices vao na excecao porque "chave X duplicada" manda procurar num corpus de
|
|
17
|
+
/// milhares; "posicoes 12 e 4.871" manda olhar duas linhas.
|
|
18
|
+
/// </para>
|
|
19
|
+
/// </remarks>
|
|
20
|
+
public sealed class DuplicateLookupKeyException : ArgumentException
|
|
21
|
+
{
|
|
22
|
+
internal DuplicateLookupKeyException(string lookupKey, int firstIndex, int duplicateIndex, string paramName)
|
|
23
|
+
: base(
|
|
24
|
+
$"lookup-key duplicada na entrada: '{lookupKey}' aparece nas posicoes {firstIndex} e " +
|
|
25
|
+
$"{duplicateIndex}. Com a mesma chave em dois itens, o plano de ingestao deixa de ser " +
|
|
26
|
+
"deterministico — qual dos dois vence passaria a depender da ordem. Corrija a origem " +
|
|
27
|
+
"ou torne a chave realmente unica.",
|
|
28
|
+
paramName)
|
|
29
|
+
{
|
|
30
|
+
LookupKey = lookupKey;
|
|
31
|
+
FirstIndex = firstIndex;
|
|
32
|
+
DuplicateIndex = duplicateIndex;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// <summary>A chave repetida.</summary>
|
|
36
|
+
public string LookupKey { get; }
|
|
37
|
+
|
|
38
|
+
/// <summary>Onde ela apareceu pela primeira vez.</summary>
|
|
39
|
+
public int FirstIndex { get; }
|
|
40
|
+
|
|
41
|
+
/// <summary>Onde ela reapareceu.</summary>
|
|
42
|
+
public int DuplicateIndex { get; }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// <summary>
|
|
46
|
+
/// Planejamento de ingestao <b>idempotente por lookup-key</b>: dada uma remessa e o que o
|
|
47
|
+
/// acervo ja tem, diz o que entrou, o que mudou, o que sumiu e o que ficou igual.
|
|
48
|
+
/// </summary>
|
|
49
|
+
/// <remarks>
|
|
50
|
+
/// <para>
|
|
51
|
+
/// <b>Funcao pura, sem I/O.</b> Nao abre conexao, nao chama embedding, nao mede tempo — o
|
|
52
|
+
/// que a torna testavel sem banco e, mais importante, torna a idempotencia <b>demonstravel</b>
|
|
53
|
+
/// em vez de prometida: aplicar o plano e replanejar a mesma entrada tem de devolver
|
|
54
|
+
/// <see cref="DeltaPlan{T}.IsNoOp"/> verdadeiro.
|
|
55
|
+
/// </para>
|
|
56
|
+
/// <para>
|
|
57
|
+
/// <b>A chave e a identidade; o hash e a versao.</b> Sao duas perguntas diferentes e por isso
|
|
58
|
+
/// dois delegados: <c>lookupKey</c> responde "e o mesmo documento?" e <c>contentHash</c>
|
|
59
|
+
/// responde "mudou?". Colapsar as duas num campo so — usar o hash como chave — faz cada
|
|
60
|
+
/// edicao parecer um documento novo e o original parecer removido, que e a ingestao
|
|
61
|
+
/// apaga-tudo com outro nome.
|
|
62
|
+
/// </para>
|
|
63
|
+
/// </remarks>
|
|
64
|
+
public static class DeltaIngest
|
|
65
|
+
{
|
|
66
|
+
/// <summary>
|
|
67
|
+
/// Compara a remessa com o acervo e devolve o plano.
|
|
68
|
+
/// </summary>
|
|
69
|
+
/// <typeparam name="T">O item ingerido.</typeparam>
|
|
70
|
+
/// <param name="incoming">A remessa. Enumerada uma unica vez.</param>
|
|
71
|
+
/// <param name="lookupKey">
|
|
72
|
+
/// A identidade estavel do item — o que faz duas versoes do mesmo documento serem o
|
|
73
|
+
/// mesmo documento. Nula ou em branco e recusada: uma chave vazia colapsaria itens
|
|
74
|
+
/// distintos num so.
|
|
75
|
+
/// </param>
|
|
76
|
+
/// <param name="contentHash">
|
|
77
|
+
/// A versao do conteudo. Igual significa "nao mudou"; diferente significa "mudou". Nulo e
|
|
78
|
+
/// recusado — sem hash nao ha como distinguir <c>Unchanged</c> de <c>Updated</c>, e
|
|
79
|
+
/// tratar a ausencia como "mudou" reintroduziria o re-embedding de tudo.
|
|
80
|
+
/// </param>
|
|
81
|
+
/// <param name="existingHashes">
|
|
82
|
+
/// O que o acervo tem hoje: lookup-key para hash de conteudo. As chaves daqui que nao
|
|
83
|
+
/// aparecerem na remessa saem em <see cref="DeltaPlan{T}.Removed"/>.
|
|
84
|
+
/// </param>
|
|
85
|
+
/// <exception cref="DuplicateLookupKeyException">A mesma chave veio duas vezes.</exception>
|
|
86
|
+
/// <exception cref="ArgumentException">Um item produziu chave ou hash nulo/em branco.</exception>
|
|
87
|
+
public static DeltaPlan<T> Plan<T>(
|
|
88
|
+
IEnumerable<T> incoming,
|
|
89
|
+
Func<T, string> lookupKey,
|
|
90
|
+
Func<T, string> contentHash,
|
|
91
|
+
IReadOnlyDictionary<string, string> existingHashes)
|
|
92
|
+
{
|
|
93
|
+
ArgumentNullException.ThrowIfNull(incoming);
|
|
94
|
+
ArgumentNullException.ThrowIfNull(lookupKey);
|
|
95
|
+
ArgumentNullException.ThrowIfNull(contentHash);
|
|
96
|
+
ArgumentNullException.ThrowIfNull(existingHashes);
|
|
97
|
+
|
|
98
|
+
List<T> added = [];
|
|
99
|
+
List<T> updated = [];
|
|
100
|
+
List<T> unchanged = [];
|
|
101
|
+
|
|
102
|
+
// Comparacao ordinal, explicita: a chave e um identificador, nao texto de usuario.
|
|
103
|
+
// Deixar a cultura decidir faria o mesmo corpus produzir planos diferentes conforme a
|
|
104
|
+
// maquina que roda a ingestao.
|
|
105
|
+
var seen = new Dictionary<string, int>(StringComparer.Ordinal);
|
|
106
|
+
var index = 0;
|
|
107
|
+
|
|
108
|
+
foreach (var item in incoming)
|
|
109
|
+
{
|
|
110
|
+
var key = lookupKey(item);
|
|
111
|
+
|
|
112
|
+
if (string.IsNullOrWhiteSpace(key))
|
|
113
|
+
{
|
|
114
|
+
throw new ArgumentException(
|
|
115
|
+
$"o item na posicao {index} produziu uma lookup-key vazia. Sem identidade nao " +
|
|
116
|
+
"ha como saber se ele ja esta no acervo, e itens distintos colapsariam num so.",
|
|
117
|
+
nameof(lookupKey));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (seen.TryGetValue(key, out var firstIndex))
|
|
121
|
+
{
|
|
122
|
+
throw new DuplicateLookupKeyException(key, firstIndex, index, nameof(incoming));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
seen.Add(key, index);
|
|
126
|
+
|
|
127
|
+
var hash = contentHash(item);
|
|
128
|
+
|
|
129
|
+
if (string.IsNullOrWhiteSpace(hash))
|
|
130
|
+
{
|
|
131
|
+
throw new ArgumentException(
|
|
132
|
+
$"o item '{key}' (posicao {index}) produziu um hash de conteudo vazio. Sem " +
|
|
133
|
+
"versao nao ha como distinguir 'nao mudou' de 'mudou', e a ingestao voltaria " +
|
|
134
|
+
"a reprocessar tudo a cada rodada.",
|
|
135
|
+
nameof(contentHash));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!existingHashes.TryGetValue(key, out var knownHash))
|
|
139
|
+
{
|
|
140
|
+
added.Add(item);
|
|
141
|
+
}
|
|
142
|
+
else if (string.Equals(knownHash, hash, StringComparison.Ordinal))
|
|
143
|
+
{
|
|
144
|
+
unchanged.Add(item);
|
|
145
|
+
}
|
|
146
|
+
else
|
|
147
|
+
{
|
|
148
|
+
updated.Add(item);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
index++;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// O que o acervo tem e a remessa nao trouxe. Note que 'seen' e consultado pela MESMA
|
|
155
|
+
// chave e com o MESMO comparador usados acima — uma segunda nocao de igualdade aqui
|
|
156
|
+
// faria itens presentes serem reportados como removidos.
|
|
157
|
+
List<string> removed = [];
|
|
158
|
+
|
|
159
|
+
foreach (var key in existingHashes.Keys)
|
|
160
|
+
{
|
|
161
|
+
if (!seen.ContainsKey(key))
|
|
162
|
+
{
|
|
163
|
+
removed.Add(key);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return new DeltaPlan<T>(added, updated, removed, unchanged);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
namespace Morph.AiKit.Rag;
|
|
2
|
+
|
|
3
|
+
/// <summary>
|
|
4
|
+
/// O que precisa acontecer no acervo para que ele passe a refletir a entrada — e nada mais.
|
|
5
|
+
/// </summary>
|
|
6
|
+
/// <remarks>
|
|
7
|
+
/// <para>
|
|
8
|
+
/// <b>O defeito que este tipo existe para matar</b> e concreto e esta em producao: a base de
|
|
9
|
+
/// conhecimento do GHLBrain <b>apaga tudo e re-embeda tudo</b> a cada ingestao. O custo e
|
|
10
|
+
/// pago em embedding de documento que nao mudou, e a janela entre o apagar e o gravar e uma
|
|
11
|
+
/// janela em que a busca nao acha nada. Um plano em quatro baldes torna visivel o que a
|
|
12
|
+
/// ingestao inteira escondia: quase sempre <see cref="Unchanged"/> e a lista grande e as
|
|
13
|
+
/// outras tres sao curtas.
|
|
14
|
+
/// </para>
|
|
15
|
+
/// <para>
|
|
16
|
+
/// <b>E um plano, nao uma execucao.</b> Nada aqui toca banco, vetor ou arquivo: quem aplica
|
|
17
|
+
/// e o projeto, que sabe qual e a sua transacao. E por isso que a idempotencia da ingestao
|
|
18
|
+
/// pode ser provada sem subir infraestrutura nenhuma.
|
|
19
|
+
/// </para>
|
|
20
|
+
/// </remarks>
|
|
21
|
+
/// <typeparam name="T">O item ingerido — documento, trecho, linha.</typeparam>
|
|
22
|
+
/// <param name="Added">Itens cuja chave nao existia no acervo.</param>
|
|
23
|
+
/// <param name="Updated">Itens cuja chave existia com <b>outro</b> conteudo.</param>
|
|
24
|
+
/// <param name="Removed">
|
|
25
|
+
/// Chaves que estavam no acervo e <b>nao vieram</b> na entrada. Sao chaves, e nao itens:
|
|
26
|
+
/// o que sumiu da origem nao tem corpo para carregar.
|
|
27
|
+
/// </param>
|
|
28
|
+
/// <param name="Unchanged">
|
|
29
|
+
/// Itens cuja chave existia com o <b>mesmo</b> conteudo. Nao re-embedar estes e a economia
|
|
30
|
+
/// inteira desta feature.
|
|
31
|
+
/// </param>
|
|
32
|
+
public sealed record DeltaPlan<T>(
|
|
33
|
+
IReadOnlyList<T> Added,
|
|
34
|
+
IReadOnlyList<T> Updated,
|
|
35
|
+
IReadOnlyList<string> Removed,
|
|
36
|
+
IReadOnlyList<T> Unchanged)
|
|
37
|
+
{
|
|
38
|
+
/// <summary>Plano vazio — nem entrada, nem acervo.</summary>
|
|
39
|
+
public static DeltaPlan<T> Empty { get; } = new([], [], [], []);
|
|
40
|
+
|
|
41
|
+
/// <summary>
|
|
42
|
+
/// Se o acervo ja reflete a entrada. <b>E a idempotencia expressa como predicado:</b>
|
|
43
|
+
/// re-planejar a mesma entrada sobre o acervo que ela produziu tem de dar verdadeiro.
|
|
44
|
+
/// </summary>
|
|
45
|
+
public bool IsNoOp => Added.Count == 0 && Updated.Count == 0 && Removed.Count == 0;
|
|
46
|
+
|
|
47
|
+
/// <summary>Quantos itens da entrada tocam o acervo. Zero num plano idempotente.</summary>
|
|
48
|
+
public int WriteCount => Added.Count + Updated.Count + Removed.Count;
|
|
49
|
+
}
|