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.
- package/README.md +569 -8
- package/dist/scripts/init.js +436 -254
- package/dist/scripts/init.js.map +1 -1
- package/dist/tool/commands/doctor.d.ts +15 -0
- package/dist/tool/commands/doctor.d.ts.map +1 -0
- package/dist/tool/commands/doctor.js +862 -0
- package/dist/tool/commands/doctor.js.map +1 -0
- package/dist/tool/commands/explain.d.ts +13 -0
- package/dist/tool/commands/explain.d.ts.map +1 -0
- package/dist/tool/commands/explain.js +299 -0
- package/dist/tool/commands/explain.js.map +1 -0
- package/dist/tool/commands/list.d.ts +16 -0
- package/dist/tool/commands/list.d.ts.map +1 -0
- package/dist/tool/commands/list.js +121 -0
- package/dist/tool/commands/list.js.map +1 -0
- package/dist/tool/commands/plan.d.ts +67 -0
- package/dist/tool/commands/plan.d.ts.map +1 -0
- package/dist/tool/commands/plan.js +851 -0
- package/dist/tool/commands/plan.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +16 -2
- package/dist/tool/questionnaire/composer.d.ts.map +1 -1
- package/dist/tool/questionnaire/composer.js +411 -200
- package/dist/tool/questionnaire/composer.js.map +1 -1
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -1
- package/dist/tool/readme/markdown-parser.js.map +1 -1
- package/dist/tool/readme/readme-generator.d.ts.map +1 -1
- package/dist/tool/readme/readme-generator.js +11 -6
- package/dist/tool/readme/readme-generator.js.map +1 -1
- package/dist/tool/schema/deployment-targets.d.ts +77 -0
- package/dist/tool/schema/deployment-targets.d.ts.map +1 -0
- package/dist/tool/schema/deployment-targets.js +91 -0
- package/dist/tool/schema/deployment-targets.js.map +1 -0
- package/dist/tool/schema/manifest-migrations.d.ts +51 -0
- package/dist/tool/schema/manifest-migrations.d.ts.map +1 -0
- package/dist/tool/schema/manifest-migrations.js +159 -0
- package/dist/tool/schema/manifest-migrations.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +1 -1
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
- package/dist/tool/schema/overlay-loader.js +42 -14
- package/dist/tool/schema/overlay-loader.js.map +1 -1
- package/dist/tool/schema/types.d.ts +62 -2
- package/dist/tool/schema/types.d.ts.map +1 -1
- package/dist/tool/utils/gitignore.d.ts +15 -0
- package/dist/tool/utils/gitignore.d.ts.map +1 -0
- package/dist/tool/utils/gitignore.js +41 -0
- package/dist/tool/utils/gitignore.js.map +1 -0
- package/dist/tool/utils/merge.d.ts +134 -0
- package/dist/tool/utils/merge.d.ts.map +1 -0
- package/dist/tool/utils/merge.js +277 -0
- package/dist/tool/utils/merge.js.map +1 -0
- package/dist/tool/utils/port-utils.d.ts +29 -0
- package/dist/tool/utils/port-utils.d.ts.map +1 -0
- package/dist/tool/utils/port-utils.js +128 -0
- package/dist/tool/utils/port-utils.js.map +1 -0
- package/dist/tool/utils/services-export.d.ts +14 -0
- package/dist/tool/utils/services-export.d.ts.map +1 -0
- package/dist/tool/utils/services-export.js +478 -0
- package/dist/tool/utils/services-export.js.map +1 -0
- package/dist/tool/utils/summary.d.ts +69 -0
- package/dist/tool/utils/summary.d.ts.map +1 -0
- package/dist/tool/utils/summary.js +260 -0
- package/dist/tool/utils/summary.js.map +1 -0
- package/dist/tool/utils/version.d.ts +9 -0
- package/dist/tool/utils/version.d.ts.map +1 -0
- package/dist/tool/utils/version.js +32 -0
- package/dist/tool/utils/version.js.map +1 -0
- package/docs/architecture.md +25 -21
- package/docs/deployment-targets.md +150 -0
- package/docs/discovery-commands.md +442 -0
- package/docs/merge-strategy.md +700 -0
- package/docs/minimal-and-editor.md +265 -0
- package/docs/overlay-imports.md +209 -0
- package/docs/overlay-manifest-refactoring.md +2 -2
- package/docs/overlay-metadata-archive.md +1 -1
- package/docs/overlays.md +139 -28
- package/docs/presets-architecture.md +3 -3
- package/docs/presets.md +1 -1
- package/docs/publishing.md +36 -35
- package/docs/team-workflow.md +540 -0
- package/overlays/.presets/data-engineering.yml +392 -0
- package/overlays/.presets/event-sourced-service.yml +262 -0
- package/overlays/.presets/frontend.yml +287 -0
- package/overlays/.presets/k8s-operator-dev.yml +462 -0
- package/overlays/{presets â .presets}/microservice.yml +32 -6
- package/overlays/.presets/web-api.yml +129 -0
- package/overlays/.registry/README.md +1 -1
- package/overlays/.registry/deployment-targets.yml +54 -0
- package/overlays/.shared/README.md +43 -0
- package/overlays/.shared/compose/common-healthchecks.yml +38 -0
- package/overlays/.shared/otel/instrumentation.env +20 -0
- package/overlays/.shared/otel/otel-base-config.yaml +30 -0
- package/overlays/.shared/vscode/recommended-extensions.json +14 -0
- package/overlays/README.md +1 -1
- package/overlays/cloudflared/README.md +190 -0
- package/overlays/cloudflared/devcontainer.patch.json +3 -0
- package/overlays/cloudflared/overlay.yml +15 -0
- package/overlays/cloudflared/setup.sh +49 -0
- package/overlays/cloudflared/verify.sh +21 -0
- package/overlays/codex/overlay.yml +1 -0
- package/overlays/direnv/README.md +6 -4
- package/overlays/direnv/setup.sh +0 -12
- package/overlays/duckdb/README.md +274 -0
- package/overlays/duckdb/devcontainer.patch.json +10 -0
- package/overlays/duckdb/overlay.yml +17 -0
- package/overlays/duckdb/setup.sh +45 -0
- package/overlays/duckdb/verify.sh +32 -0
- package/overlays/git-helpers/overlay.yml +1 -0
- package/overlays/grafana/README.md +5 -5
- package/overlays/grafana/dashboard-provider.yml +1 -1
- package/overlays/grafana/docker-compose.yml +2 -2
- package/overlays/grafana/overlay.yml +6 -1
- package/overlays/grpc-tools/README.md +242 -0
- package/overlays/grpc-tools/devcontainer.patch.json +14 -0
- package/overlays/grpc-tools/overlay.yml +14 -0
- package/overlays/grpc-tools/setup.sh +57 -0
- package/overlays/grpc-tools/verify.sh +47 -0
- package/overlays/jaeger/overlay.yml +16 -3
- package/overlays/jupyter/.env.example +6 -0
- package/overlays/jupyter/README.md +210 -0
- package/overlays/jupyter/devcontainer.patch.json +14 -0
- package/overlays/jupyter/docker-compose.yml +23 -0
- package/overlays/jupyter/overlay.yml +18 -0
- package/overlays/jupyter/verify.sh +35 -0
- package/overlays/keycloak/.env.example +5 -0
- package/overlays/keycloak/README.md +238 -0
- package/overlays/keycloak/devcontainer.patch.json +17 -0
- package/overlays/keycloak/docker-compose.yml +32 -0
- package/overlays/keycloak/overlay.yml +23 -0
- package/overlays/keycloak/verify.sh +54 -0
- package/overlays/kind/README.md +221 -0
- package/overlays/kind/devcontainer.patch.json +10 -0
- package/overlays/kind/overlay.yml +18 -0
- package/overlays/kind/setup.sh +43 -0
- package/overlays/kind/verify.sh +40 -0
- package/overlays/localstack/.env.example +6 -0
- package/overlays/localstack/README.md +188 -0
- package/overlays/localstack/devcontainer.patch.json +21 -0
- package/overlays/localstack/docker-compose.yml +25 -0
- package/overlays/localstack/overlay.yml +18 -0
- package/overlays/localstack/verify.sh +47 -0
- package/overlays/loki/overlay.yml +6 -1
- package/overlays/mailpit/.env.example +4 -0
- package/overlays/mailpit/README.md +191 -0
- package/overlays/mailpit/devcontainer.patch.json +20 -0
- package/overlays/mailpit/docker-compose.yml +17 -0
- package/overlays/mailpit/overlay.yml +26 -0
- package/overlays/mailpit/verify.sh +52 -0
- package/overlays/modern-cli-tools/overlay.yml +1 -0
- package/overlays/mongodb/overlay.yml +12 -2
- package/overlays/mysql/overlay.yml +12 -2
- package/overlays/nats/overlay.yml +12 -2
- package/overlays/ngrok/overlay.yml +2 -1
- package/overlays/openapi-tools/README.md +243 -0
- package/overlays/openapi-tools/devcontainer.patch.json +10 -0
- package/overlays/openapi-tools/overlay.yml +16 -0
- package/overlays/openapi-tools/setup.sh +45 -0
- package/overlays/openapi-tools/verify.sh +51 -0
- package/overlays/otel-collector/overlay.yml.example +26 -0
- package/overlays/postgres/overlay.yml +6 -1
- package/overlays/prometheus/overlay.yml +6 -1
- package/overlays/python/README.md +51 -35
- package/overlays/python/devcontainer.patch.json +7 -4
- package/overlays/python/setup.sh +50 -23
- package/overlays/python/verify.sh +29 -1
- package/overlays/rabbitmq/overlay.yml +12 -2
- package/overlays/redis/overlay.yml +6 -1
- package/overlays/tilt/README.md +259 -0
- package/overlays/tilt/devcontainer.patch.json +17 -0
- package/overlays/tilt/overlay.yml +19 -0
- package/overlays/tilt/setup.sh +25 -0
- package/overlays/tilt/verify.sh +24 -0
- package/package.json +8 -6
- package/tool/README.md +12 -16
- package/tool/schema/overlay-manifest.schema.json +64 -4
- package/tool/schema/superposition-manifest.schema.json +104 -0
- package/overlays/presets/web-api.yml +0 -109
- /package/overlays/{presets â .presets}/docs-site.yml +0 -0
- /package/overlays/{presets â .presets}/fullstack.yml +0 -0
package/overlays/python/setup.sh
CHANGED
|
@@ -1,47 +1,74 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# Python setup script -
|
|
2
|
+
# Python setup script - Create virtual environment and install dependencies
|
|
3
3
|
|
|
4
4
|
set -e
|
|
5
5
|
|
|
6
6
|
# Extract overlay name from script filename (setup-<overlay>.sh -> <overlay>)
|
|
7
7
|
OVERLAY_NAME=$(basename "$0" | sed 's/setup-//;s/\.sh$//')
|
|
8
8
|
|
|
9
|
-
echo "đ Setting up Python environment..."
|
|
9
|
+
echo "đ Setting up Python virtual environment..."
|
|
10
|
+
|
|
11
|
+
# Determine workspace root (script is run from workspace root via postCreateCommand)
|
|
12
|
+
WORKSPACE_ROOT="${PWD}"
|
|
13
|
+
VENV_DIR="${WORKSPACE_ROOT}/.venv"
|
|
14
|
+
|
|
15
|
+
# Create virtual environment if it doesn't exist
|
|
16
|
+
if [ ! -d "${VENV_DIR}" ]; then
|
|
17
|
+
echo "đĻ Creating virtual environment at .venv..."
|
|
18
|
+
if ! command -v python3 >/dev/null 2>&1; then
|
|
19
|
+
echo "â python3 is not available on PATH. Please ensure python3 is installed."
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
python3 -m venv "${VENV_DIR}"
|
|
23
|
+
echo "â Virtual environment created"
|
|
24
|
+
else
|
|
25
|
+
echo "â Virtual environment already exists at .venv"
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Activate virtual environment
|
|
29
|
+
# shellcheck source=/dev/null
|
|
30
|
+
source "${VENV_DIR}/bin/activate"
|
|
31
|
+
|
|
32
|
+
# Upgrade pip, setuptools, and wheel inside the venv
|
|
33
|
+
echo "âŦī¸ Upgrading pip, setuptools, and wheel..."
|
|
34
|
+
pip install --upgrade pip setuptools wheel
|
|
35
|
+
echo "â pip, setuptools, and wheel upgraded"
|
|
10
36
|
|
|
11
37
|
# Install overlay-specific packages (if requirements-overlay.txt exists)
|
|
12
38
|
if [ -f ".devcontainer/requirements-overlay-${OVERLAY_NAME}.txt" ]; then
|
|
13
39
|
echo "đĻ Installing overlay packages from requirements-overlay-${OVERLAY_NAME}.txt..."
|
|
14
|
-
pip install
|
|
40
|
+
pip install -r ".devcontainer/requirements-overlay-${OVERLAY_NAME}.txt"
|
|
15
41
|
echo "â Overlay packages installed"
|
|
16
42
|
fi
|
|
17
43
|
|
|
18
|
-
#
|
|
44
|
+
# Install from root requirements.txt (project production dependencies)
|
|
19
45
|
if [ -f "requirements.txt" ]; then
|
|
20
|
-
echo "đĻ
|
|
21
|
-
pip install
|
|
46
|
+
echo "đĻ Installing dependencies from requirements.txt..."
|
|
47
|
+
pip install -r requirements.txt
|
|
22
48
|
echo "â Dependencies installed from requirements.txt"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# Install from requirements-dev.txt (project development dependencies)
|
|
52
|
+
if [ -f "requirements-dev.txt" ]; then
|
|
53
|
+
echo "đĻ Installing dev dependencies from requirements-dev.txt..."
|
|
54
|
+
pip install -r requirements-dev.txt
|
|
26
55
|
echo "â Dev dependencies installed from requirements-dev.txt"
|
|
27
56
|
fi
|
|
28
57
|
|
|
29
|
-
#
|
|
58
|
+
# Install project in editable mode if pyproject.toml exists (modern Python projects)
|
|
30
59
|
if [ -f "pyproject.toml" ]; then
|
|
31
|
-
echo "đĻ Found pyproject.toml, installing project..."
|
|
32
|
-
pip install
|
|
60
|
+
echo "đĻ Found pyproject.toml, installing project in editable mode..."
|
|
61
|
+
pip install -e .
|
|
33
62
|
echo "â Project installed in editable mode"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
echo "đĻ Found setup.py, installing project..."
|
|
39
|
-
pip install --user -e .
|
|
63
|
+
elif [ -f "setup.py" ]; then
|
|
64
|
+
# Fallback for legacy Python projects
|
|
65
|
+
echo "đĻ Found setup.py, installing project in editable mode..."
|
|
66
|
+
pip install -e .
|
|
40
67
|
echo "â Project installed in editable mode"
|
|
41
68
|
fi
|
|
42
69
|
|
|
43
|
-
|
|
44
|
-
echo "
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
echo "
|
|
70
|
+
echo ""
|
|
71
|
+
echo "â Python virtual environment setup complete"
|
|
72
|
+
echo " Virtual environment: ${VENV_DIR}"
|
|
73
|
+
echo " Python interpreter: ${VENV_DIR}/bin/python"
|
|
74
|
+
echo " Activate manually: source .venv/bin/activate"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Verification script for Python overlay
|
|
3
|
-
# Confirms Python and
|
|
3
|
+
# Confirms Python, pip, and virtual environment are installed and functional
|
|
4
4
|
|
|
5
5
|
set -e
|
|
6
6
|
|
|
@@ -28,5 +28,33 @@ else
|
|
|
28
28
|
exit 1
|
|
29
29
|
fi
|
|
30
30
|
|
|
31
|
+
# Check venv module is available
|
|
32
|
+
echo ""
|
|
33
|
+
echo "3ī¸âŖ Checking venv module..."
|
|
34
|
+
if python3 -m venv --help &> /dev/null; then
|
|
35
|
+
echo " â
venv module available"
|
|
36
|
+
else
|
|
37
|
+
echo " â venv module not available"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# Check virtual environment was created (only if we are inside a devcontainer)
|
|
42
|
+
echo ""
|
|
43
|
+
echo "4ī¸âŖ Checking virtual environment..."
|
|
44
|
+
VENV_DIR="${PWD}/.venv"
|
|
45
|
+
if [ -d "${VENV_DIR}" ]; then
|
|
46
|
+
if [ -f "${VENV_DIR}/bin/python" ]; then
|
|
47
|
+
VENV_PYTHON_VERSION=$("${VENV_DIR}/bin/python" --version 2>&1)
|
|
48
|
+
echo " Virtual environment: ${VENV_DIR}"
|
|
49
|
+
echo " Python version: ${VENV_PYTHON_VERSION}"
|
|
50
|
+
echo " â
Virtual environment is functional"
|
|
51
|
+
else
|
|
52
|
+
echo " â ī¸ Virtual environment directory exists but python not found"
|
|
53
|
+
echo " âšī¸ Run setup script to create it: bash .devcontainer/scripts/setup-python.sh"
|
|
54
|
+
fi
|
|
55
|
+
else
|
|
56
|
+
echo " âšī¸ No .venv found â will be created on container start by setup-python.sh"
|
|
57
|
+
fi
|
|
58
|
+
|
|
31
59
|
echo ""
|
|
32
60
|
echo "â
Python overlay verification complete"
|
|
@@ -14,5 +14,15 @@ tags:
|
|
|
14
14
|
- rabbitmq
|
|
15
15
|
- amqp
|
|
16
16
|
ports:
|
|
17
|
-
- 5672
|
|
18
|
-
|
|
17
|
+
- port: 5672
|
|
18
|
+
service: rabbitmq
|
|
19
|
+
protocol: tcp
|
|
20
|
+
description: RabbitMQ AMQP connection
|
|
21
|
+
onAutoForward: notify
|
|
22
|
+
connectionStringTemplate: 'amqp://{rabbitmq_user}:{rabbitmq_password}@{host}:{port}{rabbitmq_vhost}'
|
|
23
|
+
- port: 15672
|
|
24
|
+
service: rabbitmq
|
|
25
|
+
protocol: http
|
|
26
|
+
description: RabbitMQ management UI
|
|
27
|
+
path: /
|
|
28
|
+
onAutoForward: openBrowser
|
|
@@ -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.
|
|
3
|
+
"version": "0.1.4",
|
|
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": "^
|
|
58
|
+
"boxen": "^8.0.1",
|
|
57
59
|
"chalk": "^5.6.2",
|
|
58
|
-
"commander": "^
|
|
60
|
+
"commander": "^14.0.3",
|
|
59
61
|
"js-yaml": "^4.1.1",
|
|
60
|
-
"ora": "^
|
|
62
|
+
"ora": "^9.3.0"
|
|
61
63
|
},
|
|
62
64
|
"devDependencies": {
|
|
63
65
|
"@types/js-yaml": "^4.0.9",
|
|
64
|
-
"@types/node": "^
|
|
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 #
|
|
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
|
-
âââ
|
|
129
|
-
âââ
|
|
130
|
-
âââ
|
|
131
|
-
âââ
|
|
132
|
-
âââ
|
|
133
|
-
|
|
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 (
|
|
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] #
|
|
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** -
|
|
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
|
|
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
|
|