Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
1.0.0 - 2026-06-18
Added
- YARD documentation on all public classes and methods
CONTRIBUTING.mdwith development setup, architecture overview, and PR requirementsSECURITY.mdwith vulnerability reporting instructions- API stability guarantee: semver contract begins at 1.0.0
.yardoptsconfiguration andyarddevelopment dependencydocumentation_uriin gemspec metadatagh auth tokenas automatic token source for developers with GitHub CLI installed
0.9.0 - 2026-06-18
Added
rubocop-rspecplugin for spec linting with targeted cop overrides- VCR integration tests with recorded cassettes for rails, nokogiri, puma, and edge cases
- Integration formatter tests verifying text, JSON, and markdown output against real API data
- Complete RBS type signatures for all private methods in
GithubClient,UriResolver, andCLI ExitCodemodule withSUCCESS(0),ERROR(1), andPARTIAL_FAILURE(2) constantscheckexits with status based on report errors (0 = all ok, 1 = all failed, 2 = partial)showexits 0 on success, 1 on error- README: exit codes section, concurrency flag docs, CI integration guide
0.8.0 - 2026-06-18
Added
UriResolverclass for source URI resolution with non-GitHub host detection- Informative skip messages for gems hosted on GitLab, Codeberg, Bitbucket, and SourceHut
- Automatic redirect following for renamed GitHub repositories (up to 3 hops)
RepoNotFoundErrorraised with descriptive messages for non-GitHub gemsTagMatcherclass for tag format normalization (v1.2.3,1.2.3,gem_name-1.2.3,release-1.2.3)- GitHub API pagination for gems with 100+ releases (up to 1000 releases)
- Early termination when paginated releases pass the current version
- Per-request timeout (10s default) and total timeout (120s default)
--timeoutflag to set per-request timeoutrequest_timeoutandtotal_timeoutconfig file options- Interactive mode help hint: "(Space to select, Enter to confirm)"
JSON::ParserErrorhandling in gem report builder to prevent worker thread crashes- Wider network error handling:
Errno::ETIMEDOUT,Errno::ECONNRESET,OpenSSL::SSL::SSLError
Changed
RubygemsClientdelegates URI resolution toUriResolver(extractedextract_github_repo)- Error message for missing repo changed from "Could not find GitHub repository" to "Could not determine source repository"
GithubClientusesTagMatcherfor version extraction (replacedTAG_VERSION_REGEX)GithubClientfetches 100 releases per page (was 30) with pagination supportGithubClientreturns empty array for HTTP 301 responses (redirects handled byUriResolver)- All
Gem::Version.newcalls wrapped insafe_gem_versionhelper to preventArgumentErrorcrashes ConcurrentFetcherwrapped in total timeout to prevent runaway operations- HTTP requests in
Cache,RubygemsClient, andChangelogParseruse configurable timeouts
0.7.0 - 2026-06-18
Added
- YAML config file support:
.gem_changelog_diff.yml(project) and~/.config/gem_changelog_diff/config.yml(user) - Supported config keys:
github_token,default_format,cache_ttl,concurrency,ignore_gems,no_color initsubcommand: generate a commented config file template- Config file token used as fallback when
--tokenandGITHUB_TOKENare not set --dry-runflag: show which gems would be checked without fetching changelogs- Dry-run output respects
--formatflag (text, JSON, markdown) - Rails credentials token support: reads from
Rails.application.credentials.dig(:gem_changelog_diff, :github_token)when running inside a Rails app - Token priority:
--tokenflag →GITHUB_TOKENenv → Rails credentials → config file
0.6.0 - 2026-06-18
Added
- Formatter class hierarchy:
Formatters::Text,Formatters::Json,Formatters::Markdown --formatflag:text(default),json, ormarkdown- JSON output (
--format json) for piping tojqor CI tools - Markdown output (
--format markdown) for PR descriptions --outputflag to write formatted output to a file- Interactive gem selection via
tty-prompt(--interactive/-iflag) showsubcommand:gem_changelog_diff show rails 7.0.0 7.1.0
0.5.0 - 2026-06-18
Added
- Disk cache at
~/.cache/gem_changelog_diff/with configurable TTL (default 24h) - ETag conditional requests to avoid consuming rate limit on revalidation
cache clearsubcommand--no-cacheand--cache-ttlflags- Concurrent fetching via thread pool (default 4, configurable via
--concurrency) - Progress indicator via
tty-spinnerwhen running in a terminal
0.4.0 - 2026-06-18
Added
Gemfile.lockparsing viaBundler::LockfileParserwith RubyGems API version lookup- Automatic fallback to lockfile parsing when
bundle outdatedis unavailable --strategyflag:auto(default),outdated, orlockfile--lockfileflag for custom lockfile path- Positional arguments to inspect specific gems:
gem_changelog_diff check rails sidekiq --groupflag to filter by Bundler group--ignoreflag to exclude specific gems
0.3.0 - 2026-06-18
Added
- CHANGELOG.md fallback: fetches and parses changelog files when GitHub Releases are unavailable
- Tries common filename variants:
CHANGELOG.md,CHANGES.md,History.md,NEWS.md SourceResolverorchestrates releases-first, changelog-fallback strategy- Colorized terminal output via
tty-color; respects$NO_COLORand--no-colorflag - Summary line: "X gems outdated, Y with changelogs found, Z skipped"
0.2.0 - 2026-06-17
Added
- GitHub personal access token support via
--tokenflag orGITHUB_TOKENenv var Configurationsingleton for managing runtime settings- Custom error hierarchy:
RepoNotFoundError,GitHubAPIError,RateLimitError,NetworkError - Graceful degradation: failed gems are skipped with a warning instead of aborting
- Rate limit awareness: warns when GitHub API requests remaining drops below 10
--verboseflag for detailed status output--quietflag to suppress warnings
0.1.0 - 2026-06-17
Added
- CLI entry point via Thor (
exe/gem_changelog_diff) withcheckdefault command andversioncommand - Outdated gem detection by parsing
bundle outdated --parseable OutdatedGemdata object for representing outdated gem info- RubyGems API client to look up each gem's GitHub repository
- GitHub API client to fetch releases between locked and latest versions
- Plain text formatter for changelog output
- Full end-to-end pipeline: detect → lookup → fetch → format