container-superposition 0.1.1 → 0.1.3

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 (136) hide show
  1. package/README.md +206 -1
  2. package/dist/scripts/init.js +235 -179
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/tool/commands/doctor.d.ts +15 -0
  5. package/dist/tool/commands/doctor.d.ts.map +1 -0
  6. package/dist/tool/commands/doctor.js +862 -0
  7. package/dist/tool/commands/doctor.js.map +1 -0
  8. package/dist/tool/commands/explain.d.ts +13 -0
  9. package/dist/tool/commands/explain.d.ts.map +1 -0
  10. package/dist/tool/commands/explain.js +211 -0
  11. package/dist/tool/commands/explain.js.map +1 -0
  12. package/dist/tool/commands/list.d.ts +16 -0
  13. package/dist/tool/commands/list.d.ts.map +1 -0
  14. package/dist/tool/commands/list.js +121 -0
  15. package/dist/tool/commands/list.js.map +1 -0
  16. package/dist/tool/commands/plan.d.ts +16 -0
  17. package/dist/tool/commands/plan.d.ts.map +1 -0
  18. package/dist/tool/commands/plan.js +329 -0
  19. package/dist/tool/commands/plan.js.map +1 -0
  20. package/dist/tool/questionnaire/composer.d.ts +6 -1
  21. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  22. package/dist/tool/questionnaire/composer.js +300 -202
  23. package/dist/tool/questionnaire/composer.js.map +1 -1
  24. package/dist/tool/readme/markdown-parser.d.ts.map +1 -1
  25. package/dist/tool/readme/markdown-parser.js.map +1 -1
  26. package/dist/tool/readme/readme-generator.d.ts.map +1 -1
  27. package/dist/tool/readme/readme-generator.js +11 -6
  28. package/dist/tool/readme/readme-generator.js.map +1 -1
  29. package/dist/tool/schema/deployment-targets.d.ts +77 -0
  30. package/dist/tool/schema/deployment-targets.d.ts.map +1 -0
  31. package/dist/tool/schema/deployment-targets.js +91 -0
  32. package/dist/tool/schema/deployment-targets.js.map +1 -0
  33. package/dist/tool/schema/manifest-migrations.d.ts +51 -0
  34. package/dist/tool/schema/manifest-migrations.d.ts.map +1 -0
  35. package/dist/tool/schema/manifest-migrations.js +159 -0
  36. package/dist/tool/schema/manifest-migrations.js.map +1 -0
  37. package/dist/tool/schema/overlay-loader.d.ts +1 -1
  38. package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
  39. package/dist/tool/schema/overlay-loader.js +42 -14
  40. package/dist/tool/schema/overlay-loader.js.map +1 -1
  41. package/dist/tool/schema/types.d.ts +44 -2
  42. package/dist/tool/schema/types.d.ts.map +1 -1
  43. package/dist/tool/utils/merge.d.ts +134 -0
  44. package/dist/tool/utils/merge.d.ts.map +1 -0
  45. package/dist/tool/utils/merge.js +277 -0
  46. package/dist/tool/utils/merge.js.map +1 -0
  47. package/dist/tool/utils/port-utils.d.ts +29 -0
  48. package/dist/tool/utils/port-utils.d.ts.map +1 -0
  49. package/dist/tool/utils/port-utils.js +128 -0
  50. package/dist/tool/utils/port-utils.js.map +1 -0
  51. package/dist/tool/utils/version.d.ts +9 -0
  52. package/dist/tool/utils/version.d.ts.map +1 -0
  53. package/dist/tool/utils/version.js +32 -0
  54. package/dist/tool/utils/version.js.map +1 -0
  55. package/docs/architecture.md +25 -21
  56. package/docs/deployment-targets.md +150 -0
  57. package/docs/discovery-commands.md +442 -0
  58. package/docs/merge-strategy.md +700 -0
  59. package/docs/minimal-and-editor.md +265 -0
  60. package/docs/overlay-imports.md +209 -0
  61. package/docs/overlay-manifest-refactoring.md +2 -2
  62. package/docs/overlay-metadata-archive.md +1 -1
  63. package/docs/overlays.md +91 -23
  64. package/docs/presets-architecture.md +3 -3
  65. package/docs/presets.md +1 -1
  66. package/docs/publishing.md +36 -35
  67. package/docs/team-workflow.md +540 -0
  68. package/overlays/.presets/data-engineering.yml +392 -0
  69. package/overlays/.presets/event-sourced-service.yml +262 -0
  70. package/overlays/.presets/frontend.yml +287 -0
  71. package/overlays/.presets/k8s-operator-dev.yml +462 -0
  72. package/overlays/.registry/README.md +1 -1
  73. package/overlays/.registry/deployment-targets.yml +54 -0
  74. package/overlays/.shared/README.md +43 -0
  75. package/overlays/.shared/compose/common-healthchecks.yml +38 -0
  76. package/overlays/.shared/otel/instrumentation.env +20 -0
  77. package/overlays/.shared/otel/otel-base-config.yaml +30 -0
  78. package/overlays/.shared/vscode/recommended-extensions.json +14 -0
  79. package/overlays/README.md +1 -1
  80. package/overlays/codex/overlay.yml +1 -0
  81. package/overlays/duckdb/README.md +274 -0
  82. package/overlays/duckdb/devcontainer.patch.json +10 -0
  83. package/overlays/duckdb/overlay.yml +17 -0
  84. package/overlays/duckdb/setup.sh +45 -0
  85. package/overlays/duckdb/verify.sh +32 -0
  86. package/overlays/git-helpers/overlay.yml +1 -0
  87. package/overlays/grafana/README.md +5 -5
  88. package/overlays/grafana/dashboard-provider.yml +1 -1
  89. package/overlays/grafana/docker-compose.yml +2 -2
  90. package/overlays/grafana/overlay.yml +6 -1
  91. package/overlays/jaeger/overlay.yml +16 -3
  92. package/overlays/jupyter/.env.example +6 -0
  93. package/overlays/jupyter/README.md +210 -0
  94. package/overlays/jupyter/devcontainer.patch.json +14 -0
  95. package/overlays/jupyter/docker-compose.yml +23 -0
  96. package/overlays/jupyter/overlay.yml +18 -0
  97. package/overlays/jupyter/verify.sh +35 -0
  98. package/overlays/kind/README.md +221 -0
  99. package/overlays/kind/devcontainer.patch.json +10 -0
  100. package/overlays/kind/overlay.yml +18 -0
  101. package/overlays/kind/setup.sh +43 -0
  102. package/overlays/kind/verify.sh +40 -0
  103. package/overlays/localstack/.env.example +6 -0
  104. package/overlays/localstack/README.md +188 -0
  105. package/overlays/localstack/devcontainer.patch.json +21 -0
  106. package/overlays/localstack/docker-compose.yml +25 -0
  107. package/overlays/localstack/overlay.yml +18 -0
  108. package/overlays/localstack/verify.sh +47 -0
  109. package/overlays/loki/overlay.yml +6 -1
  110. package/overlays/modern-cli-tools/overlay.yml +1 -0
  111. package/overlays/mongodb/overlay.yml +12 -2
  112. package/overlays/mysql/overlay.yml +12 -2
  113. package/overlays/nats/overlay.yml +12 -2
  114. package/overlays/openapi-tools/README.md +243 -0
  115. package/overlays/openapi-tools/devcontainer.patch.json +10 -0
  116. package/overlays/openapi-tools/overlay.yml +16 -0
  117. package/overlays/openapi-tools/setup.sh +45 -0
  118. package/overlays/openapi-tools/verify.sh +51 -0
  119. package/overlays/otel-collector/overlay.yml.example +26 -0
  120. package/overlays/postgres/overlay.yml +6 -1
  121. package/overlays/prometheus/overlay.yml +6 -1
  122. package/overlays/rabbitmq/overlay.yml +12 -2
  123. package/overlays/redis/overlay.yml +6 -1
  124. package/overlays/tilt/README.md +259 -0
  125. package/overlays/tilt/devcontainer.patch.json +17 -0
  126. package/overlays/tilt/overlay.yml +19 -0
  127. package/overlays/tilt/setup.sh +25 -0
  128. package/overlays/tilt/verify.sh +24 -0
  129. package/package.json +8 -6
  130. package/tool/README.md +12 -16
  131. package/tool/schema/overlay-manifest.schema.json +64 -4
  132. package/tool/schema/superposition-manifest.schema.json +104 -0
  133. /package/overlays/{presets → .presets}/docs-site.yml +0 -0
  134. /package/overlays/{presets → .presets}/fullstack.yml +0 -0
  135. /package/overlays/{presets → .presets}/microservice.yml +0 -0
  136. /package/overlays/{presets → .presets}/web-api.yml +0 -0
