8 Commits

Author SHA1 Message Date
Brad Lhotsky 5203cb53ba Address Potential Container Escape via git (#42)
This patch prevents claude from manipulating `.git/hooks` or
`.git/config` which could result in unintended code execution outside
the devcontainer.

As an example, ask claude to create a git hook to print "Hello World" on
commit or push. Outside of the devcontainer, the git status is clean,
but running `git commit` or `git push` will result in printing "Hellow
World".

Credit for this disovery to @tillberg.
2026-04-24 16:04:00 +02:00
Akshith G 5a2b92a790 feat: add non-interactive auth via CLAUDE_CODE_OAUTH_TOKEN (#32)
* feat: add non-interactive auth via CLAUDE_CODE_OAUTH_TOKEN

Bypass the interactive onboarding wizard when CLAUDE_CODE_OAUTH_TOKEN is
set. On container create, post_install.py runs `claude -p` to populate
auth state and sets hasCompletedOnboarding so the TUI starts without the
login wizard.

Workaround for https://github.com/anthropics/claude-code/issues/8938.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use remoteEnv instead of containerEnv for secrets

containerEnv bakes values into the image as ENV instructions, visible
in docker inspect/history. remoteEnv is set at runtime only.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: improve error handling in onboarding bypass

- Handle timeout as expected (claude -p writes config before API call)
- Catch FileNotFoundError/OSError if claude is not installed
- Check returncode explicitly instead of dead CalledProcessError catch
- Guard on ~/.claude.json existence before writing onboarding flag
- Replace contextlib.suppress with explicit try/except that logs
- Update module docstring and README wording

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 06:36:47 -07:00
rpgdev 6dc4b4f0cb feat: add devc destroy command and standardize volume naming (#31)
Add `devc destroy [-f]` to cleanly remove all Docker resources
(container, volumes, images) for a project. Includes resource
discovery via container inspection, itemized pre-deletion summary,
y/N confirmation prompt with --force bypass, running container
warning, and idempotent no-op when no resources exist.

Rename volume prefix from claude-code-* to devc-* and include
workspace folder name for self-identifying volumes
(e.g., devc-myproject-config-{devcontainerId}).

Co-authored-by: Disconnect3d <dominik.b.czarnota@gmail.com>
2026-03-10 12:38:07 +01:00
Dan Guido daab646db6 Fix bind mount failure when ~/.gitconfig does not exist (#24)
Docker bind mounts require the source file to exist. Users without
~/.gitconfig (fresh machines, XDG-based config, system-only config)
hit a container start failure.

Add initializeCommand to create an empty ~/.gitconfig on the host
before the container starts. An empty gitconfig is valid and has no
side effects — git treats it as having no settings.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:52:07 -05:00
Dan Guido 74d87a53da Minor cleanups: default TZ to UTC, shellcheck directive, comment clarity (#21)
- Default timezone to UTC instead of America/New_York
- Add shellcheck shell=bash directive to .zshrc
- Extract docker filter label into local variable in cmd_down
- Clarify mount filter comment (target paths immune to project name changes)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 06:49:08 -05:00
Dan Guido a1f3994cda Harden devcontainer: pin digests, guard SYS_ADMIN, fix mount filters (#20)
Address review feedback from #14–#19:

- Pin base image and uv with SHA256 digests (#15)
- Install fzf from GitHub releases instead of apt (#14)
- Add SYS_ADMIN capability guard to prevent remount attacks (#16)
- Fix mount filter to use target paths instead of source prefixes (#17)
- Fix temp file leak in extract_mounts_to_file (#17)
- Sort apt packages alphabetically (#18)
- Remove unused Tailscale feature (#19)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 06:35:35 -05:00
Dan Guido 90e3280503 Mount .devcontainer/ read-only to prevent container escape on rebuild (#13)
A process inside the container could modify .devcontainer/devcontainer.json
to inject malicious mounts or initializeCommand entries that execute on the
host during the next rebuild. Bind-mounting .devcontainer/ as read-only
blocks this privilege escalation vector.

Uses startswith() for the jq filter to be precise and consistent with
other mount filters, and documents the SYS_ADMIN guard requirement.

Based on PR #12 with review feedback from @dguido addressed.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 03:20:33 -05:00
Dan Guido 91ff6f7c0c Initial commit 2026-01-29 20:13:16 -05:00