From 7b1936fe7d6493a95dd971d99dce46f3fdabcfda Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Tue, 25 Aug 2026 16:45:12 -0400 Subject: [PATCH 1/6] feat(eve): publish continuous releases from main Signed-off-by: Chad Hietala --- .github/workflows/release.yml | 69 ++++++++++++++++++++++--- CONTRIBUTING.md | 13 ++++- package.json | 2 +- scripts/prepare-canary-release.mjs | 32 ++++++++++++ scripts/prepare-canary-release.test.mjs | 39 ++++++++++++++ 5 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 scripts/prepare-canary-release.mjs create mode 100644 scripts/prepare-canary-release.test.mjs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 878fe386db..4b18008d8d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,15 +5,15 @@ on: branches: [main] workflow_dispatch: -# Queue runs instead of cancelling: aborting a run mid-`changeset publish` -# can leave npm with only some of the packages published. -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: false - jobs: release: runs-on: ubuntu-latest + # Do not abort an in-flight `changeset publish`: npm could be left with only + # some packages published. Keep this scoped to stable releases so every + # commit can run its continuous release independently. + concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-stable + cancel-in-progress: false permissions: contents: write pull-requests: write @@ -71,3 +71,60 @@ jobs: if [[ -n "$version" ]]; then gh release edit "eve@$version" --latest fi + + continuous-release: + if: github.event_name == 'push' + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + + steps: + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Setup pnpm + uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + + - name: Setup Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version-file: .nvmrc + cache: "pnpm" + registry-url: "https://registry.npmjs.org" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Prepare continuous release + id: prepare + env: + COMMIT_SHA: ${{ github.sha }} + run: | + version="$(node scripts/prepare-canary-release.mjs "$COMMIT_SHA")" + echo "version=$version" >> "$GITHUB_OUTPUT" + + - name: Build continuous release + run: pnpm --dir packages/eve run prepack + + - name: Publish continuous release + env: + COMMIT_SHA: ${{ github.sha }} + VERSION: ${{ steps.prepare.outputs.version }} + run: | + published_version="$(npm view "eve@$VERSION" version 2>/dev/null || true)" + + if [[ "$published_version" != "$VERSION" ]]; then + release_tag="main-${COMMIT_SHA:0:12}" + if [[ "$(git ls-remote origin refs/heads/main | cut -f1)" == "$COMMIT_SHA" ]]; then + release_tag="canary" + fi + + npm publish ./packages/eve --tag "$release_tag" --provenance --ignore-scripts + echo "Install this commit with \`npm install eve@$VERSION\`." >> "$GITHUB_STEP_SUMMARY" + echo "This release was also published with the \`$release_tag\` tag." >> "$GITHUB_STEP_SUMMARY" + else + echo "\`eve@$VERSION\` is already published." >> "$GITHUB_STEP_SUMMARY" + fi diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a9e5f60c77..821b68b257 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -212,7 +212,18 @@ on when one exists. Do not create an issue solely to accompany a pull request. 5. Make sure `pnpm lint`, `pnpm typecheck`, and `pnpm test` pass. 6. Open the PR with a clear description of the problem and solution. -Releases are managed with [Changesets](https://github.com/changesets/changesets) by the maintainers. +Stable releases are managed with [Changesets](https://github.com/changesets/changesets) by the maintainers. +Every commit pushed to `main` also publishes an immutable continuous release of +the `eve` package. Install the latest successful build with: + +```bash +npm install eve@canary +``` + +The release workflow summary includes the exact version for its commit. Use +that `-` version when you need a reproducible install +instead of the moving `canary` tag. Continuous releases do not update the +changelog, create a GitHub release, or change npm's `latest` tag. ## Developer Certificate of Origin (DCO) diff --git a/package.json b/package.json index c7ec46db73..16d5adffd1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "test:e2e": "turbo run test:e2e --concurrency=1", "test:integration": "turbo run test:integration", "test:scenario": "turbo run test:scenario", - "test:unit": "turbo run test:unit", + "test:unit": "node --test scripts/prepare-canary-release.test.mjs && turbo run test:unit", "typecheck": "turbo run typecheck", "version-packages": "changeset version && node ./scripts/materialize-registry-release-requirements.mjs", "release": "pnpm build && node ./scripts/assert-changeset-publish-packages.mjs && changeset publish", diff --git a/scripts/prepare-canary-release.mjs b/scripts/prepare-canary-release.mjs new file mode 100644 index 0000000000..2b64c8ab90 --- /dev/null +++ b/scripts/prepare-canary-release.mjs @@ -0,0 +1,32 @@ +import { readFile, writeFile } from "node:fs/promises"; + +const defaultPackagePath = "packages/eve/package.json"; + +export function createCanaryVersion(baseVersion, sha) { + if (!/^\d+\.\d+\.\d+$/u.test(baseVersion)) { + throw new Error(`invalid base version: ${baseVersion}`); + } + if (!/^[0-9a-f]{40}$/u.test(sha)) { + throw new Error(`invalid git SHA: ${sha}`); + } + + const shaPrefix = sha.slice(0, 12); + const shortId = /^0\d+$/u.test(shaPrefix) ? `g${shaPrefix}` : shaPrefix; + return `${baseVersion}-${shortId}`; +} + +export async function prepareCanaryRelease(sha, packagePath = defaultPackagePath) { + const packageJson = JSON.parse(await readFile(packagePath, "utf8")); + if (packageJson.name !== "eve") { + throw new Error(`expected ${packagePath} to describe the eve package`); + } + + packageJson.version = createCanaryVersion(packageJson.version, sha); + await writeFile(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`); + return packageJson.version; +} + +if (import.meta.main) { + const [, , sha] = process.argv; + console.log(await prepareCanaryRelease(sha)); +} diff --git a/scripts/prepare-canary-release.test.mjs b/scripts/prepare-canary-release.test.mjs new file mode 100644 index 0000000000..a1f15c56c7 --- /dev/null +++ b/scripts/prepare-canary-release.test.mjs @@ -0,0 +1,39 @@ +import assert from "node:assert/strict"; +import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test from "node:test"; + +import { createCanaryVersion, prepareCanaryRelease } from "./prepare-canary-release.mjs"; + +const sha = "d2995e12e1234567890abcdef1234567890abcde"; + +test("appends the short commit ID to the current semver", () => { + assert.equal(createCanaryVersion("0.44.4", sha), "0.44.4-d2995e12e123"); +}); + +test("keeps an all-numeric short ID valid semver", () => { + const numericSha = "0123456789012345678901234567890123456789"; + assert.equal(createCanaryVersion("0.44.4", numericSha), "0.44.4-g012345678901"); +}); + +test("updates the eve package version", async () => { + const root = await mkdtemp(join(tmpdir(), "eve-canary-release-")); + const packagePath = join(root, "package.json"); + + try { + await writeFile(packagePath, JSON.stringify({ name: "eve", version: "0.44.4" })); + const version = await prepareCanaryRelease(sha, packagePath); + const packageJson = JSON.parse(await readFile(packagePath, "utf8")); + + assert.equal(version, "0.44.4-d2995e12e123"); + assert.equal(packageJson.version, version); + } finally { + await rm(root, { force: true, recursive: true }); + } +}); + +test("rejects invalid version inputs", () => { + assert.throws(() => createCanaryVersion("canary", sha), /invalid base version/u); + assert.throws(() => createCanaryVersion("0.44.4", "not-a-sha"), /invalid git SHA/u); +}); From 24674450ba7030f9763de77f91441ce2eaf5c3a3 Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Tue, 25 Aug 2026 16:51:51 -0400 Subject: [PATCH 2/6] test(eve): run release coverage through vitest Signed-off-by: Chad Hietala --- package.json | 2 +- .../eve/test/prepare-canary-release.test.mjs | 43 +++++++++++++++++++ packages/eve/vitest.unit.config.ts | 2 +- scripts/prepare-canary-release.test.mjs | 39 ----------------- 4 files changed, 45 insertions(+), 41 deletions(-) create mode 100644 packages/eve/test/prepare-canary-release.test.mjs delete mode 100644 scripts/prepare-canary-release.test.mjs diff --git a/package.json b/package.json index 16d5adffd1..c7ec46db73 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "test:e2e": "turbo run test:e2e --concurrency=1", "test:integration": "turbo run test:integration", "test:scenario": "turbo run test:scenario", - "test:unit": "node --test scripts/prepare-canary-release.test.mjs && turbo run test:unit", + "test:unit": "turbo run test:unit", "typecheck": "turbo run typecheck", "version-packages": "changeset version && node ./scripts/materialize-registry-release-requirements.mjs", "release": "pnpm build && node ./scripts/assert-changeset-publish-packages.mjs && changeset publish", diff --git a/packages/eve/test/prepare-canary-release.test.mjs b/packages/eve/test/prepare-canary-release.test.mjs new file mode 100644 index 0000000000..22dce4fff2 --- /dev/null +++ b/packages/eve/test/prepare-canary-release.test.mjs @@ -0,0 +1,43 @@ +import { beforeEach, expect, test, vi } from "vitest"; + +import { + createCanaryVersion, + prepareCanaryRelease, +} from "../../../scripts/prepare-canary-release.mjs"; + +const fsMocks = vi.hoisted(() => ({ + readFile: vi.fn(), + writeFile: vi.fn(), +})); + +vi.mock("node:fs/promises", () => fsMocks); + +const sha = "d2995e12e1234567890abcdef1234567890abcde"; + +beforeEach(() => { + vi.clearAllMocks(); +}); + +test("appends the short commit ID to the current semver", () => { + expect(createCanaryVersion("0.44.4", sha)).toBe("0.44.4-d2995e12e123"); +}); + +test("keeps an all-numeric short ID valid semver", () => { + const numericSha = "0123456789012345678901234567890123456789"; + expect(createCanaryVersion("0.44.4", numericSha)).toBe("0.44.4-g012345678901"); +}); + +test("updates the eve package version", async () => { + fsMocks.readFile.mockResolvedValue(JSON.stringify({ name: "eve", version: "0.44.4" })); + + await expect(prepareCanaryRelease(sha, "package.json")).resolves.toBe("0.44.4-d2995e12e123"); + expect(fsMocks.writeFile).toHaveBeenCalledWith( + "package.json", + `${JSON.stringify({ name: "eve", version: "0.44.4-d2995e12e123" }, null, 2)}\n`, + ); +}); + +test("rejects invalid version inputs", () => { + expect(() => createCanaryVersion("canary", sha)).toThrow(/invalid base version/u); + expect(() => createCanaryVersion("0.44.4", "not-a-sha")).toThrow(/invalid git SHA/u); +}); diff --git a/packages/eve/vitest.unit.config.ts b/packages/eve/vitest.unit.config.ts index aed1a7bb02..778d85c6ef 100644 --- a/packages/eve/vitest.unit.config.ts +++ b/packages/eve/vitest.unit.config.ts @@ -37,7 +37,7 @@ export default defineConfig({ "test/scenarios/**", "test/vercel/**", ], - include: ["src/**/*.test.ts", "test/**/*.test.ts"], + include: ["src/**/*.test.ts", "test/**/*.test.{ts,mjs}"], setupFiles: ["./src/internal/testing/unit-guard.ts", "./test/setup/mock-ai-gateway.ts"], testTimeout: 5_000, }, diff --git a/scripts/prepare-canary-release.test.mjs b/scripts/prepare-canary-release.test.mjs deleted file mode 100644 index a1f15c56c7..0000000000 --- a/scripts/prepare-canary-release.test.mjs +++ /dev/null @@ -1,39 +0,0 @@ -import assert from "node:assert/strict"; -import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { join } from "node:path"; -import test from "node:test"; - -import { createCanaryVersion, prepareCanaryRelease } from "./prepare-canary-release.mjs"; - -const sha = "d2995e12e1234567890abcdef1234567890abcde"; - -test("appends the short commit ID to the current semver", () => { - assert.equal(createCanaryVersion("0.44.4", sha), "0.44.4-d2995e12e123"); -}); - -test("keeps an all-numeric short ID valid semver", () => { - const numericSha = "0123456789012345678901234567890123456789"; - assert.equal(createCanaryVersion("0.44.4", numericSha), "0.44.4-g012345678901"); -}); - -test("updates the eve package version", async () => { - const root = await mkdtemp(join(tmpdir(), "eve-canary-release-")); - const packagePath = join(root, "package.json"); - - try { - await writeFile(packagePath, JSON.stringify({ name: "eve", version: "0.44.4" })); - const version = await prepareCanaryRelease(sha, packagePath); - const packageJson = JSON.parse(await readFile(packagePath, "utf8")); - - assert.equal(version, "0.44.4-d2995e12e123"); - assert.equal(packageJson.version, version); - } finally { - await rm(root, { force: true, recursive: true }); - } -}); - -test("rejects invalid version inputs", () => { - assert.throws(() => createCanaryVersion("canary", sha), /invalid base version/u); - assert.throws(() => createCanaryVersion("0.44.4", "not-a-sha"), /invalid git SHA/u); -}); From c5b50416b2a9e69ddc5b7c8b53ecceecff50cde1 Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Tue, 25 Aug 2026 17:02:11 -0400 Subject: [PATCH 3/6] refactor: publish canaries through changesets snapshots Signed-off-by: Chad Hietala --- .changeset/config.json | 3 ++ .github/workflows/release.yml | 40 ++++++++--------- CONTRIBUTING.md | 14 +++--- .../eve/test/prepare-canary-release.test.mjs | 43 ------------------- packages/eve/vitest.unit.config.ts | 2 +- scripts/prepare-canary-release.mjs | 32 -------------- 6 files changed, 29 insertions(+), 105 deletions(-) delete mode 100644 packages/eve/test/prepare-canary-release.test.mjs delete mode 100644 scripts/prepare-canary-release.mjs diff --git a/.changeset/config.json b/.changeset/config.json index d2b5c44143..5160b1aae0 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -11,5 +11,8 @@ "version": false, "tag": false }, + "snapshot": { + "useCalculatedVersion": true + }, "ignore": [] } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4b18008d8d..b6bc9dbe37 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -98,33 +98,27 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Prepare continuous release - id: prepare + - name: Version continuous release env: COMMIT_SHA: ${{ github.sha }} run: | - version="$(node scripts/prepare-canary-release.mjs "$COMMIT_SHA")" - echo "version=$version" >> "$GITHUB_OUTPUT" + cat > .changeset/continuous-release.md </dev/null || true)" - - if [[ "$published_version" != "$VERSION" ]]; then - release_tag="main-${COMMIT_SHA:0:12}" - if [[ "$(git ls-remote origin refs/heads/main | cut -f1)" == "$COMMIT_SHA" ]]; then - release_tag="canary" - fi - - npm publish ./packages/eve --tag "$release_tag" --provenance --ignore-scripts - echo "Install this commit with \`npm install eve@$VERSION\`." >> "$GITHUB_STEP_SUMMARY" - echo "This release was also published with the \`$release_tag\` tag." >> "$GITHUB_STEP_SUMMARY" - else - echo "\`eve@$VERSION\` is already published." >> "$GITHUB_STEP_SUMMARY" - fi + pnpm build + node scripts/assert-changeset-publish-packages.mjs + pnpm exec changeset publish --tag canary --no-git-tag + + version="$(jq -r .version packages/eve/package.json)" + echo "Install this commit with \`npm install eve@$version\`." >> "$GITHUB_STEP_SUMMARY" + echo "Install the latest continuous release with \`npm install eve@canary\`." >> "$GITHUB_STEP_SUMMARY" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 821b68b257..c58d42164c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -213,17 +213,19 @@ on when one exists. Do not create an issue solely to accompany a pull request. 6. Open the PR with a clear description of the problem and solution. Stable releases are managed with [Changesets](https://github.com/changesets/changesets) by the maintainers. -Every commit pushed to `main` also publishes an immutable continuous release of -the `eve` package. Install the latest successful build with: +Every commit pushed to `main` also publishes an immutable +[Changesets snapshot](https://changesets.dev/guide/snapshot-releases) of the +`eve` package. Install the most recently published snapshot with: ```bash npm install eve@canary ``` -The release workflow summary includes the exact version for its commit. Use -that `-` version when you need a reproducible install -instead of the moving `canary` tag. Continuous releases do not update the -changelog, create a GitHub release, or change npm's `latest` tag. +The release workflow summary includes the exact calculated +`-g` version for its commit. Use that version +when you need a reproducible install instead of the moving `canary` tag. +Continuous releases do not create a GitHub release or change npm's `latest` +tag. ## Developer Certificate of Origin (DCO) diff --git a/packages/eve/test/prepare-canary-release.test.mjs b/packages/eve/test/prepare-canary-release.test.mjs deleted file mode 100644 index 22dce4fff2..0000000000 --- a/packages/eve/test/prepare-canary-release.test.mjs +++ /dev/null @@ -1,43 +0,0 @@ -import { beforeEach, expect, test, vi } from "vitest"; - -import { - createCanaryVersion, - prepareCanaryRelease, -} from "../../../scripts/prepare-canary-release.mjs"; - -const fsMocks = vi.hoisted(() => ({ - readFile: vi.fn(), - writeFile: vi.fn(), -})); - -vi.mock("node:fs/promises", () => fsMocks); - -const sha = "d2995e12e1234567890abcdef1234567890abcde"; - -beforeEach(() => { - vi.clearAllMocks(); -}); - -test("appends the short commit ID to the current semver", () => { - expect(createCanaryVersion("0.44.4", sha)).toBe("0.44.4-d2995e12e123"); -}); - -test("keeps an all-numeric short ID valid semver", () => { - const numericSha = "0123456789012345678901234567890123456789"; - expect(createCanaryVersion("0.44.4", numericSha)).toBe("0.44.4-g012345678901"); -}); - -test("updates the eve package version", async () => { - fsMocks.readFile.mockResolvedValue(JSON.stringify({ name: "eve", version: "0.44.4" })); - - await expect(prepareCanaryRelease(sha, "package.json")).resolves.toBe("0.44.4-d2995e12e123"); - expect(fsMocks.writeFile).toHaveBeenCalledWith( - "package.json", - `${JSON.stringify({ name: "eve", version: "0.44.4-d2995e12e123" }, null, 2)}\n`, - ); -}); - -test("rejects invalid version inputs", () => { - expect(() => createCanaryVersion("canary", sha)).toThrow(/invalid base version/u); - expect(() => createCanaryVersion("0.44.4", "not-a-sha")).toThrow(/invalid git SHA/u); -}); diff --git a/packages/eve/vitest.unit.config.ts b/packages/eve/vitest.unit.config.ts index 778d85c6ef..aed1a7bb02 100644 --- a/packages/eve/vitest.unit.config.ts +++ b/packages/eve/vitest.unit.config.ts @@ -37,7 +37,7 @@ export default defineConfig({ "test/scenarios/**", "test/vercel/**", ], - include: ["src/**/*.test.ts", "test/**/*.test.{ts,mjs}"], + include: ["src/**/*.test.ts", "test/**/*.test.ts"], setupFiles: ["./src/internal/testing/unit-guard.ts", "./test/setup/mock-ai-gateway.ts"], testTimeout: 5_000, }, diff --git a/scripts/prepare-canary-release.mjs b/scripts/prepare-canary-release.mjs deleted file mode 100644 index 2b64c8ab90..0000000000 --- a/scripts/prepare-canary-release.mjs +++ /dev/null @@ -1,32 +0,0 @@ -import { readFile, writeFile } from "node:fs/promises"; - -const defaultPackagePath = "packages/eve/package.json"; - -export function createCanaryVersion(baseVersion, sha) { - if (!/^\d+\.\d+\.\d+$/u.test(baseVersion)) { - throw new Error(`invalid base version: ${baseVersion}`); - } - if (!/^[0-9a-f]{40}$/u.test(sha)) { - throw new Error(`invalid git SHA: ${sha}`); - } - - const shaPrefix = sha.slice(0, 12); - const shortId = /^0\d+$/u.test(shaPrefix) ? `g${shaPrefix}` : shaPrefix; - return `${baseVersion}-${shortId}`; -} - -export async function prepareCanaryRelease(sha, packagePath = defaultPackagePath) { - const packageJson = JSON.parse(await readFile(packagePath, "utf8")); - if (packageJson.name !== "eve") { - throw new Error(`expected ${packagePath} to describe the eve package`); - } - - packageJson.version = createCanaryVersion(packageJson.version, sha); - await writeFile(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`); - return packageJson.version; -} - -if (import.meta.main) { - const [, , sha] = process.argv; - console.log(await prepareCanaryRelease(sha)); -} From 549e26c8e248d60003ad7293cde81fcd97196a81 Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Tue, 25 Aug 2026 17:10:35 -0400 Subject: [PATCH 4/6] fix: scope canary snapshots to eve Signed-off-by: Chad Hietala --- .github/workflows/release.yml | 7 ++++++- CONTRIBUTING.md | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b6bc9dbe37..adc424de84 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -72,6 +72,9 @@ jobs: gh release edit "eve@$version" --latest fi + # Runs stay independent so every commit gets a snapshot. When pushes overlap, + # `canary` follows publish completion order and may briefly point to an older + # commit; immutable snapshot versions remain the reproducible install path. continuous-release: if: github.event_name == 'push' runs-on: ubuntu-latest @@ -93,7 +96,6 @@ jobs: with: node-version-file: .nvmrc cache: "pnpm" - registry-url: "https://registry.npmjs.org" - name: Install dependencies run: pnpm install --frozen-lockfile @@ -102,6 +104,9 @@ jobs: env: COMMIT_SHA: ${{ github.sha }} run: | + # Authored changesets belong to the stable release plan. Remove them + # from this ephemeral checkout so only eve receives a snapshot. + rm -f .changeset/*.md cat > .changeset/continuous-release.md <-g` version for its commit. Use that version when you need a reproducible install instead of the moving `canary` tag. Continuous releases do not create a GitHub release or change npm's `latest` -tag. +tag. Runs are independent so every commit gets a snapshot; when pushes overlap, +`canary` follows publish completion order rather than commit order. ## Developer Certificate of Origin (DCO) From e255a9a177afb83f470ddbc8c19685cfa8ef725a Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Tue, 25 Aug 2026 18:19:21 -0400 Subject: [PATCH 5/6] fix: restore peer dependents before canary publish Signed-off-by: Chad Hietala --- .github/workflows/release.yml | 11 ++++++++++- CONTRIBUTING.md | 14 ++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index adc424de84..316453224b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -106,7 +106,11 @@ jobs: run: | # Authored changesets belong to the stable release plan. Remove them # from this ephemeral checkout so only eve receives a snapshot. - rm -f .changeset/*.md + for changeset in .changeset/*.md; do + if [[ "$changeset" != ".changeset/README.md" ]]; then + rm -f "$changeset" + fi + done cat > .changeset/continuous-release.md <-g` version for its commit. Use that version -when you need a reproducible install instead of the moving `canary` tag. -Continuous releases do not create a GitHub release or change npm's `latest` -tag. Runs are independent so every commit gets a snapshot; when pushes overlap, -`canary` follows publish completion order rather than commit order. +The release workflow summary includes the exact +`-g` version for its commit. This version advances +from the current stable release and does not predict the bump in the pending +stable release plan. Use the exact version when you need a reproducible install +instead of the moving `canary` tag. Continuous releases do not create a GitHub +release or change npm's `latest` tag. Runs are independent so every commit gets +a snapshot; when pushes overlap, `canary` follows publish completion order +rather than commit order. ## Developer Certificate of Origin (DCO) From 3ef6aaaf156f552d87c84d38ee2974a95e235655 Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Tue, 25 Aug 2026 18:51:57 -0400 Subject: [PATCH 6/6] fix: structurally scope canary package restore Signed-off-by: Chad Hietala --- .github/workflows/release.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 316453224b..117d0e4e4b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -123,9 +123,13 @@ jobs: --snapshot-prerelease-template "g${COMMIT_SHA:0:12}" # Changesets bumps peer dependents even when their workspace range - # remains valid. Restore the other publishable packages so this - # continuous release remains scoped to eve. - git checkout -- packages/eve-self-modification packages/eve-buzz-acp-adapter + # remains valid. Restore every sibling package so this continuous + # release remains structurally scoped to eve as packages are added. + for package_dir in packages/*; do + if [[ "$package_dir" != "packages/eve" ]]; then + git checkout -- "$package_dir" + fi + done - name: Publish continuous release run: |