@@ -0,0 +1,259 @@
1
+ # Tilt Overlay
2
+
3
+ Live update and orchestration for Kubernetes development with real-time feedback.
4
+
5
+ ## Features
6
+
7
+ - **Tilt** - Smart rebuilds and live updates for Kubernetes
8
+ - **Web UI** - Browser-based dashboard on port 10350
9
+ - **Live Updates** - See code changes instantly in K8s
10
+ - **Smart Builds** - Only rebuild what changed
11
+ - **Resource Orchestration** - Manage complex K8s workflows
12
+ - **Multi-service Support** - Handle microservices architectures
13
+
14
+ ## How It Works
15
+
16
+ This overlay installs Tilt, a development tool that orchestrates your Kubernetes development workflow. Tilt watches your code, automatically rebuilds containers, and updates your Kubernetes cluster when files change.
17
+
18
+ **Suggested overlays:**
19
+
20
+ - `kind` - Local Kubernetes cluster
21
+ - `kubectl-helm` - Kubernetes CLI and Helm
22
+
23
+ **Conflicts:**
24
+
25
+ - `skaffold` - Alternative K8s build orchestration tool
26
+
27
+ ## Installation
28
+
29
+ Tilt is installed automatically during devcontainer creation via `setup.sh`:
30
+
31
+ - Downloads and installs latest Tilt CLI
32
+ - Installs to `/usr/local/bin/tilt`
33
+ - Web UI accessible on port 10350
34
+
35
+ ## Common Commands
36
+
37
+ ### Starting Tilt
38
+
39
+ ```bash
40
+ # Start Tilt with Tiltfile in current directory
41
+ tilt up
42
+
43
+ # Start Tilt in specific directory
44
+ tilt up --file ./services/api/Tiltfile
45
+
46
+ # Start without opening browser
47
+ tilt up --hud=false
48
+
49
+ # Run in CI mode (no interactive UI)
50
+ tilt ci
51
+ ```
52
+
53
+ ### Managing Resources
54
+
55
+ ```bash
56
+ # List resources
57
+ tilt get uiresources
58
+
59
+ # Trigger manual build
60
+ tilt trigger <resource-name>
61
+
62
+ # Disable a resource
63
+ tilt disable <resource-name>
64
+
65
+ # Enable a resource
66
+ tilt enable <resource-name>
67
+ ```
68
+
69
+ ### Logs and Debugging
70
+
71
+ ```bash
72
+ # View logs
73
+ tilt logs <resource-name>
74
+
75
+ # Get resource status
76
+ tilt get uiresources <resource-name>
77
+
78
+ # Dump snapshot for debugging
79
+ tilt dump engine
80
+ ```
81
+
82
+ ## Tiltfile Configuration
83
+
84
+ Create a `Tiltfile` in your project root:
85
+
86
+ ### Basic Example
87
+
88
+ ```python
89
+ # Build Docker image
90
+ docker_build('myapp', '.')
91
+
92
+ # Deploy to Kubernetes
93
+ k8s_yaml('k8s/deployment.yaml')
94
+
95
+ # Forward port
96
+ k8s_resource('myapp', port_forwards=8000)
97
+ ```
98
+
99
+ ### Live Update Example
100
+
101
+ ```python
102
+ # Build with live update (no rebuild for code changes)
103
+ docker_build('myapp', '.',
104
+ live_update=[
105
+ sync('./src', '/app/src'),
106
+ run('npm install', trigger=['package.json']),
107
+ restart_container(),
108
+ ]
109
+ )
110
+
111
+ k8s_yaml('k8s/deployment.yaml')
112
+ k8s_resource('myapp', port_forwards=8000)
113
+ ```
114
+
115
+ ### Multi-Service Example
116
+
117
+ ```python
118
+ # API service
119
+ docker_build('api', './services/api')
120
+ k8s_yaml('./services/api/k8s.yaml')
121
+ k8s_resource('api', port_forwards=3000)
122
+
123
+ # Frontend service
124
+ docker_build('frontend', './services/frontend')
125
+ k8s_yaml('./services/frontend/k8s.yaml')
126
+ k8s_resource('frontend', port_forwards=8080)
127
+
128
+ # Database (no rebuild needed)
129
+ k8s_yaml('./infra/postgres.yaml')
130
+ k8s_resource('postgres', port_forwards=5432)
131
+ ```
132
+
133
+ ### Custom Buttons
134
+
135
+ ```python
136
+ # Add custom actions to UI
137
+ local_resource(
138
+ 'db-migrate',
139
+ 'kubectl exec -it deploy/api -- npm run migrate',
140
+ trigger_mode=TRIGGER_MODE_MANUAL,
141
+ auto_init=False
142
+ )
143
+ ```
144
+
145
+ ## Use Cases
146
+
147
+ - **Microservices development** - Manage multiple services with dependencies
148
+ - **Rapid iteration** - See changes instantly without manual rebuilds
149
+ - **Team development** - Standardize local development workflow
150
+ - **Complex K8s apps** - Orchestrate multi-tier applications
151
+ - **Learning Kubernetes** - Simplified K8s development experience
152
+
153
+ **Integrates well with:**
154
+
155
+ - `kind` or `k3d` - Local Kubernetes clusters
156
+ - `kubectl-helm` - Kubernetes CLI and Helm
157
+ - `nodejs`, `python`, `dotnet` - Application development
158
+ - `docker-in-docker` - Docker builds
159
+
160
+ ## Web UI
161
+
162
+ Access Tilt's web dashboard:
163
+
164
+ - **URL**: http://localhost:10350
165
+ - **Features**:
166
+ - Real-time resource status
167
+ - Build logs and errors
168
+ - Resource dependencies graph
169
+ - Manual trigger buttons
170
+ - Performance metrics
171
+
172
+ The UI auto-opens when you run `tilt up`.
173
+
174
+ ## Benefits vs Skaffold
175
+
176
+ | Feature | Tilt | Skaffold |
177
+ | ------------------ | ------------------------ | --------------------- |
178
+ | **UI** | ✅ Rich web UI | ⚠️ CLI only |
179
+ | **Live Updates** | ✅ Sophisticated | ⚠️ Basic |
180
+ | **Configuration** | ✅ Programmable (Python) | ⚠️ Declarative (YAML) |
181
+ | **Flexibility** | ✅ Very flexible | ⚠️ More opinionated |
182
+ | **Learning Curve** | ⚠️ Steeper | ✅ Gentler |
183
+ | **CI Integration** | ✅ Good | ✅ Excellent |
184
+
185
+ **When to use Tilt:**
186
+
187
+ - Need rich UI and debugging tools
188
+ - Want programmable configuration
189
+ - Developing complex microservices
190
+ - Value rapid feedback loops
191
+
192
+ **When to use Skaffold:**
193
+
194
+ - Prefer declarative configuration
195
+ - Focus on CI/CD pipelines
196
+ - Want simpler tool
197
+ - Need Google Cloud integration
198
+
199
+ ## Troubleshooting
200
+
201
+ ### Tilt Can't Find Kubernetes
202
+
203
+ Ensure you have a K8s cluster:
204
+
205
+ ```bash
206
+ # Create kind cluster
207
+ kind create cluster --name dev
208
+
209
+ # Verify kubectl works
210
+ kubectl cluster-info
211
+ ```
212
+
213
+ ### Build Failures
214
+
215
+ Check build logs in Tilt UI or:
216
+
217
+ ```bash
218
+ tilt logs <resource-name>
219
+ ```
220
+
221
+ ### Port Already in Use
222
+
223
+ Change Tilt UI port:
224
+
225
+ ```bash
226
+ # In Tiltfile
227
+ config.define_string('ui-port', args=False, usage='Tilt UI port')
228
+ cfg = config.parse()
229
+ tilt_port = cfg.get('ui-port', '10350')
230
+ ```
231
+
232
+ Or use port offset when generating devcontainer.
233
+
234
+ ### Live Update Not Working
235
+
236
+ Ensure your Tiltfile has `live_update` configuration:
237
+
238
+ ```python
239
+ docker_build('myapp', '.',
240
+ live_update=[
241
+ sync('./src', '/app/src'),
242
+ restart_container(),
243
+ ]
244
+ )
245
+ ```
246
+
247
+ ## References
248
+
249
+ - [Tilt Documentation](https://docs.tilt.dev/)
250
+ - [Tilt Getting Started](https://docs.tilt.dev/tutorial.html)
251
+ - [Tiltfile API Reference](https://docs.tilt.dev/api.html)
252
+ - [Tilt Examples](https://github.com/tilt-dev/tilt-example-html)
253
+
254
+ **Related Overlays:**
255
+
256
+ - `kind` - Local Kubernetes cluster (suggested)
257
+ - `kubectl-helm` - Kubernetes CLI and Helm (suggested)
258
+ - `skaffold` - Alternative K8s build tool (conflicts)
259
+ - `docker-in-docker` - Docker builds
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
+ "features": {
4
+ "./features/cross-distro-packages": {
5
+ "apt": "curl",
6
+ "apk": "curl"
7
+ }
8
+ },
9
+ "forwardPorts": [10350],
10
+ "portsAttributes": {
11
+ "10350": {
12
+ "label": "Tilt UI",
13
+ "onAutoForward": "openBrowser"
14
+ }
15
+ },
16
+ "postCreateCommand": "bash .devcontainer/scripts/setup-tilt.sh"
17
+ }
@@ -0,0 +1,19 @@
1
+ id: tilt
2
+ name: Tilt
3
+ description: Live update and orchestration for Kubernetes development
4
+ category: dev
5
+ supports: []
6
+ requires: []
7
+ suggests:
8
+ - kind
9
+ - kubectl-helm
10
+ conflicts:
11
+ - skaffold
12
+ tags:
13
+ - dev
14
+ - kubernetes
15
+ - k8s
16
+ - development
17
+ - live-reload
18
+ ports:
19
+ - 10350
@@ -0,0 +1,25 @@
1
+ #!/bin/bash
2
+ # Setup script for Tilt
3
+
4
+ set -e
5
+
6
+ echo "🔧 Setting up Tilt..."
7
+
8
+ # Install Tilt
9
+ echo "📦 Installing Tilt..."
10
+
11
+ curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash
12
+
13
+ # Verify installation
14
+ if command -v tilt &> /dev/null; then
15
+ echo "✅ Tilt installed successfully"
16
+ tilt version
17
+ else
18
+ echo "❌ Tilt installation failed"
19
+ exit 1
20
+ fi
21
+
22
+ echo "✅ Tilt setup complete"
23
+ echo ""
24
+ echo "ℹ️ To start Tilt, run:"
25
+ echo " tilt up"
@@ -0,0 +1,24 @@
1
+ #!/bin/bash
2
+ # Verification script for Tilt overlay
3
+ # Confirms Tilt is installed
4
+
5
+ set -e
6
+
7
+ echo "🔍 Verifying Tilt overlay..."
8
+ echo ""
9
+
10
+ # Check Tilt is installed
11
+ echo "1️⃣ Checking Tilt installation..."
12
+ if command -v tilt &> /dev/null; then
13
+ tilt version
14
+ echo " ✅ Tilt is installed"
15
+ else
16
+ echo " ❌ Tilt is not installed"
17
+ exit 1
18
+ fi
19
+
20
+ echo ""
21
+ echo "✅ Tilt overlay verification complete"
22
+ echo ""
23
+ echo "ℹ️ To start Tilt, run:"
24
+ echo " tilt up"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "container-superposition",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Solution-ready devcontainer templates and features with guided initialization",
5
5
  "type": "module",
6
6
  "main": "dist/scripts/init.js",
@@ -14,7 +14,9 @@
14
14
  "test": "vitest run",
15
15
  "test:watch": "vitest",
16
16
  "test:smoke": "bash scripts/test.sh",
17
- "docs:generate": "tsx docs/generate-docs.ts",
17
+ "docs:generate": "tsx docs/generate-docs.ts && prettier --write docs/overlays.md",
18
+ "lint": "tsc --noEmit && npm run format:check",
19
+ "lint:fix": "npm run format",
18
20
  "format": "prettier --write \"**/*.{ts,js,json,md,yaml,yml}\"",
19
21
  "format:check": "prettier --check \"**/*.{ts,js,json,md,yaml,yml}\"",
20
22
  "clean": "rm -rf dist",
@@ -53,15 +55,15 @@
53
55
  "dependencies": {
54
56
  "@inquirer/checkbox": "^5.0.4",
55
57
  "@inquirer/prompts": "^8.2.0",
56
- "boxen": "^7.1.1",
58
+ "boxen": "^8.0.1",
57
59
  "chalk": "^5.6.2",
58
- "commander": "^12.1.0",
60
+ "commander": "^14.0.3",
59
61
  "js-yaml": "^4.1.1",
60
- "ora": "^8.2.0"
62
+ "ora": "^9.3.0"
61
63
  },
62
64
  "devDependencies": {
63
65
  "@types/js-yaml": "^4.0.9",
64
- "@types/node": "^20.19.33",
66
+ "@types/node": "^25.2.3",
65
67
  "@vitest/ui": "^4.0.18",
66
68
  "prettier": "^3.4.2",
67
69
  "tsx": "^4.7.0",
package/tool/README.md CHANGED
@@ -103,6 +103,7 @@ This makes the questionnaire more engaging and the output easier to scan.
103
103
  | `--cloud-tools <list>` | Cloud tools: `aws-cli`, `azure-cli`, `gcloud`, `kubectl-helm`, `terraform`, `pulumi` | `--cloud-tools aws-cli,kubectl-helm` |
104
104
  | `--dev-tools <list>` | Development tools: `docker-in-docker`, `docker-sock`, `playwright`, `codex`, `git-helpers`, `pre-commit`, `commitlint`, `just`, `direnv`, `modern-cli-tools`, `ngrok` | `--dev-tools docker-in-docker,playwright` |
105
105
  | `--port-offset <number>` | Add offset to all exposed ports (e.g., 100 makes Grafana 3100) | `--port-offset 100` |
106
+ | `--target <environment>` | Deployment target: local, codespaces, gitpod, devpod (validates compatibility) | `--target codespaces` |
106
107
  | `-o`, `--output <path>` | Output directory (default: `./.devcontainer`) | `-o ./custom-path` |
107
108
  | `-h`, `--help` | Show help | `--help` |
108
109
 
@@ -121,21 +122,16 @@ After running the tool, you'll have:
121
122
  ```
122
123
  .devcontainer/
123
124
  ├── devcontainer.json # Main configuration (editable!)
124
- ├── docker-compose.yml # Base compose file (if using compose template)
125
+ ├── docker-compose.yml # Combined compose file with selected services
125
126
  ├── .env.example # Environment variables from selected overlays
126
127
  ├── scripts/
127
128
  │ └── post_create.sh # Post-creation scripts
128
- ├── docker-compose.postgres.yml # (if postgres selected)
129
- ├── docker-compose.redis.yml # (if redis selected)
130
- ├── docker-compose.otel-collector.yml # (if otel-collector selected)
131
- ├── docker-compose.jaeger.yml # (if jaeger selected)
132
- ├── docker-compose.prometheus.yml # (if prometheus selected)
133
- ├── docker-compose.grafana.yml # (if grafana selected)
134
- ├── docker-compose.loki.yml # (if loki selected)
135
- ├── otel-collector-config.yaml # (if otel-collector selected)
136
- ├── prometheus.yml # (if prometheus selected)
137
- ├── grafana-datasources.yml # (if grafana selected)
138
- └── loki-config.yaml # (if loki selected)
129
+ ├── otel-collector-config-otel-collector.yaml # (if otel-collector selected)
130
+ ├── prometheus-prometheus.yml # (if prometheus selected)
131
+ ├── grafana-datasources-grafana.yml # (if grafana selected)
132
+ ├── dashboard-provider-grafana.yml # (if grafana selected)
133
+ ├── dashboards-grafana/ # (if grafana selected)
134
+ └── loki-config-loki.yaml # (if loki selected)
139
135
  ```
140
136
 
141
137
  All `.env.example` files from selected overlays are automatically merged into a single file with all relevant environment variables.
@@ -192,17 +188,17 @@ Each overlay is a composable package that can include:
192
188
  ```
193
189
  overlays/postgres/
194
190
  ├── devcontainer.patch.json # Features, env vars, ports (merged into devcontainer.json)
195
- ├── docker-compose.yml # Service definition (copied as docker-compose.{overlay}.yml)
191
+ ├── docker-compose.yml # Service definition (merged into output docker-compose.yml)
196
192
  ├── .env.example # Environment variables (merged into combined .env.example)
197
- └── [additional files] # Config files, scripts, directories (copied as-is)
193
+ └── [additional files] # Copied with overlay suffix to avoid filename conflicts
198
194
  ```
199
195
 
200
196
  The tool intelligently handles each file type:
201
197
 
202
198
  - **devcontainer.patch.json** - Deep-merged into devcontainer.json (arrays concatenated, objects merged)
203
- - **docker-compose.yml** - Copied as `docker-compose.{overlay}.yml` and referenced in devcontainer.json
199
+ - **docker-compose.yml** - Merged with base compose into one output `docker-compose.yml`
204
200
  - **.env.example** - Content merged into combined `.env.example` in output
205
- - **Other files/directories** - Copied as-is to output (e.g., `otel-collector.yml`, `config/redis.conf`)
201
+ - **Other files/directories** - Copied with an overlay suffix (e.g., `prometheus-prometheus.yml`, `dashboards-grafana/`)
206
202
 
207
203
  This allows overlays to provide complete, self-contained configurations including any necessary config files.
208
204
 
@@ -68,11 +68,58 @@
68
68
  },
69
69
  "ports": {
70
70
  "type": "array",
71
- "description": "Ports used by the overlay (for offset calculation)",
71
+ "description": "Ports used by the overlay (for offset calculation and documentation)",
72
72
  "items": {
73
- "type": "integer",
74
- "minimum": 1,
75
- "maximum": 65535
73
+ "oneOf": [
74
+ {
75
+ "type": "integer",
76
+ "minimum": 1,
77
+ "maximum": 65535,
78
+ "description": "Simple port number (legacy format)"
79
+ },
80
+ {
81
+ "type": "object",
82
+ "description": "Rich port metadata with service info and connection details",
83
+ "required": ["port"],
84
+ "properties": {
85
+ "port": {
86
+ "type": "integer",
87
+ "minimum": 1,
88
+ "maximum": 65535,
89
+ "description": "Port number"
90
+ },
91
+ "service": {
92
+ "type": "string",
93
+ "description": "Service name (e.g., postgres, grafana, jaeger)",
94
+ "pattern": "^[a-z0-9-]+$"
95
+ },
96
+ "protocol": {
97
+ "type": "string",
98
+ "description": "Protocol type",
99
+ "enum": ["http", "https", "tcp", "udp", "grpc"]
100
+ },
101
+ "description": {
102
+ "type": "string",
103
+ "description": "Human-readable description of what this port is for"
104
+ },
105
+ "path": {
106
+ "type": "string",
107
+ "description": "Default path for HTTP/HTTPS services (e.g., /, /metrics)",
108
+ "pattern": "^/"
109
+ },
110
+ "onAutoForward": {
111
+ "type": "string",
112
+ "description": "VS Code port auto-forward behavior",
113
+ "enum": ["notify", "openBrowser", "openPreview", "silent", "ignore"]
114
+ },
115
+ "connectionStringTemplate": {
116
+ "type": "string",
117
+ "description": "Template for connection string (e.g., postgresql://{user}:{password}@{host}:{port}/{database})"
118
+ }
119
+ },
120
+ "additionalProperties": false
121
+ }
122
+ ]
76
123
  },
77
124
  "default": []
78
125
  },
@@ -80,6 +127,19 @@
80
127
  "type": "integer",
81
128
  "description": "Display order within category (lower = first)",
82
129
  "minimum": 1
130
+ },
131
+ "imports": {
132
+ "type": "array",
133
+ "description": "Shared files to import from overlays/.shared/",
134
+ "items": {
135
+ "type": "string"
136
+ },
137
+ "default": []
138
+ },
139
+ "minimal": {
140
+ "type": "boolean",
141
+ "description": "Whether this overlay is excluded in minimal mode (true = extra/optional)",
142
+ "default": false
83
143
  }
84
144
  },
85
145
  "additionalProperties": false
@@ -0,0 +1,104 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "Superposition Manifest",
5
+ "description": "Manifest file (superposition.json) generated by container-superposition to track devcontainer configuration",
6
+ "properties": {
7
+ "manifestVersion": {
8
+ "type": "string",
9
+ "description": "Schema version of the manifest (increments on breaking changes)",
10
+ "pattern": "^[0-9]+$"
11
+ },
12
+ "generatedBy": {
13
+ "type": "string",
14
+ "description": "Version of container-superposition that created this manifest"
15
+ },
16
+ "version": {
17
+ "type": "string",
18
+ "description": "Legacy field for backward compatibility (deprecated, use manifestVersion instead)"
19
+ },
20
+ "generated": {
21
+ "type": "string",
22
+ "format": "date-time",
23
+ "description": "ISO 8601 timestamp when the manifest was generated"
24
+ },
25
+ "baseTemplate": {
26
+ "type": "string",
27
+ "enum": ["plain", "compose"],
28
+ "description": "Base devcontainer template used (plain for single image, compose for multi-service)"
29
+ },
30
+ "baseImage": {
31
+ "type": "string",
32
+ "description": "Base container image used for the devcontainer"
33
+ },
34
+ "overlays": {
35
+ "type": "array",
36
+ "items": {
37
+ "type": "string"
38
+ },
39
+ "description": "List of overlay IDs that were applied to create this configuration"
40
+ },
41
+ "portOffset": {
42
+ "type": "number",
43
+ "minimum": 0,
44
+ "description": "Port offset applied to all service ports (optional)"
45
+ },
46
+ "preset": {
47
+ "type": "string",
48
+ "description": "ID of the preset used to generate this configuration (optional)"
49
+ },
50
+ "presetChoices": {
51
+ "type": "object",
52
+ "additionalProperties": {
53
+ "type": "string"
54
+ },
55
+ "description": "User choices made within preset user-choice sections (optional)"
56
+ },
57
+ "autoResolved": {
58
+ "type": "object",
59
+ "properties": {
60
+ "added": {
61
+ "type": "array",
62
+ "items": {
63
+ "type": "string"
64
+ },
65
+ "description": "List of overlays that were automatically added as dependencies"
66
+ },
67
+ "reason": {
68
+ "type": "string",
69
+ "description": "Human-readable reason why dependencies were added"
70
+ }
71
+ },
72
+ "required": ["added", "reason"],
73
+ "description": "Information about automatically resolved dependencies (optional)"
74
+ },
75
+ "containerName": {
76
+ "type": "string",
77
+ "description": "Name of the container/project from devcontainer.json (optional)"
78
+ },
79
+ "customizations": {
80
+ "type": "object",
81
+ "properties": {
82
+ "enabled": {
83
+ "type": "boolean",
84
+ "description": "Whether custom patches are enabled"
85
+ },
86
+ "location": {
87
+ "type": "string",
88
+ "description": "Path to custom patches directory relative to workspace"
89
+ }
90
+ },
91
+ "required": ["enabled", "location"],
92
+ "description": "Information about custom patches/overrides (optional)"
93
+ }
94
+ },
95
+ "required": [
96
+ "manifestVersion",
97
+ "generatedBy",
98
+ "generated",
99
+ "baseTemplate",
100
+ "baseImage",
101
+ "overlays"
102
+ ],
103
+ "additionalProperties": false
104
+ }
File without changes
File without changes
File without changes
File without changes