container-superposition 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 (327) hide show
  1. package/README.md +843 -0
  2. package/dist/scripts/init.d.ts +3 -0
  3. package/dist/scripts/init.d.ts.map +1 -0
  4. package/dist/scripts/init.js +1190 -0
  5. package/dist/scripts/init.js.map +1 -0
  6. package/dist/scripts/migrate-to-manifests.d.ts +12 -0
  7. package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
  8. package/dist/scripts/migrate-to-manifests.js +230 -0
  9. package/dist/scripts/migrate-to-manifests.js.map +1 -0
  10. package/dist/tool/questionnaire/composer.d.ts +6 -0
  11. package/dist/tool/questionnaire/composer.d.ts.map +1 -0
  12. package/dist/tool/questionnaire/composer.js +1232 -0
  13. package/dist/tool/questionnaire/composer.js.map +1 -0
  14. package/dist/tool/readme/markdown-parser.d.ts +30 -0
  15. package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
  16. package/dist/tool/readme/markdown-parser.js +139 -0
  17. package/dist/tool/readme/markdown-parser.js.map +1 -0
  18. package/dist/tool/readme/readme-generator.d.ts +9 -0
  19. package/dist/tool/readme/readme-generator.d.ts.map +1 -0
  20. package/dist/tool/readme/readme-generator.js +422 -0
  21. package/dist/tool/readme/readme-generator.js.map +1 -0
  22. package/dist/tool/schema/custom-loader.d.ts +17 -0
  23. package/dist/tool/schema/custom-loader.d.ts.map +1 -0
  24. package/dist/tool/schema/custom-loader.js +149 -0
  25. package/dist/tool/schema/custom-loader.js.map +1 -0
  26. package/dist/tool/schema/overlay-loader.d.ts +47 -0
  27. package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
  28. package/dist/tool/schema/overlay-loader.js +252 -0
  29. package/dist/tool/schema/overlay-loader.js.map +1 -0
  30. package/dist/tool/schema/types.d.ts +212 -0
  31. package/dist/tool/schema/types.d.ts.map +1 -0
  32. package/dist/tool/schema/types.js +5 -0
  33. package/dist/tool/schema/types.js.map +1 -0
  34. package/docs/README.md +308 -0
  35. package/docs/architecture.md +233 -0
  36. package/docs/creating-overlays.md +549 -0
  37. package/docs/custom-patches.md +540 -0
  38. package/docs/dependencies.md +279 -0
  39. package/docs/examples/custom-patches-example.md +85 -0
  40. package/docs/examples.md +576 -0
  41. package/docs/messaging-comparison.md +265 -0
  42. package/docs/messaging-quick-start.md +385 -0
  43. package/docs/observability-workflow.md +537 -0
  44. package/docs/overlay-manifest-refactoring.md +214 -0
  45. package/docs/overlay-metadata-archive.md +54 -0
  46. package/docs/overlays.md +523 -0
  47. package/docs/presets-architecture.md +498 -0
  48. package/docs/presets.md +366 -0
  49. package/docs/publishing.md +476 -0
  50. package/docs/quick-reference.md +326 -0
  51. package/docs/ux.md +170 -0
  52. package/features/README.md +85 -0
  53. package/features/cross-distro-packages/README.md +146 -0
  54. package/features/cross-distro-packages/devcontainer-feature.json +20 -0
  55. package/features/cross-distro-packages/install.sh +58 -0
  56. package/features/local-secrets-manager/devcontainer-feature.json +18 -0
  57. package/features/local-secrets-manager/install.sh +127 -0
  58. package/features/project-scaffolder/devcontainer-feature.json +24 -0
  59. package/features/project-scaffolder/install.sh +100 -0
  60. package/features/team-conventions/devcontainer-feature.json +24 -0
  61. package/features/team-conventions/install.sh +93 -0
  62. package/overlays/.registry/README.md +14 -0
  63. package/overlays/.registry/base-images.yml +26 -0
  64. package/overlays/.registry/base-templates.yml +7 -0
  65. package/overlays/README.md +155 -0
  66. package/overlays/alertmanager/.env.example +5 -0
  67. package/overlays/alertmanager/README.md +465 -0
  68. package/overlays/alertmanager/alert-rules.yml +56 -0
  69. package/overlays/alertmanager/alertmanager.yml +42 -0
  70. package/overlays/alertmanager/devcontainer.patch.json +12 -0
  71. package/overlays/alertmanager/docker-compose.yml +20 -0
  72. package/overlays/alertmanager/overlay.yml +17 -0
  73. package/overlays/alertmanager/setup.sh +53 -0
  74. package/overlays/alertmanager/verify.sh +31 -0
  75. package/overlays/aws-cli/README.md +473 -0
  76. package/overlays/aws-cli/devcontainer.patch.json +13 -0
  77. package/overlays/aws-cli/overlay.yml +13 -0
  78. package/overlays/azure-cli/README.md +551 -0
  79. package/overlays/azure-cli/devcontainer.patch.json +8 -0
  80. package/overlays/azure-cli/overlay.yml +13 -0
  81. package/overlays/bun/README.md +312 -0
  82. package/overlays/bun/devcontainer.patch.json +41 -0
  83. package/overlays/bun/overlay.yml +16 -0
  84. package/overlays/bun/setup.sh +79 -0
  85. package/overlays/bun/verify.sh +30 -0
  86. package/overlays/codex/README.md +128 -0
  87. package/overlays/codex/devcontainer.patch.json +3 -0
  88. package/overlays/codex/overlay.yml +14 -0
  89. package/overlays/codex/setup.sh +24 -0
  90. package/overlays/codex/verify.sh +30 -0
  91. package/overlays/commitlint/README.md +333 -0
  92. package/overlays/commitlint/devcontainer.patch.json +8 -0
  93. package/overlays/commitlint/overlay.yml +16 -0
  94. package/overlays/commitlint/setup.sh +234 -0
  95. package/overlays/direnv/README.md +504 -0
  96. package/overlays/direnv/devcontainer.patch.json +6 -0
  97. package/overlays/direnv/overlay.yml +13 -0
  98. package/overlays/direnv/setup.sh +139 -0
  99. package/overlays/docker-in-docker/README.md +534 -0
  100. package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
  101. package/overlays/docker-in-docker/overlay.yml +13 -0
  102. package/overlays/docker-sock/README.md +256 -0
  103. package/overlays/docker-sock/devcontainer.patch.json +9 -0
  104. package/overlays/docker-sock/docker-compose.yml +8 -0
  105. package/overlays/docker-sock/overlay.yml +13 -0
  106. package/overlays/dotnet/README.md +147 -0
  107. package/overlays/dotnet/devcontainer.patch.json +51 -0
  108. package/overlays/dotnet/global-tools.txt +24 -0
  109. package/overlays/dotnet/overlay.yml +13 -0
  110. package/overlays/dotnet/setup.sh +51 -0
  111. package/overlays/dotnet/verify.sh +26 -0
  112. package/overlays/gcloud/README.md +269 -0
  113. package/overlays/gcloud/devcontainer.patch.json +14 -0
  114. package/overlays/gcloud/overlay.yml +14 -0
  115. package/overlays/gcloud/verify.sh +52 -0
  116. package/overlays/git-helpers/README.md +168 -0
  117. package/overlays/git-helpers/devcontainer.patch.json +33 -0
  118. package/overlays/git-helpers/overlay.yml +15 -0
  119. package/overlays/git-helpers/setup.sh +91 -0
  120. package/overlays/go/README.md +293 -0
  121. package/overlays/go/devcontainer.patch.json +43 -0
  122. package/overlays/go/overlay.yml +15 -0
  123. package/overlays/go/setup.sh +33 -0
  124. package/overlays/go/verify.sh +40 -0
  125. package/overlays/grafana/.env.example +9 -0
  126. package/overlays/grafana/README.md +462 -0
  127. package/overlays/grafana/dashboard-provider.yml +11 -0
  128. package/overlays/grafana/dashboards/observability-overview.json +263 -0
  129. package/overlays/grafana/devcontainer.patch.json +12 -0
  130. package/overlays/grafana/docker-compose.yml +27 -0
  131. package/overlays/grafana/grafana-datasources.yml +57 -0
  132. package/overlays/grafana/overlay.yml +21 -0
  133. package/overlays/grafana/verify.sh +34 -0
  134. package/overlays/jaeger/.env.example +7 -0
  135. package/overlays/jaeger/README.md +867 -0
  136. package/overlays/jaeger/devcontainer.patch.json +12 -0
  137. package/overlays/jaeger/docker-compose.yml +17 -0
  138. package/overlays/jaeger/overlay.yml +19 -0
  139. package/overlays/java/README.md +267 -0
  140. package/overlays/java/devcontainer.patch.json +44 -0
  141. package/overlays/java/overlay.yml +16 -0
  142. package/overlays/java/setup.sh +41 -0
  143. package/overlays/java/verify.sh +42 -0
  144. package/overlays/just/README.md +443 -0
  145. package/overlays/just/devcontainer.patch.json +3 -0
  146. package/overlays/just/overlay.yml +13 -0
  147. package/overlays/just/setup.sh +182 -0
  148. package/overlays/kubectl-helm/README.md +660 -0
  149. package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
  150. package/overlays/kubectl-helm/overlay.yml +13 -0
  151. package/overlays/loki/.env.example +5 -0
  152. package/overlays/loki/README.md +1156 -0
  153. package/overlays/loki/devcontainer.patch.json +12 -0
  154. package/overlays/loki/docker-compose.yml +18 -0
  155. package/overlays/loki/loki-config.yaml +45 -0
  156. package/overlays/loki/overlay.yml +17 -0
  157. package/overlays/minio/.env.example +9 -0
  158. package/overlays/minio/README.md +639 -0
  159. package/overlays/minio/devcontainer.patch.json +30 -0
  160. package/overlays/minio/docker-compose.yml +28 -0
  161. package/overlays/minio/overlay.yml +18 -0
  162. package/overlays/minio/setup.sh +61 -0
  163. package/overlays/minio/verify.sh +64 -0
  164. package/overlays/mkdocs/README.md +309 -0
  165. package/overlays/mkdocs/devcontainer.patch.json +24 -0
  166. package/overlays/mkdocs/overlay.yml +15 -0
  167. package/overlays/modern-cli-tools/README.md +556 -0
  168. package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
  169. package/overlays/modern-cli-tools/overlay.yml +13 -0
  170. package/overlays/modern-cli-tools/setup.sh +153 -0
  171. package/overlays/mongodb/.env.example +9 -0
  172. package/overlays/mongodb/README.md +481 -0
  173. package/overlays/mongodb/devcontainer.patch.json +32 -0
  174. package/overlays/mongodb/docker-compose.yml +44 -0
  175. package/overlays/mongodb/overlay.yml +17 -0
  176. package/overlays/mongodb/verify.sh +48 -0
  177. package/overlays/mysql/.env.example +11 -0
  178. package/overlays/mysql/README.md +542 -0
  179. package/overlays/mysql/devcontainer.patch.json +34 -0
  180. package/overlays/mysql/docker-compose.yml +55 -0
  181. package/overlays/mysql/overlay.yml +16 -0
  182. package/overlays/mysql/verify.sh +48 -0
  183. package/overlays/nats/.env.example +5 -0
  184. package/overlays/nats/README.md +762 -0
  185. package/overlays/nats/devcontainer.patch.json +24 -0
  186. package/overlays/nats/docker-compose.yml +31 -0
  187. package/overlays/nats/overlay.yml +18 -0
  188. package/overlays/nats/verify.sh +50 -0
  189. package/overlays/ngrok/README.md +503 -0
  190. package/overlays/ngrok/devcontainer.patch.json +3 -0
  191. package/overlays/ngrok/overlay.yml +14 -0
  192. package/overlays/ngrok/setup.sh +125 -0
  193. package/overlays/nodejs/README.md +192 -0
  194. package/overlays/nodejs/devcontainer.patch.json +49 -0
  195. package/overlays/nodejs/global-packages.txt +16 -0
  196. package/overlays/nodejs/overlay.yml +14 -0
  197. package/overlays/nodejs/setup.sh +46 -0
  198. package/overlays/nodejs/verify.sh +32 -0
  199. package/overlays/otel-collector/.env.example +9 -0
  200. package/overlays/otel-collector/README.md +1257 -0
  201. package/overlays/otel-collector/devcontainer.patch.json +28 -0
  202. package/overlays/otel-collector/docker-compose.yml +22 -0
  203. package/overlays/otel-collector/otel-collector-config.yaml +68 -0
  204. package/overlays/otel-collector/overlay.yml +21 -0
  205. package/overlays/otel-collector/setup.sh +49 -0
  206. package/overlays/otel-demo-nodejs/.env.example +2 -0
  207. package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
  208. package/overlays/otel-demo-nodejs/README.md +409 -0
  209. package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
  210. package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
  211. package/overlays/otel-demo-nodejs/overlay.yml +23 -0
  212. package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
  213. package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
  214. package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
  215. package/overlays/otel-demo-nodejs/verify.sh +31 -0
  216. package/overlays/otel-demo-python/.env.example +2 -0
  217. package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
  218. package/overlays/otel-demo-python/README.md +82 -0
  219. package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
  220. package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
  221. package/overlays/otel-demo-python/docker-compose.yml +19 -0
  222. package/overlays/otel-demo-python/overlay.yml +23 -0
  223. package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
  224. package/overlays/otel-demo-python/verify.sh +31 -0
  225. package/overlays/playwright/README.md +629 -0
  226. package/overlays/playwright/devcontainer.patch.json +9 -0
  227. package/overlays/playwright/overlay.yml +13 -0
  228. package/overlays/postgres/.env.example +6 -0
  229. package/overlays/postgres/README.md +602 -0
  230. package/overlays/postgres/devcontainer.patch.json +21 -0
  231. package/overlays/postgres/docker-compose.yml +22 -0
  232. package/overlays/postgres/overlay.yml +15 -0
  233. package/overlays/postgres/verify.sh +45 -0
  234. package/overlays/powershell/README.md +314 -0
  235. package/overlays/powershell/devcontainer.patch.json +22 -0
  236. package/overlays/powershell/overlay.yml +13 -0
  237. package/overlays/powershell/setup.sh +29 -0
  238. package/overlays/powershell/verify.sh +38 -0
  239. package/overlays/pre-commit/README.md +263 -0
  240. package/overlays/pre-commit/devcontainer.patch.json +9 -0
  241. package/overlays/pre-commit/overlay.yml +16 -0
  242. package/overlays/pre-commit/setup.sh +129 -0
  243. package/overlays/presets/docs-site.yml +118 -0
  244. package/overlays/presets/fullstack.yml +181 -0
  245. package/overlays/presets/microservice.yml +118 -0
  246. package/overlays/presets/web-api.yml +109 -0
  247. package/overlays/prometheus/.env.example +5 -0
  248. package/overlays/prometheus/README.md +1246 -0
  249. package/overlays/prometheus/devcontainer.patch.json +12 -0
  250. package/overlays/prometheus/docker-compose.yml +22 -0
  251. package/overlays/prometheus/overlay.yml +17 -0
  252. package/overlays/prometheus/prometheus.yml +12 -0
  253. package/overlays/prometheus/verify.sh +34 -0
  254. package/overlays/promtail/.env.example +2 -0
  255. package/overlays/promtail/README.md +357 -0
  256. package/overlays/promtail/devcontainer.patch.json +5 -0
  257. package/overlays/promtail/docker-compose.yml +16 -0
  258. package/overlays/promtail/overlay.yml +17 -0
  259. package/overlays/promtail/promtail-config.yaml +60 -0
  260. package/overlays/promtail/verify.sh +31 -0
  261. package/overlays/pulumi/README.md +472 -0
  262. package/overlays/pulumi/devcontainer.patch.json +13 -0
  263. package/overlays/pulumi/overlay.yml +14 -0
  264. package/overlays/pulumi/verify.sh +31 -0
  265. package/overlays/python/README.md +919 -0
  266. package/overlays/python/devcontainer.patch.json +41 -0
  267. package/overlays/python/overlay.yml +12 -0
  268. package/overlays/python/requirements-overlay.txt +13 -0
  269. package/overlays/python/setup.sh +47 -0
  270. package/overlays/python/verify.sh +32 -0
  271. package/overlays/rabbitmq/.env.example +7 -0
  272. package/overlays/rabbitmq/README.md +680 -0
  273. package/overlays/rabbitmq/devcontainer.patch.json +28 -0
  274. package/overlays/rabbitmq/docker-compose.yml +30 -0
  275. package/overlays/rabbitmq/overlay.yml +18 -0
  276. package/overlays/rabbitmq/verify.sh +41 -0
  277. package/overlays/redis/.env.example +4 -0
  278. package/overlays/redis/README.md +776 -0
  279. package/overlays/redis/devcontainer.patch.json +21 -0
  280. package/overlays/redis/docker-compose.yml +21 -0
  281. package/overlays/redis/overlay.yml +15 -0
  282. package/overlays/redis/verify.sh +41 -0
  283. package/overlays/redpanda/.env.example +10 -0
  284. package/overlays/redpanda/README.md +703 -0
  285. package/overlays/redpanda/devcontainer.patch.json +37 -0
  286. package/overlays/redpanda/docker-compose.yml +67 -0
  287. package/overlays/redpanda/overlay.yml +21 -0
  288. package/overlays/redpanda/verify.sh +48 -0
  289. package/overlays/rust/README.md +299 -0
  290. package/overlays/rust/devcontainer.patch.json +39 -0
  291. package/overlays/rust/overlay.yml +15 -0
  292. package/overlays/rust/setup.sh +36 -0
  293. package/overlays/rust/verify.sh +51 -0
  294. package/overlays/sqlite/README.md +584 -0
  295. package/overlays/sqlite/devcontainer.patch.json +14 -0
  296. package/overlays/sqlite/overlay.yml +15 -0
  297. package/overlays/sqlite/setup.sh +27 -0
  298. package/overlays/sqlite/verify.sh +43 -0
  299. package/overlays/sqlserver/.env.example +6 -0
  300. package/overlays/sqlserver/README.md +592 -0
  301. package/overlays/sqlserver/devcontainer.patch.json +22 -0
  302. package/overlays/sqlserver/docker-compose.yml +32 -0
  303. package/overlays/sqlserver/overlay.yml +17 -0
  304. package/overlays/sqlserver/verify.sh +30 -0
  305. package/overlays/tempo/.env.example +5 -0
  306. package/overlays/tempo/README.md +273 -0
  307. package/overlays/tempo/devcontainer.patch.json +12 -0
  308. package/overlays/tempo/docker-compose.yml +20 -0
  309. package/overlays/tempo/overlay.yml +20 -0
  310. package/overlays/tempo/tempo-config.yaml +32 -0
  311. package/overlays/tempo/verify.sh +31 -0
  312. package/overlays/terraform/README.md +389 -0
  313. package/overlays/terraform/devcontainer.patch.json +15 -0
  314. package/overlays/terraform/overlay.yml +14 -0
  315. package/overlays/terraform/verify.sh +63 -0
  316. package/package.json +74 -0
  317. package/templates/README.md +285 -0
  318. package/templates/compose/.devcontainer/devcontainer.json +46 -0
  319. package/templates/compose/.devcontainer/docker-compose.yml +12 -0
  320. package/templates/compose/README.md +20 -0
  321. package/templates/plain/.devcontainer/devcontainer.json +35 -0
  322. package/templates/plain/README.md +21 -0
  323. package/tool/README.md +281 -0
  324. package/tool/schema/base-images.schema.json +43 -0
  325. package/tool/schema/base-templates.schema.json +34 -0
  326. package/tool/schema/config.schema.json +71 -0
  327. package/tool/schema/overlay-manifest.schema.json +86 -0
