refactor: re-brand the opencode-devbox with-pi variant (single source of truth)
pi-devbox no longer installs pi itself. The Dockerfile is now a thin FROM joakimp/opencode-devbox:latest-with-pi (overridable via BASE_IMAGE), inheriting pi + pi-toolkit + pi-extensions + pi-fork (fork) + pi-observational-memory (recall) + the LAN-access helper + all base tooling from the single source of truth. Eliminates the install-logic duplication that drifted against opencode-devbox/Dockerfile.variant (decision #3). Consequences (documented in CHANGELOG/AGENTS): - The image now ALSO contains opencode (with-pi has INSTALL_OPENCODE=true). A leaner pi-only image would need a dedicated pi-only variant upstream. - Publish ordering: release opencode-devbox first so latest-with-pi carries the target pi version, THEN tag this repo. The smoke test asserts pi --version matches the tag (EXPECTED_PI_VERSION) and fails loudly if the base is stale — turning the version coupling into an enforced ordering guard. CI: drop PI_VERSION build-arg (Dockerfile installs nothing); keep tag->version resolution to feed the smoke base-freshness guard. Smoke adds fork/recall clone + node_modules + settings.json registration checks; size threshold 2200 -> 2900 MB (now tracks with-pi). Docs updated across README, AGENTS, DOCKER_HUB, .env.example, docker-compose.
This commit is contained in:
@@ -9,7 +9,11 @@ A Docker container with [pi coding-agent](https://github.com/earendil-works/pi)
|
||||
|
||||
## What's inside
|
||||
|
||||
Inherited from `opencode-devbox:base-latest`:
|
||||
pi-devbox is a re-brand of the **opencode-devbox `with-pi` variant** — it `FROM`s
|
||||
`opencode-devbox:latest-with-pi` and adds no layers of its own. Everything below
|
||||
is inherited from that single source of truth.
|
||||
|
||||
Base tooling:
|
||||
|
||||
- **Debian trixie** (current stable)
|
||||
- **Node.js** (LTS), **uv** (Python), **rustup** (Rust on-demand)
|
||||
@@ -18,15 +22,18 @@ Inherited from `opencode-devbox:base-latest`:
|
||||
- **Gitea MCP** server
|
||||
- **Dev tools**: neovim (LazyVim), tmux, bat, eza, fzf, zoxide, ripgrep, jq, git-lfs, make
|
||||
- **Shell**: bash with history tuning, prefix-search, fzf/zoxide integration
|
||||
- **Host-OS-agnostic LAN access** — on VM-backed hosts (macOS OrbStack / Docker Desktop) the entrypoint sets up the host as an SSH jump so you can reach LAN peers (`dssh` alias; `DEVBOX_LAN_ACCESS`/`HOST_SSH_USER` env). No-op on native Linux.
|
||||
|
||||
Added by pi-devbox:
|
||||
pi and companions:
|
||||
|
||||
- **pi** ([`@earendil-works/pi-coding-agent`](https://www.npmjs.com/package/@earendil-works/pi-coding-agent)) — baked at `/usr/bin/pi`, version pinned at build time
|
||||
- **pi** ([`@earendil-works/pi-coding-agent`](https://www.npmjs.com/package/@earendil-works/pi-coding-agent)) — baked at `/usr/bin/pi`, version pinned by the with-pi base build
|
||||
- **[pi-toolkit](https://gitea.jordbo.se/joakimp/pi-toolkit)** — mosh/tmux-friendly keybindings (Shift+Enter, Ctrl+J, Alt+J newline), AWS env loader, settings template
|
||||
- **[pi-extensions](https://gitea.jordbo.se/joakimp/pi-extensions)** — 7 extensions: `ext-toggle`, `mcp-loader`, `todo`, `ssh-controlmaster`, `notify`, `git-checkpoint`, `confirm-destructive`
|
||||
- **`fork` tool** ([pi-fork](https://github.com/elpapi42/pi-fork)) and **`recall` tool** ([pi-observational-memory](https://github.com/elpapi42/pi-observational-memory)) — baked into `/opt` and registered at runtime
|
||||
- **mempalace bridge** — auto-symlinked MCP extension so pi reads/writes the same palace as opencode
|
||||
- **opencode** — also present, since the image FROMs the with-pi variant
|
||||
|
||||
The entrypoint deploys all of these on first container start. Idempotent and preserves user edits.
|
||||
The entrypoint deploys/registers all of these on first container start. Idempotent and preserves user edits.
|
||||
|
||||
---
|
||||
|
||||
@@ -187,6 +194,8 @@ All config flows through `.env`. The full list (with annotations) is in [`.env.e
|
||||
| `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` | (unset) | AWS Bedrock static creds |
|
||||
| `GITEA_ACCESS_TOKEN` / `GITEA_HOST` | (unset) | Gitea MCP server (optional) |
|
||||
| `GITHUB_PERSONAL_ACCESS_TOKEN` | (unset) | GitHub MCP server / git ops over HTTPS |
|
||||
| `DEVBOX_LAN_ACCESS` | `auto` | LAN-access mode: `auto` (jump only on VM-backed hosts), `jump`, `off` |
|
||||
| `HOST_SSH_USER` | (unset) | Host username for the LAN SSH jump (see opencode-devbox README) |
|
||||
| `LANG` / `LANGUAGE` / `LC_ALL` | `en_US.UTF-8` | Locale override |
|
||||
|
||||
---
|
||||
@@ -197,34 +206,35 @@ Tags follow the pi npm package version: `v0.74.0`, `v0.75.0`, … `latest` alway
|
||||
|
||||
Container-level rebuilds on the same pi version (security updates, base bumps, fixes) get a letter suffix: `v0.74.0b`, `v0.74.0c`, …
|
||||
|
||||
When the upstream [pi npm package](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) cuts a new version, this image is rebuilt and re-tagged to match.
|
||||
The pi binary is inherited from `opencode-devbox:latest-with-pi`, so a release of this image must be preceded by an opencode-devbox release that bakes the target pi version into `latest-with-pi`. The smoke test enforces this (it asserts `pi --version` matches the tag).
|
||||
|
||||
---
|
||||
|
||||
## Building from source
|
||||
|
||||
If you want to pin a specific pi version, change the base image, or hack on the Dockerfile:
|
||||
This image is a thin re-brand of the with-pi variant, so building it just pulls
|
||||
the base. To pin a specific with-pi build or hack on it:
|
||||
|
||||
```bash
|
||||
git clone https://gitea.jordbo.se/joakimp/pi-devbox
|
||||
cd pi-devbox
|
||||
|
||||
# Edit Dockerfile or override via build args:
|
||||
# Default tracks latest-with-pi; override BASE_IMAGE to pin a build:
|
||||
docker compose build \
|
||||
--build-arg PI_VERSION=0.73.0 \
|
||||
--build-arg BASE_IMAGE=joakimp/opencode-devbox:base-latest
|
||||
--build-arg BASE_IMAGE=joakimp/opencode-devbox:v1.15.13-with-pi
|
||||
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
To change the pi version, the pi extensions, or the install logic, edit
|
||||
`opencode-devbox/Dockerfile.variant` (the single source of truth) and release
|
||||
opencode-devbox — not this repo.
|
||||
|
||||
Build args supported:
|
||||
|
||||
| Arg | Default | Effect |
|
||||
|---|---|---|
|
||||
| `BASE_IMAGE` | `joakimp/opencode-devbox:base-latest` | Parent image — set to `joakimp/opencode-devbox:base-<sha>` for reproducible builds |
|
||||
| `PI_VERSION` | `latest` | npm version of `@earendil-works/pi-coding-agent` |
|
||||
| `PI_TOOLKIT_REF` | `main` | Git ref for [pi-toolkit](https://gitea.jordbo.se/joakimp/pi-toolkit) |
|
||||
| `PI_EXTENSIONS_REF` | `main` | Git ref for [pi-extensions](https://gitea.jordbo.se/joakimp/pi-extensions) |
|
||||
| `BASE_IMAGE` | `joakimp/opencode-devbox:latest-with-pi` | Parent image — set to a `:vX.Y.Z-with-pi` tag or a digest for reproducible builds |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user