container-superposition 0.1.5 → 0.1.7

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 (155) hide show
  1. package/README.md +3 -1
  2. package/dist/scripts/init.js +24 -4
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/tool/commands/adopt.d.ts +3 -2
  5. package/dist/tool/commands/adopt.d.ts.map +1 -1
  6. package/dist/tool/commands/adopt.js +378 -67
  7. package/dist/tool/commands/adopt.js.map +1 -1
  8. package/dist/tool/commands/doctor.d.ts +3 -0
  9. package/dist/tool/commands/doctor.d.ts.map +1 -1
  10. package/dist/tool/commands/doctor.js +932 -69
  11. package/dist/tool/commands/doctor.js.map +1 -1
  12. package/dist/tool/commands/explain.d.ts.map +1 -1
  13. package/dist/tool/commands/explain.js +9 -0
  14. package/dist/tool/commands/explain.js.map +1 -1
  15. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  16. package/dist/tool/questionnaire/composer.js +212 -11
  17. package/dist/tool/questionnaire/composer.js.map +1 -1
  18. package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
  19. package/dist/tool/schema/overlay-loader.js +1 -0
  20. package/dist/tool/schema/overlay-loader.js.map +1 -1
  21. package/dist/tool/schema/project-config.d.ts +3 -1
  22. package/dist/tool/schema/project-config.d.ts.map +1 -1
  23. package/dist/tool/schema/project-config.js +164 -13
  24. package/dist/tool/schema/project-config.js.map +1 -1
  25. package/dist/tool/schema/types.d.ts +85 -11
  26. package/dist/tool/schema/types.d.ts.map +1 -1
  27. package/dist/tool/utils/merge.d.ts.map +1 -1
  28. package/dist/tool/utils/merge.js +9 -0
  29. package/dist/tool/utils/merge.js.map +1 -1
  30. package/docs/adopt.md +20 -14
  31. package/docs/creating-overlays.md +151 -2
  32. package/docs/overlay-imports.md +125 -102
  33. package/docs/overlays.md +59 -6
  34. package/docs/quick-reference.md +99 -0
  35. package/docs/specs/002-superposition-config-file/plan.md +6 -1
  36. package/docs/specs/002-superposition-config-file/spec.md +6 -0
  37. package/docs/specs/002-superposition-config-file/tasks.md +2 -0
  38. package/docs/specs/003-mkdocs2-overlay/spec.md +114 -0
  39. package/docs/specs/004-doctor-fix/spec.md +70 -0
  40. package/docs/specs/005-cuda-overlay/spec.md +101 -0
  41. package/docs/specs/006-rocm-overlay/spec.md +109 -0
  42. package/docs/team-workflow.md +7 -1
  43. package/docs/workflows.md +3 -0
  44. package/features/cross-distro-packages/README.md +18 -0
  45. package/features/cross-distro-packages/devcontainer-feature.json +3 -3
  46. package/features/cross-distro-packages/install.sh +49 -7
  47. package/overlays/.shared/README.md +80 -21
  48. package/overlays/.shared/compose/common-healthchecks.md +60 -0
  49. package/overlays/.shared/vscode/recommended-extensions.json +15 -11
  50. package/overlays/alertmanager/setup.sh +4 -19
  51. package/overlays/alertmanager/verify.sh +8 -9
  52. package/overlays/all/README.md +43 -0
  53. package/overlays/all/devcontainer.patch.json +6 -0
  54. package/overlays/all/overlay.yml +14 -0
  55. package/overlays/amp/setup.sh +5 -0
  56. package/overlays/bun/setup.sh +10 -1
  57. package/overlays/bun/verify.sh +6 -1
  58. package/overlays/claude-code/setup.sh +5 -0
  59. package/overlays/cloudflared/setup.sh +9 -12
  60. package/overlays/codex/README.md +9 -6
  61. package/overlays/codex/devcontainer.patch.json +7 -1
  62. package/overlays/codex/setup.sh +5 -0
  63. package/overlays/codex/verify.sh +8 -0
  64. package/overlays/commitlint/setup.sh +5 -0
  65. package/overlays/cuda/README.md +179 -0
  66. package/overlays/cuda/devcontainer.patch.json +7 -0
  67. package/overlays/cuda/overlay.yml +17 -0
  68. package/overlays/cuda/setup.sh +32 -0
  69. package/overlays/cuda/verify.sh +38 -0
  70. package/overlays/devcontainer-cli/README.md +50 -0
  71. package/overlays/devcontainer-cli/devcontainer.patch.json +13 -0
  72. package/overlays/devcontainer-cli/overlay.yml +16 -0
  73. package/overlays/devcontainer-cli/setup.sh +14 -0
  74. package/overlays/direnv/devcontainer.patch.json +6 -0
  75. package/overlays/direnv/setup.sh +7 -6
  76. package/overlays/dotnet/setup.sh +14 -7
  77. package/overlays/duckdb/devcontainer.patch.json +1 -2
  78. package/overlays/gcloud/devcontainer.patch.json +0 -6
  79. package/overlays/gcloud/setup.sh +51 -0
  80. package/overlays/gemini-cli/setup.sh +5 -0
  81. package/overlays/git-helpers/devcontainer.patch.json +2 -1
  82. package/overlays/go/setup.sh +15 -14
  83. package/overlays/jaeger/overlay.yml +2 -0
  84. package/overlays/just/setup.sh +5 -17
  85. package/overlays/keycloak/docker-compose.yml +6 -4
  86. package/overlays/keycloak/verify.sh +4 -3
  87. package/overlays/kind/devcontainer.patch.json +1 -2
  88. package/overlays/kind/setup.sh +8 -17
  89. package/overlays/minio/setup.sh +10 -18
  90. package/overlays/mkdocs/overlay.yml +2 -1
  91. package/overlays/mkdocs2/README.md +135 -0
  92. package/overlays/mkdocs2/devcontainer.patch.json +19 -0
  93. package/overlays/mkdocs2/overlay.yml +17 -0
  94. package/overlays/mkdocs2/setup.sh +67 -0
  95. package/overlays/mkdocs2/verify.sh +35 -0
  96. package/overlays/modern-cli-tools/devcontainer.patch.json +7 -1
  97. package/overlays/modern-cli-tools/setup.sh +21 -71
  98. package/overlays/mongodb/devcontainer.patch.json +0 -6
  99. package/overlays/mongodb/setup.sh +59 -0
  100. package/overlays/mysql/verify.sh +4 -3
  101. package/overlays/nats/.env.example +1 -1
  102. package/overlays/nats/README.md +1 -1
  103. package/overlays/nats/docker-compose.yml +1 -1
  104. package/overlays/ngrok/setup.sh +9 -6
  105. package/overlays/nodejs/setup.sh +5 -0
  106. package/overlays/openapi-tools/devcontainer.patch.json +1 -2
  107. package/overlays/openapi-tools/setup.sh +9 -8
  108. package/overlays/opencode/setup.sh +5 -0
  109. package/overlays/otel-collector/overlay.yml +2 -0
  110. package/overlays/otel-collector/setup.sh +3 -16
  111. package/overlays/otel-demo-nodejs/verify.sh +8 -9
  112. package/overlays/otel-demo-python/verify.sh +16 -10
  113. package/overlays/pandoc/README.md +286 -0
  114. package/overlays/pandoc/devcontainer.patch.json +18 -0
  115. package/overlays/pandoc/overlay.yml +19 -0
  116. package/overlays/pandoc/setup.sh +293 -0
  117. package/overlays/pandoc/verify.sh +25 -0
  118. package/overlays/playwright/devcontainer.patch.json +3 -1
  119. package/overlays/playwright/setup.sh +37 -0
  120. package/overlays/postgres/docker-compose.yml +6 -0
  121. package/overlays/powershell/setup.sh +49 -13
  122. package/overlays/pre-commit/setup.sh +12 -3
  123. package/overlays/prometheus/overlay.yml +2 -0
  124. package/overlays/promtail/verify.sh +16 -10
  125. package/overlays/pulumi/devcontainer.patch.json +1 -1
  126. package/overlays/python/setup.sh +28 -9
  127. package/overlays/python/verify.sh +4 -2
  128. package/overlays/redpanda/docker-compose.yml +3 -5
  129. package/overlays/rocm/README.md +227 -0
  130. package/overlays/rocm/devcontainer.patch.json +4 -0
  131. package/overlays/rocm/overlay.yml +17 -0
  132. package/overlays/rocm/setup.sh +45 -0
  133. package/overlays/rocm/verify.sh +47 -0
  134. package/overlays/rust/setup.sh +11 -18
  135. package/overlays/spec-kit/setup.sh +7 -3
  136. package/overlays/sqlite/setup.sh +14 -14
  137. package/overlays/sqlserver/docker-compose.yml +3 -3
  138. package/overlays/sqlserver/verify.sh +22 -5
  139. package/overlays/tempo/verify.sh +16 -10
  140. package/overlays/tilt/devcontainer.patch.json +1 -2
  141. package/overlays/tilt/setup.sh +14 -4
  142. package/overlays/windsurf-cli/setup.sh +27 -4
  143. package/overlays/windsurf-cli/verify.sh +13 -3
  144. package/package.json +2 -1
  145. package/templates/scripts/setup-utils.sh +228 -0
  146. package/tool/schema/config.schema.json +110 -8
  147. package/tool/schema/overlay-manifest.schema.json +5 -0
  148. package/overlays/.shared/compose/common-healthchecks.yml +0 -38
  149. /package/overlays/otel-demo-nodejs/{Dockerfile-otel-demo-nodejs → Dockerfile} +0 -0
  150. /package/overlays/otel-demo-nodejs/{package-otel-demo-nodejs.json → package.json} +0 -0
  151. /package/overlays/otel-demo-nodejs/{server-otel-demo-nodejs.js → server.js} +0 -0
  152. /package/overlays/otel-demo-nodejs/{tracing-otel-demo-nodejs.js → tracing.js} +0 -0
  153. /package/overlays/otel-demo-python/{Dockerfile-otel-demo-python → Dockerfile} +0 -0
  154. /package/overlays/otel-demo-python/{app-otel-demo-python.py → app.py} +0 -0
  155. /package/overlays/otel-demo-python/{requirements-otel-demo-python.txt → requirements.txt} +0 -0
