Problem
No way today to express "these N packages move in lockstep". The only mechanism approaching it is `dependsOn` which forces a cascade but doesn't share the version number.
Comparison
changesets:
- `linked`: packages bump together when one gets commits (e.g. `react` + `react-dom` both go from 1.2.3 to 1.2.4 when one of them gets a fix)
- `fixed`: packages share an identical version line forever (`@scope/a` and `@scope/b` are always the same)
lerna had this as `mode: "fixed"`.
Proposal
```toml
[workspace]
linked = [["react", "react-dom"]]
fixed = [["@scope/a", "@scope/b", "@scope/c"]]
```
In `src/monorepo/run/mod.rs`, after computing per-package bumps:
- For each `linked` group: take `max(bump_type)` across the group, apply to all members only if at least one member was bumped. Names stay distinct but version equal.
- For each `fixed` group: ignore individual bump signals; apply max across the union to all members on every release where any has a commit. All version files written to the same string.
Edge cases
- Member appears in both linked and fixed → validate-time error.
- Member listed in linked/fixed but missing from `package[]` → validate-time error.
- Prerelease channels interact: a fixed group on `beta` channel needs all members to bump on the same prerelease counter.
Test plan
- Linked: commit `feat:` on pkg A in a linked ["A", "B"] group. Assert B's version bumps the same minor amount even though no commits touched it.
- Fixed: commit `feat:` on A, `fix:` on B in fixed ["A", "B", "C"]. Assert all three end up on the same minor version (max of bumps), including C.
Problem
No way today to express "these N packages move in lockstep". The only mechanism approaching it is `dependsOn` which forces a cascade but doesn't share the version number.
Comparison
changesets:
lerna had this as `mode: "fixed"`.
Proposal
```toml
[workspace]
linked = [["react", "react-dom"]]
fixed = [["@scope/a", "@scope/b", "@scope/c"]]
```
In `src/monorepo/run/mod.rs`, after computing per-package bumps:
Edge cases
Test plan