docs: fix drift — sync compose/volumes, studio coverage, mempalace link

Audit found README/AGENTS carried a stale compose/volume set that
diverged from the shipped docker-compose.yml (DOCKER_HUB + compose +
.env.example were already consistent — README was the outlier):

- README compose block + 'Volumes and persistence' table: correct volume
  names (devbox-shell-history not -bash-history; devbox-uv at
  ~/.local/share/uv not devbox-uv-tools at /opt/uv-tools — the latter
  would SHADOW the baked mempalace install at UV_TOOL_DIR); add
  devbox-ssh-local + devbox-zoxide; mark devbox-palace/-chroma-cache
  optional; WORKSPACE_PATH/SSH_KEY_PATH (not HOST_WORKSPACE).
- README quickstart: 'compose exec -u developer' (no USER in image; bare
  exec lands a root shell).
- README: pi-studio now 'shipped' not 'planned'; build-pipeline + tag
  table cover -studio + smoke-studio/build-variant-studio.
- AGENTS: backward-compat volume names corrected; repo-layout bullets
  cover pi-studio install + studio-expose + STUDIO_EXPOSE bridge.
- DOCKER_HUB: MemPalace source link -> upstream MemPalace/mempalace
  (matches Dockerfile.base + CHANGELOG refs).

Note: the shipped v1.0.0 CHANGELOG migration note still lists the old
(incorrect) volume names; left as immutable released history.
This commit is contained in:
pi
2026-06-10 23:52:17 +02:00
parent 7d8ee4cea1
commit 9ebb0643c7
3 changed files with 55 additions and 38 deletions
+9 -5
View File
@@ -12,14 +12,17 @@ re-brand of opencode-devbox's `pi-only` variant.
Node.js, Python toolchain, locales, ssh ControlMaster defaults, and Node.js, Python toolchain, locales, ssh ControlMaster defaults, and
`/etc/tmux.conf` with 0-indexed sessions. `/etc/tmux.conf` with 0-indexed sessions.
- `Dockerfile.variant``FROM base-<hash>`, adds pi + companions - `Dockerfile.variant``FROM base-<hash>`, adds pi + companions
(`pi-toolkit`, `pi-extensions`, `pi-fork`, `pi-observational-memory`). (`pi-toolkit`, `pi-extensions`, `pi-fork`, `pi-observational-memory`)
and, when `INSTALL_STUDIO=true`, vendors `pi-studio` to `/opt/pi-studio`
(`-studio` variant).
- `entrypoint.sh` — UID/GID alignment as root, then drops to `developer`. - `entrypoint.sh` — UID/GID alignment as root, then drops to `developer`.
- `entrypoint-user.sh` — per-container start: SSH ControlMaster socket - `entrypoint-user.sh` — per-container start: SSH ControlMaster socket
dir, LAN-access setup, MemPalace init, pi-toolkit + pi-extensions dir, LAN-access setup, MemPalace init, pi-toolkit + pi-extensions
deploy, mempalace-bridge symlink, fork/recall pi-install, skillset deploy, mempalace-bridge symlink, fork/recall + pi-studio pi-install,
optional `studio-expose` bridge (when `STUDIO_EXPOSE=1`), skillset
deploy. deploy.
- `rootfs/` — files baked into the image (bash aliases, inputrc, - `rootfs/` — files baked into the image (bash aliases, inputrc,
setup-lan-access.sh). setup-lan-access.sh, `studio-expose` helper).
- `scripts/smoke-test.sh` — sanity checks run by CI before pushing to Hub. - `scripts/smoke-test.sh` — sanity checks run by CI before pushing to Hub.
- `.gitea/workflows/docker-publish.yml` — two-phase CI (base-decide → - `.gitea/workflows/docker-publish.yml` — two-phase CI (base-decide →
build-base → smoke → build-variant → promote-base-latest → build-base → smoke → build-variant → promote-base-latest →
@@ -129,8 +132,9 @@ deprecated artifacts (to be removed in opencode-devbox v2.0.0).
## Backward compatibility ## Backward compatibility
- The host `~/.mempalace` bind-mount path is unchanged. - The host `~/.mempalace` bind-mount path is unchanged.
- Volume names (`devbox-pi-config`, `devbox-bash-history`, - Volume names (`devbox-pi-config`, `devbox-ssh-local`,
`devbox-nvim-data`, `devbox-uv-tools`, `devbox-chroma-cache`) are `devbox-shell-history`, `devbox-zoxide`, `devbox-nvim-data`,
`devbox-uv`; optional `devbox-palace`, `devbox-chroma-cache`) are
unchanged. unchanged.
- `~/.pi/agent/` layout inside the container is unchanged; existing - `~/.pi/agent/` layout inside the container is unchanged; existing
named volumes work without recreation. named volumes work without recreation.
+1 -1
View File
@@ -151,7 +151,7 @@ Optional volumes for MemPalace (commented out by default — uncomment in `docke
- **pi**: https://github.com/earendil-works/pi - **pi**: https://github.com/earendil-works/pi
- **pi-toolkit**: https://gitea.jordbo.se/joakimp/pi-toolkit - **pi-toolkit**: https://gitea.jordbo.se/joakimp/pi-toolkit
- **pi-extensions**: https://gitea.jordbo.se/joakimp/pi-extensions - **pi-extensions**: https://gitea.jordbo.se/joakimp/pi-extensions
- **MemPalace**: https://github.com/joakimp/mempalace - **MemPalace**: https://github.com/MemPalace/mempalace
## License ## License
+45 -32
View File
@@ -98,7 +98,7 @@ git clone https://gitea.jordbo.se/joakimp/pi-devbox
cd pi-devbox cd pi-devbox
cp .env.example .env # edit if needed cp .env.example .env # edit if needed
docker compose up -d docker compose up -d
docker compose exec devbox bash docker compose exec -u developer devbox bash
``` ```
You're now in the container as user `developer` with `pi` on PATH and You're now in the container as user `developer` with `pi` on PATH and
@@ -236,37 +236,45 @@ services:
container_name: pi-devbox container_name: pi-devbox
stdin_open: true stdin_open: true
tty: true tty: true
env_file: .env env_file:
- .env
environment: environment:
- TZ=${TZ:-Europe/Stockholm}
- TERM=xterm-256color - TERM=xterm-256color
- AWS_PROFILE=${AWS_PROFILE:-} - GITEA_ACCESS_TOKEN=${GITEA_ACCESS_TOKEN:-}
- AWS_REGION=${AWS_REGION:-eu-west-1} - GITEA_HOST=${GITEA_HOST:-}
- GITHUB_PERSONAL_ACCESS_TOKEN=${GITHUB_PERSONAL_ACCESS_TOKEN:-}
volumes: volumes:
# Workspace: your host source tree, read-write # Workspace: your host source tree
- ${HOST_WORKSPACE:-./workspace}:/workspace:rw - ${WORKSPACE_PATH:-.}:/workspace
# SSH keys: read-only from host # SSH keys: read-only from host
- ${HOME}/.ssh:/home/developer/.ssh:ro - ${SSH_KEY_PATH:-~/.ssh}:/home/developer/.ssh:ro
# AWS config: read-only from host
- ${HOME}/.aws:/home/developer/.aws:ro
# MemPalace: bind-mounted so host pi and container pi share a brain
- ${HOME}/.mempalace:/home/developer/.mempalace:rw
# Per-container persistent state # Per-container persistent state
- devbox-pi-config:/home/developer/.pi - devbox-pi-config:/home/developer/.pi
- devbox-bash-history:/home/developer/.cache/bash - devbox-ssh-local:/home/developer/.ssh-local
- devbox-shell-history:/home/developer/.cache/bash
- devbox-zoxide:/home/developer/.local/share/zoxide
- devbox-nvim-data:/home/developer/.local/share/nvim - devbox-nvim-data:/home/developer/.local/share/nvim
- devbox-uv-tools:/opt/uv-tools - devbox-uv:/home/developer/.local/share/uv
- devbox-chroma-cache:/home/developer/.cache/chroma # Optional (uncomment to enable):
# - ~/.aws:/home/developer/.aws # AWS creds
# - devbox-palace:/home/developer/.mempalace # persist palace
# - devbox-chroma-cache:/home/developer/.cache/chroma # embedding cache
volumes: volumes:
devbox-pi-config: devbox-pi-config:
devbox-bash-history: devbox-ssh-local:
devbox-shell-history:
devbox-zoxide:
devbox-nvim-data: devbox-nvim-data:
devbox-uv-tools: devbox-uv:
devbox-chroma-cache: # devbox-palace:
# devbox-chroma-cache:
``` ```
See `.env.example` in the repo for available environment variables. See `docker-compose.yml` and `.env.example` in the repo for the full
template (build-from-source args, LAN-jump and skillset mounts, MemPalace
persistence). To share one palace between host pi and the container,
bind-mount your host `~/.mempalace` to `/home/developer/.mempalace`.
## uv-driven REPL recipes ## uv-driven REPL recipes
@@ -322,15 +330,16 @@ to refresh.
| Path inside container | Volume | What survives | | Path inside container | Volume | What survives |
|---|---|---| |---|---|---|
| `/workspace` | host bind-mount | host filesystem | | `/workspace` | host bind-mount (`WORKSPACE_PATH`) | host filesystem |
| `~/.ssh` | host bind-mount (read-only) | host filesystem | | `~/.ssh` | host bind-mount (read-only, `SSH_KEY_PATH`) | host filesystem |
| `~/.aws` | host bind-mount (read-only) | host filesystem |
| `~/.mempalace` | host bind-mount | host filesystem |
| `~/.pi` | named volume `devbox-pi-config` | `down -v` wipes | | `~/.pi` | named volume `devbox-pi-config` | `down -v` wipes |
| `~/.cache/bash` | named volume | `down -v` wipes | | `~/.ssh-local` | named volume `devbox-ssh-local` | `down -v` wipes |
| `~/.local/share/nvim` | named volume | `down -v` wipes | | `~/.cache/bash` | named volume `devbox-shell-history` | `down -v` wipes |
| `/opt/uv-tools` | named volume | `down -v` wipes | | `~/.local/share/zoxide` | named volume `devbox-zoxide` | `down -v` wipes |
| `~/.cache/chroma` | named volume | `down -v` wipes | | `~/.local/share/nvim` | named volume `devbox-nvim-data` | `down -v` wipes |
| `~/.local/share/uv` | named volume `devbox-uv` | `down -v` wipes |
| `~/.mempalace` | host bind-mount or `devbox-palace` (optional) | host / volume |
| `~/.cache/chroma` | `devbox-chroma-cache` (optional) | `down -v` wipes |
Anything not on a volume is on the writable layer and is lost on Anything not on a volume is on the writable layer and is lost on
container recreate. container recreate.
@@ -386,9 +395,9 @@ set -g pane-base-index 0
``` ```
This is the default tmux indexing. It's baked here because `pi-studio` This is the default tmux indexing. It's baked here because `pi-studio`
(planned for `:latest-studio`) hard-codes its tmux send target to (shipped in the `:latest-studio` variant) hard-codes its tmux send
`<session>:0.0`. If you override `base-index` to 1 in a personal target to `<session>:0.0`. If you override `base-index` to 1 in a
`~/.tmux.conf`, pi-studio will fail with "can't find window: 0". personal `~/.tmux.conf`, pi-studio will fail with "can't find window: 0".
## AWS Bedrock auth ## AWS Bedrock auth
@@ -411,8 +420,11 @@ pi-devbox is built from this repo's CI in two phases:
where `<hash>` is content-addressed over `Dockerfile.base`, where `<hash>` is content-addressed over `Dockerfile.base`,
`rootfs/`, and `entrypoint*.sh`. Rebuilt only when these change. `rootfs/`, and `entrypoint*.sh`. Rebuilt only when these change.
2. **Variant** (`Dockerfile.variant`) — `FROM ${BASE_IMAGE}` and adds 2. **Variant** (`Dockerfile.variant`) — `FROM ${BASE_IMAGE}` and adds
the pi install. The `:latest` and `vX.Y.Z` tags are produced from the pi install (+ pi-studio when `INSTALL_STUDIO=true`). The `:latest`
this layer; future Studio variants will extend further. / `vX.Y.Z` and `:latest-studio` / `vX.Y.Z-studio` tags are produced
from this layer. The studio variant builds via independent
`smoke-studio` + `build-variant-studio` CI jobs that gate only the
`-studio` tags.
Tag naming: Tag naming:
@@ -421,6 +433,7 @@ Tag naming:
| `base-<hash>` | base image — internal building block | | `base-<hash>` | base image — internal building block |
| `base-latest` | promoted alias of the most recent base | | `base-latest` | promoted alias of the most recent base |
| `latest`, `vX.Y.Z` | variant: base + pi | | `latest`, `vX.Y.Z` | variant: base + pi |
| `latest-studio`, `vX.Y.Z-studio` | variant: base + pi + pi-studio |
CI resolves `PI_VERSION` to a concrete version string before building CI resolves `PI_VERSION` to a concrete version string before building
to defeat a registry-buildcache hit on `npm install -g to defeat a registry-buildcache hit on `npm install -g