Skip to content
Security
Skill

/devcontainer-setup

Creates devcontainers with Claude Code, language-specific tooling (Python/Node/Rust/Go), and persistent volumes. Use when adding devcontainer support to a project, setting up isolated development environments, or configuring sandboxed Claude Code workspaces.

From plugin
trailofbits-skills
7.1k81 skills30 agents8 commands2 MCP
Install
$ npx -y skills add trailofbits/skills --skill devcontainer-setup --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/devcontainer-setup

Context preview

The summary Claude sees to decide when to auto-load this skill.

Creates devcontainers with Claude Code, language-specific tooling (Python/Node/Rust/Go), and persistent volumes. Use when adding devcontainer support to a project, setting up isolated development environments, or configuring sandboxed Claude Code workspaces.

SKILL.md

devcontainer-setup.SKILL.md
name: devcontainer-setup
description: Creates devcontainers with Claude Code, language-specific tooling (Python/Node/Rust/Go), and persistent volumes. Use when adding devcontainer support to a project, setting up isolated development environments, or configuring sandboxed Claude Code workspaces.

Devcontainer Setup Skill

Creates a pre-configured devcontainer with Claude Code and language-specific tooling.

When to Use

  • User asks to "set up a devcontainer" or "add devcontainer support"
  • User wants a sandboxed Claude Code development environment
  • User needs isolated development environments with persistent configuration

When NOT to Use

  • User already has a devcontainer configuration and just needs modifications
  • User is asking about general Docker or container questions
  • User wants to deploy production containers (this is for development only)

Workflow

flowchart TB
    start([User requests devcontainer])
    recon[1. Project Reconnaissance]
    detect[2. Detect Languages]
    generate[3. Generate Configuration]
    write[4. Write files to .devcontainer/]
    done([Done])

    start --> recon
    recon --> detect
    detect --> generate
    generate --> write
    write --> done

Phase 1: Project Reconnaissance

Infer Project Name

Check in order (use first match):

1. `package.json` → `name` field 2. `pyproject.toml` → `project.name` 3. `Cargo.toml` → `package.name` 4. `go.mod` → module path (last segment after `/`) 5. Directory name as fallback

Convert to slug: lowercase, replace spaces/underscores with hyphens.

Detect Language Stack

| Language | Detection Files | |----------|-----------------| | Python | `pyproject.toml`, `*.py` | | Node/TypeScript | `package.json`, `tsconfig.json` | | Rust | `Cargo.toml` | | Go | `go.mod`, `go.sum` |

Multi-Language Projects

If multiple languages are detected, configure all of them in the following priority order:

1. **Python** - Primary language, uses Dockerfile for uv + Python installation 2. **Node/TypeScript** - Uses devcontainer feature 3. **Rust** - Uses devcontainer feature 4. **Go** - Uses devcontainer feature

For multi-language `postCreateCommand`, chain all setup commands:

uv run /opt/post_install.py && uv sync && npm ci

Extensions and settings from all detected languages should be merged into the configuration.

Phase 2: Generate Configuration

Start with base templates from `resources/` directory. Substitute:

  • `{{PROJECT_NAME}}` → Human-readable name (e.g., "My Project")
  • `{{PROJECT_SLUG}}` → Slug for volumes (e.g., "my-project")

Then apply language-specific modifications below.

Base Template Features

The base template includes:

  • **Claude Code** with marketplace plugins (anthropics/skills, trailofbits/skills, trailofbits/skills-curated)
  • **Sandboxing** via bubblewrap and socat
  • **Python 3.13** via uv (fast binary download)
  • **Node 22** via fnm (Fast Node Manager)
  • **ast-grep** for AST-based code search
  • **Network isolation tools** (iptables, ipset) with NET_ADMIN capability
  • **Security mounts**: `.devcontainer/` mounted read-only to prevent container escape
  • **Token forwarding**: `CLAUDE_CODE_OAUTH_TOKEN` and `ANTHROPIC_API_KEY` via `remoteEnv`
  • **Modern CLI tools**: ripgrep, fd, fzf, tmux, git-delta

---

Language-Specific Sections

Python Projects

**Detection:** `pyproject.toml`, `requirements.txt`, `setup.py`, or `*.py` files

**Dockerfile additions:**

The base Dockerfile already includes Python 3.13 via uv. If a different version is required (detected from `pyproject.toml`), modify the Python installation:

# Install Python via uv (fast binary download, not source compilation)
RUN uv python install <version> --default

**devcontainer.json extensions:**

Add to `customizations.vscode.extensions`:

"ms-python.python",
"ms-python.vscode-pylance",
"charliermarsh.ruff"

Add to `customizations.vscode.settings`:

"python.defaultInterpreterPath": ".venv/bin/python",
"[python]": {
  "editor.defaultFormatter": "charliermarsh.ruff",
  "editor.codeActionsOnSave": {
    "source.organizeImports": "explicit"
  }
}

**postCreateCommand:** If `pyproject.toml` exists, chain commands:

rm -rf .venv && uv sync && uv run /opt/post_install.py

---

Node/TypeScript Projects

**Detection:** `package.json` or `tsconfig.json`

**No Dockerfile additions needed:** The base template includes Node 22 via fnm (Fast Node Manager).

**devcontainer.json extensions:**

Add to `customizations.vscode.extensions`:

"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"

Add to `customizations.vscode.settings`:

"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
  "source.fixAll.eslint": "explicit"
}

**postCreateCommand:** Detect package manager from lockfile and chain with base command:

  • `pnpm-lock.yaml` → `uv run /opt/post_install.py && pnpm install --frozen-lockfile`
  • `yarn.lock` → `uv run /opt/post_install.py && yarn install --frozen-lockfile`
  • `package-lock.json` → `uv run /opt/post_install.py && npm ci`
  • No lockfile → `uv run /opt/post_install.py && npm install`

---

Rust Projects

**Detection:** `Cargo.toml`

**Features to add:**

"ghcr.io/devcontainers/features/rust:1": {}

**devcontainer.json extensions:**

Add to `customizations.vscode.extensions`:

"rust-lang.rust-analyzer",
"tamasfe.even-better-toml"

Add to `customizations.vscode.settings`:

"[rust]": {
  "editor.defaultFormatter": "rust-lang.rust-analyzer"
}

**postCreateCommand:** If `Cargo.lock` exists, use locked builds:

uv run /opt/post_install.py && cargo build --locked

If no lockfile, use standard build:

uv run /opt/post_install.py && cargo build

---

Go Projects

**Detection:** `go.mod`

**Features to add:**

"ghcr.io/devcontainers/features/go:1": {
  "version": "latest"
}

**devcontainer.json extensions:**

Add to `customizati

Read more
Ships withtrailofbits-skills

A Claude Code plugin marketplace from Trail of Bits providing skills to enhance AI-assisted security analysis, testing, and development workflows. Codex can load this marketplace through its Claude marketplace compatibility.

Get the whole plugin

Other skills on trailofbits-skills.