Addon devcontainer
Dê ao repositório um contêiner de desenvolvimento reproduzível e isolado, que pessoas, editores e agentes de código possam usar igualmente. No DWP v7 (pack v7.8.1), este addon integra o devcontainer-kit, um produto MIT que funciona sem o Deep Work Plan. É opcional: um repositório é totalmente conforme sem ele.
O que o devcontainer-kit fornece
- Um template, baseado na especificação Dev Containers, que
dck initrenderiza no repositório em uma estrutura fixa:.devcontainer/devcontainer.json,docker/local/<service>/Dockerfile,docker/local/docker-compose.yamledev.sh. Executado novamente depois, ele reconcilia e nunca sobrescreve suas edições; qualquer mudança em um arquivo existente é mostrada antes e exige consentimento. - O contêiner próprio do repositório. O Dockerfile parte da imagem oficial do runtime fixada por digest (
node-24,python-3.13oudebian) e copia as etapas de build do kit paradocker/local/<service>/dck/. Nenhuma imagem base compartilhada está envolvida. dev.shedck.bash dev.sh upconstrói, inicia e se conecta ao contêiner a partir de um terminal comum;shell,rebuild,doctore os demais funcionam com ou sem VS Code ou Cursor.- Herdr nos dois sentidos. O Herdr do host conecta cada contêiner como uma máquina por meio de um servidor SSH restrito ao loopback, e o contêiner abre com a barra lateral padrão: App, Editor, Development e Agents. Cada espaço de trabalho e cada painel, inclusive os abertos depois, começam no caminho da aplicação (
/apppor padrão). Dentro dele, o herdr-peers permite que agentes consultem agentes no host e em outros contêineres. - A skill
dck-dockerfile. Um agente cria ou regenera o contêiner de um repositório quando solicitado e o comprova com um build real.
Instalação
git clone --branch v1.0.1 https://github.com/DailybotHQ/devcontainer-kit && ./devcontainer-kit/install.sh
cd your-repo && dck init && bash dev.sh up
Requisitos: bash 3.2 ou mais recente e python3 3.11 ou mais recente em um host Linux ou macOS, e Docker com Compose v2 para os comandos do contêiner. Verifique uma versão com o asset SHA256SUMS dela. Fixe a v1.0.1: a v0.2.0 não tem suporte.
| Item | Valor |
|---|---|
| Produto | DailybotHQ/devcontainer-kit, tag v1.0.1, interface 2 |
| Chave de registro | devcontainer em .dwp/config.json |
| Configuração por repositório | .devcontainer/dck.toml |
| Detecção | dck doctor --json |
Estável desde v1.0.0. A interface pública segue o versionamento semântico e só muda de forma incompatível em uma nova versão principal (e, para os arquivos, com um novo número de interface): os verbos do dck com suas flags documentadas e seus códigos de saída (0 ok, 1 falha, 2 uso, 3 configuração, 4 ambiente, 5 recusado), os esquemas do dck.toml, do perfil do host e do dck doctor --json (interface 2), e o contrato de renderização: os arquivos que dck init escreve e gerencia, os marcadores dck:managed e os blocos de usuário que ele preserva, e o ambiente que o entrypoint lê. Nada quebra a partir da v0.3.7: execute dck init e dck rebuild para que a imagem traga as novas versões fixadas (herdr-peers, coding-agents-kit e DeepWorkPlan Vim, cada um na v1.0.0).
Camadas
Todo contêiner traz as ferramentas de desenvolvimento (git, gh, ripgrep, um servidor SSH, Herdr e herdr-peers) e nenhum segredo, a menos que você ative as contas do host. O restante é uma camada que você escolhe em dck.toml:
| Camada | Padrão | O que adiciona |
|---|---|---|
agents |
desativada | O coding-agents-kit a partir da sua versão verificada e as CLIs que você listar, cada uma com seu próprio volume persistente, além dos presets classic (claudex, codexx, …) e providers (claude-glm, codex-azure, …). Os agentes rodam em autonomia por padrão: o contêiner é o sandbox. Para desativar: AGENTKIT_PERMISSIONS=ask no .env do serviço. |
editor |
ativada | Neovim com o DeepWorkPlan Vim fixado por tag; desativada, oferece um editor simples. |
dailybot |
desativada | A CLI do Dailybot, para o addon dailybot. |
Logins, gh, a configuração do Herdr e a identidade git sobrevivem a bash dev.sh rebuild. Com a camada agents, a imagem também traz as três skills do coding-agents-kit (agentkit, agentkit-setup, agentkit-orchestrate), vinculadas ao diretório de skills de cada agente a cada início, então um contêiner recriado as mantém.
O volume de estado (chave de host SSH, ~/.ssh, login do gh, estado do cliente Herdr, histórico) se chama state. Quando vários serviços compartilham um mesmo projeto compose, dê a cada um o próprio nome com [compose] state_volume em dck.toml (ou dck init --state-volume NAME); caso contrário, todos montam o mesmo volume, e o dck doctor avisa.
Agentes entre máquinas
Desde a v0.2.3, dck up configura uma malha bidirecional sem nenhum passo manual, no Docker Desktop:
- Contêineres e o host. Os agentes de dentro alcançam os agentes do Herdr no host, em cada um dos outros contêineres dck e nos outros contêineres loopback que o Herdr do seu host já gerencia — e esses alcançam de volta. Cada par carrega uma chave de host fixada; nada é considerado confiável no primeiro uso.
- Um listener opcional no host.
dck setupoferece, uma única vez, um servidor SSH em nível de usuário em127.0.0.1que aceita somente a chave do dck e é mantido em execução pelo launchd (macOS). Se você já executa um listener loopback, aponte o perfil do host para ele.dck host listener disableo remove. - Sobrevive a rebuilds. O catálogo de máquinas do Herdr do contêiner fica em um volume, então
bash dev.sh rebuildmantém todas as máquinas registradas dentro dele. Desde av0.3.2,rebuild,starterestartexecutam os mesmos passos queup: o contêiner é registrado de novo no Herdr do host, sua chave de host é fixada de novo e a malha é propagada, então um contêiner construído do zero alcança o host e seus pares imediatamente. - Painéis do Codex dentro de um contêiner. Um agente Codex precisa de
HERDR_PEERS_SELF, o id de máquina do contêiner salvo no host, para consultar pares em outras máquinas. Desde av0.3.3, o kit grava esse id a cada registro e os shells de login do contêiner o exportam, então nenhum agente o define à mão;dck doctoraponta qualquer divergência. Desde av0.3.4, as configurações do Codex próprias do contêiner pulam a verificação de atualização do Codex na inicialização e o daemon em segundo plano dele (o kit fixa a versão de cada CLI), sem nunca tocar no home do Codex do seu host nem em um perfil compartilhado. - Respostas também a partir do host.
dck setupinstala um herdr-peers verificado no host, entãodck agentsedck askfuncionam lá, e os agentes do host respondem comherdr-peers reply. - Contêineres que o kit não criou. Liste as chaves públicas com que eles fazem login em
[ssh] authorized_extrano perfil do host, e eles também poderão alcançar os contêineres dck.
Combine-o com o coding-agents-kit no host e no contêiner, e o mesmo ak inicia agentes dos dois lados.
Contas do host dentro do contêiner
Um contêiner pode usar as contas que você já tem no host, do mesmo jeito que o git já funciona pelo agente SSH do host, sem login dentro dele. É opt-in e fica no seu perfil do host, nunca no dck.toml de um repositório:
[agents]
host_profiles = true # default false
host_env_keys = ["ZAI_CODING_API_KEY"] # allow-list of env names to share
Com host_profiles ativado, dck up compartilha apenas os perfis das CLIs que o repositório instala:
- Claude Code por meio de um token de longa duração por perfil:
CLAUDE_CODE_OAUTH_TOKENpara@defaulteCLAUDE_CODE_OAUTH_TOKEN_<SUFFIX>para@name(o sufixo em maiúsculas, com qualquer caractere fora deA-Z,0-9e_convertido em_). - Codex por meio do seu arquivo de autenticação, para
@defaulte para cada perfil. - O arquivo de ambiente do kit, somente leitura e reduzido aos nomes de
host_env_keys.
O home inteiro do agentkit nunca é montado, e perfis que contêm caminhos absolutos do host são ignorados. Um login do Codex compartilhado em leitura e escrita pode ser renovado por dois escritores ao mesmo tempo: mantenha um único agente ativo por conta do Codex. [agents] default_profile no perfil do host (por exemplo { claude = "@work3" }) faz um ak claude sem argumentos lá dentro usar essa conta compartilhada (coding-agents-kit ≥ v0.5.2); um login @default do Claude no macOS fica nas Chaves (Keychain) e não pode ser compartilhado. Desde a v0.3.4, os shells do contêiner também apontam um claude ou codex sem argumentos para essa conta, então os painéis que o Herdr restaura abrem nela em vez de em uma tela de login. Dentro do contêiner, o mesmo ak <kind> @<profile> roda na mesma conta que no host, o que permite a um líder entregar às frentes do contêiner as contas que o ak pick escolheu — veja Executar muitos agentes.
Vários repositórios, um stack de compose
Desde a v0.3.3, um repositório cujo serviço é uma parte de um projeto compose maior (uma API, uma aplicação web, workers e um banco de dados compartilhando um projeto) pode entrar nele sem editar à mão o que o dck renderiza. Tudo é aditivo: um repositório que não define nenhuma dessas chaves é renderizado exatamente como antes.
- Um projeto, um volume de estado por serviço.
[compose] projectnomeia o projeto compartilhado em cada repositório;state_volume,[compose] networkse[compose] volumesmantêm separados o estado de cada serviço e os volumes de dados e as redes do stack. - Um bloco de usuário. As linhas entre
# >>> user:<service> >>>e# <<< user:<service> <<<dentro do serviço do dck são mantidas literalmente: chaves simples para o que o dck não renderiza (depends_on,healthcheck) ex-dck-merge:para as chaves que ele renderiza. Um arquivo com apenas alguns dos marcadores do dck é recusado com a correção, em vez de ser reescrito. - Strings de porta.
ssh_porteportsaceitam expressões do compose como"${API_PORT:-8000}:8000"; elas ficam em127.0.0.1, a menos que a string indique um IP do host. - Builds compartilhados e o seu próprio launcher.
[build] contexte[build] dockerfilecobrem um Dockerfile compartilhado por vários serviços;dev_sh = falsemantém odev.shpróprio do repositório. - Satélites do espaço de trabalho. Desde a
v0.3.5, uma segunda instância do serviço no próprio projeto compose é iniciada e parada pelo dck (dck --project P --compose-file F --service S upoudown), então recebe a mesma chave de host, as mesmas contas, a mesma identidade git e a mesma máquina Herdr que a principal;up --seed-state-from VOLUMEcopia apenas os logins para o volume de estado vazio dela. Em um arquivo de overlay,extendsdeve nomear o arquivo que estende. - Node para os agentes. O Node próprio dos agentes fica em
/opt/dck/nodee nunca substitui o da imagem;[agents] node_first = trueo coloca primeiro no PATH quando as ferramentas do repositório precisam disso.
As chaves SSH do host dentro do contêiner
Algumas ferramentas leem apenas arquivos de chave e ignoram o agente encaminhado: o gh auth login, por exemplo, oferece gerar uma chave nova. Desde a v0.3.2 você pode ativar isso, somente no seu perfil do host (o dck.toml de um repositório não pode defini-lo; dck setup pergunta uma vez, com “não” como padrão):
[ssh]
copy_keys = true # default false
Enquanto estiver ativado, dck up monta o ~/.ssh do host somente leitura em ~/.ssh_host, e cada início copia as chaves id_* dele para o ~/.ssh do contêiner (chaves privadas 0600), mantidas em sincronia com o host. O encaminhamento do agente não muda, e desativá-lo remove as cópias no próximo início. O custo: todo o ~/.ssh do host fica legível dentro do contêiner, e as chaves privadas ficam armazenadas no volume de estado.
Padrões de segurança
- Toda porta publicada se vincula a
127.0.0.1, a menos quedck.tomldefinabind. - Git sobre SSH passa pelo agente SSH do host: o socket dele, nunca um arquivo de chave e nunca um
~/.sshou~/.gitconfigmontado, a menos que você tenha ativadocopy_keysno seu perfil do host. A identidade git vem dos valoresDCK_GIT_*quedck setuppreenche. - As chaves de host SSH são geradas em tempo de execução em um volume por projeto, nunca embutidas em uma imagem; o servidor aceita somente chaves públicas, sem login de root e sem senhas.
- O template não adiciona
cap_add, nem modoprivileged, nem o socket do Docker. - Todo download é fixado por versão e verificado por checksum; a imagem base é fixada por digest.
- A malha do Herdr que permite aos agentes de um contêiner alcançar os demais vem ativada por padrão e está documentada, com suas formas de desativação, no modelo de ameaças do kit. O listener do host permite que o código de um contêiner em execução abra um shell no host como você: ele é opcional, somente loopback, aceita apenas a chave do dck e é removido com
dck host listener disable.
Notas
Opcional e nunca obrigatório. Um repositório é totalmente conforme com zero addons opcionais. Hosts Linux e macOS são suportados; a malha entre contêineres precisa do Docker Desktop.