/docker-setup
Host-only, operator-invoked. Generates Docker scaffolding and walks the operator through token setup, build, start, MCP plugin configuration, workspace trust, and verification. Offers to back up and overwrite existing Docker files. Run after /hatch.
Claude Code
$ npx -y skills add gtapps/hermitd --skill docker-setup --agent claude-code
Codex
$ npx skills add gtapps/hermitd --skill docker-setup -a codex -y
Cursor
$ npx skills add gtapps/hermitd --skill docker-setup -a cursor -y
Gemini CLI
$ npx skills add gtapps/hermitd --skill docker-setup -a gemini-cli -y
GitHub Copilot
$ npx skills add gtapps/hermitd --skill docker-setup -a github-copilot -y
OpenCode
$ npx skills add gtapps/hermitd --skill docker-setup -a opencode -y
Windsurf
$ npx skills add gtapps/hermitd --skill docker-setup -a windsurf -y
SKILL.md
docker-setup.SKILL.mdname: docker-setup
description: Host-only, operator-invoked. Generates Docker scaffolding and walks the operator through token setup, build, start, MCP plugin configuration, workspace trust, and verification. Offers to back up and overwrite existing Docker files. Run after /hatch.
disable-model-invocation: true
Docker Setup
Generate Docker scaffolding for running hermit as an always-on autonomous agent in a container. Docker provides isolation, crash recovery, and a reproducible environment. The default `auto` mode (classifier-reviewed autonomy) works well for most Docker hermits. Operators who need zero prompts for fully unattended operation can opt into `bypassPermissions` via `/hermit-settings permissions`.
**Tone:** Friendly guided wizard. Celebrate progress. When something fails, help fix it.
**Important:** Step 0's container check is a hard short-circuit — run it first and abort on `container` before anything else. After confirming host execution, run `docker-preflight.ts` once (Step 1) — it gathers all the read-only signals (docker presence, config existence, WSL path, existing docker files, host `~/.gitconfig`, auto-memory seed, a live non-Docker owner of the state dir) as a single JSON blob, so don't fan those probes out into separate Bash calls. Reuse its result for the git-identity (Step 4) and auto-memory (Step 5) decisions rather than re-probing. Step 2's project-dependency scan stays normal file reads (Read tool) plus analysis. Everything that mutates state or drives the container (file backups, `docker compose`, `tmux`, `mkdir`/`touch` setup-mode, status polls, channel `send-keys`) must run strictly sequentially in its documented order — never batch those.
Templates live in `${CLAUDE_SKILL_DIR}/../../state-templates/docker/`.
Commands
- `channel-group-add`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/channel-access.ts "<hermit_state_dir>" group-add`
Plan
0. Refuse to run inside the hermit container
This skill is host-only — it generates Docker scaffolding on the host filesystem and drives `docker compose up`.
Run: `[ -f /.dockerenv ] || [ -f /run/.containerenv ] && echo container || echo host`
If the output is `container`, **stop immediately** — do not proceed to step 1. Print:
> This skill generates host-side Docker scaffolding and then drives `docker compose up`. Run it from your host shell in the project root. To pair a channel later, run `/hermitd:channel-setup` from the host. To check what's already configured *inside* the running container, run `/hermitd:hermit-doctor`.
1. Prerequisites
Run the pre-flight probe once and parse its JSON: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/docker-preflight.ts "$(pwd)"` — pass `"$(pwd)"` so the auto-memory path key is keyed off the shell's logical path, matching Claude Code even through a symlinked project root. It returns `{ docker_version, config_exists, is_wsl, existing: {dockerfile, entrypoint, compose}, gitconfig_exists, memory: {path_key, seed_exists}, live_owner }`. Hold the result — Steps 4 and 5 reuse `gitconfig_exists` and `memory` instead of re-probing. Apply these gates:
1. If `docker_version` is null: "Docker isn't installed — grab it from https://docs.docker.com/get-docker/ and come back!" 2. If `config_exists` is false: "Run `/hermitd:hatch` first, then come back." 3. If `is_wsl` is true: abort — "Clone inside WSL2 (e.g. `/home/you/project`) and run from there." 4. If `live_owner` is non-null (`{ mode, age_secs }`): abort: "A live `<mode>` hermit owns this project's state (activity `<age_secs>`s ago). Stop it first with `hermitd stop` (run it from a separate terminal if this session *is* that hermit), then re-run this skill." Drop the parenthetical when `age_secs` is null. The container's entrypoint refuses to boot beside it and goes inert, so this must abort before anything is backed up, written, or built. Do not offer to stop it for the operator, and do not suggest `HERMIT_FORCE_BOOT=1`: that override is for split-state recovery, not for a hermit that is simply still running. If the operator reports that `hermitd-stop` itself refused ("No tmux session … but state activity Ns ago"), the recorded owner is a stale record, not a live hermit — the liveness it sees is this session's own; have them follow the `pgrep -af "claude --channels"` line `hermitd-stop` prints, kill any orphan it names, and re-run `hermitd-stop` once nothing is left. 5. If any of `existing.dockerfile` / `existing.entrypoint` / `existing.compose` is true:
- List them, then ask with `AskUserQuestion` (header: "Docker files"): **No — keep existing** (abort; remove or rename manually, then re-run) / **Yes — back up** (move to docker-backup/ and regenerate).
- "Yes — back up" → move to `docker-backup/`, continue
- "No — keep existing" → abort
- Never overwrite `.env` — only append missing vars (step 5).
1.5. Setup mode gate
Determine whether to run in **Quick** or **Advanced** mode.
**Argument-driven**: if invoked with the positional argument `quick` (e.g. `/hermitd:docker-setup quick`), skip the question below and run Quick directly. The operator can always re-invoke `/hermitd:docker-setup` without the arg later to drop into Advanced.
**Otherwise, ask:**
questions: [
{
header: "Setup mode",
question: "How would you like to configure Docker?",
options: [
{ label: "Quick", description: "OAuth + bridge networking, auto-mirror trusted plugins, build immediately" },
{ label: "Advanced", description: "Full wizard — pick auth, networking, every plugin, every package" }
]
}
]**Quick-mode contract — security non-negotiables.** Quick mode never bulk-accepts third-party plugins, never weakens the safelist, never skips the public-repo pre-flight, and never bypasses the write-time assertion. Those gates exist because that's the line where defaults stop being safe. Quick only auto-defaults the choices that have one obviously-correct answer (auth, networking, build-now) and the SAF
Read more
name: docker-setup description: Host-only, operator-invoked. Generates Docker scaffolding and walks the operator through token setup, build, start, MCP plugin configuration, workspace trust, and verification. Offers to back up and overwrite existing Docker files. Run after /hatch. disable-model-invocation: true
Docker Setup
Generate Docker scaffolding for running hermit as an always-on autonomous agent in a container. Docker provides isolation, crash recovery, and a reproducible environment. The default `auto` mode (classifier-reviewed autonomy) works well for most Docker hermits. Operators who need zero prompts for fully unattended operation can opt into `bypassPermissions` via `/hermit-settings permissions`.
**Tone:** Friendly guided wizard. Celebrate progress. When something fails, help fix it.
**Important:** Step 0's container check is a hard short-circuit — run it first and abort on `container` before anything else. After confirming host execution, run `docker-preflight.ts` once (Step 1) — it gathers all the read-only signals (docker presence, config existence, WSL path, existing docker files, host `~/.gitconfig`, auto-memory seed, a live non-Docker owner of the state dir) as a single JSON blob, so don't fan those probes out into separate Bash calls. Reuse its result for the git-identity (Step 4) and auto-memory (Step 5) decisions rather than re-probing. Step 2's project-dependency scan stays normal file reads (Read tool) plus analysis. Everything that mutates state or drives the container (file backups, `docker compose`, `tmux`, `mkdir`/`touch` setup-mode, status polls, channel `send-keys`) must run strictly sequentially in its documented order — never batch those.
Templates live in `${CLAUDE_SKILL_DIR}/../../state-templates/docker/`.
Commands
- `channel-group-add`: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/channel-access.ts "<hermit_state_dir>" group-add`
Plan
0. Refuse to run inside the hermit container
This skill is host-only — it generates Docker scaffolding on the host filesystem and drives `docker compose up`.
Run: `[ -f /.dockerenv ] || [ -f /run/.containerenv ] && echo container || echo host`
If the output is `container`, **stop immediately** — do not proceed to step 1. Print:
> This skill generates host-side Docker scaffolding and then drives `docker compose up`. Run it from your host shell in the project root. To pair a channel later, run `/hermitd:channel-setup` from the host. To check what's already configured *inside* the running container, run `/hermitd:hermit-doctor`.
1. Prerequisites
Run the pre-flight probe once and parse its JSON: `bun ${CLAUDE_PLUGIN_ROOT}/scripts/docker-preflight.ts "$(pwd)"` — pass `"$(pwd)"` so the auto-memory path key is keyed off the shell's logical path, matching Claude Code even through a symlinked project root. It returns `{ docker_version, config_exists, is_wsl, existing: {dockerfile, entrypoint, compose}, gitconfig_exists, memory: {path_key, seed_exists}, live_owner }`. Hold the result — Steps 4 and 5 reuse `gitconfig_exists` and `memory` instead of re-probing. Apply these gates:
1. If `docker_version` is null: "Docker isn't installed — grab it from https://docs.docker.com/get-docker/ and come back!" 2. If `config_exists` is false: "Run `/hermitd:hatch` first, then come back." 3. If `is_wsl` is true: abort — "Clone inside WSL2 (e.g. `/home/you/project`) and run from there." 4. If `live_owner` is non-null (`{ mode, age_secs }`): abort: "A live `<mode>` hermit owns this project's state (activity `<age_secs>`s ago). Stop it first with `hermitd stop` (run it from a separate terminal if this session *is* that hermit), then re-run this skill." Drop the parenthetical when `age_secs` is null. The container's entrypoint refuses to boot beside it and goes inert, so this must abort before anything is backed up, written, or built. Do not offer to stop it for the operator, and do not suggest `HERMIT_FORCE_BOOT=1`: that override is for split-state recovery, not for a hermit that is simply still running. If the operator reports that `hermitd-stop` itself refused ("No tmux session … but state activity Ns ago"), the recorded owner is a stale record, not a live hermit — the liveness it sees is this session's own; have them follow the `pgrep -af "claude --channels"` line `hermitd-stop` prints, kill any orphan it names, and re-run `hermitd-stop` once nothing is left. 5. If any of `existing.dockerfile` / `existing.entrypoint` / `existing.compose` is true:
- List them, then ask with `AskUserQuestion` (header: "Docker files"): **No — keep existing** (abort; remove or rename manually, then re-run) / **Yes — back up** (move to docker-backup/ and regenerate).
- "Yes — back up" → move to `docker-backup/`, continue
- "No — keep existing" → abort
- Never overwrite `.env` — only append missing vars (step 5).
1.5. Setup mode gate
Determine whether to run in **Quick** or **Advanced** mode.
**Argument-driven**: if invoked with the positional argument `quick` (e.g. `/hermitd:docker-setup quick`), skip the question below and run Quick directly. The operator can always re-invoke `/hermitd:docker-setup` without the arg later to drop into Advanced.
**Otherwise, ask:**
questions: [
{
header: "Setup mode",
question: "How would you like to configure Docker?",
options: [
{ label: "Quick", description: "OAuth + bridge networking, auto-mirror trusted plugins, build immediately" },
{ label: "Advanced", description: "Full wizard — pick auth, networking, every plugin, every package" }
]
}
]**Quick-mode contract — security non-negotiables.** Quick mode never bulk-accepts third-party plugins, never weakens the safelist, never skips the public-repo pre-flight, and never bypasses the write-time assertion. Those gates exist because that's the line where defaults stop being safe. Quick only auto-defaults the choices that have one obviously-correct answer (auth, networking, build-now) and the SAF
Run an always-on Claude Code agent on your own machine, for you or your team. Start and orchestrate sessions from chat in any project it can reach. Take over the same session in the Claude app or the CLI.
Other skills on hermitd.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
Questions about docker-setup.
- Which coding agents can use docker-setup?
- docker-setup installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

