Commit Graph

1255 Commits

Author SHA1 Message Date
Can Celik 5b0be42e04
fix(windows): restore system notifications and sound playback (#2019) 2026-07-29 15:02:32 +03:00
Ogulcan Celik 73d92004f5 ci: remove approved contributor bypass 2026-07-29 02:54:53 +03:00
kangal-bot a5920bee86 chore: approve merged contributor we11adam 2026-07-28 23:36:24 +00:00
Adam Lau a4b18b6e21
fix: preserve navigate mode after pane focus (#1993)
refs #1850

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-29 02:36:16 +03:00
kangal-bot 807033b8fc chore: approve merged contributor patrick-xin 2026-07-28 23:18:46 +00:00
Patrick Xin b7317c97ef
docs: add simplified chinese readme (#1990)
* docs: add simplified chinese readme

* fix: publish simplified chinese readme

* fix: require localized readme for releases

* docs: publish simplified chinese readme

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-29 02:18:30 +03:00
Ogulcan Celik bbe78f518b fix: restore python3 commit hook 2026-07-29 01:29:14 +03:00
JJ Liebig 9354761112
fix: select windows python command in commit hook (#1994) 2026-07-29 01:22:07 +03:00
kangal-bot 6a0ba22615 chore: approve merged contributor bioform 2026-07-28 22:21:07 +00:00
Andrew Krasnoff a0a6e13f11
fix: count ptmx master fds under devpts layouts (#1984)
live_server_holds_one_pty_master_fd_per_pane counted only /proc/<pid>/fd links
resolving to exactly /dev/ptmx. On devpts setups such as WSL2 and many
containers, a PTY master fd resolves to /dev/pts/ptmx instead, so the test found
zero masters and failed with "had 0 ptmx master fds; expected 1" even though the
server held the pane's master fd. Match both ptmx node paths; pty slaves still
resolve to /dev/pts/<N> and stay uncounted, so the one-master-per-pane invariant
is unchanged.
2026-07-29 01:20:58 +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
JJ Liebig 1491b7dd9c
fix: ignore nested codex session reports (#1927)
* fix: ignore nested codex session reports

refs #1789

* test: cover matching codex thread id

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-28 04:13:35 +03:00
Ogulcan Celik b499e611b6 fix: resolve relative plugin commands from plugin root
refs #1949
2026-07-28 02:19:33 +03:00
Ogulcan Celik 7383f120c6 docs: update sponsor acknowledgements 2026-07-28 00:59:17 +03:00
Season Saw a979916568
fix: keep focus on the current workspace when another self-closes (#1912)
handle_pane_died only clamped the stale active/selected indices after
removing a workspace that closed itself, so it never shifted them down
when the removed workspace sat before the focused one. With workspaces
[x, y, z] and focus on y, removing x left active pointing at z, silently
moving the user into a workspace they did not select.

Resolve both indices by workspace id across the removal, as
close_selected_workspace already does, keeping the clamp as the fallback
for when the removed workspace was the focused one. Also scroll the
focused workspace back into view, which the explicit-close path already
did and this one did not.

refs #1621

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-27 16:17:14 +03:00
JJ Liebig 6d1bedee3e
fix: make native windows checks reliable (#1925) 2026-07-27 14:15:23 +03:00
kangal-bot dc2506ea8c chore: approve merged contributor season179 2026-07-26 23:25:39 +00:00
Season Saw a79b3d5580
fix: close workspace when api closes its last tab (#1899)
herdr tab close on a workspace's only tab returned tab_close_failed,
while the TUI close-tab action on the same tab closes the tab and
cascades to closing the workspace. Cascade in the API too, emitting
tab.closed then workspace.closed. When the cascade would close a whole
worktree group, return confirmation_required instead, matching
pane.close and the TUI prompt.

refs #1760
2026-07-27 02:25:29 +03:00
kangal-bot 7e96b1b7e8 chore: approve merged contributor Pimpmuckl 2026-07-26 23:17:08 +00:00
JJ Liebig 04205ac070
fix: preserve shift-enter in windows panes (#1909)
refs #1743
2026-07-27 02:16:57 +03:00
Ogulcan Celik bb29eedb72 fix: delay agent prompt submission
refs #1878
2026-07-27 00:12:25 +03:00
Ogulcan Celik 471041690a fix: ignore empty clipboard writes
refs #1893
2026-07-26 17:08:03 +03:00
Ogulcan Celik 2debcec74c fix: restrict unapproved pull requests to bug fixes 2026-07-26 15:57:59 +03:00
Ogulcan Celik e1a32e5865 ci: harden pull request workflow execution 2026-07-26 15:40:59 +03:00
kangal-bot 65713cefcc chore: approve merged contributor olafkfreund 2026-07-26 12:36:04 +00:00
Olaf Krasicki-Freund d231fc0663
fix(nix): include SKILL.md in the package fileset (#1890)
refs #1889
2026-07-26 15:35:52 +03:00
Ogulcan Celik 61f6400675 fix: repaint after transient terminal resizes 2026-07-26 15:05:28 +03:00
Ogulcan Celik 19cd372f25 fix: preserve prefix mode for modifier events
refs #1870
2026-07-26 14:43:48 +03:00
Ogulcan Celik cb2e17a4a5 feat: print bundled agent skill and hint next cli steps 2026-07-26 14:29:37 +03:00
kangal-bot 51744cef01 chore: approve merged contributor yianL 2026-07-26 11:25:58 +00:00
Yi-An Lai 165dca453d
fix: preserve focus when closing a non-focused workspace (#1877)
refs #1328
2026-07-26 14:25:46 +03:00
Can Celik e536bd8bd9
fix: support non-us shifted keybindings (#1876)
* fix: support non-us shifted keybindings

refs #1870

* docs: require current pull request base
2026-07-26 04:22:05 +03:00
Can Celik 8843bbb0c4
fix: improve sidebar worktree hierarchy and reordering (#1873)
* fix: clarify sidebar worktree hierarchy

refs #1694

* feat: reorder worktree groups as a unit

refs #1694
2026-07-26 02:45:44 +03:00
Can Celik 547aba8e0a
fix: avoid renders for passive mouse motion (#1872)
refs #1865
2026-07-26 00:28:11 +03:00
Can Celik b01fc37e66
perf: avoid full pane renders for spinner animation (#1868) 2026-07-25 23:20:08 +03:00
Ogulcan Celik da40b1aa34 ci: gate pull request review by scope 2026-07-25 23:04:43 +03:00
Ogulcan Celik c7b3d8abcc fix(nix): add rust-analyzer to development shell 2026-07-25 22:28:54 +03:00
Ogulcan Celik f67803f4ca chore: consolidate project skills 2026-07-25 21:04:01 +03:00
Ogulcan Celik b9ebd238f8 docs: define maintainer and agent contribution workflows 2026-07-25 20:58:20 +03:00
joonhwan 6cfaa079a9
feat: switch IME to ASCII in prefix mode on Windows (Korean IME) (#1823)
* feat: switch IME to ASCII in prefix mode on Windows

Extend switch_ascii_input_source_in_prefix to Windows: detect IME state
via WM_IME_CONTROL and toggle to ASCII with SendInput for the Korean IME.
Other IME languages are detected and left unchanged.

refs #1802

* docs: clarify Windows (Korean IME) support for prefix ASCII switching

Follow-up to the Windows prefix ASCII switch, which extended
switch_ascii_input_source_in_prefix to Windows but left the surrounding
text describing macOS only.

- Settings row label: "(macOS)" -> "(macOS/Windows)", plus its test.
- Generalize the Windows behavior wording to "switches the IME to
  English (ASCII) input" in the config-reference.json entry and the
  model.rs doc comment, and state that Windows support is currently
  limited to the Korean IME.
- Add a :::caution aside noting the Korean-IME-only limitation to the
  en/ja/zh preview docs, keeping the three translations in sync.

refs #1802

* fix: warn when prefix IME toggle injection is incomplete

SendInput can queue fewer events than requested (for example when blocked
by UIPI), which would otherwise leave the IME silently stuck in ASCII or
native mode. Log a warning with the sent and expected counts so the failure
is diagnosable.

refs #1802

* fix: guard prefix IME restore and correct open-status naming

Address maintainer review on the Windows prefix ASCII switch:

- Restore only when safe: store the foreground window at switch time and,
  before toggling back, require that the same window is still focused and
  the IME is still in English. This stops restore from toggling another
  application or overriding a manual return to Hangul during prefix mode.
- Report injection success from send_vk_tap and only arm restoration when
  the initial toggle landed; on a partial injection retry the dropped
  key-up so a key is not left logically held down. The injection policy is
  split into send_vk_tap_with(inject) so the success, partial, and failure
  branches are unit-tested without the real SendInput.
- Correct the WM_IME_CONTROL sub-command naming: 0x0005 is IMC_GETOPENSTATUS
  (IME open state), not IMC_GETCONVERSIONMODE. Behavior is unchanged; the
  constant, comments, and tests now describe the open-status read.

refs #1802

* fix: bound IME open-status read with a timeout

The prefix IME switch reads IMC_GETOPENSTATUS via WM_IME_CONTROL, which
crosses into the terminal-emulator process. A plain SendMessageW would block
herdr's client thread until that process responds, indefinitely if it hangs.
Read through SendMessageTimeoutW with SMTO_ABORTIFHUNG and a short timeout
instead; on timeout the switch is skipped and restore does nothing, so a hung
host process can no longer freeze prefix-mode entry or exit.

refs #1802

* fix: preserve windows ime restoration after partial injection

refs #1802

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-25 20:52:45 +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 b33e5f973f fix: copy retained mouse selections with keyboard shortcuts
refs #1782
2026-07-25 02:54:20 +03:00
Ogulcan Celik 0065a0ef34 fix: run pi worktree ext on background 2026-07-25 02:54:12 +03:00
kangal-bot fc0ce8f32f chore: approve merged contributor ogulcancelik 2026-07-24 23:40:24 +00:00
Can Celik 8afd52ae57
fix: bundle modern ConPTY on Windows (#1828)
refs #1533
refs #1644
2026-07-25 02:40:14 +03:00
Ogulcan Celik 5f1957c27b fix: harden hermes lifecycle detection 2026-07-25 01:05:14 +03:00
corrius 38d2b0780c
feat: filter keybind help (#1832)
* feat: filter keybind help

refs #1825

* fix: recognize shifted slash in keybind help

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-24 22:52:17 +03:00
Enrico Carlesso e9b22084e0
feat: add grok cli integration for native session restore (#1807)
* feat: add grok cli integration for native session restore

tl;dr: adds `herdr integration install grok` (session-identity tier: a
SessionStart hook reports the grok session id for native restore; state
stays screen-detected via the bundled manifest).

Grok merges every ~/.grok/hooks/*.json, so install writes a
self-contained hooks/herdr.json registering a SessionStart hook next to
hooks/herdr-agent-state.sh, and never touches other hook files. The hook
prefers $GROK_SESSION_ID (injected into every grok hook process) and
reports through the socket API; herdr:grok is a reserved-native-state
source so screen detection stays authoritative. Restore uses
`grok --resume <id>`. Additive JSON API change; no protocol bump; the
schema artifact is regenerated.

refs #1800

* fix: honor GROK_HOME and validate grok hook config in status

Review follow-ups: grok_dir now resolves GROK_CONFIG_DIR (herdr test
seam) before GROK_HOME (the grok CLI's own config-home override) before
~/.grok, so hook installs land where grok actually looks. Integration
status now also validates the herdr-owned hooks/herdr.json next to the
hook script — missing, corrupt, or no-longer-referencing configs report
the install as outdated instead of masking a hook grok never invokes.

refs #1800

* fix: validate the exact grok session hook command in status

The config validator matched on a filename substring, so a SessionStart
command like `echo herdr-agent-state.sh`, or one invoking the script
without the `session` action, still reported the integration as current
while grok never delivered a session id. Status now compares against the
exact command the installer writes, via a shared builder, and the
degradation tests cover both nonfunctional shapes.

refs #1800

* fix: require a command-type grok session hook in status validation

A config entry carrying the exact generated command under a non-command
hook type (e.g. "http") is never executed by grok, so it must not report
the integration as current. The validator now also requires
type = "command", with a degradation test for the mismatched-type shape.

refs #1800

* fix: validate the complete grok hook config

refs #1800

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-24 22:05:20 +03:00