diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4d029822..a055e7c0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,7 +16,7 @@ on: workflow_dispatch: inputs: dist-tag: - description: "npm dist-tag. Empty = the version's canonical tag (next on the RC line, latest for stable). Pass latest explicitly to move latest onto an RC — that is the deliberate cutover act." + description: "npm dist-tag. Empty = latest, the canonical tag for every release since the 2026-08-25 cutover. Pass another tag (e.g. beta) for a hand-cut preview." required: false default: "" type: string diff --git a/docs/oss/versioning.md b/docs/oss/versioning.md index 386dc373..09f8839f 100644 --- a/docs/oss/versioning.md +++ b/docs/oss/versioning.md @@ -8,9 +8,9 @@ Prisma 8 ships as a release-candidate line ahead of `8.0.0` final: releases are RC respins may include breaking changes until `8.0.0` final ships. There are no patch releases on the RC line — a fix ships as the next `rc.N`. -For the packages this repository's publish workflow ships (`prisma`, `@prisma/cli`, `@prisma/cli-engine`), **each release publishes under its line's canonical dist-tag**: RC-line versions under `next`, stable versions under `latest` (operator ruling 2026-08-12; supersedes the earlier "`latest` tracks the newest release, RC or stable"). A dist-tag moves only through a deliberately merged version-bump PR (or a manual `workflow_dispatch`); creating and merging the bump PR is the operator's explicit act. `latest` stays on the pre-8 CLI until the operator moves it deliberately. Existing installs are unaffected — lockfiles pin resolved versions, and nobody lands on the RC line without asking for `@next`. +For the packages this repository's publish workflow ships (`prisma`, `@prisma/cli`, `@prisma/cli-engine`), **every release publishes under `latest`, RC-line versions included** (operator cutover ruling 2026-08-25, executing rollout-plan step 5; supersedes the 2026-08-12 "RC under `next`" ruling). A dist-tag moves only through a deliberately merged version-bump PR (or a manual `workflow_dispatch`); creating and merging the bump PR is the operator's explicit act. Existing installs are unaffected — lockfiles pin resolved versions. -**The bare `prisma` name is what this discipline is for.** Its `latest` serves Prisma 7 (`7.9.1`) to everyone who types `npm install prisma`, so the v8 line lives on `next` until a deliberate cutover. The products' packages are all new — nobody is installing `@prisma/composer-cli` or `@prisma/orm-toolchain` expecting a version 7 — so they publish releases straight to `latest`, pre-release versions included, and this repository follows `latest` for them (operator ruling 2026-08-17). +**History of the bare `prisma` name.** Its `latest` served Prisma 7 (`7.9.1`) until the 2026-08-25 cutover, so the v8 RC line lived on `next` while it matured. The product-family packages (`@prisma/composer-cli`, `@prisma/orm-toolchain` and their siblings — not this repository's three) were never held back — all new names with no version-7 audience — so they always published releases straight to `latest`, pre-release versions included, and this repository follows `latest` for them (operator ruling 2026-08-17). The transition onto the RC line is a one-time bump from the pre-8 base to `8.0.0-rc.1`; `pnpm bump-version` encodes it (a pre-8 stable base advances to `8.0.0-rc.1`, an RC base advances its counter). @@ -39,11 +39,11 @@ This is enforced, not remembered: the conformance checks refuse to publish a rel The npm registry exposes the CLI packages under these dist-tags: -- **`latest`** — what a bare `npm install` gets. It stays on the pre-8 CLI while the Prisma 8 RC line matures; moving it to 8.x is a deliberate operator act (dispatching the publish workflow with `dist-tag: latest`, or widening `releaseDistTag` when the RC line is ready), not a side effect of any routine release (operator ruling 2026-08-12). Once the line is stable, stable release bumps publish here. -- **`next`** — the Prisma 8 RC line (`8.0.0-rc.N`). A merged release PR on the RC line publishes here automatically. +- **`latest`** — what a bare `npm install` gets: the newest release, RC or stable. A merged release PR publishes here automatically (operator cutover ruling 2026-08-25; before it, `latest` stayed on the pre-8 CLI and the RC line lived on `next`). +- **`next`** — retired by the cutover: it froze at the last pre-cutover RC and the publish path no longer moves it (operator ruling 2026-08-25). Keeping it synced to `latest` was considered and dropped — re-pointing a tag on an already-published version cannot authenticate over OIDC, and npm has no token permission narrower than package write, so a standing sync would mean a standing publish-capable token. The operator re-points or removes the tag by hand (`scripts/cutover-dist-tags.sh`); text that says `prisma@next` should move to plain `prisma`. - **`beta`** — reserved for hand-cut previews ahead of significant changes, published by dispatching the workflow with that dist-tag. Routine releases do not use this tag. -- **`dev`** — every routine push to `main` publishes `-dev.` here automatically (operator ruling 2026-08-13, superseding the earlier "no dev channel" ruling). The suffix derives from the workflow run number and is stamped ephemerally in CI, never committed, so release versions remain exactly what a commit says. The channel exists so a product's new version reaches a working CLI without a human: an auto-merging pull request moves the version, runs the full quality and conformance checks, and its merge ships the dev build. Today a daily scheduled run is what notices a product release; the immediate path needs a notification step in each product repository, which neither has yet. See [release automation](./release-automation.md). Only a real release — an `rc.N` bump under `next`, or moving `latest` — is a human act. +- **`dev`** — every routine push to `main` publishes `-dev.` here automatically (operator ruling 2026-08-13, superseding the earlier "no dev channel" ruling). The suffix derives from the workflow run number and is stamped ephemerally in CI, never committed, so release versions remain exactly what a commit says. The channel exists so a product's new version reaches a working CLI without a human: an auto-merging pull request moves the version, runs the full quality and conformance checks, and its merge ships the dev build. Today a daily scheduled run is what notices a product release; the immediate path needs a notification step in each product repository, which neither has yet. See [release automation](./release-automation.md). Only a real release — a merged `rc.N` bump publishing under `latest` — is a human act. **Every** run of the publish workflow ships a dev build, including the one that cuts a release — the release publish is an additional half, not an alternative (operator ruling 2026-08-18). When they were alternatives, the release commit was the one merge to `main` that never reached the dev channel, so `dev` named an older version than the release until an unrelated commit landed. The dev build is published as its own version rather than by moving the `dev` tag, because OIDC trusted publishing authorises `npm publish` and nothing else. @@ -68,7 +68,7 @@ This is by design. The alternatives cause silent problems: [`scripts/set-version.ts`](../../scripts/set-version.ts) is what enforces lockstep: a single invocation walks every lockstep workspace `package.json` and writes the requested version (rewriting `workspace:` dependency pins to match). It is a maintainer's tool, invoked through `pnpm bump-version`; the publish workflow does not run it. -The publish workflow is **triggered by a change to the root `version`**: a push to `main` whose root `package.json` carries a different `version` than the previous tip is recognised as a release bump and ships that version under its canonical dist-tag — `next` on the RC line (the accompanying GitHub Release is marked pre-release), `latest` for stable. This is what makes "merge the release PR" the publish trigger; there is no separate dispatch step. Every push publishes a `dev` build; one that changes the version publishes a release as well (operator ruling 2026-08-18). Within a publish, `@prisma/cli-engine` goes first, then `@prisma/cli` (which depends on it), then `prisma`. +The publish workflow is **triggered by a change to the root `version`**: a push to `main` whose root `package.json` carries a different `version` than the previous tip is recognised as a release bump and ships that version under `latest` (the accompanying GitHub Release is marked pre-release on the RC line). This is what makes "merge the release PR" the publish trigger; there is no separate dispatch step. Every push publishes a `dev` build; one that changes the version publishes a release as well (operator ruling 2026-08-18). Within a publish, `@prisma/cli-engine` goes first, then `@prisma/cli` (which depends on it), then `prisma`. **Nothing rewrites a `version` field outside a commit.** `set-version.ts` is run by `pnpm bump-version`, whose output a maintainer reviews and commits; the publish workflow never invokes it. That is what makes "the version is whatever `package.json` says" true rather than aspirational — CI has no way to ship a version no commit describes. It also keeps `pnpm-lock.yaml` honest: the lockfile records the `workspace:` specifiers that `set-version.ts` rewrites, so `bump-version` refreshes it in the same breath and the bump lands as one internally consistent commit. @@ -81,9 +81,9 @@ Before anything reaches the registry, the workflow verifies the artifact it is a The release cadence is one PR per release (on the RC line: one PR per `rc.N`). A maintainer: 1. **Runs the [`publish-npm-version` skill](../../skills-contrib/publish-npm-version/SKILL.md)**, which drives `pnpm bump-version` in a fresh worktree off `origin/main` and opens the release PR under real maintainer credentials (so CI runs on it normally). The script reads the root version committed at HEAD, computes the next release version (`8.0.0-rc.N` → `8.0.0-rc.N+1`), and writes it to every lockstep `package.json`. `bump-version` refreshes `pnpm-lock.yaml` itself, because the lockfile records the `workspace:` pins it rewrites and a stale one fails every later frozen install. Commit both and open a `chore(release): 8.0.0-rc.N+1` PR. -2. **Reviews and merges the PR.** This is the point where a human verifies the release is intended — merging the bump PR is the deliberate act that publishes. The resulting push to `main` carries the bumped root `version`, the publish workflow detects the change, publishes under the line's canonical dist-tag (`next` on the RC line, `latest` for stable), and creates a matching GitHub Release (marked pre-release on the RC line). +2. **Reviews and merges the PR.** This is the point where a human verifies the release is intended — merging the bump PR is the deliberate act that publishes. The resulting push to `main` carries the bumped root `version`, the publish workflow detects the change, publishes under `latest`, and creates a matching GitHub Release (marked pre-release on the RC line). -If the publish needs to be re-run (transient registry failure, etc.), a maintainer can dispatch the [`Publish to npm`](../../.github/workflows/publish.yml) workflow from `main` with the version's canonical dist-tag (`next` on the RC line, `latest` for stable) and `dry-run=false`; the workflow re-publishes the version currently committed at HEAD, and because the chosen tag matches the canonical one it also re-creates the GitHub Release if it is missing. This is the same path used to cut a hand-rolled `beta` (`dist-tag=beta`, no Release). +If the publish needs to be re-run (transient registry failure, etc.), a maintainer can dispatch the [`Publish to npm`](../../.github/workflows/publish.yml) workflow from `main` with `dist-tag: latest` and `dry-run=false`; the workflow re-publishes the version currently committed at HEAD, and because the chosen tag matches the canonical one it also re-creates the GitHub Release if it is missing. This is the same path used to cut a hand-rolled `beta` (`dist-tag=beta`, no Release). ## Procedure: validate publish changes diff --git a/package.json b/package.json index 6e605b93..066ac815 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-cli", - "version": "8.0.0-rc.9", + "version": "8.0.0-rc.10", "private": true, "engines": { "node": ">=24" diff --git a/packages/cli-conformance/package.json b/packages/cli-conformance/package.json index fba846c2..3a4d49bc 100644 --- a/packages/cli-conformance/package.json +++ b/packages/cli-conformance/package.json @@ -1,7 +1,7 @@ { "name": "@repo/cli-conformance", "private": true, - "version": "8.0.0-rc.9", + "version": "8.0.0-rc.10", "description": "Reusable conformance checks for the engine's consumers: import purity over built output, config-section validators that never throw, and verification of the tarballs a registry would receive. Depends on no package it checks.", "type": "module", "exports": { @@ -24,7 +24,7 @@ "test": "pnpm run typecheck && vitest run" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.9", + "@repo/tsconfig": "workspace:8.0.0-rc.10", "@types/node": "^22.19.19", "es-module-lexer": "^2.1.0", "tsx": "^4.22.4", diff --git a/packages/cli-engine/package.json b/packages/cli-engine/package.json index 925ed028..ba0dd711 100644 --- a/packages/cli-engine/package.json +++ b/packages/cli-engine/package.json @@ -55,8 +55,8 @@ "string-width": "^8.2.1" }, "devDependencies": { - "@repo/cli-conformance": "workspace:8.0.0-rc.9", - "@repo/tsconfig": "workspace:8.0.0-rc.9", + "@repo/cli-conformance": "workspace:8.0.0-rc.10", + "@repo/tsconfig": "workspace:8.0.0-rc.10", "@types/node": "^22.19.19", "ci-info": "^4.3.1", "tsdown": "^0.21.10", diff --git a/packages/cli-telemetry/package.json b/packages/cli-telemetry/package.json index 836ce45b..b63c484a 100644 --- a/packages/cli-telemetry/package.json +++ b/packages/cli-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@repo/cli-telemetry", "private": true, - "version": "8.0.0-rc.9", + "version": "8.0.0-rc.10", "description": "CLI telemetry child sender: the detached subprocess the engine hands a composed payload to, its system probes, and the POST", "type": "module", "sideEffects": [ @@ -35,7 +35,7 @@ "@vercel/detect-agent": "^1.2.3" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.9", + "@repo/tsconfig": "workspace:8.0.0-rc.10", "@types/node": "^22.19.19", "tsdown": "^0.21.10", "typescript": "^6.0.3", diff --git a/packages/cli/package.json b/packages/cli/package.json index d9f983b8..4bfa3332 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/cli", - "version": "8.0.0-rc.9", + "version": "8.0.0-rc.10", "description": "Command-line interface for the Prisma Developer Platform.", "type": "module", "bin": { @@ -50,11 +50,11 @@ "dependencies": { "@manypkg/tools": "^2.1.2", "@prisma/cli-engine": "workspace:0.2.3", - "@prisma/composer-cli": "0.13.0", + "@prisma/composer-cli": "0.14.0", "@prisma/compute-sdk": "0.39.0", "@prisma/credentials-store": "^7.8.0", "@prisma/management-api-sdk": "1.55.0", - "@prisma/orm-toolchain": "8.0.0-rc.6", + "@prisma/orm-toolchain": "8.0.0-rc.7", "@vercel/detect-agent": "^1.2.3", "better-result": "^2.9.2", "dotenv": "^17.4.2", @@ -62,10 +62,10 @@ "open": "^11.0.0" }, "devDependencies": { - "@prisma/composer": "0.13.0", - "@repo/cli-conformance": "workspace:8.0.0-rc.9", - "@repo/cli-telemetry": "workspace:8.0.0-rc.9", - "@repo/tsconfig": "workspace:8.0.0-rc.9", + "@prisma/composer": "0.14.0", + "@repo/cli-conformance": "workspace:8.0.0-rc.10", + "@repo/cli-telemetry": "workspace:8.0.0-rc.10", + "@repo/tsconfig": "workspace:8.0.0-rc.10", "@types/node": "^22.19.19", "tsdown": "^0.21.10", "tsx": "^4.22.4", diff --git a/packages/cli/scripts/conformance.ts b/packages/cli/scripts/conformance.ts index eba23aa2..230308f5 100644 --- a/packages/cli/scripts/conformance.ts +++ b/packages/cli/scripts/conformance.ts @@ -109,34 +109,13 @@ async function tarball(): Promise { shellPackage: "@prisma/cli", enginePackage: "@prisma/cli-engine", familyPackages: ["@prisma/composer-cli", "@prisma/orm-toolchain"], - // The empty list is the goal state: both families peering the - // exact engine version this repo ships, one engine per install - // (ADR 0004). The two entries below are an engine version - // transition in flight — a family cannot peer an engine version - // that is not on the registry, so the engine publishes first and - // the mismatch is real until both families release against it. - // The entries expire with the versions they name, and the PR - // that pins the families' 0.2.3 releases removes them; while - // they stand, a release could ship the two-engine install they - // describe, which is why they must not outlive the transition. - exceptions: [ - { - familyPackage: "@prisma/composer-cli", - familyPin: "0.2.2", - shellPin: "0.2.3", - reason: "engine 0.2.3 must publish before composer-cli can peer it", - removeWhen: - "composer-cli releases peering 0.2.3 and the follow-up bump PR pins that release", - }, - { - familyPackage: "@prisma/orm-toolchain", - familyPin: "0.2.2", - shellPin: "0.2.3", - reason: "engine 0.2.3 must publish before orm-toolchain can peer it", - removeWhen: - "orm-toolchain releases peering 0.2.3 and the follow-up bump PR pins that release", - }, - ], + // No exceptions. Both families declare @prisma/cli-engine as an + // exact peer at the version this repo ships, so one engine + // resolves in an install — what ADR 0004 asks for. An entry here + // exists only while an engine version transition is in flight + // (the engine must publish before a family can peer it), and the + // release PR that pins the families' new versions removes it. + exceptions: [], channel: CHANNEL, sandboxDir: join(WORK_DIR, "sandbox"), }, diff --git a/packages/compute/package.json b/packages/compute/package.json index 3c69d683..df9be91f 100644 --- a/packages/compute/package.json +++ b/packages/compute/package.json @@ -42,7 +42,7 @@ "test": "vitest run" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.9", + "@repo/tsconfig": "workspace:8.0.0-rc.10", "@types/node": "^22.19.19", "tsdown": "^0.21.10", "typescript": "^6.0.3", diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 8a31360e..0efb77b4 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -1,6 +1,6 @@ { "name": "prisma", - "version": "8.0.0-rc.9", + "version": "8.0.0-rc.10", "description": "The Prisma CLI: one binary for the ORM, Composer, and the Prisma Developer Platform.", "type": "module", "bin": { @@ -50,11 +50,11 @@ "dependencies": { "@manypkg/tools": "^2.1.2", "@prisma/cli-engine": "workspace:0.2.3", - "@prisma/composer-cli": "0.13.0", + "@prisma/composer-cli": "0.14.0", "@prisma/compute-sdk": "0.39.0", "@prisma/credentials-store": "^7.8.0", "@prisma/management-api-sdk": "1.55.0", - "@prisma/orm-toolchain": "8.0.0-rc.6", + "@prisma/orm-toolchain": "8.0.0-rc.7", "@vercel/detect-agent": "^1.2.3", "better-result": "^2.9.2", "dotenv": "^17.4.2", @@ -62,9 +62,9 @@ "open": "^11.0.0" }, "devDependencies": { - "@prisma/cli": "workspace:8.0.0-rc.9", - "@repo/cli-telemetry": "workspace:8.0.0-rc.9", - "@repo/tsconfig": "workspace:8.0.0-rc.9", + "@prisma/cli": "workspace:8.0.0-rc.10", + "@repo/cli-telemetry": "workspace:8.0.0-rc.10", + "@repo/tsconfig": "workspace:8.0.0-rc.10", "@types/node": "^22.19.19", "tsdown": "^0.21.10", "typescript": "^6.0.3", diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 3be07542..8914ba69 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -1,7 +1,7 @@ { "name": "@repo/tsconfig", "private": true, - "version": "8.0.0-rc.9", + "version": "8.0.0-rc.10", "description": "Base tsconfig providing package for the monorepo", "license": "Apache-2.0", "files": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aeeeb1e7..2d5d119f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: workspace:0.2.3 version: link:../cli-engine '@prisma/composer-cli': - specifier: 0.13.0 - version: 0.13.0(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) + specifier: 0.14.0 + version: 0.14.0(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) '@prisma/compute-sdk': specifier: 0.39.0 version: 0.39.0(@prisma/management-api-sdk@1.55.0)(rollup@4.62.2) @@ -42,8 +42,8 @@ importers: specifier: 1.55.0 version: 1.55.0 '@prisma/orm-toolchain': - specifier: 8.0.0-rc.6 - version: 8.0.0-rc.6(@prisma/cli-engine@packages+cli-engine)(magicast@0.5.3)(typanion@3.14.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + specifier: 8.0.0-rc.7 + version: 8.0.0-rc.7(@prisma/cli-engine@packages+cli-engine)(magicast@0.5.3)(typanion@3.14.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) '@vercel/detect-agent': specifier: ^1.2.3 version: 1.2.4 @@ -61,16 +61,16 @@ importers: version: 11.0.0 devDependencies: '@prisma/composer': - specifier: 0.13.0 - version: 0.13.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) + specifier: 0.14.0 + version: 0.14.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) '@repo/cli-conformance': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../cli-conformance '@repo/cli-telemetry': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../cli-telemetry '@repo/tsconfig': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../tsconfig '@types/node': specifier: ^22.19.19 @@ -91,7 +91,7 @@ importers: packages/cli-conformance: devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../tsconfig '@types/node': specifier: ^22.19.19 @@ -134,10 +134,10 @@ importers: version: 8.2.1 devDependencies: '@repo/cli-conformance': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../cli-conformance '@repo/tsconfig': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../tsconfig '@types/node': specifier: ^22.19.19 @@ -162,7 +162,7 @@ importers: version: 1.2.4 devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../tsconfig '@types/node': specifier: ^22.19.19 @@ -180,7 +180,7 @@ importers: packages/compute: devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../tsconfig '@types/node': specifier: ^22.19.19 @@ -204,8 +204,8 @@ importers: specifier: workspace:0.2.3 version: link:../cli-engine '@prisma/composer-cli': - specifier: 0.13.0 - version: 0.13.0(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) + specifier: 0.14.0 + version: 0.14.0(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) '@prisma/compute-sdk': specifier: 0.39.0 version: 0.39.0(@prisma/management-api-sdk@1.55.0)(rollup@4.62.2) @@ -216,8 +216,8 @@ importers: specifier: 1.55.0 version: 1.55.0 '@prisma/orm-toolchain': - specifier: 8.0.0-rc.6 - version: 8.0.0-rc.6(@prisma/cli-engine@packages+cli-engine)(magicast@0.5.3)(typanion@3.14.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + specifier: 8.0.0-rc.7 + version: 8.0.0-rc.7(@prisma/cli-engine@packages+cli-engine)(magicast@0.5.3)(typanion@3.14.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) '@vercel/detect-agent': specifier: ^1.2.3 version: 1.2.4 @@ -235,13 +235,13 @@ importers: version: 11.0.0 devDependencies: '@prisma/cli': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../cli '@repo/cli-telemetry': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../cli-telemetry '@repo/tsconfig': - specifier: workspace:8.0.0-rc.9 + specifier: workspace:8.0.0-rc.10 version: link:../tsconfig '@types/node': specifier: ^22.19.19 @@ -1329,15 +1329,15 @@ packages: '@oxc-project/types@0.139.0': resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - '@prisma/composer-cli@0.13.0': - resolution: {integrity: sha512-6qYLVcbksDCvG7Xuglv5KD3y6uWdwKtKU4PyVYxvHRoLrm5t/zSnIv4Rh0WFS2FZeSU5YDDj6K0dODj2uAMkxw==} + '@prisma/composer-cli@0.14.0': + resolution: {integrity: sha512-07LbfPHvj3Qm4hrheYzPmsWP5Ob6S9nahEHtp+0o9JRr/yeq/hiuBdtjaIgoZ6EAk1Dxp1JuvZ7rCXIXvnYWsA==} engines: {node: '>=22.18.0'} hasBin: true peerDependencies: - '@prisma/cli-engine': 0.2.2 + '@prisma/cli-engine': 0.2.3 - '@prisma/composer@0.13.0': - resolution: {integrity: sha512-o73iFmsC2liTwBi+ysHmGKNa+Z33p3RFeBD4Hoqe2XaaKvGfDLprZ3FUhKOJEjFMi9kfMbbs57L4CzqYGr2Xyg==} + '@prisma/composer@0.14.0': + resolution: {integrity: sha512-XRXadDM5+zpEDZIW602asV7YFfwbC+BU2cWLXQw0l1QddOTlvSquvZKB20n8Sg9x1pRm279Pmo0eGuB0I/VLPg==} engines: {node: '>=22.18.0'} '@prisma/compute-sdk@0.39.0': @@ -1364,18 +1364,18 @@ packages: '@prisma/management-api-sdk@1.62.0': resolution: {integrity: sha512-XJjNcsMEmvXA2vE88cBSwCQBKiWx3ArGQ00MIFePP653ZdY0Uiaodoyw++WnwewvHqOvpzgSC3XsijjRUuveHQ==} - '@prisma/orm-framework@8.0.0-rc.6': - resolution: {integrity: sha512-EQAHOHr66mH4tFnSrx/8b2QLbuhGfFu5I+lXFoKzGmMJuVZnVDoy/354huMsOjEXPQykgRo0qNl7tY8eTrwlug==} + '@prisma/orm-framework@8.0.0-rc.7': + resolution: {integrity: sha512-yl3giEt14nuHkxBQjXlzfstXdYxQPjbnJJ9lyA+5oNRgqIPdwwJiEUUxhASnAyhfrENZMJhtiwSqJPPxCGp4+A==} peerDependencies: typescript: '>=5.9' peerDependenciesMeta: typescript: optional: true - '@prisma/orm-toolchain@8.0.0-rc.6': - resolution: {integrity: sha512-Pv7JkxpFLs7Fa0i6oCPbClSQ704/WGQZfhk6Tia4BZHwWSnN6h1q9NlKkJMfIlFCUM/XdLDpIAQlc3Aeh4oXhQ==} + '@prisma/orm-toolchain@8.0.0-rc.7': + resolution: {integrity: sha512-BLmdSGzFmmTt3yXWbACODsPn7chSEfqGPdwL8C4CHWb0S0QFzKMY48Ygc5Mhmcj/h0pthhr6CeRr/unKOgSsuw==} peerDependencies: - '@prisma/cli-engine': 0.2.2 + '@prisma/cli-engine': 0.2.3 typescript: '>=5.9' vite: ^7.0.0 || ^8.0.0 peerDependenciesMeta: @@ -4378,10 +4378,10 @@ snapshots: '@oxc-project/types@0.139.0': {} - '@prisma/composer-cli@0.13.0(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0)': + '@prisma/composer-cli@0.14.0(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0)': dependencies: '@prisma/cli-engine': link:packages/cli-engine - '@prisma/composer': 0.13.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) + '@prisma/composer': 0.14.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) alchemy: 2.0.0-beta.74(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(effect@4.0.0-rc.111)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0) c12: 3.3.4(magicast@0.5.3) effect: 4.0.0-rc.111 @@ -4411,7 +4411,7 @@ snapshots: - vitest - ws - '@prisma/composer@0.13.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0)': + '@prisma/composer@0.14.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(magicast@0.5.3)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(mysql2@3.23.3(@types/node@22.19.19))(pg@8.23.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))(vitest@4.1.8(@types/node@22.19.19)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)))(ws@8.21.0)': dependencies: '@prisma/management-api-sdk': 1.62.0 '@standard-schema/spec': 1.1.0 @@ -4507,7 +4507,7 @@ snapshots: dependencies: openapi-fetch: 0.14.0 - '@prisma/orm-framework@8.0.0-rc.6(typescript@6.0.3)': + '@prisma/orm-framework@8.0.0-rc.7(typescript@6.0.3)': dependencies: '@standard-schema/spec': 1.1.0 arktype: 2.2.3 @@ -4516,10 +4516,10 @@ snapshots: optionalDependencies: typescript: 6.0.3 - '@prisma/orm-toolchain@8.0.0-rc.6(@prisma/cli-engine@packages+cli-engine)(magicast@0.5.3)(typanion@3.14.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': + '@prisma/orm-toolchain@8.0.0-rc.7(@prisma/cli-engine@packages+cli-engine)(magicast@0.5.3)(typanion@3.14.0)(typescript@6.0.3)(vite@7.3.5(@types/node@22.19.19)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@prisma/cli-engine': link:packages/cli-engine - '@prisma/orm-framework': 8.0.0-rc.6(typescript@6.0.3) + '@prisma/orm-framework': 8.0.0-rc.7(typescript@6.0.3) '@vercel/detect-agent': 1.2.4 arktype: 2.2.3 c12: 3.3.4(magicast@0.5.3) diff --git a/scripts/cutover-dist-tags.sh b/scripts/cutover-dist-tags.sh new file mode 100644 index 00000000..14b0a473 --- /dev/null +++ b/scripts/cutover-dist-tags.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +# One-shot registry maintenance for the latest-tag cutover +# (rollout-plan step 5). Everything here needs real npm auth, which the +# publish workflow's OIDC cannot provide: OIDC authenticates publishes, +# and these commands touch already-published versions. +# +# Usage: +# export NPM_TOKEN=... # an automation token, so no 2FA prompt +# bash scripts/cutover-dist-tags.sh +# +# The token is read from the environment and never echoed. + +set -euo pipefail + +if [ -z "${NPM_TOKEN:-}" ]; then + echo "NPM_TOKEN is not set. Export it first (an npm automation token)." >&2 + exit 1 +fi + +npmrc=$(mktemp) +trap 'rm -f "$npmrc"' EXIT +echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > "$npmrc" + +run() { + echo "+ $*" + NPM_CONFIG_USERCONFIG="$npmrc" "$@" +} + +# The engine's tags went stale because publish-packages.sh tolerates an +# already-published version by skipping it, which also skips the tag +# move. Point latest at the newest published engine and drop its stale +# next tag: since the cutover, releases publish under latest only and +# next is retired (docs/oss/versioning.md). +run npm dist-tag add @prisma/cli-engine@0.2.3 latest +run npm dist-tag rm @prisma/cli-engine next + +# next froze at the last pre-cutover RC on the CLI names. Remove it so +# prisma@next stops resolving an ever-older release; text that says +# prisma@next should move to plain prisma. +run npm dist-tag rm prisma next +run npm dist-tag rm @prisma/cli next + +# Deprecations from the rollout plan, step 5: +# prisma-next — already deprecated (operator, 2026-08-24). +# prisma-composer — left alone (operator ruling, 2026-08-25). +# @prisma/cli — undecided: this repo still publishes it as the +# scoped twin of the bare name. Uncomment to point +# installers at `prisma` instead: +# run npm deprecate @prisma/cli@"<8.0.0" "The unified Prisma CLI ships as 'prisma'. Install prisma instead." + +echo "Done." diff --git a/scripts/determine-version-utils.test.ts b/scripts/determine-version-utils.test.ts index be6159b0..93b595a6 100644 --- a/scripts/determine-version-utils.test.ts +++ b/scripts/determine-version-utils.test.ts @@ -142,9 +142,9 @@ describe("assertCanonicalBase", () => { }); describe("releaseDistTag", () => { - it("sends an RC-line bump to next, so latest stays put until the deliberate flip", () => { - assert.equal(releaseDistTag("8.0.0-rc.1"), "next"); - assert.equal(releaseDistTag("8.0.0-rc.12"), "next"); + it("sends an RC-line bump to latest — the cutover ruling of 2026-08-25", () => { + assert.equal(releaseDistTag("8.0.0-rc.1"), "latest"); + assert.equal(releaseDistTag("8.0.0-rc.12"), "latest"); }); it("sends a stable bump to latest", () => { @@ -180,13 +180,13 @@ describe("isReleasePublish", () => { }); it("a publish under the base's canonical tag is a release", () => { - assert.equal(isReleasePublish("8.0.0-rc.2", "next"), true); + assert.equal(isReleasePublish("8.0.0-rc.2", "latest"), true); assert.equal(isReleasePublish("8.1.0", "latest"), true); }); it("a beta or off-tag publish is not a release", () => { assert.equal(isReleasePublish("8.0.0-rc.2", "beta"), false); - assert.equal(isReleasePublish("8.0.0-rc.2", "latest"), false); + assert.equal(isReleasePublish("8.0.0-rc.2", "next"), false); }); }); diff --git a/scripts/determine-version-utils.ts b/scripts/determine-version-utils.ts index 11681ac1..cac4255c 100644 --- a/scripts/determine-version-utils.ts +++ b/scripts/determine-version-utils.ts @@ -118,15 +118,19 @@ export function assertValidDistTag(tag: string): void { } /** - * The dist-tag a release-bump push publishes under. RC-line versions go - * to `next`: `latest` keeps serving the pre-8 CLI until the operator - * deliberately moves it (rollout plan step 5), by dispatching the - * publish workflow with `dist-tag: latest` or by widening this rule - * when the RC line is ready. Stable versions go to `latest`. + * The dist-tag a release-bump push publishes under: `latest`, on the + * RC line included. This is the rollout plan's step-5 cutover, ruled by + * the operator on 2026-08-25: `npm install prisma` serves the unified + * v8 CLI from the first release after this widening. Before it, RC + * releases went to `next` while `latest` kept serving the pre-8 CLI. + * `next` is not moved by the publish path anymore: it froze at the + * last pre-cutover RC, and the operator re-points or retires it by + * hand — npm has no token permission narrower than package write, so + * an automated sync would mean a standing publish-capable token. */ export function releaseDistTag(base: string): "latest" | "next" { assertCanonicalBase(base); - return base.includes("-rc.") ? "next" : "latest"; + return "latest"; } /**