CHANGELOG.md (view raw)
1# Changelog
2
3All notable changes to this project will be documented in this file.
4
5The format is based on [Keep a
6Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to
7[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
9## [0.5.0] - 2026-04-22
10
11### Added
12
13- **Accurate token counting with tiktoken**
14 - New `internal/tokeniser` package using OpenAI's tiktoken-go library
15 - BPE tokenisation for accurate token counting vs rough character estimation
16 - Encoding caching to avoid repeated initialisation overhead
17 - Model-aware encoding selection (cl100k_base, o200k_base, etc.)
18 - `CountTokens()` and `CountMessagesTokens()` functions
19 - Fallback to rough estimation when tiktoken initialisation fails
20- **Concurrent feed fetching**: Feeds are now fetched concurrently using
21 `golang.org/x/sync/errgroup`
22 - Semaphore limits concurrent requests to 10 to avoid server overload
23 - Mutex-protected shared state for thread-safe article collection
24 - Partial failures don't stop other feeds from being processed
25- **Scrollable summary in TUI**
26 - Bubble Tea viewport component for browsing long summaries
27 - Keyboard navigation: j/k or arrows (scroll), Space/B (page), g/G
28 (start/end)
29 - Mouse wheel scrolling support
30 - Scroll progress indicator showing position and total lines
31
32### Changed
33
34- **Streamlined configuration management**: Viper now uses global instance with
35automatic precedence handling. Simplified configuration flow: Parse → GetViper
36→ BindCLIArgs → ViperToRuntime
37- **TUI colour scheme**: All hex colour codes replaced with ANSI 256-colour
38 palette
39
40### Fixed
41
42- Viewport now properly handles scroll events via `Update()`. Summary content
43 pre-wrapped to viewport width before display
44- Fixed string literal colour names to use actual variables
45
46## [0.4.0] - 2026-04-21
47
48### Changed
49
50- **TUI is now fully functional and production-ready**: Replaced the
51work-in-progress TUI implementation with a robust Bubble Tea command pattern:
52 - Runtime execution now uses native `tea.Cmd` instead of manual goroutine
53 orchestration.
54 - Added real-time progress updates via `progress.Progress` interface with
55 stage, substage, and article count messages.
56 - TUI displays a spinner, elapsed time, and final summary inline.
57 - Removed signal handling and channel synchronisation in favour of Bubble
58 Tea's built-in lifecycle.
59 - `TUIProgress` now only sends messages to an existing program, simplifying
60 integration.
61 - Both verbose mode (`SimpleLogger`) and TUI mode share the same
62 `progress.Progress` interface.
63
64## [0.3.0] - 2026-04-21
65
66### Added
67
68- **Configuration file support via TOML** (XDG-compliant and cross-platform)
69 - Load settings from `~/.config/llm_aggregator/config.toml`
70 - Supports all aggregation, API, and output options
71 - Example configuration file at `configs/config.example.toml`
72- **Environment variable support with `LLM_AGGREGATOR_` prefix**
73 - All configuration options can be set via environment variables
74 - Precedence order: CLI arguments > environment variables > config file >
75 built‑in defaults
76- New `internal/config` package with Viper integration
77 - `Load()` and `Save()` methods for configuration management
78 - `GetConfigPath()` for XDG‑compliant config file location
79 - `ConfigExists()` to check for existing configuration
80- Comprehensive unit tests for configuration loading, saving, and environment
81 variable precedence (`internal/config/config_test.go`)
82
83### Changed
84
85- **Environment variable renamed:** `DEEPSEEK_API_KEY` →
86 `LLM_AGGREGATOR_API_KEY`
87- **CLI help text** now reflects the new API key environment variable and
88 general configuration options
89- **Command‑line argument precedence** implemented in `cmd/llm_aggregator.go`
90via `applyConfiguration()`
91- Updated all help text, documentation, and code references
92- `README.md` completely revised with a new "Configuration" section
93
94### Removed
95
96- Global `QuietMode` and `VerboseMode` variables from
97`internal/config/config.go`. Replaced by runtime‑specific configuration in
98`runtime.Runtime` and CLI arguments
99- Hardcoded system prompt in `runtime.NewRuntime()`. Now left empty, allowing
100configuration or client default to be used
101- CLI flags now correctly override config file and environment variables
102
103## [0.2.0] - 2026-04-21
104
105### Changed
106
107- Moved all progress and status messages behind `-v/--verbose` flag
108- Default CLI mode is now silent except for final output and errors
109- Components (aggregator, processor, LLM client) use logger interface
110controlled by verbose flag
111
112## [0.1.0] - 2026-04-21
113
114### Added
115
116- Complete translation from Python prototype to Go implementation
117- RSS/Atom feed parsing using `gofeed` library
118- DeepSeek API integration via `openai-go` client, configured for `/chat/completions` endpoint
119- Content filtering and processing with keyword‑based include/exclude, date filtering, and sorting
120- Command‑line interface using `go‑arg` with automatic help and version flags
121- Multiple output formats: plain text, GitHub‑flavoured markdown, and JSON
122- Terminal user interface (TUI) built with `bubbletea` featuring:
123 - Animated progress bar with gradient colours (`#FF7CCB` to `#FDFF8C`)
124 - Live article counters (aggregated/processed)
125 - Elapsed time display
126 - Coloured status indicators using `lipgloss` styling
127 - Keyboard controls (q/Ctrl+C to quit)
128- Web content extraction fallback using `goquery` when feed descriptions are minimal
129- Configurable limits: articles per feed, maximum age, total articles
130- Token estimation and API usage logging
131- Environment variable support (`LLM_AGGREGATOR_API_KEY`) for authentication
132- Example feeds file with technology, programming, and free software sources
133
134### Changed
135
136- Program structure organised into standard Go layout: `cmd/`, `internal/`, `pkg/`
137- English spelling conventions maintained throughout (colour, initialise, summarise)
138- Error handling improved with specific messages for common API failures (invalid key, rate limits, etc.)
139- Progress reporting unified through a `ProgressContext` interface for both TUI and CLI modes
140
141### Fixed
142
143- Initial API endpoint mismatch (using `/responses` instead of `/chat/completions`)
144- Nil pointer dereferences when handling optional feed metadata (author, dates)
145- String repetition syntax errors in Go (replaced `"="*80` with `strings.Repeat`)
146- CLI help/version flag handling to show information without requiring other arguments
147- Type compatibility issues with `openai-go` v3 API (message parameters, token usage fields)