From fullstack-devc
Set up a standard devcontainer configuration in the current project. Creates .devcontainer/devcontainer.json with standard mounts, SSH, GH CLI, and Claude config. Optionally commits and pushes to main.
How this command is triggered — by the user, by Claude, or both
Slash command
/fullstack-devc:devcontainerThe summary Claude sees in its command listing — used to decide when to auto-load this command
# Devcontainer Setup Command Generate a `.devcontainer/devcontainer.json` in the current project using the standard development container configuration. ## Process ### Step 1: Gather Project Info 1. Determine project name from the current working directory basename 2. Detect the project's primary language/stack by checking for the presence of: - `go.mod` or `*.go` files → Go project - `package.json` → Node/TypeScript project - `requirements.txt`, `pyproject.toml`, `setup.py` → Python project - `Cargo.toml` → Rust project - Multiple languages detected → fullstack 3. Ask th...
Generate a .devcontainer/devcontainer.json in the current project using the standard development container configuration.
go.mod or *.go files → Go projectpackage.json → Node/TypeScript projectrequirements.txt, pyproject.toml, setup.py → Python projectCargo.toml → Rust projectBased on the detected stack, select extensions:
Always include:
esbenp.prettier-vscodeeamodio.gitlensGitHub.copilotGo projects — add:
golang.goTypeScript/Node projects — add:
dbaeumer.vscode-eslintbiomejs.biomebradlc.vscode-tailwindcssPython projects — add:
ms-python.pythonms-python.vscode-pylanceRust projects — add:
rust-lang.rust-analyzerFullstack (Go + TS) — add both Go and TypeScript sets.
Create .devcontainer/devcontainer.json with this structure. Use the gathered info to fill in the template:
{
"name": "<project-name>",
"image": "pilotso11/fullstack-devc:latest",
"hostRequirements": {
"cpus": 2,
"memory": "4gb"
},
"customizations": {
"vscode": {
"settings": {
"editor.formatOnSave": true
},
"extensions": [
"<detected extensions from Step 2>"
]
}
},
"mounts": [
"source=${localEnv:HOME}/.claude,target=/home/developer/.claude,type=bind",
"source=${localEnv:HOME}/.config/gh,target=/home/developer/.config/gh,type=bind",
"source=/run/host-services/ssh-auth.sock,target=/ssh-agent,type=bind"
],
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
"installOhMyZsh": true,
"upgradePackages": true
}
},
"containerEnv": {
"TZ": "Europe/London"
},
"remoteEnv": {
"SSH_AUTH_SOCK": "/ssh-agent",
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "true"
},
"overrideCommand": false,
"postCreateCommand": "sudo mkdir -p /home/developer/.ssh && sudo chown developer:developer /home/developer/.ssh && ssh-keyscan github.com >> /home/developer/.ssh/known_hosts 2>/dev/null; true",
"postStartCommand": "sudo chown -R developer:developer /home/developer/.claude /home/developer/.config/gh /home/developer/.ssh 2>/dev/null; true",
"remoteUser": "developer"
}
Customization rules:
"mounts" array:
"source=${localEnv:HOME}/.config/gcloud,target=/home/developer/.config/gcloud,type=bind"
and append /home/developer/.config/gcloud to the postStartCommand chown list"forwardPorts": [...] field"containerEnv" object alongside "TZ""go.useLanguageServer": true,
"go.toolsManagement.autoUpdate": true,
"go.lintTool": "golangci-lint",
"go.lintOnSave": "package",
"go.formatTool": "goimports",
"[go]": { "editor.defaultFormatter": "golang.go" }
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }
.devcontainer/ directory if it doesn't existdevcontainer.json file.gitignore exists, verify it does NOT ignore .devcontainer/ — if it does, warn the userIf the user passed the push argument OR answers yes when asked "Commit and push to main?":
git init).devcontainer/devcontainer.json filechore: add devcontainer configurationgit push origin mainIf the user did not pass push and declines, just confirm the file was created.
Print a summary of what was created:
Then print a First use note:
**First use:** On macOS, Claude Code and GitHub CLI credentials are stored in the
system Keychain and don't transfer into the container. The first time you open
the devcontainer, run:
claude login
gh auth login
These write credentials to the bind-mounted ~/.claude and ~/.config/gh directories,
so you only need to do this once per machine.
npx claudepluginhub pilotso11/fullstack-devc --plugin fullstack-devc