kettle-family 1.2.96 → 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: d2f776638603414ab6c27f457473dea3f6088bae63f58a45fcbc0f165fe0e026
4
- data.tar.gz: b44e74efb8e840e929df24573b815df7b7a749f27e67f86f76561ab654b406ea
3
+ metadata.gz: a170049375aa0330277e878596e92a61b58655a29ca9aeba1e9ab0006fa46c04
4
+ data.tar.gz: 5bfcd0c99c774fad470b8510188e6eaad700c2ca3157f64eb1a9b52ac320d6c6
5
5
  SHA512:
6
- metadata.gz: 77f9c29784b453d8d270398c675ed52e18d8ba5f374fc8add80465bce88f59a679ab254080e3fe349685bff16134bb97541ef087d5c32116123c95e443b64685
7
- data.tar.gz: 4e750df4e8f1f7f92ee8a653bac8ed02a95ee7ddfa5daa8f8eef92003b78e2c58c93b41498b0b93f8649626dcaf3a645f36fdedabf78928e35653131f14431c3
6
+ metadata.gz: c527202894d4bca3ada36684b9a7f3700052ebd53967ebb7ea7a65cc0db5cc20a5bf04eec6730f380a444fd69ed6828428fc29e16a1718371eab48eea0647601
7
+ data.tar.gz: b147945409bca869bf23ea6ab8773b7fc8fc6c7677ef877367d2970b3c73edb1efe628606c267de48f58af8cb4db761d527ce8df457b1fe6d4f729ae8c662229
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,30 @@ 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
+
46
+ ## [1.2.97] - 2026-09-08
47
+
48
+ - TAG: [v1.2.97][1.2.97t]
49
+ - COVERAGE: 93.49% -- 6236/6670 lines in 35 files
50
+ - BRANCH COVERAGE: 77.99% -- 2523/3235 branches in 35 files
51
+ - 32.75% documented
52
+
53
+ ### Fixed
54
+
55
+ - Attribute release-preflight failures to the selected member so retry hints do not target an unselected family sibling.
56
+
33
57
  ## [1.2.96] - 2026-09-08
34
58
 
35
59
  - TAG: [v1.2.96][1.2.96t]
@@ -2668,7 +2692,11 @@ Please file a bug if you notice a violation of semantic versioning.
2668
2692
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2669
2693
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2670
2694
 
