Releases: dnouri/pilish
Release list
v3.0.0 — Pilish
Pilish is the new name for the pi-coding-agent package. The Pi CLI it wraps is unchanged.
- Everything moves to pilish names: modules (pilish.el, pilish-ui.el, …), commands (M-x pilish), buffers (pilish-chat:DIR), variables (pilish-*).
- The rename is a clean break with no compatibility shim, following MELPA rename practice: install pilish, delete the old package, and rename pi-coding-agent to pilish in your init file — the README's "Upgrading from pi-coding-agent" section walks through it.
- Dependency installation now includes GNU ELPA: MELPA's transient build needs compat ≥ 31, which is only published there.
The GitHub repository is now dnouri/pilish (old URLs redirect). The MELPA package is being renamed with :old-names (pi-coding-agent), so the MELPA site will show "Renamed from: pi-coding-agent" and keep the download history.
v2.9.1
2.9.1
Features
- Inline images from tool results — Tool outputs that include image content blocks now render inline in the chat buffer on GUI frames, with MIME-type and size placeholders in terminal frames; thanks @conornash (#221)
- Attach images to outgoing prompts (C-c C-a) — Select or paste a PNG, JPEG, GIF, or WebP path; the image shows in the input header and is sent through Pi's
imagesRPC field when the model advertises image input.C-u C-c C-aclears it. One image per prompt, sent as-is under a 3 MiB source limit (#271)
Fixes
- Pending prompts survive delayed starts and resets — A delayed
agent_startno longer treats your just-sent prompt as an invisible no-turn command; extension-handled prompts retract cleanly, and starting a new session refuses to silently discard unresolved prompts and queued follow-ups (#273) - Stable test feedback — Removed unused session-verification scaffolding, fixed the intermittent GUI resize check, and documented ERT selector escaping through Make (#268)
v2.9.0
2.9.0
Features
- Session browser —
C-c C-r,/resume, orM-x pi-coding-agent-session-browseropens a persistent, disk-backed browser for recorded Pi sessions: grouped by time, searchable (/), sortable (s: threaded, recent, or relevance), scoped to the current project or all projects (t), filtered to named sessions (f), and renamable (r);RETswitches to the session at point through the guarded resume flow. Browsing needs no running Pi process (#266) - Conversation tree browser —
win the main menu opens the conversation tree as persisted in the session file: every branch, where the live conversation currently sits, branch labels (l), tool filters (f), search (/), and refresh (g). Reading and labeling need no live process either (#266) - Branch navigation —
RETon a tree node makes that branch the live conversation: a byte-preserving local rewrite of the session file followed by the normal resume flow. Changed-on-disk files, unversioned formats, and in-flight switches refuse with a message instead of half-working; over TRAMP the atomic rewrite is best-effort (#266) - Branch summaries in resumed histories — fork points in a resumed session render as their own Markdown sections instead of disappearing (#266)
Performance
- No end-of-turn freeze from old tool output — finishing a turn no longer rewrites every completed tool block inside the process filter; older blocks are queued and cooled one at a time by short deferred callbacks that yield to pending input, keeping the chat responsive in tool-heavy sessions (#265)
- Fast branch reordering on large histories — vector-indexed lines reorder a 100k-entry session in under a second where it previously took sixteen (#266)
Fixes
- Consistent session-file parsing — every reader now applies one rule: the first nonblank line is the session header, matching Pi's own reader; files with stray blank lines or a byte-order mark before the header read consistently everywhere instead of failing navigation with a false "unreadable" error (#266)
- Interruptible session scans —
C-gduring a disk scan reports the interruption instead of leaving the browser stuck on its loading screen, and switching refuses to start while another switch is in flight (#266)
v2.8.0
2.8.0
Features
- Chat-only and on-demand input layouts — Reclaim chat space while reading by setting
pi-coding-agent-input-window-displaytoon-demandorhidden; the input pane hides after sending and reopens withM-x pi-coding-agent-open-input(i/awith Evil), while the defaultalwaysbehavior remains unchanged; thanks @SayreBlades (#262)
Performance
- Responsive tool progress during subagent runs — Tool previews now coalesce at a 250 ms cadence and defer to pending keyboard input instead of rewriting the chat buffer for every event; in the measured update storm, handling fell from 19.5 ms to 0.03 ms per update and stalls over 100 ms fell from 25 to 2 (#263)
Fixes
- Reliable tool rendering with Pi 0.84 — Delta-only tool calls no longer lose or duplicate blocks; parallel executions remain isolated, live command, path, and bounded write previews appear when start metadata is available, and partial state is cleaned up on abort or process exit (#264)
Compatibility
- Requires Pi 0.84.2 or newer — Published Pi 0.84.2 remains supported despite omitting tool identity metadata at call start: its tool blocks appear after each call is assembled, while newer builds can preview supported arguments as they stream (#264)
v2.7.0
2.7.0
Features
- Visit files and run shell commands from chat — Files mentioned in chat are one keystroke away: RET on a file target opens it (a file-content row in tool output at the matching line, a plain path like
src/app.el:12:3at that line and column, or a local Markdown link), and!runs a Dired-inspired shell command on the file at point (#250) - Improved Evil integration — Magit-style cooperation when Evil is installed: the chat buffer starts in motion state so navigation keys just work, the input buffer starts in insert state, and
?opens the command menu. Auto-loads when Evil is present and is invisible otherwise; also completes the chat keymap with direct chords for session, context, and model commands for all users; thanks @SayreBlades (#248) - Toggle table rendering in place —
pi-coding-agent-toggle-table-prettyflips tables between the pretty view and raw pipe text — per table, per region, or buffer-wide — for copying a cell exactly or inspecting the source; thanks @SayreBlades (#254) - Pluggable table cell rendering —
pi-coding-agent-table-cell-render-functionlets you supply your own function for how table cells render; thanks @SayreBlades (#255) - Thinking levels fetched from the Pi server — The thinking-level menu now lists the levels your pi actually supports instead of a hardcoded set, with server-side clamping reflected in the UI; thanks @ArthurHeymans (#251)
Fixes
- Much lower memory use in long sessions — Chat buffers no longer record undo history, which could accumulate millions of entries and grow Emacs memory by gigabytes over long sessions; the input buffer keeps undo as before; thanks @ArthurHeymans (#256)
- Process crashes are visible in chat — When the pi process dies mid-session, the chat now shows the error, exit code, and a bounded stderr excerpt instead of silently going idle (#257)
- Exit confirmation restored — Closing Emacs (from the window manager or
C-x C-c) with a live session asks before killing the pi process again (#258)
Compatibility
- Requires pi 0.81.0 or newer — Thinking-level handling now relies on the server's
thinkingLevelMap; the deadcompat.reasoningEffortMapfallback has been removed (#251)
v2.6.0
2.6.0
Features
- TRAMP project support — Remote projects now start the Pi CLI on the remote host and translate paths at the Emacs/Pi boundary, so session files, exports, commands, completion, and tool navigation use the right names on each side (#239)
Fixes
- Safer session switching — Resuming, reloading, and opening session files now use each session's saved directory, retarget chat/input buffers when that directory changes, preserve named sessions, and keep the old Pi process alive unless the switch succeeds (#239)
- Safe backend path metadata — Tool output and session state now tolerate malformed, mismatched, or control-character path metadata without breaking rendering or process filters; valid TRAMP paths still open from tool output with
RET(#239) - Clearer missing-Node startup errors — When Emacs can find
pibut/usr/bin/env nodecannot find Node, startup now explains thePATHvsexec-pathdifference and points to safe recovery options (#244)
Documentation
- Troubleshooting cleanup — First-run notes are now organized as collapsible sections and cover missing Pi, missing Node, project trust, grammar installation, TRAMP, and
transientproblems (#245, #244) - Comparison guide — The README now gives a more explicit comparison with gptel/gptel-agent, Aidermacs, claude-code-ide.el, agent-shell, and eca-emacs (#241)
Development
- More reliable CI setup — GitHub Actions now use a local Emacs setup action with a pinned
nix-emacs-ciflake revision to avoid setup rate limits (#240)
v2.5.2
2.5.2
Fixes
- Much faster reload and resume — Large session reloads and resumes avoid quadratic JSON line buffering and skip unnecessary full-message parsing when building the session picker. Synthetic benchmarks showed roughly 9-11x faster reload/resume on the affected workloads (#238)
- Reload/resume benchmarks — Added deterministic GUI, batch, and smoke benchmarks so future session performance changes have fast feedback (#238)
- Projectile-backed projects start cleanly — Sessions no longer crash when an older Projectile project backend returns a
(projectile . "/path")project value instead of implementingproject-root; thanks @jhamm (#235) - Clearer README guidance — Added a comparison with other Emacs LLM helpers and corrected the Pi authentication instructions, including the
/loginflow and provider API key setup (#237)
v2.5.1
2.5.1
Improvements
-
Large resumed sessions become usable promptly — Session history no longer waits for whole-buffer fontification or old table decoration before the buffer appears; the visible tail still gets Markdown and table polish (#233)
-
Full dates in chat message headings — User turns now always show
YYYY-MM-DD HH:MM, including messages from today, so saved transcripts stay unambiguous across days (#230)
Fixes
- C-c C-k cancels compaction too — The abort key now stops the current compaction operation instead of silently doing nothing; streaming abort behavior is unchanged (#232)
v2.5.0
2.5.0
Features
-
Project-local Pi resources work by default — Pi 0.79 introduced a new project trust model. The Emacs frontend is more lenient than the Pi CLI here: project
.piprompts, skills, settings, themes, and extensions are trusted by default. Customizepi-coding-agent-project-trust-policyto use Pi's saved trust defaults or force--no-approve(#229) -
Open session files directly —
M-x pi-coding-agent-open-session-fileopens an existing Pi JSONL session as a live chat/input session, with convenient Dired/visited-file defaults; thanks @etern for the request (#224) -
Activity phase hooks —
pi-coding-agent-activity-phase-functionslets user config react tothinking,replying,running,compact, andidletransitions for notifications, mode-line integrations, and similar UI tweaks; thanks @conornash (#223) -
Slash command runner API —
pi-coding-agent-run-commandruns Pi slash commands by name with optional arguments from Emacs Lisp; thanks @bobrowadam (#212) -
Configurable extension status faces — Style individual extension header statuses with
pi-coding-agent-extension-status-faces, keyed by the extensionstatusKey; thanks @bobrowadam (#210)
Defaults
-
Thinking stays visible — Completed thinking is expanded by default, while still toggleable per chat or per block with the existing controls (#217)
-
Markdown-highlighted input — Input buffers use Markdown highlighting by default while keeping the raw markup visible as typed (#217)
Performance
- Faster long chat rendering — History replay now batches display post-processing, and ordinary streaming text avoids table scans unless a pipe table is possible; thanks @leo-ar (#222)
Fixes
-
Clearer Markdown grammar diagnostics — Warn when an incompatible loaded Markdown tree-sitter grammar shadows the expected one, instead of reporting that all grammars are installed; thanks @2mc for the report (#218)
-
Input buffer kill confirmation — Killing the input buffer now gives the same chance to cancel as killing the chat buffer, instead of silently terminating a live Pi session (#214)
Compatibility
- Pi CLI 0.79.1 or later is required — This release depends on Pi's project trust behavior, including
defaultProjectTrust, and warns when an older CLI is detected (#229)
v2.4.0
2.4.0
Features
- Safer compaction and queued input — Emacs now follows Pi’s current
compaction_start/compaction_endprotocol, renders manual compaction completion once, preserves queued text when compaction fails, and keeps follow-up prompts behind Pi’s automatic retry instead of letting them overtake it; thanks @nicabarnimble (#213) - Session resume uses Pi’s actual session file — Resume now starts from the
sessionFilereported byget_state, so customPI_CODING_AGENT_DIRsetups and sessions outside~/.pi/agent/sessionswork correctly; thanks @yurikhan for the report (#206, fixes #205)
Compatibility
- Current Pi CLI baseline — The supported Pi CLI is now
@earendil-works/pi-coding-agent0.75.5 or later, with real integration CI aligned to that runtime (#213)
Fixes
- Prompt recovery around backend edges — If Pi exits while a prompt is being handed over, the prompt is restored to the input buffer; stale idle state replies and JSON
falsefailure cases are handled correctly (#213) - Cleaner resume picker — If cached state has no session file yet, Emacs refreshes
get_statebefore listing sessions and filters out sibling JSONL files that are not Pi sessions (#206) - No hardcoded
/bin/bash— Helper scripts and Makefile now resolve bash through the environment/PATH for better portability; thanks @broughjt (#204)