all repos — llm_aggregator @ 7208dd81944bf3bb82070208a69ea5d1d083dd01

A CLI tool to aggregate RSS feeds and summarise them with LLMs

7208dd81
fix: restructure TUI with bubbletea command pattern and progress interface

- Replace manual goroutine and signal handling with native bubbletea
  commands
  - Move runtime execution into `Model.startProcessing()` tea.Cmd
  - Remove `runWithTUI` goroutine orchestration and channel
    synchronisation
- Introduce `progress.Progress` interface and inject into
  `runtime.Runtime`
  - Add `SetStage`, `SetSubStage`, `SetArticleCount` methods to
    `SimpleLogger` and `NoopLogger`
  - Replace internal `logger *progress.Context` with `Progress
    progress.Progress` field
- Simplify `TUIProgress` to only send messages to existing `tea.Program`
  - Remove program creation and runtime execution from `TUIProgress`
  - Use `StageMsg`, `SubStageMsg`, `ArticleCountMsg` for updates
- Update `Model` to hold `*runtime.Runtime` and display spinner
  - Add `spinner` model and tick command for visual feedback
  - Show checkmark on completion, capture elapsed time, and display
    summary inline
- Clean up unused `StepMsg` related functions and redundant blank lines
- Adjust `applyConfiguration` formatting and remove unused imports
  (`os/signal`, `syscall`)
Maxwell Jensen 85795372+maxwelljens@users.noreply.github.com
Tue, 21 Apr 2026 21:47:59 +0200
6e3abd06
feat: add configuration file and environment variable support

- Add `internal/config` package with Viper-based TOML loading
  - Load configuration from `~/.config/llm_aggregator/config.toml` (XDG
    compliant)
  - Support all aggregation, API, and output options in config file
  - Implement precedence: CLI args > env vars > config file > built‑in
    defaults
- Integrate config loading into `cmd/llm_aggregator.go`
  - Call `config.Load()` before argument parsing
  - Apply config values to runtime with `applyConfiguration()`
  - Gracefully warn if config file exists but fails to load
- Rename environment variable prefix from `DEEPSEEK_API_KEY` to
  `LLM_AGGREGATOR_API_KEY`
  - Update `internal/cli/args.go` help text and environment variable
    reference
  - Update `internal/llm/deepseek.go` to read `LLM_AGGREGATOR_API_KEY`
  - Update `README.md` and `CHANGELOG.md` to reflect new variable name
- Add `configs/config.example.toml` with documented configuration
  options
- Add `internal/config/config_test.go` covering defaults, path
  resolution, save/load, and environment variable precedence
- Update `go.mod` / `go.sum` with new dependencies:
  - `github.com/spf13/viper` for configuration management
  - `github.com/adrg/xdg` for XDG base directory support
  - `github.com/pelletier/go-toml/v2` (indirect via viper)
- Revise `README.md` to document the new configuration system,
  precedence order, and environment variables
- Update `CHANGELOG.md` for version 0.3.0
- Remove unused `internal/config` global flags (`QuietMode`,
  `VerboseMode`) replaced by runtime configuration
Maxwell Jensen 85795372+maxwelljens@users.noreply.github.com
Tue, 21 Apr 2026 18:37:19 +0200
13547fc8
feat: add verbose flag to control progress and status messages

- Make CLI silent by default; only final output and errors are displayed
  - Move all progress logs, warnings, and debug messages behind
    `-v/--verbose`
- Introduce logger interface (`progress.Context`) for consistent logging
  - Add `NoopLogger` for silent mode, `SimpleLogger` for verbose output
- Update components to use logger instead of direct `fmt.Print` calls
  - `aggregator.FeedAggregator` accepts logger via
    `NewFeedAggregatorWithProgress`
  - `processor.ContentProcessor` gains `SetLogger` method
  - `llm.DeepseekClient` gains `SetLogger` method
- Modify `runtime.Runtime` to create appropriate logger from `Verbose`
  flag
- Update CLI flag description: `--verbose` now says "Show verbose
  output"
- Remove redundant conditional logging blocks (if verbose) from
  `cmd/llm_aggregator.go`
- Ensure token estimates, filtering summaries, and API call logs only
  appear in verbose mode
Maxwell Jensen 85795372+maxwelljens@users.noreply.github.com
Tue, 21 Apr 2026 15:41:41 +0200
7b6943f1
feat: initial implementation of LLM RSS aggregator with DeepSeek summarisation

- Add core aggregation engine (`internal/aggregator/`)
  - Parse RSS/Atom/JSON feeds using `gofeed`
  - Extract article metadata (title, link, date, author)
  - Fallback to web scraping with `goquery` for minimal content
- Add content processing and filtering (`internal/processor/`)
  - Keyword-based include/exclude filtering
  - Sort by date, title, or source
  - Token estimation and context preparation
- Add DeepSeek API integration (`internal/llm/`)
  - OpenAI-compatible client for chat completions
  - Configurable model, max tokens, temperature
  - Support custom system prompts
- Add command-line interface (`internal/cli/`)
  - `go-arg` based argument parsing
  - Options for feeds file, prompt, filtering, output formats
  - Environment variable support for API key
- Add output formatting (`internal/output/`)
  - Plain text, GitHub‑flavoured markdown, and JSON outputs
  - Optional inclusion of original articles
- Add terminal user interface (`internal/tui/`)
  - Bubble Tea based progress bar with gradient colours
  - Live article counters and elapsed time
  - Keyboard controls (q/Ctrl+C to quit)
- Add runtime orchestration (`internal/runtime/`)
  - Pipeline execution (aggregate → process → summarise → output)
  - File output support
- Add project documentation
  - `README.md` with usage examples and dependencies
  - `CHANGELOG.md` for version 0.1.0
  - `LICENCE.txt` (EUPL 1.2)
  - Third‑party library READMEs in `docs/` for reference
- Add build configuration
  - `go.mod` with dependencies (gofeed, openai-go, bubbletea, lipgloss,
    go-arg, goquery)
  - `.goreleaser.yaml` for cross‑platform releases
  - `.gitignore` for Go binaries and test artifacts
Maxwell Jensen 85795372+maxwelljens@users.noreply.github.com
Tue, 21 Apr 2026 14:44:42 +0200