@@ -0,0 +1,498 @@
1
+ # Presets Architecture
2
+
3
+ This document describes the design and architecture of the presets system (meta-overlays) in Container Superposition.
4
+
5
+ ## Overview
6
+
7
+ Presets are **meta-overlays** that represent pre-configured combinations of overlays for common development scenarios. They provide:
8
+
9
+ - **Faster onboarding** - Complete stacks ready in seconds
10
+ - **Best practices** - Sensible defaults and proper service integration
11
+ - **Flexibility** - Full customization after preset selection
12
+ - **Education** - Learn from working examples
13
+
14
+ ## Architecture
15
+
16
+ ### Core Concepts
17
+
18
+ 1. **Meta-Overlay**: A special type of overlay that selects other overlays rather than adding features directly
19
+ 2. **User Choices**: Interactive prompts within a preset for customization (e.g., language selection)
20
+ 3. **Glue Configuration**: Environment variables and configuration that wire services together
21
+ 4. **Preset Expansion**: The process of converting a preset selection into concrete overlay selections
22
+
23
+ ### Type System
24
+
25
+ ```typescript
26
+ interface MetaOverlay {
27
+ // Basic metadata (inherited from Overlay)
28
+ id: string;
29
+ name: string;
30
+ description: string;
31
+ type: 'meta';
32
+ category: 'preset';
33
+
34
+ // Preset-specific configuration
35
+ selects: {
36
+ // Always-included overlays
37
+ required: string[];
38
+
39
+ // Interactive user choices
40
+ userChoice?: Record<string, PresetUserChoice>;
41
+ };
42
+
43
+ // Service integration configuration
44
+ glueConfig?: PresetGlueConfig;
45
+ }
46
+
47
+ interface PresetUserChoice {
48
+ id: string;
49
+ prompt: string;
50
+ options: string[];
51
+ defaultOption?: string;
52
+ }
53
+
54
+ interface PresetGlueConfig {
55
+ // Environment variables for service integration
56
+ environment?: Record<string, string>;
57
+
58
+ // Suggested port mappings
59
+ portMappings?: Record<string, number>;
60
+
61
+ // Usage guide for generated environment
62
+ readme?: string;
63
+ }
64
+ ```
65
+
66
+ ### Preset File Structure
67
+
68
+ Presets are defined in `overlays/presets/` with YAML files:
69
+
70
+ ```yaml
71
+ # overlays/presets/web-api.yml
72
+ id: web-api
73
+ name: Web API Stack
74
+ description: Full-stack web API with database, cache, and observability
75
+ type: meta
76
+ category: preset
77
+ supports: [compose]
78
+ tags: [preset, web, api, database]
79
+
80
+ selects:
81
+ # Always included
82
+ required:
83
+ - postgres
84
+ - redis
85
+ - otel-collector
86
+ - prometheus
87
+ - grafana
88
+ - loki
89
+
90
+ # User chooses language
91
+ userChoice:
92
+ language:
93
+ id: language
94
+ prompt: 'Select your backend language'
95
+ options: [dotnet, nodejs, python, go, java]
96
+ defaultOption: nodejs
97
+
98
+ glueConfig:
99
+ environment:
100
+ DATABASE_URL: 'postgresql://postgres:postgres@postgres:5432/app'
101
+ REDIS_URL: 'redis://redis:6379'
102
+ OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel-collector:4318'
103
+
104
+ portMappings:
105
+ api: 8000
106
+ grafana: 3000
107
+
108
+ readme: |
109
+ # Web API Stack
110
+
111
+ Your API service should expose port 8000.
112
+
113
+ ## Services
114
+ - Grafana: http://localhost:3000 (admin/admin)
115
+ - PostgreSQL: localhost:5432
116
+ - Redis: localhost:6379
117
+ ```
118
+
119
+ ### Composition Flow
120
+
121
+ The preset system integrates into the existing composition pipeline:
122
+
123
+ ```txt
124
+ 1. User selects preset (or chooses custom)
125
+
126
+ 2. Preset presents user choices (if any)
127
+
128
+ 3. Preset expands to overlay list
129
+
130
+ 4. Optional: User can customize overlay selection
131
+
132
+ 5. Dependency resolution runs
133
+
134
+ 6. Conflict detection runs
135
+
136
+ 7. Normal overlay composition
137
+
138
+ 8. Glue configuration applied
139
+
140
+ 9. Preset README generated
141
+ ```
142
+
143
+ ### Integration Points
144
+
145
+ #### 1. Questionnaire (scripts/init.ts)
146
+
147
+ ```typescript
148
+ // 1. Preset selection
149
+ const mode = await select({
150
+ message: 'How would you like to start?',
151
+ choices: [
152
+ { value: 'preset', name: 'Start from preset' },
153
+ { value: 'custom', name: 'Custom configuration' },
154
+ ],
155
+ });
156
+
157
+ if (mode === 'preset') {
158
+ // 2. Load preset
159
+ const preset = await loadPreset(presetId);
160
+
161
+ // 3. Handle user choices
162
+ for (const [key, choice] of Object.entries(preset.selects.userChoice)) {
163
+ const answer = await select({
164
+ message: choice.prompt,
165
+ choices: choice.options,
166
+ default: choice.defaultOption,
167
+ });
168
+ answers.presetChoices[key] = answer;
169
+ }
170
+
171
+ // 4. Expand preset to overlays
172
+ const selectedOverlays = [...preset.selects.required, ...Object.values(answers.presetChoices)];
173
+
174
+ // 5. Optional customization
175
+ const customize = await confirm({
176
+ message: 'Customize overlay selection?',
177
+ default: false,
178
+ });
179
+ }
180
+ ```
181
+
182
+ #### 2. Composer (tool/questionnaire/composer.ts)
183
+
184
+ ```typescript
185
+ // Apply glue configuration after all overlays
186
+ async function applyGlueConfig(glueConfig: PresetGlueConfig, envPath: string, outputPath: string) {
187
+ // 1. Inject environment variables
188
+ if (glueConfig.environment) {
189
+ const envContent = [];
190
+ envContent.push('# Preset Configuration');
191
+ for (const [key, value] of Object.entries(glueConfig.environment)) {
192
+ envContent.push(`${key}=${value}`);
193
+ }
194
+ await fs.promises.appendFile(envPath, envContent.join('\n'));
195
+ }
196
+
197
+ // 2. Log port mappings
198
+ if (glueConfig.portMappings) {
199
+ console.log('Suggested port mappings:');
200
+ for (const [service, port] of Object.entries(glueConfig.portMappings)) {
201
+ console.log(` ${service}: ${port}`);
202
+ }
203
+ }
204
+
205
+ // 3. Generate preset README
206
+ if (glueConfig.readme) {
207
+ await fs.promises.writeFile(path.join(outputPath, 'PRESET-README.md'), glueConfig.readme);
208
+ }
209
+ }
210
+ ```
211
+
212
+ #### 3. Manifest (superposition.json)
213
+
214
+ ```json
215
+ {
216
+ "version": "0.1.0",
217
+ "generatedAt": "2026-02-08T10:00:00Z",
218
+ "baseTemplate": "compose",
219
+
220
+ "preset": "web-api",
221
+ "presetChoices": {
222
+ "language": "nodejs"
223
+ },
224
+
225
+ "overlays": ["nodejs", "postgres", "redis", "otel-collector", "prometheus", "grafana", "loki"]
226
+ }
227
+ ```
228
+
229
+ ## Preset Design Patterns
230
+
231
+ ### 1. Full-Stack Preset
232
+
233
+ Includes frontend, backend, data, and observability layers:
234
+
235
+ ```yaml
236
+ selects:
237
+ required:
238
+ - nodejs # Frontend
239
+ - postgres # Database
240
+ - redis # Cache
241
+ - minio # Object storage
242
+ - otel-collector # Observability
243
+ - prometheus
244
+ - grafana
245
+ - loki
246
+
247
+ userChoice:
248
+ backend:
249
+ prompt: 'Select backend language'
250
+ options: [dotnet, python, go, java]
251
+ ```
252
+
253
+ ### 2. Microservices Preset
254
+
255
+ Focuses on service-to-service communication:
256
+
257
+ ```yaml
258
+ selects:
259
+ required:
260
+ - otel-collector
261
+ - jaeger
262
+ - prometheus
263
+ - grafana
264
+
265
+ userChoice:
266
+ language:
267
+ options: [dotnet, nodejs, python, go, java]
268
+ messaging:
269
+ prompt: 'Select message broker'
270
+ options: [rabbitmq, redpanda, nats]
271
+ ```
272
+
273
+ ### 3. Documentation Preset
274
+
275
+ Single-purpose, no user choices:
276
+
277
+ ```yaml
278
+ selects:
279
+ required:
280
+ - mkdocs
281
+ - pre-commit
282
+ - modern-cli-tools
283
+
284
+ # No user choices - fully pre-configured
285
+
286
+ glueConfig:
287
+ readme: |
288
+ # Documentation Site
289
+
290
+ Run: mkdocs serve
291
+ Build: mkdocs build
292
+ ```
293
+
294
+ ## Glue Configuration Design
295
+
296
+ ### Purpose
297
+
298
+ Glue configuration solves the "integration gap" where users must:
299
+
300
+ 1. Know service hostnames (e.g., `postgres` not `localhost`)
301
+ 2. Configure connection strings
302
+ 3. Set up environment variables
303
+ 4. Understand port mappings
304
+
305
+ ### Environment Variables
306
+
307
+ **Pattern**: Pre-configured connection strings using service names
308
+
309
+ ```yaml
310
+ glueConfig:
311
+ environment:
312
+ # Database
313
+ DATABASE_URL: 'postgresql://postgres:postgres@postgres:5432/app'
314
+ POSTGRES_HOST: 'postgres'
315
+ POSTGRES_PORT: '5432'
316
+
317
+ # Cache
318
+ REDIS_URL: 'redis://redis:6379'
319
+
320
+ # Messaging
321
+ RABBITMQ_URL: 'amqp://guest:guest@rabbitmq:5672'
322
+
323
+ # Observability
324
+ OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel-collector:4318'
325
+ JAEGER_AGENT_HOST: 'jaeger'
326
+ ```
327
+
328
+ **Implementation**: Appended to `.env.example` with clear section marker:
329
+
330
+ ```bash
331
+ # Preset Configuration
332
+ DATABASE_URL=postgresql://postgres:postgres@postgres:5432/app
333
+ REDIS_URL=redis://redis:6379
334
+ ```
335
+
336
+ ### Port Mappings
337
+
338
+ **Pattern**: Informational suggestions for service exposure
339
+
340
+ ```yaml
341
+ glueConfig:
342
+ portMappings:
343
+ api: 8000
344
+ grafana: 3000
345
+ jaeger: 16686
346
+ ```
347
+
348
+ **Purpose**: Help users understand:
349
+
350
+ - Which ports their application should use
351
+ - Where to access web UIs
352
+ - How services are exposed to the host
353
+
354
+ ### README Generation
355
+
356
+ **Pattern**: Quick-start guide for the generated environment
357
+
358
+ ```yaml
359
+ glueConfig:
360
+ readme: |
361
+ # [Preset Name]
362
+
363
+ ## Services
364
+ - [Service 1]: [URL] ([credentials])
365
+ - [Service 2]: [URL]
366
+
367
+ ## Connection Strings
368
+ See .env.example for pre-configured values.
369
+
370
+ ## Quick Start
371
+ 1. [Step 1]
372
+ 2. [Step 2]
373
+
374
+ ## Next Steps
375
+ - [Suggestion 1]
376
+ - [Suggestion 2]
377
+ ```
378
+
379
+ **Output**: `PRESET-README.md` in project root alongside `superposition.json`
380
+
381
+ ## Dependency Resolution
382
+
383
+ Presets participate in normal dependency resolution:
384
+
385
+ 1. **Preset overlays expand** before dependency resolution
386
+ 2. **Dependencies auto-added** for all preset overlays
387
+ 3. **Conflicts detected** across all selected overlays
388
+ 4. **User resolves conflicts** same as custom configuration
389
+
390
+ **Example:**
391
+
392
+ ```yaml
393
+ # Preset selects grafana
394
+ selects:
395
+ required:
396
+ - grafana
397
+
398
+ # Grafana requires prometheus
399
+ # overlays/index.yml
400
+ - id: grafana
401
+ requires: [prometheus]
402
+
403
+ # Result: Both grafana AND prometheus included
404
+ ```
405
+
406
+ ## Extensibility
407
+
408
+ ### Adding New Presets
409
+
410
+ 1. **Create YAML file** in `overlays/presets/`
411
+ 2. **Register in** `overlays/index.yml`
412
+ 3. **No code changes needed** (declarative system)
413
+
414
+ **Validation**:
415
+
416
+ - Schema defined in `tool/schema/types.ts`
417
+ - Tests in `tool/__tests__/presets.test.ts`
418
+
419
+ ### Custom User Choices
420
+
421
+ User choices can select from any overlay in the same category:
422
+
423
+ ```yaml
424
+ userChoice:
425
+ language:
426
+ prompt: 'Select language'
427
+ options: [dotnet, nodejs, python, go, java, rust]
428
+
429
+ database:
430
+ prompt: 'Select database'
431
+ options: [postgres, mysql, mongodb, sqlserver]
432
+
433
+ messaging:
434
+ prompt: 'Select message broker'
435
+ options: [rabbitmq, redpanda, nats]
436
+ ```
437
+
438
+ ## Benefits
439
+
440
+ ### For New Users
441
+
442
+ - **Lower barrier to entry** - Don't need to know all overlays
443
+ - **Proven configurations** - Working examples to learn from
444
+ - **Faster success** - Complete stack in seconds
445
+
446
+ ### For Power Users
447
+
448
+ - **Starting points** - Customize presets rather than start from scratch
449
+ - **Consistency** - Team-wide standard configurations
450
+ - **Time savings** - Common patterns codified
451
+
452
+ ### For Maintainers
453
+
454
+ - **Best practices** - Demonstrate proper overlay combinations
455
+ - **Reduced support** - Fewer "how do I configure X?" questions
456
+ - **Showcase features** - Highlight observability, glue config, etc.
457
+
458
+ ## Limitations and Trade-offs
459
+
460
+ ### Current Limitations
461
+
462
+ 1. **CLI mode**: Presets not directly accessible via `--preset` flag (planned)
463
+ 2. **Interactive only**: Requires TTY for user choices
464
+ 3. **No validation**: Preset YAML files not schema-validated (yet)
465
+
466
+ ### Design Trade-offs
467
+
468
+ 1. **Flexibility vs Simplicity**: Presets add complexity but solve real onboarding problems
469
+ 2. **Opinionated vs Flexible**: Presets are opinionated but remain fully customizable
470
+ 3. **Maintenance burden**: More presets = more to maintain (balanced by declarative YAML)
471
+
472
+ ## Future Enhancements
473
+
474
+ ### CLI Preset Support
475
+
476
+ ```bash
477
+ container-superposition --preset web-api --preset-choice language=nodejs
478
+ ```
479
+
480
+ ### More Presets
481
+
482
+ - **data-science**: Python, Jupyter, visualization
483
+ - **mobile-backend**: Auth, storage, push notifications
484
+ - **iot**: MQTT, time-series database, edge computing
485
+ - **ml-training**: GPU support, frameworks, experiment tracking
486
+
487
+ ### Preset Marketplace
488
+
489
+ - Community-contributed presets
490
+ - Preset discovery and search
491
+ - Rating and versioning
492
+
493
+ ## See Also
494
+
495
+ - [Presets User Guide](presets.md) - User-facing documentation
496
+ - [Overlay Index](../overlays/index.yml) - Preset registrations
497
+ - [Creating Overlays](creating-overlays.md) - How to create presets
498
+ - [Dependencies](dependencies.md) - Dependency resolution system