wip
This commit is contained in:
90
CHANGELOG.md
90
CHANGELOG.md
@@ -7,6 +7,15 @@ loosely follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- User-created top-level command processes now survive a patterm
|
||||
restart. Each spawn (palette form, command preset, or MCP
|
||||
`spawn_process` with `kind=command`) writes a record to
|
||||
`$XDG_DATA_HOME/patterm/projects/<key>/processes.json`; on next
|
||||
startup patterm replays those entries before the UI accepts input,
|
||||
so things like `bun run dev` or `tail -F log` come back without
|
||||
re-typing. `close_process` (and the palette's close action) drops
|
||||
the entry, and rename / "relaunch on exit" toggles are mirrored as
|
||||
they happen. Agents and terminals stay ephemeral by design.
|
||||
- `patterm --version` prints the build version, git commit, and build
|
||||
date (e.g. `patterm v0.0.1 (commit abc1234, built 2026-05-14)`). The
|
||||
version string is injected by the build (`make patterm` derives it
|
||||
@@ -15,6 +24,36 @@ loosely follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
nothing has to be bumped by hand.
|
||||
- Ctrl+R restarts the focused command process from the Processes
|
||||
sidebar, including command entries that have already exited.
|
||||
- Scratchpads are now first-class navigation targets. Ctrl+W / Ctrl+S
|
||||
step from the Processes section and agent tree onto scratchpad
|
||||
entries; a focused scratchpad renders its content in the main
|
||||
viewport (with the pad name as the header) instead of cramping the
|
||||
bottom of the sidebar. The sidebar's scratchpad section is a names-
|
||||
only list with the focused pad highlighted, and external MCP
|
||||
`scratchpad_write` / `scratchpad_append` updates repaint the pad
|
||||
view immediately.
|
||||
- Focused scratchpads now render as markdown — headings, bold, inline
|
||||
code, fenced code blocks, bullet/numbered lists, blockquotes, and
|
||||
horizontal rules pick up styling instead of the previous flat
|
||||
word-wrap. Long pads scroll: the mouse wheel is the primary control
|
||||
(patterm enables SGR mouse reporting while a pad is focused), and
|
||||
Up/Down / PageUp/PageDown / Home / End work for keyboard users. The
|
||||
header reports the visible row range and total row count. Esc leaves
|
||||
the pad view and falls back to the first running process (or an
|
||||
empty viewport). The scroll offset is preserved across MCP
|
||||
`scratchpad_write` / `scratchpad_append` writes so a live update
|
||||
doesn't snap the view back to the top.
|
||||
- Inline wheel scrollback for the focused child, backed by
|
||||
libghostty-vt's native 5000-row scrollback history. On the primary
|
||||
screen, mouse-wheel events scroll the emulator viewport in-place with
|
||||
full SGR styling preserved — no modal view to enter or exit. On the
|
||||
alternate screen wheel events still pass through to the child so
|
||||
vim / less / codex receive them as input. Ctrl+B snaps the viewport
|
||||
back to the live (bottom) area as the escape hatch from a scrolled-up
|
||||
state. Patterm now keeps SGR mouse reporting armed on the host
|
||||
terminal while the alt screen is active and filters mouse-mode
|
||||
toggles from the child stream so wheel events keep arriving even
|
||||
after a child program disables mouse tracking.
|
||||
|
||||
### Changed
|
||||
- CLI flag parsing switched from Go's stdlib `flag` to `spf13/pflag`.
|
||||
@@ -24,12 +63,63 @@ loosely follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
renders the canonical `--flag` form.
|
||||
|
||||
### Fixed
|
||||
- Tab bar and bottom status row no longer get overwritten by long
|
||||
claude / codex sessions. Three holes were letting child output land
|
||||
on the chrome: (1) absolute cursor moves — CUP / HVP / VPA — added
|
||||
the row offset but didn't clamp to the viewport, so a child whose
|
||||
internal row state drifted past its assigned height could walk the
|
||||
host cursor onto the status row (or above the tab bar); (2) relative
|
||||
cursor moves — CUU / CUD / CNL / CPL — were forwarded verbatim, so
|
||||
a `CSI 50 A` from viewport row 1 walked the host cursor into the
|
||||
tab bar before the next printable wiped it; (3) the host's DECSTBM
|
||||
scroll region was only set during snapshot-replay preludes, so the
|
||||
windows between (startup before first focus, post-SIGWINCH,
|
||||
post-clearScreen) left the region defaulted to the full screen and
|
||||
any LF / IND / NEL / RI / SU / SD at the viewport bottom scrolled
|
||||
the chrome rows along with the pane. The cursor shifter now clamps
|
||||
CUP/HVP/VPA rows to mainTop..mainBottom, the viewport renderer
|
||||
rewrites CUU/CUD/CNL/CPL with a clamped step (and homes the column
|
||||
for CNL/CPL), and patterm installs the host scroll region after
|
||||
`enterScreen` and after every `clearScreen` (and resets it cleanly
|
||||
on `leaveScreen` so the calling shell isn't left with a constrained
|
||||
region).
|
||||
- Plain line-feed scrolling at the bottom of a child pane now invalidates
|
||||
and repaints the sidebar, so long agent output can no longer drag the
|
||||
sidebar border and labels out of view while the chrome cache stays warm.
|
||||
- Child DEC origin-mode and left/right-margin controls are now handled
|
||||
inside the viewport renderer instead of being forwarded to the host
|
||||
terminal, so later tab bar, sidebar, and status-line repaints keep
|
||||
using physical screen coordinates and do not appear inside the
|
||||
focused pane.
|
||||
- Exited command processes in the top Processes section are now reachable
|
||||
with Ctrl+W/S navigation, so a dead shell entry can be focused and
|
||||
restarted instead of becoming a visible but unreachable row.
|
||||
- Resizing the host terminal no longer makes codex (and other
|
||||
diff-based TUIs) scroll-jump for several seconds. SIGWINCH is now
|
||||
coalesced into a single resize after an ~80ms idle, the resize path
|
||||
skips the full snapshot replay (the child's own SIGWINCH-driven
|
||||
redraw fills the viewport), and `Child.NudgeRedraw` no longer
|
||||
toggles the PTY through rows-1 + rows back-to-back during a
|
||||
drag-resize.
|
||||
- Steady-state CPU during a long codex session dropped sharply.
|
||||
Tab-bar and status-line repaints moved off the per-PTY-chunk path
|
||||
to a 16ms chrome ticker; the scratchpad listing is cached and only
|
||||
rebuilt when the pads change; the post-spawn / post-repaint
|
||||
styled-snapshot replay budget dropped from 8 chunks to 2; URL/port
|
||||
scanning short-circuits chunks that don't contain "http"; the
|
||||
three writes around the autowrap toggle in `OnPTYOut` collapsed
|
||||
into one syscall; the per-PTY-read `make+copy` was removed (the
|
||||
64 KiB read buffer is reused, with a documented "do not retain"
|
||||
listener contract); session listeners now dispatch through an
|
||||
`atomic.Pointer` snapshot instead of a mutex copy on every chunk;
|
||||
the per-child output ring is a true wrap-around buffer instead of
|
||||
a slide-and-trim slice; `wait_for_pattern` wakes on PTY chunk
|
||||
events with a 500ms fallback instead of unconditional 50ms
|
||||
polling; ANSI stripping in MCP `get_process_output stream`,
|
||||
`search_output`, and `wait_for_pattern scrollback` is now an
|
||||
in-place byte walk; and the viewport renderer copies long ASCII
|
||||
runs en bloc instead of feeding the state machine one byte at a
|
||||
time.
|
||||
|
||||
## [0.0.1] - 2026-05-14
|
||||
|
||||
|
||||
Reference in New Issue
Block a user