kettle-dev 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81a506b1bf2188f003f54bfcb7626eb8240603ef203818cc7ed3bf28d6732ca7
4
- data.tar.gz: 97fa9a80a4f2a85e62ff8b045c6404ed256562166d339bb333742f8a7db796cf
3
+ metadata.gz: b24de5e23880095309ef51620dd87613c13465a73b0203112e2637db237d1de8
4
+ data.tar.gz: 89cdad7e0b115974c4c80fe2caad474ccc30d15eff044aceca9f1e6c2ea85dd2
5
5
  SHA512:
6
- metadata.gz: 9dc856a6fe6db2294b387870c5e1ce4bdc32c729b80fea98c53ffbbc1d5f0776c4ced4545ecc0db2ba34892afa3a6a8bf4577824c1a4c0c071be2a9255b6a29b
7
- data.tar.gz: c6793a8ee249cc47ab8793d834b6f218a074456001208a7cfe33353c3bd5b9a6cbcae5b0f6ebd2c26637eff5760421a04a1d499d2b794314c7277e7ec86cbac6
6
+ metadata.gz: fe49fa0aa98430895ae852970aec9d22a0c59f21e1c558f34fa0f86867e9dfdd52aac2eccfdfa4c4cad71dc832d6abd001975e72896f00a68341302a1e8e68d9
7
+ data.tar.gz: bf796cfa87ce767b0d1420c03c822083fa1d5a09690963edc43b3c06593ded4b2fe722f1c59174b19265a5bf2b16e4a2709e0c450ad41fbe95d630f50895eb33
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,40 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.6] - 2026-05-31
34
+
35
+ - TAG: [v2.0.6][2.0.6t]
36
+ - COVERAGE: 93.14% -- 2961/3179 lines in 25 files
37
+ - BRANCH COVERAGE: 76.95% -- 1205/1566 branches in 25 files
38
+ - 75.93% documented
39
+
40
+ ### Added
41
+
42
+ - `kettle-changelog` now supports monorepo version files, allowing release
43
+ preparation for gems whose version constants live below subproject roots.
44
+
45
+ ### Changed
46
+
47
+ - Refreshed generated `kettle-jem` template output, including
48
+ `.structuredmerge` configuration, Git diff driver setup, RuboCop-LTS RSpec
49
+ style dependencies, and release task wiring.
50
+
51
+ - Updated the user-maintained README usage sections to describe the current
52
+ kettle-dev task, changelog, release, and kettle-jem setup boundaries.
53
+ - Corrected the deprecated `kettle-dev-setup` documentation and shim output to
54
+ point at the real `kettle-jem setup` command.
55
+ - Refreshed the README with current kettle-jem logo templating, including
56
+ 128px HTML logo output and the Ruby Toolbox language-logo link.
57
+ - Moved the generated related-org and Ruby README logos from the H1 to the
58
+ Synopsis heading with the current kettle-jem width defaults.
59
+ - Added the generated README note that identifies kettle-jem and
60
+ StructuredMerge as the templating and merge-contract tooling.
61
+
62
+ ### Fixed
63
+
64
+ - Regenerated the spec helper so `kettle-dev` is required only after coverage
65
+ bootstrap setup.
66
+
33
67
  ## [2.0.5] - 2026-05-28
34
68
 
35
69
  - TAG: [v2.0.5][2.0.5t]
@@ -1812,7 +1846,9 @@ Please file a bug if you notice a violation of semantic versioning.
1812
1846
  - Selecting will run the selected workflow via `act`
1813
1847
  - This may move to its own gem in the future.
1814
1848
 
