kettle-jem 7.0.0 → 7.1.3

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.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +1505 -0
  4. data/LICENSE.md +13 -0
  5. data/README.md +794 -0
  6. data/exe/kettle-jem +20 -0
  7. data/lib/kettle/jem/cli.rb +334 -0
  8. data/lib/kettle/jem/license_txt_migrator.rb +33 -0
  9. data/lib/kettle/jem/rakelib/install.rake +10 -0
  10. data/lib/kettle/jem/rakelib/prepare.rake +10 -0
  11. data/lib/kettle/jem/rakelib/selftest.rake +10 -0
  12. data/lib/kettle/jem/rakelib/template.rake +10 -0
  13. data/lib/kettle/jem/tasks/install_task.rb +2178 -0
  14. data/lib/kettle/jem/tasks/prepare_task.rb +274 -0
  15. data/lib/kettle/jem/tasks/self_test_task.rb +256 -0
  16. data/lib/kettle/jem/tasks/template_task.rb +124 -0
  17. data/lib/kettle/jem/tasks.rb +6 -0
  18. data/lib/kettle/jem/templates/.aiignore.example +19 -0
  19. data/lib/kettle/jem/templates/.config/mise/env.sh +26 -0
  20. data/lib/kettle/jem/templates/.devcontainer/apt-install/devcontainer-feature.json.example +9 -0
  21. data/lib/kettle/jem/templates/.devcontainer/apt-install/install.sh.example +19 -0
  22. data/lib/kettle/jem/templates/.devcontainer/devcontainer.json.example +27 -0
  23. data/lib/kettle/jem/templates/.devcontainer/scripts/setup-tree-sitter.sh.example +210 -0
  24. data/lib/kettle/jem/templates/.env.local.example +67 -0
  25. data/lib/kettle/jem/templates/.envrc.example +4 -0
  26. data/lib/kettle/jem/templates/.envrc.no-osc.example +4 -0
  27. data/lib/kettle/jem/templates/.gemrc.example +1 -0
  28. data/lib/kettle/jem/templates/.git-hooks/commit-msg.example +60 -0
  29. data/lib/kettle/jem/templates/.git-hooks/commit-subjects-goalie.txt.example +8 -0
  30. data/lib/kettle/jem/templates/.git-hooks/footer-template.erb.txt.example +16 -0
  31. data/lib/kettle/jem/templates/.git-hooks/prepare-commit-msg.example +9 -0
  32. data/lib/kettle/jem/templates/.github/.codecov.yml.example +14 -0
  33. data/lib/kettle/jem/templates/.github/FUNDING.yml.example +10 -0
  34. data/lib/kettle/jem/templates/.github/FUNDING.yml.no-osc.example +10 -0
  35. data/lib/kettle/jem/templates/.github/copilot_instructions.md.example +1 -0
  36. data/lib/kettle/jem/templates/.github/dependabot.yml.example +13 -0
  37. data/lib/kettle/jem/templates/.github/workflows/auto-assign.yml.example +21 -0
  38. data/lib/kettle/jem/templates/.github/workflows/coverage.yml.example +102 -0
  39. data/lib/kettle/jem/templates/.github/workflows/current.yml.example +86 -0
  40. data/lib/kettle/jem/templates/.github/workflows/dep-heads.yml.example +249 -0
  41. data/lib/kettle/jem/templates/.github/workflows/dependency-review.yml.example +22 -0
  42. data/lib/kettle/jem/templates/.github/workflows/discord-notifier.yml.example +39 -0
  43. data/lib/kettle/jem/templates/.github/workflows/framework-ci.yml.example +81 -0
  44. data/lib/kettle/jem/templates/.github/workflows/heads.yml.example +212 -0
  45. data/lib/kettle/jem/templates/.github/workflows/jruby-10.0.yml.example +91 -0
  46. data/lib/kettle/jem/templates/.github/workflows/jruby-9.1.yml.example +90 -0
  47. data/lib/kettle/jem/templates/.github/workflows/jruby-9.2.yml.example +95 -0
  48. data/lib/kettle/jem/templates/.github/workflows/jruby-9.3.yml.example +95 -0
  49. data/lib/kettle/jem/templates/.github/workflows/jruby-9.4.yml.example +95 -0
  50. data/lib/kettle/jem/templates/.github/workflows/jruby.yml.example +91 -0
  51. data/lib/kettle/jem/templates/.github/workflows/license-eye.yml.example +43 -0
  52. data/lib/kettle/jem/templates/.github/workflows/locked_deps.yml.example +89 -0
  53. data/lib/kettle/jem/templates/.github/workflows/opencollective.yml.example +44 -0
  54. data/lib/kettle/jem/templates/.github/workflows/ruby-2.3.yml.example +80 -0
  55. data/lib/kettle/jem/templates/.github/workflows/ruby-2.4.yml.example +84 -0
  56. data/lib/kettle/jem/templates/.github/workflows/ruby-2.5.yml.example +84 -0
  57. data/lib/kettle/jem/templates/.github/workflows/ruby-2.6.yml.example +84 -0
  58. data/lib/kettle/jem/templates/.github/workflows/ruby-2.7.yml.example +84 -0
  59. data/lib/kettle/jem/templates/.github/workflows/ruby-3.0.yml.example +85 -0
  60. data/lib/kettle/jem/templates/.github/workflows/ruby-3.1.yml.example +83 -0
  61. data/lib/kettle/jem/templates/.github/workflows/ruby-3.2.yml.example +80 -0
  62. data/lib/kettle/jem/templates/.github/workflows/ruby-3.3.yml.example +80 -0
  63. data/lib/kettle/jem/templates/.github/workflows/ruby-3.4.yml.example +80 -0
  64. data/lib/kettle/jem/templates/.github/workflows/style.yml.example +78 -0
  65. data/lib/kettle/jem/templates/.github/workflows/templating.yml.example +86 -0
  66. data/lib/kettle/jem/templates/.github/workflows/truffle.yml.example +91 -0
  67. data/lib/kettle/jem/templates/.github/workflows/truffleruby-22.3.yml.example +92 -0
  68. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.0.yml.example +92 -0
  69. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.1.yml.example +78 -0
  70. data/lib/kettle/jem/templates/.github/workflows/truffleruby-24.2.yml.example +91 -0
  71. data/lib/kettle/jem/templates/.github/workflows/truffleruby-25.0.yml.example +96 -0
  72. data/lib/kettle/jem/templates/.github/workflows/truffleruby-33.0.yml.example +91 -0
  73. data/lib/kettle/jem/templates/.github/workflows/unlocked_deps.yml.example +93 -0
  74. data/lib/kettle/jem/templates/.gitignore.example +53 -0
  75. data/lib/kettle/jem/templates/.gitlab-ci.yml.example +134 -0
  76. data/lib/kettle/jem/templates/.idea/.gitignore.example +44 -0
  77. data/lib/kettle/jem/templates/.licenserc.yaml.example +8 -0
  78. data/lib/kettle/jem/templates/.opencollective.yml.example +3 -0
  79. data/lib/kettle/jem/templates/.qlty/qlty.toml.example +79 -0
  80. data/lib/kettle/jem/templates/.rspec.example +10 -0
  81. data/lib/kettle/jem/templates/.rubocop.example +1 -0
  82. data/lib/kettle/jem/templates/.rubocop.yml.example +47 -0
  83. data/lib/kettle/jem/templates/.rubocop_rspec.yml.example +55 -0
  84. data/lib/kettle/jem/templates/.simplecov.example +18 -0
  85. data/lib/kettle/jem/templates/.structuredmerge/git-drivers.toml.example +86 -0
  86. data/lib/kettle/jem/templates/.structuredmerge/kettle-jem.yml.example +519 -0
  87. data/lib/kettle/jem/templates/.yard-lint.yml.example +54 -0
  88. data/lib/kettle/jem/templates/.yardignore.example +13 -0
  89. data/lib/kettle/jem/templates/.yardopts.example +14 -0
  90. data/lib/kettle/jem/templates/AGENTS.md.example +283 -0
  91. data/lib/kettle/jem/templates/AGPL-3.0-only.md.example +235 -0
  92. data/lib/kettle/jem/templates/Appraisal.root.gemfile.example +26 -0
  93. data/lib/kettle/jem/templates/Appraisals.example +150 -0
  94. data/lib/kettle/jem/templates/Big-Time-Public-License.md.example +99 -0
  95. data/lib/kettle/jem/templates/CHANGELOG.md.example +33 -0
  96. data/lib/kettle/jem/templates/CHANGELOG.transfer.md +109 -0
  97. data/lib/kettle/jem/templates/CITATION.cff.example +20 -0
  98. data/lib/kettle/jem/templates/CODE_OF_CONDUCT.md.example +134 -0
  99. data/lib/kettle/jem/templates/CONTRIBUTING.md.example +292 -0
  100. data/lib/kettle/jem/templates/FUNDING.md.example +74 -0
  101. data/lib/kettle/jem/templates/FUNDING.md.no-osc.example +63 -0
  102. data/lib/kettle/jem/templates/Gemfile.example +52 -0
  103. data/lib/kettle/jem/templates/IRP.md.example +34 -0
  104. data/lib/kettle/jem/templates/LICENSE.md.example +3 -0
  105. data/lib/kettle/jem/templates/MIT.md.example +21 -0
  106. data/lib/kettle/jem/templates/PolyForm-Noncommercial-1.0.0.md.example +131 -0
  107. data/lib/kettle/jem/templates/PolyForm-Small-Business-1.0.0.md.example +121 -0
  108. data/lib/kettle/jem/templates/README.md.example +544 -0
  109. data/lib/kettle/jem/templates/REEK +0 -0
  110. data/lib/kettle/jem/templates/RUBOCOP.md.example +78 -0
  111. data/lib/kettle/jem/templates/Rakefile.example +163 -0
  112. data/lib/kettle/jem/templates/SECURITY.md.example +21 -0
  113. data/lib/kettle/jem/templates/bin/setup.example +36 -0
  114. data/lib/kettle/jem/templates/certs/pboling.pem.example +27 -0
  115. data/lib/kettle/jem/templates/gem.gemspec.example +161 -0
  116. data/lib/kettle/jem/templates/gemfiles/modular/benchmark/r4/v0.5.gemfile.example +2 -0
  117. data/lib/kettle/jem/templates/gemfiles/modular/benchmark/vHEAD.gemfile.example +2 -0
  118. data/lib/kettle/jem/templates/gemfiles/modular/cgi/r4/v0.5.gemfile.example +1 -0
  119. data/lib/kettle/jem/templates/gemfiles/modular/cgi/vHEAD.gemfile.example +1 -0
  120. data/lib/kettle/jem/templates/gemfiles/modular/changelog.gemfile.example +6 -0
  121. data/lib/kettle/jem/templates/gemfiles/modular/coverage.gemfile.example +14 -0
  122. data/lib/kettle/jem/templates/gemfiles/modular/coverage_local.gemfile.example +34 -0
  123. data/lib/kettle/jem/templates/gemfiles/modular/debug.gemfile.example +22 -0
  124. data/lib/kettle/jem/templates/gemfiles/modular/documentation.gemfile.example +24 -0
  125. data/lib/kettle/jem/templates/gemfiles/modular/documentation_local.gemfile.example +20 -0
  126. data/lib/kettle/jem/templates/gemfiles/modular/erb/r2/v3.0.gemfile.example +1 -0
  127. data/lib/kettle/jem/templates/gemfiles/modular/erb/r2.3/default.gemfile.example +6 -0
  128. data/lib/kettle/jem/templates/gemfiles/modular/erb/r2.6/v2.2.gemfile.example +3 -0
  129. data/lib/kettle/jem/templates/gemfiles/modular/erb/r3/v5.0.gemfile.example +1 -0
  130. data/lib/kettle/jem/templates/gemfiles/modular/erb/r3.1/v4.0.gemfile.example +2 -0
  131. data/lib/kettle/jem/templates/gemfiles/modular/erb/r4/v5.0.gemfile.example +1 -0
  132. data/lib/kettle/jem/templates/gemfiles/modular/erb/vHEAD.gemfile.example +2 -0
  133. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_22_3.gemfile.example +6 -0
  134. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_23_0.gemfile.example +6 -0
  135. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_23_1.gemfile.example +6 -0
  136. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r2/v0.3.gemfile.example +2 -0
  137. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r2.4/v0.1.gemfile.example +3 -0
  138. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r3/v0.3.gemfile.example +2 -0
  139. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/r4/v0.3.gemfile.example +2 -0
  140. data/lib/kettle/jem/templates/gemfiles/modular/mutex_m/vHEAD.gemfile.example +2 -0
  141. data/lib/kettle/jem/templates/gemfiles/modular/optional.gemfile.example +16 -0
  142. data/lib/kettle/jem/templates/gemfiles/modular/recording/r2.3/recording.gemfile.example +16 -0
  143. data/lib/kettle/jem/templates/gemfiles/modular/recording/r2.4/recording.gemfile.example +18 -0
  144. data/lib/kettle/jem/templates/gemfiles/modular/recording/r2.5/recording.gemfile.example +16 -0
  145. data/lib/kettle/jem/templates/gemfiles/modular/recording/r3/recording.gemfile.example +16 -0
  146. data/lib/kettle/jem/templates/gemfiles/modular/recording/r4/recording.gemfile.example +16 -0
  147. data/lib/kettle/jem/templates/gemfiles/modular/recording/vHEAD.gemfile.example +2 -0
  148. data/lib/kettle/jem/templates/gemfiles/modular/rspec.gemfile.example +4 -0
  149. data/lib/kettle/jem/templates/gemfiles/modular/runtime_heads.gemfile.example +14 -0
  150. data/lib/kettle/jem/templates/gemfiles/modular/shunted.gemfile.example +21 -0
  151. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r2/v3.0.gemfile.example +5 -0
  152. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r2.4/v0.0.2.gemfile.example +4 -0
  153. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r3/v3.0.gemfile.example +5 -0
  154. data/lib/kettle/jem/templates/gemfiles/modular/stringio/r4/v3.0.gemfile.example +5 -0
  155. data/lib/kettle/jem/templates/gemfiles/modular/stringio/vHEAD.gemfile.example +2 -0
  156. data/lib/kettle/jem/templates/gemfiles/modular/style.gemfile.example +33 -0
  157. data/lib/kettle/jem/templates/gemfiles/modular/style_local.gemfile.example +26 -0
  158. data/lib/kettle/jem/templates/gemfiles/modular/templating.gemfile.example +34 -0
  159. data/lib/kettle/jem/templates/gemfiles/modular/templating_local.gemfile.example +73 -0
  160. data/lib/kettle/jem/templates/gemfiles/modular/webrick/r4/v1.9.gemfile.example +1 -0
  161. data/lib/kettle/jem/templates/gemfiles/modular/webrick/vHEAD.gemfile.example +1 -0
  162. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2/libs.gemfile.example +3 -0
  163. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2.3/libs.gemfile.example +3 -0
  164. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2.4/libs.gemfile.example +3 -0
  165. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r2.6/libs.gemfile.example +3 -0
  166. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r3/libs.gemfile.example +3 -0
  167. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r3.1/libs.gemfile.example +5 -0
  168. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r4/libs.gemfile.example +6 -0
  169. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/vHEAD.gemfile.example +6 -0
  170. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs.gemfile.example +12 -0
  171. data/lib/kettle/jem/templates/lib/gem/version.rb.example +1 -0
  172. data/lib/kettle/jem/templates/lib/gem/version_gem.rb.example +1 -0
  173. data/lib/kettle/jem/templates/mise.toml.example +25 -0
  174. data/lib/kettle/jem/templates/mise.toml.no-osc.example +25 -0
  175. data/lib/kettle/jem/templates/parsers.toml.example +19 -0
  176. data/lib/kettle/jem/templates/readme/partials/basic_usage.md.example +28 -0
  177. data/lib/kettle/jem/templates/readme/partials/configuration.md.example +112 -0
  178. data/lib/kettle/jem/templates/readme/partials/synopsis.md.example +3 -0
  179. data/lib/kettle/jem/templates/shim/.github/workflows/current.yml.example +40 -0
  180. data/lib/kettle/jem/templates/shim/.rspec.example +5 -0
  181. data/lib/kettle/jem/templates/shim/.structuredmerge/kettle-jem.yml.example +28 -0
  182. data/lib/kettle/jem/templates/shim/CHANGELOG.md.example +9 -0
  183. data/lib/kettle/jem/templates/shim/Gemfile.example +14 -0
  184. data/lib/kettle/jem/templates/shim/README.md.example +25 -0
  185. data/lib/kettle/jem/templates/shim/Rakefile.example +8 -0
  186. data/lib/kettle/jem/templates/shim/gem.gemspec.example +45 -0
  187. data/lib/kettle/jem/templates/shim/lib/compat_require.rb.example +3 -0
  188. data/lib/kettle/jem/templates/shim/lib/entrypoint.rb.example +3 -0
  189. data/lib/kettle/jem/templates/shim/lib/version.rb.example +1 -0
  190. data/lib/kettle/jem/templates/shim/spec/shim_spec.rb.example +15 -0
  191. data/lib/kettle/jem/templates/shim/spec/spec_helper.rb.example +23 -0
  192. data/lib/kettle/jem/templates/sig/gem.rbs.example +1 -0
  193. data/lib/kettle/jem/templates/spec/README.md.example +28 -0
  194. data/lib/kettle/jem/templates/spec/spec_helper.rb.example +39 -0
  195. data/lib/kettle/jem/version.rb +5 -3
  196. data/lib/kettle/jem/version_gem.rb +8 -0
  197. data/lib/kettle/jem.rb +18540 -1517
  198. data/lib/kettle-jem.rb +2 -1
  199. data/sig/kettle/jem.rbs +8 -0
  200. data.tar.gz.sig +0 -0
  201. metadata +870 -32
  202. metadata.gz.sig +0 -0
