Skip to content

Release with the shared toolchain instead of a local copy - #41

Merged
stefanoverna merged 3 commits into
mainfrom
release-toolchain
Aug 31, 2026
Merged

Release with the shared toolchain instead of a local copy#41
stefanoverna merged 3 commits into
mainfrom
release-toolchain

Conversation

@stefanoverna

@stefanoverna stefanoverna commented Aug 31, 2026

Copy link
Copy Markdown
Member

toolchain/publish.mjs here was one of four 88–97% identical copies of the same
~280-line script. Three of them, this one included, never got the fix that lets
an interrupted release resume (git merge-base --is-ancestor) — which is the
exact scenario the script exists for.

@datocms/release-toolchain is
that script, once, shared by all eleven DatoCMS repos that publish to npm. It
derives the repository root, the release branch (.changeset/config.json
baseBranch) and the tag shape instead of hard-coding them, so the same code
releases a ten-package workspace and a single-package repo. It is installed
from the repo by git tag and never published to npm — the @datocms scope is
what customers install, and internal automation does not belong there.

No behaviour change is expected here. The commit-subject rule the shared
script adopted is the one this repo already had, so releases keep reading
exactly as they did.

What changed

  • toolchain/ is gone (–284 lines).
  • publishrelease, publish-nextrelease:next. Harmless in this repo,
    where the root package.json is private, but publish is a name npm runs
    itself during npm publish; the single-package repos migrating next would
    re-enter their own release script if they kept it.
  • @manypkg/get-packages dropped — the deleted script was its only consumer.
  • Docs updated in README.md, CLAUDE.md and .changeset/README.md.

Two things the shared script adds

  • The tag is derived (vX.Y.Z when the repo is one package, name@version in a
    workspace) rather than hard-coded, and a step between changeset publish and
    git push checks that its derivation and changesets' agree — while the only
    thing that has happened is a publish. A mismatch found after the push is found
    with npm already committed.
  • The preflight prints the toolchain version, so a repo running a stale pin is
    visible in the release log.

https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ

Stefano Verna added 2 commits August 31, 2026 11:53
toolchain/publish.mjs here was one of four 88-97% identical copies of the
same script. Three of them, this one included, never got the fix that lets an
interrupted release resume — which is the scenario the script exists for.

@datocms/release-toolchain is that script, once. It derives the repository
root, the release branch and the tag shape instead of hard-coding them, so
the same code releases a ten-package workspace and a single-package repo. It
is pinned by git tag and never published to npm.

The commit-subject rule this repo already had is the one the shared script
adopted, so releases here keep reading exactly as they did.

The scripts are renamed publish -> release, publish-next -> release:next.
Harmless in this repo, where the root is private, but 'publish' is a name npm
runs itself during 'npm publish', and the singles migrating next would
re-enter their own release script if they kept it.

Claude-Session: https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ
Rehearsing the resume against a real registry and a real GitHub repo turned
up a bug that every copy of the old script had: killed between
'changeset publish' and 'git push', the next run reads an empty plan - the
packages are on the registry and their tags are local, which is all
changesets looks at - and aborts with 'there is nothing to release', leaving
the commit unpushed and no GitHub release. v1.1.0 finishes that release.

Claude-Session: https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ
@pkg-pr-new

pkg-pr-new Bot commented Aug 31, 2026

Copy link
Copy Markdown

Open in StackBlitz

datocms-contentful-to-structured-text

npm i https://pkg.pr.new/datocms-contentful-to-structured-text@e7ade01

datocms-structured-text-dastdown

npm i https://pkg.pr.new/datocms-structured-text-dastdown@e7ade01

datocms-structured-text-generic-html-renderer

npm i https://pkg.pr.new/datocms-structured-text-generic-html-renderer@e7ade01

datocms-html-to-structured-text

npm i https://pkg.pr.new/datocms-html-to-structured-text@e7ade01

datocms-structured-text-slate-utils

npm i https://pkg.pr.new/datocms-structured-text-slate-utils@e7ade01

datocms-structured-text-to-dom-nodes

npm i https://pkg.pr.new/datocms-structured-text-to-dom-nodes@e7ade01

datocms-structured-text-to-html-string

npm i https://pkg.pr.new/datocms-structured-text-to-html-string@e7ade01

datocms-structured-text-to-markdown

npm i https://pkg.pr.new/datocms-structured-text-to-markdown@e7ade01

datocms-structured-text-to-plain-text

npm i https://pkg.pr.new/datocms-structured-text-to-plain-text@e7ade01

datocms-structured-text-utils

npm i https://pkg.pr.new/datocms-structured-text-utils@e7ade01

commit: e7ade01

v1.2.0 adds a guard a package runs from prepublishOnly to refuse a
hand-typed 'npm publish'. This repo does not use it: the root package.json is
private, so the same slip publishes nothing. The seven single-package repos
carry it, where 'npm publish' at the repo root does reach npm.

The lockfile is the substantive part of this commit. Changing the spec alone
left the previous SHA resolved, so 'npm ci' kept installing v1.0.0 while
package.json claimed otherwise.

Claude-Session: https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ
@stefanoverna
stefanoverna merged commit 5ef801e into main Aug 31, 2026
4 checks passed
@stefanoverna
stefanoverna deleted the release-toolchain branch August 31, 2026 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant