v0.2.7
Released on .
Highlights
Click-to-restart updater (Zed-style)
The in-app updater now silently downloads + installs in the background as soon as a release is detected, then parks at a ReadyToRestart pill. The click that used to kick off "download + 2 s analytics flush" now only invokes cx.restart() — perceived restart latency drops to GPUI's ~100 ms relauncher poll. Externally-managed installs (Flatpak, Snap, distro packages, or any binary built with PANEFLOW_UPDATE_EXPLANATION) get a copy-the-upgrade-command toast instead of an unwanted download. Mirrors crates/auto_update from Zed.
Pixel-perfect terminal rendering parity with Zed
PRD terminal-rendering-parity (US-001..US-008) delivered:
PANEFLOW_PIXEL_PROBEinstrumentation + opt-in cell-bounds overlay (debug-only, zero release cost).- Cell width / line height snapped to integer pixels at measurement time (WezTerm convention).
- Glyph X/Y snap before
ShapedLine::paint. - Shared-boundary background-rect alignment via per-frame
cell_x_boundaries/cell_y_boundariesarrays. block_char_coveragesextended with 11 codepoints —▔ ▖ ▗ ▘ ▝ ▙ ▚ ▛ ▜ ▞ ▟(single + multi-quadrants). Required for Claude Code's banner robot.- Single shared cursor-blink phase across every pane (replaces N per-pane
smol::Timerloops). - APCA-validated
selection_foregroundrecomputed at theme load against an opaque selection background. - Opt-in ligatures via
paneflow.jsonterminal.ligatures, hot-reloaded through the existing 500 ms font-config cache.
Plus Codex CLI compatibility fixes the pixel probe surfaced:
- OSC 10/11/12 now respond synchronously with the correct
NamedColorindex (256/257/258 instead of the OSC code itself). Previously crossterm'squery_background_color()in Codex timed out and never painted its input-bar tint. - Background rects no longer extend horizontally into the gutter — matches Zed and prevents Codex's input bar from leaking across the widget width.
Cross-platform AI hooks for Claude Code + Codex
Run claude or codex inside a PaneFlow terminal and the workspace card in the sidebar now shows Thinking / WaitingForInput / Finished badges in real time. End-to-end implementation of prd-ai-hooks-cross-platform across all six target triples (Linux x64/aarch64, macOS aarch64, Windows x64).
- New
paneflow-shimcrate interceptsclaude/codexon PATH, idempotently injects hook configs, capturesSIGINTforai.stopevents, sendsai.session_endon clean exit. - New
paneflow-ai-hookcrate is a tiny blocking JSON-RPC client invoked from the AI tool's hook commands — maps each event to one of six IPC methods (ai.session_start,ai.prompt_submit,ai.tool_use,ai.notification,ai.stop,ai.session_end). - Both binaries embedded via
rust-embed, atomically extracted on first PTY spawn with SHA-256 idempotent fast-path (now re-verified after write so antivirus tampering doesn't poison the cache). - Shell integration (zsh
precmd, bashPROMPT_COMMAND, fish--init-command, pwsh-NoExit) re-prepends$PANEFLOW_BIN_DIRto PATH after user rc files run. - 6 bug fixes uncovered during live testing: PATH-prepend race, stale
.codexregular-file blockingcreate_dir_all, missing$PANEFLOW_AI_TOOLon the child env, missingai.session_endon/exit, Ctrl+C killing the shim before notification, and false-positive notification badges from informational events. Notificationevents whitelisted topermission_prompt+elicitation_dialog; everything else now logs to$PANEFLOW_HOOK_LOGinstead of going into the void, so the whitelist can iterate from real telemetry.- Refactor: typed
AiToolenum replacing&'static str, consolidatedHookConfigGuard+CodexHookConfigGuardinto shared install/cleanup helpers, orphan-config sweep at startup if a previous SIGKILL'd session left stale entries. paneflow-shimships with 24 unit tests + integration tests against a mock IPC server.
Security & supply chain
- rustls-webpki 0.103.12 → 0.103.13 for RUSTSEC-2026-0104 — reachable panic in
from_deron a syntactically-valid empty BIT STRING in theonlySomeReasonsCRL extension, before signature verification. Pulled transitively viaureqand GPUI'shttp_client. - cargo-deny pin bumped from
^0.14to^0.19so CI accepts moderndeny.tomlsyntax (unmaintained = "workspace",[[licenses.exceptions]]). - License allow list widened for
0BSD,MPL-2.0,CC0-1.0,CDLA-Permissive-2.0,bzip2-1.0.6,NCSA(all OSI-approved or public-domain-equivalent, present in GPUI's transitive tree). - Per-crate exceptions added for Zed's
zlog,ztracing,ztracing_macro(GPL-3.0-or-later, dev-deps of GPUI only — never reach the shipped binary). - All sub-crates under
crates/now inheritlicense.workspace = true(closes three "unlicensed" cargo-deny errors).
Polish
- Privacy/telemetry settings tab translated from French to English (no behavior change).
- Title bar
SystemHintpill now usescursor_pointerso every interactive pill state feels like a button. **/target/added to.gitignoreso multi-MB build artifacts incrates/*andsrc-app/aren't accidentally staged.
CI
- macOS x86_64 quality-gate leg disabled until v0.3.0 —
macos-13runner queue times of 30–60 min were leaving release runs stuck inin_progressdespitecontinue-on-error: true. macOS aarch64 (Apple Silicon) still covers day-to-day cross-compile signal. Re-enable when Intel-Mac signing posture (Apple Dev secrets, codesign + notarytool) lands in v0.3.0. - Windows clippy
dead_codefor Codex symbols silenced via#[cfg(unix)]gates on symbols only reachable from Unix code paths.
Full Changelog: https://github.com/ArthurDEV44/paneflow/compare/v0.2.6...v0.2.7
Notes pulled live from the GitHub release.