Skip to content

chore(deps): migrate to @changesets/cli v3 with the config its defaults require - #5307

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-5296-changesets-v3
Aug 19, 2026
Merged

chore(deps): migrate to @changesets/cli v3 with the config its defaults require#5307
os-project-manager merged 2 commits into
mainfrom
claude/issue-5296-changesets-v3

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes#5296

@changesets/cli moves from ^2.31.1 to ^3.0.0 (resolves to 3.0.1), together with
every .changeset/config.json change v3's defaults require. One PR on purpose: split
apart, each half is broken silently until the next release, and no PR workflow in this
repo runs changeset status or changeset version — the only invocation is inside
.github/workflows/changeset-release.yml, on push to main. A green CI here proves the
workspace still installs and nothing more.

Rehearsal method

A throwaway clone with no remote at all, built by git archive from this branch's
HEAD, git init, and the two-commit .changeset scaffold recorded at
objectstack-ai/objectstack#9555 (base tree first, the pending changesets second). The
rehearsal tree hash is identical to the tree of the commit this PR ships
(aac0c984a4e75c8c81670aec238a56c0b42f7b6b), so the evidence below is from exactly what
is being merged. The deepen-loop hang that scaffold exists for did not occur:
changeset version finished in 9 s. Worth recording anyway — the primary checkout
here is shallow (git rev-parse --is-shallow-repository = true), so the trap is
live for anyone who rehearses in a clone of it with the remote removed.

Evidence from the real stock

.changeset/ holds 251.md files on this branch: README.md, the 249 real pending
changesets, and this PR's own. (Issue #5296 says 250 pending — that is the file count
including README.md; changesets itself reports changesets: 249.)

changeset status under v3.0.1, final tree — exit 0:

🦋 changeset v3.0.1
Packages to be bumped:
- minor
- @object-ui/app-shell
- @object-ui/auth
… 37 more …
- @object-ui/types
- object-ui

40 packages, all minor, no mixed-changeset error. Machine-readable plans were diffed:
the v3 plan is identical to the v2 plan, release for release — 45 releases (40 bumped
17.5.0 -> 17.6.0, 5 none for the ignored packages), 249 changesets, same types.

changeset version dry run under v3.0.1, final tree — exit 0, 9 s:

🦋 changeset v3.0.1
All files have been updated. Review them and commit at your leisure

