Skip to content

v1.0: themes + stable release#9

Merged
sebasv merged 7 commits intofeat/v0.9-worktree-mgmtfrom
feat/v1.0-polish
Apr 22, 2026
Merged

v1.0: themes + stable release#9
sebasv merged 7 commits intofeat/v0.9-worktree-mgmtfrom
feat/v1.0-polish

Conversation

@sebasv
Copy link
Copy Markdown
Owner

@sebasv sebasv commented Apr 21, 2026

Summary

Theme support (default / tokyonight / gruvbox) + stable 1.0.0 release. Stacked on #8.

Keybindings frozen for 1.x; v1.2 will add user configurability without breaking current bindings.

Test plan

  • 87 tests (unit test for theme resolution; fixed flaky path-collision test)
  • Release build clean

🤖 Generated with Claude Code

@sebasv sebasv mentioned this pull request Apr 21, 2026
2 tasks
@sebasv sebasv force-pushed the feat/v0.9-worktree-mgmt branch from 0d9ef17 to efd83ee Compare April 21, 2026 19:51
@sebasv sebasv force-pushed the feat/v1.0-polish branch 2 times, most recently from 9c1c78e to ce2d5c0 Compare April 21, 2026 20:35
@sebasv sebasv force-pushed the feat/v0.9-worktree-mgmt branch from efd83ee to 7858ae9 Compare April 21, 2026 20:35
@sebasv sebasv force-pushed the feat/v1.0-polish branch from ce2d5c0 to cebd159 Compare April 21, 2026 20:41
@sebasv sebasv force-pushed the feat/v0.9-worktree-mgmt branch from 7858ae9 to 741327a Compare April 21, 2026 20:41
- `src/theme.rs`: `Theme { accent, dim, success, warn, danger }` with
  built-in palettes `default`, `tokyonight`, `gruvbox` (serde kebab-case).
- Config `[theme] base = "..."` drives the palette; unknown names fall
  through to the default via serde's enum failure handling.
- `AppState.theme` is populated at startup; main-pane border uses
  `theme.accent` instead of a hard-coded Cyan.
- Fix flaky `derive_worktree_path_avoids_collisions` — was relying on
  `/tmp` being clean between runs; now builds an isolated parent dir.

Keybindings frozen for the 1.x series; configurability lands in v1.2.
87 tests green. Release build clean.

Version 1.0.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sebasv sebasv force-pushed the feat/v0.9-worktree-mgmt branch from 741327a to c7a743d Compare April 21, 2026 20:52
@sebasv sebasv force-pushed the feat/v1.0-polish branch from cebd159 to 2822c05 Compare April 21, 2026 20:52
sebasv and others added 6 commits April 21, 2026 23:01
ThemeName::next() wraps default → tokyonight → gruvbox → default.
AppState gains theme_name alongside theme so the current position is
tracked without touching config. F2 is intercepted globally (before PTY
dispatch) so it works from any focus without sending an escape sequence
to the shell.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
… watchers, scrollable help

- Fix linked-worktree git watcher: RecursiveMode::Recursive so index
  changes in .git/worktrees/<name>/ trigger RepoDirty events
- New worktree modal: branch picker (local + remote); Tab toggles to
  free-text mode; remote-only branches get a slug-suffixed local name
  with up to 5 collision retries
- Kill worktree: offers to delete branch locally after removal; detects
  unmerged commits and shows a force-delete confirmation; warns when an
  open PR would be closed
- Add repo modal: directory autocomplete on typed prefix (↑/↓ navigate,
  Tab accept); top 10 matches, hides dot-dirs
- Help overlay: scrollable (j/k) and sizes to the terminal height so it
  no longer overflows on small screens
- Update DESIGN.md to reflect all v1.0 decisions

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Previously Ctrl+H fell through to key_to_pty_bytes as \x08 (backspace)
and Ctrl+L as \x0c (clear screen). Intercept both — plus Ctrl+Arrow —
in main_reserved_keys before PTY dispatch. Also updates the help text
which incorrectly listed Alt+h/l.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
…window

Replaced Paragraph::scroll() — which shifts the render start but can
still allow content to bleed past the block border in ratatui 0.29 —
with an explicit skip/take on the lines vector. Content outside the
visible window is never passed to the renderer at all.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Applications like atuin send ESC[6n (Device Status Report) to query
the cursor position before drawing their TUI.  The vt100 parser
consumed the sequence silently, leaving atuin waiting for a
ESC[row;colR reply that never arrived — triggering its timeout error.

The reader thread now detects ESC[6n in the PTY output stream, reads
the current cursor position from the vt100 parser, and injects
ESC[row;colR back into the PTY master writer.  The writer is moved
into an Arc<Mutex<>> so it can be shared safely with the reader thread.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
When the help content exceeds the visible area, a dim "↓ more" label
appears on the bottom border. When the user has scrolled down, a dim
"↑" label appears on the top-right of the border. Both disappear when
no longer applicable.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
@sebasv sebasv merged commit 04b7447 into feat/v0.9-worktree-mgmt Apr 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant