kettle-changelog 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 470b4a1221d494c5197d12fa669c5c2b554cbc71a66c2bc15d4d46a1ccaaef8a
4
+ data.tar.gz: 59f8f87524474affe14bb3c4a4907268af1ce1205a79679e521bd5e6a225b624
5
+ SHA512:
6
+ metadata.gz: ea215da6524469a17c0ead84eb652377de8ecd31eac9382b4c8012381d60a62b254b34719a03c02d96eedb6184785c1510d5a246cc3fe3b44b4439edba396cbf
7
+ data.tar.gz: 17ba27fb850c28d715b553740636a3f6a4db3ea7fd5a0bfa225867d7336c5f26342b8a486f6ff23f857f6da46616f8e8f751b8d29d49d6edf54bbac0e1c78351
checksums.yaml.gz.sig ADDED
Binary file
data/CHANGELOG.md ADDED
@@ -0,0 +1,119 @@
1
+ # Changelog
2
+
3
+ [![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog]
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ The format is based on [Keep a Changelog][📗keep-changelog],
8
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
9
+ and [yes][📌major-versions-not-sacred], platform and engine support are part of the [public API][📌semver-breaking].
10
+ Please file a bug if you notice a violation of semantic versioning.
11
+
12
+ [📌semver]: https://semver.org/spec/v2.0.0.html
13
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
14
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
15
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
16
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
17
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
18
+
19
+ ## [Unreleased]
20
+
21
+ ### Added
22
+
23
+ ### Changed
24
+
25
+ ### Deprecated
26
+
27
+ ### Removed
28
+
29
+ ### Fixed
30
+
31
+ - Preserve family-local dependency wiring during aggregate coverage runs.
32
+
33
+ ### Security
34
+
35
+ ## [1.0.0] - 2026-08-10
36
+
37
+ - TAG: [v1.0.0][1.0.0t]
38
+ - COVERAGE: 93.19% -- 807/866 lines in 4 files
39
+ - BRANCH COVERAGE: 78.31% -- 296/378 branches in 4 files
40
+ - 47.62% documented
41
+
42
+ ### Added
43
+
44
+ - kettle-jem-template-20260720-005 - README Support & Community links now
45
+ include RubyForum.
46
+ - kettle-jem-template-20260726-001 - Projects now include YARD lint
47
+ configuration and documentation dependencies so documentation issues fail
48
+ before generated docs are refreshed.
49
+ - kettle-jem-template-20260727-001 - Spec harness documentation now lists the
50
+ RSpec helpers provided by `kettle-test`.
51
+
52
+ - Provide a standalone CLI for formatting releases and maintaining CHANGELOG.md files.
53
+
54
+ - Provide a minimal release bundle for standalone kettle-changelog bootstrapping.
55
+
56
+ ### Changed
57
+
58
+ - kettle-jem-template-20260716-002 - Gemspecs now ship fewer repository-only
59
+ files, reducing package noise for downstream packagers.
60
+ - kettle-jem-template-20260720-002 - Development Gemfiles now use the released
61
+ `tree_sitter_language_pack` gem 1.13.3 or newer by default.
62
+ - kettle-jem-template-20260725-002 - Version specs now use `anonymous_loader` to
63
+ cover `version.rb` without redefining constants, or are removed when version
64
+ specs are not managed for the project.
65
+ - kettle-jem-template-20260728-001 - Generated Ruby workflows now use clearer
66
+ setup-ruby-flash planning and can prepare appraisal-only jobs without
67
+ installing the main Gemfile bundle.
68
+ - kettle-jem-template-20260801-001 - Generated README gem dashboard links now
69
+ use ClickGems instead of BestGems.
70
+
71
+ ### Fixed
72
+
73
+ - kettle-jem-template-20260720-003 - StructuredMerge Git diff driver config now
74
+ uses the installed `smorg-rb` driver command.
75
+ - kettle-jem-template-20260726-002 - Generated version files now document their
76
+ version namespace and constants, reducing warning-only YARD lint output.
77
+ - kettle-jem-template-20260726-003 - Coverage upload steps now treat Coveralls,
78
+ QLTY, and Codecov as optional, so provider outages do not fail CI when local
79
+ coverage thresholds still pass.
80
+ - kettle-jem-template-20260728-002 - Generated RuboCop configs now ignore the
81
+ same `gemfiles/vendor/bundle` tree as `.gitignore`, so vendored dependency
82
+ installs are not reported as project lint debt.
83
+ - kettle-jem-template-20260728-004 - Generated dep-heads workflows now use the
84
+ setup-ruby Bundler install path for direct appraisal Gemfiles, avoiding rv
85
+ lockfile parser failures on Git and path dependencies.
86
+ - kettle-jem-template-20260728-005 - VersionGem bootstrap now creates the
87
+ missing canonical version spec when a project only has shim namespace version
88
+ specs.
89
+ - kettle-jem-template-20260730-001 - Gemspec package file enumeration now runs
90
+ relative to the gemspec directory, so release package contents stay correct
91
+ even when the gemspec is loaded from another working directory.
92
+ - kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
93
+ managed configuration block bindings structurally, preventing mixed block
94
+ parameter names from producing invalid configuration after a merge.
95
+ - kettle-jem-template-20260801-003 - Generated project metadata and
96
+ documentation now normalize configured underscore hostnames to valid
97
+ hyphenated hostnames.
98
+ - kettle-jem-template-20260801-004 - Generated organization README logos now
99
+ use GitHub's stable organization avatar endpoint instead of assuming a
100
+ matching Galtzo-hosted asset exists.
101
+ - kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
102
+ preserving comments and trailing commas during template updates.
103
+
104
+ - Run target coverage and documentation commands with the target project bundle.
105
+
106
+ - Prevent release workflow and GitHub release settings from contaminating target project tests.
107
+
108
+ - Require kettle-dev 3.0.0 or newer so the standalone executable does not conflict with the legacy kettle-dev changelog executable.
109
+
110
+ - kettle-jem-template-20260720-004 - MRI-only projects now omit JRuby and
111
+ TruffleRuby workflow jobs.
112
+
113
+ ## [0.1.0] - 2026-08-09
114
+
115
+ - Initial release
116
+
117
+ [Unreleased]: https://github.com/kettle-dev/kettle-changelog/compare/v1.0.0...HEAD
118
+ [1.0.0]: https://github.com/kettle-dev/kettle-changelog/compare/v0.1.0...v1.0.0
119
+ [1.0.0t]: https://github.com/kettle-dev/kettle-changelog/releases/tag/v1.0.0
data/LICENSE.md ADDED
@@ -0,0 +1,12 @@
1
+ # License
2
+
3
+ This project is made available under the following license.
4
+ Choose the option that best fits your use case:
5
+
6
+ - [AGPL-3.0-only](https://github.com/kettle-dev/kettle-changelog/blob/main/AGPL-3.0-only.md)
7
+
8
+ If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
9
+
10
+ ## Copyright Notice
11
+
12
+ - Copyright (c) 2026 Peter H. Boling
data/README.md ADDED
@@ -0,0 +1,429 @@
1
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by GitHub" src="https://github.com/kettle-dev.png?size=192" width="14%" align="right"/></a>
2
+
3
+ # 📝 Kettle::Changelog
4
+
5
+ [![Version][👽versioni]][👽version] [![Ruby Users Forum][✉️ruby-forum-top-img]][✉️ruby-forum] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only][📄license-img]][📄license] [![Total downloads][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
6
+
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know on Discord][✉️discord-invite] or [RubyForum][✉️ruby-forum], as I may have missed the notification.
8
+
9
+ ---
10
+
11
+ `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
12
+
13
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
14
+
15
+ <details markdown="1">
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
17
+
18
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
19
+
20
+ </details>
21
+
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
23
+
24
+ `kettle-changelog` prepares and maintains `CHANGELOG.md` files for Ruby gems. It moves entries from `Unreleased` into a versioned release section, adds coverage and documentation statistics, updates comparison links, and can emit structured release events for orchestration tools.
25
+
26
+ ## 💡 Info you can shake a stick at
27
+
28
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
29
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
30
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
31
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
32
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
33
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
34
+ | Compliance | [![License: AGPL-3.0-only][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
35
+ | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
36
+ | Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
37
+ | `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
38
+
39
+ ### Compatibility
40
+
41
+ Compatible with MRI Ruby 4.0.0+.
42
+ CI workflows and Appraisals are generated for MRI Ruby 4.0.0+.
43
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
44
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
45
+ not practical for the current toolchain.
46
+
47
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
48
+
49
+ The _amazing_ test matrix is powered by the kettle-dev stack.
50
+
51
+ <details markdown="1">
52
+ <summary>How kettle-dev manages complexity in tests</summary>
53
+
54
+ | Gem | Source | Role | Total downloads |
55
+ |-----|--------|------|---------------------|
56
+ | [appraisal2](https://clickgems.clickhouse.com/dashboard/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Total downloads for appraisal2](https://img.shields.io/gem/dt/appraisal2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2) |
57
+ | [appraisal2-rubocop](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Total downloads for appraisal2-rubocop](https://img.shields.io/gem/dt/appraisal2-rubocop.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) |
58
+ | [kettle-dev](https://clickgems.clickhouse.com/dashboard/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Total downloads for kettle-dev](https://img.shields.io/gem/dt/kettle-dev.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-dev) |
59
+ | [kettle-jem](https://clickgems.clickhouse.com/dashboard/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Total downloads for kettle-jem](https://img.shields.io/gem/dt/kettle-jem.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-jem) |
60
+ | [kettle-soup-cover](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Total downloads for kettle-soup-cover](https://img.shields.io/gem/dt/kettle-soup-cover.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) |
61
+ | [kettle-test](https://clickgems.clickhouse.com/dashboard/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Total downloads for kettle-test](https://img.shields.io/gem/dt/kettle-test.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-test) |
62
+ | [rubocop-lts](https://clickgems.clickhouse.com/dashboard/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Total downloads for rubocop-lts](https://img.shields.io/gem/dt/rubocop-lts.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/rubocop-lts) |
63
+ | [turbo_tests2](https://clickgems.clickhouse.com/dashboard/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Total downloads for turbo_tests2](https://img.shields.io/gem/dt/turbo_tests2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/turbo_tests2) |
64
+
65
+ </details>
66
+
67
+ ### Federated DVCS
68
+
69
+ <details markdown="1">
70
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
71
+
72
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
73
+ |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
74
+ | 🧪 [kettle-dev/kettle-changelog on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
75
+ | 🧊 [kettle-dev/kettle-changelog on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
76
+ | 🐙 [kettle-dev/kettle-changelog on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
77
+
78
+ </details>
79
+
80
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/kettle-changelog)](https://tidelift.com/subscription/pkg/rubygems-kettle-changelog?utm_source=rubygems-kettle-changelog&utm_medium=referral&utm_campaign=readme)
81
+
82
+ Available as part of the Tidelift Subscription.
83
+
84
+ <details markdown="1">
85
+ <summary>Need enterprise-level guarantees?</summary>
86
+
87
+ The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
88
+
89
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
90
+
91
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
92
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
93
+ - 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
94
+
95
+ Alternatively:
96
+
97
+ - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
98
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
99
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
100
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
101
+
102
+ </details>
103
+
104
+ ## ✨ Installation
105
+
106
+ Install the gem and add to the application's Gemfile by executing:
107
+
108
+ ```console
109
+ bundle add kettle-changelog
110
+ ```
111
+
112
+ If bundler is not being used to manage dependencies, install the gem by executing:
113
+
114
+ ```console
115
+ gem install kettle-changelog
116
+ ```
117
+
118
+ ## ⚙️ Configuration
119
+
120
+ `kettle-changelog` has no project configuration file. Configure project-specific paths and release behavior with environment variables:
121
+
122
+ - `K_CHANGELOG_PATH` selects a changelog outside the current project root.
123
+ - `K_CHANGELOG_COVERAGE_ROOT` selects the project root used for coverage generation.
124
+ - `K_CHANGELOG_VERSION_FILE` selects the version file when the project has more than one version tree.
125
+ - `K_CHANGELOG_GEM_NAME` overrides the gem name used for release lookups.
126
+ - `K_CHANGELOG_STRICT=false` allows missing coverage or YARD data.
127
+ - `K_CHANGELOG_COVERAGE_HARD=false` disables hard coverage-threshold failures.
128
+ - `KETTLE_GEM_COOP_REFRESH=true` refreshes cached gem metadata.
129
+
130
+ ## 🔧 Basic Usage
131
+
132
+ Run the release preparation command from the gem root:
133
+
134
+ ```console
135
+ bundle exec kettle-changelog
136
+ ```
137
+
138
+ Use `--yes` for non-interactive release automation. Add a note without preparing a release with:
139
+
140
+ ```console
141
+ bundle exec kettle-changelog --add-unreleased-entry --section Fixed --entry "Describe the fix."
142
+ ```
143
+
144
+ Useful queries and maintenance commands include `--pending-release`, `--release-state`, `--reformat`, `--update-prep`, `--json`, and `--events=changelog`. Run `bundle exec kettle-changelog --help` for the complete option list.
145
+
146
+ ## 🔐 Security
147
+
148
+ See [SECURITY.md][🔐security].
149
+
150
+ ## 🤝 Contributing
151
+
152
+ If you need some ideas of where to help, you could work on adding more code coverage,
153
+ check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], or use the gem and think about how it could be better.
154
+
155
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
156
+
157
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
158
+
159
+ ### 🚀 Release Instructions
160
+
161
+ See [CONTRIBUTING.md][🤝contributing].
162
+
163
+ ### Code Coverage
164
+
165
+ <details markdown="1">
166
+ <summary>Coverage service badges</summary>
167
+
168
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
169
+
170
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
171
+
172
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
173
+
174
+ </details>
175
+
176
+ ### 🪇 Code of Conduct
177
+
178
+ Everyone interacting with this project's codebases, issue trackers,
179
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
180
+
181
+ ## 🌈 Contributors
182
+
183
+ [![Contributors][🖐contributors-img]][🖐contributors]
184
+
185
+ Made with [contributors-img][🖐contrib-rocks].
186
+
187
+ Also see GitLab Contributors: [https://gitlab.com/kettle-dev/kettle-changelog/-/graphs/main][🚎contributors-gl]
188
+
189
+ ## 📌 Versioning
190
+
191
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
192
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
193
+
194
+ For example:
195
+
196
+ ```ruby
197
+ spec.add_dependency("kettle-changelog", "~> 1.0")
198
+ ```
199
+
200
+ <details markdown="1">
201
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
202
+
203
+ Dropping support for a platform can be a breaking change for affected users.
204
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
205
+
206
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
207
+ read this article from the creator of SemVer:
208
+
209
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
210
+
211
+ </details>
212
+
213
+ See [CHANGELOG.md][📌changelog] for a list of releases.
214
+
215
+ ## 📄 License
216
+
217
+ The gem is available under the following license: [AGPL-3.0-only](https://github.com/kettle-dev/kettle-changelog/blob/main/AGPL-3.0-only.md).
218
+ See [LICENSE.md][📄license] for details.
219
+
220
+ If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
221
+
222
+ ### © Copyright
223
+
224
+ See [LICENSE.md][📄license] for the official copyright notice.
225
+
226
+ <details markdown="1">
227
+ <summary>Copyright holders</summary>
228
+
229
+ - Copyright (c) 2026 Peter H. Boling
230
+
231
+ </details>
232
+
233
+ ## 🤑 A request for help
234
+
235
+ Maintainers have teeth and need to pay their dentists.
236
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
237
+ I began spending most of my time building open source tools.
238
+ I'm hoping to be able to pay for my kids' health insurance this month,
239
+ so if you value the work I am doing, I need your support.
240
+ Please consider sponsoring me or the project.
241
+
242
+ To join the community or get help, use the RubyForum or Discord.
243
+
244
+ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
245
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
246
+
247
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
248
+
249
+ [![Sponsor kettle-dev/kettle-changelog on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
250
+
251
+ ### Please give the project a star ⭐ ♥.
252
+
253
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
254
+
255
+ Thanks for RTFM. ☺️
256
+
257
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
258
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
259
+ [⛳liberapay]: https://liberapay.com/pboling/donate
260
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/kettle-dev
261
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/kettle-dev
262
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/kettle-dev
263
+ [🖇osc-backers]: https://opencollective.com/kettle-dev#backer
264
+ [🖇osc-backers-i]: https://opencollective.com/kettle-dev/backers/badge.svg?style=flat
265
+ [🖇osc-sponsors]: https://opencollective.com/kettle-dev#sponsor
266
+ [🖇osc-sponsors-i]: https://opencollective.com/kettle-dev/sponsors/badge.svg?style=flat
267
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/kettle-dev?style=for-the-badge
268
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/kettle-dev?style=for-the-badge
269
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/kettle-dev?style=for-the-badge
270
+ [🖇osc]: https://opencollective.com/kettle-dev
271
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
272
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
273
+ [🖇sponsor]: https://github.com/sponsors/pboling
274
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
275
+ [🖇kofi]: https://ko-fi.com/pboling
276
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
277
+ [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
278
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
279
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
280
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
281
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
282
+ [🖇floss-funding.dev]: https://floss-funding.dev
283
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
284
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
285
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
286
+ [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
287
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
288
+ [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
289
+ [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
290
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/kettle-dev
291
+
292
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
293
+ [⛳️gem-namespace]: https://github.com/kettle-dev/kettle-changelog
294
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Kettle::Changelog-3C2D2D.svg?style=square&logo=ruby&logoColor=white
295
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/kettle-changelog
296
+ [⛳️name-img]: https://img.shields.io/badge/name-kettle--changelog-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
297
+ [⛳️tag-img]: https://img.shields.io/github/tag/kettle-dev/kettle-changelog.svg
298
+ [⛳️tag]: https://github.com/kettle-dev/kettle-changelog/releases
299
+ [🚂maint-blog]: http://www.railsbling.com/tags/kettle-changelog
300
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
301
+ [🚂maint-contact]: http://www.railsbling.com/contact
302
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
303
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
304
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
305
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
306
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
307
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
308
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
309
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
310
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
311
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
312
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
313
+ [💖🌳linktree]: https://linktr.ee/galtzo
314
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
315
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
316
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
317
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
318
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
319
+ [💖🧊berg]: https://codeberg.org/pboling
320
+ [💖🐙hub]: https://github.org/pboling
321
+ [💖🛖hut]: https://sr.ht/~galtzo/
322
+ [💖🧪lab]: https://gitlab.com/pboling
323
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
324
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
325
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
326
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
327
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-kettle-changelog?utm_source=rubygems-kettle-changelog&utm_medium=referral&utm_campaign=readme
328
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
329
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
330
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
331
+ [🚂railsbling]: http://www.railsbling.com
332
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
333
+ [📜src-gl]: https://gitlab.com/kettle-dev/kettle-changelog
334
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
335
+ [📜src-cb]: https://codeberg.org/kettle-dev/kettle-changelog
336
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
337
+ [📜src-gh]: https://github.com/kettle-dev/kettle-changelog
338
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
339
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
340
+ [📜gl-wiki]: https://gitlab.com/kettle-dev/kettle-changelog/-/wikis/home
341
+ [📜gh-wiki]: https://github.com/kettle-dev/kettle-changelog/wiki
342
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
343
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
344
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/kettle-changelog
345
+ [👽dl-ranki]: https://img.shields.io/gem/dt/kettle-changelog.svg
346
+ [👽version]: https://clickgems.clickhouse.com/dashboard/kettle-changelog
347
+ [👽versioni]: https://img.shields.io/gem/v/kettle-changelog.svg
348
+ [🏀qlty-mnt]: https://qlty.sh/gh/kettle-dev/projects/kettle-changelog
349
+ [🏀qlty-mnti]: https://qlty.sh/gh/kettle-dev/projects/kettle-changelog/maintainability.svg
350
+ [🏀qlty-cov]: https://qlty.sh/gh/kettle-dev/projects/kettle-changelog/metrics/code?sort=coverageRating
351
+ [🏀qlty-covi]: https://qlty.sh/gh/kettle-dev/projects/kettle-changelog/coverage.svg
352
+ [🏀codecov]: https://codecov.io/gh/kettle-dev/kettle-changelog
353
+ [🏀codecovi]: https://codecov.io/gh/kettle-dev/kettle-changelog/graph/badge.svg
354
+ [🏀coveralls]: https://coveralls.io/github/kettle-dev/kettle-changelog?branch=main
355
+ [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-dev/kettle-changelog/badge.svg?branch=main
356
+ [🚎2-cov-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/coverage.yml
357
+ [🚎2-cov-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/coverage.yml/badge.svg
358
+ [🚎3-hd-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/heads.yml
359
+ [🚎3-hd-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/heads.yml/badge.svg
360
+ [🚎5-st-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/style.yml
361
+ [🚎5-st-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/style.yml/badge.svg
362
+ [🚎11-c-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/current.yml
363
+ [🚎11-c-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/current.yml/badge.svg
364
+ [🚎12-crh-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/dep-heads.yml
365
+ [🚎12-crh-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/dep-heads.yml/badge.svg
366
+ [🚎13-🔒️-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/locked_deps.yml
367
+ [🚎13-🔒️-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/locked_deps.yml/badge.svg
368
+ [🚎14-🔓️-wf]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/unlocked_deps.yml
369
+ [🚎14-🔓️-wfi]: https://github.com/kettle-dev/kettle-changelog/actions/workflows/unlocked_deps.yml/badge.svg
370
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
371
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
372
+ [🤝gh-issues]: https://github.com/kettle-dev/kettle-changelog/issues
373
+ [🤝gh-pulls]: https://github.com/kettle-dev/kettle-changelog/pulls
374
+ [🤝gl-issues]: https://gitlab.com/kettle-dev/kettle-changelog/-/issues
375
+ [🤝gl-pulls]: https://gitlab.com/kettle-dev/kettle-changelog/-/merge_requests
376
+ [🤝cb-issues]: https://codeberg.org/kettle-dev/kettle-changelog/issues
377
+ [🤝cb-pulls]: https://codeberg.org/kettle-dev/kettle-changelog/pulls
378
+ [🤝cb-donate]: https://donate.codeberg.org/
379
+ [🤝contributing]: https://github.com/kettle-dev/kettle-changelog/blob/main/CONTRIBUTING.md
380
+ [🏀codecov-g]: https://codecov.io/gh/kettle-dev/kettle-changelog/graph/badge.svg
381
+ [🖐contrib-rocks]: https://contrib.rocks
382
+ [🖐contributors]: https://github.com/kettle-dev/kettle-changelog/graphs/contributors
383
+ [🖐contributors-img]: https://contrib.rocks/image?repo=kettle-dev/kettle-changelog
384
+ [🚎contributors-gl]: https://gitlab.com/kettle-dev/kettle-changelog/-/graphs/main
385
+ [🪇conduct]: https://github.com/kettle-dev/kettle-changelog/blob/main/CODE_OF_CONDUCT.md
386
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
387
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
388
+ [📌semver]: https://semver.org/spec/v2.0.0.html
389
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
390
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
391
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
392
+ [📌changelog]: https://github.com/kettle-dev/kettle-changelog/blob/main/CHANGELOG.md
393
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
394
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
395
+ [📌gitmoji]: https://gitmoji.dev
396
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
397
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
398
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.866-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
399
+ [🔐security]: https://github.com/kettle-dev/kettle-changelog/blob/main/SECURITY.md
400
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
401
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
402
+ [📄license]: LICENSE.md
403
+ [📄license-ref]: https://github.com/kettle-dev/kettle-changelog/blob/main/AGPL-3.0-only.md
404
+ [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only-259D6C.svg
405
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
406
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
407
+
408
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
409
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
410
+ [🚎yard-current]: http://rubydoc.info/gems/kettle-changelog
411
+ [🚎yard-head]: https://kettle-changelog.galtzo.com
412
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
413
+ [💎SHA_checksums]: https://gitlab.com/kettle-dev/kettle-changelog/-/tree/main/checksums
414
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
415
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
416
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
417
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
418
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
419
+
420
+ <!-- kettle-jem:metadata:start -->
421
+ | Field | Value |
422
+ |---|---|
423
+ | Package | kettle-changelog |
424
+ | Description | 📝 kettle-changelog formats release sections, manages Unreleased entries, and emits machine-readable release events for Ruby gems. |
425
+ | Homepage | https://github.com/kettle-dev/kettle-changelog |
426
+ | Source | https://github.com/kettle-dev/kettle-changelog |
427
+ | License | `AGPL-3.0-only` |
428
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-dev, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-changelog, https://www.buymeacoffee.com/pboling |
429
+ <!-- kettle-jem:metadata:end -->