Conversation
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
💤 Files with no reviewable changes (1)
📜 Recent review details⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
📝 WalkthroughWalkthroughAdds support for snapshot ChangesLink Workspace Path Support
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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.
🧹 Nitpick comments (1)
pacquet/crates/lockfile/src/snapshot_dep_ref/tests.rs (1)
61-64: ⚡ Quick winTrim test doc-comments that restate assertions.
These blocks largely repeat what the test names and assertions already express. Consider reducing them to brief non-obvious context (or removing them) to keep test intent crisp.
As per coding guidelines: "Tests are documentation. Do not duplicate them in prose."
Also applies to: 100-105
🤖 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 `@pacquet/crates/lockfile/src/snapshot_dep_ref/tests.rs` around lines 61 - 64, The doc-comment blocks that restate test assertions (e.g., the block starting "`link:` deps live outside the virtual store..." and the similar block around the 100-105 region) should be trimmed or removed so the test name and assertions are the primary documentation; replace verbose prose with a short one-line note only if it adds non-obvious context, otherwise delete the comment lines above the test functions in snapshot_dep_ref/tests.rs so the tests remain concise and still compile/run.
🤖 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 `@pacquet/crates/lockfile/src/snapshot_dep_ref/tests.rs`:
- Around line 61-64: The doc-comment blocks that restate test assertions (e.g.,
the block starting "`link:` deps live outside the virtual store..." and the
similar block around the 100-105 region) should be trimmed or removed so the
test name and assertions are the primary documentation; replace verbose prose
with a short one-line note only if it adds non-obvious context, otherwise delete
the comment lines above the test functions in snapshot_dep_ref/tests.rs so the
tests remain concise and still compile/run.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 6075d957-bb16-4a38-a97a-ffbdb134f65c
📒 Files selected for processing (14)
pacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/lockfile/src/resolved_dependency.rspacquet/crates/lockfile/src/snapshot_dep_ref.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/package-manager/src/current_lockfile.rspacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/real-hoist/src/lib.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
pacquet/**/*.rs
📄 CodeRabbit inference engine (pacquet/AGENTS.md)
pacquet/**/*.rs: When porting a function that firespnpm:<channel>events throughglobalLogger,logger.debug(), orstreamParser.write(), mirror the call site, payload, and ordering so the reporter parses pacquet's NDJSON the same way it parses pnpm's.
Declare a newtype wrapper for branded string types. Do not collapse the brand into a plainStringor&str.
If upstream always validates before construction, validate in pacquet's wrapper too. The wrapper must construct only viaTryFrom<String>and/orFromStr. Do not provide an infallible public constructor.
If upstream never validates, just brand for type-safety. Expose an infallibleFrom<String>(andFrom<&str>when convenient).
If upstream occasionally constructs without validation, exposefrom_str_uncheckedas an escape hatch alongside the validating constructor.
Match upstream serde behavior for branded types that cross JSON, YAML, or INI boundaries. Use#[serde(try_from = "String")]for deserialization and#[serde(into = "String")]for serialization.
Use#[derive(derive_more::From)]and#[derive(derive_more::Into)]for mechanical conversion impls. Fall back to manualimplonly when conversion needs custom logic.
String-literal unions should becomeenums, not newtype wrappers. Model closed sets of valid string values as enums.
Template literal types should be treated as branded strings with validation discipline from rules 2-5.
Choose owned vs. borrowed parameters to minimize copies. Widen to the most encompassing type (&Pathover&PathBuf,&strover&String) when it doesn't force extra copies.
PreferArc::clone(&x)/Rc::clone(&x)overx.clone()for reference-counted types, so the cost is visible at the call site.
Follow Rust API Guidelines for naming conventions.
Do not use star imports inside module bodies. Writeuse super::{Foo, bar}instead ofuse super::*;. Two forms stay allowed: external-crate preludes likeuse rayon::prelude::*;and root-of-module re-...
Files:
pacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/real-hoist/src/lib.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/lockfile/src/resolved_dependency.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/lockfile/src/snapshot_dep_ref.rspacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/current_lockfile.rs
🧠 Learnings (1)
📚 Learning: 2026-05-20T19:40:55.051Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11774
File: pacquet/crates/resolving-deps-resolver/src/resolve_peers.rs:0-0
Timestamp: 2026-05-20T19:40:55.051Z
Learning: In the pacquet Rust code, ensure the semver implementation uses the `node-semver` crate (not `nodejs-semver`). `node-semver`’s public API does not include a `satisfies_with_prerelease`-style method; prerelease-tolerant matching should be implemented inline by first calling `Range::satisfies`, and when it rejects a prerelease version, retry matching against a stripped `MAJOR.MINOR.PATCH` base of the prerelease version.
Applied to files:
pacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/real-hoist/src/lib.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/lockfile/src/resolved_dependency.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/lockfile/src/snapshot_dep_ref.rspacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/current_lockfile.rs
🔇 Additional comments (14)
pacquet/crates/lockfile/src/snapshot_dep_ref.rs (1)
9-10: LGTM!Also applies to: 30-35, 43-47, 55-55, 63-66, 69-69, 71-73, 78-80, 82-85, 88-95, 104-104, 136-138
pacquet/crates/lockfile/src/snapshot_dep_ref/tests.rs (1)
50-51: LGTM!Also applies to: 57-58, 66-69, 79-80, 93-93, 107-111, 133-134, 138-138, 141-141, 143-144
pacquet/crates/lockfile/src/load_lockfile/tests.rs (1)
1-3: LGTM!Also applies to: 162-167, 169-225
pacquet/crates/lockfile/src/resolved_dependency.rs (1)
51-54: LGTM!pacquet/crates/package-manager/src/create_symlink_layout.rs (1)
63-68: LGTM!pacquet/crates/package-manager/src/link_bins.rs (1)
422-427: LGTM!pacquet/crates/package-manager/src/install_frozen_lockfile.rs (1)
1337-1341: LGTM!pacquet/crates/package-manager/src/build_sequence.rs (1)
105-107: LGTM!pacquet/crates/package-manager/src/deps_graph.rs (1)
153-158: LGTM!pacquet/crates/package-manager/src/hoist.rs (1)
89-93: LGTM!pacquet/crates/package-manager/src/hoisted_dep_graph.rs (1)
819-825: LGTM!pacquet/crates/package-manager/src/current_lockfile.rs (1)
214-217: LGTM!pacquet/crates/package-manager/src/virtual_store_layout.rs (1)
345-348: LGTM!pacquet/crates/real-hoist/src/lib.rs (1)
504-511: LGTM!
Micro-Benchmark ResultsLinux |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #11788 +/- ##
==========================================
- Coverage 89.65% 89.42% -0.23%
==========================================
Files 174 175 +1
Lines 20836 21130 +294
==========================================
+ Hits 18680 18895 +215
- Misses 2156 2235 +79 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
An injected workspace package's snapshot can carry a `link:<path>` dependency value when the dep is a workspace sibling. Pnpm accepts the shape — `refToRelative` short-circuits to `null` for `link:` — but pacquet's `SnapshotDepRef` only handled the plain/alias shapes and rejected `link:` at parse time. Add a `SnapshotDepRef::Link(String)` variant mirroring `ImporterDepVersion::Link`, return `None` from `resolve` / `ver_peer` for it, and skip it at every consumer (matching upstream's `if (childDepPath)` guards in `getChildren` / `lockfileDepsToGraphChildren`). Fixes #11775.
Integrated-Benchmark Report (Linux)Scenario: Frozen Lockfile
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 2.3714849058,
"stddev": 0.06318448235420429,
"median": 2.377216333,
"user": 2.82684116,
"system": 3.6287748800000004,
"min": 2.286037673,
"max": 2.460364036,
"times": [
2.460364036,
2.286037673,
2.357772674,
2.457165566,
2.287569577,
2.396659992,
2.321036271,
2.4015681260000004,
2.40549408,
2.341181063
]
},
{
"command": "pacquet@main",
"mean": 2.353438949,
"stddev": 0.04283376132443959,
"median": 2.349442293,
"user": 2.8139023599999997,
"system": 3.6150974799999993,
"min": 2.2909715100000003,
"max": 2.421483283,
"times": [
2.409406403,
2.3521952660000003,
2.3466893200000003,
2.2909715100000003,
2.3747639900000004,
2.3795497780000003,
2.308477648,
2.3193671900000004,
2.421483283,
2.3314851020000003
]
},
{
"command": "pnpm",
"mean": 4.5850333295,
"stddev": 0.06526931777984148,
"median": 4.581607828999999,
"user": 7.73848876,
"system": 4.08555418,
"min": 4.4818831139999995,
"max": 4.687392303999999,
"times": [
4.562423975,
4.501060642,
4.574567882999999,
4.4818831139999995,
4.6795869759999995,
4.687392303999999,
4.588647775,
4.598475779999999,
4.5740450059999995,
4.60224984
]
}
]
}Scenario: Frozen Lockfile (Hot Cache)
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 0.72651986988,
"stddev": 0.03447938767555693,
"median": 0.71248237278,
"user": 0.39451067999999995,
"system": 1.6033434200000003,
"min": 0.7046080212800001,
"max": 0.8200909042800001,
"times": [
0.8200909042800001,
0.7090938092800001,
0.71231540228,
0.7239300862800001,
0.7046080212800001,
0.73452960028,
0.7057334562800001,
0.71100494128,
0.7312431342800001,
0.7126493432800001
]
},
{
"command": "pacquet@main",
"mean": 0.72382535678,
"stddev": 0.03604301388749812,
"median": 0.7042564557800001,
"user": 0.38482367999999995,
"system": 1.61310632,
"min": 0.6895046962800001,
"max": 0.78488033428,
"times": [
0.73894456228,
0.74007233528,
0.69968817528,
0.6895046962800001,
0.6972309412800001,
0.78488033428,
0.69651085828,
0.70497657428,
0.7035363372800001,
0.7829087532800001
]
},
{
"command": "pnpm",
"mean": 2.51246736448,
"stddev": 0.06591101429431272,
"median": 2.5134972497800003,
"user": 2.986440880000001,
"system": 2.18897112,
"min": 2.39155676528,
"max": 2.65575032928,
"times": [
2.51592506328,
2.50554233228,
2.53829768628,
2.52226891628,
2.51106943628,
2.5304605862800003,
2.39155676528,
2.48852413928,
2.46527839028,
2.65575032928
]
}
]
} |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@pacquet/crates/lockfile/src/snapshot_dep_ref.rs`:
- Around line 52-56: Introduce a newtype LinkTarget and replace the raw String
in the SnapshotDepRef::Link variant with Link(LinkTarget); add an infallible
From<String> implementation for LinkTarget and update all pattern matches and
accessors (e.g., any existing as_link_target() helpers) to accept/return
LinkTarget instead of String, then update serde (Serialize/Deserialize) handling
to serialize the inner string of LinkTarget; apply the same substitutions in
resolved_dependency.rs and tests (there are ~16 call sites) so all construction,
matching, and (de)serialization use LinkTarget rather than raw String.
🪄 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: 86007580-b378-4052-aa0d-c3ccd85db969
📒 Files selected for processing (14)
pacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/lockfile/src/resolved_dependency.rspacquet/crates/lockfile/src/snapshot_dep_ref.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/package-manager/src/current_lockfile.rspacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/real-hoist/src/lib.rs
✅ Files skipped from review due to trivial changes (1)
- pacquet/crates/lockfile/src/resolved_dependency.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
pacquet/**/*.rs
📄 CodeRabbit inference engine (pacquet/AGENTS.md)
pacquet/**/*.rs: When porting a function that firespnpm:<channel>events throughglobalLogger,logger.debug(), orstreamParser.write(), mirror the call site, payload, and ordering so the reporter parses pacquet's NDJSON the same way it parses pnpm's.
Declare a newtype wrapper for branded string types. Do not collapse the brand into a plainStringor&str.
If upstream always validates before construction, validate in pacquet's wrapper too. The wrapper must construct only viaTryFrom<String>and/orFromStr. Do not provide an infallible public constructor.
If upstream never validates, just brand for type-safety. Expose an infallibleFrom<String>(andFrom<&str>when convenient).
If upstream occasionally constructs without validation, exposefrom_str_uncheckedas an escape hatch alongside the validating constructor.
Match upstream serde behavior for branded types that cross JSON, YAML, or INI boundaries. Use#[serde(try_from = "String")]for deserialization and#[serde(into = "String")]for serialization.
Use#[derive(derive_more::From)]and#[derive(derive_more::Into)]for mechanical conversion impls. Fall back to manualimplonly when conversion needs custom logic.
String-literal unions should becomeenums, not newtype wrappers. Model closed sets of valid string values as enums.
Template literal types should be treated as branded strings with validation discipline from rules 2-5.
Choose owned vs. borrowed parameters to minimize copies. Widen to the most encompassing type (&Pathover&PathBuf,&strover&String) when it doesn't force extra copies.
PreferArc::clone(&x)/Rc::clone(&x)overx.clone()for reference-counted types, so the cost is visible at the call site.
Follow Rust API Guidelines for naming conventions.
Do not use star imports inside module bodies. Writeuse super::{Foo, bar}instead ofuse super::*;. Two forms stay allowed: external-crate preludes likeuse rayon::prelude::*;and root-of-module re-...
Files:
pacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/real-hoist/src/lib.rspacquet/crates/package-manager/src/current_lockfile.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/lockfile/src/snapshot_dep_ref.rs
🧠 Learnings (2)
📚 Learning: 2026-05-20T19:40:55.051Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11774
File: pacquet/crates/resolving-deps-resolver/src/resolve_peers.rs:0-0
Timestamp: 2026-05-20T19:40:55.051Z
Learning: In the pacquet Rust code, ensure the semver implementation uses the `node-semver` crate (not `nodejs-semver`). `node-semver`’s public API does not include a `satisfies_with_prerelease`-style method; prerelease-tolerant matching should be implemented inline by first calling `Range::satisfies`, and when it rejects a prerelease version, retry matching against a stripped `MAJOR.MINOR.PATCH` base of the prerelease version.
Applied to files:
pacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/real-hoist/src/lib.rspacquet/crates/package-manager/src/current_lockfile.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/lockfile/src/snapshot_dep_ref.rs
📚 Learning: 2026-05-20T23:07:58.444Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11784
File: pacquet/crates/resolving-deps-resolver/src/hoist_peers.rs:120-133
Timestamp: 2026-05-20T23:07:58.444Z
Learning: When reviewing code in this pacquet Rust port, follow the upstream pnpm compatibility rule: only match pnpm’s behavior exactly. Do not propose review changes that intentionally deviate from pnpm’s documented/observed behavior, even if pnpm appears buggy. If you identify a real bug in pnpm behavior, the review should prioritize fixing it upstream in pnpm first, and avoid implementing a pnpm-behavior workaround here unless the same fix has already landed upstream.
Applied to files:
pacquet/crates/package-manager/src/install_frozen_lockfile.rspacquet/crates/package-manager/src/hoist.rspacquet/crates/package-manager/src/build_sequence.rspacquet/crates/package-manager/src/hoisted_dep_graph.rspacquet/crates/package-manager/src/create_symlink_layout.rspacquet/crates/lockfile/src/load_lockfile/tests.rspacquet/crates/real-hoist/src/lib.rspacquet/crates/package-manager/src/current_lockfile.rspacquet/crates/lockfile/src/snapshot_dep_ref/tests.rspacquet/crates/package-manager/src/link_bins.rspacquet/crates/package-manager/src/deps_graph.rspacquet/crates/package-manager/src/virtual_store_layout.rspacquet/crates/lockfile/src/snapshot_dep_ref.rs
🔇 Additional comments (13)
pacquet/crates/package-manager/src/build_sequence.rs (1)
105-107: LGTM!pacquet/crates/package-manager/src/deps_graph.rs (1)
153-158: LGTM!pacquet/crates/package-manager/src/hoist.rs (1)
89-94: LGTM!pacquet/crates/package-manager/src/hoisted_dep_graph.rs (1)
819-825: LGTM!pacquet/crates/package-manager/src/virtual_store_layout.rs (1)
345-348: LGTM!pacquet/crates/real-hoist/src/lib.rs (1)
504-511: LGTM!pacquet/crates/package-manager/src/current_lockfile.rs (1)
214-217: LGTM!pacquet/crates/package-manager/src/create_symlink_layout.rs (1)
63-68: LGTM!pacquet/crates/package-manager/src/link_bins.rs (1)
422-427: LGTM!pacquet/crates/package-manager/src/install_frozen_lockfile.rs (1)
1337-1341: LGTM!pacquet/crates/lockfile/src/snapshot_dep_ref.rs (1)
9-47: LGTM!Also applies to: 63-73, 78-95, 104-105, 136-138
pacquet/crates/lockfile/src/snapshot_dep_ref/tests.rs (1)
50-51: LGTM!Also applies to: 57-58, 61-69, 79-80, 93-97, 100-111, 133-145
pacquet/crates/lockfile/src/load_lockfile/tests.rs (1)
1-4: LGTM!Also applies to: 163-218, 220-283
Drop test doc-comments that restated the assertion. The test name + asserts already convey the intent; the upstream-parity reason lives at the `SnapshotDepRef::resolve` / `Link` variant docs.
Summary
SnapshotDepRef::FromStronly handled the bare-version and npm-alias shapes. Alink:<path>value in a snapshot'sdependencies:map (which pnpm writes when an injected workspace package's own deps resolve to a sibling workspace project) tripped the version parser and aborted the install.SnapshotDepRef::Link(String)variant mirroringImporterDepVersion::Link.resolve()andver_peer()now returnOption, withNonefor the link case — matching upstream'srefToRelativereturningnullforlink:references.if (childDepPath)guards ingetChildren/lockfileDepsToGraphChildren.Fixes #11775.
Test plan
pacquet/crates/lockfile/src/load_lockfile/tests.rsthat loads the lockfile shape from the issue report (b@file:packages/bsnapshot withc: link:packages/cdependency) and asserts the dep parses asSnapshotDepRef::Link("packages/c")withresolve()returningNone.snapshot_dep_ref/tests.rswithparse_link_workspace_path,resolve_link_returns_none, link cases indisplay_roundtrip/deserialize_ok, and theLinkarm ofver_peer_returns_inner_version_for_each_variant.cargo nextest run— 1720 passed, 3 skipped.cargo clippy --locked --workspace --all-targets -- --deny warnings— clean.cargo fmt --check— clean.Written by an agent (Claude Code, claude-opus-4-7).
Summary by CodeRabbit
New Features
Bug Fixes
Tests