CLI Reference

add compose / add docker

Regenerate compose.yml, or just the Dockerfile/.dockerignore, standalone into an existing project.
go tool gpsystem add compose
go tool gpsystem add docker

new project already ships the full containerized dev stack (compose.yml, Dockerfile, .dockerignore). These two commands (re)generate that infrastructure standalone, without touching any application code: for a project where the files were deleted, or to rebuild compose.yml cleanly after manual edits drifted from the generated shape.

add compose

Renders compose.yml from scratch: the base dev stack (postgres, redis, mailpit, rustfs, rustfs-init, migrate, worker) plus one app service for every module recorded in the manifest (gpsystem.yaml), in sorted order. It also backfills the .env.example # gpsystem:env block if it's missing.

go tool gpsystem add compose

Refuses to overwrite an existing compose.yml unless --force is given: regeneration replaces the whole file, so any service you added by hand below the # gpsystem:services anchor is lost. If you only need to wire one new module into an existing compose.yml, new module already does that via anchor insertion; reach for add compose when you want a clean rebuild instead.

go tool gpsystem add compose --force

If no Dockerfile is present, the command prints a note pointing at add docker: every service in compose.yml builds from it.

add docker

Renders the multi-stage Dockerfile (development/build/production targets) and .dockerignore that compose.yml builds against.

go tool gpsystem add docker
go tool gpsystem add docker --force   # overwrite both files

Both files are written atomically as one plan: with an existing Dockerfile or .dockerignore and no --force, the whole run aborts before writing either.

Kit-replace wiring

Both commands recover the local kit path from your go.mod's replace directive (the one --kit-replace wrote at new project time), the same way new module does. Regenerating on a machine without that replace directive (e.g. once the kit is no longer pre-1.0 and consumed via a real version) simply omits the additional_contexts/bind-mount lines; this is expected, not a bug.

Older projects

add compose reads module names from gpsystem.yaml's modules map, the same source new module writes to. A project with zero modules recorded still gets the base stack; a note reminds you that new module adds each app service.

Copyright © 2026