kettle-family 1.2.97 → 1.2.98

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: 85cd07ac87342ba42bcea97136be59eb3cdde7737f33e81f8b1f554d9ed5f875
4
- data.tar.gz: fe3d86e41548b66fde62baf1b81dda2636befa505c1db6c0c2e82fe4a6b35b2e
3
+ metadata.gz: a170049375aa0330277e878596e92a61b58655a29ca9aeba1e9ab0006fa46c04
4
+ data.tar.gz: 5bfcd0c99c774fad470b8510188e6eaad700c2ca3157f64eb1a9b52ac320d6c6
5
5
  SHA512:
6
- metadata.gz: 772815e8948f2760a938e55ccff3a2848073a3605b02c3581995e01e40e1a80037356c033abea71b13c01bc06efb2ea3a93a09401266e712f51ddf1bf42290af
7
- data.tar.gz: 0a6886e0040e1389b95b876d6ca90dba2dc3e633024a2b7132db3a50671d9126e9f86e7492f1c14ad723af914fce3d4c78be1fabd1cc76a71aaa50aaaec3580f
6
+ metadata.gz: c527202894d4bca3ada36684b9a7f3700052ebd53967ebb7ea7a65cc0db5cc20a5bf04eec6730f380a444fd69ed6828428fc29e16a1718371eab48eea0647601
7
+ data.tar.gz: b147945409bca869bf23ea6ab8773b7fc8fc6c7677ef877367d2970b3c73edb1efe628606c267de48f58af8cb4db761d527ce8df457b1fe6d4f729ae8c662229
checksums.yaml.gz.sig CHANGED
@@ -1 +1,2 @@
1
- @����}��
1
+ \^˅���S�!�as�&�s������S󻼘�����������\���@�8@<��v+�@����(�T���'��l������@� �q)~��*�`��o���AEXy�;EG˱�D�E��k�Vi�eL��}�@�5�4����u�mI4�ЍĊ6�� ��޾�<�'�]d>&��;�Q�����G�ʪ��=�9>�
2
+ ^;���@�� �P�"h"�C@�����Q��?
data/CHANGELOG.md CHANGED
@@ -30,6 +30,19 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.98] - 2026-09-09
34
+
35
+ - TAG: [v1.2.98][1.2.98t]
36
+ - COVERAGE: 93.50% -- 6245/6679 lines in 35 files
37
+ - BRANCH COVERAGE: 78.08% -- 2529/3239 branches in 35 files
38
+ - 32.75% documented
39
+
40
+ ### Fixed
41
+
42
+ - Commit the final normalized Gemfile.lock after sibling and branch-worktree template runs.
43
+
44
+ - Bootstrap member releases from the family tool bundle before registry lockfile normalization.
45
+
33
46
  ## [1.2.97] - 2026-09-08
34
47
 
35
48
  - TAG: [v1.2.97][1.2.97t]
@@ -2679,7 +2692,9 @@ Please file a bug if you notice a violation of semantic versioning.
2679
2692
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2680
2693
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2681
2694
 
