c139be326f
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.
4.4 KiB
4.4 KiB
AGENTS.md — pi-devbox
Container image that re-brands the opencode-devbox with-pi variant as a pi-focused image. As of 2026-06-03 it no longer installs pi itself.
Repository layout
Dockerfile— thin re-brand:FROM opencode-devbox:latest-with-pi(overridable viaBASE_IMAGEarg). No install logic of its own — pi + companions are inherited from the with-pi variant. This refactor removed the install-logic duplication that used to drift againstopencode-devbox/Dockerfile.variant.docker-compose.yml— compose file for local use.env.example— environment variable templatescripts/smoke-test.sh— sanity checks run by CI before pushing to Docker Hub.gitea/workflows/docker-publish.yml— CI pipeline: smoke amd64 → multi-arch push → update Hub description
Versioning scheme
- Tags follow the pi npm version:
v{pi_version}[letter] - The image inherits pi from
latest-with-pi, so the publish ordering matters: rebuild opencode-devbox first solatest-with-picarries the target pi version, then tag this repo. The smoke test assertspi --versionmatches the tag (EXPECTED_PI_VERSION) and fails loudly if the base is stale. - Docker Hub:
joakimp/pi-devbox:vX.Y.Z+joakimp/pi-devbox:latest
Release-day checklist
- Ensure opencode-devbox has been released so
joakimp/opencode-devbox:latest-with-picarries the target pi version (and the fork/recall extensions). This is the hard prerequisite — the smoke guard enforces it. - Update
CHANGELOG.md: promoteUnreleased→vX.Y.Z — YYYY-MM-DD - Add fresh
## Unreleasedsection - Commit, tag
vX.Y.Z, push tag → CI fires automatically
When drafting CHANGELOG entries, pull pi's release notes from the
CHANGELOG.md shipped inside the npm tarball:
cd /tmp && npm pack @earendil-works/pi-coding-agent@<version>
tar -xzf earendil-works-pi-coding-agent-<version>.tgz package/CHANGELOG.md
head -40 package/CHANGELOG.md
Pi's CHANGELOG has rich New Features / Added / Changed / Fixed sections
per version. Don't try to derive notes from the npm registry metadata
(npm view) — it doesn't include the changelog body.
Key facts
- Base image:
joakimp/opencode-devbox:latest-with-pi— the single source of truth for the pi install + companions. Rebuilt whenever opencode-devbox releases. - Inherited content: pi (
/usr/bin/pi), pi-toolkit, pi-extensions, pi-fork (fork), pi-observational-memory (recall), the mempalace bridge, the LAN-access helper, entrypoints, and all base dev tooling. Because it FROMs with-pi, the image also contains opencode. - Companion repos: cloned to
/opt/by the with-pi build;entrypoint-user.sh(inherited) deploys/registers them on container start. - MemPalace: fully operational — inherited from base; bridge extension deployed by entrypoint.
Conventions
- This repo no longer installs pi or clones companion repos — do not re-add that logic here. Change it in
opencode-devbox/Dockerfile.variant(the single source of truth) instead. - The smoke test threshold is 2900 MB (tracks the with-pi variant) — update if the image legitimately grows past it.
- The CI still resolves the tag's pi version, but only to feed
EXPECTED_PI_VERSIONto the smoke base-freshness guard — it is no longer passed as a build-arg (nothing in the Dockerfile consumes it). - To pin a specific base build instead of tracking
latest-with-pi, override theBASE_IMAGEarg (a version tag or a digest).
Documentation drift sweep
Before committing any non-trivial change, check that prose still matches code. Drift hotspots in this repo:
README.md— quick-start examples, env-var table, base-image reference (must matchFROMinDockerfile), "what's inside" (now includes opencode + fork/recall).AGENTS.md(this file) —Key factsblock (base-image tag, inherited content), smoke-test threshold number.CHANGELOG.md— promoteUnreleasedonly on tag, but record post-release fixes in a freshUnreleasedblock.DOCKER_HUB.md— hand-maintained slim Hub description; sync anything user-facing that changes (env vars, run command, base image)..env.example— hand-updated, must match Dockerfile/entrypoint env vars (including the inherited LAN-access knobs).DockerfileBASE_IMAGEARG default — the with-pi tag this image tracks.
Quick triage: git diff --name-only HEAD | xargs -I{} grep -l 'thing-you-changed' README.md AGENTS.md DOCKER_HUB.md CHANGELOG.md .env.example.