@@ -15,18 +15,20 @@ services:
15
15
  KC_HTTP_PORT: 8180
16
16
  KC_HOSTNAME_STRICT: 'false'
17
17
  KC_HTTP_ENABLED: 'true'
18
+ KC_HEALTH_ENABLED: 'true'
18
19
  ports:
19
20
  - '${KEYCLOAK_PORT:-8180}:8180'
20
21
  depends_on:
21
- - postgres
22
+ postgres:
23
+ condition: service_healthy
22
24
  networks:
23
25
  - devnet
24
26
  healthcheck:
25
- test: ['CMD-SHELL', 'curl -sf http://localhost:8180/health/ready || exit 1']
27
+ test: ['CMD-SHELL', 'curl -sf http://localhost:9000/health/ready || exit 1']
26
28
  interval: 15s
27
29
  timeout: 10s
28
- retries: 10
29
- start_period: 60s
30
+ retries: 15
31
+ start_period: 90s
30
32
 
31
33
  networks:
32
34
  devnet:
@@ -20,10 +20,11 @@ echo ""
20
20
  echo "2️⃣ Checking Keycloak service..."
21
21
  KEYCLOAK_HOST="${KEYCLOAK_HOST:-keycloak}"
22
22
  KEYCLOAK_PORT="${KEYCLOAK_PORT:-8180}"