2682
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.97...HEAD
2695
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.98...HEAD
2696
+ [1.2.98]: https://github.com/kettle-dev/kettle-family/compare/v1.2.97...v1.2.98
2697
+ [1.2.98t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.98
2683
2698
  [1.2.97]: https://github.com/kettle-dev/kettle-family/compare/v1.2.96...v1.2.97
2684
2699
  [1.2.97t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.97
2685
2700
  [1.2.96]: https://github.com/kettle-dev/kettle-family/compare/v1.2.95...v1.2.96
data/README.md CHANGED
@@ -662,6 +662,15 @@ and leaves RubyGems MFA prompts interactive by default:
662
662
  kettle-family release --publish --execute
663
663
  ```
664
664
 
665
+ Release uses two explicitly separate execution contexts. `release_bootstrap`
666
+ starts `kettle-release` from the family-root tool bundle, so a family can retain
667
+ its configured local sibling graph while it prepares a release wave. It never
668
+ uses a member's development Gemfile to boot the release tool. `release_registry`
669
+ then resets each tracked release lockfile against registry dependencies and is
670
+ also used by every project release child command. Local sibling paths therefore
671
+ remain available only before that transition; they cannot enter the canonical
672
+ lockfile, the release-preparation commit, or CI-facing project commands.
673
+
665
674
  Use named recovery modes when a publish wave has already prepared a member:
666
675
 
667
676
  ```console
@@ -1171,7 +1180,7 @@ Thanks for RTFM. ☺️
1171
1180
  [📌gitmoji]: https://gitmoji.dev
1172
1181
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1173
1182
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1174
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.670-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1183
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.679-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1175
1184
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
1176
1185
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1177
1186
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -40,6 +40,18 @@ module Kettle
40
40
  host_platform_policy: :active_platform_must_resolve,
41
41
  allowed_mutations: %i[template development_lockfiles generated]
42
42
  ),
43
+ # This profile only starts the release implementation from the family
44
+ # tool bundle. It is intentionally distinct from release_registry:
45
+ # canonical lockfile reset and all project release children use that
46
+ # registry-only profile after the tool has booted.
47
+ release_bootstrap: Definition.new(
48
+ name: :release_bootstrap,
49
+ path_gem_policy: :configured_siblings,
50
+ lockfile_role: :tool,
51
+ install_location: :family,
52
+ host_platform_policy: :active_platform_must_resolve,
53
+ allowed_mutations: %i[release_tool_bootstrap]
54
+ ),
43
55
  release_registry: Definition.new(
44
56
  name: :release_registry,
45
57
  path_gem_policy: :registry_only,
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "1.2.97"
8
+ VERSION = "1.2.98"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -1451,6 +1451,7 @@ module Kettle
1451
1451
  normalize_lockfiles(member: member, runner: runner, memo: memo, phase: "normalize_lockfiles", commit_changes: commit_changes)
1452
1452
  emit_member_result_progress(member, memo.last, progress: progress, progress_key: progress_key, progress_label: progress_label)
1453
1453
  commit_template_changes(member: member, runner: runner, memo: memo) if commit_changes
1454
+ commit_template_normalized_gemfile_lock(member: member, runner: runner, memo: memo, commit_changes: commit_changes)
1454
1455
  emit_member_result_progress(member, memo.last, progress: progress, progress_key: progress_key, progress_label: progress_label) if memo.last&.phase == "commit_template"
1455
1456
  ensure
1456
1457
  template_result = memo.find { |result| result.phase == "template" } || memo.last
@@ -3637,7 +3638,7 @@ module Kettle
3637
3638
  # changelog may live at the family root. Pass the shared paths to the
3638
3639
  # member release phase as well as to the separate family phase.
3639
3640
  def release_env_for_member(member, family_root: config.root, wave_jobs: 1)
3640
- env = release_env
3641
+ env = execution_profile(release_bootstrap_execution_profile, release_env)
3641
3642
  env.merge!(release_wave_local_path_env_for(member, family_root: family_root))
3642
3643
  env.merge!(release_local_path_policy_env(family_root: family_root))
3643
3644
  # Family release performs one live pin review before member releases.
@@ -3703,15 +3704,15 @@ module Kettle
3703
3704
  candidates.find { |path| File.file?(path) }
3704
3705
  end
3705
3706
 
3706
- # A member's development lockfile can pin an older kettle-dev than the
3707
- # family runner. That older release tool may not understand the current
3708
- # family policy, notably configured monorepo PATH dependencies. Launch
3709
- # kettle-release from the family bundle instead; the release tool still
3710
- # runs member project commands from the member checkout.
3707
+ # A member's development Gemfile can contain a deliberately local family
3708
+ # graph that is not independently bootable after an earlier release wave
3709
+ # changes a sibling's dependency floor. Launch kettle-release from the
3710
+ # family tool bundle instead. The release tool still runs project commands
3711
+ # from the member checkout, where it first normalizes canonical lockfiles
3712
+ # with local paths disabled.
3711
3713
  def release_tool_gemfile_path(local_kettle_dev)
3712
3714
  local_kettle_dev_gemfile = local_kettle_dev_gemfile_path(local_kettle_dev)
3713
3715
  return local_kettle_dev_gemfile if local_kettle_dev_gemfile
3714
- return unless config.configured_monorepo_release?
3715
3716
 
3716
3717
  family_gemfile = File.join(config.root, "Gemfile")
3717
3718
  family_gemfile if File.file?(family_gemfile)
@@ -5319,6 +5320,23 @@ module Kettle
5319
5320
  end
5320
5321
  end
5321
5322
 
5323
+ # Kettle Jem commits its own changes for sibling repositories. The final
5324
+ # lockfile normalization therefore happens after that commit and needs a
5325
+ # separate, deliberately narrow cleanup commit. Monorepos defer the
5326
+ # template commit, which already includes the normalized lockfile.
5327
+ def commit_template_normalized_gemfile_lock(member:, runner:, memo:, commit_changes:)
5328
+ return unless execute && commit_changes && memo.all?
5329
+ return if deferred_monorepo_template_commit?(member)
5330
+
5331
+ commit_normalized_lockfiles(
5332
+ branch_members: [member],
5333
+ runner: runner,
5334
+ memo: memo,
5335
+ reason: "template",
5336
+ paths: ["Gemfile.lock"]
5337
+ )
5338
+ end
5339
+
5322
5340
  def template_commit_message(member)
5323
5341
  "🎨 Template #{member.name} by kettle-family"
5324
5342
  end
@@ -5357,6 +5375,10 @@ module Kettle
5357
5375
  ExecutionProfile.fetch(:template_local)
5358
5376
  end
5359
5377
 
5378
+ def release_bootstrap_execution_profile
5379
+ ExecutionProfile.fetch(:release_bootstrap)
5380
+ end
5381
+
5360
5382
  def release_lockfile_execution_profile
5361
5383
  return ExecutionProfile.fetch(:release_recovery) if release_recovery?
5362
5384
  return ExecutionProfile.fetch(:release_monorepo) if preserve_monorepo_template_context?
@@ -5375,7 +5397,7 @@ module Kettle
5375
5397
  when :template_local
5376
5398
  env["K_JEM_TEMPLATING"] = "true"
5377
5399
  env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
5378
- when :release_registry, :release_monorepo, :release_recovery
5400
+ when :release_bootstrap, :release_registry, :release_monorepo, :release_recovery
5379
5401
  # Release profiles deliberately leave Bundler mutation decisions to
5380
5402
  # kettle-dev. The profile selection controls which local-path
5381
5403
  # overrides this workflow contributes below.
@@ -5588,10 +5610,14 @@ module Kettle
5588
5610
  text.include?(File::SEPARATOR)
5589
5611
  end
5590
5612
 
5591
- def commit_normalized_lockfiles(branch_members:, runner:, memo:, reason: command, force: false)
5613
+ def commit_normalized_lockfiles(branch_members:, runner:, memo:, reason: command, force: false, paths: nil)
5592
5614
  return unless commit
5593
5615
  return unless force || commit_normalized_lockfiles?(reason)
5594
5616
 
5617
+ pathspecs = Array(paths).map { |path| Shellwords.escape(path) }
5618
+ pathspecs = ["Gemfile.lock", "'*.lock'", "'**/*.lock'"] if pathspecs.empty?
5619
+ pathspec = pathspecs.join(" ")
5620
+
5595
5621
  branch_members.each do |member|
5596
5622
  result = runner.call(
5597
5623
  member: member,
@@ -5599,7 +5625,7 @@ module Kettle
5599
5625
  command: [
5600
5626
  "sh",
5601
5627
  "-lc",
5602
- "files=$(git ls-files --modified --others --exclude-standard -- Gemfile.lock '*.lock' '**/*.lock'); " \
5628
+ "files=$(git ls-files --modified --others --exclude-standard -- #{pathspec}); " \
5603
5629
  "if [ -n \"$files\" ]; then printf '%s\\n' \"$files\" | xargs git add -- && git commit -m " \
5604
5630
  "#{Shellwords.escape(normalized_lockfiles_commit_message(reason))}; fi"
5605
5631
  ]
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-family
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.97
4
+ version: 1.2.98
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -443,10 +443,10 @@ licenses:
443
443
  - AGPL-3.0-only
444
444
  metadata:
445
445
  homepage_uri: https://kettle-family.galtzo.com
446
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.97
447
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.97/CHANGELOG.md
446
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.98
447
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.98/CHANGELOG.md
448
448
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
449
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.97
449
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.98
450
450
  funding_uri: https://github.com/sponsors/pboling
451
451
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
452
452
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file