# 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.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.0.13] - 2025-10-22
Summary: Added[1], Chore[1], Fixed[5]
### Added
- ✨ feat(cli): enhance configuration loading with logging
### Fixed
- 🐛 fix(cli): load config file as optional
- 🐛 fix(cli): correct spelling errors in documentation
- 🐛 fix(client_config): print config for debugging
- 🐛 fix(cli): fix config file loading
- 🐛 fix(cli): load config file only if it exists
## [0.0.12] - 2025-10-22
Summary: Added[6], Build[1], Changed[2], Chore[7], Documentation[1], Fixed[6], Testing[2]
### Added
- ✨ feat: integrate configurable rules path throughout CLI
- ✨ feat: add get_rules_from() to load rules from custom path
- ✨ feat: add configurable rules directory support to Rules and InitCli
- 🏗️ feat(init): implement plan and apply operations
- ✨ feat(cli): scaffold InitCli subcommand and clap wiring
- 🔐 feat: Add token export/import for ephemeral environments
### Fixed
- 🐛 fix(ci): correct default test runner value
- 🔧 fix: address clippy warnings after refactoring
- 🐛 fix: allow init command to run without existing config file
- 🐛 fix: replace hardcoded paths in tests with temp directories for CI compatibility
- 🔧 fix: address clippy warnings and improve code formatting
- 🔧 fix: Resolve clippy warnings and formatting issues
### Changed
- ♻️ refactor: reduce cognitive complexity of plan_operations and execute_operation
- ♻️ refactor: extract mock credential file creation into helper function
## [0.0.11] - 2025-10-20
Summary: Added[7], Changed[7], Chore[13], Continuous Integration[5], Documentation[24], Fixed[7], Testing[12]
### Added
- ✨ feat(test): add junit report
- ✨ feat(ci): introduce nextest test runner
- ✨ feat(retention): enhance message age with parsing and validation
- ✨ feat(retention): implement retention policy configuration
- ✨ feat(error): add invalid message age error
- ✨ feat(retention): introduce message age specification
- ✨ feat(retention): enhance retention policy configuration
### Fixed
- 🐛 fix(rule_processor): correct spelling of "behaviour"
- ✅ fix(message-list): improve idioms (avoid redundant clone, extend labels, safer message extraction)
- ✅ fix(clippy): move tests module to file end to satisfy items_after_test_module lint
- 🐛 fix(retention): fix debug string formatting in retention struct
- 🐛 fix(cli): correct error mapping in add_cli
- 🐛 fix(rules): handle message age creation error
- 🐛 fix(build): correct readme generation script
### Changed
- ♻️ refactor: remove redundant credential module
- ♻️ refactor(message-list): introduce GmailService abstraction and refactor to use it; fix borrows and lifetimes
- ♻️ refactor(message-list): extract helper to append messages from ListMessagesResponse and add unit test
- ♻️ refactor(rule_processor): extract process_label and add internal ops trait for unit testing
- ♻️ refactor(rule_processor): add TRASH_LABEL, correct Gmail scopes, early returns, and improve idioms
- refactor(rules): apply idiomatic patterns and resolve clippy warnings
- refactor(rules): replace unwrap() with explicit error handling and propagate errors safely
## [0.0.10] - 2025-10-16
Summary: Added[11], Changed[15], Chore[12], Fixed[3]
### Added
- ✨ feat(cli): add default subcommand for rule execution
- ✨ feat(config): implement config builder pattern for ClientConfig
- ✨ feat(cli): load configurations from toml file
- ✨ feat(client_config): add config root parsing with regex
- ✨ feat(utils): add test utils module
- ✨ feat(deps): add lazy-regex crate
- ✨ feat(dependencies): add lazy-regex dependency
- ✨ feat(config): add ConfigRoot enum for flexible path handling
- ✨ feat(core): add client config
- ✨ feat(config): introduce client configuration
- ✨ feat(cli): add config file support
### Fixed
- 🐛 fix(gmail): fix token persistence path
- 🐛 fix(config): resolve credential file path issue
- 🐛 fix(rule_processor): update Gmail API scope
### Changed
- ♻️ refactor(cli): extract action execution into a function
- ♻️ refactor(cli): rename get_config to get_rules
- ♻️ refactor(cli): extract rule execution to separate function
- ♻️ refactor(config): improve ConfigRoot to handle different root types
- ♻️ refactor(utils): improve config directory creation
- ♻️ refactor(cli): use ClientConfig struct for gmail client
- ♻️ refactor(gmail): use client config for gmail client
- ♻️ refactor(rules): remove credentials config
- ♻️ refactor(cli): remove config from run args
- ♻️ refactor(eol_rule): improve labels handling
- ♻️ refactor(cli): remove redundant Rules import
- ♻️ refactor: rename Config to Rules
- ♻️ refactor(cli): restructure cli commands for better organization
- ♻️ refactor(message_list): rename messages_list to list_messages
- ♻️ refactor(rule_processor): remove unused delete functions
## [0.0.9] - 2025-10-14
Summary: Added[5], Changed[3], Chore[2], Fixed[2]
### Added
- ✨ feat(gmail_client): add date to message summary
- ✨ feat(gmail): enhance message metadata retrieval
- ✨ feat(cli): enhance cli subcommand ordering and grouping
- ✨ feat(cli): add message list subcommand
- ✨ feat(cli): add configuration options for message listing
### Fixed
- 🐛 fix(gmail_client): resolve ownership issue in message summary
- 🐛 fix(gmail): display message date and subject
### Changed
- ♻️ refactor(cli): rename run_cli to rules_cli
- ♻️ refactor(cli): consolidate message handling and remove delete command
- ♻️ refactor(cli): refactor message handling and remove trash command
## [0.0.8] - 2025-10-14
Summary: Added[14], Changed[42], Chore[3], Documentation[2], Fixed[5]
### Added
- ✨ feat(cli): create message trait to share list parameters
- ✨ feat(cli): add message trait for cli subcommands
- ✨ feat(cli): implement batch actions for trashing and deleting
- ✨ feat(rule_processor): implement rule processing for Gmail
- ✨ feat(gmail_client): add execute flag and EolRule
- ✨ feat(processor): add execute flag to GmailClient
- ✨ feat(gmail_client): add rule field to GmailClient struct - Add rule field to GmailClient struct to store EolAction.
- ✨ feat(eol_action): add clone derive to eolaction enum
- ✨ feat(message_list): enhance message list trait with documentation and functionalities
- ✨ feat(core): add message management structs
- ✨ feat(gmail_client): integrate message summary
- ✨ feat(gmail): create gmail client struct
- ✨ feat(gmail): add get messages functionality
- ✨ feat(error): add NoLabelsFound error
### Fixed
- 🐛 fix(cli): correct label adding to use non-async function
- 🐛 fix(rule_processor): fix label creation and message retrieval
- 🐛 fix(cli): fix rule execution and client handling
- 🐛 fix(trash): fix trash command with new gmail client
- 🐛 fix(cli): fix delete command
### Changed
- ♻️ refactor(cli): streamline message retrieval and parameter setting
- ♻️ refactor(cli): extract parameter setting logic
- ♻️ refactor(message_list): rename run to get_messages
- ♻️ refactor(cli): remove unused `Delete` import
- ♻️ refactor(cli): remove unused Delete, Trash trait - Remove Delete and Trash traits from cull_gmail - Use RuleProcessor instead of Delete and Trash traits
- ♻️ refactor(core): remove processor.rs
- ♻️ refactor(message): remove delete functionality
- ♻️ refactor(core): restructure modules for clarity
- ♻️ refactor(processor): implement RuleProcessor trait for GmailClient
- ♻️ refactor(cli): rename Processor to RuleProcessor
- ♻️ refactor(cli): use mutable client for subcommands
- ♻️ refactor(core): rename Processor to RuleProcessor
- ♻️ refactor(message_cli): simplify message processing
- ♻️ refactor(delete): streamline delete command execution
- ♻️ refactor(gmail_client): change MessageSummary's visibility
- ♻️ refactor(processor): simplify trash_messages function
- ♻️ refactor(core): remove unused trash module
- ♻️ refactor(trash): refactor trash module to trait implementation
- ♻️ refactor(message_list): remove client parameter from add_labels
- ♻️ refactor(delete): restructure delete functionality
- ♻️ refactor(core): remove unused Delete module - Delete module is no longer needed.
- ♻️ refactor(processor): consolidate message operations in GmailClient
- ♻️ refactor(gmail_client): move message_summary to gmail_client
- ♻️ refactor(message_list): implement MessageList trait for GmailClient
- ♻️ refactor(cli): use GmailClient instead of credential file
- ♻️ refactor(cli): use client for trash subcommand
- ♻️ refactor(cli): use gmail client in run_cli
- ♻️ refactor(cli): pass client to run command
- ♻️ refactor(processor): use reference for GmailClient in processor builder
- ♻️ refactor(cli): use client instance for message subcommand
- ♻️ refactor(cli): use GmailClient for MessageList
- ♻️ refactor(cli): use GmailClient in delete_cli
- ♻️ refactor(cli): use gmail client for label operations
- ♻️ refactor(trash): use GmailClient instead of credential string
- ♻️ refactor(delete): use GmailClient for message list creation
- ♻️ refactor(message_list): update add_labels function to accept &GmailClient
- ♻️ refactor(gmail): improve gmail client structure
- ♻️ refactor(processor): use GmailClient instead of credential_file
- ♻️ refactor(cli): remove unused credential file
- ♻️ refactor(message_list): use gmail client for label retrieval
- ♻️ refactor(core): rename labels module to gmail_client
- ♻️ refactor(gmail): rename labels.rs to gmail_client.rs
## [0.0.7] - 2025-10-12
Summary: Added[23], Build[1], Changed[8], Chore[5], Documentation[3], Fixed[10]
### Added
- ✨ feat(processor): introduce processor builder
- ✨ feat(cli): add execute option to processor
- ✨ feat(processor): add execute flag for dry run
- ✨ feat(cli): add execute flag to run action
- ✨ feat(message_list): increase default max results
- ✨ feat(cli): add skip action flags to cli
- ✨ feat(cli): add skip-delete flag to cli
- ✨ feat(cli): add option to skip trash actions
- ✨ feat(config): add date calculation for EOL queries
- ✨ feat(config): add retention period to eol rule
- ✨ feat(processor): add label existence check before processing
- ✨ feat(processor): add trash and delete message functionality
- ✨ feat(cli): implement trash and delete actions
- ✨ feat(processor): implement message deletion functionality
- ✨ feat(config): add eol query function
- ✨ feat(cli): add chrono crate as a dependency
- ✨ feat(core): introduce message processor module
- ✨ feat(processor): implement rule processor
- ✨ feat(eol_rule): add describe function for eol rule
- ✨ feat(cli): implement rule execution logic
- ✨ feat(eol_action): add parse method to EolAction
- ✨ feat(cli): add run command to execute rules
- ✨ feat(cli): add run cli command
### Fixed
- 🐛 fix(utils): correct string elision boundary calculation
- 🐛 fix(utils): correct string elision boundary calculation
- 🐛 fix(error): correct spelling error in error message
- 🐛 fix(processor): correct typo in error message
- 🐛 fix(processor): execute delete messages
- 🐛 fix(message_age): correct data type for message age count
- 🐛 fix(cli): correct count type in add_cli
- 🐛 fix(processor): handle None query in eol_query
- 🐛 fix(error): add error type for no query string calculated
- 🐛 fix(error): add specific error for missing label in mailbox - add `LableNotFoundInMailbox` error to handle cases where a label is not found in the mailbox
### Changed
- ♻️ refactor(utils): remove unused `get_start_boundary` function
- ♻️ refactor(cli): extract action execution to separate function
- ♻️ refactor(config): extract common logic to reduce duplication
- ♻️ refactor(eol_rule): simplify eol_rule tests
- ♻️ refactor(trash): refactor trash command
- ♻️ refactor(trash): separate trash preparation and execution
- ♻️ refactor(config): make EolRule public
- ♻️ refactor(cli): inject config into run command
## [0.0.6] - 2025-10-09
Summary: Added[23], Changed[26], Chore[12], Fixed[7]
### Added
- ✨ feat(cli): add delete subcommand
- ✨ feat(cli): add delete subcommand
- ✨ feat(gh-release): add delete module
- ✨ feat(delete): implement batch delete functionality
- ✨ feat(message_list): add label support
- ✨ feat(message): add label support to message listing
- ✨ feat(rules_cli): implement add command for managing retention rules
- ✨ feat(cli): add remove label subcommand
- ✨ feat(cli): add list labels subcommand
- ✨ feat(label): implement add label command
- ✨ feat(config): add functionality to set action on rule
- ✨ feat(cli): add action subcommand
- ✨ feat(config_cli): implement action subcommand
- ✨ feat(config): add remove label from rule
- ✨ feat(config): add label functionality to rules
- ✨ feat(error): add RuleNotFound error
- ✨ feat(config): add get_rule function to retrieve existing rules
- ✨ feat(cli): implement commands dispatching
- ✨ feat(label_cli): implement remove label subcommand
- ✨ feat(label_cli): implement label listing subcommand
- ✨ feat(label): implement add label subcommand
- ✨ feat(cli): implement label subcommand
- ✨ feat(config): add cli config - introduce cli config with clap - add subcommand rules and label
### Fixed
- 🐛 fix(config): correct typo in eol_cmd module name
- 🐛 fix(eol_rule): correct grammar in rule descriptions
- 🐛 fix(config): correct grammar in EolRule display
- 🐛 fix(remove_cli): handle rule not found when removing label
- 🐛 fix(label_cli): fix add label logic
- 🐛 fix(cli): correct output format for label list
- 🐛 fix(label_cli): display labels by rule id
### Changed
- ♻️ refactor(trash): encapsulate message list operations
- ♻️ refactor(cli): improve delete command structure
- ♻️ refactor(trash): encapsulate message list
- ♻️ refactor(delete): rename struct and methods for deleting messages
- ♻️ refactor(trash): streamline label handling in trash listing
- ♻️ refactor(utils): improve config directory handling
- ♻️ refactor(labels): simplify error handling in labels module
- ♻️ refactor(trash): simplify error handling and label management
- ♻️ refactor(cli): move rm_cli to new directory
- ♻️ refactor(cli): move rules_cli to config_cli
- ♻️ refactor(cli): rename label_cli module
- ♻️ refactor(cli): rename action_cli module
- ♻️ refactor(cli): rename trash_cli to cli
- ♻️ refactor(cli): rename message_cli to cli
- ♻️ refactor(cli): move label_cli to cli directory
- ♻️ refactor(cli): move config_cli to cli directory
- ♻️ refactor(cli): move main.rs to cli folder - move main.rs to cli folder for better structure
- ♻️ refactor(project): move main.rs to cli directory
- ♻️ refactor(cli): rename command to sub_command for clarity
- ♻️ refactor(core): rename eol_cmd module to eol_action
- ♻️ refactor(core): rename eol_cmd to eol_action - clarifies the file's purpose as defining actions related to EOL handling rather than just commands
- ♻️ refactor(config): make EolRule fields public
- ♻️ refactor(cli): restructure rules CLI
- ♻️ refactor(cli): rename add_cli to rules_cli
- ♻️ refactor(cli): rename rm_cli to rules_cli
- ♻️ refactor(cli): consolidate rules and labels under config subcommand
## [0.0.5] - 2025-10-08
Summary: Added[28], Build[1], Changed[6], Chore[16], Documentation[5], Fixed[10]
### Added
- ✨ feat(cli): implement trace logging for configuration
- ✨ feat(rules_cli): implement rule removal
- ✨ feat(lib): introduce Result type alias for error handling
- ✨ feat(error): add custom error types for rule selection
- ✨ feat(config): enhance rule management and label handling
- ✨ feat(rules_cli): implement rm_cli subcommand
- ✨ feat(rules_cli): add remove command to rules cli
- ✨ feat(rules_cli): add option to immediately delete rules
- ✨ feat(config): add delete flag for retention rules
- ✨ feat(rules_cli): add optional label for retention rules
- ✨ feat(config): add labels method to EolRule
- ✨ feat(config): add support for labels to retention rules
- ✨ feat(config): add retention attribute to EolRule
- ✨ feat(config): enhance rule management with BTreeMap
- ✨ feat(rules_cli): implement add command
- ✨ feat(retention): add message age enum creation
- ✨ feat(rules): add subcommand for rule management
- ✨ feat(config): add result type to list_rules function
- ✨ feat(config): implement display for eolrule struct
- ✨ feat(config): add function to list rules
- ✨ feat(config): implement configuration file management
- ✨ feat(retention): introduce message age enum
- ✨ feat(config): add EolRule struct for managing end-of-life rules
- ✨ feat(retention): implement data retention policy
- ✨ feat(cli): load configuration for message command
- ✨ feat(lib): add config and retention modules
- ✨ feat(eol_cmd): introduce EolCmd enum for message disposal
- ✨ feat(build): add toml dependency
### Fixed
- 🐛 fix(rm_cli): rule removal save
- 🐛 fix(config): improve rule removal and logging
- 🐛 fix(error): improve error message for missing labels
- 🐛 fix(error): refine error message for rule selector
- 🐛 fix(eol_rule): correct rule description in to_string method
- 🐛 fix(rules): fix config_cli.run to return a Result
- 🐛 fix(config): correct pluralization of time periods in EolRule display
- 🐛 fix(message_age): correct retention label formatting
- 🐛 fix(ui): correct grammar errors in eol command and trash messages
- 🐛 fix(error): refine error handling with granular variants
### Changed
- ♻️ refactor(config): use string keys for rules in config
- ♻️ refactor(config): enhance EolRule for label management
- ♻️ refactor(config): rename EolCmd to EolAction for clarity
- ♻️ refactor(core): rename EolCmd to EolAction
- ♻️ refactor(cli): restructure cli commands and config handling
- ♻️ refactor(cli): rename config_cli to rules_cli
## [0.0.4] - 2025-10-07
Summary: Added[9], Changed[7], Chore[8]
### Added
- ✨ feat(message_list): create message summary struct
- ✨ feat(utils): implement string elision trait
- ✨ feat(message_list): improve message handling and logging
- ✨ feat(trash): implement trash functionality
- ✨ feat(trash): add trash cli
- ✨ feat(cli): add trash command
- ✨ feat(message_list): enhance message list functionality and debugging
- ✨ feat(lib): add trash module for moving messages to trash
- ✨ feat(message_list): add message_ids to MessageList struct
### Changed
- ♻️ refactor(trash): improve trash operation logging
- ♻️ refactor(message): rename Message to MessageList
- ♻️ refactor(core): rename message module to message_list
- ♻️ refactor(message): rename message to message_list
- ♻️ refactor(labels): remove unused code
- ♻️ refactor(labels): improve label listing and mapping
- ♻️ refactor(message): improve subject logging with early returns
## [0.0.3] - 2025-10-04
Summary: Added[7], Changed[6], Chore[5], Fixed[1]
### Added
- ✨ feat(message): implement message listing functionality
- ✨ feat(cli): add label listing subcommand
- ✨ feat(labels): add show option to display labels
- ✨ feat(cli): add label command-line interface
- ✨ feat(cli): add query option to list command
- ✨ feat(list): add query support to list messages - allow users to filter messages using a query string - implement set_query method to set the query - add query parameter to the Gmail API call
- ✨ feat(list): add label filtering to list command
### Fixed
- 🐛 fix(list): fix label creation logic
### Changed
- ♻️ refactor(cli): rename list subcommand to message
- ♻️ refactor(cli): rename list_cli to message_cli
- 🔥 refactor(core): remove list module
- ♻️ refactor(core): rename list module to message
- ♻️ refactor(labels): simplify labels struct initialization
- ♻️ refactor(labels): simplify and optimize label retrieval - rename function name `add_label` to `add_labels` - add the function of adding multiple labels at once - optimize code for streamlined operation
## [0.0.2] - 2025-10-03
Summary: Added[26], Build[6], Changed[6], Chore[17], Continuous Integration[1], Documentation[1], Fixed[3], Security[1]
### Added
- ✨ feat(list): add label filtering to list command
- ✨ feat(list): add label filtering capability
- ✨ feat(core): add Labels struct
- ✨ feat(labels): create labels module to manage Gmail labels
- ✨ feat(list): add pagination to list command
- ✨ feat(list): add pagination support for listing messages
- ✨ feat(error): add error type for invalid paging mode
- ✨ feat(list): add max results option to list command
- ✨ feat(list): export DEFAULT_MAX_RESULTS constant
- ✨ feat(error): enhance error handling for configuration issues
- ✨ feat(core): add utils module
- ✨ feat(utils): create assure_config_dir_exists function
- ✨ feat(gmail): implement list functionality for Gmail API
- ✨ feat(lib): add error module and export it
- ✨ feat(error): introduce custom error enum for cull-gmail
- ✨ feat(list): implement list api to retrieve gmail messages
- ✨ feat(list): integrate List struct for message listing
- ✨ feat(list): export List struct in lib.rs
- ✨ feat(cli): add list subcommand
- ✨ feat(core): add client and credential modules
- ✨ feat(list): add list module - creates a new list module
- ✨ feat(credential): implement credential loading and conversion
- ✨ feat(gmail): add gmail client
- ✨ feat(cli): implement list subcommand
- ✨ feat(cli): add command line interface with logging
- ✨ feat(main): add initial main function with hello world
### Fixed
- 🐛 fix(main): exit process with error code on failure
- 🐛 fix(list): remove debug print statement
- 🐛 fix(credential): fix the config directory
### Changed
- ♻️ refactor(list): improve max results handling
- ♻️ refactor(gmail): remove unused client file
- ♻️ refactor(lib): restructure module exports and visibility
- ♻️ refactor(list): improve error handling and config loading
- ♻️ refactor(list): refactor list command to accept credential file
- ♻️ refactor(main): improve error handling and logging
### Security
- 🔧 chore(deps): remove unused dependencies
## [0.0.1] - 2025-09-30
Summary: Added[4], Build[3], Chore[21], Continuous Integration[4], Documentation[7]
### Added
- ✨ feat(lib): add addition function with test
- ✨ feat(assets): add new logo and splash screen
- ✨ feat(vscode): add custom dictionary entry for ltex
- ✨ feat(project): add initial Cargo.toml for cull-gmail tool
[Unreleased]: https://github.com/jerus-org/cull-gmail/compare/v0.0.12...HEAD
[0.0.12]: https://github.com/jerus-org/cull-gmail/compare/v0.0.11...v0.0.12
[0.0.11]: https://github.com/jerus-org/cull-gmail/compare/v0.0.10...v0.0.11
[0.0.10]: https://github.com/jerus-org/cull-gmail/compare/v0.0.9...v0.0.10
[0.0.9]: https://github.com/jerus-org/cull-gmail/compare/v0.0.8...v0.0.9
[0.0.8]: https://github.com/jerus-org/cull-gmail/compare/v0.0.7...v0.0.8
[0.0.7]: https://github.com/jerus-org/cull-gmail/compare/v0.0.6...v0.0.7
[0.0.6]: https://github.com/jerus-org/cull-gmail/compare/v0.0.5...v0.0.6
[0.0.5]: https://github.com/jerus-org/cull-gmail/compare/v0.0.4...v0.0.5
[0.0.4]: https://github.com/jerus-org/cull-gmail/compare/v0.0.3...v0.0.4
[0.0.3]: https://github.com/jerus-org/cull-gmail/compare/v0.0.2...v0.0.3
[0.0.2]: https://github.com/jerus-org/cull-gmail/compare/v0.0.1...v0.0.2
[0.0.1]: https://github.com/jerus-org/cull-gmail/releases/tag/v0.0.1