From 547f0b5d116ab76d76cfcf9e92ed4d7b47d052ad Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Sat, 21 Mar 2026 10:55:16 -0300 Subject: [PATCH] docs: add CHANGELOG.md following Keep a Changelog format --- CHANGELOG.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e1700cf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,64 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.1.0] - 2026-03-21 + +### Added + +- Streaming tar-based export (`--export`) producing `.keep.tar` archives without loading entire files into memory +- Streaming tar-based import (`--import`) extracting `.keep.tar` archives with new IDs +- Server endpoints `GET /api/export` and `POST /api/import` +- ID-based filtering for `--list` (`keep -l 1 2 3` lists specific items by ID) +- Server API accepts optional `ids` query parameter on `GET /api/item/` +- `--ids-only` flag for `--list` mode for scripting +- `infer` and `tree_magic_mini` meta plugins for MIME type detection +- Native `zstd` compression plugin as default +- Configurable compression via `--compression` flag +- Export/import modes with format detection (JSON, YAML, binary) +- `XDG_CONFIG_HOME` support for default config file location +- `XDG_DATA_HOME` support for default storage location +- Tilde (`~`) expansion in config file paths + +### Changed + +- `CompressionType::None` renamed to `CompressionType::Raw` (with `"none"` as alias for backward compatibility) +- `items.size` column renamed to `items.uncompressed_size` +- Added `items.compressed_size` column tracking compressed file size on disk +- Added `items.closed` column tracking whether an item is fully written +- Default `list_format` in config now matches CLI default (7 vs 5 columns) +- All filter plugins share deduplicated option implementations + +### Refactored + +- Extracted `spawn_body_reader()` and `check_binary_content()` helpers for streaming uploads +- Extracted `yaml_value_to_string()` helper for meta plugins +- Extracted `item_path()` helper in `ItemService` to reduce path duplication +- Unified `get_item_meta_name`/`value` to take `&str` instead of `String` +- Shared `ItemInfo` struct between client and server +- Compression service now returns `Result` types instead of panicking via `.expect()` +- `ApiResponse::ok()` and `ApiResponse::empty()` constructors +- `meta_filter()` helper on `Settings` for consistent filtering +- Added `tag_names()` method on `ItemWithMeta` +- `filter_clone_box!` macro for filter plugin cloning + +### Fixed + +- Panic guards in diff, compression engine, and spawned threads +- Pre-existing borrow errors in export handler and `TryFrom` implementation +- TOCTOU race in `stream_raw_content_response` +- Swallowed write errors in meta plugins (digest, magic_file, exec) +- Truncated uploads (413) now properly store compressed data +- `term::stderr().unwrap()` panic in `item_service` +- `.unwrap()` panics in compression engine `Read`/`Write` impls +- Client API errors now propagate to user instead of being swallowed +- Import endpoint returns 413 on `max_body_size` instead of truncating +- `keep --list` uses `list_format` from config in all modes +- All tables respect `table_config` from settings +- `DisplayListItem` struct removed (was unused) +- `#[serde(alias = "size")]` on `ImportMeta` for backward compatibility