container-superposition 0.1.6 → 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 (143) hide show
  1. package/dist/scripts/init.js +7 -4
  2. package/dist/scripts/init.js.map +1 -1
  3. package/dist/tool/commands/adopt.d.ts.map +1 -1
  4. package/dist/tool/commands/adopt.js +1 -27
  5. package/dist/tool/commands/adopt.js.map +1 -1
  6. package/dist/tool/commands/doctor.d.ts +3 -0
  7. package/dist/tool/commands/doctor.d.ts.map +1 -1
  8. package/dist/tool/commands/doctor.js +932 -69
  9. package/dist/tool/commands/doctor.js.map +1 -1
  10. package/dist/tool/commands/explain.d.ts.map +1 -1
  11. package/dist/tool/commands/explain.js +9 -0
  12. package/dist/tool/commands/explain.js.map +1 -1
  13. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  14. package/dist/tool/questionnaire/composer.js +212 -11
  15. package/dist/tool/questionnaire/composer.js.map +1 -1
  16. package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
  17. package/dist/tool/schema/overlay-loader.js +1 -0
  18. package/dist/tool/schema/overlay-loader.js.map +1 -1
  19. package/dist/tool/schema/project-config.d.ts +1 -1
  20. package/dist/tool/schema/project-config.d.ts.map +1 -1
  21. package/dist/tool/schema/project-config.js +94 -25
  22. package/dist/tool/schema/project-config.js.map +1 -1
  23. package/dist/tool/schema/types.d.ts +85 -11
  24. package/dist/tool/schema/types.d.ts.map +1 -1
  25. package/dist/tool/utils/merge.d.ts.map +1 -1
  26. package/dist/tool/utils/merge.js +9 -0
  27. package/dist/tool/utils/merge.js.map +1 -1
  28. package/docs/creating-overlays.md +151 -2
  29. package/docs/overlay-imports.md +125 -102
  30. package/docs/overlays.md +49 -6
  31. package/docs/quick-reference.md +99 -0
  32. package/docs/specs/003-mkdocs2-overlay/spec.md +114 -0
  33. package/docs/specs/004-doctor-fix/spec.md +70 -0
  34. package/docs/specs/005-cuda-overlay/spec.md +101 -0
  35. package/docs/specs/006-rocm-overlay/spec.md +109 -0
  36. package/overlays/.shared/README.md +80 -21
  37. package/overlays/.shared/compose/common-healthchecks.md +60 -0
  38. package/overlays/.shared/vscode/recommended-extensions.json +15 -11
  39. package/overlays/alertmanager/setup.sh +4 -19
  40. package/overlays/alertmanager/verify.sh +8 -9
  41. package/overlays/all/README.md +43 -0
  42. package/overlays/all/devcontainer.patch.json +6 -0
  43. package/overlays/all/overlay.yml +14 -0
  44. package/overlays/amp/setup.sh +5 -0
  45. package/overlays/bun/setup.sh +10 -1
  46. package/overlays/bun/verify.sh +6 -1
  47. package/overlays/claude-code/setup.sh +5 -0
  48. package/overlays/cloudflared/setup.sh +9 -12
  49. package/overlays/codex/README.md +9 -6
  50. package/overlays/codex/devcontainer.patch.json +7 -1
  51. package/overlays/codex/setup.sh +5 -0
  52. package/overlays/codex/verify.sh +8 -0
  53. package/overlays/commitlint/setup.sh +5 -0
  54. package/overlays/cuda/README.md +179 -0
  55. package/overlays/cuda/devcontainer.patch.json +7 -0
  56. package/overlays/cuda/overlay.yml +17 -0
  57. package/overlays/cuda/setup.sh +32 -0
  58. package/overlays/cuda/verify.sh +38 -0
  59. package/overlays/devcontainer-cli/README.md +50 -0
  60. package/overlays/devcontainer-cli/devcontainer.patch.json +13 -0
  61. package/overlays/devcontainer-cli/overlay.yml +16 -0
  62. package/overlays/devcontainer-cli/setup.sh +14 -0
  63. package/overlays/direnv/devcontainer.patch.json +6 -0
  64. package/overlays/direnv/setup.sh +7 -6
  65. package/overlays/dotnet/setup.sh +14 -7
  66. package/overlays/duckdb/devcontainer.patch.json +1 -2
  67. package/overlays/gcloud/devcontainer.patch.json +0 -6
  68. package/overlays/gcloud/setup.sh +51 -0
  69. package/overlays/gemini-cli/setup.sh +5 -0
  70. package/overlays/git-helpers/devcontainer.patch.json +2 -1
  71. package/overlays/go/setup.sh +15 -14
  72. package/overlays/jaeger/overlay.yml +2 -0
  73. package/overlays/just/setup.sh +5 -17
  74. package/overlays/keycloak/docker-compose.yml +6 -4
  75. package/overlays/keycloak/verify.sh +4 -3
  76. package/overlays/kind/devcontainer.patch.json +1 -2
  77. package/overlays/kind/setup.sh +8 -17
  78. package/overlays/minio/setup.sh +10 -18
  79. package/overlays/mkdocs/overlay.yml +2 -1
  80. package/overlays/mkdocs2/README.md +135 -0
  81. package/overlays/mkdocs2/devcontainer.patch.json +19 -0
  82. package/overlays/mkdocs2/overlay.yml +17 -0
  83. package/overlays/mkdocs2/setup.sh +67 -0
  84. package/overlays/mkdocs2/verify.sh +35 -0
  85. package/overlays/modern-cli-tools/devcontainer.patch.json +7 -1
  86. package/overlays/modern-cli-tools/setup.sh +21 -71
  87. package/overlays/mongodb/devcontainer.patch.json +0 -6
  88. package/overlays/mongodb/setup.sh +59 -0
  89. package/overlays/mysql/verify.sh +4 -3
  90. package/overlays/nats/.env.example +1 -1
  91. package/overlays/nats/README.md +1 -1
  92. package/overlays/nats/docker-compose.yml +1 -1
  93. package/overlays/ngrok/setup.sh +9 -6
  94. package/overlays/nodejs/setup.sh +5 -0
  95. package/overlays/openapi-tools/devcontainer.patch.json +1 -2
  96. package/overlays/openapi-tools/setup.sh +9 -8
  97. package/overlays/opencode/setup.sh +5 -0
  98. package/overlays/otel-collector/overlay.yml +2 -0
  99. package/overlays/otel-collector/setup.sh +3 -16
  100. package/overlays/otel-demo-nodejs/verify.sh +8 -9
  101. package/overlays/otel-demo-python/verify.sh +16 -10
  102. package/overlays/pandoc/README.md +22 -15
  103. package/overlays/pandoc/devcontainer.patch.json +6 -2
  104. package/overlays/pandoc/setup.sh +217 -18
  105. package/overlays/pandoc/verify.sh +16 -4
  106. package/overlays/playwright/devcontainer.patch.json +3 -1
  107. package/overlays/playwright/setup.sh +37 -0
  108. package/overlays/postgres/docker-compose.yml +6 -0
  109. package/overlays/powershell/setup.sh +49 -13
  110. package/overlays/pre-commit/setup.sh +12 -3
  111. package/overlays/prometheus/overlay.yml +2 -0
  112. package/overlays/promtail/verify.sh +16 -10
  113. package/overlays/pulumi/devcontainer.patch.json +1 -1
  114. package/overlays/python/setup.sh +28 -9
  115. package/overlays/python/verify.sh +4 -2
  116. package/overlays/redpanda/docker-compose.yml +3 -5
  117. package/overlays/rocm/README.md +227 -0
  118. package/overlays/rocm/devcontainer.patch.json +4 -0
  119. package/overlays/rocm/overlay.yml +17 -0
  120. package/overlays/rocm/setup.sh +45 -0
  121. package/overlays/rocm/verify.sh +47 -0
  122. package/overlays/rust/setup.sh +11 -18
  123. package/overlays/spec-kit/setup.sh +7 -3
  124. package/overlays/sqlite/setup.sh +14 -14
  125. package/overlays/sqlserver/docker-compose.yml +3 -3
  126. package/overlays/sqlserver/verify.sh +22 -5
  127. package/overlays/tempo/verify.sh +16 -10
  128. package/overlays/tilt/devcontainer.patch.json +1 -2
  129. package/overlays/tilt/setup.sh +14 -4
  130. package/overlays/windsurf-cli/setup.sh +27 -4
  131. package/overlays/windsurf-cli/verify.sh +13 -3
  132. package/package.json +2 -1
  133. package/templates/scripts/setup-utils.sh +228 -0
  134. package/tool/schema/config.schema.json +110 -8
  135. package/tool/schema/overlay-manifest.schema.json +5 -0
  136. package/overlays/.shared/compose/common-healthchecks.yml +0 -38
  137. /package/overlays/otel-demo-nodejs/{Dockerfile-otel-demo-nodejs → Dockerfile} +0 -0
  138. /package/overlays/otel-demo-nodejs/{package-otel-demo-nodejs.json → package.json} +0 -0
  139. /package/overlays/otel-demo-nodejs/{server-otel-demo-nodejs.js → server.js} +0 -0
  140. /package/overlays/otel-demo-nodejs/{tracing-otel-demo-nodejs.js → tracing.js} +0 -0
  141. /package/overlays/otel-demo-python/{Dockerfile-otel-demo-python → Dockerfile} +0 -0
  142. /package/overlays/otel-demo-python/{app-otel-demo-python.py → app.py} +0 -0
  143. /package/overlays/otel-demo-python/{requirements-otel-demo-python.txt → requirements.txt} +0 -0
