Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 0 additions & 32 deletions .devcontainer.json

This file was deleted.

50 changes: 50 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"name": "Duplocloud Devcontainers",
"image": "mcr.microsoft.com/vscode/devcontainers/python:3.11",
"features": {
"ghcr.io/devcontainers/features/node:1": {},
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {
"moby": false
},
"./features/onepassword-cli": {
"autoSsh": true,
"sshSecretNames": "${localEnv:OP_SSH_SECRET}",
"vault": "Employee",
"account": "duplocloudinc.1password.com"
},
"./features/ai-codex": {}
},
"postCreateCommand": "bash .devcontainer/post-create.sh",
"runArgs": [
"--env-file=${localWorkspaceFolder}/.env"
],
"containerEnv": {
"WORKSPACE_FOLDER": "${containerWorkspaceFolder}",
"CLOUDSDK_PYTHON": "/usr/local/bin/python",
"KUBECONFIG": "${containerWorkspaceFolder}/config/kubeconfig.yaml",
"XDG_CONFIG_HOME": "${containerWorkspaceFolder}/config",
"CONF_DIR": "${containerWorkspaceFolder}/config",
"CODEX_HOME": "${containerWorkspaceFolder}/.codex",
"AWS_CONFIG_FILE": "${containerWorkspaceFolder}/config/aws",
"AWS_DEFAULT_REGION": "us-west-2",
"AWS_REGION": "us-west-2",
"CLOUDSDK_CONFIG": "${containerWorkspaceFolder}/config/gcloud",
"GOOGLE_APPLICATION_CREDENTIALS": "${containerWorkspaceFolder}/config/gcloud/application_default_credentials.json",
"DUPLO_CONFIG": "${containerWorkspaceFolder}/config/duplo.yaml",
"GIT_USERNAME": "${localEnv:GIT_USERNAME}",
"GIT_EMAIL": "${localEnv:GIT_EMAIL}",
"EDITOR": "code --wait"
},
"customizations": {
"vscode": {
"extensions": [
"redhat.vscode-yaml",
"mads-hartmann.bash-ide-vscode",
"github.vscode-github-actions",
"GitHub.copilot-chat",
"GitHub.vscode-pull-request-github"
],
"settings": {}
}
}
}
7 changes: 7 additions & 0 deletions .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail

echo "Installing devcontainers CLI..."
npm install -g @devcontainers/cli

echo "✓ Post-create setup complete"
File renamed without changes.
23 changes: 19 additions & 4 deletions .github/workflows/test.yaml → .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,25 @@ jobs:
fail-fast: false
matrix:
features:
- ai
- ai-claude
- ai-codex
- ai-gemini
- aws-cli
- onepassword-cli
- gcloud-cli
- direnv
- duploctl
- gcloud-cli
- git
- kubernetes
- onepassword-cli
- openvpn
- terraform
baseImage:
- debian:latest
- ubuntu:latest
- mcr.microsoft.com/devcontainers/base:ubuntu
- mcr.microsoft.com/devcontainers/python:3
- nodejs/devcontainer:nightly
steps:
- uses: actions/checkout@v6

Expand All @@ -38,11 +47,17 @@ jobs:
fail-fast: false
matrix:
features:
- ai-claude
- ai-codex
- ai-gemini
- aws-cli
- onepassword-cli
- duploctl
- gcloud-cli
- terraform
- git
- kubernetes
- onepassword-cli
- openvpn
- terraform
steps:
- uses: actions/checkout@v6

