{"id":"f939b7ee-d20c-4134-a81a-458185a8d78d","shortId":"LfdMUh","kind":"skill","title":"devcontainer-setup","tagline":"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.","description":"# Devcontainer Setup Skill\n\nCreates a pre-configured devcontainer with Claude Code and language-specific tooling.\n\n## When to Use\n- User asks to \"set up a devcontainer\" or \"add devcontainer support\"\n- User wants a sandboxed Claude Code development environment\n- User needs isolated development environments with persistent configuration\n\n## When NOT to Use\n\n- User already has a devcontainer configuration and just needs modifications\n- User is asking about general Docker or container questions\n- User wants to deploy production containers (this is for development only)\n\n## Workflow\n\n```mermaid\nflowchart TB\n    start([User requests devcontainer])\n    recon[1. Project Reconnaissance]\n    detect[2. Detect Languages]\n    generate[3. Generate Configuration]\n    write[4. Write files to .devcontainer/]\n    done([Done])\n\n    start --> recon\n    recon --> detect\n    detect --> generate\n    generate --> write\n    write --> done\n```\n\n## Phase 1: Project Reconnaissance\n\n### Infer Project Name\n\nCheck in order (use first match):\n\n1. `package.json` → `name` field\n2. `pyproject.toml` → `project.name`\n3. `Cargo.toml` → `package.name`\n4. `go.mod` → module path (last segment after `/`)\n5. Directory name as fallback\n\nConvert to slug: lowercase, replace spaces/underscores with hyphens.\n\n### Detect Language Stack\n\n| Language | Detection Files |\n|----------|-----------------|\n| Python | `pyproject.toml`, `*.py` |\n| Node/TypeScript | `package.json`, `tsconfig.json` |\n| Rust | `Cargo.toml` |\n| Go | `go.mod`, `go.sum` |\n\n### Multi-Language Projects\n\nIf multiple languages are detected, configure all of them in the following priority order:\n\n1. **Python** - Primary language, uses Dockerfile for uv + Python installation\n2. **Node/TypeScript** - Uses devcontainer feature\n3. **Rust** - Uses devcontainer feature\n4. **Go** - Uses devcontainer feature\n\nFor multi-language `postCreateCommand`, chain all setup commands:\n```\nuv run /opt/post_install.py && uv sync && npm ci\n```\n\nExtensions and settings from all detected languages should be merged into the configuration.\n\n## Phase 2: Generate Configuration\n\nStart with base templates from `resources/` directory. Substitute:\n\n- `{{PROJECT_NAME}}` → Human-readable name (e.g., \"My Project\")\n- `{{PROJECT_SLUG}}` → Slug for volumes (e.g., \"my-project\")\n\nThen apply language-specific modifications below.\n\n## Base Template Features\n\nThe base template includes:\n\n- **Claude Code** with marketplace plugins (anthropics/skills, trailofbits/skills, trailofbits/skills-curated)\n- **Python 3.13** via uv (fast binary download)\n- **Node 22** via fnm (Fast Node Manager)\n- **ast-grep** for AST-based code search\n- **Network isolation tools** (iptables, ipset) with NET_ADMIN capability\n- **Modern CLI tools**: ripgrep, fd, fzf, tmux, git-delta\n\n---\n\n## Language-Specific Sections\n\n### Python Projects\n\n**Detection:** `pyproject.toml`, `requirements.txt`, `setup.py`, or `*.py` files\n\n**Dockerfile additions:**\n\nThe base Dockerfile already includes Python 3.13 via uv. If a different version is required (detected from `pyproject.toml`), modify the Python installation:\n\n```dockerfile\n# Install Python via uv (fast binary download, not source compilation)\nRUN uv python install <version> --default\n```\n\n**devcontainer.json extensions:**\n\nAdd to `customizations.vscode.extensions`:\n```json\n\"ms-python.python\",\n\"ms-python.vscode-pylance\",\n\"charliermarsh.ruff\"\n```\n\nAdd to `customizations.vscode.settings`:\n```json\n\"python.defaultInterpreterPath\": \".venv/bin/python\",\n\"[python]\": {\n  \"editor.defaultFormatter\": \"charliermarsh.ruff\",\n  \"editor.codeActionsOnSave\": {\n    \"source.organizeImports\": \"explicit\"\n  }\n}\n```\n\n**postCreateCommand:**\nIf `pyproject.toml` exists, chain commands:\n```\nrm -rf .venv && uv sync && uv run /opt/post_install.py\n```\n\n---\n\n### Node/TypeScript Projects\n\n**Detection:** `package.json` or `tsconfig.json`\n\n**No Dockerfile additions needed:** The base template includes Node 22 via fnm (Fast Node Manager).\n\n**devcontainer.json extensions:**\n\nAdd to `customizations.vscode.extensions`:\n```json\n\"dbaeumer.vscode-eslint\",\n\"esbenp.prettier-vscode\"\n```\n\nAdd to `customizations.vscode.settings`:\n```json\n\"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n\"editor.codeActionsOnSave\": {\n  \"source.fixAll.eslint\": \"explicit\"\n}\n```\n\n**postCreateCommand:**\nDetect package manager from lockfile and chain with base command:\n- `pnpm-lock.yaml` → `uv run /opt/post_install.py && pnpm install --frozen-lockfile`\n- `yarn.lock` → `uv run /opt/post_install.py && yarn install --frozen-lockfile`\n- `package-lock.json` → `uv run /opt/post_install.py && npm ci`\n- No lockfile → `uv run /opt/post_install.py && npm install`\n\n---\n\n### Rust Projects\n\n**Detection:** `Cargo.toml`\n\n**Features to add:**\n\n```json\n\"ghcr.io/devcontainers/features/rust:1\": {}\n```\n\n**devcontainer.json extensions:**\n\nAdd to `customizations.vscode.extensions`:\n```json\n\"rust-lang.rust-analyzer\",\n\"tamasfe.even-better-toml\"\n```\n\nAdd to `customizations.vscode.settings`:\n```json\n\"[rust]\": {\n  \"editor.defaultFormatter\": \"rust-lang.rust-analyzer\"\n}\n```\n\n**postCreateCommand:**\nIf `Cargo.lock` exists, use locked builds:\n```\nuv run /opt/post_install.py && cargo build --locked\n```\nIf no lockfile, use standard build:\n```\nuv run /opt/post_install.py && cargo build\n```\n\n---\n\n### Go Projects\n\n**Detection:** `go.mod`\n\n**Features to add:**\n\n```json\n\"ghcr.io/devcontainers/features/go:1\": {\n  \"version\": \"latest\"\n}\n```\n\n**devcontainer.json extensions:**\n\nAdd to `customizations.vscode.extensions`:\n```json\n\"golang.go\"\n```\n\nAdd to `customizations.vscode.settings`:\n```json\n\"[go]\": {\n  \"editor.defaultFormatter\": \"golang.go\"\n},\n\"go.useLanguageServer\": true\n```\n\n**postCreateCommand:**\n```\nuv run /opt/post_install.py && go mod download\n```\n\n---\n\n## Reference Material\n\nFor additional guidance, see:\n- `references/dockerfile-best-practices.md` - Layer optimization, multi-stage builds, architecture support\n- `references/features-vs-dockerfile.md` - When to use devcontainer features vs custom Dockerfile\n\n---\n\n## Adding Persistent Volumes\n\nPattern for new mounts in `devcontainer.json`:\n\n```json\n\"mounts\": [\n  \"source={{PROJECT_SLUG}}-<purpose>-${devcontainerId},target=<container-path>,type=volume\"\n]\n```\n\nCommon additions:\n- `source={{PROJECT_SLUG}}-cargo-${devcontainerId},target=/home/vscode/.cargo,type=volume` (Rust)\n- `source={{PROJECT_SLUG}}-go-${devcontainerId},target=/home/vscode/go,type=volume` (Go)\n\n---\n\n## Output Files\n\nGenerate these files in the project's `.devcontainer/` directory:\n\n1. `Dockerfile` - Container build instructions\n2. `devcontainer.json` - VS Code/devcontainer configuration\n3. `post_install.py` - Post-creation setup script\n4. `.zshrc` - Shell configuration\n5. `install.sh` - CLI helper for managing the devcontainer (`devc` command)\n\n---\n\n## Validation Checklist\n\nBefore presenting files to the user, verify:\n\n1. All `{{PROJECT_NAME}}` placeholders are replaced with the human-readable name\n2. All `{{PROJECT_SLUG}}` placeholders are replaced with the slugified name\n3. JSON syntax is valid in `devcontainer.json` (no trailing commas, proper nesting)\n4. Language-specific extensions are added for all detected languages\n5. `postCreateCommand` includes all required setup commands (chained with `&&`)\n\n---\n\n## User Instructions\n\nAfter generating, inform the user:\n\n1. How to start: \"Open in VS Code and select 'Reopen in Container'\"\n2. Alternative: `devcontainer up --workspace-folder .`\n3. CLI helper: Run `.devcontainer/install.sh self-install` to add the `devc` command to PATH\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["devcontainer","setup","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-devcontainer-setup","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/devcontainer-setup","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34831 github stars · SKILL.md body (7,833 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T06:51:03.770Z","embedding":null,"createdAt":"2026-04-18T21:36:03.002Z","updatedAt":"2026-04-24T06:51:03.770Z","lastSeenAt":"2026-04-24T06:51:03.770Z","tsv":"'/devcontainers/features/go:1':618 '/devcontainers/features/rust:1':563 '/home/vscode/.cargo':694 '/home/vscode/go':704 '/opt/post_install.py':269,469,525,534,543,550,593,605,640 '1':126,156,168,233,719,759,822 '2':130,172,243,288,724,772,835 '22':347,485 '3':134,175,248,729,783,842 '3.13':340,402 '4':138,178,253,736,795 '5':185,740,806 'ad':19,668,801 'add':64,436,444,493,501,559,566,576,614,623,628,851 'addit':395,478,647,687 'admin':369 'alreadi':88,399 'altern':836 'analyz':571,583 'anthropics/skills':336 'appli':318 'architectur':657 'ask':57,99,890 'ast':354,358 'ast-bas':357 'ast-grep':353 'base':293,324,328,359,397,481,520 'better':574 'better-toml':573 'binari':344,424 'boundari':898 'build':590,595,602,607,656,722 'capabl':370 'cargo':594,606,691 'cargo.lock':586 'cargo.toml':176,211,556 'chain':263,460,518,813 'charliermarsh.ruff':443,452 'check':162 'checklist':751 'ci':273,545 'clarif':892 'claud':7,33,46,71,331 'clear':865 'cli':372,742,843 'code':8,34,47,72,332,360,829 'code/devcontainer':727 'comma':792 'command':266,461,521,749,812,854 'common':686 'compil':428 'configur':31,43,82,92,136,224,286,290,728,739 'contain':104,111,721,834 'convert':190 'creat':4,39 'creation':733 'criteria':901 'custom':666 'customizations.vscode.extensions':438,495,568,625 'customizations.vscode.settings':446,503,578,630 'dbaeumer.vscode':497 'default':433 'delta':380 'deploy':109 'describ':869 'detect':129,131,148,149,198,202,223,279,387,411,472,512,555,610,804 'devc':748,853 'devcontain':2,5,20,36,44,62,65,91,124,142,246,251,256,663,717,747,837 'devcontainer-setup':1 'devcontainer.json':434,491,564,621,676,725,789 'devcontainer/install.sh':846 'devcontainerid':682,692,702 'develop':28,73,78,115 'differ':407 'directori':186,297,718 'docker':102 'dockerfil':238,394,398,418,477,667,720 'done':143,144,154 'download':345,425,643 'e.g':305,313 'editor.codeactionsonsave':453,508 'editor.defaultformatter':451,505,581,633 'environ':29,74,79,881 'environment-specif':880 'esbenp.prettier':499,506 'eslint':498 'exist':459,587 'expert':886 'explicit':455,510 'extens':274,435,492,565,622,799 'fallback':189 'fast':343,350,423,488 'fd':375 'featur':247,252,257,326,557,612,664 'field':171 'file':140,203,393,709,712,754 'first':166 'flowchart':119 'fnm':349,487 'folder':841 'follow':230 'frozen':529,538 'frozen-lockfil':528,537 'fzf':376 'general':101 'generat':133,135,150,151,289,710,818 'ghcr.io':562,617 'ghcr.io/devcontainers/features/go:1':616 'ghcr.io/devcontainers/features/rust:1':561 'git':379 'git-delta':378 'go':212,254,608,632,641,701,707 'go.mod':179,213,611 'go.sum':214 'go.uselanguageserver':635 'golang.go':627,634 'grep':355 'guidanc':648 'helper':743,844 'human':302,769 'human-read':301,768 'hyphen':197 'includ':330,400,483,808 'infer':159 'inform':819 'input':895 'instal':242,417,419,432,527,536,552,849 'install.sh':741 'instruct':723,816 'ipset':366 'iptabl':365 'isol':27,77,363 'json':439,447,496,504,560,569,579,615,626,631,677,784 'languag':10,50,132,199,201,217,221,236,261,280,320,382,797,805 'language-specif':9,49,319,381,796 'last':182 'latest':620 'layer':651 'limit':857 'lock':589,596 'lockfil':516,530,539,547,599 'lowercas':193 'manag':352,490,514,745 'marketplac':334 'match':167,866 'materi':645 'merg':283 'mermaid':118 'miss':903 'mod':642 'modern':371 'modif':96,322 'modifi':414 'modul':180 'mount':674,678 'ms-python.python':440 'ms-python.vscode':441 'multi':216,260,654 'multi-languag':215,259 'multi-stag':653 'multipl':220 'my-project':314 'name':161,170,187,300,304,762,771,782 'need':76,95,479 'nest':794 'net':368 'network':362 'new':673 'node':346,351,484,489 'node/typescript':207,244,470 'npm':272,544,551 'open':826 'optim':652 'order':164,232 'output':708,875 'packag':513 'package-lock.json':540 'package.json':169,208,473 'package.name':177 'path':181,856 'pattern':671 'permiss':896 'persist':15,81,669 'phase':155,287 'placehold':763,776 'plugin':335 'pnpm':526 'pnpm-lock.yaml':522 'post':732 'post-creat':731 'post_install.py':730 'postcreatecommand':262,456,511,584,637,807 'pre':42 'pre-configur':41 'present':753 'primari':235 'prioriti':231 'product':110 'project':24,127,157,160,218,299,307,308,316,386,471,554,609,680,689,699,715,761,774 'project.name':174 'proper':793 'py':206,392 'pylanc':442 'pyproject.toml':173,205,388,413,458 'python':204,234,241,339,385,401,416,420,431,450 'python.defaultinterpreterpath':448 'python/node/rust/go':13 'question':105 'readabl':303,770 'recon':125,146,147 'reconnaiss':128,158 'refer':644 'references/dockerfile-best-practices.md':650 'references/features-vs-dockerfile.md':659 'reopen':832 'replac':194,765,778 'request':123 'requir':410,810,894 'requirements.txt':389 'resourc':296 'review':887 'rf':463 'ripgrep':374 'rm':462 'run':268,429,468,524,533,542,549,592,604,639,845 'rust':210,249,553,580,697 'rust-lang.rust':570,582 'safeti':897 'sandbox':32,70 'scope':868 'script':735 'search':361 'section':384 'see':649 'segment':183 'select':831 'self':848 'self-instal':847 'set':25,59,276 'setup':3,37,265,734,811 'setup.py':390 'shell':738 'skill':38,860 'skill-devcontainer-setup' 'slug':192,309,310,681,690,700,775 'slugifi':781 'sourc':427,679,688,698 'source-sickn33' 'source.fixall.eslint':509 'source.organizeimports':454 'spaces/underscores':195 'specif':11,51,321,383,798,882 'stack':200 'stage':655 'standard':601 'start':121,145,291,825 'stop':888 'substitut':298,878 'success':900 'support':21,66,658 'sync':271,466 'syntax':785 'tamasfe.even':572 'target':683,693,703 'task':864 'tb':120 'templat':294,325,329,482 'test':884 'tmux':377 'toml':575 'tool':12,52,364,373 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'trail':791 'trailofbits/skills':337 'trailofbits/skills-curated':338 'treat':873 'true':636 'tsconfig.json':209,475 'type':684,695,705 'use':17,55,86,165,237,245,250,255,588,600,662,858 'user':56,67,75,87,97,106,122,757,815,821 'uv':240,267,270,342,404,422,430,465,467,523,532,541,548,591,603,638 'valid':750,787,883 'venv':464 'venv/bin/python':449 'verifi':758 'version':408,619 'via':341,348,403,421,486 'volum':16,312,670,685,696,706 'vs':665,726,828 'vscode':500,507 'want':68,107 'workflow':117 'workspac':35,840 'workspace-fold':839 'write':137,139,152,153 'yarn':535 'yarn.lock':531 'zshrc':737","prices":[{"id":"39965b48-3b57-4d5d-afb1-74a6c88fdef9","listingId":"f939b7ee-d20c-4134-a81a-458185a8d78d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:36:03.002Z"}],"sources":[{"listingId":"f939b7ee-d20c-4134-a81a-458185a8d78d","source":"github","sourceId":"sickn33/antigravity-awesome-skills/devcontainer-setup","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/devcontainer-setup","isPrimary":false,"firstSeenAt":"2026-04-18T21:36:03.002Z","lastSeenAt":"2026-04-24T06:51:03.770Z"}],"details":{"listingId":"f939b7ee-d20c-4134-a81a-458185a8d78d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"devcontainer-setup","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34831,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"6aeecc6a8119eab9b13441034698e23afdc378a0","skill_md_path":"skills/devcontainer-setup/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/devcontainer-setup"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"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."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/devcontainer-setup"},"updatedAt":"2026-04-24T06:51:03.770Z"}}