container-superposition 0.1.1 → 0.1.3-pr.159.17

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 (521) hide show
  1. package/README.md +88 -811
  2. package/dist/scripts/generate-schema.d.ts +14 -0
  3. package/dist/scripts/generate-schema.d.ts.map +1 -0
  4. package/dist/scripts/generate-schema.js +406 -0
  5. package/dist/scripts/generate-schema.js.map +1 -0
  6. package/dist/scripts/init.js +1 -1187
  7. package/dist/scripts/init.js.map +1 -1
  8. package/dist/tool/cli/args.d.ts +20 -0
  9. package/dist/tool/cli/args.d.ts.map +1 -0
  10. package/dist/tool/cli/args.js +325 -0
  11. package/dist/tool/cli/args.js.map +1 -0
  12. package/dist/tool/cli/run.d.ts +2 -0
  13. package/dist/tool/cli/run.d.ts.map +1 -0
  14. package/dist/tool/cli/run.js +318 -0
  15. package/dist/tool/cli/run.js.map +1 -0
  16. package/dist/tool/commands/adopt.d.ts +63 -0
  17. package/dist/tool/commands/adopt.d.ts.map +1 -0
  18. package/dist/tool/commands/adopt.js +1072 -0
  19. package/dist/tool/commands/adopt.js.map +1 -0
  20. package/dist/tool/commands/doctor.d.ts +19 -0
  21. package/dist/tool/commands/doctor.d.ts.map +1 -0
  22. package/dist/tool/commands/doctor.js +3157 -0
  23. package/dist/tool/commands/doctor.js.map +1 -0
  24. package/dist/tool/commands/explain.d.ts +13 -0
  25. package/dist/tool/commands/explain.d.ts.map +1 -0
  26. package/dist/tool/commands/explain.js +317 -0
  27. package/dist/tool/commands/explain.js.map +1 -0
  28. package/dist/tool/commands/hash.d.ts +36 -0
  29. package/dist/tool/commands/hash.d.ts.map +1 -0
  30. package/dist/tool/commands/hash.js +242 -0
  31. package/dist/tool/commands/hash.js.map +1 -0
  32. package/dist/tool/commands/list.d.ts +16 -0
  33. package/dist/tool/commands/list.d.ts.map +1 -0
  34. package/dist/tool/commands/list.js +121 -0
  35. package/dist/tool/commands/list.js.map +1 -0
  36. package/dist/tool/commands/migrate.d.ts +7 -0
  37. package/dist/tool/commands/migrate.d.ts.map +1 -0
  38. package/dist/tool/commands/migrate.js +52 -0
  39. package/dist/tool/commands/migrate.js.map +1 -0
  40. package/dist/tool/commands/plan.d.ts +69 -0
  41. package/dist/tool/commands/plan.d.ts.map +1 -0
  42. package/dist/tool/commands/plan.js +1071 -0
  43. package/dist/tool/commands/plan.js.map +1 -0
  44. package/dist/tool/questionnaire/answers.d.ts +16 -0
  45. package/dist/tool/questionnaire/answers.d.ts.map +1 -0
  46. package/dist/tool/questionnaire/answers.js +102 -0
  47. package/dist/tool/questionnaire/answers.js.map +1 -0
  48. package/dist/tool/questionnaire/composer.d.ts +18 -2
  49. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  50. package/dist/tool/questionnaire/composer.js +1544 -215
  51. package/dist/tool/questionnaire/composer.js.map +1 -1
  52. package/dist/tool/questionnaire/presets.d.ts +60 -0
  53. package/dist/tool/questionnaire/presets.d.ts.map +1 -0
  54. package/dist/tool/questionnaire/presets.js +165 -0
  55. package/dist/tool/questionnaire/presets.js.map +1 -0
  56. package/dist/tool/questionnaire/questionnaire.d.ts +10 -0
  57. package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -0
  58. package/dist/tool/questionnaire/questionnaire.js +582 -0
  59. package/dist/tool/questionnaire/questionnaire.js.map +1 -0
  60. package/dist/tool/readme/markdown-parser.d.ts.map +1 -1
  61. package/dist/tool/readme/markdown-parser.js.map +1 -1
  62. package/dist/tool/readme/readme-generator.d.ts.map +1 -1
  63. package/dist/tool/readme/readme-generator.js +12 -7
  64. package/dist/tool/readme/readme-generator.js.map +1 -1
  65. package/dist/tool/schema/deployment-targets.d.ts +77 -0
  66. package/dist/tool/schema/deployment-targets.d.ts.map +1 -0
  67. package/dist/tool/schema/deployment-targets.js +91 -0
  68. package/dist/tool/schema/deployment-targets.js.map +1 -0
  69. package/dist/tool/schema/manifest-migrations.d.ts +56 -0
  70. package/dist/tool/schema/manifest-migrations.d.ts.map +1 -0
  71. package/dist/tool/schema/manifest-migrations.js +204 -0
  72. package/dist/tool/schema/manifest-migrations.js.map +1 -0
  73. package/dist/tool/schema/overlay-loader.d.ts +1 -1
  74. package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
  75. package/dist/tool/schema/overlay-loader.js +67 -14
  76. package/dist/tool/schema/overlay-loader.js.map +1 -1
  77. package/dist/tool/schema/project-config.d.ts +36 -0
  78. package/dist/tool/schema/project-config.d.ts.map +1 -0
  79. package/dist/tool/schema/project-config.js +862 -0
  80. package/dist/tool/schema/project-config.js.map +1 -0
  81. package/dist/tool/schema/target-rules.d.ts +78 -0
  82. package/dist/tool/schema/target-rules.d.ts.map +1 -0
  83. package/dist/tool/schema/target-rules.js +367 -0
  84. package/dist/tool/schema/target-rules.js.map +1 -0
  85. package/dist/tool/schema/types.d.ts +269 -8
  86. package/dist/tool/schema/types.d.ts.map +1 -1
  87. package/dist/tool/utils/backup.d.ts +23 -0
  88. package/dist/tool/utils/backup.d.ts.map +1 -0
  89. package/dist/tool/utils/backup.js +123 -0
  90. package/dist/tool/utils/backup.js.map +1 -0
  91. package/dist/tool/utils/gitignore.d.ts +15 -0
  92. package/dist/tool/utils/gitignore.d.ts.map +1 -0
  93. package/dist/tool/utils/gitignore.js +41 -0
  94. package/dist/tool/utils/gitignore.js.map +1 -0
  95. package/dist/tool/utils/merge.d.ts +134 -0
  96. package/dist/tool/utils/merge.d.ts.map +1 -0
  97. package/dist/tool/utils/merge.js +286 -0
  98. package/dist/tool/utils/merge.js.map +1 -0
  99. package/dist/tool/utils/parameters.d.ts +76 -0
  100. package/dist/tool/utils/parameters.d.ts.map +1 -0
  101. package/dist/tool/utils/parameters.js +125 -0
  102. package/dist/tool/utils/parameters.js.map +1 -0
  103. package/dist/tool/utils/paths.d.ts +2 -0
  104. package/dist/tool/utils/paths.d.ts.map +1 -0
  105. package/dist/tool/utils/paths.js +31 -0
  106. package/dist/tool/utils/paths.js.map +1 -0
  107. package/dist/tool/utils/port-utils.d.ts +29 -0
  108. package/dist/tool/utils/port-utils.d.ts.map +1 -0
  109. package/dist/tool/utils/port-utils.js +128 -0
  110. package/dist/tool/utils/port-utils.js.map +1 -0
  111. package/dist/tool/utils/services-export.d.ts +14 -0
  112. package/dist/tool/utils/services-export.d.ts.map +1 -0
  113. package/dist/tool/utils/services-export.js +478 -0
  114. package/dist/tool/utils/services-export.js.map +1 -0
  115. package/dist/tool/utils/summary.d.ts +69 -0
  116. package/dist/tool/utils/summary.d.ts.map +1 -0
  117. package/dist/tool/utils/summary.js +260 -0
  118. package/dist/tool/utils/summary.js.map +1 -0
  119. package/dist/tool/utils/version.d.ts +9 -0
  120. package/dist/tool/utils/version.d.ts.map +1 -0
  121. package/dist/tool/utils/version.js +32 -0
  122. package/dist/tool/utils/version.js.map +1 -0
  123. package/docs/README.md +13 -2
  124. package/docs/adopt.md +202 -0
  125. package/docs/architecture.md +25 -21
  126. package/docs/creating-overlays.md +151 -2
  127. package/docs/custom-patches.md +1 -1
  128. package/docs/deployment-targets.md +182 -0
  129. package/docs/discovery-commands.md +494 -0
  130. package/docs/examples.md +58 -21
  131. package/docs/filesystem-contract.md +63 -0
  132. package/docs/hash.md +183 -0
  133. package/docs/merge-strategy.md +700 -0
  134. package/docs/minimal-and-editor.md +325 -0
  135. package/docs/overlay-imports.md +310 -0
  136. package/docs/overlay-manifest-refactoring.md +2 -2
  137. package/docs/overlay-metadata-archive.md +1 -1
  138. package/docs/overlays.md +483 -123
  139. package/docs/presets-architecture.md +4 -4
  140. package/docs/presets.md +2 -2
  141. package/docs/publishing.md +72 -58
  142. package/docs/quick-reference.md +99 -0
  143. package/docs/security.md +43 -0
  144. package/docs/specs/001-verbose-plan-graph/checklists/requirements.md +36 -0
  145. package/docs/specs/001-verbose-plan-graph/contracts/plan-verbose-output.md +96 -0
  146. package/docs/specs/001-verbose-plan-graph/data-model.md +111 -0
  147. package/docs/specs/001-verbose-plan-graph/plan.md +127 -0
  148. package/docs/specs/001-verbose-plan-graph/quickstart.md +106 -0
  149. package/docs/specs/001-verbose-plan-graph/research.md +100 -0
  150. package/docs/specs/001-verbose-plan-graph/spec.md +121 -0
  151. package/docs/specs/001-verbose-plan-graph/tasks.md +223 -0
  152. package/docs/specs/002-superposition-config-file/checklists/requirements.md +36 -0
  153. package/docs/specs/002-superposition-config-file/contracts/init-project-config.md +98 -0
  154. package/docs/specs/002-superposition-config-file/data-model.md +126 -0
  155. package/docs/specs/002-superposition-config-file/plan.md +213 -0
  156. package/docs/specs/002-superposition-config-file/quickstart.md +140 -0
  157. package/docs/specs/002-superposition-config-file/research.md +144 -0
  158. package/docs/specs/002-superposition-config-file/spec.md +129 -0
  159. package/docs/specs/002-superposition-config-file/tasks.md +215 -0
  160. package/docs/specs/003-mkdocs2-overlay/spec.md +107 -0
  161. package/docs/specs/004-doctor-fix/spec.md +63 -0
  162. package/docs/specs/005-cuda-overlay/spec.md +94 -0
  163. package/docs/specs/006-rocm-overlay/spec.md +102 -0
  164. package/docs/specs/007-target-aware-generation/spec.md +119 -0
  165. package/docs/specs/008-project-file-canonical/spec.md +82 -0
  166. package/docs/specs/009-project-env/spec.md +140 -0
  167. package/docs/specs/010-compose-env-materialization/spec.md +123 -0
  168. package/docs/specs/011-overlay-parameters/spec.md +228 -0
  169. package/docs/specs/012-ollama-cli-overlay/spec.md +47 -0
  170. package/docs/specs/013-doctor-dependency-check/spec.md +250 -0
  171. package/docs/specs/014-doctor-compose-port-cross-validation/spec.md +276 -0
  172. package/docs/specs/015-doctor-env-example-drift/spec.md +248 -0
  173. package/docs/specs/016-doctor-reproducibility-check/spec.md +276 -0
  174. package/docs/specs/017-doctor-dry-run/spec.md +276 -0
  175. package/docs/specs/018-init-project-file/spec.md +59 -0
  176. package/docs/specs/019-project-mounts/spec.md +176 -0
  177. package/docs/specs/020-superposition-yml-schema.md +83 -0
  178. package/docs/specs/021-deterministic-generated-readme/spec.md +70 -0
  179. package/docs/specs/taxonomy.md +186 -0
  180. package/docs/superposition-yml.md +481 -0
  181. package/docs/team-workflow.md +572 -0
  182. package/docs/workflows.md +139 -0
  183. package/features/cross-distro-packages/README.md +18 -0
  184. package/features/cross-distro-packages/devcontainer-feature.json +3 -3
  185. package/features/cross-distro-packages/install.sh +49 -7
  186. package/overlays/.presets/data-engineering.yml +392 -0
  187. package/overlays/.presets/event-sourced-service.yml +262 -0
  188. package/overlays/.presets/frontend.yml +287 -0
  189. package/overlays/.presets/full-observability.yml +113 -0
  190. package/overlays/.presets/k8s-dev.yml +174 -0
  191. package/overlays/.presets/k8s-operator-dev.yml +462 -0
  192. package/overlays/.presets/local-llm.yml +105 -0
  193. package/overlays/{presets → .presets}/microservice.yml +32 -6
  194. package/overlays/.presets/sdd.yml +84 -0
  195. package/overlays/.presets/vector-ai.yml +150 -0
  196. package/overlays/.presets/web-api.yml +129 -0
  197. package/overlays/.registry/README.md +1 -1
  198. package/overlays/.registry/deployment-targets.yml +54 -0
  199. package/overlays/.shared/README.md +127 -0
  200. package/overlays/.shared/compose/common-healthchecks.md +60 -0
  201. package/overlays/.shared/compose/nvidia-gpu-devcontainer.yml +22 -0
  202. package/overlays/.shared/otel/instrumentation.env +20 -0
  203. package/overlays/.shared/vscode/js-ts-settings.json +19 -0
  204. package/overlays/.shared/vscode/markdown-extensions.json +8 -0
  205. package/overlays/.shared/vscode/recommended-extensions.json +18 -0
  206. package/overlays/README.md +8 -2
  207. package/overlays/alertmanager/devcontainer.patch.json +0 -1
  208. package/overlays/alertmanager/docker-compose.yml +8 -0
  209. package/overlays/alertmanager/overlay.yml +1 -0
  210. package/overlays/alertmanager/setup.sh +4 -19
  211. package/overlays/alertmanager/verify.sh +8 -9
  212. package/overlays/all/README.md +43 -0
  213. package/overlays/all/devcontainer.patch.json +6 -0
  214. package/overlays/all/overlay.yml +14 -0
  215. package/overlays/amp/README.md +70 -0
  216. package/overlays/amp/devcontainer.patch.json +6 -0
  217. package/overlays/amp/overlay.yml +15 -0
  218. package/overlays/amp/setup.sh +26 -0
  219. package/overlays/amp/verify.sh +21 -0
  220. package/overlays/ansible/README.md +163 -0
  221. package/overlays/ansible/devcontainer.patch.json +14 -0
  222. package/overlays/ansible/overlay.yml +18 -0
  223. package/overlays/argocd/README.md +158 -0
  224. package/overlays/argocd/devcontainer.patch.json +9 -0
  225. package/overlays/argocd/overlay.yml +17 -0
  226. package/overlays/argocd/setup.sh +29 -0
  227. package/overlays/argocd/verify.sh +14 -0
  228. package/overlays/bun/devcontainer.patch.json +1 -10
  229. package/overlays/bun/overlay.yml +8 -1
  230. package/overlays/bun/setup.sh +10 -1
  231. package/overlays/bun/verify.sh +6 -1
  232. package/overlays/claude-code/README.md +83 -0
  233. package/overlays/claude-code/devcontainer.patch.json +8 -0
  234. package/overlays/claude-code/overlay.yml +15 -0
  235. package/overlays/claude-code/setup.sh +26 -0
  236. package/overlays/claude-code/verify.sh +21 -0
  237. package/overlays/cloudflared/README.md +190 -0
  238. package/overlays/cloudflared/devcontainer.patch.json +3 -0
  239. package/overlays/cloudflared/overlay.yml +15 -0
  240. package/overlays/cloudflared/setup.sh +46 -0
  241. package/overlays/cloudflared/verify.sh +21 -0
  242. package/overlays/codex/README.md +9 -6
  243. package/overlays/codex/devcontainer.patch.json +12 -1
  244. package/overlays/codex/overlay.yml +1 -0
  245. package/overlays/codex/setup.sh +5 -0
  246. package/overlays/codex/verify.sh +8 -0
  247. package/overlays/comfyui/.env.example +34 -0
  248. package/overlays/comfyui/README.md +342 -0
  249. package/overlays/comfyui/devcontainer.patch.json +15 -0
  250. package/overlays/comfyui/docker-compose.yml +40 -0
  251. package/overlays/comfyui/overlay.yml +24 -0
  252. package/overlays/comfyui/setup.sh +36 -0
  253. package/overlays/comfyui/verify.sh +103 -0
  254. package/overlays/commitlint/devcontainer.patch.json +1 -6
  255. package/overlays/commitlint/setup.sh +5 -0
  256. package/overlays/cuda/README.md +179 -0
  257. package/overlays/cuda/devcontainer.patch.json +7 -0
  258. package/overlays/cuda/overlay.yml +17 -0
  259. package/overlays/cuda/setup.sh +32 -0
  260. package/overlays/cuda/verify.sh +38 -0
  261. package/overlays/devcontainer-cli/README.md +50 -0
  262. package/overlays/devcontainer-cli/devcontainer.patch.json +13 -0
  263. package/overlays/devcontainer-cli/overlay.yml +16 -0
  264. package/overlays/devcontainer-cli/setup.sh +14 -0
  265. package/overlays/direnv/README.md +6 -4
  266. package/overlays/direnv/devcontainer.patch.json +6 -0
  267. package/overlays/direnv/setup.sh +7 -18
  268. package/overlays/docker-sock/overlay.yml +1 -0
  269. package/overlays/dotnet/overlay.yml +4 -1
  270. package/overlays/dotnet/setup.sh +14 -7
  271. package/overlays/duckdb/README.md +274 -0
  272. package/overlays/duckdb/devcontainer.patch.json +9 -0
  273. package/overlays/duckdb/overlay.yml +17 -0
  274. package/overlays/duckdb/setup.sh +45 -0
  275. package/overlays/duckdb/verify.sh +32 -0
  276. package/overlays/fuseki/.env.example +5 -0
  277. package/overlays/fuseki/README.md +173 -0
  278. package/overlays/fuseki/devcontainer.patch.json +18 -0
  279. package/overlays/fuseki/docker-compose.yml +30 -0
  280. package/overlays/fuseki/overlay.yml +42 -0
  281. package/overlays/fuseki/verify.sh +58 -0
  282. package/overlays/gcloud/devcontainer.patch.json +0 -6
  283. package/overlays/gcloud/setup.sh +51 -0
  284. package/overlays/gemini-cli/README.md +77 -0
  285. package/overlays/gemini-cli/devcontainer.patch.json +6 -0
  286. package/overlays/gemini-cli/overlay.yml +15 -0
  287. package/overlays/gemini-cli/setup.sh +26 -0
  288. package/overlays/gemini-cli/verify.sh +21 -0
  289. package/overlays/git-helpers/devcontainer.patch.json +2 -1
  290. package/overlays/git-helpers/overlay.yml +1 -0
  291. package/overlays/go/overlay.yml +6 -1
  292. package/overlays/go/setup.sh +15 -14
  293. package/overlays/grafana/README.md +5 -5
  294. package/overlays/grafana/dashboard-provider.yml +1 -1
  295. package/overlays/grafana/devcontainer.patch.json +0 -1
  296. package/overlays/grafana/docker-compose.yml +10 -4
  297. package/overlays/grafana/overlay.yml +12 -2
  298. package/overlays/grpc-tools/README.md +242 -0
  299. package/overlays/grpc-tools/devcontainer.patch.json +14 -0
  300. package/overlays/grpc-tools/overlay.yml +14 -0
  301. package/overlays/grpc-tools/setup.sh +57 -0
  302. package/overlays/grpc-tools/verify.sh +47 -0
  303. package/overlays/jaeger/.env.example +11 -0
  304. package/overlays/jaeger/README.md +33 -4
  305. package/overlays/jaeger/devcontainer.patch.json +9 -1
  306. package/overlays/jaeger/docker-compose.yml +17 -0
  307. package/overlays/jaeger/overlay.yml +7 -3
  308. package/overlays/java/overlay.yml +6 -1
  309. package/overlays/jupyter/.env.example +6 -0
  310. package/overlays/jupyter/README.md +210 -0
  311. package/overlays/jupyter/devcontainer.patch.json +14 -0
  312. package/overlays/jupyter/docker-compose.yml +24 -0
  313. package/overlays/jupyter/overlay.yml +19 -0
  314. package/overlays/jupyter/verify.sh +35 -0
  315. package/overlays/just/setup.sh +5 -17
  316. package/overlays/k3d/README.md +201 -0
  317. package/overlays/k3d/devcontainer.patch.json +9 -0
  318. package/overlays/k3d/overlay.yml +19 -0
  319. package/overlays/k3d/setup.sh +34 -0
  320. package/overlays/k3d/verify.sh +38 -0
  321. package/overlays/keycloak/.env.example +5 -0
  322. package/overlays/keycloak/README.md +238 -0
  323. package/overlays/keycloak/devcontainer.patch.json +16 -0
  324. package/overlays/keycloak/docker-compose.yml +35 -0
  325. package/overlays/keycloak/overlay.yml +38 -0
  326. package/overlays/keycloak/verify.sh +55 -0
  327. package/overlays/kind/README.md +221 -0
  328. package/overlays/kind/devcontainer.patch.json +9 -0
  329. package/overlays/kind/overlay.yml +18 -0
  330. package/overlays/kind/setup.sh +34 -0
  331. package/overlays/kind/verify.sh +40 -0
  332. package/overlays/localstack/.env.example +6 -0
  333. package/overlays/localstack/README.md +188 -0
  334. package/overlays/localstack/devcontainer.patch.json +21 -0
  335. package/overlays/localstack/docker-compose.yml +26 -0
  336. package/overlays/localstack/overlay.yml +36 -0
  337. package/overlays/localstack/verify.sh +47 -0
  338. package/overlays/loki/devcontainer.patch.json +0 -1
  339. package/overlays/loki/docker-compose.yml +8 -0
  340. package/overlays/loki/overlay.yml +7 -1
  341. package/overlays/mailpit/.env.example +4 -0
  342. package/overlays/mailpit/README.md +191 -0
  343. package/overlays/mailpit/devcontainer.patch.json +20 -0
  344. package/overlays/mailpit/docker-compose.yml +18 -0
  345. package/overlays/mailpit/overlay.yml +27 -0
  346. package/overlays/mailpit/verify.sh +52 -0
  347. package/overlays/minio/devcontainer.patch.json +1 -1
  348. package/overlays/minio/docker-compose.yml +1 -0
  349. package/overlays/minio/overlay.yml +23 -2
  350. package/overlays/minio/setup.sh +10 -18
  351. package/overlays/mkdocs/devcontainer.patch.json +1 -5
  352. package/overlays/mkdocs/overlay.yml +5 -2
  353. package/overlays/mkdocs2/README.md +135 -0
  354. package/overlays/mkdocs2/devcontainer.patch.json +15 -0
  355. package/overlays/mkdocs2/overlay.yml +19 -0
  356. package/overlays/mkdocs2/setup.sh +67 -0
  357. package/overlays/mkdocs2/verify.sh +35 -0
  358. package/overlays/modern-cli-tools/devcontainer.patch.json +7 -1
  359. package/overlays/modern-cli-tools/overlay.yml +1 -0
  360. package/overlays/modern-cli-tools/setup.sh +21 -71
  361. package/overlays/mongodb/devcontainer.patch.json +0 -6
  362. package/overlays/mongodb/docker-compose.yml +2 -0
  363. package/overlays/mongodb/overlay.yml +38 -4
  364. package/overlays/mongodb/setup.sh +59 -0
  365. package/overlays/mysql/docker-compose.yml +2 -0
  366. package/overlays/mysql/overlay.yml +48 -4
  367. package/overlays/mysql/verify.sh +4 -3
  368. package/overlays/nats/.env.example +1 -1
  369. package/overlays/nats/README.md +1 -1
  370. package/overlays/nats/docker-compose.yml +2 -1
  371. package/overlays/nats/overlay.yml +30 -4
  372. package/overlays/ngrok/overlay.yml +2 -1
  373. package/overlays/ngrok/setup.sh +9 -6
  374. package/overlays/nodejs/devcontainer.patch.json +1 -12
  375. package/overlays/nodejs/overlay.yml +8 -1
  376. package/overlays/nodejs/setup.sh +5 -0
  377. package/overlays/ollama/.env.example +14 -0
  378. package/overlays/ollama/README.md +326 -0
  379. package/overlays/ollama/devcontainer.patch.json +14 -0
  380. package/overlays/ollama/docker-compose.yml +25 -0
  381. package/overlays/ollama/overlay.yml +27 -0
  382. package/overlays/ollama/verify.sh +76 -0
  383. package/overlays/ollama-cli/README.md +90 -0
  384. package/overlays/ollama-cli/devcontainer.patch.json +3 -0
  385. package/overlays/ollama-cli/overlay.yml +19 -0
  386. package/overlays/ollama-cli/setup.sh +103 -0
  387. package/overlays/ollama-cli/verify.sh +49 -0
  388. package/overlays/open-webui/.env.example +5 -0
  389. package/overlays/open-webui/README.md +162 -0
  390. package/overlays/open-webui/devcontainer.patch.json +14 -0
  391. package/overlays/open-webui/docker-compose.yml +24 -0
  392. package/overlays/open-webui/overlay.yml +45 -0
  393. package/overlays/openapi-tools/README.md +243 -0
  394. package/overlays/openapi-tools/devcontainer.patch.json +9 -0
  395. package/overlays/openapi-tools/overlay.yml +16 -0
  396. package/overlays/openapi-tools/setup.sh +46 -0
  397. package/overlays/openapi-tools/verify.sh +51 -0
  398. package/overlays/opencode/README.md +76 -0
  399. package/overlays/opencode/devcontainer.patch.json +6 -0
  400. package/overlays/opencode/overlay.yml +14 -0
  401. package/overlays/opencode/setup.sh +26 -0
  402. package/overlays/opencode/verify.sh +21 -0
  403. package/overlays/otel-collector/README.md +4 -0
  404. package/overlays/otel-collector/devcontainer.patch.json +4 -1
  405. package/overlays/otel-collector/docker-compose.yml +8 -4
  406. package/overlays/otel-collector/overlay.yml +3 -0
  407. package/overlays/otel-collector/overlay.yml.example +26 -0
  408. package/overlays/otel-collector/setup.sh +3 -16
  409. package/overlays/otel-demo-nodejs/devcontainer.patch.json +0 -1
  410. package/overlays/otel-demo-nodejs/docker-compose.yml +1 -0
  411. package/overlays/otel-demo-nodejs/overlay.yml +9 -1
  412. package/overlays/otel-demo-nodejs/verify.sh +8 -9
  413. package/overlays/otel-demo-python/devcontainer.patch.json +0 -1
  414. package/overlays/otel-demo-python/docker-compose.yml +1 -0
  415. package/overlays/otel-demo-python/overlay.yml +6 -1
  416. package/overlays/otel-demo-python/verify.sh +16 -10
  417. package/overlays/pandoc/README.md +296 -0
  418. package/overlays/pandoc/devcontainer.patch.json +13 -0
  419. package/overlays/pandoc/overlay.yml +21 -0
  420. package/overlays/pandoc/setup.sh +303 -0
  421. package/overlays/pandoc/verify.sh +25 -0
  422. package/overlays/pgvector/.env.example +6 -0
  423. package/overlays/pgvector/README.md +215 -0
  424. package/overlays/pgvector/devcontainer.patch.json +29 -0
  425. package/overlays/pgvector/docker-compose.yml +33 -0
  426. package/overlays/pgvector/overlay.yml +47 -0
  427. package/overlays/pi/README.md +141 -0
  428. package/overlays/pi/devcontainer.patch.json +6 -0
  429. package/overlays/pi/overlay.yml +15 -0
  430. package/overlays/pi/setup.sh +28 -0
  431. package/overlays/pi/verify.sh +23 -0
  432. package/overlays/playwright/devcontainer.patch.json +3 -6
  433. package/overlays/playwright/overlay.yml +2 -1
  434. package/overlays/playwright/setup.sh +37 -0
  435. package/overlays/postgres/.env.example +5 -5
  436. package/overlays/postgres/devcontainer.patch.json +4 -4
  437. package/overlays/postgres/docker-compose.yml +16 -5
  438. package/overlays/postgres/overlay.yml +29 -3
  439. package/overlays/powershell/setup.sh +49 -13
  440. package/overlays/pre-commit/devcontainer.patch.json +1 -7
  441. package/overlays/pre-commit/setup.sh +12 -3
  442. package/overlays/prometheus/devcontainer.patch.json +0 -1
  443. package/overlays/prometheus/docker-compose.yml +8 -0
  444. package/overlays/prometheus/overlay.yml +9 -1
  445. package/overlays/promtail/devcontainer.patch.json +1 -2
  446. package/overlays/promtail/docker-compose.yml +8 -0
  447. package/overlays/promtail/overlay.yml +1 -0
  448. package/overlays/promtail/verify.sh +16 -10
  449. package/overlays/pulumi/devcontainer.patch.json +1 -1
  450. package/overlays/python/README.md +51 -35
  451. package/overlays/python/devcontainer.patch.json +7 -4
  452. package/overlays/python/setup.sh +69 -23
  453. package/overlays/python/verify.sh +33 -3
  454. package/overlays/qdrant/.env.example +4 -0
  455. package/overlays/qdrant/README.md +216 -0
  456. package/overlays/qdrant/devcontainer.patch.json +20 -0
  457. package/overlays/qdrant/docker-compose.yml +26 -0
  458. package/overlays/qdrant/overlay.yml +44 -0
  459. package/overlays/rabbitmq/docker-compose.yml +1 -0
  460. package/overlays/rabbitmq/overlay.yml +37 -4
  461. package/overlays/redis/docker-compose.yml +7 -0
  462. package/overlays/redis/overlay.yml +21 -2
  463. package/overlays/redpanda/docker-compose.yml +4 -5
  464. package/overlays/redpanda/overlay.yml +15 -3
  465. package/overlays/rocm/README.md +227 -0
  466. package/overlays/rocm/devcontainer.patch.json +4 -0
  467. package/overlays/rocm/overlay.yml +18 -0
  468. package/overlays/rocm/setup.sh +45 -0
  469. package/overlays/rocm/verify.sh +47 -0
  470. package/overlays/rust/overlay.yml +3 -1
  471. package/overlays/rust/setup.sh +11 -18
  472. package/overlays/skaffold/README.md +256 -0
  473. package/overlays/skaffold/devcontainer.patch.json +9 -0
  474. package/overlays/skaffold/overlay.yml +20 -0
  475. package/overlays/skaffold/setup.sh +33 -0
  476. package/overlays/skaffold/verify.sh +24 -0
  477. package/overlays/spec-kit/README.md +181 -0
  478. package/overlays/spec-kit/devcontainer.patch.json +6 -0
  479. package/overlays/spec-kit/overlay.yml +19 -0
  480. package/overlays/spec-kit/setup.sh +49 -0
  481. package/overlays/spec-kit/verify.sh +33 -0
  482. package/overlays/sqlite/setup.sh +14 -14
  483. package/overlays/sqlserver/docker-compose.yml +4 -3
  484. package/overlays/sqlserver/overlay.yml +17 -0
  485. package/overlays/sqlserver/verify.sh +22 -5
  486. package/overlays/task/README.md +47 -0
  487. package/overlays/task/devcontainer.patch.json +9 -0
  488. package/overlays/task/overlay.yml +16 -0
  489. package/overlays/task/setup.sh +29 -0
  490. package/overlays/task/verify.sh +14 -0
  491. package/overlays/tempo/devcontainer.patch.json +0 -1
  492. package/overlays/tempo/docker-compose.yml +8 -0
  493. package/overlays/tempo/overlay.yml +1 -0
  494. package/overlays/tempo/verify.sh +16 -10
  495. package/overlays/tilt/README.md +259 -0
  496. package/overlays/tilt/devcontainer.patch.json +16 -0
  497. package/overlays/tilt/overlay.yml +19 -0
  498. package/overlays/tilt/setup.sh +35 -0
  499. package/overlays/tilt/verify.sh +24 -0
  500. package/overlays/windsurf-cli/README.md +69 -0
  501. package/overlays/windsurf-cli/devcontainer.patch.json +6 -0
  502. package/overlays/windsurf-cli/overlay.yml +15 -0
  503. package/overlays/windsurf-cli/setup.sh +44 -0
  504. package/overlays/windsurf-cli/verify.sh +31 -0
  505. package/package.json +12 -7
  506. package/templates/scripts/setup-utils.sh +228 -0
  507. package/tool/README.md +12 -16
  508. package/tool/schema/config.schema.json +350 -14
  509. package/tool/schema/overlay-manifest.schema.json +102 -4
  510. package/tool/schema/superposition-manifest.schema.json +104 -0
  511. package/tool/schema/superposition.schema.json +569 -0
  512. package/overlays/presets/web-api.yml +0 -109
  513. /package/overlays/{presets → .presets}/docs-site.yml +0 -0
  514. /package/overlays/{presets → .presets}/fullstack.yml +0 -0
  515. /package/overlays/otel-demo-nodejs/{Dockerfile-otel-demo-nodejs → Dockerfile} +0 -0
  516. /package/overlays/otel-demo-nodejs/{package-otel-demo-nodejs.json → package.json} +0 -0
  517. /package/overlays/otel-demo-nodejs/{server-otel-demo-nodejs.js → server.js} +0 -0
  518. /package/overlays/otel-demo-nodejs/{tracing-otel-demo-nodejs.js → tracing.js} +0 -0
  519. /package/overlays/otel-demo-python/{Dockerfile-otel-demo-python → Dockerfile} +0 -0
  520. /package/overlays/otel-demo-python/{app-otel-demo-python.py → app.py} +0 -0
  521. /package/overlays/otel-demo-python/{requirements-otel-demo-python.txt → requirements.txt} +0 -0
