chore(release): unwrap CHANGELOG paragraphs for GitHub Release notes (#180)

GitHub renders release-note Markdown with GFM hard breaks, so every
`\n` becomes `<br>`. The CHANGELOG is hard-wrapped at ~75 chars for
readable diffs, which renders as awkward visible line breaks on the
release page (see https://github.com/colbymchenry/codegraph/releases/tag/v0.7.10).

Add `scripts/extract-release-notes.mjs` to extract a version block
and join indented continuation lines into a single line per bullet.
Nested list items, headings, and link references are preserved.
`scripts/release.sh` now uses this helper instead of the inline awk
extractor — repo-level CHANGELOG.md viewing is unaffected because
CommonMark there treats newlines as spaces.

Also fix the 0.7.10 entry: "Two underlying fixes" -> "Three", "Rust
file-/level" broken hyphen, and move the closes/credit line above
the nested list so it doesn't strand as a top-level paragraph.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Colby Mchenry
2026-05-19 11:42:22 -05:00
committed by GitHub
co-authored by Claude Opus 4.7
parent fb8fb0ea8b
commit 483ec9171c
3 changed files with 128 additions and 15 deletions
+7 -8
View File
@@ -42,24 +42,23 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
…) accept `module::symbol` (Rust / C++ / Ruby), `Module.symbol`
(TS / JS / Python), and `module/symbol` (path-style) — multi-level
forms (`crate::configurator::stage_apply::run`) and Rust path
prefixes (`crate`, `super`, `self`) are handled. Two underlying
fixes:
prefixes (`crate`, `super`, `self`) are handled. Closes
[#173](https://github.com/colbymchenry/codegraph/issues/173). Thanks
to [@joselhurtado](https://github.com/joselhurtado) for the detailed
reproduction. Three underlying fixes:
- The FTS5 query builder now treats `::` as a token separator
instead of stripping it to nothing, so `stage_apply::run` no
longer collapses to the unsearchable `stage_applyrun`.
- `matchesSymbol` falls back to a file-path containment check when
`qualifiedName` doesn't carry the module hierarchy (Rust file-
level functions, Python free functions in a package): a `run`
in `src/configurator/stage_apply.rs` now matches
`qualifiedName` doesn't carry the module hierarchy (Rust
file-level functions, Python free functions in a package): a
`run` in `src/configurator/stage_apply.rs` now matches
`stage_apply::run` because `stage_apply` appears as a path
segment.
- Qualified lookups that don't match the qualifier no longer fall
through to fuzzy text matches — `stage_apply::nonexistent_fn`
returns `null` instead of resolving to an unrelated `rollback`
in the same file.
Closes [#173](https://github.com/colbymchenry/codegraph/issues/173).
Thanks to [@joselhurtado](https://github.com/joselhurtado) for the
detailed reproduction.
[0.7.10]: https://github.com/colbymchenry/codegraph/releases/tag/v0.7.10