23
+ KEYCLOAK_MGMT_PORT="${KEYCLOAK_MGMT_PORT:-9000}"
23
24
  KEYCLOAK_READY=false
24
25
 
25
- for i in {1..40}; do
26
- if curl -sf "http://${KEYCLOAK_HOST}:${KEYCLOAK_PORT}/health/ready" &> /dev/null; then
26
+ for i in {1..80}; do
27
+ if curl -sf "http://${KEYCLOAK_HOST}:${KEYCLOAK_MGMT_PORT}/health/ready" &> /dev/null; then
27
28
  echo " ✅ Keycloak service is ready"
28
29
  KEYCLOAK_READY=true
29
30
  break
@@ -32,7 +33,7 @@ for i in {1..40}; do
32
33
  done
33
34
 
34
35
  if [ "$KEYCLOAK_READY" = false ]; then
35
- echo " ❌ Keycloak service not ready after 2 minutes"
36
+ echo " ❌ Keycloak service not ready after 4 minutes"
36
37
  echo " ℹ️ Keycloak can take a while to start on first run"
37
38
  exit 1
38
39
  fi
@@ -5,6 +5,5 @@
5
5
  "apt": "curl",
6
6
  "apk": "curl"
7
7
  }
8
- },
9
- "postCreateCommand": "bash .devcontainer/scripts/setup-kind.sh"
8
+ }
10
9
  }
@@ -5,28 +5,19 @@ set -e
5
5
 
6
6
  echo "🔧 Setting up kind (Kubernetes in Docker)..."
7
7
 
8
- # Detect architecture
9
- ARCH=$(uname -m)
10
- case $ARCH in
11
- x86_64)
12
- KIND_ARCH="amd64"
13
- ;;
14
- aarch64|arm64)
15
- KIND_ARCH="arm64"
16
- ;;
17
- *)
18
- echo "❌ Unsupported architecture: $ARCH"
19
- exit 1
20
- ;;
21
- esac
8
+ # Source shared setup utilities
9
+ # shellcheck source=setup-utils.sh
10
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
11
+
12
+ detect_arch
22
13
 
23
14
  # Install kind
24
15
  KIND_VERSION="${KIND_VERSION:-v0.22.0}"
25
16
  echo "📦 Installing kind ${KIND_VERSION}..."
26
17
 
27
- curl -Lo /tmp/kind "https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-${KIND_ARCH}"
28
- chmod +x /tmp/kind
29
- sudo mv /tmp/kind /usr/local/bin/kind
18
+ install_binary \
19
+ "https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-${CS_ARCH}" \
20
+ "kind"
30
21
 
31
22
  # Verify installation
32
23
  if command -v kind &> /dev/null; then
@@ -7,25 +7,17 @@ echo "🔧 Setting up MinIO client..."
7
7
 
8
8
  # Install MinIO client (mc)
9
9
  echo "📦 Installing MinIO client (mc)..."
10
+ # Source shared setup utilities
11
+ # shellcheck source=setup-utils.sh
12
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
13
+
10
14
  if ! command -v mc &> /dev/null; then
