Repository navigation
chore(release): version packages - #224
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
3 times, most recently
from
November 14, 2026 11:59
fa1f9c2 to
f597967
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
7 times, most recently
from
November 15, 2026 08:27
a3deb61 to
fd37a70
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
November 15, 2026 09:03
fd37a70 to
a203674
Compare
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.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@cloudhal/[email protected]
Minor Changes
f41802b:
cloudhal deploy --releaseinstalls the signed release of the CLI's own version instead of building the project (RFC-0046 §11b, @cloudhal/release-verify package and cloudhal deploy --release (RFC-0046) #227).~/.cloudhal/release-trust.json, so a rolled-back list, a replayed key list or a revoked yank key is refused.v0.8.0and older have none. The CLI verifies it with@cloudhal/release-verify: the keys reduced by both lists, yanked versions refused, and every file checked against its digest.gh.--allow-single-factorcontinues on the release key alone whenghis unavailable; a failed attestation is always refused.--discard-local-themeis given. Itscloudhal.jsonbuild keys must match the starter's, a key the CLI does not know is refused, and the installed wrangler must be at least the bundle's..cloudhal/deploy/release/<version>/. Both Workers are then deployed withno_bundlewrangler configs that upload exactly those bytes.--from <dir>installs offline from the assets and both lists, and--release --dry-runstops before wrangler.The CLI now depends on
@cloudhal/release-verify.@cloudhal/release-verifynow typechecks under every consumer's lib settings: WebCrypto inputs areArrayBuffer-backed views, and the gzip pipe is typed through explicitly.@cloudhal/astro-renderernames the Site Worker's single-site choicesingleSiteId, so a test holds thatCLOUDHAL_SITE_IDoverrides the built id.Patch Changes
49720db:
render_pageon Node gives a slow Chrome more chances to start. A launch that hangs past its start budget or exits is killed, and the renderer tries again up to three times. Each try uses a new profile, and the pause doubles from 1 s. The error says how long a launch may take and how many tries were made. A Chrome that crashes after it started is launched again by the next render, and its profile is removed (CI: render-chrome test fails when Chrome does not start on a busy runner #207).74d7098: RFC-0045 rollout step 7b: reference and repeater fields are now enabled. Sites can define
referencefields (entries of one to five collections of the same site, one or several, with optional conditions) andrepeaterfields (ordered lists of items with up to ten flat sub-fields) wherever the renderer serving them reads the two types. See docs/guides/fields.md.GET /__cloudhal/featureswithfields: 2(0.9.0 and later): the admin Worker asks the Worker each site is routed to (SITE, or an attachedSITE_n), as it asks for time gates, and remembers a yes for that Worker only. Time gates are now confirmed per site Worker too, so a site on an older attached Worker no longer inherits the installation Worker's answer. Deploy the site Worker first; until it reportsfields: 2, the types stay refused withfields_unsupportedon every path. On Node (cloudhal dev,studio, self-host, Docker) and in the playground, always, since the renderer runs in the same process (openLocalStorepassesFIELDS_SUPPORTED).cloudhal push(the admin route passes the store's capability),pull,cloudhal import(dry runs included),--replaceand--revert. A bundle that defines either type is still refused whole where the capability does not hold, and a site's new snapshot cannot point at another site's held site body to bring the types in.update_collectionandchange_field_typelist both types, and/api/instanceanswersfeatures.referenceFields: true, on servers that have the capability. The store still decides per site.entry_refscheck per site (rebuildEntryRefs, new core-ts export): the admin Worker's newrefs.rebuildsystem job (every five minutes, offset fromlists.backfill, until every site is done; then two reads a run), andopenLocalStoreat start-up. Rows are written per entry, anchored on the hash each entry was read with, so a concurrent edit keeps its own rows; each chunk is anchored on the site node's hash, so no statement grows with the site's settings; it leaves a site alone while a text ↔ reference type change runs there; progress is in the newentry_refs_statetable (storage migration0034_entry_refs_state), so a run stopped anywhere resumes. It is a safety net and should find nothing to change.9501d81: Studio's list toolbars come from one shared
@cloudhal/uiblock. The search now fills the free width of the row, and the filters, other actions, sort and refresh follow in a fixed order.@cloudhal/uialso gainsStatusIndicator,UsageMeterRow, a "View docs" pill onPageLayout, and a resource mode for one resource's detail page: its tabs under the top bar, actions on the right, and no large title (@cloudhal/ui: dashboard-pattern blocks (resource tabs, docs link, list toolbar, status indicator, usage meter row) #228).Updated dependencies [4cb3ac6]
Updated dependencies [f41802b]
Updated dependencies [5baacb4]
Updated dependencies [61825b8]
Updated dependencies [3ffdf29]
Updated dependencies [74d7098]
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
74d7098: RFC-0045 rollout step 7b: reference and repeater fields are now enabled. Sites can define
referencefields (entries of one to five collections of the same site, one or several, with optional conditions) andrepeaterfields (ordered lists of items with up to ten flat sub-fields) wherever the renderer serving them reads the two types. See docs/guides/fields.md.GET /__cloudhal/featureswithfields: 2(0.9.0 and later): the admin Worker asks the Worker each site is routed to (SITE, or an attachedSITE_n), as it asks for time gates, and remembers a yes for that Worker only. Time gates are now confirmed per site Worker too, so a site on an older attached Worker no longer inherits the installation Worker's answer. Deploy the site Worker first; until it reportsfields: 2, the types stay refused withfields_unsupportedon every path. On Node (cloudhal dev,studio, self-host, Docker) and in the playground, always, since the renderer runs in the same process (openLocalStorepassesFIELDS_SUPPORTED).cloudhal push(the admin route passes the store's capability),pull,cloudhal import(dry runs included),--replaceand--revert. A bundle that defines either type is still refused whole where the capability does not hold, and a site's new snapshot cannot point at another site's held site body to bring the types in.update_collectionandchange_field_typelist both types, and/api/instanceanswersfeatures.referenceFields: true, on servers that have the capability. The store still decides per site.entry_refscheck per site (rebuildEntryRefs, new core-ts export): the admin Worker's newrefs.rebuildsystem job (every five minutes, offset fromlists.backfill, until every site is done; then two reads a run), andopenLocalStoreat start-up. Rows are written per entry, anchored on the hash each entry was read with, so a concurrent edit keeps its own rows; each chunk is anchored on the site node's hash, so no statement grows with the site's settings; it leaves a site alone while a text ↔ reference type change runs there; progress is in the newentry_refs_statetable (storage migration0034_entry_refs_state), so a run stopped anywhere resumes. It is a safety net and should find nothing to change.Updated dependencies [4cb3ac6]
Updated dependencies [f41802b]
Updated dependencies [61825b8]
Updated dependencies [74d7098]
@cloudhal/[email protected]
Patch Changes
4cb3ac6: The
cloudflaretarget no longer bakesdataDirintovirtual:cloudhal/config(release: drift guard that the cloudflare target ignores dataDir (RFC-0046 §11b) #239, RFC-0046 §11b). The Site Worker reads D1 and R2 through its bindings and never read the field. The baked value was the build machine's absolute data path, so a release bundle built in CI would have carried that path to every deployment. Node targets (cloudhal dev, static builds) keep it.The virtual module is now typed as
VirtualCloudhalConfig, withdataDiroptional; the type is exported, and the starter'senv.d.tsuses it. Theme code that readsdataDirmust handle its absence on the Cloudflare Site Worker.f41802b:
cloudhal deploy --releaseinstalls the signed release of the CLI's own version instead of building the project (RFC-0046 §11b, @cloudhal/release-verify package and cloudhal deploy --release (RFC-0046) #227).~/.cloudhal/release-trust.json, so a rolled-back list, a replayed key list or a revoked yank key is refused.v0.8.0and older have none. The CLI verifies it with@cloudhal/release-verify: the keys reduced by both lists, yanked versions refused, and every file checked against its digest.gh.--allow-single-factorcontinues on the release key alone whenghis unavailable; a failed attestation is always refused.--discard-local-themeis given. Itscloudhal.jsonbuild keys must match the starter's, a key the CLI does not know is refused, and the installed wrangler must be at least the bundle's..cloudhal/deploy/release/<version>/. Both Workers are then deployed withno_bundlewrangler configs that upload exactly those bytes.--from <dir>installs offline from the assets and both lists, and--release --dry-runstops before wrangler.The CLI now depends on
@cloudhal/release-verify.@cloudhal/release-verifynow typechecks under every consumer's lib settings: WebCrypto inputs areArrayBuffer-backed views, and the gzip pipe is typed through explicitly.@cloudhal/astro-renderernames the Site Worker's single-site choicesingleSiteId, so a test holds thatCLOUDHAL_SITE_IDoverrides the built id.Updated dependencies [61825b8]
Updated dependencies [74d7098]
@cloudhal/[email protected]
Patch Changes
74d7098: RFC-0045 rollout step 7b: reference and repeater fields are now enabled. Sites can define
referencefields (entries of one to five collections of the same site, one or several, with optional conditions) andrepeaterfields (ordered lists of items with up to ten flat sub-fields) wherever the renderer serving them reads the two types. See docs/guides/fields.md.GET /__cloudhal/featureswithfields: 2(0.9.0 and later): the admin Worker asks the Worker each site is routed to (SITE, or an attachedSITE_n), as it asks for time gates, and remembers a yes for that Worker only. Time gates are now confirmed per site Worker too, so a site on an older attached Worker no longer inherits the installation Worker's answer. Deploy the site Worker first; until it reportsfields: 2, the types stay refused withfields_unsupportedon every path. On Node (cloudhal dev,studio, self-host, Docker) and in the playground, always, since the renderer runs in the same process (openLocalStorepassesFIELDS_SUPPORTED).cloudhal push(the admin route passes the store's capability),pull,cloudhal import(dry runs included),--replaceand--revert. A bundle that defines either type is still refused whole where the capability does not hold, and a site's new snapshot cannot point at another site's held site body to bring the types in.update_collectionandchange_field_typelist both types, and/api/instanceanswersfeatures.referenceFields: true, on servers that have the capability. The store still decides per site.entry_refscheck per site (rebuildEntryRefs, new core-ts export): the admin Worker's newrefs.rebuildsystem job (every five minutes, offset fromlists.backfill, until every site is done; then two reads a run), andopenLocalStoreat start-up. Rows are written per entry, anchored on the hash each entry was read with, so a concurrent edit keeps its own rows; each chunk is anchored on the site node's hash, so no statement grows with the site's settings; it leaves a site alone while a text ↔ reference type change runs there; progress is in the newentry_refs_statetable (storage migration0034_entry_refs_state), so a run stopped anywhere resumes. It is a safety net and should find nothing to change.Updated dependencies [74d7098]
@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
61825b8: Signed key and yank lists for release bundles (RFC-0046 §9, Release signing phase 2: signed keys.json and yanked.json, key expiry, KMS custody (RFC-0046 §9) #226).
@cloudhal/core-contractsgains therelease-keysroot (keys.json, signed by an offline root) and therelease-yank-listroot (yanked.json, signed by a yank key and expiring 30 days after it is issued).@cloudhal/release-verifygains:verifyKeys, which checks a pinned root's signature and that the list is fresh (expiresat most 13 months afterissuedAt);verifyYanked, which checks a signature by an active yank key thatkeys.jsonlists, and refuses a stale list withstale-yank-list;rememberYanksand thememoryoption ofverifyKeysandverifyYanked, for consumers that keep state: they refuse a rolled-back or pruned yank list, a replayed olderkeys.json, and a revoked or replaced yank key. Akeys.jsonmay list at most one active yank key;mergeTrust, which only reduces trust in the pinned keys: it revokes, marks retiring, and narrows a key's validity window, and it never adds a key.verifyReleasenow enforces each key's validity window. A statement'screatedAtmust lie within its key's[notBefore, notAfter]. AfternotAfter, a key verifies only while a freshkeys.jsonlists it as retiring; otherwise the release is refused withkey-expired.verifyReleasealso refuses a yanked version (yanked).PINNED_KEYSnow carries each key's window.@cloudhal/[email protected]
Patch Changes
74d7098: RFC-0045 rollout step 7b: reference and repeater fields are now enabled. Sites can define
referencefields (entries of one to five collections of the same site, one or several, with optional conditions) andrepeaterfields (ordered lists of items with up to ten flat sub-fields) wherever the renderer serving them reads the two types. See docs/guides/fields.md.GET /__cloudhal/featureswithfields: 2(0.9.0 and later): the admin Worker asks the Worker each site is routed to (SITE, or an attachedSITE_n), as it asks for time gates, and remembers a yes for that Worker only. Time gates are now confirmed per site Worker too, so a site on an older attached Worker no longer inherits the installation Worker's answer. Deploy the site Worker first; until it reportsfields: 2, the types stay refused withfields_unsupportedon every path. On Node (cloudhal dev,studio, self-host, Docker) and in the playground, always, since the renderer runs in the same process (openLocalStorepassesFIELDS_SUPPORTED).cloudhal push(the admin route passes the store's capability),pull,cloudhal import(dry runs included),--replaceand--revert. A bundle that defines either type is still refused whole where the capability does not hold, and a site's new snapshot cannot point at another site's held site body to bring the types in.update_collectionandchange_field_typelist both types, and/api/instanceanswersfeatures.referenceFields: true, on servers that have the capability. The store still decides per site.entry_refscheck per site (rebuildEntryRefs, new core-ts export): the admin Worker's newrefs.rebuildsystem job (every five minutes, offset fromlists.backfill, until every site is done; then two reads a run), andopenLocalStoreat start-up. Rows are written per entry, anchored on the hash each entry was read with, so a concurrent edit keeps its own rows; each chunk is anchored on the site node's hash, so no statement grows with the site's settings; it leaves a site alone while a text ↔ reference type change runs there; progress is in the newentry_refs_statetable (storage migration0034_entry_refs_state), so a run stopped anywhere resumes. It is a safety net and should find nothing to change.Updated dependencies [61825b8]
Updated dependencies [74d7098]
[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
74d7098: RFC-0045 rollout step 7b: reference and repeater fields are now enabled. Sites can define
referencefields (entries of one to five collections of the same site, one or several, with optional conditions) andrepeaterfields (ordered lists of items with up to ten flat sub-fields) wherever the renderer serving them reads the two types. See docs/guides/fields.md.GET /__cloudhal/featureswithfields: 2(0.9.0 and later): the admin Worker asks the Worker each site is routed to (SITE, or an attachedSITE_n), as it asks for time gates, and remembers a yes for that Worker only. Time gates are now confirmed per site Worker too, so a site on an older attached Worker no longer inherits the installation Worker's answer. Deploy the site Worker first; until it reportsfields: 2, the types stay refused withfields_unsupportedon every path. On Node (cloudhal dev,studio, self-host, Docker) and in the playground, always, since the renderer runs in the same process (openLocalStorepassesFIELDS_SUPPORTED).cloudhal push(the admin route passes the store's capability),pull,cloudhal import(dry runs included),--replaceand--revert. A bundle that defines either type is still refused whole where the capability does not hold, and a site's new snapshot cannot point at another site's held site body to bring the types in.update_collectionandchange_field_typelist both types, and/api/instanceanswersfeatures.referenceFields: true, on servers that have the capability. The store still decides per site.entry_refscheck per site (rebuildEntryRefs, new core-ts export): the admin Worker's newrefs.rebuildsystem job (every five minutes, offset fromlists.backfill, until every site is done; then two reads a run), andopenLocalStoreat start-up. Rows are written per entry, anchored on the hash each entry was read with, so a concurrent edit keeps its own rows; each chunk is anchored on the site node's hash, so no statement grows with the site's settings; it leaves a site alone while a text ↔ reference type change runs there; progress is in the newentry_refs_statetable (storage migration0034_entry_refs_state), so a run stopped anywhere resumes. It is a safety net and should find nothing to change.Updated dependencies [4cb3ac6]
Updated dependencies [f41802b]
Updated dependencies [61825b8]
Updated dependencies [74d7098]
@cloudhal/[email protected]
Patch Changes
f41802b:
cloudhal deploy --releaseinstalls the signed release of the CLI's own version instead of building the project (RFC-0046 §11b, @cloudhal/release-verify package and cloudhal deploy --release (RFC-0046) #227).~/.cloudhal/release-trust.json, so a rolled-back list, a replayed key list or a revoked yank key is refused.v0.8.0and older have none. The CLI verifies it with@cloudhal/release-verify: the keys reduced by both lists, yanked versions refused, and every file checked against its digest.gh.--allow-single-factorcontinues on the release key alone whenghis unavailable; a failed attestation is always refused.--discard-local-themeis given. Itscloudhal.jsonbuild keys must match the starter's, a key the CLI does not know is refused, and the installed wrangler must be at least the bundle's..cloudhal/deploy/release/<version>/. Both Workers are then deployed withno_bundlewrangler configs that upload exactly those bytes.--from <dir>installs offline from the assets and both lists, and--release --dry-runstops before wrangler.The CLI now depends on
@cloudhal/release-verify.@cloudhal/release-verifynow typechecks under every consumer's lib settings: WebCrypto inputs areArrayBuffer-backed views, and the gzip pipe is typed through explicitly.@cloudhal/astro-renderernames the Site Worker's single-site choicesingleSiteId, so a test holds thatCLOUDHAL_SITE_IDoverrides the built id.5baacb4:
PINNED_ROOTSnow pins the offline rootcloudhal-root-2026a(Ed25519, from the owner's root ceremony on 2026-11-15).verifyKeysverifies the publishedkeys.jsonwith it by default. The firstkeys.jsonlists the release keycloudhal-release-2026aand the yank keycloudhal-yank-2026a, and is committed assecurity/keys.json. A CLI built with this version can runcloudhal deploy --releaseonce cloudhal.dev serves the lists.61825b8: Signed key and yank lists for release bundles (RFC-0046 §9, Release signing phase 2: signed keys.json and yanked.json, key expiry, KMS custody (RFC-0046 §9) #226).
@cloudhal/core-contractsgains therelease-keysroot (keys.json, signed by an offline root) and therelease-yank-listroot (yanked.json, signed by a yank key and expiring 30 days after it is issued).@cloudhal/release-verifygains:verifyKeys, which checks a pinned root's signature and that the list is fresh (expiresat most 13 months afterissuedAt);verifyYanked, which checks a signature by an active yank key thatkeys.jsonlists, and refuses a stale list withstale-yank-list;rememberYanksand thememoryoption ofverifyKeysandverifyYanked, for consumers that keep state: they refuse a rolled-back or pruned yank list, a replayed olderkeys.json, and a revoked or replaced yank key. Akeys.jsonmay list at most one active yank key;mergeTrust, which only reduces trust in the pinned keys: it revokes, marks retiring, and narrows a key's validity window, and it never adds a key.verifyReleasenow enforces each key's validity window. A statement'screatedAtmust lie within its key's[notBefore, notAfter]. AfternotAfter, a key verifies only while a freshkeys.jsonlists it as retiring; otherwise the release is refused withkey-expired.verifyReleasealso refuses a yanked version (yanked).PINNED_KEYSnow carries each key's window.3ffdf29: New package
@cloudhal/release-verify(RFC-0046 §11a). It is the one verifier of Cloudhal release bundles, and it is Worker-safe.verifyReleaseruns these checks in order, and refuses on the first failure:release-statement.json, against the pinned release keys;The tarball is never held whole. The first pass checks its digest, and the second yields each entry only once it is verified. Unsafe entry paths (
..,., empty segments, backslashes, control characters, case-fold duplicates) are refused withentry-path. Every refusal carries a stablecode.The package also exports:
missingScopes, which applies §3's rule thatworkers-scripts.admincoversworkers-scripts.edit;releaseAssetUrls;PINNED_KEYS, which can only be reduced.The Node-only subpath
@cloudhal/release-verify/attestationchecks the GitHub build attestation withgh2.68.0 or newer.@cloudhal/[email protected]
Patch Changes
@cloudhal/[email protected]
Patch Changes
74d7098: RFC-0045 rollout step 7b: reference and repeater fields are now enabled. Sites can define
referencefields (entries of one to five collections of the same site, one or several, with optional conditions) andrepeaterfields (ordered lists of items with up to ten flat sub-fields) wherever the renderer serving them reads the two types. See docs/guides/fields.md.GET /__cloudhal/featureswithfields: 2(0.9.0 and later): the admin Worker asks the Worker each site is routed to (SITE, or an attachedSITE_n), as it asks for time gates, and remembers a yes for that Worker only. Time gates are now confirmed per site Worker too, so a site on an older attached Worker no longer inherits the installation Worker's answer. Deploy the site Worker first; until it reportsfields: 2, the types stay refused withfields_unsupportedon every path. On Node (cloudhal dev,studio, self-host, Docker) and in the playground, always, since the renderer runs in the same process (openLocalStorepassesFIELDS_SUPPORTED).cloudhal push(the admin route passes the store's capability),pull,cloudhal import(dry runs included),--replaceand--revert. A bundle that defines either type is still refused whole where the capability does not hold, and a site's new snapshot cannot point at another site's held site body to bring the types in.update_collectionandchange_field_typelist both types, and/api/instanceanswersfeatures.referenceFields: true, on servers that have the capability. The store still decides per site.entry_refscheck per site (rebuildEntryRefs, new core-ts export): the admin Worker's newrefs.rebuildsystem job (every five minutes, offset fromlists.backfill, until every site is done; then two reads a run), andopenLocalStoreat start-up. Rows are written per entry, anchored on the hash each entry was read with, so a concurrent edit keeps its own rows; each chunk is anchored on the site node's hash, so no statement grows with the site's settings; it leaves a site alone while a text ↔ reference type change runs there; progress is in the newentry_refs_statetable (storage migration0034_entry_refs_state), so a run stopped anywhere resumes. It is a safety net and should find nothing to change.Updated dependencies [61825b8]