2671
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.96...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
2698
+ [1.2.97]: https://github.com/kettle-dev/kettle-family/compare/v1.2.96...v1.2.97
2699
+ [1.2.97t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.97
2672
2700
  [1.2.96]: https://github.com/kettle-dev/kettle-family/compare/v1.2.95...v1.2.96
2673
2701
  [1.2.96t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.96
2674
2702
  [1.2.95]: https://github.com/kettle-dev/kettle-family/compare/v1.2.94...v1.2.95
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.669-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.96"
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
@@ -1944,11 +1945,15 @@ module Kettle
1944
1945
  end
1945
1946
 
1946
1947
  def release_preflight_error_result(phase, message)
1948
+ # A preflight failure blocks the selected release invocation. Attribute
1949
+ # it to that invocation's first member so generated resume commands do
1950
+ # not target the synthetic family name or an unselected sibling.
1951
+ member = members.first || family_member
1947
1952
  CommandResult.new(
1948
- member_name: family_member.name,
1953
+ member_name: member.name,
1949
1954
  phase: phase,
1950
1955
  command: ["internal", phase],
1951
- workdir: config.root,
1956
+ workdir: member.root,
1952
1957
  status: 1,
1953
1958
  success: false,
1954
1959
  stdout: "",
@@ -3633,7 +3638,7 @@ module Kettle
3633
3638
  # changelog may live at the family root. Pass the shared paths to the
3634
3639
  # member release phase as well as to the separate family phase.
3635
3640
  def release_env_for_member(member, family_root: config.root, wave_jobs: 1)
3636
- env = release_env
3641
+ env = execution_profile(release_bootstrap_execution_profile, release_env)
3637
3642
  env.merge!(release_wave_local_path_env_for(member, family_root: family_root))
3638
3643
  env.merge!(release_local_path_policy_env(family_root: family_root))
3639
3644
  # Family release performs one live pin review before member releases.
@@ -3699,15 +3704,15 @@ module Kettle
3699
3704
  candidates.find { |path| File.file?(path) }
3700
3705
  end
3701
3706
 
3702
- # A member's development lockfile can pin an older kettle-dev than the
3703
- # family runner. That older release tool may not understand the current
3704
- # family policy, notably configured monorepo PATH dependencies. Launch
3705
- # kettle-release from the family bundle instead; the release tool still
3706
- # 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.
3707
3713
  def release_tool_gemfile_path(local_kettle_dev)
3708
3714
  local_kettle_dev_gemfile = local_kettle_dev_gemfile_path(local_kettle_dev)
3709
3715
  return local_kettle_dev_gemfile if local_kettle_dev_gemfile
3710
- return unless config.configured_monorepo_release?
3711
3716
 
3712
3717
  family_gemfile = File.join(config.root, "Gemfile")
3713
3718
  family_gemfile if File.file?(family_gemfile)
@@ -5315,6 +5320,23 @@ module Kettle
5315
5320
  end
5316
5321
  end
5317
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
+
5318
5340
  def template_commit_message(member)
5319
5341
  "🎨 Template #{member.name} by kettle-family"
5320
5342
  end
@@ -5353,6 +5375,10 @@ module Kettle
5353
5375
  ExecutionProfile.fetch(:template_local)
5354
5376
  end
5355
5377
 
5378
+ def release_bootstrap_execution_profile
5379
+ ExecutionProfile.fetch(:release_bootstrap)
5380
+ end
5381
+
5356
5382
  def release_lockfile_execution_profile
5357
5383
  return ExecutionProfile.fetch(:release_recovery) if release_recovery?
5358
5384
  return ExecutionProfile.fetch(:release_monorepo) if preserve_monorepo_template_context?
@@ -5371,7 +5397,7 @@ module Kettle
5371
5397
  when :template_local
5372
5398
  env["K_JEM_TEMPLATING"] = "true"
5373
5399
  env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
5374
- when :release_registry, :release_monorepo, :release_recovery
5400
+ when :release_bootstrap, :release_registry, :release_monorepo, :release_recovery
5375
5401
  # Release profiles deliberately leave Bundler mutation decisions to
5376
5402
  # kettle-dev. The profile selection controls which local-path
5377
5403
  # overrides this workflow contributes below.
@@ -5584,10 +5610,14 @@ module Kettle
5584
5610
  text.include?(File::SEPARATOR)
5585
5611
  end
5586
5612
 
5587
- 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)
5588
5614
  return unless commit
5589
5615
  return unless force || commit_normalized_lockfiles?(reason)
5590
5616
 
5617
+ pathspecs = Array(paths).map { |path| Shellwords.escape(path) }
5618
+ pathspecs = ["Gemfile.lock", "'*.lock'", "'**/*.lock'"] if pathspecs.empty?
5619
+ pathspec = pathspecs.join(" ")
5620
+
5591
5621
  branch_members.each do |member|
5592
5622
  result = runner.call(
5593
5623
  member: member,
@@ -5595,7 +5625,7 @@ module Kettle
5595
5625
  command: [
5596
5626
  "sh",
5597
5627
  "-lc",
5598
- "files=$(git ls-files --modified --others --exclude-standard -- Gemfile.lock '*.lock' '**/*.lock'); " \
5628
+ "files=$(git ls-files --modified --others --exclude-standard -- #{pathspec}); " \
5599
5629
  "if [ -n \"$files\" ]; then printf '%s\\n' \"$files\" | xargs git add -- && git commit -m " \
5600
5630
  "#{Shellwords.escape(normalized_lockfiles_commit_message(reason))}; fi"
5601
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.96
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.96
447
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.96/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.96
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