From 19daccb4be45528340892b8e18b848321b8760b3 Mon Sep 17 00:00:00 2001 From: willbot Date: Tue, 27 Oct 2026 17:27:02 +0100 Subject: [PATCH 1/3] feat: mount prisma deploy list from Composer Composer's family gained `deploy list`, which lists every node an app has deployed on a stage with its address, kind, platform ID and URL. Mount it under a new `deploy` group, next to `deploy`. Composer 0.35 also drops the positional entry argument from `deploy` and `dev` (the entry comes from `entry` in prisma.config.ts, or --entry), so the bin test and the platform skill use that form. Pinned to @prisma/composer(-cli) 0.34.0-dev.6 until 0.35.0 is released. Co-Authored-By: Claude Opus 5.5 Signed-off-by: willbot Signed-off-by: Will Madden --- packages/cli/package.json | 4 +- packages/cli/src/cli.ts | 9 ++- packages/cli/tests/bin.test.ts | 1 + packages/cli/tests/composer-mount.test.ts | 62 +++++++++++++++++-- packages/cli/tests/e2e-coverage.test.ts | 2 + packages/cli/tests/mount-coverage.test.ts | 1 + packages/prisma/package.json | 2 +- pnpm-lock.yaml | 27 ++++---- skills/prisma-platform-core-concepts/SKILL.md | 11 ++-- 9 files changed, 93 insertions(+), 26 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index b7529425..79e8a782 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,7 +50,7 @@ "dependencies": { "@manypkg/tools": "^2.1.2", "@prisma/cli-engine": "workspace:0.9.0", - "@prisma/composer-cli": "0.34.0", + "@prisma/composer-cli": "0.34.0-dev.6", "@prisma/compute-sdk": "0.43.0", "@prisma/management-api-sdk": "1.80.0", "@prisma/orm-toolchain": "8.0.0-rc.20", @@ -62,7 +62,7 @@ "open": "^11.0.0" }, "devDependencies": { - "@prisma/composer": "0.34.0", + "@prisma/composer": "0.34.0-dev.6", "@prisma/credentials-store": "^7.8.0", "@repo/cli-conformance": "workspace:8.0.0-rc.27", "@repo/cli-telemetry": "workspace:8.0.0-rc.27", diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 69fc514a..ff21795d 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -346,6 +346,10 @@ export const cliGroups: Readonly< "A ref is a named pointer to a contract, letting commands target a contract by a stable name. Set, list, and delete refs here.", }, orm: { brief: "Initialize a Prisma ORM project" }, + deploy: { + brief: + "Deploy your app to Prisma Cloud, and list what a stage has deployed", + }, dev: { brief: "Run your app on this machine, with no Prisma account. Start it, print a node's local URL, stop it", @@ -421,9 +425,10 @@ export const mountedCommands: Readonly> = { "service domain delete": serviceDomainDeleteCommand, "service domain retry": serviceDomainRetryCommand, "service domain wait": serviceDomainWaitCommand, - // Composer's product verbs: deploy and dev at the root, dev's - // children beneath it, and the local emulators under their own group. + // Composer's product verbs: deploy and dev at the root, their + // children beneath them, and the local emulators under their own group. deploy: composerCommandFamily.commands.deploy, + "deploy list": composerCommandFamily.commands["deploy list"], dev: composerCommandFamily.commands.dev, "dev url": composerCommandFamily.commands["dev url"], "dev stop": composerCommandFamily.commands["dev stop"], diff --git a/packages/cli/tests/bin.test.ts b/packages/cli/tests/bin.test.ts index f6d84483..f013f6ff 100644 --- a/packages/cli/tests/bin.test.ts +++ b/packages/cli/tests/bin.test.ts @@ -533,6 +533,7 @@ describe("buildCli", () => { "--json", "--config", configPath, + "--entry", "src/service.ts", ], }); diff --git a/packages/cli/tests/composer-mount.test.ts b/packages/cli/tests/composer-mount.test.ts index d95a6cbc..600fab4b 100644 --- a/packages/cli/tests/composer-mount.test.ts +++ b/packages/cli/tests/composer-mount.test.ts @@ -4,11 +4,13 @@ * what a pipe receives, not Composer's dev logic, which Composer's own * integration tests run against real emulators. */ -import { createTestCli } from "@prisma/cli-engine/testing"; +import { createTestCli, mintTestJwt } from "@prisma/cli-engine/testing"; import { defineConfig as composer } from "@prisma/composer/config"; import { nodeBuild } from "@prisma/composer/node/control"; import { createComposerFamily, + type DeployedNode, + type ListDeployed, type ListEmulators, } from "@prisma/composer-cli/family"; import { createOperationsDouble } from "@prisma/composer-cli/testing"; @@ -70,12 +72,38 @@ const ONE_INSTANCE = listing([ { kind: "database", running: false, url: null, instances: [], error: null }, ]); -const COMPOSER_PATHS = ["dev", "dev url", "dev stop", "emulator list"]; +const DEPLOYED: readonly DeployedNode[] = [ + { address: "shop", kind: "project", platformId: "proj_1", url: null }, + { + address: "shop.api", + kind: "service", + platformId: "cps_1", + url: "https://api.example.prisma.build", + }, +]; + +const listDeployed: ListDeployed = async () => ({ + ok: true, + value: DEPLOYED, + assertOk: () => DEPLOYED, + assertNotOk: () => { + throw new Error("listDeployed succeeded"); + }, +}); + +const COMPOSER_PATHS = [ + "deploy list", + "dev", + "dev url", + "dev stop", + "emulator list", +]; function shell(emulators: Listing = listing([])) { const family = createComposerFamily({ operations: createOperationsDouble().operations, listEmulators: async () => emulators, + listDeployed, }); const commands = Object.fromEntries( COMPOSER_PATHS.map((path) => [path, family.commands[path]]), @@ -83,17 +111,34 @@ function shell(emulators: Listing = listing([])) { return createTestCli({ commandFamilies: [family], commands, - groups: { dev: cliGroups.dev, emulator: cliGroups.emulator }, + groups: { + deploy: cliGroups.deploy, + dev: cliGroups.dev, + emulator: cliGroups.emulator, + }, config: { composer: COMPOSER_SECTION }, + sessions: [ + { + workspaceId: "ws_1", + workspaceName: "Acme Inc", + credential: { + token: mintTestJwt({ sub: "usr_1", workspace_id: "ws_1" }), + refreshToken: undefined, + expiresAt: undefined, + }, + }, + ], + selectedWorkspaceId: "ws_1", now: () => new Date(0), }); } describe("Composer's commands in the shell", () => { - it("mounts Composer's dev children and emulator list where the shell says", () => { + it("mounts Composer's deploy and dev children and emulator list where the shell says", () => { for (const path of COMPOSER_PATHS) { expect(mountedCommands[path], path).toBeDefined(); } + expect(cliGroups.deploy).toBeDefined(); expect(cliGroups.dev).toBeDefined(); expect(cliGroups.emulator?.description).toContain("emulator"); }); @@ -112,6 +157,15 @@ describe("Composer's commands in the shell", () => { expect(result.stdout).toBe(""); }); + it("pipes one tab-separated line per deployed node from deploy list", async () => { + const result = await shell().run(["deploy", "list"]); + + expect(result.exitCode).toBe(0); + expect(result.stdout).toBe( + "shop\tproject\tproj_1\t\nshop.api\tservice\tcps_1\thttps://api.example.prisma.build\n", + ); + }); + it("lists emulators", async () => { const result = await shell().run(["emulator", "list"]); diff --git a/packages/cli/tests/e2e-coverage.test.ts b/packages/cli/tests/e2e-coverage.test.ts index 46593825..879f48e6 100644 --- a/packages/cli/tests/e2e-coverage.test.ts +++ b/packages/cli/tests/e2e-coverage.test.ts @@ -105,6 +105,8 @@ const EXCLUSIONS: Readonly> = { "Needs a connected repository, which `git connect` cannot create here.", deploy: "Provisions real cloud infrastructure for an app entry point, through a child `alchemy deploy`. Standing that up per CI run is neither cheap nor unattended-safe.", + "deploy list": + "Lists a deployed Composer app's stage, and this suite deploys none (see `deploy`). Composer's e2e deploy workflow runs it after every deploy and checks it against the platform.", dev: "A session command: it runs until SIGINT or SIGTERM, redeploying on file change, so it has no happy path that terminates on its own.", "dev url": LOCAL_EMULATOR_REASON, "dev stop": LOCAL_EMULATOR_REASON, diff --git a/packages/cli/tests/mount-coverage.test.ts b/packages/cli/tests/mount-coverage.test.ts index 5d86dc13..cceb3de7 100644 --- a/packages/cli/tests/mount-coverage.test.ts +++ b/packages/cli/tests/mount-coverage.test.ts @@ -99,6 +99,7 @@ const EXPECTED_MOUNT_PATHS: readonly string[] = [ "db update", "db verify", "deploy", + "deploy list", "dev", "dev stop", "dev url", diff --git a/packages/prisma/package.json b/packages/prisma/package.json index e45a84fc..c0600bd7 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -51,7 +51,7 @@ "dependencies": { "@manypkg/tools": "^2.1.2", "@prisma/cli-engine": "workspace:0.9.0", - "@prisma/composer-cli": "0.34.0", + "@prisma/composer-cli": "0.34.0-dev.6", "@prisma/compute-sdk": "0.43.0", "@prisma/management-api-sdk": "1.80.0", "@prisma/orm-toolchain": "8.0.0-rc.20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f55681a..82e08e22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: workspace:0.9.0 version: link:../cli-engine '@prisma/composer-cli': - specifier: 0.34.0 - version: 0.34.0(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6 + version: 0.34.0-dev.6(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.43.0 version: 0.43.0(@prisma/management-api-sdk@1.80.0)(rollup@4.62.2) @@ -61,8 +61,8 @@ importers: version: 11.0.0 devDependencies: '@prisma/composer': - specifier: 0.34.0 - version: 0.34.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6 + version: 0.34.0-dev.6(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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/credentials-store': specifier: ^7.8.0 version: 7.8.0 @@ -213,8 +213,8 @@ importers: specifier: workspace:0.9.0 version: link:../cli-engine '@prisma/composer-cli': - specifier: 0.34.0 - version: 0.34.0(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6 + version: 0.34.0-dev.6(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.43.0 version: 0.43.0(@prisma/management-api-sdk@1.80.0)(rollup@4.62.2) @@ -1342,14 +1342,14 @@ packages: '@oxc-project/types@0.146.0': resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} - '@prisma/composer-cli@0.34.0': - resolution: {integrity: sha512-IIzKPghOXnVpBr8NNPZ7k3mMdJPWhANZBbgxcMNNwxwZHAv1SFQ7pYaaxDYmVtp/fnMD9tJVW1BiX8Y5gjTDPA==} + '@prisma/composer-cli@0.34.0-dev.6': + resolution: {integrity: sha512-Udb4MrwYdZUJiwvCIM6QP1hGCoSiXcO4ugERBjRvFU9lt7bL8jHRmrzoOeqA2EWxGcDkEz+ihCzlYxpok7aIyg==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: '@prisma/cli-engine': 0.9.0 - '@prisma/composer@0.34.0': - resolution: {integrity: sha512-1SowNGV/hDsaVo6RWUbl6M7dzlhQkCyGlGECArfV53Dgy51SaD1MxjleWr73XEPPrYoD4AM5E9yIz01+uoJwjQ==} + '@prisma/composer@0.34.0-dev.6': + resolution: {integrity: sha512-0GhAJrIV97oSrZ7Gts32j0qUTUJsW47xq641H9lw9bZlnaV+xSmblTkyM/IsbgtTKA+T6fqvFAYiQNi3xSdruw==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} '@prisma/compute-sdk@0.43.0': @@ -4059,10 +4059,11 @@ snapshots: '@oxc-project/types@0.146.0': {} - '@prisma/composer-cli@0.34.0(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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/management-api-sdk': 1.80.0 alchemy: 2.0.0-beta.83(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(effect@4.0.3)(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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))(ws@8.21.0) cross-spawn: 7.0.6 effect: 4.0.3 @@ -4096,7 +4097,7 @@ snapshots: - vitest - ws - '@prisma/composer@0.34.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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: '@effect/sql-d1': 4.0.3(effect@4.0.3) '@effect/sql-sqlite-do': 4.0.3(effect@4.0.3) diff --git a/skills/prisma-platform-core-concepts/SKILL.md b/skills/prisma-platform-core-concepts/SKILL.md index fe7d25ee..9ded96d4 100644 --- a/skills/prisma-platform-core-concepts/SKILL.md +++ b/skills/prisma-platform-core-concepts/SKILL.md @@ -144,7 +144,7 @@ branch is the environment, and branches come into being by deploying to them: 1. **Push a git branch** (with the GitHub integration connected and the deploy workflow in the repository): the workflow builds and deploys, and the platform creates the branch environment on the fly. -2. **Deploy a stage from the CLI**: `prisma deploy module.ts --stage pr-42` +2. **Deploy a stage from the CLI**: `prisma deploy --stage pr-42` creates a branch named `pr-42` and deploys the identical app graph into it. A stage name must be a valid git ref name; an invalid name is a hard error. @@ -208,8 +208,11 @@ Opening a pull request does not itself deploy anything; previews track branch pushes. A connected repository without the workflow gets branch bookkeeping and preview teardown from the platform, and no builds. -**CLI.** `prisma deploy module.ts` deploys production directly; add -`--stage ` for a preview. Authenticate once with `prisma auth login` +**CLI.** `prisma deploy` deploys production directly; add `--stage ` +for a preview. It deploys the entry file named by `entry` in the `composer` +section of `prisma.config.ts`; `--entry ` overrides it. `prisma deploy +list` (same `--stage`) lists each deployed node's address, kind, platform ID +and URL. Authenticate once with `prisma auth login` (interactive), or set `PRISMA_SERVICE_TOKEN` (plus `PRISMA_WORKSPACE_ID` when the token can see more than one workspace) for CI and other headless runs. The first deploy creates the project, named after your module; the @@ -350,7 +353,7 @@ over deploying whenever you want to show the user a change or verify your own work: 1. Build the app exactly as you would for deploy, then run - `prisma dev module.ts`. It provisions a local Prisma Postgres database, + `prisma dev` (it runs the config's `entry`, like deploy). It provisions a local Prisma Postgres database, applies the schema, creates local stand-ins for declared buckets, starts the services, and prints a local URL. It watches built output and restarts a service when its build changes. From 9f4dd4d917e3c2bfb821132f4401b40a3158b38f Mon Sep 17 00:00:00 2001 From: willbot Date: Tue, 27 Oct 2026 18:36:51 +0100 Subject: [PATCH 2/3] chore(deps): follow Composer's 0.35.0 release Co-Authored-By: Claude Opus 5.5 Signed-off-by: willbot Signed-off-by: Will Madden --- packages/cli/package.json | 4 ++-- packages/prisma/package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++++------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 79e8a782..6d62a374 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,7 +50,7 @@ "dependencies": { "@manypkg/tools": "^2.1.2", "@prisma/cli-engine": "workspace:0.9.0", - "@prisma/composer-cli": "0.34.0-dev.6", + "@prisma/composer-cli": "0.35.0", "@prisma/compute-sdk": "0.43.0", "@prisma/management-api-sdk": "1.80.0", "@prisma/orm-toolchain": "8.0.0-rc.20", @@ -62,7 +62,7 @@ "open": "^11.0.0" }, "devDependencies": { - "@prisma/composer": "0.34.0-dev.6", + "@prisma/composer": "0.35.0", "@prisma/credentials-store": "^7.8.0", "@repo/cli-conformance": "workspace:8.0.0-rc.27", "@repo/cli-telemetry": "workspace:8.0.0-rc.27", diff --git a/packages/prisma/package.json b/packages/prisma/package.json index c0600bd7..92c84cdb 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -51,7 +51,7 @@ "dependencies": { "@manypkg/tools": "^2.1.2", "@prisma/cli-engine": "workspace:0.9.0", - "@prisma/composer-cli": "0.34.0-dev.6", + "@prisma/composer-cli": "0.35.0", "@prisma/compute-sdk": "0.43.0", "@prisma/management-api-sdk": "1.80.0", "@prisma/orm-toolchain": "8.0.0-rc.20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82e08e22..0fc64284 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: workspace:0.9.0 version: link:../cli-engine '@prisma/composer-cli': - specifier: 0.34.0-dev.6 - version: 0.34.0-dev.6(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.35.0 + version: 0.35.0(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.43.0 version: 0.43.0(@prisma/management-api-sdk@1.80.0)(rollup@4.62.2) @@ -61,8 +61,8 @@ importers: version: 11.0.0 devDependencies: '@prisma/composer': - specifier: 0.34.0-dev.6 - version: 0.34.0-dev.6(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.35.0 + version: 0.35.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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/credentials-store': specifier: ^7.8.0 version: 7.8.0 @@ -213,8 +213,8 @@ importers: specifier: workspace:0.9.0 version: link:../cli-engine '@prisma/composer-cli': - specifier: 0.34.0-dev.6 - version: 0.34.0-dev.6(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.35.0 + version: 0.35.0(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.43.0 version: 0.43.0(@prisma/management-api-sdk@1.80.0)(rollup@4.62.2) @@ -1342,14 +1342,14 @@ packages: '@oxc-project/types@0.146.0': resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} - '@prisma/composer-cli@0.34.0-dev.6': - resolution: {integrity: sha512-Udb4MrwYdZUJiwvCIM6QP1hGCoSiXcO4ugERBjRvFU9lt7bL8jHRmrzoOeqA2EWxGcDkEz+ihCzlYxpok7aIyg==} + '@prisma/composer-cli@0.35.0': + resolution: {integrity: sha512-CjWQzfx5AjTYnAoLpF/zxlQgIUvDsnydb4kl79XiwoxeAqd7mLnedecFFHL7AQAoJRmohGkDft5WDPvMnuGR0Q==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: '@prisma/cli-engine': 0.9.0 - '@prisma/composer@0.34.0-dev.6': - resolution: {integrity: sha512-0GhAJrIV97oSrZ7Gts32j0qUTUJsW47xq641H9lw9bZlnaV+xSmblTkyM/IsbgtTKA+T6fqvFAYiQNi3xSdruw==} + '@prisma/composer@0.35.0': + resolution: {integrity: sha512-qQZY57p6JpnJxiuZ/EWxC2VBJIW3UqA7FCbuCRCh2coecojDAPhEQ4NaBac7JhpFJxWZpsaXmzGznF5sX53lSQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} '@prisma/compute-sdk@0.43.0': @@ -4059,10 +4059,10 @@ snapshots: '@oxc-project/types@0.146.0': {} - '@prisma/composer-cli@0.34.0-dev.6(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.35.0(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@prisma/cli-engine@packages+cli-engine)(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.34.0-dev.6(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.35.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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/management-api-sdk': 1.80.0 alchemy: 2.0.0-beta.83(@effect/vitest@4.0.3(effect@4.0.3)(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))))(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(effect@4.0.3)(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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))(ws@8.21.0) cross-spawn: 7.0.6 @@ -4097,7 +4097,7 @@ snapshots: - vitest - ws - '@prisma/composer@0.34.0-dev.6(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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.35.0(@types/node@22.19.19)(@vercel/nft@1.10.2(rollup@4.62.2))(hono@4.11.4)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1107.0))(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: '@effect/sql-d1': 4.0.3(effect@4.0.3) '@effect/sql-sqlite-do': 4.0.3(effect@4.0.3) From fa5976fe8d267dbe281ec0869b6decba2df3e5cb Mon Sep 17 00:00:00 2001 From: willbot Date: Tue, 27 Oct 2026 18:42:50 +0100 Subject: [PATCH 3/3] docs(skill): the config example sets Composer's entry Co-Authored-By: Claude Opus 5.5 Signed-off-by: willbot Signed-off-by: Will Madden --- skills/prisma-platform-core-concepts/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/skills/prisma-platform-core-concepts/SKILL.md b/skills/prisma-platform-core-concepts/SKILL.md index 9ded96d4..939d2bd2 100644 --- a/skills/prisma-platform-core-concepts/SKILL.md +++ b/skills/prisma-platform-core-concepts/SKILL.md @@ -94,6 +94,7 @@ import { defineConfig as orm } from "@prisma/orm-postgres/config"; export default definePrismaConfig({ composer: composer({ + entry: "./module.ts", extensions: [prismaCloud(), nodeBuild()], state: prismaState(), }),