diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bf804bd..ab6b11c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,43 @@ and this project adheres to pre-1.0 [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [0.8.0] - 2026-02-28 + +### Added + +- `--exact` flag for `piano build` and `piano profile`: exact-match mode for `--fn`, mirroring `cargo test -- --exact` convention (#120) +- `--list-skipped` flag for `piano build` and `piano profile`: list functions that Piano cannot instrument (const, unsafe, extern) with file paths and reasons; prints "no functions skipped" when all functions are instrumentable (#137, #186, #192) +- `piano tag` with no arguments lists all saved tags; `piano tag ` saves (#175) +- `piano diff` with no arguments compares the two most recent runs, showing "comparing: X vs Y" with tag names or relative timestamps (#125) +- User labels as diff column headers: tag names, filename stems, or relative timestamps instead of generic "Before"/"After" (#124) +- Auto-detect project root by walking up from cwd to find Cargo.toml, removing the need for `--project` in most cases (#135) +- Structural color in report tables: bold headers, dim separators, full NO_COLOR/CLICOLOR/CLICOLOR_FORCE/TERM=dumb support via anstream (#122) +- Recovery guidance in NoTargetsFound errors: shows similar function names via edit distance, or lists all available functions (#127) +- UX design principles documented in docs/standards/ux.md + +### Fixed + +- Diff table sorted by absolute self-time delta descending instead of alphabetically (#193) +- Duplicate error message on NoTargetsFound when all matched functions were skipped (#191) +- Missing tag produces "no run found for tag '...'" instead of leaking internal file paths (#198) +- Internal staging/tempdir paths removed from all user-facing error messages (#129) +- Cascading NoRuns error suppressed when profiled program exits non-zero (#139) +- `--fn` substring matching now checks qualified names (Type::method), not just bare names (#185) +- Stale tags produce RunNotFound with recovery guidance instead of generic NoRuns (#160) +- Non-printable characters in tag names displayed safely in error messages (#166) +- Redundant "invalid tag:" prefix removed from tag validation errors (#165) +- Run ID removed from tag confirmation message (#126) +- Concurrency warning simplified to one line per function (#138) +- Invalid tag error defines the valid character set instead of listing what's invalid (#128) +- App name shown in build output instead of internal binary path (#121) +- `--fn` help text harmonized between build and profile commands (#123) + +### Changed + +- Report columns reordered: Function | Self | Calls | Allocs | Alloc Bytes (self-time leads, Total removed from default view) (#180, #136) +- Runtime exits non-zero on profiling data write failure instead of silently discarding +- Runs directory pre-created before instrumented build to prevent write failures + ## [0.7.0] - 2026-02-27 ### Added diff --git a/Cargo.lock b/Cargo.lock index f2f62296..030ca976 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -325,7 +325,7 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "piano" -version = "0.7.0" +version = "0.8.0" dependencies = [ "anstream", "anstyle", @@ -344,7 +344,7 @@ dependencies = [ [[package]] name = "piano-runtime" -version = "0.7.0" +version = "0.8.0" dependencies = [ "tempfile", ] diff --git a/Cargo.toml b/Cargo.toml index af9d276e..422e1cf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["piano-runtime"] [package] name = "piano" -version = "0.7.0" +version = "0.8.0" edition = "2024" rust-version = "1.88" description = "Automated instrumentation-based profiling for Rust" diff --git a/docs/standards/releases.md b/docs/standards/releases.md index 8a36214f..dce73c04 100644 --- a/docs/standards/releases.md +++ b/docs/standards/releases.md @@ -39,8 +39,8 @@ Batch related changes, release when there's a meaningful set of user-facing chan 6. Bump version in both `Cargo.toml` and `piano-runtime/Cargo.toml` 7. Run `cargo generate-lockfile --ignore-rust-version` (without this flag, cargo constrains all workspace deps to the lowest member MSRV, downgrading shared dependencies like clap) 8. Commit: `chore(cargo): bump version to 0.x.y` -- this commit may only touch `Cargo.toml`, `piano-runtime/Cargo.toml`, and `Cargo.lock` (CI enforces this on `release/*` PRs) -9. Tag: `git tag v0.x.y` -10. Push: `git push && git push --tags` +9. Open a PR (`release/v0.x.y` branch) -- main has branch protection, even version bumps go through a PR +10. After merge, tag the merge commit: `git tag v0.x.y` and `git push --tags` 11. Publish `piano-runtime` first: `cargo publish -p piano-runtime` 12. Wait for crates.io to index, then publish `piano`: `cargo publish -p piano` 13. Close the milestone on GitHub (if applicable) diff --git a/piano-runtime/Cargo.toml b/piano-runtime/Cargo.toml index 46a8e262..8bb0792f 100644 --- a/piano-runtime/Cargo.toml +++ b/piano-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "piano-runtime" -version = "0.7.0" +version = "0.8.0" edition = "2021" rust-version = "1.59" description = "Zero-dependency timing and allocation tracking runtime for piano profiler"