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,
and yes, platform and engine support are part of the public API.
Please file a bug if you notice a violation of semantic versioning.
Unreleased
Added
Changed
Deprecated
Removed
Fixed
Security
2.0.4 - 2026-07-01
- TAG: v2.0.4
- COVERAGE: 99.62% – 265/266 lines in 11 files
- BRANCH COVERAGE: 98.46% – 64/65 branches in 11 files
- 93.55% documented
Fixed
- Package configured license files in gem release file lists.
2.0.3 - 2026-06-21
- TAG: v2.0.3
- COVERAGE: 99.62% – 265/266 lines in 11 files
- BRANCH COVERAGE: 98.46% – 64/65 branches in 11 files
- 93.55% documented
Added
- Added support for JRuby 10.1 and TruffleRuby 34.0.
Changed
- Retemplated project metadata and CI/development automation with
kettle-jemv7.0.0.
Fixed
- Corrected OpenCollective funding metadata to use the
kettle-devcollective.
2.0.2 - 2026-06-10
- TAG: v2.0.2
- COVERAGE: 100.00% – 265/265 lines in 10 files
- BRANCH COVERAGE: 100.00% – 64/64 branches in 10 files
- 93.55% documented
Fixed
- Updated generated project metadata links to use the migrated
kettle-dev
GitHub organization.
2.0.1 - 2026-05-31
- TAG: v2.0.1
- COVERAGE: 100.00% – 265/265 lines in 10 files
- BRANCH COVERAGE: 100.00% – 64/64 branches in 10 files
- 93.55% documented
Added
- Added StructuredMerge git diff driver config and local
.gitattributes
entries generated by the current kettle-jem template.
Changed
- Refreshed kettle-jem-managed project files, migrated template config to
.structuredmerge/kettle-jem.yml, and updated local development tooling
dependencies includingkettle-dev2.0.6 andnomono1.0.2.
Fixed
- Fixed generated documentation URLs that incorrectly pointed at a monorepo
gems/token-resolverpath.
2.0.0 - 2026-05-27
- TAG: v2.0.0
- COVERAGE: 100.00% – 265/265 lines in 10 files
- BRANCH COVERAGE: 100.00% – 64/64 branches in 10 files
- 93.55% documented
Added
-
New CI workflows — Expanded Ruby/engine matrix coverage:
-
jruby.yml— JRuby CI workflow -
ruby-3.4.yml— Ruby 3.4 CI workflow -
templating.yml— Templating CI workflow -
truffleruby-23.1.yml,truffleruby-23.2.yml,truffleruby-24.2.yml,truffleruby-25.0.yml— TruffleRuby version-pinned CI workflows - Renamed
legacy.yml→ruby-3.2.ymlandsupported.yml→ruby-3.3.ymlfor consistency
-
-
Dev binaries — New developer/tooling scripts in
bin/:ast-merge-recipe,kettle-gh-release,kettle-jem,print_matches,rbts,unparser -
Modular gemfiles — Added
coverage_local.gemfile,style_local.gemfile,templating.gemfile,templating_local.gemfile, and recording gemfiles for local-path sibling gem development -
Dev container setup — Added
devcontainer/scripts/setup-tree-sitter.shfor Tree-sitter native library installation -
mise environment management — Added
mise.tomlfor ENV-driven local development configuration; migrated from.envrc-only approach to mise + dotenvy -
Template freeze markers — Added
kettle-jem:freeze/kettle-jem:unfreezemarkers intoken-resolver.gemspecto preserve custom sections across template runs -
.gemrc— Added project-level gem configuration file -
.rubocop_rspec.yml— Added RSpec-specific RuboCop configuration -
GitHub Copilot instructions — Added
.github/COPILOT_INSTRUCTIONS.md -
License texts — Added
AGPL-3.0-only.mdandPolyForm-Small-Business-1.0.0.md
Changed
-
BREAKING: License changed from MIT to AGPL-3.0-only OR PolyForm-Small-Business-1.0.0 —
spec.licensesupdated in gemspec; license files, README badges, and compatibility metadata updated accordingly -
kettle-devdevelopment dependency bumped from~> 1.2to~> 2.0 -
bundler-auditdevelopment dependency bumped from~> 0.9.2to~> 0.9.3 -
appraisal2version constraint loosened from~> 3.0, ~> 3.0.6to~> 3.0, >= 3.0.6 -
Local dev wiring — Switched from ad hoc monorepo paths to
nomonoGemfile macros for sibling gem resolution instyle.gemfileand related local gemfiles -
Template dependency — Updated from
jsonc-mergetojson-mergeintemplating_local.gemfile -
Gemspec
homepage_uri— Hardcoded tohttps://token-resolver.galtzo.com/(was dynamically constructed withtr) -
Skip unresolved-token scan for gemspec — Added
.kettle-jem.ymlconfig to excludetoken-resolver.gemspecfrom the token scan -
CI:
codecov/codecov-actionbumped from v5 to v6 -
CI:
marocchino/sticky-pull-request-commentbumped from v2 to v3 -
CI:
addressable(transitive dependency) bumped from 2.8.8 to 2.8.9 -
CI:
json(bundler group) bumped from 2.18.1 to 2.19.2 -
Dev container — Updated
devcontainer.jsonandapt-installscripts with improved tooling setup
Removed
-
LICENSE.txt— Replaced byLICENSE.md,AGPL-3.0-only.md, andPolyForm-Small-Business-1.0.0.md -
Previous license options not included in the new dual-license set — Removed retired license files such as
Big-Time-Public-License.md
Fixed
-
Typos — Minor documentation/comment typo corrections in
BENCHMARK.mdand IDE configuration
Security
-
bundler-audit~> 0.9.3` — Picked up latest security-advisory database and patch-level fixes
1.0.2 - 2026-02-22
- TAG: v1.0.2
- COVERAGE: 98.13% – 263/268 lines in 10 files
- BRANCH COVERAGE: 91.18% – 62/68 branches in 10 files
- 96.77% documented
Added
-
Benchmarking tools — Performance comparison suite comparing
token-resolveragainst simpler
alternatives (String#gsubandKernel#sprintf):-
benchmarks/comparison.rb— Comprehensive benchmark script measuring iterations per second
across four realistic scenarios (simple replacement, moderate complexity, high complexity,
and large documents with sparse tokens) -
gemfiles/modular/benchmark/ips.gemfile— Development dependency forbenchmark-ipsgem - Rake tasks:
rake bench:comparison(run comparison),rake bench:list(list benchmarks),
rake bench:run(run all benchmarks),rake bench(alias) -
BENCHMARK.md— Results and analysis showing token-resolver is 100-3000x slower due to
PEG parsing, validation, and AST building; includes guidance on when to use each approach
and real-world performance context
-
1.0.1 - 2026-02-22
- TAG: v1.0.1
- COVERAGE: 98.13% – 263/268 lines in 10 files
- BRANCH COVERAGE: 91.18% – 62/68 branches in 10 files
- 96.77% documented
Added
-
Config#segment_patternoption — a parslet character class constraining which characters
are valid inside token segments (default:"[A-Za-z0-9_]"). This prevents false positive
token matches against Ruby block parameters ({ |x| expr }), shell variable expansion
(${VAR:+val}), and other syntax that structurally resembles tokens but contains spaces
or punctuation in the “segments”. -
Resolve#resolvenow validates replacement keys against the config’ssegment_patternand
raisesArgumentErrorif a key contains characters that the grammar would never parse.
Fixed
-
False positive token matches — the grammar previously used
any(match any character)
for segment content, which allowed spaces, operators, and punctuation inside token segments.
This caused Ruby block syntax like{ |fp| File.exist?(fp) }and shell expansion like
${CLASSPATH:+:$CLASSPATH}to be incorrectly parsed as tokens. With multi-separator configs
(["|", ":"]), the second|was reconstructed as:duringon_missing: :keep
roundtripping, silently corrupting source files. The grammar now uses
match(segment_pattern)instead ofany, limiting segments to word characters by default.
1.0.0 - 2026-02-21
- TAG: v1.0.0
- COVERAGE: 97.67% – 252/258 lines in 10 files
- BRANCH COVERAGE: 89.39% – 59/66 branches in 10 files
- 96.72% documented
Added
- Initial release