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,279 @@
1
+ # Service Dependencies and Startup Order
2
+
3
+ ## Overview
4
+
5
+ The overlay system supports service dependencies through `depends_on` in docker-compose files and `runServices` arrays in devcontainer.json. The composer must intelligently handle these when merging overlays.
6
+
7
+ ## Dependency Graph
8
+
9
+ ```
10
+ postgres, redis (base infrastructure)
11
+
12
+ jaeger, prometheus, loki (observability backends)
13
+
14
+ otel-collector (telemetry pipeline)
15
+
16
+ grafana (visualization)
17
+
18
+ devcontainer (main application)
19
+ ```
20
+
21
+ ## Service Order Hints
22
+
23
+ Overlays use `_serviceOrder` (custom field, non-standard) to indicate startup priority:
24
+
25
+ - **Order 0** (implicit): postgres, redis - base infrastructure
26
+ - **Order 1**: jaeger, prometheus, loki - observability backends
27
+ - **Order 2**: otel-collector - telemetry collection
28
+ - **Order 3**: grafana - visualization layer
29
+
30
+ The devcontainer service should start last, after all selected infrastructure.
31
+
32
+ ## Docker Compose depends_on
33
+
34
+ ### Static Dependencies (in overlay files)
35
+
36
+ Each overlay's docker-compose.yml includes ALL potential dependencies:
37
+
38
+ **otel-collector/docker-compose.yml:**
39
+
40
+ ```yaml
41
+ services:
42
+ otel-collector:
43
+ depends_on:
44
+ - jaeger
45
+ - prometheus
46
+ - loki
47
+ ```
48
+
49
+ **grafana/docker-compose.yml:**
50
+
51
+ ```yaml
52
+ services:
53
+ grafana:
54
+ depends_on:
55
+ - prometheus
56
+ - loki
57
+ - jaeger
58
+ ```
59
+
60
+ **compose/docker-compose.yml:**
61
+
62
+ ```yaml
63
+ services:
64
+ devcontainer:
65
+ depends_on:
66
+ - postgres
67
+ - redis
68
+ - otel-collector
69
+ ```
70
+
71
+ ### Composer Responsibility
72
+
73
+ The composer MUST:
74
+
75
+ 1. **Filter depends_on** - Remove dependencies for services not selected
76
+
77
+ ```javascript
78
+ // If jaeger is not selected, remove it from otel-collector's depends_on
79
+ if (!selectedOverlays.includes('jaeger')) {
80
+ delete services['otel-collector'].depends_on['jaeger'];
81
+ }
82
+ ```
83
+
84
+ 2. **Clean empty depends_on** - Remove the field if no dependencies remain
85
+
86
+ ```javascript
87
+ if (Object.keys(service.depends_on).length === 0) {
88
+ delete service.depends_on;
89
+ }
90
+ ```
91
+
92
+ 3. **Validate dependency chain** - Ensure no circular dependencies
93
+ 4. **Order docker-compose files** - Merge in dependency order to avoid forward references
94
+
95
+ ## runServices Array
96
+
97
+ The `runServices` array in devcontainer.json controls which services start automatically.
98
+
99
+ ### Overlay Definitions
100
+
101
+ Each overlay declares its service(s):
102
+
103
+ ```json
104
+ // postgres/devcontainer.patch.json
105
+ {
106
+ "runServices": ["postgres"]
107
+ }
108
+
109
+ // otel-collector/devcontainer.patch.json
110
+ {
111
+ "runServices": ["otel-collector"],
112
+ "_serviceOrder": 2
113
+ }
114
+ ```
115
+
116
+ ### Composer Merge Strategy
117
+
118
+ When merging `runServices`:
119
+
120
+ 1. **Collect all services** from base template + selected overlays
121
+ 2. **Sort by \_serviceOrder** (ascending)
122
+ 3. **Merge into single array** maintaining order
123
+ 4. **Remove duplicates** while preserving order
124
+
125
+ **Example merge:**
126
+
127
+ ```javascript
128
+ // Selected overlays: postgres, redis, jaeger, prometheus, otel-collector, grafana
129
+ const runServices = [
130
+ // Order 0 (infrastructure)
131
+ 'postgres',
132
+ 'redis',
133
+ // Order 1 (observability backends)
134
+ 'jaeger',
135
+ 'prometheus',
136
+ // Order 2 (telemetry pipeline)
137
+ 'otel-collector',
138
+ // Order 3 (visualization)
139
+ 'grafana',
140
+ ];
141
+ ```
142
+
143
+ The devcontainer service itself is NOT in runServices (it's the main service).
144
+
145
+ ## Implementation Example
146
+
147
+ ```typescript
148
+ interface Overlay {
149
+ name: string;
150
+ devcontainer: {
151
+ runServices?: string[];
152
+ _serviceOrder?: number;
153
+ };
154
+ dockerCompose?: {
155
+ services: Record<
156
+ string,
157
+ {
158
+ depends_on?: string[];
159
+ // ... other fields
160
+ }
161
+ >;
162
+ };
163
+ }
164
+
165
+ function mergeOverlays(baseTemplate: any, overlays: Overlay[]) {
166
+ const selectedServices = new Set(overlays.map((o) => o.name));
167
+ const result = { ...baseTemplate };
168
+
169
+ // 1. Merge runServices with ordering
170
+ const servicesByOrder = overlays
171
+ .flatMap((o) =>
172
+ (o.devcontainer.runServices || []).map((s) => ({
173
+ name: s,
174
+ order: o.devcontainer._serviceOrder || 0,
175
+ }))
176
+ )
177
+ .sort((a, b) => a.order - b.order);
178
+
179
+ result.runServices = [...new Set(servicesByOrder.map((s) => s.name))];
180
+
181
+ // 2. Merge docker-compose and filter depends_on
182
+ for (const overlay of overlays) {
183
+ if (!overlay.dockerCompose) continue;
184
+
185
+ for (const [serviceName, service] of Object.entries(overlay.dockerCompose.services)) {
186
+ if (service.depends_on) {
187
+ // Filter out unselected dependencies
188
+ service.depends_on = service.depends_on.filter((dep) => selectedServices.has(dep));
189
+
190
+ // Remove empty depends_on
191
+ if (service.depends_on.length === 0) {
192
+ delete service.depends_on;
193
+ }
194
+ }
195
+
196
+ // Merge service definition
197
+ result.services[serviceName] = {
198
+ ...result.services[serviceName],
199
+ ...service,
200
+ };
201
+ }
202
+ }
203
+
204
+ return result;
205
+ }
206
+ ```
207
+
208
+ ## Edge Cases
209
+
210
+ ### Partial Observability Stack
211
+
212
+ If user selects only some observability tools:
213
+
214
+ **Selection:** otel-collector + prometheus (no jaeger, no loki)
215
+
216
+ **Result:**
217
+
218
+ ```yaml
219
+ # otel-collector depends only on prometheus
220
+ services:
221
+ otel-collector:
222
+ depends_on:
223
+ - prometheus # jaeger and loki removed
224
+ ```
225
+
226
+ ### No Dependencies
227
+
228
+ If a service has no selected dependencies:
229
+
230
+ **Selection:** jaeger only (standalone)
231
+
232
+ **Result:**
233
+
234
+ ```yaml
235
+ # jaeger has no depends_on (removed entirely)
236
+ services:
237
+ jaeger:
238
+ image: jaegertracing/all-in-one:latest
239
+ # no depends_on field
240
+ ```
241
+
242
+ ### Devcontainer Dependencies
243
+
244
+ The main devcontainer service depends on all infrastructure:
245
+
246
+ **Selection:** postgres + otel-collector
247
+
248
+ **Result:**
249
+
250
+ ```yaml
251
+ services:
252
+ devcontainer:
253
+ depends_on:
254
+ - postgres
255
+ - otel-collector
256
+ # redis removed (not selected)
257
+ ```
258
+
259
+ ## Validation
260
+
261
+ The composer should validate:
262
+
263
+ 1. ✅ No circular dependencies
264
+ 2. ✅ All dependencies in depends_on exist as services
265
+ 3. ✅ runServices order matches dependency graph
266
+ 4. ✅ No orphaned services (defined but not in runServices or depended upon)
267
+
268
+ ## Testing Scenarios
269
+
270
+ Test these combinations:
271
+
272
+ 1. **Full stack**: postgres + redis + jaeger + prometheus + loki + otel-collector + grafana
273
+ 2. **Minimal**: postgres only
274
+ 3. **Partial observability**: prometheus + grafana (no otel-collector)
275
+ 4. **Trace-only**: jaeger + otel-collector (no metrics)
276
+ 5. **Metrics-only**: prometheus + otel-collector (no tracing)
277
+ 6. **Direct to backends**: jaeger + prometheus + loki (no otel-collector)
278
+
279
+ Each should produce valid docker-compose with correct dependencies.
@@ -0,0 +1,85 @@
1
+ # Custom Patches Example
2
+
3
+ This example demonstrates how to use custom patches to preserve project-specific customizations across regenerations.
4
+
5
+ ## Scenario
6
+
7
+ You're working on a Node.js API that:
8
+
9
+ 1. Uses shared libraries from a sibling directory
10
+ 2. Needs MinIO for local S3 testing
11
+ 3. Has custom environment variables for feature flags
12
+ 4. Requires a custom initialization script
13
+
14
+ ## Initial Setup
15
+
16
+ Generate the base devcontainer:
17
+
18
+ ```bash
19
+ npm run init -- --stack compose --language nodejs --database postgres
20
+ ```
21
+
22
+ ## Add Custom Patches
23
+
24
+ ### 1. Create Custom Directory
25
+
26
+ ```bash
27
+ mkdir -p .devcontainer/custom/scripts
28
+ ```
29
+
30
+ ### 2. Add Custom Devcontainer Patch
31
+
32
+ File: `.devcontainer/custom/devcontainer.patch.json`
33
+
34
+ ```json
35
+ {
36
+ "mounts": [
37
+ "source=${localWorkspaceFolder}/../shared-utils,target=/workspace/shared-utils,type=bind,readonly"
38
+ ],
39
+ "customizations": {
40
+ "vscode": {
41
+ "extensions": ["eamodio.gitlens"]
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### 3. Add Custom Docker Compose Service
48
+
49
+ File: `.devcontainer/custom/docker-compose.patch.yml`
50
+
51
+ ```yaml
52
+ services:
53
+ minio:
54
+ image: minio/minio:latest
55
+ command: server /data --console-address ":9001"
56
+ ports:
57
+ - '9000:9000'
58
+ networks:
59
+ - devnet
60
+ ```
61
+
62
+ ### 4. Add Custom Environment Variables
63
+
64
+ File: `.devcontainer/custom/environment.env`
65
+
66
+ ```bash
67
+ # Feature Flags
68
+ FEATURE_S3_STORAGE=enabled
69
+ S3_ENDPOINT=http://minio:9000
70
+ ```
71
+
72
+ ## Regenerate with Customizations
73
+
74
+ Add Redis to your stack:
75
+
76
+ ```bash
77
+ npm run init -- --from-manifest .devcontainer/superposition.json
78
+ # Select redis in addition to existing overlays
79
+ ```
80
+
81
+ ## Result
82
+
83
+ After regeneration, all custom patches are preserved and merged! ✅
84
+
85
+ See [docs/custom-patches.md](../custom-patches.md) for complete documentation.