container-superposition 0.1.1 → 0.1.4

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 (178) hide show
  1. package/README.md +569 -8
  2. package/dist/scripts/init.js +436 -254
  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 +299 -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 +67 -0
  17. package/dist/tool/commands/plan.d.ts.map +1 -0
  18. package/dist/tool/commands/plan.js +851 -0
  19. package/dist/tool/commands/plan.js.map +1 -0
  20. package/dist/tool/questionnaire/composer.d.ts +16 -2
  21. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  22. package/dist/tool/questionnaire/composer.js +411 -200
  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 +62 -2
  42. package/dist/tool/schema/types.d.ts.map +1 -1
  43. package/dist/tool/utils/gitignore.d.ts +15 -0
  44. package/dist/tool/utils/gitignore.d.ts.map +1 -0
  45. package/dist/tool/utils/gitignore.js +41 -0
  46. package/dist/tool/utils/gitignore.js.map +1 -0
  47. package/dist/tool/utils/merge.d.ts +134 -0
  48. package/dist/tool/utils/merge.d.ts.map +1 -0
  49. package/dist/tool/utils/merge.js +277 -0
  50. package/dist/tool/utils/merge.js.map +1 -0
  51. package/dist/tool/utils/port-utils.d.ts +29 -0
  52. package/dist/tool/utils/port-utils.d.ts.map +1 -0
  53. package/dist/tool/utils/port-utils.js +128 -0
  54. package/dist/tool/utils/port-utils.js.map +1 -0
  55. package/dist/tool/utils/services-export.d.ts +14 -0
  56. package/dist/tool/utils/services-export.d.ts.map +1 -0
  57. package/dist/tool/utils/services-export.js +478 -0
  58. package/dist/tool/utils/services-export.js.map +1 -0
  59. package/dist/tool/utils/summary.d.ts +69 -0
  60. package/dist/tool/utils/summary.d.ts.map +1 -0
  61. package/dist/tool/utils/summary.js +260 -0
  62. package/dist/tool/utils/summary.js.map +1 -0
  63. package/dist/tool/utils/version.d.ts +9 -0
  64. package/dist/tool/utils/version.d.ts.map +1 -0
  65. package/dist/tool/utils/version.js +32 -0
  66. package/dist/tool/utils/version.js.map +1 -0
  67. package/docs/architecture.md +25 -21
  68. package/docs/deployment-targets.md +150 -0
  69. package/docs/discovery-commands.md +442 -0
  70. package/docs/merge-strategy.md +700 -0
  71. package/docs/minimal-and-editor.md +265 -0
  72. package/docs/overlay-imports.md +209 -0
  73. package/docs/overlay-manifest-refactoring.md +2 -2
  74. package/docs/overlay-metadata-archive.md +1 -1
  75. package/docs/overlays.md +139 -28
  76. package/docs/presets-architecture.md +3 -3
  77. package/docs/presets.md +1 -1
  78. package/docs/publishing.md +36 -35
  79. package/docs/team-workflow.md +540 -0
  80. package/overlays/.presets/data-engineering.yml +392 -0
  81. package/overlays/.presets/event-sourced-service.yml +262 -0
  82. package/overlays/.presets/frontend.yml +287 -0
  83. package/overlays/.presets/k8s-operator-dev.yml +462 -0
  84. package/overlays/{presets → .presets}/microservice.yml +32 -6
  85. package/overlays/.presets/web-api.yml +129 -0
  86. package/overlays/.registry/README.md +1 -1
  87. package/overlays/.registry/deployment-targets.yml +54 -0
  88. package/overlays/.shared/README.md +43 -0
  89. package/overlays/.shared/compose/common-healthchecks.yml +38 -0
  90. package/overlays/.shared/otel/instrumentation.env +20 -0
  91. package/overlays/.shared/otel/otel-base-config.yaml +30 -0
  92. package/overlays/.shared/vscode/recommended-extensions.json +14 -0
  93. package/overlays/README.md +1 -1
  94. package/overlays/cloudflared/README.md +190 -0
  95. package/overlays/cloudflared/devcontainer.patch.json +3 -0
  96. package/overlays/cloudflared/overlay.yml +15 -0
  97. package/overlays/cloudflared/setup.sh +49 -0
  98. package/overlays/cloudflared/verify.sh +21 -0
  99. package/overlays/codex/overlay.yml +1 -0
  100. package/overlays/direnv/README.md +6 -4
  101. package/overlays/direnv/setup.sh +0 -12
  102. package/overlays/duckdb/README.md +274 -0
  103. package/overlays/duckdb/devcontainer.patch.json +10 -0
  104. package/overlays/duckdb/overlay.yml +17 -0
  105. package/overlays/duckdb/setup.sh +45 -0
  106. package/overlays/duckdb/verify.sh +32 -0
  107. package/overlays/git-helpers/overlay.yml +1 -0
  108. package/overlays/grafana/README.md +5 -5
  109. package/overlays/grafana/dashboard-provider.yml +1 -1
  110. package/overlays/grafana/docker-compose.yml +2 -2
  111. package/overlays/grafana/overlay.yml +6 -1
  112. package/overlays/grpc-tools/README.md +242 -0
  113. package/overlays/grpc-tools/devcontainer.patch.json +14 -0
  114. package/overlays/grpc-tools/overlay.yml +14 -0
  115. package/overlays/grpc-tools/setup.sh +57 -0
  116. package/overlays/grpc-tools/verify.sh +47 -0
  117. package/overlays/jaeger/overlay.yml +16 -3
  118. package/overlays/jupyter/.env.example +6 -0
  119. package/overlays/jupyter/README.md +210 -0
  120. package/overlays/jupyter/devcontainer.patch.json +14 -0
  121. package/overlays/jupyter/docker-compose.yml +23 -0
  122. package/overlays/jupyter/overlay.yml +18 -0
  123. package/overlays/jupyter/verify.sh +35 -0
  124. package/overlays/keycloak/.env.example +5 -0
  125. package/overlays/keycloak/README.md +238 -0
  126. package/overlays/keycloak/devcontainer.patch.json +17 -0
  127. package/overlays/keycloak/docker-compose.yml +32 -0
  128. package/overlays/keycloak/overlay.yml +23 -0
  129. package/overlays/keycloak/verify.sh +54 -0
  130. package/overlays/kind/README.md +221 -0
  131. package/overlays/kind/devcontainer.patch.json +10 -0
  132. package/overlays/kind/overlay.yml +18 -0
  133. package/overlays/kind/setup.sh +43 -0
  134. package/overlays/kind/verify.sh +40 -0
  135. package/overlays/localstack/.env.example +6 -0
  136. package/overlays/localstack/README.md +188 -0
  137. package/overlays/localstack/devcontainer.patch.json +21 -0
  138. package/overlays/localstack/docker-compose.yml +25 -0
  139. package/overlays/localstack/overlay.yml +18 -0
  140. package/overlays/localstack/verify.sh +47 -0
  141. package/overlays/loki/overlay.yml +6 -1
  142. package/overlays/mailpit/.env.example +4 -0
  143. package/overlays/mailpit/README.md +191 -0
  144. package/overlays/mailpit/devcontainer.patch.json +20 -0
  145. package/overlays/mailpit/docker-compose.yml +17 -0
  146. package/overlays/mailpit/overlay.yml +26 -0
  147. package/overlays/mailpit/verify.sh +52 -0
  148. package/overlays/modern-cli-tools/overlay.yml +1 -0
  149. package/overlays/mongodb/overlay.yml +12 -2
  150. package/overlays/mysql/overlay.yml +12 -2
  151. package/overlays/nats/overlay.yml +12 -2
  152. package/overlays/ngrok/overlay.yml +2 -1
  153. package/overlays/openapi-tools/README.md +243 -0
  154. package/overlays/openapi-tools/devcontainer.patch.json +10 -0
  155. package/overlays/openapi-tools/overlay.yml +16 -0
  156. package/overlays/openapi-tools/setup.sh +45 -0
  157. package/overlays/openapi-tools/verify.sh +51 -0
  158. package/overlays/otel-collector/overlay.yml.example +26 -0
  159. package/overlays/postgres/overlay.yml +6 -1
  160. package/overlays/prometheus/overlay.yml +6 -1
  161. package/overlays/python/README.md +51 -35
  162. package/overlays/python/devcontainer.patch.json +7 -4
  163. package/overlays/python/setup.sh +50 -23
  164. package/overlays/python/verify.sh +29 -1
  165. package/overlays/rabbitmq/overlay.yml +12 -2
  166. package/overlays/redis/overlay.yml +6 -1
  167. package/overlays/tilt/README.md +259 -0
  168. package/overlays/tilt/devcontainer.patch.json +17 -0
  169. package/overlays/tilt/overlay.yml +19 -0
  170. package/overlays/tilt/setup.sh +25 -0
  171. package/overlays/tilt/verify.sh +24 -0
  172. package/package.json +8 -6
  173. package/tool/README.md +12 -16
  174. package/tool/schema/overlay-manifest.schema.json +64 -4
  175. package/tool/schema/superposition-manifest.schema.json +104 -0
  176. package/overlays/presets/web-api.yml +0 -109
  177. /package/overlays/{presets → .presets}/docs-site.yml +0 -0
  178. /package/overlays/{presets → .presets}/fullstack.yml +0 -0
