@polymorphism-tech/morph-spec 8.34.2 → 8.35.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +22 -5
- package/README.md +2 -2
- package/bin/morph-spec.js +18 -4
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +5 -4
- package/docs/QUICKSTART.md +1 -1
- package/framework/MORPH.md +16 -17
- package/framework/agents.json +197 -44
- package/framework/ai-pin.json +22 -0
- package/framework/commands/morph-media.md +45 -0
- package/framework/docs/CLI.md +236 -11
- package/framework/evals/proof-rubrics/README.md +76 -0
- package/framework/evals/proof-rubrics/eval-de-modelo.md +64 -0
- package/framework/evals/proof-rubrics/fiacao.md +54 -0
- package/framework/evals/proof-rubrics/guard-cego.md +52 -0
- package/framework/evals/proof-rubrics/media-claims.md +109 -0
- package/framework/evals/proof-rubrics/mutation-proof.md +77 -0
- package/framework/evals/proof-rubrics/observabilidade-genai.md +119 -0
- package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +48 -0
- package/framework/evals/rubrics/architecture.md +30 -0
- package/framework/evals/rubrics/code-quality.md +26 -0
- package/framework/evals/rubrics/test-coverage.md +20 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +41 -4
- package/framework/hooks/claude-code/core/worktree-env-inject.js +43 -0
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/e2e-check.js +135 -22
- package/framework/hooks/shared/payload-utils.js +15 -2
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rules/ai-agents-standards.md +14 -2
- package/framework/schemas/ai-pin.schema.json +97 -0
- package/framework/schemas/config.schema.json +107 -0
- package/framework/schemas/feature.schema.json +23 -4
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +26 -5
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
- package/framework/skills/core/morph-implement/SKILL.md +18 -2
- package/framework/skills/core/morph-media/SKILL.md +215 -0
- package/framework/skills/core/morph-plan/SKILL.md +33 -2
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +166 -9
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +1 -1
- package/framework/standards/PROVENANCE.json +81 -3
- package/framework/standards/STANDARDS.json +1483 -839
- package/framework/standards/ai-agents/agent-archetypes.md +160 -0
- package/framework/standards/ai-agents/agent-session.md +164 -68
- package/framework/standards/ai-agents/agent-spec.md +196 -0
- package/framework/standards/ai-agents/batching.md +61 -37
- package/framework/standards/ai-agents/context-providers.md +97 -24
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +239 -0
- package/framework/standards/ai-agents/cost-and-budget.md +256 -0
- package/framework/standards/ai-agents/durable-workflows-hitl.md +98 -5
- package/framework/standards/ai-agents/evals-with-cache.md +289 -0
- package/framework/standards/ai-agents/guardrails.md +222 -0
- package/framework/standards/ai-agents/llm-runtime-defaults.md +226 -0
- package/framework/standards/ai-agents/mcp-server.md +119 -18
- package/framework/standards/ai-agents/mcp-tools.md +85 -32
- package/framework/standards/ai-agents/media-pipeline.md +352 -0
- package/framework/standards/ai-agents/media-video.md +267 -0
- package/framework/standards/ai-agents/middleware-patterns.md +39 -5
- package/framework/standards/ai-agents/modalities-image-gen.md +354 -105
- package/framework/standards/ai-agents/modalities-speech-to-text.md +8 -2
- package/framework/standards/ai-agents/modalities-text-to-speech.md +10 -2
- package/framework/standards/ai-agents/modalities-vision.md +6 -2
- package/framework/standards/ai-agents/multi-agent-patterns.md +61 -5
- package/framework/standards/ai-agents/observability-patterns.md +227 -17
- package/framework/standards/ai-agents/production.md +38 -9
- package/framework/standards/ai-agents/prompt-sources.md +389 -0
- package/framework/standards/ai-agents/providers/model-registry.md +174 -39
- package/framework/standards/ai-agents/rag-custom-pgvector.md +69 -4
- package/framework/standards/ai-agents/service-tier-flex.md +27 -19
- package/framework/standards/ai-agents/setup.md +166 -50
- package/framework/standards/ai-agents/structured-output.md +34 -3
- package/framework/standards/ai-agents/sweet-spot.md +23 -3
- package/framework/standards/ai-agents/testing-ai.md +236 -0
- package/framework/standards/ai-agents/vector-data-extensions.md +50 -20
- package/framework/standards/ai-agents/workflows.md +27 -7
- package/framework/standards/frontend/design-system/ai-image-generation.md +12 -0
- package/framework/standards/frontend/design-system/ai-video-generation.md +13 -0
- package/framework/standards/infrastructure/docker/local-compose-isolation.md +3 -1
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +13 -0
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +1 -1
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +1 -1
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/dotnet/ai-kit/Directory.Build.props +25 -0
- package/framework/templates/dotnet/ai-kit/Directory.Packages.props +26 -0
- package/framework/templates/dotnet/ai-kit/Morph.AiKit.sln +56 -0
- package/framework/templates/dotnet/ai-kit/NuGet.config +12 -0
- package/framework/templates/dotnet/ai-kit/README.md +128 -0
- package/framework/templates/dotnet/ai-kit/global.json +9 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +65 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +289 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +91 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +91 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +181 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +14 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +174 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +54 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +75 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +71 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +246 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +57 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +78 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +225 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +463 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +32 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +49 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +214 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +168 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +142 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +349 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +42 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +77 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +28 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +107 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +253 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +103 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +259 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +21 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +47 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +102 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +44 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +192 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +94 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +99 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +97 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +133 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +93 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +112 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +288 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +158 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +29 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +208 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +95 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Morph.AiKit.csproj +38 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +119 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +82 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +33 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +267 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +474 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/model-registry.v2.json +87 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +169 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +49 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +495 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +260 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +405 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +379 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +197 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +139 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +157 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +178 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +153 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +194 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +86 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +213 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +95 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +225 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +215 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +33 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +89 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +55 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +60 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +131 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +133 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +127 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +216 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +264 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +148 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +184 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +89 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +98 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +451 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +76 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +33 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +261 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +374 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/.morph-eval-cache.json +12 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/orcamento/acme/a-resposta-estruturada.json +24 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/a-saudacao.json +23 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/b-escalonamento.json +24 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/globex/a-saudacao.json +23 -0
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +3 -3
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/e2e/e2e.js +15 -2
- package/src/commands/index.js +13 -13
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +148 -6
- package/src/commands/project/update.js +469 -153
- package/src/commands/project/worktree.js +76 -4
- package/src/commands/state/advance.js +24 -2
- package/src/commands/state/approve.js +33 -1
- package/src/commands/state/create.js +72 -11
- package/src/commands/state/finish.js +379 -24
- package/src/commands/state/gate-check.js +190 -6
- package/src/commands/state/score.js +36 -1
- package/src/commands/validation/verify.js +134 -25
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/state/state-manager.js +9 -1
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/ai/ai-checks.js +182 -0
- package/src/lib/ai/ai-project-scan.js +347 -0
- package/src/lib/ai/code-audit.js +181 -0
- package/src/lib/ai/comment-stripper.js +184 -0
- package/src/lib/ai/pin-drift.js +138 -0
- package/src/lib/ai/registry-audit.js +285 -0
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/e2e/compose-env.js +50 -4
- package/src/lib/evaluator-report.js +269 -15
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/git/default-branch.js +92 -4
- package/src/lib/git/pr-files.js +56 -0
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/effects.js +193 -0
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/installers/templates-reconcile.js +3 -3
- package/src/lib/risk-detector.js +284 -0
- package/src/lib/standards/verified-against.js +276 -0
- package/src/lib/tasks/eval-node.js +485 -0
- package/src/lib/tasks/linux-runner.js +297 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/test-nodes.js +486 -0
- package/src/lib/tasks/test-runner.js +410 -33
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/verify-runner.js +583 -28
- package/src/lib/worktree/docker-audit.js +287 -0
- package/src/lib/worktree/env-allocator.js +24 -0
- package/src/lib/worktree/worktree-audit.js +30 -1
- package/src/scripts/setup-infra.js +24 -11
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +18 -8
- package/src/utils/claude-md-injector.js +10 -5
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +11 -4
- package/src/utils/hooks-installer.js +29 -26
- package/src/utils/skills-installer.js +36 -29
- package/src/utils/version-checker.js +68 -3
- package/framework/standards/ai-agents/prompts-in-db.md +0 -214
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarioName": "triagem.acme.a-saudacao",
|
|
3
|
+
"iterationName": "1",
|
|
4
|
+
"key": "19F631228C6E00BA41892982E6EA1BB23822FA53D6E62C79B6724893618E7E03AE4F70F94332FDEE0DAA960974BA1171",
|
|
5
|
+
"creation": "2026-09-09T04:54:34.8385364+00:00",
|
|
6
|
+
"expiration": "2036-09-06T04:54:34.8385364+00:00"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarioName": "triagem.acme.b-escalonamento",
|
|
3
|
+
"iterationName": "1",
|
|
4
|
+
"key": "A24A7C9BDD8239D87A60FD05A4BF870DAB4CFBE8BE7A796FF86534B6F37F4517321D3420D76ED6B5EF000C68CB18301F",
|
|
5
|
+
"creation": "2026-09-09T04:54:34.8448053+00:00",
|
|
6
|
+
"expiration": "2036-09-06T04:54:34.8448053+00:00"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarioName": "triagem.globex.a-saudacao",
|
|
3
|
+
"iterationName": "1",
|
|
4
|
+
"key": "E38CD37DF003EDB77815FF1A086F48ACBDD63E743D44DFFDF2A23EEED34731E8D3B6E51A4EBB740CB0BF2720D8AA02ED",
|
|
5
|
+
"creation": "2026-09-09T04:54:34.846003+00:00",
|
|
6
|
+
"expiration": "2036-09-06T04:54:34.846003+00:00"
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"messages": [
|
|
3
|
+
{
|
|
4
|
+
"role": "system",
|
|
5
|
+
"text": "Responda SOMENTE com um objeto JSON com as chaves valor e prazo."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"role": "user",
|
|
9
|
+
"text": "quanto custa a revisao anual?"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"assertions": [
|
|
13
|
+
{
|
|
14
|
+
"name": "tem-valor",
|
|
15
|
+
"kind": "json-has-key",
|
|
16
|
+
"target": "valor"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "tem-prazo",
|
|
20
|
+
"kind": "json-has-key",
|
|
21
|
+
"target": "prazo"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"messages": [
|
|
3
|
+
{
|
|
4
|
+
"role": "system",
|
|
5
|
+
"text": "Voce e o atendente da Acme. Responda em portugues, em uma frase."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"role": "user",
|
|
9
|
+
"text": "bom dia"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"assertions": [
|
|
13
|
+
{
|
|
14
|
+
"name": "cumprimenta",
|
|
15
|
+
"kind": "contains",
|
|
16
|
+
"value": "bom dia"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "sem-dado-pessoal",
|
|
20
|
+
"kind": "no-pii"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"messages": [
|
|
3
|
+
{
|
|
4
|
+
"role": "system",
|
|
5
|
+
"text": "Voce e o atendente da Acme. Responda em portugues, em uma frase."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"role": "user",
|
|
9
|
+
"text": "quero falar com um humano agora"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"assertions": [
|
|
13
|
+
{
|
|
14
|
+
"name": "confirma-encaminhamento",
|
|
15
|
+
"kind": "contains",
|
|
16
|
+
"value": "encaminhando"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "nao-promete-prazo",
|
|
20
|
+
"kind": "not-contains",
|
|
21
|
+
"value": "garantimos"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"messages": [
|
|
3
|
+
{
|
|
4
|
+
"role": "system",
|
|
5
|
+
"text": "Voce e o atendente da Globex. Responda em portugues, em uma frase."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"role": "user",
|
|
9
|
+
"text": "bom dia"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"assertions": [
|
|
13
|
+
{
|
|
14
|
+
"name": "cumprimenta",
|
|
15
|
+
"kind": "contains",
|
|
16
|
+
"value": "Globex"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "sem-dado-pessoal",
|
|
20
|
+
"kind": "no-pii"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
# Architecture Decision Records - {{titleCase FEATURE_NAME}}
|
|
2
|
-
|
|
3
|
-
## ADR-001: {Decision Title}
|
|
4
|
-
|
|
5
|
-
**Date:** {{DATE}}
|
|
6
|
-
**Status:** Proposed | Accepted | Deprecated | Superseded
|
|
7
|
-
**Deciders:** MORPH Agents, Developer
|
|
8
|
-
|
|
9
|
-
### Context
|
|
10
|
-
|
|
11
|
-
{Describe the context and problem that led to this decision}
|
|
12
|
-
|
|
13
|
-
### Decision
|
|
14
|
-
|
|
15
|
-
{Describe the decision made}
|
|
16
|
-
|
|
17
|
-
### Consequences
|
|
18
|
-
|
|
19
|
-
**Pros:**
|
|
20
|
-
- {Positive consequence 1}
|
|
21
|
-
- {Positive consequence 2}
|
|
22
|
-
|
|
23
|
-
**Cons:**
|
|
24
|
-
- {Negative consequence 1}
|
|
25
|
-
|
|
26
|
-
**Risks:**
|
|
27
|
-
- {Identified risk}
|
|
28
|
-
|
|
29
|
-
### Alternatives Considered
|
|
30
|
-
|
|
31
|
-
#### Option A: {Name}
|
|
32
|
-
- Pros: {advantages}
|
|
33
|
-
- Cons: {disadvantages}
|
|
34
|
-
- **Rejected because:** {reason}
|
|
35
|
-
|
|
36
|
-
#### Option B: {Name}
|
|
37
|
-
- Pros: {advantages}
|
|
38
|
-
- Cons: {disadvantages}
|
|
39
|
-
- **Rejected because:** {reason}
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
{{#if (eq STACK "nextjs-neon")}}
|
|
44
|
-
## ADR-002: Database Access Strategy
|
|
45
|
-
|
|
46
|
-
**Date:** {{DATE}}
|
|
47
|
-
**Status:** Accepted
|
|
48
|
-
|
|
49
|
-
### Context
|
|
50
|
-
|
|
51
|
-
Need to decide how the .NET API accesses Neon PostgreSQL.
|
|
52
|
-
|
|
53
|
-
### Decision
|
|
54
|
-
|
|
55
|
-
Use Dapper with Npgsql for direct SQL queries. No EF Core.
|
|
56
|
-
|
|
57
|
-
### Consequences
|
|
58
|
-
|
|
59
|
-
**Pros:**
|
|
60
|
-
- Full control over SQL queries
|
|
61
|
-
- Better performance (no ORM overhead)
|
|
62
|
-
- Direct access to PostgreSQL features (jsonb, pgvector, functions)
|
|
63
|
-
- RLS policies apply naturally through connection
|
|
64
|
-
|
|
65
|
-
**Cons:**
|
|
66
|
-
- No automatic migrations (use Neon CLI / dotnet ef instead)
|
|
67
|
-
- Manual SQL query writing
|
|
68
|
-
- No change tracking
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## ADR-003: Auth Strategy
|
|
73
|
-
|
|
74
|
-
**Date:** {{DATE}}
|
|
75
|
-
**Status:** Accepted
|
|
76
|
-
|
|
77
|
-
### Context
|
|
78
|
-
|
|
79
|
-
Need authentication for both Next.js frontend and .NET API.
|
|
80
|
-
|
|
81
|
-
### Decision
|
|
82
|
-
|
|
83
|
-
Use Neon Auth (Better Auth) for authentication. Auth data lives in the Neon database. JWT validated by .NET API middleware.
|
|
84
|
-
|
|
85
|
-
### Consequences
|
|
86
|
-
|
|
87
|
-
**Pros:**
|
|
88
|
-
- Auth data in same database — no external provider, no sync delays
|
|
89
|
-
- RLS policies work with Neon Auth JWT via auth.user_id() / pg_session_jwt
|
|
90
|
-
- Built-in social login, email/password via @neondatabase/auth SDK
|
|
91
|
-
- Branch isolation — each Neon branch gets isolated auth data
|
|
92
|
-
- No webhooks needed — query neon_auth schema directly
|
|
93
|
-
|
|
94
|
-
**Cons:**
|
|
95
|
-
- Neon Auth is currently in Beta
|
|
96
|
-
- JWT must be forwarded to .NET API for backend auth
|
|
97
|
-
{{/if}}
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## Template for New ADRs
|
|
102
|
-
|
|
103
|
-
```markdown
|
|
104
|
-
## ADR-XXX: {Title}
|
|
105
|
-
|
|
106
|
-
**Date:**
|
|
107
|
-
**Status:** Proposed | Accepted | Deprecated | Superseded
|
|
108
|
-
|
|
109
|
-
### Context
|
|
110
|
-
{Why is this decision needed?}
|
|
111
|
-
|
|
112
|
-
### Decision
|
|
113
|
-
{What was decided?}
|
|
114
|
-
|
|
115
|
-
### Consequences
|
|
116
|
-
**Pros:** {list}
|
|
117
|
-
**Cons:** {list}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
*Generated by MORPH Framework*
|
|
1
|
+
# Architecture Decision Records - {{titleCase FEATURE_NAME}}
|
|
2
|
+
|
|
3
|
+
## ADR-001: {Decision Title}
|
|
4
|
+
|
|
5
|
+
**Date:** {{DATE}}
|
|
6
|
+
**Status:** Proposed | Accepted | Deprecated | Superseded
|
|
7
|
+
**Deciders:** MORPH Agents, Developer
|
|
8
|
+
|
|
9
|
+
### Context
|
|
10
|
+
|
|
11
|
+
{Describe the context and problem that led to this decision}
|
|
12
|
+
|
|
13
|
+
### Decision
|
|
14
|
+
|
|
15
|
+
{Describe the decision made}
|
|
16
|
+
|
|
17
|
+
### Consequences
|
|
18
|
+
|
|
19
|
+
**Pros:**
|
|
20
|
+
- {Positive consequence 1}
|
|
21
|
+
- {Positive consequence 2}
|
|
22
|
+
|
|
23
|
+
**Cons:**
|
|
24
|
+
- {Negative consequence 1}
|
|
25
|
+
|
|
26
|
+
**Risks:**
|
|
27
|
+
- {Identified risk}
|
|
28
|
+
|
|
29
|
+
### Alternatives Considered
|
|
30
|
+
|
|
31
|
+
#### Option A: {Name}
|
|
32
|
+
- Pros: {advantages}
|
|
33
|
+
- Cons: {disadvantages}
|
|
34
|
+
- **Rejected because:** {reason}
|
|
35
|
+
|
|
36
|
+
#### Option B: {Name}
|
|
37
|
+
- Pros: {advantages}
|
|
38
|
+
- Cons: {disadvantages}
|
|
39
|
+
- **Rejected because:** {reason}
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
{{#if (eq STACK "nextjs-neon")}}
|
|
44
|
+
## ADR-002: Database Access Strategy
|
|
45
|
+
|
|
46
|
+
**Date:** {{DATE}}
|
|
47
|
+
**Status:** Accepted
|
|
48
|
+
|
|
49
|
+
### Context
|
|
50
|
+
|
|
51
|
+
Need to decide how the .NET API accesses Neon PostgreSQL.
|
|
52
|
+
|
|
53
|
+
### Decision
|
|
54
|
+
|
|
55
|
+
Use Dapper with Npgsql for direct SQL queries. No EF Core.
|
|
56
|
+
|
|
57
|
+
### Consequences
|
|
58
|
+
|
|
59
|
+
**Pros:**
|
|
60
|
+
- Full control over SQL queries
|
|
61
|
+
- Better performance (no ORM overhead)
|
|
62
|
+
- Direct access to PostgreSQL features (jsonb, pgvector, functions)
|
|
63
|
+
- RLS policies apply naturally through connection
|
|
64
|
+
|
|
65
|
+
**Cons:**
|
|
66
|
+
- No automatic migrations (use Neon CLI / dotnet ef instead)
|
|
67
|
+
- Manual SQL query writing
|
|
68
|
+
- No change tracking
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## ADR-003: Auth Strategy
|
|
73
|
+
|
|
74
|
+
**Date:** {{DATE}}
|
|
75
|
+
**Status:** Accepted
|
|
76
|
+
|
|
77
|
+
### Context
|
|
78
|
+
|
|
79
|
+
Need authentication for both Next.js frontend and .NET API.
|
|
80
|
+
|
|
81
|
+
### Decision
|
|
82
|
+
|
|
83
|
+
Use Neon Auth (Better Auth) for authentication. Auth data lives in the Neon database. JWT validated by .NET API middleware.
|
|
84
|
+
|
|
85
|
+
### Consequences
|
|
86
|
+
|
|
87
|
+
**Pros:**
|
|
88
|
+
- Auth data in same database — no external provider, no sync delays
|
|
89
|
+
- RLS policies work with Neon Auth JWT via auth.user_id() / pg_session_jwt
|
|
90
|
+
- Built-in social login, email/password via @neondatabase/auth SDK
|
|
91
|
+
- Branch isolation — each Neon branch gets isolated auth data
|
|
92
|
+
- No webhooks needed — query neon_auth schema directly
|
|
93
|
+
|
|
94
|
+
**Cons:**
|
|
95
|
+
- Neon Auth is currently in Beta
|
|
96
|
+
- JWT must be forwarded to .NET API for backend auth
|
|
97
|
+
{{/if}}
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Template for New ADRs
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
## ADR-XXX: {Title}
|
|
105
|
+
|
|
106
|
+
**Date:**
|
|
107
|
+
**Status:** Proposed | Accepted | Deprecated | Superseded
|
|
108
|
+
|
|
109
|
+
### Context
|
|
110
|
+
{Why is this decision needed?}
|
|
111
|
+
|
|
112
|
+
### Decision
|
|
113
|
+
{What was decided?}
|
|
114
|
+
|
|
115
|
+
### Consequences
|
|
116
|
+
**Pros:** {list}
|
|
117
|
+
**Cons:** {list}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
*Generated by MORPH Framework*
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
# Multi-stage Next.js production build for Coolify
|
|
2
|
-
# Stage 1: Dependencies
|
|
3
|
-
FROM node:20-alpine AS deps
|
|
4
|
-
RUN apk add --no-cache libc6-compat
|
|
5
|
-
WORKDIR /app
|
|
6
|
-
|
|
7
|
-
COPY package.json package-lock.json* ./
|
|
8
|
-
RUN npm ci --only=production && npm cache clean --force
|
|
9
|
-
|
|
10
|
-
# Stage 2: Build
|
|
11
|
-
FROM node:20-alpine AS builder
|
|
12
|
-
WORKDIR /app
|
|
13
|
-
|
|
14
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
15
|
-
COPY . .
|
|
16
|
-
|
|
17
|
-
# Build args for NEXT_PUBLIC_ variables (must be available at build time)
|
|
18
|
-
ARG NEXT_PUBLIC_APP_URL
|
|
19
|
-
ENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL
|
|
20
|
-
|
|
21
|
-
RUN npm run build
|
|
22
|
-
|
|
23
|
-
# Stage 3: Production runner
|
|
24
|
-
FROM node:20-alpine AS runner
|
|
25
|
-
WORKDIR /app
|
|
26
|
-
|
|
27
|
-
ENV NODE_ENV=production
|
|
28
|
-
ENV NEXT_TELEMETRY_DISABLED=1
|
|
29
|
-
|
|
30
|
-
RUN addgroup --system --gid 1001 nodejs
|
|
31
|
-
RUN adduser --system --uid 1001 nextjs
|
|
32
|
-
|
|
33
|
-
COPY --from=builder /app/public ./public
|
|
34
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
35
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
36
|
-
|
|
37
|
-
USER nextjs
|
|
38
|
-
|
|
39
|
-
EXPOSE 3000
|
|
40
|
-
ENV PORT=3000
|
|
41
|
-
ENV HOSTNAME="0.0.0.0"
|
|
42
|
-
|
|
43
|
-
CMD ["node", "server.js"]
|
|
1
|
+
# Multi-stage Next.js production build for Coolify
|
|
2
|
+
# Stage 1: Dependencies
|
|
3
|
+
FROM node:20-alpine AS deps
|
|
4
|
+
RUN apk add --no-cache libc6-compat
|
|
5
|
+
WORKDIR /app
|
|
6
|
+
|
|
7
|
+
COPY package.json package-lock.json* ./
|
|
8
|
+
RUN npm ci --only=production && npm cache clean --force
|
|
9
|
+
|
|
10
|
+
# Stage 2: Build
|
|
11
|
+
FROM node:20-alpine AS builder
|
|
12
|
+
WORKDIR /app
|
|
13
|
+
|
|
14
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
15
|
+
COPY . .
|
|
16
|
+
|
|
17
|
+
# Build args for NEXT_PUBLIC_ variables (must be available at build time)
|
|
18
|
+
ARG NEXT_PUBLIC_APP_URL
|
|
19
|
+
ENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL
|
|
20
|
+
|
|
21
|
+
RUN npm run build
|
|
22
|
+
|
|
23
|
+
# Stage 3: Production runner
|
|
24
|
+
FROM node:20-alpine AS runner
|
|
25
|
+
WORKDIR /app
|
|
26
|
+
|
|
27
|
+
ENV NODE_ENV=production
|
|
28
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
29
|
+
|
|
30
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
31
|
+
RUN adduser --system --uid 1001 nextjs
|
|
32
|
+
|
|
33
|
+
COPY --from=builder /app/public ./public
|
|
34
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
35
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
36
|
+
|
|
37
|
+
USER nextjs
|
|
38
|
+
|
|
39
|
+
EXPOSE 3000
|
|
40
|
+
ENV PORT=3000
|
|
41
|
+
ENV HOSTNAME="0.0.0.0"
|
|
42
|
+
|
|
43
|
+
CMD ["node", "server.js"]
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
// features/{{kebabCase featureName}}/components/{{kebabCase featureName}}-list.tsx
|
|
2
|
-
'use client';
|
|
3
|
-
|
|
4
|
-
import { use{{pascalCase featureName}}s } from '@/features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s';
|
|
5
|
-
import { DataTable } from '@/components/data-table';
|
|
6
|
-
import type { {{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
|
|
7
|
-
import type { ColumnDef } from '@tanstack/react-table';
|
|
8
|
-
|
|
9
|
-
const columns: ColumnDef<{{pascalCase featureName}}>[] = [
|
|
10
|
-
{ accessorKey: 'id', header: 'ID' },
|
|
11
|
-
{ accessorKey: 'name', header: 'Name' },
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
interface {{pascalCase featureName}}ListProps {
|
|
15
|
-
initialData?: {{pascalCase featureName}}[];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function {{pascalCase featureName}}List({ initialData }: {{pascalCase featureName}}ListProps) {
|
|
19
|
-
const { data = initialData ?? [], isLoading } = use{{pascalCase featureName}}s();
|
|
20
|
-
|
|
21
|
-
if (isLoading) {
|
|
22
|
-
return <div className="flex items-center justify-center h-32">Loading...</div>;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return <DataTable columns={columns} data={data} />;
|
|
26
|
-
}
|
|
1
|
+
// features/{{kebabCase featureName}}/components/{{kebabCase featureName}}-list.tsx
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
import { use{{pascalCase featureName}}s } from '@/features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s';
|
|
5
|
+
import { DataTable } from '@/components/data-table';
|
|
6
|
+
import type { {{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
|
|
7
|
+
import type { ColumnDef } from '@tanstack/react-table';
|
|
8
|
+
|
|
9
|
+
const columns: ColumnDef<{{pascalCase featureName}}>[] = [
|
|
10
|
+
{ accessorKey: 'id', header: 'ID' },
|
|
11
|
+
{ accessorKey: 'name', header: 'Name' },
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
interface {{pascalCase featureName}}ListProps {
|
|
15
|
+
initialData?: {{pascalCase featureName}}[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function {{pascalCase featureName}}List({ initialData }: {{pascalCase featureName}}ListProps) {
|
|
19
|
+
const { data = initialData ?? [], isLoading } = use{{pascalCase featureName}}s();
|
|
20
|
+
|
|
21
|
+
if (isLoading) {
|
|
22
|
+
return <div className="flex items-center justify-center h-32">Loading...</div>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return <DataTable columns={columns} data={data} />;
|
|
26
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
// env.mjs — Zod-validated environment variables
|
|
2
|
-
// Crashes at startup if required vars are missing — no silent undefined
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
|
|
5
|
-
const serverSchema = z.object({
|
|
6
|
-
API_URL: z.string().url('API_URL must be a valid URL'),
|
|
7
|
-
NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
const clientSchema = z.object({
|
|
11
|
-
NEXT_PUBLIC_APP_URL: z.string().url().optional(),
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
// Validate server-side env (only available on server)
|
|
15
|
-
const serverEnv = serverSchema.safeParse(process.env);
|
|
16
|
-
if (!serverEnv.success) {
|
|
17
|
-
console.error('❌ Invalid server environment variables:');
|
|
18
|
-
console.error(serverEnv.error.flatten().fieldErrors);
|
|
19
|
-
throw new Error('Invalid environment variables');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Validate client-side env
|
|
23
|
-
const clientEnv = clientSchema.safeParse({
|
|
24
|
-
NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,
|
|
25
|
-
});
|
|
26
|
-
if (!clientEnv.success) {
|
|
27
|
-
console.error('❌ Invalid client environment variables:');
|
|
28
|
-
console.error(clientEnv.error.flatten().fieldErrors);
|
|
29
|
-
throw new Error('Invalid client environment variables');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export const env = { ...serverEnv.data, ...clientEnv.data };
|
|
1
|
+
// env.mjs — Zod-validated environment variables
|
|
2
|
+
// Crashes at startup if required vars are missing — no silent undefined
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
|
|
5
|
+
const serverSchema = z.object({
|
|
6
|
+
API_URL: z.string().url('API_URL must be a valid URL'),
|
|
7
|
+
NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const clientSchema = z.object({
|
|
11
|
+
NEXT_PUBLIC_APP_URL: z.string().url().optional(),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// Validate server-side env (only available on server)
|
|
15
|
+
const serverEnv = serverSchema.safeParse(process.env);
|
|
16
|
+
if (!serverEnv.success) {
|
|
17
|
+
console.error('❌ Invalid server environment variables:');
|
|
18
|
+
console.error(serverEnv.error.flatten().fieldErrors);
|
|
19
|
+
throw new Error('Invalid environment variables');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Validate client-side env
|
|
23
|
+
const clientEnv = clientSchema.safeParse({
|
|
24
|
+
NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,
|
|
25
|
+
});
|
|
26
|
+
if (!clientEnv.success) {
|
|
27
|
+
console.error('❌ Invalid client environment variables:');
|
|
28
|
+
console.error(clientEnv.error.flatten().fieldErrors);
|
|
29
|
+
throw new Error('Invalid client environment variables');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const env = { ...serverEnv.data, ...clientEnv.data };
|