Addon devcontainer
Dai al repository un container di sviluppo riproducibile e isolato, che persone, editor e agenti di codice possano usare allo stesso modo. In DWP v7 (pack v7.9.0) questo addon integra devcontainer-kit, un prodotto MIT che funziona senza Deep Work Plan. È opzionale: un repository è pienamente conforme anche senza di esso.
Cosa fornisce devcontainer-kit
- Un template, basato sulla specifica Dev Containers, che
dck initgenera nel repository con una struttura fissa:.devcontainer/devcontainer.json,docker/local/<service>/Dockerfile,docker/local/docker-compose.yamledev.sh. Rieseguito in seguito, riconcilia e non sovrascrive mai le tue modifiche; qualsiasi modifica a un file esistente viene mostrata prima e richiede il consenso. - Il container proprio del repository. Il Dockerfile parte dall’immagine ufficiale del runtime fissata per digest (
node-24,python-3.13odebian) e copia i passaggi di build del kit indocker/local/<service>/dck/. Non è coinvolta alcuna immagine di base condivisa. dev.shedck.bash dev.sh upcostruisce, avvia e si collega al container da un semplice terminale;shell,rebuild,doctore gli altri funzionano con o senza VS Code o Cursor.- Herdr in entrambi i sensi. L’Herdr dell’host collega ogni container come una macchina tramite un server SSH limitato al loopback, e il container si apre con la barra laterale standard: App, Editor, Development e Agents. Ogni workspace e ogni pannello, compresi quelli aperti in seguito, partono dal percorso dell’applicazione (
/appper impostazione predefinita). All’interno, herdr-peers permette agli agenti di interpellare agenti sull’host e in altri container. - La skill
dck-dockerfile. Un agente crea o rigenera il container di un repository su richiesta e lo dimostra con una build reale.
Installazione
git clone --branch v1.1.1 https://github.com/DailybotHQ/devcontainer-kit && ./devcontainer-kit/install.sh
cd your-repo && dck init && bash dev.sh up
Requisiti: bash 3.2 o successivo e python3 3.11 o successivo su un host Linux o macOS, e Docker con Compose v2 per i comandi del container. Verifica una release con il suo asset SHA256SUMS. Fissa v1.1.1: v0.2.0 non è supportata.
| Elemento | Valore |
|---|---|
| Prodotto | DailybotHQ/devcontainer-kit, tag v1.1.1, interfaccia 2 |
| Chiave di registro | devcontainer in .dwp/config.json |
| Configurazione per repository | .devcontainer/dck.toml |
| Rilevamento | dck doctor --json |
Stabile da v1.0.0. L’interfaccia pubblica segue il versionamento semantico e cambia in modo incompatibile solo in una nuova versione major (e, per i file, con un nuovo numero di interfaccia): i verbi di dck con i relativi flag documentati e codici di uscita (0 ok, 1 fallito, 2 uso, 3 configurazione, 4 ambiente, 5 rifiutato), gli schemi di dck.toml, del profilo host e di dck doctor --json (interfaccia 2), e il contratto di rendering — i file che dck init scrive e possiede, i marcatori dck:managed e i blocchi utente che preserva, e l’ambiente che legge l’entrypoint. Nulla si rompe da v0.3.7: esegui dck init e dck rebuild perché l’immagine includa le nuove versioni fissate (herdr-peers v1.1.0, coding-agents-kit v1.1.0 e DeepWorkPlan Vim v1.0.1).
Livelli
Ogni container include gli strumenti di sviluppo (git, gh, ripgrep, un server SSH, Herdr e herdr-peers) e nessun segreto, a meno che tu non attivi gli account host. Il resto è un livello che scegli in dck.toml:
| Livello | Predefinito | Cosa aggiunge |
|---|---|---|
agents |
disattivato | coding-agents-kit dalla sua release verificata e le CLI che elenchi, ciascuna con il proprio volume persistente, più i preset classic (claudex, codexx, …) e providers (claude-glm, codex-azure, …). Gli agenti girano in autonomia per impostazione predefinita: il container è la sandbox. Per disattivarla: AGENTKIT_PERMISSIONS=ask nel .env del servizio. |
editor |
attivato | Neovim con DeepWorkPlan Vim fissato per tag; disattivato, lascia un editor semplice. |
dailybot |
disattivato | La CLI di Dailybot, per l’addon dailybot. |
Gli accessi, gh, la configurazione di Herdr e l’identità git sopravvivono a bash dev.sh rebuild. Con il livello agents, l’immagine include anche le tre skill di coding-agents-kit (agentkit, agentkit-setup, agentkit-orchestrate), collegate nella directory delle skill di ogni agente a ogni avvio, così un container ricreato le mantiene.
Il volume di stato (chiave host SSH, ~/.ssh, login di gh, stato del client Herdr, cronologia) si chiama state. Quando più servizi condividono un unico progetto compose, assegna a ciascuno un nome proprio con [compose] state_volume in dck.toml (o dck init --state-volume NAME); altrimenti montano tutti lo stesso volume, e dck doctor lo segnala.
Agenti tra macchine diverse
Da v0.2.3, dck up configura una mesh bidirezionale senza passaggi manuali, su Docker Desktop:
- Container e host. Gli agenti all’interno raggiungono gli agenti Herdr sull’host, in ogni altro container dck e negli altri container loopback che l’Herdr del tuo host gestisce già, e questi li raggiungono a loro volta. Ogni peer porta una chiave host fissata; nulla viene considerato attendibile al primo utilizzo.
- Un listener opzionale sull’host.
dck setuppropone, una sola volta, un server SSH a livello utente su127.0.0.1che accetta solo la chiave dck ed è mantenuto in esecuzione da launchd (macOS). Se esegui già un listener loopback, punta invece il profilo host verso di esso.dck host listener disablelo rimuove. - Sopravvive alle ricostruzioni. Il catalogo delle macchine Herdr del container risiede su un volume, quindi
bash dev.sh rebuildmantiene ogni macchina registrata al suo interno. Dav0.3.2,rebuild,starterestarteseguono gli stessi passaggi diup: il container viene registrato di nuovo presso l’Herdr dell’host, la sua chiave host viene fissata di nuovo e la mesh viene distribuita, così un container costruito da zero raggiunge subito l’host e i suoi peer. - Pannelli Codex dentro un container. Un agente Codex ha bisogno di
HERDR_PEERS_SELF, l’id macchina del container così come è salvato sull’host, per interpellare peer su altre macchine. Dav0.3.3il kit salva quell’id a ogni registrazione e le shell di login del container lo esportano, quindi nessun agente lo imposta a mano;dck doctorsegnala una discrepanza. Dav0.3.4le configurazioni Codex proprie del container saltano il controllo degli aggiornamenti di Codex all’avvio e il suo daemon in background (il kit fissa la versione di ogni CLI), senza mai toccare la home Codex del tuo host né un profilo condiviso. - Risposte anche dall’host.
dck setupinstalla sull’host un herdr-peers verificato, cosìdck agentsedck askfunzionano anche lì e gli agenti dell’host rispondono conherdr-peers reply. - Container non creati dal kit. Elenca le chiavi pubbliche con cui accedono in
[ssh] authorized_extranel profilo host, e potranno raggiungere anche i container dck.
Abbinalo a coding-agents-kit sull’host e nel container, e lo stesso ak avvia agenti su entrambi i lati.
Gli account host nel container
Un container può usare gli account che hai già sull’host, come git funziona già tramite l’agente SSH dell’host, senza alcun login all’interno. È opt-in e si trova nel tuo profilo host, mai nel dck.toml di un repository:
[agents]
host_profiles = true # default false
host_env_keys = ["ZAI_CODING_API_KEY"] # allow-list of env names to share
Con host_profiles attivo, dck up condivide solo i profili delle CLI che il repository installa:
- Claude Code tramite un token di lunga durata per profilo:
CLAUDE_CODE_OAUTH_TOKENper@defaulteCLAUDE_CODE_OAUTH_TOKEN_<SUFFIX>per@name(il suffisso in maiuscolo, con ogni carattere al di fuori diA-Z,0-9e_convertito in_). - Codex tramite il suo file di autenticazione, per
@defaulte per ogni profilo. - Il file di ambiente del kit, di sola lettura e ridotto ai nomi in
host_env_keys.
L’intera home di agentkit non viene mai montata, e i profili che contengono percorsi assoluti dell’host vengono saltati. Un login Codex condiviso in lettura e scrittura può essere rinnovato da due scrittori contemporaneamente: tieni un solo agente attivo per account Codex. [agents] default_profile nel profilo host (per esempio { claude = "@work3" }) fa sì che un semplice ak claude all’interno usi quell’account condiviso (coding-agents-kit ≥ v0.5.2); un login Claude @default su macOS risiede nel Portachiavi (Keychain) e non può essere condiviso. Da v0.3.4 le shell del container puntano anche un semplice claude o codex a quell’account, così i pannelli che Herdr ripristina si aprono su di esso invece che su una schermata di login. Nel container, lo stesso ak <kind> @<profile> gira sullo stesso account che sull’host, ed è ciò che permette a un lead di affidare alle corsie del container gli account scelti da ak pick — vedi Eseguire molti agenti.
Più repository, un solo stack compose
Da v0.3.3, un repository il cui servizio è una parte di un progetto compose più ampio (un’API, un’app web, worker e un database che condividono un unico progetto) può unirsi a esso senza modificare a mano ciò che dck genera. Tutto è additivo: un repository che non imposta nessuna di queste chiavi viene generato esattamente come prima.
- Un progetto, un volume di stato per servizio.
[compose] projectindica il progetto condiviso in ogni repository;state_volume,[compose] networkse[compose] volumestengono separati lo stato di ciascun servizio e i volumi di dati e le reti dello stack. - Un blocco utente. Le righe tra
# >>> user:<service> >>>e# <<< user:<service> <<<all’interno del servizio dck vengono mantenute alla lettera: chiavi semplici per ciò che dck non genera (depends_on,healthcheck), ex-dck-merge:per le chiavi che genera. Un file con solo alcuni dei marcatori di dck viene rifiutato indicando la correzione, invece di essere riscritto. - Porte come stringhe.
ssh_porteportsaccettano espressioni compose come"${API_PORT:-8000}:8000"; restano su127.0.0.1a meno che la stringa non indichi un IP dell’host. - Build condivise e il tuo launcher.
[build] contexte[build] dockerfilecoprono un Dockerfile condiviso da più servizi;dev_sh = falsemantiene ildev.shproprio del repository. - Satelliti del workspace. Da
v0.3.5, una seconda istanza del servizio nel proprio progetto compose si avvia e si arresta tramite dck (dck --project P --compose-file F --service S upodown), così ottiene la stessa chiave host, gli stessi account, la stessa identità git e la stessa macchina Herdr di quella principale;up --seed-state-from VOLUMEcopia solo i login nel suo volume di stato vuoto. In un file di overlay,extendsdeve indicare il file che estende. - Node per gli agenti. Il Node degli agenti risiede in
/opt/dck/nodee non sostituisce mai quello dell’immagine;[agents] node_first = truelo mette per primo nel PATH quando gli strumenti del repository lo richiedono.
Le chiavi SSH dell’host nel container
Alcuni strumenti leggono solo file di chiave e ignorano l’agente inoltrato: gh auth login, per esempio, propone di generare una nuova chiave. Da v0.3.2 puoi attivarlo come opt-in, solo nel tuo profilo host (il dck.toml di un repository non può impostarlo; dck setup lo chiede una volta, con risposta predefinita no):
[ssh]
copy_keys = true # default false
Finché è attivo, dck up monta in sola lettura il ~/.ssh dell’host in ~/.ssh_host, e a ogni avvio ne copia le chiavi id_* nel ~/.ssh del container (chiavi private 0600), mantenendole allineate con l’host. L’inoltro dell’agente resta invariato, e disattivandolo le copie vengono rimosse all’avvio successivo. Il costo: l’intero ~/.ssh dell’host è leggibile all’interno del container, e le chiavi private restano nel volume di stato.
Impostazioni di sicurezza predefinite
- Ogni porta pubblicata si associa a
127.0.0.1, a meno chedck.tomlnon impostibind. - Git su SSH passa attraverso l’agente SSH dell’host: il suo socket, mai un file di chiave e mai un
~/.ssho un~/.gitconfigmontato, a meno che tu non abbia attivatocopy_keysnel tuo profilo host. L’identità git deriva dai valoriDCK_GIT_*chedck setupcompila. - Le chiavi host SSH vengono generate a runtime in un volume per progetto, mai incorporate in un’immagine; il server accetta solo chiavi pubbliche, senza login root e senza password.
- Il template non aggiunge
cap_add, né la modalitàprivileged, né il socket di Docker. - Ogni download è fissato per versione e verificato tramite checksum; l’immagine di base è fissata per digest.
- La mesh di Herdr che permette agli agenti di un container di raggiungere gli altri è attiva per impostazione predefinita ed è documentata, con i relativi interruttori di disattivazione, nel modello delle minacce del kit. Il listener dell’host permette al codice di un container in esecuzione di aprire una shell sull’host con la tua identità: è opt-in, solo loopback, accetta solo la chiave dck e si rimuove con
dck host listener disable.
Note
Opzionale e mai richiesto. Un repository è pienamente conforme con zero addon opzionali. Sono supportati host Linux e macOS; la mesh tra container richiede Docker Desktop.