native macOS codings agent orchestrator
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Demote release-note section headings to `### …`

Section headings (New/Fixed/Improved) were rendering as `<h2>` on Prowl-Site
because the markdown used `## `, the same level as the version header.
Prowl-Site's CSS targets `:global(h3)`, so the styled green monospace look
only applied to older entries that already used `### …`. Demote the canonical
form to `### New` / `### Fixed` / `### Improved`, sitting one level below the
`## [VERSION]` header that release.sh prepends.

- Backfill all 28 affected entries in CHANGELOG.md.
- Flip release-notes.sh's prompt and lint to require `### …` and reject both
`## …` and `**…**`.
- Flip release.sh's inline grep guard to the same direction.
- Companion change: 19 GitHub release bodies (v2026.3.27..v2026.4.29) were
rewritten via `gh release edit` so the public release pages match.

onevcat ca6d6022 ee466ee4

+50 -46
+28 -28
CHANGELOG.md
··· 4 4 5 5 This release focuses on Shelf-mode responsiveness — switching books, especially via keyboard shortcuts, is noticeably snappier after a sweep of unnecessary SwiftUI invalidations. 6 6 7 - ## New 7 + ### New 8 8 9 9 - Repositories can now have a custom display name. Open Repo Settings and set a **Display Name** to override the folder-derived title in the sidebar, toolbar, and canvas. Useful when multiple checkouts share a generic folder name like `src`. Clearing the field reverts to the original folder name. 10 10 11 - ## Fixed 11 + ### Fixed 12 12 13 13 - Switching between books in Shelf mode is noticeably smoother, particularly when using keyboard shortcuts. A cascade of unnecessary SwiftUI invalidations was traced and removed. 14 14 - A trailing space typed at the end of the Display Name field is no longer silently dropped. ··· 17 17 18 18 This release adds per-repository visual identity across the entire app. 19 19 20 - ## New 20 + ### New 21 21 22 22 - Each repository can now have a custom icon and color. Pick an SF Symbol or upload any image, and choose from 10 system colors in Repo Settings. The identity appears in the sidebar row, shelf spine header and background, and canvas card title bar. 23 23 - Custom Command tabs now display the command's configured icon for the lifetime of the tab. Run Script tabs keep the play icon throughout the run instead of briefly flashing before switching to the detected command icon. 24 24 - Repo Settings is now accessible from the shelf spine context menu. 25 25 26 - ## Fixed 26 + ### Fixed 27 27 28 28 - The "Choose Image" file picker in Repo Settings now opens inside the repository's working directory instead of the last-used Finder location. 29 29 - Hovering the spine's New Tab, Split Vertically, and Split Horizontally buttons now shows the correct per-button tooltip with the associated shortcut key. Previously, the book-level tooltip masked all three buttons. ··· 31 31 32 32 ## [2026.4.27](https://github.com/onevcat/Prowl/releases/tag/v2026.4.27) 33 33 34 - ## Fixed 34 + ### Fixed 35 35 36 36 - Fixed a bug where terminal windows could open in the wrong Light or Dark appearance at startup. 37 37 ··· 39 39 40 40 This release brings mouse-driven Canvas navigation and improves reliability for long-running sessions. 41 41 42 - ## New 42 + ### New 43 43 44 44 - **Canvas zoom with Cmd+scroll wheel**: hold Cmd and scroll to zoom in or out, anchored on the cursor position. Works with both mouse wheels and trackpads. 45 45 - **Canvas pan with middle-click drag**: press and drag the middle mouse button to pan the Canvas. Terminals never see the click, and middle-click works normally outside Canvas mode. 46 46 47 - ## Fixed 47 + ### Fixed 48 48 49 49 - The `prowl` CLI no longer loses its connection to the app after a few days. macOS periodically cleans `/tmp`, which was deleting the socket file and causing `APP_NOT_RUNNING` errors even with the app running. The socket is now stored in `~/Library/Application Support/com.onevcat.prowl/`. A one-time app relaunch is required after upgrading to bind the new path. 50 50 - Prowl now applies a runtime Ghostty theme fallback when you have a single theme configured and it mismatches the current macOS appearance (light/dark). No changes are written to your Ghostty config file. ··· 55 55 56 56 Tab icons now update automatically based on the running command, making it easy to tell at a glance what each terminal tab is doing. 57 57 58 - ## New 58 + ### New 59 59 60 60 - **Auto-detecting tab icons**: Prowl now detects the running command from the terminal title and displays a matching icon in the tab bar and Shelf spine. Brand icons are available for coding agents (Claude, Codex, Gemini, Copilot, Amp, and more), editors, package managers, runtimes, VCS tools, containers, and databases — over 55 command mappings in total. The icon stays visible after a short-lived command finishes as a "what is this tab for" hint, and is never overridden if you have manually locked an icon via the Icon Picker. 61 61 - **Context-aware Shelf close action**: The Shelf spine context menu now shows "Close Worktree" or "Close Folder" depending on the book type, replacing the old "Remove Book" entry. Closing removes the book from the Shelf without touching the underlying directory or worktree. This also works on the main worktree, which previously showed the option but did nothing. 62 62 63 - ## Fixed 63 + ### Fixed 64 64 65 65 - Staggered background refresh schedules across worktrees so periodic git and pull-request checks no longer fire simultaneously, reducing CPU spikes when many repos are open. 66 66 - Shelf empty-state wording now consistently refers to worktrees, matching the rest of the UI. ··· 69 69 70 70 This release introduces Shelf, a new way to view and navigate your worktrees, along with a significant performance improvement that eliminates a source of main-thread hangs. 71 71 72 - ## New 72 + ### New 73 73 74 74 - **Shelf view**: a new presentation mode that stacks your worktrees as books with vertical spines. Press `Cmd+Shift+Enter` or click the Shelf button in the sidebar toolbar to toggle it. Each spine shows the worktree name, branch, and tab slots; click any spine to open that book. 75 75 - **Navigation shortcuts in Shelf**: navigate between books with `Cmd+Ctrl+←` / `Cmd+Ctrl+→`, navigate between tabs with `Cmd+Ctrl+↑` / `Cmd+Ctrl+↓`, or jump directly to a specific book with `Ctrl+Option+1–9`. All bindings are rebindable in Settings → Shortcuts. 76 76 - **Command-key tab hints**: hold `Cmd` while in Shelf to swap each tab slot's icon for its `1–9` digit, making keyboard switching more discoverable. 77 77 - **Default View setting**: choose whether Prowl launches into the standard view or Shelf in Settings → General. 78 78 79 - ## Improved 79 + ### Improved 80 80 81 81 - Eliminated a main-thread hang (App Hang) triggered by rapid file-change or pull-request-refresh bursts. A repeated `standardizedFileURL` comparison in the sidebar render loop was accumulating enough work to stall the UI for 3+ seconds; the result is now computed once per worktree at construction time, so the sidebar stays responsive under heavy activity. 82 82 83 - ## Fixed 83 + ### Fixed 84 84 85 85 - Shelf now correctly restores focus to the open book's terminal after SwiftUI reparenting, and properly tracks which worktrees the user has actually opened rather than showing all known worktrees. 86 86 - Toggling into Shelf from Canvas now honors the card that was focused in Canvas as the open book, rather than falling back to a default. ··· 89 89 90 90 This release focuses on canvas usability improvements and broader code host support. 91 91 92 - ## New 92 + ### New 93 93 94 94 - Canvas cards now show close and expand buttons in the title bar when you hover over them, letting you act on any card without focusing it first. 95 95 - When a focused canvas card is closed (via button, Cmd+W, or any other method), focus automatically moves to the nearest surviving card so the highlighted state stays consistent. ··· 97 97 - Code host actions in the toolbar and command palette are now labeled with the detected host name (e.g., "Open on GitHub" vs. "Open on GitLab"). 98 98 - "Change Tab Icon..." and "Open Repository on Code Host" are now hidden from the command palette's empty-query list to reduce noise. Type to search for either action. 99 99 100 - ## Fixed 100 + ### Fixed 101 101 102 102 - Restored two-finger scroll for TUI programs (pagers, editors, etc.) inside canvas mode. A previous optimization incorrectly forwarded scroll events to the canvas when Ghostty reported no scrollback buffer, breaking apps like `nvim`, `less`, and `htop`. 103 103 - Fixed a crash (EXC_BREAKPOINT abort) that could occur during ANR detection due to Sentry invoking a Swift concurrency callback off the main thread. ··· 106 106 107 107 This release focuses on tab customization and a less-interrupting update experience. 108 108 109 - ## New 109 + ### New 110 110 111 111 - **Tab icons**: Right-click any terminal tab and choose "Change Tab Icon..." to pick from a curated SF Symbol preset grid or enter any SF Symbol name directly. You can also invoke this from the Command Palette (Cmd+P, search "icon"). Custom icons survive app restarts when *Restore Terminal Layout on Launch* is enabled. 112 112 - **Rename from context menu**: "Change Tab Title..." is now available directly in the tab right-click menu, in addition to the existing keyboard shortcut flow. 113 113 - **Quiet update notifications**: Available updates no longer interrupt your session with a dialog. A badge appears in the toolbar instead; click it (or use "Check for Updates...") when you are ready to install. 114 114 - **Anonymous quality telemetry**: To help improve Prowl, this release adds lightweight anonymous crash reporting and memory usage telemetry. No personal data is collected. If you prefer not to participate, you can opt out in Settings. 115 115 116 - ## Fixed 116 + ### Fixed 117 117 118 118 - The "Download and install automatically" setting has been removed; it conflicted with the new silent update detection flow and was not functional in this build. 119 119 ··· 121 121 122 122 This release focuses on Custom Command power-ups and two Canvas reliability fixes. 123 123 124 - ## New 124 + ### New 125 125 126 126 - **Custom Commands can now open a New Split**, running your command in a new pane alongside the current terminal. Choose split direction (left, right, up, down) per command in Settings. 127 127 - **Close on success** toggle for New Tab and New Split targets: when enabled, the tab or split is automatically dismissed after the command exits with code 0, leaving it open on failure so you can inspect the output. 128 128 - The toolbar status badge now animates in and out smoothly, and a brief toast appears when a Custom Command completes successfully. 129 129 130 - ## Fixed 130 + ### Fixed 131 131 132 132 - Creating split panes with Cmd+D or Cmd+Shift+D while in Canvas mode no longer freezes rendering. All panes now display and accept input correctly. 133 133 - Two-finger pan on the Canvas is no longer interrupted when the cursor drifts over a focused terminal card mid-gesture. Scrolling on a card with no scrollback content now pans the canvas instead of being silently consumed. 134 134 135 135 ## [2026.4.16](https://github.com/onevcat/Prowl/releases/tag/v2026.4.16) 136 136 137 - ## Fixed 137 + ### Fixed 138 138 139 139 - Fixed a race condition when entering Canvas view that could leave the terminal surface blank. 140 140 141 141 ## [2026.4.15](https://github.com/onevcat/Prowl/releases/tag/v2026.4.15) 142 142 143 - ## New 143 + ### New 144 144 145 145 - **Fetch before worktree creation**: Prowl can now run `git fetch` against the relevant remote before creating a new worktree. The option is on by default and can be toggled in Settings > Worktree. Fetch errors are logged but do not block worktree creation. 146 146 - **Merged worktree action**: The "auto-archive on merge" toggle has been replaced with a three-option picker — Do Nothing, Archive, or Delete — controlling what happens to a worktree when its pull request is merged. Find it in Settings > Worktree. Existing configurations migrate automatically. 147 147 - **Global defaults for copy flags and merge strategy**: The "copy ignored files", "copy untracked files", and "pull request merge strategy" settings can now be configured once as global defaults in Settings, with optional per-repository overrides. Repository-level pickers show the current global value when no override is set. 148 148 149 - ## Fixed 149 + ### Fixed 150 150 151 151 - Terminals could appear blank after exiting Canvas view due to the surface losing its host attachment. Prowl now detects and recovers from this state automatically. 152 152 ··· 154 154 155 155 This release focuses on worktree management improvements and quality-of-life fixes. 156 156 157 - ## New 157 + ### New 158 158 159 159 - **Auto-delete archived worktrees**: A new setting in Worktree Settings lets you configure a period (1, 3, 7, 14, or 30 days) after which archived worktrees are deleted automatically. 160 160 - **Reveal in Sidebar**: Press Shift+Cmd+L to scroll the sidebar to the currently selected worktree, expanding its repository section if collapsed. 161 161 - **Archived worktrees discoverability**: Archive confirmation dialogs now tell you where to find archived worktrees (Menu Bar > Worktrees, or Control+Cmd+A). A "View Archived Worktrees" entry is also available in the command palette. 162 162 163 - ## Fixed 163 + ### Fixed 164 164 165 165 - Restored terminal surfaces no longer spin the CPU and GPU when they are not displayed, keeping resource usage low for non-visible tabs after session restore. 166 166 ··· 168 168 169 169 Tab layout and Worktrees menu discoverability are the main themes of this release. 170 170 171 - ## New 171 + ### New 172 172 173 173 - All worktrees and plain folders now appear in the Worktrees menu, regardless of count. Previously only the first 9 were shown. Items beyond the 9th no longer have keyboard shortcuts but remain reachable via the menu or **Help > Search**. 174 174 - Manually renamed tab titles and icons are now saved in the terminal layout snapshot and restored when the layout is reloaded. 175 175 - Added Homepage and Release Notes links to the Help menu and sidebar footer. 176 176 177 - ## Fixed 177 + ### Fixed 178 178 179 179 - Plain folders were missing from the Worktrees menu entirely; they now appear in the same order as the sidebar. 180 180 181 181 ## [2026.4.7](https://github.com/onevcat/Prowl/releases/tag/v2026.4.7) 182 182 183 - ## Fixed 183 + ### Fixed 184 184 185 185 - When using a transparent background (`background-opacity < 1`) in dark mode on macOS 26, the titlebar and window border now correctly appear dark-tinted instead of showing an unwanted light glass effect. 186 186 - The sidebar footer now displays a proper frosted glass effect when the background is transparent, rather than a plain semi-transparent fill that let the wallpaper bleed through without blur. ··· 190 190 191 191 This release brings a redesigned sidebar with a modern, cleaner, and more compact layout, along with reliability fixes across the terminal surface and CLI. 192 192 193 - ## New 193 + ### New 194 194 195 195 - **Redesigned Sidebar** — the sidebar has been completely re-laid out for a modern, cleaner, and more compact look, giving you more room to focus on your work. 196 196 - **Reveal in Finder** is now available in the worktree context menu, opening the worktree directory directly in Finder. ··· 199 199 - CLI tool install and uninstall results now show a toolbar toast on the main window for all entry points (Command Palette, menu bar), so you always get feedback regardless of whether Settings is open. 200 200 - `prowl key` now correctly emits ANSI control characters for `Ctrl-[`, `Ctrl-\`, `Ctrl-]`, `Ctrl-^`, and `Ctrl-_` combos, and uppercase letters preserve their shift meaning. 201 201 202 - ## Fixed 202 + ### Fixed 203 203 204 204 - Hovering a worktree row no longer causes a vertical layout jump when pin and archive buttons appear. 205 205 - Archive, Delete, pin, and archive buttons are now hidden for the main worktree, where those actions do not apply.
+16 -13
doc-onevcat/scripts/release-notes.sh
··· 130 130 5. **Format**: 131 131 - Start with a one-line summary sentence of the release theme if there is a 132 132 clear one; otherwise jump straight to the section. 133 - - Group items into sections using literal Markdown level-2 headings: 134 - `## New` for features/enhancements, `## Fixed` for bug fixes. Omit a 135 - section if it has no items. Always use the `## ` heading syntax — never 136 - bold-paragraph forms like `**New**` or `**Fixed**`, and never `### `. 133 + - Group items into sections using literal Markdown level-3 headings: 134 + `### New` for features/enhancements, `### Fixed` for bug fixes, and 135 + optionally `### Improved` for non-feature, non-bug enhancements. Omit a 136 + section if it has no items. Always use the `### ` heading syntax — never 137 + bold-paragraph forms like `**New**` or `**Fixed**`, and never `## ` 138 + (which is reserved for the version header). 137 139 - Use a flat bullet list (`-`) within each section. 138 140 - Each bullet should be one or two sentences maximum. 139 141 - End with nothing — no sign-off, no footer. ··· 180 182 181 183 # Lint a release-notes file against the CHANGELOG format used by Prowl-Site. 182 184 # Returns 0 on clean, 1 if violations were found (also prints them). 183 - # Section headings must be `## New` / `## Fixed` / `## Improved` (level 2), 184 - # never bold paragraphs (`**Fixed**`) or level-3 headings (`### Fixed`), since 185 - # the site CSS targets `:global(h3)` after a one-level heading shift. 185 + # Section headings must be `### New` / `### Fixed` / `### Improved` (level 3) 186 + # so they sit one level below the `## [VERSION]` header that release.sh 187 + # prepends. Bold paragraphs (`**Fixed**`) and `## Fixed` are both rejected: 188 + # the site CSS targets `:global(h3)`, so anything else renders unstyled. 186 189 lint_release_notes() { 187 190 local file="$1" 188 191 local violations=() ··· 190 193 # Bold-paragraph section headers (whole-line) 191 194 if grep -nE '^\*\*(New|Fixed|Improved)\*\*[[:space:]]*$' "$file" >/dev/null; then 192 195 while IFS= read -r line; do 193 - violations+=("$line (use '## …' instead of bold paragraph)") 196 + violations+=("$line (use '### …' instead of bold paragraph)") 194 197 done < <(grep -nE '^\*\*(New|Fixed|Improved)\*\*[[:space:]]*$' "$file") 195 198 fi 196 199 197 - # Level-3 section headers 198 - if grep -nE '^### (New|Fixed|Improved)[[:space:]]*$' "$file" >/dev/null; then 200 + # Level-2 section headers (collide with the version header) 201 + if grep -nE '^## (New|Fixed|Improved)[[:space:]]*$' "$file" >/dev/null; then 199 202 while IFS= read -r line; do 200 - violations+=("$line (use '## …' instead of '### …')") 201 - done < <(grep -nE '^### (New|Fixed|Improved)[[:space:]]*$' "$file") 203 + violations+=("$line (use '### …' instead of '## …')") 204 + done < <(grep -nE '^## (New|Fixed|Improved)[[:space:]]*$' "$file") 202 205 fi 203 206 204 207 if [[ ${#violations[@]} -gt 0 ]]; then ··· 238 241 log "saved to $NOTES_FILE" 239 242 240 243 if ! lint_release_notes "$NOTES_FILE"; then 241 - log "fix the headings above (use '## New' / '## Fixed' / '## Improved')," 244 + log "fix the headings above (use '### New' / '### Fixed' / '### Improved')," 242 245 log "then re-run this script or edit $NOTES_FILE before invoking release.sh." 243 246 exit 1 244 247 fi
+6 -5
doc-onevcat/scripts/release.sh
··· 104 104 NOTES_FILE="build/release-notes.md" 105 105 [[ -s "$NOTES_FILE" ]] || die "$NOTES_FILE not found — run release-notes.sh first" 106 106 107 - # Section headings must be `## New` / `## Fixed` / `## Improved` so they render 108 - # as <h3> on Prowl-Site (which shifts headings one level). Reject bold-paragraph 109 - # pseudo-headings and level-3 headings — both render as plain text on the site. 110 - if bad_lines="$(grep -nE '^(\*\*(New|Fixed|Improved)\*\*|### (New|Fixed|Improved))[[:space:]]*$' "$NOTES_FILE")"; then 107 + # Section headings must be `### New` / `### Fixed` / `### Improved` so they 108 + # render as <h3> on Prowl-Site (its CSS targets `:global(h3)`) and sit one 109 + # level below the `## [VERSION]` header that this script prepends. Reject 110 + # bold-paragraph pseudo-headings and `## …` headings — both render unstyled. 111 + if bad_lines="$(grep -nE '^(\*\*(New|Fixed|Improved)\*\*|## (New|Fixed|Improved))[[:space:]]*$' "$NOTES_FILE")"; then 111 112 echo "error: invalid section headings in $NOTES_FILE:" >&2 112 113 echo "$bad_lines" | sed 's/^/ /' >&2 113 - die "use '## New' / '## Fixed' / '## Improved' (level-2 headings) instead" 114 + die "use '### New' / '### Fixed' / '### Improved' (level-3 headings) instead" 114 115 fi 115 116 116 117 log "repository: $REPO"