This file provides guidance to coding agents working in this repository.
deva.sh is a Docker-based multi-agent launcher for:
- OpenAI Codex
- Claude Code
- Google Gemini CLI
The container is the sandbox. Agent-level permission theater is not.
That is the core design. Do not "improve" it by moving trust back into interactive prompt confirmations.
We use issue-based development.
- Before any Git or GitHub CLI command, read the matching file in
workflows/:GITHUB-ISSUE.mdGIT-COMMIT.mdGITHUB-PR.mdRELEASE.md
- Keep one branch per issue when practical.
- PRs should reference and close the relevant issue.
Release workflow lives in workflows/RELEASE.md.
Current release source of truth:
- version comes from
deva.sh - changelog comes from
CHANGELOG.md - images are published by GitHub Actions
Do not use claude.sh as the version source. That is old baggage.
deva/
├── deva.sh
├── claude.sh
├── claude-yolo
├── agents/
├── Dockerfile
├── Dockerfile.rust
├── docker-entrypoint.sh
├── install.sh
├── .deva.example
├── examples/
├── docs/
├── .github/workflows/
├── workflows/
├── CHANGELOG.md
├── DEV-LOGS.md
└── AGENTS.md
Important current roles:
deva.sh: primary entrypoint and container lifecycle manageragents/*.sh: agent-specific auth and command wiringinstall.sh: one-line installer.github/workflows/ci.yml: lint, docs, and smoke coverage.github/workflows/release.yml: tagged image + release flow.github/workflows/nightly-images.yml: scheduled nightly image refresh
Legacy compatibility wrappers still exist:
claude.shclaude-yolo
They are compatibility shims, not primary branding.
Deva runs agent CLIs inside Docker and disables their built-in permission prompts:
- Claude:
--dangerously-skip-permissions - Gemini:
--yolo - Codex: unrestricted mode equivalent
That is deliberate.
The security boundary is:
- the container
- the exact mounts and env vars we pass into it
So the real risks are the host bridges we expose:
- mounted workspace paths
- mounted auth files
/var/run/docker.sock--host-net- tmux bridge tooling
Do not document or implement this as if the agent sandbox is protecting the host. It is not.
Deva supports multiple auth modes per agent.
Current design:
- default config root is
~/.config/deva - per-agent homes live under that root
--config-homeisolates auth state-Qmeans bare mode: no config loading, no autolink, no host auth mounts- non-default auth overlays default credential paths instead of moving live host files around
If you touch auth code, verify real --dry-run output and one live path.
Auth bugs are usually mount bugs wearing a fake auth moustache.
Persistent containers are keyed by workspace plus container shape.
Shape includes things like:
- selected agent
- extra volumes
- explicit config home
- auth mode
So it is not "one container per repo" in the naive sense. Different shapes must not collide.
For clean repros and CI smoke tests, use:
deva.sh claude -Q -- --version
deva.sh codex -Q -- --version
deva.sh gemini -Q -- --versionNon-interactive launch paths must work without a TTY.
Run these before claiming things work:
./deva.sh --help
./deva.sh --version
./claude-yolo --help
./scripts/version-check.shIf you changed container launch, mounts, auth, or the installer, also run:
./deva.sh claude --debug --dry-run
./deva.sh claude -Q -- --version
./deva.sh codex -Q -- --version
./deva.sh gemini -Q -- --versionIf you changed docs site plumbing, also run:
mkdocs build --strictBridges are deliberate holes from container back to host.
Current ones:
- Docker socket mount
- tmux bridge
Treat bridge changes as security-sensitive. They change the real trust boundary, not some fake marketing boundary.
Public copy should say deva.sh first.
Allowed:
- mention
claude.sh/claude-yoloas compatibility wrappers - historical notes in changelog/dev logs
Not allowed:
- presenting the project as Claude-only
- using
claude.shas the primary interface in current docs - leaving stale release or workflow prompts centered on old naming
Do not use the issue queue as a mirror of every upstream vendor changelog.
If upstream version tracking is automated, close the old noise and keep the real issue queue for:
- bugs in deva
- missing features in deva
- docs gaps in deva
- concrete release/process work in deva