Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ checksum:

release:
mode: replace
prerelease: true
make_latest: true

brews:
- name: diffmantic
Expand Down
31 changes: 29 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion cmd/man.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
2 changes: 1 addition & 1 deletion man/diffm.1
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion man/diffmantic.1
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Loading