@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
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
// features/{{kebabCase featureName}}/components/create-{{kebabCase featureName}}-form.tsx
|
|
2
|
-
'use client';
|
|
3
|
-
|
|
4
|
-
import { useForm } from 'react-hook-form';
|
|
5
|
-
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
-
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
|
|
7
|
-
import { Input } from '@/components/ui/input';
|
|
8
|
-
import { Button } from '@/components/ui/button';
|
|
9
|
-
import { useCreate{{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/hooks/use-create-{{kebabCase featureName}}';
|
|
10
|
-
import { create{{pascalCase featureName}}Schema, type Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
|
|
11
|
-
|
|
12
|
-
interface Create{{pascalCase featureName}}FormProps {
|
|
13
|
-
onSuccess?: () => void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function Create{{pascalCase featureName}}Form({ onSuccess }: Create{{pascalCase featureName}}FormProps) {
|
|
17
|
-
const form = useForm<Create{{pascalCase featureName}}Input>({
|
|
18
|
-
resolver: zodResolver(create{{pascalCase featureName}}Schema),
|
|
19
|
-
defaultValues: { name: '' },
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const { mutate: create{{pascalCase featureName}}, isPending } = useCreate{{pascalCase featureName}}();
|
|
23
|
-
|
|
24
|
-
function onSubmit(values: Create{{pascalCase featureName}}Input) {
|
|
25
|
-
create{{pascalCase featureName}}(values, {
|
|
26
|
-
onSuccess: () => { form.reset(); onSuccess?.(); },
|
|
27
|
-
onError: (error) => { form.setError('root', { message: error.message }); },
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return (
|
|
32
|
-
<Form {...form}>
|
|
33
|
-
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
|
|
34
|
-
<FormField
|
|
35
|
-
control={form.control}
|
|
36
|
-
name="name"
|
|
37
|
-
render={({ field }) => (
|
|
38
|
-
<FormItem>
|
|
39
|
-
<FormLabel>Name</FormLabel>
|
|
40
|
-
<FormControl>
|
|
41
|
-
<Input placeholder="Enter name" {...field} />
|
|
42
|
-
</FormControl>
|
|
43
|
-
<FormMessage />
|
|
44
|
-
</FormItem>
|
|
45
|
-
)}
|
|
46
|
-
/>
|
|
47
|
-
{form.formState.errors.root && (
|
|
48
|
-
<p className="text-sm text-destructive">{form.formState.errors.root.message}</p>
|
|
49
|
-
)}
|
|
50
|
-
<Button type="submit" disabled={isPending}>
|
|
51
|
-
{isPending ? 'Creating...' : 'Create {{pascalCase featureName}}'}
|
|
52
|
-
</Button>
|
|
53
|
-
</form>
|
|
54
|
-
</Form>
|
|
55
|
-
);
|
|
56
|
-
}
|
|
1
|
+
// features/{{kebabCase featureName}}/components/create-{{kebabCase featureName}}-form.tsx
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
import { useForm } from 'react-hook-form';
|
|
5
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
+
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
|
|
7
|
+
import { Input } from '@/components/ui/input';
|
|
8
|
+
import { Button } from '@/components/ui/button';
|
|
9
|
+
import { useCreate{{pascalCase featureName}} } from '@/features/{{kebabCase featureName}}/hooks/use-create-{{kebabCase featureName}}';
|
|
10
|
+
import { create{{pascalCase featureName}}Schema, type Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
|
|
11
|
+
|
|
12
|
+
interface Create{{pascalCase featureName}}FormProps {
|
|
13
|
+
onSuccess?: () => void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function Create{{pascalCase featureName}}Form({ onSuccess }: Create{{pascalCase featureName}}FormProps) {
|
|
17
|
+
const form = useForm<Create{{pascalCase featureName}}Input>({
|
|
18
|
+
resolver: zodResolver(create{{pascalCase featureName}}Schema),
|
|
19
|
+
defaultValues: { name: '' },
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const { mutate: create{{pascalCase featureName}}, isPending } = useCreate{{pascalCase featureName}}();
|
|
23
|
+
|
|
24
|
+
function onSubmit(values: Create{{pascalCase featureName}}Input) {
|
|
25
|
+
create{{pascalCase featureName}}(values, {
|
|
26
|
+
onSuccess: () => { form.reset(); onSuccess?.(); },
|
|
27
|
+
onError: (error) => { form.setError('root', { message: error.message }); },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<Form {...form}>
|
|
33
|
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
|
|
34
|
+
<FormField
|
|
35
|
+
control={form.control}
|
|
36
|
+
name="name"
|
|
37
|
+
render={({ field }) => (
|
|
38
|
+
<FormItem>
|
|
39
|
+
<FormLabel>Name</FormLabel>
|
|
40
|
+
<FormControl>
|
|
41
|
+
<Input placeholder="Enter name" {...field} />
|
|
42
|
+
</FormControl>
|
|
43
|
+
<FormMessage />
|
|
44
|
+
</FormItem>
|
|
45
|
+
)}
|
|
46
|
+
/>
|
|
47
|
+
{form.formState.errors.root && (
|
|
48
|
+
<p className="text-sm text-destructive">{form.formState.errors.root.message}</p>
|
|
49
|
+
)}
|
|
50
|
+
<Button type="submit" disabled={isPending}>
|
|
51
|
+
{isPending ? 'Creating...' : 'Create {{pascalCase featureName}}'}
|
|
52
|
+
</Button>
|
|
53
|
+
</form>
|
|
54
|
+
</Form>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
// app/(dashboard)/{{kebabCase featureName}}/page.tsx
|
|
2
|
-
// Server Component — fetches initial data, renders feature component
|
|
3
|
-
import { {{pascalCase featureName}}List } from '@/features/{{kebabCase featureName}}';
|
|
4
|
-
|
|
5
|
-
async function get{{pascalCase featureName}}List() {
|
|
6
|
-
const res = await fetch(`${process.env.API_URL}/api/{{kebabCase featureName}}`, {
|
|
7
|
-
next: { revalidate: 30 },
|
|
8
|
-
headers: { 'Content-Type': 'application/json' },
|
|
9
|
-
});
|
|
10
|
-
if (!res.ok) throw new Error('Failed to fetch {{featureName}}');
|
|
11
|
-
return res.json();
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default async function {{pascalCase featureName}}Page() {
|
|
15
|
-
const data = await get{{pascalCase featureName}}List();
|
|
16
|
-
return (
|
|
17
|
-
<div className="container py-6">
|
|
18
|
-
<h1 className="text-2xl font-bold mb-6">{{pascalCase featureName}}</h1>
|
|
19
|
-
<{{pascalCase featureName}}List initialData={data} />
|
|
20
|
-
</div>
|
|
21
|
-
);
|
|
22
|
-
}
|
|
1
|
+
// app/(dashboard)/{{kebabCase featureName}}/page.tsx
|
|
2
|
+
// Server Component — fetches initial data, renders feature component
|
|
3
|
+
import { {{pascalCase featureName}}List } from '@/features/{{kebabCase featureName}}';
|
|
4
|
+
|
|
5
|
+
async function get{{pascalCase featureName}}List() {
|
|
6
|
+
const res = await fetch(`${process.env.API_URL}/api/{{kebabCase featureName}}`, {
|
|
7
|
+
next: { revalidate: 30 },
|
|
8
|
+
headers: { 'Content-Type': 'application/json' },
|
|
9
|
+
});
|
|
10
|
+
if (!res.ok) throw new Error('Failed to fetch {{featureName}}');
|
|
11
|
+
return res.json();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default async function {{pascalCase featureName}}Page() {
|
|
15
|
+
const data = await get{{pascalCase featureName}}List();
|
|
16
|
+
return (
|
|
17
|
+
<div className="container py-6">
|
|
18
|
+
<h1 className="text-2xl font-bold mb-6">{{pascalCase featureName}}</h1>
|
|
19
|
+
<{{pascalCase featureName}}List initialData={data} />
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
-
"allowJs": false,
|
|
6
|
-
"skipLibCheck": true,
|
|
7
|
-
"strict": true,
|
|
8
|
-
"noUncheckedIndexedAccess": true,
|
|
9
|
-
"noImplicitOverride": true,
|
|
10
|
-
"forceConsistentCasingInFileNames": true,
|
|
11
|
-
"noEmit": true,
|
|
12
|
-
"esModuleInterop": true,
|
|
13
|
-
"module": "esnext",
|
|
14
|
-
"moduleResolution": "bundler",
|
|
15
|
-
"resolveJsonModule": true,
|
|
16
|
-
"isolatedModules": true,
|
|
17
|
-
"jsx": "preserve",
|
|
18
|
-
"incremental": true,
|
|
19
|
-
"plugins": [{ "name": "next" }],
|
|
20
|
-
"paths": {
|
|
21
|
-
"@/*": ["./src/*"]
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
25
|
-
"exclude": ["node_modules"]
|
|
26
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": false,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noUncheckedIndexedAccess": true,
|
|
9
|
+
"noImplicitOverride": true,
|
|
10
|
+
"forceConsistentCasingInFileNames": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"esModuleInterop": true,
|
|
13
|
+
"module": "esnext",
|
|
14
|
+
"moduleResolution": "bundler",
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"jsx": "preserve",
|
|
18
|
+
"incremental": true,
|
|
19
|
+
"plugins": [{ "name": "next" }],
|
|
20
|
+
"paths": {
|
|
21
|
+
"@/*": ["./src/*"]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
25
|
+
"exclude": ["node_modules"]
|
|
26
|
+
}
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
// features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s.ts
|
|
2
|
-
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { {{camelCase featureName}}Schema } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
|
|
5
|
-
import type { Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
|
|
6
|
-
|
|
7
|
-
// ============================================
|
|
8
|
-
// Query Key Factory
|
|
9
|
-
// ============================================
|
|
10
|
-
|
|
11
|
-
export const {{camelCase featureName}}Keys = {
|
|
12
|
-
all: ['{{kebabCase featureName}}'] as const,
|
|
13
|
-
lists: () => [...{{camelCase featureName}}Keys.all, 'list'] as const,
|
|
14
|
-
detail: (id: string) => [...{{camelCase featureName}}Keys.all, 'detail', id] as const,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
// ============================================
|
|
18
|
-
// List Hook (TanStack Query v5 syntax)
|
|
19
|
-
// ============================================
|
|
20
|
-
|
|
21
|
-
const {{camelCase featureName}}ListSchema = z.array({{camelCase featureName}}Schema);
|
|
22
|
-
|
|
23
|
-
export function use{{pascalCase featureName}}s() {
|
|
24
|
-
return useQuery({
|
|
25
|
-
queryKey: {{camelCase featureName}}Keys.lists(),
|
|
26
|
-
queryFn: async () => {
|
|
27
|
-
const res = await fetch('/api/{{kebabCase featureName}}');
|
|
28
|
-
if (!res.ok) throw new Error('Failed to fetch {{featureName}}');
|
|
29
|
-
return {{camelCase featureName}}ListSchema.parse(await res.json());
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// ============================================
|
|
35
|
-
// Create Mutation
|
|
36
|
-
// ============================================
|
|
37
|
-
|
|
38
|
-
export function useCreate{{pascalCase featureName}}() {
|
|
39
|
-
const queryClient = useQueryClient();
|
|
40
|
-
return useMutation({
|
|
41
|
-
mutationFn: async (input: Create{{pascalCase featureName}}Input) => {
|
|
42
|
-
const res = await fetch('/api/{{kebabCase featureName}}', {
|
|
43
|
-
method: 'POST',
|
|
44
|
-
headers: { 'Content-Type': 'application/json' },
|
|
45
|
-
body: JSON.stringify(input),
|
|
46
|
-
});
|
|
47
|
-
if (!res.ok) throw new Error('Failed to create {{featureName}}');
|
|
48
|
-
return res.json();
|
|
49
|
-
},
|
|
50
|
-
onSuccess: () => {
|
|
51
|
-
queryClient.invalidateQueries({ queryKey: {{camelCase featureName}}Keys.lists() });
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
}
|
|
1
|
+
// features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s.ts
|
|
2
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { {{camelCase featureName}}Schema } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
|
|
5
|
+
import type { Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
|
|
6
|
+
|
|
7
|
+
// ============================================
|
|
8
|
+
// Query Key Factory
|
|
9
|
+
// ============================================
|
|
10
|
+
|
|
11
|
+
export const {{camelCase featureName}}Keys = {
|
|
12
|
+
all: ['{{kebabCase featureName}}'] as const,
|
|
13
|
+
lists: () => [...{{camelCase featureName}}Keys.all, 'list'] as const,
|
|
14
|
+
detail: (id: string) => [...{{camelCase featureName}}Keys.all, 'detail', id] as const,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// ============================================
|
|
18
|
+
// List Hook (TanStack Query v5 syntax)
|
|
19
|
+
// ============================================
|
|
20
|
+
|
|
21
|
+
const {{camelCase featureName}}ListSchema = z.array({{camelCase featureName}}Schema);
|
|
22
|
+
|
|
23
|
+
export function use{{pascalCase featureName}}s() {
|
|
24
|
+
return useQuery({
|
|
25
|
+
queryKey: {{camelCase featureName}}Keys.lists(),
|
|
26
|
+
queryFn: async () => {
|
|
27
|
+
const res = await fetch('/api/{{kebabCase featureName}}');
|
|
28
|
+
if (!res.ok) throw new Error('Failed to fetch {{featureName}}');
|
|
29
|
+
return {{camelCase featureName}}ListSchema.parse(await res.json());
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ============================================
|
|
35
|
+
// Create Mutation
|
|
36
|
+
// ============================================
|
|
37
|
+
|
|
38
|
+
export function useCreate{{pascalCase featureName}}() {
|
|
39
|
+
const queryClient = useQueryClient();
|
|
40
|
+
return useMutation({
|
|
41
|
+
mutationFn: async (input: Create{{pascalCase featureName}}Input) => {
|
|
42
|
+
const res = await fetch('/api/{{kebabCase featureName}}', {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: { 'Content-Type': 'application/json' },
|
|
45
|
+
body: JSON.stringify(input),
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) throw new Error('Failed to create {{featureName}}');
|
|
48
|
+
return res.json();
|
|
49
|
+
},
|
|
50
|
+
onSuccess: () => {
|
|
51
|
+
queryClient.invalidateQueries({ queryKey: {{camelCase featureName}}Keys.lists() });
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
# Multi-stage Dockerfile for Next.js Production Build
|
|
2
|
-
# Optimized for Next.js 15 with App Router
|
|
3
|
-
|
|
4
|
-
FROM node:20-alpine AS base
|
|
5
|
-
|
|
6
|
-
# Install dependencies only when needed
|
|
7
|
-
FROM base AS deps
|
|
8
|
-
RUN apk add --no-cache libc6-compat
|
|
9
|
-
WORKDIR /app
|
|
10
|
-
|
|
11
|
-
# Copy package files
|
|
12
|
-
COPY package.json package-lock.json* ./
|
|
13
|
-
RUN npm ci
|
|
14
|
-
|
|
15
|
-
# Rebuild the source code only when needed
|
|
16
|
-
FROM base AS builder
|
|
17
|
-
WORKDIR /app
|
|
18
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
19
|
-
COPY . .
|
|
20
|
-
|
|
21
|
-
# Set build-time environment variables
|
|
22
|
-
ENV NEXT_TELEMETRY_DISABLED 1
|
|
23
|
-
|
|
24
|
-
# Build Next.js application
|
|
25
|
-
RUN npm run build
|
|
26
|
-
|
|
27
|
-
# Production image, copy all the files and run next
|
|
28
|
-
FROM base AS runner
|
|
29
|
-
WORKDIR /app
|
|
30
|
-
|
|
31
|
-
ENV NODE_ENV production
|
|
32
|
-
ENV NEXT_TELEMETRY_DISABLED 1
|
|
33
|
-
|
|
34
|
-
# Create nextjs user
|
|
35
|
-
RUN addgroup --system --gid 1001 nodejs
|
|
36
|
-
RUN adduser --system --uid 1001 nextjs
|
|
37
|
-
|
|
38
|
-
# Copy built application
|
|
39
|
-
COPY --from=builder /app/public ./public
|
|
40
|
-
|
|
41
|
-
# Set the correct permission for prerender cache
|
|
42
|
-
RUN mkdir .next
|
|
43
|
-
RUN chown nextjs:nodejs .next
|
|
44
|
-
|
|
45
|
-
# Automatically leverage output traces to reduce image size
|
|
46
|
-
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
47
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
48
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
49
|
-
|
|
50
|
-
USER nextjs
|
|
51
|
-
|
|
52
|
-
EXPOSE 3000
|
|
53
|
-
|
|
54
|
-
ENV PORT 3000
|
|
55
|
-
ENV HOSTNAME "0.0.0.0"
|
|
56
|
-
|
|
57
|
-
# Run Next.js server
|
|
58
|
-
CMD ["node", "server.js"]
|
|
1
|
+
# Multi-stage Dockerfile for Next.js Production Build
|
|
2
|
+
# Optimized for Next.js 15 with App Router
|
|
3
|
+
|
|
4
|
+
FROM node:20-alpine AS base
|
|
5
|
+
|
|
6
|
+
# Install dependencies only when needed
|
|
7
|
+
FROM base AS deps
|
|
8
|
+
RUN apk add --no-cache libc6-compat
|
|
9
|
+
WORKDIR /app
|
|
10
|
+
|
|
11
|
+
# Copy package files
|
|
12
|
+
COPY package.json package-lock.json* ./
|
|
13
|
+
RUN npm ci
|
|
14
|
+
|
|
15
|
+
# Rebuild the source code only when needed
|
|
16
|
+
FROM base AS builder
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
19
|
+
COPY . .
|
|
20
|
+
|
|
21
|
+
# Set build-time environment variables
|
|
22
|
+
ENV NEXT_TELEMETRY_DISABLED 1
|
|
23
|
+
|
|
24
|
+
# Build Next.js application
|
|
25
|
+
RUN npm run build
|
|
26
|
+
|
|
27
|
+
# Production image, copy all the files and run next
|
|
28
|
+
FROM base AS runner
|
|
29
|
+
WORKDIR /app
|
|
30
|
+
|
|
31
|
+
ENV NODE_ENV production
|
|
32
|
+
ENV NEXT_TELEMETRY_DISABLED 1
|
|
33
|
+
|
|
34
|
+
# Create nextjs user
|
|
35
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
36
|
+
RUN adduser --system --uid 1001 nextjs
|
|
37
|
+
|
|
38
|
+
# Copy built application
|
|
39
|
+
COPY --from=builder /app/public ./public
|
|
40
|
+
|
|
41
|
+
# Set the correct permission for prerender cache
|
|
42
|
+
RUN mkdir .next
|
|
43
|
+
RUN chown nextjs:nodejs .next
|
|
44
|
+
|
|
45
|
+
# Automatically leverage output traces to reduce image size
|
|
46
|
+
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
47
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
48
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
49
|
+
|
|
50
|
+
USER nextjs
|
|
51
|
+
|
|
52
|
+
EXPOSE 3000
|
|
53
|
+
|
|
54
|
+
ENV PORT 3000
|
|
55
|
+
ENV HOSTNAME "0.0.0.0"
|
|
56
|
+
|
|
57
|
+
# Run Next.js server
|
|
58
|
+
CMD ["node", "server.js"]
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
# ============================================================
|
|
2
|
-
# Dockerfile: .NET 10 API ({{titleCase FEATURE_NAME}})
|
|
3
|
-
# Stack: Next.js + Neon + .NET API
|
|
4
|
-
# Generated by MORPH Framework
|
|
5
|
-
# ============================================================
|
|
6
|
-
|
|
7
|
-
# Stage 1: Build
|
|
8
|
-
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
9
|
-
WORKDIR /src
|
|
10
|
-
|
|
11
|
-
# Copy project file and restore dependencies
|
|
12
|
-
COPY *.csproj .
|
|
13
|
-
RUN dotnet restore
|
|
14
|
-
|
|
15
|
-
# Copy source code and publish
|
|
16
|
-
COPY . .
|
|
17
|
-
RUN dotnet publish -c Release -o /app/publish --no-restore
|
|
18
|
-
|
|
19
|
-
# Stage 2: Runtime
|
|
20
|
-
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
21
|
-
WORKDIR /app
|
|
22
|
-
|
|
23
|
-
# Copy published output
|
|
24
|
-
COPY --from=build /app/publish .
|
|
25
|
-
|
|
26
|
-
# Configuration
|
|
27
|
-
ENV ASPNETCORE_URLS=http://+:8080
|
|
28
|
-
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
29
|
-
|
|
30
|
-
# Expose port
|
|
31
|
-
EXPOSE 8080
|
|
32
|
-
|
|
33
|
-
# Health check
|
|
34
|
-
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
35
|
-
CMD curl -f http://localhost:8080/health || exit 1
|
|
36
|
-
|
|
37
|
-
# Entrypoint
|
|
38
|
-
ENTRYPOINT ["dotnet", "Api.dll"]
|
|
1
|
+
# ============================================================
|
|
2
|
+
# Dockerfile: .NET 10 API ({{titleCase FEATURE_NAME}})
|
|
3
|
+
# Stack: Next.js + Neon + .NET API
|
|
4
|
+
# Generated by MORPH Framework
|
|
5
|
+
# ============================================================
|
|
6
|
+
|
|
7
|
+
# Stage 1: Build
|
|
8
|
+
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
9
|
+
WORKDIR /src
|
|
10
|
+
|
|
11
|
+
# Copy project file and restore dependencies
|
|
12
|
+
COPY *.csproj .
|
|
13
|
+
RUN dotnet restore
|
|
14
|
+
|
|
15
|
+
# Copy source code and publish
|
|
16
|
+
COPY . .
|
|
17
|
+
RUN dotnet publish -c Release -o /app/publish --no-restore
|
|
18
|
+
|
|
19
|
+
# Stage 2: Runtime
|
|
20
|
+
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
|
|
23
|
+
# Copy published output
|
|
24
|
+
COPY --from=build /app/publish .
|
|
25
|
+
|
|
26
|
+
# Configuration
|
|
27
|
+
ENV ASPNETCORE_URLS=http://+:8080
|
|
28
|
+
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
29
|
+
|
|
30
|
+
# Expose port
|
|
31
|
+
EXPOSE 8080
|
|
32
|
+
|
|
33
|
+
# Health check
|
|
34
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
35
|
+
CMD curl -f http://localhost:8080/health || exit 1
|
|
36
|
+
|
|
37
|
+
# Entrypoint
|
|
38
|
+
ENTRYPOINT ["dotnet", "Api.dll"]
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
# ============================================================
|
|
2
|
-
# Dockerfile: Next.js Frontend ({{titleCase FEATURE_NAME}})
|
|
3
|
-
# Stack: Next.js + Neon
|
|
4
|
-
# Generated by MORPH Framework
|
|
5
|
-
# Requires: output: "standalone" in next.config.ts
|
|
6
|
-
# ============================================================
|
|
7
|
-
|
|
8
|
-
# Stage 1: Install dependencies
|
|
9
|
-
FROM node:22-alpine AS deps
|
|
10
|
-
WORKDIR /app
|
|
11
|
-
COPY package.json package-lock.json ./
|
|
12
|
-
RUN npm ci --omit=dev
|
|
13
|
-
|
|
14
|
-
# Stage 2: Build application
|
|
15
|
-
FROM node:22-alpine AS builder
|
|
16
|
-
WORKDIR /app
|
|
17
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
18
|
-
COPY . .
|
|
19
|
-
ENV NEXT_TELEMETRY_DISABLED=1
|
|
20
|
-
RUN npm run build
|
|
21
|
-
|
|
22
|
-
# Stage 3: Production runtime
|
|
23
|
-
FROM node:22-alpine AS runner
|
|
24
|
-
WORKDIR /app
|
|
25
|
-
|
|
26
|
-
ENV NODE_ENV=production
|
|
27
|
-
ENV NEXT_TELEMETRY_DISABLED=1
|
|
28
|
-
|
|
29
|
-
# Create non-root user
|
|
30
|
-
RUN addgroup --system --gid 1001 nodejs && \
|
|
31
|
-
adduser --system --uid 1001 nextjs
|
|
32
|
-
|
|
33
|
-
# Copy build output
|
|
34
|
-
COPY --from=builder /app/public ./public
|
|
35
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
36
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
37
|
-
|
|
38
|
-
# Switch to non-root user
|
|
39
|
-
USER nextjs
|
|
40
|
-
|
|
41
|
-
# Expose port
|
|
42
|
-
EXPOSE 3000
|
|
43
|
-
|
|
44
|
-
ENV PORT=3000
|
|
45
|
-
ENV HOSTNAME="0.0.0.0"
|
|
46
|
-
|
|
47
|
-
# Start server
|
|
48
|
-
CMD ["node", "server.js"]
|
|
1
|
+
# ============================================================
|
|
2
|
+
# Dockerfile: Next.js Frontend ({{titleCase FEATURE_NAME}})
|
|
3
|
+
# Stack: Next.js + Neon
|
|
4
|
+
# Generated by MORPH Framework
|
|
5
|
+
# Requires: output: "standalone" in next.config.ts
|
|
6
|
+
# ============================================================
|
|
7
|
+
|
|
8
|
+
# Stage 1: Install dependencies
|
|
9
|
+
FROM node:22-alpine AS deps
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY package.json package-lock.json ./
|
|
12
|
+
RUN npm ci --omit=dev
|
|
13
|
+
|
|
14
|
+
# Stage 2: Build application
|
|
15
|
+
FROM node:22-alpine AS builder
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
18
|
+
COPY . .
|
|
19
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
20
|
+
RUN npm run build
|
|
21
|
+
|
|
22
|
+
# Stage 3: Production runtime
|
|
23
|
+
FROM node:22-alpine AS runner
|
|
24
|
+
WORKDIR /app
|
|
25
|
+
|
|
26
|
+
ENV NODE_ENV=production
|
|
27
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
28
|
+
|
|
29
|
+
# Create non-root user
|
|
30
|
+
RUN addgroup --system --gid 1001 nodejs && \
|
|
31
|
+
adduser --system --uid 1001 nextjs
|
|
32
|
+
|
|
33
|
+
# Copy build output
|
|
34
|
+
COPY --from=builder /app/public ./public
|
|
35
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
36
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
37
|
+
|
|
38
|
+
# Switch to non-root user
|
|
39
|
+
USER nextjs
|
|
40
|
+
|
|
41
|
+
# Expose port
|
|
42
|
+
EXPOSE 3000
|
|
43
|
+
|
|
44
|
+
ENV PORT=3000
|
|
45
|
+
ENV HOSTNAME="0.0.0.0"
|
|
46
|
+
|
|
47
|
+
# Start server
|
|
48
|
+
CMD ["node", "server.js"]
|