11
- # Pin to a specific version for security and reproducibility
12
- MC_VERSION="RELEASE.2024-11-17T19-35-25Z"
13
- MC_URL="https://dl.min.io/client/mc/release/linux-amd64/archive/mc.${MC_VERSION}"
14
- MC_CHECKSUM="27e18faeabd9a0c8066e3b4aadb13a2c0ae4dac09a1e24defe34c99a11b59e26"
15
-
16
- echo " Downloading MinIO client version ${MC_VERSION}..."
17
- wget -q "${MC_URL}" -O /tmp/mc
18
-
19
- # Verify checksum
20
- echo " Verifying checksum..."
21
- echo "${MC_CHECKSUM} /tmp/mc" | sha256sum -c - || {
22
- echo " ❌ Checksum verification failed!"
23
- rm -f /tmp/mc
24
- exit 1
25
- }
26
-
27
- sudo install /tmp/mc /usr/local/bin/
28
- rm /tmp/mc
15
+ MC_VERSION="${MC_VERSION:-RELEASE.2024-11-17T19-35-25Z}"
16
+ detect_arch
17
+ echo " Downloading MinIO client version ${MC_VERSION} for ${CS_ARCH}..."
18
+ install_binary \
19
+ "https://dl.min.io/client/mc/release/linux-${CS_ARCH}/archive/mc.${MC_VERSION}" \
20
+ "mc"
29
21
  echo " ✅ MinIO client installed (${MC_VERSION})"
30
22
  else
31
23
  echo " ✅ MinIO client already installed"
@@ -6,7 +6,8 @@ supports: []
6
6
  requires:
7
7
  - python
8
8
  suggests: []
9
- conflicts: []
9
+ conflicts:
10
+ - mkdocs2
10
11
  tags:
11
12
  - documentation
12
13
  - mkdocs
