@opengroundplan/core 0.1.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/LICENSE +21 -0
- package/README.md +26 -0
- package/adapters/README.md +155 -0
- package/adapters/_shared/README.md +16 -0
- package/adapters/aider/adapter.yaml +30 -0
- package/adapters/aider/templates/.aider.conf.yml.tmpl +5 -0
- package/adapters/amp/adapter.yaml +32 -0
- package/adapters/amp/templates/SKILL.md.tmpl +8 -0
- package/adapters/antigravity-cli/adapter.yaml +36 -0
- package/adapters/antigravity-cli/templates/ANTIGRAVITY.md.tmpl +11 -0
- package/adapters/claude-code/adapter.yaml +65 -0
- package/adapters/claude-code/templates/CLAUDE.md.tmpl +24 -0
- package/adapters/claude-code/templates/SKILL.md.tmpl +8 -0
- package/adapters/claude-code/templates/agent.md.tmpl +9 -0
- package/adapters/claude-code/templates/command.md.tmpl +6 -0
- package/adapters/claude-code/templates/rule.md.tmpl +8 -0
- package/adapters/claude-code/templates/settings.json.tmpl +11 -0
- package/adapters/cline/adapter.yaml +31 -0
- package/adapters/cline/templates/rule.md.tmpl +8 -0
- package/adapters/codex/adapter.yaml +29 -0
- package/adapters/continue/adapter.yaml +36 -0
- package/adapters/continue/templates/00-agents-md.md.tmpl +9 -0
- package/adapters/continue/templates/rule.md.tmpl +8 -0
- package/adapters/cursor/adapter.yaml +34 -0
- package/adapters/cursor/templates/rule.mdc.tmpl +9 -0
- package/adapters/gemini-cli/adapter.yaml +51 -0
- package/adapters/gemini-cli/templates/GEMINI.md.tmpl +9 -0
- package/adapters/gemini-cli/templates/command.toml.tmpl +4 -0
- package/adapters/github-copilot/adapter.yaml +44 -0
- package/adapters/github-copilot/templates/instructions.md.tmpl +8 -0
- package/adapters/github-copilot/templates/prompt.prompt.md.tmpl +6 -0
- package/adapters/opencode/adapter.yaml +18 -0
- package/adapters/opencode/templates/opencode.json.tmpl +4 -0
- package/adapters/roo-code/adapter.yaml +21 -0
- package/adapters/roo-code/templates/rule.md.tmpl +5 -0
- package/adapters/windsurf/adapter.yaml +34 -0
- package/adapters/windsurf/templates/agents-md.md.tmpl +12 -0
- package/adapters/windsurf/templates/rule.md.tmpl +9 -0
- package/adapters/windsurf/templates/workflow.md.tmpl +7 -0
- package/adapters/zed/adapter.yaml +14 -0
- package/catalog/README.md +62 -0
- package/catalog/architectures/agentic-tool-loop.yaml +62 -0
- package/catalog/architectures/bff.yaml +58 -0
- package/catalog/architectures/clean.yaml +61 -0
- package/catalog/architectures/cqrs.yaml +58 -0
- package/catalog/architectures/ddd-tactical.yaml +68 -0
- package/catalog/architectures/event-driven.yaml +59 -0
- package/catalog/architectures/feature-sliced-design.yaml +61 -0
- package/catalog/architectures/hexagonal.yaml +60 -0
- package/catalog/architectures/lakehouse.yaml +63 -0
- package/catalog/architectures/layered.yaml +60 -0
- package/catalog/architectures/llm-workflow.yaml +59 -0
- package/catalog/architectures/medallion.yaml +60 -0
- package/catalog/architectures/micro-frontends.yaml +60 -0
- package/catalog/architectures/microservices.yaml +62 -0
- package/catalog/architectures/modular-monolith.yaml +62 -0
- package/catalog/architectures/monolith.yaml +61 -0
- package/catalog/architectures/multi-agent.yaml +61 -0
- package/catalog/architectures/mvc-mvvm.yaml +62 -0
- package/catalog/architectures/nextjs-colocation.yaml +67 -0
- package/catalog/architectures/onion.yaml +60 -0
- package/catalog/architectures/pipes-and-filters.yaml +59 -0
- package/catalog/architectures/rag-hybrid.yaml +62 -0
- package/catalog/architectures/serverless.yaml +58 -0
- package/catalog/architectures/vertical-slice.yaml +61 -0
- package/catalog/characteristics.yaml +165 -0
- package/catalog/decision.yaml +309 -0
- package/catalog/sources/README.md +697 -0
- package/catalog/sources/agent-tooling.yaml +1180 -0
- package/catalog/sources/ai-llm.yaml +508 -0
- package/catalog/sources/auth.yaml +618 -0
- package/catalog/sources/backend-api.yaml +720 -0
- package/catalog/sources/cms-ecommerce.yaml +558 -0
- package/catalog/sources/data-engineering.yaml +618 -0
- package/catalog/sources/database-orm.yaml +507 -0
- package/catalog/sources/devops-cicd.yaml +422 -0
- package/catalog/sources/frontend-ui.yaml +654 -0
- package/catalog/sources/fullstack-saas.yaml +629 -0
- package/catalog/sources/game-3d.yaml +834 -0
- package/catalog/sources/gaps.md +268 -0
- package/catalog/sources/layer-plan.yaml +3919 -0
- package/catalog/sources/mobile-desktop.yaml +638 -0
- package/catalog/sources/observability.yaml +1364 -0
- package/catalog/sources/payments-billing.yaml +553 -0
- package/catalog/sources/realtime-messaging.yaml +787 -0
- package/catalog/sources/security-compliance.yaml +613 -0
- package/catalog/sources/testing.yaml +652 -0
- package/dist/adapters.d.ts +43 -0
- package/dist/adapters.js +181 -0
- package/dist/adapters.js.map +1 -0
- package/dist/agentkit.d.ts +65 -0
- package/dist/agentkit.js +183 -0
- package/dist/agentkit.js.map +1 -0
- package/dist/apply.d.ts +21 -0
- package/dist/apply.js +135 -0
- package/dist/apply.js.map +1 -0
- package/dist/condition.d.ts +14 -0
- package/dist/condition.js +121 -0
- package/dist/condition.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +131 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/intent.d.ts +52 -0
- package/dist/intent.js +220 -0
- package/dist/intent.js.map +1 -0
- package/dist/license.d.ts +11 -0
- package/dist/license.js +68 -0
- package/dist/license.js.map +1 -0
- package/dist/loader.d.ts +12 -0
- package/dist/loader.js +118 -0
- package/dist/loader.js.map +1 -0
- package/dist/merge.d.ts +28 -0
- package/dist/merge.js +412 -0
- package/dist/merge.js.map +1 -0
- package/dist/plan.d.ts +12 -0
- package/dist/plan.js +206 -0
- package/dist/plan.js.map +1 -0
- package/dist/python-data.json +575 -0
- package/dist/python-requirements.d.ts +7 -0
- package/dist/python-requirements.js +79 -0
- package/dist/python-requirements.js.map +1 -0
- package/dist/recommend.d.ts +27 -0
- package/dist/recommend.js +68 -0
- package/dist/recommend.js.map +1 -0
- package/dist/resolve.d.ts +22 -0
- package/dist/resolve.js +132 -0
- package/dist/resolve.js.map +1 -0
- package/dist/schema.d.ts +878 -0
- package/dist/schema.js +307 -0
- package/dist/schema.js.map +1 -0
- package/dist/tokens.d.ts +42 -0
- package/dist/tokens.js +90 -0
- package/dist/tokens.js.map +1 -0
- package/package.json +61 -0
- package/registry/README.md +194 -0
- package/registry/agents/architecture-reviewer/agent.md +59 -0
- package/registry/agents/architecture-reviewer/agent.yaml +7 -0
- package/registry/agents/breaking-change-detector/agent.md +83 -0
- package/registry/agents/breaking-change-detector/agent.yaml +7 -0
- package/registry/agents/security-reviewer/agent.md +63 -0
- package/registry/agents/security-reviewer/agent.yaml +7 -0
- package/registry/agents/solid-reviewer/agent.md +61 -0
- package/registry/agents/solid-reviewer/agent.yaml +7 -0
- package/registry/agents/spec-consistency-checker/agent.md +70 -0
- package/registry/agents/spec-consistency-checker/agent.yaml +7 -0
- package/registry/agents/test-coverage-reviewer/agent.md +67 -0
- package/registry/agents/test-coverage-reviewer/agent.yaml +7 -0
- package/registry/commands/adr/command.md +80 -0
- package/registry/commands/adr/command.yaml +7 -0
- package/registry/commands/breaking/command.md +72 -0
- package/registry/commands/breaking/command.yaml +7 -0
- package/registry/commands/done/command.md +50 -0
- package/registry/commands/done/command.yaml +7 -0
- package/registry/commands/handoff/command.md +65 -0
- package/registry/commands/handoff/command.yaml +7 -0
- package/registry/commands/plan/command.md +81 -0
- package/registry/commands/plan/command.yaml +7 -0
- package/registry/commands/review/command.md +54 -0
- package/registry/commands/review/command.yaml +8 -0
- package/registry/commands/scope/command.md +45 -0
- package/registry/commands/scope/command.yaml +7 -0
- package/registry/commands/spec/command.md +81 -0
- package/registry/commands/spec/command.yaml +7 -0
- package/registry/commands/tasks/command.md +70 -0
- package/registry/commands/tasks/command.yaml +7 -0
- package/registry/commands/verify/command.md +43 -0
- package/registry/commands/verify/command.yaml +7 -0
- package/registry/hooks/_lib/config.ps1 +116 -0
- package/registry/hooks/_lib/config.sh +143 -0
- package/registry/hooks/_lib/defaults.json +76 -0
- package/registry/hooks/_lib/json_get.mjs +59 -0
- package/registry/hooks/_lib/json_get.py +60 -0
- package/registry/hooks/architecture-boundary-check/hook.ps1 +46 -0
- package/registry/hooks/architecture-boundary-check/hook.sh +49 -0
- package/registry/hooks/architecture-boundary-check/hook.yaml +18 -0
- package/registry/hooks/conventional-commit-check/hook.ps1 +68 -0
- package/registry/hooks/conventional-commit-check/hook.sh +68 -0
- package/registry/hooks/conventional-commit-check/hook.yaml +16 -0
- package/registry/hooks/format-on-write/hook.ps1 +36 -0
- package/registry/hooks/format-on-write/hook.sh +33 -0
- package/registry/hooks/format-on-write/hook.yaml +14 -0
- package/registry/hooks/guard-protected-paths/hook.ps1 +34 -0
- package/registry/hooks/guard-protected-paths/hook.sh +35 -0
- package/registry/hooks/guard-protected-paths/hook.yaml +14 -0
- package/registry/hooks/no-secrets/hook.ps1 +67 -0
- package/registry/hooks/no-secrets/hook.sh +56 -0
- package/registry/hooks/no-secrets/hook.yaml +16 -0
- package/registry/skills/adr-write/SKILL.md +127 -0
- package/registry/skills/adr-write/references/adr-template.md +143 -0
- package/registry/skills/adr-write/references/when-to-write-an-adr.md +74 -0
- package/registry/skills/adr-write/skill.yaml +7 -0
- package/registry/skills/architecture-guard/SKILL.md +150 -0
- package/registry/skills/architecture-guard/references/boundary-patterns.md +142 -0
- package/registry/skills/architecture-guard/references/violation-catalog.md +149 -0
- package/registry/skills/architecture-guard/skill.yaml +7 -0
- package/registry/skills/handoff/SKILL.md +125 -0
- package/registry/skills/handoff/references/agent-protocol.md +128 -0
- package/registry/skills/handoff/references/handoff-template.md +116 -0
- package/registry/skills/handoff/skill.yaml +7 -0
- package/registry/skills/onboard/SKILL.md +120 -0
- package/registry/skills/onboard/references/discovery-checklist.md +129 -0
- package/registry/skills/onboard/references/repo-map-template.md +120 -0
- package/registry/skills/onboard/skill.yaml +7 -0
- package/registry/skills/perf-budget/SKILL.md +152 -0
- package/registry/skills/perf-budget/references/budget-catalog.md +165 -0
- package/registry/skills/perf-budget/references/measurement-sources.md +163 -0
- package/registry/skills/perf-budget/skill.yaml +7 -0
- package/registry/skills/security-review/SKILL.md +145 -0
- package/registry/skills/security-review/references/owasp-checklist.md +190 -0
- package/registry/skills/security-review/references/secret-patterns.md +110 -0
- package/registry/skills/security-review/skill.yaml +7 -0
- package/registry/skills/spec-driven/SKILL.md +124 -0
- package/registry/skills/spec-driven/references/phase-gates.md +115 -0
- package/registry/skills/spec-driven/references/plan-template.md +98 -0
- package/registry/skills/spec-driven/references/spec-template.md +101 -0
- package/registry/skills/spec-driven/references/tasks-template.md +96 -0
- package/registry/skills/spec-driven/skill.yaml +7 -0
- package/registry/skills/test-first/SKILL.md +125 -0
- package/registry/skills/test-first/references/anti-patterns.md +178 -0
- package/registry/skills/test-first/references/test-design.md +156 -0
- package/registry/skills/test-first/skill.yaml +7 -0
- package/templates/README.md +104 -0
- package/templates/agent-kits/core/blueprint.yaml +39 -0
- package/templates/agent-kits/core/files/.agent/ACTIVE.md +25 -0
- package/templates/agent-kits/core/files/.agent/DECISIONS.md +27 -0
- package/templates/agent-kits/core/files/.agent/DELEGATION.md +30 -0
- package/templates/agent-kits/core/files/.agent/DONE.md +9 -0
- package/templates/agent-kits/core/files/.agent/HANDOFF.md +38 -0
- package/templates/agent-kits/core/files/.agent/delegate.mjs +352 -0
- package/templates/agent-kits/core/files/.agent/delegation-tools.json +1 -0
- package/templates/agent-kits/core/files/.agent/delegation.yaml +33 -0
- package/templates/agent-kits/core/files/AGENTS.md +107 -0
- package/templates/agent-kits/core/files/docs/ARCHITECTURE.md +26 -0
- package/templates/agent-kits/core/files/docs/adr/0001-record-architecture-decisions.md +27 -0
- package/templates/agent-kits/core/files/specs/000-template/plan.md +48 -0
- package/templates/agent-kits/core/files/specs/000-template/spec.md +45 -0
- package/templates/agent-kits/core/files/specs/000-template/tasks.md +21 -0
- package/templates/agent-kits/core/files/specs/README.md +32 -0
- package/templates/architectures/agentic-tool-loop/blueprint.yaml +137 -0
- package/templates/architectures/agentic-tool-loop/files/.importlinter +47 -0
- package/templates/architectures/agentic-tool-loop/files/docs/architecture/agentic-tool-loop.node.md +83 -0
- package/templates/architectures/agentic-tool-loop/files/docs/architecture/agentic-tool-loop.python.md +93 -0
- package/templates/architectures/agentic-tool-loop/files/package.json +6 -0
- package/templates/architectures/agentic-tool-loop/files/pyproject.toml +5 -0
- package/templates/architectures/agentic-tool-loop/files/scripts/check-agent-loop.mjs +227 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/__init__.py +20 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/loop.py +112 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/model.py +50 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/sandbox.py +62 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/settings.py +69 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/__init__.py +6 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/current_time.py +27 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/registry.py +44 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/spec.py +29 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/write_note.py +36 -0
- package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/trace.py +33 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/config.ts +65 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/index.ts +8 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/loop.ts +117 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/model.ts +35 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/sandbox.ts +52 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/tools/current-time.ts +13 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/tools/registry.ts +49 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/tools/types.ts +26 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/tools/write-note.ts +23 -0
- package/templates/architectures/agentic-tool-loop/files/src/agent/trace.ts +26 -0
- package/templates/architectures/agentic-tool-loop/files/tests/architecture/test_agent_loop.py +167 -0
- package/templates/architectures/bff/blueprint.yaml +83 -0
- package/templates/architectures/bff/files/docs/architecture/bff.node.md +115 -0
- package/templates/architectures/bff/files/docs/architecture/bff.typescript.md +113 -0
- package/templates/architectures/bff/files/scripts/check-bff-boundaries.mjs +223 -0
- package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/aggregate.ts +38 -0
- package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/config.ts +30 -0
- package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/dto.ts +21 -0
- package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/index.ts +6 -0
- package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/routes.ts +21 -0
- package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/aggregate.ts +23 -0
- package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/config.ts +26 -0
- package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/dto.ts +16 -0
- package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/index.ts +6 -0
- package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/routes.ts +21 -0
- package/templates/architectures/bff/files/src/downstream/config.ts +35 -0
- package/templates/architectures/bff/files/src/downstream/http-client.ts +41 -0
- package/templates/architectures/bff/files/src/downstream/index.ts +9 -0
- package/templates/architectures/bff/files/src/downstream/orders-client.ts +23 -0
- package/templates/architectures/bff/files/src/downstream/profile-client.ts +18 -0
- package/templates/architectures/clean/blueprint.yaml +147 -0
- package/templates/architectures/clean/files/.importlinter +35 -0
- package/templates/architectures/clean/files/Directory.Packages.props +7 -0
- package/templates/architectures/clean/files/__solutionName.dot__.slnx +10 -0
- package/templates/architectures/clean/files/docs/architecture/clean.md +87 -0
- package/templates/architectures/clean/files/eslint.config.architecture.mjs +27 -0
- package/templates/architectures/clean/files/internal/application/doc.go +2 -0
- package/templates/architectures/clean/files/internal/application/ports/doc.go +2 -0
- package/templates/architectures/clean/files/internal/architecture/architecture_test.go +166 -0
- package/templates/architectures/clean/files/internal/architecture/doc.go +3 -0
- package/templates/architectures/clean/files/internal/domain/doc.go +2 -0
- package/templates/architectures/clean/files/internal/infrastructure/doc.go +2 -0
- package/templates/architectures/clean/files/pyproject.toml +2 -0
- package/templates/architectures/clean/files/scripts/check-architecture.mjs +68 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Application/Abstractions/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Application/AssemblyMarker.cs +10 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Application/UseCases/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Application/__solutionName.dot__.Application.csproj +14 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/AssemblyMarker.cs +10 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/Entities/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/Events/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/ValueObjects/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/__solutionName.dot__.Domain.csproj +11 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/AssemblyMarker.cs +10 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/External/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/Persistence/.gitkeep +1 -0
- package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/__solutionName.dot__.Infrastructure.csproj +14 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/application/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/application/ports/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/application/use_cases/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/domain/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/domain/entities/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/domain/events/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/infrastructure/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/infrastructure/external/__init__.py +1 -0
- package/templates/architectures/clean/files/src/__solutionName.snake__/infrastructure/persistence/__init__.py +1 -0
- package/templates/architectures/clean/files/src/application/ports/README.md +1 -0
- package/templates/architectures/clean/files/src/application/use-cases/README.md +1 -0
- package/templates/architectures/clean/files/src/domain/README.md +1 -0
- package/templates/architectures/clean/files/src/infrastructure/README.md +1 -0
- package/templates/architectures/clean/files/tests/__solutionName.dot__.ArchitectureTests/DependencyRuleTests.cs +118 -0
- package/templates/architectures/clean/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +27 -0
- package/templates/architectures/cqrs/blueprint.yaml +134 -0
- package/templates/architectures/cqrs/files/.importlinter +26 -0
- package/templates/architectures/cqrs/files/Directory.Packages.props +7 -0
- package/templates/architectures/cqrs/files/__solutionName.dot__.slnx +11 -0
- package/templates/architectures/cqrs/files/docs/architecture/cqrs.dotnet.md +116 -0
- package/templates/architectures/cqrs/files/docs/architecture/cqrs.node.md +117 -0
- package/templates/architectures/cqrs/files/docs/architecture/cqrs.python.md +107 -0
- package/templates/architectures/cqrs/files/eslint.config.cqrs.mjs +29 -0
- package/templates/architectures/cqrs/files/pyproject.toml +2 -0
- package/templates/architectures/cqrs/files/scripts/check-cqrs-boundaries.mjs +132 -0
- package/templates/architectures/cqrs/files/src/__contextName.kebab__/commands/index.ts +15 -0
- package/templates/architectures/cqrs/files/src/__contextName.kebab__/domain/index.ts +10 -0
- package/templates/architectures/cqrs/files/src/__contextName.kebab__/queries/index.ts +13 -0
- package/templates/architectures/cqrs/files/src/__contextName.kebab__/read-models/index.ts +7 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/AssemblyMarker.cs +9 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/ICommandHandler.cs +12 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/IQueryHandler.cs +10 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/__solutionName.dot__.Abstractions.csproj +11 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Commands/AssemblyMarker.cs +9 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Commands/Handlers/.gitkeep +2 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Commands/__solutionName.dot__.__contextName.pascal__.Commands.csproj +15 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Domain/Aggregates/.gitkeep +2 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Domain/AssemblyMarker.cs +9 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Domain/__solutionName.dot__.__contextName.pascal__.Domain.csproj +11 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/AssemblyMarker.cs +9 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/Handlers/.gitkeep +2 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/ReadModels/.gitkeep +2 -0
- package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/__solutionName.dot__.__contextName.pascal__.Queries.csproj +14 -0
- package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/__init__.py +6 -0
- package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/commands/__init__.py +15 -0
- package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/domain/__init__.py +9 -0
- package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/queries/__init__.py +14 -0
- package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/read_models/__init__.py +14 -0
- package/templates/architectures/cqrs/files/tests/ArchitectureTests/ArchitectureTests.csproj +33 -0
- package/templates/architectures/cqrs/files/tests/ArchitectureTests/CqrsBoundaryTests.cs +104 -0
- package/templates/architectures/event-driven/blueprint.yaml +163 -0
- package/templates/architectures/event-driven/files/.importlinter +43 -0
- package/templates/architectures/event-driven/files/Directory.Packages.props +11 -0
- package/templates/architectures/event-driven/files/__solutionName.dot__.slnx +11 -0
- package/templates/architectures/event-driven/files/docs/architecture/event-driven.dotnet.md +117 -0
- package/templates/architectures/event-driven/files/docs/architecture/event-driven.node.md +98 -0
- package/templates/architectures/event-driven/files/docs/architecture/event-driven.python.md +100 -0
- package/templates/architectures/event-driven/files/scripts/check-event-boundaries.mjs +181 -0
- package/templates/architectures/event-driven/files/src/EventCatalog/EventCatalog.csproj +11 -0
- package/templates/architectures/event-driven/files/src/EventCatalog/EventContract.cs +36 -0
- package/templates/architectures/event-driven/files/src/EventCatalog/EventEnvelope.cs +10 -0
- package/templates/architectures/event-driven/files/src/EventCatalog/EventRegistry.cs +16 -0
- package/templates/architectures/event-driven/files/src/EventCatalog/EventSchemaException.cs +19 -0
- package/templates/architectures/event-driven/files/src/EventCatalog/__eventDomain.pascal__/__firstEvent.pascal__V1.cs +20 -0
- package/templates/architectures/event-driven/files/src/EventHandlers/EventHandlers.csproj +14 -0
- package/templates/architectures/event-driven/files/src/EventHandlers/__firstHandler.pascal__/__firstHandler.pascal__Handler.cs +32 -0
- package/templates/architectures/event-driven/files/src/EventHandlers/__secondHandler.pascal__/__secondHandler.pascal__Handler.cs +30 -0
- package/templates/architectures/event-driven/files/src/EventPublishers/EventPublishers.csproj +14 -0
- package/templates/architectures/event-driven/files/src/EventPublishers/__eventDomain.pascal__/__eventDomain.pascal__Publisher.cs +27 -0
- package/templates/architectures/event-driven/files/src/Messaging/Adapters/InMemoryEventBroker.cs +107 -0
- package/templates/architectures/event-driven/files/src/Messaging/BrokerOptions.cs +19 -0
- package/templates/architectures/event-driven/files/src/Messaging/IEventBroker.cs +6 -0
- package/templates/architectures/event-driven/files/src/Messaging/IEventPublisher.cs +9 -0
- package/templates/architectures/event-driven/files/src/Messaging/IEventSubscriber.cs +11 -0
- package/templates/architectures/event-driven/files/src/Messaging/Messaging.csproj +18 -0
- package/templates/architectures/event-driven/files/src/Messaging/MessagingRegistration.cs +36 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/__init__.py +17 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/adapters/__init__.py +1 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/adapters/in_memory.py +61 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/config.py +42 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/factory.py +13 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/port.py +25 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/eventing.py +26 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__eventDomain.snake__/__firstEvent.snake__/__init__.py +5 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__eventDomain.snake__/__firstEvent.snake__/v1.py +34 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__eventDomain.snake__/__init__.py +1 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__init__.py +27 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/contract.py +35 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/envelope.py +24 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/handlers/__firstHandler.snake__/__init__.py +30 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/handlers/__init__.py +1 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/handlers/__secondHandler.snake__/__init__.py +25 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/publishers/__eventDomain.snake__.py +17 -0
- package/templates/architectures/event-driven/files/src/__solutionName.snake__/publishers/__init__.py +5 -0
- package/templates/architectures/event-driven/files/src/bootstrap/events.ts +24 -0
- package/templates/architectures/event-driven/files/src/broker/adapters/in-memory-broker.ts +63 -0
- package/templates/architectures/event-driven/files/src/broker/config.ts +39 -0
- package/templates/architectures/event-driven/files/src/broker/factory.ts +13 -0
- package/templates/architectures/event-driven/files/src/broker/index.ts +6 -0
- package/templates/architectures/event-driven/files/src/broker/port.ts +15 -0
- package/templates/architectures/event-driven/files/src/events/__eventDomain.kebab__/__firstEvent.kebab__/v1.ts +20 -0
- package/templates/architectures/event-driven/files/src/events/contract.ts +36 -0
- package/templates/architectures/event-driven/files/src/events/envelope.ts +20 -0
- package/templates/architectures/event-driven/files/src/events/index.ts +17 -0
- package/templates/architectures/event-driven/files/src/handlers/__firstHandler.kebab__/index.ts +21 -0
- package/templates/architectures/event-driven/files/src/handlers/__secondHandler.kebab__/index.ts +17 -0
- package/templates/architectures/event-driven/files/src/publishers/__eventDomain.kebab__.publisher.ts +20 -0
- package/templates/architectures/event-driven/files/tests/EventArchitectureTests/EventArchitectureTests.csproj +31 -0
- package/templates/architectures/event-driven/files/tests/EventArchitectureTests/EventBoundaryTests.cs +121 -0
- package/templates/architectures/event-driven/files/tests/architecture/test_event_boundaries.py +161 -0
- package/templates/architectures/feature-sliced-design/blueprint.yaml +121 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/app/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/entities/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/features/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/pages/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/api/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/config/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/lib/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/ui/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/widgets/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/docs/architecture.md +148 -0
- package/templates/architectures/feature-sliced-design/files/package.json +6 -0
- package/templates/architectures/feature-sliced-design/files/scripts/check-fsd-boundaries.mjs +210 -0
- package/templates/architectures/feature-sliced-design/files/src/_app/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/src/_pages/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/src/app/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/src/entities/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/src/features/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/src/pages/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/src/shared/api/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/src/shared/config/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/src/shared/lib/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/src/shared/ui/index.ts +3 -0
- package/templates/architectures/feature-sliced-design/files/src/widgets/.gitkeep +1 -0
- package/templates/architectures/feature-sliced-design/files/steiger.config.js +21 -0
- package/templates/architectures/hexagonal/blueprint.yaml +146 -0
- package/templates/architectures/hexagonal/files/.importlinter +33 -0
- package/templates/architectures/hexagonal/files/Directory.Packages.props +8 -0
- package/templates/architectures/hexagonal/files/__solutionName.dot__.slnx +13 -0
- package/templates/architectures/hexagonal/files/docs/architecture/hexagonal.md +102 -0
- package/templates/architectures/hexagonal/files/internal/adapters/inbound/rest/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/adapters/outbound/memory/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/adapters/outbound/postgres/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/application/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/architecture/architecture_test.go +150 -0
- package/templates/architectures/hexagonal/files/internal/architecture/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/bootstrap/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/domain/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/ports/inbound/doc.go +2 -0
- package/templates/architectures/hexagonal/files/internal/ports/outbound/doc.go +2 -0
- package/templates/architectures/hexagonal/files/pyproject.toml +2 -0
- package/templates/architectures/hexagonal/files/scripts/check-architecture.mjs +104 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Inbound.Http/HttpAdapterMarker.cs +4 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Inbound.Http/__solutionName.dot__.Adapters.Inbound.Http.csproj +15 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.InMemory/InMemoryAdapterMarker.cs +4 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.InMemory/__solutionName.dot__.Adapters.Outbound.InMemory.csproj +15 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.Persistence/PersistenceAdapterMarker.cs +4 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.Persistence/__solutionName.dot__.Adapters.Outbound.Persistence.csproj +15 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/ApplicationMarker.cs +4 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/Ports/Inbound/.gitkeep +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/Ports/Outbound/.gitkeep +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/UseCases/.gitkeep +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/__solutionName.dot__.Application.csproj +15 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Bootstrap/CompositionRoot.cs +8 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Bootstrap/__solutionName.dot__.Bootstrap.csproj +18 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Domain/DomainMarker.cs +4 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Domain/__solutionName.dot__.Domain.csproj +12 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/inbound/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/inbound/http/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/outbound/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/outbound/in_memory/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/outbound/persistence/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/application/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/bootstrap/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/domain/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/ports/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/ports/inbound/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/__solutionName.snake__/ports/outbound/__init__.py +1 -0
- package/templates/architectures/hexagonal/files/src/adapters/inbound/http/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/adapters/outbound/in-memory/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/adapters/outbound/persistence/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/application/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/bootstrap/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/domain/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/ports/inbound/index.ts +2 -0
- package/templates/architectures/hexagonal/files/src/ports/outbound/index.ts +2 -0
- package/templates/architectures/hexagonal/files/tests/ArchitectureTests/ArchitectureTests.csproj +34 -0
- package/templates/architectures/hexagonal/files/tests/ArchitectureTests/HexagonBoundaryTests.cs +135 -0
- package/templates/architectures/lakehouse/blueprint.yaml +103 -0
- package/templates/architectures/lakehouse/files/.importlinter +51 -0
- package/templates/architectures/lakehouse/files/docs/architecture/lakehouse.python.md +134 -0
- package/templates/architectures/lakehouse/files/pyproject.toml +5 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/__init__.py +20 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/catalog/__init__.py +21 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/catalog/_delta.py +155 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/catalog/_iceberg.py +214 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/maintenance/__init__.py +9 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/maintenance/__main__.py +31 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/maintenance/jobs.py +38 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/ports.py +58 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/queries/__init__.py +13 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/queries/reads.py +30 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/schema.py +66 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/settings.py +61 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/tables/__firstTable.snake__.py +22 -0
- package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/tables/__init__.py +28 -0
- package/templates/architectures/lakehouse/files/tests/architecture/test_lakehouse_boundaries.py +155 -0
- package/templates/architectures/layered/blueprint.yaml +159 -0
- package/templates/architectures/layered/files/.importlinter +18 -0
- package/templates/architectures/layered/files/Directory.Build.targets +10 -0
- package/templates/architectures/layered/files/Directory.Packages.props +7 -0
- package/templates/architectures/layered/files/__solutionName.dot__.slnx +9 -0
- package/templates/architectures/layered/files/architecture.layers.json +19 -0
- package/templates/architectures/layered/files/docs/architecture/layered.md +94 -0
- package/templates/architectures/layered/files/internal/architecture/doc.go +3 -0
- package/templates/architectures/layered/files/internal/architecture/layers_test.go +138 -0
- package/templates/architectures/layered/files/internal/business/doc.go +3 -0
- package/templates/architectures/layered/files/internal/data/doc.go +3 -0
- package/templates/architectures/layered/files/internal/presentation/doc.go +4 -0
- package/templates/architectures/layered/files/pyproject.toml +2 -0
- package/templates/architectures/layered/files/scripts/check-layers.mjs +125 -0
- package/templates/architectures/layered/files/src/__solutionName.dot__.Business/AssemblyMarker.cs +7 -0
- package/templates/architectures/layered/files/src/__solutionName.dot__.Business/__solutionName.dot__.Business.csproj +15 -0
- package/templates/architectures/layered/files/src/__solutionName.dot__.Data/AssemblyMarker.cs +7 -0
- package/templates/architectures/layered/files/src/__solutionName.dot__.Data/__solutionName.dot__.Data.csproj +10 -0
- package/templates/architectures/layered/files/src/__solutionName.snake__/business/__init__.py +1 -0
- package/templates/architectures/layered/files/src/__solutionName.snake__/data/__init__.py +1 -0
- package/templates/architectures/layered/files/src/__solutionName.snake__/presentation/__init__.py +1 -0
- package/templates/architectures/layered/files/src/business/README.md +1 -0
- package/templates/architectures/layered/files/src/data/README.md +1 -0
- package/templates/architectures/layered/files/src/presentation/README.md +1 -0
- package/templates/architectures/layered/files/src/shared/README.md +1 -0
- package/templates/architectures/layered/files/tests/__solutionName.dot__.ArchitectureTests/LayerBoundaryTests.cs +151 -0
- package/templates/architectures/layered/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +27 -0
- package/templates/architectures/llm-workflow/blueprint.yaml +129 -0
- package/templates/architectures/llm-workflow/files/.importlinter +34 -0
- package/templates/architectures/llm-workflow/files/__promptsDir__/README.md +26 -0
- package/templates/architectures/llm-workflow/files/__promptsDir__/__firstStep.kebab__/__promptVersion__.md +7 -0
- package/templates/architectures/llm-workflow/files/docs/architecture/llm-workflow.python.md +133 -0
- package/templates/architectures/llm-workflow/files/docs/architecture/llm-workflow.typescript.md +124 -0
- package/templates/architectures/llm-workflow/files/package.json +9 -0
- package/templates/architectures/llm-workflow/files/scripts/check-llm-workflow.mjs +200 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/__init__.py +5 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/chains/__init__.py +5 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/chains/__workflowName.snake__.py +19 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/__init__.py +1 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/assertions.py +82 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/goldens.jsonl +4 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/runner.py +64 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/parallel/__init__.py +5 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/parallel/gather.py +28 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/ports/__init__.py +38 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/ports/llm.py +41 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/ports/stub.py +27 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/prompts.py +22 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/routing/__init__.py +5 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/routing/route.py +47 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/settings.py +60 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/steps/__firstStep.snake__.py +24 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/steps/__init__.py +6 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/steps/normalize.py +11 -0
- package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/types.py +40 -0
- package/templates/architectures/llm-workflow/files/src/workflow/chains/__workflowName.kebab__.ts +14 -0
- package/templates/architectures/llm-workflow/files/src/workflow/evals/assert.ts +59 -0
- package/templates/architectures/llm-workflow/files/src/workflow/evals/goldens.jsonl +4 -0
- package/templates/architectures/llm-workflow/files/src/workflow/evals/run.ts +60 -0
- package/templates/architectures/llm-workflow/files/src/workflow/parallel/gather.ts +25 -0
- package/templates/architectures/llm-workflow/files/src/workflow/ports/index.ts +34 -0
- package/templates/architectures/llm-workflow/files/src/workflow/ports/llm.ts +33 -0
- package/templates/architectures/llm-workflow/files/src/workflow/ports/stub.ts +23 -0
- package/templates/architectures/llm-workflow/files/src/workflow/prompts.ts +27 -0
- package/templates/architectures/llm-workflow/files/src/workflow/routing/route.ts +38 -0
- package/templates/architectures/llm-workflow/files/src/workflow/settings.ts +44 -0
- package/templates/architectures/llm-workflow/files/src/workflow/steps/__firstStep.kebab__.ts +19 -0
- package/templates/architectures/llm-workflow/files/src/workflow/steps/index.ts +3 -0
- package/templates/architectures/llm-workflow/files/src/workflow/steps/normalize.ts +8 -0
- package/templates/architectures/llm-workflow/files/src/workflow/types.ts +29 -0
- package/templates/architectures/llm-workflow/files/tests/test_workflow_boundaries.py +171 -0
- package/templates/architectures/llm-workflow/files/tests/test_workflow_goldens.py +30 -0
- package/templates/architectures/medallion/blueprint.yaml +91 -0
- package/templates/architectures/medallion/files/.importlinter +31 -0
- package/templates/architectures/medallion/files/contracts/bronze.contract.toml +16 -0
- package/templates/architectures/medallion/files/contracts/gold.contract.toml +21 -0
- package/templates/architectures/medallion/files/contracts/silver.contract.toml +31 -0
- package/templates/architectures/medallion/files/docs/architecture/medallion.python.md +104 -0
- package/templates/architectures/medallion/files/pyproject.toml +2 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/__init__.py +5 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/bronze/__init__.py +5 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/bronze/ingest.py +41 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/config.py +48 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/contracts.py +166 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/gold/__init__.py +5 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/gold/aggregate.py +40 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/io.py +28 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/run.py +40 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/silver/__init__.py +6 -0
- package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/silver/conform.py +53 -0
- package/templates/architectures/medallion/files/tests/architecture/test_layer_contracts.py +72 -0
- package/templates/architectures/medallion/files/tests/architecture/test_medallion_boundaries.py +166 -0
- package/templates/architectures/micro-frontends/blueprint.yaml +124 -0
- package/templates/architectures/micro-frontends/files/apps/host/package.json +10 -0
- package/templates/architectures/micro-frontends/files/apps/host/remotes.example.json +9 -0
- package/templates/architectures/micro-frontends/files/apps/host/src/config.ts +34 -0
- package/templates/architectures/micro-frontends/files/apps/host/src/loaders/import-map.ts +34 -0
- package/templates/architectures/micro-frontends/files/apps/host/src/loaders/module-federation.ts +29 -0
- package/templates/architectures/micro-frontends/files/apps/host/src/remote-loader.ts +45 -0
- package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/module-federation.config.mjs +19 -0
- package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/package.json +15 -0
- package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/src/config.ts +28 -0
- package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/src/index.ts +5 -0
- package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/src/mount.ts +32 -0
- package/templates/architectures/micro-frontends/files/docs/architecture/micro-frontends.md +161 -0
- package/templates/architectures/micro-frontends/files/package.json +14 -0
- package/templates/architectures/micro-frontends/files/packages/design-system/README.md +27 -0
- package/templates/architectures/micro-frontends/files/packages/design-system/package.json +11 -0
- package/templates/architectures/micro-frontends/files/packages/design-system/src/index.ts +10 -0
- package/templates/architectures/micro-frontends/files/packages/design-system/src/tokens.ts +20 -0
- package/templates/architectures/micro-frontends/files/packages/host-contract/package.json +11 -0
- package/templates/architectures/micro-frontends/files/packages/host-contract/src/index.ts +18 -0
- package/templates/architectures/micro-frontends/files/scripts/check-mfe-boundaries.mjs +199 -0
- package/templates/architectures/microservices/blueprint.yaml +160 -0
- package/templates/architectures/microservices/files/.importlinter +22 -0
- package/templates/architectures/microservices/files/Directory.Packages.props +8 -0
- package/templates/architectures/microservices/files/__solutionName.dot__.slnx +9 -0
- package/templates/architectures/microservices/files/contracts/__firstService.kebab__/package.json +8 -0
- package/templates/architectures/microservices/files/contracts/__firstService.kebab__/src/index.ts +32 -0
- package/templates/architectures/microservices/files/contracts/__firstService.lower__/contract.go +35 -0
- package/templates/architectures/microservices/files/contracts/__solutionName.pascal__.Contracts.__firstService.pascal__/__firstService.pascal__Contract.cs +26 -0
- package/templates/architectures/microservices/files/contracts/__solutionName.pascal__.Contracts.__firstService.pascal__/__solutionName.pascal__.Contracts.__firstService.pascal__.csproj +11 -0
- package/templates/architectures/microservices/files/deploy/__firstService.kebab__/Dockerfile +16 -0
- package/templates/architectures/microservices/files/docs/architecture/microservices.dotnet.md +91 -0
- package/templates/architectures/microservices/files/docs/architecture/microservices.go.md +77 -0
- package/templates/architectures/microservices/files/docs/architecture/microservices.node.md +88 -0
- package/templates/architectures/microservices/files/docs/architecture/microservices.python.md +92 -0
- package/templates/architectures/microservices/files/internal/architecture/boundary_test.go +139 -0
- package/templates/architectures/microservices/files/package.json +9 -0
- package/templates/architectures/microservices/files/pyproject.toml +2 -0
- package/templates/architectures/microservices/files/scripts/check-service-boundaries.mjs +200 -0
- package/templates/architectures/microservices/files/services/__firstService.kebab__/Dockerfile +19 -0
- package/templates/architectures/microservices/files/services/__firstService.kebab__/package.json +9 -0
- package/templates/architectures/microservices/files/services/__firstService.kebab__/src/config.ts +50 -0
- package/templates/architectures/microservices/files/services/__firstService.kebab__/src/index.ts +26 -0
- package/templates/architectures/microservices/files/services/__firstService.lower__/Dockerfile +18 -0
- package/templates/architectures/microservices/files/services/__firstService.lower__/internal/config/config.go +45 -0
- package/templates/architectures/microservices/files/services/__firstService.lower__/main.go +23 -0
- package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/Dockerfile +17 -0
- package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/ServiceAssemblyMarker.cs +10 -0
- package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/ServiceOptions.cs +28 -0
- package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/__solutionName.pascal__.Services.__firstService.pascal__.csproj +14 -0
- package/templates/architectures/microservices/files/src/__solutionName.snake__/contracts/__firstService.snake__/__init__.py +42 -0
- package/templates/architectures/microservices/files/src/__solutionName.snake__/contracts/__init__.py +5 -0
- package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__firstService.snake__/__init__.py +5 -0
- package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__firstService.snake__/config.py +54 -0
- package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__firstService.snake__/service.py +21 -0
- package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__init__.py +5 -0
- package/templates/architectures/microservices/files/tests/ArchitectureTests/ArchitectureTests.csproj +29 -0
- package/templates/architectures/microservices/files/tests/ArchitectureTests/ServiceBoundaryTests.cs +102 -0
- package/templates/architectures/microservices/files/tests/architecture/test_service_boundaries.py +120 -0
- package/templates/architectures/modular-monolith/blueprint.yaml +111 -0
- package/templates/architectures/modular-monolith/files/.importlinter +22 -0
- package/templates/architectures/modular-monolith/files/Directory.Packages.props +9 -0
- package/templates/architectures/modular-monolith/files/__solutionName.dot__.slnx +9 -0
- package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.dotnet.md +54 -0
- package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.go.md +50 -0
- package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.node.md +56 -0
- package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.python.md +54 -0
- package/templates/architectures/modular-monolith/files/internal/architecture/boundary_test.go +151 -0
- package/templates/architectures/modular-monolith/files/internal/modules/__moduleName.lower__/__moduleName.lower__.go +56 -0
- package/templates/architectures/modular-monolith/files/internal/modules/__moduleName.lower__/internal/store/store.go +12 -0
- package/templates/architectures/modular-monolith/files/internal/shared/events/bus.go +60 -0
- package/templates/architectures/modular-monolith/files/scripts/check-module-boundaries.mjs +185 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Api/I__moduleName.pascal__Module.cs +14 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Api/__moduleName.pascal__Events.cs +6 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Api/__moduleName.pascal__ModuleRegistration.cs +18 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Internal/__moduleName.pascal__Service.cs +19 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/__solutionName.dot__.Modules.__moduleName.pascal__.csproj +16 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/EventBusRegistration.cs +14 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/IEventBus.cs +15 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/IIntegrationEvent.cs +8 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/InProcessEventBus.cs +23 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/__solutionName.dot__.SharedKernel.csproj +12 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__init__.py +1 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/__init__.py +1 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/api/__init__.py +15 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/api/contracts.py +27 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/api/factory.py +11 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/internal/__init__.py +1 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/internal/service.py +20 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/shared/__init__.py +1 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/shared/events/__init__.py +3 -0
- package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/shared/events/bus.py +43 -0
- package/templates/architectures/modular-monolith/files/src/modules/__moduleName.kebab__/api/contracts.ts +19 -0
- package/templates/architectures/modular-monolith/files/src/modules/__moduleName.kebab__/api/index.ts +18 -0
- package/templates/architectures/modular-monolith/files/src/modules/__moduleName.kebab__/internal/__moduleName.kebab__.service.ts +24 -0
- package/templates/architectures/modular-monolith/files/src/shared/events/event-bus.ts +34 -0
- package/templates/architectures/modular-monolith/files/src/shared/events/index.ts +2 -0
- package/templates/architectures/modular-monolith/files/tests/__solutionName.dot__.ArchitectureTests/ModuleBoundaryTests.cs +102 -0
- package/templates/architectures/modular-monolith/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +30 -0
- package/templates/architectures/modular-monolith/files/tests/architecture/test_module_boundaries.py +114 -0
- package/templates/architectures/monolith/blueprint.yaml +141 -0
- package/templates/architectures/monolith/files/.importlinter +14 -0
- package/templates/architectures/monolith/files/Directory.Packages.props +8 -0
- package/templates/architectures/monolith/files/__solutionName.dot__.slnx +5 -0
- package/templates/architectures/monolith/files/docs/architecture/monolith.dotnet.md +78 -0
- package/templates/architectures/monolith/files/docs/architecture/monolith.go.md +69 -0
- package/templates/architectures/monolith/files/docs/architecture/monolith.node.md +70 -0
- package/templates/architectures/monolith/files/docs/architecture/monolith.python.md +71 -0
- package/templates/architectures/monolith/files/internal/architecture/boundary_test.go +141 -0
- package/templates/architectures/monolith/files/internal/features/__featureName.lower__/__featureName.lower__.go +37 -0
- package/templates/architectures/monolith/files/internal/features/__featureName.lower__/internal/store/store.go +14 -0
- package/templates/architectures/monolith/files/internal/features/features.go +18 -0
- package/templates/architectures/monolith/files/internal/shared/apperr/apperr.go +17 -0
- package/templates/architectures/monolith/files/pyproject.toml +2 -0
- package/templates/architectures/monolith/files/scripts/check-monolith-boundaries.mjs +187 -0
- package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Features/__featureName.pascal__/Internal/__featureName.pascal__Service.cs +12 -0
- package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Features/__featureName.pascal__/__featureName.pascal__Feature.cs +13 -0
- package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Features/__featureName.pascal__/__featureName.pascal__Registration.cs +13 -0
- package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Kernel/AppException.cs +30 -0
- package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Features/__featureName.pascal__/Internal/__featureName.pascal__Service.cs +12 -0
- package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Features/__featureName.pascal__/__featureName.pascal__Feature.cs +13 -0
- package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Features/__featureName.pascal__/__featureName.pascal__Registration.cs +13 -0
- package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Kernel/AppException.cs +30 -0
- package/templates/architectures/monolith/files/src/__solutionName.snake__/features/__featureName.snake__/__init__.py +31 -0
- package/templates/architectures/monolith/files/src/__solutionName.snake__/features/__featureName.snake__/service.py +22 -0
- package/templates/architectures/monolith/files/src/__solutionName.snake__/features/__init__.py +14 -0
- package/templates/architectures/monolith/files/src/__solutionName.snake__/shared/__init__.py +11 -0
- package/templates/architectures/monolith/files/src/__solutionName.snake__/shared/errors.py +13 -0
- package/templates/architectures/monolith/files/src/features/__featureName.kebab__/__featureName.kebab__.service.ts +15 -0
- package/templates/architectures/monolith/files/src/features/__featureName.kebab__/index.ts +20 -0
- package/templates/architectures/monolith/files/src/features/index.ts +11 -0
- package/templates/architectures/monolith/files/src/shared/errors.ts +13 -0
- package/templates/architectures/monolith/files/src/shared/index.ts +7 -0
- package/templates/architectures/monolith/files/tests/ArchitectureTests/ArchitectureTests.csproj +32 -0
- package/templates/architectures/monolith/files/tests/ArchitectureTests/FeatureBoundaryTests.cs +129 -0
- package/templates/architectures/monolith/files/tests/architecture/test_monolith_boundaries.py +136 -0
- package/templates/architectures/multi-agent/blueprint.yaml +97 -0
- package/templates/architectures/multi-agent/files/.importlinter +36 -0
- package/templates/architectures/multi-agent/files/docs/architecture/multi-agent.node.md +110 -0
- package/templates/architectures/multi-agent/files/docs/architecture/multi-agent.python.md +94 -0
- package/templates/architectures/multi-agent/files/docs/architecture/multi-agent.typescript.md +102 -0
- package/templates/architectures/multi-agent/files/pyproject.toml +2 -0
- package/templates/architectures/multi-agent/files/scripts/check-agent-boundaries.mjs +207 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/__init__.py +5 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/config.py +52 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/contracts.py +62 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/__init__.py +9 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/budget.py +45 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/fanout.py +63 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/lead.py +92 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/runtime/__init__.py +5 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/runtime/runner.py +48 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__init__.py +27 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__workerName.snake__/__init__.py +9 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__workerName.snake__/prompt.py +31 -0
- package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__workerName.snake__/worker.py +28 -0
- package/templates/architectures/multi-agent/files/src/agents/config.ts +46 -0
- package/templates/architectures/multi-agent/files/src/agents/contracts/index.ts +4 -0
- package/templates/architectures/multi-agent/files/src/agents/contracts/result.ts +50 -0
- package/templates/architectures/multi-agent/files/src/agents/contracts/task.ts +19 -0
- package/templates/architectures/multi-agent/files/src/agents/orchestrator/budget.ts +51 -0
- package/templates/architectures/multi-agent/files/src/agents/orchestrator/fanout.ts +67 -0
- package/templates/architectures/multi-agent/files/src/agents/orchestrator/index.ts +4 -0
- package/templates/architectures/multi-agent/files/src/agents/orchestrator/lead.ts +77 -0
- package/templates/architectures/multi-agent/files/src/agents/runtime/index.ts +3 -0
- package/templates/architectures/multi-agent/files/src/agents/runtime/runner.ts +36 -0
- package/templates/architectures/multi-agent/files/src/agents/workers/README.md +13 -0
- package/templates/architectures/multi-agent/files/src/agents/workers/__workerName.kebab__/prompt.ts +22 -0
- package/templates/architectures/multi-agent/files/src/agents/workers/__workerName.kebab__/worker.ts +25 -0
- package/templates/architectures/multi-agent/files/src/agents/workers/index.ts +15 -0
- package/templates/architectures/multi-agent/files/tests/architecture/test_agent_boundaries.py +184 -0
- package/templates/architectures/mvc-mvvm/blueprint.yaml +156 -0
- package/templates/architectures/mvc-mvvm/files/.importlinter +25 -0
- package/templates/architectures/mvc-mvvm/files/Directory.Packages.props +8 -0
- package/templates/architectures/mvc-mvvm/files/__solutionName.dot__.slnx +8 -0
- package/templates/architectures/mvc-mvvm/files/docs/architecture/mvc-mvvm.dotnet.md +84 -0
- package/templates/architectures/mvc-mvvm/files/docs/architecture/mvc-mvvm.python.md +69 -0
- package/templates/architectures/mvc-mvvm/files/docs/architecture/mvc-mvvm.typescript.md +85 -0
- package/templates/architectures/mvc-mvvm/files/scripts/check-mvvm-boundaries.mjs +234 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/Models/__firstScreen.pascal__.cs +8 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/ViewModels/RelayCommand.cs +18 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/ViewModels/ViewModelBase.cs +27 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/ViewModels/__firstScreen.pascal__ViewModel.cs +55 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/Views/README.md +12 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/__solutionName.dot__.Presentation.csproj +11 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/controllers/__firstScreen.snake___controller.py +17 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/controllers/__init__.py +5 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/models/__firstScreen.snake__.py +13 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/models/__init__.py +5 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/models/repository.py +17 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/views/__firstScreen.snake___view.py +17 -0
- package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/views/__init__.py +6 -0
- package/templates/architectures/mvc-mvvm/files/src/models/index.ts +4 -0
- package/templates/architectures/mvc-mvvm/files/src/viewmodels/index.ts +12 -0
- package/templates/architectures/mvc-mvvm/files/src/views/index.ts +10 -0
- package/templates/architectures/mvc-mvvm/files/tests/__solutionName.dot__.ArchitectureTests/PresentationBoundaryTests.cs +124 -0
- package/templates/architectures/mvc-mvvm/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +28 -0
- package/templates/architectures/mvc-mvvm/files/tests/test_presentation_boundaries.py +33 -0
- package/templates/architectures/onion/blueprint.yaml +146 -0
- package/templates/architectures/onion/files/.dependency-cruiser.cjs +50 -0
- package/templates/architectures/onion/files/.importlinter +33 -0
- package/templates/architectures/onion/files/Directory.Packages.props +8 -0
- package/templates/architectures/onion/files/__solutionName.dot__.slnx +11 -0
- package/templates/architectures/onion/files/docs/architecture/onion-dotnet.md +39 -0
- package/templates/architectures/onion/files/docs/architecture/onion-go.md +33 -0
- package/templates/architectures/onion/files/docs/architecture/onion-python.md +35 -0
- package/templates/architectures/onion/files/docs/architecture/onion-typescript.md +34 -0
- package/templates/architectures/onion/files/internal/applicationservices/doc.go +4 -0
- package/templates/architectures/onion/files/internal/arch/rings.go +11 -0
- package/templates/architectures/onion/files/internal/arch/rings_test.go +112 -0
- package/templates/architectures/onion/files/internal/domain/doc.go +4 -0
- package/templates/architectures/onion/files/internal/domainservices/doc.go +5 -0
- package/templates/architectures/onion/files/internal/infrastructure/doc.go +5 -0
- package/templates/architectures/onion/files/pyproject.toml +2 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.ApplicationServices/ApplicationServicesAssemblyMarker.cs +4 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.ApplicationServices/__solutionName.dot__.ApplicationServices.csproj +13 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.Domain/DomainAssemblyMarker.cs +4 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.Domain/__solutionName.dot__.Domain.csproj +11 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.DomainServices/DomainServicesAssemblyMarker.cs +4 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.DomainServices/Repositories/.gitkeep +2 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.DomainServices/__solutionName.dot__.DomainServices.csproj +14 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.Infrastructure/InfrastructureAssemblyMarker.cs +4 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.Infrastructure/Repositories/.gitkeep +2 -0
- package/templates/architectures/onion/files/src/__solutionName.dot__.Infrastructure/__solutionName.dot__.Infrastructure.csproj +14 -0
- package/templates/architectures/onion/files/src/__solutionName.snake__/application_services/__init__.py +4 -0
- package/templates/architectures/onion/files/src/__solutionName.snake__/domain/__init__.py +5 -0
- package/templates/architectures/onion/files/src/__solutionName.snake__/domain_services/__init__.py +6 -0
- package/templates/architectures/onion/files/src/__solutionName.snake__/infrastructure/__init__.py +5 -0
- package/templates/architectures/onion/files/src/application-services/index.ts +3 -0
- package/templates/architectures/onion/files/src/domain/index.ts +3 -0
- package/templates/architectures/onion/files/src/domain-services/index.ts +3 -0
- package/templates/architectures/onion/files/src/infrastructure/index.ts +3 -0
- package/templates/architectures/onion/files/tests/__solutionName.dot__.ArchitectureTests/RingDependencyTests.cs +104 -0
- package/templates/architectures/onion/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +31 -0
- package/templates/architectures/pipes-and-filters/blueprint.yaml +104 -0
- package/templates/architectures/pipes-and-filters/files/.importlinter +25 -0
- package/templates/architectures/pipes-and-filters/files/docs/architecture/pipes-and-filters.go.md +72 -0
- package/templates/architectures/pipes-and-filters/files/docs/architecture/pipes-and-filters.node.md +73 -0
- package/templates/architectures/pipes-and-filters/files/docs/architecture/pipes-and-filters.python.md +76 -0
- package/templates/architectures/pipes-and-filters/files/internal/pipeline/boundary_test.go +107 -0
- package/templates/architectures/pipes-and-filters/files/internal/pipeline/config.go +53 -0
- package/templates/architectures/pipes-and-filters/files/internal/pipeline/contract/contract.go +35 -0
- package/templates/architectures/pipes-and-filters/files/internal/pipeline/pipeline.go +39 -0
- package/templates/architectures/pipes-and-filters/files/internal/pipeline/stages/__firstStage.lower__/__firstStage.lower__.go +42 -0
- package/templates/architectures/pipes-and-filters/files/internal/pipeline/stages/__firstStage.lower__/__firstStage.lower___test.go +59 -0
- package/templates/architectures/pipes-and-filters/files/package.json +8 -0
- package/templates/architectures/pipes-and-filters/files/pyproject.toml +2 -0
- package/templates/architectures/pipes-and-filters/files/scripts/check-stage-boundaries.mjs +172 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/__init__.py +16 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/config.py +26 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/contract.py +34 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/pipeline.py +33 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/stages/__firstStage.snake__/__init__.py +3 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/stages/__firstStage.snake__/stage.py +31 -0
- package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/stages/__init__.py +1 -0
- package/templates/architectures/pipes-and-filters/files/src/pipeline/config.ts +24 -0
- package/templates/architectures/pipes-and-filters/files/src/pipeline/contract.ts +41 -0
- package/templates/architectures/pipes-and-filters/files/src/pipeline/pipeline.ts +37 -0
- package/templates/architectures/pipes-and-filters/files/src/pipeline/stages/__firstStage.kebab__/__firstStage.kebab__.test.ts +32 -0
- package/templates/architectures/pipes-and-filters/files/src/pipeline/stages/__firstStage.kebab__/index.ts +29 -0
- package/templates/architectures/pipes-and-filters/files/tests/architecture/test_stage_boundaries.py +127 -0
- package/templates/architectures/pipes-and-filters/files/tests/pipeline/test___firstStage.snake__.py +32 -0
- package/templates/architectures/rag-hybrid/blueprint.yaml +121 -0
- package/templates/architectures/rag-hybrid/files/.importlinter +42 -0
- package/templates/architectures/rag-hybrid/files/docs/architecture/rag-hybrid.node.md +159 -0
- package/templates/architectures/rag-hybrid/files/docs/architecture/rag-hybrid.python.md +157 -0
- package/templates/architectures/rag-hybrid/files/evals/corpus/chunking.md +20 -0
- package/templates/architectures/rag-hybrid/files/evals/corpus/fusion.md +17 -0
- package/templates/architectures/rag-hybrid/files/evals/corpus/hybrid-retrieval.md +21 -0
- package/templates/architectures/rag-hybrid/files/evals/corpus/reranking.md +17 -0
- package/templates/architectures/rag-hybrid/files/evals/golden/queries.jsonl +5 -0
- package/templates/architectures/rag-hybrid/files/package.json +9 -0
- package/templates/architectures/rag-hybrid/files/pyproject.toml +2 -0
- package/templates/architectures/rag-hybrid/files/scripts/check-retrieval-seam.mjs +156 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/__init__.py +23 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/chunk/__init__.py +57 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/config.py +101 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/contracts.py +58 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/embed/__init__.py +90 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/__init__.py +11 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/cli.py +47 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/harness.py +115 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/metrics.py +51 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/generate/__init__.py +85 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/indexing.py +23 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/ingest/__init__.py +45 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/pipeline.py +27 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/rerank/__init__.py +85 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/__init__.py +37 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/dense.py +25 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/fusion.py +30 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/keyword.py +45 -0
- package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/store/__init__.py +87 -0
- package/templates/architectures/rag-hybrid/files/src/rag/chunk/index.ts +56 -0
- package/templates/architectures/rag-hybrid/files/src/rag/config.ts +96 -0
- package/templates/architectures/rag-hybrid/files/src/rag/contracts.ts +50 -0
- package/templates/architectures/rag-hybrid/files/src/rag/embed/index.ts +98 -0
- package/templates/architectures/rag-hybrid/files/src/rag/evaluation/cli.ts +47 -0
- package/templates/architectures/rag-hybrid/files/src/rag/evaluation/harness.ts +101 -0
- package/templates/architectures/rag-hybrid/files/src/rag/evaluation/metrics.ts +40 -0
- package/templates/architectures/rag-hybrid/files/src/rag/generate/index.ts +86 -0
- package/templates/architectures/rag-hybrid/files/src/rag/indexing.ts +21 -0
- package/templates/architectures/rag-hybrid/files/src/rag/ingest/index.ts +58 -0
- package/templates/architectures/rag-hybrid/files/src/rag/pipeline.ts +32 -0
- package/templates/architectures/rag-hybrid/files/src/rag/rerank/index.ts +90 -0
- package/templates/architectures/rag-hybrid/files/src/rag/retrieve/dense.ts +26 -0
- package/templates/architectures/rag-hybrid/files/src/rag/retrieve/fusion.ts +32 -0
- package/templates/architectures/rag-hybrid/files/src/rag/retrieve/index.ts +38 -0
- package/templates/architectures/rag-hybrid/files/src/rag/retrieve/keyword.ts +42 -0
- package/templates/architectures/rag-hybrid/files/src/rag/store/index.ts +108 -0
- package/templates/architectures/rag-hybrid/files/tests/architecture/test_retrieval_seam.py +108 -0
- package/templates/architectures/serverless/blueprint.yaml +139 -0
- package/templates/architectures/serverless/files/.gitignore.serverless +3 -0
- package/templates/architectures/serverless/files/.importlinter +18 -0
- package/templates/architectures/serverless/files/cdk.json +7 -0
- package/templates/architectures/serverless/files/docs/architecture/serverless.node.md +97 -0
- package/templates/architectures/serverless/files/docs/architecture/serverless.python.md +108 -0
- package/templates/architectures/serverless/files/events/__firstHandler.kebab__.json +21 -0
- package/templates/architectures/serverless/files/infra/app.ts +15 -0
- package/templates/architectures/serverless/files/infra/config.ts +22 -0
- package/templates/architectures/serverless/files/infra/stack.ts +45 -0
- package/templates/architectures/serverless/files/package.json +9 -0
- package/templates/architectures/serverless/files/pyproject.toml +2 -0
- package/templates/architectures/serverless/files/scripts/check-handler-boundaries.mjs +144 -0
- package/templates/architectures/serverless/files/scripts/invoke-local.ts +57 -0
- package/templates/architectures/serverless/files/scripts/invoke_local.py +61 -0
- package/templates/architectures/serverless/files/src/__solutionName.snake__/functions/__firstHandler.snake__/__init__.py +1 -0
- package/templates/architectures/serverless/files/src/__solutionName.snake__/functions/__firstHandler.snake__/handler.py +27 -0
- package/templates/architectures/serverless/files/src/__solutionName.snake__/functions/__init__.py +4 -0
- package/templates/architectures/serverless/files/src/__solutionName.snake__/layers/__init__.py +5 -0
- package/templates/architectures/serverless/files/src/__solutionName.snake__/layers/config.py +45 -0
- package/templates/architectures/serverless/files/src/__solutionName.snake__/layers/observability.py +35 -0
- package/templates/architectures/serverless/files/src/functions/__firstHandler.kebab__/handler.ts +26 -0
- package/templates/architectures/serverless/files/src/layers/config/index.ts +31 -0
- package/templates/architectures/serverless/files/src/layers/observability/index.ts +38 -0
- package/templates/architectures/serverless/files/src/requirements.txt +3 -0
- package/templates/architectures/serverless/files/template.yaml +48 -0
- package/templates/architectures/serverless/files/tests/architecture/test_handler_boundaries.py +32 -0
- package/templates/architectures/vertical-slice/blueprint.yaml +124 -0
- package/templates/architectures/vertical-slice/files/.importlinter +18 -0
- package/templates/architectures/vertical-slice/files/Directory.Packages.props +8 -0
- package/templates/architectures/vertical-slice/files/__solutionName.dot__.slnx +5 -0
- package/templates/architectures/vertical-slice/files/docs/architecture/vertical-slice.md +75 -0
- package/templates/architectures/vertical-slice/files/internal/features/__firstSlice.lower__/__firstSlice.lower__.go +2 -0
- package/templates/architectures/vertical-slice/files/internal/features/boundary_test.go +92 -0
- package/templates/architectures/vertical-slice/files/internal/features/doc.go +3 -0
- package/templates/architectures/vertical-slice/files/internal/shared/doc.go +2 -0
- package/templates/architectures/vertical-slice/files/pyproject.toml +2 -0
- package/templates/architectures/vertical-slice/files/scripts/check-slice-boundaries.mjs +118 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.dot__.Api/Common/.gitkeep +0 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.dot__.Api/Features/.gitkeep +0 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.dot__.Api/Features/__firstSlice.pascal__/Slice.cs +15 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.pascal__.Api/Common/.gitkeep +0 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.pascal__.Api/Features/.gitkeep +0 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.pascal__.Api/Features/__firstSlice.pascal__/Slice.cs +15 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.snake__/features/__firstSlice.snake__/__init__.py +1 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.snake__/features/__init__.py +1 -0
- package/templates/architectures/vertical-slice/files/src/__solutionName.snake__/shared/__init__.py +1 -0
- package/templates/architectures/vertical-slice/files/src/features/__firstSlice.kebab__/index.ts +3 -0
- package/templates/architectures/vertical-slice/files/src/shared/.gitkeep +0 -0
- package/templates/architectures/vertical-slice/files/tests/ArchitectureTests/ArchitectureTests.csproj +33 -0
- package/templates/architectures/vertical-slice/files/tests/ArchitectureTests/SliceBoundaryTests.cs +110 -0
- package/templates/architectures/vertical-slice/files/tests/test_architecture.py +32 -0
- package/templates/bases/dotnet-aspire/blueprint.yaml +120 -0
- package/templates/bases/dotnet-aspire/files/Directory.Build.props +11 -0
- package/templates/bases/dotnet-aspire/files/Directory.Packages.props +17 -0
- package/templates/bases/dotnet-aspire/files/README.md +60 -0
- package/templates/bases/dotnet-aspire/files/__solutionName.dot__.slnx +7 -0
- package/templates/bases/dotnet-aspire/files/aspire.config.json +5 -0
- package/templates/bases/dotnet-aspire/files/gitignore +44 -0
- package/templates/bases/dotnet-aspire/files/global.json +6 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/Configuration/ApiOptions.cs +20 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/Program.cs +37 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/Properties/launchSettings.json +23 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/__solutionName.pascal__.Api.csproj +11 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/appsettings.Development.json +8 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/appsettings.json +14 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/AppHost.cs +8 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/Properties/launchSettings.json +29 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/__solutionName.pascal__.AppHost.csproj +11 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/appsettings.Development.json +8 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/appsettings.json +9 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.ServiceDefaults/Extensions.cs +101 -0
- package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.ServiceDefaults/__solutionName.pascal__.ServiceDefaults.csproj +19 -0
- package/templates/bases/dotnet-webapi/blueprint.yaml +112 -0
- package/templates/bases/dotnet-webapi/files/.editorconfig +78 -0
- package/templates/bases/dotnet-webapi/files/Directory.Build.props +28 -0
- package/templates/bases/dotnet-webapi/files/Directory.Packages.props +18 -0
- package/templates/bases/dotnet-webapi/files/README.md +71 -0
- package/templates/bases/dotnet-webapi/files/__solutionName.dot__.slnx +11 -0
- package/templates/bases/dotnet-webapi/files/gitignore +49 -0
- package/templates/bases/dotnet-webapi/files/global.json +7 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Configuration/ApiOptions.cs +23 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Configuration/ServiceCollectionExtensions.cs +35 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Endpoints/GreetingEndpoints.cs +24 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Endpoints/HealthEndpoints.cs +11 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Program.cs +23 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Properties/launchSettings.json +21 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/__solutionName.dot__.Api.csproj +19 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/appsettings.Development.json +8 -0
- package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/appsettings.json +9 -0
- package/templates/bases/fastapi-service/blueprint.yaml +87 -0
- package/templates/bases/fastapi-service/files/.env.example +10 -0
- package/templates/bases/fastapi-service/files/README.md +42 -0
- package/templates/bases/fastapi-service/files/gitignore +27 -0
- package/templates/bases/fastapi-service/files/pyproject.toml +35 -0
- package/templates/bases/fastapi-service/files/src/__solutionName.snake__/__init__.py +1 -0
- package/templates/bases/fastapi-service/files/src/__solutionName.snake__/api/__init__.py +1 -0
- package/templates/bases/fastapi-service/files/src/__solutionName.snake__/api/routes.py +38 -0
- package/templates/bases/fastapi-service/files/src/__solutionName.snake__/main.py +34 -0
- package/templates/bases/fastapi-service/files/src/__solutionName.snake__/settings.py +30 -0
- package/templates/bases/go-api/blueprint.yaml +58 -0
- package/templates/bases/go-api/files/.env.example +16 -0
- package/templates/bases/go-api/files/README.md +76 -0
- package/templates/bases/go-api/files/cmd/__solutionName.kebab__/main.go +65 -0
- package/templates/bases/go-api/files/gitignore +27 -0
- package/templates/bases/go-api/files/go.mod +5 -0
- package/templates/bases/go-api/files/internal/config/config.go +127 -0
- package/templates/bases/go-api/files/internal/httpapi/greeting.go +25 -0
- package/templates/bases/go-api/files/internal/httpapi/health.go +25 -0
- package/templates/bases/go-api/files/internal/httpapi/respond.go +25 -0
- package/templates/bases/go-api/files/internal/httpapi/router.go +63 -0
- package/templates/bases/hono-api/blueprint.yaml +94 -0
- package/templates/bases/hono-api/files/.env.example +7 -0
- package/templates/bases/hono-api/files/README.md +77 -0
- package/templates/bases/hono-api/files/biome.json +24 -0
- package/templates/bases/hono-api/files/gitignore +16 -0
- package/templates/bases/hono-api/files/package.json +29 -0
- package/templates/bases/hono-api/files/src/app.ts +27 -0
- package/templates/bases/hono-api/files/src/config.ts +27 -0
- package/templates/bases/hono-api/files/src/index.ts +17 -0
- package/templates/bases/hono-api/files/src/routes/greetings.ts +17 -0
- package/templates/bases/hono-api/files/src/routes/health.ts +13 -0
- package/templates/bases/hono-api/files/tsconfig.json +18 -0
- package/templates/bases/nestjs-api/blueprint.yaml +94 -0
- package/templates/bases/nestjs-api/files/.env.example +8 -0
- package/templates/bases/nestjs-api/files/.prettierrc +5 -0
- package/templates/bases/nestjs-api/files/README.md +69 -0
- package/templates/bases/nestjs-api/files/eslint.config.mjs +23 -0
- package/templates/bases/nestjs-api/files/gitignore +11 -0
- package/templates/bases/nestjs-api/files/nest-cli.json +9 -0
- package/templates/bases/nestjs-api/files/package.json +41 -0
- package/templates/bases/nestjs-api/files/src/app.module.ts +16 -0
- package/templates/bases/nestjs-api/files/src/config/app.config.ts +30 -0
- package/templates/bases/nestjs-api/files/src/config/env.validation.ts +15 -0
- package/templates/bases/nestjs-api/files/src/health/health.controller.ts +19 -0
- package/templates/bases/nestjs-api/files/src/health/health.module.ts +6 -0
- package/templates/bases/nestjs-api/files/src/main.ts +25 -0
- package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/__solutionName.kebab__.controller.ts +14 -0
- package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/__solutionName.kebab__.module.ts +11 -0
- package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/__solutionName.kebab__.service.ts +12 -0
- package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/dto/greet-query.dto.ts +10 -0
- package/templates/bases/nestjs-api/files/tsconfig.build.json +4 -0
- package/templates/bases/nestjs-api/files/tsconfig.json +26 -0
- package/templates/bases/nextjs-app/blueprint.yaml +80 -0
- package/templates/bases/nextjs-app/files/.env.example +10 -0
- package/templates/bases/nextjs-app/files/README.md +48 -0
- package/templates/bases/nextjs-app/files/eslint.config.mjs +12 -0
- package/templates/bases/nextjs-app/files/gitignore +32 -0
- package/templates/bases/nextjs-app/files/next.config.ts +8 -0
- package/templates/bases/nextjs-app/files/package.json +30 -0
- package/templates/bases/nextjs-app/files/postcss.config.mjs +7 -0
- package/templates/bases/nextjs-app/files/src/app/api/health/route.ts +21 -0
- package/templates/bases/nextjs-app/files/src/app/globals.css +45 -0
- package/templates/bases/nextjs-app/files/src/app/layout.tsx +28 -0
- package/templates/bases/nextjs-app/files/src/app/page.tsx +39 -0
- package/templates/bases/nextjs-app/files/src/config/env.ts +64 -0
- package/templates/bases/nextjs-app/files/tsconfig.json +35 -0
- package/templates/bases/python-ai-agent/blueprint.yaml +84 -0
- package/templates/bases/python-ai-agent/files/.env.example +29 -0
- package/templates/bases/python-ai-agent/files/README.md +80 -0
- package/templates/bases/python-ai-agent/files/gitignore +21 -0
- package/templates/bases/python-ai-agent/files/pyproject.toml +34 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/__init__.py +1 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/api/__init__.py +1 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/api/routes.py +69 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/config.py +70 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/__init__.py +1 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/anthropic_provider.py +69 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/openai_provider.py +75 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/provider.py +45 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/registry.py +35 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/main.py +33 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/observability/__init__.py +1 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/observability/evals.py +28 -0
- package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/observability/tracing.py +49 -0
- package/templates/bases/react-vite-spa/blueprint.yaml +92 -0
- package/templates/bases/react-vite-spa/files/.env.example +13 -0
- package/templates/bases/react-vite-spa/files/README.md +49 -0
- package/templates/bases/react-vite-spa/files/eslint.config.mjs +26 -0
- package/templates/bases/react-vite-spa/files/gitignore +25 -0
- package/templates/bases/react-vite-spa/files/index.html +13 -0
- package/templates/bases/react-vite-spa/files/package.json +37 -0
- package/templates/bases/react-vite-spa/files/src/api/client.ts +28 -0
- package/templates/bases/react-vite-spa/files/src/api/health.ts +12 -0
- package/templates/bases/react-vite-spa/files/src/app/query-client.ts +12 -0
- package/templates/bases/react-vite-spa/files/src/app/root-layout.tsx +24 -0
- package/templates/bases/react-vite-spa/files/src/app/router.tsx +44 -0
- package/templates/bases/react-vite-spa/files/src/config/env.ts +37 -0
- package/templates/bases/react-vite-spa/files/src/main.tsx +18 -0
- package/templates/bases/react-vite-spa/files/src/pages/home-page.tsx +31 -0
- package/templates/bases/react-vite-spa/files/src/pages/not-found-page.tsx +13 -0
- package/templates/bases/react-vite-spa/files/src/pages/status-page.tsx +37 -0
- package/templates/bases/react-vite-spa/files/src/styles/global.css +169 -0
- package/templates/bases/react-vite-spa/files/src/vite-env.d.ts +15 -0
- package/templates/bases/react-vite-spa/files/tsconfig.app.json +29 -0
- package/templates/bases/react-vite-spa/files/tsconfig.json +4 -0
- package/templates/bases/react-vite-spa/files/tsconfig.node.json +24 -0
- package/templates/bases/react-vite-spa/files/vite.config.ts +25 -0
- package/templates/bases/turborepo-monorepo/blueprint.yaml +84 -0
- package/templates/bases/turborepo-monorepo/files/.env.example +7 -0
- package/templates/bases/turborepo-monorepo/files/.prettierignore +9 -0
- package/templates/bases/turborepo-monorepo/files/.prettierrc.json +5 -0
- package/templates/bases/turborepo-monorepo/files/README.md +55 -0
- package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/eslint.config.js +3 -0
- package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/package.json +25 -0
- package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/src/config.ts +46 -0
- package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/src/index.ts +20 -0
- package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/src/router.ts +24 -0
- package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/tsconfig.json +8 -0
- package/templates/bases/turborepo-monorepo/files/gitignore +17 -0
- package/templates/bases/turborepo-monorepo/files/package.json +25 -0
- package/templates/bases/turborepo-monorepo/files/packages/eslint-config/index.js +21 -0
- package/templates/bases/turborepo-monorepo/files/packages/eslint-config/package.json +21 -0
- package/templates/bases/turborepo-monorepo/files/packages/shared/eslint.config.js +3 -0
- package/templates/bases/turborepo-monorepo/files/packages/shared/package.json +26 -0
- package/templates/bases/turborepo-monorepo/files/packages/shared/src/health.ts +23 -0
- package/templates/bases/turborepo-monorepo/files/packages/shared/src/index.ts +2 -0
- package/templates/bases/turborepo-monorepo/files/packages/shared/tsconfig.json +10 -0
- package/templates/bases/turborepo-monorepo/files/packages/tsconfig/base.json +19 -0
- package/templates/bases/turborepo-monorepo/files/packages/tsconfig/node.json +7 -0
- package/templates/bases/turborepo-monorepo/files/packages/tsconfig/package.json +9 -0
- package/templates/bases/turborepo-monorepo/files/pnpm-workspace.yaml +7 -0
- package/templates/bases/turborepo-monorepo/files/turbo.json +22 -0
- package/templates/layers/api-versioning/blueprint.yaml +264 -0
- package/templates/layers/api-versioning/files/.env.apiversion.example +53 -0
- package/templates/layers/api-versioning/files/__apiVersionContractDir__/README.md +48 -0
- package/templates/layers/api-versioning/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/api-versioning/files/docs/api-versioning.md +100 -0
- package/templates/layers/api-versioning/files/internal/apiversion/apiversion_test.go +202 -0
- package/templates/layers/api-versioning/files/internal/apiversion/config.go +242 -0
- package/templates/layers/api-versioning/files/internal/apiversion/contract.go +280 -0
- package/templates/layers/api-versioning/files/internal/apiversion/headers.go +55 -0
- package/templates/layers/api-versioning/files/internal/apiversion/middleware.go +53 -0
- package/templates/layers/api-versioning/files/internal/apiversion/negotiate.go +107 -0
- package/templates/layers/api-versioning/files/internal/apiversion/snapshot.go +72 -0
- package/templates/layers/api-versioning/files/internal/apiversion/versions.go +72 -0
- package/templates/layers/api-versioning/files/package.json +5 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionHeaders.cs +62 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionNegotiator.cs +129 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionOptions.cs +58 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionPolicy.cs +99 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersioningMiddleware.cs +58 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersioningServiceCollectionExtensions.cs +18 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ContractDiff.cs +152 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ContractShape.cs +142 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ContractStore.cs +64 -0
- package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/__solutionName.dot__.ApiVersioning.csproj +17 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/__init__.py +67 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/contract.py +191 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/errors.py +28 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/headers.py +56 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/middleware.py +76 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/negotiate.py +94 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/settings.py +189 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/snapshot.py +74 -0
- package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/versions.py +70 -0
- package/templates/layers/api-versioning/files/src/apiversion/client/pinned-fetch.ts +89 -0
- package/templates/layers/api-versioning/files/src/apiversion/contract/diff.ts +153 -0
- package/templates/layers/api-versioning/files/src/apiversion/contract/node/snapshot.ts +76 -0
- package/templates/layers/api-versioning/files/src/apiversion/contract/shape.ts +94 -0
- package/templates/layers/api-versioning/files/src/apiversion/errors.ts +36 -0
- package/templates/layers/api-versioning/files/src/apiversion/headers.ts +52 -0
- package/templates/layers/api-versioning/files/src/apiversion/index.ts +23 -0
- package/templates/layers/api-versioning/files/src/apiversion/middleware.ts +59 -0
- package/templates/layers/api-versioning/files/src/apiversion/negotiate.ts +113 -0
- package/templates/layers/api-versioning/files/src/apiversion/node/http.ts +50 -0
- package/templates/layers/api-versioning/files/src/apiversion/settings.ts +214 -0
- package/templates/layers/api-versioning/files/src/apiversion/tests/apiversion.spec.ts +162 -0
- package/templates/layers/api-versioning/files/src/apiversion/tests/apiversion.test.ts +167 -0
- package/templates/layers/api-versioning/files/src/apiversion/versions.ts +66 -0
- package/templates/layers/api-versioning/files/tests/test_api_versioning.py +162 -0
- package/templates/layers/audit-log/blueprint.yaml +186 -0
- package/templates/layers/audit-log/files/.env.audit.example +41 -0
- package/templates/layers/audit-log/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/audit-log/files/docs/audit-log.md +195 -0
- package/templates/layers/audit-log/files/internal/audit/audit_test.go +141 -0
- package/templates/layers/audit-log/files/internal/audit/chain.go +91 -0
- package/templates/layers/audit-log/files/internal/audit/config.go +143 -0
- package/templates/layers/audit-log/files/internal/audit/event.go +87 -0
- package/templates/layers/audit-log/files/internal/audit/recorder.go +133 -0
- package/templates/layers/audit-log/files/internal/audit/redact.go +83 -0
- package/templates/layers/audit-log/files/internal/audit/sink.go +196 -0
- package/templates/layers/audit-log/files/internal/audit/verify.go +17 -0
- package/templates/layers/audit-log/files/package.json +5 -0
- package/templates/layers/audit-log/files/pyproject.toml +2 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditChain.cs +74 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditEvent.cs +90 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditOptions.cs +104 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditRecorder.cs +106 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditSerialization.cs +116 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditSinks.cs +165 -0
- package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/__solutionName.dot__.Auditing.csproj +17 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/chain.py +56 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/event.py +118 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/recorder.py +118 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/redact.py +41 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/settings.py +102 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/sinks.py +121 -0
- package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/verify.py +14 -0
- package/templates/layers/audit-log/files/src/audit/chain.ts +59 -0
- package/templates/layers/audit-log/files/src/audit/event.ts +73 -0
- package/templates/layers/audit-log/files/src/audit/index.ts +32 -0
- package/templates/layers/audit-log/files/src/audit/recorder.ts +108 -0
- package/templates/layers/audit-log/files/src/audit/redact.ts +54 -0
- package/templates/layers/audit-log/files/src/audit/settings.ts +113 -0
- package/templates/layers/audit-log/files/src/audit/sinks.ts +131 -0
- package/templates/layers/audit-log/files/src/audit/tests/audit.spec.ts +97 -0
- package/templates/layers/audit-log/files/src/audit/tests/audit.test.ts +103 -0
- package/templates/layers/audit-log/files/tests/test_audit_log.py +91 -0
- package/templates/layers/auth-jwt/blueprint.yaml +124 -0
- package/templates/layers/auth-jwt/files/.env.auth.example +17 -0
- package/templates/layers/auth-jwt/files/Directory.Packages.props +5 -0
- package/templates/layers/auth-jwt/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/auth-jwt/files/docs/auth-jwt.md +198 -0
- package/templates/layers/auth-jwt/files/go.mod +2 -0
- package/templates/layers/auth-jwt/files/internal/auth/auth_test.go +167 -0
- package/templates/layers/auth-jwt/files/internal/auth/config.go +108 -0
- package/templates/layers/auth-jwt/files/internal/auth/errors.go +21 -0
- package/templates/layers/auth-jwt/files/internal/auth/http.go +65 -0
- package/templates/layers/auth-jwt/files/internal/auth/password.go +76 -0
- package/templates/layers/auth-jwt/files/internal/auth/service.go +213 -0
- package/templates/layers/auth-jwt/files/internal/auth/store.go +138 -0
- package/templates/layers/auth-jwt/files/internal/auth/token.go +83 -0
- package/templates/layers/auth-jwt/files/package.json +9 -0
- package/templates/layers/auth-jwt/files/pyproject.toml +2 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthException.cs +39 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthOptions.cs +35 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthService.cs +132 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthServiceCollectionExtensions.cs +48 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/JwtTokenService.cs +84 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/PasswordHasher.cs +52 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/Stores.cs +100 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/__solutionName.dot__.Auth.csproj +21 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/appsettings.Auth.sample.json +10 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/__init__.py +42 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/config.py +49 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/errors.py +21 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/http.py +36 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/passwords.py +37 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/service.py +139 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/store.py +90 -0
- package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/tokens.py +72 -0
- package/templates/layers/auth-jwt/files/src/auth/config.ts +77 -0
- package/templates/layers/auth-jwt/files/src/auth/errors.ts +32 -0
- package/templates/layers/auth-jwt/files/src/auth/http.ts +35 -0
- package/templates/layers/auth-jwt/files/src/auth/index.ts +20 -0
- package/templates/layers/auth-jwt/files/src/auth/password.ts +23 -0
- package/templates/layers/auth-jwt/files/src/auth/random.ts +28 -0
- package/templates/layers/auth-jwt/files/src/auth/service.ts +125 -0
- package/templates/layers/auth-jwt/files/src/auth/store.memory.ts +50 -0
- package/templates/layers/auth-jwt/files/src/auth/store.ts +37 -0
- package/templates/layers/auth-jwt/files/src/auth/tests/auth.spec.ts +98 -0
- package/templates/layers/auth-jwt/files/src/auth/tests/auth.test.ts +102 -0
- package/templates/layers/auth-jwt/files/src/auth/tokens.ts +56 -0
- package/templates/layers/auth-jwt/files/tests/auth/test_auth.py +106 -0
- package/templates/layers/auth-oidc/blueprint.yaml +89 -0
- package/templates/layers/auth-oidc/files/dotnet/.env.oidc.example +14 -0
- package/templates/layers/auth-oidc/files/dotnet/docs/auth-oidc.md +73 -0
- package/templates/layers/auth-oidc/files/dotnet/src/__solutionName.pascal__.Api/Auth/OidcAuthenticationExtensions.cs +65 -0
- package/templates/layers/auth-oidc/files/dotnet/src/__solutionName.pascal__.Api/Auth/OidcOptions.cs +25 -0
- package/templates/layers/auth-oidc/files/dotnet/src/__solutionName.pascal__.Api/Auth/ScopeRequirement.cs +29 -0
- package/templates/layers/auth-oidc/files/node/.env.oidc.example +14 -0
- package/templates/layers/auth-oidc/files/node/docs/auth-oidc.md +66 -0
- package/templates/layers/auth-oidc/files/node/src/auth/auth.config.ts +64 -0
- package/templates/layers/auth-oidc/files/node/src/auth/auth.decorators.ts +19 -0
- package/templates/layers/auth-oidc/files/node/src/auth/auth.guard.ts +61 -0
- package/templates/layers/auth-oidc/files/node/src/auth/auth.module.ts +12 -0
- package/templates/layers/auth-oidc/files/node/src/auth/jwt-verifier.ts +97 -0
- package/templates/layers/auth-oidc/files/package.json +6 -0
- package/templates/layers/auth-oidc/files/pyproject.toml +2 -0
- package/templates/layers/auth-oidc/files/python/.env.oidc.example +14 -0
- package/templates/layers/auth-oidc/files/python/app/auth/dependencies.py +69 -0
- package/templates/layers/auth-oidc/files/python/app/auth/settings.py +32 -0
- package/templates/layers/auth-oidc/files/python/app/auth/verifier.py +57 -0
- package/templates/layers/auth-oidc/files/python/docs/auth-oidc.md +57 -0
- package/templates/layers/auth-oidc/files/python/requirements-auth-oidc.txt +4 -0
- package/templates/layers/auth-oidc/files/typescript/.env.oidc.example +21 -0
- package/templates/layers/auth-oidc/files/typescript/docs/auth-oidc.md +69 -0
- package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/callback/route.ts +43 -0
- package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/login/route.ts +40 -0
- package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/logout/route.ts +27 -0
- package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/me/route.ts +12 -0
- package/templates/layers/auth-oidc/files/typescript/src/lib/auth/config.ts +98 -0
- package/templates/layers/auth-oidc/files/typescript/src/lib/auth/guard.ts +23 -0
- package/templates/layers/auth-oidc/files/typescript/src/lib/auth/oidc.ts +19 -0
- package/templates/layers/auth-oidc/files/typescript/src/lib/auth/session.ts +81 -0
- package/templates/layers/cache-redis/blueprint.yaml +186 -0
- package/templates/layers/cache-redis/files/.env.cache.example +29 -0
- package/templates/layers/cache-redis/files/Directory.Packages.props +5 -0
- package/templates/layers/cache-redis/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/cache-redis/files/docker-compose.redis.yml +33 -0
- package/templates/layers/cache-redis/files/docs/cache/redis.md +113 -0
- package/templates/layers/cache-redis/files/go.mod +1 -0
- package/templates/layers/cache-redis/files/internal/cache/cache.go +127 -0
- package/templates/layers/cache-redis/files/internal/cache/cache_test.go +113 -0
- package/templates/layers/cache-redis/files/internal/cache/config.go +110 -0
- package/templates/layers/cache-redis/files/internal/cache/memory.go +124 -0
- package/templates/layers/cache-redis/files/internal/cache/redis.go +108 -0
- package/templates/layers/cache-redis/files/package.json +5 -0
- package/templates/layers/cache-redis/files/pyproject.toml +2 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/CacheKey.cs +44 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/CacheOptions.cs +119 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/CacheStoreFactory.cs +16 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/ICacheStore.cs +37 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/MemoryCacheStore.cs +129 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/RedisCacheStore.cs +139 -0
- package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/__solutionName.dot__.Cache.Redis.csproj +18 -0
- package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/api.py +67 -0
- package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/keys.py +39 -0
- package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/redis_store.py +85 -0
- package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/settings.py +82 -0
- package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/store.py +113 -0
- package/templates/layers/cache-redis/files/src/cache/index.ts +54 -0
- package/templates/layers/cache-redis/files/src/cache/keys.ts +28 -0
- package/templates/layers/cache-redis/files/src/cache/redis.ts +131 -0
- package/templates/layers/cache-redis/files/src/cache/settings.ts +86 -0
- package/templates/layers/cache-redis/files/src/cache/store.ts +98 -0
- package/templates/layers/cache-redis/files/tests/test_cache_redis.py +105 -0
- package/templates/layers/ci-github-actions/blueprint.yaml +174 -0
- package/templates/layers/ci-github-actions/files/.github/actions/dotnet-setup/action.yml +25 -0
- package/templates/layers/ci-github-actions/files/.github/actions/go-setup/action.yml +30 -0
- package/templates/layers/ci-github-actions/files/.github/actions/node-setup/action.yml +58 -0
- package/templates/layers/ci-github-actions/files/.github/actions/python-setup/action.yml +23 -0
- package/templates/layers/ci-github-actions/files/.github/dependabot.yml +13 -0
- package/templates/layers/ci-github-actions/files/.github/scripts/run-package-script.sh +13 -0
- package/templates/layers/ci-github-actions/files/.github/workflows/ci-dotnet.yml +85 -0
- package/templates/layers/ci-github-actions/files/.github/workflows/ci-go.yml +91 -0
- package/templates/layers/ci-github-actions/files/.github/workflows/ci-node.yml +111 -0
- package/templates/layers/ci-github-actions/files/.github/workflows/ci-python.yml +125 -0
- package/templates/layers/ci-github-actions/files/docs/ci-github-actions.md +106 -0
- package/templates/layers/db-core/blueprint.yaml +98 -0
- package/templates/layers/db-core/files/.env.example +18 -0
- package/templates/layers/db-core/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/db-core/files/docs/persistence.md +91 -0
- package/templates/layers/db-core/files/internal/db/config.go +108 -0
- package/templates/layers/db-core/files/internal/db/errors.go +61 -0
- package/templates/layers/db-core/files/internal/db/memory.go +141 -0
- package/templates/layers/db-core/files/internal/db/memory_test.go +195 -0
- package/templates/layers/db-core/files/internal/db/ports.go +76 -0
- package/templates/layers/db-core/files/internal/db/repository.go +134 -0
- package/templates/layers/db-core/files/internal/db/retry.go +30 -0
- package/templates/layers/db-core/files/package.json +5 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/DatabaseException.cs +39 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/DatabaseOptions.cs +65 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/DatabaseRetry.cs +24 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/IRepository.cs +30 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/IUnitOfWork.cs +23 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/InMemory/InMemoryDatabase.cs +188 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/Query.cs +29 -0
- package/templates/layers/db-core/files/src/__solutionName.dot__.Data/__solutionName.dot__.Data.csproj +16 -0
- package/templates/layers/db-core/files/src/__solutionName.snake__/db/api.py +63 -0
- package/templates/layers/db-core/files/src/__solutionName.snake__/db/config.py +79 -0
- package/templates/layers/db-core/files/src/__solutionName.snake__/db/errors.py +47 -0
- package/templates/layers/db-core/files/src/__solutionName.snake__/db/memory.py +143 -0
- package/templates/layers/db-core/files/src/__solutionName.snake__/db/ports.py +80 -0
- package/templates/layers/db-core/files/src/__solutionName.snake__/db/retry.py +25 -0
- package/templates/layers/db-core/files/src/db/config.ts +65 -0
- package/templates/layers/db-core/files/src/db/errors.ts +52 -0
- package/templates/layers/db-core/files/src/db/index.ts +41 -0
- package/templates/layers/db-core/files/src/db/memory.test.ts +107 -0
- package/templates/layers/db-core/files/src/db/memory.ts +182 -0
- package/templates/layers/db-core/files/src/db/ports.ts +58 -0
- package/templates/layers/db-core/files/src/db/retry.ts +20 -0
- package/templates/layers/db-core/files/tests/test_db_core.py +95 -0
- package/templates/layers/db-mongo/blueprint.yaml +157 -0
- package/templates/layers/db-mongo/files/.env.mongo.example +17 -0
- package/templates/layers/db-mongo/files/Directory.Packages.props +7 -0
- package/templates/layers/db-mongo/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/db-mongo/files/docker-compose.mongo.yml +27 -0
- package/templates/layers/db-mongo/files/docs/db-mongo.md +138 -0
- package/templates/layers/db-mongo/files/go.mod +1 -0
- package/templates/layers/db-mongo/files/internal/db/mongodb/client.go +57 -0
- package/templates/layers/db-mongo/files/internal/db/mongodb/config.go +105 -0
- package/templates/layers/db-mongo/files/internal/db/mongodb/indexes.go +42 -0
- package/templates/layers/db-mongo/files/package.json +5 -0
- package/templates/layers/db-mongo/files/pyproject.toml +2 -0
- package/templates/layers/db-mongo/files/requirements-mongo.txt +2 -0
- package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoContext.cs +21 -0
- package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoHealthCheck.cs +28 -0
- package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoIndexes.cs +25 -0
- package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoOptions.cs +23 -0
- package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoServiceCollectionExtensions.cs +31 -0
- package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/__solutionName.dot__.Infrastructure.Mongo.csproj +18 -0
- package/templates/layers/db-mongo/files/src/__solutionName.snake__/db/mongo/client.py +48 -0
- package/templates/layers/db-mongo/files/src/__solutionName.snake__/db/mongo/config.py +66 -0
- package/templates/layers/db-mongo/files/src/__solutionName.snake__/db/mongo/indexes.py +29 -0
- package/templates/layers/db-mongo/files/src/db/mongo/client.rs +37 -0
- package/templates/layers/db-mongo/files/src/db/mongo/client.ts +51 -0
- package/templates/layers/db-mongo/files/src/db/mongo/config.rs +68 -0
- package/templates/layers/db-mongo/files/src/db/mongo/config.ts +58 -0
- package/templates/layers/db-mongo/files/src/db/mongo/index.ts +3 -0
- package/templates/layers/db-mongo/files/src/db/mongo/indexes.rs +26 -0
- package/templates/layers/db-mongo/files/src/db/mongo/indexes.ts +21 -0
- package/templates/layers/db-mongo/files/src/db/mongo/mod.rs +7 -0
- package/templates/layers/db-mongo/files/src/main/java/__solutionName.lower__/db/mongo/MongoClientProvider.java +66 -0
- package/templates/layers/db-mongo/files/src/main/java/__solutionName.lower__/db/mongo/MongoConfig.java +56 -0
- package/templates/layers/db-mongo/files/src/main/java/__solutionName.lower__/db/mongo/MongoIndexes.java +26 -0
- package/templates/layers/db-postgres/blueprint.yaml +130 -0
- package/templates/layers/db-postgres/files/.env.postgres.example +31 -0
- package/templates/layers/db-postgres/files/Directory.Packages.props +5 -0
- package/templates/layers/db-postgres/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/db-postgres/files/docker-compose.postgres.yml +28 -0
- package/templates/layers/db-postgres/files/docs/postgres.md +152 -0
- package/templates/layers/db-postgres/files/go.mod +1 -0
- package/templates/layers/db-postgres/files/internal/db/postgres.go +48 -0
- package/templates/layers/db-postgres/files/internal/db/postgres_config.go +79 -0
- package/templates/layers/db-postgres/files/internal/db/postgres_errors.go +59 -0
- package/templates/layers/db-postgres/files/internal/db/postgres_migrate.go +155 -0
- package/templates/layers/db-postgres/files/migrations/0001_init.sql +9 -0
- package/templates/layers/db-postgres/files/package.json +11 -0
- package/templates/layers/db-postgres/files/pyproject.toml +2 -0
- package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/PostgresErrors.cs +57 -0
- package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/PostgresMigrator.cs +171 -0
- package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/PostgresOptions.cs +92 -0
- package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/__solutionName.dot__.Data.Postgres.csproj +25 -0
- package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres.py +256 -0
- package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres_config.py +81 -0
- package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres_errors.py +48 -0
- package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres_migrate.py +132 -0
- package/templates/layers/db-postgres/files/src/db/postgres/config.ts +86 -0
- package/templates/layers/db-postgres/files/src/db/postgres/database.ts +109 -0
- package/templates/layers/db-postgres/files/src/db/postgres/errors.ts +48 -0
- package/templates/layers/db-postgres/files/src/db/postgres/index.ts +16 -0
- package/templates/layers/db-postgres/files/src/db/postgres/migrate.cli.ts +11 -0
- package/templates/layers/db-postgres/files/src/db/postgres/migrate.ts +134 -0
- package/templates/layers/db-postgres/files/src/db/postgres/repository.ts +159 -0
- package/templates/layers/db-sqlite/blueprint.yaml +147 -0
- package/templates/layers/db-sqlite/files/.env.sqlite.example +20 -0
- package/templates/layers/db-sqlite/files/.gitignore.sqlite +5 -0
- package/templates/layers/db-sqlite/files/Directory.Packages.props +6 -0
- package/templates/layers/db-sqlite/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/db-sqlite/files/docs/db/sqlite.md +91 -0
- package/templates/layers/db-sqlite/files/go.mod +1 -0
- package/templates/layers/db-sqlite/files/internal/db/sqlite/health.go +39 -0
- package/templates/layers/db-sqlite/files/internal/db/sqlite/migrate.go +106 -0
- package/templates/layers/db-sqlite/files/internal/db/sqlite/settings.go +103 -0
- package/templates/layers/db-sqlite/files/internal/db/sqlite/sqlite.go +78 -0
- package/templates/layers/db-sqlite/files/internal/db/sqlite/sqlite_test.go +94 -0
- package/templates/layers/db-sqlite/files/migrations/0001_init.sql +11 -0
- package/templates/layers/db-sqlite/files/package.json +8 -0
- package/templates/layers/db-sqlite/files/pyproject.toml +2 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteConnectionFactory.cs +67 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteHealth.cs +37 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteMigrator.cs +99 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteOptions.cs +81 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/__solutionName.dot__.Persistence.Sqlite.csproj +18 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/connection.py +49 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/health.py +36 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/migrate.py +58 -0
- package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/settings.py +68 -0
- package/templates/layers/db-sqlite/files/src/db/sqlite/cli.ts +38 -0
- package/templates/layers/db-sqlite/files/src/db/sqlite/client.ts +45 -0
- package/templates/layers/db-sqlite/files/src/db/sqlite/health.ts +30 -0
- package/templates/layers/db-sqlite/files/src/db/sqlite/index.ts +8 -0
- package/templates/layers/db-sqlite/files/src/db/sqlite/migrate.ts +51 -0
- package/templates/layers/db-sqlite/files/src/db/sqlite/settings.ts +75 -0
- package/templates/layers/db-sqlite/files/tests/test_db_sqlite.py +50 -0
- package/templates/layers/devcontainer/blueprint.yaml +130 -0
- package/templates/layers/devcontainer/files/.devcontainer/devcontainer.json +61 -0
- package/templates/layers/devcontainer/files/.devcontainer/post-create.sh +29 -0
- package/templates/layers/devcontainer/files/.devcontainer/setup-dotnet.sh +19 -0
- package/templates/layers/devcontainer/files/.devcontainer/setup-go.sh +13 -0
- package/templates/layers/devcontainer/files/.devcontainer/setup-node.sh +29 -0
- package/templates/layers/devcontainer/files/.devcontainer/setup-python.sh +32 -0
- package/templates/layers/devcontainer/files/docs/devcontainer.md +75 -0
- package/templates/layers/docker/blueprint.yaml +168 -0
- package/templates/layers/docker/files/.dockerignore +80 -0
- package/templates/layers/docker/files/.env.docker.example +17 -0
- package/templates/layers/docker/files/Dockerfile.dotnet +38 -0
- package/templates/layers/docker/files/Dockerfile.go +40 -0
- package/templates/layers/docker/files/Dockerfile.nextjs +42 -0
- package/templates/layers/docker/files/Dockerfile.nodejs +46 -0
- package/templates/layers/docker/files/Dockerfile.python +52 -0
- package/templates/layers/docker/files/Dockerfile.spa +30 -0
- package/templates/layers/docker/files/compose.yaml +35 -0
- package/templates/layers/docker/files/docker/nginx.conf +44 -0
- package/templates/layers/docker/files/docs/docker.md +115 -0
- package/templates/layers/docker/files/next.config.ts +11 -0
- package/templates/layers/docker-compose/blueprint.yaml +118 -0
- package/templates/layers/docker-compose/files/.env.compose.example +66 -0
- package/templates/layers/docker-compose/files/compose/cache-none.yml +3 -0
- package/templates/layers/docker-compose/files/compose/cache-redis.yml +28 -0
- package/templates/layers/docker-compose/files/compose/cache-valkey.yml +27 -0
- package/templates/layers/docker-compose/files/compose/db-mongo.yml +27 -0
- package/templates/layers/docker-compose/files/compose/db-mysql.yml +31 -0
- package/templates/layers/docker-compose/files/compose/db-none.yml +4 -0
- package/templates/layers/docker-compose/files/compose/db-postgres.yml +28 -0
- package/templates/layers/docker-compose/files/compose/queue-kafka.yml +35 -0
- package/templates/layers/docker-compose/files/compose/queue-nats.yml +26 -0
- package/templates/layers/docker-compose/files/compose/queue-none.yml +3 -0
- package/templates/layers/docker-compose/files/compose/queue-rabbitmq.yml +27 -0
- package/templates/layers/docker-compose/files/docker-compose.yml +20 -0
- package/templates/layers/docker-compose/files/docs/local-stack.md +135 -0
- package/templates/layers/evals/blueprint.yaml +211 -0
- package/templates/layers/evals/files/.github/workflows/evals-node.yml +55 -0
- package/templates/layers/evals/files/.github/workflows/evals-python.yml +54 -0
- package/templates/layers/evals/files/docs/evals.md +68 -0
- package/templates/layers/evals/files/evals/README.md +73 -0
- package/templates/layers/evals/files/evals/assertions.py +56 -0
- package/templates/layers/evals/files/evals/assertions.ts +66 -0
- package/templates/layers/evals/files/evals/budget.py +55 -0
- package/templates/layers/evals/files/evals/budget.ts +61 -0
- package/templates/layers/evals/files/evals/cli.ts +76 -0
- package/templates/layers/evals/files/evals/config.py +83 -0
- package/templates/layers/evals/files/evals/config.ts +77 -0
- package/templates/layers/evals/files/evals/dataset.py +90 -0
- package/templates/layers/evals/files/evals/dataset.ts +101 -0
- package/templates/layers/evals/files/evals/datasets/case.schema.json +67 -0
- package/templates/layers/evals/files/evals/datasets/golden.jsonl +4 -0
- package/templates/layers/evals/files/evals/run.py +85 -0
- package/templates/layers/evals/files/evals/runner.py +114 -0
- package/templates/layers/evals/files/evals/runner.ts +125 -0
- package/templates/layers/evals/files/evals/target.ts +95 -0
- package/templates/layers/evals/files/evals/targets.py +103 -0
- package/templates/layers/evals/files/evals/tracing.py +49 -0
- package/templates/layers/evals/files/evals/tracing.ts +31 -0
- package/templates/layers/evals/files/evals/tsconfig.json +15 -0
- package/templates/layers/health-checks/blueprint.yaml +170 -0
- package/templates/layers/health-checks/files/.env.health.example +23 -0
- package/templates/layers/health-checks/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/health-checks/files/docs/health-checks.md +200 -0
- package/templates/layers/health-checks/files/internal/health/config.go +96 -0
- package/templates/layers/health-checks/files/internal/health/health.go +113 -0
- package/templates/layers/health-checks/files/internal/health/health_test.go +102 -0
- package/templates/layers/health-checks/files/internal/health/http.go +56 -0
- package/templates/layers/health-checks/files/internal/health/probes.go +88 -0
- package/templates/layers/health-checks/files/internal/health/runner.go +100 -0
- package/templates/layers/health-checks/files/package.json +5 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/DependencyProbeOptions.cs +26 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthEndpointExtensions.cs +34 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthOptions.cs +25 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthProbeResponder.cs +121 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthServiceCollectionExtensions.cs +51 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthTags.cs +10 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HttpDependencyHealthCheck.cs +44 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/TcpDependencyHealthCheck.cs +36 -0
- package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/__solutionName.dot__.Health.csproj +15 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/__init__.py +28 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/models.py +48 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/probes.py +82 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/register.py +15 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/registry.py +24 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/router.py +52 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/runner.py +94 -0
- package/templates/layers/health-checks/files/src/__solutionName.snake__/health/settings.py +33 -0
- package/templates/layers/health-checks/files/src/app/health/live/route.ts +11 -0
- package/templates/layers/health-checks/files/src/app/health/ready/route.ts +10 -0
- package/templates/layers/health-checks/files/src/app/health/startup/route.ts +10 -0
- package/templates/layers/health-checks/files/src/health/__tests__/health.test.ts +66 -0
- package/templates/layers/health-checks/files/src/health/config.ts +62 -0
- package/templates/layers/health-checks/files/src/health/handler.ts +50 -0
- package/templates/layers/health-checks/files/src/health/index.ts +20 -0
- package/templates/layers/health-checks/files/src/health/node/http.ts +26 -0
- package/templates/layers/health-checks/files/src/health/node/tcp.ts +36 -0
- package/templates/layers/health-checks/files/src/health/probes.ts +61 -0
- package/templates/layers/health-checks/files/src/health/register.ts +15 -0
- package/templates/layers/health-checks/files/src/health/registry.ts +27 -0
- package/templates/layers/health-checks/files/src/health/runner.ts +76 -0
- package/templates/layers/health-checks/files/src/health/types.ts +39 -0
- package/templates/layers/health-checks/files/tests/__init__.py +1 -0
- package/templates/layers/health-checks/files/tests/test_health.py +51 -0
- package/templates/layers/lint-format/blueprint.yaml +178 -0
- package/templates/layers/lint-format/files/.editorconfig +87 -0
- package/templates/layers/lint-format/files/.golangci.yml +34 -0
- package/templates/layers/lint-format/files/.prettierignore +20 -0
- package/templates/layers/lint-format/files/.prettierrc.json +11 -0
- package/templates/layers/lint-format/files/docs/lint-format.md +111 -0
- package/templates/layers/lint-format/files/eslint.config.mjs +43 -0
- package/templates/layers/lint-format/files/package.json +9 -0
- package/templates/layers/lint-format/files/ruff.toml +25 -0
- package/templates/layers/observability-otel/blueprint.yaml +212 -0
- package/templates/layers/observability-otel/files/.env.otel.example +30 -0
- package/templates/layers/observability-otel/files/Directory.Packages.props +8 -0
- package/templates/layers/observability-otel/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/observability-otel/files/docker-compose.otel.yml +16 -0
- package/templates/layers/observability-otel/files/docs/observability.md +224 -0
- package/templates/layers/observability-otel/files/go.mod +7 -0
- package/templates/layers/observability-otel/files/internal/telemetry/config.go +122 -0
- package/templates/layers/observability-otel/files/internal/telemetry/http.go +33 -0
- package/templates/layers/observability-otel/files/internal/telemetry/logging.go +84 -0
- package/templates/layers/observability-otel/files/internal/telemetry/provider.go +77 -0
- package/templates/layers/observability-otel/files/otel-collector-config.yaml +47 -0
- package/templates/layers/observability-otel/files/package.json +15 -0
- package/templates/layers/observability-otel/files/pyproject.toml +2 -0
- package/templates/layers/observability-otel/files/src/__solutionName.dot__.Observability/ObservabilityExtensions.cs +81 -0
- package/templates/layers/observability-otel/files/src/__solutionName.dot__.Observability/ObservabilityOptions.cs +37 -0
- package/templates/layers/observability-otel/files/src/__solutionName.dot__.Observability/__solutionName.dot__.Observability.csproj +25 -0
- package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/__init__.py +15 -0
- package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/config.py +99 -0
- package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/log.py +86 -0
- package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/setup.py +124 -0
- package/templates/layers/observability-otel/files/src/instrumentation.ts +9 -0
- package/templates/layers/observability-otel/files/src/otel/config.ts +83 -0
- package/templates/layers/observability-otel/files/src/otel/logger.ts +46 -0
- package/templates/layers/observability-otel/files/src/otel/register.ts +5 -0
- package/templates/layers/observability-otel/files/src/otel/sdk.ts +73 -0
- package/templates/layers/queue-broker/blueprint.yaml +194 -0
- package/templates/layers/queue-broker/files/.env.queue.example +35 -0
- package/templates/layers/queue-broker/files/Directory.Packages.props +7 -0
- package/templates/layers/queue-broker/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/queue-broker/files/cmd/worker/main.go +34 -0
- package/templates/layers/queue-broker/files/docker-compose.queue-rabbitmq.yml +26 -0
- package/templates/layers/queue-broker/files/docker-compose.queue-redis.yml +23 -0
- package/templates/layers/queue-broker/files/docs/queue-asynq.md +71 -0
- package/templates/layers/queue-broker/files/docs/queue-bullmq.md +62 -0
- package/templates/layers/queue-broker/files/docs/queue-celery.md +58 -0
- package/templates/layers/queue-broker/files/docs/queue-masstransit.md +84 -0
- package/templates/layers/queue-broker/files/go.mod +2 -0
- package/templates/layers/queue-broker/files/internal/queue/client.go +57 -0
- package/templates/layers/queue-broker/files/internal/queue/config.go +109 -0
- package/templates/layers/queue-broker/files/internal/queue/config_test.go +38 -0
- package/templates/layers/queue-broker/files/internal/queue/handlers.go +33 -0
- package/templates/layers/queue-broker/files/internal/queue/server.go +29 -0
- package/templates/layers/queue-broker/files/internal/queue/tasks.go +11 -0
- package/templates/layers/queue-broker/files/package.json +6 -0
- package/templates/layers/queue-broker/files/pyproject.toml +2 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/Consumers/WelcomeEmailRequestedConsumer.cs +24 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/Contracts/WelcomeEmailRequested.cs +7 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/IJobPublisher.cs +11 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/JobPublisher.cs +10 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/QueueOptions.cs +32 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/QueueServiceCollectionExtensions.cs +60 -0
- package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/__solutionName.dot__.Queue.csproj +21 -0
- package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/__init__.py +12 -0
- package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/app.py +35 -0
- package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/config.py +90 -0
- package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/producer.py +10 -0
- package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/tasks.py +31 -0
- package/templates/layers/queue-broker/files/src/queue/config.ts +60 -0
- package/templates/layers/queue-broker/files/src/queue/connection.ts +19 -0
- package/templates/layers/queue-broker/files/src/queue/handlers.ts +22 -0
- package/templates/layers/queue-broker/files/src/queue/index.ts +8 -0
- package/templates/layers/queue-broker/files/src/queue/jobs.ts +15 -0
- package/templates/layers/queue-broker/files/src/queue/producer.ts +39 -0
- package/templates/layers/queue-broker/files/src/queue/worker.cli.ts +32 -0
- package/templates/layers/queue-broker/files/src/queue/worker.ts +28 -0
- package/templates/layers/queue-broker/files/tests/test_queue_config.py +37 -0
- package/templates/layers/release-automation/blueprint.yaml +205 -0
- package/templates/layers/release-automation/files/.changeset/README.md +31 -0
- package/templates/layers/release-automation/files/.changeset/config.json +12 -0
- package/templates/layers/release-automation/files/.githooks/commit-msg +32 -0
- package/templates/layers/release-automation/files/.github/workflows/commit-conventions.yml +45 -0
- package/templates/layers/release-automation/files/.github/workflows/release-changesets.yml +68 -0
- package/templates/layers/release-automation/files/.github/workflows/release-dotnet.yml +90 -0
- package/templates/layers/release-automation/files/.github/workflows/release-go.yml +89 -0
- package/templates/layers/release-automation/files/.github/workflows/release-monorepo.yml +40 -0
- package/templates/layers/release-automation/files/.github/workflows/release-node.yml +85 -0
- package/templates/layers/release-automation/files/.github/workflows/release-python.yml +68 -0
- package/templates/layers/release-automation/files/.release-please-manifest.json +3 -0
- package/templates/layers/release-automation/files/docs/release-automation.md +154 -0
- package/templates/layers/release-automation/files/release-please-config.json +22 -0
- package/templates/layers/security-supply-chain/blueprint.yaml +208 -0
- package/templates/layers/security-supply-chain/files/.githooks/pre-commit +17 -0
- package/templates/layers/security-supply-chain/files/.github/dependabot.yml +30 -0
- package/templates/layers/security-supply-chain/files/.github/workflows/codeql.yml +54 -0
- package/templates/layers/security-supply-chain/files/.github/workflows/dependency-review.yml +35 -0
- package/templates/layers/security-supply-chain/files/.github/workflows/sbom.yml +56 -0
- package/templates/layers/security-supply-chain/files/.github/workflows/scorecard.yml +51 -0
- package/templates/layers/security-supply-chain/files/.github/workflows/secret-scan.yml +62 -0
- package/templates/layers/security-supply-chain/files/.gitleaks.toml +42 -0
- package/templates/layers/security-supply-chain/files/SECURITY.md +36 -0
- package/templates/layers/security-supply-chain/files/docs/security-supply-chain.md +124 -0
- package/templates/layers/security-supply-chain/files/npmrc +13 -0
- package/templates/layers/security-supply-chain/files/renovate.json +26 -0
- package/templates/layers/testing-e2e/blueprint.yaml +199 -0
- package/templates/layers/testing-e2e/files/.env.e2e.example +32 -0
- package/templates/layers/testing-e2e/files/Directory.Packages.props +7 -0
- package/templates/layers/testing-e2e/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/testing-e2e/files/docs/testing-e2e.md +106 -0
- package/templates/layers/testing-e2e/files/e2e/api/contract.spec.ts +37 -0
- package/templates/layers/testing-e2e/files/e2e/api/health.spec.ts +29 -0
- package/templates/layers/testing-e2e/files/e2e/browser/app.spec.ts +27 -0
- package/templates/layers/testing-e2e/files/e2e/browser/navigation.spec.ts +26 -0
- package/templates/layers/testing-e2e/files/e2e/config.ts +85 -0
- package/templates/layers/testing-e2e/files/e2e/support.ts +20 -0
- package/templates/layers/testing-e2e/files/package.json +8 -0
- package/templates/layers/testing-e2e/files/playwright.config.ts +44 -0
- package/templates/layers/testing-e2e/files/test/e2e/config.go +71 -0
- package/templates/layers/testing-e2e/files/test/e2e/contract_test.go +65 -0
- package/templates/layers/testing-e2e/files/test/e2e/health_test.go +71 -0
- package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/ApiContractTests.cs +51 -0
- package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/DeploymentFixture.cs +44 -0
- package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/E2eSettings.cs +26 -0
- package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/HealthContractTests.cs +42 -0
- package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/__solutionName.dot__.E2E.csproj +23 -0
- package/templates/layers/testing-e2e/files/tests/e2e/conftest.py +52 -0
- package/templates/layers/testing-e2e/files/tests/e2e/e2e_config.py +47 -0
- package/templates/layers/testing-e2e/files/tests/e2e/test_api_contract.py +35 -0
- package/templates/layers/testing-e2e/files/tests/e2e/test_health_contract.py +28 -0
- package/templates/layers/testing-unit/blueprint.yaml +161 -0
- package/templates/layers/testing-unit/files/.coveragerc +12 -0
- package/templates/layers/testing-unit/files/Directory.Packages.props +9 -0
- package/templates/layers/testing-unit/files/__solutionName.dot__.slnx +5 -0
- package/templates/layers/testing-unit/files/docs/testing.md +90 -0
- package/templates/layers/testing-unit/files/internal/testsupport/clock.go +89 -0
- package/templates/layers/testing-unit/files/internal/testsupport/clock_test.go +132 -0
- package/templates/layers/testing-unit/files/internal/testsupport/recorder.go +41 -0
- package/templates/layers/testing-unit/files/package.json +10 -0
- package/templates/layers/testing-unit/files/pyproject.toml +2 -0
- package/templates/layers/testing-unit/files/pytest.ini +16 -0
- package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/Recorder.cs +66 -0
- package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/RecorderTests.cs +90 -0
- package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/__solutionName.dot__.Tests.csproj +32 -0
- package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/coverlet.runsettings +17 -0
- package/templates/layers/testing-unit/files/tests/conftest.py +17 -0
- package/templates/layers/testing-unit/files/tests/support/clock.ts +81 -0
- package/templates/layers/testing-unit/files/tests/support/index.ts +2 -0
- package/templates/layers/testing-unit/files/tests/support/recorder.ts +21 -0
- package/templates/layers/testing-unit/files/tests/support.py +78 -0
- package/templates/layers/testing-unit/files/tests/support.test.ts +87 -0
- package/templates/layers/testing-unit/files/tests/test_support.py +85 -0
- package/templates/layers/testing-unit/files/vitest.config.ts +52 -0
|
@@ -0,0 +1,3919 @@
|
|
|
1
|
+
# Groundplan consolidated layer plan
|
|
2
|
+
#
|
|
3
|
+
# Generated: 2026-07-19 from the 17 category files in this directory.
|
|
4
|
+
#
|
|
5
|
+
# HOW THIS WAS BUILT
|
|
6
|
+
# ------------------
|
|
7
|
+
# The 313 catalog entries proposed 883 distinct `proposedLayerIds` between them. That number is
|
|
8
|
+
# not a taxonomy, it is a cartesian product: the category researchers wrote one id per
|
|
9
|
+
# (capability x stack x library) combination, so `db-postgres-drizzle`, `db-postgres-prisma`,
|
|
10
|
+
# `db-mysql-drizzle`, `db-sqlserver-kysely` and thirty-one of their siblings are four ids for
|
|
11
|
+
# what are really TWO orthogonal choices - which engine, and which access layer.
|
|
12
|
+
#
|
|
13
|
+
# This plan collapses those 883 ids onto 233 layers by separating the axes and turning each axis
|
|
14
|
+
# into a `choiceSet`. Where the collapse was lossy - where an id encoded a genuine capability
|
|
15
|
+
# rather than a combination - the id survives as its own layer. Every original id is reachable:
|
|
16
|
+
# either it IS a layer here, or it is named in that layer's `absorbs:` list.
|
|
17
|
+
#
|
|
18
|
+
# `absorbs` is therefore the audit trail. If an id from a category YAML does not appear as a
|
|
19
|
+
# layer `id` and does not appear in any `absorbs`, that is a bug in this plan, not a decision.
|
|
20
|
+
#
|
|
21
|
+
# STATUS
|
|
22
|
+
# ------
|
|
23
|
+
# status: built - a directory already exists in templates/layers/. 22 of these.
|
|
24
|
+
# status: proposed - everything else. 211 of these.
|
|
25
|
+
# The built set was read from templates/layers/ on 2026-07-19 and its `requires`/`conflicts`/
|
|
26
|
+
# `provides` were read from each blueprint.yaml, so the edges below for built layers are the
|
|
27
|
+
# real ones, not guesses.
|
|
28
|
+
#
|
|
29
|
+
# TIERS
|
|
30
|
+
# -----
|
|
31
|
+
# foundation - repo scaffolding. Almost every generated repo wants these. No domain opinion.
|
|
32
|
+
# core - the load-bearing choices: runtime, framework, datastore, auth. Mostly choice sets.
|
|
33
|
+
# capability - cross-cutting features layered onto a core. Composable, mostly independent.
|
|
34
|
+
# domain - a business vertical: billing, commerce, CMS, game, data platform.
|
|
35
|
+
# specialist - narrow, high-effort, low-frequency. Build last or never.
|
|
36
|
+
#
|
|
37
|
+
# CHOICE SETS
|
|
38
|
+
# -----------
|
|
39
|
+
# `choiceSet: <name>` means pick-one. Groundplan's CLI must render these as radio groups. Without
|
|
40
|
+
# them a user can select three conflicting databases and only discover the clash at resolve time.
|
|
41
|
+
# Members of a choice set are implicitly mutually exclusive - `conflicts` below lists only
|
|
42
|
+
# CROSS-set conflicts, the ones a pick-one widget cannot prevent.
|
|
43
|
+
#
|
|
44
|
+
# LICENSE
|
|
45
|
+
# -------
|
|
46
|
+
# Every url under `sources:` is `licenseClass: vendorable` in README.md unless the layer carries
|
|
47
|
+
# an explicit `licenseNote`. Reference-only and excluded sources are NEVER listed as a layer
|
|
48
|
+
# source; where such a source is the best prior art, the layer says so in `licenseNote` and is
|
|
49
|
+
# marked `fromScratch: true`. See gaps.md.
|
|
50
|
+
|
|
51
|
+
# UNRESOLVED: DANGLING EDGES IN THE SHIPPED BLUEPRINTS
|
|
52
|
+
# -----------------------------------------------------
|
|
53
|
+
# Four `conflicts` entries in templates/layers/*/blueprint.yaml name layer ids that do not exist
|
|
54
|
+
# in templates/layers/ and do not match any id in this plan. They are reproduced verbatim below
|
|
55
|
+
# rather than silently renamed, because guessing at them would hide a real inconsistency in the
|
|
56
|
+
# shipped set. Each needs a human decision before the resolver can be trusted:
|
|
57
|
+
#
|
|
58
|
+
# lint-format conflicts: hono-api -> probably this plan's `api-hono`.
|
|
59
|
+
# observability-otel conflicts: dotnet-aspire -> probably `infra-dotnet-aspire`.
|
|
60
|
+
# queue-broker conflicts: react-vite-spa -> probably `app-vite-spa`.
|
|
61
|
+
# queue-broker conflicts: turborepo-monorepo -> probably `monorepo-turborepo`.
|
|
62
|
+
#
|
|
63
|
+
# Two of these are also questionable on the merits, not just the naming. `queue-broker conflicts
|
|
64
|
+
# turborepo-monorepo` reads as a guard against adding a worker to a repo with no server, but a
|
|
65
|
+
# turborepo monorepo is precisely where a separate worker app belongs. And `lint-format conflicts
|
|
66
|
+
# hono-api` has no obvious justification at all. Resolve the names first, then re-argue the edges.
|
|
67
|
+
|
|
68
|
+
version: 1
|
|
69
|
+
generated: "2026-07-19"
|
|
70
|
+
generatedFrom: 17 category files, 313 entries, 304 unique repositories
|
|
71
|
+
rawLayerIdsConsolidated: 883
|
|
72
|
+
layerCount: 233
|
|
73
|
+
builtCount: 22
|
|
74
|
+
proposedCount: 211
|
|
75
|
+
|
|
76
|
+
# ---------------------------------------------------------------------------------------------
|
|
77
|
+
choiceSets:
|
|
78
|
+
- id: runtime-language
|
|
79
|
+
prompt: Primary language and runtime
|
|
80
|
+
required: true
|
|
81
|
+
virtual: true
|
|
82
|
+
note: >-
|
|
83
|
+
The root choice, and the only set with no layers of its own - it is a filter, not a
|
|
84
|
+
selection. The CLI should ask it first and hide inapplicable sets rather than offering
|
|
85
|
+
them and rejecting them at resolve time. `virtual: true` marks that no layer declares
|
|
86
|
+
`choiceSet: runtime-language`; a validator must not read that as an empty set.
|
|
87
|
+
- id: backend-framework
|
|
88
|
+
prompt: Backend HTTP framework
|
|
89
|
+
filteredBy: runtime-language
|
|
90
|
+
- id: frontend-framework
|
|
91
|
+
prompt: Frontend framework and router
|
|
92
|
+
filteredBy: runtime-language
|
|
93
|
+
- id: db-engine
|
|
94
|
+
prompt: Primary datastore
|
|
95
|
+
note: The engine only. Which library talks to it is a separate question.
|
|
96
|
+
- id: db-access
|
|
97
|
+
prompt: Database access layer
|
|
98
|
+
filteredBy: [runtime-language, db-engine]
|
|
99
|
+
note: >-
|
|
100
|
+
Orthogonal to db-engine. Drizzle/Prisma/Kysely all speak Postgres, MySQL, SQLite and
|
|
101
|
+
Turso; EF Core and Dapper both speak SQL Server and Postgres. Modelling these as one
|
|
102
|
+
combined choice was the single biggest source of id explosion in the raw catalog.
|
|
103
|
+
- id: migrations
|
|
104
|
+
prompt: Schema migration tool
|
|
105
|
+
filteredBy: db-access
|
|
106
|
+
- id: auth-strategy
|
|
107
|
+
prompt: Authentication strategy
|
|
108
|
+
- id: authz-model
|
|
109
|
+
prompt: Authorization model
|
|
110
|
+
- id: test-runner-unit
|
|
111
|
+
prompt: Unit test runner
|
|
112
|
+
filteredBy: runtime-language
|
|
113
|
+
- id: test-runner-e2e
|
|
114
|
+
prompt: End-to-end test runner
|
|
115
|
+
- id: queue-backend
|
|
116
|
+
prompt: Background job backend
|
|
117
|
+
- id: realtime-transport
|
|
118
|
+
prompt: Realtime transport
|
|
119
|
+
- id: broker
|
|
120
|
+
prompt: Message broker
|
|
121
|
+
- id: payments-provider
|
|
122
|
+
prompt: Payment provider
|
|
123
|
+
- id: cms-backend
|
|
124
|
+
prompt: Content backend
|
|
125
|
+
- id: commerce-backend
|
|
126
|
+
prompt: Commerce backend
|
|
127
|
+
- id: vector-store
|
|
128
|
+
prompt: Vector store
|
|
129
|
+
- id: agent-framework
|
|
130
|
+
prompt: LLM agent framework
|
|
131
|
+
- id: game-renderer
|
|
132
|
+
prompt: 3D renderer or engine
|
|
133
|
+
- id: game-physics
|
|
134
|
+
prompt: Physics engine
|
|
135
|
+
filteredBy: game-renderer
|
|
136
|
+
- id: mobile-desktop-shell
|
|
137
|
+
prompt: Mobile or desktop shell
|
|
138
|
+
- id: data-orchestrator
|
|
139
|
+
prompt: Data pipeline orchestrator
|
|
140
|
+
- id: data-transform
|
|
141
|
+
prompt: Transformation engine
|
|
142
|
+
- id: lint-toolchain
|
|
143
|
+
prompt: Lint and format toolchain
|
|
144
|
+
filteredBy: runtime-language
|
|
145
|
+
- id: obs-backend
|
|
146
|
+
prompt: Observability backend for local development
|
|
147
|
+
- id: iac-tool
|
|
148
|
+
prompt: Infrastructure-as-code tool
|
|
149
|
+
- id: deploy-target
|
|
150
|
+
prompt: Deployment target
|
|
151
|
+
|
|
152
|
+
# ---------------------------------------------------------------------------------------------
|
|
153
|
+
layers:
|
|
154
|
+
|
|
155
|
+
# ===========================================================================================
|
|
156
|
+
# TIER: foundation
|
|
157
|
+
# ===========================================================================================
|
|
158
|
+
|
|
159
|
+
- id: repo-scaffold
|
|
160
|
+
category: foundation
|
|
161
|
+
tier: foundation
|
|
162
|
+
status: proposed
|
|
163
|
+
what: >-
|
|
164
|
+
The empty-repo floor every other layer assumes - README skeleton, LICENSE selection,
|
|
165
|
+
.gitignore per stack, .editorconfig, CODEOWNERS, and the THIRD-PARTY-NOTICES.md file that
|
|
166
|
+
vendored-code attribution is appended to. Nothing here is optional; it is the substrate.
|
|
167
|
+
stacks: [any]
|
|
168
|
+
sources:
|
|
169
|
+
- https://github.com/github/spec-kit
|
|
170
|
+
- https://github.com/devcontainers/templates
|
|
171
|
+
requires: []
|
|
172
|
+
conflicts: []
|
|
173
|
+
absorbs: [config-typed-env, tsconfig-node-web-split]
|
|
174
|
+
note: >-
|
|
175
|
+
THIRD-PARTY-NOTICES.md belongs here rather than in each vendoring layer, so that layers
|
|
176
|
+
append to a file guaranteed to exist. See README.md#attribution.
|
|
177
|
+
|
|
178
|
+
- id: lint-format
|
|
179
|
+
category: foundation
|
|
180
|
+
tier: foundation
|
|
181
|
+
status: built
|
|
182
|
+
what: Lint, format and code-style config with an .editorconfig baseline.
|
|
183
|
+
stacks: [node, python, go, dotnet]
|
|
184
|
+
sources:
|
|
185
|
+
- https://github.com/biomejs/biome
|
|
186
|
+
- https://github.com/oxc-project/oxc
|
|
187
|
+
requires: []
|
|
188
|
+
conflicts: [hono-api]
|
|
189
|
+
provides: [lint, format, code-style, lint-config, editorconfig]
|
|
190
|
+
absorbs: [tooling-eslint-prettier, lint-eslint-flat, lint-very-good-analysis]
|
|
191
|
+
note: >-
|
|
192
|
+
Built. The conflict with hono-api is recorded in the shipped blueprint and is preserved
|
|
193
|
+
here verbatim; it is not a conclusion of this plan.
|
|
194
|
+
|
|
195
|
+
- id: lint-biome
|
|
196
|
+
category: foundation
|
|
197
|
+
tier: foundation
|
|
198
|
+
status: proposed
|
|
199
|
+
choiceSet: lint-toolchain
|
|
200
|
+
what: >-
|
|
201
|
+
Single-binary lint+format for JS/TS replacing the eslint+prettier pair. Borrow biome.json
|
|
202
|
+
and the migration command story.
|
|
203
|
+
stacks: [node, typescript]
|
|
204
|
+
sources:
|
|
205
|
+
- https://github.com/biomejs/biome
|
|
206
|
+
requires: [lint-format]
|
|
207
|
+
conflicts: []
|
|
208
|
+
absorbs: [tooling-biome]
|
|
209
|
+
|
|
210
|
+
- id: lint-oxlint
|
|
211
|
+
category: foundation
|
|
212
|
+
tier: foundation
|
|
213
|
+
status: proposed
|
|
214
|
+
choiceSet: lint-toolchain
|
|
215
|
+
what: Rust-based JS/TS linter for repos that want speed but keep prettier for formatting.
|
|
216
|
+
stacks: [node, typescript]
|
|
217
|
+
sources:
|
|
218
|
+
- https://github.com/oxc-project/oxc
|
|
219
|
+
requires: [lint-format]
|
|
220
|
+
conflicts: []
|
|
221
|
+
absorbs: [lint-oxlint]
|
|
222
|
+
|
|
223
|
+
- id: lint-precommit
|
|
224
|
+
category: foundation
|
|
225
|
+
tier: foundation
|
|
226
|
+
status: proposed
|
|
227
|
+
what: >-
|
|
228
|
+
.pre-commit-config.yaml wiring the language linters plus gitleaks and terraform hooks into
|
|
229
|
+
one local gate. The `stages` split (fast on commit, full on push) is the part worth copying.
|
|
230
|
+
stacks: [any]
|
|
231
|
+
sources:
|
|
232
|
+
- https://github.com/gitleaks/gitleaks
|
|
233
|
+
- https://github.com/antonbabenko/pre-commit-terraform
|
|
234
|
+
requires: [lint-format]
|
|
235
|
+
conflicts: []
|
|
236
|
+
absorbs: [lint-precommit-base, lint-precommit-terraform, security-precommit-hooks]
|
|
237
|
+
|
|
238
|
+
- id: hooks-commit-conventions
|
|
239
|
+
category: foundation
|
|
240
|
+
tier: foundation
|
|
241
|
+
status: proposed
|
|
242
|
+
what: husky + commitlint + lint-staged enforcing conventional commits at the client side.
|
|
243
|
+
stacks: [node]
|
|
244
|
+
sources:
|
|
245
|
+
- https://github.com/ixartz/Next-js-Boilerplate
|
|
246
|
+
- https://github.com/Blazity/next-enterprise
|
|
247
|
+
requires: [lint-format]
|
|
248
|
+
conflicts: []
|
|
249
|
+
absorbs: [hooks-husky-commitlint, tooling-husky-commitlint]
|
|
250
|
+
|
|
251
|
+
- id: docker
|
|
252
|
+
category: foundation
|
|
253
|
+
tier: foundation
|
|
254
|
+
status: built
|
|
255
|
+
what: Multi-stage Dockerfile with a non-root user and cached dependency layers.
|
|
256
|
+
stacks: [any]
|
|
257
|
+
sources:
|
|
258
|
+
- https://github.com/nickjj/docker-rails-example
|
|
259
|
+
- https://github.com/docker/awesome-compose
|
|
260
|
+
requires: []
|
|
261
|
+
conflicts: []
|
|
262
|
+
provides: [container-image, dockerfile, docker-compose, containerization]
|
|
263
|
+
absorbs: [container-docker-multistage, container-nonroot-user, deploy-docker]
|
|
264
|
+
|
|
265
|
+
- id: docker-compose
|
|
266
|
+
category: foundation
|
|
267
|
+
tier: foundation
|
|
268
|
+
status: built
|
|
269
|
+
what: Local service stack - app plus its backing services - with healthchecks and profiles.
|
|
270
|
+
stacks: [any]
|
|
271
|
+
sources:
|
|
272
|
+
- https://github.com/docker/awesome-compose
|
|
273
|
+
- https://github.com/nickjj/docker-rails-example
|
|
274
|
+
requires: []
|
|
275
|
+
conflicts: []
|
|
276
|
+
provides: [local-stack, container-runtime, dev-services, compose-network]
|
|
277
|
+
absorbs:
|
|
278
|
+
[compose-local-dev, compose-postgres, compose-mysql, compose-nginx-proxy,
|
|
279
|
+
infra-docker-compose, dev-docker-compose-postgres, deploy-docker-compose,
|
|
280
|
+
db-postgres-docker-compose, docker-compose-vector, testing-compose-fixtures]
|
|
281
|
+
licenseNote: >-
|
|
282
|
+
awesome-compose is CC0-1.0 - zero attribution burden, the cheapest source in the catalog.
|
|
283
|
+
But its stacks are demos: plaintext DB passwords inline, no restart policy, no resource
|
|
284
|
+
limits. Never emit one without replacing credentials and adding healthcheck/restart.
|
|
285
|
+
|
|
286
|
+
- id: devcontainer
|
|
287
|
+
category: foundation
|
|
288
|
+
tier: foundation
|
|
289
|
+
status: built
|
|
290
|
+
what: devcontainer.json plus editor settings for a reproducible containerised dev environment.
|
|
291
|
+
stacks: [any]
|
|
292
|
+
sources:
|
|
293
|
+
- https://github.com/devcontainers/templates
|
|
294
|
+
- https://github.com/devcontainers/features
|
|
295
|
+
requires: []
|
|
296
|
+
conflicts: []
|
|
297
|
+
provides: [devcontainer, dev-environment, containerized-dev, docker-in-dev, editor-settings]
|
|
298
|
+
absorbs:
|
|
299
|
+
[devcontainer-base, devcontainer-node, devcontainer-python, devcontainer-go,
|
|
300
|
+
devcontainer-features, devcontainer-docker-in-docker]
|
|
301
|
+
note: >-
|
|
302
|
+
devcontainers/features is the single best real-world model of a composable layer system.
|
|
303
|
+
The feature.json + install.sh pairing and the `installsAfter` dependency ordering map
|
|
304
|
+
almost one-to-one onto Groundplan's own layer model - borrow the concept, not the OCI
|
|
305
|
+
packaging assumption.
|
|
306
|
+
|
|
307
|
+
- id: nix-devshell
|
|
308
|
+
category: foundation
|
|
309
|
+
tier: specialist
|
|
310
|
+
status: proposed
|
|
311
|
+
what: flake.nix / devenv.nix pinning the whole toolchain, for teams already on Nix.
|
|
312
|
+
stacks: [any]
|
|
313
|
+
sources: []
|
|
314
|
+
requires: []
|
|
315
|
+
conflicts: [devcontainer]
|
|
316
|
+
absorbs: [nix-flake-base, nix-devenv, devenv-services-postgres]
|
|
317
|
+
fromScratch: true
|
|
318
|
+
licenseNote: >-
|
|
319
|
+
the-nix-way/dev-templates is MPL-2.0 - REFERENCE-ONLY, no files may be copied. A naive
|
|
320
|
+
matcher reads MPL as AGPL because the Secondary License clause names the Affero GPL;
|
|
321
|
+
it is neither. Read it, then author the flake fresh.
|
|
322
|
+
|
|
323
|
+
- id: task-runner
|
|
324
|
+
category: foundation
|
|
325
|
+
tier: foundation
|
|
326
|
+
status: proposed
|
|
327
|
+
what: >-
|
|
328
|
+
A plain shell file of named functions (`./run test`, `./run lint`) replacing a Makefile.
|
|
329
|
+
Works identically on host and inside the container, which a Makefile does not.
|
|
330
|
+
stacks: [any]
|
|
331
|
+
sources:
|
|
332
|
+
- https://github.com/nickjj/docker-rails-example
|
|
333
|
+
requires: []
|
|
334
|
+
conflicts: []
|
|
335
|
+
absorbs: [task-runner-shell]
|
|
336
|
+
|
|
337
|
+
- id: ci-github-actions
|
|
338
|
+
category: foundation
|
|
339
|
+
tier: foundation
|
|
340
|
+
status: built
|
|
341
|
+
what: >-
|
|
342
|
+
Build/test/lint/typecheck pipeline with dependency caching and required-checks wiring.
|
|
343
|
+
stacks: [any]
|
|
344
|
+
sources:
|
|
345
|
+
- https://github.com/nickjj/docker-rails-example
|
|
346
|
+
- https://github.com/step-security/harden-runner
|
|
347
|
+
- https://github.com/ixartz/Next-js-Boilerplate
|
|
348
|
+
requires: []
|
|
349
|
+
conflicts: []
|
|
350
|
+
provides:
|
|
351
|
+
[ci, ci-pipeline, build-pipeline, test-pipeline, lint-pipeline, typecheck-pipeline,
|
|
352
|
+
dependency-caching, required-checks, github-actions]
|
|
353
|
+
absorbs:
|
|
354
|
+
[ci-matrix-node, ci-matrix-python, ci-reusable-workflow, ci-coverage-report,
|
|
355
|
+
deploy-github-actions, ci-github-actions-release]
|
|
356
|
+
portability: github-actions-only
|
|
357
|
+
|
|
358
|
+
- id: ci-container-publish
|
|
359
|
+
category: foundation
|
|
360
|
+
tier: foundation
|
|
361
|
+
status: proposed
|
|
362
|
+
what: >-
|
|
363
|
+
Multi-arch image build and push to GHCR with buildx, layer caching, and digest-pinned
|
|
364
|
+
base images.
|
|
365
|
+
stacks: [any]
|
|
366
|
+
sources:
|
|
367
|
+
- https://github.com/nickjj/docker-rails-example
|
|
368
|
+
requires: [ci-github-actions, docker]
|
|
369
|
+
conflicts: []
|
|
370
|
+
absorbs: [ci-docker-publish, ci-release-multiarch]
|
|
371
|
+
portability: github-actions-only
|
|
372
|
+
|
|
373
|
+
- id: ci-test-sharding
|
|
374
|
+
category: foundation
|
|
375
|
+
tier: capability
|
|
376
|
+
status: proposed
|
|
377
|
+
what: >-
|
|
378
|
+
Matrix sharding for suites that have outgrown a single runner, plus the merge-reports step
|
|
379
|
+
that makes sharded runs produce one coverage artifact instead of N.
|
|
380
|
+
stacks: [node, python, dotnet]
|
|
381
|
+
sources:
|
|
382
|
+
- https://github.com/microsoft/playwright
|
|
383
|
+
- https://github.com/vitest-dev/vitest
|
|
384
|
+
requires: [ci-github-actions]
|
|
385
|
+
conflicts: []
|
|
386
|
+
absorbs: [ci-test-sharding, testing-incremental-analysis, testing-monorepo-projects]
|
|
387
|
+
|
|
388
|
+
- id: release-automation
|
|
389
|
+
category: foundation
|
|
390
|
+
tier: foundation
|
|
391
|
+
status: built
|
|
392
|
+
what: >-
|
|
393
|
+
Conventional commits to changelog to semver tag to GitHub release to package publish,
|
|
394
|
+
with trusted publishing rather than long-lived tokens.
|
|
395
|
+
stacks: [any]
|
|
396
|
+
sources:
|
|
397
|
+
- https://github.com/goreleaser/goreleaser
|
|
398
|
+
requires: []
|
|
399
|
+
conflicts: []
|
|
400
|
+
provides:
|
|
401
|
+
[release-automation, conventional-commits, commit-lint, changelog, semantic-versioning,
|
|
402
|
+
version-tags, github-release, package-publish, trusted-publishing]
|
|
403
|
+
absorbs: [release-changelog, release-semantic-release, release-goreleaser]
|
|
404
|
+
|
|
405
|
+
- id: monorepo-turborepo
|
|
406
|
+
category: foundation
|
|
407
|
+
tier: foundation
|
|
408
|
+
status: proposed
|
|
409
|
+
what: >-
|
|
410
|
+
turbo.json task graph with remote caching, plus the packages/* + apps/* split and the
|
|
411
|
+
import-boundary lint rule that stops the split decaying into a shared-everything blob.
|
|
412
|
+
stacks: [node, typescript]
|
|
413
|
+
sources:
|
|
414
|
+
- https://github.com/vercel/turborepo
|
|
415
|
+
- https://github.com/alan2207/bulletproof-react
|
|
416
|
+
requires: [repo-scaffold]
|
|
417
|
+
conflicts: []
|
|
418
|
+
absorbs: [tooling-turborepo, lint-import-boundaries, arch-feature-sliced]
|
|
419
|
+
|
|
420
|
+
- id: env-typed-config
|
|
421
|
+
category: foundation
|
|
422
|
+
tier: foundation
|
|
423
|
+
status: proposed
|
|
424
|
+
what: >-
|
|
425
|
+
Zod/pydantic-validated environment schema that fails at boot rather than at first use,
|
|
426
|
+
with the server/client split enforced at the type level. Directly implements this repo's
|
|
427
|
+
no-static-values rule - config is read here, once, and nowhere else.
|
|
428
|
+
stacks: [node, typescript, python]
|
|
429
|
+
sources:
|
|
430
|
+
- https://github.com/t3-oss/create-t3-app
|
|
431
|
+
- https://github.com/ixartz/Next-js-Boilerplate
|
|
432
|
+
requires: [repo-scaffold]
|
|
433
|
+
conflicts: []
|
|
434
|
+
absorbs: [tooling-t3-env, config-typed-env, config-env-zod-typed, config-env-tiered]
|
|
435
|
+
|
|
436
|
+
# ===========================================================================================
|
|
437
|
+
# TIER: core - backend
|
|
438
|
+
# ===========================================================================================
|
|
439
|
+
|
|
440
|
+
- id: api-fastapi
|
|
441
|
+
category: backend-api
|
|
442
|
+
tier: core
|
|
443
|
+
status: proposed
|
|
444
|
+
choiceSet: backend-framework
|
|
445
|
+
what: >-
|
|
446
|
+
FastAPI app with routers, dependency-injected sessions, pydantic settings and generated
|
|
447
|
+
OpenAPI. full-stack-fastapi-template is the reference repo layout; minimal-fastapi-postgres
|
|
448
|
+
is the strip-down.
|
|
449
|
+
stacks: [python]
|
|
450
|
+
sources:
|
|
451
|
+
- https://github.com/fastapi/fastapi
|
|
452
|
+
- https://github.com/fastapi/full-stack-fastapi-template
|
|
453
|
+
- https://github.com/rafsaf/minimal-fastapi-postgres-template
|
|
454
|
+
requires: [repo-scaffold]
|
|
455
|
+
conflicts: []
|
|
456
|
+
absorbs: [api-fastapi, db-session-dependency-fastapi, validation-pydantic, auth-oauth2-password]
|
|
457
|
+
|
|
458
|
+
- id: api-litestar
|
|
459
|
+
category: backend-api
|
|
460
|
+
tier: core
|
|
461
|
+
status: proposed
|
|
462
|
+
choiceSet: backend-framework
|
|
463
|
+
what: Litestar app - the ASGI alternative with first-class DI and msgspec serialisation.
|
|
464
|
+
stacks: [python]
|
|
465
|
+
sources:
|
|
466
|
+
- https://github.com/litestar-org/litestar
|
|
467
|
+
requires: [repo-scaffold]
|
|
468
|
+
conflicts: []
|
|
469
|
+
absorbs: [api-litestar]
|
|
470
|
+
|
|
471
|
+
- id: api-express
|
|
472
|
+
category: backend-api
|
|
473
|
+
tier: core
|
|
474
|
+
status: proposed
|
|
475
|
+
choiceSet: backend-framework
|
|
476
|
+
what: Express app with router modules, error middleware and a hardened helmet baseline.
|
|
477
|
+
stacks: [node]
|
|
478
|
+
sources:
|
|
479
|
+
- https://github.com/expressjs/express
|
|
480
|
+
- https://github.com/helmetjs/helmet
|
|
481
|
+
requires: [repo-scaffold]
|
|
482
|
+
conflicts: []
|
|
483
|
+
absorbs: [api-express, backend-express-hardening, server-node-express, build-tsx-watch]
|
|
484
|
+
|
|
485
|
+
- id: api-hono
|
|
486
|
+
category: backend-api
|
|
487
|
+
tier: core
|
|
488
|
+
status: proposed
|
|
489
|
+
choiceSet: backend-framework
|
|
490
|
+
what: >-
|
|
491
|
+
Hono app that runs unchanged on Node, Bun, Deno and Workers - the best pick when the
|
|
492
|
+
deploy target is not yet decided.
|
|
493
|
+
stacks: [node, edge, bun, deno]
|
|
494
|
+
sources:
|
|
495
|
+
- https://github.com/honojs/hono
|
|
496
|
+
requires: [repo-scaffold]
|
|
497
|
+
conflicts: []
|
|
498
|
+
absorbs: [api-hono]
|
|
499
|
+
note: >-
|
|
500
|
+
The shipped lint-format blueprint records a conflict with `hono-api`. If that id is this
|
|
501
|
+
layer under an older name, the conflict must be reconciled before either is used.
|
|
502
|
+
|
|
503
|
+
- id: api-nestjs
|
|
504
|
+
category: backend-api
|
|
505
|
+
tier: core
|
|
506
|
+
status: proposed
|
|
507
|
+
choiceSet: backend-framework
|
|
508
|
+
what: >-
|
|
509
|
+
NestJS modular app - module/provider/controller triad, class-validator DTOs, and the
|
|
510
|
+
brocoders boilerplate's swappable persistence layer.
|
|
511
|
+
stacks: [node, typescript]
|
|
512
|
+
sources:
|
|
513
|
+
- https://github.com/nestjs/nest
|
|
514
|
+
- https://github.com/brocoders/nestjs-boilerplate
|
|
515
|
+
requires: [repo-scaffold]
|
|
516
|
+
conflicts: []
|
|
517
|
+
absorbs: [api-nestjs, validation-class-validator, orm-repository-port-pattern, db-dual-persistence-hexagonal]
|
|
518
|
+
|
|
519
|
+
- id: api-go-http
|
|
520
|
+
category: backend-api
|
|
521
|
+
tier: core
|
|
522
|
+
status: proposed
|
|
523
|
+
choiceSet: backend-framework
|
|
524
|
+
what: >-
|
|
525
|
+
Go HTTP service in the clean-architecture layout - entity/usecase/adapter split, explicit
|
|
526
|
+
wiring, no framework magic. Gin and Fiber variants share the layout.
|
|
527
|
+
stacks: [go]
|
|
528
|
+
sources:
|
|
529
|
+
- https://github.com/evrone/go-clean-template
|
|
530
|
+
- https://github.com/amitshekhariitbhu/go-backend-clean-architecture
|
|
531
|
+
- https://github.com/goravel/goravel
|
|
532
|
+
requires: [repo-scaffold]
|
|
533
|
+
conflicts: []
|
|
534
|
+
absorbs: [api-go-gin, api-go-fiber, api-go-goravel, db-migrations-golang-migrate, db-migrations-goravel]
|
|
535
|
+
|
|
536
|
+
- id: api-dotnet
|
|
537
|
+
category: backend-api
|
|
538
|
+
tier: core
|
|
539
|
+
status: proposed
|
|
540
|
+
choiceSet: backend-framework
|
|
541
|
+
what: >-
|
|
542
|
+
ASP.NET Core Web API or Minimal API in the clean-architecture layout, with
|
|
543
|
+
FluentValidation and the MediatR request pipeline.
|
|
544
|
+
stacks: [dotnet]
|
|
545
|
+
sources:
|
|
546
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
547
|
+
- https://github.com/ardalis/CleanArchitecture
|
|
548
|
+
- https://github.com/dotnet/eShop
|
|
549
|
+
requires: [repo-scaffold]
|
|
550
|
+
conflicts: []
|
|
551
|
+
absorbs: [api-dotnet-webapi, api-dotnet-minimal, validation-fluentvalidation, cqrs-mediatr]
|
|
552
|
+
|
|
553
|
+
- id: arch-clean-architecture
|
|
554
|
+
category: backend-api
|
|
555
|
+
tier: capability
|
|
556
|
+
status: proposed
|
|
557
|
+
what: >-
|
|
558
|
+
The dependency-inversion project layout applied to whichever backend framework was chosen -
|
|
559
|
+
domain has no outward references, infrastructure depends inward, and an architecture test
|
|
560
|
+
fails the build when that is violated. The enforcement test is the borrowable part; the
|
|
561
|
+
folder names are not.
|
|
562
|
+
stacks: [dotnet, go, node, python]
|
|
563
|
+
sources:
|
|
564
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
565
|
+
- https://github.com/ardalis/CleanArchitecture
|
|
566
|
+
- https://github.com/evrone/go-clean-template
|
|
567
|
+
- https://github.com/alan2207/bulletproof-react
|
|
568
|
+
requires: []
|
|
569
|
+
conflicts: []
|
|
570
|
+
absorbs: [arch-clean-architecture, arch-ddd-aggregates, arch-microservices]
|
|
571
|
+
|
|
572
|
+
- id: api-openapi
|
|
573
|
+
category: backend-api
|
|
574
|
+
tier: capability
|
|
575
|
+
status: proposed
|
|
576
|
+
what: >-
|
|
577
|
+
Generated OpenAPI document, served docs UI, and the CI job that diffs the spec against the
|
|
578
|
+
previous commit so a breaking change fails review rather than production.
|
|
579
|
+
stacks: [python, node, go, dotnet]
|
|
580
|
+
sources:
|
|
581
|
+
- https://github.com/fastapi/fastapi
|
|
582
|
+
- https://github.com/honojs/hono
|
|
583
|
+
- https://github.com/litestar-org/litestar
|
|
584
|
+
- https://github.com/schemathesis/schemathesis
|
|
585
|
+
requires: []
|
|
586
|
+
conflicts: []
|
|
587
|
+
absorbs: [api-openapi-swagger, ci-api-conformance, testing-contract-openapi-schemathesis]
|
|
588
|
+
|
|
589
|
+
- id: api-versioning
|
|
590
|
+
category: backend-api
|
|
591
|
+
tier: capability
|
|
592
|
+
status: built
|
|
593
|
+
what: >-
|
|
594
|
+
Version negotiation, deprecation and sunset headers, contract snapshots and a
|
|
595
|
+
compatibility check.
|
|
596
|
+
stacks: [any]
|
|
597
|
+
sources:
|
|
598
|
+
- https://github.com/fastapi/fastapi
|
|
599
|
+
requires: []
|
|
600
|
+
conflicts: []
|
|
601
|
+
provides:
|
|
602
|
+
[api-versioning, version-negotiation, version-policy, deprecation-headers, sunset-headers,
|
|
603
|
+
contract-snapshots, contract-compatibility, api-version-config]
|
|
604
|
+
|
|
605
|
+
- id: api-graphql
|
|
606
|
+
category: backend-api
|
|
607
|
+
tier: capability
|
|
608
|
+
status: proposed
|
|
609
|
+
what: >-
|
|
610
|
+
Schema-first GraphQL server with generated resolvers and typed client artifacts. Saleor is
|
|
611
|
+
the reference for a large schema; Keystone for schema-from-model generation.
|
|
612
|
+
stacks: [node, python]
|
|
613
|
+
sources:
|
|
614
|
+
- https://github.com/keystonejs/keystone
|
|
615
|
+
- https://github.com/saleor/saleor
|
|
616
|
+
- https://github.com/nestjs/nest
|
|
617
|
+
requires: []
|
|
618
|
+
conflicts: [api-trpc]
|
|
619
|
+
absorbs: [api-graphql, api-graphql-server, api-graphql-schema-first, state-apollo-client]
|
|
620
|
+
|
|
621
|
+
- id: api-trpc
|
|
622
|
+
category: backend-api
|
|
623
|
+
tier: capability
|
|
624
|
+
status: proposed
|
|
625
|
+
what: >-
|
|
626
|
+
End-to-end typed RPC without codegen, for the case where client and server are the same
|
|
627
|
+
TypeScript repo. Loses its entire advantage the moment a non-TS consumer appears.
|
|
628
|
+
stacks: [typescript]
|
|
629
|
+
sources:
|
|
630
|
+
- https://github.com/t3-oss/create-t3-app
|
|
631
|
+
- https://github.com/calcom/cal.diy
|
|
632
|
+
requires: [monorepo-turborepo]
|
|
633
|
+
conflicts: [api-graphql]
|
|
634
|
+
absorbs: [api-trpc, api-server-functions]
|
|
635
|
+
|
|
636
|
+
- id: api-grpc
|
|
637
|
+
category: backend-api
|
|
638
|
+
tier: specialist
|
|
639
|
+
status: proposed
|
|
640
|
+
what: proto definitions, generated stubs, and the buf lint/breaking-change CI gate.
|
|
641
|
+
stacks: [go, dotnet]
|
|
642
|
+
sources:
|
|
643
|
+
- https://github.com/evrone/go-clean-template
|
|
644
|
+
- https://github.com/dotnet/eShop
|
|
645
|
+
requires: []
|
|
646
|
+
conflicts: []
|
|
647
|
+
absorbs: [api-grpc, service-rpc-request-reply]
|
|
648
|
+
|
|
649
|
+
- id: resilience-policies
|
|
650
|
+
category: backend-api
|
|
651
|
+
tier: capability
|
|
652
|
+
status: proposed
|
|
653
|
+
what: >-
|
|
654
|
+
Retry with jitter, circuit breaker, timeout and bulkhead as declared policy rather than
|
|
655
|
+
hand-rolled try/catch. Polly's pipeline builder is the clearest expression of the shape.
|
|
656
|
+
stacks: [dotnet, node, go, python]
|
|
657
|
+
sources:
|
|
658
|
+
- https://github.com/App-vNext/Polly
|
|
659
|
+
requires: []
|
|
660
|
+
conflicts: []
|
|
661
|
+
absorbs: [resilience-polly]
|
|
662
|
+
|
|
663
|
+
# ===========================================================================================
|
|
664
|
+
# TIER: core - frontend
|
|
665
|
+
# ===========================================================================================
|
|
666
|
+
|
|
667
|
+
- id: app-nextjs
|
|
668
|
+
category: frontend-ui
|
|
669
|
+
tier: core
|
|
670
|
+
status: proposed
|
|
671
|
+
choiceSet: frontend-framework
|
|
672
|
+
what: >-
|
|
673
|
+
Next.js App Router application - route groups, server components, server actions, metadata
|
|
674
|
+
API. next-enterprise and Next-js-Boilerplate are the two most complete opinionated bases.
|
|
675
|
+
stacks: [node, react, typescript]
|
|
676
|
+
sources:
|
|
677
|
+
- https://github.com/Blazity/next-enterprise
|
|
678
|
+
- https://github.com/ixartz/Next-js-Boilerplate
|
|
679
|
+
- https://github.com/Skolaczk/next-starter
|
|
680
|
+
- https://github.com/vercel/next.js
|
|
681
|
+
requires: [repo-scaffold]
|
|
682
|
+
conflicts: []
|
|
683
|
+
absorbs: [framework-nextjs-app-router, app-next-app-router, build-nextjs, forms-server-actions]
|
|
684
|
+
|
|
685
|
+
- id: app-nextjs-pages
|
|
686
|
+
category: frontend-ui
|
|
687
|
+
tier: specialist
|
|
688
|
+
status: proposed
|
|
689
|
+
choiceSet: frontend-framework
|
|
690
|
+
what: Next.js Pages Router, for brownfield repos that cannot migrate yet.
|
|
691
|
+
stacks: [node, react]
|
|
692
|
+
sources:
|
|
693
|
+
- https://github.com/nextacular/nextacular
|
|
694
|
+
requires: [repo-scaffold]
|
|
695
|
+
conflicts: []
|
|
696
|
+
absorbs: [framework-nextjs-pages-router]
|
|
697
|
+
|
|
698
|
+
- id: app-react-router
|
|
699
|
+
category: frontend-ui
|
|
700
|
+
tier: core
|
|
701
|
+
status: proposed
|
|
702
|
+
choiceSet: frontend-framework
|
|
703
|
+
what: React Router v7 framework mode - loaders, actions, and the epic-stack conventions.
|
|
704
|
+
stacks: [node, react, typescript]
|
|
705
|
+
sources:
|
|
706
|
+
- https://github.com/epicweb-dev/epic-stack
|
|
707
|
+
- https://github.com/remix-run/react-router
|
|
708
|
+
requires: [repo-scaffold]
|
|
709
|
+
conflicts: []
|
|
710
|
+
absorbs: [framework-react-router-7, framework-react-router-v7]
|
|
711
|
+
|
|
712
|
+
- id: app-tanstack-start
|
|
713
|
+
category: frontend-ui
|
|
714
|
+
tier: core
|
|
715
|
+
status: proposed
|
|
716
|
+
choiceSet: frontend-framework
|
|
717
|
+
what: TanStack Start with typed file routing and server functions.
|
|
718
|
+
stacks: [node, react, typescript]
|
|
719
|
+
sources:
|
|
720
|
+
- https://github.com/dotnize/react-tanstarter
|
|
721
|
+
- https://github.com/CarlosZiegler/fullstack-start-template
|
|
722
|
+
requires: [repo-scaffold]
|
|
723
|
+
conflicts: []
|
|
724
|
+
absorbs: [framework-tanstack-start]
|
|
725
|
+
|
|
726
|
+
- id: app-vite-spa
|
|
727
|
+
category: frontend-ui
|
|
728
|
+
tier: core
|
|
729
|
+
status: proposed
|
|
730
|
+
choiceSet: frontend-framework
|
|
731
|
+
what: >-
|
|
732
|
+
Vite + React SPA with the bulletproof-react feature-folder layout and import boundaries.
|
|
733
|
+
The right default when there is no server-rendering requirement.
|
|
734
|
+
stacks: [node, react, typescript]
|
|
735
|
+
sources:
|
|
736
|
+
- https://github.com/alan2207/bulletproof-react
|
|
737
|
+
- https://github.com/vitejs/vite
|
|
738
|
+
requires: [repo-scaffold]
|
|
739
|
+
conflicts: []
|
|
740
|
+
absorbs: [app-vite-spa, build-vite, build-vite-ts]
|
|
741
|
+
|
|
742
|
+
- id: ui-shadcn
|
|
743
|
+
category: frontend-ui
|
|
744
|
+
tier: core
|
|
745
|
+
status: proposed
|
|
746
|
+
what: >-
|
|
747
|
+
shadcn/ui copy-in component set over Radix primitives and Tailwind, with components.json
|
|
748
|
+
and the CLI's registry format. The registry format itself is the most valuable artifact
|
|
749
|
+
here - it is a working model of "distribute source, not a dependency", which is exactly
|
|
750
|
+
Groundplan's own thesis.
|
|
751
|
+
stacks: [react, tailwind]
|
|
752
|
+
sources:
|
|
753
|
+
- https://github.com/shadcn-ui/ui
|
|
754
|
+
- https://github.com/radix-ui/primitives
|
|
755
|
+
- https://github.com/satnaing/shadcn-admin
|
|
756
|
+
requires: [styling-tailwind]
|
|
757
|
+
conflicts: [ui-ant-design]
|
|
758
|
+
absorbs:
|
|
759
|
+
[ui-shadcn, ui-shadcn-tailwind, ui-radix-primitives, ui-headless-primitives, ui-base-ui,
|
|
760
|
+
component-registry-cli, icons-lucide]
|
|
761
|
+
|
|
762
|
+
- id: ui-ant-design
|
|
763
|
+
category: frontend-ui
|
|
764
|
+
tier: specialist
|
|
765
|
+
status: proposed
|
|
766
|
+
what: Ant Design component library for dense internal/admin tooling.
|
|
767
|
+
stacks: [react]
|
|
768
|
+
sources:
|
|
769
|
+
- https://github.com/ant-design/ant-design
|
|
770
|
+
requires: []
|
|
771
|
+
conflicts: [ui-shadcn]
|
|
772
|
+
absorbs: [ui-ant-design]
|
|
773
|
+
|
|
774
|
+
- id: styling-tailwind
|
|
775
|
+
category: frontend-ui
|
|
776
|
+
tier: core
|
|
777
|
+
status: proposed
|
|
778
|
+
what: Tailwind config, CSS-variable theme tokens, and the dark-mode strategy.
|
|
779
|
+
stacks: [react, vue, svelte]
|
|
780
|
+
sources:
|
|
781
|
+
- https://github.com/tailwindlabs/tailwindcss
|
|
782
|
+
- https://github.com/shadcn-ui/ui
|
|
783
|
+
requires: []
|
|
784
|
+
conflicts: []
|
|
785
|
+
absorbs: [styling-tailwind, ui-tailwind, theming-css-variables, theming-dark-mode, design-system-docs]
|
|
786
|
+
|
|
787
|
+
- id: state-client
|
|
788
|
+
category: frontend-ui
|
|
789
|
+
tier: capability
|
|
790
|
+
status: proposed
|
|
791
|
+
what: >-
|
|
792
|
+
Zustand store slices plus nuqs URL state, with the boundary rule that makes them coexist:
|
|
793
|
+
anything a user should be able to link to lives in the URL, everything else in the store.
|
|
794
|
+
stacks: [react]
|
|
795
|
+
sources:
|
|
796
|
+
- https://github.com/pmndrs/zustand
|
|
797
|
+
- https://github.com/47ng/nuqs
|
|
798
|
+
requires: []
|
|
799
|
+
conflicts: []
|
|
800
|
+
absorbs: [state-zustand, url-state-nuqs]
|
|
801
|
+
|
|
802
|
+
- id: data-fetching-tanstack-query
|
|
803
|
+
category: frontend-ui
|
|
804
|
+
tier: capability
|
|
805
|
+
status: proposed
|
|
806
|
+
what: >-
|
|
807
|
+
TanStack Query client with the query-key factory convention, suspense boundaries, and
|
|
808
|
+
optimistic-update patterns.
|
|
809
|
+
stacks: [react]
|
|
810
|
+
sources:
|
|
811
|
+
- https://github.com/TanStack/query
|
|
812
|
+
- https://github.com/alan2207/bulletproof-react
|
|
813
|
+
requires: []
|
|
814
|
+
conflicts: []
|
|
815
|
+
absorbs: [api-layer-tanstack-query, data-provider-rest]
|
|
816
|
+
|
|
817
|
+
- id: forms-validation
|
|
818
|
+
category: frontend-ui
|
|
819
|
+
tier: capability
|
|
820
|
+
status: proposed
|
|
821
|
+
what: >-
|
|
822
|
+
One Zod schema driving client validation, server validation and inferred TypeScript types.
|
|
823
|
+
react-hook-form, TanStack Form and Conform are three bindings of the same idea.
|
|
824
|
+
stacks: [react, typescript]
|
|
825
|
+
sources:
|
|
826
|
+
- https://github.com/react-hook-form/react-hook-form
|
|
827
|
+
- https://github.com/colinhacks/zod
|
|
828
|
+
- https://github.com/edmundhung/conform
|
|
829
|
+
requires: []
|
|
830
|
+
conflicts: []
|
|
831
|
+
absorbs: [forms-react-hook-form, forms-tanstack-zod, forms-conform-zod, validation-zod, content-schema-zod]
|
|
832
|
+
|
|
833
|
+
- id: table-tanstack
|
|
834
|
+
category: frontend-ui
|
|
835
|
+
tier: capability
|
|
836
|
+
status: proposed
|
|
837
|
+
what: >-
|
|
838
|
+
Headless TanStack Table with server-side pagination/sort/filter wired to URL state, plus
|
|
839
|
+
row virtualization for the large-dataset case.
|
|
840
|
+
stacks: [react]
|
|
841
|
+
sources:
|
|
842
|
+
- https://github.com/TanStack/table
|
|
843
|
+
- https://github.com/TanStack/virtual
|
|
844
|
+
requires: [data-fetching-tanstack-query]
|
|
845
|
+
conflicts: []
|
|
846
|
+
absorbs:
|
|
847
|
+
[table-tanstack, table-tanstack-server-pagination, table-virtualization,
|
|
848
|
+
data-table-server-side, ui-data-table-advanced]
|
|
849
|
+
|
|
850
|
+
- id: dashboard-shell
|
|
851
|
+
category: frontend-ui
|
|
852
|
+
tier: capability
|
|
853
|
+
status: proposed
|
|
854
|
+
what: >-
|
|
855
|
+
Admin shell - collapsible sidebar nav, breadcrumb header, KPI card grid, responsive
|
|
856
|
+
breakpoints. next-shadcn-dashboard-starter and shadcn-admin are the two cleanest bases.
|
|
857
|
+
stacks: [react]
|
|
858
|
+
sources:
|
|
859
|
+
- https://github.com/Kiranism/next-shadcn-dashboard-starter
|
|
860
|
+
- https://github.com/satnaing/shadcn-admin
|
|
861
|
+
requires: [ui-shadcn]
|
|
862
|
+
conflicts: []
|
|
863
|
+
absorbs: [dashboard-admin-shell, layout-sidebar-nav, ui-dashboard-shell, ui-kpi-cards, admin-dashboard-react]
|
|
864
|
+
|
|
865
|
+
- id: charts
|
|
866
|
+
category: frontend-ui
|
|
867
|
+
tier: capability
|
|
868
|
+
status: proposed
|
|
869
|
+
what: >-
|
|
870
|
+
Chart components with a shared token palette so every chart in the app reads as one system.
|
|
871
|
+
Recharts for the common case, visx when the chart is bespoke.
|
|
872
|
+
stacks: [react]
|
|
873
|
+
sources:
|
|
874
|
+
- https://github.com/recharts/recharts
|
|
875
|
+
- https://github.com/airbnb/visx
|
|
876
|
+
- https://github.com/tremorlabs/tremor
|
|
877
|
+
requires: []
|
|
878
|
+
conflicts: []
|
|
879
|
+
absorbs: [charts-recharts, charts-visx, charts-tremor, charts-custom-d3, dashboard-analytics-widgets]
|
|
880
|
+
|
|
881
|
+
- id: crud-admin-refine
|
|
882
|
+
category: frontend-ui
|
|
883
|
+
tier: specialist
|
|
884
|
+
status: proposed
|
|
885
|
+
what: >-
|
|
886
|
+
Refine's data-provider abstraction and schema-driven CRUD screens, for internal tools where
|
|
887
|
+
the UI is a thin shell over a REST/GraphQL backend.
|
|
888
|
+
stacks: [react]
|
|
889
|
+
sources:
|
|
890
|
+
- https://github.com/refinedev/refine
|
|
891
|
+
requires: []
|
|
892
|
+
conflicts: []
|
|
893
|
+
absorbs: [crud-admin-refine, crud-schema-driven]
|
|
894
|
+
|
|
895
|
+
- id: i18n
|
|
896
|
+
category: frontend-ui
|
|
897
|
+
tier: capability
|
|
898
|
+
status: proposed
|
|
899
|
+
what: >-
|
|
900
|
+
Message catalogs, locale routing, RTL handling and the CI check that fails on a missing
|
|
901
|
+
translation key rather than shipping the key name to users.
|
|
902
|
+
stacks: [node, react]
|
|
903
|
+
sources:
|
|
904
|
+
- https://github.com/amannn/next-intl
|
|
905
|
+
- https://github.com/i18next/react-i18next
|
|
906
|
+
requires: []
|
|
907
|
+
conflicts: []
|
|
908
|
+
absorbs:
|
|
909
|
+
[i18n-next-intl, i18n-next-i18next, i18n-multi-locale, i18n-i18next-rtl, i18n-backend,
|
|
910
|
+
i18n-message-catalog, i18n-content-locales]
|
|
911
|
+
|
|
912
|
+
- id: a11y-baseline
|
|
913
|
+
category: frontend-ui
|
|
914
|
+
tier: capability
|
|
915
|
+
status: proposed
|
|
916
|
+
what: >-
|
|
917
|
+
WAI-ARIA patterns from Radix, focus management on route change and modal open/close, and
|
|
918
|
+
an axe-core CI gate. The focus-management piece is what most starters skip.
|
|
919
|
+
stacks: [react]
|
|
920
|
+
sources:
|
|
921
|
+
- https://github.com/radix-ui/primitives
|
|
922
|
+
- https://github.com/dequelabs/axe-core
|
|
923
|
+
requires: []
|
|
924
|
+
conflicts: []
|
|
925
|
+
absorbs: [a11y-wai-aria, a11y-focus-management, a11y-testing]
|
|
926
|
+
|
|
927
|
+
- id: storybook
|
|
928
|
+
category: frontend-ui
|
|
929
|
+
tier: capability
|
|
930
|
+
status: proposed
|
|
931
|
+
what: Storybook workbench with a11y and interaction-test addons, plus visual regression.
|
|
932
|
+
stacks: [react, vue, svelte]
|
|
933
|
+
sources:
|
|
934
|
+
- https://github.com/storybookjs/storybook
|
|
935
|
+
requires: []
|
|
936
|
+
conflicts: []
|
|
937
|
+
absorbs: [storybook-workbench, tooling-storybook, visual-regression-testing]
|
|
938
|
+
|
|
939
|
+
- id: perf-bundle-budget
|
|
940
|
+
category: frontend-ui
|
|
941
|
+
tier: capability
|
|
942
|
+
status: proposed
|
|
943
|
+
what: CI-enforced bundle-size budget with a per-route breakdown, failing the PR not the deploy.
|
|
944
|
+
stacks: [node]
|
|
945
|
+
sources:
|
|
946
|
+
- https://github.com/Blazity/next-enterprise
|
|
947
|
+
requires: [ci-github-actions]
|
|
948
|
+
conflicts: []
|
|
949
|
+
absorbs: [perf-bundle-budget]
|
|
950
|
+
|
|
951
|
+
# ===========================================================================================
|
|
952
|
+
# TIER: core - database (two orthogonal axes)
|
|
953
|
+
# ===========================================================================================
|
|
954
|
+
|
|
955
|
+
- id: db-core
|
|
956
|
+
category: database
|
|
957
|
+
tier: core
|
|
958
|
+
status: built
|
|
959
|
+
what: >-
|
|
960
|
+
The storage-agnostic contract every driver sits behind - repository shape, unit of work,
|
|
961
|
+
typed errors, config surface, health hook. No driver may stand alone without it.
|
|
962
|
+
stacks: [any]
|
|
963
|
+
sources:
|
|
964
|
+
- https://github.com/brocoders/nestjs-boilerplate
|
|
965
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
966
|
+
requires: []
|
|
967
|
+
conflicts: []
|
|
968
|
+
provides: [db-abstraction, repository-pattern, unit-of-work, db-config, db-errors]
|
|
969
|
+
absorbs: [orm-repository-port-pattern]
|
|
970
|
+
|
|
971
|
+
- id: db-postgres
|
|
972
|
+
category: database
|
|
973
|
+
tier: core
|
|
974
|
+
status: built
|
|
975
|
+
choiceSet: db-engine
|
|
976
|
+
what: Pooled PostgreSQL access, plain-SQL migrations, and a local server, config from env.
|
|
977
|
+
stacks: [any]
|
|
978
|
+
sources:
|
|
979
|
+
- https://github.com/postgres/postgres
|
|
980
|
+
- https://github.com/supabase/supabase
|
|
981
|
+
requires: [db-core]
|
|
982
|
+
conflicts: [db-sqlite, db-mongo]
|
|
983
|
+
provides: [db, relational-db, sql-migrations, postgres]
|
|
984
|
+
|
|
985
|
+
- id: db-sqlite
|
|
986
|
+
category: database
|
|
987
|
+
tier: core
|
|
988
|
+
status: built
|
|
989
|
+
choiceSet: db-engine
|
|
990
|
+
what: Embedded SQLite - the right default for CLIs, desktop apps and single-node services.
|
|
991
|
+
stacks: [any]
|
|
992
|
+
sources:
|
|
993
|
+
- https://github.com/drizzle-team/drizzle-orm
|
|
994
|
+
- https://github.com/epicweb-dev/epic-stack
|
|
995
|
+
requires: [db-core]
|
|
996
|
+
conflicts: [db-postgres, db-mongo]
|
|
997
|
+
provides: [db-engine, sql-database, embedded-database]
|
|
998
|
+
absorbs: [db-sqlite-embedded]
|
|
999
|
+
|
|
1000
|
+
- id: db-mongo
|
|
1001
|
+
category: database
|
|
1002
|
+
tier: core
|
|
1003
|
+
status: built
|
|
1004
|
+
choiceSet: db-engine
|
|
1005
|
+
what: MongoDB document store behind the db-core repository contract.
|
|
1006
|
+
stacks: [node, go, dotnet]
|
|
1007
|
+
sources:
|
|
1008
|
+
- https://github.com/brocoders/nestjs-boilerplate
|
|
1009
|
+
- https://github.com/amitshekhariitbhu/go-backend-clean-architecture
|
|
1010
|
+
requires: [db-core]
|
|
1011
|
+
conflicts: [db-postgres, db-sqlite]
|
|
1012
|
+
provides: [database, document-store, mongodb]
|
|
1013
|
+
absorbs: [db-mongo-go, db-mongo-mongoose, db-mongodb-mongoose, db-mongodb-mongoose-nestjs, db-mongodb-prisma]
|
|
1014
|
+
|
|
1015
|
+
- id: db-mysql
|
|
1016
|
+
category: database
|
|
1017
|
+
tier: core
|
|
1018
|
+
status: proposed
|
|
1019
|
+
choiceSet: db-engine
|
|
1020
|
+
what: MySQL/MariaDB engine behind db-core. Needed for brownfield and for the Ghost/WP world.
|
|
1021
|
+
stacks: [any]
|
|
1022
|
+
sources:
|
|
1023
|
+
- https://github.com/TryGhost/Ghost
|
|
1024
|
+
- https://github.com/drizzle-team/drizzle-orm
|
|
1025
|
+
requires: [db-core]
|
|
1026
|
+
conflicts: [db-postgres, db-sqlite, db-mongo]
|
|
1027
|
+
absorbs: [db-mysql-drizzle, db-mysql-prisma, db-mysql-kysely, db-mysql-gorm, db-mysql-sqlc, db-mysql-knex, compose-mysql]
|
|
1028
|
+
|
|
1029
|
+
- id: db-sqlserver
|
|
1030
|
+
category: database
|
|
1031
|
+
tier: core
|
|
1032
|
+
status: proposed
|
|
1033
|
+
choiceSet: db-engine
|
|
1034
|
+
what: SQL Server engine behind db-core, for .NET shops where it is not a choice.
|
|
1035
|
+
stacks: [dotnet]
|
|
1036
|
+
sources:
|
|
1037
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
1038
|
+
- https://github.com/DapperLib/Dapper
|
|
1039
|
+
requires: [db-core]
|
|
1040
|
+
conflicts: [db-postgres, db-sqlite, db-mongo, db-mysql]
|
|
1041
|
+
absorbs: [db-sqlserver-efcore, db-sqlserver-dapper, db-sqlserver-prisma, db-sqlserver-kysely, db-sqlserver-gorm]
|
|
1042
|
+
|
|
1043
|
+
- id: db-turso
|
|
1044
|
+
category: database
|
|
1045
|
+
tier: specialist
|
|
1046
|
+
status: proposed
|
|
1047
|
+
choiceSet: db-engine
|
|
1048
|
+
what: Turso/libSQL - SQLite semantics with an embedded replica and edge reads.
|
|
1049
|
+
stacks: [node, edge]
|
|
1050
|
+
sources:
|
|
1051
|
+
- https://github.com/drizzle-team/drizzle-orm
|
|
1052
|
+
requires: [db-core]
|
|
1053
|
+
conflicts: [db-postgres, db-sqlite, db-mongo, db-mysql]
|
|
1054
|
+
absorbs: [db-turso-drizzle, db-turso-prisma]
|
|
1055
|
+
|
|
1056
|
+
- id: db-d1-cloudflare
|
|
1057
|
+
category: database
|
|
1058
|
+
tier: specialist
|
|
1059
|
+
status: proposed
|
|
1060
|
+
choiceSet: db-engine
|
|
1061
|
+
what: Cloudflare D1 with the Workers binding model and wrangler-driven migrations.
|
|
1062
|
+
stacks: [edge, cloudflare]
|
|
1063
|
+
sources:
|
|
1064
|
+
- https://github.com/drizzle-team/drizzle-orm
|
|
1065
|
+
requires: [db-core, deploy-cloudflare-workers]
|
|
1066
|
+
conflicts: [db-postgres, db-sqlite, db-mongo, db-mysql]
|
|
1067
|
+
absorbs: [db-d1-cloudflare, db-d1-drizzle, deploy-cloudflare-d1]
|
|
1068
|
+
|
|
1069
|
+
- id: db-clickhouse
|
|
1070
|
+
category: database
|
|
1071
|
+
tier: specialist
|
|
1072
|
+
status: proposed
|
|
1073
|
+
what: >-
|
|
1074
|
+
ClickHouse as an analytical sidecar next to the primary OLTP store, not as a replacement
|
|
1075
|
+
for it. Added because both the AI and observability categories reached for it independently.
|
|
1076
|
+
stacks: [any]
|
|
1077
|
+
sources:
|
|
1078
|
+
- https://github.com/ClickHouse/ClickHouse
|
|
1079
|
+
requires: []
|
|
1080
|
+
conflicts: []
|
|
1081
|
+
absorbs: [db-clickhouse]
|
|
1082
|
+
|
|
1083
|
+
# --- db access layer: orthogonal to engine -----------------------------------------------
|
|
1084
|
+
|
|
1085
|
+
- id: db-drizzle
|
|
1086
|
+
category: database
|
|
1087
|
+
tier: core
|
|
1088
|
+
status: proposed
|
|
1089
|
+
choiceSet: db-access
|
|
1090
|
+
what: >-
|
|
1091
|
+
Drizzle schema files, typed query builder and drizzle-kit migration generation. Speaks
|
|
1092
|
+
Postgres, MySQL, SQLite, Turso and D1 - one layer, five engines.
|
|
1093
|
+
stacks: [node, typescript]
|
|
1094
|
+
sources:
|
|
1095
|
+
- https://github.com/drizzle-team/drizzle-orm
|
|
1096
|
+
- https://github.com/ixartz/SaaS-Boilerplate
|
|
1097
|
+
- https://github.com/dotnize/react-tanstarter
|
|
1098
|
+
requires: [db-core]
|
|
1099
|
+
conflicts: []
|
|
1100
|
+
supportsEngines: [db-postgres, db-mysql, db-sqlite, db-turso, db-d1-cloudflare]
|
|
1101
|
+
absorbs:
|
|
1102
|
+
[db-postgres-drizzle, db-mysql-drizzle, db-sqlite-drizzle, db-turso-drizzle,
|
|
1103
|
+
db-d1-drizzle, db-neon-drizzle, db-planetscale-drizzle, db-supabase-drizzle,
|
|
1104
|
+
auth-better-auth-drizzle, db-codegen-types]
|
|
1105
|
+
|
|
1106
|
+
- id: db-prisma
|
|
1107
|
+
category: database
|
|
1108
|
+
tier: core
|
|
1109
|
+
status: proposed
|
|
1110
|
+
choiceSet: db-access
|
|
1111
|
+
what: >-
|
|
1112
|
+
schema.prisma as single source of truth, generated client, and prisma migrate. The
|
|
1113
|
+
prisma-examples repo is a per-engine matrix of working setups.
|
|
1114
|
+
stacks: [node, typescript]
|
|
1115
|
+
sources:
|
|
1116
|
+
- https://github.com/prisma/prisma-examples
|
|
1117
|
+
- https://github.com/t3-oss/create-t3-app
|
|
1118
|
+
- https://github.com/epicweb-dev/epic-stack
|
|
1119
|
+
requires: [db-core]
|
|
1120
|
+
conflicts: []
|
|
1121
|
+
supportsEngines: [db-postgres, db-mysql, db-sqlite, db-sqlserver, db-mongo, db-turso]
|
|
1122
|
+
absorbs:
|
|
1123
|
+
[db-postgres-prisma, db-mysql-prisma, db-sqlite-prisma, db-sqlserver-prisma,
|
|
1124
|
+
db-mongodb-prisma, db-turso-prisma, db-cockroachdb-prisma, auth-better-auth-prisma]
|
|
1125
|
+
|
|
1126
|
+
- id: db-kysely
|
|
1127
|
+
category: database
|
|
1128
|
+
tier: core
|
|
1129
|
+
status: proposed
|
|
1130
|
+
choiceSet: db-access
|
|
1131
|
+
what: >-
|
|
1132
|
+
Typed SQL builder with no runtime schema - the pick when the team wants SQL but not
|
|
1133
|
+
stringly-typed SQL. Dialects cover Postgres, MySQL, SQLite and SQL Server.
|
|
1134
|
+
stacks: [node, typescript]
|
|
1135
|
+
sources:
|
|
1136
|
+
- https://github.com/kysely-org/kysely
|
|
1137
|
+
requires: [db-core]
|
|
1138
|
+
conflicts: []
|
|
1139
|
+
supportsEngines: [db-postgres, db-mysql, db-sqlite, db-sqlserver]
|
|
1140
|
+
absorbs: [db-postgres-kysely, db-mysql-kysely, db-sqlite-kysely, db-sqlserver-kysely]
|
|
1141
|
+
|
|
1142
|
+
- id: db-typeorm
|
|
1143
|
+
category: database
|
|
1144
|
+
tier: specialist
|
|
1145
|
+
status: proposed
|
|
1146
|
+
choiceSet: db-access
|
|
1147
|
+
what: TypeORM entities and repositories, primarily for NestJS repos that already use it.
|
|
1148
|
+
stacks: [node, typescript]
|
|
1149
|
+
sources:
|
|
1150
|
+
- https://github.com/brocoders/nestjs-boilerplate
|
|
1151
|
+
- https://github.com/nestjs/nest
|
|
1152
|
+
requires: [db-core]
|
|
1153
|
+
conflicts: []
|
|
1154
|
+
absorbs: [db-postgres-typeorm, db-postgres-typeorm-nestjs, db-postgres-mikroorm]
|
|
1155
|
+
|
|
1156
|
+
- id: db-sqlalchemy
|
|
1157
|
+
category: database
|
|
1158
|
+
tier: core
|
|
1159
|
+
status: proposed
|
|
1160
|
+
choiceSet: db-access
|
|
1161
|
+
what: >-
|
|
1162
|
+
SQLAlchemy 2.x async ORM with the session-per-request dependency, plus the SQLModel variant
|
|
1163
|
+
where the pydantic model and the table are one class.
|
|
1164
|
+
stacks: [python]
|
|
1165
|
+
sources:
|
|
1166
|
+
- https://github.com/fastapi/full-stack-fastapi-template
|
|
1167
|
+
- https://github.com/rafsaf/minimal-fastapi-postgres-template
|
|
1168
|
+
- https://github.com/litestar-org/litestar
|
|
1169
|
+
requires: [db-core]
|
|
1170
|
+
conflicts: []
|
|
1171
|
+
absorbs:
|
|
1172
|
+
[db-postgres-sqlalchemy, db-postgres-sqlalchemy-async, db-postgres-sqlmodel,
|
|
1173
|
+
db-session-dependency-fastapi]
|
|
1174
|
+
|
|
1175
|
+
- id: db-gorm
|
|
1176
|
+
category: database
|
|
1177
|
+
tier: core
|
|
1178
|
+
status: proposed
|
|
1179
|
+
choiceSet: db-access
|
|
1180
|
+
what: GORM models, hooks and auto-migration for Go, across Postgres/MySQL/SQLite/SQL Server.
|
|
1181
|
+
stacks: [go]
|
|
1182
|
+
sources:
|
|
1183
|
+
- https://github.com/go-gorm/gorm
|
|
1184
|
+
- https://github.com/goravel/goravel
|
|
1185
|
+
requires: [db-core]
|
|
1186
|
+
conflicts: []
|
|
1187
|
+
absorbs: [db-postgres-gorm, db-mysql-gorm, db-sqlite-gorm, db-sqlserver-gorm]
|
|
1188
|
+
|
|
1189
|
+
- id: db-sqlc
|
|
1190
|
+
category: database
|
|
1191
|
+
tier: core
|
|
1192
|
+
status: proposed
|
|
1193
|
+
choiceSet: db-access
|
|
1194
|
+
what: >-
|
|
1195
|
+
Write SQL, generate typed Go. The inverse of an ORM and the better fit when the schema is
|
|
1196
|
+
owned by a DBA rather than the app.
|
|
1197
|
+
stacks: [go]
|
|
1198
|
+
sources:
|
|
1199
|
+
- https://github.com/sqlc-dev/sqlc
|
|
1200
|
+
requires: [db-core]
|
|
1201
|
+
conflicts: []
|
|
1202
|
+
absorbs: [db-postgres-sqlc, db-mysql-sqlc, db-sqlite-sqlc, db-postgres-pgx]
|
|
1203
|
+
|
|
1204
|
+
- id: db-efcore
|
|
1205
|
+
category: database
|
|
1206
|
+
tier: core
|
|
1207
|
+
status: proposed
|
|
1208
|
+
choiceSet: db-access
|
|
1209
|
+
what: >-
|
|
1210
|
+
EF Core DbContext, configurations, and the interceptor pattern that stamps audit columns
|
|
1211
|
+
and dispatches domain events without touching call sites.
|
|
1212
|
+
stacks: [dotnet]
|
|
1213
|
+
sources:
|
|
1214
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
1215
|
+
- https://github.com/dotnet/eShop
|
|
1216
|
+
- https://github.com/ardalis/CleanArchitecture
|
|
1217
|
+
requires: [db-core]
|
|
1218
|
+
conflicts: []
|
|
1219
|
+
absorbs: [db-postgres-efcore, db-sqlite-efcore, db-sqlserver-efcore, orm-efcore-interceptors-audit, auth-openiddict-efcore]
|
|
1220
|
+
|
|
1221
|
+
- id: db-dapper
|
|
1222
|
+
category: database
|
|
1223
|
+
tier: specialist
|
|
1224
|
+
status: proposed
|
|
1225
|
+
choiceSet: db-access
|
|
1226
|
+
what: Dapper micro-ORM for hot paths where EF Core's change tracker is the bottleneck.
|
|
1227
|
+
stacks: [dotnet]
|
|
1228
|
+
sources:
|
|
1229
|
+
- https://github.com/DapperLib/Dapper
|
|
1230
|
+
requires: [db-core]
|
|
1231
|
+
conflicts: []
|
|
1232
|
+
absorbs: [orm-micro-dapper, db-postgres-dapper, db-sqlserver-dapper]
|
|
1233
|
+
|
|
1234
|
+
# --- migrations ---------------------------------------------------------------------------
|
|
1235
|
+
|
|
1236
|
+
- id: migrations-alembic
|
|
1237
|
+
category: database
|
|
1238
|
+
tier: capability
|
|
1239
|
+
status: proposed
|
|
1240
|
+
choiceSet: migrations
|
|
1241
|
+
what: >-
|
|
1242
|
+
Alembic env.py, autogenerate with a type-comparison hook, and the multi-database branch
|
|
1243
|
+
layout. The naming-convention block is what makes autogenerate produce stable diffs.
|
|
1244
|
+
stacks: [python]
|
|
1245
|
+
sources:
|
|
1246
|
+
- https://github.com/sqlalchemy/alembic
|
|
1247
|
+
- https://github.com/fastapi/full-stack-fastapi-template
|
|
1248
|
+
requires: [db-sqlalchemy]
|
|
1249
|
+
conflicts: []
|
|
1250
|
+
absorbs: [migrations-alembic-python, migrations-alembic-multidb, db-migrations-alembic]
|
|
1251
|
+
|
|
1252
|
+
- id: migrations-atlas
|
|
1253
|
+
category: database
|
|
1254
|
+
tier: capability
|
|
1255
|
+
status: proposed
|
|
1256
|
+
choiceSet: migrations
|
|
1257
|
+
what: >-
|
|
1258
|
+
Atlas declarative or versioned migrations plus `atlas migrate lint` in CI, which catches
|
|
1259
|
+
destructive changes before merge rather than at deploy.
|
|
1260
|
+
stacks: [go, any]
|
|
1261
|
+
sources:
|
|
1262
|
+
- https://github.com/ariga/atlas
|
|
1263
|
+
requires: []
|
|
1264
|
+
conflicts: []
|
|
1265
|
+
absorbs: [migrations-atlas-declarative, migrations-atlas-versioned, migrations-atlas-ci-lint, db-migrations-golang-migrate]
|
|
1266
|
+
|
|
1267
|
+
- id: migrations-efcore
|
|
1268
|
+
category: database
|
|
1269
|
+
tier: capability
|
|
1270
|
+
status: proposed
|
|
1271
|
+
choiceSet: migrations
|
|
1272
|
+
what: EF Core migrations with an idempotent-script CI artifact rather than migrate-on-startup.
|
|
1273
|
+
stacks: [dotnet]
|
|
1274
|
+
sources:
|
|
1275
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
1276
|
+
requires: [db-efcore]
|
|
1277
|
+
conflicts: []
|
|
1278
|
+
absorbs: [db-migrations-efcore]
|
|
1279
|
+
|
|
1280
|
+
- id: db-rls-multitenant
|
|
1281
|
+
category: database
|
|
1282
|
+
tier: capability
|
|
1283
|
+
status: proposed
|
|
1284
|
+
what: >-
|
|
1285
|
+
Postgres row-level-security policies keyed on a session-local tenant claim, plus the test
|
|
1286
|
+
that proves a cross-tenant read actually fails. Without that test RLS is decoration.
|
|
1287
|
+
stacks: [postgres]
|
|
1288
|
+
sources:
|
|
1289
|
+
- https://github.com/supabase/supabase
|
|
1290
|
+
- https://github.com/supabase/auth
|
|
1291
|
+
requires: [db-postgres]
|
|
1292
|
+
conflicts: []
|
|
1293
|
+
absorbs: [db-postgres-rls-multitenant, db-postgres-rls-auth, security-rls-policies, authz-field-level-access]
|
|
1294
|
+
|
|
1295
|
+
- id: cache-redis
|
|
1296
|
+
category: database
|
|
1297
|
+
tier: capability
|
|
1298
|
+
status: built
|
|
1299
|
+
what: Distributed cache, session store and rate-limit store on Redis.
|
|
1300
|
+
stacks: [any]
|
|
1301
|
+
sources:
|
|
1302
|
+
- https://github.com/redis/ioredis
|
|
1303
|
+
requires: []
|
|
1304
|
+
conflicts: []
|
|
1305
|
+
provides: [cache, distributed-cache, redis, cache-config, session-store, rate-limit-store]
|
|
1306
|
+
absorbs: [cache-redis-ioredis, session-store-redis]
|
|
1307
|
+
|
|
1308
|
+
# ===========================================================================================
|
|
1309
|
+
# TIER: core - auth / authz
|
|
1310
|
+
# ===========================================================================================
|
|
1311
|
+
|
|
1312
|
+
- id: auth-jwt
|
|
1313
|
+
category: auth
|
|
1314
|
+
tier: core
|
|
1315
|
+
status: built
|
|
1316
|
+
choiceSet: auth-strategy
|
|
1317
|
+
what: Self-issued JWT auth with password hashing and a refresh-rotation flow.
|
|
1318
|
+
stacks: [any]
|
|
1319
|
+
sources:
|
|
1320
|
+
- https://github.com/brocoders/nestjs-boilerplate
|
|
1321
|
+
- https://github.com/lucia-auth/lucia
|
|
1322
|
+
requires: []
|
|
1323
|
+
conflicts: [auth-oidc]
|
|
1324
|
+
provides: [auth, jwt-issuer, password-hashing]
|
|
1325
|
+
absorbs: [auth-jwt-refresh, auth-jwt-refresh-rotation, auth-password-argon2, auth-jwks-rotation]
|
|
1326
|
+
|
|
1327
|
+
- id: auth-oidc
|
|
1328
|
+
category: auth
|
|
1329
|
+
tier: core
|
|
1330
|
+
status: built
|
|
1331
|
+
choiceSet: auth-strategy
|
|
1332
|
+
what: OIDC/OAuth2 relying-party integration against an external identity provider.
|
|
1333
|
+
stacks: [any]
|
|
1334
|
+
sources:
|
|
1335
|
+
- https://github.com/panva/node-oidc-provider
|
|
1336
|
+
- https://github.com/keycloak/keycloak
|
|
1337
|
+
requires: []
|
|
1338
|
+
conflicts: [auth-jwt]
|
|
1339
|
+
provides: [auth, oidc, oauth2]
|
|
1340
|
+
absorbs:
|
|
1341
|
+
[auth-oidc-client-keycloak, auth-client-credentials-api, auth-oauth-provider-configs,
|
|
1342
|
+
auth-entra-id, auth-social-google, auth-social-apple]
|
|
1343
|
+
|
|
1344
|
+
- id: auth-better-auth
|
|
1345
|
+
category: auth
|
|
1346
|
+
tier: core
|
|
1347
|
+
status: proposed
|
|
1348
|
+
choiceSet: auth-strategy
|
|
1349
|
+
what: >-
|
|
1350
|
+
Better Auth as the TypeScript auth core, with its plugin set covering 2FA, passkeys,
|
|
1351
|
+
magic links, organizations, admin and an OIDC provider mode. One config object rather
|
|
1352
|
+
than seven integrations - the plugin architecture is the borrowable part.
|
|
1353
|
+
stacks: [node, typescript]
|
|
1354
|
+
sources:
|
|
1355
|
+
- https://github.com/better-auth/better-auth
|
|
1356
|
+
- https://github.com/CarlosZiegler/fullstack-start-template
|
|
1357
|
+
- https://github.com/dotnize/react-tanstarter
|
|
1358
|
+
requires: [db-core]
|
|
1359
|
+
conflicts: [auth-jwt, auth-oidc, auth-nextauth]
|
|
1360
|
+
absorbs:
|
|
1361
|
+
[auth-better-auth, auth-better-auth-2fa, auth-better-auth-passkeys,
|
|
1362
|
+
auth-better-auth-magic-link, auth-better-auth-organization, auth-better-auth-admin,
|
|
1363
|
+
auth-better-auth-oidc-provider, auth-better-auth-drizzle, auth-better-auth-prisma,
|
|
1364
|
+
auth-2fa-totp, auth-2fa-totp-webauthn, auth-passkeys, auth-passkeys-webauthn,
|
|
1365
|
+
auth-magic-link-email, auth-oauth-arctic, auth-session-cookie, auth-session-cookie-scratch,
|
|
1366
|
+
auth-schema-authjs-compatible]
|
|
1367
|
+
|
|
1368
|
+
- id: auth-nextauth
|
|
1369
|
+
category: auth
|
|
1370
|
+
tier: core
|
|
1371
|
+
status: proposed
|
|
1372
|
+
choiceSet: auth-strategy
|
|
1373
|
+
what: Auth.js / NextAuth with a database adapter and provider config, across Next and SvelteKit.
|
|
1374
|
+
stacks: [node, react, svelte]
|
|
1375
|
+
sources:
|
|
1376
|
+
- https://github.com/nextauthjs/next-auth
|
|
1377
|
+
- https://github.com/t3-oss/create-t3-app
|
|
1378
|
+
- https://github.com/Skolaczk/next-starter
|
|
1379
|
+
requires: [db-core]
|
|
1380
|
+
conflicts: [auth-better-auth]
|
|
1381
|
+
absorbs: [auth-nextauth, auth-authjs-nextjs, auth-authjs-sveltekit, auth-authjs-express]
|
|
1382
|
+
|
|
1383
|
+
- id: auth-clerk
|
|
1384
|
+
category: auth
|
|
1385
|
+
tier: core
|
|
1386
|
+
status: proposed
|
|
1387
|
+
choiceSet: auth-strategy
|
|
1388
|
+
what: >-
|
|
1389
|
+
Clerk hosted auth - middleware, gated routes, organization support. Fastest path to
|
|
1390
|
+
working auth; also the layer with the hardest exit, so pair it with auth-provider-port.
|
|
1391
|
+
stacks: [node, react, react-native]
|
|
1392
|
+
sources:
|
|
1393
|
+
- https://github.com/ixartz/SaaS-Boilerplate
|
|
1394
|
+
- https://github.com/Kiranism/next-shadcn-dashboard-starter
|
|
1395
|
+
- https://github.com/flemingvincent/expo-clerk-convex
|
|
1396
|
+
requires: []
|
|
1397
|
+
conflicts: [auth-better-auth, auth-nextauth, auth-jwt]
|
|
1398
|
+
absorbs: [auth-clerk]
|
|
1399
|
+
|
|
1400
|
+
- id: auth-supabase
|
|
1401
|
+
category: auth
|
|
1402
|
+
tier: core
|
|
1403
|
+
status: proposed
|
|
1404
|
+
choiceSet: auth-strategy
|
|
1405
|
+
what: >-
|
|
1406
|
+
Supabase GoTrue auth with JWT claims that RLS policies read directly - the auth and authz
|
|
1407
|
+
layers become one thing, which is its main appeal and its main lock-in.
|
|
1408
|
+
stacks: [node, postgres]
|
|
1409
|
+
sources:
|
|
1410
|
+
- https://github.com/supabase/auth
|
|
1411
|
+
- https://github.com/supabase/supabase
|
|
1412
|
+
requires: [db-postgres]
|
|
1413
|
+
conflicts: [auth-better-auth, auth-nextauth, auth-clerk]
|
|
1414
|
+
absorbs: [auth-supabase, auth-gotrue-postgres, auth-jwt-claims-supabase, auth-supabase-selfhost, db-postgres-supabase, db-supabase-postgres, db-supabase-selfhost-docker]
|
|
1415
|
+
|
|
1416
|
+
- id: auth-aspnet-identity
|
|
1417
|
+
category: auth
|
|
1418
|
+
tier: core
|
|
1419
|
+
status: proposed
|
|
1420
|
+
choiceSet: auth-strategy
|
|
1421
|
+
what: ASP.NET Core Identity with either JWT bearer or an OpenIddict-backed authorization server.
|
|
1422
|
+
stacks: [dotnet]
|
|
1423
|
+
sources:
|
|
1424
|
+
- https://github.com/openiddict/openiddict-core
|
|
1425
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
1426
|
+
requires: []
|
|
1427
|
+
conflicts: [auth-better-auth, auth-nextauth, auth-clerk]
|
|
1428
|
+
absorbs:
|
|
1429
|
+
[auth-aspnet-identity, auth-aspnet-identity-jwt, auth-aspnet-identity-openiddict,
|
|
1430
|
+
auth-openiddict, auth-openiddict-server, auth-openiddict-client,
|
|
1431
|
+
auth-openiddict-validation, auth-dotnet-starter-kit]
|
|
1432
|
+
|
|
1433
|
+
- id: auth-idp-keycloak
|
|
1434
|
+
category: auth
|
|
1435
|
+
tier: capability
|
|
1436
|
+
status: proposed
|
|
1437
|
+
what: >-
|
|
1438
|
+
Keycloak as a self-hosted IdP - compose service plus a version-controlled realm-import
|
|
1439
|
+
JSON, so the IdP config is a reviewable artifact rather than clicks in an admin console.
|
|
1440
|
+
stacks: [any]
|
|
1441
|
+
sources:
|
|
1442
|
+
- https://github.com/keycloak/keycloak
|
|
1443
|
+
requires: [auth-oidc, docker-compose]
|
|
1444
|
+
conflicts: []
|
|
1445
|
+
absorbs: [auth-keycloak, auth-keycloak-compose, auth-keycloak-realm-import, auth-idp-config-as-code]
|
|
1446
|
+
|
|
1447
|
+
- id: auth-idp-ory
|
|
1448
|
+
category: auth
|
|
1449
|
+
tier: specialist
|
|
1450
|
+
status: proposed
|
|
1451
|
+
what: >-
|
|
1452
|
+
Ory Kratos (identities, self-service flows) plus Hydra (OAuth2 server) as separate
|
|
1453
|
+
services, with the identity schema as JSON Schema and flows as declarative config.
|
|
1454
|
+
stacks: [any]
|
|
1455
|
+
sources:
|
|
1456
|
+
- https://github.com/ory/kratos
|
|
1457
|
+
- https://github.com/ory/hydra
|
|
1458
|
+
requires: [docker-compose]
|
|
1459
|
+
conflicts: []
|
|
1460
|
+
absorbs:
|
|
1461
|
+
[auth-ory-kratos, auth-ory-kratos-compose, auth-ory-hydra, auth-identity-schema-json,
|
|
1462
|
+
auth-selfservice-flows, auth-login-consent-app, auth-oauth2-server,
|
|
1463
|
+
auth-oidc-provider-node, auth-oidc-provider-express, auth-oidc-provider-koa]
|
|
1464
|
+
|
|
1465
|
+
- id: auth-idp-authentik
|
|
1466
|
+
category: auth
|
|
1467
|
+
tier: specialist
|
|
1468
|
+
status: proposed
|
|
1469
|
+
what: >-
|
|
1470
|
+
Authentik as a self-hosted IdP, deployed as containers and configured entirely through
|
|
1471
|
+
version-controlled blueprint YAML - flows, stages, prompts, policies and providers as
|
|
1472
|
+
declarative files with a published JSON Schema. The blueprint model is the idea worth
|
|
1473
|
+
having; it is what turns IdP configuration into a reviewable artifact.
|
|
1474
|
+
stacks: [any]
|
|
1475
|
+
sources: []
|
|
1476
|
+
requires: [auth-oidc, docker-compose]
|
|
1477
|
+
conflicts: []
|
|
1478
|
+
absorbs: [auth-authentik-deploy, auth-flow-stage-policy-model]
|
|
1479
|
+
fromScratch: true
|
|
1480
|
+
licenseNote: >-
|
|
1481
|
+
goauthentik/authentik reports NOASSERTION and is split-licensed, with features drifting
|
|
1482
|
+
into `authentik/enterprise/` over time - a path that is MIT today may not be next release.
|
|
1483
|
+
REFERENCE-ONLY. Deploy it as a container and author the blueprints yourself; copy no files.
|
|
1484
|
+
Its operational floor is also high (server + worker + Postgres + Redis). Prefer
|
|
1485
|
+
auth-idp-keycloak unless the blueprint model is specifically wanted. See gaps.md.
|
|
1486
|
+
|
|
1487
|
+
- id: backend-baas
|
|
1488
|
+
category: auth
|
|
1489
|
+
tier: specialist
|
|
1490
|
+
status: proposed
|
|
1491
|
+
what: >-
|
|
1492
|
+
A hosted backend-as-a-service - Convex or Firebase - owning database, auth and realtime
|
|
1493
|
+
together. Fastest path to a working mobile or prototype app; the deepest lock-in in the
|
|
1494
|
+
catalog, since the data model, the auth model and the query language all come from the
|
|
1495
|
+
vendor at once.
|
|
1496
|
+
stacks: [node, react-native, flutter]
|
|
1497
|
+
sources:
|
|
1498
|
+
- https://github.com/flemingvincent/expo-clerk-convex
|
|
1499
|
+
- https://github.com/bizz84/starter_architecture_flutter_firebase
|
|
1500
|
+
requires: []
|
|
1501
|
+
conflicts: [db-core]
|
|
1502
|
+
absorbs: [backend-convex, auth-firebase, db-firestore]
|
|
1503
|
+
note: >-
|
|
1504
|
+
Conflicts with db-core deliberately: a BaaS replaces the repository contract rather than
|
|
1505
|
+
implementing it. Pair with auth-provider-port so at least the auth surface stays portable.
|
|
1506
|
+
|
|
1507
|
+
- id: auth-forward-proxy
|
|
1508
|
+
category: auth
|
|
1509
|
+
tier: specialist
|
|
1510
|
+
status: proposed
|
|
1511
|
+
what: >-
|
|
1512
|
+
Forward-auth sidecar (Authelia / oauth2-proxy) putting SSO in front of an app that has no
|
|
1513
|
+
auth of its own, via nginx auth_request or Traefik middleware.
|
|
1514
|
+
stacks: [any]
|
|
1515
|
+
sources:
|
|
1516
|
+
- https://github.com/authelia/authelia
|
|
1517
|
+
- https://github.com/oauth2-proxy/oauth2-proxy
|
|
1518
|
+
requires: [docker-compose]
|
|
1519
|
+
conflicts: []
|
|
1520
|
+
absorbs:
|
|
1521
|
+
[auth-authelia-portal, auth-forward-auth-nginx, auth-forward-auth-traefik,
|
|
1522
|
+
auth-proxy-oauth2-proxy, auth-sso-sidecar]
|
|
1523
|
+
|
|
1524
|
+
- id: auth-saml-enterprise
|
|
1525
|
+
category: auth
|
|
1526
|
+
tier: specialist
|
|
1527
|
+
status: proposed
|
|
1528
|
+
what: SAML SSO and directory federation for the enterprise-sales checkbox.
|
|
1529
|
+
stacks: [any]
|
|
1530
|
+
sources:
|
|
1531
|
+
- https://github.com/boxyhq/saas-starter-kit
|
|
1532
|
+
requires: [auth-oidc]
|
|
1533
|
+
conflicts: []
|
|
1534
|
+
absorbs: [auth-saml-sso, auth-saml-idp, auth-ldap-federation]
|
|
1535
|
+
|
|
1536
|
+
- id: auth-provider-port
|
|
1537
|
+
category: auth
|
|
1538
|
+
tier: capability
|
|
1539
|
+
status: proposed
|
|
1540
|
+
what: >-
|
|
1541
|
+
A thin interface over whichever auth choice was made - `getSession`, `requireUser`,
|
|
1542
|
+
`signOut` - so application code never imports Clerk or Supabase directly and the auth
|
|
1543
|
+
choice stays reversible. The single highest-leverage layer in this category.
|
|
1544
|
+
stacks: [any]
|
|
1545
|
+
sources:
|
|
1546
|
+
- https://github.com/alan2207/bulletproof-react
|
|
1547
|
+
- https://github.com/brocoders/nestjs-boilerplate
|
|
1548
|
+
requires: []
|
|
1549
|
+
conflicts: []
|
|
1550
|
+
absorbs: [auth-provider-abstraction]
|
|
1551
|
+
|
|
1552
|
+
- id: authz-rbac
|
|
1553
|
+
category: auth
|
|
1554
|
+
tier: core
|
|
1555
|
+
status: proposed
|
|
1556
|
+
choiceSet: authz-model
|
|
1557
|
+
what: >-
|
|
1558
|
+
Role/permission matrix with a single `can(user, action, resource)` entry point, permission
|
|
1559
|
+
claims in the token, and a seeded default role set.
|
|
1560
|
+
stacks: [any]
|
|
1561
|
+
sources:
|
|
1562
|
+
- https://github.com/casbin/casbin
|
|
1563
|
+
- https://github.com/keystonejs/keystone
|
|
1564
|
+
requires: []
|
|
1565
|
+
conflicts: [authz-rebac]
|
|
1566
|
+
absorbs:
|
|
1567
|
+
[authz-rbac-matrix, rbac-permissions, rbac-access-control, authz-permission-groups,
|
|
1568
|
+
authz-permission-claims-dotnet, authz-access-control-rules, authz-casbin-rbac,
|
|
1569
|
+
authz-casbin-rbac-domains, authz-casbin-abac, authz-policy-model-files]
|
|
1570
|
+
|
|
1571
|
+
- id: authz-rebac
|
|
1572
|
+
category: auth
|
|
1573
|
+
tier: specialist
|
|
1574
|
+
status: proposed
|
|
1575
|
+
choiceSet: authz-model
|
|
1576
|
+
what: >-
|
|
1577
|
+
Zanzibar-style relationship-based authorization on OpenFGA, with the model as a versioned
|
|
1578
|
+
DSL file and model assertions run as tests in CI.
|
|
1579
|
+
stacks: [any]
|
|
1580
|
+
sources:
|
|
1581
|
+
- https://github.com/openfga/openfga
|
|
1582
|
+
requires: [docker-compose]
|
|
1583
|
+
conflicts: [authz-rbac]
|
|
1584
|
+
absorbs: [authz-openfga, authz-openfga-compose, authz-openfga-model-tests, authz-rebac-zanzibar]
|
|
1585
|
+
|
|
1586
|
+
- id: authz-gateway-policy
|
|
1587
|
+
category: auth
|
|
1588
|
+
tier: specialist
|
|
1589
|
+
status: proposed
|
|
1590
|
+
what: Ory Oathkeeper access rules enforcing authz at the gateway rather than in each service.
|
|
1591
|
+
stacks: [any]
|
|
1592
|
+
sources:
|
|
1593
|
+
- https://github.com/ory/oathkeeper
|
|
1594
|
+
requires: []
|
|
1595
|
+
conflicts: []
|
|
1596
|
+
absorbs: [authz-ory-oathkeeper]
|
|
1597
|
+
|
|
1598
|
+
- id: tenancy-organizations
|
|
1599
|
+
category: auth
|
|
1600
|
+
tier: capability
|
|
1601
|
+
status: proposed
|
|
1602
|
+
what: >-
|
|
1603
|
+
Organization/workspace model - membership, invites, role-per-org, org switcher, and
|
|
1604
|
+
subdomain or path-based tenant resolution.
|
|
1605
|
+
stacks: [any]
|
|
1606
|
+
sources:
|
|
1607
|
+
- https://github.com/ixartz/SaaS-Boilerplate
|
|
1608
|
+
- https://github.com/boxyhq/saas-starter-kit
|
|
1609
|
+
- https://github.com/nextacular/nextacular
|
|
1610
|
+
requires: [auth-provider-port]
|
|
1611
|
+
conflicts: []
|
|
1612
|
+
absorbs: [tenancy-organizations, tenancy-subdomain-multitenant, tenancy-finbuckle-multitenant]
|
|
1613
|
+
|
|
1614
|
+
# ===========================================================================================
|
|
1615
|
+
# TIER: capability - testing
|
|
1616
|
+
# ===========================================================================================
|
|
1617
|
+
|
|
1618
|
+
- id: testing-unit
|
|
1619
|
+
category: testing
|
|
1620
|
+
tier: foundation
|
|
1621
|
+
status: built
|
|
1622
|
+
what: Unit test runner, test doubles and a coverage report.
|
|
1623
|
+
stacks: [any]
|
|
1624
|
+
sources:
|
|
1625
|
+
- https://github.com/vitest-dev/vitest
|
|
1626
|
+
- https://github.com/pytest-dev/pytest
|
|
1627
|
+
requires: []
|
|
1628
|
+
conflicts: []
|
|
1629
|
+
provides: [unit-tests, test-runner, test-doubles, coverage-report]
|
|
1630
|
+
|
|
1631
|
+
- id: testing-vitest
|
|
1632
|
+
category: testing
|
|
1633
|
+
tier: core
|
|
1634
|
+
status: proposed
|
|
1635
|
+
choiceSet: test-runner-unit
|
|
1636
|
+
what: >-
|
|
1637
|
+
Vitest config with the projects/workspace split, v8 coverage thresholds, in-source tests
|
|
1638
|
+
and typecheck assertions (`expectTypeOf`), which no other JS runner does natively.
|
|
1639
|
+
stacks: [node, typescript]
|
|
1640
|
+
sources:
|
|
1641
|
+
- https://github.com/vitest-dev/vitest
|
|
1642
|
+
requires: [testing-unit]
|
|
1643
|
+
conflicts: []
|
|
1644
|
+
absorbs:
|
|
1645
|
+
[testing-unit-vitest, testing-vitest, test-vitest, testing-vitest-projects,
|
|
1646
|
+
testing-in-source, testing-typecheck-assertions, testing-coverage-v8]
|
|
1647
|
+
|
|
1648
|
+
- id: testing-jest
|
|
1649
|
+
category: testing
|
|
1650
|
+
tier: core
|
|
1651
|
+
status: proposed
|
|
1652
|
+
choiceSet: test-runner-unit
|
|
1653
|
+
what: Jest config, custom environments and snapshot conventions, for repos already on it.
|
|
1654
|
+
stacks: [node]
|
|
1655
|
+
sources:
|
|
1656
|
+
- https://github.com/jestjs/jest
|
|
1657
|
+
requires: [testing-unit]
|
|
1658
|
+
conflicts: []
|
|
1659
|
+
absorbs: [testing-unit-jest, testing-custom-environment, testing-snapshot, test-jest-e2e, test-jest-rn]
|
|
1660
|
+
|
|
1661
|
+
- id: testing-pytest
|
|
1662
|
+
category: testing
|
|
1663
|
+
tier: core
|
|
1664
|
+
status: proposed
|
|
1665
|
+
choiceSet: test-runner-unit
|
|
1666
|
+
what: >-
|
|
1667
|
+
pytest layout, conftest fixture scoping, parametrize conventions, coverage.py thresholds
|
|
1668
|
+
and a tox/nox version matrix.
|
|
1669
|
+
stacks: [python]
|
|
1670
|
+
sources:
|
|
1671
|
+
- https://github.com/pytest-dev/pytest
|
|
1672
|
+
- https://github.com/nedbat/coveragepy
|
|
1673
|
+
requires: [testing-unit]
|
|
1674
|
+
conflicts: []
|
|
1675
|
+
absorbs:
|
|
1676
|
+
[testing-unit-pytest, test-pytest, testing-pytest-fixtures, testing-pytest-plugin,
|
|
1677
|
+
testing-python-layout, testing-coverage-python, testing-matrix-tox]
|
|
1678
|
+
|
|
1679
|
+
- id: testing-xunit
|
|
1680
|
+
category: testing
|
|
1681
|
+
tier: core
|
|
1682
|
+
status: proposed
|
|
1683
|
+
choiceSet: test-runner-unit
|
|
1684
|
+
what: >-
|
|
1685
|
+
xUnit conventions, collection fixtures for parallelism control, and WebApplicationFactory
|
|
1686
|
+
integration tests against the real pipeline.
|
|
1687
|
+
stacks: [dotnet]
|
|
1688
|
+
sources:
|
|
1689
|
+
- https://github.com/xunit/xunit
|
|
1690
|
+
requires: [testing-unit]
|
|
1691
|
+
conflicts: []
|
|
1692
|
+
absorbs:
|
|
1693
|
+
[testing-unit-xunit, test-xunit-integration, testing-dotnet-conventions,
|
|
1694
|
+
testing-fixtures-dotnet, testing-parallel-collections, testing-webapplicationfactory,
|
|
1695
|
+
testing-integration-dotnet]
|
|
1696
|
+
|
|
1697
|
+
- id: testing-go
|
|
1698
|
+
category: testing
|
|
1699
|
+
tier: core
|
|
1700
|
+
status: proposed
|
|
1701
|
+
choiceSet: test-runner-unit
|
|
1702
|
+
what: Go table-driven tests with testify assertions and a build-tagged integration suite.
|
|
1703
|
+
stacks: [go]
|
|
1704
|
+
sources:
|
|
1705
|
+
- https://github.com/stretchr/testify
|
|
1706
|
+
requires: [testing-unit]
|
|
1707
|
+
conflicts: []
|
|
1708
|
+
absorbs: [test-testify, test-integration-go]
|
|
1709
|
+
|
|
1710
|
+
- id: testing-e2e
|
|
1711
|
+
category: testing
|
|
1712
|
+
tier: foundation
|
|
1713
|
+
status: built
|
|
1714
|
+
what: End-to-end and smoke test harness with its config.
|
|
1715
|
+
stacks: [any]
|
|
1716
|
+
sources:
|
|
1717
|
+
- https://github.com/microsoft/playwright
|
|
1718
|
+
requires: []
|
|
1719
|
+
conflicts: []
|
|
1720
|
+
provides: [e2e-tests, smoke-tests, e2e-config]
|
|
1721
|
+
|
|
1722
|
+
- id: testing-playwright
|
|
1723
|
+
category: testing
|
|
1724
|
+
tier: core
|
|
1725
|
+
status: proposed
|
|
1726
|
+
choiceSet: test-runner-e2e
|
|
1727
|
+
what: >-
|
|
1728
|
+
Playwright with the custom-fixture pattern, the webServer dev-server adapter, trace/video
|
|
1729
|
+
artifacts on failure only, and the official Docker image pinned to the library version.
|
|
1730
|
+
stacks: [any]
|
|
1731
|
+
sources:
|
|
1732
|
+
- https://github.com/microsoft/playwright
|
|
1733
|
+
requires: [testing-e2e]
|
|
1734
|
+
conflicts: [testing-cypress]
|
|
1735
|
+
absorbs:
|
|
1736
|
+
[testing-e2e-playwright, e2e-playwright, testing-playwright, testing-e2e-fixtures,
|
|
1737
|
+
testing-dev-server-adapter, testing-trace-artifacts, testing-browser-docker-image]
|
|
1738
|
+
|
|
1739
|
+
- id: testing-cypress
|
|
1740
|
+
category: testing
|
|
1741
|
+
tier: specialist
|
|
1742
|
+
status: proposed
|
|
1743
|
+
choiceSet: test-runner-e2e
|
|
1744
|
+
what: Cypress e2e plus component testing, for teams already invested in it.
|
|
1745
|
+
stacks: [node]
|
|
1746
|
+
sources:
|
|
1747
|
+
- https://github.com/cypress-io/cypress
|
|
1748
|
+
requires: [testing-e2e]
|
|
1749
|
+
conflicts: [testing-playwright]
|
|
1750
|
+
absorbs: [testing-e2e-cypress, testing-component-cypress]
|
|
1751
|
+
|
|
1752
|
+
- id: testing-maestro-mobile
|
|
1753
|
+
category: testing
|
|
1754
|
+
tier: capability
|
|
1755
|
+
status: proposed
|
|
1756
|
+
choiceSet: test-runner-e2e
|
|
1757
|
+
what: Maestro YAML flows for mobile e2e, which survive re-renders that break selector-based tools.
|
|
1758
|
+
stacks: [react-native, flutter]
|
|
1759
|
+
sources:
|
|
1760
|
+
- https://github.com/mobile-dev-inc/maestro
|
|
1761
|
+
requires: [testing-e2e]
|
|
1762
|
+
conflicts: []
|
|
1763
|
+
absorbs: [e2e-maestro]
|
|
1764
|
+
|
|
1765
|
+
- id: testing-http-mocking
|
|
1766
|
+
category: testing
|
|
1767
|
+
tier: capability
|
|
1768
|
+
status: proposed
|
|
1769
|
+
what: >-
|
|
1770
|
+
MSW handlers shared between the Node test setup and the browser worker, so one set of
|
|
1771
|
+
mocks serves unit tests, Storybook and local development.
|
|
1772
|
+
stacks: [node, typescript]
|
|
1773
|
+
sources:
|
|
1774
|
+
- https://github.com/mswjs/msw
|
|
1775
|
+
requires: []
|
|
1776
|
+
conflicts: []
|
|
1777
|
+
absorbs: [testing-msw, testing-http-mock-msw, testing-msw-node-setup, testing-msw-browser-worker, testing-fixtures-handlers]
|
|
1778
|
+
|
|
1779
|
+
- id: testing-testcontainers
|
|
1780
|
+
category: testing
|
|
1781
|
+
tier: capability
|
|
1782
|
+
status: proposed
|
|
1783
|
+
what: >-
|
|
1784
|
+
Real Postgres/Redis/Kafka in tests via Testcontainers, with a per-suite reset strategy
|
|
1785
|
+
(Respawn or truncate) rather than a per-test container, which is the usual perf mistake.
|
|
1786
|
+
stacks: [node, dotnet, python, go]
|
|
1787
|
+
sources:
|
|
1788
|
+
- https://github.com/testcontainers/testcontainers-node
|
|
1789
|
+
- https://github.com/testcontainers/testcontainers-dotnet
|
|
1790
|
+
requires: [docker]
|
|
1791
|
+
conflicts: []
|
|
1792
|
+
absorbs:
|
|
1793
|
+
[testing-integration-testcontainers-node, testing-integration-testcontainers-dotnet,
|
|
1794
|
+
testing-db-ephemeral, testing-db-reset-respawn, testing-integration-setup-teardown,
|
|
1795
|
+
testing-db-migrations-flyway]
|
|
1796
|
+
|
|
1797
|
+
- id: testing-contract
|
|
1798
|
+
category: testing
|
|
1799
|
+
tier: capability
|
|
1800
|
+
status: proposed
|
|
1801
|
+
what: >-
|
|
1802
|
+
Consumer-driven contracts - Pact consumer tests, broker publish from CI, and provider
|
|
1803
|
+
verification as a required check on the provider's PRs. Also covers message contracts.
|
|
1804
|
+
stacks: [node, dotnet, python, go]
|
|
1805
|
+
sources:
|
|
1806
|
+
- https://github.com/pact-foundation/pact-js
|
|
1807
|
+
- https://github.com/schemathesis/schemathesis
|
|
1808
|
+
requires: [ci-github-actions]
|
|
1809
|
+
conflicts: []
|
|
1810
|
+
absorbs:
|
|
1811
|
+
[testing-contract-pact, testing-contract-consumer, testing-contract-provider-verification,
|
|
1812
|
+
testing-contract-messaging, ci-contract-broker-publish, test-contract-conformance]
|
|
1813
|
+
|
|
1814
|
+
- id: testing-property
|
|
1815
|
+
category: testing
|
|
1816
|
+
tier: capability
|
|
1817
|
+
status: proposed
|
|
1818
|
+
what: >-
|
|
1819
|
+
Property-based tests with fast-check or Hypothesis, plus the seeded-replay convention that
|
|
1820
|
+
turns a flaky counterexample into a permanent regression test.
|
|
1821
|
+
stacks: [node, python]
|
|
1822
|
+
sources:
|
|
1823
|
+
- https://github.com/dubzzz/fast-check
|
|
1824
|
+
- https://github.com/HypothesisWorks/hypothesis
|
|
1825
|
+
requires: [testing-unit]
|
|
1826
|
+
conflicts: []
|
|
1827
|
+
absorbs: [testing-property-fast-check, testing-property-python, testing-seeded-replay, testing-model-based, testing-fuzz-inputs, testing-api-fuzz]
|
|
1828
|
+
|
|
1829
|
+
- id: testing-mutation
|
|
1830
|
+
category: testing
|
|
1831
|
+
tier: specialist
|
|
1832
|
+
status: proposed
|
|
1833
|
+
what: >-
|
|
1834
|
+
Stryker mutation testing with an incremental-analysis cache and a CI gate on the mutation
|
|
1835
|
+
score, which measures whether the tests assert anything rather than whether they ran.
|
|
1836
|
+
stacks: [node, dotnet]
|
|
1837
|
+
sources:
|
|
1838
|
+
- https://github.com/stryker-mutator/stryker-js
|
|
1839
|
+
requires: [testing-unit, ci-github-actions]
|
|
1840
|
+
conflicts: []
|
|
1841
|
+
absorbs: [testing-mutation-stryker, testing-mutation-ci-gate]
|
|
1842
|
+
|
|
1843
|
+
- id: testing-coverage-gate
|
|
1844
|
+
category: testing
|
|
1845
|
+
tier: capability
|
|
1846
|
+
status: proposed
|
|
1847
|
+
what: Coverage thresholds enforced in CI with a per-directory floor, not one global number.
|
|
1848
|
+
stacks: [any]
|
|
1849
|
+
sources:
|
|
1850
|
+
- https://github.com/nedbat/coveragepy
|
|
1851
|
+
- https://github.com/vitest-dev/vitest
|
|
1852
|
+
requires: [testing-unit, ci-github-actions]
|
|
1853
|
+
conflicts: []
|
|
1854
|
+
absorbs: [testing-coverage-gate, test-coverage-enforced, ci-coverage-report]
|
|
1855
|
+
|
|
1856
|
+
- id: testing-load
|
|
1857
|
+
category: testing
|
|
1858
|
+
tier: specialist
|
|
1859
|
+
status: proposed
|
|
1860
|
+
what: >-
|
|
1861
|
+
k6 or Locust load scripts with thresholds as pass/fail, run as a smoke-sized job on every
|
|
1862
|
+
PR and a full run on a schedule.
|
|
1863
|
+
stacks: [any]
|
|
1864
|
+
sources:
|
|
1865
|
+
- https://github.com/locustio/locust
|
|
1866
|
+
- https://github.com/grafana/k6
|
|
1867
|
+
requires: []
|
|
1868
|
+
conflicts: []
|
|
1869
|
+
absorbs: [testing-load-locust, testing-load-distributed, testing-load-docker, ci-load-smoke]
|
|
1870
|
+
|
|
1871
|
+
- id: evals
|
|
1872
|
+
category: ai-llm
|
|
1873
|
+
tier: capability
|
|
1874
|
+
status: built
|
|
1875
|
+
what: >-
|
|
1876
|
+
LLM eval harness - golden dataset, runner, budget caps, tracing and a CI gate on the
|
|
1877
|
+
eval score.
|
|
1878
|
+
stacks: [python, node]
|
|
1879
|
+
sources:
|
|
1880
|
+
- https://github.com/promptfoo/promptfoo
|
|
1881
|
+
- https://github.com/pydantic/pydantic-ai
|
|
1882
|
+
requires: []
|
|
1883
|
+
conflicts: []
|
|
1884
|
+
provides:
|
|
1885
|
+
[llm-evals, eval-harness, golden-dataset, eval-runner, eval-budget-caps, eval-tracing, eval-gate]
|
|
1886
|
+
absorbs:
|
|
1887
|
+
[evals-promptfoo, evals-pydantic-evals, evals-deepeval, evals-pytest, evals-rag-metrics,
|
|
1888
|
+
ci-evals-github-actions, redteam-promptfoo]
|
|
1889
|
+
|
|
1890
|
+
# ===========================================================================================
|
|
1891
|
+
# TIER: capability - observability
|
|
1892
|
+
# ===========================================================================================
|
|
1893
|
+
|
|
1894
|
+
- id: observability-otel
|
|
1895
|
+
category: observability
|
|
1896
|
+
tier: capability
|
|
1897
|
+
status: built
|
|
1898
|
+
what: >-
|
|
1899
|
+
OpenTelemetry tracing, metrics and structured logging behind one OTLP exporter, so the
|
|
1900
|
+
backend is a config change rather than a code change.
|
|
1901
|
+
stacks: [any]
|
|
1902
|
+
sources:
|
|
1903
|
+
- https://github.com/open-telemetry/opentelemetry-collector-contrib
|
|
1904
|
+
- https://github.com/open-telemetry/opentelemetry-demo
|
|
1905
|
+
requires: []
|
|
1906
|
+
conflicts: [dotnet-aspire]
|
|
1907
|
+
provides:
|
|
1908
|
+
[observability, opentelemetry, tracing, metrics, structured-logging, otlp-exporter]
|
|
1909
|
+
absorbs:
|
|
1910
|
+
[observability-opentelemetry, obs-opentelemetry, otel-exporter-otlp, obs-dashboard-otlp,
|
|
1911
|
+
otel-instrumentation-polyglot]
|
|
1912
|
+
|
|
1913
|
+
- id: otel-instrumentation-node
|
|
1914
|
+
category: observability
|
|
1915
|
+
tier: capability
|
|
1916
|
+
status: proposed
|
|
1917
|
+
what: >-
|
|
1918
|
+
Node SDK bootstrap loaded before app code, auto-instrumentations for http/express/pg, and
|
|
1919
|
+
the resource attributes that make service.name/version/env show up correctly.
|
|
1920
|
+
stacks: [node]
|
|
1921
|
+
sources:
|
|
1922
|
+
- https://github.com/open-telemetry/opentelemetry-js
|
|
1923
|
+
- https://github.com/open-telemetry/opentelemetry-js-contrib
|
|
1924
|
+
requires: [observability-otel]
|
|
1925
|
+
conflicts: []
|
|
1926
|
+
absorbs: [otel-instrumentation-node, obs-http-server-instrumentation]
|
|
1927
|
+
|
|
1928
|
+
- id: otel-instrumentation-python
|
|
1929
|
+
category: observability
|
|
1930
|
+
tier: capability
|
|
1931
|
+
status: proposed
|
|
1932
|
+
what: Python SDK plus the zero-code `opentelemetry-instrument` agent path and its trade-offs.
|
|
1933
|
+
stacks: [python]
|
|
1934
|
+
sources:
|
|
1935
|
+
- https://github.com/open-telemetry/opentelemetry-python
|
|
1936
|
+
- https://github.com/open-telemetry/opentelemetry-python-contrib
|
|
1937
|
+
requires: [observability-otel]
|
|
1938
|
+
conflicts: []
|
|
1939
|
+
absorbs: [otel-instrumentation-python, otel-agent-python, obs-tracing-python]
|
|
1940
|
+
|
|
1941
|
+
- id: otel-instrumentation-go
|
|
1942
|
+
category: observability
|
|
1943
|
+
tier: capability
|
|
1944
|
+
status: proposed
|
|
1945
|
+
what: Go SDK with otelhttp/otelgrpc handlers - explicit wiring, no agent.
|
|
1946
|
+
stacks: [go]
|
|
1947
|
+
sources:
|
|
1948
|
+
- https://github.com/open-telemetry/opentelemetry-go
|
|
1949
|
+
- https://github.com/open-telemetry/opentelemetry-go-contrib
|
|
1950
|
+
requires: [observability-otel]
|
|
1951
|
+
conflicts: []
|
|
1952
|
+
absorbs: [otel-instrumentation-go]
|
|
1953
|
+
|
|
1954
|
+
- id: otel-instrumentation-dotnet
|
|
1955
|
+
category: observability
|
|
1956
|
+
tier: capability
|
|
1957
|
+
status: proposed
|
|
1958
|
+
what: .NET OTel with ActivitySource, Meter, and the contrib instrumentation packages.
|
|
1959
|
+
stacks: [dotnet]
|
|
1960
|
+
sources:
|
|
1961
|
+
- https://github.com/open-telemetry/opentelemetry-dotnet
|
|
1962
|
+
- https://github.com/open-telemetry/opentelemetry-dotnet-contrib
|
|
1963
|
+
requires: [observability-otel]
|
|
1964
|
+
conflicts: []
|
|
1965
|
+
absorbs: [otel-instrumentation-dotnet, obs-dotnet-servicedefaults]
|
|
1966
|
+
|
|
1967
|
+
- id: otel-instrumentation-jvm
|
|
1968
|
+
category: observability
|
|
1969
|
+
tier: capability
|
|
1970
|
+
status: proposed
|
|
1971
|
+
what: JVM javaagent attach plus Micrometer bridge for existing metrics.
|
|
1972
|
+
stacks: [jvm]
|
|
1973
|
+
sources:
|
|
1974
|
+
- https://github.com/open-telemetry/opentelemetry-java-instrumentation
|
|
1975
|
+
requires: [observability-otel]
|
|
1976
|
+
conflicts: []
|
|
1977
|
+
absorbs: [otel-instrumentation-java, otel-agent-jvm, obs-tracing-jvm, obs-metrics-jvm, obs-metrics-jvm-micrometer]
|
|
1978
|
+
|
|
1979
|
+
- id: otel-collector
|
|
1980
|
+
category: observability
|
|
1981
|
+
tier: capability
|
|
1982
|
+
status: proposed
|
|
1983
|
+
what: >-
|
|
1984
|
+
Collector config - receivers/processors/exporters, batch and memory_limiter, attribute
|
|
1985
|
+
redaction, and tail sampling. The processor pipeline is where PII scrubbing belongs, once,
|
|
1986
|
+
rather than in every service.
|
|
1987
|
+
stacks: [any]
|
|
1988
|
+
sources:
|
|
1989
|
+
- https://github.com/open-telemetry/opentelemetry-collector-contrib
|
|
1990
|
+
- https://github.com/open-telemetry/opentelemetry-collector-releases
|
|
1991
|
+
- https://github.com/grafana/alloy
|
|
1992
|
+
requires: [observability-otel]
|
|
1993
|
+
conflicts: []
|
|
1994
|
+
absorbs:
|
|
1995
|
+
[otel-collector-config, otel-collector-alloy, otel-collector-custom-distro,
|
|
1996
|
+
obs-pipeline-processors, obs-tail-sampling, observability-pii-scrubbing,
|
|
1997
|
+
obs-host-container-metrics]
|
|
1998
|
+
|
|
1999
|
+
- id: logging-structured
|
|
2000
|
+
category: observability
|
|
2001
|
+
tier: capability
|
|
2002
|
+
status: proposed
|
|
2003
|
+
what: >-
|
|
2004
|
+
JSON logs with a per-language library (pino / structlog / zap / zerolog / Serilog), context
|
|
2005
|
+
variables carried across async boundaries, trace_id and span_id injected on every line, and
|
|
2006
|
+
a redaction list. The trace-correlation piece is what makes logs worth having next to traces.
|
|
2007
|
+
stacks: [node, python, go, dotnet]
|
|
2008
|
+
sources:
|
|
2009
|
+
- https://github.com/pinojs/pino
|
|
2010
|
+
- https://github.com/hynek/structlog
|
|
2011
|
+
- https://github.com/uber-go/zap
|
|
2012
|
+
- https://github.com/rs/zerolog
|
|
2013
|
+
- https://github.com/serilog/serilog
|
|
2014
|
+
requires: []
|
|
2015
|
+
conflicts: []
|
|
2016
|
+
absorbs:
|
|
2017
|
+
[obs-structured-logging, logging-structured-node-pino, logging-structured-python-structlog,
|
|
2018
|
+
logging-structured-go-zap, logging-structured-go-zerolog, logging-structured-dotnet-serilog,
|
|
2019
|
+
logging-json-renderer, logging-context-vars, logging-enrichers, logging-redaction,
|
|
2020
|
+
logging-sampling, logging-http-middleware, logging-testable,
|
|
2021
|
+
logging-trace-correlation-node, logging-trace-correlation-python,
|
|
2022
|
+
logging-trace-correlation-go, logging-trace-correlation-dotnet]
|
|
2023
|
+
|
|
2024
|
+
- id: metrics-prometheus
|
|
2025
|
+
category: observability
|
|
2026
|
+
tier: capability
|
|
2027
|
+
status: proposed
|
|
2028
|
+
what: >-
|
|
2029
|
+
Prometheus client registry, a /metrics endpoint, the four RED/USE series worth having by
|
|
2030
|
+
default, and recording rules so dashboards query pre-aggregated series.
|
|
2031
|
+
stacks: [go, node, python, dotnet]
|
|
2032
|
+
sources:
|
|
2033
|
+
- https://github.com/prometheus/client_golang
|
|
2034
|
+
- https://github.com/prometheus/prometheus
|
|
2035
|
+
requires: []
|
|
2036
|
+
conflicts: []
|
|
2037
|
+
absorbs: [obs-metrics-prometheus, obs-metrics-go-client, obs-recording-rules]
|
|
2038
|
+
|
|
2039
|
+
- id: health-checks
|
|
2040
|
+
category: observability
|
|
2041
|
+
tier: foundation
|
|
2042
|
+
status: built
|
|
2043
|
+
what: Liveness, readiness and startup probes with dependency checks and a health endpoint.
|
|
2044
|
+
stacks: [any]
|
|
2045
|
+
sources:
|
|
2046
|
+
- https://github.com/nestjs/terminus
|
|
2047
|
+
- https://github.com/dotnet/aspnetcore
|
|
2048
|
+
requires: []
|
|
2049
|
+
conflicts: []
|
|
2050
|
+
provides:
|
|
2051
|
+
[health, liveness-probe, readiness-probe, startup-probe, dependency-probes,
|
|
2052
|
+
health-endpoint, health-config]
|
|
2053
|
+
absorbs:
|
|
2054
|
+
[obs-health-checks, health-checks-dotnet, health-checks-nestjs, health-checks-ui,
|
|
2055
|
+
health-readiness-go, obs-readiness-liveness-probes, obs-dependency-probes,
|
|
2056
|
+
obs-graceful-shutdown]
|
|
2057
|
+
|
|
2058
|
+
- id: obs-stack-local
|
|
2059
|
+
category: observability
|
|
2060
|
+
tier: capability
|
|
2061
|
+
status: proposed
|
|
2062
|
+
choiceSet: obs-backend
|
|
2063
|
+
what: >-
|
|
2064
|
+
A one-command local observability backend so traces have somewhere to go in development.
|
|
2065
|
+
docker-otel-lgtm is a single Apache-2.0 container; SigNoz and Jaeger are the alternatives.
|
|
2066
|
+
stacks: [any]
|
|
2067
|
+
sources:
|
|
2068
|
+
- https://github.com/grafana/docker-otel-lgtm
|
|
2069
|
+
- https://github.com/jaegertracing/jaeger
|
|
2070
|
+
- https://github.com/SigNoz/signoz
|
|
2071
|
+
requires: [docker-compose, observability-otel]
|
|
2072
|
+
conflicts: []
|
|
2073
|
+
absorbs:
|
|
2074
|
+
[obs-local-dev-backend, obs-stack-compose, obs-stack-lgtm-single-container,
|
|
2075
|
+
obs-stack-signoz, obs-trace-jaeger, obs-stack-prometheus-compose, obs-service-map]
|
|
2076
|
+
licenseNote: >-
|
|
2077
|
+
grafana/docker-otel-lgtm is Apache-2.0 and may be vendored, but the image it builds BUNDLES
|
|
2078
|
+
Loki and Grafana binaries, both AGPL-3.0. Running that image is fine. Copying Loki or
|
|
2079
|
+
Grafana source, plugin code or bundled dashboard JSON out of it is not. Any Grafana
|
|
2080
|
+
provisioning YAML shipped by a Groundplan layer must be authored by us.
|
|
2081
|
+
|
|
2082
|
+
- id: obs-stack-kubernetes
|
|
2083
|
+
category: observability
|
|
2084
|
+
tier: specialist
|
|
2085
|
+
status: proposed
|
|
2086
|
+
choiceSet: obs-backend
|
|
2087
|
+
what: kube-prometheus jsonnet stack - operator, exporters, default rules and alerts.
|
|
2088
|
+
stacks: [kubernetes]
|
|
2089
|
+
sources:
|
|
2090
|
+
- https://github.com/prometheus-operator/kube-prometheus
|
|
2091
|
+
requires: [k8s-manifests]
|
|
2092
|
+
conflicts: []
|
|
2093
|
+
absorbs: [obs-stack-kubernetes, observability-kube-prometheus]
|
|
2094
|
+
|
|
2095
|
+
- id: obs-slo
|
|
2096
|
+
category: observability
|
|
2097
|
+
tier: capability
|
|
2098
|
+
status: proposed
|
|
2099
|
+
what: >-
|
|
2100
|
+
SLO definitions in the OpenSLO format, compiled by Sloth or Pyrra into Prometheus recording
|
|
2101
|
+
and multi-window burn-rate alert rules. Alert on burn rate, never on raw error count -
|
|
2102
|
+
that is the whole point and the thing most teams get wrong.
|
|
2103
|
+
stacks: [any]
|
|
2104
|
+
sources:
|
|
2105
|
+
- https://github.com/OpenSLO/OpenSLO
|
|
2106
|
+
- https://github.com/slok/sloth
|
|
2107
|
+
- https://github.com/pyrra-dev/pyrra
|
|
2108
|
+
requires: [metrics-prometheus]
|
|
2109
|
+
conflicts: []
|
|
2110
|
+
absorbs:
|
|
2111
|
+
[obs-slo-definitions, obs-slo-tracking, slo-definitions-openslo, slo-prometheus-sloth,
|
|
2112
|
+
slo-prometheus-rules, slo-multi-backend-generator, slo-error-budget,
|
|
2113
|
+
obs-alerting-burnrate, obs-alerting-rules, obs-alertmanager-rules,
|
|
2114
|
+
observability-alerting-rules]
|
|
2115
|
+
|
|
2116
|
+
- id: obs-error-tracking
|
|
2117
|
+
category: observability
|
|
2118
|
+
tier: capability
|
|
2119
|
+
status: proposed
|
|
2120
|
+
what: >-
|
|
2121
|
+
Sentry SDK wiring per runtime, source-map upload in CI, release tracking tied to the
|
|
2122
|
+
deploy, and a PII scrubbing config that is on by default rather than opt-in.
|
|
2123
|
+
stacks: [node, python, react, react-native]
|
|
2124
|
+
sources:
|
|
2125
|
+
- https://github.com/getsentry/sentry-javascript
|
|
2126
|
+
- https://github.com/getsentry/sentry-python
|
|
2127
|
+
requires: []
|
|
2128
|
+
conflicts: []
|
|
2129
|
+
absorbs:
|
|
2130
|
+
[observability-sentry, observability-sentry-nextjs, observability-sentry-node,
|
|
2131
|
+
observability-sentry-python, observability-sentry-react, obs-sourcemaps-upload,
|
|
2132
|
+
obs-release-tracking]
|
|
2133
|
+
licenseNote: >-
|
|
2134
|
+
The Sentry SDKs (getsentry/sentry-javascript, -python) are MIT and vendorable. The Sentry
|
|
2135
|
+
SERVER (getsentry/sentry) is FSL-1.1-Apache-2.0, source-available, and EXCLUDED. Do not
|
|
2136
|
+
conflate them.
|
|
2137
|
+
|
|
2138
|
+
- id: obs-dashboards
|
|
2139
|
+
category: observability
|
|
2140
|
+
tier: capability
|
|
2141
|
+
status: proposed
|
|
2142
|
+
what: >-
|
|
2143
|
+
Dashboard JSON checked into the repo and provisioned as code, covering the RED signals for
|
|
2144
|
+
each service plus one unified overview.
|
|
2145
|
+
stacks: [any]
|
|
2146
|
+
sources: []
|
|
2147
|
+
requires: [obs-stack-local]
|
|
2148
|
+
conflicts: []
|
|
2149
|
+
absorbs: [obs-grafana-provisioning, obs-dashboard-unified, observability-grafana-dashboards]
|
|
2150
|
+
fromScratch: true
|
|
2151
|
+
licenseNote: >-
|
|
2152
|
+
Grafana is AGPL-3.0 - EXCLUDED. No dashboard JSON, plugin code or provisioning file may be
|
|
2153
|
+
copied out of grafana/grafana. Provisioning YAML and dashboard JSON that WE author is our
|
|
2154
|
+
own work and carries no obligation. This layer must be written from scratch. See gaps.md.
|
|
2155
|
+
|
|
2156
|
+
- id: obs-ebpf-zero-instrumentation
|
|
2157
|
+
category: observability
|
|
2158
|
+
tier: specialist
|
|
2159
|
+
status: proposed
|
|
2160
|
+
what: eBPF auto-instrumentation for services that cannot be recompiled or re-deployed.
|
|
2161
|
+
stacks: [linux]
|
|
2162
|
+
sources:
|
|
2163
|
+
- https://github.com/grafana/beyla
|
|
2164
|
+
requires: []
|
|
2165
|
+
conflicts: []
|
|
2166
|
+
absorbs: [obs-ebpf-zero-instrumentation]
|
|
2167
|
+
|
|
2168
|
+
- id: audit-log
|
|
2169
|
+
category: security-compliance
|
|
2170
|
+
tier: capability
|
|
2171
|
+
status: built
|
|
2172
|
+
what: >-
|
|
2173
|
+
Append-only, tamper-evident audit trail with field redaction and a compliance-shaped
|
|
2174
|
+
event schema.
|
|
2175
|
+
stacks: [any]
|
|
2176
|
+
sources:
|
|
2177
|
+
- https://github.com/jasontaylordev/CleanArchitecture
|
|
2178
|
+
requires: []
|
|
2179
|
+
conflicts: []
|
|
2180
|
+
provides:
|
|
2181
|
+
[audit-log, audit-trail, append-only-log, tamper-evident-log, compliance-logging,
|
|
2182
|
+
audit-config, field-redaction]
|
|
2183
|
+
|
|
2184
|
+
# ===========================================================================================
|
|
2185
|
+
# TIER: capability - security / supply chain
|
|
2186
|
+
# ===========================================================================================
|
|
2187
|
+
|
|
2188
|
+
- id: security-supply-chain
|
|
2189
|
+
category: security-compliance
|
|
2190
|
+
tier: foundation
|
|
2191
|
+
status: built
|
|
2192
|
+
what: >-
|
|
2193
|
+
Dependency updates, dependency review, SAST/code scanning, secret scanning, SBOM,
|
|
2194
|
+
scorecard, pinned actions and a SECURITY.md.
|
|
2195
|
+
stacks: [any]
|
|
2196
|
+
sources:
|
|
2197
|
+
- https://github.com/ossf/scorecard
|
|
2198
|
+
- https://github.com/step-security/harden-runner
|
|
2199
|
+
- https://github.com/gitleaks/gitleaks
|
|
2200
|
+
requires: [ci-github-actions]
|
|
2201
|
+
conflicts: []
|
|
2202
|
+
provides:
|
|
2203
|
+
[supply-chain-security, dependency-updates, dependency-review, sast, code-scanning,
|
|
2204
|
+
secret-scanning, sbom, scorecard, pinned-actions, security-policy]
|
|
2205
|
+
absorbs: [security-hardening-baseline, security-posture-scorecard]
|
|
2206
|
+
licenseNote: >-
|
|
2207
|
+
This layer ships a renovate.json. renovatebot/renovate is AGPL-3.0. Referencing a preset by
|
|
2208
|
+
name (`config:recommended`) is use, not distribution, and is fine. Inlining a preset body
|
|
2209
|
+
into this layer is distribution and is not. The file must stay reference-by-name.
|
|
2210
|
+
|
|
2211
|
+
- id: security-secret-scanning
|
|
2212
|
+
category: security-compliance
|
|
2213
|
+
tier: capability
|
|
2214
|
+
status: proposed
|
|
2215
|
+
what: >-
|
|
2216
|
+
A repo-local .gitleaks.toml that `[extend] useDefault = true` rather than forking the 222
|
|
2217
|
+
default rules, a lockfile/dist allowlist so the first run does not drown the user, a
|
|
2218
|
+
pre-commit hook, and the `--baseline-path` flow for brownfield adoption.
|
|
2219
|
+
stacks: [any]
|
|
2220
|
+
sources:
|
|
2221
|
+
- https://github.com/gitleaks/gitleaks
|
|
2222
|
+
requires: []
|
|
2223
|
+
conflicts: []
|
|
2224
|
+
portability: ci-agnostic
|
|
2225
|
+
absorbs: [security-secret-scanning, security-precommit-hooks]
|
|
2226
|
+
licenseNote: >-
|
|
2227
|
+
gitleaks is MIT - vendorable. trufflesecurity/trufflehog, the tool everyone reflexively
|
|
2228
|
+
pairs with it, is AGPL-3.0 and EXCLUDED. Do not add it as a "companion scanner".
|
|
2229
|
+
|
|
2230
|
+
- id: security-sast-codeql
|
|
2231
|
+
category: security-compliance
|
|
2232
|
+
tier: capability
|
|
2233
|
+
status: proposed
|
|
2234
|
+
what: >-
|
|
2235
|
+
CodeQL workflow with a curated query-suite selection rather than the default everything,
|
|
2236
|
+
plus the SARIF upload that makes findings show as PR annotations.
|
|
2237
|
+
stacks: [any]
|
|
2238
|
+
sources:
|
|
2239
|
+
- https://github.com/github/codeql
|
|
2240
|
+
requires: [ci-github-actions]
|
|
2241
|
+
conflicts: []
|
|
2242
|
+
portability: github-actions-only
|
|
2243
|
+
absorbs: [security-sast, security-sast-codeql, security-codeql]
|
|
2244
|
+
licenseNote: >-
|
|
2245
|
+
github/codeql is MIT and the QUERIES are copyable - the only MIT source in this category
|
|
2246
|
+
whose value is its rule content. The CLI/engine ships from github/codeql-cli-binaries under
|
|
2247
|
+
separate commercial terms for closed-source analysis and is NOT redistributable. Vendor
|
|
2248
|
+
queries; reference the engine. semgrep/semgrep-rules is proprietary and EXCLUDED - it is
|
|
2249
|
+
the obvious-looking substitute and it is the wrong one.
|
|
2250
|
+
|
|
2251
|
+
- id: security-sbom
|
|
2252
|
+
category: security-compliance
|
|
2253
|
+
tier: capability
|
|
2254
|
+
status: proposed
|
|
2255
|
+
what: >-
|
|
2256
|
+
CycloneDX or SPDX SBOM generated by syft at build time, attached to the release, and fed
|
|
2257
|
+
to grype for vulnerability scanning. VEX statements suppress the false positives that
|
|
2258
|
+
otherwise make the scan output unreadable within a month.
|
|
2259
|
+
stacks: [any]
|
|
2260
|
+
sources:
|
|
2261
|
+
- https://github.com/anchore/syft
|
|
2262
|
+
- https://github.com/anchore/grype
|
|
2263
|
+
- https://github.com/CycloneDX/specification
|
|
2264
|
+
requires: [ci-github-actions]
|
|
2265
|
+
conflicts: []
|
|
2266
|
+
portability: ci-agnostic
|
|
2267
|
+
absorbs: [security-sbom, security-sbom-cyclonedx, supply-chain-sbom, security-vex, security-license-compliance]
|
|
2268
|
+
note: >-
|
|
2269
|
+
.syft.yaml and .grype.yaml are NOT checked into their upstream repos - they are config
|
|
2270
|
+
schemas this layer authors. Do not send anyone looking for a file to copy.
|
|
2271
|
+
|
|
2272
|
+
- id: security-vuln-scanning
|
|
2273
|
+
category: security-compliance
|
|
2274
|
+
tier: capability
|
|
2275
|
+
status: proposed
|
|
2276
|
+
what: >-
|
|
2277
|
+
Trivy scanning of filesystem, image and IaC in one tool, with the ignore-file and the
|
|
2278
|
+
exit-code policy that decides which severities actually fail a build.
|
|
2279
|
+
stacks: [any]
|
|
2280
|
+
sources:
|
|
2281
|
+
- https://github.com/aquasecurity/trivy
|
|
2282
|
+
- https://github.com/anchore/grype
|
|
2283
|
+
requires: [ci-github-actions]
|
|
2284
|
+
conflicts: []
|
|
2285
|
+
absorbs: [security-vulnerability-scanning, security-iac-scanning]
|
|
2286
|
+
|
|
2287
|
+
- id: security-artifact-signing
|
|
2288
|
+
category: security-compliance
|
|
2289
|
+
tier: capability
|
|
2290
|
+
status: proposed
|
|
2291
|
+
what: >-
|
|
2292
|
+
Keyless Sigstore signing of images and artifacts with an OIDC workload identity - no
|
|
2293
|
+
long-lived keys to rotate or leak - plus cosign verify as a deploy-time admission gate.
|
|
2294
|
+
gitsign extends the same identity model to commit signing.
|
|
2295
|
+
stacks: [any]
|
|
2296
|
+
sources:
|
|
2297
|
+
- https://github.com/sigstore/cosign
|
|
2298
|
+
- https://github.com/sigstore/gitsign
|
|
2299
|
+
requires: [ci-container-publish]
|
|
2300
|
+
conflicts: []
|
|
2301
|
+
absorbs:
|
|
2302
|
+
[security-artifact-signing, security-keyless-identity, security-commit-signing,
|
|
2303
|
+
supply-chain-sigstore, security-attestation]
|
|
2304
|
+
|
|
2305
|
+
- id: security-slsa-provenance
|
|
2306
|
+
category: security-compliance
|
|
2307
|
+
tier: capability
|
|
2308
|
+
status: proposed
|
|
2309
|
+
what: >-
|
|
2310
|
+
SLSA build provenance generated by the reusable workflow and attached as an attestation,
|
|
2311
|
+
giving a verifiable link from artifact back to source commit and builder.
|
|
2312
|
+
stacks: [any]
|
|
2313
|
+
sources:
|
|
2314
|
+
- https://github.com/slsa-framework/slsa-github-generator
|
|
2315
|
+
requires: [ci-github-actions]
|
|
2316
|
+
conflicts: []
|
|
2317
|
+
portability: github-actions-only
|
|
2318
|
+
absorbs: [security-slsa, security-build-provenance, supply-chain-slsa, supply-chain-provenance]
|
|
2319
|
+
licenseNote: >-
|
|
2320
|
+
The GENERATOR repo (slsa-framework/slsa-github-generator) is Apache-2.0 and vendorable.
|
|
2321
|
+
The SPEC repo (slsa-framework/slsa) is the Community Specification License 1.0 -
|
|
2322
|
+
reference-only. Cite the spec, vendor the generator.
|
|
2323
|
+
|
|
2324
|
+
- id: security-runner-hardening
|
|
2325
|
+
category: security-compliance
|
|
2326
|
+
tier: capability
|
|
2327
|
+
status: proposed
|
|
2328
|
+
what: >-
|
|
2329
|
+
harden-runner egress policy plus SHA-pinned actions, so a compromised third-party action
|
|
2330
|
+
cannot exfiltrate secrets. `block` mode after an audit-mode learning period.
|
|
2331
|
+
stacks: [any]
|
|
2332
|
+
sources:
|
|
2333
|
+
- https://github.com/step-security/harden-runner
|
|
2334
|
+
requires: [ci-github-actions]
|
|
2335
|
+
conflicts: []
|
|
2336
|
+
portability: github-actions-only
|
|
2337
|
+
absorbs: [ci-runner-hardening, ci-security-gates]
|
|
2338
|
+
|
|
2339
|
+
- id: security-headers
|
|
2340
|
+
category: security-compliance
|
|
2341
|
+
tier: capability
|
|
2342
|
+
status: proposed
|
|
2343
|
+
what: >-
|
|
2344
|
+
The fourteen helmet middlewares with a CSP that is actually restrictive, plus the
|
|
2345
|
+
report-only rollout path that makes a strict CSP deployable without breaking the app.
|
|
2346
|
+
stacks: [node]
|
|
2347
|
+
sources:
|
|
2348
|
+
- https://github.com/helmetjs/helmet
|
|
2349
|
+
requires: []
|
|
2350
|
+
conflicts: []
|
|
2351
|
+
absorbs: [security-headers, security-csp, backend-express-hardening]
|
|
2352
|
+
|
|
2353
|
+
- id: security-policy-as-code
|
|
2354
|
+
category: security-compliance
|
|
2355
|
+
tier: specialist
|
|
2356
|
+
status: proposed
|
|
2357
|
+
what: >-
|
|
2358
|
+
Rego policies run by conftest against Kubernetes manifests, Terraform plans, Dockerfiles
|
|
2359
|
+
and CI config, with the policy unit tests that keep the policies honest.
|
|
2360
|
+
stacks: [any]
|
|
2361
|
+
sources:
|
|
2362
|
+
- https://github.com/open-policy-agent/conftest
|
|
2363
|
+
requires: []
|
|
2364
|
+
conflicts: []
|
|
2365
|
+
absorbs: [security-policy-as-code, compliance-policy-rego]
|
|
2366
|
+
note: Terraform examples live under examples/hcl1 and examples/hcl2, not examples/terraform.
|
|
2367
|
+
|
|
2368
|
+
- id: compliance-oscal
|
|
2369
|
+
category: security-compliance
|
|
2370
|
+
tier: specialist
|
|
2371
|
+
status: proposed
|
|
2372
|
+
what: >-
|
|
2373
|
+
OSCAL control catalogs and SSP authoring with compliance-trestle, plus ComplianceAsCode
|
|
2374
|
+
control mappings (products/rhel9/controls/cis_rhel9.yml is the shape) and automated
|
|
2375
|
+
evidence generation from CI runs.
|
|
2376
|
+
stacks: [any]
|
|
2377
|
+
sources:
|
|
2378
|
+
- https://github.com/oscal-compass/compliance-trestle
|
|
2379
|
+
- https://github.com/ComplianceAsCode/content
|
|
2380
|
+
requires: []
|
|
2381
|
+
conflicts: []
|
|
2382
|
+
absorbs: [compliance-oscal, compliance-as-code, compliance-control-mapping, compliance-evidence-generation]
|
|
2383
|
+
licenseNote: >-
|
|
2384
|
+
ComplianceAsCode/content is BSD-3-Clause with exactly one root LICENSE and no sub-directory
|
|
2385
|
+
overrides (checked). Attribution required. OWASP/ASVS and OWASP/CheatSheetSeries are
|
|
2386
|
+
CC-BY-SA-4.0 and reference-only - restate control text in original words, never paste it.
|
|
2387
|
+
|
|
2388
|
+
- id: security-arcjet
|
|
2389
|
+
category: security-compliance
|
|
2390
|
+
tier: specialist
|
|
2391
|
+
status: proposed
|
|
2392
|
+
what: Bot detection, rate limiting and shield rules declared in application code.
|
|
2393
|
+
stacks: [node]
|
|
2394
|
+
sources:
|
|
2395
|
+
- https://github.com/arcjet/arcjet-js
|
|
2396
|
+
requires: []
|
|
2397
|
+
conflicts: []
|
|
2398
|
+
absorbs: [security-arcjet]
|
|
2399
|
+
|
|
2400
|
+
# ===========================================================================================
|
|
2401
|
+
# TIER: capability - async / realtime
|
|
2402
|
+
# ===========================================================================================
|
|
2403
|
+
|
|
2404
|
+
- id: queue-broker
|
|
2405
|
+
category: realtime-messaging
|
|
2406
|
+
tier: capability
|
|
2407
|
+
status: built
|
|
2408
|
+
what: >-
|
|
2409
|
+
Background job queue with retry, dead-letter and worker lifecycle behind a broker-agnostic
|
|
2410
|
+
config surface.
|
|
2411
|
+
stacks: [any]
|
|
2412
|
+
sources:
|
|
2413
|
+
- https://github.com/taskforcesh/bullmq
|
|
2414
|
+
- https://github.com/celery/celery
|
|
2415
|
+
requires: []
|
|
2416
|
+
conflicts: [react-vite-spa, turborepo-monorepo]
|
|
2417
|
+
provides:
|
|
2418
|
+
[queue, message-queue, background-jobs, async-worker, job-retry, dead-letter, queue-config]
|
|
2419
|
+
absorbs: [queue-worker-process, queue-dashboard, queue-priority-queues, queue-concurrency-control]
|
|
2420
|
+
note: >-
|
|
2421
|
+
The conflicts are from the shipped blueprint and look like guards against adding a worker
|
|
2422
|
+
process to a repo with no server. Preserved verbatim; worth re-examining, since a
|
|
2423
|
+
turborepo monorepo is exactly where a separate worker app belongs.
|
|
2424
|
+
|
|
2425
|
+
- id: queue-bullmq
|
|
2426
|
+
category: realtime-messaging
|
|
2427
|
+
tier: capability
|
|
2428
|
+
status: proposed
|
|
2429
|
+
choiceSet: queue-backend
|
|
2430
|
+
what: >-
|
|
2431
|
+
BullMQ on Redis - repeatable cron jobs, flow DAGs for parent/child work, and the
|
|
2432
|
+
QueueEvents stream. The flows feature is the differentiator; most queues have no DAG.
|
|
2433
|
+
stacks: [node]
|
|
2434
|
+
sources:
|
|
2435
|
+
- https://github.com/taskforcesh/bullmq
|
|
2436
|
+
requires: [queue-broker, cache-redis]
|
|
2437
|
+
conflicts: []
|
|
2438
|
+
absorbs: [queue-bullmq-redis, queue-redis-bullmq, queue-flows-dag, queue-cron-repeatable]
|
|
2439
|
+
|
|
2440
|
+
- id: queue-celery
|
|
2441
|
+
category: realtime-messaging
|
|
2442
|
+
tier: capability
|
|
2443
|
+
status: proposed
|
|
2444
|
+
choiceSet: queue-backend
|
|
2445
|
+
what: Celery workers, beat scheduler and the Redis/RabbitMQ broker split.
|
|
2446
|
+
stacks: [python]
|
|
2447
|
+
sources:
|
|
2448
|
+
- https://github.com/celery/celery
|
|
2449
|
+
requires: [queue-broker]
|
|
2450
|
+
conflicts: []
|
|
2451
|
+
absorbs: [queue-celery-python, queue-celery-redis, queue-celery-beat-scheduler]
|
|
2452
|
+
|
|
2453
|
+
- id: queue-asynq
|
|
2454
|
+
category: realtime-messaging
|
|
2455
|
+
tier: capability
|
|
2456
|
+
status: proposed
|
|
2457
|
+
choiceSet: queue-backend
|
|
2458
|
+
what: Asynq on Redis for Go - typed task payloads, priority queues, and a web dashboard.
|
|
2459
|
+
stacks: [go]
|
|
2460
|
+
sources:
|
|
2461
|
+
- https://github.com/hibiken/asynq
|
|
2462
|
+
requires: [queue-broker, cache-redis]
|
|
2463
|
+
conflicts: []
|
|
2464
|
+
absorbs: [queue-asynq-go, jobs-background-queue]
|
|
2465
|
+
|
|
2466
|
+
- id: queue-postgres-native
|
|
2467
|
+
category: realtime-messaging
|
|
2468
|
+
tier: capability
|
|
2469
|
+
status: proposed
|
|
2470
|
+
choiceSet: queue-backend
|
|
2471
|
+
what: >-
|
|
2472
|
+
Jobs as rows in the app's own Postgres, enqueued in the SAME transaction as the business
|
|
2473
|
+
write - so job and data commit or roll back together and the dual-write problem simply
|
|
2474
|
+
does not exist. No extra infrastructure. Throughput ceiling is Postgres's.
|
|
2475
|
+
stacks: [postgres]
|
|
2476
|
+
sources:
|
|
2477
|
+
- https://github.com/hatchet-dev/hatchet
|
|
2478
|
+
requires: [db-postgres]
|
|
2479
|
+
conflicts: []
|
|
2480
|
+
absorbs: [queue-postgres-native, queue-transactional-enqueue, queue-sql-storage-backed, queue-river-postgres, db-postgres-migrations]
|
|
2481
|
+
licenseNote: >-
|
|
2482
|
+
riverqueue/river - the cleanest expression of transactional enqueueing - is MPL-2.0,
|
|
2483
|
+
REFERENCE-ONLY. Keep it a go.mod dependency if used at all; never vendor its source. The
|
|
2484
|
+
IDEA is not copyrightable; the implementation is. Hatchet (Apache-2.0/MIT) is the
|
|
2485
|
+
vendorable source here.
|
|
2486
|
+
|
|
2487
|
+
- id: queue-hangfire
|
|
2488
|
+
category: realtime-messaging
|
|
2489
|
+
tier: specialist
|
|
2490
|
+
status: proposed
|
|
2491
|
+
choiceSet: queue-backend
|
|
2492
|
+
what: Background jobs for .NET stored in the app's existing SQL database.
|
|
2493
|
+
stacks: [dotnet]
|
|
2494
|
+
sources: []
|
|
2495
|
+
requires: [queue-broker]
|
|
2496
|
+
conflicts: []
|
|
2497
|
+
absorbs: [queue-hangfire-dotnet]
|
|
2498
|
+
fromScratch: true
|
|
2499
|
+
licenseNote: >-
|
|
2500
|
+
HangfireIO/Hangfire is a genuine trap: the API reports NOASSERTION and the internet calls
|
|
2501
|
+
it "open source", but the free arm of its multi-license is LGPL-3.0 - REFERENCE-ONLY, no
|
|
2502
|
+
file copying - and Pro/Ace (batches, Redis storage) are separately paid. Reimplement the
|
|
2503
|
+
pattern (persistent storage in the app's existing SQL database, no extra infrastructure)
|
|
2504
|
+
over a permissive base. See gaps.md.
|
|
2505
|
+
|
|
2506
|
+
- id: pattern-transactional-outbox
|
|
2507
|
+
category: realtime-messaging
|
|
2508
|
+
tier: capability
|
|
2509
|
+
status: proposed
|
|
2510
|
+
what: >-
|
|
2511
|
+
Outbox table written in the business transaction, relayed to the broker by a separate
|
|
2512
|
+
poller, with the consumer-side idempotency key that makes at-least-once delivery safe.
|
|
2513
|
+
Solves the same dual-write problem as queue-postgres-native but keeps a real broker.
|
|
2514
|
+
stacks: [any]
|
|
2515
|
+
sources:
|
|
2516
|
+
- https://github.com/dotnet/eShop
|
|
2517
|
+
- https://github.com/debezium/debezium
|
|
2518
|
+
requires: [db-core]
|
|
2519
|
+
conflicts: []
|
|
2520
|
+
absorbs: [pattern-transactional-outbox, msg-integration-events-outbox, pattern-event-driven, pattern-cqrs]
|
|
2521
|
+
|
|
2522
|
+
- id: broker-rabbitmq
|
|
2523
|
+
category: realtime-messaging
|
|
2524
|
+
tier: capability
|
|
2525
|
+
status: proposed
|
|
2526
|
+
choiceSet: broker
|
|
2527
|
+
what: AMQP exchange/queue/binding topology as declarative config, plus a DLX policy.
|
|
2528
|
+
stacks: [any]
|
|
2529
|
+
sources:
|
|
2530
|
+
- https://github.com/rabbitmq/rabbitmq-server
|
|
2531
|
+
requires: [docker-compose]
|
|
2532
|
+
conflicts: []
|
|
2533
|
+
absorbs: [broker-rabbitmq-amqp, msg-rabbitmq]
|
|
2534
|
+
|
|
2535
|
+
- id: broker-nats
|
|
2536
|
+
category: realtime-messaging
|
|
2537
|
+
tier: capability
|
|
2538
|
+
status: proposed
|
|
2539
|
+
choiceSet: broker
|
|
2540
|
+
what: >-
|
|
2541
|
+
NATS core pub/sub plus JetStream for persistence, and the KV store that comes free with
|
|
2542
|
+
JetStream and removes a Redis dependency for simple cases.
|
|
2543
|
+
stacks: [any]
|
|
2544
|
+
sources:
|
|
2545
|
+
- https://github.com/nats-io/nats-server
|
|
2546
|
+
- https://github.com/nats-io/nats.go
|
|
2547
|
+
requires: [docker-compose]
|
|
2548
|
+
conflicts: []
|
|
2549
|
+
absorbs: [broker-nats-core, broker-nats-jetstream, broker-kv-store]
|
|
2550
|
+
|
|
2551
|
+
- id: broker-kafka
|
|
2552
|
+
category: realtime-messaging
|
|
2553
|
+
tier: specialist
|
|
2554
|
+
status: proposed
|
|
2555
|
+
choiceSet: broker
|
|
2556
|
+
what: Kafka in KRaft mode (no ZooKeeper) with a schema registry and topic-as-code config.
|
|
2557
|
+
stacks: [any]
|
|
2558
|
+
sources:
|
|
2559
|
+
- https://github.com/apache/kafka
|
|
2560
|
+
requires: [docker-compose]
|
|
2561
|
+
conflicts: []
|
|
2562
|
+
absorbs: [broker-kafka, broker-kafka-kraft, pattern-schema-registry, data-streaming-kafka]
|
|
2563
|
+
|
|
2564
|
+
- id: broker-redis-streams
|
|
2565
|
+
category: realtime-messaging
|
|
2566
|
+
tier: capability
|
|
2567
|
+
status: proposed
|
|
2568
|
+
choiceSet: broker
|
|
2569
|
+
what: Redis Streams with consumer groups, for teams that already run Redis and want no more.
|
|
2570
|
+
stacks: [any]
|
|
2571
|
+
sources:
|
|
2572
|
+
- https://github.com/redis/redis
|
|
2573
|
+
requires: [cache-redis]
|
|
2574
|
+
conflicts: []
|
|
2575
|
+
absorbs: [broker-redis-streams]
|
|
2576
|
+
|
|
2577
|
+
- id: pubsub-abstraction
|
|
2578
|
+
category: realtime-messaging
|
|
2579
|
+
tier: capability
|
|
2580
|
+
status: proposed
|
|
2581
|
+
what: >-
|
|
2582
|
+
A publisher/subscriber interface over whichever broker was chosen, so the broker choice
|
|
2583
|
+
stays reversible. Watermill is the reference implementation of the shape.
|
|
2584
|
+
stacks: [go, any]
|
|
2585
|
+
sources:
|
|
2586
|
+
- https://github.com/ThreeDotsLabs/watermill
|
|
2587
|
+
requires: []
|
|
2588
|
+
conflicts: []
|
|
2589
|
+
absorbs: [pubsub-watermill-go]
|
|
2590
|
+
|
|
2591
|
+
- id: realtime-websocket
|
|
2592
|
+
category: realtime-messaging
|
|
2593
|
+
tier: capability
|
|
2594
|
+
status: proposed
|
|
2595
|
+
choiceSet: realtime-transport
|
|
2596
|
+
what: >-
|
|
2597
|
+
Raw WebSocket server with the three things every hand-rolled implementation forgets:
|
|
2598
|
+
heartbeat/ping-pong with a dead-connection timeout, auth on the HTTP upgrade rather than
|
|
2599
|
+
in the first message, and backpressure on slow consumers.
|
|
2600
|
+
stacks: [node, go, python]
|
|
2601
|
+
sources:
|
|
2602
|
+
- https://github.com/websockets/ws
|
|
2603
|
+
- https://github.com/gorilla/websocket
|
|
2604
|
+
requires: []
|
|
2605
|
+
conflicts: []
|
|
2606
|
+
absorbs:
|
|
2607
|
+
[realtime-websocket-echo, realtime-websocket-node, realtime-websocket-go,
|
|
2608
|
+
realtime-websocket-heartbeat, realtime-ws-auth-upgrade, realtime-python-async]
|
|
2609
|
+
|
|
2610
|
+
- id: realtime-socketio
|
|
2611
|
+
category: realtime-messaging
|
|
2612
|
+
tier: capability
|
|
2613
|
+
status: proposed
|
|
2614
|
+
choiceSet: realtime-transport
|
|
2615
|
+
what: >-
|
|
2616
|
+
Socket.IO server with rooms, the Redis adapter for multi-instance fanout, and the Next.js
|
|
2617
|
+
custom-server integration that is the usual sticking point.
|
|
2618
|
+
stacks: [node]
|
|
2619
|
+
sources:
|
|
2620
|
+
- https://github.com/socketio/socket.io
|
|
2621
|
+
requires: [cache-redis]
|
|
2622
|
+
conflicts: []
|
|
2623
|
+
absorbs: [realtime-socketio-server, realtime-socketio-redis-adapter, realtime-socketio-nextjs, realtime-chat-fanout]
|
|
2624
|
+
|
|
2625
|
+
- id: realtime-sse
|
|
2626
|
+
category: realtime-messaging
|
|
2627
|
+
tier: capability
|
|
2628
|
+
status: proposed
|
|
2629
|
+
choiceSet: realtime-transport
|
|
2630
|
+
what: >-
|
|
2631
|
+
Server-sent events for one-way streaming - the right answer far more often than a
|
|
2632
|
+
WebSocket, since it survives proxies, reconnects on its own, and needs no protocol upgrade.
|
|
2633
|
+
stacks: [node, python, go]
|
|
2634
|
+
sources:
|
|
2635
|
+
- https://github.com/fastapi/fastapi
|
|
2636
|
+
- https://github.com/centrifugal/centrifugo
|
|
2637
|
+
requires: []
|
|
2638
|
+
conflicts: []
|
|
2639
|
+
absorbs: [realtime-sse-broadcast, realtime-sse-fastapi, realtime-sse-centrifugo]
|
|
2640
|
+
|
|
2641
|
+
- id: realtime-centrifugo
|
|
2642
|
+
category: realtime-messaging
|
|
2643
|
+
tier: capability
|
|
2644
|
+
status: proposed
|
|
2645
|
+
choiceSet: realtime-transport
|
|
2646
|
+
what: >-
|
|
2647
|
+
Centrifugo as a realtime sidecar - the app never holds a socket, it publishes over an API
|
|
2648
|
+
and Centrifugo owns fanout, presence and connection tokens. The best fit when the app
|
|
2649
|
+
language has no good socket story.
|
|
2650
|
+
stacks: [any]
|
|
2651
|
+
sources:
|
|
2652
|
+
- https://github.com/centrifugal/centrifugo
|
|
2653
|
+
requires: [docker-compose]
|
|
2654
|
+
conflicts: []
|
|
2655
|
+
absorbs: [realtime-centrifugo, realtime-sidecar-service, realtime-jwt-connection-token, realtime-broadcast-channels]
|
|
2656
|
+
|
|
2657
|
+
- id: realtime-supabase
|
|
2658
|
+
category: realtime-messaging
|
|
2659
|
+
tier: capability
|
|
2660
|
+
status: proposed
|
|
2661
|
+
choiceSet: realtime-transport
|
|
2662
|
+
what: Postgres logical replication surfaced as client subscriptions, with presence built in.
|
|
2663
|
+
stacks: [postgres, node]
|
|
2664
|
+
sources:
|
|
2665
|
+
- https://github.com/supabase/realtime
|
|
2666
|
+
requires: [db-postgres]
|
|
2667
|
+
conflicts: []
|
|
2668
|
+
absorbs: [realtime-supabase, realtime-postgres-cdc, db-postgres-logical-replication]
|
|
2669
|
+
|
|
2670
|
+
- id: realtime-presence
|
|
2671
|
+
category: realtime-messaging
|
|
2672
|
+
tier: capability
|
|
2673
|
+
status: proposed
|
|
2674
|
+
what: >-
|
|
2675
|
+
Who-is-online state with a Redis-backed set, TTL expiry for ungraceful disconnects, and
|
|
2676
|
+
cross-instance fanout. The TTL is the part hand-rolled versions omit and then leak.
|
|
2677
|
+
stacks: [any]
|
|
2678
|
+
sources:
|
|
2679
|
+
- https://github.com/centrifugal/centrifugo
|
|
2680
|
+
- https://github.com/colyseus/colyseus
|
|
2681
|
+
requires: [cache-redis]
|
|
2682
|
+
conflicts: []
|
|
2683
|
+
absorbs: [realtime-presence, scaling-redis-presence]
|
|
2684
|
+
|
|
2685
|
+
- id: realtime-rooms
|
|
2686
|
+
category: realtime-messaging
|
|
2687
|
+
tier: capability
|
|
2688
|
+
status: proposed
|
|
2689
|
+
what: >-
|
|
2690
|
+
Authoritative room state with schema-based delta sync and a matchmaking/lobby entry point.
|
|
2691
|
+
Colyseus is the reference; its room lifecycle maps cleanly onto non-game use cases too.
|
|
2692
|
+
stacks: [node]
|
|
2693
|
+
sources:
|
|
2694
|
+
- https://github.com/colyseus/colyseus
|
|
2695
|
+
requires: [realtime-websocket]
|
|
2696
|
+
conflicts: []
|
|
2697
|
+
absorbs:
|
|
2698
|
+
[realtime-rooms, realtime-room-state-sync, realtime-matchmaking,
|
|
2699
|
+
realtime-multiplayer-colyseus, netcode-colyseus, matchmaking-rooms, matchmaking-lobby,
|
|
2700
|
+
state-sync-schema, test-colyseus-room]
|
|
2701
|
+
|
|
2702
|
+
- id: workflow-durable
|
|
2703
|
+
category: realtime-messaging
|
|
2704
|
+
tier: specialist
|
|
2705
|
+
status: proposed
|
|
2706
|
+
what: >-
|
|
2707
|
+
Durable execution - workflows that survive process restarts, with signals/queries for
|
|
2708
|
+
external interaction and an explicit versioning strategy so in-flight executions do not
|
|
2709
|
+
break on deploy. The versioning story is what separates this from a job queue.
|
|
2710
|
+
stacks: [any]
|
|
2711
|
+
sources:
|
|
2712
|
+
- https://github.com/temporalio/temporal
|
|
2713
|
+
- https://github.com/hatchet-dev/hatchet
|
|
2714
|
+
- https://github.com/triggerdotdev/trigger.dev
|
|
2715
|
+
requires: []
|
|
2716
|
+
conflicts: []
|
|
2717
|
+
absorbs:
|
|
2718
|
+
[workflow-durable-execution, workflow-temporal, workflow-hatchet, workflow-trigger-dev,
|
|
2719
|
+
workflow-signals-queries, workflow-versioning, workflows-saga-compensation,
|
|
2720
|
+
observability-task-monitoring, ai-scheduled-tasks]
|
|
2721
|
+
|
|
2722
|
+
- id: webhooks-inbound
|
|
2723
|
+
category: payments-billing
|
|
2724
|
+
tier: capability
|
|
2725
|
+
status: proposed
|
|
2726
|
+
what: >-
|
|
2727
|
+
Signature verification before body parse, an idempotency table keyed on the provider event
|
|
2728
|
+
id, an event log for replay, and a queue handoff so the handler returns 200 in
|
|
2729
|
+
milliseconds. Every one of these is a production incident if omitted.
|
|
2730
|
+
stacks: [any]
|
|
2731
|
+
sources:
|
|
2732
|
+
- https://github.com/stripe-samples/accept-a-payment
|
|
2733
|
+
- https://github.com/nextjs/saas-starter
|
|
2734
|
+
- https://github.com/useautumn/autumn
|
|
2735
|
+
requires: [queue-broker]
|
|
2736
|
+
conflicts: []
|
|
2737
|
+
absorbs:
|
|
2738
|
+
[webhooks-inbound-receiver, webhooks-signature-verify, webhooks-normalization,
|
|
2739
|
+
billing-webhook-event-log, billing-idempotency, payments-stripe-webhooks,
|
|
2740
|
+
webhooks-signed-events, events-cloudevents-ingest]
|
|
2741
|
+
|
|
2742
|
+
- id: webhooks-outbound
|
|
2743
|
+
category: payments-billing
|
|
2744
|
+
tier: capability
|
|
2745
|
+
status: proposed
|
|
2746
|
+
what: >-
|
|
2747
|
+
Outbound webhook delivery with HMAC signing, exponential-backoff retry from a queue, a
|
|
2748
|
+
per-endpoint circuit breaker, and a delivery log the customer can see.
|
|
2749
|
+
stacks: [any]
|
|
2750
|
+
sources:
|
|
2751
|
+
- https://github.com/useautumn/autumn
|
|
2752
|
+
requires: [queue-broker]
|
|
2753
|
+
conflicts: []
|
|
2754
|
+
absorbs: [webhooks-outbound, webhooks-outbound-delivery, webhooks-queue-retry]
|
|
2755
|
+
|
|
2756
|
+
# ===========================================================================================
|
|
2757
|
+
# TIER: domain - payments and billing
|
|
2758
|
+
# ===========================================================================================
|
|
2759
|
+
|
|
2760
|
+
- id: payments-provider-port
|
|
2761
|
+
category: payments-billing
|
|
2762
|
+
tier: domain
|
|
2763
|
+
status: proposed
|
|
2764
|
+
what: >-
|
|
2765
|
+
An interface over the PSP - create checkout, fetch subscription, cancel, resolve
|
|
2766
|
+
entitlement - so the provider choice is reversible and testable without network calls.
|
|
2767
|
+
Build this BEFORE any concrete provider, not after the second one is needed.
|
|
2768
|
+
stacks: [any]
|
|
2769
|
+
sources:
|
|
2770
|
+
- https://github.com/medusajs/medusa
|
|
2771
|
+
- https://github.com/hyperswitch-io/hyperswitch
|
|
2772
|
+
requires: []
|
|
2773
|
+
conflicts: []
|
|
2774
|
+
absorbs:
|
|
2775
|
+
[payments-provider-abstraction, payments-multi-psp-connector, payments-orchestration,
|
|
2776
|
+
payments-routing-retry, commerce-provider-adapter]
|
|
2777
|
+
|
|
2778
|
+
- id: payments-stripe
|
|
2779
|
+
category: payments-billing
|
|
2780
|
+
tier: domain
|
|
2781
|
+
status: proposed
|
|
2782
|
+
choiceSet: payments-provider
|
|
2783
|
+
what: >-
|
|
2784
|
+
Stripe Checkout and Elements flows, the customer/subscription sync table, and the webhook
|
|
2785
|
+
set that actually matters. t3dotgg/stripe-recommendations is the shortest correct
|
|
2786
|
+
description of the sync problem anywhere and should be read before writing a line of this.
|
|
2787
|
+
stacks: [node, python, php, dotnet]
|
|
2788
|
+
sources:
|
|
2789
|
+
- https://github.com/stripe-samples/accept-a-payment
|
|
2790
|
+
- https://github.com/stripe-samples/subscription-use-cases
|
|
2791
|
+
- https://github.com/t3dotgg/stripe-recommendations
|
|
2792
|
+
- https://github.com/nextjs/saas-starter
|
|
2793
|
+
requires: [payments-provider-port, webhooks-inbound]
|
|
2794
|
+
conflicts: []
|
|
2795
|
+
absorbs:
|
|
2796
|
+
[payments-stripe, payments-stripe-checkout, payments-stripe-elements,
|
|
2797
|
+
payments-stripe-subscriptions, payments-one-time, payments-session-model,
|
|
2798
|
+
billing-state-sync]
|
|
2799
|
+
|
|
2800
|
+
- id: payments-merchant-of-record
|
|
2801
|
+
category: payments-billing
|
|
2802
|
+
tier: domain
|
|
2803
|
+
status: proposed
|
|
2804
|
+
choiceSet: payments-provider
|
|
2805
|
+
what: >-
|
|
2806
|
+
Polar or Lemon Squeezy as merchant of record - they own VAT/sales-tax liability, which is
|
|
2807
|
+
the entire reason to accept the higher fee. Different data model from Stripe: you get
|
|
2808
|
+
orders and benefits, not charges and subscriptions.
|
|
2809
|
+
stacks: [node]
|
|
2810
|
+
sources:
|
|
2811
|
+
- https://github.com/polarsource/polar
|
|
2812
|
+
requires: [payments-provider-port, webhooks-inbound]
|
|
2813
|
+
conflicts: []
|
|
2814
|
+
absorbs: [payments-merchant-of-record, payments-polar, payments-lemon-squeezy]
|
|
2815
|
+
|
|
2816
|
+
- id: payments-framework-native
|
|
2817
|
+
category: payments-billing
|
|
2818
|
+
tier: domain
|
|
2819
|
+
status: proposed
|
|
2820
|
+
choiceSet: payments-provider
|
|
2821
|
+
what: Laravel Cashier or dj-stripe - the framework's own Stripe integration and its models.
|
|
2822
|
+
stacks: [php, python]
|
|
2823
|
+
sources:
|
|
2824
|
+
- https://github.com/laravel/cashier-stripe
|
|
2825
|
+
- https://github.com/dj-stripe/dj-stripe
|
|
2826
|
+
requires: [payments-provider-port]
|
|
2827
|
+
conflicts: []
|
|
2828
|
+
absorbs: [framework-laravel, framework-django, db-postgres-django]
|
|
2829
|
+
|
|
2830
|
+
- id: billing-subscription-model
|
|
2831
|
+
category: payments-billing
|
|
2832
|
+
tier: domain
|
|
2833
|
+
status: proposed
|
|
2834
|
+
what: >-
|
|
2835
|
+
The local schema mirroring the PSP - plan catalog with versioned prices, subscription
|
|
2836
|
+
state machine, trial and proration handling, upgrade/downgrade paths. Owning this locally
|
|
2837
|
+
is what makes the app queryable without hitting the PSP on every request.
|
|
2838
|
+
stacks: [any]
|
|
2839
|
+
sources:
|
|
2840
|
+
- https://github.com/useautumn/autumn
|
|
2841
|
+
- https://github.com/lotus-data/lotus
|
|
2842
|
+
- https://github.com/nextjs/saas-starter
|
|
2843
|
+
requires: [payments-provider-port, db-core]
|
|
2844
|
+
conflicts: []
|
|
2845
|
+
absorbs:
|
|
2846
|
+
[billing-subscription-model, billing-subscription-engine, billing-plan-catalog,
|
|
2847
|
+
billing-catalog-versioned, billing-trials-proration, billing-upgrade-downgrade-proration,
|
|
2848
|
+
billing-per-seat, billing-multi-tenant, billing-org-scoped]
|
|
2849
|
+
|
|
2850
|
+
- id: billing-usage-metered
|
|
2851
|
+
category: payments-billing
|
|
2852
|
+
tier: domain
|
|
2853
|
+
status: proposed
|
|
2854
|
+
what: >-
|
|
2855
|
+
Usage event ingestion, aggregation windows, a credits ledger, and the sync job that pushes
|
|
2856
|
+
metered usage to the PSP. OpenMeter is the strongest open source on the ingestion side.
|
|
2857
|
+
stacks: [any]
|
|
2858
|
+
sources:
|
|
2859
|
+
- https://github.com/openmeterio/openmeter
|
|
2860
|
+
- https://github.com/lotus-data/lotus
|
|
2861
|
+
- https://github.com/useautumn/autumn
|
|
2862
|
+
requires: [billing-subscription-model]
|
|
2863
|
+
conflicts: []
|
|
2864
|
+
absorbs: [billing-usage-metered, billing-credits-ledger, payments-stripe-usage-sync]
|
|
2865
|
+
|
|
2866
|
+
- id: billing-entitlements
|
|
2867
|
+
category: payments-billing
|
|
2868
|
+
tier: domain
|
|
2869
|
+
status: proposed
|
|
2870
|
+
what: >-
|
|
2871
|
+
A single `hasAccess(user, feature)` derived from subscription state, with quota checks and
|
|
2872
|
+
the graceful-degradation path for overdue accounts. Feature gating scattered across the
|
|
2873
|
+
codebase is the failure mode this prevents.
|
|
2874
|
+
stacks: [any]
|
|
2875
|
+
sources:
|
|
2876
|
+
- https://github.com/useautumn/autumn
|
|
2877
|
+
- https://github.com/polarsource/polar
|
|
2878
|
+
requires: [billing-subscription-model]
|
|
2879
|
+
conflicts: []
|
|
2880
|
+
absorbs: [entitlements-feature-gating, entitlements-benefits, entitlements-usage-quota, plugin-app-store]
|
|
2881
|
+
|
|
2882
|
+
- id: billing-invoicing-dunning
|
|
2883
|
+
category: payments-billing
|
|
2884
|
+
tier: domain
|
|
2885
|
+
status: proposed
|
|
2886
|
+
what: Invoice generation, tax fields, and the dunning email/retry ladder for failed payments.
|
|
2887
|
+
stacks: [any]
|
|
2888
|
+
sources:
|
|
2889
|
+
- https://github.com/getlago/lago
|
|
2890
|
+
requires: [billing-subscription-model, email-transactional]
|
|
2891
|
+
conflicts: []
|
|
2892
|
+
absorbs: [billing-invoice, billing-dunning-overdue]
|
|
2893
|
+
|
|
2894
|
+
- id: payments-vault-tokenization
|
|
2895
|
+
category: payments-billing
|
|
2896
|
+
tier: specialist
|
|
2897
|
+
status: proposed
|
|
2898
|
+
what: Card tokenization and vaulting so raw PAN never touches the application at all.
|
|
2899
|
+
stacks: [any]
|
|
2900
|
+
sources:
|
|
2901
|
+
- https://github.com/hyperswitch-io/hyperswitch
|
|
2902
|
+
requires: [payments-provider-port]
|
|
2903
|
+
conflicts: []
|
|
2904
|
+
absorbs: [payments-vault-tokenization]
|
|
2905
|
+
|
|
2906
|
+
# ===========================================================================================
|
|
2907
|
+
# TIER: domain - CMS and commerce
|
|
2908
|
+
# ===========================================================================================
|
|
2909
|
+
|
|
2910
|
+
- id: cms-payload
|
|
2911
|
+
category: cms-ecommerce
|
|
2912
|
+
tier: domain
|
|
2913
|
+
status: proposed
|
|
2914
|
+
choiceSet: cms-backend
|
|
2915
|
+
what: >-
|
|
2916
|
+
Payload CMS - collections as TypeScript config, generated types, admin UI, and the website
|
|
2917
|
+
and ecommerce templates as ready starting shapes.
|
|
2918
|
+
stacks: [node, typescript]
|
|
2919
|
+
sources:
|
|
2920
|
+
- https://github.com/payloadcms/payload
|
|
2921
|
+
requires: [db-core]
|
|
2922
|
+
conflicts: []
|
|
2923
|
+
absorbs:
|
|
2924
|
+
[cms-payload, admin-payload, cms-payload-website-template, cms-payload-ecommerce-template,
|
|
2925
|
+
cms-strapi-reference, content-type-builder-runtime]
|
|
2926
|
+
licenseNote: >-
|
|
2927
|
+
strapi/strapi is the obvious comparison and is REFERENCE-ONLY: its MIT grant applies only
|
|
2928
|
+
outside `ee/` AND only if you hold no registered Strapi Cloud account. Its
|
|
2929
|
+
content-type-builder (schemas as JSON, editable at runtime through the admin) and its
|
|
2930
|
+
draft/publish + i18n model are worth studying, which is why `cms-strapi-reference` and
|
|
2931
|
+
`content-type-builder-runtime` land here - but they must be reimplemented, never vendored.
|
|
2932
|
+
|
|
2933
|
+
- id: cms-keystone
|
|
2934
|
+
category: cms-ecommerce
|
|
2935
|
+
tier: domain
|
|
2936
|
+
status: proposed
|
|
2937
|
+
choiceSet: cms-backend
|
|
2938
|
+
what: >-
|
|
2939
|
+
Keystone - schema-defined lists generating both an admin UI and a GraphQL API, with
|
|
2940
|
+
field-level access control as first-class config.
|
|
2941
|
+
stacks: [node, typescript]
|
|
2942
|
+
sources:
|
|
2943
|
+
- https://github.com/keystonejs/keystone
|
|
2944
|
+
requires: [db-core]
|
|
2945
|
+
conflicts: []
|
|
2946
|
+
absorbs: [cms-keystone, auth-session-keystone]
|
|
2947
|
+
|
|
2948
|
+
- id: cms-sanity
|
|
2949
|
+
category: cms-ecommerce
|
|
2950
|
+
tier: domain
|
|
2951
|
+
status: proposed
|
|
2952
|
+
choiceSet: cms-backend
|
|
2953
|
+
what: >-
|
|
2954
|
+
Sanity with an embedded Studio route, Portable Text rendering, and live visual editing
|
|
2955
|
+
with draft mode.
|
|
2956
|
+
stacks: [node, react]
|
|
2957
|
+
sources:
|
|
2958
|
+
- https://github.com/sanity-io/sanity
|
|
2959
|
+
requires: []
|
|
2960
|
+
conflicts: []
|
|
2961
|
+
absorbs: [cms-sanity, cms-sanity-studio-embedded, content-portable-text, preview-live-visual-editing, preview-draft-mode]
|
|
2962
|
+
|
|
2963
|
+
- id: cms-git-backed
|
|
2964
|
+
category: cms-ecommerce
|
|
2965
|
+
tier: domain
|
|
2966
|
+
status: proposed
|
|
2967
|
+
choiceSet: cms-backend
|
|
2968
|
+
what: >-
|
|
2969
|
+
Content as files in the repo - MDX or Markdoc with a typed schema, edited through Keystatic
|
|
2970
|
+
or Nuxt Content. No database, no CMS to run, and content changes go through code review.
|
|
2971
|
+
stacks: [node, react, vue]
|
|
2972
|
+
sources:
|
|
2973
|
+
- https://github.com/Thinkmill/keystatic
|
|
2974
|
+
- https://github.com/nuxt/content
|
|
2975
|
+
- https://github.com/markdoc/markdoc
|
|
2976
|
+
requires: []
|
|
2977
|
+
conflicts: []
|
|
2978
|
+
absorbs:
|
|
2979
|
+
[cms-keystatic, admin-keystatic-embedded, cms-nuxt-content, content-file-based,
|
|
2980
|
+
content-git-backed, content-mdx, content-markdoc, content-schema-typed,
|
|
2981
|
+
db-sqlite-embedded]
|
|
2982
|
+
|
|
2983
|
+
- id: cms-ghost-headless
|
|
2984
|
+
category: cms-ecommerce
|
|
2985
|
+
tier: specialist
|
|
2986
|
+
status: proposed
|
|
2987
|
+
choiceSet: cms-backend
|
|
2988
|
+
what: Ghost as a headless publishing backend with members and paid subscriptions built in.
|
|
2989
|
+
stacks: [node]
|
|
2990
|
+
sources:
|
|
2991
|
+
- https://github.com/TryGhost/Ghost
|
|
2992
|
+
requires: []
|
|
2993
|
+
conflicts: []
|
|
2994
|
+
absorbs: [cms-ghost-headless, members-subscriptions]
|
|
2995
|
+
|
|
2996
|
+
- id: cms-content-api
|
|
2997
|
+
category: cms-ecommerce
|
|
2998
|
+
tier: capability
|
|
2999
|
+
status: proposed
|
|
3000
|
+
what: >-
|
|
3001
|
+
The read-side contract in front of whichever CMS was chosen - read-only API keys, cached
|
|
3002
|
+
queries, draft-vs-published resolution, and locale fallback.
|
|
3003
|
+
stacks: [any]
|
|
3004
|
+
sources:
|
|
3005
|
+
- https://github.com/payloadcms/payload
|
|
3006
|
+
- https://github.com/sanity-io/sanity
|
|
3007
|
+
requires: []
|
|
3008
|
+
conflicts: []
|
|
3009
|
+
absorbs: [content-api-readonly-keys, rendering-streaming-deferred, seo-metadata-opengraph]
|
|
3010
|
+
|
|
3011
|
+
- id: commerce-medusa
|
|
3012
|
+
category: cms-ecommerce
|
|
3013
|
+
tier: domain
|
|
3014
|
+
status: proposed
|
|
3015
|
+
choiceSet: commerce-backend
|
|
3016
|
+
what: >-
|
|
3017
|
+
Medusa - modular commerce with workflow-based order orchestration, multi-region pricing,
|
|
3018
|
+
and pluggable payment/fulfilment providers.
|
|
3019
|
+
stacks: [node, typescript]
|
|
3020
|
+
sources:
|
|
3021
|
+
- https://github.com/medusajs/medusa
|
|
3022
|
+
requires: [db-postgres]
|
|
3023
|
+
conflicts: []
|
|
3024
|
+
absorbs: [commerce-medusa, admin-medusa, commerce-inventory-fulfillment, db-postgres-mikroorm]
|
|
3025
|
+
|
|
3026
|
+
- id: commerce-saleor
|
|
3027
|
+
category: cms-ecommerce
|
|
3028
|
+
tier: domain
|
|
3029
|
+
status: proposed
|
|
3030
|
+
choiceSet: commerce-backend
|
|
3031
|
+
what: Saleor - GraphQL-first commerce with channels for multi-market pricing and catalog.
|
|
3032
|
+
stacks: [python]
|
|
3033
|
+
sources:
|
|
3034
|
+
- https://github.com/saleor/saleor
|
|
3035
|
+
requires: [db-postgres]
|
|
3036
|
+
conflicts: []
|
|
3037
|
+
absorbs: [commerce-saleor, commerce-multichannel, queue-celery-redis]
|
|
3038
|
+
|
|
3039
|
+
- id: commerce-shopify-storefront
|
|
3040
|
+
category: cms-ecommerce
|
|
3041
|
+
tier: domain
|
|
3042
|
+
status: proposed
|
|
3043
|
+
choiceSet: commerce-backend
|
|
3044
|
+
what: >-
|
|
3045
|
+
Hydrogen storefront against the Shopify Storefront API - Shopify owns catalog, checkout,
|
|
3046
|
+
payments and tax; you own presentation only.
|
|
3047
|
+
stacks: [node, react]
|
|
3048
|
+
sources:
|
|
3049
|
+
- https://github.com/Shopify/hydrogen
|
|
3050
|
+
requires: []
|
|
3051
|
+
conflicts: []
|
|
3052
|
+
absorbs: [storefront-shopify-hydrogen, commerce-cart-shopify, deploy-shopify-oxygen, storefront-nextjs-minimal]
|
|
3053
|
+
|
|
3054
|
+
- id: commerce-cart-checkout
|
|
3055
|
+
category: cms-ecommerce
|
|
3056
|
+
tier: domain
|
|
3057
|
+
status: proposed
|
|
3058
|
+
what: >-
|
|
3059
|
+
Cart state with optimistic updates, server-authoritative price recalculation on every
|
|
3060
|
+
mutation, and the checkout state machine. Never trust a client-supplied price - the
|
|
3061
|
+
optimistic UI is a display concern only.
|
|
3062
|
+
stacks: [node, react]
|
|
3063
|
+
sources:
|
|
3064
|
+
- https://github.com/medusajs/medusa
|
|
3065
|
+
- https://github.com/vercel/commerce
|
|
3066
|
+
requires: [payments-provider-port]
|
|
3067
|
+
conflicts: []
|
|
3068
|
+
absorbs: [commerce-cart-checkout, commerce-cart-optimistic]
|
|
3069
|
+
|
|
3070
|
+
- id: media-uploads
|
|
3071
|
+
category: cms-ecommerce
|
|
3072
|
+
tier: capability
|
|
3073
|
+
status: proposed
|
|
3074
|
+
what: >-
|
|
3075
|
+
Presigned direct-to-S3 upload, MIME and size validation server-side, and an image
|
|
3076
|
+
derivative pipeline. Direct upload keeps large files off the app server entirely.
|
|
3077
|
+
stacks: [any]
|
|
3078
|
+
sources:
|
|
3079
|
+
- https://github.com/payloadcms/payload
|
|
3080
|
+
- https://github.com/fastapi/full-stack-fastapi-template
|
|
3081
|
+
requires: []
|
|
3082
|
+
conflicts: []
|
|
3083
|
+
absorbs: [media-uploads-s3, files-s3-upload, storage-supabase, storage-vercel-blob, assets-static-pipeline]
|
|
3084
|
+
|
|
3085
|
+
- id: email-transactional
|
|
3086
|
+
category: fullstack-saas
|
|
3087
|
+
tier: capability
|
|
3088
|
+
status: proposed
|
|
3089
|
+
what: >-
|
|
3090
|
+
React Email templates rendered server-side and sent through a provider adapter, plus the
|
|
3091
|
+
invite/verify/reset flows that every product needs and every product rewrites.
|
|
3092
|
+
stacks: [node, react]
|
|
3093
|
+
sources:
|
|
3094
|
+
- https://github.com/resend/react-email
|
|
3095
|
+
- https://github.com/nextacular/nextacular
|
|
3096
|
+
requires: []
|
|
3097
|
+
conflicts: []
|
|
3098
|
+
absorbs: [email-react-email-resend, email-transactional-invites, mail-smtp-templates]
|
|
3099
|
+
|
|
3100
|
+
# ===========================================================================================
|
|
3101
|
+
# TIER: domain - AI / LLM
|
|
3102
|
+
# ===========================================================================================
|
|
3103
|
+
|
|
3104
|
+
- id: ai-sdk-core
|
|
3105
|
+
category: ai-llm
|
|
3106
|
+
tier: domain
|
|
3107
|
+
status: proposed
|
|
3108
|
+
what: >-
|
|
3109
|
+
A provider-agnostic LLM call surface - streaming, tool calls, structured output via a Zod
|
|
3110
|
+
schema - so the model choice is config, not code. Directly implements this repo's
|
|
3111
|
+
role-to-env model resolution rule: no literal model id at any call site.
|
|
3112
|
+
stacks: [node, typescript]
|
|
3113
|
+
sources:
|
|
3114
|
+
- https://github.com/vercel/ai
|
|
3115
|
+
requires: [env-typed-config]
|
|
3116
|
+
conflicts: []
|
|
3117
|
+
absorbs:
|
|
3118
|
+
[ai-sdk-core, ai-provider-openai, ai-provider-anthropic, ai-provider-gateway,
|
|
3119
|
+
ai-structured-output, ai-tools-zod]
|
|
3120
|
+
|
|
3121
|
+
- id: ai-chat-ui
|
|
3122
|
+
category: ai-llm
|
|
3123
|
+
tier: domain
|
|
3124
|
+
status: proposed
|
|
3125
|
+
what: >-
|
|
3126
|
+
Streaming chat UI - message list, tool-call rendering, generative UI components, stop and
|
|
3127
|
+
regenerate. assistant-ui is shadcn-compatible so it drops into an existing design system.
|
|
3128
|
+
stacks: [react]
|
|
3129
|
+
sources:
|
|
3130
|
+
- https://github.com/assistant-ui/assistant-ui
|
|
3131
|
+
- https://github.com/vercel/chatbot
|
|
3132
|
+
requires: [ai-sdk-core, ui-shadcn]
|
|
3133
|
+
conflicts: []
|
|
3134
|
+
absorbs: [ai-chat-nextjs-ai-sdk, ui-chat-assistant-ui, ai-generative-ui]
|
|
3135
|
+
|
|
3136
|
+
- id: ai-agent-framework
|
|
3137
|
+
category: ai-llm
|
|
3138
|
+
tier: domain
|
|
3139
|
+
status: proposed
|
|
3140
|
+
choiceSet: agent-framework
|
|
3141
|
+
what: >-
|
|
3142
|
+
Agent loop with tools, handoffs and typed outputs. PydanticAI for typed Python, OpenAI
|
|
3143
|
+
Agents SDK for the OpenAI-native path, LangGraph when the control flow is a real graph
|
|
3144
|
+
rather than a loop.
|
|
3145
|
+
stacks: [python, node]
|
|
3146
|
+
sources:
|
|
3147
|
+
- https://github.com/pydantic/pydantic-ai
|
|
3148
|
+
- https://github.com/openai/openai-agents-python
|
|
3149
|
+
- https://github.com/langchain-ai/langgraph
|
|
3150
|
+
requires: []
|
|
3151
|
+
conflicts: []
|
|
3152
|
+
absorbs:
|
|
3153
|
+
[ai-agent-python-pydantic-ai, ai-agent-python-openai-agents, ai-agent-graph-langgraph,
|
|
3154
|
+
ai-agent-cloudflare-workers, ai-human-in-the-loop, ai-guardrails]
|
|
3155
|
+
|
|
3156
|
+
- id: ai-agent-memory
|
|
3157
|
+
category: ai-llm
|
|
3158
|
+
tier: domain
|
|
3159
|
+
status: proposed
|
|
3160
|
+
what: >-
|
|
3161
|
+
Session memory, long-term memory and graph checkpointing to Postgres, so an agent run
|
|
3162
|
+
survives a process restart and a conversation survives a session.
|
|
3163
|
+
stacks: [python, node]
|
|
3164
|
+
sources:
|
|
3165
|
+
- https://github.com/langchain-ai/langgraph
|
|
3166
|
+
requires: [ai-agent-framework, db-postgres]
|
|
3167
|
+
conflicts: []
|
|
3168
|
+
absorbs: [ai-session-memory, ai-long-term-memory, ai-checkpoint-postgres]
|
|
3169
|
+
|
|
3170
|
+
- id: rag-pipeline
|
|
3171
|
+
category: ai-llm
|
|
3172
|
+
tier: domain
|
|
3173
|
+
status: proposed
|
|
3174
|
+
what: >-
|
|
3175
|
+
Document ingestion, chunking, embedding, hybrid retrieval, reranking and citation-carrying
|
|
3176
|
+
answers, with per-document ACL filtering applied at query time rather than after.
|
|
3177
|
+
stacks: [python, node]
|
|
3178
|
+
sources:
|
|
3179
|
+
- https://github.com/pgvector/pgvector
|
|
3180
|
+
- https://github.com/qdrant/qdrant
|
|
3181
|
+
requires: [vector-store-pgvector]
|
|
3182
|
+
conflicts: []
|
|
3183
|
+
absorbs:
|
|
3184
|
+
[rag-doc-ingestion, rag-retriever-interface, rag-citations, rag-acl-filtering,
|
|
3185
|
+
vector-hybrid-search, rag-azure-ai-search]
|
|
3186
|
+
|
|
3187
|
+
- id: vector-store-pgvector
|
|
3188
|
+
category: ai-llm
|
|
3189
|
+
tier: domain
|
|
3190
|
+
status: proposed
|
|
3191
|
+
choiceSet: vector-store
|
|
3192
|
+
what: >-
|
|
3193
|
+
pgvector in the app's existing Postgres - no extra service, transactional with the rest of
|
|
3194
|
+
the data, and correct up to a few million vectors.
|
|
3195
|
+
stacks: [postgres]
|
|
3196
|
+
sources:
|
|
3197
|
+
- https://github.com/pgvector/pgvector
|
|
3198
|
+
requires: [db-postgres]
|
|
3199
|
+
conflicts: []
|
|
3200
|
+
absorbs: [db-postgres-pgvector, db-migrations-vector]
|
|
3201
|
+
licenseNote: >-
|
|
3202
|
+
pgvector is licensed `PostgreSQL` - a two-clause permissive license, textually an ISC/BSD-2
|
|
3203
|
+
variant, OSI-approved. Not literally on the vendorable allowlist; admitted by reading it.
|
|
3204
|
+
|
|
3205
|
+
- id: vector-store-qdrant
|
|
3206
|
+
category: ai-llm
|
|
3207
|
+
tier: domain
|
|
3208
|
+
status: proposed
|
|
3209
|
+
choiceSet: vector-store
|
|
3210
|
+
what: Qdrant with payload filtering and named vectors, for when pgvector's ceiling is hit.
|
|
3211
|
+
stacks: [any]
|
|
3212
|
+
sources:
|
|
3213
|
+
- https://github.com/qdrant/qdrant
|
|
3214
|
+
requires: [docker-compose]
|
|
3215
|
+
conflicts: []
|
|
3216
|
+
absorbs: [vector-qdrant]
|
|
3217
|
+
|
|
3218
|
+
- id: vector-store-embedded
|
|
3219
|
+
category: ai-llm
|
|
3220
|
+
tier: domain
|
|
3221
|
+
status: proposed
|
|
3222
|
+
choiceSet: vector-store
|
|
3223
|
+
what: Chroma or LanceDB embedded in-process - zero infrastructure, for prototypes and CLIs.
|
|
3224
|
+
stacks: [python]
|
|
3225
|
+
sources:
|
|
3226
|
+
- https://github.com/chroma-core/chroma
|
|
3227
|
+
requires: []
|
|
3228
|
+
conflicts: []
|
|
3229
|
+
absorbs: [vector-chroma, vector-embedded-local]
|
|
3230
|
+
|
|
3231
|
+
- id: mcp-server
|
|
3232
|
+
category: agent-tooling
|
|
3233
|
+
tier: domain
|
|
3234
|
+
status: proposed
|
|
3235
|
+
what: >-
|
|
3236
|
+
An MCP server exposing tools, resources and prompts over streamable HTTP, with the OAuth
|
|
3237
|
+
flow for authenticated servers. The reference servers are the authoritative shape.
|
|
3238
|
+
stacks: [node, python]
|
|
3239
|
+
sources:
|
|
3240
|
+
- https://github.com/modelcontextprotocol/typescript-sdk
|
|
3241
|
+
- https://github.com/modelcontextprotocol/python-sdk
|
|
3242
|
+
- https://github.com/modelcontextprotocol/servers
|
|
3243
|
+
- https://github.com/PrefectHQ/fastmcp
|
|
3244
|
+
requires: []
|
|
3245
|
+
conflicts: []
|
|
3246
|
+
absorbs:
|
|
3247
|
+
[mcp-server-typescript, mcp-server-python-fastmcp, mcp-transport-streamable-http,
|
|
3248
|
+
mcp-auth-oauth, mcp-testing]
|
|
3249
|
+
|
|
3250
|
+
- id: mcp-client
|
|
3251
|
+
category: agent-tooling
|
|
3252
|
+
tier: domain
|
|
3253
|
+
status: proposed
|
|
3254
|
+
what: MCP client - server discovery, tool listing, and the connection lifecycle.
|
|
3255
|
+
stacks: [node, python]
|
|
3256
|
+
sources:
|
|
3257
|
+
- https://github.com/modelcontextprotocol/typescript-sdk
|
|
3258
|
+
- https://github.com/modelcontextprotocol/python-sdk
|
|
3259
|
+
- https://github.com/modelcontextprotocol/registry
|
|
3260
|
+
requires: []
|
|
3261
|
+
conflicts: []
|
|
3262
|
+
absorbs: [mcp-client-typescript, mcp-client-python]
|
|
3263
|
+
|
|
3264
|
+
- id: agent-skills
|
|
3265
|
+
category: agent-tooling
|
|
3266
|
+
tier: domain
|
|
3267
|
+
status: proposed
|
|
3268
|
+
what: >-
|
|
3269
|
+
SKILL.md authoring - the three-key frontmatter shape, progressive disclosure so the
|
|
3270
|
+
context window stays lean, and a lint rule that flags a skill which has outgrown it.
|
|
3271
|
+
stacks: [any]
|
|
3272
|
+
sources:
|
|
3273
|
+
- https://github.com/obra/superpowers
|
|
3274
|
+
- https://github.com/github/spec-kit
|
|
3275
|
+
requires: []
|
|
3276
|
+
conflicts: []
|
|
3277
|
+
absorbs: []
|
|
3278
|
+
licenseNote: >-
|
|
3279
|
+
anthropics/skills (162k stars) has NO root LICENSE and its docx/pdf/pptx/xlsx skills carry
|
|
3280
|
+
an explicit source-available LICENSE.txt forbidding extraction. EXCLUDED - nothing may be
|
|
3281
|
+
vendored. Take the spec from agentskills/agentskills, which publishes the same text under
|
|
3282
|
+
Apache-2.0, and take vendorable skill content from obra/superpowers (MIT). Four of the most
|
|
3283
|
+
cited "awesome-claude-*" lists are unlicensed or CC-BY-NC-ND; see README.md.
|
|
3284
|
+
|
|
3285
|
+
- id: obs-llm-tracing
|
|
3286
|
+
category: ai-llm
|
|
3287
|
+
tier: capability
|
|
3288
|
+
status: proposed
|
|
3289
|
+
what: >-
|
|
3290
|
+
OTel GenAI semantic conventions for LLM spans - token counts, model, cost - plus prompt
|
|
3291
|
+
versioning. Makes LLM cost a metric on the existing dashboard rather than a separate tool.
|
|
3292
|
+
stacks: [python, node]
|
|
3293
|
+
sources:
|
|
3294
|
+
- https://github.com/langfuse/langfuse
|
|
3295
|
+
- https://github.com/open-telemetry/opentelemetry-python-contrib
|
|
3296
|
+
requires: [observability-otel]
|
|
3297
|
+
conflicts: []
|
|
3298
|
+
absorbs: [obs-otel-llm, obs-langfuse, prompt-management-langfuse]
|
|
3299
|
+
|
|
3300
|
+
# ===========================================================================================
|
|
3301
|
+
# TIER: domain - data engineering
|
|
3302
|
+
# ===========================================================================================
|
|
3303
|
+
|
|
3304
|
+
- id: data-dbt
|
|
3305
|
+
category: data-engineering
|
|
3306
|
+
tier: domain
|
|
3307
|
+
status: proposed
|
|
3308
|
+
choiceSet: data-transform
|
|
3309
|
+
what: >-
|
|
3310
|
+
dbt project layout on the medallion staging/intermediate/marts split, with schema tests,
|
|
3311
|
+
source freshness, and exposures. The tests are the part that makes a pipeline trustworthy.
|
|
3312
|
+
stacks: [sql, python]
|
|
3313
|
+
sources:
|
|
3314
|
+
- https://github.com/dbt-labs/dbt-core
|
|
3315
|
+
- https://github.com/dbt-labs/jaffle-shop
|
|
3316
|
+
requires: []
|
|
3317
|
+
conflicts: []
|
|
3318
|
+
absorbs: [data-dbt, data-dbt-tests, data-dbt-governance, data-medallion]
|
|
3319
|
+
|
|
3320
|
+
- id: data-sqlmesh
|
|
3321
|
+
category: data-engineering
|
|
3322
|
+
tier: specialist
|
|
3323
|
+
status: proposed
|
|
3324
|
+
choiceSet: data-transform
|
|
3325
|
+
what: >-
|
|
3326
|
+
SQLMesh with virtual data environments and column-level lineage, so a model change can be
|
|
3327
|
+
previewed without rebuilding the warehouse.
|
|
3328
|
+
stacks: [sql, python]
|
|
3329
|
+
sources:
|
|
3330
|
+
- https://github.com/TobikoData/sqlmesh
|
|
3331
|
+
requires: []
|
|
3332
|
+
conflicts: []
|
|
3333
|
+
absorbs: [data-transform-sqlmesh]
|
|
3334
|
+
|
|
3335
|
+
- id: data-duckdb
|
|
3336
|
+
category: data-engineering
|
|
3337
|
+
tier: domain
|
|
3338
|
+
status: proposed
|
|
3339
|
+
what: >-
|
|
3340
|
+
DuckDB as the local analytical engine - dbt-duckdb makes the whole warehouse a file, which
|
|
3341
|
+
collapses the dev-environment problem for data work entirely.
|
|
3342
|
+
stacks: [python, sql]
|
|
3343
|
+
sources:
|
|
3344
|
+
- https://github.com/duckdb/duckdb
|
|
3345
|
+
- https://github.com/duckdb/dbt-duckdb
|
|
3346
|
+
requires: []
|
|
3347
|
+
conflicts: []
|
|
3348
|
+
absorbs: [data-duckdb, data-dbt-duckdb, data-lakehouse-ducklake]
|
|
3349
|
+
|
|
3350
|
+
- id: data-orchestration-dagster
|
|
3351
|
+
category: data-engineering
|
|
3352
|
+
tier: domain
|
|
3353
|
+
status: proposed
|
|
3354
|
+
choiceSet: data-orchestrator
|
|
3355
|
+
what: >-
|
|
3356
|
+
Dagster software-defined assets - declare what should exist, not what should run. Asset
|
|
3357
|
+
lineage comes free; in Airflow it is a separate concern.
|
|
3358
|
+
stacks: [python]
|
|
3359
|
+
sources:
|
|
3360
|
+
- https://github.com/dagster-io/dagster
|
|
3361
|
+
requires: []
|
|
3362
|
+
conflicts: []
|
|
3363
|
+
absorbs: [data-orchestration-dagster]
|
|
3364
|
+
|
|
3365
|
+
- id: data-orchestration-airflow
|
|
3366
|
+
category: data-engineering
|
|
3367
|
+
tier: domain
|
|
3368
|
+
status: proposed
|
|
3369
|
+
choiceSet: data-orchestrator
|
|
3370
|
+
what: Airflow DAGs with TaskFlow, deferrable operators and a compose-based local stack.
|
|
3371
|
+
stacks: [python]
|
|
3372
|
+
sources:
|
|
3373
|
+
- https://github.com/apache/airflow
|
|
3374
|
+
requires: [docker-compose]
|
|
3375
|
+
conflicts: []
|
|
3376
|
+
absorbs: [data-orchestration-airflow]
|
|
3377
|
+
|
|
3378
|
+
- id: data-ingestion-dlt
|
|
3379
|
+
category: data-engineering
|
|
3380
|
+
tier: domain
|
|
3381
|
+
status: proposed
|
|
3382
|
+
what: >-
|
|
3383
|
+
dlt pipelines with schema inference/evolution and incremental cursors - the extract-load
|
|
3384
|
+
half that dbt deliberately does not cover.
|
|
3385
|
+
stacks: [python]
|
|
3386
|
+
sources:
|
|
3387
|
+
- https://github.com/dlt-hub/dlt
|
|
3388
|
+
requires: []
|
|
3389
|
+
conflicts: []
|
|
3390
|
+
absorbs: [data-ingestion-dlt, data-cdc-incremental]
|
|
3391
|
+
|
|
3392
|
+
- id: data-cdc-debezium
|
|
3393
|
+
category: data-engineering
|
|
3394
|
+
tier: specialist
|
|
3395
|
+
status: proposed
|
|
3396
|
+
what: Change-data-capture off the database log rather than by polling, streamed to a broker.
|
|
3397
|
+
stacks: [any]
|
|
3398
|
+
sources:
|
|
3399
|
+
- https://github.com/debezium/debezium
|
|
3400
|
+
requires: [broker-kafka]
|
|
3401
|
+
conflicts: []
|
|
3402
|
+
absorbs: [data-cdc-debezium]
|
|
3403
|
+
|
|
3404
|
+
- id: data-lakehouse-table-format
|
|
3405
|
+
category: data-engineering
|
|
3406
|
+
tier: specialist
|
|
3407
|
+
status: proposed
|
|
3408
|
+
what: Iceberg or Delta table format on object storage - schema evolution and time travel.
|
|
3409
|
+
stacks: [python, sql]
|
|
3410
|
+
sources:
|
|
3411
|
+
- https://github.com/apache/iceberg
|
|
3412
|
+
- https://github.com/delta-io/delta
|
|
3413
|
+
requires: []
|
|
3414
|
+
conflicts: []
|
|
3415
|
+
absorbs: [data-lakehouse-iceberg, data-lakehouse-delta]
|
|
3416
|
+
|
|
3417
|
+
- id: data-quality
|
|
3418
|
+
category: data-engineering
|
|
3419
|
+
tier: capability
|
|
3420
|
+
status: proposed
|
|
3421
|
+
what: >-
|
|
3422
|
+
Expectation suites and freshness/volume anomaly monitors that fail the pipeline rather
|
|
3423
|
+
than quietly publishing bad marts.
|
|
3424
|
+
stacks: [python, sql]
|
|
3425
|
+
sources:
|
|
3426
|
+
- https://github.com/great-expectations/great_expectations
|
|
3427
|
+
- https://github.com/elementary-data/elementary
|
|
3428
|
+
requires: []
|
|
3429
|
+
conflicts: []
|
|
3430
|
+
absorbs: [data-quality-great-expectations, data-observability-elementary]
|
|
3431
|
+
|
|
3432
|
+
- id: data-transform-polars
|
|
3433
|
+
category: data-engineering
|
|
3434
|
+
tier: capability
|
|
3435
|
+
status: proposed
|
|
3436
|
+
what: Polars lazy frames for in-process transforms that outgrew pandas but not the machine.
|
|
3437
|
+
stacks: [python, rust]
|
|
3438
|
+
sources:
|
|
3439
|
+
- https://github.com/pola-rs/polars
|
|
3440
|
+
requires: []
|
|
3441
|
+
conflicts: []
|
|
3442
|
+
absorbs: [data-transform-polars]
|
|
3443
|
+
|
|
3444
|
+
# ===========================================================================================
|
|
3445
|
+
# TIER: domain - mobile and desktop
|
|
3446
|
+
# ===========================================================================================
|
|
3447
|
+
|
|
3448
|
+
- id: mobile-expo
|
|
3449
|
+
category: mobile-desktop
|
|
3450
|
+
tier: domain
|
|
3451
|
+
status: proposed
|
|
3452
|
+
choiceSet: mobile-desktop-shell
|
|
3453
|
+
what: >-
|
|
3454
|
+
Expo app with file-based expo-router, typed routes, auth-gated route groups, NativeWind
|
|
3455
|
+
styling and EAS build/submit in CI.
|
|
3456
|
+
stacks: [react-native]
|
|
3457
|
+
sources:
|
|
3458
|
+
- https://github.com/expo/expo
|
|
3459
|
+
- https://github.com/obytes/react-native-template-obytes
|
|
3460
|
+
- https://github.com/flemingvincent/expo-clerk-convex
|
|
3461
|
+
requires: [repo-scaffold]
|
|
3462
|
+
conflicts: []
|
|
3463
|
+
absorbs:
|
|
3464
|
+
[mobile-expo-router, mobile-expo-minimal, mobile-auth-expo-session,
|
|
3465
|
+
mobile-auth-gated-routes, ui-nativewind, theme-tokens-rn, mobile-rn-components-kit,
|
|
3466
|
+
ci-eas-build, ci-github-actions-eas, mobile-push-notifications, devtools-reactotron]
|
|
3467
|
+
|
|
3468
|
+
- id: mobile-flutter
|
|
3469
|
+
category: mobile-desktop
|
|
3470
|
+
tier: domain
|
|
3471
|
+
status: proposed
|
|
3472
|
+
choiceSet: mobile-desktop-shell
|
|
3473
|
+
what: >-
|
|
3474
|
+
Flutter app in the feature-first layered layout with Riverpod or BLoC, go_router,
|
|
3475
|
+
Material 3 theming from design tokens, and dev/stg/prod flavors.
|
|
3476
|
+
stacks: [flutter, dart]
|
|
3477
|
+
sources:
|
|
3478
|
+
- https://github.com/flutter/samples
|
|
3479
|
+
- https://github.com/bizz84/starter_architecture_flutter_firebase
|
|
3480
|
+
requires: [repo-scaffold]
|
|
3481
|
+
conflicts: []
|
|
3482
|
+
absorbs:
|
|
3483
|
+
[flutter-app-core, flutter-app-minimal, flutter-feature-first-layers, flutter-riverpod,
|
|
3484
|
+
flutter-bloc, flutter-mvvm-compass, flutter-stacked-mvvm, flutter-di-get-it,
|
|
3485
|
+
flutter-routing-go-router, flutter-routing-generated, flutter-material3-theme,
|
|
3486
|
+
flutter-design-tokens, flutter-flavors-dev-stg-prod, flutter-codegen-build-runner,
|
|
3487
|
+
flutter-platform-runners, lint-very-good-analysis]
|
|
3488
|
+
|
|
3489
|
+
- id: desktop-tauri
|
|
3490
|
+
category: mobile-desktop
|
|
3491
|
+
tier: domain
|
|
3492
|
+
status: proposed
|
|
3493
|
+
choiceSet: mobile-desktop-shell
|
|
3494
|
+
what: >-
|
|
3495
|
+
Tauri v2 with the capabilities permission model (deny by default), external-link guard,
|
|
3496
|
+
window-flash prevention on startup, and release size optimisation.
|
|
3497
|
+
stacks: [rust, react, typescript]
|
|
3498
|
+
sources:
|
|
3499
|
+
- https://github.com/tauri-apps/tauri
|
|
3500
|
+
- https://github.com/agmmnn/tauri-ui
|
|
3501
|
+
requires: [repo-scaffold]
|
|
3502
|
+
conflicts: []
|
|
3503
|
+
absorbs:
|
|
3504
|
+
[desktop-tauri-v2, tauri-capabilities-security, tauri-security-link-guard,
|
|
3505
|
+
tauri-window-flash-prevention, tauri-release-size-optimization, tauri-icon-assets]
|
|
3506
|
+
|
|
3507
|
+
- id: desktop-electron
|
|
3508
|
+
category: mobile-desktop
|
|
3509
|
+
tier: domain
|
|
3510
|
+
status: proposed
|
|
3511
|
+
choiceSet: mobile-desktop-shell
|
|
3512
|
+
what: >-
|
|
3513
|
+
Electron with contextIsolation on, a preload contextBridge exposing a typed IPC surface
|
|
3514
|
+
(never the raw ipcRenderer), a window factory, electron-builder packaging, code signing
|
|
3515
|
+
and notarization, and auto-update.
|
|
3516
|
+
stacks: [node, typescript]
|
|
3517
|
+
sources:
|
|
3518
|
+
- https://github.com/electron/electron
|
|
3519
|
+
- https://github.com/alex8088/electron-vite
|
|
3520
|
+
- https://github.com/daltonmenezes/electron-app
|
|
3521
|
+
requires: [repo-scaffold]
|
|
3522
|
+
conflicts: []
|
|
3523
|
+
absorbs:
|
|
3524
|
+
[desktop-electron, electron-security-baseline, electron-preload-contextbridge,
|
|
3525
|
+
electron-typed-ipc, electron-window-factory, electron-multi-window-router,
|
|
3526
|
+
packaging-electron-builder, electron-code-signing-notarization, electron-auto-update,
|
|
3527
|
+
build-electron-vite, build-electron-webpack, ci-release-multiplatform]
|
|
3528
|
+
|
|
3529
|
+
- id: desktop-mobile-maui
|
|
3530
|
+
category: mobile-desktop
|
|
3531
|
+
tier: specialist
|
|
3532
|
+
status: proposed
|
|
3533
|
+
choiceSet: mobile-desktop-shell
|
|
3534
|
+
what: .NET MAUI with the MVVM Community Toolkit, Shell navigation and multi-target csproj.
|
|
3535
|
+
stacks: [dotnet]
|
|
3536
|
+
sources:
|
|
3537
|
+
- https://github.com/dotnet/maui
|
|
3538
|
+
requires: [repo-scaffold]
|
|
3539
|
+
conflicts: []
|
|
3540
|
+
absorbs: [desktop-mobile-maui, maui-mvvm-toolkit, maui-shell-navigation, maui-di-mauiprogram, maui-multitarget-csproj, maui-resources-theming]
|
|
3541
|
+
|
|
3542
|
+
- id: mobile-local-storage
|
|
3543
|
+
category: mobile-desktop
|
|
3544
|
+
tier: capability
|
|
3545
|
+
status: proposed
|
|
3546
|
+
what: >-
|
|
3547
|
+
On-device storage - SQLite/WatermelonDB for relational data, MMKV for key-value, and
|
|
3548
|
+
SecureStore/Keychain for tokens. Tokens never go in MMKV; that is the mistake this prevents.
|
|
3549
|
+
stacks: [react-native, flutter]
|
|
3550
|
+
sources:
|
|
3551
|
+
- https://github.com/Nozbe/WatermelonDB
|
|
3552
|
+
- https://github.com/mrousavy/react-native-mmkv
|
|
3553
|
+
requires: []
|
|
3554
|
+
conflicts: []
|
|
3555
|
+
absorbs: [db-sqlite-mobile, mobile-expo-sqlite, db-watermelondb, storage-mmkv, storage-secure-store, db-migrations-versioned]
|
|
3556
|
+
|
|
3557
|
+
- id: mobile-offline-sync
|
|
3558
|
+
category: mobile-desktop
|
|
3559
|
+
tier: specialist
|
|
3560
|
+
status: proposed
|
|
3561
|
+
what: >-
|
|
3562
|
+
Offline-first sync - a local write queue, pull/push protocol, partial-replication rules so
|
|
3563
|
+
a device does not download the whole table, and an explicit conflict policy. The conflict
|
|
3564
|
+
policy must be chosen deliberately; last-write-wins by omission is a data-loss bug.
|
|
3565
|
+
stacks: [react-native, flutter]
|
|
3566
|
+
sources:
|
|
3567
|
+
- https://github.com/powersync-ja/powersync-js
|
|
3568
|
+
- https://github.com/Nozbe/WatermelonDB
|
|
3569
|
+
requires: [mobile-local-storage]
|
|
3570
|
+
conflicts: []
|
|
3571
|
+
absorbs: [offline-first-sync, sync-powersync, sync-pull-push-protocol, sync-upload-queue, sync-partial-replication-rules, db-postgres-backend]
|
|
3572
|
+
|
|
3573
|
+
# ===========================================================================================
|
|
3574
|
+
# TIER: domain - game / 3D
|
|
3575
|
+
# ===========================================================================================
|
|
3576
|
+
|
|
3577
|
+
- id: render-r3f
|
|
3578
|
+
category: game-3d
|
|
3579
|
+
tier: domain
|
|
3580
|
+
status: proposed
|
|
3581
|
+
choiceSet: game-renderer
|
|
3582
|
+
what: >-
|
|
3583
|
+
React Three Fiber scene graph with drei helpers, HDRI environment lighting, postprocessing
|
|
3584
|
+
and instancing for draw-call reduction.
|
|
3585
|
+
stacks: [react, threejs, typescript]
|
|
3586
|
+
sources:
|
|
3587
|
+
- https://github.com/pmndrs/react-three-fiber
|
|
3588
|
+
- https://github.com/pmndrs/drei
|
|
3589
|
+
- https://github.com/mrdoob/three.js
|
|
3590
|
+
requires: [repo-scaffold]
|
|
3591
|
+
conflicts: []
|
|
3592
|
+
absorbs:
|
|
3593
|
+
[render-r3f, render-threejs, controls-orbit, lighting-environment-hdri,
|
|
3594
|
+
postfx-postprocessing, perf-instancing, assets-gltf-loader, camera-third-person,
|
|
3595
|
+
controls-character-ecctrl, ui-spatial, shaders-glsl, webgpu-renderer]
|
|
3596
|
+
|
|
3597
|
+
- id: render-babylon
|
|
3598
|
+
category: game-3d
|
|
3599
|
+
tier: domain
|
|
3600
|
+
status: proposed
|
|
3601
|
+
choiceSet: game-renderer
|
|
3602
|
+
what: Babylon.js scene with the node material editor and built-in physics/XR integration.
|
|
3603
|
+
stacks: [typescript]
|
|
3604
|
+
sources:
|
|
3605
|
+
- https://github.com/BabylonJS/Babylon.js
|
|
3606
|
+
requires: [repo-scaffold]
|
|
3607
|
+
conflicts: []
|
|
3608
|
+
absorbs: [render-babylon, shaders-node-material, physics-havok]
|
|
3609
|
+
|
|
3610
|
+
- id: render-playcanvas
|
|
3611
|
+
category: game-3d
|
|
3612
|
+
tier: specialist
|
|
3613
|
+
status: proposed
|
|
3614
|
+
choiceSet: game-renderer
|
|
3615
|
+
what: PlayCanvas engine with its ECS and the gaussian-splatting renderer.
|
|
3616
|
+
stacks: [typescript]
|
|
3617
|
+
sources:
|
|
3618
|
+
- https://github.com/playcanvas/engine
|
|
3619
|
+
requires: [repo-scaffold]
|
|
3620
|
+
conflicts: []
|
|
3621
|
+
absorbs: [render-playcanvas, ecs-playcanvas, render-gaussian-splatting]
|
|
3622
|
+
|
|
3623
|
+
- id: render-framework-bindings
|
|
3624
|
+
category: game-3d
|
|
3625
|
+
tier: specialist
|
|
3626
|
+
status: proposed
|
|
3627
|
+
what: Threlte (Svelte) and TresJS (Vue) - the same three.js scene graph in another framework.
|
|
3628
|
+
stacks: [svelte, vue]
|
|
3629
|
+
sources:
|
|
3630
|
+
- https://github.com/threlte/threlte
|
|
3631
|
+
- https://github.com/Tresjs/tres
|
|
3632
|
+
requires: []
|
|
3633
|
+
conflicts: []
|
|
3634
|
+
absorbs: [render-threlte-svelte, render-tres-vue, build-nuxt]
|
|
3635
|
+
|
|
3636
|
+
- id: engine-phaser
|
|
3637
|
+
category: game-3d
|
|
3638
|
+
tier: domain
|
|
3639
|
+
status: proposed
|
|
3640
|
+
choiceSet: game-renderer
|
|
3641
|
+
what: Phaser 2D game with scene routing, arcade physics and spritesheet atlases.
|
|
3642
|
+
stacks: [typescript]
|
|
3643
|
+
sources:
|
|
3644
|
+
- https://github.com/phaserjs/phaser
|
|
3645
|
+
requires: [repo-scaffold]
|
|
3646
|
+
conflicts: []
|
|
3647
|
+
absorbs: [engine-phaser, physics-arcade, physics-matter, assets-spritesheet-atlas, game-scene-router]
|
|
3648
|
+
|
|
3649
|
+
- id: engine-godot
|
|
3650
|
+
category: game-3d
|
|
3651
|
+
tier: domain
|
|
3652
|
+
status: proposed
|
|
3653
|
+
choiceSet: game-renderer
|
|
3654
|
+
what: Godot project with scene/node structure, 3D physics, headless export in CI, and OpenXR.
|
|
3655
|
+
stacks: [godot, gdscript]
|
|
3656
|
+
sources:
|
|
3657
|
+
- https://github.com/godotengine/godot
|
|
3658
|
+
requires: []
|
|
3659
|
+
conflicts: []
|
|
3660
|
+
absorbs: [engine-godot, physics-godot-3d, ci-godot-export, netcode-godot-multiplayer, xr-openxr-godot]
|
|
3661
|
+
|
|
3662
|
+
- id: engine-bevy
|
|
3663
|
+
category: game-3d
|
|
3664
|
+
tier: specialist
|
|
3665
|
+
status: proposed
|
|
3666
|
+
choiceSet: game-renderer
|
|
3667
|
+
what: Bevy ECS app with the bevy_new_2d template's system ordering and asset-loading states.
|
|
3668
|
+
stacks: [rust]
|
|
3669
|
+
sources:
|
|
3670
|
+
- https://github.com/bevyengine/bevy
|
|
3671
|
+
- https://github.com/TheBevyFlock/bevy_new_2d
|
|
3672
|
+
requires: []
|
|
3673
|
+
conflicts: []
|
|
3674
|
+
absorbs: [engine-bevy, ecs-bevy, audio-bevy, build-cargo]
|
|
3675
|
+
licenseNote: >-
|
|
3676
|
+
bevy_new_2d is `MIT OR Apache-2.0 OR CC0-1.0` - a disjunction. Pick MIT to minimise the
|
|
3677
|
+
notice burden and RECORD the choice in THIRD-PARTY-NOTICES.md. An unrecorded choice is
|
|
3678
|
+
not a choice.
|
|
3679
|
+
|
|
3680
|
+
- id: engine-unity
|
|
3681
|
+
category: game-3d
|
|
3682
|
+
tier: specialist
|
|
3683
|
+
status: proposed
|
|
3684
|
+
choiceSet: game-renderer
|
|
3685
|
+
what: Unity project conventions plus Mirror networking for the authoritative-server model.
|
|
3686
|
+
stacks: [unity, csharp]
|
|
3687
|
+
sources:
|
|
3688
|
+
- https://github.com/MirrorNetworking/Mirror
|
|
3689
|
+
requires: []
|
|
3690
|
+
conflicts: []
|
|
3691
|
+
absorbs: [engine-unity, netcode-mirror-unity, state-sync-syncvar, transport-kcp-udp]
|
|
3692
|
+
|
|
3693
|
+
- id: physics-rapier
|
|
3694
|
+
category: game-3d
|
|
3695
|
+
tier: capability
|
|
3696
|
+
status: proposed
|
|
3697
|
+
choiceSet: game-physics
|
|
3698
|
+
what: >-
|
|
3699
|
+
Rapier physics via react-three-rapier - rigid bodies, colliders, collision events and a
|
|
3700
|
+
debug overlay that is on in development and stripped in production.
|
|
3701
|
+
stacks: [react, threejs, rust]
|
|
3702
|
+
sources:
|
|
3703
|
+
- https://github.com/dimforge/rapier
|
|
3704
|
+
- https://github.com/pmndrs/react-three-rapier
|
|
3705
|
+
requires: [render-r3f]
|
|
3706
|
+
conflicts: []
|
|
3707
|
+
absorbs: [physics-rapier, collision-events, debug-physics-overlay]
|
|
3708
|
+
|
|
3709
|
+
- id: game-audio
|
|
3710
|
+
category: game-3d
|
|
3711
|
+
tier: capability
|
|
3712
|
+
status: proposed
|
|
3713
|
+
what: Web Audio positional sound with a sprite-based loader and an unlock-on-first-gesture path.
|
|
3714
|
+
stacks: [typescript]
|
|
3715
|
+
sources:
|
|
3716
|
+
- https://github.com/goldfire/howler.js
|
|
3717
|
+
requires: []
|
|
3718
|
+
conflicts: []
|
|
3719
|
+
absorbs: [audio-webaudio]
|
|
3720
|
+
|
|
3721
|
+
- id: game-input
|
|
3722
|
+
category: game-3d
|
|
3723
|
+
tier: capability
|
|
3724
|
+
status: proposed
|
|
3725
|
+
what: Keyboard/gamepad/pointer input mapped to named actions rather than raw key codes.
|
|
3726
|
+
stacks: [typescript]
|
|
3727
|
+
sources:
|
|
3728
|
+
- https://github.com/pmndrs/drei
|
|
3729
|
+
requires: []
|
|
3730
|
+
conflicts: []
|
|
3731
|
+
absorbs: [input-keyboard-gamepad, input-pointer-keyboard, input-hand-tracking]
|
|
3732
|
+
|
|
3733
|
+
- id: game-xr-webxr
|
|
3734
|
+
category: game-3d
|
|
3735
|
+
tier: specialist
|
|
3736
|
+
status: proposed
|
|
3737
|
+
what: WebXR session setup, controller/hand tracking and the XR-specific perf budget.
|
|
3738
|
+
stacks: [react, threejs]
|
|
3739
|
+
sources:
|
|
3740
|
+
- https://github.com/pmndrs/xr
|
|
3741
|
+
requires: [render-r3f]
|
|
3742
|
+
conflicts: []
|
|
3743
|
+
absorbs: [xr-webxr]
|
|
3744
|
+
|
|
3745
|
+
- id: game-perf-mobile
|
|
3746
|
+
category: game-3d
|
|
3747
|
+
tier: capability
|
|
3748
|
+
status: proposed
|
|
3749
|
+
what: Mobile GPU budget - texture compression, LOD, draw-call ceilings and a device tier map.
|
|
3750
|
+
stacks: [threejs, typescript]
|
|
3751
|
+
sources:
|
|
3752
|
+
- https://github.com/pmndrs/drei
|
|
3753
|
+
requires: []
|
|
3754
|
+
conflicts: []
|
|
3755
|
+
absorbs: [perf-mobile, editor-inspector-debug]
|
|
3756
|
+
|
|
3757
|
+
# ===========================================================================================
|
|
3758
|
+
# TIER: capability - infrastructure and deploy
|
|
3759
|
+
# ===========================================================================================
|
|
3760
|
+
|
|
3761
|
+
- id: k8s-manifests
|
|
3762
|
+
category: devops-cicd
|
|
3763
|
+
tier: capability
|
|
3764
|
+
status: proposed
|
|
3765
|
+
what: >-
|
|
3766
|
+
Kustomize base plus staging/prod overlays, with resource requests/limits, PDBs and an HPA.
|
|
3767
|
+
Overlays rather than Helm values when the difference between environments is small.
|
|
3768
|
+
stacks: [kubernetes]
|
|
3769
|
+
sources:
|
|
3770
|
+
- https://github.com/kubernetes-sigs/kustomize
|
|
3771
|
+
requires: [docker]
|
|
3772
|
+
conflicts: []
|
|
3773
|
+
absorbs:
|
|
3774
|
+
[k8s-manifests-base, k8s-manifests-kustomize, k8s-overlays-staging-prod,
|
|
3775
|
+
k8s-hpa-autoscaling, k8s-blue-green-upgrade]
|
|
3776
|
+
|
|
3777
|
+
- id: helm-chart
|
|
3778
|
+
category: devops-cicd
|
|
3779
|
+
tier: capability
|
|
3780
|
+
status: proposed
|
|
3781
|
+
what: A chart for the app with a values schema, so invalid values fail at lint not at install.
|
|
3782
|
+
stacks: [kubernetes]
|
|
3783
|
+
sources:
|
|
3784
|
+
- https://github.com/helm/helm
|
|
3785
|
+
requires: [docker]
|
|
3786
|
+
conflicts: []
|
|
3787
|
+
absorbs: [helm-chart-app, deploy-helm-chart]
|
|
3788
|
+
|
|
3789
|
+
- id: gitops-flux
|
|
3790
|
+
category: devops-cicd
|
|
3791
|
+
tier: specialist
|
|
3792
|
+
status: proposed
|
|
3793
|
+
what: Flux GitRepository/Kustomization/HelmRelease reconciliation from the repo.
|
|
3794
|
+
stacks: [kubernetes]
|
|
3795
|
+
sources:
|
|
3796
|
+
- https://github.com/fluxcd/flux2
|
|
3797
|
+
requires: [k8s-manifests]
|
|
3798
|
+
conflicts: []
|
|
3799
|
+
absorbs: [gitops-flux, helm-release-flux]
|
|
3800
|
+
|
|
3801
|
+
- id: iac-terraform
|
|
3802
|
+
category: devops-cicd
|
|
3803
|
+
tier: capability
|
|
3804
|
+
status: proposed
|
|
3805
|
+
choiceSet: iac-tool
|
|
3806
|
+
what: >-
|
|
3807
|
+
Terraform module layout (root/modules/environments), remote state with locking, the
|
|
3808
|
+
terraform-aws-modules VPC and EKS modules, and Karpenter for node autoscaling.
|
|
3809
|
+
stacks: [terraform, aws]
|
|
3810
|
+
sources:
|
|
3811
|
+
- https://github.com/terraform-aws-modules/terraform-aws-vpc
|
|
3812
|
+
- https://github.com/terraform-aws-modules/terraform-aws-eks
|
|
3813
|
+
- https://github.com/antonbabenko/pre-commit-terraform
|
|
3814
|
+
requires: []
|
|
3815
|
+
conflicts: []
|
|
3816
|
+
absorbs:
|
|
3817
|
+
[iac-terraform-module-layout, iac-terraform-aws-vpc, iac-terraform-aws-eks,
|
|
3818
|
+
k8s-autoscaling-karpenter, iac-reference-architecture, lint-precommit-terraform]
|
|
3819
|
+
licenseNote: >-
|
|
3820
|
+
opentofu/opentofu is MPL-2.0 - reference-only. It is a drop-in CLI replacement and using
|
|
3821
|
+
the binary is fine; copying its source is not. The terraform-aws-modules are Apache-2.0
|
|
3822
|
+
and vendorable with attribution.
|
|
3823
|
+
|
|
3824
|
+
- id: iac-bicep-azd
|
|
3825
|
+
category: devops-cicd
|
|
3826
|
+
tier: specialist
|
|
3827
|
+
status: proposed
|
|
3828
|
+
choiceSet: iac-tool
|
|
3829
|
+
what: Bicep modules driven by azd up, for Azure-native deployments.
|
|
3830
|
+
stacks: [azure, bicep]
|
|
3831
|
+
sources:
|
|
3832
|
+
- https://github.com/Azure/azure-dev
|
|
3833
|
+
requires: []
|
|
3834
|
+
conflicts: []
|
|
3835
|
+
absorbs: [iac-bicep-azd, deploy-azure-container-apps]
|
|
3836
|
+
|
|
3837
|
+
- id: deploy-vercel
|
|
3838
|
+
category: devops-cicd
|
|
3839
|
+
tier: capability
|
|
3840
|
+
status: proposed
|
|
3841
|
+
choiceSet: deploy-target
|
|
3842
|
+
what: Vercel project config, preview deployments per PR, and env-var scoping per environment.
|
|
3843
|
+
stacks: [node, react]
|
|
3844
|
+
sources:
|
|
3845
|
+
- https://github.com/vercel/next.js
|
|
3846
|
+
requires: []
|
|
3847
|
+
conflicts: []
|
|
3848
|
+
absorbs: [deploy-vercel]
|
|
3849
|
+
|
|
3850
|
+
- id: deploy-cloudflare-workers
|
|
3851
|
+
category: devops-cicd
|
|
3852
|
+
tier: capability
|
|
3853
|
+
status: proposed
|
|
3854
|
+
choiceSet: deploy-target
|
|
3855
|
+
what: >-
|
|
3856
|
+
wrangler.toml with bindings for D1/KV/R2/Durable Objects, and the Workers runtime
|
|
3857
|
+
constraints that force an edge-compatible design from the first commit rather than later.
|
|
3858
|
+
stacks: [edge, cloudflare, typescript]
|
|
3859
|
+
sources:
|
|
3860
|
+
- https://github.com/cloudflare/workers-sdk
|
|
3861
|
+
- https://github.com/honojs/hono
|
|
3862
|
+
requires: []
|
|
3863
|
+
conflicts: []
|
|
3864
|
+
absorbs: [deploy-cloudflare-workers, runtime-edge-worker, edge-durable-objects]
|
|
3865
|
+
|
|
3866
|
+
- id: deploy-fly-io
|
|
3867
|
+
category: devops-cicd
|
|
3868
|
+
tier: capability
|
|
3869
|
+
status: proposed
|
|
3870
|
+
choiceSet: deploy-target
|
|
3871
|
+
what: fly.toml with health checks, rolling deploys and a release command for migrations.
|
|
3872
|
+
stacks: [any]
|
|
3873
|
+
sources:
|
|
3874
|
+
- https://github.com/epicweb-dev/epic-stack
|
|
3875
|
+
requires: [docker]
|
|
3876
|
+
conflicts: []
|
|
3877
|
+
absorbs: [deploy-fly-io]
|
|
3878
|
+
|
|
3879
|
+
- id: infra-dotnet-aspire
|
|
3880
|
+
category: devops-cicd
|
|
3881
|
+
tier: specialist
|
|
3882
|
+
status: proposed
|
|
3883
|
+
what: >-
|
|
3884
|
+
.NET Aspire AppHost as the local composition root, with ServiceDefaults carrying OTel,
|
|
3885
|
+
health checks and resilience into every project.
|
|
3886
|
+
stacks: [dotnet]
|
|
3887
|
+
sources:
|
|
3888
|
+
- https://github.com/microsoft/aspire
|
|
3889
|
+
- https://github.com/dotnet/eShop
|
|
3890
|
+
requires: []
|
|
3891
|
+
conflicts: [observability-otel]
|
|
3892
|
+
absorbs: [infra-aspire-apphost]
|
|
3893
|
+
note: >-
|
|
3894
|
+
The conflict with observability-otel is recorded in the shipped observability-otel
|
|
3895
|
+
blueprint (`conflicts: [dotnet-aspire]`) and is real - ServiceDefaults already wires OTel,
|
|
3896
|
+
so both layers would configure the same pipeline twice.
|
|
3897
|
+
|
|
3898
|
+
- id: scaffold-cli-generator
|
|
3899
|
+
category: fullstack-saas
|
|
3900
|
+
tier: specialist
|
|
3901
|
+
status: proposed
|
|
3902
|
+
what: >-
|
|
3903
|
+
Groundplan's own reflection point - the prompt/template/post-generation-hook loop these
|
|
3904
|
+
generators all implement. create-t3-app and the Flutter/RN template generators are the
|
|
3905
|
+
closest prior art to what Groundplan itself is.
|
|
3906
|
+
stacks: [node, typescript]
|
|
3907
|
+
sources:
|
|
3908
|
+
- https://github.com/t3-oss/create-t3-app
|
|
3909
|
+
- https://github.com/devcontainers/features
|
|
3910
|
+
requires: []
|
|
3911
|
+
conflicts: []
|
|
3912
|
+
absorbs:
|
|
3913
|
+
[scaffold-cli-generator, generator-template-registry, generator-base-overlay-templates,
|
|
3914
|
+
generator-adapter-per-framework, generator-post-gen-hooks,
|
|
3915
|
+
generator-idempotent-feature-batteries, component-registry-cli]
|
|
3916
|
+
note: >-
|
|
3917
|
+
Read this one for Groundplan's own design, not to emit into a generated repo. The
|
|
3918
|
+
devcontainers/features `installsAfter` ordering and the shadcn registry format are the two
|
|
3919
|
+
most directly applicable artifacts in the entire catalog.
|