From 3abdb50098ca9acf1a955a5db48c1e055e5805a2 Mon Sep 17 00:00:00 2001 From: Harsh Kapse Date: Sat, 19 Sep 2026 17:38:43 +0530 Subject: [PATCH] chore(release): prepare v0.9.0 release and mark as latest - Bump CLI and manual page versions to 0.9.0 - Update CHANGELOG with humanized 0.9.0 release notes - Configure GoReleaser with make_latest: true and remove prerelease - Update README install snippet for v0.9.0 --- .github/workflows/release.yml | 2 +- .goreleaser.yaml | 2 +- CHANGELOG.md | 31 +++++++++++++++++++++++++++++-- README.md | 2 +- cmd/man.go | 2 +- cmd/root.go | 2 +- man/diffm.1 | 2 +- man/diffmantic.1 | 2 +- 8 files changed, 36 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index de3ab832..95629d8f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -45,7 +45,7 @@ jobs: if: steps.cache-grammars.outputs.cache-hit != 'true' run: go run ./native/bridge/build_grammars.go --cross-all - - name: Run test suite (pre-release verification) + - name: Run test suite (release verification) run: go test -v ./... - name: Verify CHANGELOG has release version header and extract notes diff --git a/.goreleaser.yaml b/.goreleaser.yaml index a1e8a43e..1209c0ad 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -59,7 +59,7 @@ checksum: release: mode: replace - prerelease: true + make_latest: true brews: - name: diffmantic diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e9a8cac..da882f4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.0] - 2026-09-19 + +### Added +- Side-by-side diff renderer (`-f side-by-side` / `-f sbs`). Diffmantic streams side-by-side output directly through your pager (`$PAGER`, `less`, or `more`) without buffering delays. +- Support for Git external diff drivers (`git -c diff.external=diffm diff` or `git config diff.external diffm`), letting you use Diffmantic as Git's global diff tool. +- On-the-fly streaming for Git diffs and revisions. Changes render concurrently file-by-file instead of buffering the entire repository diff in memory first. +- Unix manual pages (`diffm.1` and `diffmantic.1`) for command documentation directly in your terminal via `man diffm`. +- Move destination badges (`[L...]`) rendered in move-teal on moved blocks and declarations, making it obvious where code moved. +- Configuration through standard environment variables (`DIFFM_FORMAT`, `DIFFM_TAB_WIDTH`, `DIFFM_IGNORE_COMMENTS`, `DIFFM_PARSE_ERROR_LIMIT`, `DIFFM_SIZE_LIMIT`, `DIFFM_LINE_LIMIT`, `DIFFM_NO_PAGER`). +- Added `--line-limit` flag to set the maximum line count (default 10,000) for AST parsing before falling back to line diffing. +- Added `--textconv` flag to run external text conversion filters when diffing binary files configured in Git. +- Shell tab completion for `--format` and `--color` flags. + ### Changed -- Side-by-side (`sbs`) is now the default diff format everywhere. Running `diffm` without `-f` prints a side-by-side diff through your pager (`$PAGER`, `less`, or `more`). +- Side-by-side (`sbs`) is now the default diff format everywhere. Running `diffm` without `-f` prints a side-by-side diff through your terminal pager. +- Replaced YAML config files (`~/.config/diffmantic/config.yml`) with zero-dependency `DIFFM_*` environment variables for simpler shell scripts and CI. + +### Fixed +- Collapsed noisy nested move highlights into outermost containers, preventing inner tokens from rendering as fragmented "tag soup". +- Absorbed list commas (`,`) in argument lists, parameter lists, and array literals so delimiter punctuation highlights with surrounding changes instead of being left behind. +- Fixed closing brackets on indexed expressions (like Python subscripts `obj[...]`) picking up false move highlights. +- Contiguous deletions and insertions now group into clean replacement blocks instead of alternating back and forth between single lines. +- Misplaced flags passed after the `--` positional delimiter (like `diffm a b -- -f json`) now trigger a clear error message explaining flag placement. +- Stopped exit calls (like `os.Exit` or `panic`) and boilerplate guards from falsely matching as moves across unrelated functions. + +### Performance +- Faster, cleaner line alignment on large files with heavy edits. Uses affine gap costs to keep matched code blocks aligned side-by-side without artificial zipper gaps. +- Unified structural move scoring into a single pass, speeding up matching on large refactors. ## [0.8.0] - 2026-09-15 @@ -218,7 +244,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Security - Initial baseline release security check. -[Unreleased]: https://github.com/HarshK97/diffmantic/compare/v0.8.0...HEAD +[Unreleased]: https://github.com/HarshK97/diffmantic/compare/v0.9.0...HEAD +[0.9.0]: https://github.com/HarshK97/diffmantic/compare/v0.8.0...v0.9.0 [0.8.0]: https://github.com/HarshK97/diffmantic/compare/v0.7.0...v0.8.0 [0.7.0]: https://github.com/HarshK97/diffmantic/compare/v0.6.0...v0.7.0 [0.6.0]: https://github.com/HarshK97/diffmantic/compare/v0.5.0...v0.6.0 diff --git a/README.md b/README.md index c5350abd..b7d166a0 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ It auto-detects your OS and architecture, grabs the right binary from [GitHub Re curl -fsSL https://raw.githubusercontent.com/HarshK97/diffmantic/main/install.sh | sh -s -- --dir=/usr/local/bin # Install a specific version -curl -fsSL https://raw.githubusercontent.com/HarshK97/diffmantic/main/install.sh | sh -s -- --version=v0.8.0 +curl -fsSL https://raw.githubusercontent.com/HarshK97/diffmantic/main/install.sh | sh -s -- --version=v0.9.0 ``` ### Homebrew diff --git a/cmd/man.go b/cmd/man.go index 5b3a712d..b07123c3 100644 --- a/cmd/man.go +++ b/cmd/man.go @@ -20,7 +20,7 @@ func GenerateManPage(cmd *cobra.Command, releaseDate string) string { version := cmd.Version if version == "" { - version = "0.8.0" + version = "0.9.0" } fmt.Fprintf(&buf, ".TH DIFFM 1 %q %q \"Diffmantic Manual\"\n", releaseDate, "Diffmantic "+version) diff --git a/cmd/root.go b/cmd/root.go index e2375eaa..eca02430 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -37,7 +37,7 @@ func isTerminal(f *os.File) bool { var rootCmd = &cobra.Command{ Use: "diffm [refA] [refB]", - Version: "0.8.0", + Version: "0.9.0", Short: "Semantic diff engine powered by Tree-sitter", Long: `diffmantic is a structural source code diff engine. diff --git a/man/diffm.1 b/man/diffm.1 index 3775547c..5a47203b 100644 --- a/man/diffm.1 +++ b/man/diffm.1 @@ -1,4 +1,4 @@ -.TH DIFFM 1 "2026-09-19" "Diffmantic 0.8.0" "Diffmantic Manual" +.TH DIFFM 1 "2026-09-19" "Diffmantic 0.9.0" "Diffmantic Manual" .SH NAME diffm \- structural, semantic diff engine powered by Tree-sitter .SH SYNOPSIS diff --git a/man/diffmantic.1 b/man/diffmantic.1 index 3775547c..5a47203b 100644 --- a/man/diffmantic.1 +++ b/man/diffmantic.1 @@ -1,4 +1,4 @@ -.TH DIFFM 1 "2026-09-19" "Diffmantic 0.8.0" "Diffmantic Manual" +.TH DIFFM 1 "2026-09-19" "Diffmantic 0.9.0" "Diffmantic Manual" .SH NAME diffm \- structural, semantic diff engine powered by Tree-sitter .SH SYNOPSIS