Skip to content
Draft
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
1 change: 1 addition & 0 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ jobs:
- name: Validate features
uses: devcontainers/action@v1
with:
base-path-to-features: "./src"
validate-only: "true"
2 changes: 1 addition & 1 deletion src/ai-clis/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# AI CLI Tools (ai-clis)

Installs AI coding assistant CLIs and agentic development tools: Claude Code, Gemini CLI, OpenAI Codex, GitHub Copilot, OpenCode, CodeRabbit, Beads (with Dolt), and Specify CLI.
Installs AI coding assistant CLIs and agentic development tools: Claude Code, Claude Agent ACP, Gemini CLI, OpenAI Codex, GitHub Copilot, OpenCode, CodeRabbit, Beads (with Dolt), and Specify CLI.

## Options

Expand Down
4 changes: 2 additions & 2 deletions src/ai-clis/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"id": "ai-clis",
"version": "2.0.3",
"version": "2.1.0",
"name": "AI CLI Tools",
"documentationURL": "https://github.com/get2knowio/devcontainer-features/tree/main/src/ai-clis",
"description": "Installs AI coding assistant CLIs and agentic development tools: Claude Code, Gemini CLI, OpenAI Codex, GitHub Copilot, OpenCode, CodeRabbit, Beads (with Dolt), and Specify CLI.",
"description": "Installs AI coding assistant CLIs and agentic development tools: Claude Code, Claude Agent ACP, Gemini CLI, OpenAI Codex, GitHub Copilot, OpenCode, CodeRabbit, Beads (with Dolt), and Specify CLI.",
"options": {
"install": {
"type": "string",
Expand Down
44 changes: 27 additions & 17 deletions src/ai-clis/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ echo "Installing AI CLI tools..."

# Step 1: All tools enabled by default
CLAUDECODE="true"
CLAUDEAGENTACP="true"
GEMINICLI="true"
CODEX="true"
COPILOT="true"
Expand All @@ -16,6 +17,7 @@ SPECIFYCLI="true"
# Step 2: If install is set, whitelist mode
if [ -n "${INSTALL}" ]; then
CLAUDECODE="false"
CLAUDEAGENTACP="false"
GEMINICLI="false"
CODEX="false"
COPILOT="false"
Expand All @@ -28,14 +30,15 @@ if [ -n "${INSTALL}" ]; then
for item in "${SELECTED[@]}"; do
item="$(echo "$item" | xargs)"
case "$item" in
claudeCode) CLAUDECODE="true" ;;
geminiCli) GEMINICLI="true" ;;
codex) CODEX="true" ;;
copilot) COPILOT="true" ;;
openCode) OPENCODE="true" ;;
codeRabbit) CODERABBIT="true" ;;
beads) BEADS="true" ;;
specifyCli) SPECIFYCLI="true" ;;
claudeCode) CLAUDECODE="true" ;;
claudeAgentAcp) CLAUDEAGENTACP="true" ;;
geminiCli) GEMINICLI="true" ;;
codex) CODEX="true" ;;
copilot) COPILOT="true" ;;
openCode) OPENCODE="true" ;;
codeRabbit) CODERABBIT="true" ;;
beads) BEADS="true" ;;
specifyCli) SPECIFYCLI="true" ;;
*) echo "Warning: unknown CLI '$item' in install list" ;;
esac
done
Expand All @@ -47,14 +50,15 @@ if [ -n "${OMIT}" ]; then
for item in "${EXCLUDED[@]}"; do
item="$(echo "$item" | xargs)"
case "$item" in
claudeCode) CLAUDECODE="false" ;;
geminiCli) GEMINICLI="false" ;;
codex) CODEX="false" ;;
copilot) COPILOT="false" ;;
openCode) OPENCODE="false" ;;
codeRabbit) CODERABBIT="false" ;;
beads) BEADS="false" ;;
specifyCli) SPECIFYCLI="false" ;;
claudeCode) CLAUDECODE="false" ;;
claudeAgentAcp) CLAUDEAGENTACP="false" ;;
geminiCli) GEMINICLI="false" ;;
codex) CODEX="false" ;;
copilot) COPILOT="false" ;;
openCode) OPENCODE="false" ;;
codeRabbit) CODERABBIT="false" ;;
beads) BEADS="false" ;;
specifyCli) SPECIFYCLI="false" ;;
*) echo "Warning: unknown CLI '$item' in omit list" ;;
esac
done
Expand All @@ -66,6 +70,12 @@ if [ "${CLAUDECODE}" = "true" ]; then
su - "$_REMOTE_USER" -c 'curl -fsSL https://claude.ai/install.sh | bash' || echo "Warning: Claude Code installation failed"
fi

# Claude Agent ACP - ACP server for Claude agent SDK
if [ "${CLAUDEAGENTACP}" = "true" ]; then
echo "Installing Claude Agent ACP..."
npm install -g @zed-industries/claude-agent-acp
fi

# Gemini CLI
if [ "${GEMINICLI}" = "true" ]; then
echo "Installing Gemini CLI..."
Expand All @@ -87,7 +97,7 @@ fi
# OpenCode AI
if [ "${OPENCODE}" = "true" ]; then
echo "Installing OpenCode AI..."
curl -fsSL https://opencode.ai/install | bash
npm install -g opencode-ai
fi

# CodeRabbit CLI
Expand Down
3 changes: 1 addition & 2 deletions test/_global/scenarios.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
{
"all_features": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"image": "mcr.microsoft.com/devcontainers/javascript-node:22",
"features": {
"ghcr.io/devcontainers/features/python:1": {},
"ghcr.io/devcontainers/features/node:1": {},
"ghcr.io/devcontainers/features/rust:1": {},
"ai-clis": {},
"modern-cli-tools": {},
Expand Down
1 change: 1 addition & 0 deletions test/ai-clis/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ set -e
source dev-container-features-test-lib

check "claude code installed" bash -c "command -v claude"
check "claude-agent-acp installed" bash -c "command -v claude-agent-acp"
check "gemini installed" bash -c "command -v gemini"
check "codex installed" bash -c "command -v codex"
check "copilot installed" bash -c "command -v copilot"
Expand Down
Loading