@@ -14,5 +14,15 @@ tags:
14
14
  - nats
15
15
  - jetstream
16
16
  ports:
17
- - 4222
18
- - 8222
17
+ - port: 4222
18
+ service: nats
19
+ protocol: tcp
20
+ description: NATS client connection
21
+ onAutoForward: notify
22
+ connectionStringTemplate: 'nats://{host}:{port}'
23
+ - port: 8222
24
+ service: nats
25
+ protocol: http
26
+ description: NATS monitoring/stats endpoint
27
+ path: /
28
+ onAutoForward: ignore
@@ -5,7 +5,8 @@ category: dev
5
5
  supports: []
6
6
  requires: []
7
7
  suggests: []
8
- conflicts: []
8
+ conflicts:
9
+ - cloudflared
9
10
  tags:
10
11
  - dev
11
12
  - tunneling
@@ -0,0 +1,243 @@
1
+ # OpenAPI Tools Overlay
2
+
3
+ OpenAPI/Swagger tooling for API development, documentation, and validation.
4
+
5
+ ## Features
6
+
7
+ - **swagger-cli** - OpenAPI/Swagger validation
8
+ - **spectral** - OpenAPI linting with customizable rules
9
+ - **redocly** - Documentation generation and API bundling
10
+ - **npm-based** - Easy to install and update
11
+
12
+ ## How It Works
13
+
14
+ This overlay installs OpenAPI development tools as global npm packages. These tools help you create, validate, lint, and document APIs using the OpenAPI Specification (formerly Swagger).
15
+
16
+ **Suggested overlays:**
17
+
18
+ - `nodejs` - Node.js runtime for running OpenAPI tools
19
+
20
+ ## Installation
21
+
22
+ OpenAPI tools are installed automatically during devcontainer creation via `setup.sh`:
23
+
24
+ - `@apidevtools/swagger-cli` - OpenAPI validation
25
+ - `@stoplight/spectral-cli` - OpenAPI linting
26
+ - `@redocly/cli` - Documentation and bundling
27
+
28
+ ## Common Commands
29
+
30
+ ### Validation
31
+
32
+ ```bash
33
+ # Validate OpenAPI specification
34
+ swagger-cli validate openapi.yaml
35
+
36
+ # Validate with detailed output
37
+ swagger-cli validate openapi.yaml --debug
38
+
39
+ # Bundle multiple files into one
40
+ swagger-cli bundle openapi.yaml --outfile bundled.yaml --type yaml
41
+ ```
42
+
43
+ ### Linting
44
+
45
+ ```bash
46
+ # Lint OpenAPI spec with spectral
47
+ spectral lint openapi.yaml
48
+
49
+ # Use custom ruleset
50
+ spectral lint openapi.yaml --ruleset .spectral.yaml
51
+
52
+ # Output as JSON
53
+ spectral lint openapi.yaml --format json
54
+ ```
55
+
56
+ ### Redocly CLI
57
+
58
+ ```bash
59
+ # Lint with redocly
60
+ redocly lint openapi.yaml
61
+
62
+ # Bundle specification
63
+ redocly bundle openapi.yaml -o bundled.yaml
64
+
65
+ # Build documentation
66
+ redocly build-docs openapi.yaml
67
+
68
+ # Preview documentation locally
69
+ redocly preview-docs openapi.yaml
70
+ ```
71
+
72
+ ## Configuration
73
+
74
+ ### Spectral Ruleset
75
+
76
+ Create `.spectral.yaml` for custom linting rules:
77
+
78
+ ```yaml
79
+ extends: [[spectral:oas, all]]
80
+
81
+ rules:
82
+ operation-description: error
83
+ operation-tags: error
84
+ operation-operationId: error
85
+
86
+ # Custom rules
87
+ my-custom-rule:
88
+ description: Ensure all operations have examples
89
+ given: $.paths[*][*].responses[*].content[*]
90
+ severity: warn
91
+ then:
92
+ field: example
93
+ function: truthy
94
+ ```
95
+
96
+ ### Redocly Configuration
97
+
98
+ Create `redocly.yaml`:
99
+
100
+ ```yaml
101
+ apis:
102
+ main:
103
+ root: ./openapi.yaml
104
+
105
+ lint:
106
+ extends:
107
+ - recommended
108
+
109
+ rules:
110
+ operation-description: error
111
+ operation-tags: error
112
+ ```
113
+
114
+ ## Use Cases
115
+
116
+ - **API design** - Design and validate OpenAPI specifications
117
+ - **Documentation** - Generate beautiful API documentation
118
+ - **Quality assurance** - Lint APIs for best practices
119
+ - **Code generation** - Validate specs before code generation
120
+ - **CI/CD** - Automated API validation in pipelines
121
+
122
+ **Integrates well with:**
123
+
124
+ - `nodejs` - Node.js runtime (suggested)
125
+ - Any REST API framework (Express, FastAPI, ASP.NET Core, etc.)
126
+ - `docker-in-docker` or `docker-sock` - For containerized API testing
127
+
128
+ ## OpenAPI Specification Basics
129
+
130
+ ### Minimal Example
131
+
132
+ ```yaml
133
+ openapi: 3.0.0
134
+ info:
135
+ title: My API
136
+ version: 1.0.0
137
+ description: API description
138
+
139
+ servers:
140
+ - url: http://localhost:3000
141
+ description: Development server
142
+
143
+ paths:
144
+ /users:
145
+ get:
146
+ summary: Get all users
147
+ operationId: getUsers
148
+ tags:
149
+ - users
150
+ responses:
151
+ '200':
152
+ description: Successful response
153
+ content:
154
+ application/json:
155
+ schema:
156
+ type: array
157
+ items:
158
+ $ref: '#/components/schemas/User'
159
+
160
+ components:
161
+ schemas:
162
+ User:
163
+ type: object
164
+ required:
165
+ - id
166
+ - name
167
+ properties:
168
+ id:
169
+ type: integer
170
+ name:
171
+ type: string
172
+ email:
173
+ type: string
174
+ format: email
175
+ ```
176
+
177
+ ## Workflow
178
+
179
+ ### Development Workflow
180
+
181
+ 1. **Design**: Create OpenAPI spec (YAML or JSON)
182
+ 2. **Validate**: `swagger-cli validate openapi.yaml`
183
+ 3. **Lint**: `spectral lint openapi.yaml`
184
+ 4. **Preview**: `redocly preview-docs openapi.yaml`
185
+ 5. **Iterate**: Fix issues and repeat
186
+
187
+ ### CI/CD Integration
188
+
189
+ ```bash
190
+ # In CI pipeline
191
+ swagger-cli validate openapi.yaml
192
+ spectral lint openapi.yaml --fail-severity warn
193
+ redocly lint openapi.yaml
194
+ ```
195
+
196
+ ## Troubleshooting
197
+
198
+ ### swagger-cli Not Found
199
+
200
+ Ensure Node.js and npm are installed:
201
+
202
+ ```bash
203
+ node --version
204
+ npm --version
205
+ ```
206
+
207
+ Reinstall if needed:
208
+
209
+ ```bash
210
+ npm install -g @apidevtools/swagger-cli
211
+ ```
212
+
213
+ ### Validation Errors
214
+
215
+ Common OpenAPI errors:
216
+
217
+ - **Missing required fields**: Add `info`, `paths`, `openapi` version
218
+ - **Invalid references**: Ensure `$ref` paths are correct
219
+ - **Schema errors**: Validate against OpenAPI 3.0/3.1 schema
220
+
221
+ ### Spectral Errors
222
+
223
+ ```bash
224
+ # Run with debugging
225
+ spectral lint openapi.yaml --verbose
226
+
227
+ # Ignore specific rules
228
+ spectral lint openapi.yaml --ignore-unknown-format
229
+ ```
230
+
231
+ ## References
232
+
233
+ - [OpenAPI Specification](https://spec.openapis.org/oas/latest.html)
234
+ - [Swagger CLI Documentation](https://github.com/APIDevTools/swagger-cli)
235
+ - [Spectral Documentation](https://stoplight.io/open-source/spectral)
236
+ - [Redocly CLI Documentation](https://redocly.com/docs/cli/)
237
+ - [OpenAPI Examples](https://github.com/OAI/OpenAPI-Specification/tree/main/examples)
238
+
239
+ **Related Overlays:**
240
+
241
+ - `nodejs` - Node.js runtime (suggested)
242
+ - `python` - For OpenAPI code generation with frameworks
243
+ - `dotnet` - For ASP.NET Core OpenAPI integration
@@ -0,0 +1,10 @@
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
+ "postCreateCommand": "bash .devcontainer/scripts/setup-openapi-tools.sh"
10
+ }
@@ -0,0 +1,16 @@
1
+ id: openapi-tools
2
+ name: OpenAPI Tools
3
+ description: OpenAPI/Swagger tooling for API development and documentation
4
+ category: dev
5
+ supports: []
6
+ requires: []
7
+ suggests:
8
+ - nodejs
9
+ conflicts: []
10
+ tags:
11
+ - dev
12
+ - openapi
13
+ - swagger
14
+ - api
15
+ - documentation
16
+ ports: []
@@ -0,0 +1,45 @@
1
+ #!/bin/bash
2
+ # Setup script for OpenAPI Tools
3
+
4
+ set -e
5
+
6
+ echo "🔧 Setting up OpenAPI Tools..."
7
+
8
+ # Install OpenAPI tools globally via npm
9
+ echo "📦 Installing OpenAPI tools..."
10
+
11
+ # Install swagger-cli (OpenAPI validation)
12
+ npm install -g @apidevtools/swagger-cli || echo "⚠️ swagger-cli already installed or failed"
13
+
14
+ # Install spectral (OpenAPI linting)
15
+ npm install -g @stoplight/spectral-cli || echo "⚠️ spectral already installed or failed"
16
+
17
+ # Install redocly CLI (documentation and bundling)
18
+ npm install -g @redocly/cli || echo "⚠️ redocly already installed or failed"
19
+
20
+ # Verify installations
21
+ echo ""
22
+ echo "✅ OpenAPI tools setup complete"
23
+ echo ""
24
+ echo "Installed tools:"
25
+
26
+ if command -v swagger-cli &> /dev/null; then
27
+ echo " ✓ swagger-cli (OpenAPI validation)"
28
+ swagger-cli --version
29
+ fi
30
+
31
+ if command -v spectral &> /dev/null; then
32
+ echo " ✓ spectral (OpenAPI linting)"
33
+ spectral --version
34
+ fi
35
+
36
+ if command -v redocly &> /dev/null; then
37
+ echo " ✓ redocly (documentation and bundling)"
38
+ redocly --version
39
+ fi
40
+
41
+ echo ""
42
+ echo "ℹ️ Usage examples:"
43
+ echo " swagger-cli validate openapi.yaml"
44
+ echo " spectral lint openapi.yaml"
45
+ echo " redocly lint openapi.yaml"
@@ -0,0 +1,51 @@
1
+ #!/bin/bash
2
+ # Verification script for OpenAPI Tools overlay
3
+ # Confirms OpenAPI tools are installed
4
+
5
+ set -e
6
+
7
+ echo "🔍 Verifying OpenAPI Tools overlay..."
8
+ echo ""
9
+
10
+ ALL_CHECKS_PASSED=true
11
+
12
+ # Check swagger-cli
13
+ echo "1️⃣ Checking swagger-cli..."
14
+ if command -v swagger-cli &> /dev/null; then
15
+ swagger-cli --version
16
+ echo " ✅ swagger-cli is installed"
17
+ else
18
+ echo " ❌ swagger-cli is not installed"
19
+ ALL_CHECKS_PASSED=false
20
+ fi
21
+
22
+ # Check spectral
23
+ echo ""
24
+ echo "2️⃣ Checking spectral..."
25
+ if command -v spectral &> /dev/null; then
26
+ spectral --version
27
+ echo " ✅ spectral is installed"
28
+ else
29
+ echo " ❌ spectral is not installed"
30
+ ALL_CHECKS_PASSED=false
31
+ fi
32
+
33
+ # Check redocly
34
+ echo ""
35
+ echo "3️⃣ Checking redocly..."
36
+ if command -v redocly &> /dev/null; then
37
+ redocly --version
38
+ echo " ✅ redocly is installed"
39
+ else
40
+ echo " ❌ redocly is not installed"
41
+ ALL_CHECKS_PASSED=false
42
+ fi
43
+
44
+ echo ""
45
+ if [ "$ALL_CHECKS_PASSED" = true ]; then
46
+ echo "✅ OpenAPI Tools overlay verification complete"
47
+ exit 0
48
+ else
49
+ echo "⚠️ Some OpenAPI tools are missing"
50
+ exit 1
51
+ fi
@@ -0,0 +1,26 @@
1
+ # Example: OpenTelemetry Collector with shared config
2
+ # This demonstrates the imports feature
3
+
4
+ id: otel-collector
5
+ name: OpenTelemetry Collector
6
+ description: Telemetry data collection and export
7
+ category: observability
8
+ supports:
9
+ - compose
10
+ requires: []
11
+ suggests:
12
+ - jaeger
13
+ - prometheus
14
+ conflicts: []
15
+ tags:
16
+ - observability
17
+ - telemetry
18
+ - opentelemetry
19
+ ports:
20
+ - 4317
21
+ - 4318
22
+ - 8888
23
+ - 8889
24
+ order: 2
25
+ imports:
26
+ - .shared/otel/instrumentation.env
@@ -12,4 +12,9 @@ tags:
12
12
  - sql
13
13
  - postgres
14
14
  ports:
15
- - 5432
15
+ - port: 5432
16
+ service: postgres
17
+ protocol: tcp
18
+ description: PostgreSQL database connection
19
+ onAutoForward: notify
20
+ connectionStringTemplate: 'postgresql://{postgres_user}:{postgres_password}@{host}:{port}/{postgres_db}'
@@ -13,5 +13,10 @@ tags:
13
13
  - metrics
14
14
  - prometheus
15
15
  ports:
16
- - 9090
16
+ - port: 9090
17
+ service: prometheus
18
+ protocol: http
19
+ description: Prometheus web UI and API
20
+ path: /
21
+ onAutoForward: openBrowser
17
22
  order: 1
@@ -5,67 +5,84 @@ Adds Python 3.12 with development tools, linting, and formatting.
5
5
  ## Features
6
6
 
7
7
  - **Python 3.12** with pip, setuptools, and wheel
8
+ - **Virtual environment** (`.venv`) created automatically in the workspace root
8
9
  - **VS Code Extensions:**
9
10
  - Python (ms-python.python)
10
11
  - Pylance (ms-python.vscode-pylance)
11
12
  - Black Formatter (ms-python.black-formatter)
12
13
  - Ruff (charliermarsh.ruff)
13
- - **Automatic dependency installation** from:
14
- - `requirements.txt`
15
- - `requirements-dev.txt`
14
+ - **Automatic dependency installation** into `.venv` from:
15
+ - `requirements.txt` (project production dependencies)
16
+ - `requirements-dev.txt` (project development dependencies)
16
17
  - `pyproject.toml` (editable install)
17
18
  - `setup.py` (legacy support)
18
19
  - **Pre-configured settings:**
20
+ - VS Code interpreter pointed at `.venv/bin/python`
19
21
  - Black as default formatter
20
22
  - Format on save enabled
21
23
  - Auto-organize imports
22
- - PYTHONPATH set to workspace root
24
+ - `PYTHONPATH`, `VIRTUAL_ENV`, and `PATH` set for the venv
25
+ - **`.gitignore`** — `.venv/`, `__pycache__/`, `*.pyc`, `.pytest_cache/`, and build artefacts added to the project root `.gitignore` automatically
23
26
 
24
- ## Virtual Environment Philosophy
27
+ ## Virtual Environment
25
28
 
26
- This overlay uses **user-level pip installations** (`pip install --user`) instead of virtual environments inside the container for these reasons:
29
+ This overlay automatically creates a `.venv` virtual environment in the workspace root on container creation and installs all dependencies into it.
27
30
 
28
- ### Why Not venv in Container?
31
+ ### Why venv?
29
32
 
30
- 1. **Container IS the environment** - The devcontainer already provides isolation
31
- 2. **Simpler workflow** - No need to activate/deactivate venv
32
- 3. **Better VS Code integration** - Python extension finds packages automatically
33
- 4. **Fewer moving parts** - Less to go wrong
33
+ 1. **Clean isolation** Dependencies are scoped to the project, not the system Python
34
+ 2. **Production parity** Matches how the app runs in CI/CD and production
35
+ 3. **Tool compatibility** Works seamlessly with pytest, mypy, ruff, and other dev tools
36
+ 4. **VS Code integration** — The Python extension is pre-configured to use `.venv/bin/python`
34
37
 
35
- ### When to Use venv
38
+ ### How It Works
36
39
 
37
- Use a virtual environment if you need:
40
+ On container creation, the setup script:
38
41
 
39
- - Multiple Python versions in the same container
40
- - Strict dependency isolation for testing
41
- - Exact production parity (though containers already provide this)
42
+ 1. Creates `.venv` at `${workspaceFolder}/.venv` using `python -m venv`
43
+ 2. Upgrades `pip`, `setuptools`, and `wheel` inside the venv
44
+ 3. Installs overlay default packages from `.devcontainer/requirements-overlay-python.txt`
45
+ 4. Installs project dependencies from `requirements.txt` (if present)
46
+ 5. Installs dev dependencies from `requirements-dev.txt` (if present)
47
+ 6. Installs project in editable mode if `pyproject.toml` or `setup.py` is present
42
48
 
43
- To create a venv manually:
49
+ ### Activating the Virtual Environment
50
+
51
+ The `.venv/bin` directory is prepended to `PATH` automatically in the devcontainer, so tools like `python`, `pip`, `pytest`, and `ruff` resolve to the venv by default. You can also activate explicitly:
44
52
 
45
53
  ```bash
46
- python -m venv .venv
47
54
  source .venv/bin/activate
48
- pip install -r requirements.txt
49
55
  ```
50
56
 
51
- Then update VS Code settings:
57
+ ### Gitignore
52
58
 
53
- ```json
54
- {
55
- "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python"
56
- }
59
+ When the Python overlay is selected, the composer automatically adds Python-specific entries to the **project root** `.gitignore` (creating the file if it doesn’t exist, and never duplicating existing entries):
60
+
61
+ ```gitignore
62
+ # python (container-superposition)
63
+ .venv/
64
+ __pycache__/
65
+ *.pyc
66
+ *.pyo
67
+ .pytest_cache/
68
+ *.egg-info/
69
+ dist/
70
+ build/
57
71
  ```
58
72
 
73
+ This happens at generation time — no container startup required.
74
+
59
75
  ## Automatic Setup
60
76
 
61
77
  The overlay automatically runs on container creation:
62
78
 
63
- 1. ✅ Installs overlay packages from `.devcontainer/requirements-overlay.txt`
64
- 2. ✅ Checks for `requirements.txt` installs with pip
65
- 3. ✅ Checks for `requirements-dev.txt` → installs dev dependencies
66
- 4. ✅ Checks for `pyproject.toml` → installs project in editable mode
67
- 5. ✅ Checks for `setup.py` → installs legacy projects
68
- 6. ✅ Upgrades pip, setuptools, and wheel to latest
79
+ 1. ✅ Creates `.venv` virtual environment in the workspace root
80
+ 2. ✅ Upgrades pip, setuptools, and wheel inside the venv
81
+ 3. ✅ Installs overlay packages from `.devcontainer/requirements-overlay-python.txt`
82
+ 4. ✅ Checks for `requirements.txt` → installs into venv
83
+ 5. ✅ Checks for `requirements-dev.txt` → installs dev dependencies into venv
84
+ 6. ✅ Checks for `pyproject.toml` installs project in editable mode
85
+ 7. ✅ Checks for `setup.py` → installs legacy projects in editable mode
69
86
 
70
87
  ## Customizing Overlay Packages
71
88
 
@@ -176,7 +193,7 @@ mytool = "mytool.cli:main"
176
193
  1. **Pin versions** in requirements.txt for reproducibility
177
194
  2. **Separate dev dependencies** in requirements-dev.txt
178
195
  3. **Use pyproject.toml** for modern Python projects
179
- 4. **Add `.gitignore`** for `__pycache__`, `.pytest_cache`, etc.
196
+ 4. **Add `.gitignore`** handled automatically by the overlay
180
197
 
181
198
  ## Troubleshooting
182
199
 
@@ -200,17 +217,16 @@ Update `devcontainer.patch.json`:
200
217
  }
201
218
  ```
202
219
 
203
- ### Want to use venv anyway?
220
+ ### Customizing the Interpreter Path
204
221
 
205
- Add to your project's `.devcontainer/devcontainer.json`:
222
+ The overlay pre-configures VS Code to use `${workspaceFolder}/.venv/bin/python`. If your venv is elsewhere, update `python.defaultInterpreterPath` in your workspace settings or `.devcontainer/custom/devcontainer.patch.json`:
206
223
 
207
224
  ```json
208
225
  {
209
- "postCreateCommand": "python -m venv .venv && .venv/bin/pip install -r requirements.txt",
210
226
  "customizations": {
211
227
  "vscode": {
212
228
  "settings": {
213
- "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python"
229
+ "python.defaultInterpreterPath": "${workspaceFolder}/my-custom-venv/bin/python"
214
230
  }
215
231
  }
216
232
  }
@@ -26,16 +26,19 @@
26
26
  "source.organizeImports": "explicit"
27
27
  }
28
28
  },
29
- "python.defaultInterpreterPath": "/usr/local/bin/python",
29
+ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
30
+ "python.terminal.activateEnvironment": true,
30
31
  "files.exclude": {
31
32
  "**/__pycache__": true,
32
- "**/.pytest_cache": true
33
+ "**/.pytest_cache": true,
34
+ "**/.venv": true
33
35
  }
34
36
  }
35
37
  }
36
38
  },
37
39
  "remoteEnv": {
38
- "PATH": "${containerEnv:HOME}/.local/bin:${containerEnv:PATH}",
39
- "PYTHONPATH": "${containerWorkspaceFolder}"
40
+ "PATH": "${containerWorkspaceFolder}/.venv/bin:${containerEnv:HOME}/.local/bin:${containerEnv:PATH}",
41
+ "PYTHONPATH": "${containerWorkspaceFolder}",
42
+ "VIRTUAL_ENV": "${containerWorkspaceFolder}/.venv"
40
43
  }
41
44
  }