From 5933a6a862efc915237292e0b5e1139a67662569 Mon Sep 17 00:00:00 2001 From: S Smith Date: Mon, 6 Jul 2026 06:43:28 +0000 Subject: [PATCH] Add MCP plugins --- roles/devcontainer_sync/defaults/main.yml | 37 ++++- .../tasks/sync_devcontainer.yml | 6 + .../.devcontainer/devcontainer.json | 23 ++- tests/cloud-example/.devcontainer/install.sh | 14 +- tests/golden_output | 146 ++++++++++++++---- .../.devcontainer/devcontainer.json | 23 ++- tests/node-example/.devcontainer/install.sh | 16 +- .../.devcontainer/devcontainer.json | 21 ++- tests/python-example/.devcontainer/install.sh | 14 +- .../.devcontainer/devcontainer.json | 21 ++- tests/rust-example/.devcontainer/install.sh | 14 +- 11 files changed, 269 insertions(+), 66 deletions(-) diff --git a/roles/devcontainer_sync/defaults/main.yml b/roles/devcontainer_sync/defaults/main.yml index f115286..62d8eb9 100644 --- a/roles/devcontainer_sync/defaults/main.yml +++ b/roles/devcontainer_sync/defaults/main.yml @@ -28,6 +28,7 @@ devcontainer_defaults: container_env: {} remote_env: {} features: {} + mcp: {} vscode_extensions: - EditorConfig.EditorConfig - redhat.vscode-yaml @@ -38,12 +39,15 @@ devcontainer_defaults: mounts: [] run_args: [] plugins: - - codex - claude - opencode + - smarttree + - contextmode devcontainer_plugins: opencode: + vscode_extensions: + - ankurmathur.opencode-provider-bridge install_steps: - curl -fsSL https://opencode.ai/install | bash post_create_commands: @@ -52,10 +56,31 @@ devcontainer_plugins: - ln -sfn /opt/opencode-config $HOME/.config/opencode mounts: - source=opencode-config,target=/opt/opencode-config,type=volume + + smarttree: + install_steps: + - curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + mcp: + servers: + smart-tree: + type: stdio + command: st + args: + - "--mcp" + + contextmode: + install_steps: + - curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + - bash -c "source ~/.nvm/nvm.sh && nvm install 24" + - npm install context-mode + - mkdir -p "${containerWorkspaceFolder}"/.github/hooks + - wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + mcp: + servers: + context-mode: + command: "context-mode" claude: - vscode_extensions: - - Anthropic.claude-code install_steps: - curl -fsSL https://claude.ai/install.sh | bash post_create_commands: @@ -72,8 +97,6 @@ devcontainer_plugins: - source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume codex: - vscode_extensions: - - openai.chatgpt install_steps: - curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh post_create_commands: @@ -168,7 +191,9 @@ devcontainer_plugins: typescript: install_steps: - sudo apt update && sudo apt install -y npm --no-install-recommends - - npm install || true + - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash + - bash -c "source ~/.nvm/nvm.sh && nvm install 24" + - if [ -f "${containerWorkspaceFolder}/package.json" ]; then npm install; fi github: install_steps: diff --git a/roles/devcontainer_sync/tasks/sync_devcontainer.yml b/roles/devcontainer_sync/tasks/sync_devcontainer.yml index 4355b4a..d5bae15 100644 --- a/roles/devcontainer_sync/tasks/sync_devcontainer.yml +++ b/roles/devcontainer_sync/tasks/sync_devcontainer.yml @@ -82,6 +82,7 @@ - devcontainer.container_env is mapping - devcontainer.remote_env is mapping - devcontainer.features is mapping + - devcontainer.mcp is mapping - devcontainer.vscode_settings is mapping - devcontainer.vscode_extensions is sequence - devcontainer.vscode_extensions is not string @@ -157,6 +158,11 @@ {'settings': devcontainer.vscode_settings} if devcontainer.vscode_settings else {} + ) + | combine( + {'mcp': devcontainer.mcp} + if devcontainer.mcp + else {} ), }, 'containerEnv': devcontainer.container_env, diff --git a/tests/cloud-example/.devcontainer/devcontainer.json b/tests/cloud-example/.devcontainer/devcontainer.json index 736d414..84887fc 100644 --- a/tests/cloud-example/.devcontainer/devcontainer.json +++ b/tests/cloud-example/.devcontainer/devcontainer.json @@ -12,10 +12,23 @@ "github.vscode-github-actions", "4ops.terraform", "redhat.vscode-yaml", - "openai.chatgpt", - "Anthropic.claude-code", + "ankurmathur.opencode-provider-bridge", "ms-kubernetes-tools.vscode-kubernetes-tools" - ] + ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + } } }, "features": { @@ -36,8 +49,6 @@ }, "image": "mcr.microsoft.com/devcontainers/base:resolute", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -45,5 +56,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "cloud-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/cloud-example/.devcontainer/install.sh b/tests/cloud-example/.devcontainer/install.sh index aef9618..072d07d 100755 --- a/tests/cloud-example/.devcontainer/install.sh +++ b/tests/cloud-example/.devcontainer/install.sh @@ -11,12 +11,22 @@ sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reco echo alias tf=terraform > ~/.bash_aliases -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh - curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + mkdir -p ~/.ssh printf 'Host *\n User ec2-user\n IdentityFile %s/.ssh/id_rsa\n StrictHostKeyChecking no\n' "${containerWorkspaceFolder}" > ~/.ssh/config diff --git a/tests/golden_output b/tests/golden_output index 8fbc4c2..7327449 100644 --- a/tests/golden_output +++ b/tests/golden_output @@ -71,10 +71,23 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ "github.vscode-github-actions", "4ops.terraform", "redhat.vscode-yaml", - "openai.chatgpt", - "Anthropic.claude-code", + "ankurmathur.opencode-provider-bridge", "ms-kubernetes-tools.vscode-kubernetes-tools" - ] + ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + } } }, "features": { @@ -95,8 +108,6 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ }, "image": "mcr.microsoft.com/devcontainers/base:resolute", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -104,7 +115,7 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "cloud-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -119,12 +130,22 @@ sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reco echo alias tf=terraform > ~/.bash_aliases -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh - curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + mkdir -p ~/.ssh printf 'Host *\n User ec2-user\n IdentityFile %s/.ssh/id_rsa\n StrictHostKeyChecking no\n' "${containerWorkspaceFolder}" > ~/.ssh/config @@ -154,15 +175,26 @@ trim_trailing_whitespace = false "timonwong.shellcheck", "usernamehw.errorlens", "github.vscode-github-actions", - "openai.chatgpt", - "Anthropic.claude-code" - ] + "ankurmathur.opencode-provider-bridge" + ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + } } }, "image": "mcr.microsoft.com/devcontainers/typescript-node:24", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -171,7 +203,7 @@ trim_trailing_whitespace = false "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "node-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -186,13 +218,25 @@ sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reco sudo apt update && sudo apt install -y npm --no-install-recommends -npm install || true +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh +if [ -f "${containerWorkspaceFolder}/package.json" ]; then npm install; fi curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash + +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json # Managed by devcontainer-sync. root = true @@ -280,9 +324,22 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ "github.vscode-github-actions", "KevinRose.vsc-python-indent", "mikestead.dotenv", - "openai.chatgpt", - "Anthropic.claude-code" + "ankurmathur.opencode-provider-bridge" ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + }, "settings": { "python.analysis.autoFormatStrings": true, "python.defaultInterpreterPath": "/usr/local/python/current/bin/python", @@ -310,8 +367,6 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ }, "image": "mcr.microsoft.com/devcontainers/python:3.10", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -321,7 +376,7 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "python-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -341,12 +396,22 @@ if [ -f "${containerWorkspaceFolder}/requirements.txt" ] || [ -f "${containerWor pip install "$@" fi -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh - curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + mkdir -p ~/.ssh printf 'Host *\n User ec2-user\n IdentityFile %s/.ssh/id_rsa\n StrictHostKeyChecking no\n' "${containerWorkspaceFolder}" > ~/.ssh/config @@ -379,9 +444,22 @@ trim_trailing_whitespace = false "timonwong.shellcheck", "usernamehw.errorlens", "github.vscode-github-actions", - "openai.chatgpt", - "Anthropic.claude-code" + "ankurmathur.opencode-provider-bridge" ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + }, "settings": { "rust-analyzer.runnables.test.overrideCommand": [ "cargo", @@ -401,8 +479,6 @@ trim_trailing_whitespace = false }, "image": "mcr.microsoft.com/devcontainers/rust:2-1", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -412,7 +488,7 @@ trim_trailing_whitespace = false "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "rust-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -429,12 +505,22 @@ sudo apt install -y python-is-python3 cargo install --locked cargo-nextest -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh - curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + sudo apt update sudo apt install -y --no-install-recommends default-jre-headless diff --git a/tests/node-example/.devcontainer/devcontainer.json b/tests/node-example/.devcontainer/devcontainer.json index f96ec0b..34bc680 100644 --- a/tests/node-example/.devcontainer/devcontainer.json +++ b/tests/node-example/.devcontainer/devcontainer.json @@ -11,15 +11,26 @@ "timonwong.shellcheck", "usernamehw.errorlens", "github.vscode-github-actions", - "openai.chatgpt", - "Anthropic.claude-code" - ] + "ankurmathur.opencode-provider-bridge" + ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + } } }, "image": "mcr.microsoft.com/devcontainers/typescript-node:24", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -28,5 +39,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "node-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/node-example/.devcontainer/install.sh b/tests/node-example/.devcontainer/install.sh index d1bb3f8..0f923d3 100755 --- a/tests/node-example/.devcontainer/install.sh +++ b/tests/node-example/.devcontainer/install.sh @@ -11,10 +11,22 @@ sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reco sudo apt update && sudo apt install -y npm --no-install-recommends -npm install || true +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh +if [ -f "${containerWorkspaceFolder}/package.json" ]; then npm install; fi curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash + +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json diff --git a/tests/python-example/.devcontainer/devcontainer.json b/tests/python-example/.devcontainer/devcontainer.json index 4ac470a..8ebbc29 100644 --- a/tests/python-example/.devcontainer/devcontainer.json +++ b/tests/python-example/.devcontainer/devcontainer.json @@ -15,9 +15,22 @@ "github.vscode-github-actions", "KevinRose.vsc-python-indent", "mikestead.dotenv", - "openai.chatgpt", - "Anthropic.claude-code" + "ankurmathur.opencode-provider-bridge" ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + }, "settings": { "python.analysis.autoFormatStrings": true, "python.defaultInterpreterPath": "/usr/local/python/current/bin/python", @@ -45,8 +58,6 @@ }, "image": "mcr.microsoft.com/devcontainers/python:3.10", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -56,5 +67,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "python-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/python-example/.devcontainer/install.sh b/tests/python-example/.devcontainer/install.sh index 2c3dfde..2d56e09 100755 --- a/tests/python-example/.devcontainer/install.sh +++ b/tests/python-example/.devcontainer/install.sh @@ -16,12 +16,22 @@ if [ -f "${containerWorkspaceFolder}/requirements.txt" ] || [ -f "${containerWor pip install "$@" fi -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh - curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + mkdir -p ~/.ssh printf 'Host *\n User ec2-user\n IdentityFile %s/.ssh/id_rsa\n StrictHostKeyChecking no\n' "${containerWorkspaceFolder}" > ~/.ssh/config diff --git a/tests/rust-example/.devcontainer/devcontainer.json b/tests/rust-example/.devcontainer/devcontainer.json index bcd68a4..73df859 100644 --- a/tests/rust-example/.devcontainer/devcontainer.json +++ b/tests/rust-example/.devcontainer/devcontainer.json @@ -10,9 +10,22 @@ "timonwong.shellcheck", "usernamehw.errorlens", "github.vscode-github-actions", - "openai.chatgpt", - "Anthropic.claude-code" + "ankurmathur.opencode-provider-bridge" ], + "mcp": { + "servers": { + "context-mode": { + "command": "context-mode" + }, + "smart-tree": { + "args": [ + "--mcp" + ], + "command": "st", + "type": "stdio" + } + } + }, "settings": { "rust-analyzer.runnables.test.overrideCommand": [ "cargo", @@ -32,8 +45,6 @@ }, "image": "mcr.microsoft.com/devcontainers/rust:2-1", "mounts": [ - "source=codex-config,target=/opt/.codex,type=volume", - "source=agents-config,target=/opt/.agents,type=volume", "source=claude-code-config,target=/opt/claude-code-config,type=volume", "source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume", "source=opencode-config,target=/opt/opencode-config,type=volume", @@ -43,5 +54,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "rust-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo chown $USER:$USER /opt/opencode-config && mkdir -p $HOME/.config && ln -sfn /opt/opencode-config $HOME/.config/opencode && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/rust-example/.devcontainer/install.sh b/tests/rust-example/.devcontainer/install.sh index 2156642..d493d28 100755 --- a/tests/rust-example/.devcontainer/install.sh +++ b/tests/rust-example/.devcontainer/install.sh @@ -13,12 +13,22 @@ sudo apt install -y python-is-python3 cargo install --locked cargo-nextest -curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh - curl -fsSL https://claude.ai/install.sh | bash curl -fsSL https://opencode.ai/install | bash +curl -sSL https://raw.githubusercontent.com/8b-is/smart-tree/main/scripts/install.sh | bash + +curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name')/install.sh" | bash + +bash -c "source ~/.nvm/nvm.sh && nvm install 24" + +npm install context-mode + +mkdir -p "${containerWorkspaceFolder}"/.github/hooks + +wget https://raw.githubusercontent.com/mksglu/context-mode/refs/heads/main/configs/vscode-copilot/hooks.json -O .github/hooks/context-mode.json + sudo apt update sudo apt install -y --no-install-recommends default-jre-headless