chore!: put all eight packages on one lockstep version at 0.2.0 - #47
Merged
Conversation
An application installs a kernel and two or three starters together, so 'which @btravstack/http goes with @btravstack/core@0.4.1' is a question nobody should have to answer. A changesets `fixed` group makes every release bump all eight, whether or not they changed — Spring Boot's model. @btravstack/di is the only one with a published history (0.1.0, from its standalone repo). The unified line starts at 0.2.0: above that, and 0.x because the API still moves. di's peer range was a hardcoded ^0.1.0 while every other in-repo peer used workspace:^. That pin would have gone stale silently on the first bump; it is workspace:^ now, which pnpm rewrites to a real range at publish, so consumers still install their own copy. The 19 pending changesets are consumed into the CHANGELOGs rather than squashed — each was written when its change was fresh. Recorded in CLAUDE.md, including the constraint that bit here: changesets majors any package whose peer dependency takes a minor, so from 0.2.0 a patch gives 0.2.1 but a minor gives 1.0.0. Neither documented escape hatch suppresses it, and the internal peers cannot become ordinary dependencies. This release overrode the computed 1.0.0 by hand.
There was a problem hiding this comment.
Pull request overview
This PR establishes lockstep versioning across the eight published @btravstack/* packages starting at 0.2.0, enforced via a Changesets fixed group, and updates release documentation to make the policy explicit.
Changes:
- Adds a Changesets
fixedgroup so all eight packages always share one version number. - Aligns package versions to
0.2.0and normalizes internal peer dependency ranges toworkspace:^. - Consumes existing pending changesets into per-package
CHANGELOG.mdfiles and removes the consumed.changeset/*.mdentries.
Reviewed changes
Copilot reviewed 37 out of 37 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/testing/package.json | Bumps package version to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/testing/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| packages/temporal/package.json | Bumps package version to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/temporal/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| packages/observability/package.json | Bumps package version to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/observability/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| packages/http/package.json | Bumps package version to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/http/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| packages/di/package.json | Bumps @btravstack/di from 0.1.0 to 0.2.0. |
| packages/di/CHANGELOG.md | Adds 0.2.0 section documenting relevant changes. |
| packages/core/package.json | Bumps @btravstack/core from 0.1.0 to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/core/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| packages/config/package.json | Bumps package version to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/config/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| packages/amqp/package.json | Bumps package version to 0.2.0 and repins @btravstack/di peer range to workspace:^. |
| packages/amqp/CHANGELOG.md | Adds 0.2.0 changelog content (consumed changesets). |
| CLAUDE.md | Documents the lockstep versioning policy and rationale. |
| .changeset/config.json | Adds the fixed group containing all eight published packages. |
| .changeset/unit-signal.md | Removed (consumed into CHANGELOGs). |
| .changeset/unit-module.md | Removed (consumed into CHANGELOGs). |
| .changeset/testing-package.md | Removed (consumed into CHANGELOGs). |
| .changeset/temporal.md | Removed (consumed into CHANGELOGs). |
| .changeset/temporal-starter.md | Removed (consumed into CHANGELOGs). |
| .changeset/runtime-port.md | Removed (consumed into CHANGELOGs). |
| .changeset/run-main-front-door.md | Removed (consumed into CHANGELOGs). |
| .changeset/ponytail-audit.md | Removed (consumed into CHANGELOGs). |
| .changeset/observability.md | Removed (consumed into CHANGELOGs). |
| .changeset/initial-kernel.md | Removed (consumed into CHANGELOGs). |
| .changeset/http.md | Removed (consumed into CHANGELOGs). |
| .changeset/http-unit-defects.md | Removed (consumed into CHANGELOGs). |
| .changeset/http-handler-port.md | Removed (consumed into CHANGELOGs). |
| .changeset/drop-version-const.md | Removed (consumed into CHANGELOGs). |
| .changeset/drain-and-shutdown-fixes.md | Removed (consumed into CHANGELOGs). |
| .changeset/di-declared-pieces.md | Removed (consumed into CHANGELOGs). |
| .changeset/config-and-starters.md | Removed (consumed into CHANGELOGs). |
| .changeset/amqp.md | Removed (consumed into CHANGELOGs). |
| .changeset/amqp-starter.md | Removed (consumed into CHANGELOGs). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Rewriting the computed 1.0.0 down to 0.2.0 caught the eight CHANGELOG headings and the eight package.json versions, but not the 'Updated dependencies' lists inside seven of those changelogs — which changesets also writes with the computed version. Left alone they would have published @btravstack/di@1.0.0 and friends as the dependency line of a 0.2.0 release. CLAUDE.md now names that third place explicitly, and disambiguates the two escape hatches: both are under ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH and neither is the updateInternalDependencies already in our config.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
All eight published packages now share one version number, starting at 0.2.0.
An application installs a kernel and two or three starters together, so "which
@btravstack/httpgoes with@btravstack/core@0.4.1" is a question nobody shouldhave to answer. A changesets
fixedgroup makes every release bump all eight —Spring Boot's model.
Why 0.2.0
@btravstack/diis the only package with a published history —0.1.0, from itsstandalone repository, before the merge. The unified line has to start above that,
and stays in 0.x because the API still moves: this repo removed
Port.manyandwithAppin a single afternoon.@btravstack/di0.1.0(published)0.2.0@btravstack/core0.1.00.2.0config·testing·observability·http·temporal·amqp0.0.00.2.0A latent bug this uncovered
maintoday would publish six packages at1.0.0. Not because of anything inthis PR — it is already true. Verified by running
changeset versiononmainunmodified:
changesets majors any package whose
peerDependencyis bumped by a minor, andfrom 0.x a major is
1.0.0. Every package here peer-depends on@btravstack/di,and most on
configandcore. Isolated to a single changeset: oneminoron@btravstack/configalone drives six unrelated packages to1.0.0.So the next
pnpm run versiononmainwould have shipped seven packages at 1.0.0— declaring API stability — while
di, the most mature of them, sat at 0.2.0.What that means going forward, measured
Neither documented escape hatch suppresses the rule
(
onlyUpdatePeerDependentsWhenOutOfRange,updateInternalDependents: "out-of-range"— both tried on changesets 2.31.1, neither changes the result), and the internal
peers cannot become ordinary dependencies: the dual-copy hazard is the reason they
are peers at all.
patchchangeset0.2.1— the whole group, as intendedminorchangeset1.0.0— the whole groupSo the first feature release after this one lands on 1.0.0 unless it is overridden
by hand. This release overrode it:
changeset versioncomputed1.0.0, and theeight
package.jsonversions and eightCHANGELOG.mdheadings were rewritten to0.2.0. That is recorded inCLAUDE.mdunder a new Versioning section so thedecision is deliberate next time rather than a surprise.
Also in here
di's peer range was a hardcoded^0.1.0while every other in-repo peer usedworkspace:^. A literal range in a peer field is a pin that goes stale silentlythe first time the dependency is bumped — which lockstep guarantees. It is
workspace:^now, which pnpm rewrites to a real^range at publish, so aconsumer still installs their own single copy.
CLAUDE.md's paragraph documentingthe old pin is updated.
each was written when its change was fresh and says why.
Gate
format --check,lint,knip,typecheck(28/28),build(9/9) green;test24/24 tasks.packages/amqpandexamples/order-amqp-workernot runlocally (no Docker daemon).
pnpm install --frozen-lockfileis clean — the peerrepin needed no lockfile change.
Nothing is published by this PR. Releases are still manual (
pnpm run version,then
pnpm run release); this only sets the policy and the starting line.