@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.
Files changed (1739) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/adapters/README.md +155 -0
  4. package/adapters/_shared/README.md +16 -0
  5. package/adapters/aider/adapter.yaml +30 -0
  6. package/adapters/aider/templates/.aider.conf.yml.tmpl +5 -0
  7. package/adapters/amp/adapter.yaml +32 -0
  8. package/adapters/amp/templates/SKILL.md.tmpl +8 -0
  9. package/adapters/antigravity-cli/adapter.yaml +36 -0
  10. package/adapters/antigravity-cli/templates/ANTIGRAVITY.md.tmpl +11 -0
  11. package/adapters/claude-code/adapter.yaml +65 -0
  12. package/adapters/claude-code/templates/CLAUDE.md.tmpl +24 -0
  13. package/adapters/claude-code/templates/SKILL.md.tmpl +8 -0
  14. package/adapters/claude-code/templates/agent.md.tmpl +9 -0
  15. package/adapters/claude-code/templates/command.md.tmpl +6 -0
  16. package/adapters/claude-code/templates/rule.md.tmpl +8 -0
  17. package/adapters/claude-code/templates/settings.json.tmpl +11 -0
  18. package/adapters/cline/adapter.yaml +31 -0
  19. package/adapters/cline/templates/rule.md.tmpl +8 -0
  20. package/adapters/codex/adapter.yaml +29 -0
  21. package/adapters/continue/adapter.yaml +36 -0
  22. package/adapters/continue/templates/00-agents-md.md.tmpl +9 -0
  23. package/adapters/continue/templates/rule.md.tmpl +8 -0
  24. package/adapters/cursor/adapter.yaml +34 -0
  25. package/adapters/cursor/templates/rule.mdc.tmpl +9 -0
  26. package/adapters/gemini-cli/adapter.yaml +51 -0
  27. package/adapters/gemini-cli/templates/GEMINI.md.tmpl +9 -0
  28. package/adapters/gemini-cli/templates/command.toml.tmpl +4 -0
  29. package/adapters/github-copilot/adapter.yaml +44 -0
  30. package/adapters/github-copilot/templates/instructions.md.tmpl +8 -0
  31. package/adapters/github-copilot/templates/prompt.prompt.md.tmpl +6 -0
  32. package/adapters/opencode/adapter.yaml +18 -0
  33. package/adapters/opencode/templates/opencode.json.tmpl +4 -0
  34. package/adapters/roo-code/adapter.yaml +21 -0
  35. package/adapters/roo-code/templates/rule.md.tmpl +5 -0
  36. package/adapters/windsurf/adapter.yaml +34 -0
  37. package/adapters/windsurf/templates/agents-md.md.tmpl +12 -0
  38. package/adapters/windsurf/templates/rule.md.tmpl +9 -0
  39. package/adapters/windsurf/templates/workflow.md.tmpl +7 -0
  40. package/adapters/zed/adapter.yaml +14 -0
  41. package/catalog/README.md +62 -0
  42. package/catalog/architectures/agentic-tool-loop.yaml +62 -0
  43. package/catalog/architectures/bff.yaml +58 -0
  44. package/catalog/architectures/clean.yaml +61 -0
  45. package/catalog/architectures/cqrs.yaml +58 -0
  46. package/catalog/architectures/ddd-tactical.yaml +68 -0
  47. package/catalog/architectures/event-driven.yaml +59 -0
  48. package/catalog/architectures/feature-sliced-design.yaml +61 -0
  49. package/catalog/architectures/hexagonal.yaml +60 -0
  50. package/catalog/architectures/lakehouse.yaml +63 -0
  51. package/catalog/architectures/layered.yaml +60 -0
  52. package/catalog/architectures/llm-workflow.yaml +59 -0
  53. package/catalog/architectures/medallion.yaml +60 -0
  54. package/catalog/architectures/micro-frontends.yaml +60 -0
  55. package/catalog/architectures/microservices.yaml +62 -0
  56. package/catalog/architectures/modular-monolith.yaml +62 -0
  57. package/catalog/architectures/monolith.yaml +61 -0
  58. package/catalog/architectures/multi-agent.yaml +61 -0
  59. package/catalog/architectures/mvc-mvvm.yaml +62 -0
  60. package/catalog/architectures/nextjs-colocation.yaml +67 -0
  61. package/catalog/architectures/onion.yaml +60 -0
  62. package/catalog/architectures/pipes-and-filters.yaml +59 -0
  63. package/catalog/architectures/rag-hybrid.yaml +62 -0
  64. package/catalog/architectures/serverless.yaml +58 -0
  65. package/catalog/architectures/vertical-slice.yaml +61 -0
  66. package/catalog/characteristics.yaml +165 -0
  67. package/catalog/decision.yaml +309 -0
  68. package/catalog/sources/README.md +697 -0
  69. package/catalog/sources/agent-tooling.yaml +1180 -0
  70. package/catalog/sources/ai-llm.yaml +508 -0
  71. package/catalog/sources/auth.yaml +618 -0
  72. package/catalog/sources/backend-api.yaml +720 -0
  73. package/catalog/sources/cms-ecommerce.yaml +558 -0
  74. package/catalog/sources/data-engineering.yaml +618 -0
  75. package/catalog/sources/database-orm.yaml +507 -0
  76. package/catalog/sources/devops-cicd.yaml +422 -0
  77. package/catalog/sources/frontend-ui.yaml +654 -0
  78. package/catalog/sources/fullstack-saas.yaml +629 -0
  79. package/catalog/sources/game-3d.yaml +834 -0
  80. package/catalog/sources/gaps.md +268 -0
  81. package/catalog/sources/layer-plan.yaml +3919 -0
  82. package/catalog/sources/mobile-desktop.yaml +638 -0
  83. package/catalog/sources/observability.yaml +1364 -0
  84. package/catalog/sources/payments-billing.yaml +553 -0
  85. package/catalog/sources/realtime-messaging.yaml +787 -0
  86. package/catalog/sources/security-compliance.yaml +613 -0
  87. package/catalog/sources/testing.yaml +652 -0
  88. package/dist/adapters.d.ts +43 -0
  89. package/dist/adapters.js +181 -0
  90. package/dist/adapters.js.map +1 -0
  91. package/dist/agentkit.d.ts +65 -0
  92. package/dist/agentkit.js +183 -0
  93. package/dist/agentkit.js.map +1 -0
  94. package/dist/apply.d.ts +21 -0
  95. package/dist/apply.js +135 -0
  96. package/dist/apply.js.map +1 -0
  97. package/dist/condition.d.ts +14 -0
  98. package/dist/condition.js +121 -0
  99. package/dist/condition.js.map +1 -0
  100. package/dist/config.d.ts +36 -0
  101. package/dist/config.js +131 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/index.d.ts +15 -0
  104. package/dist/index.js +16 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/intent.d.ts +52 -0
  107. package/dist/intent.js +220 -0
  108. package/dist/intent.js.map +1 -0
  109. package/dist/license.d.ts +11 -0
  110. package/dist/license.js +68 -0
  111. package/dist/license.js.map +1 -0
  112. package/dist/loader.d.ts +12 -0
  113. package/dist/loader.js +118 -0
  114. package/dist/loader.js.map +1 -0
  115. package/dist/merge.d.ts +28 -0
  116. package/dist/merge.js +412 -0
  117. package/dist/merge.js.map +1 -0
  118. package/dist/plan.d.ts +12 -0
  119. package/dist/plan.js +206 -0
  120. package/dist/plan.js.map +1 -0
  121. package/dist/python-data.json +575 -0
  122. package/dist/python-requirements.d.ts +7 -0
  123. package/dist/python-requirements.js +79 -0
  124. package/dist/python-requirements.js.map +1 -0
  125. package/dist/recommend.d.ts +27 -0
  126. package/dist/recommend.js +68 -0
  127. package/dist/recommend.js.map +1 -0
  128. package/dist/resolve.d.ts +22 -0
  129. package/dist/resolve.js +132 -0
  130. package/dist/resolve.js.map +1 -0
  131. package/dist/schema.d.ts +878 -0
  132. package/dist/schema.js +307 -0
  133. package/dist/schema.js.map +1 -0
  134. package/dist/tokens.d.ts +42 -0
  135. package/dist/tokens.js +90 -0
  136. package/dist/tokens.js.map +1 -0
  137. package/package.json +61 -0
  138. package/registry/README.md +194 -0
  139. package/registry/agents/architecture-reviewer/agent.md +59 -0
  140. package/registry/agents/architecture-reviewer/agent.yaml +7 -0
  141. package/registry/agents/breaking-change-detector/agent.md +83 -0
  142. package/registry/agents/breaking-change-detector/agent.yaml +7 -0
  143. package/registry/agents/security-reviewer/agent.md +63 -0
  144. package/registry/agents/security-reviewer/agent.yaml +7 -0
  145. package/registry/agents/solid-reviewer/agent.md +61 -0
  146. package/registry/agents/solid-reviewer/agent.yaml +7 -0
  147. package/registry/agents/spec-consistency-checker/agent.md +70 -0
  148. package/registry/agents/spec-consistency-checker/agent.yaml +7 -0
  149. package/registry/agents/test-coverage-reviewer/agent.md +67 -0
  150. package/registry/agents/test-coverage-reviewer/agent.yaml +7 -0
  151. package/registry/commands/adr/command.md +80 -0
  152. package/registry/commands/adr/command.yaml +7 -0
  153. package/registry/commands/breaking/command.md +72 -0
  154. package/registry/commands/breaking/command.yaml +7 -0
  155. package/registry/commands/done/command.md +50 -0
  156. package/registry/commands/done/command.yaml +7 -0
  157. package/registry/commands/handoff/command.md +65 -0
  158. package/registry/commands/handoff/command.yaml +7 -0
  159. package/registry/commands/plan/command.md +81 -0
  160. package/registry/commands/plan/command.yaml +7 -0
  161. package/registry/commands/review/command.md +54 -0
  162. package/registry/commands/review/command.yaml +8 -0
  163. package/registry/commands/scope/command.md +45 -0
  164. package/registry/commands/scope/command.yaml +7 -0
  165. package/registry/commands/spec/command.md +81 -0
  166. package/registry/commands/spec/command.yaml +7 -0
  167. package/registry/commands/tasks/command.md +70 -0
  168. package/registry/commands/tasks/command.yaml +7 -0
  169. package/registry/commands/verify/command.md +43 -0
  170. package/registry/commands/verify/command.yaml +7 -0
  171. package/registry/hooks/_lib/config.ps1 +116 -0
  172. package/registry/hooks/_lib/config.sh +143 -0
  173. package/registry/hooks/_lib/defaults.json +76 -0
  174. package/registry/hooks/_lib/json_get.mjs +59 -0
  175. package/registry/hooks/_lib/json_get.py +60 -0
  176. package/registry/hooks/architecture-boundary-check/hook.ps1 +46 -0
  177. package/registry/hooks/architecture-boundary-check/hook.sh +49 -0
  178. package/registry/hooks/architecture-boundary-check/hook.yaml +18 -0
  179. package/registry/hooks/conventional-commit-check/hook.ps1 +68 -0
  180. package/registry/hooks/conventional-commit-check/hook.sh +68 -0
  181. package/registry/hooks/conventional-commit-check/hook.yaml +16 -0
  182. package/registry/hooks/format-on-write/hook.ps1 +36 -0
  183. package/registry/hooks/format-on-write/hook.sh +33 -0
  184. package/registry/hooks/format-on-write/hook.yaml +14 -0
  185. package/registry/hooks/guard-protected-paths/hook.ps1 +34 -0
  186. package/registry/hooks/guard-protected-paths/hook.sh +35 -0
  187. package/registry/hooks/guard-protected-paths/hook.yaml +14 -0
  188. package/registry/hooks/no-secrets/hook.ps1 +67 -0
  189. package/registry/hooks/no-secrets/hook.sh +56 -0
  190. package/registry/hooks/no-secrets/hook.yaml +16 -0
  191. package/registry/skills/adr-write/SKILL.md +127 -0
  192. package/registry/skills/adr-write/references/adr-template.md +143 -0
  193. package/registry/skills/adr-write/references/when-to-write-an-adr.md +74 -0
  194. package/registry/skills/adr-write/skill.yaml +7 -0
  195. package/registry/skills/architecture-guard/SKILL.md +150 -0
  196. package/registry/skills/architecture-guard/references/boundary-patterns.md +142 -0
  197. package/registry/skills/architecture-guard/references/violation-catalog.md +149 -0
  198. package/registry/skills/architecture-guard/skill.yaml +7 -0
  199. package/registry/skills/handoff/SKILL.md +125 -0
  200. package/registry/skills/handoff/references/agent-protocol.md +128 -0
  201. package/registry/skills/handoff/references/handoff-template.md +116 -0
  202. package/registry/skills/handoff/skill.yaml +7 -0
  203. package/registry/skills/onboard/SKILL.md +120 -0
  204. package/registry/skills/onboard/references/discovery-checklist.md +129 -0
  205. package/registry/skills/onboard/references/repo-map-template.md +120 -0
  206. package/registry/skills/onboard/skill.yaml +7 -0
  207. package/registry/skills/perf-budget/SKILL.md +152 -0
  208. package/registry/skills/perf-budget/references/budget-catalog.md +165 -0
  209. package/registry/skills/perf-budget/references/measurement-sources.md +163 -0
  210. package/registry/skills/perf-budget/skill.yaml +7 -0
  211. package/registry/skills/security-review/SKILL.md +145 -0
  212. package/registry/skills/security-review/references/owasp-checklist.md +190 -0
  213. package/registry/skills/security-review/references/secret-patterns.md +110 -0
  214. package/registry/skills/security-review/skill.yaml +7 -0
  215. package/registry/skills/spec-driven/SKILL.md +124 -0
  216. package/registry/skills/spec-driven/references/phase-gates.md +115 -0
  217. package/registry/skills/spec-driven/references/plan-template.md +98 -0
  218. package/registry/skills/spec-driven/references/spec-template.md +101 -0
  219. package/registry/skills/spec-driven/references/tasks-template.md +96 -0
  220. package/registry/skills/spec-driven/skill.yaml +7 -0
  221. package/registry/skills/test-first/SKILL.md +125 -0
  222. package/registry/skills/test-first/references/anti-patterns.md +178 -0
  223. package/registry/skills/test-first/references/test-design.md +156 -0
  224. package/registry/skills/test-first/skill.yaml +7 -0
  225. package/templates/README.md +104 -0
  226. package/templates/agent-kits/core/blueprint.yaml +39 -0
  227. package/templates/agent-kits/core/files/.agent/ACTIVE.md +25 -0
  228. package/templates/agent-kits/core/files/.agent/DECISIONS.md +27 -0
  229. package/templates/agent-kits/core/files/.agent/DELEGATION.md +30 -0
  230. package/templates/agent-kits/core/files/.agent/DONE.md +9 -0
  231. package/templates/agent-kits/core/files/.agent/HANDOFF.md +38 -0
  232. package/templates/agent-kits/core/files/.agent/delegate.mjs +352 -0
  233. package/templates/agent-kits/core/files/.agent/delegation-tools.json +1 -0
  234. package/templates/agent-kits/core/files/.agent/delegation.yaml +33 -0
  235. package/templates/agent-kits/core/files/AGENTS.md +107 -0
  236. package/templates/agent-kits/core/files/docs/ARCHITECTURE.md +26 -0
  237. package/templates/agent-kits/core/files/docs/adr/0001-record-architecture-decisions.md +27 -0
  238. package/templates/agent-kits/core/files/specs/000-template/plan.md +48 -0
  239. package/templates/agent-kits/core/files/specs/000-template/spec.md +45 -0
  240. package/templates/agent-kits/core/files/specs/000-template/tasks.md +21 -0
  241. package/templates/agent-kits/core/files/specs/README.md +32 -0
  242. package/templates/architectures/agentic-tool-loop/blueprint.yaml +137 -0
  243. package/templates/architectures/agentic-tool-loop/files/.importlinter +47 -0
  244. package/templates/architectures/agentic-tool-loop/files/docs/architecture/agentic-tool-loop.node.md +83 -0
  245. package/templates/architectures/agentic-tool-loop/files/docs/architecture/agentic-tool-loop.python.md +93 -0
  246. package/templates/architectures/agentic-tool-loop/files/package.json +6 -0
  247. package/templates/architectures/agentic-tool-loop/files/pyproject.toml +5 -0
  248. package/templates/architectures/agentic-tool-loop/files/scripts/check-agent-loop.mjs +227 -0
  249. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/__init__.py +20 -0
  250. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/loop.py +112 -0
  251. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/model.py +50 -0
  252. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/sandbox.py +62 -0
  253. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/settings.py +69 -0
  254. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/__init__.py +6 -0
  255. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/current_time.py +27 -0
  256. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/registry.py +44 -0
  257. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/spec.py +29 -0
  258. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/tools/write_note.py +36 -0
  259. package/templates/architectures/agentic-tool-loop/files/src/__solutionName.snake__/agent/trace.py +33 -0
  260. package/templates/architectures/agentic-tool-loop/files/src/agent/config.ts +65 -0
  261. package/templates/architectures/agentic-tool-loop/files/src/agent/index.ts +8 -0
  262. package/templates/architectures/agentic-tool-loop/files/src/agent/loop.ts +117 -0
  263. package/templates/architectures/agentic-tool-loop/files/src/agent/model.ts +35 -0
  264. package/templates/architectures/agentic-tool-loop/files/src/agent/sandbox.ts +52 -0
  265. package/templates/architectures/agentic-tool-loop/files/src/agent/tools/current-time.ts +13 -0
  266. package/templates/architectures/agentic-tool-loop/files/src/agent/tools/registry.ts +49 -0
  267. package/templates/architectures/agentic-tool-loop/files/src/agent/tools/types.ts +26 -0
  268. package/templates/architectures/agentic-tool-loop/files/src/agent/tools/write-note.ts +23 -0
  269. package/templates/architectures/agentic-tool-loop/files/src/agent/trace.ts +26 -0
  270. package/templates/architectures/agentic-tool-loop/files/tests/architecture/test_agent_loop.py +167 -0
  271. package/templates/architectures/bff/blueprint.yaml +83 -0
  272. package/templates/architectures/bff/files/docs/architecture/bff.node.md +115 -0
  273. package/templates/architectures/bff/files/docs/architecture/bff.typescript.md +113 -0
  274. package/templates/architectures/bff/files/scripts/check-bff-boundaries.mjs +223 -0
  275. package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/aggregate.ts +38 -0
  276. package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/config.ts +30 -0
  277. package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/dto.ts +21 -0
  278. package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/index.ts +6 -0
  279. package/templates/architectures/bff/files/src/bff/__primaryClient.kebab__/routes.ts +21 -0
  280. package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/aggregate.ts +23 -0
  281. package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/config.ts +26 -0
  282. package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/dto.ts +16 -0
  283. package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/index.ts +6 -0
  284. package/templates/architectures/bff/files/src/bff/__secondaryClient.kebab__/routes.ts +21 -0
  285. package/templates/architectures/bff/files/src/downstream/config.ts +35 -0
  286. package/templates/architectures/bff/files/src/downstream/http-client.ts +41 -0
  287. package/templates/architectures/bff/files/src/downstream/index.ts +9 -0
  288. package/templates/architectures/bff/files/src/downstream/orders-client.ts +23 -0
  289. package/templates/architectures/bff/files/src/downstream/profile-client.ts +18 -0
  290. package/templates/architectures/clean/blueprint.yaml +147 -0
  291. package/templates/architectures/clean/files/.importlinter +35 -0
  292. package/templates/architectures/clean/files/Directory.Packages.props +7 -0
  293. package/templates/architectures/clean/files/__solutionName.dot__.slnx +10 -0
  294. package/templates/architectures/clean/files/docs/architecture/clean.md +87 -0
  295. package/templates/architectures/clean/files/eslint.config.architecture.mjs +27 -0
  296. package/templates/architectures/clean/files/internal/application/doc.go +2 -0
  297. package/templates/architectures/clean/files/internal/application/ports/doc.go +2 -0
  298. package/templates/architectures/clean/files/internal/architecture/architecture_test.go +166 -0
  299. package/templates/architectures/clean/files/internal/architecture/doc.go +3 -0
  300. package/templates/architectures/clean/files/internal/domain/doc.go +2 -0
  301. package/templates/architectures/clean/files/internal/infrastructure/doc.go +2 -0
  302. package/templates/architectures/clean/files/pyproject.toml +2 -0
  303. package/templates/architectures/clean/files/scripts/check-architecture.mjs +68 -0
  304. package/templates/architectures/clean/files/src/__solutionName.dot__.Application/Abstractions/.gitkeep +1 -0
  305. package/templates/architectures/clean/files/src/__solutionName.dot__.Application/AssemblyMarker.cs +10 -0
  306. package/templates/architectures/clean/files/src/__solutionName.dot__.Application/UseCases/.gitkeep +1 -0
  307. package/templates/architectures/clean/files/src/__solutionName.dot__.Application/__solutionName.dot__.Application.csproj +14 -0
  308. package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/AssemblyMarker.cs +10 -0
  309. package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/Entities/.gitkeep +1 -0
  310. package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/Events/.gitkeep +1 -0
  311. package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/ValueObjects/.gitkeep +1 -0
  312. package/templates/architectures/clean/files/src/__solutionName.dot__.Domain/__solutionName.dot__.Domain.csproj +11 -0
  313. package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/AssemblyMarker.cs +10 -0
  314. package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/External/.gitkeep +1 -0
  315. package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/Persistence/.gitkeep +1 -0
  316. package/templates/architectures/clean/files/src/__solutionName.dot__.Infrastructure/__solutionName.dot__.Infrastructure.csproj +14 -0
  317. package/templates/architectures/clean/files/src/__solutionName.snake__/application/__init__.py +1 -0
  318. package/templates/architectures/clean/files/src/__solutionName.snake__/application/ports/__init__.py +1 -0
  319. package/templates/architectures/clean/files/src/__solutionName.snake__/application/use_cases/__init__.py +1 -0
  320. package/templates/architectures/clean/files/src/__solutionName.snake__/domain/__init__.py +1 -0
  321. package/templates/architectures/clean/files/src/__solutionName.snake__/domain/entities/__init__.py +1 -0
  322. package/templates/architectures/clean/files/src/__solutionName.snake__/domain/events/__init__.py +1 -0
  323. package/templates/architectures/clean/files/src/__solutionName.snake__/infrastructure/__init__.py +1 -0
  324. package/templates/architectures/clean/files/src/__solutionName.snake__/infrastructure/external/__init__.py +1 -0
  325. package/templates/architectures/clean/files/src/__solutionName.snake__/infrastructure/persistence/__init__.py +1 -0
  326. package/templates/architectures/clean/files/src/application/ports/README.md +1 -0
  327. package/templates/architectures/clean/files/src/application/use-cases/README.md +1 -0
  328. package/templates/architectures/clean/files/src/domain/README.md +1 -0
  329. package/templates/architectures/clean/files/src/infrastructure/README.md +1 -0
  330. package/templates/architectures/clean/files/tests/__solutionName.dot__.ArchitectureTests/DependencyRuleTests.cs +118 -0
  331. package/templates/architectures/clean/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +27 -0
  332. package/templates/architectures/cqrs/blueprint.yaml +134 -0
  333. package/templates/architectures/cqrs/files/.importlinter +26 -0
  334. package/templates/architectures/cqrs/files/Directory.Packages.props +7 -0
  335. package/templates/architectures/cqrs/files/__solutionName.dot__.slnx +11 -0
  336. package/templates/architectures/cqrs/files/docs/architecture/cqrs.dotnet.md +116 -0
  337. package/templates/architectures/cqrs/files/docs/architecture/cqrs.node.md +117 -0
  338. package/templates/architectures/cqrs/files/docs/architecture/cqrs.python.md +107 -0
  339. package/templates/architectures/cqrs/files/eslint.config.cqrs.mjs +29 -0
  340. package/templates/architectures/cqrs/files/pyproject.toml +2 -0
  341. package/templates/architectures/cqrs/files/scripts/check-cqrs-boundaries.mjs +132 -0
  342. package/templates/architectures/cqrs/files/src/__contextName.kebab__/commands/index.ts +15 -0
  343. package/templates/architectures/cqrs/files/src/__contextName.kebab__/domain/index.ts +10 -0
  344. package/templates/architectures/cqrs/files/src/__contextName.kebab__/queries/index.ts +13 -0
  345. package/templates/architectures/cqrs/files/src/__contextName.kebab__/read-models/index.ts +7 -0
  346. package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/AssemblyMarker.cs +9 -0
  347. package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/ICommandHandler.cs +12 -0
  348. package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/IQueryHandler.cs +10 -0
  349. package/templates/architectures/cqrs/files/src/__solutionName.dot__.Abstractions/__solutionName.dot__.Abstractions.csproj +11 -0
  350. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Commands/AssemblyMarker.cs +9 -0
  351. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Commands/Handlers/.gitkeep +2 -0
  352. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Commands/__solutionName.dot__.__contextName.pascal__.Commands.csproj +15 -0
  353. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Domain/Aggregates/.gitkeep +2 -0
  354. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Domain/AssemblyMarker.cs +9 -0
  355. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Domain/__solutionName.dot__.__contextName.pascal__.Domain.csproj +11 -0
  356. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/AssemblyMarker.cs +9 -0
  357. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/Handlers/.gitkeep +2 -0
  358. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/ReadModels/.gitkeep +2 -0
  359. package/templates/architectures/cqrs/files/src/__solutionName.dot__.__contextName.pascal__.Queries/__solutionName.dot__.__contextName.pascal__.Queries.csproj +14 -0
  360. package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/__init__.py +6 -0
  361. package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/commands/__init__.py +15 -0
  362. package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/domain/__init__.py +9 -0
  363. package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/queries/__init__.py +14 -0
  364. package/templates/architectures/cqrs/files/src/__solutionName.snake__/__contextName.snake__/read_models/__init__.py +14 -0
  365. package/templates/architectures/cqrs/files/tests/ArchitectureTests/ArchitectureTests.csproj +33 -0
  366. package/templates/architectures/cqrs/files/tests/ArchitectureTests/CqrsBoundaryTests.cs +104 -0
  367. package/templates/architectures/event-driven/blueprint.yaml +163 -0
  368. package/templates/architectures/event-driven/files/.importlinter +43 -0
  369. package/templates/architectures/event-driven/files/Directory.Packages.props +11 -0
  370. package/templates/architectures/event-driven/files/__solutionName.dot__.slnx +11 -0
  371. package/templates/architectures/event-driven/files/docs/architecture/event-driven.dotnet.md +117 -0
  372. package/templates/architectures/event-driven/files/docs/architecture/event-driven.node.md +98 -0
  373. package/templates/architectures/event-driven/files/docs/architecture/event-driven.python.md +100 -0
  374. package/templates/architectures/event-driven/files/scripts/check-event-boundaries.mjs +181 -0
  375. package/templates/architectures/event-driven/files/src/EventCatalog/EventCatalog.csproj +11 -0
  376. package/templates/architectures/event-driven/files/src/EventCatalog/EventContract.cs +36 -0
  377. package/templates/architectures/event-driven/files/src/EventCatalog/EventEnvelope.cs +10 -0
  378. package/templates/architectures/event-driven/files/src/EventCatalog/EventRegistry.cs +16 -0
  379. package/templates/architectures/event-driven/files/src/EventCatalog/EventSchemaException.cs +19 -0
  380. package/templates/architectures/event-driven/files/src/EventCatalog/__eventDomain.pascal__/__firstEvent.pascal__V1.cs +20 -0
  381. package/templates/architectures/event-driven/files/src/EventHandlers/EventHandlers.csproj +14 -0
  382. package/templates/architectures/event-driven/files/src/EventHandlers/__firstHandler.pascal__/__firstHandler.pascal__Handler.cs +32 -0
  383. package/templates/architectures/event-driven/files/src/EventHandlers/__secondHandler.pascal__/__secondHandler.pascal__Handler.cs +30 -0
  384. package/templates/architectures/event-driven/files/src/EventPublishers/EventPublishers.csproj +14 -0
  385. package/templates/architectures/event-driven/files/src/EventPublishers/__eventDomain.pascal__/__eventDomain.pascal__Publisher.cs +27 -0
  386. package/templates/architectures/event-driven/files/src/Messaging/Adapters/InMemoryEventBroker.cs +107 -0
  387. package/templates/architectures/event-driven/files/src/Messaging/BrokerOptions.cs +19 -0
  388. package/templates/architectures/event-driven/files/src/Messaging/IEventBroker.cs +6 -0
  389. package/templates/architectures/event-driven/files/src/Messaging/IEventPublisher.cs +9 -0
  390. package/templates/architectures/event-driven/files/src/Messaging/IEventSubscriber.cs +11 -0
  391. package/templates/architectures/event-driven/files/src/Messaging/Messaging.csproj +18 -0
  392. package/templates/architectures/event-driven/files/src/Messaging/MessagingRegistration.cs +36 -0
  393. package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/__init__.py +17 -0
  394. package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/adapters/__init__.py +1 -0
  395. package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/adapters/in_memory.py +61 -0
  396. package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/config.py +42 -0
  397. package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/factory.py +13 -0
  398. package/templates/architectures/event-driven/files/src/__solutionName.snake__/broker/port.py +25 -0
  399. package/templates/architectures/event-driven/files/src/__solutionName.snake__/eventing.py +26 -0
  400. package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__eventDomain.snake__/__firstEvent.snake__/__init__.py +5 -0
  401. package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__eventDomain.snake__/__firstEvent.snake__/v1.py +34 -0
  402. package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__eventDomain.snake__/__init__.py +1 -0
  403. package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/__init__.py +27 -0
  404. package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/contract.py +35 -0
  405. package/templates/architectures/event-driven/files/src/__solutionName.snake__/events/envelope.py +24 -0
  406. package/templates/architectures/event-driven/files/src/__solutionName.snake__/handlers/__firstHandler.snake__/__init__.py +30 -0
  407. package/templates/architectures/event-driven/files/src/__solutionName.snake__/handlers/__init__.py +1 -0
  408. package/templates/architectures/event-driven/files/src/__solutionName.snake__/handlers/__secondHandler.snake__/__init__.py +25 -0
  409. package/templates/architectures/event-driven/files/src/__solutionName.snake__/publishers/__eventDomain.snake__.py +17 -0
  410. package/templates/architectures/event-driven/files/src/__solutionName.snake__/publishers/__init__.py +5 -0
  411. package/templates/architectures/event-driven/files/src/bootstrap/events.ts +24 -0
  412. package/templates/architectures/event-driven/files/src/broker/adapters/in-memory-broker.ts +63 -0
  413. package/templates/architectures/event-driven/files/src/broker/config.ts +39 -0
  414. package/templates/architectures/event-driven/files/src/broker/factory.ts +13 -0
  415. package/templates/architectures/event-driven/files/src/broker/index.ts +6 -0
  416. package/templates/architectures/event-driven/files/src/broker/port.ts +15 -0
  417. package/templates/architectures/event-driven/files/src/events/__eventDomain.kebab__/__firstEvent.kebab__/v1.ts +20 -0
  418. package/templates/architectures/event-driven/files/src/events/contract.ts +36 -0
  419. package/templates/architectures/event-driven/files/src/events/envelope.ts +20 -0
  420. package/templates/architectures/event-driven/files/src/events/index.ts +17 -0
  421. package/templates/architectures/event-driven/files/src/handlers/__firstHandler.kebab__/index.ts +21 -0
  422. package/templates/architectures/event-driven/files/src/handlers/__secondHandler.kebab__/index.ts +17 -0
  423. package/templates/architectures/event-driven/files/src/publishers/__eventDomain.kebab__.publisher.ts +20 -0
  424. package/templates/architectures/event-driven/files/tests/EventArchitectureTests/EventArchitectureTests.csproj +31 -0
  425. package/templates/architectures/event-driven/files/tests/EventArchitectureTests/EventBoundaryTests.cs +121 -0
  426. package/templates/architectures/event-driven/files/tests/architecture/test_event_boundaries.py +161 -0
  427. package/templates/architectures/feature-sliced-design/blueprint.yaml +121 -0
  428. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/app/.gitkeep +1 -0
  429. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/entities/.gitkeep +1 -0
  430. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/features/.gitkeep +1 -0
  431. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/pages/.gitkeep +1 -0
  432. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/api/index.ts +3 -0
  433. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/config/index.ts +3 -0
  434. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/lib/index.ts +3 -0
  435. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/shared/ui/index.ts +3 -0
  436. package/templates/architectures/feature-sliced-design/files/apps/__appName.kebab__/src/widgets/.gitkeep +1 -0
  437. package/templates/architectures/feature-sliced-design/files/docs/architecture.md +148 -0
  438. package/templates/architectures/feature-sliced-design/files/package.json +6 -0
  439. package/templates/architectures/feature-sliced-design/files/scripts/check-fsd-boundaries.mjs +210 -0
  440. package/templates/architectures/feature-sliced-design/files/src/_app/.gitkeep +1 -0
  441. package/templates/architectures/feature-sliced-design/files/src/_pages/.gitkeep +1 -0
  442. package/templates/architectures/feature-sliced-design/files/src/app/.gitkeep +1 -0
  443. package/templates/architectures/feature-sliced-design/files/src/entities/.gitkeep +1 -0
  444. package/templates/architectures/feature-sliced-design/files/src/features/.gitkeep +1 -0
  445. package/templates/architectures/feature-sliced-design/files/src/pages/.gitkeep +1 -0
  446. package/templates/architectures/feature-sliced-design/files/src/shared/api/index.ts +3 -0
  447. package/templates/architectures/feature-sliced-design/files/src/shared/config/index.ts +3 -0
  448. package/templates/architectures/feature-sliced-design/files/src/shared/lib/index.ts +3 -0
  449. package/templates/architectures/feature-sliced-design/files/src/shared/ui/index.ts +3 -0
  450. package/templates/architectures/feature-sliced-design/files/src/widgets/.gitkeep +1 -0
  451. package/templates/architectures/feature-sliced-design/files/steiger.config.js +21 -0
  452. package/templates/architectures/hexagonal/blueprint.yaml +146 -0
  453. package/templates/architectures/hexagonal/files/.importlinter +33 -0
  454. package/templates/architectures/hexagonal/files/Directory.Packages.props +8 -0
  455. package/templates/architectures/hexagonal/files/__solutionName.dot__.slnx +13 -0
  456. package/templates/architectures/hexagonal/files/docs/architecture/hexagonal.md +102 -0
  457. package/templates/architectures/hexagonal/files/internal/adapters/inbound/rest/doc.go +2 -0
  458. package/templates/architectures/hexagonal/files/internal/adapters/outbound/memory/doc.go +2 -0
  459. package/templates/architectures/hexagonal/files/internal/adapters/outbound/postgres/doc.go +2 -0
  460. package/templates/architectures/hexagonal/files/internal/application/doc.go +2 -0
  461. package/templates/architectures/hexagonal/files/internal/architecture/architecture_test.go +150 -0
  462. package/templates/architectures/hexagonal/files/internal/architecture/doc.go +2 -0
  463. package/templates/architectures/hexagonal/files/internal/bootstrap/doc.go +2 -0
  464. package/templates/architectures/hexagonal/files/internal/domain/doc.go +2 -0
  465. package/templates/architectures/hexagonal/files/internal/ports/inbound/doc.go +2 -0
  466. package/templates/architectures/hexagonal/files/internal/ports/outbound/doc.go +2 -0
  467. package/templates/architectures/hexagonal/files/pyproject.toml +2 -0
  468. package/templates/architectures/hexagonal/files/scripts/check-architecture.mjs +104 -0
  469. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Inbound.Http/HttpAdapterMarker.cs +4 -0
  470. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Inbound.Http/__solutionName.dot__.Adapters.Inbound.Http.csproj +15 -0
  471. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.InMemory/InMemoryAdapterMarker.cs +4 -0
  472. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.InMemory/__solutionName.dot__.Adapters.Outbound.InMemory.csproj +15 -0
  473. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.Persistence/PersistenceAdapterMarker.cs +4 -0
  474. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Adapters.Outbound.Persistence/__solutionName.dot__.Adapters.Outbound.Persistence.csproj +15 -0
  475. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/ApplicationMarker.cs +4 -0
  476. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/Ports/Inbound/.gitkeep +1 -0
  477. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/Ports/Outbound/.gitkeep +1 -0
  478. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/UseCases/.gitkeep +1 -0
  479. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Application/__solutionName.dot__.Application.csproj +15 -0
  480. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Bootstrap/CompositionRoot.cs +8 -0
  481. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Bootstrap/__solutionName.dot__.Bootstrap.csproj +18 -0
  482. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Domain/DomainMarker.cs +4 -0
  483. package/templates/architectures/hexagonal/files/src/__solutionName.dot__.Domain/__solutionName.dot__.Domain.csproj +12 -0
  484. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/__init__.py +1 -0
  485. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/inbound/__init__.py +1 -0
  486. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/inbound/http/__init__.py +1 -0
  487. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/outbound/__init__.py +1 -0
  488. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/outbound/in_memory/__init__.py +1 -0
  489. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/adapters/outbound/persistence/__init__.py +1 -0
  490. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/application/__init__.py +1 -0
  491. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/bootstrap/__init__.py +1 -0
  492. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/domain/__init__.py +1 -0
  493. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/ports/__init__.py +1 -0
  494. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/ports/inbound/__init__.py +1 -0
  495. package/templates/architectures/hexagonal/files/src/__solutionName.snake__/ports/outbound/__init__.py +1 -0
  496. package/templates/architectures/hexagonal/files/src/adapters/inbound/http/index.ts +2 -0
  497. package/templates/architectures/hexagonal/files/src/adapters/outbound/in-memory/index.ts +2 -0
  498. package/templates/architectures/hexagonal/files/src/adapters/outbound/persistence/index.ts +2 -0
  499. package/templates/architectures/hexagonal/files/src/application/index.ts +2 -0
  500. package/templates/architectures/hexagonal/files/src/bootstrap/index.ts +2 -0
  501. package/templates/architectures/hexagonal/files/src/domain/index.ts +2 -0
  502. package/templates/architectures/hexagonal/files/src/ports/inbound/index.ts +2 -0
  503. package/templates/architectures/hexagonal/files/src/ports/outbound/index.ts +2 -0
  504. package/templates/architectures/hexagonal/files/tests/ArchitectureTests/ArchitectureTests.csproj +34 -0
  505. package/templates/architectures/hexagonal/files/tests/ArchitectureTests/HexagonBoundaryTests.cs +135 -0
  506. package/templates/architectures/lakehouse/blueprint.yaml +103 -0
  507. package/templates/architectures/lakehouse/files/.importlinter +51 -0
  508. package/templates/architectures/lakehouse/files/docs/architecture/lakehouse.python.md +134 -0
  509. package/templates/architectures/lakehouse/files/pyproject.toml +5 -0
  510. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/__init__.py +20 -0
  511. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/catalog/__init__.py +21 -0
  512. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/catalog/_delta.py +155 -0
  513. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/catalog/_iceberg.py +214 -0
  514. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/maintenance/__init__.py +9 -0
  515. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/maintenance/__main__.py +31 -0
  516. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/maintenance/jobs.py +38 -0
  517. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/ports.py +58 -0
  518. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/queries/__init__.py +13 -0
  519. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/queries/reads.py +30 -0
  520. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/schema.py +66 -0
  521. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/settings.py +61 -0
  522. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/tables/__firstTable.snake__.py +22 -0
  523. package/templates/architectures/lakehouse/files/src/__solutionName.snake__/lakehouse/tables/__init__.py +28 -0
  524. package/templates/architectures/lakehouse/files/tests/architecture/test_lakehouse_boundaries.py +155 -0
  525. package/templates/architectures/layered/blueprint.yaml +159 -0
  526. package/templates/architectures/layered/files/.importlinter +18 -0
  527. package/templates/architectures/layered/files/Directory.Build.targets +10 -0
  528. package/templates/architectures/layered/files/Directory.Packages.props +7 -0
  529. package/templates/architectures/layered/files/__solutionName.dot__.slnx +9 -0
  530. package/templates/architectures/layered/files/architecture.layers.json +19 -0
  531. package/templates/architectures/layered/files/docs/architecture/layered.md +94 -0
  532. package/templates/architectures/layered/files/internal/architecture/doc.go +3 -0
  533. package/templates/architectures/layered/files/internal/architecture/layers_test.go +138 -0
  534. package/templates/architectures/layered/files/internal/business/doc.go +3 -0
  535. package/templates/architectures/layered/files/internal/data/doc.go +3 -0
  536. package/templates/architectures/layered/files/internal/presentation/doc.go +4 -0
  537. package/templates/architectures/layered/files/pyproject.toml +2 -0
  538. package/templates/architectures/layered/files/scripts/check-layers.mjs +125 -0
  539. package/templates/architectures/layered/files/src/__solutionName.dot__.Business/AssemblyMarker.cs +7 -0
  540. package/templates/architectures/layered/files/src/__solutionName.dot__.Business/__solutionName.dot__.Business.csproj +15 -0
  541. package/templates/architectures/layered/files/src/__solutionName.dot__.Data/AssemblyMarker.cs +7 -0
  542. package/templates/architectures/layered/files/src/__solutionName.dot__.Data/__solutionName.dot__.Data.csproj +10 -0
  543. package/templates/architectures/layered/files/src/__solutionName.snake__/business/__init__.py +1 -0
  544. package/templates/architectures/layered/files/src/__solutionName.snake__/data/__init__.py +1 -0
  545. package/templates/architectures/layered/files/src/__solutionName.snake__/presentation/__init__.py +1 -0
  546. package/templates/architectures/layered/files/src/business/README.md +1 -0
  547. package/templates/architectures/layered/files/src/data/README.md +1 -0
  548. package/templates/architectures/layered/files/src/presentation/README.md +1 -0
  549. package/templates/architectures/layered/files/src/shared/README.md +1 -0
  550. package/templates/architectures/layered/files/tests/__solutionName.dot__.ArchitectureTests/LayerBoundaryTests.cs +151 -0
  551. package/templates/architectures/layered/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +27 -0
  552. package/templates/architectures/llm-workflow/blueprint.yaml +129 -0
  553. package/templates/architectures/llm-workflow/files/.importlinter +34 -0
  554. package/templates/architectures/llm-workflow/files/__promptsDir__/README.md +26 -0
  555. package/templates/architectures/llm-workflow/files/__promptsDir__/__firstStep.kebab__/__promptVersion__.md +7 -0
  556. package/templates/architectures/llm-workflow/files/docs/architecture/llm-workflow.python.md +133 -0
  557. package/templates/architectures/llm-workflow/files/docs/architecture/llm-workflow.typescript.md +124 -0
  558. package/templates/architectures/llm-workflow/files/package.json +9 -0
  559. package/templates/architectures/llm-workflow/files/scripts/check-llm-workflow.mjs +200 -0
  560. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/__init__.py +5 -0
  561. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/chains/__init__.py +5 -0
  562. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/chains/__workflowName.snake__.py +19 -0
  563. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/__init__.py +1 -0
  564. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/assertions.py +82 -0
  565. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/goldens.jsonl +4 -0
  566. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/evals/runner.py +64 -0
  567. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/parallel/__init__.py +5 -0
  568. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/parallel/gather.py +28 -0
  569. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/ports/__init__.py +38 -0
  570. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/ports/llm.py +41 -0
  571. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/ports/stub.py +27 -0
  572. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/prompts.py +22 -0
  573. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/routing/__init__.py +5 -0
  574. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/routing/route.py +47 -0
  575. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/settings.py +60 -0
  576. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/steps/__firstStep.snake__.py +24 -0
  577. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/steps/__init__.py +6 -0
  578. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/steps/normalize.py +11 -0
  579. package/templates/architectures/llm-workflow/files/src/__solutionName.snake__/workflow/types.py +40 -0
  580. package/templates/architectures/llm-workflow/files/src/workflow/chains/__workflowName.kebab__.ts +14 -0
  581. package/templates/architectures/llm-workflow/files/src/workflow/evals/assert.ts +59 -0
  582. package/templates/architectures/llm-workflow/files/src/workflow/evals/goldens.jsonl +4 -0
  583. package/templates/architectures/llm-workflow/files/src/workflow/evals/run.ts +60 -0
  584. package/templates/architectures/llm-workflow/files/src/workflow/parallel/gather.ts +25 -0
  585. package/templates/architectures/llm-workflow/files/src/workflow/ports/index.ts +34 -0
  586. package/templates/architectures/llm-workflow/files/src/workflow/ports/llm.ts +33 -0
  587. package/templates/architectures/llm-workflow/files/src/workflow/ports/stub.ts +23 -0
  588. package/templates/architectures/llm-workflow/files/src/workflow/prompts.ts +27 -0
  589. package/templates/architectures/llm-workflow/files/src/workflow/routing/route.ts +38 -0
  590. package/templates/architectures/llm-workflow/files/src/workflow/settings.ts +44 -0
  591. package/templates/architectures/llm-workflow/files/src/workflow/steps/__firstStep.kebab__.ts +19 -0
  592. package/templates/architectures/llm-workflow/files/src/workflow/steps/index.ts +3 -0
  593. package/templates/architectures/llm-workflow/files/src/workflow/steps/normalize.ts +8 -0
  594. package/templates/architectures/llm-workflow/files/src/workflow/types.ts +29 -0
  595. package/templates/architectures/llm-workflow/files/tests/test_workflow_boundaries.py +171 -0
  596. package/templates/architectures/llm-workflow/files/tests/test_workflow_goldens.py +30 -0
  597. package/templates/architectures/medallion/blueprint.yaml +91 -0
  598. package/templates/architectures/medallion/files/.importlinter +31 -0
  599. package/templates/architectures/medallion/files/contracts/bronze.contract.toml +16 -0
  600. package/templates/architectures/medallion/files/contracts/gold.contract.toml +21 -0
  601. package/templates/architectures/medallion/files/contracts/silver.contract.toml +31 -0
  602. package/templates/architectures/medallion/files/docs/architecture/medallion.python.md +104 -0
  603. package/templates/architectures/medallion/files/pyproject.toml +2 -0
  604. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/__init__.py +5 -0
  605. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/bronze/__init__.py +5 -0
  606. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/bronze/ingest.py +41 -0
  607. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/config.py +48 -0
  608. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/contracts.py +166 -0
  609. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/gold/__init__.py +5 -0
  610. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/gold/aggregate.py +40 -0
  611. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/io.py +28 -0
  612. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/run.py +40 -0
  613. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/silver/__init__.py +6 -0
  614. package/templates/architectures/medallion/files/src/__solutionName.snake__/pipelines/silver/conform.py +53 -0
  615. package/templates/architectures/medallion/files/tests/architecture/test_layer_contracts.py +72 -0
  616. package/templates/architectures/medallion/files/tests/architecture/test_medallion_boundaries.py +166 -0
  617. package/templates/architectures/micro-frontends/blueprint.yaml +124 -0
  618. package/templates/architectures/micro-frontends/files/apps/host/package.json +10 -0
  619. package/templates/architectures/micro-frontends/files/apps/host/remotes.example.json +9 -0
  620. package/templates/architectures/micro-frontends/files/apps/host/src/config.ts +34 -0
  621. package/templates/architectures/micro-frontends/files/apps/host/src/loaders/import-map.ts +34 -0
  622. package/templates/architectures/micro-frontends/files/apps/host/src/loaders/module-federation.ts +29 -0
  623. package/templates/architectures/micro-frontends/files/apps/host/src/remote-loader.ts +45 -0
  624. package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/module-federation.config.mjs +19 -0
  625. package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/package.json +15 -0
  626. package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/src/config.ts +28 -0
  627. package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/src/index.ts +5 -0
  628. package/templates/architectures/micro-frontends/files/apps/remotes/__remoteName.kebab__/src/mount.ts +32 -0
  629. package/templates/architectures/micro-frontends/files/docs/architecture/micro-frontends.md +161 -0
  630. package/templates/architectures/micro-frontends/files/package.json +14 -0
  631. package/templates/architectures/micro-frontends/files/packages/design-system/README.md +27 -0
  632. package/templates/architectures/micro-frontends/files/packages/design-system/package.json +11 -0
  633. package/templates/architectures/micro-frontends/files/packages/design-system/src/index.ts +10 -0
  634. package/templates/architectures/micro-frontends/files/packages/design-system/src/tokens.ts +20 -0
  635. package/templates/architectures/micro-frontends/files/packages/host-contract/package.json +11 -0
  636. package/templates/architectures/micro-frontends/files/packages/host-contract/src/index.ts +18 -0
  637. package/templates/architectures/micro-frontends/files/scripts/check-mfe-boundaries.mjs +199 -0
  638. package/templates/architectures/microservices/blueprint.yaml +160 -0
  639. package/templates/architectures/microservices/files/.importlinter +22 -0
  640. package/templates/architectures/microservices/files/Directory.Packages.props +8 -0
  641. package/templates/architectures/microservices/files/__solutionName.dot__.slnx +9 -0
  642. package/templates/architectures/microservices/files/contracts/__firstService.kebab__/package.json +8 -0
  643. package/templates/architectures/microservices/files/contracts/__firstService.kebab__/src/index.ts +32 -0
  644. package/templates/architectures/microservices/files/contracts/__firstService.lower__/contract.go +35 -0
  645. package/templates/architectures/microservices/files/contracts/__solutionName.pascal__.Contracts.__firstService.pascal__/__firstService.pascal__Contract.cs +26 -0
  646. package/templates/architectures/microservices/files/contracts/__solutionName.pascal__.Contracts.__firstService.pascal__/__solutionName.pascal__.Contracts.__firstService.pascal__.csproj +11 -0
  647. package/templates/architectures/microservices/files/deploy/__firstService.kebab__/Dockerfile +16 -0
  648. package/templates/architectures/microservices/files/docs/architecture/microservices.dotnet.md +91 -0
  649. package/templates/architectures/microservices/files/docs/architecture/microservices.go.md +77 -0
  650. package/templates/architectures/microservices/files/docs/architecture/microservices.node.md +88 -0
  651. package/templates/architectures/microservices/files/docs/architecture/microservices.python.md +92 -0
  652. package/templates/architectures/microservices/files/internal/architecture/boundary_test.go +139 -0
  653. package/templates/architectures/microservices/files/package.json +9 -0
  654. package/templates/architectures/microservices/files/pyproject.toml +2 -0
  655. package/templates/architectures/microservices/files/scripts/check-service-boundaries.mjs +200 -0
  656. package/templates/architectures/microservices/files/services/__firstService.kebab__/Dockerfile +19 -0
  657. package/templates/architectures/microservices/files/services/__firstService.kebab__/package.json +9 -0
  658. package/templates/architectures/microservices/files/services/__firstService.kebab__/src/config.ts +50 -0
  659. package/templates/architectures/microservices/files/services/__firstService.kebab__/src/index.ts +26 -0
  660. package/templates/architectures/microservices/files/services/__firstService.lower__/Dockerfile +18 -0
  661. package/templates/architectures/microservices/files/services/__firstService.lower__/internal/config/config.go +45 -0
  662. package/templates/architectures/microservices/files/services/__firstService.lower__/main.go +23 -0
  663. package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/Dockerfile +17 -0
  664. package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/ServiceAssemblyMarker.cs +10 -0
  665. package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/ServiceOptions.cs +28 -0
  666. package/templates/architectures/microservices/files/services/__solutionName.pascal__.Services.__firstService.pascal__/__solutionName.pascal__.Services.__firstService.pascal__.csproj +14 -0
  667. package/templates/architectures/microservices/files/src/__solutionName.snake__/contracts/__firstService.snake__/__init__.py +42 -0
  668. package/templates/architectures/microservices/files/src/__solutionName.snake__/contracts/__init__.py +5 -0
  669. package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__firstService.snake__/__init__.py +5 -0
  670. package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__firstService.snake__/config.py +54 -0
  671. package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__firstService.snake__/service.py +21 -0
  672. package/templates/architectures/microservices/files/src/__solutionName.snake__/services/__init__.py +5 -0
  673. package/templates/architectures/microservices/files/tests/ArchitectureTests/ArchitectureTests.csproj +29 -0
  674. package/templates/architectures/microservices/files/tests/ArchitectureTests/ServiceBoundaryTests.cs +102 -0
  675. package/templates/architectures/microservices/files/tests/architecture/test_service_boundaries.py +120 -0
  676. package/templates/architectures/modular-monolith/blueprint.yaml +111 -0
  677. package/templates/architectures/modular-monolith/files/.importlinter +22 -0
  678. package/templates/architectures/modular-monolith/files/Directory.Packages.props +9 -0
  679. package/templates/architectures/modular-monolith/files/__solutionName.dot__.slnx +9 -0
  680. package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.dotnet.md +54 -0
  681. package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.go.md +50 -0
  682. package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.node.md +56 -0
  683. package/templates/architectures/modular-monolith/files/docs/architecture/modular-monolith.python.md +54 -0
  684. package/templates/architectures/modular-monolith/files/internal/architecture/boundary_test.go +151 -0
  685. package/templates/architectures/modular-monolith/files/internal/modules/__moduleName.lower__/__moduleName.lower__.go +56 -0
  686. package/templates/architectures/modular-monolith/files/internal/modules/__moduleName.lower__/internal/store/store.go +12 -0
  687. package/templates/architectures/modular-monolith/files/internal/shared/events/bus.go +60 -0
  688. package/templates/architectures/modular-monolith/files/scripts/check-module-boundaries.mjs +185 -0
  689. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Api/I__moduleName.pascal__Module.cs +14 -0
  690. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Api/__moduleName.pascal__Events.cs +6 -0
  691. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Api/__moduleName.pascal__ModuleRegistration.cs +18 -0
  692. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/Internal/__moduleName.pascal__Service.cs +19 -0
  693. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.Modules.__moduleName.pascal__/__solutionName.dot__.Modules.__moduleName.pascal__.csproj +16 -0
  694. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/EventBusRegistration.cs +14 -0
  695. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/IEventBus.cs +15 -0
  696. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/IIntegrationEvent.cs +8 -0
  697. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/Events/InProcessEventBus.cs +23 -0
  698. package/templates/architectures/modular-monolith/files/src/__solutionName.dot__.SharedKernel/__solutionName.dot__.SharedKernel.csproj +12 -0
  699. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__init__.py +1 -0
  700. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/__init__.py +1 -0
  701. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/api/__init__.py +15 -0
  702. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/api/contracts.py +27 -0
  703. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/api/factory.py +11 -0
  704. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/internal/__init__.py +1 -0
  705. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/modules/__moduleName.snake__/internal/service.py +20 -0
  706. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/shared/__init__.py +1 -0
  707. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/shared/events/__init__.py +3 -0
  708. package/templates/architectures/modular-monolith/files/src/__solutionName.snake__/shared/events/bus.py +43 -0
  709. package/templates/architectures/modular-monolith/files/src/modules/__moduleName.kebab__/api/contracts.ts +19 -0
  710. package/templates/architectures/modular-monolith/files/src/modules/__moduleName.kebab__/api/index.ts +18 -0
  711. package/templates/architectures/modular-monolith/files/src/modules/__moduleName.kebab__/internal/__moduleName.kebab__.service.ts +24 -0
  712. package/templates/architectures/modular-monolith/files/src/shared/events/event-bus.ts +34 -0
  713. package/templates/architectures/modular-monolith/files/src/shared/events/index.ts +2 -0
  714. package/templates/architectures/modular-monolith/files/tests/__solutionName.dot__.ArchitectureTests/ModuleBoundaryTests.cs +102 -0
  715. package/templates/architectures/modular-monolith/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +30 -0
  716. package/templates/architectures/modular-monolith/files/tests/architecture/test_module_boundaries.py +114 -0
  717. package/templates/architectures/monolith/blueprint.yaml +141 -0
  718. package/templates/architectures/monolith/files/.importlinter +14 -0
  719. package/templates/architectures/monolith/files/Directory.Packages.props +8 -0
  720. package/templates/architectures/monolith/files/__solutionName.dot__.slnx +5 -0
  721. package/templates/architectures/monolith/files/docs/architecture/monolith.dotnet.md +78 -0
  722. package/templates/architectures/monolith/files/docs/architecture/monolith.go.md +69 -0
  723. package/templates/architectures/monolith/files/docs/architecture/monolith.node.md +70 -0
  724. package/templates/architectures/monolith/files/docs/architecture/monolith.python.md +71 -0
  725. package/templates/architectures/monolith/files/internal/architecture/boundary_test.go +141 -0
  726. package/templates/architectures/monolith/files/internal/features/__featureName.lower__/__featureName.lower__.go +37 -0
  727. package/templates/architectures/monolith/files/internal/features/__featureName.lower__/internal/store/store.go +14 -0
  728. package/templates/architectures/monolith/files/internal/features/features.go +18 -0
  729. package/templates/architectures/monolith/files/internal/shared/apperr/apperr.go +17 -0
  730. package/templates/architectures/monolith/files/pyproject.toml +2 -0
  731. package/templates/architectures/monolith/files/scripts/check-monolith-boundaries.mjs +187 -0
  732. package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Features/__featureName.pascal__/Internal/__featureName.pascal__Service.cs +12 -0
  733. package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Features/__featureName.pascal__/__featureName.pascal__Feature.cs +13 -0
  734. package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Features/__featureName.pascal__/__featureName.pascal__Registration.cs +13 -0
  735. package/templates/architectures/monolith/files/src/__solutionName.dot__.Api/Kernel/AppException.cs +30 -0
  736. package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Features/__featureName.pascal__/Internal/__featureName.pascal__Service.cs +12 -0
  737. package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Features/__featureName.pascal__/__featureName.pascal__Feature.cs +13 -0
  738. package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Features/__featureName.pascal__/__featureName.pascal__Registration.cs +13 -0
  739. package/templates/architectures/monolith/files/src/__solutionName.pascal__.Api/Kernel/AppException.cs +30 -0
  740. package/templates/architectures/monolith/files/src/__solutionName.snake__/features/__featureName.snake__/__init__.py +31 -0
  741. package/templates/architectures/monolith/files/src/__solutionName.snake__/features/__featureName.snake__/service.py +22 -0
  742. package/templates/architectures/monolith/files/src/__solutionName.snake__/features/__init__.py +14 -0
  743. package/templates/architectures/monolith/files/src/__solutionName.snake__/shared/__init__.py +11 -0
  744. package/templates/architectures/monolith/files/src/__solutionName.snake__/shared/errors.py +13 -0
  745. package/templates/architectures/monolith/files/src/features/__featureName.kebab__/__featureName.kebab__.service.ts +15 -0
  746. package/templates/architectures/monolith/files/src/features/__featureName.kebab__/index.ts +20 -0
  747. package/templates/architectures/monolith/files/src/features/index.ts +11 -0
  748. package/templates/architectures/monolith/files/src/shared/errors.ts +13 -0
  749. package/templates/architectures/monolith/files/src/shared/index.ts +7 -0
  750. package/templates/architectures/monolith/files/tests/ArchitectureTests/ArchitectureTests.csproj +32 -0
  751. package/templates/architectures/monolith/files/tests/ArchitectureTests/FeatureBoundaryTests.cs +129 -0
  752. package/templates/architectures/monolith/files/tests/architecture/test_monolith_boundaries.py +136 -0
  753. package/templates/architectures/multi-agent/blueprint.yaml +97 -0
  754. package/templates/architectures/multi-agent/files/.importlinter +36 -0
  755. package/templates/architectures/multi-agent/files/docs/architecture/multi-agent.node.md +110 -0
  756. package/templates/architectures/multi-agent/files/docs/architecture/multi-agent.python.md +94 -0
  757. package/templates/architectures/multi-agent/files/docs/architecture/multi-agent.typescript.md +102 -0
  758. package/templates/architectures/multi-agent/files/pyproject.toml +2 -0
  759. package/templates/architectures/multi-agent/files/scripts/check-agent-boundaries.mjs +207 -0
  760. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/__init__.py +5 -0
  761. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/config.py +52 -0
  762. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/contracts.py +62 -0
  763. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/__init__.py +9 -0
  764. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/budget.py +45 -0
  765. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/fanout.py +63 -0
  766. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/orchestrator/lead.py +92 -0
  767. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/runtime/__init__.py +5 -0
  768. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/runtime/runner.py +48 -0
  769. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__init__.py +27 -0
  770. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__workerName.snake__/__init__.py +9 -0
  771. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__workerName.snake__/prompt.py +31 -0
  772. package/templates/architectures/multi-agent/files/src/__solutionName.snake__/agents/workers/__workerName.snake__/worker.py +28 -0
  773. package/templates/architectures/multi-agent/files/src/agents/config.ts +46 -0
  774. package/templates/architectures/multi-agent/files/src/agents/contracts/index.ts +4 -0
  775. package/templates/architectures/multi-agent/files/src/agents/contracts/result.ts +50 -0
  776. package/templates/architectures/multi-agent/files/src/agents/contracts/task.ts +19 -0
  777. package/templates/architectures/multi-agent/files/src/agents/orchestrator/budget.ts +51 -0
  778. package/templates/architectures/multi-agent/files/src/agents/orchestrator/fanout.ts +67 -0
  779. package/templates/architectures/multi-agent/files/src/agents/orchestrator/index.ts +4 -0
  780. package/templates/architectures/multi-agent/files/src/agents/orchestrator/lead.ts +77 -0
  781. package/templates/architectures/multi-agent/files/src/agents/runtime/index.ts +3 -0
  782. package/templates/architectures/multi-agent/files/src/agents/runtime/runner.ts +36 -0
  783. package/templates/architectures/multi-agent/files/src/agents/workers/README.md +13 -0
  784. package/templates/architectures/multi-agent/files/src/agents/workers/__workerName.kebab__/prompt.ts +22 -0
  785. package/templates/architectures/multi-agent/files/src/agents/workers/__workerName.kebab__/worker.ts +25 -0
  786. package/templates/architectures/multi-agent/files/src/agents/workers/index.ts +15 -0
  787. package/templates/architectures/multi-agent/files/tests/architecture/test_agent_boundaries.py +184 -0
  788. package/templates/architectures/mvc-mvvm/blueprint.yaml +156 -0
  789. package/templates/architectures/mvc-mvvm/files/.importlinter +25 -0
  790. package/templates/architectures/mvc-mvvm/files/Directory.Packages.props +8 -0
  791. package/templates/architectures/mvc-mvvm/files/__solutionName.dot__.slnx +8 -0
  792. package/templates/architectures/mvc-mvvm/files/docs/architecture/mvc-mvvm.dotnet.md +84 -0
  793. package/templates/architectures/mvc-mvvm/files/docs/architecture/mvc-mvvm.python.md +69 -0
  794. package/templates/architectures/mvc-mvvm/files/docs/architecture/mvc-mvvm.typescript.md +85 -0
  795. package/templates/architectures/mvc-mvvm/files/scripts/check-mvvm-boundaries.mjs +234 -0
  796. package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/Models/__firstScreen.pascal__.cs +8 -0
  797. package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/ViewModels/RelayCommand.cs +18 -0
  798. package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/ViewModels/ViewModelBase.cs +27 -0
  799. package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/ViewModels/__firstScreen.pascal__ViewModel.cs +55 -0
  800. package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/Views/README.md +12 -0
  801. package/templates/architectures/mvc-mvvm/files/src/__solutionName.dot__.Presentation/__solutionName.dot__.Presentation.csproj +11 -0
  802. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/controllers/__firstScreen.snake___controller.py +17 -0
  803. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/controllers/__init__.py +5 -0
  804. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/models/__firstScreen.snake__.py +13 -0
  805. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/models/__init__.py +5 -0
  806. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/models/repository.py +17 -0
  807. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/views/__firstScreen.snake___view.py +17 -0
  808. package/templates/architectures/mvc-mvvm/files/src/__solutionName.snake__/views/__init__.py +6 -0
  809. package/templates/architectures/mvc-mvvm/files/src/models/index.ts +4 -0
  810. package/templates/architectures/mvc-mvvm/files/src/viewmodels/index.ts +12 -0
  811. package/templates/architectures/mvc-mvvm/files/src/views/index.ts +10 -0
  812. package/templates/architectures/mvc-mvvm/files/tests/__solutionName.dot__.ArchitectureTests/PresentationBoundaryTests.cs +124 -0
  813. package/templates/architectures/mvc-mvvm/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +28 -0
  814. package/templates/architectures/mvc-mvvm/files/tests/test_presentation_boundaries.py +33 -0
  815. package/templates/architectures/onion/blueprint.yaml +146 -0
  816. package/templates/architectures/onion/files/.dependency-cruiser.cjs +50 -0
  817. package/templates/architectures/onion/files/.importlinter +33 -0
  818. package/templates/architectures/onion/files/Directory.Packages.props +8 -0
  819. package/templates/architectures/onion/files/__solutionName.dot__.slnx +11 -0
  820. package/templates/architectures/onion/files/docs/architecture/onion-dotnet.md +39 -0
  821. package/templates/architectures/onion/files/docs/architecture/onion-go.md +33 -0
  822. package/templates/architectures/onion/files/docs/architecture/onion-python.md +35 -0
  823. package/templates/architectures/onion/files/docs/architecture/onion-typescript.md +34 -0
  824. package/templates/architectures/onion/files/internal/applicationservices/doc.go +4 -0
  825. package/templates/architectures/onion/files/internal/arch/rings.go +11 -0
  826. package/templates/architectures/onion/files/internal/arch/rings_test.go +112 -0
  827. package/templates/architectures/onion/files/internal/domain/doc.go +4 -0
  828. package/templates/architectures/onion/files/internal/domainservices/doc.go +5 -0
  829. package/templates/architectures/onion/files/internal/infrastructure/doc.go +5 -0
  830. package/templates/architectures/onion/files/pyproject.toml +2 -0
  831. package/templates/architectures/onion/files/src/__solutionName.dot__.ApplicationServices/ApplicationServicesAssemblyMarker.cs +4 -0
  832. package/templates/architectures/onion/files/src/__solutionName.dot__.ApplicationServices/__solutionName.dot__.ApplicationServices.csproj +13 -0
  833. package/templates/architectures/onion/files/src/__solutionName.dot__.Domain/DomainAssemblyMarker.cs +4 -0
  834. package/templates/architectures/onion/files/src/__solutionName.dot__.Domain/__solutionName.dot__.Domain.csproj +11 -0
  835. package/templates/architectures/onion/files/src/__solutionName.dot__.DomainServices/DomainServicesAssemblyMarker.cs +4 -0
  836. package/templates/architectures/onion/files/src/__solutionName.dot__.DomainServices/Repositories/.gitkeep +2 -0
  837. package/templates/architectures/onion/files/src/__solutionName.dot__.DomainServices/__solutionName.dot__.DomainServices.csproj +14 -0
  838. package/templates/architectures/onion/files/src/__solutionName.dot__.Infrastructure/InfrastructureAssemblyMarker.cs +4 -0
  839. package/templates/architectures/onion/files/src/__solutionName.dot__.Infrastructure/Repositories/.gitkeep +2 -0
  840. package/templates/architectures/onion/files/src/__solutionName.dot__.Infrastructure/__solutionName.dot__.Infrastructure.csproj +14 -0
  841. package/templates/architectures/onion/files/src/__solutionName.snake__/application_services/__init__.py +4 -0
  842. package/templates/architectures/onion/files/src/__solutionName.snake__/domain/__init__.py +5 -0
  843. package/templates/architectures/onion/files/src/__solutionName.snake__/domain_services/__init__.py +6 -0
  844. package/templates/architectures/onion/files/src/__solutionName.snake__/infrastructure/__init__.py +5 -0
  845. package/templates/architectures/onion/files/src/application-services/index.ts +3 -0
  846. package/templates/architectures/onion/files/src/domain/index.ts +3 -0
  847. package/templates/architectures/onion/files/src/domain-services/index.ts +3 -0
  848. package/templates/architectures/onion/files/src/infrastructure/index.ts +3 -0
  849. package/templates/architectures/onion/files/tests/__solutionName.dot__.ArchitectureTests/RingDependencyTests.cs +104 -0
  850. package/templates/architectures/onion/files/tests/__solutionName.dot__.ArchitectureTests/__solutionName.dot__.ArchitectureTests.csproj +31 -0
  851. package/templates/architectures/pipes-and-filters/blueprint.yaml +104 -0
  852. package/templates/architectures/pipes-and-filters/files/.importlinter +25 -0
  853. package/templates/architectures/pipes-and-filters/files/docs/architecture/pipes-and-filters.go.md +72 -0
  854. package/templates/architectures/pipes-and-filters/files/docs/architecture/pipes-and-filters.node.md +73 -0
  855. package/templates/architectures/pipes-and-filters/files/docs/architecture/pipes-and-filters.python.md +76 -0
  856. package/templates/architectures/pipes-and-filters/files/internal/pipeline/boundary_test.go +107 -0
  857. package/templates/architectures/pipes-and-filters/files/internal/pipeline/config.go +53 -0
  858. package/templates/architectures/pipes-and-filters/files/internal/pipeline/contract/contract.go +35 -0
  859. package/templates/architectures/pipes-and-filters/files/internal/pipeline/pipeline.go +39 -0
  860. package/templates/architectures/pipes-and-filters/files/internal/pipeline/stages/__firstStage.lower__/__firstStage.lower__.go +42 -0
  861. package/templates/architectures/pipes-and-filters/files/internal/pipeline/stages/__firstStage.lower__/__firstStage.lower___test.go +59 -0
  862. package/templates/architectures/pipes-and-filters/files/package.json +8 -0
  863. package/templates/architectures/pipes-and-filters/files/pyproject.toml +2 -0
  864. package/templates/architectures/pipes-and-filters/files/scripts/check-stage-boundaries.mjs +172 -0
  865. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/__init__.py +16 -0
  866. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/config.py +26 -0
  867. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/contract.py +34 -0
  868. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/pipeline.py +33 -0
  869. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/stages/__firstStage.snake__/__init__.py +3 -0
  870. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/stages/__firstStage.snake__/stage.py +31 -0
  871. package/templates/architectures/pipes-and-filters/files/src/__solutionName.snake__/pipeline/stages/__init__.py +1 -0
  872. package/templates/architectures/pipes-and-filters/files/src/pipeline/config.ts +24 -0
  873. package/templates/architectures/pipes-and-filters/files/src/pipeline/contract.ts +41 -0
  874. package/templates/architectures/pipes-and-filters/files/src/pipeline/pipeline.ts +37 -0
  875. package/templates/architectures/pipes-and-filters/files/src/pipeline/stages/__firstStage.kebab__/__firstStage.kebab__.test.ts +32 -0
  876. package/templates/architectures/pipes-and-filters/files/src/pipeline/stages/__firstStage.kebab__/index.ts +29 -0
  877. package/templates/architectures/pipes-and-filters/files/tests/architecture/test_stage_boundaries.py +127 -0
  878. package/templates/architectures/pipes-and-filters/files/tests/pipeline/test___firstStage.snake__.py +32 -0
  879. package/templates/architectures/rag-hybrid/blueprint.yaml +121 -0
  880. package/templates/architectures/rag-hybrid/files/.importlinter +42 -0
  881. package/templates/architectures/rag-hybrid/files/docs/architecture/rag-hybrid.node.md +159 -0
  882. package/templates/architectures/rag-hybrid/files/docs/architecture/rag-hybrid.python.md +157 -0
  883. package/templates/architectures/rag-hybrid/files/evals/corpus/chunking.md +20 -0
  884. package/templates/architectures/rag-hybrid/files/evals/corpus/fusion.md +17 -0
  885. package/templates/architectures/rag-hybrid/files/evals/corpus/hybrid-retrieval.md +21 -0
  886. package/templates/architectures/rag-hybrid/files/evals/corpus/reranking.md +17 -0
  887. package/templates/architectures/rag-hybrid/files/evals/golden/queries.jsonl +5 -0
  888. package/templates/architectures/rag-hybrid/files/package.json +9 -0
  889. package/templates/architectures/rag-hybrid/files/pyproject.toml +2 -0
  890. package/templates/architectures/rag-hybrid/files/scripts/check-retrieval-seam.mjs +156 -0
  891. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/__init__.py +23 -0
  892. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/chunk/__init__.py +57 -0
  893. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/config.py +101 -0
  894. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/contracts.py +58 -0
  895. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/embed/__init__.py +90 -0
  896. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/__init__.py +11 -0
  897. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/cli.py +47 -0
  898. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/harness.py +115 -0
  899. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/evaluation/metrics.py +51 -0
  900. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/generate/__init__.py +85 -0
  901. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/indexing.py +23 -0
  902. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/ingest/__init__.py +45 -0
  903. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/pipeline.py +27 -0
  904. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/rerank/__init__.py +85 -0
  905. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/__init__.py +37 -0
  906. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/dense.py +25 -0
  907. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/fusion.py +30 -0
  908. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/retrieve/keyword.py +45 -0
  909. package/templates/architectures/rag-hybrid/files/src/__solutionName.snake__/rag/store/__init__.py +87 -0
  910. package/templates/architectures/rag-hybrid/files/src/rag/chunk/index.ts +56 -0
  911. package/templates/architectures/rag-hybrid/files/src/rag/config.ts +96 -0
  912. package/templates/architectures/rag-hybrid/files/src/rag/contracts.ts +50 -0
  913. package/templates/architectures/rag-hybrid/files/src/rag/embed/index.ts +98 -0
  914. package/templates/architectures/rag-hybrid/files/src/rag/evaluation/cli.ts +47 -0
  915. package/templates/architectures/rag-hybrid/files/src/rag/evaluation/harness.ts +101 -0
  916. package/templates/architectures/rag-hybrid/files/src/rag/evaluation/metrics.ts +40 -0
  917. package/templates/architectures/rag-hybrid/files/src/rag/generate/index.ts +86 -0
  918. package/templates/architectures/rag-hybrid/files/src/rag/indexing.ts +21 -0
  919. package/templates/architectures/rag-hybrid/files/src/rag/ingest/index.ts +58 -0
  920. package/templates/architectures/rag-hybrid/files/src/rag/pipeline.ts +32 -0
  921. package/templates/architectures/rag-hybrid/files/src/rag/rerank/index.ts +90 -0
  922. package/templates/architectures/rag-hybrid/files/src/rag/retrieve/dense.ts +26 -0
  923. package/templates/architectures/rag-hybrid/files/src/rag/retrieve/fusion.ts +32 -0
  924. package/templates/architectures/rag-hybrid/files/src/rag/retrieve/index.ts +38 -0
  925. package/templates/architectures/rag-hybrid/files/src/rag/retrieve/keyword.ts +42 -0
  926. package/templates/architectures/rag-hybrid/files/src/rag/store/index.ts +108 -0
  927. package/templates/architectures/rag-hybrid/files/tests/architecture/test_retrieval_seam.py +108 -0
  928. package/templates/architectures/serverless/blueprint.yaml +139 -0
  929. package/templates/architectures/serverless/files/.gitignore.serverless +3 -0
  930. package/templates/architectures/serverless/files/.importlinter +18 -0
  931. package/templates/architectures/serverless/files/cdk.json +7 -0
  932. package/templates/architectures/serverless/files/docs/architecture/serverless.node.md +97 -0
  933. package/templates/architectures/serverless/files/docs/architecture/serverless.python.md +108 -0
  934. package/templates/architectures/serverless/files/events/__firstHandler.kebab__.json +21 -0
  935. package/templates/architectures/serverless/files/infra/app.ts +15 -0
  936. package/templates/architectures/serverless/files/infra/config.ts +22 -0
  937. package/templates/architectures/serverless/files/infra/stack.ts +45 -0
  938. package/templates/architectures/serverless/files/package.json +9 -0
  939. package/templates/architectures/serverless/files/pyproject.toml +2 -0
  940. package/templates/architectures/serverless/files/scripts/check-handler-boundaries.mjs +144 -0
  941. package/templates/architectures/serverless/files/scripts/invoke-local.ts +57 -0
  942. package/templates/architectures/serverless/files/scripts/invoke_local.py +61 -0
  943. package/templates/architectures/serverless/files/src/__solutionName.snake__/functions/__firstHandler.snake__/__init__.py +1 -0
  944. package/templates/architectures/serverless/files/src/__solutionName.snake__/functions/__firstHandler.snake__/handler.py +27 -0
  945. package/templates/architectures/serverless/files/src/__solutionName.snake__/functions/__init__.py +4 -0
  946. package/templates/architectures/serverless/files/src/__solutionName.snake__/layers/__init__.py +5 -0
  947. package/templates/architectures/serverless/files/src/__solutionName.snake__/layers/config.py +45 -0
  948. package/templates/architectures/serverless/files/src/__solutionName.snake__/layers/observability.py +35 -0
  949. package/templates/architectures/serverless/files/src/functions/__firstHandler.kebab__/handler.ts +26 -0
  950. package/templates/architectures/serverless/files/src/layers/config/index.ts +31 -0
  951. package/templates/architectures/serverless/files/src/layers/observability/index.ts +38 -0
  952. package/templates/architectures/serverless/files/src/requirements.txt +3 -0
  953. package/templates/architectures/serverless/files/template.yaml +48 -0
  954. package/templates/architectures/serverless/files/tests/architecture/test_handler_boundaries.py +32 -0
  955. package/templates/architectures/vertical-slice/blueprint.yaml +124 -0
  956. package/templates/architectures/vertical-slice/files/.importlinter +18 -0
  957. package/templates/architectures/vertical-slice/files/Directory.Packages.props +8 -0
  958. package/templates/architectures/vertical-slice/files/__solutionName.dot__.slnx +5 -0
  959. package/templates/architectures/vertical-slice/files/docs/architecture/vertical-slice.md +75 -0
  960. package/templates/architectures/vertical-slice/files/internal/features/__firstSlice.lower__/__firstSlice.lower__.go +2 -0
  961. package/templates/architectures/vertical-slice/files/internal/features/boundary_test.go +92 -0
  962. package/templates/architectures/vertical-slice/files/internal/features/doc.go +3 -0
  963. package/templates/architectures/vertical-slice/files/internal/shared/doc.go +2 -0
  964. package/templates/architectures/vertical-slice/files/pyproject.toml +2 -0
  965. package/templates/architectures/vertical-slice/files/scripts/check-slice-boundaries.mjs +118 -0
  966. package/templates/architectures/vertical-slice/files/src/__solutionName.dot__.Api/Common/.gitkeep +0 -0
  967. package/templates/architectures/vertical-slice/files/src/__solutionName.dot__.Api/Features/.gitkeep +0 -0
  968. package/templates/architectures/vertical-slice/files/src/__solutionName.dot__.Api/Features/__firstSlice.pascal__/Slice.cs +15 -0
  969. package/templates/architectures/vertical-slice/files/src/__solutionName.pascal__.Api/Common/.gitkeep +0 -0
  970. package/templates/architectures/vertical-slice/files/src/__solutionName.pascal__.Api/Features/.gitkeep +0 -0
  971. package/templates/architectures/vertical-slice/files/src/__solutionName.pascal__.Api/Features/__firstSlice.pascal__/Slice.cs +15 -0
  972. package/templates/architectures/vertical-slice/files/src/__solutionName.snake__/features/__firstSlice.snake__/__init__.py +1 -0
  973. package/templates/architectures/vertical-slice/files/src/__solutionName.snake__/features/__init__.py +1 -0
  974. package/templates/architectures/vertical-slice/files/src/__solutionName.snake__/shared/__init__.py +1 -0
  975. package/templates/architectures/vertical-slice/files/src/features/__firstSlice.kebab__/index.ts +3 -0
  976. package/templates/architectures/vertical-slice/files/src/shared/.gitkeep +0 -0
  977. package/templates/architectures/vertical-slice/files/tests/ArchitectureTests/ArchitectureTests.csproj +33 -0
  978. package/templates/architectures/vertical-slice/files/tests/ArchitectureTests/SliceBoundaryTests.cs +110 -0
  979. package/templates/architectures/vertical-slice/files/tests/test_architecture.py +32 -0
  980. package/templates/bases/dotnet-aspire/blueprint.yaml +120 -0
  981. package/templates/bases/dotnet-aspire/files/Directory.Build.props +11 -0
  982. package/templates/bases/dotnet-aspire/files/Directory.Packages.props +17 -0
  983. package/templates/bases/dotnet-aspire/files/README.md +60 -0
  984. package/templates/bases/dotnet-aspire/files/__solutionName.dot__.slnx +7 -0
  985. package/templates/bases/dotnet-aspire/files/aspire.config.json +5 -0
  986. package/templates/bases/dotnet-aspire/files/gitignore +44 -0
  987. package/templates/bases/dotnet-aspire/files/global.json +6 -0
  988. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/Configuration/ApiOptions.cs +20 -0
  989. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/Program.cs +37 -0
  990. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/Properties/launchSettings.json +23 -0
  991. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/__solutionName.pascal__.Api.csproj +11 -0
  992. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/appsettings.Development.json +8 -0
  993. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.Api/appsettings.json +14 -0
  994. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/AppHost.cs +8 -0
  995. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/Properties/launchSettings.json +29 -0
  996. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/__solutionName.pascal__.AppHost.csproj +11 -0
  997. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/appsettings.Development.json +8 -0
  998. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.AppHost/appsettings.json +9 -0
  999. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.ServiceDefaults/Extensions.cs +101 -0
  1000. package/templates/bases/dotnet-aspire/files/src/__solutionName.pascal__.ServiceDefaults/__solutionName.pascal__.ServiceDefaults.csproj +19 -0
  1001. package/templates/bases/dotnet-webapi/blueprint.yaml +112 -0
  1002. package/templates/bases/dotnet-webapi/files/.editorconfig +78 -0
  1003. package/templates/bases/dotnet-webapi/files/Directory.Build.props +28 -0
  1004. package/templates/bases/dotnet-webapi/files/Directory.Packages.props +18 -0
  1005. package/templates/bases/dotnet-webapi/files/README.md +71 -0
  1006. package/templates/bases/dotnet-webapi/files/__solutionName.dot__.slnx +11 -0
  1007. package/templates/bases/dotnet-webapi/files/gitignore +49 -0
  1008. package/templates/bases/dotnet-webapi/files/global.json +7 -0
  1009. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Configuration/ApiOptions.cs +23 -0
  1010. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Configuration/ServiceCollectionExtensions.cs +35 -0
  1011. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Endpoints/GreetingEndpoints.cs +24 -0
  1012. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Endpoints/HealthEndpoints.cs +11 -0
  1013. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Program.cs +23 -0
  1014. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/Properties/launchSettings.json +21 -0
  1015. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/__solutionName.dot__.Api.csproj +19 -0
  1016. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/appsettings.Development.json +8 -0
  1017. package/templates/bases/dotnet-webapi/files/src/__solutionName.dot__.Api/appsettings.json +9 -0
  1018. package/templates/bases/fastapi-service/blueprint.yaml +87 -0
  1019. package/templates/bases/fastapi-service/files/.env.example +10 -0
  1020. package/templates/bases/fastapi-service/files/README.md +42 -0
  1021. package/templates/bases/fastapi-service/files/gitignore +27 -0
  1022. package/templates/bases/fastapi-service/files/pyproject.toml +35 -0
  1023. package/templates/bases/fastapi-service/files/src/__solutionName.snake__/__init__.py +1 -0
  1024. package/templates/bases/fastapi-service/files/src/__solutionName.snake__/api/__init__.py +1 -0
  1025. package/templates/bases/fastapi-service/files/src/__solutionName.snake__/api/routes.py +38 -0
  1026. package/templates/bases/fastapi-service/files/src/__solutionName.snake__/main.py +34 -0
  1027. package/templates/bases/fastapi-service/files/src/__solutionName.snake__/settings.py +30 -0
  1028. package/templates/bases/go-api/blueprint.yaml +58 -0
  1029. package/templates/bases/go-api/files/.env.example +16 -0
  1030. package/templates/bases/go-api/files/README.md +76 -0
  1031. package/templates/bases/go-api/files/cmd/__solutionName.kebab__/main.go +65 -0
  1032. package/templates/bases/go-api/files/gitignore +27 -0
  1033. package/templates/bases/go-api/files/go.mod +5 -0
  1034. package/templates/bases/go-api/files/internal/config/config.go +127 -0
  1035. package/templates/bases/go-api/files/internal/httpapi/greeting.go +25 -0
  1036. package/templates/bases/go-api/files/internal/httpapi/health.go +25 -0
  1037. package/templates/bases/go-api/files/internal/httpapi/respond.go +25 -0
  1038. package/templates/bases/go-api/files/internal/httpapi/router.go +63 -0
  1039. package/templates/bases/hono-api/blueprint.yaml +94 -0
  1040. package/templates/bases/hono-api/files/.env.example +7 -0
  1041. package/templates/bases/hono-api/files/README.md +77 -0
  1042. package/templates/bases/hono-api/files/biome.json +24 -0
  1043. package/templates/bases/hono-api/files/gitignore +16 -0
  1044. package/templates/bases/hono-api/files/package.json +29 -0
  1045. package/templates/bases/hono-api/files/src/app.ts +27 -0
  1046. package/templates/bases/hono-api/files/src/config.ts +27 -0
  1047. package/templates/bases/hono-api/files/src/index.ts +17 -0
  1048. package/templates/bases/hono-api/files/src/routes/greetings.ts +17 -0
  1049. package/templates/bases/hono-api/files/src/routes/health.ts +13 -0
  1050. package/templates/bases/hono-api/files/tsconfig.json +18 -0
  1051. package/templates/bases/nestjs-api/blueprint.yaml +94 -0
  1052. package/templates/bases/nestjs-api/files/.env.example +8 -0
  1053. package/templates/bases/nestjs-api/files/.prettierrc +5 -0
  1054. package/templates/bases/nestjs-api/files/README.md +69 -0
  1055. package/templates/bases/nestjs-api/files/eslint.config.mjs +23 -0
  1056. package/templates/bases/nestjs-api/files/gitignore +11 -0
  1057. package/templates/bases/nestjs-api/files/nest-cli.json +9 -0
  1058. package/templates/bases/nestjs-api/files/package.json +41 -0
  1059. package/templates/bases/nestjs-api/files/src/app.module.ts +16 -0
  1060. package/templates/bases/nestjs-api/files/src/config/app.config.ts +30 -0
  1061. package/templates/bases/nestjs-api/files/src/config/env.validation.ts +15 -0
  1062. package/templates/bases/nestjs-api/files/src/health/health.controller.ts +19 -0
  1063. package/templates/bases/nestjs-api/files/src/health/health.module.ts +6 -0
  1064. package/templates/bases/nestjs-api/files/src/main.ts +25 -0
  1065. package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/__solutionName.kebab__.controller.ts +14 -0
  1066. package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/__solutionName.kebab__.module.ts +11 -0
  1067. package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/__solutionName.kebab__.service.ts +12 -0
  1068. package/templates/bases/nestjs-api/files/src/modules/__solutionName.kebab__/dto/greet-query.dto.ts +10 -0
  1069. package/templates/bases/nestjs-api/files/tsconfig.build.json +4 -0
  1070. package/templates/bases/nestjs-api/files/tsconfig.json +26 -0
  1071. package/templates/bases/nextjs-app/blueprint.yaml +80 -0
  1072. package/templates/bases/nextjs-app/files/.env.example +10 -0
  1073. package/templates/bases/nextjs-app/files/README.md +48 -0
  1074. package/templates/bases/nextjs-app/files/eslint.config.mjs +12 -0
  1075. package/templates/bases/nextjs-app/files/gitignore +32 -0
  1076. package/templates/bases/nextjs-app/files/next.config.ts +8 -0
  1077. package/templates/bases/nextjs-app/files/package.json +30 -0
  1078. package/templates/bases/nextjs-app/files/postcss.config.mjs +7 -0
  1079. package/templates/bases/nextjs-app/files/src/app/api/health/route.ts +21 -0
  1080. package/templates/bases/nextjs-app/files/src/app/globals.css +45 -0
  1081. package/templates/bases/nextjs-app/files/src/app/layout.tsx +28 -0
  1082. package/templates/bases/nextjs-app/files/src/app/page.tsx +39 -0
  1083. package/templates/bases/nextjs-app/files/src/config/env.ts +64 -0
  1084. package/templates/bases/nextjs-app/files/tsconfig.json +35 -0
  1085. package/templates/bases/python-ai-agent/blueprint.yaml +84 -0
  1086. package/templates/bases/python-ai-agent/files/.env.example +29 -0
  1087. package/templates/bases/python-ai-agent/files/README.md +80 -0
  1088. package/templates/bases/python-ai-agent/files/gitignore +21 -0
  1089. package/templates/bases/python-ai-agent/files/pyproject.toml +34 -0
  1090. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/__init__.py +1 -0
  1091. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/api/__init__.py +1 -0
  1092. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/api/routes.py +69 -0
  1093. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/config.py +70 -0
  1094. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/__init__.py +1 -0
  1095. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/anthropic_provider.py +69 -0
  1096. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/openai_provider.py +75 -0
  1097. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/provider.py +45 -0
  1098. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/llm/registry.py +35 -0
  1099. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/main.py +33 -0
  1100. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/observability/__init__.py +1 -0
  1101. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/observability/evals.py +28 -0
  1102. package/templates/bases/python-ai-agent/files/src/__solutionName.snake__/observability/tracing.py +49 -0
  1103. package/templates/bases/react-vite-spa/blueprint.yaml +92 -0
  1104. package/templates/bases/react-vite-spa/files/.env.example +13 -0
  1105. package/templates/bases/react-vite-spa/files/README.md +49 -0
  1106. package/templates/bases/react-vite-spa/files/eslint.config.mjs +26 -0
  1107. package/templates/bases/react-vite-spa/files/gitignore +25 -0
  1108. package/templates/bases/react-vite-spa/files/index.html +13 -0
  1109. package/templates/bases/react-vite-spa/files/package.json +37 -0
  1110. package/templates/bases/react-vite-spa/files/src/api/client.ts +28 -0
  1111. package/templates/bases/react-vite-spa/files/src/api/health.ts +12 -0
  1112. package/templates/bases/react-vite-spa/files/src/app/query-client.ts +12 -0
  1113. package/templates/bases/react-vite-spa/files/src/app/root-layout.tsx +24 -0
  1114. package/templates/bases/react-vite-spa/files/src/app/router.tsx +44 -0
  1115. package/templates/bases/react-vite-spa/files/src/config/env.ts +37 -0
  1116. package/templates/bases/react-vite-spa/files/src/main.tsx +18 -0
  1117. package/templates/bases/react-vite-spa/files/src/pages/home-page.tsx +31 -0
  1118. package/templates/bases/react-vite-spa/files/src/pages/not-found-page.tsx +13 -0
  1119. package/templates/bases/react-vite-spa/files/src/pages/status-page.tsx +37 -0
  1120. package/templates/bases/react-vite-spa/files/src/styles/global.css +169 -0
  1121. package/templates/bases/react-vite-spa/files/src/vite-env.d.ts +15 -0
  1122. package/templates/bases/react-vite-spa/files/tsconfig.app.json +29 -0
  1123. package/templates/bases/react-vite-spa/files/tsconfig.json +4 -0
  1124. package/templates/bases/react-vite-spa/files/tsconfig.node.json +24 -0
  1125. package/templates/bases/react-vite-spa/files/vite.config.ts +25 -0
  1126. package/templates/bases/turborepo-monorepo/blueprint.yaml +84 -0
  1127. package/templates/bases/turborepo-monorepo/files/.env.example +7 -0
  1128. package/templates/bases/turborepo-monorepo/files/.prettierignore +9 -0
  1129. package/templates/bases/turborepo-monorepo/files/.prettierrc.json +5 -0
  1130. package/templates/bases/turborepo-monorepo/files/README.md +55 -0
  1131. package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/eslint.config.js +3 -0
  1132. package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/package.json +25 -0
  1133. package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/src/config.ts +46 -0
  1134. package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/src/index.ts +20 -0
  1135. package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/src/router.ts +24 -0
  1136. package/templates/bases/turborepo-monorepo/files/apps/__appName.kebab__/tsconfig.json +8 -0
  1137. package/templates/bases/turborepo-monorepo/files/gitignore +17 -0
  1138. package/templates/bases/turborepo-monorepo/files/package.json +25 -0
  1139. package/templates/bases/turborepo-monorepo/files/packages/eslint-config/index.js +21 -0
  1140. package/templates/bases/turborepo-monorepo/files/packages/eslint-config/package.json +21 -0
  1141. package/templates/bases/turborepo-monorepo/files/packages/shared/eslint.config.js +3 -0
  1142. package/templates/bases/turborepo-monorepo/files/packages/shared/package.json +26 -0
  1143. package/templates/bases/turborepo-monorepo/files/packages/shared/src/health.ts +23 -0
  1144. package/templates/bases/turborepo-monorepo/files/packages/shared/src/index.ts +2 -0
  1145. package/templates/bases/turborepo-monorepo/files/packages/shared/tsconfig.json +10 -0
  1146. package/templates/bases/turborepo-monorepo/files/packages/tsconfig/base.json +19 -0
  1147. package/templates/bases/turborepo-monorepo/files/packages/tsconfig/node.json +7 -0
  1148. package/templates/bases/turborepo-monorepo/files/packages/tsconfig/package.json +9 -0
  1149. package/templates/bases/turborepo-monorepo/files/pnpm-workspace.yaml +7 -0
  1150. package/templates/bases/turborepo-monorepo/files/turbo.json +22 -0
  1151. package/templates/layers/api-versioning/blueprint.yaml +264 -0
  1152. package/templates/layers/api-versioning/files/.env.apiversion.example +53 -0
  1153. package/templates/layers/api-versioning/files/__apiVersionContractDir__/README.md +48 -0
  1154. package/templates/layers/api-versioning/files/__solutionName.dot__.slnx +5 -0
  1155. package/templates/layers/api-versioning/files/docs/api-versioning.md +100 -0
  1156. package/templates/layers/api-versioning/files/internal/apiversion/apiversion_test.go +202 -0
  1157. package/templates/layers/api-versioning/files/internal/apiversion/config.go +242 -0
  1158. package/templates/layers/api-versioning/files/internal/apiversion/contract.go +280 -0
  1159. package/templates/layers/api-versioning/files/internal/apiversion/headers.go +55 -0
  1160. package/templates/layers/api-versioning/files/internal/apiversion/middleware.go +53 -0
  1161. package/templates/layers/api-versioning/files/internal/apiversion/negotiate.go +107 -0
  1162. package/templates/layers/api-versioning/files/internal/apiversion/snapshot.go +72 -0
  1163. package/templates/layers/api-versioning/files/internal/apiversion/versions.go +72 -0
  1164. package/templates/layers/api-versioning/files/package.json +5 -0
  1165. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionHeaders.cs +62 -0
  1166. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionNegotiator.cs +129 -0
  1167. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionOptions.cs +58 -0
  1168. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersionPolicy.cs +99 -0
  1169. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersioningMiddleware.cs +58 -0
  1170. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ApiVersioningServiceCollectionExtensions.cs +18 -0
  1171. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ContractDiff.cs +152 -0
  1172. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ContractShape.cs +142 -0
  1173. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/ContractStore.cs +64 -0
  1174. package/templates/layers/api-versioning/files/src/__solutionName.dot__.ApiVersioning/__solutionName.dot__.ApiVersioning.csproj +17 -0
  1175. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/__init__.py +67 -0
  1176. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/contract.py +191 -0
  1177. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/errors.py +28 -0
  1178. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/headers.py +56 -0
  1179. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/middleware.py +76 -0
  1180. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/negotiate.py +94 -0
  1181. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/settings.py +189 -0
  1182. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/snapshot.py +74 -0
  1183. package/templates/layers/api-versioning/files/src/__solutionName.snake__/apiversion/versions.py +70 -0
  1184. package/templates/layers/api-versioning/files/src/apiversion/client/pinned-fetch.ts +89 -0
  1185. package/templates/layers/api-versioning/files/src/apiversion/contract/diff.ts +153 -0
  1186. package/templates/layers/api-versioning/files/src/apiversion/contract/node/snapshot.ts +76 -0
  1187. package/templates/layers/api-versioning/files/src/apiversion/contract/shape.ts +94 -0
  1188. package/templates/layers/api-versioning/files/src/apiversion/errors.ts +36 -0
  1189. package/templates/layers/api-versioning/files/src/apiversion/headers.ts +52 -0
  1190. package/templates/layers/api-versioning/files/src/apiversion/index.ts +23 -0
  1191. package/templates/layers/api-versioning/files/src/apiversion/middleware.ts +59 -0
  1192. package/templates/layers/api-versioning/files/src/apiversion/negotiate.ts +113 -0
  1193. package/templates/layers/api-versioning/files/src/apiversion/node/http.ts +50 -0
  1194. package/templates/layers/api-versioning/files/src/apiversion/settings.ts +214 -0
  1195. package/templates/layers/api-versioning/files/src/apiversion/tests/apiversion.spec.ts +162 -0
  1196. package/templates/layers/api-versioning/files/src/apiversion/tests/apiversion.test.ts +167 -0
  1197. package/templates/layers/api-versioning/files/src/apiversion/versions.ts +66 -0
  1198. package/templates/layers/api-versioning/files/tests/test_api_versioning.py +162 -0
  1199. package/templates/layers/audit-log/blueprint.yaml +186 -0
  1200. package/templates/layers/audit-log/files/.env.audit.example +41 -0
  1201. package/templates/layers/audit-log/files/__solutionName.dot__.slnx +5 -0
  1202. package/templates/layers/audit-log/files/docs/audit-log.md +195 -0
  1203. package/templates/layers/audit-log/files/internal/audit/audit_test.go +141 -0
  1204. package/templates/layers/audit-log/files/internal/audit/chain.go +91 -0
  1205. package/templates/layers/audit-log/files/internal/audit/config.go +143 -0
  1206. package/templates/layers/audit-log/files/internal/audit/event.go +87 -0
  1207. package/templates/layers/audit-log/files/internal/audit/recorder.go +133 -0
  1208. package/templates/layers/audit-log/files/internal/audit/redact.go +83 -0
  1209. package/templates/layers/audit-log/files/internal/audit/sink.go +196 -0
  1210. package/templates/layers/audit-log/files/internal/audit/verify.go +17 -0
  1211. package/templates/layers/audit-log/files/package.json +5 -0
  1212. package/templates/layers/audit-log/files/pyproject.toml +2 -0
  1213. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditChain.cs +74 -0
  1214. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditEvent.cs +90 -0
  1215. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditOptions.cs +104 -0
  1216. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditRecorder.cs +106 -0
  1217. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditSerialization.cs +116 -0
  1218. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/AuditSinks.cs +165 -0
  1219. package/templates/layers/audit-log/files/src/__solutionName.dot__.Auditing/__solutionName.dot__.Auditing.csproj +17 -0
  1220. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/chain.py +56 -0
  1221. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/event.py +118 -0
  1222. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/recorder.py +118 -0
  1223. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/redact.py +41 -0
  1224. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/settings.py +102 -0
  1225. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/sinks.py +121 -0
  1226. package/templates/layers/audit-log/files/src/__solutionName.snake__/audit/verify.py +14 -0
  1227. package/templates/layers/audit-log/files/src/audit/chain.ts +59 -0
  1228. package/templates/layers/audit-log/files/src/audit/event.ts +73 -0
  1229. package/templates/layers/audit-log/files/src/audit/index.ts +32 -0
  1230. package/templates/layers/audit-log/files/src/audit/recorder.ts +108 -0
  1231. package/templates/layers/audit-log/files/src/audit/redact.ts +54 -0
  1232. package/templates/layers/audit-log/files/src/audit/settings.ts +113 -0
  1233. package/templates/layers/audit-log/files/src/audit/sinks.ts +131 -0
  1234. package/templates/layers/audit-log/files/src/audit/tests/audit.spec.ts +97 -0
  1235. package/templates/layers/audit-log/files/src/audit/tests/audit.test.ts +103 -0
  1236. package/templates/layers/audit-log/files/tests/test_audit_log.py +91 -0
  1237. package/templates/layers/auth-jwt/blueprint.yaml +124 -0
  1238. package/templates/layers/auth-jwt/files/.env.auth.example +17 -0
  1239. package/templates/layers/auth-jwt/files/Directory.Packages.props +5 -0
  1240. package/templates/layers/auth-jwt/files/__solutionName.dot__.slnx +5 -0
  1241. package/templates/layers/auth-jwt/files/docs/auth-jwt.md +198 -0
  1242. package/templates/layers/auth-jwt/files/go.mod +2 -0
  1243. package/templates/layers/auth-jwt/files/internal/auth/auth_test.go +167 -0
  1244. package/templates/layers/auth-jwt/files/internal/auth/config.go +108 -0
  1245. package/templates/layers/auth-jwt/files/internal/auth/errors.go +21 -0
  1246. package/templates/layers/auth-jwt/files/internal/auth/http.go +65 -0
  1247. package/templates/layers/auth-jwt/files/internal/auth/password.go +76 -0
  1248. package/templates/layers/auth-jwt/files/internal/auth/service.go +213 -0
  1249. package/templates/layers/auth-jwt/files/internal/auth/store.go +138 -0
  1250. package/templates/layers/auth-jwt/files/internal/auth/token.go +83 -0
  1251. package/templates/layers/auth-jwt/files/package.json +9 -0
  1252. package/templates/layers/auth-jwt/files/pyproject.toml +2 -0
  1253. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthException.cs +39 -0
  1254. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthOptions.cs +35 -0
  1255. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthService.cs +132 -0
  1256. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/AuthServiceCollectionExtensions.cs +48 -0
  1257. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/JwtTokenService.cs +84 -0
  1258. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/PasswordHasher.cs +52 -0
  1259. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/Stores.cs +100 -0
  1260. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/__solutionName.dot__.Auth.csproj +21 -0
  1261. package/templates/layers/auth-jwt/files/src/__solutionName.dot__.Auth/appsettings.Auth.sample.json +10 -0
  1262. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/__init__.py +42 -0
  1263. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/config.py +49 -0
  1264. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/errors.py +21 -0
  1265. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/http.py +36 -0
  1266. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/passwords.py +37 -0
  1267. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/service.py +139 -0
  1268. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/store.py +90 -0
  1269. package/templates/layers/auth-jwt/files/src/__solutionName.snake__/auth/tokens.py +72 -0
  1270. package/templates/layers/auth-jwt/files/src/auth/config.ts +77 -0
  1271. package/templates/layers/auth-jwt/files/src/auth/errors.ts +32 -0
  1272. package/templates/layers/auth-jwt/files/src/auth/http.ts +35 -0
  1273. package/templates/layers/auth-jwt/files/src/auth/index.ts +20 -0
  1274. package/templates/layers/auth-jwt/files/src/auth/password.ts +23 -0
  1275. package/templates/layers/auth-jwt/files/src/auth/random.ts +28 -0
  1276. package/templates/layers/auth-jwt/files/src/auth/service.ts +125 -0
  1277. package/templates/layers/auth-jwt/files/src/auth/store.memory.ts +50 -0
  1278. package/templates/layers/auth-jwt/files/src/auth/store.ts +37 -0
  1279. package/templates/layers/auth-jwt/files/src/auth/tests/auth.spec.ts +98 -0
  1280. package/templates/layers/auth-jwt/files/src/auth/tests/auth.test.ts +102 -0
  1281. package/templates/layers/auth-jwt/files/src/auth/tokens.ts +56 -0
  1282. package/templates/layers/auth-jwt/files/tests/auth/test_auth.py +106 -0
  1283. package/templates/layers/auth-oidc/blueprint.yaml +89 -0
  1284. package/templates/layers/auth-oidc/files/dotnet/.env.oidc.example +14 -0
  1285. package/templates/layers/auth-oidc/files/dotnet/docs/auth-oidc.md +73 -0
  1286. package/templates/layers/auth-oidc/files/dotnet/src/__solutionName.pascal__.Api/Auth/OidcAuthenticationExtensions.cs +65 -0
  1287. package/templates/layers/auth-oidc/files/dotnet/src/__solutionName.pascal__.Api/Auth/OidcOptions.cs +25 -0
  1288. package/templates/layers/auth-oidc/files/dotnet/src/__solutionName.pascal__.Api/Auth/ScopeRequirement.cs +29 -0
  1289. package/templates/layers/auth-oidc/files/node/.env.oidc.example +14 -0
  1290. package/templates/layers/auth-oidc/files/node/docs/auth-oidc.md +66 -0
  1291. package/templates/layers/auth-oidc/files/node/src/auth/auth.config.ts +64 -0
  1292. package/templates/layers/auth-oidc/files/node/src/auth/auth.decorators.ts +19 -0
  1293. package/templates/layers/auth-oidc/files/node/src/auth/auth.guard.ts +61 -0
  1294. package/templates/layers/auth-oidc/files/node/src/auth/auth.module.ts +12 -0
  1295. package/templates/layers/auth-oidc/files/node/src/auth/jwt-verifier.ts +97 -0
  1296. package/templates/layers/auth-oidc/files/package.json +6 -0
  1297. package/templates/layers/auth-oidc/files/pyproject.toml +2 -0
  1298. package/templates/layers/auth-oidc/files/python/.env.oidc.example +14 -0
  1299. package/templates/layers/auth-oidc/files/python/app/auth/dependencies.py +69 -0
  1300. package/templates/layers/auth-oidc/files/python/app/auth/settings.py +32 -0
  1301. package/templates/layers/auth-oidc/files/python/app/auth/verifier.py +57 -0
  1302. package/templates/layers/auth-oidc/files/python/docs/auth-oidc.md +57 -0
  1303. package/templates/layers/auth-oidc/files/python/requirements-auth-oidc.txt +4 -0
  1304. package/templates/layers/auth-oidc/files/typescript/.env.oidc.example +21 -0
  1305. package/templates/layers/auth-oidc/files/typescript/docs/auth-oidc.md +69 -0
  1306. package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/callback/route.ts +43 -0
  1307. package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/login/route.ts +40 -0
  1308. package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/logout/route.ts +27 -0
  1309. package/templates/layers/auth-oidc/files/typescript/src/app/api/auth/me/route.ts +12 -0
  1310. package/templates/layers/auth-oidc/files/typescript/src/lib/auth/config.ts +98 -0
  1311. package/templates/layers/auth-oidc/files/typescript/src/lib/auth/guard.ts +23 -0
  1312. package/templates/layers/auth-oidc/files/typescript/src/lib/auth/oidc.ts +19 -0
  1313. package/templates/layers/auth-oidc/files/typescript/src/lib/auth/session.ts +81 -0
  1314. package/templates/layers/cache-redis/blueprint.yaml +186 -0
  1315. package/templates/layers/cache-redis/files/.env.cache.example +29 -0
  1316. package/templates/layers/cache-redis/files/Directory.Packages.props +5 -0
  1317. package/templates/layers/cache-redis/files/__solutionName.dot__.slnx +5 -0
  1318. package/templates/layers/cache-redis/files/docker-compose.redis.yml +33 -0
  1319. package/templates/layers/cache-redis/files/docs/cache/redis.md +113 -0
  1320. package/templates/layers/cache-redis/files/go.mod +1 -0
  1321. package/templates/layers/cache-redis/files/internal/cache/cache.go +127 -0
  1322. package/templates/layers/cache-redis/files/internal/cache/cache_test.go +113 -0
  1323. package/templates/layers/cache-redis/files/internal/cache/config.go +110 -0
  1324. package/templates/layers/cache-redis/files/internal/cache/memory.go +124 -0
  1325. package/templates/layers/cache-redis/files/internal/cache/redis.go +108 -0
  1326. package/templates/layers/cache-redis/files/package.json +5 -0
  1327. package/templates/layers/cache-redis/files/pyproject.toml +2 -0
  1328. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/CacheKey.cs +44 -0
  1329. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/CacheOptions.cs +119 -0
  1330. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/CacheStoreFactory.cs +16 -0
  1331. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/ICacheStore.cs +37 -0
  1332. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/MemoryCacheStore.cs +129 -0
  1333. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/RedisCacheStore.cs +139 -0
  1334. package/templates/layers/cache-redis/files/src/__solutionName.dot__.Cache.Redis/__solutionName.dot__.Cache.Redis.csproj +18 -0
  1335. package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/api.py +67 -0
  1336. package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/keys.py +39 -0
  1337. package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/redis_store.py +85 -0
  1338. package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/settings.py +82 -0
  1339. package/templates/layers/cache-redis/files/src/__solutionName.snake__/cache/store.py +113 -0
  1340. package/templates/layers/cache-redis/files/src/cache/index.ts +54 -0
  1341. package/templates/layers/cache-redis/files/src/cache/keys.ts +28 -0
  1342. package/templates/layers/cache-redis/files/src/cache/redis.ts +131 -0
  1343. package/templates/layers/cache-redis/files/src/cache/settings.ts +86 -0
  1344. package/templates/layers/cache-redis/files/src/cache/store.ts +98 -0
  1345. package/templates/layers/cache-redis/files/tests/test_cache_redis.py +105 -0
  1346. package/templates/layers/ci-github-actions/blueprint.yaml +174 -0
  1347. package/templates/layers/ci-github-actions/files/.github/actions/dotnet-setup/action.yml +25 -0
  1348. package/templates/layers/ci-github-actions/files/.github/actions/go-setup/action.yml +30 -0
  1349. package/templates/layers/ci-github-actions/files/.github/actions/node-setup/action.yml +58 -0
  1350. package/templates/layers/ci-github-actions/files/.github/actions/python-setup/action.yml +23 -0
  1351. package/templates/layers/ci-github-actions/files/.github/dependabot.yml +13 -0
  1352. package/templates/layers/ci-github-actions/files/.github/scripts/run-package-script.sh +13 -0
  1353. package/templates/layers/ci-github-actions/files/.github/workflows/ci-dotnet.yml +85 -0
  1354. package/templates/layers/ci-github-actions/files/.github/workflows/ci-go.yml +91 -0
  1355. package/templates/layers/ci-github-actions/files/.github/workflows/ci-node.yml +111 -0
  1356. package/templates/layers/ci-github-actions/files/.github/workflows/ci-python.yml +125 -0
  1357. package/templates/layers/ci-github-actions/files/docs/ci-github-actions.md +106 -0
  1358. package/templates/layers/db-core/blueprint.yaml +98 -0
  1359. package/templates/layers/db-core/files/.env.example +18 -0
  1360. package/templates/layers/db-core/files/__solutionName.dot__.slnx +5 -0
  1361. package/templates/layers/db-core/files/docs/persistence.md +91 -0
  1362. package/templates/layers/db-core/files/internal/db/config.go +108 -0
  1363. package/templates/layers/db-core/files/internal/db/errors.go +61 -0
  1364. package/templates/layers/db-core/files/internal/db/memory.go +141 -0
  1365. package/templates/layers/db-core/files/internal/db/memory_test.go +195 -0
  1366. package/templates/layers/db-core/files/internal/db/ports.go +76 -0
  1367. package/templates/layers/db-core/files/internal/db/repository.go +134 -0
  1368. package/templates/layers/db-core/files/internal/db/retry.go +30 -0
  1369. package/templates/layers/db-core/files/package.json +5 -0
  1370. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/DatabaseException.cs +39 -0
  1371. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/DatabaseOptions.cs +65 -0
  1372. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/DatabaseRetry.cs +24 -0
  1373. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/IRepository.cs +30 -0
  1374. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/IUnitOfWork.cs +23 -0
  1375. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/InMemory/InMemoryDatabase.cs +188 -0
  1376. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/Query.cs +29 -0
  1377. package/templates/layers/db-core/files/src/__solutionName.dot__.Data/__solutionName.dot__.Data.csproj +16 -0
  1378. package/templates/layers/db-core/files/src/__solutionName.snake__/db/api.py +63 -0
  1379. package/templates/layers/db-core/files/src/__solutionName.snake__/db/config.py +79 -0
  1380. package/templates/layers/db-core/files/src/__solutionName.snake__/db/errors.py +47 -0
  1381. package/templates/layers/db-core/files/src/__solutionName.snake__/db/memory.py +143 -0
  1382. package/templates/layers/db-core/files/src/__solutionName.snake__/db/ports.py +80 -0
  1383. package/templates/layers/db-core/files/src/__solutionName.snake__/db/retry.py +25 -0
  1384. package/templates/layers/db-core/files/src/db/config.ts +65 -0
  1385. package/templates/layers/db-core/files/src/db/errors.ts +52 -0
  1386. package/templates/layers/db-core/files/src/db/index.ts +41 -0
  1387. package/templates/layers/db-core/files/src/db/memory.test.ts +107 -0
  1388. package/templates/layers/db-core/files/src/db/memory.ts +182 -0
  1389. package/templates/layers/db-core/files/src/db/ports.ts +58 -0
  1390. package/templates/layers/db-core/files/src/db/retry.ts +20 -0
  1391. package/templates/layers/db-core/files/tests/test_db_core.py +95 -0
  1392. package/templates/layers/db-mongo/blueprint.yaml +157 -0
  1393. package/templates/layers/db-mongo/files/.env.mongo.example +17 -0
  1394. package/templates/layers/db-mongo/files/Directory.Packages.props +7 -0
  1395. package/templates/layers/db-mongo/files/__solutionName.dot__.slnx +5 -0
  1396. package/templates/layers/db-mongo/files/docker-compose.mongo.yml +27 -0
  1397. package/templates/layers/db-mongo/files/docs/db-mongo.md +138 -0
  1398. package/templates/layers/db-mongo/files/go.mod +1 -0
  1399. package/templates/layers/db-mongo/files/internal/db/mongodb/client.go +57 -0
  1400. package/templates/layers/db-mongo/files/internal/db/mongodb/config.go +105 -0
  1401. package/templates/layers/db-mongo/files/internal/db/mongodb/indexes.go +42 -0
  1402. package/templates/layers/db-mongo/files/package.json +5 -0
  1403. package/templates/layers/db-mongo/files/pyproject.toml +2 -0
  1404. package/templates/layers/db-mongo/files/requirements-mongo.txt +2 -0
  1405. package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoContext.cs +21 -0
  1406. package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoHealthCheck.cs +28 -0
  1407. package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoIndexes.cs +25 -0
  1408. package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoOptions.cs +23 -0
  1409. package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/MongoServiceCollectionExtensions.cs +31 -0
  1410. package/templates/layers/db-mongo/files/src/__solutionName.dot__.Infrastructure.Mongo/__solutionName.dot__.Infrastructure.Mongo.csproj +18 -0
  1411. package/templates/layers/db-mongo/files/src/__solutionName.snake__/db/mongo/client.py +48 -0
  1412. package/templates/layers/db-mongo/files/src/__solutionName.snake__/db/mongo/config.py +66 -0
  1413. package/templates/layers/db-mongo/files/src/__solutionName.snake__/db/mongo/indexes.py +29 -0
  1414. package/templates/layers/db-mongo/files/src/db/mongo/client.rs +37 -0
  1415. package/templates/layers/db-mongo/files/src/db/mongo/client.ts +51 -0
  1416. package/templates/layers/db-mongo/files/src/db/mongo/config.rs +68 -0
  1417. package/templates/layers/db-mongo/files/src/db/mongo/config.ts +58 -0
  1418. package/templates/layers/db-mongo/files/src/db/mongo/index.ts +3 -0
  1419. package/templates/layers/db-mongo/files/src/db/mongo/indexes.rs +26 -0
  1420. package/templates/layers/db-mongo/files/src/db/mongo/indexes.ts +21 -0
  1421. package/templates/layers/db-mongo/files/src/db/mongo/mod.rs +7 -0
  1422. package/templates/layers/db-mongo/files/src/main/java/__solutionName.lower__/db/mongo/MongoClientProvider.java +66 -0
  1423. package/templates/layers/db-mongo/files/src/main/java/__solutionName.lower__/db/mongo/MongoConfig.java +56 -0
  1424. package/templates/layers/db-mongo/files/src/main/java/__solutionName.lower__/db/mongo/MongoIndexes.java +26 -0
  1425. package/templates/layers/db-postgres/blueprint.yaml +130 -0
  1426. package/templates/layers/db-postgres/files/.env.postgres.example +31 -0
  1427. package/templates/layers/db-postgres/files/Directory.Packages.props +5 -0
  1428. package/templates/layers/db-postgres/files/__solutionName.dot__.slnx +5 -0
  1429. package/templates/layers/db-postgres/files/docker-compose.postgres.yml +28 -0
  1430. package/templates/layers/db-postgres/files/docs/postgres.md +152 -0
  1431. package/templates/layers/db-postgres/files/go.mod +1 -0
  1432. package/templates/layers/db-postgres/files/internal/db/postgres.go +48 -0
  1433. package/templates/layers/db-postgres/files/internal/db/postgres_config.go +79 -0
  1434. package/templates/layers/db-postgres/files/internal/db/postgres_errors.go +59 -0
  1435. package/templates/layers/db-postgres/files/internal/db/postgres_migrate.go +155 -0
  1436. package/templates/layers/db-postgres/files/migrations/0001_init.sql +9 -0
  1437. package/templates/layers/db-postgres/files/package.json +11 -0
  1438. package/templates/layers/db-postgres/files/pyproject.toml +2 -0
  1439. package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/PostgresErrors.cs +57 -0
  1440. package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/PostgresMigrator.cs +171 -0
  1441. package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/PostgresOptions.cs +92 -0
  1442. package/templates/layers/db-postgres/files/src/__solutionName.dot__.Data.Postgres/__solutionName.dot__.Data.Postgres.csproj +25 -0
  1443. package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres.py +256 -0
  1444. package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres_config.py +81 -0
  1445. package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres_errors.py +48 -0
  1446. package/templates/layers/db-postgres/files/src/__solutionName.snake__/db/postgres_migrate.py +132 -0
  1447. package/templates/layers/db-postgres/files/src/db/postgres/config.ts +86 -0
  1448. package/templates/layers/db-postgres/files/src/db/postgres/database.ts +109 -0
  1449. package/templates/layers/db-postgres/files/src/db/postgres/errors.ts +48 -0
  1450. package/templates/layers/db-postgres/files/src/db/postgres/index.ts +16 -0
  1451. package/templates/layers/db-postgres/files/src/db/postgres/migrate.cli.ts +11 -0
  1452. package/templates/layers/db-postgres/files/src/db/postgres/migrate.ts +134 -0
  1453. package/templates/layers/db-postgres/files/src/db/postgres/repository.ts +159 -0
  1454. package/templates/layers/db-sqlite/blueprint.yaml +147 -0
  1455. package/templates/layers/db-sqlite/files/.env.sqlite.example +20 -0
  1456. package/templates/layers/db-sqlite/files/.gitignore.sqlite +5 -0
  1457. package/templates/layers/db-sqlite/files/Directory.Packages.props +6 -0
  1458. package/templates/layers/db-sqlite/files/__solutionName.dot__.slnx +5 -0
  1459. package/templates/layers/db-sqlite/files/docs/db/sqlite.md +91 -0
  1460. package/templates/layers/db-sqlite/files/go.mod +1 -0
  1461. package/templates/layers/db-sqlite/files/internal/db/sqlite/health.go +39 -0
  1462. package/templates/layers/db-sqlite/files/internal/db/sqlite/migrate.go +106 -0
  1463. package/templates/layers/db-sqlite/files/internal/db/sqlite/settings.go +103 -0
  1464. package/templates/layers/db-sqlite/files/internal/db/sqlite/sqlite.go +78 -0
  1465. package/templates/layers/db-sqlite/files/internal/db/sqlite/sqlite_test.go +94 -0
  1466. package/templates/layers/db-sqlite/files/migrations/0001_init.sql +11 -0
  1467. package/templates/layers/db-sqlite/files/package.json +8 -0
  1468. package/templates/layers/db-sqlite/files/pyproject.toml +2 -0
  1469. package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteConnectionFactory.cs +67 -0
  1470. package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteHealth.cs +37 -0
  1471. package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteMigrator.cs +99 -0
  1472. package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/SqliteOptions.cs +81 -0
  1473. package/templates/layers/db-sqlite/files/src/__solutionName.dot__.Persistence.Sqlite/__solutionName.dot__.Persistence.Sqlite.csproj +18 -0
  1474. package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/connection.py +49 -0
  1475. package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/health.py +36 -0
  1476. package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/migrate.py +58 -0
  1477. package/templates/layers/db-sqlite/files/src/__solutionName.snake__/db/sqlite/settings.py +68 -0
  1478. package/templates/layers/db-sqlite/files/src/db/sqlite/cli.ts +38 -0
  1479. package/templates/layers/db-sqlite/files/src/db/sqlite/client.ts +45 -0
  1480. package/templates/layers/db-sqlite/files/src/db/sqlite/health.ts +30 -0
  1481. package/templates/layers/db-sqlite/files/src/db/sqlite/index.ts +8 -0
  1482. package/templates/layers/db-sqlite/files/src/db/sqlite/migrate.ts +51 -0
  1483. package/templates/layers/db-sqlite/files/src/db/sqlite/settings.ts +75 -0
  1484. package/templates/layers/db-sqlite/files/tests/test_db_sqlite.py +50 -0
  1485. package/templates/layers/devcontainer/blueprint.yaml +130 -0
  1486. package/templates/layers/devcontainer/files/.devcontainer/devcontainer.json +61 -0
  1487. package/templates/layers/devcontainer/files/.devcontainer/post-create.sh +29 -0
  1488. package/templates/layers/devcontainer/files/.devcontainer/setup-dotnet.sh +19 -0
  1489. package/templates/layers/devcontainer/files/.devcontainer/setup-go.sh +13 -0
  1490. package/templates/layers/devcontainer/files/.devcontainer/setup-node.sh +29 -0
  1491. package/templates/layers/devcontainer/files/.devcontainer/setup-python.sh +32 -0
  1492. package/templates/layers/devcontainer/files/docs/devcontainer.md +75 -0
  1493. package/templates/layers/docker/blueprint.yaml +168 -0
  1494. package/templates/layers/docker/files/.dockerignore +80 -0
  1495. package/templates/layers/docker/files/.env.docker.example +17 -0
  1496. package/templates/layers/docker/files/Dockerfile.dotnet +38 -0
  1497. package/templates/layers/docker/files/Dockerfile.go +40 -0
  1498. package/templates/layers/docker/files/Dockerfile.nextjs +42 -0
  1499. package/templates/layers/docker/files/Dockerfile.nodejs +46 -0
  1500. package/templates/layers/docker/files/Dockerfile.python +52 -0
  1501. package/templates/layers/docker/files/Dockerfile.spa +30 -0
  1502. package/templates/layers/docker/files/compose.yaml +35 -0
  1503. package/templates/layers/docker/files/docker/nginx.conf +44 -0
  1504. package/templates/layers/docker/files/docs/docker.md +115 -0
  1505. package/templates/layers/docker/files/next.config.ts +11 -0
  1506. package/templates/layers/docker-compose/blueprint.yaml +118 -0
  1507. package/templates/layers/docker-compose/files/.env.compose.example +66 -0
  1508. package/templates/layers/docker-compose/files/compose/cache-none.yml +3 -0
  1509. package/templates/layers/docker-compose/files/compose/cache-redis.yml +28 -0
  1510. package/templates/layers/docker-compose/files/compose/cache-valkey.yml +27 -0
  1511. package/templates/layers/docker-compose/files/compose/db-mongo.yml +27 -0
  1512. package/templates/layers/docker-compose/files/compose/db-mysql.yml +31 -0
  1513. package/templates/layers/docker-compose/files/compose/db-none.yml +4 -0
  1514. package/templates/layers/docker-compose/files/compose/db-postgres.yml +28 -0
  1515. package/templates/layers/docker-compose/files/compose/queue-kafka.yml +35 -0
  1516. package/templates/layers/docker-compose/files/compose/queue-nats.yml +26 -0
  1517. package/templates/layers/docker-compose/files/compose/queue-none.yml +3 -0
  1518. package/templates/layers/docker-compose/files/compose/queue-rabbitmq.yml +27 -0
  1519. package/templates/layers/docker-compose/files/docker-compose.yml +20 -0
  1520. package/templates/layers/docker-compose/files/docs/local-stack.md +135 -0
  1521. package/templates/layers/evals/blueprint.yaml +211 -0
  1522. package/templates/layers/evals/files/.github/workflows/evals-node.yml +55 -0
  1523. package/templates/layers/evals/files/.github/workflows/evals-python.yml +54 -0
  1524. package/templates/layers/evals/files/docs/evals.md +68 -0
  1525. package/templates/layers/evals/files/evals/README.md +73 -0
  1526. package/templates/layers/evals/files/evals/assertions.py +56 -0
  1527. package/templates/layers/evals/files/evals/assertions.ts +66 -0
  1528. package/templates/layers/evals/files/evals/budget.py +55 -0
  1529. package/templates/layers/evals/files/evals/budget.ts +61 -0
  1530. package/templates/layers/evals/files/evals/cli.ts +76 -0
  1531. package/templates/layers/evals/files/evals/config.py +83 -0
  1532. package/templates/layers/evals/files/evals/config.ts +77 -0
  1533. package/templates/layers/evals/files/evals/dataset.py +90 -0
  1534. package/templates/layers/evals/files/evals/dataset.ts +101 -0
  1535. package/templates/layers/evals/files/evals/datasets/case.schema.json +67 -0
  1536. package/templates/layers/evals/files/evals/datasets/golden.jsonl +4 -0
  1537. package/templates/layers/evals/files/evals/run.py +85 -0
  1538. package/templates/layers/evals/files/evals/runner.py +114 -0
  1539. package/templates/layers/evals/files/evals/runner.ts +125 -0
  1540. package/templates/layers/evals/files/evals/target.ts +95 -0
  1541. package/templates/layers/evals/files/evals/targets.py +103 -0
  1542. package/templates/layers/evals/files/evals/tracing.py +49 -0
  1543. package/templates/layers/evals/files/evals/tracing.ts +31 -0
  1544. package/templates/layers/evals/files/evals/tsconfig.json +15 -0
  1545. package/templates/layers/health-checks/blueprint.yaml +170 -0
  1546. package/templates/layers/health-checks/files/.env.health.example +23 -0
  1547. package/templates/layers/health-checks/files/__solutionName.dot__.slnx +5 -0
  1548. package/templates/layers/health-checks/files/docs/health-checks.md +200 -0
  1549. package/templates/layers/health-checks/files/internal/health/config.go +96 -0
  1550. package/templates/layers/health-checks/files/internal/health/health.go +113 -0
  1551. package/templates/layers/health-checks/files/internal/health/health_test.go +102 -0
  1552. package/templates/layers/health-checks/files/internal/health/http.go +56 -0
  1553. package/templates/layers/health-checks/files/internal/health/probes.go +88 -0
  1554. package/templates/layers/health-checks/files/internal/health/runner.go +100 -0
  1555. package/templates/layers/health-checks/files/package.json +5 -0
  1556. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/DependencyProbeOptions.cs +26 -0
  1557. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthEndpointExtensions.cs +34 -0
  1558. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthOptions.cs +25 -0
  1559. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthProbeResponder.cs +121 -0
  1560. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthServiceCollectionExtensions.cs +51 -0
  1561. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HealthTags.cs +10 -0
  1562. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/HttpDependencyHealthCheck.cs +44 -0
  1563. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/TcpDependencyHealthCheck.cs +36 -0
  1564. package/templates/layers/health-checks/files/src/__solutionName.dot__.Health/__solutionName.dot__.Health.csproj +15 -0
  1565. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/__init__.py +28 -0
  1566. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/models.py +48 -0
  1567. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/probes.py +82 -0
  1568. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/register.py +15 -0
  1569. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/registry.py +24 -0
  1570. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/router.py +52 -0
  1571. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/runner.py +94 -0
  1572. package/templates/layers/health-checks/files/src/__solutionName.snake__/health/settings.py +33 -0
  1573. package/templates/layers/health-checks/files/src/app/health/live/route.ts +11 -0
  1574. package/templates/layers/health-checks/files/src/app/health/ready/route.ts +10 -0
  1575. package/templates/layers/health-checks/files/src/app/health/startup/route.ts +10 -0
  1576. package/templates/layers/health-checks/files/src/health/__tests__/health.test.ts +66 -0
  1577. package/templates/layers/health-checks/files/src/health/config.ts +62 -0
  1578. package/templates/layers/health-checks/files/src/health/handler.ts +50 -0
  1579. package/templates/layers/health-checks/files/src/health/index.ts +20 -0
  1580. package/templates/layers/health-checks/files/src/health/node/http.ts +26 -0
  1581. package/templates/layers/health-checks/files/src/health/node/tcp.ts +36 -0
  1582. package/templates/layers/health-checks/files/src/health/probes.ts +61 -0
  1583. package/templates/layers/health-checks/files/src/health/register.ts +15 -0
  1584. package/templates/layers/health-checks/files/src/health/registry.ts +27 -0
  1585. package/templates/layers/health-checks/files/src/health/runner.ts +76 -0
  1586. package/templates/layers/health-checks/files/src/health/types.ts +39 -0
  1587. package/templates/layers/health-checks/files/tests/__init__.py +1 -0
  1588. package/templates/layers/health-checks/files/tests/test_health.py +51 -0
  1589. package/templates/layers/lint-format/blueprint.yaml +178 -0
  1590. package/templates/layers/lint-format/files/.editorconfig +87 -0
  1591. package/templates/layers/lint-format/files/.golangci.yml +34 -0
  1592. package/templates/layers/lint-format/files/.prettierignore +20 -0
  1593. package/templates/layers/lint-format/files/.prettierrc.json +11 -0
  1594. package/templates/layers/lint-format/files/docs/lint-format.md +111 -0
  1595. package/templates/layers/lint-format/files/eslint.config.mjs +43 -0
  1596. package/templates/layers/lint-format/files/package.json +9 -0
  1597. package/templates/layers/lint-format/files/ruff.toml +25 -0
  1598. package/templates/layers/observability-otel/blueprint.yaml +212 -0
  1599. package/templates/layers/observability-otel/files/.env.otel.example +30 -0
  1600. package/templates/layers/observability-otel/files/Directory.Packages.props +8 -0
  1601. package/templates/layers/observability-otel/files/__solutionName.dot__.slnx +5 -0
  1602. package/templates/layers/observability-otel/files/docker-compose.otel.yml +16 -0
  1603. package/templates/layers/observability-otel/files/docs/observability.md +224 -0
  1604. package/templates/layers/observability-otel/files/go.mod +7 -0
  1605. package/templates/layers/observability-otel/files/internal/telemetry/config.go +122 -0
  1606. package/templates/layers/observability-otel/files/internal/telemetry/http.go +33 -0
  1607. package/templates/layers/observability-otel/files/internal/telemetry/logging.go +84 -0
  1608. package/templates/layers/observability-otel/files/internal/telemetry/provider.go +77 -0
  1609. package/templates/layers/observability-otel/files/otel-collector-config.yaml +47 -0
  1610. package/templates/layers/observability-otel/files/package.json +15 -0
  1611. package/templates/layers/observability-otel/files/pyproject.toml +2 -0
  1612. package/templates/layers/observability-otel/files/src/__solutionName.dot__.Observability/ObservabilityExtensions.cs +81 -0
  1613. package/templates/layers/observability-otel/files/src/__solutionName.dot__.Observability/ObservabilityOptions.cs +37 -0
  1614. package/templates/layers/observability-otel/files/src/__solutionName.dot__.Observability/__solutionName.dot__.Observability.csproj +25 -0
  1615. package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/__init__.py +15 -0
  1616. package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/config.py +99 -0
  1617. package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/log.py +86 -0
  1618. package/templates/layers/observability-otel/files/src/__solutionName.snake__/otel/setup.py +124 -0
  1619. package/templates/layers/observability-otel/files/src/instrumentation.ts +9 -0
  1620. package/templates/layers/observability-otel/files/src/otel/config.ts +83 -0
  1621. package/templates/layers/observability-otel/files/src/otel/logger.ts +46 -0
  1622. package/templates/layers/observability-otel/files/src/otel/register.ts +5 -0
  1623. package/templates/layers/observability-otel/files/src/otel/sdk.ts +73 -0
  1624. package/templates/layers/queue-broker/blueprint.yaml +194 -0
  1625. package/templates/layers/queue-broker/files/.env.queue.example +35 -0
  1626. package/templates/layers/queue-broker/files/Directory.Packages.props +7 -0
  1627. package/templates/layers/queue-broker/files/__solutionName.dot__.slnx +5 -0
  1628. package/templates/layers/queue-broker/files/cmd/worker/main.go +34 -0
  1629. package/templates/layers/queue-broker/files/docker-compose.queue-rabbitmq.yml +26 -0
  1630. package/templates/layers/queue-broker/files/docker-compose.queue-redis.yml +23 -0
  1631. package/templates/layers/queue-broker/files/docs/queue-asynq.md +71 -0
  1632. package/templates/layers/queue-broker/files/docs/queue-bullmq.md +62 -0
  1633. package/templates/layers/queue-broker/files/docs/queue-celery.md +58 -0
  1634. package/templates/layers/queue-broker/files/docs/queue-masstransit.md +84 -0
  1635. package/templates/layers/queue-broker/files/go.mod +2 -0
  1636. package/templates/layers/queue-broker/files/internal/queue/client.go +57 -0
  1637. package/templates/layers/queue-broker/files/internal/queue/config.go +109 -0
  1638. package/templates/layers/queue-broker/files/internal/queue/config_test.go +38 -0
  1639. package/templates/layers/queue-broker/files/internal/queue/handlers.go +33 -0
  1640. package/templates/layers/queue-broker/files/internal/queue/server.go +29 -0
  1641. package/templates/layers/queue-broker/files/internal/queue/tasks.go +11 -0
  1642. package/templates/layers/queue-broker/files/package.json +6 -0
  1643. package/templates/layers/queue-broker/files/pyproject.toml +2 -0
  1644. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/Consumers/WelcomeEmailRequestedConsumer.cs +24 -0
  1645. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/Contracts/WelcomeEmailRequested.cs +7 -0
  1646. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/IJobPublisher.cs +11 -0
  1647. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/JobPublisher.cs +10 -0
  1648. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/QueueOptions.cs +32 -0
  1649. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/QueueServiceCollectionExtensions.cs +60 -0
  1650. package/templates/layers/queue-broker/files/src/__solutionName.dot__.Queue/__solutionName.dot__.Queue.csproj +21 -0
  1651. package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/__init__.py +12 -0
  1652. package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/app.py +35 -0
  1653. package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/config.py +90 -0
  1654. package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/producer.py +10 -0
  1655. package/templates/layers/queue-broker/files/src/__solutionName.snake__/queue/tasks.py +31 -0
  1656. package/templates/layers/queue-broker/files/src/queue/config.ts +60 -0
  1657. package/templates/layers/queue-broker/files/src/queue/connection.ts +19 -0
  1658. package/templates/layers/queue-broker/files/src/queue/handlers.ts +22 -0
  1659. package/templates/layers/queue-broker/files/src/queue/index.ts +8 -0
  1660. package/templates/layers/queue-broker/files/src/queue/jobs.ts +15 -0
  1661. package/templates/layers/queue-broker/files/src/queue/producer.ts +39 -0
  1662. package/templates/layers/queue-broker/files/src/queue/worker.cli.ts +32 -0
  1663. package/templates/layers/queue-broker/files/src/queue/worker.ts +28 -0
  1664. package/templates/layers/queue-broker/files/tests/test_queue_config.py +37 -0
  1665. package/templates/layers/release-automation/blueprint.yaml +205 -0
  1666. package/templates/layers/release-automation/files/.changeset/README.md +31 -0
  1667. package/templates/layers/release-automation/files/.changeset/config.json +12 -0
  1668. package/templates/layers/release-automation/files/.githooks/commit-msg +32 -0
  1669. package/templates/layers/release-automation/files/.github/workflows/commit-conventions.yml +45 -0
  1670. package/templates/layers/release-automation/files/.github/workflows/release-changesets.yml +68 -0
  1671. package/templates/layers/release-automation/files/.github/workflows/release-dotnet.yml +90 -0
  1672. package/templates/layers/release-automation/files/.github/workflows/release-go.yml +89 -0
  1673. package/templates/layers/release-automation/files/.github/workflows/release-monorepo.yml +40 -0
  1674. package/templates/layers/release-automation/files/.github/workflows/release-node.yml +85 -0
  1675. package/templates/layers/release-automation/files/.github/workflows/release-python.yml +68 -0
  1676. package/templates/layers/release-automation/files/.release-please-manifest.json +3 -0
  1677. package/templates/layers/release-automation/files/docs/release-automation.md +154 -0
  1678. package/templates/layers/release-automation/files/release-please-config.json +22 -0
  1679. package/templates/layers/security-supply-chain/blueprint.yaml +208 -0
  1680. package/templates/layers/security-supply-chain/files/.githooks/pre-commit +17 -0
  1681. package/templates/layers/security-supply-chain/files/.github/dependabot.yml +30 -0
  1682. package/templates/layers/security-supply-chain/files/.github/workflows/codeql.yml +54 -0
  1683. package/templates/layers/security-supply-chain/files/.github/workflows/dependency-review.yml +35 -0
  1684. package/templates/layers/security-supply-chain/files/.github/workflows/sbom.yml +56 -0
  1685. package/templates/layers/security-supply-chain/files/.github/workflows/scorecard.yml +51 -0
  1686. package/templates/layers/security-supply-chain/files/.github/workflows/secret-scan.yml +62 -0
  1687. package/templates/layers/security-supply-chain/files/.gitleaks.toml +42 -0
  1688. package/templates/layers/security-supply-chain/files/SECURITY.md +36 -0
  1689. package/templates/layers/security-supply-chain/files/docs/security-supply-chain.md +124 -0
  1690. package/templates/layers/security-supply-chain/files/npmrc +13 -0
  1691. package/templates/layers/security-supply-chain/files/renovate.json +26 -0
  1692. package/templates/layers/testing-e2e/blueprint.yaml +199 -0
  1693. package/templates/layers/testing-e2e/files/.env.e2e.example +32 -0
  1694. package/templates/layers/testing-e2e/files/Directory.Packages.props +7 -0
  1695. package/templates/layers/testing-e2e/files/__solutionName.dot__.slnx +5 -0
  1696. package/templates/layers/testing-e2e/files/docs/testing-e2e.md +106 -0
  1697. package/templates/layers/testing-e2e/files/e2e/api/contract.spec.ts +37 -0
  1698. package/templates/layers/testing-e2e/files/e2e/api/health.spec.ts +29 -0
  1699. package/templates/layers/testing-e2e/files/e2e/browser/app.spec.ts +27 -0
  1700. package/templates/layers/testing-e2e/files/e2e/browser/navigation.spec.ts +26 -0
  1701. package/templates/layers/testing-e2e/files/e2e/config.ts +85 -0
  1702. package/templates/layers/testing-e2e/files/e2e/support.ts +20 -0
  1703. package/templates/layers/testing-e2e/files/package.json +8 -0
  1704. package/templates/layers/testing-e2e/files/playwright.config.ts +44 -0
  1705. package/templates/layers/testing-e2e/files/test/e2e/config.go +71 -0
  1706. package/templates/layers/testing-e2e/files/test/e2e/contract_test.go +65 -0
  1707. package/templates/layers/testing-e2e/files/test/e2e/health_test.go +71 -0
  1708. package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/ApiContractTests.cs +51 -0
  1709. package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/DeploymentFixture.cs +44 -0
  1710. package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/E2eSettings.cs +26 -0
  1711. package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/HealthContractTests.cs +42 -0
  1712. package/templates/layers/testing-e2e/files/tests/__solutionName.dot__.E2E/__solutionName.dot__.E2E.csproj +23 -0
  1713. package/templates/layers/testing-e2e/files/tests/e2e/conftest.py +52 -0
  1714. package/templates/layers/testing-e2e/files/tests/e2e/e2e_config.py +47 -0
  1715. package/templates/layers/testing-e2e/files/tests/e2e/test_api_contract.py +35 -0
  1716. package/templates/layers/testing-e2e/files/tests/e2e/test_health_contract.py +28 -0
  1717. package/templates/layers/testing-unit/blueprint.yaml +161 -0
  1718. package/templates/layers/testing-unit/files/.coveragerc +12 -0
  1719. package/templates/layers/testing-unit/files/Directory.Packages.props +9 -0
  1720. package/templates/layers/testing-unit/files/__solutionName.dot__.slnx +5 -0
  1721. package/templates/layers/testing-unit/files/docs/testing.md +90 -0
  1722. package/templates/layers/testing-unit/files/internal/testsupport/clock.go +89 -0
  1723. package/templates/layers/testing-unit/files/internal/testsupport/clock_test.go +132 -0
  1724. package/templates/layers/testing-unit/files/internal/testsupport/recorder.go +41 -0
  1725. package/templates/layers/testing-unit/files/package.json +10 -0
  1726. package/templates/layers/testing-unit/files/pyproject.toml +2 -0
  1727. package/templates/layers/testing-unit/files/pytest.ini +16 -0
  1728. package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/Recorder.cs +66 -0
  1729. package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/RecorderTests.cs +90 -0
  1730. package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/__solutionName.dot__.Tests.csproj +32 -0
  1731. package/templates/layers/testing-unit/files/tests/__solutionName.dot__.Tests/coverlet.runsettings +17 -0
  1732. package/templates/layers/testing-unit/files/tests/conftest.py +17 -0
  1733. package/templates/layers/testing-unit/files/tests/support/clock.ts +81 -0
  1734. package/templates/layers/testing-unit/files/tests/support/index.ts +2 -0
  1735. package/templates/layers/testing-unit/files/tests/support/recorder.ts +21 -0
  1736. package/templates/layers/testing-unit/files/tests/support.py +78 -0
  1737. package/templates/layers/testing-unit/files/tests/support.test.ts +87 -0
  1738. package/templates/layers/testing-unit/files/tests/test_support.py +85 -0
  1739. 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.