Commit Graph
41 Commits
Author SHA1 Message Date
Can Celik 207be3c771 refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell

* feat: add client-owned shell mouse controls

* feat: complete client-owned shell chrome

* feat: add client-owned shell settings and notifications

* feat: run client shell custom commands

* feat: render popup terminals in client shell

* feat: add client-owned scrollback and copy mode

* fix: preserve client worktree trust defaults

* feat: render startup diagnostics in client shell

* feat: render onboarding in client shell

* feat: render product announcements in client shell

* feat: render release notes in client shell

* feat: render mobile switcher in client shell

* feat: render kitty graphics in client shell

* fix: preserve client shell lifecycle coherence

* refactor: route client shell commands through endpoint connections

* refactor: make the client-rendered shell the default

* refactor: remove monolithic launch mode

* refactor: complete client-rendered shell cutover

* perf: retain client pane surface updates

* perf: scale retained pane surface updates

* perf: remove remote pane input latency

* test: make client shell checks platform-independent

* fix: prevent client timer starvation

* test: fix client shell platform gates

* test: accept retained surfaces in cross-area checks

* test: make client mode assertions platform-neutral

* fix: badge only outdated integrations
2026-09-01 15:48:22 +03:00
caner-akca 03ce02e1a7 fix: reject oversized git ref files in workspace status reads (#3373)
* fix: reject oversized git ref files in workspace status reads

refs #3343

* fix: treat oversized loose refs as unavailable instead of absent

refs #3343

* fix: classify git ref read errors instead of probing path existence

A loose ref behind a metadata or I/O error (for example an unsearchable
refs/heads directory) previously read as absent, because Path::exists()
also returns false on metadata errors, letting a stale same-name
packed-refs OID enter the workspace status fingerprint. The reader now
classifies the open error itself: NotFound and NotADirectory mean the
loose ref is absent (packed-refs fallback stays legitimate), every other
error marks the ref unavailable with no fallback. This also removes the
racy second existence probe.

refs #3343

* fix: reject empty loose git refs

refs #3343

* fix: reject dangling loose git refs

refs #3343

* fix: reject dangling git refs with invalid target paths

refs #3343
2026-08-30 01:40:49 +03:00
JJ LiebigandCan Celik 5600197f00 perf: avoid repeated Git config reads (#2688)
refs #2643

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-12 04:14:59 +03:00
akbashandakbash-bot b8387818f0 fix: derive repo name for embedded bare layouts (#2660)
refs #2657

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-11 16:27:49 +03:00
Jon KinneyandCan Celik 09cdd88d0a fix(layout): return focus to the pane a split was opened from (#2266)
Closing a focused pane handed focus to the next pane in tree order.
For a pane opened beside another one -- a plugin split, a file viewer,
any transient tool pane -- that is rarely where the user was: it lands
on some unrelated neighbour rather than the pane that opened it.

Track the pane focus came from in TileLayout and prefer it when the
focused pane closes, falling back to tree order when there is no
history, when it points at the pane being closed, or when it points at
a pane that has since gone away. The history lives in the layout, so it
can only ever name a pane in the same tab.

A one-slot history is only sound if internal focus excursions never
write it, so the tree edits that used to bounce focus around now go
through target-taking primitives instead. close_pane removes a
background pane directly, so detach_pane and take_pane_for_move stop
focus-close-refocusing. split_pane splits a target without moving
focus: the runtime split path only focuses the new pane once the spawn
succeeds, which makes a failed split a pure rollback, and the targeted
and unfocused workspace split paths stop fabricating history.
insert_pane_near now takes the focus intent, so an unfocused pane move
leaves the target tab's history alone. The layout-level focused-split
helpers become test-only; production splits all flow through the
target-taking path.

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-05 00:35:15 +03:00
Can Celik 10eb0bc744 fix: propagate host color scheme to pane apps (#2214)
refs #714
2026-08-03 02:05:27 +03:00
Ogulcan Celik e27a4ea427 perf: skip rendering hidden pty updates 2026-07-28 23:29:11 +03:00
Ogulcan Celik e16d7d8c07 fix: preserve linked worktree workspace labels 2026-07-28 15:34:13 +03:00
Ogulcan Celik 81f355fada perf: replace agent spinners with static status marks 2026-07-28 14:56:53 +03:00
Can Celik d4e0dd3d90 perf: eliminate repeated workspace git discovery (#1842)
* perf: eliminate repeated workspace git discovery

refs #1838

* fix: keep workspace labels current without extra redraws

refs #1838

* fix: retain discovered workspace git metadata

refs #1838
2026-07-25 04:26:55 +03:00
Ogulcan Celik a02c3a69bb refactor: centralize new terminal cwd selection
replaces contributions from Pitchfork-and-Torch
2026-07-22 22:41:01 +03:00
Ogulcan Celik d30ab1b54f feat: add plugin-driven agent views and startup hooks 2026-07-20 00:55:36 +03:00
Ogulcan Celik 550e9f8cc0 fix: follow foreground process group leader cwd
refs #1472
2026-07-16 23:13:41 +03:00
Ogulcan Celik 616d1dd812 fix(windows): suppress noninteractive process windows
refs #1468
2026-07-16 21:23:53 +03:00
Ogulcan Celik 2c7c8beb07 feat: add floating popup panes
refs #1125
2026-07-15 04:02:14 +03:00
Ogulcan Celik 5cfe5e5e73 feat: add configurable sidebar metadata tokens 2026-07-13 03:30:13 +03:00
Pitchfork-and-Torch 4f7fcc48d1 fix: follow foreground cwd for new terminals
refs #1245
2026-07-10 15:06:54 +03:00
Ogulcan Celik edd08e895f refactor: route pane layout tui actions through runtime wrappers 2026-07-04 03:15:11 +03:00
Ogulcan Celik 54490254f7 feat: sort agent panel by priority
refs #318
2026-06-17 16:08:43 +03:00
Ogulcan Celik 4ffd99c2ec fix: keep auto tab labels compact 2026-06-15 04:56:03 +03:00
Ogulcan Celik 226e87306d fix: preserve tab identity across restored sessions 2026-06-14 05:30:20 +03:00
Ogulcan Celik fbd20ad6e4 feat: add plugin v1 system
Add manifest-driven plugin actions, event hooks, pane entrypoints, link handlers, and host APIs.

Support plugin link, GitHub install, build commands, installed plugin registry, pane movement, runtime context, and plugin docs.
2026-06-14 03:47:07 +03:00
Ogulcan Celik d35c642ef3 feat: add pane move api and cli
refs #299
2026-06-13 01:59:24 +03:00
Ogulcan Celik f7a7da03fc fix: stabilize public pane and tab ids
refs #569
2026-06-12 19:10:09 +03:00
Ogulcan Celik 5d7e56737e fix: support worktree actions from bare repos
refs #497
2026-06-07 01:16:42 +03:00
Ogulcan Celik 556b16b2df feat: add pane navigation controls
refs #421

refs #330

related discussions:

https://github.com/ogulcancelik/herdr/discussions/422

https://github.com/ogulcancelik/herdr/discussions/438

https://github.com/ogulcancelik/herdr/discussions/442
2026-06-05 22:06:02 +03:00
LaneandCan Celik a0b124c382 fix: resolve git branch names in reftable repos (#423)
* fix: resolve git branch names in reftable repos

refs #384

* fix: limit git plumbing to reftable refs

refs #384

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-06-02 22:23:51 +03:00
Ogulcan Celik fc4e1bbf6b perf: reduce sidebar git polling overhead
refs #353
2026-05-30 23:58:34 +03:00
Ogulcan Celik 8df1639048 fix: use login shells for macos panes
refs #350
2026-05-30 01:55:36 +03:00
Ogulcan Celik 9e302984cc feat: expose foreground cwd in pane info
refs #345
2026-05-29 20:38:55 +03:00
Ogulcan Celik 3750e0bae2 feat: add pane metadata reporting
refs #36
2026-05-26 17:10:28 +03:00
Ogulcan Celik 0148c1379b feat: add git worktree workspace management
refs #137
2026-05-22 02:23:35 +03:00
Ogulcan Celik 866aaf740e refactor: separate server client boundaries 2026-05-21 20:22:57 +03:00
Ogulcan Celik 2b97799b67 feat: add configurable default shell
refs #196
2026-05-20 00:34:27 +03:00
Ogulcan Celik b04c4ca3da fix: show agent names in sidebar
refs #145
2026-05-19 14:27:41 +03:00
Ogulcan Celik a36da363f1 refactor: extract terminal state and runtime from panes 2026-05-17 01:41:16 +03:00
Ogulcan Celik e4de58b37f feat: add agent start for server-owned terminals 2026-05-17 01:41:16 +03:00
Ogulcan Celik 86adf88351 feat: add terminal identity and agent cli facade 2026-05-17 01:41:16 +03:00
Ogulcan Celik 72770305d3 feat: add hook-owned custom agent status labels 2026-05-16 02:26:14 +03:00
Ogulcan Celik 55cdf2e8f8 fix: stabilize integration agent state reports 2026-05-11 16:13:17 +03:00
Can Celik 3397e1ce29 feat: add persistent server-client sessions
Make herdr persistent by default.

   Launching herdr now starts or reattaches to a background session
   server. Clients can detach and reattach while panes and agent
   processes keep running. Session mode now supports multi-client attach,
   auto-detect startup, and a thin-client/headless-server split.

   This also refactors the large app, ui, input, pane, config,
   workspace, and persistence modules into smaller focused submodules,
   while preserving behavior and colocating tests with the code they
   exercise.

   Upgrade notes:
   - persistence mode is now the default
   - in-app quit detaches the current client instead of stopping the server
   - use `herdr server stop` to stop the background session
   - use `--no-session` for the old single-process behavior
   - default socket paths now live under the config directory
2026-04-21 16:30:04 +03:00