Skip to content

Releases: dnouri/pilish

v3.0.0 — Pilish

Choose a tag to compare

@dnouri dnouri released this 03 Sep 10:00
3b20c35

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

Choose a tag to compare

@dnouri dnouri released this 02 Sep 14:25

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 images RPC field when the model advertises image input. C-u C-c C-a clears 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_start no 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

Choose a tag to compare

@dnouri dnouri released this 27 Aug 19:57

2.9.0

Features

  • Session browserC-c C-r, /resume, or M-x pi-coding-agent-session-browser opens 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); RET switches to the session at point through the guarded resume flow. Browsing needs no running Pi process (#266)
  • Conversation tree browserw in 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 navigationRET on 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 scansC-g during 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

Choose a tag to compare

@dnouri dnouri released this 24 Aug 20:34

2.8.0

Features

  • Chat-only and on-demand input layouts — Reclaim chat space while reading by setting pi-coding-agent-input-window-display to on-demand or hidden; the input pane hides after sending and reopens with M-x pi-coding-agent-open-input (i/a with Evil), while the default always behavior 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

Choose a tag to compare

@dnouri dnouri released this 05 Aug 12:39

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:3 at 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 placepi-coding-agent-toggle-table-pretty flips 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 renderingpi-coding-agent-table-cell-render-function lets 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 dead compat.reasoningEffortMap fallback has been removed (#251)

v2.6.0

Choose a tag to compare

@dnouri dnouri released this 02 Jul 10:53

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 pi but /usr/bin/env node cannot find Node, startup now explains the PATH vs exec-path difference 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 transient problems (#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-ci flake revision to avoid setup rate limits (#240)

v2.5.2

Choose a tag to compare

@dnouri dnouri released this 28 Jun 10:24

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 implementing project-root; thanks @jhamm (#235)
  • Clearer README guidance — Added a comparison with other Emacs LLM helpers and corrected the Pi authentication instructions, including the /login flow and provider API key setup (#237)

v2.5.1

Choose a tag to compare

@dnouri dnouri released this 15 Jun 14:56

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

Choose a tag to compare

@dnouri dnouri released this 13 Jun 13:55

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 .pi prompts, skills, settings, themes, and extensions are trusted by default. Customize pi-coding-agent-project-trust-policy to use Pi's saved trust defaults or force --no-approve (#229)

  • Open session files directlyM-x pi-coding-agent-open-session-file opens 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 hookspi-coding-agent-activity-phase-functions lets user config react to thinking, replying, running, compact, and idle transitions for notifications, mode-line integrations, and similar UI tweaks; thanks @conornash (#223)

  • Slash command runner APIpi-coding-agent-run-command runs 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 extension statusKey; 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

Choose a tag to compare

@dnouri dnouri released this 27 May 21:59

2.4.0

Features

  • Safer compaction and queued input — Emacs now follows Pi’s current compaction_start / compaction_end protocol, 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 sessionFile reported by get_state, so custom PI_CODING_AGENT_DIR setups and sessions outside ~/.pi/agent/sessions work correctly; thanks @yurikhan for the report (#206, fixes #205)

Compatibility

  • Current Pi CLI baseline — The supported Pi CLI is now @earendil-works/pi-coding-agent 0.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 false failure cases are handled correctly (#213)
  • Cleaner resume picker — If cached state has no session file yet, Emacs refreshes get_state before 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)