@@ -0,0 +1,135 @@
1
+ # MkDocs 2 Overlay
2
+
3
+ MkDocs 2.0 pre-release from [encode/mkdocs](https://github.com/encode/mkdocs) — a smart, simple website design tool by Tom Christie.
4
+
5
+ > **Pre-release notice:** MkDocs 2.0 is installed from the `encode/mkdocs` git repository. There is no PyPI release yet. This is a complete rewrite of the original MkDocs project — it is **not** backward-compatible with MkDocs 1.x.
6
+
7
+ ## Features
8
+
9
+ - **MkDocs 2.0** — complete rewrite with modern architecture
10
+ - **TOML configuration** — uses `mkdocs.toml` instead of `mkdocs.yml`
11
+ - **Built-in theming** — custom theme system (does not use Material for MkDocs)
12
+ - **GitHub Flavored Markdown** — native GFM support
13
+ - **pymdown-extensions** — extended Markdown syntax included
14
+ - **Python dependency** — automatically includes the Python overlay (required)
15
+ - **VS Code Extensions:**
16
+ - Markdown All in One
17
+ - Markdown Lint
18
+ - Markdown Mermaid
19
+ - **Port forwarding:** 8000 (MkDocs dev server, auto-opens in browser)
20
+
21
+ ## How It Works
22
+
23
+ The overlay's `setup.sh` script installs MkDocs 2.0 directly from the
24
+ [encode/mkdocs](https://github.com/encode/mkdocs) GitHub repository via
25
+ `pip install git+https://github.com/encode/mkdocs.git` into the workspace
26
+ virtual environment (`.venv`) created by the Python overlay.
27
+
28
+ ## Dependencies
29
+
30
+ - Requires: **python** overlay (automatically selected)
31
+ - Conflicts: **mkdocs** overlay — only one MkDocs variant can be active at a time
32
+
33
+ ## Quick Start
34
+
35
+ ### New Documentation Site
36
+
37
+ ```bash
38
+ # Create a README.md and start the dev server
39
+ echo "# My Docs" > README.md
40
+ mkdocs serve
41
+ # Opens at http://localhost:8000
42
+ ```
43
+
44
+ ### Build Static Site
45
+
46
+ ```bash
47
+ mkdocs build
48
+ ```
49
+
50
+ ## Configuration
51
+
52
+ MkDocs 2.0 uses `mkdocs.toml` (not the 1.x `mkdocs.yml`):
53
+
54
+ ```toml
55
+ [mkdocs]
56
+ nav = [
57
+ {path = "README.md", title = "Introduction"},
58
+ {path = "guide.md", title = "Guide"},
59
+ {path = "CREDITS.md", title = "Credits"},
60
+ ]
61
+
62
+ [loaders]
63
+ theme = "pkg://mkdocs/default"
64
+ docs = "dir://docs"
65
+
66
+ [context]
67
+ title = "Documentation"
68
+ favicon = "📘"
69
+ ```
70
+
71
+ ### Page Structure
72
+
73
+ Use either `README.md` or `index.md` for the homepage. Place additional pages in a `docs/` directory:
74
+
75
+ ```
76
+ my-project/
77
+ ├── mkdocs.toml
78
+ ├── README.md
79
+ ├── docs/
80
+ │ ├── guide.md
81
+ │ └── reference.md
82
+ └── site/ # Built output (git-ignored)
83
+ ```
84
+
85
+ ## Key Differences from MkDocs 1.x
86
+
87
+ | Feature | MkDocs 1.x (`mkdocs` overlay) | MkDocs 2.0 (`mkdocs2` overlay) |
88
+ | -------------- | ----------------------------- | ------------------------------ |
89
+ | Config file | `mkdocs.yml` | `mkdocs.toml` |
90
+ | Theme | Material for MkDocs | Built-in themes |
91
+ | Plugin system | `mkdocs-plugins` ecosystem | New architecture |
92
+ | Install source | PyPI / devcontainer feature | `encode/mkdocs` git repo |
93
+ | Markdown | Standard + extensions | GitHub Flavored Markdown |
94
+ | Status | Stable (1.6.1) | Pre-release (2.0) |
95
+
96
+ ## Common Commands
97
+
98
+ ```bash
99
+ # Start live-reloading dev server
100
+ mkdocs serve
101
+
102
+ # Build static site
103
+ mkdocs build
104
+
105
+ # Serve on a different port
106
+ mkdocs serve --dev-addr 0.0.0.0:8001
107
+ ```
108
+
109
+ ## Troubleshooting
110
+
111
+ ### `mkdocs: command not found`
112
+
113
+ The Python virtual environment may not be activated. Activate it manually:
114
+
115
+ ```bash
116
+ source .venv/bin/activate
117
+ mkdocs --version
118
+ ```
119
+
120
+ ### Port 8000 already in use
121
+
122
+ Use a different port: `mkdocs serve --dev-addr 0.0.0.0:8001`
123
+
124
+ ## References
125
+
126
+ - [encode/mkdocs on GitHub](https://github.com/encode/mkdocs)
127
+ - [MkDocs 2.0 writing guide](https://github.com/encode/mkdocs/blob/main/docs/writing.md)
128
+ - [MkDocs 2.0 navigation docs](https://github.com/encode/mkdocs/blob/main/docs/navigation.md)
129
+ - [MkDocs 2.0 styling docs](https://github.com/encode/mkdocs/blob/main/docs/styling.md)
130
+
131
+ **Related Overlays:**
132
+
133
+ - `python` — required Python runtime
134
+ - `mkdocs` — legacy MkDocs 1.x overlay (conflicts with this overlay)
135
+ - `pandoc` — convert Markdown to PDF
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
+ "customizations": {
4
+ "vscode": {
5
+ "extensions": [
6
+ "yzhang.markdown-all-in-one",
7
+ "DavidAnson.vscode-markdownlint",
8
+ "bierner.markdown-mermaid"
9
+ ]
10
+ }
11
+ },
12
+ "forwardPorts": [8000],
13
+ "portsAttributes": {
14
+ "8000": {
15
+ "label": "MkDocs Server",
16
+ "onAutoForward": "openBrowser"
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,17 @@
1
+ id: mkdocs2
2
+ name: MkDocs 2
3
+ description: MkDocs 2.0 pre-release (encode/mkdocs) — smart, simple website design tool
4
+ category: dev
5
+ supports: []
6
+ requires:
7
+ - python
8
+ suggests: []
9
+ conflicts:
10
+ - mkdocs
11
+ tags:
12
+ - dev
13
+ - documentation
14
+ - mkdocs
15
+ - python
16
+ ports:
17
+ - 8000
@@ -0,0 +1,67 @@
1
+ #!/bin/bash
2
+ # mkdocs2 setup script — install MkDocs 2.0 pre-release from encode/mkdocs
3
+
4
+ set -e
5
+
6
+ echo "📚 Setting up MkDocs 2.0 (encode/mkdocs)..."
7
+
8
+ # Always install into the workspace virtual environment.
9
+ # The Python overlay is declared as a hard dependency (requires: [python]) so
10
+ # its setup script should have run first; but if the .venv doesn't exist yet
11
+ # (e.g., ordering edge-case) we create it here so this script is self-contained.
12
+ VENV_DIR="${PWD}/.venv"
13
+
14
+ # Helper: validate that the venv's Python interpreter is actually executable.
15
+ venv_is_valid() {
16
+ "${VENV_DIR}/bin/python" -c "import sys" &>/dev/null
17
+ }
18
+
19
+ if [ -d "${VENV_DIR}" ]; then
20
+ if venv_is_valid; then
21
+ echo " Using virtual environment: ${VENV_DIR}"
22
+ else
23
+ echo "⚠️ Existing .venv is invalid (stale interpreter or broken site-packages), recreating..."
24
+ rm -rf "${VENV_DIR}"
25
+ fi
26
+ else
27
+ # Also handle the case where the directory listing showed site-packages exists
28
+ # but venv_is_valid failed — this handles partial/corrupted venvs
29
+ : # nothing to do, venv doesn't exist yet
30
+ fi
31
+
32
+ # If the venv directory exists but python fails with EEXIST on site-packages,
33
+ # it is a leftover from a previous interrupted run — recreate it.
34
+ if [ -d "${VENV_DIR}" ] && ! "${VENV_DIR}/bin/python" -m pip --version &>/dev/null; then
35
+ echo "⚠️ Existing .venv has broken pip, recreating..."
36
+ rm -rf "${VENV_DIR}"
37
+ fi
38
+
39
+ if [ ! -d "${VENV_DIR}" ]; then
40
+ echo "📦 Creating virtual environment at .venv..."
41
+ if ! command -v python3 &>/dev/null; then
42
+ echo "❌ python3 is not available. Please ensure the python overlay is included."
43
+ exit 1
44
+ fi
45
+ python3 -m venv "${VENV_DIR}"
46
+ echo "✓ Virtual environment created"
47
+ fi
48
+
49
+ # Use the venv's Python directly to invoke pip — this is more robust than
50
+ # calling the pip wrapper script, whose shebang can point to a stale path.
51
+ PYTHON="${VENV_DIR}/bin/python"
52
+
53
+ echo "📦 Installing MkDocs 2.0 from encode/mkdocs..."
54
+ "${PYTHON}" -m pip install -q --no-cache-dir \
55
+ "mkdocs @ git+https://github.com/encode/mkdocs.git"
56
+
57
+ MKDOCS_BIN="${VENV_DIR}/bin/mkdocs"
58
+ if [ -x "${MKDOCS_BIN}" ]; then
59
+ echo "✓ $( "${MKDOCS_BIN}" --version 2>/dev/null || echo 'mkdocs 2.0' )"
60
+ else
61
+ echo "✗ mkdocs not found in ${VENV_DIR}/bin after installation"
62
+ exit 1
63
+ fi
64
+
65
+ echo "✅ MkDocs 2.0 setup complete"
66
+ echo "ℹ️ Start dev server: mkdocs serve"
67
+ echo "ℹ️ Build static site: mkdocs build"
@@ -0,0 +1,35 @@
1
+ #!/bin/bash
2
+ # mkdocs2 overlay verification script
3
+
4
+ echo "🔍 Verifying MkDocs 2.0 overlay setup..."
5
+
6
+ ALL_CHECKS_PASSED=true
7
+
8
+ # mkdocs may be installed inside .venv (Python overlay) or on the system PATH
9
+ MKDOCS_BIN="mkdocs"
10
+ if [ -f "${PWD}/.venv/bin/mkdocs" ]; then
11
+ MKDOCS_BIN="${PWD}/.venv/bin/mkdocs"
12
+ fi
13
+
14
+ # Check mkdocs is available
15
+ if ! command -v "${MKDOCS_BIN}" &>/dev/null && [ ! -x "${MKDOCS_BIN}" ]; then
16
+ echo "✗ mkdocs not found"
17
+ ALL_CHECKS_PASSED=false
18
+ else
19
+ VERSION=$("${MKDOCS_BIN}" --version 2>/dev/null || echo "unknown")
20
+ echo "✓ mkdocs is installed: ${VERSION}"
21
+ fi
22
+
23
+ if [ "${ALL_CHECKS_PASSED}" = true ]; then
24
+ echo ""
25
+ echo "✅ MkDocs 2.0 overlay verification complete!"
26
+ echo ""
27
+ echo "💡 Tips:"
28
+ echo " - Start dev server: mkdocs serve"
29
+ echo " - Build static site: mkdocs build"
30
+ echo " - New project: mkdocs new ."
31
+ else
32
+ echo ""
33
+ echo "✗ MkDocs 2.0 overlay verification failed"
34
+ exit 1
35
+ fi
@@ -1,3 +1,9 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json"
2
+ "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
+ "features": {
4
+ "./features/cross-distro-packages": {
5
+ "apt": "jq ripgrep fd-find bat",
6
+ "apk": "jq ripgrep fd bat"
7
+ }
8
+ }
3
9
  }
@@ -1,94 +1,44 @@
1
1
  #!/bin/bash
2
2
  # Modern CLI tools setup script
3
+ # jq, ripgrep, fd, bat are installed via cross-distro-packages devcontainer feature.
4
+ # This script installs yq (not in standard repos), creates Debian symlinks, and configures tools.
3
5
 
4
6
  set -e
5
7
 
6
8
  echo "🚀 Setting up modern CLI tools..."
7
9
 
8
- # Update package list
9
- sudo apt-get update -qq
10
-
11
- # Install jq (JSON processor)
12
- echo "📦 Installing jq..."
13
- sudo apt-get install -y jq
14
- if command -v jq &> /dev/null; then
15
- echo "✓ jq installed: $(jq --version)"
16
- else
17
- echo "✗ jq installation failed"
18
- exit 1
19
- fi
20
-
21
- # Install yq (YAML processor)
10
+ # Install yq (YAML processor — not in standard distro repos)
22
11
  echo "📦 Installing yq..."
23
- YQ_VERSION="4.52.2"
12
+ YQ_VERSION="${YQ_VERSION:-4.52.2}"
24
13
  ARCH=$(uname -m)
14
+ case "$ARCH" in
15
+ x86_64) YQ_ARCH="amd64" ;;
16
+ aarch64|arm64) YQ_ARCH="arm64" ;;
17
+ *) echo "⚠️ Unsupported architecture: $ARCH, defaulting to amd64"; YQ_ARCH="amd64" ;;
18
+ esac
25
19
 
26
- # SHA256 checksums for yq v4.52.2
27
- if [ "$ARCH" = "x86_64" ]; then
28
- YQ_ARCH="amd64"
29
- YQ_CHECKSUM="a74bd266990339e0c48a2103534aef692abf99f19390d12c2b0ce6830385c459"
30
- elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
31
- YQ_ARCH="arm64"
32
- YQ_CHECKSUM="c82856ac30da522f50dcdd4f53065487b5a2927e9b87ff637956900986f1f7c2"
33
- else
34
- echo "⚠️ Unsupported architecture: $ARCH, defaulting to amd64"
35
- YQ_ARCH="amd64"
36
- YQ_CHECKSUM="a74bd266990339e0c48a2103534aef692abf99f19390d12c2b0ce6830385c459"
37
- fi
38
-
39
- curl -L "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_${YQ_ARCH}" \
20
+ curl -fsSL "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_${YQ_ARCH}" \
40
21
  -o /tmp/yq
22
+ sudo install -m 0755 /tmp/yq /usr/local/bin/yq
23
+ rm /tmp/yq
41
24
 
42
- # Verify checksum
43
- echo "🔐 Verifying yq checksum..."
44
- echo "${YQ_CHECKSUM} /tmp/yq" | sha256sum -c - || {
45
- echo "✗ yq checksum verification failed"
46
- rm /tmp/yq
47
- exit 1
48
- }
49
-
50
- sudo mv /tmp/yq /usr/local/bin/yq
51
- sudo chmod +x /usr/local/bin/yq
52
-
53
- if command -v yq &> /dev/null; then
25
+ if command -v yq &>/dev/null; then
54
26
  echo "✓ yq installed: $(yq --version)"
55
27
  else
56
28
  echo "✗ yq installation failed"
57
29
  exit 1
58
30
  fi
59
31
 
60
- # Install ripgrep (fast grep alternative)
61
- echo "📦 Installing ripgrep..."
62
- sudo apt-get install -y ripgrep
63
- if command -v rg &> /dev/null; then
64
- echo "✓ ripgrep installed: $(rg --version | head -n 1)"
65
- else
66
- echo "✗ ripgrep installation failed"
67
- exit 1
32
+ # Create fd symlink Debian installs the binary as 'fdfind'
33
+ if command -v fdfind &>/dev/null && ! command -v fd &>/dev/null; then
34
+ sudo ln -sf "$(which fdfind)" /usr/local/bin/fd
35
+ echo "✓ fd symlink created (fdfind → fd)"
68
36
  fi
69
37
 
70
- # Install fd (fast find alternative)
71
- echo "📦 Installing fd..."
72
- sudo apt-get install -y fd-find
73
- # Create symlink for 'fd' command (package installs as 'fdfind' on Debian)
74
- sudo ln -sf $(which fdfind) /usr/local/bin/fd
75
- if command -v fd &> /dev/null; then
76
- echo "✓ fd installed: $(fd --version)"
77
- else
78
- echo "✗ fd installation failed"
79
- exit 1
80
- fi
81
-
82
- # Install bat (better cat with syntax highlighting)
83
- echo "📦 Installing bat..."
84
- sudo apt-get install -y bat
85
- # Create symlink for 'bat' command (package installs as 'batcat' on Debian)
86
- sudo ln -sf $(which batcat) /usr/local/bin/bat
87
- if command -v bat &> /dev/null; then
88
- echo "✓ bat installed: $(bat --version)"
89
- else
90
- echo "✗ bat installation failed"
91
- exit 1
38
+ # Create bat symlink Debian installs the binary as 'batcat'
39
+ if command -v batcat &>/dev/null && ! command -v bat &>/dev/null; then
40
+ sudo ln -sf "$(which batcat)" /usr/local/bin/bat
41
+ echo "✓ bat symlink created (batcat bat)"
92
42
  fi
93
43
 
94
44
  # Configure bat
@@ -1,11 +1,5 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
- "features": {
4
- "./features/cross-distro-packages": {
5
- "apt": "mongodb-mongosh",
6
- "apk": "mongodb-tools"
7
- }
8
- },
9
3
  "customizations": {
10
4
  "vscode": {
11
5
  "extensions": ["mongodb.mongodb-vscode"]
@@ -0,0 +1,59 @@
1
+ #!/bin/bash
2
+ # MongoDB setup script - Install mongosh client
3
+
4
+ set -e
5
+
6
+ echo "📦 Installing mongosh client..."
7
+
8
+ # Source shared setup utilities
9
+ # shellcheck source=setup-utils.sh
10
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
11
+
12
+ if command -v apk >/dev/null 2>&1; then
13
+ # Alpine Linux — `mongodb-tools` does not include mongosh on Alpine.
14
+ # Install mongosh from the MongoDB community package (available on Alpine 3.17+).
15
+ apk add --no-cache mongodb-mongosh 2>/dev/null || {
16
+ echo "⚠️ mongosh package not found in Alpine repos; falling back to npm install"
17
+ apk add --no-cache nodejs npm
18
+ npm install -g mongosh
19
+ }
20
+ elif command -v apt-get >/dev/null 2>&1; then
21
+ # Debian/Ubuntu — install prerequisites first, then add the MongoDB repo.
22
+ # MongoDB doesn't publish a trixie/sid repo yet; fall back to bookworm.
23
+ CODENAME=$(. /etc/os-release && echo "${VERSION_CODENAME:-bookworm}")
24
+ case "$CODENAME" in
25
+ trixie | sid | testing) CODENAME="bookworm" ;;
26
+ esac
27
+
28
+ # Single lock acquisition: install prereqs, add repo, update, install mongosh.
29
+ # curl and gnupg must be present before add_apt_repo runs them.
30
+ acquire_apt_lock
31
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get update -qq
32
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get install -y -qq --no-install-recommends curl gnupg ca-certificates
33
+ release_apt_lock
34
+
35
+ add_apt_repo \
36
+ "https://www.mongodb.org/static/pgp/server-8.0.asc" \
37
+ "/usr/share/keyrings/mongodb-server.gpg" \
38
+ "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server.gpg ] https://repo.mongodb.org/apt/debian ${CODENAME}/mongodb-org/8.0 main" \
39
+ "/etc/apt/sources.list.d/mongodb-org.list"
40
+
41
+ acquire_apt_lock
42
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get update -qq
43
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get install -y -qq --no-install-recommends mongodb-mongosh
44
+ sudo apt-get clean
45
+ sudo rm -rf /var/lib/apt/lists/*
46
+ release_apt_lock
47
+ else
48
+ echo "⚠️ Unsupported package manager, skipping mongosh installation"
49
+ exit 0
50
+ fi
51
+
52
+ if command -v mongosh >/dev/null 2>&1; then
53
+ echo "✓ mongosh installed: $(mongosh --version)"
54
+ else
55
+ echo "✗ mongosh installation failed"
56
+ exit 1
57
+ fi
58
+
59
+ echo "✓ mongodb setup complete"
@@ -21,8 +21,9 @@ fi
21
21
  echo ""
22
22
  echo "2️⃣ Checking MySQL service..."
23
23
  MYSQL_READY=false
24
- for i in {1..15}; do
25
- if mysql -h mysql -P 3306 -u root -prootpassword -e "SELECT 1" &> /dev/null; then
24
+ for i in {1..90}; do
25
+ # MYSQL_PWD avoids interactive prompt; </dev/null prevents TTY queries.
26
+ if MYSQL_PWD=rootpassword mysql -h mysql -P 3306 -u root -e "SELECT 1" </dev/null &>/dev/null; then
26
27
  echo " ✅ MySQL service is ready"
27
28
  MYSQL_READY=true
28
29
  break
@@ -31,7 +32,7 @@ for i in {1..15}; do
31
32
  done
32
33
 
33
34
  if [ "$MYSQL_READY" = false ]; then
34
- echo " ❌ MySQL service not ready after 15 seconds"
35
+ echo " ❌ MySQL service not ready after 90 seconds"
35
36
  exit 1
36
37
  fi
37
38
 
@@ -1,5 +1,5 @@
1
1
  # NATS Configuration
2
- NATS_VERSION=latest
2
+ NATS_VERSION=2
3
3
  NATS_CLIENT_PORT=4222
4
4
  NATS_HTTP_PORT=8222
5
5
  NATS_CLUSTER_PORT=6222
@@ -39,7 +39,7 @@ cp .env.example .env
39
39
 
40
40
  ```bash
41
41
  # NATS Configuration
42
- NATS_VERSION=latest
42
+ NATS_VERSION=2
43
43
  NATS_CLIENT_PORT=4222
44
44
  NATS_HTTP_PORT=8222
45
45
  NATS_CLUSTER_PORT=6222
@@ -2,7 +2,7 @@ version: '3.8'
2
2
 
3
3
  services:
4
4
  nats:
5
- image: nats:${NATS_VERSION:-latest}-alpine
5
+ image: nats:${NATS_VERSION:-2}-alpine
6
6
  restart: unless-stopped
7
7
  command:
8
8
  - '--jetstream'