Addon de devcontainer
Dale al repositorio un contenedor de desarrollo reproducible y aislado, que puedan usar por igual las personas, los editores y los agentes de programación. En DWP v7 (pack v7.9.0) este addon integra devcontainer-kit, un producto MIT que funciona sin Deep Work Plan. Es opcional: un repositorio es plenamente conforme sin él.
Qué proporciona devcontainer-kit
- Una plantilla, basada en la especificación de Dev Containers, que
dck initrenderiza en el repositorio con una estructura fija:.devcontainer/devcontainer.json,docker/local/<service>/Dockerfile,docker/local/docker-compose.yamlydev.sh. Si se vuelve a ejecutar más adelante, concilia y nunca sobrescribe tus ediciones; cualquier cambio en un archivo existente se muestra primero y requiere consentimiento. - El contenedor propio del repositorio. El Dockerfile parte de la imagen oficial del runtime fijada por digest (
node-24,python-3.13odebian) y copia los pasos de compilación del kit endocker/local/<service>/dck/. No interviene ninguna imagen base compartida. dev.shydck.bash dev.sh upconstruye, inicia y se conecta al contenedor desde una terminal normal;shell,rebuild,doctory los demás funcionan con o sin VS Code o Cursor.- Herdr en ambos sentidos. El Herdr del host conecta cada contenedor como una máquina a través de un servidor SSH limitado a loopback, y el contenedor se abre con la barra lateral estándar: App, Editor, Development y Agents. Cada espacio de trabajo y cada panel, incluidos los que se abran después, comienzan en la ruta de la aplicación (
/apppor defecto). Dentro, herdr-peers permite que los agentes consulten a agentes del host y de otros contenedores. - La skill
dck-dockerfile. Un agente crea o regenera el contenedor de un repositorio cuando se le pide y lo demuestra con una compilación real.
Instalación
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
Requisitos: bash 3.2 o posterior y python3 3.11 o posterior en un host Linux o macOS, y Docker con Compose v2 para los comandos del contenedor. Verifica una versión con su asset SHA256SUMS. Fija v1.1.1: v0.2.0 no tiene soporte.
| Elemento | Valor |
|---|---|
| Producto | DailybotHQ/devcontainer-kit, tag v1.1.1, interfaz 2 |
| Clave de registro | devcontainer en .dwp/config.json |
| Configuración por repositorio | .devcontainer/dck.toml |
| Detección | dck doctor --json |
Estable desde v1.0.0. La interfaz pública sigue el versionado semántico y solo cambia de forma incompatible en una nueva versión mayor (y, para los archivos, con un nuevo número de interfaz): los verbos de dck con sus opciones documentadas y sus códigos de salida (0 correcto, 1 fallo, 2 uso, 3 configuración, 4 entorno, 5 rechazado), los esquemas de dck.toml, del perfil del host y de dck doctor --json (interfaz 2), y el contrato de renderizado: los archivos que dck init escribe y gestiona, los marcadores dck:managed y los bloques de usuario que conserva, y el entorno que lee el entrypoint. Nada se rompe al actualizar desde v0.3.7: ejecuta dck init y dck rebuild para que la imagen incluya las nuevas versiones fijadas (herdr-peers v1.1.0, coding-agents-kit v1.1.0 y DeepWorkPlan Vim v1.0.1).
Capas
Todo contenedor incluye las herramientas de desarrollo (git, gh, ripgrep, un servidor SSH, Herdr y herdr-peers) y ningún secreto, salvo que actives las cuentas del host. El resto es una capa que eliges en dck.toml:
| Capa | Predeterminado | Qué agrega |
|---|---|---|
agents |
desactivada | coding-agents-kit desde su versión verificada y las CLI que indiques, cada una con su propio volumen persistente, más los presets classic (claudex, codexx, …) y providers (claude-glm, codex-azure, …). Los agentes se ejecutan en autonomía por defecto: el contenedor es el sandbox. Para desactivarla: AGENTKIT_PERMISSIONS=ask en el .env del servicio. |
editor |
activada | Neovim con DeepWorkPlan Vim fijado por tag; desactivada, deja un editor simple. |
dailybot |
desactivada | La CLI de Dailybot, para el addon dailybot. |
Los inicios de sesión, gh, la configuración de Herdr y la identidad de git sobreviven a bash dev.sh rebuild. Con la capa agents, la imagen también incluye las tres skills de coding-agents-kit (agentkit, agentkit-setup, agentkit-orchestrate), enlazadas en el directorio de skills de cada agente en cada inicio, de modo que un contenedor recreado las conserva.
El volumen de estado (clave de host SSH, ~/.ssh, inicio de sesión de gh, estado del cliente de Herdr, historial) se llama state. Cuando varios servicios comparten un mismo proyecto de compose, dale a cada uno su propio nombre con [compose] state_volume en dck.toml (o dck init --state-volume NAME); de lo contrario, todos montan el mismo volumen, y dck doctor lo advierte.
Agentes entre máquinas
Desde v0.2.3, dck up configura una malla bidireccional sin pasos manuales, en Docker Desktop:
- Contenedores y el host. Los agentes de dentro llegan a los agentes de Herdr del host, de cada uno de los demás contenedores dck y de los otros contenedores loopback que el Herdr de tu host ya gestiona, y estos también llegan de vuelta. Cada par lleva una clave de host fijada; nada se acepta como confiable en el primer uso.
- Un listener opcional en el host.
dck setupofrece, una sola vez, un servidor SSH a nivel de usuario en127.0.0.1que solo acepta la clave de dck y que launchd mantiene en ejecución (macOS). Si ya ejecutas un listener loopback, apunta el perfil del host a él.dck host listener disablelo elimina. - Sobrevive a las reconstrucciones. El catálogo de máquinas de Herdr del contenedor vive en un volumen, así que
bash dev.sh rebuildconserva todas las máquinas registradas dentro. Desdev0.3.2,rebuild,startyrestartejecutan los mismos pasos queup: el contenedor se vuelve a registrar en el Herdr del host, su clave de host se vuelve a fijar y se propaga la malla, de modo que un contenedor construido desde cero llega de inmediato al host y a sus pares. - Paneles de Codex dentro de un contenedor. Un agente Codex necesita
HERDR_PEERS_SELF, el id de máquina del contenedor tal como está guardado en el host, para consultar a pares de otras máquinas. Desdev0.3.3el kit registra ese id en cada registro y los shells de inicio de sesión del contenedor lo exportan, así que ningún agente lo define a mano;dck doctorseñala cualquier discrepancia. Desdev0.3.4las configuraciones de Codex propias del contenedor omiten la comprobación de actualizaciones de Codex al iniciar y su daemon en segundo plano (el kit fija la versión de cada CLI), sin tocar nunca el home de Codex de tu host ni un perfil compartido. - Respuestas también desde el host.
dck setupinstala un herdr-peers verificado en el host, de modo quedck agentsydck askfuncionan allí, y los agentes del host responden conherdr-peers reply. - Contenedores que el kit no creó. Enumera las claves públicas con las que inician sesión en
[ssh] authorized_extradel perfil del host, y también podrán llegar a los contenedores dck.
Combínalo con coding-agents-kit en el host y en el contenedor, y el mismo ak lanza agentes en ambos lados.
Cuentas del host dentro del contenedor
Un contenedor puede usar las cuentas que ya tienes en el host, igual que git ya funciona a través del agente SSH del host, sin iniciar sesión dentro. Es opcional y vive en tu perfil del host, nunca en el dck.toml de un repositorio:
[agents]
host_profiles = true # default false
host_env_keys = ["ZAI_CODING_API_KEY"] # allow-list of env names to share
Con host_profiles activado, dck up comparte solo los perfiles de las CLI que instala el repositorio:
- Claude Code mediante un token de larga duración por perfil:
CLAUDE_CODE_OAUTH_TOKENpara@defaultyCLAUDE_CODE_OAUTH_TOKEN_<SUFFIX>para@name(el sufijo en mayúsculas, y cualquier carácter fuera deA-Z,0-9y_convertido en_). - Codex mediante su archivo de autenticación, para
@defaulty para cada perfil. - El archivo de entorno del kit, de solo lectura y reducido a los nombres de
host_env_keys.
El home completo de agentkit nunca se monta, y se omiten los perfiles que contienen rutas absolutas del host. Un inicio de sesión de Codex compartido en lectura y escritura puede ser renovado por dos escritores a la vez: mantén un solo agente activo por cuenta de Codex. [agents] default_profile en el perfil del host (por ejemplo { claude = "@work3" }) hace que un ak claude sin argumentos dentro del contenedor use esa cuenta compartida (coding-agents-kit ≥ v0.5.2); un inicio de sesión @default de Claude en macOS vive en el Llavero (Keychain) y no se puede compartir. Desde v0.3.4 los shells del contenedor también apuntan un claude o codex sin argumentos a esa cuenta, de modo que los paneles que Herdr restaura se abren en ella en lugar de en una pantalla de inicio de sesión. Dentro del contenedor, el mismo ak <kind> @<profile> se ejecuta con la misma cuenta que en el host, lo que permite a un líder entregar a los carriles del contenedor las cuentas que eligió ak pick; consulta Ejecutar muchos agentes.
Varios repositorios, un stack de compose
Desde v0.3.3, un repositorio cuyo servicio es una parte de un proyecto de compose más grande (una API, una aplicación web, workers y una base de datos que comparten un proyecto) puede unirse a él sin editar a mano lo que dck renderiza. Todo es aditivo: un repositorio que no define ninguna de estas claves se renderiza exactamente igual que antes.
- Un proyecto, un volumen de estado por servicio.
[compose] projectnombra el proyecto compartido en cada repositorio;state_volume,[compose] networksy[compose] volumesmantienen separados el estado de cada servicio y los volúmenes de datos y las redes del stack. - Un bloque de usuario. Las líneas entre
# >>> user:<service> >>>y# <<< user:<service> <<<dentro del servicio de dck se conservan tal cual: claves simples para lo que dck no renderiza (depends_on,healthcheck) yx-dck-merge:para las claves que sí renderiza. Un archivo con solo algunos de los marcadores de dck se rechaza indicando la corrección en lugar de reescribirse. - Cadenas de puertos.
ssh_portyportsaceptan expresiones de compose como"${API_PORT:-8000}:8000"; se quedan en127.0.0.1salvo que la cadena indique una IP del host. - Builds compartidos y tu propio lanzador.
[build] contexty[build] dockerfilecubren un Dockerfile compartido por varios servicios;dev_sh = falseconserva eldev.shpropio del repositorio. - Satélites del espacio de trabajo. Desde
v0.3.5, una segunda instancia del servicio en su propio proyecto de compose se inicia y se detiene a través de dck (dck --project P --compose-file F --service S upodown), así que obtiene la misma clave de host, las mismas cuentas, la misma identidad de git y la misma máquina de Herdr que la principal;up --seed-state-from VOLUMEcopia solo los inicios de sesión en su volumen de estado vacío. En un archivo de superposición,extendsdebe nombrar el archivo que extiende. - Node para los agentes. El Node propio de los agentes vive en
/opt/dck/nodey nunca reemplaza al de la imagen;[agents] node_first = truelo pone primero en el PATH cuando las herramientas del repositorio lo necesitan.
Las claves SSH del host dentro del contenedor
Algunas herramientas solo leen archivos de clave e ignoran el agente reenviado: gh auth login, por ejemplo, ofrece generar una clave nueva. Desde v0.3.2 puedes activarlo, solo en tu perfil del host (el dck.toml de un repositorio no puede definirlo; dck setup lo pregunta una vez, con «no» como respuesta predeterminada):
[ssh]
copy_keys = true # default false
Mientras está activado, dck up monta el ~/.ssh del host en solo lectura en ~/.ssh_host, y cada inicio copia sus claves id_* en el ~/.ssh del contenedor (claves privadas 0600), sincronizadas con el host. El reenvío del agente no cambia, y al desactivarlo las copias se eliminan en el siguiente inicio. El costo: todo el ~/.ssh del host es legible dentro del contenedor, y las claves privadas quedan guardadas en el volumen de estado.
Valores de seguridad predeterminados
- Todo puerto publicado se vincula a
127.0.0.1salvo quedck.tomldefinabind. - Git sobre SSH pasa por el agente SSH del host: su socket, nunca un archivo de clave y nunca un
~/.ssho~/.gitconfigmontado, salvo que hayas activadocopy_keysen tu perfil del host. La identidad de git proviene de los valoresDCK_GIT_*que completadck setup. - Las claves de host SSH se generan en tiempo de ejecución en un volumen por proyecto, nunca se incorporan a una imagen; el servidor solo acepta claves públicas, sin inicio de sesión como root y sin contraseñas.
- La plantilla no agrega
cap_add, ni modoprivileged, ni el socket de Docker. - Cada descarga está fijada por versión y verificada por checksum; la imagen base está fijada por digest.
- La malla de Herdr que permite a los agentes de un contenedor llegar a los demás está activada por defecto y documentada, junto con sus interruptores de desactivación, en el modelo de amenazas del kit. El listener del host permite que el código de un contenedor en ejecución abra una shell en el host con tu usuario: es opcional, solo escucha en loopback, acepta únicamente la clave de dck y se retira con
dck host listener disable.
Notas
Opcional y nunca obligatorio. Un repositorio es plenamente conforme con cero addons opcionales. Se admiten hosts Linux y macOS; la malla entre contenedores necesita Docker Desktop.