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,540 @@
1
+ # Custom Patches - Project-Specific Customizations
2
+
3
+ This guide explains how to use the `.devcontainer/custom/` directory to preserve project-specific customizations across regenerations.
4
+
5
+ ## Overview
6
+
7
+ When you regenerate a devcontainer (e.g., to add a new overlay), all manual changes to the generated files are normally lost. The **custom patches** feature solves this problem by allowing you to define customizations in a special directory that is preserved and automatically merged during regeneration.
8
+
9
+ ## Quick Start
10
+
11
+ ### 1. Generate Initial Devcontainer
12
+
13
+ ```bash
14
+ npm run init -- --stack compose --language nodejs --database postgres
15
+ ```
16
+
17
+ ### 2. Add Custom Patches
18
+
19
+ Create the custom directory and add your customizations:
20
+
21
+ ```bash
22
+ mkdir -p .devcontainer/custom
23
+ ```
24
+
25
+ Create a custom devcontainer patch:
26
+
27
+ ```json
28
+ // .devcontainer/custom/devcontainer.patch.json
29
+ {
30
+ "mounts": ["source=${localWorkspaceFolder}/../shared-libs,target=/workspace/shared,type=bind"],
31
+ "customizations": {
32
+ "vscode": {
33
+ "extensions": ["eamodio.gitlens"]
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ ### 3. Regenerate (Customizations Preserved)
40
+
41
+ ```bash
42
+ # Add a new overlay by regenerating
43
+ npm run init -- --from-manifest .devcontainer/superposition.json
44
+
45
+ # Select additional overlays (e.g., aws-cli)
46
+ # Your custom patches will be automatically applied ✅
47
+ ```
48
+
49
+ ## Supported Customization Files
50
+
51
+ The `.devcontainer/custom/` directory supports the following files:
52
+
53
+ ### 1. `devcontainer.patch.json`
54
+
55
+ Patches to merge into the generated `devcontainer.json`.
56
+
57
+ **Use cases:**
58
+
59
+ - Add custom mounts
60
+ - Add custom environment variables
61
+ - Add custom VS Code extensions
62
+ - Override settings
63
+
64
+ **Example:**
65
+
66
+ ```json
67
+ {
68
+ "mounts": [
69
+ "source=${localWorkspaceFolder}/../shared,target=/workspace/shared,type=bind",
70
+ "source=${localWorkspaceFolder}/../cache,target=/workspace/cache,type=bind"
71
+ ],
72
+ "remoteEnv": {
73
+ "MY_CUSTOM_VAR": "value",
74
+ "API_ENDPOINT": "https://api.example.com"
75
+ },
76
+ "customizations": {
77
+ "vscode": {
78
+ "extensions": ["eamodio.gitlens", "myorg.custom-extension"],
79
+ "settings": {
80
+ "editor.formatOnSave": true
81
+ }
82
+ }
83
+ }
84
+ }
85
+ ```
86
+
87
+ ### 2. `docker-compose.patch.yml`
88
+
89
+ Patches to merge into the generated `docker-compose.yml` (for compose-based stacks only).
90
+
91
+ **Use cases:**
92
+
93
+ - Add custom services
94
+ - Add custom volumes
95
+ - Modify existing services
96
+
97
+ **Example:**
98
+
99
+ ```yaml
100
+ services:
101
+ redis:
102
+ image: redis:alpine
103
+ ports:
104
+ - '6379:6379'
105
+ networks:
106
+ - devnet
107
+
108
+ minio:
109
+ image: minio/minio:latest
110
+ command: server /data --console-address ":9001"
111
+ environment:
112
+ MINIO_ROOT_USER: minioadmin
113
+ MINIO_ROOT_PASSWORD: minioadmin
114
+ ports:
115
+ - '9000:9000'
116
+ - '9001:9001'
117
+ networks:
118
+ - devnet
119
+ ```
120
+
121
+ ### 3. `environment.env`
122
+
123
+ Custom environment variables to append to `.env.example`.
124
+
125
+ **Use cases:**
126
+
127
+ - Add API keys
128
+ - Add feature flags
129
+ - Add custom configuration
130
+
131
+ **Example:**
132
+
133
+ ```bash
134
+ # Custom Environment Variables
135
+ MY_API_KEY=secret123
136
+ CUSTOM_FEATURE_FLAG=enabled
137
+ DATABASE_URL=postgresql://localhost:5432/mydb
138
+ ```
139
+
140
+ ### 4. `scripts/post-create.sh`
141
+
142
+ Custom script to run after container creation (one-time setup).
143
+
144
+ **Use cases:**
145
+
146
+ - Download proprietary tools
147
+ - Set up local databases
148
+ - Initialize project-specific dependencies
149
+
150
+ **Example:**
151
+
152
+ ```bash
153
+ #!/bin/bash
154
+ # Custom post-create setup
155
+
156
+ echo "🎨 Running custom initialization..."
157
+
158
+ # Download proprietary CLI
159
+ curl -o /tmp/custom-cli.tar.gz https://example.com/custom-cli.tar.gz
160
+ tar -xzf /tmp/custom-cli.tar.gz -C /usr/local/bin/
161
+
162
+ # Initialize custom database schema
163
+ psql -h postgres -U postgres -d myapp -f .devcontainer/custom/files/schema.sql
164
+
165
+ echo "✅ Custom initialization complete"
166
+ ```
167
+
168
+ ### 5. `scripts/post-start.sh`
169
+
170
+ Custom script to run every time the container starts.
171
+
172
+ **Use cases:**
173
+
174
+ - Start background services
175
+ - Refresh credentials
176
+ - Check environment health
177
+
178
+ **Example:**
179
+
180
+ ```bash
181
+ #!/bin/bash
182
+ # Custom post-start tasks
183
+
184
+ echo "✨ Running custom startup tasks..."
185
+
186
+ # Refresh AWS credentials
187
+ aws configure set region us-east-1
188
+
189
+ # Check database connectivity
190
+ pg_isready -h postgres -U postgres || echo "⚠️ Database not ready"
191
+
192
+ echo "✅ Startup tasks complete"
193
+ ```
194
+
195
+ ### 6. `files/`
196
+
197
+ Directory for additional files to copy into the devcontainer.
198
+
199
+ **Use cases:**
200
+
201
+ - Custom configuration files
202
+ - Project-specific scripts
203
+ - Seed data
204
+
205
+ **Example structure:**
206
+
207
+ ```
208
+ .devcontainer/custom/files/
209
+ ├── config.yml # Copied to .devcontainer/config.yml
210
+ ├── scripts/
211
+ │ └── helper.sh # Copied to .devcontainer/scripts/helper.sh
212
+ └── data/
213
+ └── seed.sql # Copied to .devcontainer/data/seed.sql
214
+ ```
215
+
216
+ ## How It Works
217
+
218
+ ### Merge Strategy
219
+
220
+ Custom patches are applied **after** all overlay merging, using the following strategy:
221
+
222
+ 1. **Objects**: Deep merge (nested properties are merged recursively)
223
+ 2. **Arrays**: Concatenate and deduplicate
224
+ 3. **Primitives**: Custom value takes precedence
225
+ 4. **Scripts**: Chained with `&&` in lifecycle commands
226
+
227
+ ### Application Order
228
+
229
+ 1. Base template loaded
230
+ 2. Overlays applied in order
231
+ 3. Port offsets applied
232
+ 4. **Custom patches applied** ← Your customizations
233
+ 5. Files written to disk
234
+
235
+ ### Preservation During Regeneration
236
+
237
+ The `.devcontainer/custom/` directory is:
238
+
239
+ - ✅ **Preserved** during regeneration (never deleted)
240
+ - ✅ **Automatically merged** into generated files
241
+ - ✅ **Tracked** in `superposition.json` manifest
242
+
243
+ ## Use Cases
244
+
245
+ ### Use Case 1: Shared Workspace Mounts
246
+
247
+ **Problem**: Your project depends on shared libraries in a sibling directory.
248
+
249
+ **Solution**:
250
+
251
+ ```json
252
+ // .devcontainer/custom/devcontainer.patch.json
253
+ {
254
+ "mounts": [
255
+ "source=${localWorkspaceFolder}/../shared-libs,target=/workspace/libs,type=bind,readonly"
256
+ ]
257
+ }
258
+ ```
259
+
260
+ ### Use Case 2: Custom Post-Start Script
261
+
262
+ **Problem**: You need to initialize proprietary tools on every container start.
263
+
264
+ **Solution**:
265
+
266
+ ```bash
267
+ # .devcontainer/custom/scripts/post-start.sh
268
+ #!/bin/bash
269
+ echo "Initializing proprietary tools..."
270
+ /usr/local/bin/custom-tool init
271
+ ```
272
+
273
+ ### Use Case 3: Additional Docker Compose Service
274
+
275
+ **Problem**: You need MinIO for local S3 testing, but it's not a standard overlay.
276
+
277
+ **Solution**:
278
+
279
+ ```yaml
280
+ # .devcontainer/custom/docker-compose.patch.yml
281
+ services:
282
+ minio:
283
+ image: minio/minio:latest
284
+ command: server /data --console-address ":9001"
285
+ ports:
286
+ - '9000:9000'
287
+ - '9001:9001'
288
+ networks:
289
+ - devnet
290
+ ```
291
+
292
+ ### Use Case 4: Team Config vs Personal Config
293
+
294
+ **Scenario**: Team uses standardized overlays, but you have personal preferences.
295
+
296
+ **Solution**:
297
+
298
+ ```json
299
+ // .devcontainer/custom/devcontainer.patch.json (in .gitignore)
300
+ {
301
+ "customizations": {
302
+ "vscode": {
303
+ "extensions": ["eamodio.gitlens", "myorg.personal-extension"],
304
+ "settings": {
305
+ "editor.fontSize": 14
306
+ }
307
+ }
308
+ }
309
+ }
310
+ ```
311
+
312
+ **Tip**: Add `.devcontainer/custom/` to `.gitignore` for personal config, or commit it for team config.
313
+
314
+ ## Workflow Examples
315
+
316
+ ### Initial Generation
317
+
318
+ ```bash
319
+ # 1. Generate devcontainer
320
+ npm run init -- --stack compose --language nodejs --database postgres
321
+
322
+ # 2. Test the generated devcontainer
323
+ # Open in VS Code: Dev Containers: Reopen in Container
324
+
325
+ # 3. Add customizations
326
+ mkdir -p .devcontainer/custom
327
+ cat > .devcontainer/custom/devcontainer.patch.json << EOF
328
+ {
329
+ "mounts": ["source=\${localWorkspaceFolder}/../shared,target=/workspace/shared,type=bind"]
330
+ }
331
+ EOF
332
+
333
+ # 4. Regenerate to apply customizations
334
+ npm run init -- --from-manifest .devcontainer/superposition.json
335
+ # (Select same overlays or add new ones)
336
+
337
+ # 5. Customizations are now applied ✅
338
+ ```
339
+
340
+ ### Regeneration Workflow
341
+
342
+ ```bash
343
+ # You want to add Redis to an existing setup
344
+
345
+ # 1. Check current configuration
346
+ cat .devcontainer/superposition.json
347
+
348
+ # 2. Regenerate from manifest
349
+ npm run init -- --from-manifest .devcontainer/superposition.json
350
+
351
+ # 3. In the questionnaire, select:
352
+ # - Keep existing: nodejs, postgres
353
+ # - Add new: redis
354
+ #
355
+ # 4. Custom patches are automatically preserved and merged ✅
356
+ ```
357
+
358
+ ### Migrating Manual Changes
359
+
360
+ If you've already made manual changes to generated files:
361
+
362
+ ```bash
363
+ # 1. Extract your manual changes into custom patches
364
+
365
+ # Example: You manually added a mount to devcontainer.json
366
+ # Extract it:
367
+ cat .devcontainer/devcontainer.json | jq '.mounts' > /tmp/mounts.json
368
+
369
+ # Create custom patch:
370
+ mkdir -p .devcontainer/custom
371
+ cat > .devcontainer/custom/devcontainer.patch.json << EOF
372
+ {
373
+ "mounts": $(cat /tmp/mounts.json)
374
+ }
375
+ EOF
376
+
377
+ # 2. Regenerate (your changes will now be preserved)
378
+ npm run init -- --from-manifest .devcontainer/superposition.json
379
+
380
+ # 3. Verify custom patches were applied
381
+ cat .devcontainer/devcontainer.json | jq '.mounts'
382
+ ```
383
+
384
+ ## Advanced Topics
385
+
386
+ ### Custom Files Copying
387
+
388
+ Files in `.devcontainer/custom/files/` are automatically copied during generation:
389
+
390
+ ```
391
+ .devcontainer/custom/files/schema.sql
392
+ → Copied to .devcontainer/schema.sql
393
+
394
+ .devcontainer/custom/files/configs/app.yml
395
+ → Copied to .devcontainer/configs/app.yml
396
+ ```
397
+
398
+ **Use case**: Seed data, configuration templates, helper scripts.
399
+
400
+ ### Script Execution Order
401
+
402
+ Lifecycle scripts are executed in this order:
403
+
404
+ **postCreateCommand** (one-time):
405
+
406
+ 1. Overlay setup scripts (e.g., `setup-nodejs.sh`)
407
+ 2. Custom post-create script (`custom/scripts/post-create.sh`)
408
+
409
+ **postStartCommand** (every start):
410
+
411
+ 1. Overlay verify scripts (e.g., `verify-nodejs.sh`)
412
+ 2. Custom post-start script (`custom/scripts/post-start.sh`)
413
+
414
+ ### Manifest Tracking
415
+
416
+ The `superposition.json` manifest tracks whether customizations are present:
417
+
418
+ ```json
419
+ {
420
+ "version": "0.1.0",
421
+ "baseTemplate": "compose",
422
+ "overlays": ["nodejs", "postgres"],
423
+ "customizations": {
424
+ "enabled": true,
425
+ "location": ".devcontainer/custom"
426
+ }
427
+ }
428
+ ```
429
+
430
+ This helps tools understand that custom patches are in use.
431
+
432
+ ## Best Practices
433
+
434
+ ### ✅ Do
435
+
436
+ - **Use custom patches for project-specific needs** that don't belong in standard overlays
437
+ - **Keep custom patches minimal** - only override what's necessary
438
+ - **Document your customizations** in comments within patch files
439
+ - **Test regeneration** to ensure custom patches apply correctly
440
+ - **Commit custom patches** for team configurations, `.gitignore` for personal configs
441
+
442
+ ### ❌ Don't
443
+
444
+ - **Don't override critical overlay settings** unless absolutely necessary
445
+ - **Don't use custom patches for things that should be overlays** - contribute overlays instead
446
+ - **Don't ignore errors** from custom patch application - they indicate conflicts
447
+ - **Don't hardcode secrets** in custom patches - use `.env` files
448
+
449
+ ## Troubleshooting
450
+
451
+ ### Custom Patches Not Applied
452
+
453
+ **Symptom**: Regeneration doesn't include custom changes.
454
+
455
+ **Solution**:
456
+
457
+ 1. Verify custom directory exists: `ls .devcontainer/custom/`
458
+ 2. Check patch file syntax: `jq . .devcontainer/custom/devcontainer.patch.json`
459
+ 3. Look for error messages during generation
460
+ 4. Verify manifest tracking: `cat .devcontainer/superposition.json | jq .customizations`
461
+
462
+ ### Merge Conflicts
463
+
464
+ **Symptom**: Custom patch conflicts with overlay settings.
465
+
466
+ **Solution**:
467
+
468
+ - Custom patches are applied **last**, so they take precedence
469
+ - If conflicts occur, check console output for warnings
470
+ - Use deep merge strategy - objects merge, primitives override
471
+
472
+ ### Scripts Not Executing
473
+
474
+ **Symptom**: Custom scripts don't run.
475
+
476
+ **Solution**:
477
+
478
+ 1. Ensure scripts are executable: `chmod +x .devcontainer/custom/scripts/*.sh`
479
+ 2. Verify scripts are referenced in devcontainer.json:
480
+ ```bash
481
+ cat .devcontainer/devcontainer.json | jq '.postCreateCommand'
482
+ ```
483
+ 3. Check script paths are correct (relative to workspace root)
484
+
485
+ ## Examples
486
+
487
+ ### Example 1: Monorepo with Shared Dependencies
488
+
489
+ ```json
490
+ // .devcontainer/custom/devcontainer.patch.json
491
+ {
492
+ "mounts": [
493
+ "source=${localWorkspaceFolder}/../packages/shared,target=/workspace/shared,type=bind,readonly",
494
+ "source=${localWorkspaceFolder}/../packages/utils,target=/workspace/utils,type=bind,readonly"
495
+ ],
496
+ "remoteEnv": {
497
+ "MONOREPO_ROOT": "/workspace"
498
+ }
499
+ }
500
+ ```
501
+
502
+ ### Example 2: Custom Development Tools
503
+
504
+ ```bash
505
+ # .devcontainer/custom/scripts/post-create.sh
506
+ #!/bin/bash
507
+
508
+ # Install custom linter
509
+ npm install -g @myorg/custom-linter
510
+
511
+ # Set up git hooks
512
+ cd /workspace
513
+ git config core.hooksPath .devcontainer/custom/files/git-hooks
514
+
515
+ # Initialize database with custom schema
516
+ psql -h postgres -U postgres -d myapp -f .devcontainer/custom/files/schema.sql
517
+ ```
518
+
519
+ ### Example 3: Development Environment Variables
520
+
521
+ ```bash
522
+ # .devcontainer/custom/environment.env
523
+
524
+ # Feature flags for development
525
+ FEATURE_NEW_UI=enabled
526
+ FEATURE_EXPERIMENTAL_API=enabled
527
+
528
+ # API endpoints
529
+ API_BASE_URL=http://localhost:3000
530
+ AUTH_SERVICE_URL=http://localhost:4000
531
+
532
+ # Debug settings
533
+ DEBUG=app:*
534
+ LOG_LEVEL=debug
535
+ ```
536
+
537
+ ## See Also
538
+
539
+ - [Overlay Authoring Guide](../.github/instructions/overlay-authoring.instructions.md)
540
+ - [DevContainer Specification](https://containers.dev/)