1815
- [Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v2.0.5...HEAD
1849
+ [Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v2.0.6...HEAD
1850
+ [2.0.6]: https://github.com/kettle-rb/kettle-dev/compare/v2.0.5...v2.0.6
1851
+ [2.0.6t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v2.0.6
1816
1852
  [2.0.5]: https://github.com/kettle-rb/kettle-dev/compare/v2.0.4...v2.0.5
1817
1853
  [2.0.5t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v2.0.5
1818
1854
  [2.0.4]: https://github.com/kettle-rb/kettle-dev/compare/v2.0.3...v2.0.4
data/CONTRIBUTING.md CHANGED
@@ -102,13 +102,29 @@ Git hooks and commit message helpers (exe/kettle-commit-msg)
102
102
  - GIT_HOOK_FOOTER_SENTINEL: Required when footer append is enabled — a unique first-line sentinel to prevent duplicates
103
103
  - GIT_HOOK_FOOTER_APPEND_DEBUG: Extra debug output in the footer template (true/false)
104
104
 
105
+ Git diff driver setup
106
+ - Local setup writes repository `.gitattributes` entries so this checkout uses StructuredMerge semantic diffs.
107
+ - Global setup registers `diff.smorg-*` commands once in the user Git config; use it when you work across several StructuredMerge-enabled repositories.
108
+ - Include-file setup writes `.git/smorg/config` and includes it from local Git config, keeping command registrations out of the repository files.
109
+ - Git hosting forges generally ignore external diff drivers, so pull request views may still show raw textual diffs even when local `git diff` uses semantic drivers.
110
+
111
+ ```console
112
+ K_JEM_TEMPLATING=true bundle exec kettle-jem install
113
+ ```
114
+
115
+ Troubleshooting Git diffs
116
+ - Use `git diff --no-ext-diff` to compare against Git's built-in diff output.
117
+ - Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect.
118
+ - If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --get-regexp '^diff\.smorg-'`.
119
+ - To remove managed local entries, run `K_JEM_TEMPLATING=true bundle exec kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`.
120
+
105
121
  For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
106
122
 
107
123
  ## Appraisals
108
124
 
109
125
  From time to time the [appraisal2][🚎appraisal2] gemfiles in `gemfiles/` will need to be updated.
110
126
  Generated appraisal and CI workflow floors are controlled by `ruby.test_minimum`
111
- in `.kettle-jem.yml`; this project was templated with `ruby.test_minimum: 2.4`.
127
+ in `.structuredmerge/kettle-jem.yml`; this project was templated with `ruby.test_minimum: 2.4`.
112
128
  That value describes the lowest Ruby version expected to run the test/development
113
129
  toolchain, and it may be higher than the gemspec runtime floor.
114
130
 
data/README.md CHANGED
@@ -1,17 +1,10 @@
1
- [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-floss-i]][🖼️galtzo-floss] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-rb Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-rb-i]][🖼️kettle-rb]
2
-
3
- [🖼️galtzo-floss-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
- [🖼️galtzo-floss]: https://discord.gg/3qme4XHNKN
5
- [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
6
- [🖼️ruby-lang]: https://www.ruby-lang.org/
7
- [🖼️kettle-rb-i]: https://logos.galtzo.com/assets/images/kettle-rb/avatar-192px.svg
8
- [🖼️kettle-rb]: https://github.com/kettle-rb
1
+ <a href="https://github.com/kettle-rb"><img alt="kettle-rb Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-rb/avatar-128px.svg" width="14%" align="right"/></a>
9
2
 
10
3
  # 🍲 Kettle::Dev
11
4
 
12
- [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL]
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
13
6
 
14
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-floss], as I may have missed the [discord notification][🖼️galtzo-floss].
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
15
8
 
16
9
  ---
17
10
 
@@ -26,187 +19,70 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta
26
19
 
27
20
  </details>
28
21
 
29
- ## 🌻 Synopsis
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
30
23
 
31
- Run the one-time project bootstrapper:
24
+ Kettle::Dev is the development, CI, changelog, and release harness used by
25
+ kettle-rb gems. It installs rake tasks when loaded from a project's `Rakefile`,
26
+ and it ships command-line tools for changelog preparation, release automation,
27
+ multi-forge git remotes, commit-message hooks, and Open Collective README
28
+ updates.
32
29
 
33
- ```console
34
- kettle-dev-setup
35
- # Or if your middle name is "danger":
36
- # kettle-dev-setup --allowed=true --force
30
+ Add it to a gem's development dependencies, then load the rake integration:
31
+
32
+ ```ruby
33
+ # Gemfile
34
+ group :development, :test do
35
+ gem "kettle-dev", require: false
36
+ end
37
37
  ```
38
38
 
39
- This gem integrates tightly with [kettle-test](https://github.com/kettle-rb/kettle-test).
39
+ ```ruby
40
+ # Rakefile
41
+ require "kettle/dev"
42
+ ```
40
43
 
41
- Add this to your `spec/spec_helper.rb`:
44
+ For RSpec projects, use the matching test harness from
45
+ [kettle-test](https://github.com/kettle-rb/kettle-test):
42
46
 
43
47
  ```ruby
44
48
  require "kettle/test/rspec"
45
49
  ```
46
50
 
47
- Now you have many powerful development and testing tools at your disposal, all fully [documented](#-configuration) and tested.
48
-
49
- If you need to top-up an old setup to get the latest goodies, just re-template:
51
+ Project setup and template refreshes are now owned by
52
+ [kettle-jem](https://github.com/kettle-rb/kettle-jem), not kettle-dev:
50
53
 
51
54
  ```console
52
- bundle exec rake kettle:dev:install
55
+ gem install kettle-jem
56
+ kettle-jem setup
53
57
  ```
54
58
 
55
- Making sure to review the changes, and retain overwritten bits that matter.
59
+ Once a project is wired, the normal local development loop is:
56
60
 
57
- Later, when ready to release:
61
+ ```console
62
+ bin/rake
63
+ bin/rake rubocop_gradual:autocorrect
64
+ bin/rake yard
65
+ ```
66
+
67
+ And the maintainer release flow is:
58
68
 
59
69
  ```console
70
+ bin/kettle-pre-release
60
71
  bin/kettle-changelog
61
72
  bin/kettle-release
62
73
  ```
63
74
 
64
- ### The `*-merge` Gem Family
65
-
66
- The `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree_haver][tree_haver], which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
67
-
68
- | Gem | Version / CI | Language<br>/ Format | Parser Backend(s) | Description |
69
- |------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------:|----------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
70
- | [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] <br/> [![CI][tree_haver-ci-i]][tree_haver-ci] | Multi | Supported Backends: MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
71
- | [ast-merge][ast-merge] | [![Version][ast-merge-gem-i]][ast-merge-gem] <br/> [![CI][ast-merge-ci-i]][ast-merge-ci] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
72
- | [bash-merge][bash-merge] | [![Version][bash-merge-gem-i]][bash-merge-gem] <br/> [![CI][bash-merge-ci-i]][bash-merge-ci] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
73
- | [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem] <br/> [![CI][commonmarker-merge-ci-i]][commonmarker-merge-ci] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
74
- | [dotenv-merge][dotenv-merge] | [![Version][dotenv-merge-gem-i]][dotenv-merge-gem] <br/> [![CI][dotenv-merge-ci-i]][dotenv-merge-ci] | Dotenv | internal | Smart merge for `.env` files |
75
- | [json-merge][json-merge] | [![Version][json-merge-gem-i]][json-merge-gem] <br/> [![CI][json-merge-ci-i]][json-merge-ci] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
76
- | [jsonc-merge][jsonc-merge] | [![Version][jsonc-merge-gem-i]][jsonc-merge-gem] <br/> [![CI][jsonc-merge-ci-i]][jsonc-merge-ci] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
77
- | [markdown-merge][markdown-merge] | [![Version][markdown-merge-gem-i]][markdown-merge-gem] <br/> [![CI][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver), [Parslet][parslet] | **Foundation**: Shared base for Markdown mergers with inner code block merging |
78
- | [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] <br/> [![CI][markly-merge-ci-i]][markly-merge-ci] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
79
- | [prism-merge][prism-merge] | [![Version][prism-merge-gem-i]][prism-merge-gem] <br/> [![CI][prism-merge-ci-i]][prism-merge-ci] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
80
- | [psych-merge][psych-merge] | [![Version][psych-merge-gem-i]][psych-merge-gem] <br/> [![CI][psych-merge-ci-i]][psych-merge-ci] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
81
- | [rbs-merge][rbs-merge] | [![Version][rbs-merge-gem-i]][rbs-merge-gem] <br/> [![CI][rbs-merge-ci-i]][rbs-merge-ci] | RBS | [tree-sitter-rbs][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem) | Smart merge for Ruby type signatures |
82
- | [toml-merge][toml-merge] | [![Version][toml-merge-gem-i]][toml-merge-gem] <br/> [![CI][toml-merge-ci-i]][toml-merge-ci] | TOML | [Parslet + toml][toml], [Citrus + toml-rb][toml-rb], [tree-sitter-toml][ts-toml] (all via tree_haver) | Smart merge for TOML files |
83
-
84
- #### Backend Platform Compatibility
85
-
86
- tree_haver supports multiple parsing backends, but not all backends work on all Ruby platforms:
87
-
88
- | Platform 👉️<br> TreeHaver Backend 👇️ | MRI | JRuby | TruffleRuby | Notes |
89
- |-------------------------------------------------|:---:|:-----:|:-----------:|----------------------------------------------------------------------------|
90
- | **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) | ✅ | ❌ | ❌ | C extension, MRI only |
91
- | **Rust** ([tree_stump][tree_stump]) | ✅ | ❌ | ❌ | Rust extension via magnus/rb-sys, MRI only |
92
- | **FFI** ([ffi][ffi]) | ✅ | ✅ | ❌ | TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |
93
- | **Java** ([jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
94
- | **Prism** ([prism][prism]) | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
95
- | **Psych** ([psych][psych]) | ✅ | ✅ | ✅ | YAML parsing, stdlib |
96
- | **Citrus** ([citrus][citrus]) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
97
- | **Parslet** ([parslet][parslet]) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
98
- | **Commonmarker** ([commonmarker][commonmarker]) | ✅ | ❌ | ❓ | Rust extension for Markdown (via [commonmarker-merge][commonmarker-merge]) |
99
- | **Markly** ([markly][markly]) | ✅ | ❌ | ❓ | C extension for Markdown (via [markly-merge][markly-merge]) |
100
-
101
- **Legend**: ✅ = Works, ❌ = Does not work, ❓ = Untested
102
-
103
- **Why some backends don't work on certain platforms**:
104
-
105
- - **JRuby**: Runs on the JVM; cannot load native C/Rust extensions (`.so` files)
106
- - **TruffleRuby**: Has C API emulation via Sulong/LLVM, but it doesn't expose all MRI internals that native extensions require (e.g., `RBasic.flags`, `rb_gc_writebarrier`)
107
- - **FFI on TruffleRuby**: TruffleRuby's FFI implementation doesn't support returning structs by value, which tree-sitter's C API requires
108
-
109
- **Example implementations** for the gem templating use case:
110
-
111
- | Gem | Purpose | Description |
112
- |--------------------------|-----------------|-----------------------------------------------|
113
- | [kettle-dev][kettle-dev] | Gem Development | Development tooling, CI automation, and release workflows |
114
- | [kettle-jem][kettle-jem] | Gem Templating | Gem template library with smart merge support |
115
-
116
- [tree_haver]: https://github.com/kettle-rb/tree_haver
117
- [ast-merge]: https://github.com/kettle-rb/ast-merge
118
- [prism-merge]: https://github.com/kettle-rb/prism-merge
119
- [psych-merge]: https://github.com/kettle-rb/psych-merge
120
- [json-merge]: https://github.com/kettle-rb/json-merge
121
- [jsonc-merge]: https://github.com/kettle-rb/jsonc-merge
122
- [bash-merge]: https://github.com/kettle-rb/bash-merge
123
- [rbs-merge]: https://github.com/kettle-rb/rbs-merge
124
- [dotenv-merge]: https://github.com/kettle-rb/dotenv-merge
125
- [toml-merge]: https://github.com/kettle-rb/toml-merge
126
- [markdown-merge]: https://github.com/kettle-rb/markdown-merge
127
- [markly-merge]: https://github.com/kettle-rb/markly-merge
128
- [commonmarker-merge]: https://github.com/kettle-rb/commonmarker-merge
129
- [kettle-dev]: https://github.com/kettle-rb/kettle-dev
130
- [kettle-jem]: https://github.com/kettle-rb/kettle-jem
131
- [tree_haver-gem]: https://bestgems.org/gems/tree_haver
132
- [ast-merge-gem]: https://bestgems.org/gems/ast-merge
133
- [prism-merge-gem]: https://bestgems.org/gems/prism-merge
134
- [psych-merge-gem]: https://bestgems.org/gems/psych-merge
135
- [json-merge-gem]: https://bestgems.org/gems/json-merge
136
- [jsonc-merge-gem]: https://bestgems.org/gems/jsonc-merge
137
- [bash-merge-gem]: https://bestgems.org/gems/bash-merge
138
- [rbs-merge-gem]: https://bestgems.org/gems/rbs-merge
139
- [dotenv-merge-gem]: https://bestgems.org/gems/dotenv-merge
140
- [toml-merge-gem]: https://bestgems.org/gems/toml-merge
141
- [markdown-merge-gem]: https://bestgems.org/gems/markdown-merge
142
- [markly-merge-gem]: https://bestgems.org/gems/markly-merge
143
- [commonmarker-merge-gem]: https://bestgems.org/gems/commonmarker-merge
144
- [kettle-dev-gem]: https://bestgems.org/gems/kettle-dev
145
- [kettle-jem-gem]: https://bestgems.org/gems/kettle-jem
146
- [tree_haver-gem-i]: https://img.shields.io/gem/v/tree_haver.svg
147
- [ast-merge-gem-i]: https://img.shields.io/gem/v/ast-merge.svg
148
- [prism-merge-gem-i]: https://img.shields.io/gem/v/prism-merge.svg
149
- [psych-merge-gem-i]: https://img.shields.io/gem/v/psych-merge.svg
150
- [json-merge-gem-i]: https://img.shields.io/gem/v/json-merge.svg
151
- [jsonc-merge-gem-i]: https://img.shields.io/gem/v/jsonc-merge.svg
152
- [bash-merge-gem-i]: https://img.shields.io/gem/v/bash-merge.svg
153
- [rbs-merge-gem-i]: https://img.shields.io/gem/v/rbs-merge.svg
154
- [dotenv-merge-gem-i]: https://img.shields.io/gem/v/dotenv-merge.svg
155
- [toml-merge-gem-i]: https://img.shields.io/gem/v/toml-merge.svg
156
- [markdown-merge-gem-i]: https://img.shields.io/gem/v/markdown-merge.svg
157
- [markly-merge-gem-i]: https://img.shields.io/gem/v/markly-merge.svg
158
- [commonmarker-merge-gem-i]: https://img.shields.io/gem/v/commonmarker-merge.svg
159
- [kettle-dev-gem-i]: https://img.shields.io/gem/v/kettle-dev.svg
160
- [kettle-jem-gem-i]: https://img.shields.io/gem/v/kettle-jem.svg
161
- [tree_haver-ci-i]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml/badge.svg
162
- [ast-merge-ci-i]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml/badge.svg
163
- [prism-merge-ci-i]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml/badge.svg
164
- [psych-merge-ci-i]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml/badge.svg
165
- [json-merge-ci-i]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml/badge.svg
166
- [jsonc-merge-ci-i]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml/badge.svg
167
- [bash-merge-ci-i]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml/badge.svg
168
- [rbs-merge-ci-i]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml/badge.svg
169
- [dotenv-merge-ci-i]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml/badge.svg
170
- [toml-merge-ci-i]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml/badge.svg
171
- [markdown-merge-ci-i]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml/badge.svg
172
- [markly-merge-ci-i]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml/badge.svg
173
- [commonmarker-merge-ci-i]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml/badge.svg
174
- [kettle-dev-ci-i]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml/badge.svg
175
- [kettle-jem-ci-i]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml/badge.svg
176
- [tree_haver-ci]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml
177
- [ast-merge-ci]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml
178
- [prism-merge-ci]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml
179
- [psych-merge-ci]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml
180
- [json-merge-ci]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml
181
- [jsonc-merge-ci]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml
182
- [bash-merge-ci]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml
183
- [rbs-merge-ci]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml
184
- [dotenv-merge-ci]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml
185
- [toml-merge-ci]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml
186
- [markdown-merge-ci]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml
187
- [markly-merge-ci]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml
188
- [commonmarker-merge-ci]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml
189
- [kettle-dev-ci]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml
190
- [kettle-jem-ci]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml
191
- [prism]: https://github.com/ruby/prism
192
- [psych]: https://github.com/ruby/psych
193
- [ffi]: https://github.com/ffi/ffi
194
- [ts-json]: https://github.com/tree-sitter/tree-sitter-json
195
- [ts-jsonc]: https://gitlab.com/WhyNotHugo/tree-sitter-jsonc
196
- [ts-bash]: https://github.com/tree-sitter/tree-sitter-bash
197
- [ts-rbs]: https://github.com/joker1007/tree-sitter-rbs
198
- [ts-toml]: https://github.com/tree-sitter-grammars/tree-sitter-toml
199
- [dotenv]: https://github.com/bkeepers/dotenv
200
- [rbs]: https://github.com/ruby/rbs
201
- [toml-rb]: https://github.com/emancu/toml-rb
202
- [toml]: https://github.com/jm/toml
203
- [markly]: https://github.com/ioquatix/markly
204
- [commonmarker]: https://github.com/gjtorikian/commonmarker
205
- [ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter
206
- [tree_stump]: https://github.com/joker1007/tree_stump
207
- [jtreesitter]: https://central.sonatype.com/artifact/io.github.tree-sitter/jtreesitter
208
- [citrus]: https://github.com/mjackson/citrus
209
- [parslet]: https://github.com/kschiess/parslet
75
+ ### What kettle-dev provides
76
+
77
+ - Rake task loading from `require "kettle/dev"`.
78
+ - RuboCop Gradual, Reek, YARD, appraisal, local CI, benchmark, and coverage task wiring.
79
+ - `kettle-changelog` for moving Unreleased changelog notes into a versioned release section with coverage and documentation stats.
80
+ - `kettle-release` for the canonical kettle-rb release flow.
81
+ - `kettle-pre-release` for release readiness checks.
82
+ - `kettle-dvcs` for normalizing GitHub, GitLab, Codeberg, and aggregate remotes.
83
+ - `kettle-commit-msg` for shared commit-message hook behavior.
84
+ - `kettle-readme-backers` for Open Collective README sections.
85
+ - `kettle-dev-setup` as a deprecated compatibility executable that exits with instructions to use kettle-jem.
210
86
 
211
87
  ## 💡 Info you can shake a stick at
212
88
 
@@ -292,19 +168,22 @@ gem install kettle-dev
292
168
 
293
169
  ## ⚙️ Configuration
294
170
 
295
- Note on executables vs Rake tasks
171
+ Kettle-dev has two integration surfaces:
296
172
 
297
- - Executable scripts provided by this gem (exe/\* and installed binstubs) work when the gem is installed as a system gem (gem install kettle-dev). They do not require the gem to be in your bundle to run.
298
- - The Rake tasks provided by this gem require kettle-dev to be declared as a development dependency in your Gemfile and loaded in your project's Rakefile. Ensure your Gemfile includes:
299
- ```ruby
300
- group :development do
301
- gem "kettle-dev", require: false
302
- end
303
- ```
304
- And your Rakefile loads the gem's tasks, e.g.:
305
- ```ruby
306
- require "kettle/dev"
307
- ```
173
+ - Executable scripts in `exe/`, or binstubs generated from them, can run when
174
+ `kettle-dev` is installed and loadable.
175
+ - Rake tasks are registered by adding `kettle-dev` to the project's development
176
+ dependencies and requiring `kettle/dev` from the project's `Rakefile`.
177
+
178
+ ```ruby
179
+ group :development, :test do
180
+ gem "kettle-dev", require: false
181
+ end
182
+ ```
183
+
184
+ ```ruby
185
+ require "kettle/dev"
186
+ ```
308
187
 
309
188
  ### RSpec
310
189
 
@@ -337,78 +216,33 @@ Add to your `Rakefile`:
337
216
  require "kettle/dev"
338
217
  ```
339
218
 
340
- Then run the one-time project bootstrapper:
219
+ This loads the kettle-dev rake task set. Current project setup and template
220
+ refreshes should be run through kettle-jem:
341
221
 
342
222
  ```console
343
- kettle-dev-setup
344
- # Or to accept all defaults:
345
- kettle-dev-setup --allowed=true --force
223
+ gem install kettle-jem
224
+ kettle-jem setup
346
225
  ```
347
226
 
348
- You'll be able to compare the changes with your diff tool, and certainly revert some of them.
349
-
350
- For your protection:
227
+ `kettle-dev-setup` is still shipped for compatibility, but it now exits with a
228
+ message explaining that setup and templating moved to kettle-jem.
351
229
 
352
- - it won't run if git doesn't start out porcelain clean.
353
- After bootstrapping, to update the template to the latest version from a new release of this gem, run:
354
-
355
- <!-- end list -->
230
+ Useful registered tasks include:
356
231
 
357
- ```console
358
- bundle exec rake kettle:dev:install
359
- ```
232
+ - `rubocop_gradual:autocorrect` and `rubocop_gradual:check`
233
+ - `reek` and `reek:update`
234
+ - `yard`
235
+ - `appraisal:install`, `appraisal:generate`, `appraisal:update`, and `appraisal:reset`
236
+ - `ci:act`
237
+ - `bench`
238
+ - `kettle:jem:template` and `kettle:jem:selftest`, when kettle-jem's task integration is available
360
239
 
361
- If git status is not clean it will abort.
362
- It may have some prompts, which can mostly be avoided by running with options:
240
+ Install binstubs when a project wants local `bin/kettle-*` commands:
363
241
 
364
242
  ```console
365
- # DANGER: options to reduce prompts will overwrite files without asking.
366
- bundle exec rake kettle:dev:install allowed=true force=true
243
+ bundle binstubs kettle-dev --path bin
367
244
  ```
368
245
 
369
- Hopefully, all the files that get overwritten are tracked in git\!
370
- I wrote this for myself, and it fits my patterns of development.
371
-
372
- The install task will write a report at the end with:
373
-
374
- 1. A file list summary of the changes made.
375
- 2. Next steps for using the tools.
376
- 3. A warning about .env.local (DO NOT COMMIT IT, as it will likely have secrets added)
377
- That’s it. Once installed, kettle-dev:
378
-
379
- <!-- end list -->
380
-
381
- - Registers RuboCop-LTS tasks and wires your default Rake task to run the gradual linter.
382
- - Locally: default task prefers `rubocop_gradual:autocorrect`.
383
- - On CI (`CI=true`): default task prefers `rubocop_gradual:check`.
384
- - Integrates optional coverage tasks via kettle-soup-cover (enabled locally when present).
385
- - Adds gem-shipped Rake tasks from `lib/kettle/dev/rakelib`, including:
386
- - `ci:act` — interactive selector for running GitHub Actions workflows via `act`.
387
- - `kettle:dev:install` — copies this repo’s .github automation, offers to install .git-hooks templates, and overwrites many files in your project.
388
- - Grapheme syncing: detects the grapheme (e.g., emoji) immediately following the first `#` H1 in README.md and ensures the same grapheme, followed by a single space, prefixes both `spec.summary` and `spec.description` in your gemspec. If the H1 has none, you’ll be prompted to enter one; tests use an input adapter, so runs never hang in CI.
389
- - option: force: When truthy (1, true, y, yes), treat all y/N prompts as Yes. Useful for non-interactive runs or to accept defaults quickly. Example: `bundle exec rake kettle:dev:install force=true`
390
- - option: allowed: When truthy (1, true, y, yes), resume task after you have reviewed `.envrc`/`.env.local` and run `direnv allow`. If either file is created or updated, the task will abort with instructions unless `allowed=true` is present. Example: `bundle exec rake kettle:dev:install allowed=true`
391
- - option: only: A comma-separated list of glob patterns to include in templating. Any destination file whose path+filename does not match one of the patterns is excluded. Patterns are matched relative to your project root. Examples: `only="README.md,.github/**"`, `only="docs/**,lib/**/*.rb"`.
392
- - option: include: A comma-separated list of glob patterns that opt-in additional, non-default files. Currently, `.github/workflows/discord-notifier.yml` is not copied by default and will only be copied when `include` matches it (e.g., `include=".github/workflows/discord-notifier.yml"`).
393
- - `kettle:jem:template` (provided by [kettle-jem][kettle-jem]) — templates files from this gem into your project (e.g., .github workflows, .devcontainer, .qlty, modular Gemfiles, README/CONTRIBUTING stubs). You can run this independently to refresh templates without the extra install prompts.
394
- - option: force: When truthy (1, true, y, yes), treat all y/N prompts as Yes. Useful for non-interactive runs or to accept defaults quickly. Example: `bundle exec rake kettle:dev:install force=true`
395
- - option: allowed: When truthy (1, true, y, yes), resume task after you have reviewed `.envrc`/`.env.local` and run `direnv allow`. If either file is created or updated, the task will abort with instructions unless `allowed=true` is present. Example: `bundle exec rake kettle:jem:template allowed=true`
396
- - option: only: Same as for install; limits which destination files are written based on glob patterns relative to the project root.
397
- - option: include: Same as for install; opts into optional files (e.g., `.github/workflows/discord-notifier.yml`).
398
- Recommended one-time setup in your project:
399
- - Install binstubs so kettle-dev executables are available under `./bin`:
400
- - `bundle binstubs kettle-dev --path bin`
401
- - Use direnv (recommended) so `./bin` is on PATH automatically:
402
- - `brew install direnv`
403
- - In your project’s `.envrc` add:
404
- - `# Run any command in this library's bin/ without the bin/ prefix!`
405
- - `PATH_add bin`
406
- - Configure shared git hooks path (optional, recommended):
407
- - `git config --global core.hooksPath .git-hooks`
408
- - Install project automation and sample hooks/templates:
409
- - `bundle exec rake kettle:dev:install` and follow prompts (copies .github and installs .git-hooks templates locally or globally).
410
- See the next section for environment variables that tweak behavior.
411
-
412
246
  ### Environment Variables
413
247
 
414
248
  Below are the primary environment variables recognized by kettle-dev (and its integrated tools). Unless otherwise noted, set boolean values to the string "true" to enable.
@@ -454,66 +288,39 @@ For a quick starting point, this repository’s `.envrc` shows sane defaults, an
454
288
 
455
289
  ## 🔧 Basic Usage
456
290
 
457
- Common flows
458
-
459
- - Default quality workflow (locally):
460
- - `bundle exec rake` — runs the curated default task set (gradual RuboCop autocorrect, coverage if available, and other local tasks). On CI `CI=true`, the default task is adjusted to be CI-friendly.
461
- - Run specs:
462
- - `bin/rspec` or `bundle exec rspec`
463
- - To run a subset without failing coverage thresholds: `K_SOUP_COV_MIN_HARD=false bin/rspec spec/path/to/file_spec.rb`
464
- - To produce multiple coverage reports: `K_SOUP_COV_FORMATTERS="html,xml,rcov,lcov,json,tty" bin/rspec`
465
- - Linting (Gradual):
466
- - `bundle exec rake rubocop_gradual:autocorrect`
467
- - `bundle exec rake rubocop_gradual:check` (CI-friendly)
468
- - Reek and docs:
469
- - `bundle exec rake reek` or `bundle exec rake reek:update`
470
- - `bundle exec rake yard`
471
- [Appraisals][💎appraisal2] helpers
472
- - `bundle exec rake appraisal:isntall` — First time Appraisal setup.
473
- - `bundle exec rake appraisal:update` — Update Appraisal gemfiles and run RuboCop Gradual autocorrect.
474
- - `bundle exec rake appraisal:reset` — Delete all Appraisal lockfiles in gemfiles/ (\*.gemfile.lock). Useful before regenerating appraisals or when switching Ruby versions.
475
- GitHub Actions local runner helper
476
- - `bundle exec rake ci:act` — interactive menu shows workflows from `.github/workflows` with live status and short codes (first 3 letters of file name). Type a number or short code.
477
- - Non-interactive: `bundle exec rake ci:act[loc]` (short code), or `bundle exec rake ci:act[locked_deps.yml]` (filename).
478
- Setup tokens for API status (GitHub and GitLab)
479
- - Purpose: ci:act displays the latest status for GitHub Actions runs and (when applicable) the latest GitLab pipeline for the current branch. Unauthenticated requests are rate-limited; private repositories require tokens. Provide tokens to get reliable status.
480
- - GitHub token (recommended: fine-grained):
481
- - Where to create: https://github.com/settings/personal-access-tokens
482
- - Fine-grained: “Tokens (fine-grained)” → Generate new token
483
- - Classic (fallback): “Tokens (classic)” → Generate new token
484
- - Minimum permissions:
485
- - Fine-grained: Repository access: Read-only for the target repository (or your org); Permissions → Actions: Read
486
- - Classic: For public repos, no scopes are strictly required, but rate limits are very low; for private repos, include the repo scope
487
- - Add to environment (`.env.local` via `direnv`):
488
- - `GITHUB_TOKEN=your_token_here` (or `GH_TOKEN=…`)
489
- - GitLab token:
490
- - Where to create: [gitlab.com](https://gitlab.com/-/user_settings/personal_access_tokens)
491
- - Minimum scope: `read_api` (sufficient to read pipelines)
492
- - Add to environment (.env.local via direnv):
493
- - `GITLAB_TOKEN=your_token_here` (or `GL_TOKEN=…`)
494
- - Load environment:
495
- - Save tokens in `.env.local` (never commit this file), then run: `direnv allow`
496
- - Verify:
497
- - Run: bundle exec rake ci:act
498
- - The header will include Repo/Upstream/HEAD; entries will show “Latest GHA …” and “Latest GL … pipeline” with emoji status. On failure to authenticate or rate-limit, you’ll see a brief error/result code.
499
- Project automation bootstrap
500
- - `bundle exec rake kettle:dev:install` — copies the library’s `.github` folder into your project and offers to install `.git-hooks` templates locally or globally.
501
- - `bundle exec rake kettle:jem:template` — runs only the templating step used by install; useful to re-apply updates to templates (.github workflows, .devcontainer, .qlty, modular Gemfiles, README, and friends) without the `install` task’s extra prompts.
502
- - Also copies maintainer certificate `certs/pboling.pem` into your project when present (used for signed gem builds).
503
- - README carry-over during templating: when your project’s README.md is replaced by the template, selected sections from your existing README are preserved and merged into the new one. Specifically, the task carries over the following sections (matched case-insensitively):
504
- - "Synopsis"
505
- - "Configuration"
506
- - "Basic Usage"
507
- - Any section whose heading starts with "Note:" at any heading level (for example: "\# NOTE: …", "\#\# Note: …", or "\#\#\# note: …").
508
- - Headings are recognized at any level using Markdown hashes (\#, \#\#, \#\#\#, …).
509
- - Notes about task options:
510
- - Non-interactive confirmations: append `force=true` to accept all y/N prompts as Yes, e.g., `bundle exec rake kettle:jem:template force=true`.
511
- - direnv review flow: if `.envrc` or `.env.local` is created or updated, the task stops and asks you to run `direnv allow`. After you review and allow, resume with `allowed=true`:
512
- - `bundle exec rake kettle:jem:template allowed=true`
513
- - `bundle exec rake kettle:dev:install allowed=true`
514
- - After that, set up binstubs and direnv for convenience:
515
- - `bundle binstubs kettle-dev --path bin`
516
- - Add to `.envrc`: `PATH_add bin` (so `bin/` tools run without the prefix)
291
+ Common local workflows:
292
+
293
+ - `bundle exec rake` runs the curated default task set. Locally this favors
294
+ autocorrection where supported; with `CI=true` it favors check-only behavior.
295
+ - `bin/rspec` or `bundle exec rspec` runs specs.
296
+ - `K_SOUP_COV_MIN_HARD=false bin/rspec spec/path/to/file_spec.rb` is useful for
297
+ focused spec runs that should not fail whole-suite coverage thresholds.
298
+ - `bundle exec rake rubocop_gradual:autocorrect` applies gradual RuboCop fixes.
299
+ - `bundle exec rake rubocop_gradual:check` is the CI-friendly RuboCop Gradual task.
300
+ - `bundle exec rake reek` and `bundle exec rake reek:update` run or refresh Reek.
301
+ - `bundle exec rake yard` builds API documentation.
302
+ - `bundle exec rake appraisal:install` performs first-time Appraisal setup.
303
+ - `bundle exec rake appraisal:generate` regenerates Appraisal gemfiles.
304
+ - `bundle exec rake appraisal:update` updates Appraisal locks and applies gradual RuboCop autocorrect.
305
+ - `bundle exec rake appraisal:reset` removes Appraisal lockfiles below `gemfiles/`.
306
+
307
+ GitHub Actions local runner helper:
308
+
309
+ - `bundle exec rake ci:act` opens an interactive workflow selector using
310
+ `.github/workflows` and live CI status when tokens are available.
311
+ - `bundle exec rake ci:act[loc]` selects by short code.
312
+ - `bundle exec rake ci:act[locked_deps.yml]` selects by workflow filename.
313
+ - Set `GITHUB_TOKEN` or `GH_TOKEN` for GitHub Actions API status.
314
+ - Set `GITLAB_TOKEN` or `GL_TOKEN` for GitLab pipeline status.
315
+
316
+ Project automation and template refreshes:
317
+
318
+ - Use `kettle-jem setup` for first-time setup and `kettle-jem install` for
319
+ full template refreshes.
320
+ - When kettle-jem's rake integration is installed, run `bundle exec rake kettle:jem:template`
321
+ to refresh template-managed files.
322
+ - `kettle-dev-setup` is deprecated and intentionally exits with a migration
323
+ message pointing to kettle-jem.
517
324
 
518
325
  ### kettle-dvcs (normalize multi-forge remotes)
519
326
 
@@ -633,7 +440,7 @@ What it does:
633
440
  - Purpose: Append a standardized footer and optionally enforce branch naming rules when configured.
634
441
  - Usage:
635
442
  - Git invokes this with the path to the commit message file: `kettle-commit-msg .git/COMMIT_EDITMSG`
636
- - Install via `bundle exec rake kettle:dev:install` to copy hook templates into `.git-hooks` and wire them up.
443
+ - Install hook templates through kettle-jem setup/templating, then point git at the resulting hook path.
637
444
  - Behavior:
638
445
  - When `GIT_HOOK_BRANCH_VALIDATE=jira`, validates the current branch matches the pattern: `^(hotfix|bug|feature|candy)/[0-9]{8,}-…`.
639
446
  - If it matches and the commit message lacks the numeric ID, appends `[<type>][<id>]`.
@@ -648,23 +455,17 @@ What it does:
648
455
  ### Project bootstrap installer
649
456
 
650
457
  - Script: `exe/kettle-dev-setup` (run as `kettle-dev-setup`)
651
- - Purpose: Bootstrap a host gem repository to use kettle-dev’s tooling without manual steps.
458
+ - Status: Deprecated compatibility shim.
459
+ - Purpose: Direct users to kettle-jem, which now owns setup and templating.
652
460
  - Usage:
653
- - `kettle-dev-setup [options] [passthrough args]`
654
- - Options (mapped through to `rake kettle:dev:install`):
655
- - `--allowed=VAL` Pass `allowed=VAL` to acknowledge prior direnv allow, etc.
656
- - `--force` Pass `force=true` to accept prompts non-interactively.
657
- - `--hook_templates=VAL` Pass `hook_templates=VAL` to control git hook templating.
658
- - `--only=VAL` Pass `only=VAL` to restrict install scope.
659
- - `--include=VAL` Pass `include=VAL` to include optional files by glob (see notes below).
660
- - `-h`, `--help` Show help.
461
+ - `kettle-dev-setup`
661
462
  - Behavior:
662
- - Verifies a clean git working tree, presence of a Gemfile and a gemspec.
663
- - Syncs development dependencies from this gem’s example gemspec into the target gemspec (replacing or inserting `add_development_dependency` lines as needed).
664
- - Ensures `bin/setup` exists (copies from gem if missing) and replaces/creates the project’s `Rakefile` from `Rakefile.example`.
665
- - Runs `bin/setup`, then `bundle exec bundle binstubs --all`.
666
- - Stages and commits any bootstrap changes with message: `🎨 Template bootstrap by kettle-dev-setup v<version>`.
667
- - Executes `bin/rake kettle:dev:install` with the parsed passthrough args.
463
+ - Prints migration instructions.
464
+ - Exits non-zero.
465
+ - Does not modify the destination repository.
466
+ - Replacement:
467
+ - `gem install kettle-jem`
468
+ - `kettle-jem setup`
668
469
 
669
470
  ### Open Collective README updater
670
471
 
@@ -822,6 +623,8 @@ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
822
623
 
823
624
  ### Please give the project a star ⭐ ♥.
824
625
 
626
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
627
+
825
628
  Thanks for RTFM. ☺️
826
629
 
827
630
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
@@ -924,8 +727,6 @@ Thanks for RTFM. ☺️
924
727
  [🏀codecovi]: https://codecov.io/gh/kettle-rb/kettle-dev/graph/badge.svg
925
728
  [🏀coveralls]: https://coveralls.io/github/kettle-rb/kettle-dev?branch=main
926
729
  [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-rb/kettle-dev/badge.svg?branch=main
927
- [🖐codeQL]: https://github.com/kettle-rb/kettle-dev/security/code-scanning
928
- [🖐codeQL-img]: https://github.com/kettle-rb/kettle-dev/actions/workflows/codeql-analysis.yml/badge.svg
929
730
  [🚎ruby-2.4-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/ruby-2.4.yml
930
731
  [🚎ruby-2.5-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/ruby-2.5.yml
931
732
  [🚎ruby-2.6-wf]: https://github.com/kettle-rb/kettle-dev/actions/workflows/ruby-2.6.yml
@@ -1010,7 +811,7 @@ Thanks for RTFM. ☺️
1010
811
  [📌gitmoji]: https://gitmoji.dev
1011
812
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1012
813
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1013
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-3.180-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
814
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-3.179-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1014
815
  [🔐security]: https://github.com/kettle-rb/kettle-dev/blob/main/SECURITY.md
1015
816
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1016
817
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -1038,7 +839,7 @@ Thanks for RTFM. ☺️
1038
839
  | Package | kettle-dev |
1039
840
  | Description | 🍲 Kettle::Dev is a meta tool from kettle-rb to streamline development and testing. Acts as a shim dependency, pulling in many other dependencies, to give you OOTB productivity with a RubyGem, or Ruby app project. Configures a complete set of Rake tasks, for all the libraries is brings in, so they arrive ready to go. Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev |
1040
841
  | Homepage | https://github.com/kettle-rb/kettle-dev |
1041
- | Source | https://github.com/kettle-rb/kettle-dev/tree/v2.0.1 |
842
+ | Source | https://github.com/kettle-rb/kettle-dev/tree/v2.0.6 |
1042
843
  | License | `AGPL-3.0-only` |
1043
844
  | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-rb, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-dev, https://www.buymeacoffee.com/pboling |
1044
845
  <!-- kettle-jem:metadata:end -->
data/exe/kettle-changelog CHANGED
@@ -5,6 +5,7 @@
5
5
 
6
6
  # kettle-changelog: Generate a CHANGELOG.md entry for the current VERSION.
7
7
  # - Reads VERSION from lib/**/version.rb (must be unique across files)
8
+ # - Set K_CHANGELOG_VERSION_FILE to use a specific version.rb for monorepo roots
8
9
  # - Moves entries from the "Unreleased" section into a new versioned section
9
10
  # - Prepends 4 heading lines:
10
11
  # - TAG
@@ -67,6 +68,7 @@ begin
67
68
  Environment:
68
69
  K_CHANGELOG_STRICT=false Disable strict mode (equivalent to --no-strict flag)
69
70
  K_CHANGELOG_COVERAGE_HARD=false Disable coverage threshold hard-failure
71
+ K_CHANGELOG_VERSION_FILE=path Read VERSION from this file instead of lib/**/version.rb
70
72
 
71
73
  Prerequisites:
72
74
  - coverage/coverage.json present (run: bundle exec kettle-test with K_SOUP_COV_FORMATTERS=json to generate)
data/exe/kettle-dev-setup CHANGED
@@ -3,15 +3,15 @@
3
3
 
4
4
  # vim: set syntax=ruby
5
5
 
6
- # kettle-dev-setup has been replaced by kettle-jem-setup.
6
+ # kettle-dev-setup has been replaced by kettle-jem setup.
7
7
  # All setup and templating functionality has moved to the kettle-jem gem.
8
8
 
9
- $stderr.puts <<~MSG
9
+ warn <<~MSG
10
10
  kettle-dev-setup has been removed.
11
11
  Setup and templating functionality has moved to the kettle-jem gem.
12
12
 
13
- Please install kettle-jem and use kettle-jem-setup instead:
13
+ Please install kettle-jem and use kettle-jem setup instead:
14
14
  gem install kettle-jem
15
- kettle-jem-setup
15
+ kettle-jem setup
16
16
  MSG
17
17
  exit 1
@@ -299,18 +299,7 @@ module Kettle
299
299
  end
300
300
 
301
301
  def detect_version
302
- candidates = Dir[File.join(@root, "lib", "**", "version.rb")]
303
- abort("Could not find version.rb under lib/**.") if candidates.empty?
304
- versions = candidates.map do |path|
305
- content = File.read(path)
306
- m = content.match(/VERSION\s*=\s*(["'])([^"']+)\1/)
307
- next unless m
308
-
309
- m[2]
310
- end.compact
311
- abort("VERSION constant not found in #{@root}/lib/**/version.rb") if versions.none?
312
- abort("Multiple VERSION constants found to be out of sync (#{versions.inspect}) in #{@root}/lib/**/version.rb") unless versions.uniq.length == 1
313
- versions.first
302
+ Kettle::Dev::Versioning.detect_version(@root)
314
303
  end
315
304
 
316
305
  def extract_unreleased(content)
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Dev
5
5
  module Version
6
- VERSION = "2.0.5"
6
+ VERSION = "2.0.6"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -6,12 +6,13 @@ module Kettle
6
6
  module Versioning
7
7
  module_function
8
8
 
9
- # Detects a unique VERSION constant declared under lib/**/version.rb
9
+ # Detects a unique VERSION constant declared under lib/**/version.rb,
10
+ # or in K_CHANGELOG_VERSION_FILE when a monorepo/root changelog needs
11
+ # to point at a representative package version file.
10
12
  # @param root [String] project root
11
13
  # @return [String] version string
12
14
  def detect_version(root)
13
- candidates = Dir[File.join(root, "lib", "**", "version.rb")]
14
- abort!("Could not find version.rb under lib/**.") if candidates.empty?
15
+ candidates = version_file_candidates(root)
15
16
  versions = candidates.map do |path|
16
17
  content = File.read(path)
17
18
  m = content.match(/VERSION\s*=\s*(["'])([^"']+)\1/)
@@ -24,6 +25,20 @@ module Kettle
24
25
  versions.first
25
26
  end
26
27
 
28
+ def version_file_candidates(root)
29
+ override = ENV.fetch("K_CHANGELOG_VERSION_FILE", "").to_s.strip
30
+ unless override.empty?
31
+ path = File.expand_path(override, root)
32
+ abort!("K_CHANGELOG_VERSION_FILE does not exist: #{override}") unless File.file?(path)
33
+
34
+ return [path]
35
+ end
36
+
37
+ candidates = Dir[File.join(root, "lib", "**", "version.rb")]
38
+ abort!("Could not find version.rb under lib/**.") if candidates.empty?
39
+ candidates
40
+ end
41
+
27
42
  # Classify the bump type from prev -> cur.
28
43
  # EPIC is a MAJOR > 1000.
29
44
  # @param prev [String] previous released version
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.5
4
+ version: 2.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -312,10 +312,10 @@ licenses:
312
312
  - AGPL-3.0-only
313
313
  metadata:
314
314
  homepage_uri: https://kettle-dev.galtzo.com
315
- source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v2.0.5
316
- changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v2.0.5/CHANGELOG.md
315
+ source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v2.0.6
316
+ changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v2.0.6/CHANGELOG.md
317
317
  bug_tracker_uri: https://github.com/kettle-rb/kettle-dev/issues
318
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.0.5
318
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.0.6
319
319
  funding_uri: https://github.com/sponsors/pboling
320
320
  wiki_uri: https://github.com/kettle-rb/kettle-dev/wiki
321
321
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file