native macOS codings agent orchestrator
6
fork

Configure Feed

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

Enforce `## New`/`## Fixed`/`## Improved` headings in release notes

The release-notes prompt previously framed section names as `**New**` /
`**Fixed**`, which is Markdown emphasis. Claude usually upgraded these to
`## ` h2 headings when there were many bullets, but for small releases
(one or two fixes) it treated `**Fixed**` as the literal output format,
producing bold-paragraph pseudo-headings that render as plain `<p><strong>`
on Prowl-Site instead of the styled `<h3>` everywhere else. Affected
2026.4.7, 4.16, 4.27, and 4.29.

- Rewrite the prompt to require literal `## New` / `## Fixed` /
`## Improved` headings and explicitly forbid `**...**` and `### ...`.
- Add a lint pass at the end of release-notes.sh that fails fast when
generated notes use a forbidden heading style.
- Add a defensive grep in release.sh before the CHANGELOG is written so
manually edited notes cannot reintroduce the bad format either.
- Backfill the four affected CHANGELOG entries to use `## ` headings.

onevcat ee466ee4 b6f84783

+59 -8
+5 -5
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. ··· 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 ··· 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 ··· 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.
+45 -3
doc-onevcat/scripts/release-notes.sh
··· 129 129 exclamation marks, no "we're excited". 130 130 5. **Format**: 131 131 - Start with a one-line summary sentence of the release theme if there is a 132 - clear one; otherwise jump straight to the list. 133 - - Group into two sections: **New** for features/enhancements, and **Fixed** 134 - for bug fixes. Omit a section if it has no items. 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 `### `. 135 137 - Use a flat bullet list (`-`) within each section. 136 138 - Each bullet should be one or two sentences maximum. 137 139 - End with nothing — no sign-off, no footer. ··· 174 176 fi 175 177 } 176 178 179 + # ── Validation ─────────────────────────────────────────────────────────────── 180 + 181 + # Lint a release-notes file against the CHANGELOG format used by Prowl-Site. 182 + # 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. 186 + lint_release_notes() { 187 + local file="$1" 188 + local violations=() 189 + 190 + # Bold-paragraph section headers (whole-line) 191 + if grep -nE '^\*\*(New|Fixed|Improved)\*\*[[:space:]]*$' "$file" >/dev/null; then 192 + while IFS= read -r line; do 193 + violations+=("$line (use '## …' instead of bold paragraph)") 194 + done < <(grep -nE '^\*\*(New|Fixed|Improved)\*\*[[:space:]]*$' "$file") 195 + fi 196 + 197 + # Level-3 section headers 198 + if grep -nE '^### (New|Fixed|Improved)[[:space:]]*$' "$file" >/dev/null; then 199 + while IFS= read -r line; do 200 + violations+=("$line (use '## …' instead of '### …')") 201 + done < <(grep -nE '^### (New|Fixed|Improved)[[:space:]]*$' "$file") 202 + fi 203 + 204 + if [[ ${#violations[@]} -gt 0 ]]; then 205 + echo "release-notes format violations in $file:" >&2 206 + printf ' %s\n' "${violations[@]}" >&2 207 + return 1 208 + fi 209 + return 0 210 + } 211 + 177 212 # ── Generate ───────────────────────────────────────────────────────────────── 178 213 179 214 NOTES_FILE="build/release-notes.md" ··· 201 236 echo "──────────────────────────────────" 202 237 echo 203 238 log "saved to $NOTES_FILE" 239 + 240 + if ! lint_release_notes "$NOTES_FILE"; then 241 + log "fix the headings above (use '## New' / '## Fixed' / '## Improved')," 242 + log "then re-run this script or edit $NOTES_FILE before invoking release.sh." 243 + exit 1 244 + fi 245 + 204 246 log "review and edit the file if needed, then run:" 205 247 log " ./doc-onevcat/scripts/release.sh $VERSION"
+9
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 111 + echo "error: invalid section headings in $NOTES_FILE:" >&2 112 + echo "$bad_lines" | sed 's/^/ /' >&2 113 + die "use '## New' / '## Fixed' / '## Improved' (level-2 headings) instead" 114 + fi 115 + 107 116 log "repository: $REPO" 108 117 log "signing identity: $SIGNING_IDENTITY" 109 118 log "team ID: $TEAM_ID"