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
package/docs/README.md ADDED
@@ -0,0 +1,308 @@
1
+ # Container Superposition Documentation
2
+
3
+ Complete documentation for the container-superposition devcontainer scaffolding system.
4
+
5
+ ## 📚 Documentation Index
6
+
7
+ ### Getting Started
8
+
9
+ - **[Publishing Guide](publishing.md)** - How to publish to npm and make the tool publicly available
10
+ - **[Quick Reference](quick-reference.md)** - Quick lookup for templates, overlays, ports, and commands
11
+ - **[Examples](examples.md)** - Common usage patterns and real-world scenarios
12
+
13
+ ### Architecture & Design
14
+
15
+ - **[Architecture](architecture.md)** - Design principles, composition algorithm, and deep merge logic
16
+ - **[Presets Architecture](presets-architecture.md)** - Meta-overlay design and preset system architecture
17
+ - **[Dependencies](dependencies.md)** - Service dependencies, startup order, and runServices configuration
18
+ - **[UX Design](ux.md)** - Visual design, CLI enhancements, and accessibility features
19
+
20
+ ### User Guides
21
+
22
+ - **[Presets Guide](presets.md)** - Using stack presets for common development scenarios
23
+ - **[Messaging Comparison](messaging-comparison.md)** - Choosing between RabbitMQ, Redpanda, and NATS
24
+ - **[Messaging Quick Start](messaging-quick-start.md)** - Getting started with messaging overlays
25
+ - **[Observability Workflow](observability-workflow.md)** - Setting up monitoring and tracing
26
+
27
+ ### Development
28
+
29
+ - **[Creating Overlays](creating-overlays.md)** - Complete guide to creating new overlays
30
+ - **[Contributing](../CONTRIBUTING.md)** - Contribution guidelines and development workflow
31
+ - **[AGENTS.md](../AGENTS.md)** - Comprehensive guide for AI coding agents
32
+
33
+ ## 🎯 Quick Start
34
+
35
+ ### For Users
36
+
37
+ ```bash
38
+ # Interactive mode (recommended)
39
+ npx container-superposition init
40
+
41
+ # Non-interactive mode
42
+ npx container-superposition init --stack compose --language nodejs --database postgres
43
+ ```
44
+
45
+ ### For Contributors
46
+
47
+ ```bash
48
+ # Clone and setup
49
+ git clone https://github.com/veggerby/container-superposition.git
50
+ cd container-superposition
51
+ npm install
52
+
53
+ # Run in development mode
54
+ npm run init
55
+
56
+ # Build and test
57
+ npm run build
58
+ npm test
59
+ ```
60
+
61
+ ## 📖 Core Concepts
62
+
63
+ ### Base Templates
64
+
65
+ Minimal starting points for devcontainer configurations:
66
+
67
+ - **plain** - Simple single-image devcontainer
68
+ - **compose** - Docker Compose-based for multi-service setups
69
+
70
+ Located in `templates/`
71
+
72
+ ### Overlays
73
+
74
+ Composable capability modules organized by category:
75
+
76
+ **Languages & Frameworks:**
77
+
78
+ - dotnet, nodejs, python, mkdocs
79
+
80
+ **Databases:**
81
+
82
+ - postgres, redis
83
+
84
+ **Observability:**
85
+
86
+ - otel-collector, jaeger, prometheus, grafana, loki
87
+
88
+ **Cloud Tools:**
89
+
90
+ - aws-cli, azure-cli, kubectl-helm
91
+
92
+ **Dev Tools:**
93
+
94
+ - docker-in-docker, docker-sock, playwright, codex, git-helpers, pre-commit, commitlint, just, direnv, modern-cli-tools, ngrok
95
+
96
+ Located in `overlays/`
97
+
98
+ ### Composition
99
+
100
+ The tool uses a deep merge strategy to combine:
101
+
102
+ 1. Base template
103
+ 2. Selected overlays (in category order)
104
+ 3. User preferences (port offsets, custom paths)
105
+
106
+ Output: Standard `.devcontainer/` folder with editable JSON/YAML files
107
+
108
+ ## 🔧 Architecture Overview
109
+
110
+ ```mermaid
111
+ graph TD
112
+ A[User Input<br/>CLI/Interactive] --> B[Dependency Resolution<br/>requires/suggests]
113
+ B --> C[Conflict Detection<br/>conflicts field]
114
+ C --> D[Composition<br/>Deep Merge]
115
+ D --> E[Output<br/>.devcontainer/]
116
+ ```
117
+
118
+ ## 📁 Output Structure
119
+
120
+ After running the tool:
121
+
122
+ ```txt
123
+ .devcontainer/
124
+ ├── devcontainer.json # Main configuration
125
+ ├── docker-compose.yml # Base compose file (if using compose)
126
+ ├── .env.example # Environment variables
127
+ ├── superposition.json # Generation metadata
128
+ ├── scripts/ # Setup scripts
129
+ │ ├── setup-*.sh # Overlay-specific setup
130
+ │ └── ...
131
+ ├── verify-*.sh # Service verification scripts
132
+ └── [overlay-specific files] # Config files from overlays
133
+ ```
134
+
135
+ ## 🎨 Key Features
136
+
137
+ ### Dependency Resolution
138
+
139
+ Overlays can declare relationships:
140
+
141
+ ```yaml
142
+ - id: grafana
143
+ requires: [prometheus] # Auto-added when grafana selected
144
+ suggests: [loki, jaeger] # Recommended but optional
145
+ conflicts: [] # Cannot be used together
146
+ ```
147
+
148
+ ### Conflict Detection
149
+
150
+ Prevents incompatible combinations:
151
+
152
+ ```yaml
153
+ - id: docker-in-docker
154
+ conflicts: [docker-sock] # Only one Docker access method allowed
155
+ ```
156
+
157
+ ### Port Management
158
+
159
+ Automatic port configuration with optional offset:
160
+
161
+ ```bash
162
+ # Default ports
163
+ npm run init
164
+
165
+ # Add 100 to all ports (Grafana: 3000 → 3100)
166
+ npm run init -- --port-offset 100
167
+ ```
168
+
169
+ ### Environment Variables
170
+
171
+ Merged from all selected overlays into `.env.example`:
172
+
173
+ ```bash
174
+ # PostgreSQL
175
+ POSTGRES_VERSION=16
176
+ POSTGRES_DB=devdb
177
+ POSTGRES_USER=postgres
178
+ POSTGRES_PASSWORD=postgres
179
+ POSTGRES_PORT=5432
180
+
181
+ # Redis
182
+ REDIS_VERSION=7
183
+ REDIS_PORT=6379
184
+ # REDIS_PASSWORD=your-secure-password
185
+ ```
186
+
187
+ ## 🧪 Testing
188
+
189
+ ```bash
190
+ # Unit tests
191
+ npm test
192
+
193
+ # Watch mode
194
+ npm test:watch
195
+
196
+ # Smoke tests (actual devcontainer generation)
197
+ npm run test:smoke
198
+ ```
199
+
200
+ ## 📦 Package Structure
201
+
202
+ When published to npm, includes:
203
+
204
+ - ✅ Compiled JavaScript (`dist/`)
205
+ - ✅ All templates (`templates/`)
206
+ - ✅ All overlays (`overlays/`)
207
+ - ✅ All features (`features/`)
208
+ - ✅ Configuration metadata (`overlays/index.yml`)
209
+ - ✅ Type definitions and schema (`tool/schema/`)
210
+ - ✅ Documentation
211
+
212
+ **Package size**: ~122 KB compressed, ~462 KB unpacked
213
+
214
+ ## 🤝 Contributing
215
+
216
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) for:
217
+
218
+ - Development setup
219
+ - Code style guidelines
220
+ - Pull request process
221
+ - Testing requirements
222
+
223
+ ## 📄 License
224
+
225
+ MIT - See [LICENSE](../LICENSE)
226
+
227
+ ## 🔗 Links
228
+
229
+ - **Repository**: <https://github.com/veggerby/container-superposition>
230
+ - **Issues**: <https://github.com/veggerby/container-superposition/issues>
231
+ - **npm Package**: <https://www.npmjs.com/package/container-superposition> (once published)
232
+
233
+ ## 🆘 Support
234
+
235
+ - **GitHub Issues**: Bug reports and feature requests
236
+ - **Discussions**: Questions and community support
237
+ - **Pull Requests**: Code contributions welcome
238
+
239
+ ---
240
+
241
+ **Philosophy**: Build a thin picker that outputs normal configurations, not a platform.
242
+
243
+ - Generates once, users edit forever
244
+ - No update or sync mechanisms
245
+ - No state tracking
246
+ - No proprietary formats
247
+
248
+ ### Stateless
249
+
250
+ - Each invocation is independent
251
+ - Output is deterministic
252
+ - No configuration files
253
+
254
+ ### Optional
255
+
256
+ - Templates work without the tool
257
+ - Manual copying is always an option
258
+ - Tool is convenience wrapper
259
+
260
+ ## Technology
261
+
262
+ - **Node.js/TypeScript** - Cross-platform, type-safe
263
+ - **chalk** - Terminal colors
264
+ - **boxen** - Terminal boxes
265
+ - **ora** - Progress spinners
266
+ - **commander** - CLI parsing
267
+
268
+ ## Extension
269
+
270
+ ### Add an Overlay
271
+
272
+ 1. Create `overlays/<name>/`
273
+ 2. Add `devcontainer.patch.json`
274
+ 3. Add `overlay.yml` manifest ([schema](../tool/schema/overlay-manifest.schema.json), [detailed guide](../.github/instructions/overlay-index.instructions.md))
275
+ 4. Optional: Add `docker-compose.yml`
276
+ 5. Optional: Add `README.md` documentation
277
+ 6. Update questionnaire
278
+
279
+ See [Creating Overlays Guide](creating-overlays.md) for complete instructions.
280
+
281
+ ### Add a Template
282
+
283
+ 1. Create `templates/<name>/.devcontainer/`
284
+ 2. Add complete devcontainer.json
285
+ 3. Add scripts and files
286
+ 4. Update types and questionnaire
287
+
288
+ ## Maintenance
289
+
290
+ ### Smoke Tests
291
+
292
+ ```bash
293
+ npm test
294
+ ```
295
+
296
+ ### Build
297
+
298
+ ```bash
299
+ npm run build
300
+ ```
301
+
302
+ ### Development
303
+
304
+ ```bash
305
+ npm run init
306
+ ```
307
+
308
+ Uses `tsx` for direct TypeScript execution without build step.
@@ -0,0 +1,233 @@
1
+ # Architecture
2
+
3
+ The init tool is a **thin "purpose picker"** that composes devcontainer configurations from base templates and overlays.
4
+
5
+ ## Design Principles
6
+
7
+ ### Generate Once, Edit Forever
8
+
9
+ The tool creates standard `.devcontainer/` folders that users own completely. There is no "sync" or "update" mechanism—once generated, the configuration is independent of the tool.
10
+
11
+ ### Stateless Composition
12
+
13
+ No configuration tracking, version control, or state management. Each invocation is independent and produces deterministic output based on the provided options.
14
+
15
+ ### Plain JSON Output
16
+
17
+ All output is standard `devcontainer.json` format compatible with VS Code Dev Containers and GitHub Codespaces. No proprietary schemas or custom DSLs.
18
+
19
+ ### Optional Tooling
20
+
21
+ Templates in `templates/` work standalone. The init tool is a convenience wrapper, not a requirement.
22
+
23
+ ## Directory Structure
24
+
25
+ ```
26
+ tool/
27
+ ├── docs/ # Architecture and design documentation
28
+ ├── overlays/ # Composable feature add-ons
29
+ │ ├── Language/Framework
30
+ │ │ ├── dotnet/ # .NET overlay
31
+ │ │ ├── nodejs/ # Node.js overlay
32
+ │ │ ├── python/ # Python overlay
33
+ │ │ └── mkdocs/ # MkDocs overlay
34
+ │ ├── Databases
35
+ │ │ ├── postgres/ # PostgreSQL overlay
36
+ │ │ └── redis/ # Redis overlay
37
+ │ ├── Observability
38
+ │ │ ├── otel-collector/ # OpenTelemetry Collector
39
+ │ │ ├── jaeger/ # Distributed tracing
40
+ │ │ ├── prometheus/ # Metrics collection
41
+ │ │ ├── grafana/ # Visualization
42
+ │ │ └── loki/ # Log aggregation
43
+ │ ├── Development Tools
44
+ │ │ ├── playwright/ # Browser automation
45
+ │ │ ├── aws-cli/ # AWS tools
46
+ │ │ ├── azure-cli/ # Azure tools
47
+ │ │ └── kubectl-helm/ # Kubernetes tools
48
+ ├── questionnaire/ # Composition logic
49
+ │ └── composer.ts # Deep merge engine
50
+ └── schema/ # Type definitions
51
+ ├── types.ts # TypeScript interfaces
52
+ └── config.schema.json # JSON schema
53
+
54
+ scripts/
55
+ ├── init.ts # CLI entry point
56
+ ├── test.sh # Smoke tests
57
+ └── example.js # Programmatic usage
58
+ ```
59
+
60
+ ## Composition Algorithm
61
+
62
+ ### Input Processing
63
+
64
+ 1. **Parse arguments** - Commander processes CLI flags or triggers interactive questionnaire
65
+ 2. **Validate answers** - Ensure stack exists and options are compatible
66
+ 3. **Select overlays** - Based on database, playwright, cloud tools choices
67
+
68
+ ### Template Composition
69
+
70
+ 1. **Load base template** from `templates/<stack>/.devcontainer/`
71
+ 2. **Apply overlays** sequentially using deep merge
72
+ 3. **Copy template files** (scripts, etc.) from base template
73
+ 4. **Copy overlay files** (config files, docker-compose, etc.)
74
+ 5. **Merge .env.example** files from all selected overlays
75
+ 6. **Write merged configuration** to output path
76
+
77
+ ### Deep Merge Logic
78
+
79
+ ```typescript
80
+ function deepMerge(base, overlay) {
81
+ for each key in overlay:
82
+ if key exists in base and both are objects:
83
+ if both are arrays:
84
+ concatenate and deduplicate
85
+ else:
86
+ recursively merge
87
+ else:
88
+ use overlay value
89
+ return merged
90
+ }
91
+ ```
92
+
93
+ Special handling:
94
+
95
+ - **Arrays**: Concatenate and deduplicate (ports, packages)
96
+ - **apt-get packages**: Merge space-separated lists
97
+ - **Features**: Deep merge feature configs
98
+ - **Environment variables**: Merge key-value pairs
99
+ - **Port attributes**: Merge labeled port configurations
100
+
101
+ ### File Handling per Overlay
102
+
103
+ Each overlay can contain multiple file types:
104
+
105
+ - **devcontainer.patch.json** - Merged into devcontainer.json (not copied)
106
+ - **.env.example** - Merged into combined .env.example (not copied separately)
107
+ - **docker-compose.yml** - Copied as `docker-compose.{overlay}.yml`
108
+ - **Other files/directories** - Copied as-is to output
109
+
110
+ This allows overlays to provide complete configurations with config files, scripts, and directories.
111
+
112
+ ## Workflow
113
+
114
+ ```mermaid
115
+ graph TD
116
+ A[User Input] --> B[CLI Parser Commander]
117
+ B --> C[Interactive or Non-Interactive Mode]
118
+ C --> D[QuestionnaireAnswers]
119
+ D --> E[Composer Engine]
120
+ E --> F[Load base template]
121
+ E --> G[Select overlays]
122
+ E --> H[Deep merge devcontainer configs]
123
+ E --> I[Copy template files]
124
+ E --> J[Copy overlay files]
125
+ E --> K[Merge .env.example files]
126
+ E --> L[Write output]
127
+ L --> M[.devcontainer/ folder]
128
+ ```
129
+
130
+ ## Overlay System
131
+
132
+ Each overlay is a composable package that can include multiple files:
133
+
134
+ ```
135
+ overlay-name/
136
+ ├── devcontainer.patch.json # Partial config to merge (required)
137
+ ├── docker-compose.yml # Service definition (optional)
138
+ ├── .env.example # Environment variables (optional)
139
+ └── [additional files/dirs] # Config files, scripts, etc. (optional)
140
+ ```
141
+
142
+ Overlays can add:
143
+
144
+ - Features
145
+ - Environment variables
146
+ - Port forwards
147
+ - Services (via Docker Compose)
148
+ - Package installations
149
+
150
+ ## Technology Choices
151
+
152
+ ### Node.js/TypeScript
153
+
154
+ - Cross-platform (Windows, Mac, Linux)
155
+ - Native JSON handling
156
+ - Easy npm/npx distribution
157
+ - Type safety during development
158
+
159
+ ### CLI Libraries
160
+
161
+ - **chalk** - Terminal colors for better UX
162
+ - **boxen** - Visual hierarchy with borders
163
+ - **ora** - Progress feedback
164
+ - **commander** - Robust argument parsing
165
+
166
+ ### No Framework
167
+
168
+ Deliberate choice to avoid:
169
+
170
+ - Complex build pipelines
171
+ - Runtime dependencies in output
172
+ - Learning curve for contributors
173
+ - Version coupling
174
+
175
+ ## Extension Points
176
+
177
+ ### Adding Overlays
178
+
179
+ 1. Create `overlays/<name>/`
180
+ 2. Add `overlay.yml` manifest
181
+ 3. Add `devcontainer.patch.json`
182
+ 4. Optional: Add `docker-compose.yml`
183
+ 5. Update questionnaire in `scripts/init.ts`
184
+
185
+ ### Adding Templates
186
+
187
+ 1. Create `templates/<name>/.devcontainer/`
188
+ 2. Add standard devcontainer.json
189
+ 3. Add scripts and supporting files
190
+ 4. Update types in `tool/schema/types.ts`
191
+ 5. Add questionnaire option
192
+
193
+ ## Constraints
194
+
195
+ ### What We Don't Do
196
+
197
+ - ❌ No "update" command (would require state tracking)
198
+ - ❌ No custom DSL (just standard JSON)
199
+ - ❌ No required preprocessing (templates work directly)
200
+ - ❌ No version coupling (output is independent)
201
+ - ❌ No cloud services (purely local operation)
202
+
203
+ ### Why These Constraints
204
+
205
+ These limitations keep the tool **humble** and prevent it from becoming a platform that users must learn, debug, and maintain. The tool is training wheels, not a framework.
206
+
207
+ ## Success Metrics
208
+
209
+ The tool succeeds when:
210
+
211
+ 1. Users create their first devcontainer easily
212
+ 2. Users edit output directly without the tool
213
+ 3. Users don't need the tool after initial setup
214
+ 4. Templates work independently of the tool
215
+
216
+ ## Trade-offs
217
+
218
+ ### Advantages
219
+
220
+ - Low barrier to entry
221
+ - No vendor lock-in
222
+ - Composable and extensible
223
+ - Easy to understand
224
+ - Minimal maintenance burden
225
+
226
+ ### Limitations
227
+
228
+ - No automatic updates of existing configs
229
+ - Limited validation of composed output
230
+ - Manual effort to keep overlays compatible
231
+ - No rollback mechanism
232
+
233
+ These limitations are **intentional** to prevent tool creep.