forge attest runs .forge/ci in a clean worktree of each commit and signs the result into refs/notes/ci; forge push sends it with the branch. The script runs ./release.sh --check in a throwaway clone with main at the commit, since the gate refuses a detached HEAD, and uses Node.js 24 or newer from PATH. It builds the editor first because the shell Worker's tests serve apps/editor/dist.
- commit
- 1291881cb0670ccc2d7c6426f67f1a676d8ab274
- parent
- 68515cf99182d2fc4733e14cc67a8774bcbc95d0
- author
- cat <admin@dev.site>
- ci
- ✓ passed in 95s, signed by cat
ci attestation
forge-attestation 1 type ci commit 1291881cb0670ccc2d7c6426f67f1a676d8ab274 tree 6df6e3af154e2a5fb0ce5415f235f815a610652a script .forge/ci f4524deea7434b1e995a29ceea8cf2d173fd0a22 result pass exit 0 started 2026-10-17T23:03:10Z duration 95s runner (not shown here; refs/notes/ci has it) system Darwin 25.5.0 arm64 env host log sha256:124e075d85e82260d160c6b54f88b30004741a6ffd7a944bcea6636dad4e521f 797 lines | | ⛅️ wrangler 4.125.0 (update available 4.151.1) |─────────────────────────────────────────────── |Total Upload: 122.11 KiB / gzip: 25.99 KiB |Your Worker has access to the following bindings: |Binding Resource |env.DB (diagramzip) D1 Database |env.CONTENT (diagramzip-content) R2 Bucket | |--dry-run: exiting now. | [services/shell] /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/services/shell/node_modules/.bin/wrangler deploy --dry-run --strict --config wrangler.jsonc | | ⛅️ wrangler 4.125.0 (update available 4.151.1) |─────────────────────────────────────────────── |✨ Read 29 files from the assets directory /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/apps/editor/dist |Total Upload: 105.93 KiB / gzip: 23.11 KiB |Your Worker has access to the following bindings: |Binding Resource |env.ASSETS Assets | |--dry-run: exiting now. | [renderers/browser-run] /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/renderers/browser-run/node_modules/.bin/wrangler deploy --dry-run --strict --config wrangler.jsonc | | ⛅️ wrangler 4.125.0 (update available 4.151.1) |─────────────────────────────────────────────── |Total Upload: 693.38 KiB / gzip: 136.64 KiB |Your Worker has access to the following bindings: |Binding Resource |env.BROWSER_SESSIONS (BrowserSession) Durable Object |env.BROWSER Browser Run | |--dry-run: exiting now. | [renderers/browser-run/frames/diagramsnet] /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/renderers/edge/node_modules/.bin/wrangler deploy --dry-run --strict --config wrangler.jsonc | | ⛅️ wrangler 4.125.0 (update available 4.151.1) |─────────────────────────────────────────────── |✨ Read 2525 files from the assets directory /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/renderers/browser-run/frames/diagramsnet/dist |Total Upload: 123.72 KiB / gzip: 26.16 KiB |Your Worker has access to the following bindings: |Binding Resource |env.BROWSER_RENDERER (diagramzip-browser-run) Worker |env.ASSETS Assets | |--dry-run: exiting now. | [renderers/browser-run/frames/mermaid] /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/renderers/edge/node_modules/.bin/wrangler deploy --dry-run --strict --config wrangler.jsonc | | ⛅️ wrangler 4.125.0 (update available 4.151.1) |─────────────────────────────────────────────── |✨ Read 3 files from the assets directory /private/var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/tmp.SrDjROgv69/diagramzip/renderers/browser-run/frames/mermaid/dist |Total Upload: 123.54 KiB / gzip: 26.08 KiB |Your Worker has access to the following bindings: |Binding Resource |env.BROWSER_RENDERER (diagramzip-browser-run) Worker |env.ASSETS Assets | |--dry-run: exiting now. | |==> generated-file drift check | |Release gate passed for 1291881cb067. No remote commands were run.
Signature: good, cat
| A | .forge/ | 36 | ++++++++++++++++++++++++++++++ |
@@ -0,0 +1,36 @@
1+2+# CI for src.rest: ./release.sh --check, the local release gate (locked installs,3+# generated types, static checks, tests, editor and docs builds, Worker dry runs).4+set -eu5+6+# release.sh needs Node.js 24 or newer. If the first node on PATH is older,7+# put the directory of the first one that is new enough ahead of it.8+node_major() { "$1" -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0; }9+if [ "$(node_major node)" -lt 24 ]; then10+ IFS=:11+ for dir in $PATH; do12+ if [ -x "$dir/node" ] && [ "$(node_major "$dir/node")" -ge 24 ]; then13+ PATH=$dir:$PATH14+ break15+ fi16+ done17+ unset IFS18+ export PATH19+fi20+21+# release.sh only runs from the main branch, and forge attest checks out a22+# detached HEAD, so run it in a throwaway clone with main at this commit.23+commit=$(git rev-parse HEAD)24+tmp=$(mktemp -d)25+trap 'rm -rf "$tmp"' EXIT26+git clone -q --shared --no-checkout . "$tmp/diagramzip"27+cd "$tmp/diagramzip"28+git checkout -q -B main "$commit"29+30+# The shell Worker's tests serve apps/editor/dist through its asset binding,31+# and release.sh builds the editor only after the tests, so build it first,32+# as it already is in a working checkout.33+npm ci --no-audit --no-fund34+npm run build:editor35+36+./release.sh --check