@@ -0,0 +1,51 @@
1
+ #!/bin/bash
2
+ # Google Cloud CLI setup script
3
+
4
+ set -e
5
+
6
+ echo "☁️ Setting up Google Cloud CLI..."
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 — no official gcloud apt repo; install via tarball
14
+ apk add --no-cache python3 curl
15
+ curl -sSL https://sdk.cloud.google.com | CLOUDSDK_CORE_DISABLE_PROMPTS=1 bash -s -- --disable-prompts --install-dir=/usr/local
16
+ ln -sf /usr/local/google-cloud-sdk/bin/gcloud /usr/local/bin/gcloud
17
+ ln -sf /usr/local/google-cloud-sdk/bin/gsutil /usr/local/bin/gsutil
18
+ elif command -v apt-get >/dev/null 2>&1; then
19
+ # Debian/Ubuntu — add Google Cloud apt repo using modern signed-by method
20
+ # The Google Cloud key is already in binary (non-armored) format — write directly.
21
+ sudo mkdir -p /usr/share/keyrings /etc/apt/sources.list.d
22
+ curl -fsSL "https://packages.cloud.google.com/apt/doc/apt-key.gpg" \
23
+ | sudo tee /usr/share/keyrings/cloud.google.gpg >/dev/null
24
+ echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" \
25
+ | sudo tee /etc/apt/sources.list.d/google-cloud-sdk.list >/dev/null
26
+
27
+ # Single lock acquisition: install prereqs + add repo + install gcloud in one pass
28
+ acquire_apt_lock
29
+ # Pass env vars explicitly — sudo strips them by default.
30
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get update -qq
31
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get install -y -qq --no-install-recommends apt-transport-https ca-certificates gnupg curl
32
+ # apt index already fresh — install gcloud packages without a second apt-get update
33
+ sudo DEBIAN_FRONTEND=noninteractive TERM=dumb apt-get install -y -qq --no-install-recommends \
34
+ google-cloud-cli \
35
+ google-cloud-cli-gke-gcloud-auth-plugin
36
+ sudo apt-get clean
37
+ sudo rm -rf /var/lib/apt/lists/*
38
+ release_apt_lock
39
+ else
40
+ echo "⚠️ Unsupported package manager, skipping gcloud installation"
41
+ exit 0
42
+ fi
43
+
44
+ if command -v gcloud >/dev/null 2>&1; then
45
+ echo "✓ gcloud installed: $(gcloud --version | head -1)"
46
+ else
47
+ echo "✗ gcloud installation failed"
48
+ exit 1
49
+ fi
50
+
51
+ echo "✓ gcloud setup complete"
@@ -3,6 +3,11 @@
3
3
 
4
4
  set -e
5
5
 
6
+ # Source shared setup utilities (provides load_nvm)
7
+ # shellcheck source=setup-utils.sh
8
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
9
+ load_nvm
10
+
6
11
  echo "📦 Installing Google Gemini CLI..."
7
12
 
8
13
  # Install @google/gemini-cli globally
@@ -6,7 +6,8 @@
6
6
  "version": "os-provided"
7
7
  },
8
8
  "ghcr.io/devcontainers/features/git-lfs:1": {
9
- "version": "latest"
9
+ "version": "latest",
10
+ "autoPull": false
10
11
  },
11
12
  "ghcr.io/devcontainers/features/github-cli:1": {
12
13
  "version": "latest"
@@ -3,25 +3,26 @@
3
3
 
4
4
  set -e
5
5
 
6
- echo "🔧 Setting up Go development environment..."
6
+ # Source shared setup utilities
7
+ # shellcheck source=setup-utils.sh
8
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
7
9
 
8
- # Install common Go tools
10
+ echo "🔧 Setting up Go development environment..."
9
11
  echo "📦 Installing Go development tools..."
10
12
 
11
- # gopls (Language Server)
12
- go install golang.org/x/tools/gopls@latest || echo "⚠️ gopls installation failed"
13
-
14
- # delve (Debugger)
15
- go install github.com/go-delve/delve/cmd/dlv@latest || echo "⚠️ delve installation failed"
13
+ run_spinner "gopls (language server)" go install golang.org/x/tools/gopls@latest
14
+ run_spinner "delve (debugger)" go install github.com/go-delve/delve/cmd/dlv@latest
16
15
 
17
- # golangci-lint (Linter) - install via go install for security
18
- go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest || echo "⚠️ golangci-lint installation failed"
19
-
20
- # gofumpt (Formatter)
21
- go install mvdan.cc/gofumpt@latest || echo "⚠️ gofumpt installation failed"
16
+ # golangci-lint use official installer to avoid gold linker issues on arm64
17
+ if ! command -v golangci-lint &>/dev/null; then
18
+ run_spinner "golangci-lint" \
19
+ bash -c 'curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "$(go env GOPATH)/bin"'
20
+ else
21
+ echo " ℹ️ golangci-lint already installed: $(golangci-lint version --short 2>/dev/null || true)"
22
+ fi
22
23
 
23
- # staticcheck (Static analyzer)
24
- go install honnef.co/go/tools/cmd/staticcheck@latest || echo "⚠️ staticcheck installation failed"
24
+ run_spinner "gofumpt (formatter)" go install mvdan.cc/gofumpt@latest
25
+ run_spinner "staticcheck (analyzer)" go install honnef.co/go/tools/cmd/staticcheck@latest
25
26
 
26
27
  # Install project dependencies if go.mod exists
27
28
  if [ -f "go.mod" ]; then
@@ -30,3 +30,5 @@ ports:
30
30
  description: Jaeger HTTP receiver
31
31
  onAutoForward: ignore
32
32
  order: 1
33
+ imports:
34
+ - .shared/otel/instrumentation.env
@@ -9,31 +9,19 @@ echo "⚡ Setting up just task runner..."
9
9
  JUST_VERSION="1.25.2"
10
10
  ARCH=$(uname -m)
11
11
 
12
- # SHA256 checksums for just v1.25.2
13
- if [ "$ARCH" = "x86_64" ]; then
14
- ARCH="x86_64"
15
- CHECKSUM="6804798c3744fd1ce563840ee9fe14ae53c74b3cc7b8536da3f87751d7f85501"
16
- elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
12
+ if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
17
13
  ARCH="aarch64"
18
- CHECKSUM="f287a95846131ce8de65181b0b1ec0a0b7db4f6f8d393b3b548f70fcb5a4b0ee"
14
+ elif [ "$ARCH" = "x86_64" ]; then
15
+ ARCH="x86_64"
19
16
  else
20
- echo "⚠️ Unsupported architecture: $ARCH"
17
+ echo "⚠️ Unsupported architecture: $ARCH, falling back to x86_64"
21
18
  ARCH="x86_64"
22
- CHECKSUM="6804798c3744fd1ce563840ee9fe14ae53c74b3cc7b8536da3f87751d7f85501"
23
19
  fi
24
20
 
25
21
  echo "📦 Downloading just v${JUST_VERSION} for ${ARCH}..."
26
- curl -L "https://github.com/casey/just/releases/download/${JUST_VERSION}/just-${JUST_VERSION}-${ARCH}-unknown-linux-musl.tar.gz" \
22
+ curl -fsSL "https://github.com/casey/just/releases/download/${JUST_VERSION}/just-${JUST_VERSION}-${ARCH}-unknown-linux-musl.tar.gz" \
27
23
  -o /tmp/just.tar.gz
28
24
 
29
- # Verify checksum
30
- echo "🔐 Verifying checksum..."
31
- echo "${CHECKSUM} /tmp/just.tar.gz" | sha256sum -c - || {
32
- echo "✗ Checksum verification failed"
33
- rm /tmp/just.tar.gz
34
- exit 1
35
- }
36
-
37
25
  # Extract and install
38
26
  tar -xzf /tmp/just.tar.gz -C /tmp
39
27
  sudo mv /tmp/just /usr/local/bin/
@@ -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
  }