# Changelog
All notable changes to this project will be documented in this file.
## [Unreleased][unreleased]
## [0.2.7] (parity: flowmark-py 0.6.5)
Parity sync and stabilization release.
Bumps the Python parity baseline from `0.6.4` to `0.6.5` and fixes two formatter parity
gaps found via full-corpus differential testing.
### Formatter behavior changes
- **Thematic-break spacing (D17):** a thematic break (`* * *`, `---`) written tight
against a neighbouring block now stays tight, matching Python.
Previously the renderer forced blank lines on both sides.
- **Reference-link normalization (D18):** a reference link whose text equals its
normalized label now renders as the unambiguous collapsed form `[text][]` instead of
the fragile shortcut `[text]`; distinct labels render as the full form
`[text][label]`. This adopts upstream flowmark fix
[#45](https://github.com/jlevy/flowmark/issues/45) (an intentional, documented
divergence from released Python `0.6.5`, matching upstream `main`).
### Parity
- Python parity baseline updated `0.6.4` → `0.6.5` (GFM tilde flanking and CLI-help
footer needed no Rust change; comrak/Rust already conformant — tests ported).
- 15 new parity tests (D17 ×5, D18 ×10) plus 2 reference-link encoder unit tests.
## [0.2.6] (parity: flowmark-py 0.6.4)
Release infrastructure and documentation hardening release.
No formatter behavior changes; parity remains pinned to Python flowmark `0.6.4`.
### Improvements
- Stabilized embedded version metadata so release builds produce clean version strings
(no spurious `-dev.unknown+gunknown` suffix)
- Codified canonical publishing runbook for hybrid Rust/Python multi-channel releases
- Refreshed top-level docs, README, and installation guidance (leading with `uv`/`uvx`)
### CI and release process
- Fixed clippy format-arg lint in version metadata build script
- Added `release_tag` passthrough to `publish.yml` and `pypi.yml` reusable workflows for
stable version embedding in CI builds
- Moved completed specs from `active` to `done` and reorganized project docs
### Testing
- Retired legacy `cli-golden.tryscript.md` test without coverage loss (replaced by
focused `file-discovery` and `stdin` tryscript tests)
## [0.2.5] (parity: flowmark-py 0.6.4)
First multi-channel release: crates.io, PyPI, GitHub Releases, and Homebrew.
No formatter behavior changes; parity remains pinned to Python flowmark `0.6.4`.
### Features
- Added PyPI distribution support for `flowmark-rs` via maturin (`pyproject.toml`) and a
dedicated GitHub Actions workflow (`pypi.yml`)
- Added incremental cache lifecycle/inspection support in the CLI, including
`--cache-dir`, `--show-cache`, and `--clear-cache`
### Fixes
- `--clear-cache` no longer requires resolving the current working directory
- Hardened PyPI smoke tests to install only locally built wheels (`--no-index`), and
restricted PyPI publish job execution to release-triggered runs
## [0.2.4] (parity: flowmark-py 0.6.4)
Release process and documentation hardening release.
No formatter behavior changes; parity remains pinned to Python flowmark `0.6.4`.
### Improvements
- Clarified and standardized Homebrew installation guidance across README and publishing
docs
- Tightened CLI help text and usage footer for clearer command-line guidance
- Added and documented README generation sync checks so generated docs stay in lockstep
### CI and release process
- Expanded publishing playbook with explicit release workflow sequencing and
verification steps
- Added Homebrew tap update workflow details and validation commands
- Applied repository-wide Markdown formatting to keep release/process docs consistent
### Dependencies
- Bumped `clap` to `4.5.60`
- Bumped `tempfile` to `3.26.0`
- Bumped `anyhow` to `1.0.102`
## [0.2.3] (parity: flowmark-py 0.6.4)
Fixes release workflow for cross-compiled Linux ARM64 binaries.
### Fixes
- Fixed cross-compilation for `aarch64-unknown-linux-musl`: set `CC` env var for `cc-rs`
to find the cross-compiler
- Release workflow now uses `fail-fast: false` so one target failure doesn’t cancel all
other builds
## [0.2.2] (parity: flowmark-py 0.6.4)
Infrastructure release adding pre-built binaries for all major platforms.
### Features
- **Pre-built binaries** for 6 platforms via GitHub Releases: Linux (x86_64, ARM64),
macOS (x86_64, ARM64), Windows (x86_64, ARM64). Archives include SHA256 checksums.
`cargo binstall flowmark` now works automatically.
- **Windows CI** added to the test matrix (ubuntu + macOS + Windows)
### Fixes
- Fixed CRLF line-ending handling in golden tests for Windows compatibility
- Tryscript integration tests now correctly skip on Windows (bash-only)
## [0.2.1] (parity: flowmark-py 0.6.4)
Patch release fixing four formatting parity bugs discovered by corpus-wide comparison
against Python flowmark on 623 real-world files, plus new systematic parity testing
infrastructure.
### Fixes
- **Mixed loose/tight list code fences** (D12b): Code blocks inside loose list items no
longer get spurious blank lines when the source had none
- **Blockquote blank line indentation** (D13): Blank separator lines inside blockquote
lists now preserve the full list-content indent (e.g., `"> "`) instead of trimming to
a bare `">"`
- **Smart quote after inline code** (D15): Apostrophes after code spans are now
context-sensitive — `config`’s converts to a smart quote while `foo()`'s stays ASCII,
matching Python’s behavior
- **Empty code blocks** (D16): Empty fenced code blocks no longer produce a spurious
blank line between the opening and closing fences
### Testing
- New Python-generated golden file parity tests (`tests/parity/corner-cases.md`)
covering all four fixed bugs across 5 formatting modes
- New cross-binary parity test suite comparing Rust and Python CLI output directly
- Parity verification scripts (`scripts/corpus-parity-check.sh`,
`scripts/generate-parity-golden.sh`) for corpus-wide regression testing
## [0.2.0] (parity: flowmark-py 0.6.4)
First formal release.
Complete Rust port with full behavioral parity to Python flowmark v0.6.4.
### Highlights
- **Drop-in replacement** for Python flowmark — identical CLI interface, identical
formatting output across all modes
- **Single binary, no runtime** — `cargo install flowmark`, no Python needed
- **Library crate** — embed formatting in Rust toolchains via `flowmark::FormatOptions`
### Features
- All formatting modes: default (width 88), semantic, auto, plaintext, custom width
- List spacing: preserve, tight, loose
- Typography: smart quotes, ellipsis conversion
- Cleanups: unbold headings
- File discovery: glob patterns, `.gitignore` support, `.flowmarkignore`, config file
loading (`.flowmark.toml`, `flowmark.toml`, `pyproject.toml`)
- Batch multi-file processing with `--inplace` and `--auto`
- Claude Code skill integration (`--install-skill`, `--skill`)
### Parity Verification
- 430 tests (0 ignored, 0 failures)
- 292 Python tests mapped to Rust equivalents (CI-enforced)
- 15 parity discrepancies identified and resolved
- Golden reference document tested across 4 modes
- 11 tryscript golden tests for end-to-end CLI validation
### Infrastructure
- 12-check CI pipeline (fmt, clippy, test, MSRV, deny, docs, coverage, semver-checks)
- Automated crates.io publishing via trusted publishing (OIDC)
- Cross-platform testing (Ubuntu + macOS)
- Supply chain security via `deny.toml`
## [0.1.3] - 2025-11-01
Early development release.
[0.1.3]: https://github.com/jlevy/flowmark-rs/releases/tag/v0.1.3
[0.2.0]: https://github.com/jlevy/flowmark-rs/compare/v0.1.3...v0.2.0
[0.2.1]: https://github.com/jlevy/flowmark-rs/compare/v0.2.0...v0.2.1
[0.2.2]: https://github.com/jlevy/flowmark-rs/compare/v0.2.1...v0.2.2
[0.2.3]: https://github.com/jlevy/flowmark-rs/compare/v0.2.2...v0.2.3
[0.2.4]: https://github.com/jlevy/flowmark-rs/compare/v0.2.3...v0.2.4
[0.2.5]: https://github.com/jlevy/flowmark-rs/compare/v0.2.4...v0.2.5
[0.2.6]: https://github.com/jlevy/flowmark-rs/compare/v0.2.5...v0.2.6
[0.2.7]: https://github.com/jlevy/flowmark-rs/compare/v0.2.6...v0.2.7
[unreleased]: https://github.com/jlevy/flowmark-rs/compare/v0.2.7...HEAD