package/README.md CHANGED
@@ -1,843 +1,120 @@
1
1
  # container-superposition
2
2
 
3
- Composable devcontainer scaffolds that collapse into working environments.
3
+ [![Validate Overlays](https://github.com/veggerby/container-superposition/actions/workflows/validate-overlays.yml/badge.svg)](https://github.com/veggerby/container-superposition/actions/workflows/validate-overlays.yml)
4
+ [![Build DevContainers](https://github.com/veggerby/container-superposition/actions/workflows/build-devcontainers.yml/badge.svg)](https://github.com/veggerby/container-superposition/actions/workflows/build-devcontainers.yml)
5
+ [![npm version](https://badge.fury.io/js/container-superposition.svg)](https://www.npmjs.com/package/container-superposition)
4
6
 
5
- ## 🎯 Purpose
7
+ Composable devcontainer scaffolds that collapse into normal, editable configs.
6
8
 
7
- Container Superposition provides a **modular, overlay-based system** for building devcontainer configurations. Start with a minimal base template, then compose it with language frameworks, databases, observability tools, and cloud utilities to create your ideal development environment.
9
+ ## Development Policy
8
10
 
9
- **Key Principles:**
11
+ This project follows spec-first development. Every feature MUST start with a
12
+ reviewed spec committed under `docs/specs/` before implementation code is
13
+ written.
10
14
 
11
- - **Leverage, Don't Duplicate** - Use official images and features from containers.dev
12
- - **Minimal Base + Composable Overlays** - Start simple, add what you need
13
- - **Copy-Paste Ready** - Works immediately, customize as needed
14
- - **Observability First-Class** - Full OpenTelemetry stack available as overlays
15
-
16
- ## 📋 Philosophy: Opinionated with Battle-Tested Defaults
17
-
18
- This tool is **opinionated by design**, providing carefully curated configurations that have been tested in real-world development scenarios:
19
-
20
- - **🎯 Battle-Tested Defaults** - Base images and configurations are chosen based on proven stability and broad compatibility
21
- - **🔧 Customization Available** - While we provide sensible defaults, you can customize base images and configurations
22
- - **⚠️ With Great Power...** - Custom images may introduce conflicts with overlays; test thoroughly
23
- - **📝 Editable Output** - Generated configurations are plain JSON/YAML you can modify post-generation
24
-
25
- **Default Base Image**: `mcr.microsoft.com/devcontainers/base:bookworm` (Debian Bookworm)
26
-
27
- - Well-maintained by Microsoft
28
- - Broad compatibility with devcontainer features
29
- - Regular security updates
30
- - Proven stability across diverse projects
31
-
32
- **Alternative Base Images**:
33
-
34
- - **Debian Trixie**: Newer packages, testing stability
35
- - **Alpine Linux**: Minimal footprint (~5MB), ideal for resource-constrained environments
36
- - **Ubuntu LTS**: Popular, familiar, extensive package ecosystem
37
- - **Custom Images**: Specify your own, but be aware of potential overlay conflicts
38
-
39
- All overlays are designed to work across Debian, Alpine, and Ubuntu bases with automatic package manager detection.
40
-
41
- ## 📁 Structure
42
-
43
- ```
44
- container-superposition/
45
- ├── templates/ # Minimal base templates (plain, compose)
46
- │ ├── plain/ # Simple image-based devcontainer
47
- │ └── compose/ # Docker Compose-based devcontainer
48
- ├── overlays/ # Composable capability overlays
49
- │ ├── index.yml # Overlay registry and metadata
50
- │ ├── presets/ # Stack presets (meta-overlays)
51
- │ │ ├── web-api.yml
52
- │ │ ├── microservice.yml
53
- │ │ ├── docs-site.yml
54
- │ │ └── fullstack.yml
55
- │ ├── dotnet/ # Language overlays
56
- │ ├── nodejs/
57
- │ ├── python/
58
- │ ├── mkdocs/
59
- │ ├── bun/
60
- │ ├── go/
61
- │ ├── java/
62
- │ ├── rust/
63
- │ ├── powershell/
64
- │ ├── postgres/ # Database/messaging overlays
65
- │ ├── redis/
66
- │ ├── mongodb/
67
- │ ├── mysql/
68
- │ ├── sqlite/
69
- │ ├── sqlserver/
70
- │ ├── minio/
71
- │ ├── rabbitmq/
72
- │ ├── redpanda/
73
- │ ├── nats/
74
- │ ├── otel-collector/ # Observability overlays
75
- │ ├── jaeger/
76
- │ ├── prometheus/
77
- │ ├── grafana/
78
- │ ├── loki/
79
- │ ├── tempo/
80
- │ ├── alertmanager/
81
- │ ├── promtail/
82
- │ ├── otel-demo-nodejs/
83
- │ ├── otel-demo-python/
84
- │ ├── aws-cli/ # Cloud tool overlays
85
- │ ├── azure-cli/
86
- │ ├── gcloud/
87
- │ ├── kubectl-helm/
88
- │ ├── terraform/
89
- │ ├── pulumi/
90
- │ ├── docker-in-docker/ # Dev tool overlays
91
- │ ├── docker-sock/
92
- │ ├── playwright/
93
- │ ├── codex/
94
- │ ├── git-helpers/
95
- │ ├── pre-commit/
96
- │ ├── commitlint/
97
- │ ├── just/
98
- │ ├── direnv/
99
- │ ├── modern-cli-tools/
100
- │ └── ngrok/
101
- ├── features/ # Custom devcontainer features
102
- ├── tool/ # Composition logic and schema
103
- │ ├── questionnaire/ # Composition engine
104
- │ └── schema/ # TypeScript types and JSON schema
105
- ├── docs/ # Complete documentation
106
- │ ├── presets.md # Stack presets guide
107
- │ └── ...
108
- └── scripts/ # CLI entry points
109
- ```
110
-
111
- ### `/templates` - Minimal Base Templates
112
-
113
- Two foundational templates that serve as starting points:
114
-
115
- - **plain** - Simple image-based devcontainer with essential tools
116
- - **compose** - Docker Compose-based for multi-service environments
117
-
118
- Each template is minimal by design. Capabilities are added via overlays.
119
-
120
- ### `/overlays` - Composable Capabilities
121
-
122
- Overlays are modular configuration fragments organized by category:
123
-
124
- **Language & Framework:**
125
-
126
- - **dotnet** - .NET SDK with C# development tools
127
- - **nodejs** - Node.js LTS with npm and TypeScript support
128
- - **python** - Python with pip and common data science tools
129
- - **mkdocs** - MkDocs for documentation sites
130
- - **bun** - Bun JavaScript runtime and toolkit
131
- - **go** - Go programming language
132
- - **java** - Java Development Kit
133
- - **rust** - Rust programming language
134
- - **powershell** - PowerShell Core
135
-
136
- **Databases & Message Brokers:**
137
-
138
- - **postgres** - PostgreSQL relational database
139
- - **redis** - Redis in-memory data store
140
- - **mongodb** - MongoDB document database
141
- - **mysql** - MySQL relational database
142
- - **sqlite** - SQLite embedded database
143
- - **sqlserver** - Microsoft SQL Server
144
- - **minio** - MinIO S3-compatible object storage
145
- - **rabbitmq** - RabbitMQ message broker (AMQP)
146
- - **redpanda** - Redpanda Kafka-compatible streaming
147
- - **nats** - NATS messaging system
148
-
149
- **Observability:**
150
-
151
- - **otel-collector** - OpenTelemetry Collector (telemetry pipeline)
152
- - **jaeger** - Jaeger distributed tracing
153
- - **prometheus** - Prometheus metrics collection
154
- - **grafana** - Grafana visualization and dashboards
155
- - **loki** - Loki log aggregation
156
- - **tempo** - Tempo distributed tracing backend
157
- - **alertmanager** - Prometheus Alertmanager
158
- - **promtail** - Promtail log collector for Loki
159
- - **otel-demo-nodejs** - OpenTelemetry demo app (Node.js)
160
- - **otel-demo-python** - OpenTelemetry demo app (Python)
161
-
162
- **Cloud Tools:**
163
-
164
- - **aws-cli** - AWS Command Line Interface
165
- - **azure-cli** - Azure Command Line Interface
166
- - **gcloud** - Google Cloud SDK
167
- - **kubectl-helm** - Kubernetes CLI and Helm package manager
168
- - **terraform** - Terraform infrastructure as code
169
- - **pulumi** - Pulumi infrastructure as code
170
-
171
- **Dev Tools:**
172
-
173
- - **docker-in-docker** - Docker daemon in container
174
- - **docker-sock** - Access to host Docker daemon
175
- - **playwright** - Playwright browser automation
176
- - **codex** - Codex AI coding assistant
177
- - **git-helpers** - Git with LFS, GPG, GitHub CLI
178
- - **pre-commit** - Pre-commit hook framework
179
- - **commitlint** - Commit message linting
180
- - **just** - Just command runner
181
- - **direnv** - Directory-based environment variables
182
- - **modern-cli-tools** - Modern alternatives (ripgrep, fd, bat, jq, yq)
183
- - **ngrok** - Ngrok secure tunnels
184
-
185
- Each overlay includes:
186
-
187
- - `devcontainer.patch.json` - Configuration to merge
188
- - `docker-compose.yml` (if needed) - Service definitions
189
- - `.env.example` - Environment variables
190
- - Configuration files (e.g., `otel-collector-config.yaml`)
191
- - README with usage instructions
192
-
193
- ### `/features` - Custom Building Blocks
194
-
195
- Custom devcontainer features that add value beyond containers.dev:
196
-
197
- - **cross-distro-packages** - Cross-distribution package manager with automatic distro detection (apt/apk)
198
- - **project-scaffolder** - Interactive project initialization
199
- - **team-conventions** - Shared linting, formatting, commit standards
200
- - **local-secrets-manager** - Safe local development secrets
201
-
202
- ## 🚀 Quick Start
203
-
204
- ### Via npx (Recommended)
205
-
206
- No installation required! Use npx to run the tool directly:
207
-
208
- ```bash
209
- # Interactive mode - guided questionnaire
210
- npx container-superposition init
211
-
212
- # With CLI flags - skip to your stack
213
- npx container-superposition init --stack compose --language nodejs --database postgres
214
-
215
- # List all available overlays
216
- npx container-superposition list
217
-
218
- # Check your environment
219
- npx container-superposition doctor
220
- ```
221
-
222
- ### Global Installation (Optional)
223
-
224
- Install globally for faster repeated use:
225
-
226
- ```bash
227
- # Install globally
228
- npm install -g container-superposition
229
-
230
- # Now use without npx
231
- container-superposition init
232
- container-superposition list
233
- container-superposition doctor
234
- ```
235
-
236
- ### From Source (Development)
237
-
238
- For contributors or those who want to modify the tool:
239
-
240
- ```bash
241
- # Clone the repository
242
- git clone https://github.com/veggerby/container-superposition.git
243
- cd container-superposition
244
-
245
- # Install dependencies
246
- npm install
247
-
248
- # Run the interactive setup
249
- npm run init
250
- ```
251
-
252
- ### Available Commands
253
-
254
- - **`init`** - Initialize a new devcontainer configuration (default command)
255
- - **`regen`** - Regenerate devcontainer from existing manifest
256
- - **`list`** - List all available overlays and presets
257
- - **`doctor`** - Check environment and validate configuration
258
-
259
- The questionnaire guides you through:
260
-
261
- 1. **Preset or Custom** - Start from a pre-configured stack or build custom?
262
- 2. **Base template** - plain or compose?
263
- 3. **Overlays** - All available overlays in one multi-select (language, databases, observability, cloud tools, dev tools)
264
- 4. **Output path** - Where to generate the configuration
265
-
266
- #### Stack Presets (NEW!)
267
-
268
- Quickly get started with common development scenarios:
269
-
270
- **🌐 Web API Stack**
271
-
272
- - Language choice (Node.js, .NET, Python, Go, Java)
273
- - PostgreSQL + Redis
274
- - Full observability (OTEL, Prometheus, Grafana, Loki)
275
- - Pre-configured connection strings
276
-
277
- **🔀 Microservice Stack**
278
-
279
- - Language choice
280
- - Message broker (RabbitMQ, Redpanda, NATS)
281
- - Distributed tracing (Jaeger)
282
- - Metrics & monitoring (Prometheus, Grafana)
283
-
284
- **📚 Documentation Site**
285
-
286
- - MkDocs + Python
287
- - Pre-commit hooks
288
- - Modern CLI tools
289
- - GitHub Pages ready
290
-
291
- **🎨 Full-Stack Application**
292
-
293
- - Node.js frontend + Backend language choice
294
- - PostgreSQL + Redis + MinIO
295
- - Complete observability stack
296
-
297
- See [docs/presets.md](docs/presets.md) for detailed preset documentation.
298
-
299
- **Example compositions:**
15
+ ## Quickstart
300
16
 
301
17
  ```bash
302
- # Using presets (interactive)
18
+ # Guided questionnaire — always writes superposition.yml
303
19
  npx container-superposition init
304
- # Select "Web API Stack" → Choose Node.js → Done!
305
-
306
- # Node.js API with PostgreSQL and observability
307
- npx container-superposition init --stack compose --language nodejs --database postgres --observability otel-collector,jaeger,prometheus,grafana
308
20
 
309
- # .NET microservice with full observability stack
310
- npx container-superposition init --stack compose --language dotnet --database postgres,redis --observability otel-collector,jaeger,prometheus,grafana,loki --cloud-tools aws-cli,kubectl-helm
311
-
312
- # Go microservice with RabbitMQ messaging
313
- npx container-superposition init --stack compose --language go --database rabbitmq,redis --observability jaeger,prometheus
314
-
315
- # Rust development environment with modern CLI tools
316
- npx container-superposition init --stack plain --language rust --dev-tools modern-cli-tools,git-helpers,pre-commit
317
-
318
- # Java Spring Boot with MySQL
319
- npx container-superposition init --stack compose --language java --database mysql,redis --cloud-tools kubectl-helm
320
-
321
- # Python data science with MongoDB
322
- npx container-superposition init --stack compose --language python --database mongodb
323
-
324
- # Event-driven architecture with Redpanda
325
- npx container-superposition init --stack compose --language nodejs --database redpanda,postgres --observability otel-collector,tempo,grafana
326
-
327
- # Multi-cloud setup with Terraform
328
- npx container-superposition init --stack plain --language python --cloud-tools aws-cli,azure-cli,gcloud,terraform,pulumi
329
-
330
- # Full observability stack with demo apps
331
- npx container-superposition init --stack compose --language nodejs --observability otel-collector,jaeger,prometheus,grafana,loki,tempo,otel-demo-nodejs
332
-
333
- # Bun with MinIO object storage
334
- npx container-superposition init --stack compose --language bun --database postgres,minio --dev-tools docker-sock
335
-
336
- # Documentation site with MkDocs
337
- npx container-superposition init --stack plain --language mkdocs --dev-tools pre-commit,modern-cli-tools
338
-
339
- # PowerShell scripting environment
340
- npx container-superposition init --stack plain --language powershell --cloud-tools aws-cli,azure-cli
341
- ```
342
-
343
- **Port Offset for Multiple Instances:**
344
-
345
- If you're running multiple devcontainer instances simultaneously (e.g., multiple microservices), use `--port-offset` to avoid port conflicts:
346
-
347
- ```bash
348
- # Service 1 (default ports)
349
- npm run init -- --stack compose --language nodejs --postgres --output ./service1
350
-
351
- # Service 2 (ports shifted by 100)
352
- npm run init -- --stack compose --language nodejs --postgres --port-offset 100 --output ./service2
353
-
354
- # Service 3 (ports shifted by 200)
355
- npm run init -- --stack compose --language nodejs --postgres --port-offset 200 --output ./service3
356
- ```
357
-
358
- This automatically adjusts all exposed ports in docker-compose.yml and documents the offset in .env.example.
359
-
360
- ### Regenerating from Manifest
361
-
362
- Every devcontainer generation creates a `superposition.json` manifest file that records your configuration choices. You can use this manifest to:
363
-
364
- - **Iterate on your setup** - Modify overlay selections and regenerate
365
- - **Update to latest** - Regenerate with newer overlay versions
366
- - **Experiment safely** - Try different configurations with automatic backup
367
- - **Share configurations** - Commit the manifest for team consistency
368
-
369
- **Quick regeneration (recommended):**
370
-
371
- ```bash
372
- # Simple regen command - automatically finds manifest in .devcontainer/
21
+ # Declarative project config committed in the repo
22
+ cat > .superposition.yml <<'YAML'
23
+ stack: compose
24
+ language:
25
+ - nodejs
26
+ database:
27
+ - postgres
28
+ env:
29
+ APP_ENV: development
30
+ mounts:
31
+ - "./local-tools:/workspace/tools"
32
+ customizations:
33
+ envTemplate:
34
+ POSTGRES_PASSWORD: postgres
35
+ YAML
36
+ npx container-superposition init --no-interactive
37
+
38
+ # Regenerate from the repository project file (superposition.yml is required)
373
39
  npx container-superposition regen
374
40
 
375
- # Creates backup and regenerates with exact same settings from manifest
376
- ```
377
-
378
- **Interactive regeneration with changes:**
41
+ # Or select the project file explicitly
42
+ npx container-superposition regen --from-project
379
43
 
380
- ```bash
381
- # Loads manifest, creates backup, shows questionnaire with pre-selected options
382
- npx container-superposition init --from-manifest ./.devcontainer/superposition.json
383
-
384
- # Or from a different location (regenerates in the manifest's directory)
385
- npx container-superposition init --from-manifest /path/to/project/.devcontainer/superposition.json
386
- ```
387
-
388
- > **Note:** When using `--from-manifest`, the devcontainer is generated relative to the manifest file's location, not your current working directory. This means you can run the command from anywhere and the output will go to the correct project directory.
389
-
390
- **Non-interactive regeneration (CI/CD):**
391
-
392
- ```bash
393
- # Truly non-interactive: use manifest values directly without questionnaire
394
- npx container-superposition init --from-manifest ./.devcontainer/superposition.json --no-interactive --no-backup
395
- ```
396
-
397
- > **Note:** The `--no-interactive` option skips the questionnaire entirely and uses all values from the manifest. This is perfect for CI/CD pipelines or when you want to ensure exact reproducibility.
398
-
399
- **Workflow examples:**
400
-
401
- ```bash
402
- # 1. Initial setup
44
+ # Non-interactive example
403
45
  npx container-superposition init --stack compose --language nodejs --database postgres
404
- # Creates .devcontainer/ and superposition.json
405
-
406
- # 2. Later: Add Redis and observability (interactive)
407
- npx container-superposition init --from-manifest ./.devcontainer/superposition.json
408
- # Questionnaire shows with nodejs and postgres pre-selected
409
- # Add redis, otel-collector, grafana
410
- # Original .devcontainer/ backed up automatically
411
-
412
- # 3. Update to latest overlay versions (simple regen)
413
- npx container-superposition regen
414
- # Uses exact manifest values, creates backup
415
- # Perfect for pulling latest overlay updates
416
-
417
- # 4. Switch languages (e.g., Node.js → Python)
418
- npx container-superposition init --from-manifest ./.devcontainer/superposition.json
419
- # Change nodejs to python in questionnaire
420
- # Regenerate with new language
421
- ```
422
46
 
423
- **Backup behavior:**
47
+ # Write only superposition.yml without generating .devcontainer/
48
+ npx container-superposition init --stack compose --language nodejs --no-scaffold
424
49
 
425
- - **Default**: Creates timestamped backup next to the devcontainer directory (e.g., `.devcontainer.backup-2026-02-08-143022/`)
426
- - **`--no-backup`**: Skip backup (destructive, use with caution)
427
- - **`--backup-dir <path>`**: Custom backup location
428
- - **Automatic .gitignore**: Backup patterns added to project root `.gitignore`
50
+ # Preview before writing files
51
+ npx container-superposition plan --stack compose --overlays nodejs,postgres,grafana
429
52
 
430
- **What's preserved from manifest:**
53
+ # Explain why dependencies were included
54
+ npx container-superposition plan --stack compose --overlays grafana --verbose
431
55
 
432
- - Base template (plain/compose)
433
- - Preset selection (if used)
434
- - All overlay selections
435
- - Port offset
436
- - Output path
437
- - Container name
438
-
439
- See [tool/README.md](tool/README.md) for full documentation.
440
-
441
- ### Preserving Project-Specific Customizations
442
-
443
- **Problem**: When you regenerate a devcontainer (to add overlays or update), manual customizations are lost.
444
-
445
- **Solution**: Use the `.devcontainer/custom/` directory for customizations that persist across regenerations.
446
-
447
- **Quick example:**
448
-
449
- ```bash
450
- # 1. Generate initial devcontainer
451
- npm run init -- --stack compose --language nodejs --database postgres
452
-
453
- # 2. Add custom patches
454
- mkdir -p .devcontainer/custom
455
-
456
- # Add custom mounts, extensions, etc.
457
- cat > .devcontainer/custom/devcontainer.patch.json << 'EOF'
458
- {
459
- "mounts": [
460
- "source=${localWorkspaceFolder}/../shared-libs,target=/workspace/shared,type=bind"
461
- ],
462
- "customizations": {
463
- "vscode": {
464
- "extensions": ["eamodio.gitlens"]
465
- }
466
- }
467
- }
468
- EOF
469
-
470
- # 3. Regenerate (e.g., to add Redis)
471
- npm run init -- --from-manifest .devcontainer/superposition.json
472
- # Select redis in addition to existing overlays
473
-
474
- # 4. Your custom patches are automatically preserved and merged! ✅
475
- ```
476
-
477
- **Supported customization files:**
478
-
479
- - `devcontainer.patch.json` - Merges into devcontainer.json
480
- - `docker-compose.patch.yml` - Merges into docker-compose.yml
481
- - `environment.env` - Additional environment variables
482
- - `scripts/post-create.sh` - Custom one-time setup script
483
- - `scripts/post-start.sh` - Custom startup script
484
- - `files/` - Additional files to copy
485
-
486
- See **[Custom Patches Guide](docs/custom-patches.md)** for complete documentation and examples.
487
-
488
- ### Option 2: Manual Composition
489
-
490
- 1. **Copy a base template:**
491
-
492
- ```bash
493
- cp -r templates/compose/.devcontainer /path/to/your/project/
494
- ```
495
-
496
- 2. **Add overlay configurations:**
497
-
498
- ```bash
499
- # Merge devcontainer.patch.json files
500
- # Copy docker-compose.yml files as docker-compose.{overlay}.yml
501
- # Merge .env.example files
502
- ```
503
-
504
- 3. **Open in VS Code** and reopen in container
505
-
506
- ## 🔧 Architecture
507
-
508
- - **Questionnaire**: 5–8 questions to understand your needs
509
- - **Composition**: Merges base templates with lightweight overlays
510
- - **Output**: Plain `.devcontainer/` folder — fully editable, no lock-in
511
- - **Overlays**: Add-ons for databases (Postgres, Redis), Playwright, cloud tools, etc.
512
-
513
- **Key Design Decisions:**
514
-
515
- - ✅ Generate once, edit forever (no "sync" or "update")
516
- - ✅ Output is standard JSON — no proprietary formats
517
- - ✅ Tool is optional — templates work standalone
518
- - ✅ Cross-platform via Node.js/TypeScript
519
- - ✅ Metadata-driven overlays (no hardcoded menus)
520
-
521
- ### Metadata-Driven Overlays
522
-
523
- All overlays are defined in [overlays/index.yml](overlays/index.yml):
524
-
525
- ```yaml
526
- observability_overlays:
527
- - id: otel-collector
528
- name: OpenTelemetry Collector
529
- description: Telemetry collection pipeline
530
- category: observability
531
- order: 2 # Start after backends
532
- ```
533
-
534
- **Benefits:**
535
-
536
- - Add new overlays without code changes
537
- - Consistent naming and descriptions
538
- - Control display order and categorization
539
- - Easy maintenance and documentation
540
-
541
- **Overlay Categories:**
542
-
543
- - `base_templates` - plain, compose
544
- - `base_images` - bookworm, trixie, alpine, ubuntu, custom
545
- - `language_overlays` - dotnet, nodejs, python, mkdocs, bun, go, java, rust, powershell
546
- - `database_overlays` - postgres, redis, mongodb, mysql, sqlite, sqlserver, minio, rabbitmq, redpanda, nats
547
- - `observability_overlays` - otel-collector, jaeger, prometheus, grafana, loki, tempo, alertmanager, promtail, otel-demo-nodejs, otel-demo-python
548
- - `cloud_tool_overlays` - aws-cli, azure-cli, gcloud, kubectl-helm, terraform, pulumi
549
- - `dev_tool_overlays` - docker-in-docker, docker-sock, playwright, codex, git-helpers, pre-commit, commitlint, just, direnv, modern-cli-tools, ngrok
550
-
551
- See [tool/docs/questionnaire-updates.md](tool/docs/questionnaire-updates.md) for details.
552
-
553
- ### Dependency Management & Auto-Resolution
554
-
555
- Container Superposition includes an intelligent dependency model that automatically resolves required dependencies:
556
-
557
- **Dependency Types:**
558
-
559
- - **`requires`** - Hard dependencies that are automatically added
560
- - **`suggests`** - Soft dependencies that work well together
561
- - **`conflicts`** - Mutually exclusive overlays
562
-
563
- **Auto-Resolution Example:**
564
-
565
- ```bash
566
- # Select grafana, and prometheus is automatically added
567
- npm run init -- --stack compose --observability grafana
568
-
569
- # Output includes both:
570
- # ✅ grafana
571
- # ✅ prometheus (auto-resolved, required by grafana)
572
- ```
573
-
574
- **Explicit Metadata in overlays/index.yml:**
575
-
576
- ```yaml
577
- observability_overlays:
578
- - id: grafana
579
- name: Grafana
580
- requires: [prometheus] # Auto-add prometheus
581
- suggests: [loki, jaeger] # Could work well together
582
- conflicts: []
583
- tags: [observability, ui]
584
- ports: [3000] # Explicit port declarations
585
- ```
586
-
587
- **Benefits:**
588
-
589
- - ✅ Predictable behavior - no hidden "if overlay == ..." logic
590
- - ✅ Automatic dependency resolution
591
- - ✅ Clear conflict detection
592
- - ✅ Port-offset becomes data-driven
593
-
594
- **Superposition Manifest:**
595
-
596
- Every generated configuration includes a `superposition.json` manifest for debugging:
597
-
598
- ```json
599
- {
600
- "version": "0.1.0",
601
- "generated": "2026-02-04T10:30:00Z",
602
- "baseTemplate": "compose",
603
- "baseImage": "bookworm",
604
- "overlays": ["dotnet", "postgres", "prometheus", "grafana"],
605
- "portOffset": 100,
606
- "autoResolved": {
607
- "added": ["prometheus"],
608
- "reason": "prometheus (required by grafana)"
609
- }
610
- }
611
- ```
612
-
613
- This manifest answers "why is this here?" without reading generated configs.
614
-
615
- See [tool/docs/overlays.md](tool/docs/overlays.md) for complete overlay reference.
616
-
617
- ### Service Dependency Management
618
-
619
- The composer intelligently manages docker-compose service dependencies:
620
-
621
- 1. **Filters docker-compose** - Removes `depends_on` references to unselected services
622
- 2. **Orders services** - Uses `_serviceOrder` field (0=infra, 1=backends, 2=middleware, 3=UI)
623
- 3. **Merges runServices** - Creates ordered startup sequence
624
- 4. **Validates overlays** - Ensures compatible combinations
625
-
626
- Example: If you select `grafana` without `prometheus`, the `depends_on: [prometheus]` is automatically removed.
627
-
628
- See [tool/README.md](tool/README.md) for architecture details.
629
-
630
- ## 🔧 Customization
631
-
632
- ### Using Official Features
633
-
634
- All templates use official features from [containers.dev/features](https://containers.dev/features). Add more by editing `devcontainer.json`:
635
-
636
- ```json
637
- {
638
- "features": {
639
- "ghcr.io/devcontainers/features/node:1": {},
640
- "ghcr.io/devcontainers/features/docker-in-docker:2": {},
641
- "ghcr.io/devcontainers/features/github-cli:1": {}
642
- }
643
- }
644
- ```
645
-
646
- ### Adding Custom Features
647
-
648
- Use our custom features for specialized needs:
649
-
650
- ```json
651
- {
652
- "features": {
653
- "./features/project-scaffolder": { "template": "express-api" },
654
- "./features/team-conventions": { "preset": "airbnb" }
655
- }
656
- }
657
- ```
658
-
659
- ### Mixing Templates
660
-
661
- Start with one template and enhance it:
662
-
663
- - Add features from containers.dev
664
- - Include custom features from this repo
665
- - Copy useful scripts from other templates
666
-
667
- ## 🧪 Testing & Verification
668
-
669
- ### Golden Tests
670
-
671
- The project includes comprehensive test coverage for composition logic:
672
-
673
- ```bash
674
- # Run all tests
675
- npm test
676
-
677
- # Run tests in watch mode
678
- npm run test:watch
679
-
680
- # Run smoke tests
681
- npm run test:smoke
56
+ # Migrate a manifest-only repo to the project-file model
57
+ npx container-superposition migrate
682
58
  ```
683
59
 
684
- **Test Coverage:**
60
+ ## What It Does
685
61
 
686
- - Dependency resolution logic
687
- - devcontainer.json merging
688
- - docker-compose.yml merging
689
- - Port offset application
690
- - Environment variable merging
691
- - Manifest generation
62
+ - Base templates: `plain` (single image) and `compose` (multi-service).
63
+ - Overlays: add languages, databases, observability, cloud tools, dev tools.
64
+ - Composition: merges overlays into a standard `.devcontainer/` you can edit freely.
65
+ - Project config: `superposition.yml` (or `.superposition.yml`) is the **canonical input** for all
66
+ generation and regeneration flows. Commit it to your repo for reproducible team and CI builds.
67
+ - `init` always writes `superposition.yml` as its primary output
68
+ - `regen` reads only the project file — `superposition.json` is an output-only receipt
69
+ - Repos without a project file should run `cs migrate` once to create one from their manifest
70
+ - `doctor` compares the project file against the last-generated manifest and reports drift
692
71
 
693
- ### Overlay Verification Scripts
694
-
695
- Each overlay includes a `verify.sh` script for validation:
696
-
697
- ```bash
698
- # Inside a devcontainer, run verification scripts
699
- bash ./verify-postgres.sh
700
- bash ./verify-redis.sh
701
- bash ./verify-grafana.sh
702
- ```
72
+ ## Core Commands
703
73
 
704
- **Verification scripts check:**
74
+ - `init` — run the interactive questionnaire; always writes `superposition.yml` and (by default) scaffolds `.devcontainer/`
75
+ - Add `--no-scaffold` to write only the project file without generating `.devcontainer/`
76
+ - Add `--project-root <path>` to resolve persisted input from a different repository root
77
+ - `regen` — deterministically replay the repository project file (`superposition.yml` required)
78
+ - Add `--project-root <path>` to resolve persisted input from a different repository root
79
+ - `migrate` — one-time migration: creates `superposition.yml` from an existing `superposition.json`
80
+ - Required for repos that ran `init` before this project-file-first model was introduced
81
+ - `adopt` — migrate an existing `.devcontainer/` to the overlay-based workflow
82
+ - `list` — browse overlays
83
+ - `explain` — overlay details
84
+ - `plan` — preview output
85
+ - Add `--verbose` to narrate dependency resolution and inclusion reasons
86
+ - Add `--from-manifest <path>` to preview an existing manifest with the same explanation model
87
+ - `hash` — deterministic environment fingerprint
88
+ - `doctor` — validate environment and detect project-file drift
705
89
 
706
- - ✅ Tool/service is installed
707
- - ✅ Version information
708
- - ✅ Service connectivity (for compose overlays)
709
- - ✅ Port accessibility
710
-
711
- Example output:
712
-
713
- ```
714
- 🔍 Verifying PostgreSQL overlay...
715
-
716
- 1️⃣ Checking psql client...
717
- psql (PostgreSQL) 16.1
718
- ✅ psql client found
719
-
720
- 2️⃣ Checking PostgreSQL service...
721
- ✅ PostgreSQL service is ready
722
- postgres:5432 - accepting connections
723
-
724
- ✅ PostgreSQL overlay verification complete
725
- ```
90
+ ## Documentation
726
91
 
727
- ## 📦 Design Principles
92
+ Start here:
728
93
 
729
- - **Copy-Paste First** - Templates should work immediately without modification
730
- - **Fast Builds** - Optimized Dockerfiles with layer caching
731
- - **Composability** - Features can be mixed and matched
732
- - **Minimal Bloat** - Only include what's needed
733
- - **No Lock-In** - Standard devcontainer format, works anywhere
734
- - **Preserve Customizations** - Project-specific changes survive regeneration via `.devcontainer/custom/`
735
-
736
- ## 🏗️ Building Your Own Template
737
-
738
- Create a custom template for your team or project:
739
-
740
- 1. **Start with an official base** from [containers.dev/images](https://containers.dev/images)
741
- 2. **Add official features** from [containers.dev/features](https://containers.dev/features)
742
- 3. **Include custom features** from this repo for specialized needs
743
- 4. **Add project scripts** for your specific workflow
744
- 5. **Test thoroughly** - build and verify all tools work
745
- 6. **Document** - explain what's included and why
746
-
747
- Example `devcontainer.json` structure:
748
-
749
- ```json
750
- {
751
- "name": "My Custom Template",
752
- "image": "mcr.microsoft.com/devcontainers/typescript-node:20",
753
- "features": {
754
- "ghcr.io/devcontainers/features/docker-in-docker:2": {},
755
- "./features/team-conventions": {}
756
- },
757
- "postCreateCommand": "npm install && npm run setup",
758
- "customizations": {
759
- "vscode": {
760
- "extensions": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
761
- }
762
- }
763
- }
764
- ```
765
-
766
- ## 📚 Documentation
767
-
768
- Complete documentation is available in the [docs/](docs/) folder:
769
-
770
- - **[Documentation Index](docs/README.md)** - Complete documentation overview
771
- - **[Custom Patches](docs/custom-patches.md)** - Preserve project-specific customizations across regenerations
772
- - **[Publishing Guide](docs/publishing.md)** - How to publish to npm
773
- - **[Quick Reference](docs/quick-reference.md)** - Templates, overlays, ports, commands
774
- - **[Architecture](docs/architecture.md)** - Design principles and composition logic
775
- - **[Creating Overlays](docs/creating-overlays.md)** - Guide for adding new overlays
776
- - [Overlay Manifest Schema](tool/schema/overlay-manifest.schema.json) - JSON schema for overlay.yml
777
- - [Overlay Index Guide](.github/instructions/overlay-index.instructions.md) - Comprehensive field documentation
778
- - **[Examples](docs/examples.md)** - Common usage patterns
779
-
780
- Additional resources:
781
-
782
- - [VS Code Dev Containers Documentation](https://code.visualstudio.com/docs/devcontainers/containers)
783
- - [Dev Container Specification](https://containers.dev/)
784
- - [Docker Best Practices](https://docs.docker.com/develop/dev-best-practices/)
785
-
786
- ## 💻 Development
787
-
788
- ### Working on Container Superposition
789
-
790
- This repository dogfoods its own tooling! The development environment is set up using Container Superposition itself.
791
-
792
- **Quick Start:**
793
-
794
- ```bash
795
- # Clone and open in VS Code
796
- git clone https://github.com/veggerby/container-superposition.git
797
- cd container-superposition
798
- code .
799
-
800
- # When prompted, click "Reopen in Container"
801
- # The devcontainer includes:
802
- # - Node.js with TypeScript
803
- # - Docker access (via host socket)
804
- # - Git helpers and modern CLI tools
805
- # - Codex for AI assistance
806
- ```
807
-
808
- **Without Devcontainer:**
809
-
810
- ```bash
811
- npm install # Install dependencies
812
- npm run build # Compile TypeScript
813
- npm run init # Run the tool
814
- npm test # Run tests
815
- ```
816
-
817
- **Development Workflow:**
818
-
819
- 1. Make changes to TypeScript sources in `scripts/` or `tool/`
820
- 2. Run `npm run build` to compile
821
- 3. Test with `npm run init` or `npm test`
822
- 4. Submit PR following [CONTRIBUTING.md](CONTRIBUTING.md)
823
-
824
- The `.devcontainer/` folder is generated using:
825
-
826
- ```bash
827
- npm run init -- --stack plain --language nodejs --dev-tools codex,docker-sock,git-helpers,modern-cli-tools
828
- ```
94
+ - [Docs index](https://github.com/veggerby/container-superposition/blob/main/docs/README.md)
95
+ - [**superposition.yml reference**](https://github.com/veggerby/container-superposition/blob/main/docs/superposition-yml.md) project file authoring guide
96
+ - [Quick reference](https://github.com/veggerby/container-superposition/blob/main/docs/quick-reference.md)
97
+ - [Adopt command](https://github.com/veggerby/container-superposition/blob/main/docs/adopt.md)
98
+ - [Hash command](https://github.com/veggerby/container-superposition/blob/main/docs/hash.md)
99
+ - [Examples](https://github.com/veggerby/container-superposition/blob/main/docs/examples.md)
100
+ - [Presets](https://github.com/veggerby/container-superposition/blob/main/docs/presets.md)
101
+ - [Architecture](https://github.com/veggerby/container-superposition/blob/main/docs/architecture.md)
102
+ - [Overlays](https://github.com/veggerby/container-superposition/blob/main/docs/overlays.md)
103
+ - [Custom patches](https://github.com/veggerby/container-superposition/blob/main/docs/custom-patches.md)
104
+ - [Workflows and regen](https://github.com/veggerby/container-superposition/blob/main/docs/workflows.md)
105
+ - [Filesystem contract](https://github.com/veggerby/container-superposition/blob/main/docs/filesystem-contract.md)
106
+ - [Security](https://github.com/veggerby/container-superposition/blob/main/docs/security.md)
107
+ - [Publishing](https://github.com/veggerby/container-superposition/blob/main/docs/publishing.md)
829
108
 
830
- ## 🤝 Contributing
109
+ ## Examples
831
110
 
832
- Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
111
+ - [Example projects](https://github.com/veggerby/container-superposition/tree/main/examples)
112
+ - [Examples guide](https://github.com/veggerby/container-superposition/blob/main/docs/examples.md)
833
113
 
834
- Keep contributions:
114
+ ## Contributing
835
115
 
836
- - Minimal and focused
837
- - Well-documented
838
- - Fast to build
839
- - Easy to understand
116
+ See [CONTRIBUTING.md](https://github.com/veggerby/container-superposition/blob/main/CONTRIBUTING.md)
840
117
 
841
- ## 📄 License
118
+ ## License
842
119
 
843
- MIT License - use freely in your projects.
120
+ MIT. See [LICENSE](https://github.com/veggerby/container-superposition/blob/main/LICENSE)