chore: synchronize release version management - #934
Conversation
* add 'just release x.y.z` support
📝 WalkthroughWalkthroughThis PR bumps the workspace, crate, package, SDK, and documentation version references to 0.72.1, and adds release automation scripts plus a Justfile recipe to run them. ChangesVersion Bump Across Manifests, Config, and Docs
Release Automation Scripts
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
crates/mesh-llm-config/src/model/built_in_schema/presentation.rs (1)
246-261: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winInconsistent min/max placeholder example after bump.
mesh_requirements.min_node_versionplaceholder was bumped to"0.72.1", butmesh_requirements.max_node_versionplaceholder is still"0.69.0"(unchanged). The resulting example now shows a minimum version higher than the maximum version, which is a nonsensical/confusing placeholder pair for users configuring this setting.🐛 Proposed fix
"mesh_requirements.max_node_version" => Some(sp( "Maximum node version", "Highest mesh-llm node version allowed when this requirement-aware mesh is created or joined.", ATTESTATION_CATEGORY, 20, ) - .placeholder("0.69.0") + .placeholder("0.72.1") .hint("text")),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/mesh-llm-config/src/model/built_in_schema/presentation.rs` around lines 246 - 261, The placeholder values for the node version requirements are inconsistent in the presentation schema: `mesh_requirements.min_node_version` was updated to a newer example while `mesh_requirements.max_node_version` still shows an older one, creating a confusing min-greater-than-max pair. Update the `sp(...)` entries in `presentation.rs` so the `mesh_requirements.min_node_version` and `mesh_requirements.max_node_version` placeholders form a sensible ordered example, keeping the two values aligned and easy to understand for users.
🧹 Nitpick comments (3)
scripts/release.sh (2)
201-242: 🩺 Stability & Availability | 🔵 TrivialDirect push to
origin/mainbypasses normal PR review for the release-prep commit.
push_release_source_commitpushes straight tomain(line 241), which requires the operator's credentials to bypass any branch-protection rules requiring PR review/status checks onmain. Worth confirming this is intentional and thatmainis configured to allow it for the release automation path (or a bot/service account), otherwise this step will fail at push time.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/release.sh` around lines 201 - 242, The `push_release_source_commit` flow is pushing directly to `origin/main`, which can bypass normal branch protection and PR review for the release-prep commit. Update this release step to use the intended protected-branch automation path or clearly gate it behind a bot/service account setup, and verify the `git push` in `push_release_source_commit` aligns with the repository’s `main` protection rules.
53-127: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win
set +earound the Python semver comparison is intentional and bounded, but consider avoiding it.The static analysis hint flags
set +eas masking failures. Here it's narrowly scoped and the exit code is checked immediately afterward via an exhaustivecase(0/1/*), so it isn't actually masking unhandled failures. Still, you can avoid disablingerrexitglobally by capturing the status with anifinstead.♻️ Alternative without `set +e`
- set +e - python3 - "$current" "$target" <<'PY' + if python3 - "$current" "$target" <<'PY' ... PY - compare_status="$?" - set -e + then + compare_status=0 + else + compare_status="$?" + fi🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/release.sh` around lines 53 - 127, The ensure_target_version_advances() helper in the release script is using set +e to capture the Python semver comparison exit status, which the review notes is unnecessary. Refactor this block to avoid disabling errexit globally by running the Python comparison in a conditional/if construct that captures the status directly, while preserving the same 0/1/* handling and die() messages in the surrounding case logic.Source: Linters/SAST tools
scripts/release-version.sh (1)
97-113: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low valueEscape
$nextin the Perl match.release-version.shonly accepts semver input, so this isn’t an injection path, butupdate_known_mesh_versionsstill feeds the version straight into a regex. Reusing thequotemeta/@ARGVpattern fromupdate_literal_version_referenceswould make the existence check exact and consistent.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/release-version.sh` around lines 97 - 113, The existence check in update_known_mesh_versions currently interpolates $next directly into the Perl regex, so update that check to treat the version as a literal match instead of a regex pattern. Reuse the safer quotemeta/@ARGV approach already used in update_literal_version_references so the comparison against known_mesh_llm_versions is exact and consistent, while keeping the rest of the update logic in update_known_mesh_versions unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/mesh-llm/Cargo.toml`:
- Around line 24-30: The dependency block in mesh-llm’s Cargo.toml has an
inconsistent bump: mesh-llm-host-runtime is missing the version pin that all
sibling path dependencies now use. Update the mesh-llm-host-runtime entry to
match the other mesh-llm-* dependencies by adding the same 0.72.1 version field,
keeping the dependency list consistent for publishing. Use the existing
mesh-llm-host-runtime symbol in this block to locate the change.
In `@scripts/release-version.sh`:
- Around line 72-95: The global literal replacement in
update_literal_version_references is too broad and can rewrite unrelated version
strings inside JSON lockfiles and package manifests. Update this helper to use a
more targeted match for JSON content (for example, only the version field in
package.json/package-lock.json via a structured parser or an anchored pattern)
while keeping the loose substitution only for unambiguous text files; also
adjust the loop that calls update_literal_version_references so it selects the
safer path for crates/mesh-llm-ui/package-lock.json and sdk/node/package.json.
- Around line 204-234: The release-version automation is missing the Kotlin SDK
root build file, so it won’t keep the Kotlin project version in sync. Update the
literal_version_files list in scripts/release-version.sh to include
sdk/kotlin/build.gradle.kts alongside the existing Kotlin example build file,
and ensure update_literal_version_references runs over it so future releases
bump both Kotlin version files together.
In `@scripts/release.sh`:
- Around line 49-51: The read_workspace_version helper is too broadly matching
the first version field in Cargo.toml, so it can return the wrong workspace
version. Update the implementation in read_workspace_version to use the same
[workspace.package]-scoped parsing already used by scripts/release-version.sh,
or share that helper instead of duplicating the looser regex. Keep
ensure_target_version_advances and the release prompt wired to the correctly
scoped workspace version lookup.
---
Outside diff comments:
In `@crates/mesh-llm-config/src/model/built_in_schema/presentation.rs`:
- Around line 246-261: The placeholder values for the node version requirements
are inconsistent in the presentation schema:
`mesh_requirements.min_node_version` was updated to a newer example while
`mesh_requirements.max_node_version` still shows an older one, creating a
confusing min-greater-than-max pair. Update the `sp(...)` entries in
`presentation.rs` so the `mesh_requirements.min_node_version` and
`mesh_requirements.max_node_version` placeholders form a sensible ordered
example, keeping the two values aligned and easy to understand for users.
---
Nitpick comments:
In `@scripts/release-version.sh`:
- Around line 97-113: The existence check in update_known_mesh_versions
currently interpolates $next directly into the Perl regex, so update that check
to treat the version as a literal match instead of a regex pattern. Reuse the
safer quotemeta/@ARGV approach already used in update_literal_version_references
so the comparison against known_mesh_llm_versions is exact and consistent, while
keeping the rest of the update logic in update_known_mesh_versions unchanged.
In `@scripts/release.sh`:
- Around line 201-242: The `push_release_source_commit` flow is pushing directly
to `origin/main`, which can bypass normal branch protection and PR review for
the release-prep commit. Update this release step to use the intended
protected-branch automation path or clearly gate it behind a bot/service account
setup, and verify the `git push` in `push_release_source_commit` aligns with the
repository’s `main` protection rules.
- Around line 53-127: The ensure_target_version_advances() helper in the release
script is using set +e to capture the Python semver comparison exit status,
which the review notes is unnecessary. Refactor this block to avoid disabling
errexit globally by running the Python comparison in a conditional/if construct
that captures the status directly, while preserving the same 0/1/* handling and
die() messages in the surrounding case logic.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 6f6d2247-1618-482a-b205-bca30d250c2d
⛔ Files ignored due to path filters (2)
Cargo.lockis excluded by!**/*.lockcrates/mesh-llm-ui/package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (48)
Cargo.tomlJustfilecrates/mesh-client/Cargo.tomlcrates/mesh-llm-api-client/Cargo.tomlcrates/mesh-llm-api-server/Cargo.tomlcrates/mesh-llm-cli/Cargo.tomlcrates/mesh-llm-commands/Cargo.tomlcrates/mesh-llm-config/Cargo.tomlcrates/mesh-llm-config/src/model/built_in_schema.rscrates/mesh-llm-config/src/model/built_in_schema/presentation.rscrates/mesh-llm-console-server/Cargo.tomlcrates/mesh-llm-embedded-runtime/Cargo.tomlcrates/mesh-llm-hardware-profile/Cargo.tomlcrates/mesh-llm-host-runtime/Cargo.tomlcrates/mesh-llm-host-runtime/tests/fixtures/config_schema_reference.jsoncrates/mesh-llm-native-runtime/README.mdcrates/mesh-llm-node/Cargo.tomlcrates/mesh-llm-nodejs/Cargo.tomlcrates/mesh-llm-runtime-install/Cargo.tomlcrates/mesh-llm-sdk/Cargo.tomlcrates/mesh-llm-sdk/README.mdcrates/mesh-llm-system/Cargo.tomlcrates/mesh-llm-tui/Cargo.tomlcrates/mesh-llm-ui/package.jsoncrates/mesh-llm/Cargo.tomlcrates/mesh-mixture-of-agents/Cargo.tomlcrates/model-artifact/Cargo.tomlcrates/model-hf/Cargo.tomlcrates/model-package/Cargo.tomlcrates/model-resolver/Cargo.tomlcrates/openai-frontend/Cargo.tomlcrates/skippy-cache/Cargo.tomlcrates/skippy-runtime/Cargo.tomlcrates/skippy-server/Cargo.tomldocs/SDK.mddocs/design/NATIVE_RUNTIMES.mddocs/sdk/node.mddocs/sdk/rust.mddocs/sdk/swift.mdscripts/release-version.shscripts/release.shsdk/kotlin/README.mdsdk/kotlin/build.gradle.ktssdk/kotlin/example/example-jvm/build.gradle.ktssdk/node/package.jsonsdk/swift/README.mdsdk/swift/scripts/generate-swift-bindings.shwebsite/src/docs/pages/CLI.md
michaelneale
left a comment
There was a problem hiding this comment.
one coderabbit comment about missing version @ndizazzo
There was a problem hiding this comment.
🧹 Nitpick comments (1)
scripts/release-version.sh (1)
138-138: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueFull-file JSON reformat on change may widen diffs beyond the version bump.
When
changedis true, the script writes backJSON.stringify(data, null, 2)rather than a targeted patch, so any deviation between the source file's original formatting and a strict 2-space stringify (trailing newline, numeric key ordering artifacts, etc.) will show up as unrelated diff noise inpackage.json/package-lock.json. Low risk given npm normally emits 2-space JSON, but worth a short comment noting the assumption if this is intentional.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/release-version.sh` at line 138, The full-file rewrite in the release-version script can widen diffs because `process.stdout.write` emits a complete `JSON.stringify(data, null, 2)` when `changed` is true. Update the logic around this write path to either narrow the output to only the version change or add a brief comment near the JSON stringify call explaining the assumption that npm-managed JSON uses stable 2-space formatting; reference the `changed` flag and the `process.stdout.write` branch so the intent is clear.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@scripts/release-version.sh`:
- Line 138: The full-file rewrite in the release-version script can widen diffs
because `process.stdout.write` emits a complete `JSON.stringify(data, null, 2)`
when `changed` is true. Update the logic around this write path to either narrow
the output to only the version change or add a brief comment near the JSON
stringify call explaining the assumption that npm-managed JSON uses stable
2-space formatting; reference the `changed` flag and the `process.stdout.write`
branch so the intent is clear.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 48b6a92e-ae16-41c9-a2fb-947a99e0b01d
📒 Files selected for processing (4)
crates/mesh-llm-config/src/model/built_in_schema/presentation.rscrates/mesh-llm/Cargo.tomlscripts/release-version.shscripts/release.sh
✅ Files skipped from review due to trivial changes (1)
- crates/mesh-llm-config/src/model/built_in_schema/presentation.rs
🚧 Files skipped from review as they are similar to previous changes (2)
- crates/mesh-llm/Cargo.toml
- scripts/release.sh
Summary
just release <version>as a synchronous release-prep and publish commandscripts/release-version.shso future bumps update Rust crates, lockfile entries, SDK/package manifests, docs, config schema metadata, and website source examples togethermainRationale
The previous release workflow accepted a version input for build jobs, but it did not reliably produce and build from a source commit that contained the corresponding version bump. That made the repository drift from published releases and left multiple public surfaces stuck on older versions.
This PR makes the release commit the first-class source of truth.
just release <version>prepares the versioned commit onmain, pushes it, dispatches the GitHub release workflow against that commit, watches the run viagh, and then attaches generated release notes to the GitHub release after a successful non-canary build. That avoids release branches and keeps the release build tied to the commit containing the version update.The release command also fails closed before it can publish an ambiguous release: the target version must parse as semver, advance from the workspace version, and not already exist as a local tag, remote tag, or GitHub release. This supports RC progression such as
0.72.0-rc1to0.72.0-rc3, while preventing accidental rebuilds of an already released version.Validation
just test-allscripts/release-version.sh 0.72.1bash -n scripts/release.sh scripts/release-version.shcargo metadata --format-version 1just check-releasegit diff --checkNote: the first full
just test-allattempt exposed the expected config schema snapshot drift after syncing the built-in plugin version, and Playwright Chromium needed to be installed for the updated Playwright version. After updating the snapshot and runningpnpm exec playwright install chromium, the final fulljust test-allpassed.Summary by CodeRabbit
New Features
Documentation
0.72.1.Chores
0.72.1across the project.