330 files changed: 40 package.json bumps (every one to 17.6.0), 40 CHANGELOG.md
files, 250 changesets consumed, README.md left in place. apps/site,
packages/test-support and examples/* were untouched (0 files each), the root
package.json and pnpm-lock.yaml were untouched, and the private
packages/vscode-extension went 17.5.0 -> 17.6.0 in lockstep with the rest — which is
the behaviour privatePackages has to be set explicitly to keep. The tree was then
discarded; no release was performed, no tag written, no version PR touched.

The four v3 changes, one at a time

1. privatePackages — the trap fires today, not hypothetically

Issue #5296 states that of the pending changesets "none names" the private
object-ui, so "the trap does not fire today". That measurement is wrong.
.changeset/no-console-lint-rule.md names it beside four published packages:

'@object-ui/app-shell': patch
'@object-ui/fields': patch
'@object-ui/plugin-detail': patch
'@object-ui/runner': patch
'object-ui': patch

With the bump applied and privatePackages left undeclared, that is fatal on the current
stock — changeset statusexit 1:

Error: Found mixed changeset no-console-lint-rule
Found ignored packages: object-ui
Found not ignored packages: @object-ui/app-shell @object-ui/fields @object-ui/plugin-detail @object-ui/runner
Mixed changesets that contain both ignored and not ignored packages are not allowed
at getRelevantChangesets (@changesets/assemble-release-plan@7.0.0)

So the correction strengthens the card rather than weakening it: dependabot's bump alone
would have stopped the release lane on the very next push to main, with PR CI green.

{ "version": true, "tag": false } — the sibling repo's choice — is right here too, and
for a reason measured rather than inherited. Read out of @changesets/config@4.0.0: an
absent key now defaults to { version: false, tag: false } (v2 defaulted to
{ version: true, tag: false }), a boolean is shorthand for both fields, and each field
of the object form defaults to false individually. version: false does not merely skip
the bump — it feeds allowPrivatePackages: false into the assembler, i.e. the package is
treated as ignored. Three settings were rehearsed on the real stock:

privatePackageschangeset status
absent (v3 default)exit 1, mixed changeset
{ version: false, tag: false }exit 1, mixed changeset
{ version: true, tag: false }exit 0, plan identical to v2

tag: false is not cosmetic: getPublishPlan.mjs filters pkg.packageJson.private out of
the npm publish set unconditionally, so version: true never publishes the extension;
privatePackages.tag alone decides whether it gets a git tag, and false matches what v2
did. Moving object-ui into ignore instead was rejected — check-changeset-presence.mjs
derives its guarded surface from fixed, so ignoring the extension would silently stop
demanding a changeset for its source changes.

2. The experimental key — inert under v3, load-bearing under v2

___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH.onlyUpdatePeerDependentsWhenOutOfRange
is removed in the same commit as the bump. Measured both ways rather than assumed:
@changesets/assemble-release-plan@6.0.10 (what v2 resolves) references
onlyUpdatePeerDependentsWhenOutOfRange6 times in its dist; @7.0.0 (what v3
resolves) references it 0 times. @changesets/config@4.0.0 still parses and defaults
the key, so it is accepted and dead rather than rejected — and a v3 run with the key
re-added produced a byte-identical release plan to the run without it.

3. ESM-only, engines: ^22.11 || ^24 || >=26 — the repo pin does not satisfy it

Measured from the installed package: "engines": { "node": "^22.11 || ^24 || >=26", "npm": ">=10.9.0", "pnpm": ">=10.0.0", "yarn": ">=4.5.2" }, "type": "module".

This repo declares "engines": { "node": ">=22", "pnpm": ">=9" }. Neither range is a
subset of v3's: >=22 admits 22.0–22.10, 23.x and 25.x, all of which v3 rejects, and
>=9 admits pnpm 9. Nothing enforces it today — there is no engine-strict in
.npmrc (it contains only auto-install-peers=true), the repo pins
packageManager: pnpm@10.31.0, and every workflow runs node-version: '22.x', which
resolves to a 22.11+ release. So the migration is safe as it stands, but the declared
range is looser than what the toolchain now requires. Deliberately not changed here
tightening engines.node affects every consumer of this workspace and is a decision, not
a rider on a tooling bump. Filed separately as #5306.

4. changeset version on an empty plan — measured, and the workflow needs no change

The exit-code change is real and reproduced:

stockv2.31.1v3.0.1
no changeset files at allexit 0, warn No unreleased changesets found, exiting.exit 1, No unreleased changesets found.
only an empty-frontmatter changesetexit 0, file consumedexit 0, file consumed

That second row matters here, because an empty-frontmatter changeset is this repo's
declaration mechanism for changes that publish nothing — it is not an empty plan as far
as the exit code is concerned.

It is nevertheless unreachable through changeset-release.yml. Rather than reason
about it, the pinned action's source was read: changesets/action@v1 currently resolves to
v1.9.0, whose src/index.ts (and the compiled dist/index.js that actually runs)
branches before ever invoking the version: input:

case !hasChangesets && hasPublishScript: -> "No changesets found. Attempting to publish …" (runPublish)
case hasChangesets && !hasNonEmptyChangesets: -> "All changesets are empty; not creating PR" (returns)
case hasChangesets: -> runVersion(...)

The workflow supplies both version: and publish:, so an empty .changeset/ takes the
first branch and pnpm changeset:version is never run; a stock of only empty-frontmatter
changesets takes the second and it is never run either. runVersion is reached only when
at least one changeset carries a release, i.e. exactly when the plan is non-empty. The
action reads the changesets with its own bundled @changesets/*, so this bump cannot
change which branch it takes.

Conclusion: .github/workflows/changeset-release.yml is unchanged in this PR, and the
card's item 4 is answered "no real change" with the source to back it.

Gate scripts under v3

scripts/check-changeset-no-major.mjsnothing in it models v2, deliberately: it
hand-parses YAML frontmatter and may not import @changesets/*, because
.github/workflows/changeset-guard.yml runs it on a bare checkout with no install. Its
self-test asserts on the parser, on repo state, and on the guard workflow; all of that is
version-agnostic. Run under v3: green, unchanged. (The header's "39 packages" was checked
against the config rather than trusted — fixed holds 40 names, of which 39 are
publishable and one, object-ui, is private. The comment is accurate.)

scripts/check-changeset-fixed.mjs — this is the one that modelled v2. Its single rule
("every workspace package is in fixed or ignore") was complete only while privacy did
not affect release membership, and it passes happily on precisely the config that makes
changeset status exit 1. Two rules added, both derived from the failure measured above:

  1. privatePackages must be declared. Silence is no longer a safe default; v2 and v3
    read the same silence as opposite values.
  2. A private package in the fixed group must not be paired with
    privatePackages.version: false. That combination is a contradiction changesets does
    not diagnose at config-read time — it surfaces later as the mixed-changeset error, from
    whichever changeset happens to trip it first.

Reverse-verified on this branch, from the committed state: deleting the key turns the gate
red (rule 1) and setting version: false turns it red (rule 2) — and in that same state
the CLI itself fails with the mixed-changeset error, so the gate's verdict coincides with
the real one. ignore/fixed matching also became glob-aware, matching how changesets
expands those lists when it reads the config and how check-changeset-presence.mjs
already matched them; inert on today's config, wrong only later.

Beyond the claimed file territory:scripts/__tests__/check-changeset-fixed.test.ts is
new. The card asks for both gate scripts' self-tests to pass and model v3; this script had
no self-test at all (only check-changeset-no-major and check-changeset-presence
have one), so the acceptance criterion could not otherwise be met. It drives the pure
helpers directly, pins the repo's own config, and pins the shape the rules exist for (a
private object-ui inside fixed). Verified live: with the key removed, 2 of its 13 tests
fail with the intended messages.

Verification

All at c488fd7, the commit this PR ships, working tree clean:

  • pnpm exec vitest run --project unit scripts/__tests__/check-changeset-fixed.test.ts scripts/__tests__/check-changeset-no-major.test.ts scripts/__tests__/check-changeset-presence.test.ts scripts/__tests__/merge-queue-reporting.test.ts4 files, 66 tests, all pass
  • pnpm changeset:check — green, now also reporting privatePackages declared: version=true, tag=false
  • node scripts/check-changeset-presence.mjs — green (no source of a released package changed in this range; a changeset is added anyway, per the repo convention)
  • pnpm check:control-bytes — green (4688 files)
  • pnpm type-check:scripts, pnpm lint:coverage, eslint on both changed script files — green

Non-goals honoured

No release was performed: no changeset publish, no version tag, no release-workflow
dispatch, no version PR merged. Pre mode was not entered (.changeset/pre.json still does
not exist). The changesets/action@v1 pin is untouched — its source was read, not changed,
and whether objectstack-ai/objectstack#9208's reasoning applies here remains a separate
question. .github/workflows/dependabot-auto-merge.yml and all 249 pre-existing changeset
files are untouched. Dependabot's #4950 stays open and unmerged; dependabot retires it on
its own once main carries ^3.0.0.

Changeset

.changeset/changesets-cli-v3-migration-5296.md, empty frontmatter — this PR publishes
nothing (root devDependency, changeset config, CI helper scripts). objectui has no
skip-changeset label and none was minted.


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)25.3 KB350 KB
Entry fileindex-rutq2Tr4.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.83KB3.70KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)29.33KB7.05KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.79KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.71KB1.22KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)506.27KB113.31KB
core (index.js)4.11KB1.62KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)159.80KB44.34KB
fields (index.js)237.07KB59.46KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.42KB1.39KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)29.43KB7.15KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)39.16KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.35KB3.31KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.42KB1.42KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.81KB0.83KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.75KB18.37KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)127.97KB32.84KB
plugin-designer (index.js)212.39KB42.83KB
plugin-detail (index.js)241.46KB60.56KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)123.77KB30.07KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)198.22KB53.27KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.66KB27.13KB
plugin-map (index.js)19.96KB6.56KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)42.84KB11.77KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.34KB20.61KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)36.10KB12.26KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.33KB0.69KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (index.js)4.77KB2.16KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)10.76KB3.17KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)6.92KB2.40KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.08KB1.53KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-project-managerClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review-of-record — checked against origin/main (7260a1ed4) and the diff on this PR, not against the dev seat's report.

The card's own measurement was wrong, and this PR is right.#5296 stated that no pending changeset names the private object-ui. I re-read .changeset/no-console-lint-rule.md on origin/main directly: it names object-ui beside @object-ui/app-shell, fields, plugin-detail, runner. So the mixed-changeset failure is live on today's stock, not a future risk. Corrected on the card; the error was mine (I searched the bare name, which is a substring of all 40 @object-ui/* scoped names, without anchoring on ^'object-ui':).

Verified independently, three claims that the whole shape rests on:

  1. "No PR workflow runs changeset status or changeset version." Confirmed — git grep over origin/main returns exactly two hits: .github/workflows/changeset-release.yml:67 (version: pnpm changeset:version) and the package.json script it names. No changeset status anywhere in the repo. So a green run on this PR genuinely proves only that the workspace installs, and the rehearsal is the actual evidence.
  2. changeset-release.yml needs no change. The workflow supplies bothversion: and publish: (lines 66–69) — that is precisely the precondition the branch argument needs, so the !hasChangesets && hasPublishScript path is reachable and runVersion is not. The conclusion is consistent with the pinned action's shape, and it is recorded falsifiably (v1.9.0, source and dist).
  3. check-changeset-no-major.mjs models nothing version-specific. Confirmed at source: it imports only node:fs/node:path/node:url, and its own header states it may not import @changesets/* because the guard runs on a bare checkout. Correctly left untouched — an untouched file here is the right answer, not a missed one.

Ruling on the one out-of-territory file.scripts/__tests__/check-changeset-fixed.test.ts is outside the file surface the PM claim comment declared. Accepted: #5296's acceptance asks for both gate scripts' self-tests to pass and model v3, and this script had no self-test at all, so the criterion was otherwise unmeetable. It is a scripts-only test, touches no product surface, and the addition was disclosed rather than found. Also checked that its globMatcher matches the ignoreMatcher/PACKAGE_ROOTS convention check-changeset-presence.mjs already uses, so the two gates still compose.

The decision not to move object-ui into ignore is right for the stated reason, and I verified the reason rather than taking it: check-changeset-presence.mjs derives its guarded surface from fixed, so ignoring the extension would silently stop demanding a changeset for its source.

CI at c488fd7: 12 green (including all three changeset gates), 7 still running, 0 failures. Not ready-for-review until it converges; nothing here needs a change in the meantime.

Out of scope and correctly split out rather than ridden in: #5306 (root engines looser than the toolchain now requires).


Generated by Claude Code

@os-project-managerClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review-of-record, part 2 — the privatePackages chain, verified from the packages rather than from the report.

The PR argues { "version": true, "tag": false } from a semantics claim plus a three-row measurement. I re-derived the semantics myself, by unpacking both config packages and reading the defaulting code:

@changesets/config@3.1.2 (what v2 resolves), absent key:

privatePackages: json.privatePackages===false ? {tag: false,version: false}
: json.privatePackages ? {version: ??true,tag: ??false}
: {version: true,tag: false}// ← absent

@changesets/config@4.0.0 (what v3 resolves), absent key:

if(typeofwrittenConfig.privatePackages!=="object")config.privatePackages={version: writtenConfig.privatePackages??false,tag: writtenConfig.privatePackages??false};

So the same silence reads {version: true, tag: false} under v2 and {version: false, tag: false} under v3. The inversion is real, and { "version": true, "tag": false } is exactly the value that holds this repo's existing behaviour still — it is not inherited from the sibling repo, it is the only value that changes nothing.

The remaining link is confirmed too: @changesets/assemble-release-plan@7.0.0 contains 6 sites of literally allowPrivatePackages: config.privatePackages.version, which is how version: false turns into ignored rather than merely unbumped, and thence into the mixed-changeset refusal.

Same method on §2's claim: onlyUpdatePeerDependentsWhenOutOfRange appears 12 times across @changesets/assemble-release-plan@6.0.10's dist and 0 times in @7.0.0's. (The PR body says 6 — that is per build output; v6 ships both a cjs and an esm bundle. Same fact, different denominator, no correction needed.)

On the last check still running.Live E2E (informational) is the only non-completed run, and it is not a gate: .github/workflows/live-e2e.yml sets continue-on-error: true and its own header marks it an informational, non-required lane. Verified in the workflow rather than inferred from the job name. Everything else at c488fd7 is green — 18 success, 2 skipped, 0 failures, including all three changeset gates.

Review passes. Marking ready and sending it through the merge queue; not merging by hand.


Generated by Claude Code

@os-project-manager
os-project-manager marked this pull request as ready for review August 19, 2026 08:43
@os-project-manager
os-project-manager added this pull request to the merge queueAug 19, 2026
Merged via the queue into main with commit e7c3b3eAug 19, 2026
21 of 22 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-5296-changesets-v3 branch August 19, 2026 08:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Migrate to @changesets/cli v3 — one PR carrying the bump plus the config changes v3's defaults require

2 participants

@os-project-manager@claude