feat: ship nano + micro (non-modal editors) alongside nvim
Lint workflows / actionlint (push) Successful in 13s

The image shipped only nvim (EDITOR=nvim), a modal vi-style editor. Not
everyone is comfortable with vi keybindings, so add both a classic and a
modern non-modal option:

- nano (apt): ~2.8 MB installed; deps (libc6, libncursesw6, libtinfo6)
  already present via nvim/less/htop/tmux, so no extra packages pulled in.
- micro: ~12 MB single static Go binary from GitHub releases (same pattern
  as bat/eza/zoxide). Desktop-style keys (Ctrl+S/Ctrl+Q), mouse, syntax
  highlighting. ARG MICRO_VERSION pins; defaults to latest.

Combined ~15 MB (<0.5% of the ~3.2 GB image). EDITOR stays nvim; both new
editors are opt-in (export EDITOR=micro | nano). Uses the canonical
micro-editor/micro URL because the old zyedidia/micro org rename makes
/releases/latest redirect to another /latest, defeating the tag-parsing
latest-resolution idiom.

Base-image change, so it lands on the next base-<hash> rebuild. Updates
README tool table + EDITOR note, CHANGELOG (Unreleased/Added), and
smoke-test.sh (nano + micro presence checks).
This commit is contained in:
pi
2026-07-01 23:11:25 +02:00
parent d1db595f17
commit 3a59e15563
4 changed files with 74 additions and 2 deletions
+27
View File
@@ -13,6 +13,33 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
## Unreleased ## Unreleased
### Added
- **Two non-modal terminal editors alongside `nvim`: `nano` and `micro`.**
The image previously shipped only `nvim` (with `EDITOR=nvim`), a modal
vi-style editor. Not everyone is comfortable with vi keybindings, so both
a classic and a modern non-modal option now ship:
- **`nano`** (apt) — ~2.8 MB installed. Its dependencies (`libc6`,
`libncursesw6`, `libtinfo6`) are already present via `nvim`/`less`/`htop`/
`tmux`, so it pulls in **no extra packages**. On-screen shortcut hints
(`^O` write, `^X` exit) make it the lowest-friction fallback.
- **`micro`** — ~12 MB, a single static Go binary installed from GitHub
releases (same pattern as `bat`/`eza`/`zoxide`). Desktop-style keybindings
(`Ctrl+S` save, `Ctrl+Q` quit, `Ctrl+C/V/X`, `Ctrl+Z` undo), mouse
support, and syntax highlighting out of the box. Pin with
`--build-arg MICRO_VERSION=vX.Y.Z`; defaults to `latest`.
Combined footprint is ~15 MB (<0.5% of the ~3.2 GB image). **`EDITOR`
stays `nvim`** — the new editors are opt-in via `export EDITOR=micro`
(or `nano`) and/or `git config --global core.editor micro`.
Note: micro's upstream repo moved `zyedidia/micro``micro-editor/micro`;
the Dockerfile uses the canonical URL because the old org's
`/releases/latest` redirect lands on another `/latest` URL (the org
rename), which would defeat the tag-parsing `latest`-resolution idiom.
These are base-image additions, so they only land once the `base-<hash>`
rebuilds (this file changed, so the next build picks them up).
### Added (CI) ### Added (CI)
- **Workflow lint (`.gitea/workflows/lint.yml`) running on every push and PR.** - **Workflow lint (`.gitea/workflows/lint.yml`) running on every push and PR.**
+34
View File
@@ -57,6 +57,12 @@ ENV DEBIAN_FRONTEND=noninteractive
# pi-studio's container-loopback server to the container's # pi-studio's container-loopback server to the container's
# external interface so a published port can reach it. # external interface so a published port can reach it.
# ~1 MB; generally useful for any port-forwarding need. # ~1 MB; generally useful for any port-forwarding need.
# nano — small, non-modal terminal editor for users who don't want
# a vi-based editor. ~2.8 MB installed; its deps (libc6,
# libncursesw6, libtinfo6) are already pulled in by nvim/less/
# htop/tmux, so it adds no extra packages. Companion to nvim
# and the `micro` binary installed further down. EDITOR stays
# nvim; users opt in via `export EDITOR=nano`.
RUN apt-get update && \ RUN apt-get update && \
apt-get upgrade -y --no-install-recommends && \ apt-get upgrade -y --no-install-recommends && \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
@@ -92,6 +98,7 @@ RUN apt-get update && \
graphviz \ graphviz \
imagemagick \ imagemagick \
socat \ socat \
nano \
&& ln -s /usr/bin/fdfind /usr/local/bin/fd \ && ln -s /usr/bin/fdfind /usr/local/bin/fd \
&& apt-get clean \ && apt-get clean \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
@@ -231,6 +238,33 @@ RUN ARCH=$(case "${TARGETARCH}" in amd64) echo "x86_64" ;; arm64) echo "arm64" ;
ln -s /opt/nvim-linux-${ARCH}/bin/nvim /usr/local/bin/nvim && \ ln -s /opt/nvim-linux-${ARCH}/bin/nvim /usr/local/bin/nvim && \
nvim --version | head -1 nvim --version | head -1
# micro — modern, non-modal terminal editor. Ships alongside nvim so users
# who aren't comfortable with vi-style modal editing have a friendly option:
# desktop-style keybindings (Ctrl+S save, Ctrl+Q quit, Ctrl+C/V/X, Ctrl+Z
# undo), mouse support, and syntax highlighting out of the box. A single
# static Go binary (~12 MB) installed from GitHub releases, exactly like
# bat/eza/zoxide below. EDITOR stays nvim (see below); users opt in with
# `export EDITOR=micro` or `git config --global core.editor micro`.
#
# NOTE: upstream moved zyedidia/micro -> micro-editor/micro. The old org URL
# still 302s, but its /releases/latest redirect lands on ANOTHER /latest URL
# (the org rename), so the tag-parsing idiom below would resolve "latest"
# instead of a version. Use the canonical micro-editor/micro URL.
# Arch asset naming differs from the others: amd64 -> linux64, arm64 ->
# linux-arm64. The tarball extracts to micro-<version>/micro.
ARG MICRO_VERSION=latest
RUN ARCH=$(case "${TARGETARCH}" in amd64) echo "linux64" ;; arm64) echo "linux-arm64" ;; *) echo "linux64" ;; esac) && \
V="${MICRO_VERSION}" && \
if [ "$V" = "latest" ]; then \
V=$(curl -sI --retry 5 --retry-delay 5 --retry-all-errors "https://github.com/micro-editor/micro/releases/latest" | awk 'tolower($1)=="location:" { sub(/\r$/,"",$2); n=split($2,a,"/"); print a[n] }'); \
fi && \
V="${V#v}" && [ -n "$V" ] && \
echo "Installing micro ${V}" && \
curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors "https://github.com/micro-editor/micro/releases/download/v${V}/micro-${V}-${ARCH}.tar.gz" | tar -xz -C /tmp && \
install /tmp/micro-${V}/micro /usr/local/bin/micro && \
rm -rf /tmp/micro-${V} && \
micro --version
# bat # bat
ARG BAT_VERSION=latest ARG BAT_VERSION=latest
RUN ARCH=$(case "${TARGETARCH}" in amd64) echo "x86_64" ;; arm64) echo "aarch64" ;; *) echo "x86_64" ;; esac) && \ RUN ARCH=$(case "${TARGETARCH}" in amd64) echo "x86_64" ;; arm64) echo "aarch64" ;; *) echo "x86_64" ;; esac) && \
+8 -1
View File
@@ -35,7 +35,9 @@ this container so all your agents share one brain.
| Tool | Purpose | | Tool | Purpose |
|---|---| |---|---|
| `nvim` | Neovim text editor | | `nvim` | Neovim text editor (modal / vi-style) |
| `nano` | Small non-modal editor (on-screen shortcut hints) |
| `micro` | Modern non-modal editor (Ctrl+S/Ctrl+Q keys, mouse, syntax highlighting) |
| `tmux` | Terminal multiplexer (configured for 0-indexed sessions) | | `tmux` | Terminal multiplexer (configured for 0-indexed sessions) |
| `ripgrep`, `fd` | Fast file content / filename search | | `ripgrep`, `fd` | Fast file content / filename search |
| `fzf` | Fuzzy finder | | `fzf` | Fuzzy finder |
@@ -49,6 +51,11 @@ this container so all your agents share one brain.
| `gosu` | Privilege de-escalation in entrypoint | | `gosu` | Privilege de-escalation in entrypoint |
| `htop`, `tree`, `less` | Inspection utilities | | `htop`, `tree`, `less` | Inspection utilities |
The default `$EDITOR` is `nvim`. Three editors ship so you can pick your
comfort level — if you'd rather not use a vi-style editor, `nano` and `micro`
are both non-modal. Set your preference with `export EDITOR=micro` (or `nano`)
in your shell profile, and/or `git config --global core.editor micro`.
### Document and image tooling ### Document and image tooling
- `pandoc` — universal Markdown↔HTML/Org/RST/etc. converter - `pandoc` — universal Markdown↔HTML/Org/RST/etc. converter
+5 -1
View File
@@ -6,6 +6,7 @@
# Verifies: # Verifies:
# - pi binary present and (if EXPECTED_PI_VERSION set) matches CI's resolved version # - pi binary present and (if EXPECTED_PI_VERSION set) matches CI's resolved version
# - new v1.0.0 base additions (pandoc, graphviz, imagemagick, yq, tealdeer) # - new v1.0.0 base additions (pandoc, graphviz, imagemagick, yq, tealdeer)
# - non-modal editors nano + micro (alongside nvim)
# - tmux 0-indexing baked in /etc/tmux.conf (required for pi-studio variants) # - tmux 0-indexing baked in /etc/tmux.conf (required for pi-studio variants)
# - pi-toolkit cloned at /opt/pi-toolkit # - pi-toolkit cloned at /opt/pi-toolkit
# - pi-extensions cloned at /opt/pi-extensions # - pi-extensions cloned at /opt/pi-extensions
@@ -24,7 +25,8 @@ set -euo pipefail
IMAGE="${1:?usage: $0 <image>}" IMAGE="${1:?usage: $0 <image>}"
PASS=0; FAIL=0 PASS=0; FAIL=0
# pi-devbox v1.0.0 (decoupled from opencode-devbox) added pandoc, graphviz, # pi-devbox v1.0.0 (decoupled from opencode-devbox) added pandoc, graphviz,
# imagemagick, yq, tealdeer, and a baked /etc/tmux.conf. Local arm64 build # imagemagick, yq, tealdeer, a baked /etc/tmux.conf, and the non-modal
# editors nano + micro (~15 MB combined). Local arm64 build
# observed 3.20 GB. CI amd64 builds may differ slightly; threshold below # observed 3.20 GB. CI amd64 builds may differ slightly; threshold below
# carries +300 MB margin to absorb arch differences without false reds. # carries +300 MB margin to absorb arch differences without false reds.
# Tighten in a follow-up release once amd64 actuals are observed in CI logs. # Tighten in a follow-up release once amd64 actuals are observed in CI logs.
@@ -71,6 +73,8 @@ run "git" "git --version"
run "aws" "aws --version" run "aws" "aws --version"
run "uv" "uv --version" run "uv" "uv --version"
run "nvim" "nvim --version" run "nvim" "nvim --version"
run "nano" "nano --version"
run "micro" "micro --version"
run "mempalace-mcp" "mempalace-mcp --help" run "mempalace-mcp" "mempalace-mcp --help"
# v1.0.0 base additions — verify presence and basic functionality. # v1.0.0 base additions — verify presence and basic functionality.
run "pandoc" "pandoc --version" run "pandoc" "pandoc --version"