data/CHANGELOG.md ADDED
@@ -0,0 +1,1505 @@
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
+ ### Security
32
+
33
+ ## [7.1.3] - 2026-08-11
34
+
35
+ - TAG: [v7.1.3][7.1.3t]
36
+ - COVERAGE: 93.99% -- 10757/11445 lines in 15 files
37
+ - BRANCH COVERAGE: 77.39% -- 4605/5950 branches in 15 files
38
+ - 18.01% documented
39
+
40
+ ### Changed
41
+
42
+ - Generate README star-history embeds with the revived star-history.dera.page service.
43
+
44
+ - Generate the README Star History section only for GitHub repositories with at least 150 stars.
45
+
46
+ ### Fixed
47
+
48
+ - Handle comment-only YAML documents while pruning disabled engine workflow jobs.
49
+
50
+ - Remove disabled engine workflow badge references from generated README files.
51
+
52
+ - Gemspec templating now discards untouched Bundler allowed-push-host placeholders while preserving destination-specific metadata.
53
+
54
+ - Prepare profile synchronization now materializes newly added modular Gemfiles before Bundler bootstrapping.
55
+
56
+ - Generate modular changelog Gemfiles with the released kettle-changelog 1.x dependency floor.
57
+
58
+ - Synchronize monorepo subgem profiles with a template-owned Rakefile so legacy generated task blocks are replaced instead of duplicated.
59
+
60
+ - Preserve local Gemfile indentation when removing destination package entries from multiline word arrays.
61
+
62
+ - Add the generated frozen-string-literal comment to Ruby 3.1 extracted stdlib Gemfiles.
63
+
64
+ - Retain the MRI runtime floor when normalizing multi-engine README compatibility text.
65
+
66
+ - Include html-merge in generated StructuredMerge local dependency wiring.
67
+
68
+ ## [7.1.2] - 2026-08-10
69
+
70
+ - TAG: [v7.1.2][7.1.2t]
71
+ - COVERAGE: 93.86% -- 10679/11378 lines in 15 files
72
+ - BRANCH COVERAGE: 77.21% -- 4569/5918 branches in 15 files
73
+ - 18.04% documented
74
+
75
+ ### Added
76
+
77
+ - Template generated projects now receive kettle-changelog as a development dependency; kettle-changelog itself is excluded to avoid a self-dependency.
78
+
79
+ - Local templating dependency wiring now resolves the standalone kettle-changelog development tool alongside the Kettle development stack.
80
+
81
+ ### Changed
82
+
83
+ - Align generated compatibility workflows with the Ruby 4.0 runtime floor by excluding unsupported TruffleRuby targets
84
+
85
+ - Resolve kettle-changelog through a Ruby-compatible modular development Gemfile instead of every generated gemspec.
86
+
87
+ - Keep the standalone kettle-changelog tool in a Ruby-compatible modular Gemfile with explicit local-path wiring, rather than adding it to every generated gemspec.
88
+
89
+ - Allow kettle-jem to resolve kettle-dev 3.x while retaining compatibility with supported kettle-dev 2.x releases.
90
+
91
+ - Allow kettle-jem to update independently within the StructuredMerge 7.1 dependency series instead of requiring every sibling gem to share its patch version.
92
+
93
+ ### Fixed
94
+
95
+ - Preserve enabled engine workflow jobs when pruning disabled jobs from generated YAML
96
+
97
+ - Generate README compatibility prose from the configured Ruby engine set
98
+
99
+ - Honor disabled README integrations after destination content is merged
100
+
101
+ - Temporarily pin generated RuboCop Packaging style Gemfiles to the nested-project config-root fix.
102
+
103
+ - Keep scoped kettle-jem template runs from applying unselected post-template mutations.
104
+
105
+ - Preserve destination-only gemspec metadata when the template does not define that key.
106
+
107
+ - Keep aggregate standard-library Gemfile references available when Ruby-floor pruning would otherwise remove their targets, and generate Appraisal Gemfiles during full kettle-jem installs.
108
+
109
+ ## [7.1.1] - 2026-08-08
110
+
111
+ - TAG: [v7.1.1][7.1.1t]
112
+ - COVERAGE: 93.95% -- 10635/11320 lines in 15 files
113
+ - BRANCH COVERAGE: 77.25% -- 4549/5889 branches in 15 files
114
+ - 18.04% documented
115
+
116
+ ### Added
117
+
118
+ - Template NDJSON summaries now distinguish checksum write bypasses, planned
119
+ files left unchanged after rendering, and changed destination files.
120
+ - Source-template fingerprinting now uses an explicit renderer-semantics
121
+ version, so unrelated Kettle-Jem code changes do not invalidate every
122
+ destination checksum record.
123
+
124
+ - `kettle-jem-deps-floor` now keeps a 30-day persistent per-gem RubyGems
125
+ version cache and honors `kettle-release` cache-bust markers, so recently
126
+ released gems refresh while untouched dependency checks can survive transient
127
+ RubyGems API failures.
128
+ - Generated spec harness files now document the RSpec helpers made available by
129
+ `kettle-test`.
130
+ - Generated main Gemfiles now include `kettle-family`, except when templating
131
+ the `kettle-family` gem itself.
132
+ - Monorepo subproject Gemfiles now use the repository package path when
133
+ generating direct sibling local-path wiring, so truthy family workspace envs
134
+ resolve siblings from the member root instead of the repository root.
135
+ - Added `.structuredmerge/kettle-jem.lock` for template application state and
136
+ checksum-based template skipping, with `--checksums` modes and
137
+ `--ignore-checksums` as an alias for `--checksums=off`.
138
+ - Documented checksum skip modes and the per-destination `input_fingerprint`
139
+ used by template-based skipping.
140
+ - `kettle-jem` now uses the shared `kettle-ndjson` event toolkit for NDJSON
141
+ progress stream filtering, emission, recording, and phase timing.
142
+ - Added `KJ_GH_ORG` as a GitHub-specific repository-owner override for
143
+ scaffolded GitHub URLs, while keeping generic `FORGE_ORG` at highest
144
+ precedence so personal `KJ_GH_USER` maintainer settings do not seed org-owned
145
+ repos.
146
+ - Changelog replay now records a cursor in the managed `kettle-jem` config
147
+ state so first-time templated projects receive only an initial templating
148
+ changelog entry, while previously templated projects replay only missed
149
+ template-impacting entries.
150
+ - Curated Bundler binstub generation now includes `kettle-gha-pins` when it is
151
+ present in the destination bundle.
152
+ - Generated gemspec templates now include `anonymous_loader` as a development
153
+ dependency, and version spec normalization uses it to execute generated
154
+ `version.rb` files for coverage without redefining package constants.
155
+ - Added a transfer changelog query API so family tooling can report how many
156
+ template-impacting changelog replay entries a project has not yet applied.
157
+ - Generated documentation tooling now includes `yard-lint` and a
158
+ `.yard-lint.yml` config for kettle-dev's documentation lint task.
159
+ - RubyForum tags are now configurable through family/project kettle-jem config
160
+ and ENV, so templated gemspecs set `mailing_list_uri` and support docs point
161
+ to tagged RubyForum pages instead of GitHub Discussions.
162
+
163
+ - kettle-jem-template-20260727-001 - Spec harness documentation now lists the
164
+ RSpec helpers provided by `kettle-test`.
165
+
166
+ - Transfer changelog replay now supports destination applicability filters and filter-aware status reporting.
167
+
168
+ ### Changed
169
+
170
+ - Runtime dependency metadata now requires `kettle-ndjson` 0.1.3 or newer and
171
+ `kettle-rb` 0.1.7 or newer.
172
+ - Gemspec package manifest merging now normalizes legacy destination `Dir[...]`
173
+ globs into the generated package-helper shape, preventing duplicated
174
+ `spec.files` assignments after templating.
175
+ - Runtime dependency metadata now requires `kettle-gha-pins` 0.3.3 or newer.
176
+ - Generated main Gemfiles now require `kettle-family` 1.2.1 or newer, so
177
+ gem-root family commands use the reset helper that runs outside broken
178
+ member bundles.
179
+ - Generated main Gemfiles now require `nomono` 1.1.1 or newer.
180
+ - Generated Ruby workflow templates now use `appraisal-rb/setup-ruby-flash` for
181
+ Ruby setup, including the workflow summary improvements for resolved Ruby
182
+ versions and head-build revisions.
183
+ - Generated Ruby workflow templates now pin the setup-ruby-flash revision that
184
+ supports appraisal-only setup without installing the main Gemfile bundle.
185
+ - kettle-jem-template-20260728-001 - Generated Ruby workflows now use clearer
186
+ setup-ruby-flash planning and can prepare appraisal-only jobs without
187
+ installing the main Gemfile bundle.
188
+
189
+ - The `kettle-jem` executable startup header is now shown only when
190
+ `--verbose` is passed, while `version`, `-v`, and `--version` still print
191
+ just the executable version and exit.
192
+ - Transfer changelog replay now reads sectioned Markdown structurally and
193
+ applies transferred entries to the matching destination changelog section.
194
+ - Transfer changelog entries now use concise destination-project wording,
195
+ focusing on what maintainers see after templating.
196
+ - `kettle-jem-deps-floor --write` now commits its managed dependency floor
197
+ updates by default, with `--no-commit` available for callers that need the
198
+ previous uncommitted write behavior.
199
+ - `kettle-jem-deps-floor` now labels text reports with dry-run/write mode and
200
+ prints the exact `--write` hint when stale floors are found in dry-run mode.
201
+ - `kettle-jem-deps-floor --write` now stages dependency floor updates correctly
202
+ when `kettle-jem` is nested below a monorepo Git worktree root.
203
+ - `kettle-jem-workflow-pins` now labels text reports with dry-run/write mode
204
+ and prints the exact `--write` hint when stale workflow pins are found in
205
+ dry-run mode.
206
+ - `kettle-jem-workflow-pins --write` now commits managed workflow pin updates
207
+ by default, with `--no-commit` available for uncommitted writes.
208
+ - `kettle-jem-workflow-pins` now detects and updates stale version comments
209
+ when a pinned GitHub Action SHA is already current.
210
+ - Generated Kettle local Gemfiles now resolve `KETTLE_DEV_DEV=true` to the
211
+ `kettle-dev` workspace family root instead of sibling directories directly
212
+ under `~/src/my`.
213
+ - Runtime dependency metadata now requires `kettle-gha-pins` 0.3.1 or newer.
214
+ - `bin/kettle-jem-workflow-pins` now calls the shared `kettle-gha-pins` API
215
+ directly for cache, GitHub ref resolution, and upgrade planning instead of
216
+ shelling out to `kettle-gha-sha-pins`.
217
+ - Templating now reuses static, shareable regexes and small lookup lists in the
218
+ recipe dispatch and template-policy paths instead of reallocating them during
219
+ each recipe execution.
220
+ - Opt-in recipe-planning Ractor mode now batches worker-safe recipes across a
221
+ bounded chunked worker pool instead of spawning one Ractor per recipe, and it
222
+ keeps parser/merge paths with known unshareable dependency state on the main
223
+ Ractor.
224
+ - Templating can now opt into thread-backed recipe planning and file work with
225
+ `KETTLE_JEM_THREAD_WORKERS` and `KETTLE_JEM_THREAD_FILE_WORKERS`, providing a
226
+ benchmarkable alternative to main-thread and Ractor execution.
227
+ - Templating now supports benchmark-oriented skip controls for external
228
+ post-template work: `--skip-drift-check`, `--skip-rubocop-gradual`, and
229
+ `--skip-binstubs`, with matching `KETTLE_JEM_SKIP_*` environment variables.
230
+ - Templating reports now persist phase duration metadata, install command steps
231
+ record elapsed duration, and benchmark summaries show recipe-phase time apart
232
+ from external command time.
233
+ - The benchmark harness now supports `KETTLE_JEM_BENCHMARK_MODE=raw-template`
234
+ to compare scoped raw `TemplateTask` runs separately from the default
235
+ install-orchestrated one-shot template flow.
236
+ - The benchmark harness now defaults worker counts to `1,min(4,n/2),min(8,n/2),n`
237
+ instead of only `min(2,n)`, giving higher-core machines a useful default
238
+ scaling matrix while keeping low-core hosts bounded.
239
+ - Benchmark summaries now show each variant's median percentage delta against
240
+ `baseline-main` immediately after the variant name.
241
+ - README recipe reports now include sub-step timing metadata, and benchmark
242
+ results summarize the baseline README timing breakdown.
243
+
244
+ - Generated gemspec templates now require `kettle-dev` >= 2.5.10 and declare
245
+ `kettle-dev` literally so dependency floor automation can keep it current.
246
+ - Generated `.rspec` files now exclude `spec/tmp/**/*_spec.rb` so temporary
247
+ fixture projects do not get discovered during member-level spec runs.
248
+ - kettle-jem now requires `kettle-rb` >= 0.1.4.
249
+ - Refreshed generated GitHub Actions workflow pins for `ruby/setup-ruby` and
250
+ CodeQL actions.
251
+ - Gemfile and Appraisals template merge adapter failures now fail closed instead
252
+ of silently accepting template content.
253
+ - Generated pull request engine workflows now keep JRuby and TruffleRuby
254
+ coverage available via branch opt-in prefixes: `jruby/*` runs JRuby
255
+ workflows, `truffleruby/*` runs TruffleRuby workflows, and `engines/*` runs
256
+ all engine workflows. Other pull request branches continue to run MRI checks
257
+ without the alternate engine jobs.
258
+ - Generated CONTRIBUTING docs now explain the `jruby/*`, `truffleruby/*`, and
259
+ `engines/*` branch prefixes that opt pull requests into alternate Ruby engine
260
+ workflows.
261
+ - Generated workflow templates now evaluate skip-CI commit messages only for
262
+ push events, and mixed head/dependency-head templates gate JRuby and
263
+ TruffleRuby jobs before runner provisioning on pull requests.
264
+ - Generated standalone JRuby and TruffleRuby workflow templates now group their
265
+ push skip checks before their pull request branch guards so ordinary pull
266
+ request branches do not run alternate engine jobs.
267
+ - Template apply now restores executable bits on generated Git hook scripts.
268
+ - `require "kettle/jem"` now defers parser-backed template runtime dependencies
269
+ until template execution so Rake task installation does not load
270
+ `tree_sitter_language_pack` before RuboCop loads `parser`.
271
+ - `require "kettle/jem"` no longer directly loads `version_gem` by default;
272
+ require `kettle/jem/version_gem` for the optional `VersionGem::Basic`
273
+ extension.
274
+ - Ruby, engine, Rails, RuboCop, and RuboCop LTS compatibility choices now come
275
+ from `Kettle::Rb::CompatMatrix` in `kettle-rb`.
276
+ - Generated `mise.toml` files no longer export `RUBOCOP_LTS_LOCAL=false`;
277
+ local RuboCop-LTS mode is now controlled by setting the variable only when a
278
+ local checkout should be used.
279
+ - Generated style Gemfiles now require `rubocop-lts-rspec` >= 1.0.4.
280
+ - kettle-jem now declares and loads the direct `rbs` runtime dependency used
281
+ by its RBS signature cleanup logic.
282
+ - Version-gem bootstrapping now preserves projects that load `version_gem`
283
+ through a dedicated `lib/<entrypoint>/version_gem.rb` file instead of forcing
284
+ it back into the default entrypoint.
285
+ - Version-gem bootstrapping now updates existing generated version specs to
286
+ require a dedicated `lib/<entrypoint>/version_gem.rb` entrypoint when present.
287
+ - Gem templates and generated root Gemfiles now require `kettle-dev` >= 2.3.5.
288
+ - Gem templates and generated root Gemfiles now require `kettle-test` >= 2.0.11.
289
+ - Gem templates and generated root Gemfiles now require `turbo_tests2` >= 3.1.14.
290
+ - Generated gemspecs and optional Gemfiles now require `stone_checksums` >= 1.0.6.
291
+ - Shim gemspec templates now include `LICENSE.md`, matching the generated
292
+ license template filename, instead of the nonexistent `LICENSE.txt`.
293
+ - Monorepo subgem package templating now includes the main `Gemfile` so existing
294
+ generated gems receive the `nomono` bootstrap required by local modular
295
+ Gemfiles during templating-mode CI.
296
+ - Templating now applies transferable kettle-jem changelog entries to destination
297
+ `CHANGELOG.md` files using stable `kettle-jem-template-YYYYMMDD-NNN` IDs.
298
+ - Generated gemspecs now support explicit extra package-file globs via
299
+ `gemspec.package_files.include` in `.structuredmerge/kettle-jem.yml`.
300
+ - Version-gem templates now generate one package-level RBS file at
301
+ `sig/<entrypoint>.rbs` and migrate legacy nested
302
+ `sig/<entrypoint>/version.rbs` files into it.
303
+ - Generated gemspec package manifests now omit repository-only governance docs,
304
+ signing certs, recursive signature directories, split license files, and
305
+ `spec.extra_rdoc_files` by default.
306
+ - Generated templates now require the released floors for `kettle-dev` 2.3.0,
307
+ `kettle-drift` 1.0.5, `kettle-test` 2.0.9, `nomono` 1.0.8, and
308
+ `token-resolver` 2.0.4.
309
+ - Generated gemspecs now require `appraisal2` >= 3.1.4.
310
+ - Generated style Gemfiles now require `appraisal2-rubocop` >= 1.0.0.
311
+
312
+ - Generated optional Gemfiles no longer duplicate the gemspec's direct
313
+ `stone_checksums` development dependency.
314
+
315
+ - Quiet templating orchestration now passes quiet flags and debug-suppressing
316
+ environment to Bundler commands.
317
+ - Generated Appraisal guidance now defaults to `bin/rake appraisal:generate`,
318
+ reserving `appraisal:update` for intentional lock refreshes.
319
+ - Gemspec templating now raises preserved `rspec-stubbed_env` dependencies to
320
+ `>= 1.0.6`.
321
+ - Generated documentation Gemfiles now require `yard-fence` >= 0.9.6,
322
+ `yard-timekeeper` >= 0.2.3, and `yard-yaml` >= 0.2.3.
323
+ - kettle-jem now requires `kettle-rb` >= 0.1.2.
324
+
325
+ - kettle-jem-template-20260716-002 - Gemspecs now ship fewer repository-only
326
+ files, reducing package noise for downstream packagers.
327
+
328
+ - kettle-jem-template-20260720-002 - Development Gemfiles now use the released
329
+ `tree_sitter_language_pack` gem 1.13.3 or newer by default.
330
+ - kettle-jem-template-20260720-003 - StructuredMerge Git diff driver config now
331
+ uses the installed `smorg-rb` driver command.
332
+ - kettle-jem-template-20260720-005 - README Support & Community links now
333
+ include RubyForum.
334
+
335
+ - kettle-jem-template-20260725-001 - Release pull request branches beginning
336
+ with `feature/release` now run JRuby and TruffleRuby workflows.
337
+ - kettle-jem-template-20260725-002 - Version specs now use `anonymous_loader` to
338
+ cover `version.rb` without redefining constants, or are removed when version
339
+ specs are not managed for the project.
340
+
341
+ - Recognize legacy git ls-files spec.files pipelines when merging gemspec templates.
342
+
343
+ - Replace legacy byebug-named Gemfile dependencies with debug during templating.
344
+
345
+ - Generated README gem dashboard links now use ClickGems instead of BestGems.
346
+
347
+ - Clarify that transferable changelog entries are destination release notes, not internal template metadata.
348
+
349
+ - kettle-jem-template-20260801-001 - Generated README gem dashboard links now
350
+ use ClickGems instead of BestGems.
351
+
352
+ - Bootstrap direct-versus-modular dependency conflicts into a reviewable dependency_conflicts.resolve list, including keep_both for compatible overlapping ranges.
353
+
354
+ - Scope direct-versus-modular conflict discovery to active top-level fragments and x_std_libs; framework appraisal matrix files remain under appraisal resolution.
355
+
356
+ - Record explicit modular dependency removals and compatible keep_both decisions so repeated templating remains deterministic.
357
+
358
+ ### Fixed
359
+
360
+ - Templating now removes the obsolete `tree_sitter_language_pack` entry from
361
+ managed StructuredMerge local-gem lists, keeping `STRUCTUREDMERGE_DEV` from
362
+ resolving it under the sibling gems directory.
363
+ - Unset optional author ORCIDs now resolve to an empty citation value rather
364
+ than leaking their template token and aborting templating.
365
+ - Gemspec package manifest merging now recognizes the historical generated
366
+ `Dir[...] + [...]` shape structurally, retains legitimate destination globs,
367
+ and removes only obsolete generated `certs` and `sig` package helpers.
368
+
369
+ - Prepare every modular Gemfile referenced by the generated Gemfile before Bundler bootstraps templating dependencies.
370
+
371
+ - Preserve an existing main Gemfile source while applying templates.
372
+
373
+ - Use bundle install when a legacy lockfile lacks the required templating bootstrap gems.
374
+
375
+ - Respect per-file Ruby merge settings when applying templates.
376
+
377
+ - Canonicalize legacy release headings before replaying transfer changelog entries.
378
+
379
+ - Generated CI workflows now retry compatibility dependency installation while newly published runtime floors propagate through gem sources.
380
+
381
+ - Template merges now normalize managed RSpec block bindings structurally, preventing invalid mixed parameter names.
382
+
383
+ - Template runtime and config synchronization now normalize invalid underscore hostnames in generated documentation and gemspec metadata.
384
+
385
+ - Generated organization README logos now use GitHub's stable avatar endpoint when no Galtzo-hosted asset is guaranteed.
386
+
387
+ - Preserve flat Ruby entrypoints and avoid duplicating equivalent version requires during template bootstrap.
388
+
389
+ - Honor explicit VersionGem disablement and default supported Ruby gems to VersionGem during templating.
390
+
391
+ - Prune stale template lock records after managed files are removed.
392
+
393
+ - Avoid recursive project fact discovery while evaluating transfer changelog filters during templating.
394
+
395
+ - Templating now removes duplicated legacy configuration comments and repeated generated SimpleCov usage guidance from destinations.
396
+
397
+ - Generated RubyGems download badges now use Shields.io total downloads instead of the discontinued download-rank endpoint.
398
+
399
+ - Generated documentation Gemfiles now correctly document that `yard-lint`
400
+ 1.10 requires Ruby 3.3 or newer; projects testing older Rubies must keep
401
+ documentation tooling out of those targeted appraisals.
402
+
403
+ - Main Gemfile templating now removes stale direct `tree_sitter_language_pack`
404
+ declarations when the current templates own that dependency through the
405
+ modular templating Gemfile, preventing duplicate Bundler requirements during
406
+ re-templating.
407
+ - Kettle config templating now resolves known template tokens retained in
408
+ destination YAML values before the unresolved-token guard runs, while still
409
+ failing unknown token leaks.
410
+ - Git preflight now honors `KETTLE_JEM_GIT_LOCK` /
411
+ `KETTLE_JEM_GIT_COMMIT_LOCK`, preventing `.git/index.lock` races when
412
+ family-level monorepo templating runs many members concurrently.
413
+ - Old-Ruby version spec normalization now removes the managed VersionGem shared
414
+ example when the destination cannot depend on VersionGem.
415
+ - Generated gemspec package file enumeration now honors the destination Ruby
416
+ floor, so old-Ruby and JRuby workflows can parse gemspecs during Bundler
417
+ install while modern gems keep modern helper code.
418
+ - kettle-jem-template-20260729-002 - VersionGem bootstrap now preserves
419
+ and templates dedicated `version_gem.rb` entrypoints even when the gemspec
420
+ dependency is intentionally omitted, and generated anonymous-loader specs
421
+ cover both `version.rb` and `version_gem.rb`.
422
+ - `kettle-jem prepare` now skips release lockfile reset while local path
423
+ development env is active, so self-templating unreleased template stacks does
424
+ not fail release validation before templating can run.
425
+ - `kettle-jem prepare` now keeps templating enabled for bootstrap bundle
426
+ commands while local path development env is active.
427
+ - `kettle-jem install` setup commands now also preserve templating when local
428
+ path development env is active.
429
+ - `kettle-jem install` now skips release-style bundle lock normalization while
430
+ local path development env is active, so unreleased monorepo siblings are not
431
+ resolved as registry gems during self-templating.
432
+ - Generated local templating gemfiles now activate the lockfile's `nomono`
433
+ version before requiring `nomono/bundler`, avoiding early activation conflicts
434
+ when a newer `nomono` is installed locally.
435
+ - Generated local templating gemfiles now keep the `kettle-dev` local override
436
+ available even when it is already declared transitively by local `kettle-jem`.
437
+ - Generated dep-heads workflows now run TruffleRuby jobs with current RubyGems
438
+ and Bundler, avoiding setup failures before the test suite starts.
439
+ - `kettle-jem-workflow-pins --write` now refreshes GitHub Actions release
440
+ metadata instead of trusting a fresh persistent cache entry, so newly
441
+ published action releases are detected immediately.
442
+ - `kettle-jem-workflow-pins` no longer downgrades an existing version comment
443
+ such as `# v2.0` to an equivalent but less specific evergreen tag like
444
+ `# v2`.
445
+ - kettle-jem-template-20260728-002 - Generated RuboCop configs now ignore the
446
+ same `gemfiles/vendor/bundle` tree as `.gitignore`, so vendored dependency
447
+ installs are not reported as project lint debt.
448
+ - Existing generated `spec/spec_helper.rb` files now receive the
449
+ `kettle-test` helper documentation comment when structural merge preserves
450
+ their existing `require "kettle/test/rspec"` line.
451
+ - Version spec normalization now removes managed version specs when
452
+ `version_gem` is disabled or incompatible with the project's runtime Ruby
453
+ floor.
454
+ - Templating plan reports now include per-recipe duration metadata, template
455
+ planning deduplicates destination and template-source file reads, and runtime
456
+ loading is reduced to explicit main-Ractor extension points. A disabled
457
+ classified planning strategy now identifies worker-safe recipes, can opt into
458
+ experimental Ractor workers with `KETTLE_JEM_RACTOR_WORKERS`, records
459
+ execution counters, and preserves sequential report parity in preparation for
460
+ Ractor-based recipe planning.
461
+ - Added a `benchmarks/` harness that templates a reset Bundler gem skeleton and
462
+ compares classified planning and phase-gated file work with and without
463
+ opt-in Ractor workers. The harness now defaults `KJ_MIN_RUBY` to `1.8.7` so
464
+ benchmark runs exercise legacy workflow and gemfile generation through the
465
+ supported one-shot `template --accept-config` flow, prints progress while
466
+ long benchmark matrices run, records planning and file-worker execution
467
+ counters for both Ractors and threads, and records the latest benchmark
468
+ outcome in a committed results README.
469
+ - Apply now routes recipe report mutations through explicit write intents and
470
+ phase-gated per-file work units, preparing the file-processing path for
471
+ opt-in `KETTLE_JEM_RACTOR_FILE_WORKERS` execution without changing phase gates
472
+ or final filesystem outcomes.
473
+ - The former monolithic thin-slice spec has been split into behavior-named
474
+ integration, system, and end-to-end specs so the project test harness can
475
+ parallelize templating coverage more effectively.
476
+ - Generated README Support & Community rows now include a RubyForum help badge.
477
+ - Generated READMEs can now render template-managed corporate sponsor logos
478
+ from `readme.corporate_sponsors` config or family-provided sponsorship data.
479
+ - `kettle-jem` now supports `--events` for newline-delimited JSON progress
480
+ events, including named event type filters via comma-separated
481
+ `--events=TYPE,...` values, phase events, per-recipe template progress,
482
+ post-apply and command-step events, diagnostics, and summary events for family
483
+ orchestration consumers.
484
+ - Generated CI workflow templates now cache `.rspec_status` with explicit
485
+ per-workflow keys so `kettle-test` / `turbo_tests2` can reuse timing data
486
+ across MRI, JRuby, TruffleRuby, coverage, heads, dep-heads, and framework
487
+ matrix runs.
488
+ - Generated JRuby and TruffleRuby workflow templates now run when pull request
489
+ head branches start with `feature/release`, so `kettle-release` CI monitoring
490
+ does not treat intentionally skipped engine workflows as release failures.
491
+ - Generated dep-heads workflows now document why every engine job runs directly
492
+ from `gemfiles/dep_heads.gemfile`, making that generated Appraisal file
493
+ required checked-in output for the workflow.
494
+ - JRuby 9.2 workflow templates now use the legacy-engine bundle install path
495
+ instead of `ruby/setup-ruby` bundler caching so old Bundler does not fail
496
+ setup against gem servers without the full legacy index.
497
+ - Gemspec templating now structurally merges destination `spec.files`
498
+ collection entries with template package entries so project-specific
499
+ packaged files are not lost when the template rewrites the generated gemspec
500
+ structure.
501
+ - Main Gemfile templating now removes repeated direct sibling execution blocks
502
+ left behind by older `nomono` bootstrap output when applying the simplified
503
+ `require "nomono/bundler"` loader.
504
+ - Gemspec templating now restores additional legacy Prism policy behavior for
505
+ destination-only metadata fields, Bundler `git ls-files` package declarations,
506
+ and empty development-dependency section cleanup after runtime dependency
507
+ promotion.
508
+ - Added the repo-local `bin/kettle-jem-workflow-pins` maintenance script to
509
+ update the GitHub Actions SHA pin index used by generated workflow templates
510
+ via `kettle-gha-sha-pins`.
511
+ - Generated local Gemfile templates now use a simple `require "nomono/bundler"`
512
+ loader, with a provider-relative loader for `nomono` itself, instead of
513
+ emitting runtime lockfile parsing or explicit gem activation ceremony.
514
+ - Generated root Gemfiles now declare `nomono` with a plain dependency line
515
+ requiring `nomono` 1.1.0 or newer, and retemplating removes the older
516
+ `nomono_requirements` helper block.
517
+ - Added the repo-local `bin/kettle-jem-deps-floor` maintenance script to scan
518
+ dependency-bearing kettle-jem templates and update their dependency floors.
519
+ - `kettle-jem install` now generates a curated `bin/appraisal` binstub for the
520
+ `appraisal2` executable.
521
+ - Added a default-off `readme.badges.fossa` template option for managed FOSSA
522
+ README badges.
523
+ - Added explicit `ruby.test_minimum` template configuration, defaulting to
524
+ Ruby 2.4, for generated CI workflow and Appraisal floors.
525
+ - Added top-level `integrations` configuration for disabling coverage
526
+ integrations (`codecov`, `coveralls`, `qlty`) and the SkyWalking Eyes license
527
+ check integration across README badges, upload/check workflow steps, packaged
528
+ config/workflow templates, and cleanup of existing config files or workflows.
529
+ - kettle-jem's own `mise` environment now enables templating dependencies so
530
+ templating-only floors are validated in the normal gem bundle.
531
+ - Restored `kettle-jem prepare` as a pre-flight dependency bootstrap mode for
532
+ applying the minimal templating Gemfile payload before full templating.
533
+ - Gem templates and generated root Gemfiles now require `kettle-dev` >= 2.2.24.
534
+ - Version-gem bootstrapping now removes stale top-level RBS `VERSION`
535
+ declarations and generated style workflows load the RBS environment so
536
+ duplicate declarations fail in CI.
537
+ - Version-gem bootstrapping now removes literal `bundle gem` scaffold RBS
538
+ `VERSION` declarations before writing the managed `version.rbs` signature.
539
+ - Added a destructive `shim` template profile for compatibility wrapper gems.
540
+ Shim templating accepts the replacement gem via `--shimmed-gem` or
541
+ `KETTLE_JEM_SHIMMED_GEM`, generates only the shim runtime/docs/specs/CI, and
542
+ deletes obsolete implementation code, behavior specs, workflows, and gemfiles.
543
+
544
+ - kettle-jem-template-20260726-001 - Projects now include an optional
545
+ `yard:lint` task and YARD lint configuration for documentation quality checks.
546
+
547
+ - Generated coverage workflows now treat Coveralls, QLTY, and Codecov uploads
548
+ as optional so third-party coverage outages do not fail CI while the internal
549
+ coverage threshold check remains authoritative.
550
+ - Generated version files now document their version namespace and constants,
551
+ reducing warning-only `yard-lint` output in templated gems.
552
+ - Existing managed checksum state is now migrated out of the user-managed
553
+ kettle-jem config and into `.structuredmerge/kettle-jem.lock` automatically.
554
+ - Legacy root `.kettle-jem.lock` files are now moved to
555
+ `.structuredmerge/kettle-jem.lock` automatically.
556
+ - Changelog transfer replay now reads migrated `.structuredmerge/kettle-jem.lock`
557
+ state, so projects do not fall back to first-template changelog behavior after
558
+ checksum-state migration.
559
+ - Template checksum fingerprints now hash template token values without writing
560
+ those values into `.structuredmerge/kettle-jem.lock`.
561
+ - Generated `.yard-lint.yml` files now use yard-lint's current schema for
562
+ severity gating and tag ordering, so documentation lint can boot before docs
563
+ are regenerated.
564
+ - The packaged transfer changelog is now actually grouped by changelog section,
565
+ while replay still treats entries as a key-sorted stack for cursor tracking.
566
+ - Changelog replay now corrects stale transfer entries already present in
567
+ released changelog sections by stable transfer ID, preserving release metadata
568
+ and project-authored entries.
569
+ - Monorepo templating now serializes local Git driver configuration with the
570
+ shared family Git operation lock and retries transient Git lock conflicts,
571
+ preventing parallel `git config --local` workers from racing on `.git/config`.
572
+ - Changelog replay now cross-checks stored replay cursors against the
573
+ destination changelog contents, so legacy templated projects whose cursor was
574
+ stamped before transfer entries landed receive the missing transfer entries
575
+ on the next template run.
576
+
577
+ - Raised the `kettle-ndjson` runtime dependency floor to v0.1.1 so template
578
+ tooling can install it on the Ruby 2.4+ Kettle support floor.
579
+
580
+ - The `kettle-jem` executable now uses normal `require` loading and suppresses
581
+ its startup header for `--json` / `--events` machine-readable output.
582
+ - Generated MRI 2.4 through 2.7 workflows now bypass `ruby/setup-ruby`
583
+ Bundler caching and run an explicit bundle install, avoiding `bundle lock`
584
+ failures against gem.coop's missing legacy specs index.
585
+ - Generated legacy-engine workflows now configure Bundler to mirror gem.coop to
586
+ RubyGems.org during explicit CI installs, avoiding old Bundler full-index
587
+ requests that gem.coop does not support.
588
+ - Main Gemfile templating now removes duplicate `eval_gemfile` declarations
589
+ for the same modular dependency file, avoiding duplicate Bundler dependency
590
+ warnings after repeated templating.
591
+ - Generated templating workflows now update the root `nomono` bootstrap
592
+ dependency before enabling `K_JEM_TEMPLATING`, so cold CI runners can install
593
+ `nomono` before local templating gemfiles require its Bundler DSL.
594
+ - Local Gemfile templating now removes obsolete nomono activation ceremony from
595
+ existing destination files while retaining the simple
596
+ `require "nomono/bundler"` loader.
597
+ - Bootstrap commit execution now honors `KETTLE_JEM_GIT_COMMIT_LOCK` by locking
598
+ around the dirty recheck, `git add`, and `git commit` sequence for monorepo
599
+ family templating.
600
+ - Generated license summaries now link split license detail files to the
601
+ repository `blob/main` copy instead of packaging-relative files that are
602
+ intentionally excluded from gem manifests.
603
+ - Generated root Gemfiles no longer duplicate the
604
+ `tree_sitter_language_pack` declaration that belongs to the templating
605
+ modular Gemfile.
606
+ - Generated README source badges now use GitHub's canonical capitalization.
607
+ - Generated nomono local Gemfiles now use the normal `require "nomono/bundler"`
608
+ loader instead of a nomono-specific `require_relative` path.
609
+ - Install orchestration now bundles each distinct Bundler environment it will
610
+ execute under, and probes RuboCop Gradual tasks with the same environment used
611
+ for the eventual command.
612
+ - Bundler child commands now strip inherited command-line Git configuration, so
613
+ parent `safe.bareRepository=explicit` settings do not break Bundler Git source
614
+ caches during templating.
615
+ - Generated semantic diff Git driver configuration now consistently uses the
616
+ installed `smorg-rb` executable and Git diff driver name for Ruby diffs.
617
+ - Generated multi-engine workflow files, including `heads.yml` and
618
+ `dep-heads.yml`, now omit JRuby and TruffleRuby jobs when the project config
619
+ declares an MRI-only `engines` list.
620
+ - `kettle-jem`'s generated development Gemfiles now depend on released
621
+ `tree_sitter_language_pack` 1.13.2 or newer by default, while still
622
+ allowing templating runs to switch to a local source with
623
+ `VENDORED_GEMS=tree_sitter_language_pack` / `VENDOR_GEM_DIR`.
624
+ - Gemspec templating now deletes empty generated development-dependency comment
625
+ sections through Prism-backed CRISPR structural edits, preventing blank-line
626
+ churn before the closing `Gem::Specification` `end`.
627
+ - Fixed the `kettle-jem` package manifest so runtime template assets are
628
+ included even when the gemspec is loaded from the monorepo root.
629
+ - Generated local templating Gemfiles can now route
630
+ `tree_sitter_language_pack` through nomono's `VENDORED_GEMS` /
631
+ `VENDOR_GEM_DIR` support instead of using a one-off inferred local path.
632
+
633
+ - Templating setup now respects explicit `STRUCTUREDMERGE_DEV=false` and
634
+ `KETTLE_DEV_DEV=false` values when reading the kettle-family local install
635
+ marker, preventing prepare-mode bundle updates from re-enabling stale local
636
+ Gemfile wiring.
637
+ - Generated root Gemfiles no longer add a separate `gem "nomono"` bootstrap
638
+ line when templating the `nomono` gem itself, avoiding duplicate dependency
639
+ declarations against the package gemspec.
640
+ - `kettle-jem prepare` no longer explicitly asks Bundler to update parser gems
641
+ before they exist in a member lockfile, allowing cold-start templating
642
+ bootstraps to introduce vendored parser path dependencies during
643
+ `bundle install`.
644
+ - Workflow template pin maintenance now compares and updates complete pinned
645
+ action strings in source files, so `bin/kettle-jem-workflow-pins --check`
646
+ fails when template files drift from `github_actions_step_pins` even if the
647
+ action name is already covered by the pin index.
648
+ - kettle-jem's own gemspec now includes public signing certs in packaged files.
649
+ - Generated CI workflow synchronization now emits valid YAML for matrix and
650
+ setup-ruby sections instead of misindenting multi-line template fragments.
651
+ - Open Collective badge/funding detection now respects disabled funding policy
652
+ without falling back to the default organization.
653
+ - Version-gem RBS consolidation now migrates all legacy nested
654
+ `sig/<entrypoint>/**/*.rbs` content into the package-level signature and
655
+ removes the nested files, including when the package-level signature is
656
+ managed by a template entry.
657
+ - Generated dep-heads workflows now run every engine job directly from the
658
+ generated `gemfiles/dep_heads.gemfile`, avoiding `Appraisal.root.gemfile`
659
+ bootstrap failures with RubyGems/Bundler and gem.coop before the dep-heads
660
+ appraisal is selected.
661
+ - Packaged Rakefile templating now merges destination Rakefiles by default
662
+ instead of replacing them wholesale, preserving project-specific rake tasks
663
+ such as release or adapter test helpers.
664
+ - Version-gem namespace discovery no longer treats nested implementation
665
+ namespaces in the public entrypoint, such as `Kettle::Dev::Tasks`, as the gem
666
+ namespace when the existing version namespace is more specific.
667
+ - Gemfile and gemspec templating byte-offset rewrites now splice source with
668
+ byte-aware slicing so non-ASCII content before an edited AST node does not
669
+ corrupt generated Ruby.
670
+ - Generated legacy-engine CI workflows now install Bundler gems under
671
+ `${RUNNER_TEMP}/bundle` instead of `vendor/bundle`, preventing Appraisal
672
+ installs from creating nested `gemfiles/vendor` bundles.
673
+ - Generated RuboCop configs now exclude `**/vendor/**/*` so nested vendored
674
+ dependency trees are not linted.
675
+
676
+ - Fixed `bin/kettle-jem-workflow-pins` so its default project root resolves to
677
+ the kettle-jem gem root relative to the script instead of the caller's working
678
+ directory.
679
+ - Generated GitHub Actions workflows now preserve existing push branch filters
680
+ from destination workflows.
681
+ - GitHub Actions workflow templating now preserves existing destination SHA
682
+ pins for the same action/version when accepted templates are stale, and emits
683
+ a final warning telling maintainers to update the workflow template pins.
684
+ - SimpleCov templating now removes legacy kettle-soup-cover startup requires
685
+ from `.simplecov` and upgrades modifier-form `spec_helper` coverage bootstraps
686
+ to the full kettle-soup-cover `SimpleCov.start` block.
687
+ - Root Gemfile templating now keeps `nomono_requirements` before existing
688
+ `gem "nomono", *nomono_requirements` calls when merging legacy local sibling
689
+ wiring.
690
+ - Root Gemfile templating no longer adds generic direct-sibling path wiring for
691
+ runtime dependencies already handled by project-specific local modular
692
+ Gemfiles.
693
+ - Root Gemfile templating now evaluates the paired modular Gemfile for direct
694
+ runtime dependencies handled by `*_local.gemfile` overrides, preserving
695
+ released-vs-local switching after `accept_template` Gemfile rewrites.
696
+ - Root Gemfile templating now recognizes `eval_nomono_gems(gems: local_gems)`
697
+ declarations in `*_local.gemfile` files before deciding whether a runtime
698
+ dependency is already handled by paired modular local wiring.
699
+ - Local GitHub remotes now override generated gemspec `source_code_uri` tag URLs
700
+ when deriving repository owner tokens, preventing stale homepage metadata from
701
+ corrupting README logos and local sibling workspace env names.
702
+ - Bootstrap configs now seed runtime URI values, OpenCollective ENV overrides,
703
+ and Gemfile template ownership so first-time full templating does not leave
704
+ raw URI tokens or merge legacy Gemfile dependency sets into the generated
705
+ bundle.
706
+ - Generated Gemfiles now activate the Bundler-locked `nomono` before loading
707
+ `nomono/bundler`, avoiding global gem activation conflicts during
708
+ templating.
709
+ - Generated Gemfiles now scope templating-only direct sibling local-path
710
+ environment overrides to the direct dependency block so later modular
711
+ Gemfiles do not accidentally enter local sibling mode.
712
+ - Generated style Gemfiles now skip released RuboCop-LTS gems that were already
713
+ declared by earlier Gemfile evaluation, avoiding duplicate path/version
714
+ declarations during templating.
715
+ - Generated documentation local Gemfiles now skip the current package and
716
+ already declared gems before adding local family path overrides.
717
+ - Gem templates now require `appraisal2` >= 3.1.3.
718
+ - Generated style Gemfiles now require `appraisal2-rubocop` >= 0.2.2.
719
+ - Generated main Gemfiles now require `nomono` >= 1.0.6.
720
+ - Generated templating local Gemfiles now only use `TSLP_DEV` for local
721
+ `tree_sitter_language_pack` path overrides and no longer derive that path
722
+ from `STRUCTUREDMERGE_DEV`.
723
+ - Generated gemspecs now require `version_gem` >= 1.1.14.
724
+ - Generated gemspecs now require `gitmoji-regex` >= 2.0.4.
725
+ - Generated documentation Gemfiles now require `yaml-converter` >= 0.2.3.
726
+ - Generated documentation Gemfiles now require `yard-fence` >= 0.9.5.
727
+ - Generated documentation Gemfiles now require `yard-timekeeper` >= 0.2.2.
728
+ - Generated documentation Gemfiles now require `yard-yaml` >= 0.2.2.
729
+ - Gemfile, gemspec, Appraisal, and Rakefile template merging now derives Ruby
730
+ call source ranges and static string values from Prism nodes so heredoc
731
+ string arguments are preserved transparently.
732
+ - Gemspec dependency preservation now rewrites project-version constant
733
+ interpolation in dependency requirements to `spec.version` so preserved
734
+ dependencies remain loadable after anonymous-module version loading.
735
+ - Removed retired funding links and template tokens from generated kettle-jem
736
+ funding and README templates.
737
+ - Retemplated generated project metadata, support documentation, CI workflows,
738
+ binstubs, and development dependency floors with `kettle-jem` v7.0.0.
739
+ - Generated README and workflow templates now treat Ruby 4.0 as MRI current,
740
+ add discrete JRuby 10.0 and TruffleRuby 33.0 workflows/badges, and include a
741
+ TruffleRuby HEAD badge pointing at the shared heads workflow.
742
+ - Generated CI workflows now disable `ruby/setup-ruby` Bundler caching for
743
+ TruffleRuby 25.0 and JRuby 9.3 and run a serial Bundler install to avoid
744
+ legacy engine setup failures.
745
+ - `kettle-jem install` now runs `rubocop_gradual:autocorrect` after templating
746
+ and before the bootstrap commit when the destination project provides
747
+ `bin/rake`, so project-local Ruby syntax floors can normalize generated
748
+ files.
749
+ - `RUBOCOP_LTS_LOCAL` templating now switches the local `rubocop-lts/rubocop-lts`
750
+ checkout to the branch matching the selected `rubocop-rubyN_N` wrapper before
751
+ running setup and RuboCop Gradual normalization.
752
+ - Generated RuboCop-LTS local style Gemfiles now exclude the current project
753
+ package and already-declared gems before adding local family path overrides.
754
+ - Generated funding templates now default missing OpenCollective orgs to
755
+ `galtzo-floss` and warn when that fallback differs from the GitHub org.
756
+ - Shim gemspec templates now include the kettle-dev release/test harness
757
+ dependencies required by `kettle-changelog`, `kettle-test`, and release tasks.
758
+ - Shim gemspec templates now resolve the generated gem version token instead of
759
+ leaving `{KJ|GEM_VERSION}` unresolved.
760
+ - Shim and monorepo-root template profiles now include generated `.gitignore`
761
+ files so local `.env.local` configuration is ignored consistently.
762
+ - Shim Gemfile templates now include `nomono` and the generated templating
763
+ Gemfiles so `K_JEM_TEMPLATING=true bundle exec kettle-jem install` works.
764
+ - Shim Gemfile templates no longer add a Git-sourced replacement gem fallback;
765
+ the released replacement gem is already declared by the generated gemspec.
766
+ - Shim Gemfile templates now use `https://gem.coop`, matching the full template
767
+ and allowing released replacement gems to resolve without Git sources.
768
+ - Generated README compatibility sections now use prose for the test-matrix
769
+ credit and render all generated details blocks with Markdown enabled.
770
+ - Generated README compatibility sections now pair the test-matrix credit with
771
+ the kettle-dev logo and use a kettle-dev-specific details summary.
772
+ - The generated README dev/test stack table now includes `kettle-jem` with its
773
+ Appraisals and CI workflow template role.
774
+ - The generated README dev/test stack table now includes `kettle-dev` and keeps
775
+ stack gems in A-Z order while preserving self-exclusion.
776
+ - Gem templates and generated root Gemfiles now require `kettle-dev` >= 2.2.22.
777
+ - Generated SimpleCov setup now keeps `.simplecov` configuration-only and
778
+ starts coverage explicitly from `spec/spec_helper.rb` for SimpleCov v1.
779
+ - `.simplecov` templating now removes obsolete `SimpleCov.start` blocks with a
780
+ Prism AST cleanup pass while preserving destination-local configuration.
781
+ - `.simplecov` templating now removes the obsolete kettle-soup-cover config
782
+ require with the same Prism AST cleanup pass so SimpleCov finishes loading
783
+ before formatter configuration is required.
784
+ - `.simplecov` templating now migrates old generated `keep_destination`
785
+ overrides and converts preserved `track_files` calls to `cover` calls.
786
+ - Generated spec helper templating now normalizes stale SimpleCov bootstrap
787
+ blocks by deduplicating SimpleCov requires and restoring the formatter config
788
+ require before `SimpleCov.start`.
789
+ - Generated spec helpers now document that requiring SimpleCov loads the
790
+ configuration-only `.simplecov` before coverage starts.
791
+ - Generated coverage Gemfiles no longer pin SimpleCov to the pre-release-only
792
+ `kettle-dev/simplecov` `fix-final-parallel-worker-formatting` branch.
793
+ - Generated workspace path examples now use the renamed `my` local workspace
794
+ instead of the old `kettle-rb` checkout path.
795
+ - Generated coverage Gemfiles now require `kettle-soup-cover` >= 3.0.0.
796
+ - Generated Rakefiles now use `# simplecov:disable` / `# simplecov:enable`
797
+ blocks instead of deprecated legacy coverage markers.
798
+ - `kettle-jem install` now uses the latest `kettle-family install` marker to
799
+ activate locally installed template-stack source roots during templating
800
+ setup.
801
+ - Generated Gemfiles now guard preserved runtime `eval_nomono_gems` workspace
802
+ overrides during `K_JEM_TEMPLATING=true`, keeping templating bundles isolated
803
+ from target runtime sibling path dependencies.
804
+ - Generated main Gemfiles now add templating-aware `nomono` wiring for direct
805
+ runtime dependencies that exist as sibling gems in the same local family
806
+ workspace.
807
+ - Install lockfile normalization now keeps direct sibling runtime dependencies
808
+ available through the generated family `*_DEV` environment while still
809
+ disabling templating-only path overrides.
810
+ - Generated kettle-jem usage instructions now use the `kettle-jem` executable as
811
+ the bootstrap entrypoint instead of starting from `bundle exec kettle-jem`.
812
+ - Generated templating Gemfiles now resolve the local tree-sitter language pack
813
+ workspace fork from `structuredmerge/vendor`.
814
+ - Generated Appraisals now use modern keyword hash syntax for the
815
+ `appraisal2-rubocop` plugin declaration.
816
+ - Refreshed the generated `codecov/codecov-action` workflow pin and made
817
+ workflow-pin specs validate immutable pin shape instead of exact live SHAs.
818
+ - Refreshed generated workflow templates to pin `actions/checkout` to the
819
+ `v7.0.0` release.
820
+ - Gem templates and generated templating Gemfiles now require `kettle-dev` >= 2.2.12.
821
+ - The packaged gemspec template now uses the same `kettle-dev` 2.2.12 floor as
822
+ generated Gemfile tooling.
823
+ - Generated templating Gemfiles now require `kettle-drift` >= 1.0.4.
824
+ - Gem templates now require `kettle-test` >= 2.0.8.
825
+ - Generated coverage Gemfiles now require `kettle-soup-cover` >= 2.0.2.
826
+ - Generated style Gemfiles now require `rubocop-gradual` >= 0.4.0.
827
+ - Generated style Gemfiles now require `appraisal2-rubocop` >= 0.2.1.
828
+ - Generated main Gemfiles now require `nomono` >= 1.0.4.
829
+ - Generated gemspec templates now preserve the full existing gemspec author list
830
+ instead of replacing it with the primary author token.
831
+ - Retemplating now removes legacy `.github/workflows/tests.yml` files as
832
+ obsolete workflows.
833
+ - Runtime dependency `token-resolver` now requires 2.0.3 or newer.
834
+ - Gem templates now require `turbo_tests2` >= 3.1.6 for the default
835
+ `kettle-test` runner dependency.
836
+ - The README template now links `kettle-readme-backers` to the generated
837
+ `bin/` binstub instead of a non-existent `exe/` path.
838
+ - The README template's test matrix credit now highlights the Kettle dev/test
839
+ stack with BestGems, GitHub, and daily download rank links, excluding the
840
+ current gem from its own stack table.
841
+ - The README dev/test stack table now includes `kettle-soup-cover`.
842
+ - Documentation templates now require `yard-yaml` >= 0.2.1.
843
+ - Gemfile and gemspec source checks now prefer Prism-backed call records instead
844
+ of regex/string fallback matching for dependency and project-name decisions.
845
+ - Appraisals template merging now delegates same-name DSL call reconciliation to
846
+ `Prism::Merge` instead of custom source-line dependency comparison.
847
+ - Generated gemspec version-loader fallbacks now use `require_relative` for
848
+ gems whose runtime Ruby floor is 2.2 or newer, reserving `$LOAD_PATH`
849
+ mutation for gems that still target older Rubies.
850
+ - Generated gemspec version-loader guards now use `Gem.ruby_version`, avoiding
851
+ RuboCop `Gemspec/RubyVersionGlobalsUsage` violations.
852
+ - Generated auto-assign workflows now pin `pozil/auto-assign-issue` to the
853
+ immutable SHA for v4.
854
+ - Generated GitHub Actions workflow templates now pin `actions/checkout` to
855
+ the peeled commit SHA for v6.0.3 and `qltysh/qlty-action/coverage` to the
856
+ immutable SHA for v2.2.1.
857
+ - Generated GitHub Actions workflow templates now refresh pins for
858
+ `coverallsapp/github-action` and `codecov/codecov-action`.
859
+ - Generated templating and unlocked dependency workflows no longer install the
860
+ legacy tree-sitter action and rely on the packaged
861
+ `tree_sitter_language_pack` runtime instead.
862
+ - Generated templating workflows and `kettle-jem prepare` now update `nomono`
863
+ before install/selftest commands run, so stale locks do not activate old
864
+ local-workspace wiring code.
865
+ - Generated GitHub Actions workflow templates now refresh pins for
866
+ `github/codeql-action` sub-actions to v4.36.2.
867
+ - Generated workflow templates now pin `coverallsapp/github-action` and
868
+ `codecov/codecov-action` to resolvable release SHAs instead of stripped
869
+ SemVer strings.
870
+ - Generated README badge URLs now use the same URI-normalized form as
871
+ `kettle-pre-release`, avoiding churn between encoded namespace separators
872
+ and Unicode badge messages.
873
+ - Generated GitHub Actions workflow templates now refresh `ruby/setup-ruby` to
874
+ the immutable SHA for v1.312.0 and `codecov/codecov-action` to the latest
875
+ v7.0.0 release comment.
876
+ - Generated GitHub Actions workflow templates now refresh `ruby/setup-ruby`,
877
+ `coverallsapp/github-action`, and `pozil/auto-assign-issue` pins.
878
+ - Generated coverage workflows now publish QLTY coverage with GitHub OIDC so
879
+ repositories do not require `QLTY_COVERAGE_TOKEN` to be configured.
880
+ - Generated README and FUNDING OpenCollective links now use the configured
881
+ OpenCollective slug instead of assuming it matches the GitHub organization.
882
+ - Generated coverage workflow uploads now share the same template token as
883
+ custom workflow injection, avoiding duplicate coverage upload step templates.
884
+ - Generated coverage workflows no longer gain an extra blank line after the
885
+ shared coverage upload step token is expanded at end of file.
886
+ - Generated Appraisal/RuboCop templates now use Appraisal2 3.1.1's `plugin`
887
+ and `generator_only` DSLs to provide the full style toolchain from modern
888
+ Appraisal root bundles without leaking style dependencies into old-Ruby
889
+ appraisal bundles, while still evaluating the style toolchain for Bundler.
890
+ - Generated Appraisals no longer add a separate `cgi >= 0.5` declaration to
891
+ the `head` appraisal because the extracted stdlib gemfiles already provide
892
+ the Ruby-specific `cgi` dependency.
893
+ - Generated Appraisal root Gemfiles now load the style toolchain only on Ruby
894
+ 3.2+, matching the current RuboCop-LTS dependency floor.
895
+ - Generated Open Collective backers workflows now skip the README update step
896
+ when `README_UPDATER_TOKEN` is not configured instead of failing the workflow.
897
+ - Generated style toolchains now use `appraisal2-rubocop` 0.2.0 as their floor.
898
+ - Generated style toolchains now include `rubocop-minitest` so projects with
899
+ preserved Minitest RuboCop config can run `rubocop_gradual`.
900
+ - Template strategy documentation now clarifies that `raw_copy` is a bootstrap
901
+ path that bypasses token resolution and StructuredMerge normalization.
902
+ - Generated EOL TruffleRuby 22.3, 23.0, and 23.1 workflows now mark their
903
+ matrix entries experimental so native extension build failures do not fail
904
+ the whole workflow.
905
+ - Documented `kettle-jem install` as the canonical full templating entrypoint
906
+ and marked generated `kettle:jem:*` rake tasks as internal orchestration targets.
907
+ - Bare `kettle-jem template` now aliases to the full install path; use
908
+ `kettle-jem template --only PATH` or `--include PATH` for scoped file updates.
909
+ - `kettle-jem` project fact discovery now uses `Kettle::Jem::GemSpecReader`
910
+ and RubyGems specification objects instead of parsing gemspec source.
911
+ - `kettle-jem` namespace discovery now prefers existing source-tree version
912
+ namespaces before stale gemspec metadata so non-standard acronym namespaces
913
+ such as `OAuth2` and `OmniAuth` are preserved.
914
+ - README and CONTRIBUTING templates now document the effective
915
+ `ruby.test_minimum` value used when the project was templated.
916
+ - README templates now list Ruby 2.3 as supported but untested, matching Ruby
917
+ 2.2 and older, instead of rendering a Ruby 2.3 CI workflow badge.
918
+ - README templates now include a closing note that identifies kettle-jem and
919
+ StructuredMerge as the templating and merge-contract tooling.
920
+ - Generated gemspec summary and description assignments now use package
921
+ metadata tokens instead of emoji-only placeholders.
922
+ - README logo templating now splits config-driven `top_logos` from
923
+ `h2_synopsis_logos`, renders logos as aligned HTML images, and normalizes logo
924
+ assets to 128px.
925
+ - README logo config now accepts optional per-logo widths with `type|width`
926
+ entries, such as `org|12%` or `ruby|96px`.
927
+ - README Ruby language logos now link to Ruby Toolbox.
928
+ - Documented `rubygems.min_ruby` in the generated `.kettle-jem.yml` so projects
929
+ can make the published runtime Ruby floor explicit.
930
+ - Documentation templates now require `yard-yaml` >= 0.2.0.
931
+ - Documentation templates now require `yard-fence` >= 0.9.4.
932
+ - Documentation templates now require `yard-timekeeper` >= 0.2.1.
933
+ - Gem templates and generated templating Gemfiles now require `kettle-dev` >= 2.1.1.
934
+ - Gem templates now require `kettle-test` >= 2.0.3.
935
+ - Gem templates now require `appraisal2` >= 3.1.1.
936
+ - Generated templating Gemfiles now require `kettle-drift` >= 1.0.1.
937
+ - Runtime dependency `token-resolver` now requires the released 2.x line.
938
+ - Development lockfile generation now uses Bundler 4.0.12.
939
+ - Rake task specs now run from a sandboxed temporary project root.
940
+ - Ruby, engine, Bundler, RubyGems, RuboCop, and Rails compatibility choices now
941
+ come from an `RRRRB_MATRIX` source of truth so generated workflows and
942
+ appraisals can select the newest stable compatible toolchain per Ruby.
943
+ - Generated JRuby 9.1 and 9.2 workflows now install RubyGems 3.3.27 and
944
+ Bundler 2.3.27 instead of using the default JRuby toolchain versions.
945
+ - Generated TruffleRuby 23.1 workflows now bootstrap from the Ruby 3.2
946
+ appraisal Gemfile so Ruby 3.2-specific dependency restrictions apply before
947
+ Bundler cache installation, then run tests directly under that bundle instead
948
+ of regenerating the active appraisal Gemfile.
949
+ - Generated Ruby 3.0 and Ruby 3.2 appraisal Gemfiles now include
950
+ TruffleRuby-only `json` modules that pin to the default `json` gem shipped
951
+ with EOL TruffleRuby releases instead of constraining MRI Ruby bundles.
952
+ - Generated main Gemfiles now install `nomono` >= 1.0.3 so local workspace
953
+ override Gemfiles can load `nomono/bundler` from the released gem.
954
+ - Generated coverage workflows now pass `K_SOUP_COV_MIN_LINE` and
955
+ `K_SOUP_COV_MIN_BRANCH` through to Code Coverage Summary thresholds instead
956
+ of hardcoding `100 100`.
957
+ - Default semantic Git driver setup now writes repo-local `diff.smorg-*`
958
+ command config as well as managed `.gitattributes`, so local `git diff`
959
+ can actually invoke StructuredMerge drivers after templating.
960
+ - Runtime dependency `token-resolver` now requires 2.0.1 or newer.
961
+ - Generated gemspecs now require `version_gem` >= 1.1.12 while allowing the
962
+ released 1.1 line.
963
+ - Gem templates now require `gitmoji-regex` >= 2.0.2.
964
+ - Gem templates now require `turbo_tests2` >= 3.1.1 for the default
965
+ `kettle-test` runner.
966
+ - Generated style Gemfiles now use the latest released `rubocop-ruby*`
967
+ wrapper patch constraints for the RuboCop-LTS family.
968
+ - Generated style Gemfiles now use the latest released `rubocop-lts` track
969
+ constraints for every supported Ruby floor.
970
+ - Generated style Gemfiles now treat style dependency floors as latest-Ruby
971
+ task dependencies, independent from the gemspec runtime Ruby floor.
972
+ - kettle-jem now requires `kettle-rb` >= 0.1.1.
973
+ - Generated coverage Gemfiles now require `kettle-soup-cover` >= 2.0.1.
974
+ - Generated documentation Gemfiles now require `yaml-converter` >= 0.2.1
975
+ while allowing the released 0.2 line.
976
+
977
+ - Generated root Gemfiles no longer path-wire direct sibling dependencies from
978
+ stale sibling directories whose gemspec defines a different gem name.
979
+ - Generated root Gemfiles now remove previously generated direct sibling wiring
980
+ when the current sibling directory no longer defines the dependency gem.
981
+ - Generated RuboCop configs now activate the `rubocop-rspec` plugin for the
982
+ packaged RSpec RuboCop overlay.
983
+ - Gemspec `spec.files` merging now supports the generated `Dir[...] + [...]`
984
+ assignment shape on subsequent template runs instead of rejecting it as
985
+ unsupported.
986
+ - Generated modular Gemfiles no longer redeclare runtime dependencies that are
987
+ already supplied by the project gemspec.
988
+ - Existing generated gemspecs with splat-based `spec.files` assignments now
989
+ retain configured root license files from the template instead of preserving
990
+ the old splat-only assignment wholesale.
991
+ - Gemspec `spec.files` templating now fails hard for unsupported package-list
992
+ shapes instead of silently preserving destination content.
993
+ - Generated gemspecs now package active root license files declared by the
994
+ project license configuration.
995
+ - Gemspec templating no longer preserves frozen `spec.files` override blocks;
996
+ `spec.files` is structurally merged so stale frozen package lists cannot
997
+ replace the merged package payload.
998
+ - README template merging no longer duplicates preserved destination-only
999
+ subsections when they are already inside another preserved destination
1000
+ section.
1001
+ - Generated gemspecs now add an inline `Gemspec/RequiredRubyVersion` RuboCop
1002
+ disable when the published runtime Ruby floor is below 2.0.
1003
+ - `kettle-jem install` no longer tries to switch the local RuboCop-LTS checkout
1004
+ while templating the RuboCop-LTS checkout itself.
1005
+ - Generated style Gemfiles now require `rubocop-ruby3_2` >= 3.0.6 so
1006
+ Appraisal/RuboCop tasks do not select damaged packages missing
1007
+ packaged RuboCop-LTS configuration files.
1008
+ - Gemspec `spec.files` merging now preserves `Dir[...]` glob expansion when
1009
+ merging destination glob entries into an array-based template assignment by
1010
+ generating concatenated `Dir[...] + [...]` package file expressions.
1011
+ - Quiet templating orchestration no longer passes unsupported `--quiet`
1012
+ switches to Bundler subcommands such as `bundle binstubs` or `bundle lock`;
1013
+ only Bundler subcommands documented with `--quiet` receive that flag.
1014
+ - Gemspec `spec.files` merging now inserts missing trailing commas when moving
1015
+ existing collection entries before appended template entries, preventing
1016
+ invalid Ruby when a destination's former last entry had no comma.
1017
+ - Gemfile templating now preserves destination-only Ruby-bucket
1018
+ `eval_gemfile` entries, preventing configured recording Gemfiles from being
1019
+ dropped when the main Gemfile template is reapplied, and restores the main
1020
+ recording Gemfile eval when existing Appraisals show recording is configured.
1021
+ - Generated templating Gemfiles no longer duplicate `appraisal2-rubocop`; the
1022
+ Appraisal generator formatter is provided by the style Gemfile loaded from
1023
+ `Appraisal.root.gemfile`.
1024
+ - Generated local Gemfile overrides now load `nomono/bundler` without activating
1025
+ nomono's runtime dependencies during Bundler Gemfile evaluation, and bundled
1026
+ handoff no longer runs through the RubyGems `kettle-jem` wrapper.
1027
+ - Gemspec template merging now preserves chained squiggly heredoc assignments
1028
+ such as `spec.description = <<~DESC.strip` instead of replacing only the
1029
+ opener line.
1030
+ - Generated README post-processing now adds missing compatible JRuby 10.0 and
1031
+ TruffleRuby 33.0 compatibility badges when the matching workflow files exist.
1032
+ - Shunted Gemfile generation no longer duplicates broad gemspec development
1033
+ dependencies that already have explicit modular Gemfile compatibility
1034
+ overrides, such as old-Ruby fork handling.
1035
+ - `kettle-jem install` no longer fails a stale outer bootstrap commit step when
1036
+ the bundled handoff already committed the generated changes.
1037
+ - Shim template discovery now recovers the package version from the git index
1038
+ or `HEAD` when a previous failed run already replaced the working-tree
1039
+ version file with replacement-gem aliases.
1040
+ - Shim profile version files now alias the replacement gem version constants
1041
+ and compute the replacement version require path relative to the generated
1042
+ shim version file, fixing nested require paths such as `omniauth/jwt`
1043
+ shimming `omniauth/jwt2`.
1044
+ - `kettle-jem install` now skips its bundled handoff when the destination bundle
1045
+ does not include `kettle-jem`, allowing shim-only gems to finish templating.
1046
+ - Namespace discovery now detects nested module declarations in the public
1047
+ entrypoint before falling back to a stale generated version namespace, and the
1048
+ README namespace badge now uses the shield-safe namespace token.
1049
+ - OpenCollective template tokens now use `.github/FUNDING.yml` as a valid org
1050
+ source, preventing empty `https://opencollective.com//...` README and
1051
+ FUNDING links when destination env variables are not loaded.
1052
+ - Monorepo-root templating now uses the no-OpenCollective funding templates
1053
+ when no OpenCollective slug is configured, preventing empty generated
1054
+ OpenCollective badge URLs in root `FUNDING.md` files.
1055
+ - The `kettle-jem` CLI now refuses to run from the `kettle-jem` project root
1056
+ against a different destination, so templating cannot silently use
1057
+ `kettle-jem`'s own environment instead of the target repo's environment.
1058
+ - Fixed `bin/kettle-jem-workflow-pins` so its synthetic workflow is valid YAML
1059
+ and child command failures include stdout diagnostics.
1060
+ - Fixed `bin/kettle-jem-workflow-pins` so sub-action updates reported under the
1061
+ parent action repository, such as `github/codeql-action`, update the full
1062
+ pinned action path instead of being silently counted as zero updates.
1063
+ - Fixed `bin/kettle-jem-workflow-pins` to default to the same broad upgrade
1064
+ strategy used by family workflow pin maintenance, so minor action releases
1065
+ such as `ruby/setup-ruby` are not missed by template pin refreshes.
1066
+ - README compatibility badge pruning now compares Ruby minor series so patch
1067
+ floors like `>= 1.8.7` and `>= 2.2.2` keep their matching minor badges.
1068
+ - Gemspec template summary and description tokens now strip an already-present
1069
+ project emoji and escape double quotes before rendering inside Ruby strings.
1070
+ - Templates now remove `version_gem` dependencies and entrypoint references for
1071
+ gems whose minimum Ruby is below 2.2 while keeping the standard
1072
+ `<Namespace>::Version::VERSION` constant shape.
1073
+ - Curated Bundler binstub pruning now keeps any executable owned by the curated
1074
+ binstub gems, so newly added executables such as `kettle-bump` are retained
1075
+ without hardcoding every executable name.
1076
+ - Gem templates now require `appraisal2` >= 3.1.2.
1077
+ - Gemspec merging now lets explicit `KJ_AUTHOR_EMAIL` and `KJ_AUTHOR_NAME`
1078
+ environment overrides replace destination `spec.email` and `spec.authors`
1079
+ metadata instead of preserving stale project fields over resolved template
1080
+ tokens.
1081
+ - Explicit `rubygems.min_ruby: "0"` template configuration now renders the
1082
+ zero runtime floor consistently while omitting `required_ruby_version` and
1083
+ runtime dependencies that cannot support Ruby 1.x.
1084
+ - Generated Ruby 4/head extracted-stdlib Gemfiles now include `cgi` and
1085
+ `webrick` so legacy suites that require extracted standard libraries can run
1086
+ on modern Rubies.
1087
+ - `kettle-jem install` now ensures curated Bundler binstubs are executable,
1088
+ including legacy `bin/rake` and rewritten `bin/yard` binstubs used by
1089
+ `kettle-changelog`.
1090
+ - Generated `LICENSE.md` copyright notice lines now render as a Markdown list.
1091
+ - Appraisals templating now treats `eval_gemfile "path"` and
1092
+ `eval_gemfile("path")` as the same dependency when merging same-named
1093
+ appraisal blocks.
1094
+ - Generated freeze-marker guidance now consistently names `kettle-jem` as the
1095
+ templating tool instead of substituting the destination gem name.
1096
+ - Templating now prunes legacy dashed Ruby workflow filenames such as
1097
+ `ruby-2-4.yml` when replacing them with dotted packaged workflow filenames.
1098
+ - Gemspec freeze-block preservation now honors configured custom
1099
+ `defaults.freeze_token` values.
1100
+ - RuboCop config templating now removes destination `AllCops.TargetRubyVersion`
1101
+ settings so Ruby target selection remains owned by the `rubocop-lts` family.
1102
+ - Coverage workflow templating now preserves `K_SOUP_COV_MIN_LINE` and
1103
+ `K_SOUP_COV_MIN_BRANCH` from `mise.toml`, keeping the generated SimpleCov
1104
+ hard gate aligned with the project's configured thresholds.
1105
+ - Framework CI workflow templating no longer emits duplicate matrix environment
1106
+ keys when generated matrix entries are visited through overlapping YAML nodes.
1107
+ - Gemspec templating no longer preserves stale `kettle-soup-cover` development
1108
+ dependencies now that coverage dependencies are owned by the modular coverage
1109
+ Gemfile.
1110
+ - Workflow action pin normalization now keeps `pozil/auto-assign-issue` on the
1111
+ pinned v4 ref.
1112
+ - Workflow templating no longer rewrites coverage summary thresholds back to
1113
+ literal numbers after applying destination-specific coverage env values.
1114
+ - Generated coverage workflows now keep Codecov upload failures non-gating, so
1115
+ generated coverage reports remain the authoritative CI gate.
1116
+ - Generated style workflows now run `rbs validate` through the appraisal bundle
1117
+ instead of the project `bin/rbs` wrapper.
1118
+ - Workflow templating now normalizes obsolete Appraisal-relative `kettle-test`
1119
+ commands to the canonical project-root `kettle-test` command.
1120
+ - Local override Gemfile and gemspec templates no longer emit RuboCop-Gradual
1121
+ regressions from trailing commas or unnecessary encoding comments.
1122
+ - README logo templating now preserves generated Synopsis H2 logo HTML during
1123
+ README heading normalization, migrates legacy combined `top_logos` config into
1124
+ `top_logos` plus `h2_synopsis_logos`, and removes unused old logo link
1125
+ definitions.
1126
+ - Ruby template merges now preserve template-only require/bootstrap nodes and
1127
+ place them at their template anchor instead of deleting them after merge.
1128
+ - Ruby template merges now preserve coverage bootstrap ordering when the
1129
+ package name and entrypoint require path differ, avoiding duplicate or
1130
+ pre-coverage library requires in generated spec helpers.
1131
+ - Generated style Gemfiles now include released `rubocop-lts-rspec` in the
1132
+ non-local RuboCop-LTS bundle instead of requiring `rubocop-rspec` directly.
1133
+ - Fixed generated documentation URLs for standalone gems so template-owned
1134
+ citation and documentation links do not retain monorepo `gems/` paths.
1135
+ - Monorepo-root templating now applies without a root gemspec, detects root
1136
+ license files ahead of stale config values, installs the generated Rakefile
1137
+ task plumbing, and syncs root Gemfile tooling dependencies without duplicating
1138
+ local nomono declarations.
1139
+ - Generated `gemfiles/modular/x_std_libs.gemfile` now selects the extracted
1140
+ stdlib dependency set from the active Ruby version, so dependency solvers
1141
+ running on Ruby 3.1 do not receive Ruby 4-only stdlib requirements.
1142
+ - README merging now preserves a destination front `## Important`/warning
1143
+ section before Synopsis when that section encloses the badge cloud.
1144
+ - Same-named destination gemspecs loaded from different project directories no
1145
+ longer bleed metadata into one another during templating.
1146
+ - `kettle-jem install` now strips inherited Bundler activation variables before
1147
+ running destination setup commands, so generated `bin/setup` can run
1148
+ `bundle install` even when the destination lockfile references gems that are
1149
+ not installed yet.
1150
+ - Generated `bin/yard` now routes through `bin/rake yard` so documentation
1151
+ plugins installed by the templated rake task, such as yard-timekeeper, run
1152
+ consistently.
1153
+ - GemSpec template merging now keeps the greater version requirement between
1154
+ template-managed dependencies and destination dependencies, allowing newer
1155
+ destination constraints to remain while still upgrading stale template-owned
1156
+ floors.
1157
+ - Generated evergreen JRuby workflows now mark the current JRuby and
1158
+ `dep-heads` JRuby jobs experimental, so JRuby 10/arjdbc incompatibilities
1159
+ remain visible without blocking release CI.
1160
+ - Same-named Appraisal blocks now merge destination-only `gem` and
1161
+ `eval_gemfile` entries into the templated block, so framework/appraisal tools
1162
+ can enrich standard `ruby-X-Y` appraisals without losing template updates.
1163
+ - Standard test Appraisal blocks now include configured
1164
+ `appraisal_matrix.appraisal_gemfiles`, allowing kettle-jem-appraisals to
1165
+ model required framework dependencies without duplicating the simple
1166
+ framework matrix.
1167
+ - Standard Appraisal gemfile injection now skips blocks already enriched by a
1168
+ collapsed framework/appraisal matrix dependency gemfile, avoiding duplicate
1169
+ broad and version-pinned framework dependency declarations.
1170
+ - Standard Appraisal gemfile injection now distinguishes ordinary modular
1171
+ support gemfiles from framework matrix fragments, so coverage and dependency
1172
+ test appraisals still receive required framework dependencies.
1173
+ - TOML recipe merging now loads the concrete TOML backend provider with
1174
+ kettle-jem, so `.toml` template merges have a registered parser in ordinary
1175
+ bundle contexts.
1176
+ - The generated `.kettle-jem.yml` keeps `Appraisal.root.gemfile`
1177
+ template-owned so stale root-appraisal content is replaced cleanly.
1178
+ - Simple `workflows.framework_matrix` version entries can now target an
1179
+ existing appraisal with `appraisal`, `appraisal_name`, or
1180
+ `standard_appraisal`, allowing explicit collapse onto standard appraisals.
1181
+ - Collapsed `workflows.framework_matrix` appraisals now preserve configured
1182
+ per-version environment variables, can skip framework workflow generation,
1183
+ respect `keep_destination` framework gemfiles, and remove replaced standalone
1184
+ framework appraisal blocks.
1185
+ - Collapsed framework matrix environment variables now render into generated
1186
+ GitHub workflow matrices instead of mutating `ENV` from `Appraisals`, so each
1187
+ appraisal run receives its own framework version without definition-order
1188
+ leakage.
1189
+ - README merge preservation now keeps configured destination-only sections
1190
+ instead of dropping them when the packaged README template has no matching
1191
+ heading.
1192
+ - Added `KETTLE_JEM_SKIP_LOCK_NORMALIZATION` for self-templating unreleased
1193
+ gems whose dependencies cannot yet resolve from remote sources.
1194
+ - Added a native `Kettle::Jem::GemSpecReader` for gemspec metadata so tooling
1195
+ built on `kettle-jem` no longer needs to call into `kettle-dev` for project
1196
+ Ruby floors and gemspec facts.
1197
+ - Kept malformed destination gemspecs from leaving template tokens unresolved
1198
+ by falling back to filename-derived gem identity inside `GemSpecReader`.
1199
+ - Fixed generated appraisal `eval_gemfile` paths so Appraisal2 resolves
1200
+ modular gemfiles relative to `gemfiles/` instead of `gemfiles/gemfiles/`.
1201
+ - Fixed generated Appraisals content so it does not end with an extra blank line.
1202
+ - Fixed generated version-gem Ruby and RBS files so whole-file template tokens
1203
+ do not add an extra blank line at EOF.
1204
+ - Generated Rakefiles now install a `kettle:jem:selftest` fallback when the
1205
+ installed `kettle-jem` package lacks rake task support.
1206
+ - Generated Rakefile merging now normalizes section spacing so template-added
1207
+ task blocks do not introduce RuboCop `Layout/EmptyLines` offenses.
1208
+ - Fixed generated framework workflow YAML indentation so `framework:` remains
1209
+ under `strategy.matrix`.
1210
+ - Removed duplicate generated `spec.homepage` assignments when destination
1211
+ gemspecs already carry the configured homepage.
1212
+ - `kettle-jem install --hook-templates l` now activates the generated
1213
+ project-local `.git-hooks` by setting `core.hooksPath` to `.git-hooks` and
1214
+ ensuring the generated hook scripts are executable.
1215
+ - Removed stale `continue-on-error` handling from the generated style workflow
1216
+ so RuboCop Gradual failures are enforced by default.
1217
+ - Removed stale `continue-on-error` handling from the generated current workflow.
1218
+ - Marked generated workflow files as template-owned by default to prevent stale
1219
+ YAML keys from surviving future template runs.
1220
+ - Replaced generated Appraisal workflow matrix Gemfile indirection with a
1221
+ fixed `Appraisal.root.gemfile` job environment so Appraisal never falls back
1222
+ to the root development `Gemfile`.
1223
+ - Changed packaged GitHub workflow templates to whole-file replacement so stale
1224
+ job steps from older matrix formats cannot accumulate beside new steps.
1225
+ - Preserved destination coverage thresholds when replacing generated coverage
1226
+ workflows.
1227
+ - Preserved the current gem in local modular gemfile workspace arrays when the
1228
+ generated local dependency wiring needs to include it.
1229
+ - Excluded the current gem from generated `eval_nomono_gems` calls so local
1230
+ workspace lists do not conflict with the root `gemspec` dependency.
1231
+ - Excluded already-declared gemspec dependencies from generated local
1232
+ `eval_nomono_gems` calls so local modular gemfiles do not conflict with
1233
+ development dependencies declared by the project gemspec.
1234
+ - Changed post-template lockfile normalization to run `bundle update` with
1235
+ templating and local sibling overrides disabled, so dependency template
1236
+ updates are fully re-resolved against released gems.
1237
+ - `kettle-jem install --accept-config` now immediately applies the newly
1238
+ bootstrapped canonical config before running bundle setup and bundled handoff,
1239
+ so first-time templating installs generate the Gemfile templating wiring that
1240
+ makes `bundle exec kettle-jem` available.
1241
+ - First-time config bootstrap now seeds `project_emoji` from the destination
1242
+ gemspec summary or description when the README does not expose a leading H1
1243
+ emoji.
1244
+ - Generated `mise.toml` files now preserve existing coverage thresholds from
1245
+ the destination `mise.toml` or legacy coverage workflow, so local
1246
+ `kettle-test` runs keep the project's established coverage floor.
1247
+ - Added curated `rbs` and `rspec-core` binstubs because generated CI templates
1248
+ call `bin/rbs` and `bin/rspec` directly through appraisals.
1249
+ - Generated optional Gemfiles now include `rbs` and `stone_checksums`,
1250
+ matching the curated binstubs generated during `kettle-jem install`.
1251
+ - Updated the generated coverage bundle to require `kettle-soup-cover` 2.0.0 or newer.
1252
+ - Removed the generated CodeQL workflow so templated repositories can rely on
1253
+ GitHub CodeQL default setup instead of failing from duplicate advanced setup.
1254
+ - Generated workflow pruning now treats TruffleRuby 23.1 as Ruby 3.1
1255
+ compatible, matching README compatibility pruning and removing that stale
1256
+ workflow from Ruby 3.2+ projects.
1257
+ - Generated JRuby 9.3 workflows now use RubyGems 3.4.22 and Bundler 2.4.22,
1258
+ matching Ruby 2.6 compatibility workflows and avoiding default-gem activation
1259
+ conflicts during Appraisal setup.
1260
+ - Monorepo-root template bootstrap now falls back to package-derived namespace
1261
+ and entrypoint tokens when no gemspec-backed RubyGems config is present.
1262
+ - Updated the generated documentation bundle to require `yard-fence` 0.9.1 or newer.
1263
+ - Removed `--plugin timekeeper` from generated `.yardopts` because
1264
+ yard-timekeeper is installed through the rake `yard` task hook.
1265
+ - Escaped generated README metadata table cells so multiline gemspec
1266
+ descriptions render with `<br>` instead of breaking table rows.
1267
+ - Fixed gemspec emoji normalization so multiline quoted summaries and
1268
+ descriptions remain valid Ruby after templating.
1269
+ - Fixed version-gem bootstrap so an explicit `rubygems.namespace` in
1270
+ `.kettle-jem.yml` wins over stale inferred entrypoint namespaces.
1271
+ - Updated the generated contributing guide to refresh the `REEK` backlog with
1272
+ `bin/rake reek:update` instead of redirecting the raw `reek` executable.
1273
+ - Replaced `bundle binstubs --all` during template install with curated
1274
+ binstubs for documented project entrypoints, and prune stale Bundler-generated
1275
+ development-tool binstubs such as `bin/reek`.
1276
+ - Added `kettle-test` to the curated generated binstub set, and preserve
1277
+ `kettle-drift` binstubs when they already exist from local/plugin installs
1278
+ without requiring unreleased `kettle-drift` in every generated gemspec.
1279
+ - Added `kettle-drift` to generated templating Gemfiles, resolved remotely in
1280
+ templating mode and via `KETTLE_DEV_DEV` locally, separate from the
1281
+ `STRUCTUREDMERGE_DEV` StructuredMerge local gem set.
1282
+ - Refreshed generated README metadata blocks after template README merging so
1283
+ version-derived gemspec metadata such as `source_code_uri` does not stay stale.
1284
+ - Added `yard-yaml` to generated local documentation Gemfiles so local
1285
+ `GALTZO_FLOSS_DEV` runs match the released documentation plugin set.
1286
+ - Updated the generated development dependency on `kettle-test` to require
1287
+ 2.0.1 or newer.
1288
+ - Updated the generated development dependency on `kettle-dev` to require
1289
+ 2.0.5 or newer.
1290
+ - Monorepo-root bootstrap now keeps existing changelogs instead of replacing
1291
+ release history with a blank generated template.
1292
+ - Monorepo-root Rakefiles no longer lose existing RSpec/default tasks during
1293
+ scaffold cleanup before plugin task injection runs.
1294
+ - StructuredMerge family templating now runs child gem updates under the
1295
+ kettle-jem bundle so child directories without a Gemfile do not inherit the
1296
+ workspace root bundle.
1297
+ - StructuredMerge family templating now uses a gitmoji-prefixed default commit
1298
+ message so scripted commits satisfy the local commit hook.
1299
+ - Generated framework CI now uses an explicit framework matrix axis instead
1300
+ of GitHub Actions `include` expansion.
1301
+ - Scrubbed parent Bundler activation variables before the post-template
1302
+ lockfile normalization command runs in the destination project.
1303
+ - Preserved multiline heredoc gemspec assignments as whole fields during
1304
+ gemspec template merging.
1305
+ - Generated two-segment framework requirements as patch-bounded pessimistic
1306
+ constraints, e.g. `~> 7.0.0`, so framework appraisals do not drift to
1307
+ later minor versions.
1308
+ - Removed generated gemspec development dependencies when the destination
1309
+ already declares the same gem as a runtime dependency.
1310
+ - Preserved zero-byte generated template outputs such as `REEK` instead of
1311
+ normalizing them to a single blank line.
1312
+ - Added `workflows.recording` to `.kettle-jem.yml` so generated Appraisals only
1313
+ include VCR/WebMock recording gemfiles for projects that opt in.
1314
+ - Applied configured `rubygems.min_ruby` to generated gemspec
1315
+ `required_ruby_version` instead of preserving a stale destination value.
1316
+ - Preserved heredoc gemspec descriptions when applying project emoji
1317
+ normalization so templating does not corrupt valid `<<~` assignments.
1318
+ - Generated local templating Gemfiles now wire `tree_sitter_language_pack` from
1319
+ the sibling StructuredMerge checkout when iterating on unreleased
1320
+ `kettle-jem`, avoiding broken released native gem materialization.
1321
+ - Generated `spec/spec_helper.rb` now starts `kettle-soup-cover`/SimpleCov
1322
+ before loading the library so `kettle-test` produces the canonical
1323
+ `coverage/coverage.json` consumed by `kettle-changelog`.
1324
+ - VersionGem-managed `version.rb` and `version.rbs` packaged template targets
1325
+ now default to whole-file replacement, preventing legacy version constants
1326
+ from being merged into the generated shape.
1327
+
1328
+ - kettle-jem-template-20260726-002 - Generated version files now document their
1329
+ version namespace and constants, reducing warning-only YARD lint output.
1330
+
1331
+ - kettle-jem-template-20260726-003 - Coverage upload steps now treat Coveralls,
1332
+ QLTY, and Codecov as optional, so provider outages do not fail CI when local
1333
+ coverage thresholds still pass.
1334
+ - kettle-jem-template-20260728-004 - Generated dep-heads workflows now use the
1335
+ setup-ruby Bundler install path for direct appraisal Gemfiles, avoiding rv
1336
+ lockfile parser failures on Git and path dependencies.
1337
+ - kettle-jem-template-20260728-005 - VersionGem bootstrap now creates the
1338
+ missing canonical version spec when a project only has shim namespace version
1339
+ specs.
1340
+
1341
+ - kettle-jem-template-20260730-001 - Gemspec package file enumeration now runs
1342
+ relative to the gemspec directory, so packaged template assets are included
1343
+ even when the gemspec is loaded from another working directory.
1344
+
1345
+ - kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
1346
+ managed configuration block bindings structurally, preventing mixed block
1347
+ parameter names from producing invalid configuration after a merge.
1348
+ - kettle-jem-template-20260801-003 - Generated project metadata and
1349
+ documentation now normalize configured underscore hostnames to valid
1350
+ hyphenated hostnames.
1351
+ - kettle-jem-template-20260801-004 - Generated organization README logos now
1352
+ use GitHub's stable organization avatar endpoint instead of assuming a
1353
+ matching Galtzo-hosted asset exists.
1354
+
1355
+ - Repair stale executable version headers when a configured entrypoint differs from the package name.
1356
+
1357
+ - Generated README titles now lead with the package name when a gem retains a different legacy namespace.
1358
+
1359
+ - Generated gitignore files now ignore nested modular Gemfile lockfiles.
1360
+
1361
+ - Preserve destination README KLOC badges when current changelog coverage metadata is unavailable.
1362
+
1363
+ - Allow local Gemfile bootstraps to reuse an already activated compatible nomono version instead of pinning an older lockfile version.
1364
+
1365
+ - Remove legacy rubocop-rspec development dependencies that conflict with generated rubocop-lts-rspec tooling.
1366
+
1367
+ - Recover legacy lockfiles with unsupported tree_sitter_language_pack platforms during templating bootstrap.
1368
+
1369
+ - Remove legacy yard-junk development dependencies that conflict with generated documentation tooling.
1370
+
1371
+ - Gemfile accept-template strategy now replaces an existing dependency source instead of retaining it.
1372
+
1373
+ - Transfer changelog filters now remove inapplicable template-owned entries from released and Unreleased sections.
1374
+
1375
+ - Preserve generated version requires before executable entrypoint code when later requires exist.
1376
+
1377
+ - Merge devcontainer JSON files as JSONC so comments and trailing commas are supported.
1378
+
1379
+ - Keep parser-backed and stateful template recipes out of parallel planning workers.
1380
+
1381
+ - Preserve destination-specific SimpleCov filters and formatters when migrating legacy SimpleCov.start configuration blocks.
1382
+
1383
+ - Remove legacy standard-library declarations from Appraisals blocks managed by modular x_std_libs gemfiles.
1384
+
1385
+ - Recreate missing managed modular Gemfiles instead of treating empty checksum records as cache hits.
1386
+
1387
+ - Recognize legacy Dir.chdir-wrapped git ls-files gemspec package manifests during templating.
1388
+
1389
+ - Replace stale byebug-family spec helper requires with debug during templating.
1390
+
1391
+ - Migrate byebug-family dependencies to debug independently within each appraisal.
1392
+
1393
+ - Remove preserved duplicate gemspec dependency declarations after template merge.
1394
+
1395
+ - Template policy fingerprints now invalidate cached Appraisal, gemspec, and spec helper transforms when their merge behavior changes.
1396
+
1397
+ - Modular Gemfile fragments now retain their named runtime dependency when materializing missing files.
1398
+
1399
+ - kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
1400
+ preserving comments and trailing commas during template updates.
1401
+
1402
+ - Fail templating when direct project dependencies collide with templated modular Gemfiles unless an exact decision is recorded in kettle-jem configuration.
1403
+
1404
+ - Preserve explicit Bundler checksum validation settings during template setup.
1405
+
1406
+ - Prevent local modular Gemfiles from evaluating the destination gem as a sibling path dependency.
1407
+
1408
+ - Avoid pinning local nomono bootstraps to unavailable versions from stale lockfiles.
1409
+
1410
+ - Clarify modular dependency conflict decisions and reject incompatible keep_both requirements.
1411
+
1412
+ - Repair legacy local Gemfile nomono bootstraps before the templating dependency bundle starts.
1413
+
1414
+ - Run legacy local Gemfile bootstrap repair after managed template application so stale nomono pins cannot reach Bundler.
1415
+
1416
+ - Remove direct rdoc development dependencies from templated gemspecs; Yard owns documentation dependencies.
1417
+
1418
+ - Remove explicit rdoc development dependency declarations from documentation modular Gemfiles.
1419
+
1420
+ - Generate engine-specific dependency lockfiles for JRuby CI workflows
1421
+
1422
+ - Generate JRuby dependency lockfiles directly instead of requiring ignored appraisal lockfiles
1423
+
1424
+ - Refresh kettle-family with nomono in the templating workflow.
1425
+
1426
+ - Guard generated debug requires for Ruby versions below the debug gem support floor.
1427
+
1428
+ - Bootstrap VersionGem wiring in existing package-level shims instead of nested implementation files.
1429
+
1430
+ - Infer direct VERSION namespaces and remove stale VersionGem wiring from former nested implementation entrypoints.
1431
+
1432
+ - Allow legacy appraisal projects to opt into a compatible Bundler via KJ_BUNDLER_VERSION.
1433
+
1434
+ - Normalize stale VersionGem class extensions when repairing an existing package shim.
1435
+
1436
+ - Remove legacy VersionGem extensions from nested implementation files during package-shim repair.
1437
+
1438
+ - Preserve local modular Gemfile bodies during template finalization.
1439
+
1440
+ - Avoid duplicate version requires when a package shim delegates version loading to its implementation.
1441
+
1442
+ - Version specs now load inline version-gem package entrypoints before exercising the VersionGem API.
1443
+
1444
+ - Version specs now require the discovered Ruby entrypoint for hyphenated package names.
1445
+
1446
+ - Version bootstrap repairs remove stale package-name requires when the discovered Ruby entrypoint uses a different require path.
1447
+
1448
+ - Version specs for packages with nested version entrypoints now load the package shim when it owns the version bootstrap.
1449
+
1450
+ - Use the canonical version file when deriving a gem namespace during templating.
1451
+
1452
+ - Invalidate version namespace template checksums after renderer policy changes so corrected bootstrap output can repair prior template damage.
1453
+
1454
+ - Reconcile malformed version namespaces against destination class declarations during templating.
1455
+
1456
+ - Preserve class-based version namespaces during template bootstrap.
1457
+
1458
+ - Preserve modular Gemfile content while filtering direct dependency conflicts.
1459
+
1460
+ - Keep policy-preserving modular Gemfile rewrites during lint autocorrection.
1461
+
1462
+ - Preserve explicit class namespace superclasses when generating VersionGem version files.
1463
+
1464
+ - Preserve tracked project-owned Bundler binstubs during template bootstrap.
1465
+
1466
+ - Preserve existing Version module includes when templating version files.
1467
+
1468
+ - Generated workflows now pin the setup-ruby-flash revision that supports compatibility-bundle retries.
1469
+
1470
+ - Debug requires generated by templating now remain opt-in and disabled in CI
1471
+
1472
+ - Define the Discord badge reference in generated CONTRIBUTING.md files.
1473
+
1474
+ - Restore legacy LICENSE.txt and workflow cleanup during templating, and treat falsey TSLP_DEV values as unset.
1475
+
1476
+ - Migrate MIT LICENSE.txt copyright notices safely and preserve custom license files with an unlabelled LICENSE.md link.
1477
+
1478
+ - Keep git-blame copyright facts authoritative when migrating legacy MIT LICENSE.txt files.
1479
+
1480
+ - Monorepo subgem mise templates no longer enforce aggregate coverage thresholds during per-gem release checks.
1481
+
1482
+ - Exclude the intentional vHEAD.gemfile appraisal filename from templated RuboCop filename checks.
1483
+
1484
+ - Include the canonical Rakefile scaffold in monorepo subgem templates.
1485
+
1486
+ - Resolve all local StructuredMerge sibling dependencies in isolated require-boundary tests.
1487
+
1488
+ ## [7.0.0] - 2026-05-05
1489
+
1490
+ - TAG: [v7.0.0][7.0.0t]
1491
+
1492
+ ### Added
1493
+
1494
+ - Released kettle-jem as part of the initial StructuredMerge Ruby 7.0.0 gem set.
1495
+ - Included packaged templates and parser-backed merge support for Ruby gem templating.
1496
+
1497
+ [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.3...HEAD
1498
+ [7.1.3]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.2...v7.1.3
1499
+ [7.1.3t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.3
1500
+ [7.1.2]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.1...v7.1.2
1501
+ [7.1.2t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.2
1502
+ [7.1.1]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.0.0...v7.1.1
1503
+ [7.1.1t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.1
1504
+ [7.0.0]: https://github.com/structuredmerge/structuredmerge-ruby/compare/0aae485e7ca20583b73f8c146f467a64e526ca41...v7.0.0
1505
+ [7.0.0t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.0.0