container-superposition 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
package/docs/README.md
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# Container Superposition Documentation
|
|
2
|
+
|
|
3
|
+
Complete documentation for the container-superposition devcontainer scaffolding system.
|
|
4
|
+
|
|
5
|
+
## 📚 Documentation Index
|
|
6
|
+
|
|
7
|
+
### Getting Started
|
|
8
|
+
|
|
9
|
+
- **[Publishing Guide](publishing.md)** - How to publish to npm and make the tool publicly available
|
|
10
|
+
- **[Quick Reference](quick-reference.md)** - Quick lookup for templates, overlays, ports, and commands
|
|
11
|
+
- **[Examples](examples.md)** - Common usage patterns and real-world scenarios
|
|
12
|
+
|
|
13
|
+
### Architecture & Design
|
|
14
|
+
|
|
15
|
+
- **[Architecture](architecture.md)** - Design principles, composition algorithm, and deep merge logic
|
|
16
|
+
- **[Presets Architecture](presets-architecture.md)** - Meta-overlay design and preset system architecture
|
|
17
|
+
- **[Dependencies](dependencies.md)** - Service dependencies, startup order, and runServices configuration
|
|
18
|
+
- **[UX Design](ux.md)** - Visual design, CLI enhancements, and accessibility features
|
|
19
|
+
|
|
20
|
+
### User Guides
|
|
21
|
+
|
|
22
|
+
- **[Presets Guide](presets.md)** - Using stack presets for common development scenarios
|
|
23
|
+
- **[Messaging Comparison](messaging-comparison.md)** - Choosing between RabbitMQ, Redpanda, and NATS
|
|
24
|
+
- **[Messaging Quick Start](messaging-quick-start.md)** - Getting started with messaging overlays
|
|
25
|
+
- **[Observability Workflow](observability-workflow.md)** - Setting up monitoring and tracing
|
|
26
|
+
|
|
27
|
+
### Development
|
|
28
|
+
|
|
29
|
+
- **[Creating Overlays](creating-overlays.md)** - Complete guide to creating new overlays
|
|
30
|
+
- **[Contributing](../CONTRIBUTING.md)** - Contribution guidelines and development workflow
|
|
31
|
+
- **[AGENTS.md](../AGENTS.md)** - Comprehensive guide for AI coding agents
|
|
32
|
+
|
|
33
|
+
## 🎯 Quick Start
|
|
34
|
+
|
|
35
|
+
### For Users
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Interactive mode (recommended)
|
|
39
|
+
npx container-superposition init
|
|
40
|
+
|
|
41
|
+
# Non-interactive mode
|
|
42
|
+
npx container-superposition init --stack compose --language nodejs --database postgres
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### For Contributors
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Clone and setup
|
|
49
|
+
git clone https://github.com/veggerby/container-superposition.git
|
|
50
|
+
cd container-superposition
|
|
51
|
+
npm install
|
|
52
|
+
|
|
53
|
+
# Run in development mode
|
|
54
|
+
npm run init
|
|
55
|
+
|
|
56
|
+
# Build and test
|
|
57
|
+
npm run build
|
|
58
|
+
npm test
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 📖 Core Concepts
|
|
62
|
+
|
|
63
|
+
### Base Templates
|
|
64
|
+
|
|
65
|
+
Minimal starting points for devcontainer configurations:
|
|
66
|
+
|
|
67
|
+
- **plain** - Simple single-image devcontainer
|
|
68
|
+
- **compose** - Docker Compose-based for multi-service setups
|
|
69
|
+
|
|
70
|
+
Located in `templates/`
|
|
71
|
+
|
|
72
|
+
### Overlays
|
|
73
|
+
|
|
74
|
+
Composable capability modules organized by category:
|
|
75
|
+
|
|
76
|
+
**Languages & Frameworks:**
|
|
77
|
+
|
|
78
|
+
- dotnet, nodejs, python, mkdocs
|
|
79
|
+
|
|
80
|
+
**Databases:**
|
|
81
|
+
|
|
82
|
+
- postgres, redis
|
|
83
|
+
|
|
84
|
+
**Observability:**
|
|
85
|
+
|
|
86
|
+
- otel-collector, jaeger, prometheus, grafana, loki
|
|
87
|
+
|
|
88
|
+
**Cloud Tools:**
|
|
89
|
+
|
|
90
|
+
- aws-cli, azure-cli, kubectl-helm
|
|
91
|
+
|
|
92
|
+
**Dev Tools:**
|
|
93
|
+
|
|
94
|
+
- docker-in-docker, docker-sock, playwright, codex, git-helpers, pre-commit, commitlint, just, direnv, modern-cli-tools, ngrok
|
|
95
|
+
|
|
96
|
+
Located in `overlays/`
|
|
97
|
+
|
|
98
|
+
### Composition
|
|
99
|
+
|
|
100
|
+
The tool uses a deep merge strategy to combine:
|
|
101
|
+
|
|
102
|
+
1. Base template
|
|
103
|
+
2. Selected overlays (in category order)
|
|
104
|
+
3. User preferences (port offsets, custom paths)
|
|
105
|
+
|
|
106
|
+
Output: Standard `.devcontainer/` folder with editable JSON/YAML files
|
|
107
|
+
|
|
108
|
+
## 🔧 Architecture Overview
|
|
109
|
+
|
|
110
|
+
```mermaid
|
|
111
|
+
graph TD
|
|
112
|
+
A[User Input<br/>CLI/Interactive] --> B[Dependency Resolution<br/>requires/suggests]
|
|
113
|
+
B --> C[Conflict Detection<br/>conflicts field]
|
|
114
|
+
C --> D[Composition<br/>Deep Merge]
|
|
115
|
+
D --> E[Output<br/>.devcontainer/]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 📁 Output Structure
|
|
119
|
+
|
|
120
|
+
After running the tool:
|
|
121
|
+
|
|
122
|
+
```txt
|
|
123
|
+
.devcontainer/
|
|
124
|
+
├── devcontainer.json # Main configuration
|
|
125
|
+
├── docker-compose.yml # Base compose file (if using compose)
|
|
126
|
+
├── .env.example # Environment variables
|
|
127
|
+
├── superposition.json # Generation metadata
|
|
128
|
+
├── scripts/ # Setup scripts
|
|
129
|
+
│ ├── setup-*.sh # Overlay-specific setup
|
|
130
|
+
│ └── ...
|
|
131
|
+
├── verify-*.sh # Service verification scripts
|
|
132
|
+
└── [overlay-specific files] # Config files from overlays
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 🎨 Key Features
|
|
136
|
+
|
|
137
|
+
### Dependency Resolution
|
|
138
|
+
|
|
139
|
+
Overlays can declare relationships:
|
|
140
|
+
|
|
141
|
+
```yaml
|
|
142
|
+
- id: grafana
|
|
143
|
+
requires: [prometheus] # Auto-added when grafana selected
|
|
144
|
+
suggests: [loki, jaeger] # Recommended but optional
|
|
145
|
+
conflicts: [] # Cannot be used together
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Conflict Detection
|
|
149
|
+
|
|
150
|
+
Prevents incompatible combinations:
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
- id: docker-in-docker
|
|
154
|
+
conflicts: [docker-sock] # Only one Docker access method allowed
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Port Management
|
|
158
|
+
|
|
159
|
+
Automatic port configuration with optional offset:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Default ports
|
|
163
|
+
npm run init
|
|
164
|
+
|
|
165
|
+
# Add 100 to all ports (Grafana: 3000 → 3100)
|
|
166
|
+
npm run init -- --port-offset 100
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Environment Variables
|
|
170
|
+
|
|
171
|
+
Merged from all selected overlays into `.env.example`:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# PostgreSQL
|
|
175
|
+
POSTGRES_VERSION=16
|
|
176
|
+
POSTGRES_DB=devdb
|
|
177
|
+
POSTGRES_USER=postgres
|
|
178
|
+
POSTGRES_PASSWORD=postgres
|
|
179
|
+
POSTGRES_PORT=5432
|
|
180
|
+
|
|
181
|
+
# Redis
|
|
182
|
+
REDIS_VERSION=7
|
|
183
|
+
REDIS_PORT=6379
|
|
184
|
+
# REDIS_PASSWORD=your-secure-password
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 🧪 Testing
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Unit tests
|
|
191
|
+
npm test
|
|
192
|
+
|
|
193
|
+
# Watch mode
|
|
194
|
+
npm test:watch
|
|
195
|
+
|
|
196
|
+
# Smoke tests (actual devcontainer generation)
|
|
197
|
+
npm run test:smoke
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## 📦 Package Structure
|
|
201
|
+
|
|
202
|
+
When published to npm, includes:
|
|
203
|
+
|
|
204
|
+
- ✅ Compiled JavaScript (`dist/`)
|
|
205
|
+
- ✅ All templates (`templates/`)
|
|
206
|
+
- ✅ All overlays (`overlays/`)
|
|
207
|
+
- ✅ All features (`features/`)
|
|
208
|
+
- ✅ Configuration metadata (`overlays/index.yml`)
|
|
209
|
+
- ✅ Type definitions and schema (`tool/schema/`)
|
|
210
|
+
- ✅ Documentation
|
|
211
|
+
|
|
212
|
+
**Package size**: ~122 KB compressed, ~462 KB unpacked
|
|
213
|
+
|
|
214
|
+
## 🤝 Contributing
|
|
215
|
+
|
|
216
|
+
See [CONTRIBUTING.md](../CONTRIBUTING.md) for:
|
|
217
|
+
|
|
218
|
+
- Development setup
|
|
219
|
+
- Code style guidelines
|
|
220
|
+
- Pull request process
|
|
221
|
+
- Testing requirements
|
|
222
|
+
|
|
223
|
+
## 📄 License
|
|
224
|
+
|
|
225
|
+
MIT - See [LICENSE](../LICENSE)
|
|
226
|
+
|
|
227
|
+
## 🔗 Links
|
|
228
|
+
|
|
229
|
+
- **Repository**: <https://github.com/veggerby/container-superposition>
|
|
230
|
+
- **Issues**: <https://github.com/veggerby/container-superposition/issues>
|
|
231
|
+
- **npm Package**: <https://www.npmjs.com/package/container-superposition> (once published)
|
|
232
|
+
|
|
233
|
+
## 🆘 Support
|
|
234
|
+
|
|
235
|
+
- **GitHub Issues**: Bug reports and feature requests
|
|
236
|
+
- **Discussions**: Questions and community support
|
|
237
|
+
- **Pull Requests**: Code contributions welcome
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
**Philosophy**: Build a thin picker that outputs normal configurations, not a platform.
|
|
242
|
+
|
|
243
|
+
- Generates once, users edit forever
|
|
244
|
+
- No update or sync mechanisms
|
|
245
|
+
- No state tracking
|
|
246
|
+
- No proprietary formats
|
|
247
|
+
|
|
248
|
+
### Stateless
|
|
249
|
+
|
|
250
|
+
- Each invocation is independent
|
|
251
|
+
- Output is deterministic
|
|
252
|
+
- No configuration files
|
|
253
|
+
|
|
254
|
+
### Optional
|
|
255
|
+
|
|
256
|
+
- Templates work without the tool
|
|
257
|
+
- Manual copying is always an option
|
|
258
|
+
- Tool is convenience wrapper
|
|
259
|
+
|
|
260
|
+
## Technology
|
|
261
|
+
|
|
262
|
+
- **Node.js/TypeScript** - Cross-platform, type-safe
|
|
263
|
+
- **chalk** - Terminal colors
|
|
264
|
+
- **boxen** - Terminal boxes
|
|
265
|
+
- **ora** - Progress spinners
|
|
266
|
+
- **commander** - CLI parsing
|
|
267
|
+
|
|
268
|
+
## Extension
|
|
269
|
+
|
|
270
|
+
### Add an Overlay
|
|
271
|
+
|
|
272
|
+
1. Create `overlays/<name>/`
|
|
273
|
+
2. Add `devcontainer.patch.json`
|
|
274
|
+
3. Add `overlay.yml` manifest ([schema](../tool/schema/overlay-manifest.schema.json), [detailed guide](../.github/instructions/overlay-index.instructions.md))
|
|
275
|
+
4. Optional: Add `docker-compose.yml`
|
|
276
|
+
5. Optional: Add `README.md` documentation
|
|
277
|
+
6. Update questionnaire
|
|
278
|
+
|
|
279
|
+
See [Creating Overlays Guide](creating-overlays.md) for complete instructions.
|
|
280
|
+
|
|
281
|
+
### Add a Template
|
|
282
|
+
|
|
283
|
+
1. Create `templates/<name>/.devcontainer/`
|
|
284
|
+
2. Add complete devcontainer.json
|
|
285
|
+
3. Add scripts and files
|
|
286
|
+
4. Update types and questionnaire
|
|
287
|
+
|
|
288
|
+
## Maintenance
|
|
289
|
+
|
|
290
|
+
### Smoke Tests
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
npm test
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Build
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
npm run build
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Development
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
npm run init
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Uses `tsx` for direct TypeScript execution without build step.
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
The init tool is a **thin "purpose picker"** that composes devcontainer configurations from base templates and overlays.
|
|
4
|
+
|
|
5
|
+
## Design Principles
|
|
6
|
+
|
|
7
|
+
### Generate Once, Edit Forever
|
|
8
|
+
|
|
9
|
+
The tool creates standard `.devcontainer/` folders that users own completely. There is no "sync" or "update" mechanism—once generated, the configuration is independent of the tool.
|
|
10
|
+
|
|
11
|
+
### Stateless Composition
|
|
12
|
+
|
|
13
|
+
No configuration tracking, version control, or state management. Each invocation is independent and produces deterministic output based on the provided options.
|
|
14
|
+
|
|
15
|
+
### Plain JSON Output
|
|
16
|
+
|
|
17
|
+
All output is standard `devcontainer.json` format compatible with VS Code Dev Containers and GitHub Codespaces. No proprietary schemas or custom DSLs.
|
|
18
|
+
|
|
19
|
+
### Optional Tooling
|
|
20
|
+
|
|
21
|
+
Templates in `templates/` work standalone. The init tool is a convenience wrapper, not a requirement.
|
|
22
|
+
|
|
23
|
+
## Directory Structure
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
tool/
|
|
27
|
+
├── docs/ # Architecture and design documentation
|
|
28
|
+
├── overlays/ # Composable feature add-ons
|
|
29
|
+
│ ├── Language/Framework
|
|
30
|
+
│ │ ├── dotnet/ # .NET overlay
|
|
31
|
+
│ │ ├── nodejs/ # Node.js overlay
|
|
32
|
+
│ │ ├── python/ # Python overlay
|
|
33
|
+
│ │ └── mkdocs/ # MkDocs overlay
|
|
34
|
+
│ ├── Databases
|
|
35
|
+
│ │ ├── postgres/ # PostgreSQL overlay
|
|
36
|
+
│ │ └── redis/ # Redis overlay
|
|
37
|
+
│ ├── Observability
|
|
38
|
+
│ │ ├── otel-collector/ # OpenTelemetry Collector
|
|
39
|
+
│ │ ├── jaeger/ # Distributed tracing
|
|
40
|
+
│ │ ├── prometheus/ # Metrics collection
|
|
41
|
+
│ │ ├── grafana/ # Visualization
|
|
42
|
+
│ │ └── loki/ # Log aggregation
|
|
43
|
+
│ ├── Development Tools
|
|
44
|
+
│ │ ├── playwright/ # Browser automation
|
|
45
|
+
│ │ ├── aws-cli/ # AWS tools
|
|
46
|
+
│ │ ├── azure-cli/ # Azure tools
|
|
47
|
+
│ │ └── kubectl-helm/ # Kubernetes tools
|
|
48
|
+
├── questionnaire/ # Composition logic
|
|
49
|
+
│ └── composer.ts # Deep merge engine
|
|
50
|
+
└── schema/ # Type definitions
|
|
51
|
+
├── types.ts # TypeScript interfaces
|
|
52
|
+
└── config.schema.json # JSON schema
|
|
53
|
+
|
|
54
|
+
scripts/
|
|
55
|
+
├── init.ts # CLI entry point
|
|
56
|
+
├── test.sh # Smoke tests
|
|
57
|
+
└── example.js # Programmatic usage
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Composition Algorithm
|
|
61
|
+
|
|
62
|
+
### Input Processing
|
|
63
|
+
|
|
64
|
+
1. **Parse arguments** - Commander processes CLI flags or triggers interactive questionnaire
|
|
65
|
+
2. **Validate answers** - Ensure stack exists and options are compatible
|
|
66
|
+
3. **Select overlays** - Based on database, playwright, cloud tools choices
|
|
67
|
+
|
|
68
|
+
### Template Composition
|
|
69
|
+
|
|
70
|
+
1. **Load base template** from `templates/<stack>/.devcontainer/`
|
|
71
|
+
2. **Apply overlays** sequentially using deep merge
|
|
72
|
+
3. **Copy template files** (scripts, etc.) from base template
|
|
73
|
+
4. **Copy overlay files** (config files, docker-compose, etc.)
|
|
74
|
+
5. **Merge .env.example** files from all selected overlays
|
|
75
|
+
6. **Write merged configuration** to output path
|
|
76
|
+
|
|
77
|
+
### Deep Merge Logic
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
function deepMerge(base, overlay) {
|
|
81
|
+
for each key in overlay:
|
|
82
|
+
if key exists in base and both are objects:
|
|
83
|
+
if both are arrays:
|
|
84
|
+
concatenate and deduplicate
|
|
85
|
+
else:
|
|
86
|
+
recursively merge
|
|
87
|
+
else:
|
|
88
|
+
use overlay value
|
|
89
|
+
return merged
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Special handling:
|
|
94
|
+
|
|
95
|
+
- **Arrays**: Concatenate and deduplicate (ports, packages)
|
|
96
|
+
- **apt-get packages**: Merge space-separated lists
|
|
97
|
+
- **Features**: Deep merge feature configs
|
|
98
|
+
- **Environment variables**: Merge key-value pairs
|
|
99
|
+
- **Port attributes**: Merge labeled port configurations
|
|
100
|
+
|
|
101
|
+
### File Handling per Overlay
|
|
102
|
+
|
|
103
|
+
Each overlay can contain multiple file types:
|
|
104
|
+
|
|
105
|
+
- **devcontainer.patch.json** - Merged into devcontainer.json (not copied)
|
|
106
|
+
- **.env.example** - Merged into combined .env.example (not copied separately)
|
|
107
|
+
- **docker-compose.yml** - Copied as `docker-compose.{overlay}.yml`
|
|
108
|
+
- **Other files/directories** - Copied as-is to output
|
|
109
|
+
|
|
110
|
+
This allows overlays to provide complete configurations with config files, scripts, and directories.
|
|
111
|
+
|
|
112
|
+
## Workflow
|
|
113
|
+
|
|
114
|
+
```mermaid
|
|
115
|
+
graph TD
|
|
116
|
+
A[User Input] --> B[CLI Parser Commander]
|
|
117
|
+
B --> C[Interactive or Non-Interactive Mode]
|
|
118
|
+
C --> D[QuestionnaireAnswers]
|
|
119
|
+
D --> E[Composer Engine]
|
|
120
|
+
E --> F[Load base template]
|
|
121
|
+
E --> G[Select overlays]
|
|
122
|
+
E --> H[Deep merge devcontainer configs]
|
|
123
|
+
E --> I[Copy template files]
|
|
124
|
+
E --> J[Copy overlay files]
|
|
125
|
+
E --> K[Merge .env.example files]
|
|
126
|
+
E --> L[Write output]
|
|
127
|
+
L --> M[.devcontainer/ folder]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Overlay System
|
|
131
|
+
|
|
132
|
+
Each overlay is a composable package that can include multiple files:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
overlay-name/
|
|
136
|
+
├── devcontainer.patch.json # Partial config to merge (required)
|
|
137
|
+
├── docker-compose.yml # Service definition (optional)
|
|
138
|
+
├── .env.example # Environment variables (optional)
|
|
139
|
+
└── [additional files/dirs] # Config files, scripts, etc. (optional)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Overlays can add:
|
|
143
|
+
|
|
144
|
+
- Features
|
|
145
|
+
- Environment variables
|
|
146
|
+
- Port forwards
|
|
147
|
+
- Services (via Docker Compose)
|
|
148
|
+
- Package installations
|
|
149
|
+
|
|
150
|
+
## Technology Choices
|
|
151
|
+
|
|
152
|
+
### Node.js/TypeScript
|
|
153
|
+
|
|
154
|
+
- Cross-platform (Windows, Mac, Linux)
|
|
155
|
+
- Native JSON handling
|
|
156
|
+
- Easy npm/npx distribution
|
|
157
|
+
- Type safety during development
|
|
158
|
+
|
|
159
|
+
### CLI Libraries
|
|
160
|
+
|
|
161
|
+
- **chalk** - Terminal colors for better UX
|
|
162
|
+
- **boxen** - Visual hierarchy with borders
|
|
163
|
+
- **ora** - Progress feedback
|
|
164
|
+
- **commander** - Robust argument parsing
|
|
165
|
+
|
|
166
|
+
### No Framework
|
|
167
|
+
|
|
168
|
+
Deliberate choice to avoid:
|
|
169
|
+
|
|
170
|
+
- Complex build pipelines
|
|
171
|
+
- Runtime dependencies in output
|
|
172
|
+
- Learning curve for contributors
|
|
173
|
+
- Version coupling
|
|
174
|
+
|
|
175
|
+
## Extension Points
|
|
176
|
+
|
|
177
|
+
### Adding Overlays
|
|
178
|
+
|
|
179
|
+
1. Create `overlays/<name>/`
|
|
180
|
+
2. Add `overlay.yml` manifest
|
|
181
|
+
3. Add `devcontainer.patch.json`
|
|
182
|
+
4. Optional: Add `docker-compose.yml`
|
|
183
|
+
5. Update questionnaire in `scripts/init.ts`
|
|
184
|
+
|
|
185
|
+
### Adding Templates
|
|
186
|
+
|
|
187
|
+
1. Create `templates/<name>/.devcontainer/`
|
|
188
|
+
2. Add standard devcontainer.json
|
|
189
|
+
3. Add scripts and supporting files
|
|
190
|
+
4. Update types in `tool/schema/types.ts`
|
|
191
|
+
5. Add questionnaire option
|
|
192
|
+
|
|
193
|
+
## Constraints
|
|
194
|
+
|
|
195
|
+
### What We Don't Do
|
|
196
|
+
|
|
197
|
+
- ❌ No "update" command (would require state tracking)
|
|
198
|
+
- ❌ No custom DSL (just standard JSON)
|
|
199
|
+
- ❌ No required preprocessing (templates work directly)
|
|
200
|
+
- ❌ No version coupling (output is independent)
|
|
201
|
+
- ❌ No cloud services (purely local operation)
|
|
202
|
+
|
|
203
|
+
### Why These Constraints
|
|
204
|
+
|
|
205
|
+
These limitations keep the tool **humble** and prevent it from becoming a platform that users must learn, debug, and maintain. The tool is training wheels, not a framework.
|
|
206
|
+
|
|
207
|
+
## Success Metrics
|
|
208
|
+
|
|
209
|
+
The tool succeeds when:
|
|
210
|
+
|
|
211
|
+
1. Users create their first devcontainer easily
|
|
212
|
+
2. Users edit output directly without the tool
|
|
213
|
+
3. Users don't need the tool after initial setup
|
|
214
|
+
4. Templates work independently of the tool
|
|
215
|
+
|
|
216
|
+
## Trade-offs
|
|
217
|
+
|
|
218
|
+
### Advantages
|
|
219
|
+
|
|
220
|
+
- Low barrier to entry
|
|
221
|
+
- No vendor lock-in
|
|
222
|
+
- Composable and extensible
|
|
223
|
+
- Easy to understand
|
|
224
|
+
- Minimal maintenance burden
|
|
225
|
+
|
|
226
|
+
### Limitations
|
|
227
|
+
|
|
228
|
+
- No automatic updates of existing configs
|
|
229
|
+
- Limited validation of composed output
|
|
230
|
+
- Manual effort to keep overlays compatible
|
|
231
|
+
- No rollback mechanism
|
|
232
|
+
|
|
233
|
+
These limitations are **intentional** to prevent tool creep.
|