Expand Down
18 changes: 18 additions & 0 deletions .vscode/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"inputs": [
{
"type": "promptString",
"description": "The API Key for JinaAI",
"id": "jina_api_key",
"password": true
}
],
"servers": {
"jina": {
"url": "https://mcp.jina.ai/v1",
"headers": {
"Authorization": "Bearer ${input:jina_api_key}"
}
}
}
}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,4 @@ We recommend this is as a sane starting point: `mcr.microsoft.com/vscode/devcont
- [Available Dev Container Templates](https://containers.dev/templates)
- [Available Dev Container Features](https://containers.dev/features)
- [Schema for Features json](https://containers.dev/implementors/features/)
- [Node.js Devcontainer](https://github.com/nodejs/devcontainer)
5 changes: 3 additions & 2 deletions src/ai-claude/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "ai-claude",
"version": "1.0.0",
"version": "1.0.1",
"name": "Claude Code AI",
"description": "Anthropic's Claude Code CLI with VS Code integration and skills support",
"options": {
Expand All @@ -19,5 +19,6 @@
},
"dependsOn": {
"ghcr.io/duplocloud/devcontainers/ai:latest": {}
}
},
"onCreateCommand": "bash /usr/local/share/ai-claude-on-create.sh"
}
4 changes: 2 additions & 2 deletions src/ai-claude/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ echo "Installing @anthropic-ai/claude-code..."
npm install -g @anthropic-ai/claude-code

# Verify installation
if command -v claude-code &> /dev/null; then
if command -v claude &> /dev/null; then
echo "✓ Claude Code CLI installed successfully"
claude-code --version || true
claude --version || true
else
echo "⚠ Claude Code CLI installation could not be verified"
fi
Expand Down
4 changes: 2 additions & 2 deletions src/ai-claude/on-create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ for SKILL in "${SKILL_ARRAY[@]}"; do
echo "Installing skill: ${SKILL}"

if duplo-skills --dir "${SKILLS_DIR}" --skill "${SKILL}"; then
((INSTALLED_COUNT++))
((INSTALLED_COUNT+=1))
else
echo "⚠ Failed to install skill: ${SKILL}"
((FAILED_COUNT++))
((FAILED_COUNT+=1))
fi
done

Expand Down
5 changes: 3 additions & 2 deletions src/ai-codex/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "ai-codex",
"version": "1.0.0",
"version": "1.0.1",
"name": "OpenAI Codex AI",
"description": "OpenAI's Codex CLI with VS Code integration and skills support",
"options": {
Expand All @@ -19,5 +19,6 @@
},
"dependsOn": {
"ghcr.io/duplocloud/devcontainers/ai:latest": {}
}
},
"onCreateCommand": "bash /usr/local/share/ai-codex-on-create.sh"
}
4 changes: 2 additions & 2 deletions src/ai-codex/on-create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ for SKILL in "${SKILL_ARRAY[@]}"; do
echo "Installing skill: ${SKILL}"

if duplo-skills --dir "${SKILLS_DIR}" --skill "${SKILL}"; then
((INSTALLED_COUNT++))
((INSTALLED_COUNT+=1))
else
echo "⚠ Failed to install skill: ${SKILL}"
((FAILED_COUNT++))
((FAILED_COUNT+=1))
fi
done

Expand Down
5 changes: 3 additions & 2 deletions src/ai-gemini/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "ai-gemini",
"version": "1.0.0",
"version": "1.0.1",
"name": "Gemini CLI AI",
"description": "Google's Gemini CLI with VS Code integration and skills support",
"options": {
Expand All @@ -19,5 +19,6 @@
},
"dependsOn": {
"ghcr.io/duplocloud/devcontainers/ai:latest": {}
}
},
"onCreateCommand": "bash /usr/local/share/ai-gemini-on-create.sh"
}
4 changes: 2 additions & 2 deletions src/ai-gemini/on-create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ for SKILL in "${SKILL_ARRAY[@]}"; do
echo "Installing skill: ${SKILL}"

if duplo-skills --dir "${SKILLS_DIR}" --skill "${SKILL}"; then
((INSTALLED_COUNT++))
((INSTALLED_COUNT+=1))
else
echo "⚠ Failed to install skill: ${SKILL}"
((FAILED_COUNT++))
((FAILED_COUNT+=1))
fi
done

Expand Down
2 changes: 1 addition & 1 deletion src/ai/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "ai",
"version": "1.0.1",
"version": "1.0.2",
"name": "AI Base",
"description": "Base dependencies for AI CLI tools including Node.js and skills downloader",
"options": {},
Expand Down
6 changes: 6 additions & 0 deletions src/ai/scripts/install-nodejs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,11 @@ load_nvm() {
for nvm_sh in "${candidates[@]}"; do
if [[ -s "$nvm_sh" ]]; then
echo "Found nvm at $nvm_sh, loading it..."
# Temporarily disable unbound variable check for nvm
# shellcheck disable=SC1090,SC1091
set +u
source "$nvm_sh"
set -u
if command -v nvm >/dev/null 2>&1; then
return 0
fi
Expand All @@ -60,8 +63,11 @@ install_with_nvm() {
fi

echo "Installing Node.js LTS via nvm..."
# Temporarily disable unbound variable check for nvm commands
set +u
nvm install --lts
nvm use --lts
set -u

ensure_min_node
}
Expand Down
2 changes: 1 addition & 1 deletion src/duploctl/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "duploctl",
"version": "1.0.4",
"version": "1.0.5",
"name": "duploctl",
"description": "Installs duploctl CLI via pip (if available) or prebuilt binary.",
"options": {
Expand Down
2 changes: 1 addition & 1 deletion src/gcloud-cli/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Google Cloud CLI",
"id": "gcloud-cli",
"version": "1.0.3",
"version": "1.0.4",
"description": "Installs Google Cloud CLI with multi-architecture support",
"documentationURL": "https://github.com/duplocloud-internal/customer-workspace/tree/main/features/gcloud-cli",
"options": {},
Expand Down
Loading
Loading