Skip to content

feat(cli): install Prisma agent skills during prisma init - #29689

Merged
aqrln merged 8 commits into
mainfrom
tml-2968-s1-install-prisma-skills-during-prisma-init
Jul 9, 2026
Merged

feat(cli): install Prisma agent skills during prisma init#29689
aqrln merged 8 commits into
mainfrom
tml-2968-s1-install-prisma-skills-during-prisma-init

Conversation

@tensordreams

Copy link
Copy Markdown
Contributor

prisma init now installs the prisma/skills catalog into freshly scaffolded projects, so AI agents working in them start with current, version-relevant Prisma knowledge instead of stale training data. First slice (S1) of the Agent-Native Prisma ORM project — spec and plan in docs/plans/agent-native/ and projects/agent-native/ (#29688).

Changes

  • Skill-install runner (packages/cli/src/init/skill-install.ts): executes <runner> skills@1.5.14 add prisma/skills --agent cursor claude-code codex windsurf --skill '*' --copy -y via execa, streaming output. The runner adapts to the invoking package manager (npx --yes / pnpm dlx / yarn dlx / bunx), detected from npm_config_user_agent, then the Bun runtime, then a lockfile sniff, defaulting to npm. Yarn 1 routes through npx — classic yarn has no dlx. installSkills never throws: any failure resolves to { ok: false, manualCommand }.
  • Init wiring (packages/cli/src/Init.ts): the install runs after file scaffolding (both default and Prisma Postgres new-project flows); --no-skills opts out (arg spec + help). Success appends .claude/skills/, .windsurf/skills/, .agents/skills/, skills-lock.json to the init summary; failure prints a warning with the copy-pasteable manual command and init still exits 0. The PPG existing-project path (which scaffolds nothing) skips the install.
  • Tests: 43 passing in packages/cli — 17 runner unit tests (command assembly per package manager, detection fallbacks, failure shapes; injected exec, no network, no module mocks) and 26 Init tests including 4 new integration cases (default invokes the runner, --no-skills skips, failure is non-fatal, help lists the flag). Snapshot updates are exactly the new summary lines.

Why

  • Default-on with a clean opt-out implements the project spec's distribution goal (zero-configuration agent readiness), following the prisma-next precedent — with two deliberate deviations: the skills CLI version is pinned (supply-chain hygiene; bumped via Renovate) and install failure is non-fatal (the stable CLI must never fail scaffolding over an auxiliary network step).
  • --copy instead of the default symlink layout: skills@1.5.14 with multiple --agent values writes only the universal .agents/skills/ tree and silently skips the per-agent symlinks its own plan output promises (verified empirically; upstream bug report prepared). --copy materializes real .claude/skills/ and .windsurf/skills/ copies so Claude Code and Windsurf find skills where they actually look.
  • Default-branch install for now: prisma/skills has no release tags yet; a prepared ask requests per-ORM-minor tags so the install can pin prisma/skills#v<minor> in a follow-up.

Verification (live runs, built CLI, clean env)

  • Default prisma init: exit 0; all 8 catalog skills present in each of .claude/skills/, .windsurf/skills/, .agents/skills/ (24 SKILL.md files, zero symlinks); skills-lock.json written; summary matches disk.
  • Forced failure (unreachable registry): exit 0; scaffolding intact; warning printed with the manual command.
  • --no-skills: exit 0; no agent artifacts.

Full evidence and the two prepared external filings (tagging ask for prisma/skills; symlink bug for vercel-labs/skills) live in projects/agent-native/slices/init-skill-install/verification.md on the project branch (#29688).

Linear: TML-2968

Add packages/cli/src/init/skill-install.ts, which installs the
prisma/skills catalog via the upstream skills CLI (pinned to 1.5.14)
using a package-manager-adaptive runner (npx --yes / pnpm dlx /
yarn dlx / bunx). The runner is detected from npm_config_user_agent,
the Bun runtime, or a lockfile in the target directory, defaulting to
npm. installSkills() streams the CLI output and never throws: failures
resolve to { ok: false, manualCommand } so callers can print the
command for the user to run by hand.

Unit tests cover command assembly per package manager, lockfile-based
detection with npm fallback, and the failure shape.
Wire the skill-install runner into prisma init: after scaffolding
(including when the Prisma Postgres flow is taken), init runs the
skills CLI to install the prisma/skills catalog for cursor,
claude-code, codex, and windsurf. A successful install lists
.claude/skills/, .agents/skills/, and skills-lock.json in the summary
output. A failed install is non-fatal: init prints a warning with the
equivalent manual command and completes normally. The new --no-skills
flag skips the install entirely.

The Bun runtime check now lives in the skill-install module and Init
imports it from there.
Yarn 1 (classic) has no dlx command, so a yarn/1.x user agent now
resolves to the npx --yes runner instead of yarn dlx; yarn 2+ keeps
yarn dlx.

Side-task to the init skills wiring, surfaced by review of the runner
detection.
Pass --copy to the skills CLI so each agent gets its own copy of the
installed skills, and list all four produced artifacts
(.claude/skills/, .windsurf/skills/, .agents/skills/, skills-lock.json)
in the init summary.

Live-run verification showed that without --copy, multi-agent installs
with skills@1.5.14 only populate the universal .agents/skills/
directory: the symlinks its plan output promises for Claude Code and
Windsurf are never created, which would leave those agents without the
skill files. The slice spec was amended accordingly after this
evidence.
tensordreams added a commit that referenced this pull request Jul 3, 2026
D3 R2 satisfied after the --copy amendment; slice scoreboard 2 PASS +
1 accepted deferral (AC-3, permission-gated external filings preserved
in verification.md). Full trace through dispatch-end.
@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e4e1340d-cafe-413e-ade5-98fcfdec450a

📥 Commits

Reviewing files that changed from the base of the PR and between 7a9786c and ca1c3eb.

📒 Files selected for processing (2)
  • packages/cli/src/__tests__/skill-install.vitest.ts
  • packages/cli/src/init/skill-install.ts

Summary by CodeRabbit

  • New Features
    • The init command can now install Prisma agent skills automatically and shows a skills-related summary on success.
    • Added a --no-skills flag to skip skill installation (including in --help).
  • Bug Fixes
    • Skill installation failures no longer stop initialization; a warning is shown with a manual install command.
    • Improved package-manager/runtime detection for the skills installer.
  • Tests
    • Added/expanded coverage for default skills installation, --no-skills, runner/command selection, and non-fatal failure handling.

Walkthrough

This PR adds automatic Prisma agent skills installation to prisma init. A new helper detects the package manager runner from user agent, Bun runtime, or lockfiles and runs the matching skills add command, returning a manual command on failure. Init now imports the helper, adds a --no-skills flag, installs skills by default, warns instead of aborting on install failure, and only includes skills-related paths in the final output when installation succeeds. Tests cover runner detection, command assembly, failure handling, and Init integration.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: installing Prisma agent skills during prisma init.
Description check ✅ Passed The description is directly related to the changeset and accurately describes the new skills install flow and opt-out flag.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tml-2968-s1-install-prisma-skills-during-prisma-init
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch tml-2968-s1-install-prisma-skills-during-prisma-init

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/cli/src/Init.ts (1)

692-756: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Thread the skills summary into the PPG init output

The PPG new-project branch returns printPpgInitOutput(...) directly, and that helper has no way to render skillsInstalled/skillsSummary. As a result, a successful skills install is hidden from the user-facing output on the Prisma Postgres path even though it is shown for the default init path.

Pass the skills summary through to printPpgInitOutput as well.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/src/Init.ts` around lines 692 - 756, The Prisma Postgres init
path skips the skills summary because `isPpgCommand` returns
`printPpgInitOutput(...)` directly, so successful installs are hidden. Update
the `Init.ts` flow to pass `skillsSummary` (or `skillsInstalled`) into
`printPpgInitOutput` and render it there, matching the default `defaultOutput`
behavior while keeping the existing `skillsInstalled`/`skillsSummary` logic
intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/cli/src/init/skill-install.ts`:
- Around line 131-162: The external `skills` CLI call in `installSkills` can
hang forever because `defaultExec` uses `execa` without a timeout. Update
`defaultExec` to pass a finite `timeout` so the `installSkills` best-effort flow
can fail fast and return `{ ok: false, manualCommand }` instead of blocking
`prisma init`; keep the change localized to `defaultExec` and the
`installSkills` call path.

---

Outside diff comments:
In `@packages/cli/src/Init.ts`:
- Around line 692-756: The Prisma Postgres init path skips the skills summary
because `isPpgCommand` returns `printPpgInitOutput(...)` directly, so successful
installs are hidden. Update the `Init.ts` flow to pass `skillsSummary` (or
`skillsInstalled`) into `printPpgInitOutput` and render it there, matching the
default `defaultOutput` behavior while keeping the existing
`skillsInstalled`/`skillsSummary` logic intact.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: fce22338-517c-44ef-8651-3883712b9bed

📥 Commits

Reviewing files that changed from the base of the PR and between 9b2e72a and ca261b4.

⛔ Files ignored due to path filters (1)
  • packages/cli/src/__tests__/__snapshots__/Init.vitest.ts.snap is excluded by !**/*.snap
📒 Files selected for processing (4)
  • packages/cli/src/Init.ts
  • packages/cli/src/__tests__/Init.vitest.ts
  • packages/cli/src/__tests__/skill-install.vitest.ts
  • packages/cli/src/init/skill-install.ts

Comment thread packages/cli/src/init/skill-install.ts
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size
packages/client/runtime/index-browser.js 2.29 KB (0%)
packages/client/runtime/index-browser.d.ts 3.37 KB (0%)
packages/cli/build/index.js 2.55 MB (+0.08% 🔺)
packages/client/prisma-client-0.0.0.tgz 26.71 MB (0%)
packages/cli/prisma-0.0.0.tgz 13.53 MB (+0.02% 🔺)
packages/bundle-size/da-workers-libsql/output.tgz 1.33 MB (0%)
packages/bundle-size/da-workers-neon/output.tgz 1.39 MB (0%)
packages/bundle-size/da-workers-pg/output.tgz 1.39 MB (0%)
packages/bundle-size/da-workers-planetscale/output.tgz 1.33 MB (0%)
packages/bundle-size/da-workers-d1/output.tgz 1.31 MB (0%)

A stalled installer process (typically a hung network call inside the
package-manager runner) previously hung prisma init indefinitely,
defeating the non-fatal design of the skills install. execa now kills
the child after 60s; the rejection resolves into the existing
{ ok: false, manualCommand } failure shape.

Addresses a review finding on the initial PR.
Comment thread packages/cli/src/__tests__/skill-install.vitest.ts Outdated
Comment thread packages/cli/src/init/skill-install.ts Outdated
@dosubot dosubot Bot added the lgtm This PR has been approved by a maintainer label Jul 9, 2026
@aqrln
aqrln merged commit 9acd8dc into main Jul 9, 2026
243 checks passed
@aqrln
aqrln deleted the tml-2968-s1-install-prisma-skills-during-prisma-init branch July 9, 2026 15:02
aqrln pushed a commit that referenced this pull request Jul 22, 2026
> **Stacked PR** — based on #29689 (S1, the skill-install runner); will
be retargeted to `main` once #29689 merges. The diff here is only S2's
two commits.

Existing projects (which never ran the new `prisma init`) get exactly
one polite, interactive, time-limited offer to install the
[prisma/skills](https://github.com/prisma/skills) catalog, shown after a
successful `prisma generate`. Second slice (S2) of the Agent-Native
Prisma ORM project (#29688).

## Changes

- **Offer module** (`packages/cli/src/utils/skills/skills-offer.ts`):
`handleSkillsOffer()` runs the full NPS-style gate chain — prior
acknowledgement, already-installed detection, interactive TTY, Deno
guard, CI, git hook, npm lifecycle hook, container, and "first Prisma
command ≥ 1 day ago" — then asks one yes/no question with a 30-second
timeout defaulting to No. Every outcome (`accepted` / `declined` /
`timeout` / `already-installed`) persists `skills-offer.json` in the OS
config dir, so the offer fires **once ever per machine** (unlike the NPS
survey's once-per-timeframe). Accepting runs S1's pinned skill-install
runner; failure prints the manual command, non-fatally. The whole body
never throws — an offer failure can never fail `generate`.
- **Generate wiring** (`packages/cli/src/Generate.ts`): the offer runs
in the existing `!hideHints` non-watch success block, before the NPS
survey; if the offer prompted, the survey is skipped for that run — at
most one prompt per generate. Injectable handler mirroring the existing
`surveyHandler` seam.
- **Shared helper** (`packages/cli/src/utils/prompt-timeout.ts`): the
`timeout()` racer extracted verbatim from `nps/survey.ts`; both prompts
now share it.
- **Telemetry**: a single `skills_offer_resolved` `{ outcome, cliVersion
}` event through the existing PostHog capture path, only when a prompt
was actually shown.
- **Tests**: 27 unit tests for the module (every gate short-circuit,
input variants, fake-timer timeout, four failure-isolation cases) + 4
Generate-level tests (ordering, mutual exclusion both ways, `--no-hints`
and watch suppression). Injection over module mocking throughout.

## Why

- **Once-ever, not once-per-timeframe**: a declined offer should never
nag again; `prisma init` (S1) and docs remain the discovery paths.
- **Acknowledgement only after a prompt resolves**: gated-out runs (CI,
non-TTY) write nothing, so a developer whose first runs are in CI still
gets the offer later on a real TTY.
- **Ordering inside the resolution path** (acknowledge → install →
telemetry) makes once-ever survive a crash mid-install and keeps an
offline telemetry endpoint from robbing an accepting user of the
install.
- **Mutual exclusion with NPS** keeps the post-generate moment to a
single question, ever.

## Verification (live pty runs, built CLI, isolated config dirs)

- First interactive run: offer shown; `n` persists `outcome:
"declined"`; second run silent.
- Accept run: skills land via the S1 runner (24 SKILL.md across
`.claude`/`.windsurf`/`.agents` + `skills-lock.json`); `outcome:
"accepted"`.
- Non-TTY run: no prompt, no acknowledgement written, generate output
normal.
- In prompted runs the offer was the only prompt (NPS skipped; mechanism
also pinned by unit tests).

Full captures:
`projects/agent-native/slices/generate-skill-offer/verification.md` on
the project branch (#29688).

**Linear:**
[TML-2971](https://linear.app/prisma-company/issue/TML-2971/s2-one-time-skill-offer-on-prisma-generate)
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Server that referenced this pull request Jul 28, 2026
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [@prisma/adapter-pg](https://github.com/prisma/prisma) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/adapter-pg)) | imports | minor | [`7.8.0` -> `7.9.0`](https://renovatebot.com/diffs/npm/@prisma%2fadapter-pg/7.8.0/7.9.0) | `7.9.1` |
| [@prisma/client](https://www.prisma.io) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/client)) | imports | minor | [`7.8.0` -> `7.9.0`](https://renovatebot.com/diffs/npm/@prisma%2fclient/7.8.0/7.9.0) | `7.9.1` |
| [prisma](https://www.prisma.io) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/cli)) | imports | minor | [`7.8.0` -> `7.9.0`](https://renovatebot.com/diffs/npm/prisma/7.8.0/7.9.0) | `7.9.1` |

---

### Release Notes

<details>
<summary>prisma/prisma (@&#8203;prisma/adapter-pg)</summary>

### [`v7.9.0`](https://github.com/prisma/prisma/releases/tag/7.9.0)

[Compare Source](prisma/orm@7.8.0...7.9.0)

Today, we are excited to share the `7.9.0` stable release 🎉

**🌟 Star this repo for notifications about new releases, bug fixes & features — or [follow us on X](https://pris.ly/x)!**

##### Highlights

##### ORM

##### Tab completions for the Prisma CLI

Typing out CLI commands from memory is now optional. Prisma ships **shell tab completions** for `bash`, `zsh`, `fish`, and PowerShell, covering commands, subcommands, options, flags, and even option values.

**Setting it up.** Most projects run Prisma through a package manager, so completions are enabled through `@bomb.sh/tab`'s package-manager integration — install it once, then source the completion for your package manager and shell:

```bash

# 1. Install @&#8203;bomb.sh/tab globally
npm install -g @&#8203;bomb.sh/tab

# 2. Wire up your package manager + shell (pnpm shown; swap in npm / yarn / bun):
echo 'source <(tab pnpm zsh)'  >> ~/.zshrc            # zsh
echo 'source <(tab pnpm bash)' >> ~/.bashrc           # bash
tab pnpm fish > ~/.config/fish/completions/pnpm.fish  # fish
tab pnpm powershell > ~/.tab-pnpm.ps1                 # PowerShell (then dot-source it from $PROFILE)
```

`@bomb.sh/tab` delegates to any locally-installed CLI that ships completions, so `pnpm prisma <TAB>`, `pnpm exec prisma <TAB>`, `yarn prisma <TAB>`, and `bun x prisma <TAB>` all complete Prisma's commands, options, and values — no per-project setup. (`npx` and `bunx` don't support completion themselves; use `npm exec` and `bun x`.)

If instead you have Prisma installed globally on your `PATH`, source its own completion directly: `source <(prisma complete zsh)` (or the `bash` / `fish` / `powershell` variant).

This is built on [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab/), the same completion library that powers other CLIs in the ecosystem — including Cloudflare, Nuxt, and Vitest — so the package-manager completions you enable for Prisma work for those tools too. A wonderful community contribution from [@&#8203;AmirSa12](https://github.com/AmirSa12) ([#&#8203;28351](prisma/orm#28351)) — thank you!

<https://github.com/user-attachments/assets/1f916a60-ee4d-40be-bb7d-74035d48ca83>

##### Prisma ORM, ready for AI agents

Coding agents are now a first-class audience for Prisma, and 7.9.0 brings the first wave of work to make Prisma projects safe and productive for them to work in.

**Agent skills installed with `prisma init`** ([#&#8203;29689](prisma/orm#29689))

`prisma init` now installs the [prisma/skills](https://github.com/prisma/skills) catalog into freshly scaffolded projects. Agents such as Claude Code, Cursor, Codex, and Windsurf start out with current, version-relevant Prisma knowledge instead of relying on whatever happened to be in their training data. The install is best-effort and never blocks scaffolding; opt out at any time with `--no-skills`.

```terminal
npx prisma@latest init
```

![prisma init scaffolds a project and installs the Prisma agent skills catalog](https://github.com/user-attachments/assets/8244a6dc-cdad-4028-a652-bb5ac6e4b271)

**A safer default around destructive commands** ([#&#8203;29684](prisma/orm#29684), [#&#8203;29691](prisma/orm#29691), [#&#8203;29713](prisma/orm#29713))

Prisma's AI safety checkpoint refuses to run destructive commands when it detects that an AI agent is at the keyboard, unless the user has given explicit consent. In this release we:

- **Broadened agent detection** to cover today's landscape — Codex CLI (now on Linux as well as macOS), Qwen Code, GitHub Copilot CLI, OpenCode, Cline, Goose, Amp, Crush, Augment Code, Antigravity, Replit Agent, and Devin — plus generic `AI_AGENT` / `AGENT` conventions so future agents are caught without a code change.
- **Extended the guard to `db push --accept-data-loss`**, which previously bypassed the checkpoint even though it can drop data.
- **Removed the `migrate-reset` tool from the `prisma mcp` server** entirely — resetting a database drops it, and that is not an operation an agent should be handed as a first-class tool. An agent that needs a reset must run the CLI, where the checkpoint applies.

##### Bug Fixes

Many of the fixes below are **community contributions** — thank you to everyone who reported and fixed these!

**Prisma Client**

- Fixed a severe TypeScript performance regression introduced in Prisma 7: restoring the `OmitOpts` generic default lets `tsc` reuse cached type instantiations again, bringing type-checking on large schemas back from minutes to seconds ([#&#8203;29592](prisma/orm#29592), from [@&#8203;nfl1ryxditimo12](https://github.com/nfl1ryxditimo12)).
- The `XOR` type helper now rejects primitive values such as `data: 5`, which were previously accepted at compile time even though the runtime rejected them ([#&#8203;29735](prisma/orm#29735), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- `$queryRaw` and `$executeRaw` now fail fast with a clear validation error when passed an invalid `Date`, instead of silently serializing it as `null` and corrupting the value sent to the database ([#&#8203;29697](prisma/orm#29697), from [@&#8203;jibin7jose](https://github.com/jibin7jose)).
- The generated client is no longer corrupted by a `///` documentation comment that contains a `*/` sequence; the comment terminator is now escaped when doc comments are emitted, in both the TypeScript and JavaScript generators ([#&#8203;29736](prisma/orm#29736), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- Improved the runtime and TypeScript error messages shown when a driver adapter is missing from the `PrismaClient` constructor; both now include a copy-pasteable example and a link to the [driver adapters docs](https://pris.ly/d/driver-adapters) ([#&#8203;29624](prisma/orm#29624)).
- Unmapped database errors from driver adapters now surface as a user-facing `P2039` (`PrismaClientKnownRequestError`) carrying the original code and message, instead of an opaque failure, which keeps schema-drift-style problems debuggable ([#&#8203;29512](prisma/orm#29512)).
- The `prisma-client-js` generator no longer emits a stray `undefined` statement when generating from a schema that declares only enums or types and no models ([#&#8203;29738](prisma/orm#29738), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- Fixed a connection leak when an interactive transaction times out (`maxWait`) while it is still starting: the discarded transaction now sends an explicit `ROLLBACK` before the connection is returned to the pool, instead of releasing it mid-transaction. Previously, on adapters like `@prisma/adapter-pg` and `@prisma/adapter-neon`, the next query to reuse that connection could fail with `there is already a transaction in progress` — or silently commit the leaked transaction's work ([#&#8203;29727](prisma/orm#29727), from [@&#8203;lazerg](https://github.com/lazerg)).

**CLI**

- `prisma validate` (and other schema-loading commands) no longer hangs forever on a multi-file schema whose directories contain a symlink cycle, and no longer reports the same file twice when a directory is reachable under two spellings (e.g. `/tmp` → `/private/tmp` on macOS) ([#&#8203;29740](prisma/orm#29740), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- On Windows, engine binaries are now cached in a stable, user-level directory (`%APPDATA%\Prisma`) instead of a `cwd`-relative `node_modules\.cache`, which eliminated duplicate cache directories and the bloated Serverless/Docker bundles they caused ([#&#8203;29730](prisma/orm#29730), from [@&#8203;santichausis](https://github.com/santichausis); closes [#&#8203;22574](prisma/orm#22574), [#&#8203;6670](prisma/orm#6670), [#&#8203;11577](prisma/orm#11577)).

**Driver Adapters**

- **[@&#8203;prisma/adapter-pg](https://github.com/prisma/adapter-pg)**, **[@&#8203;prisma/adapter-neon](https://github.com/prisma/adapter-neon)**, **[@&#8203;prisma/adapter-ppg](https://github.com/prisma/adapter-ppg)**: Reading a `Bytes` column no longer emits Node.js' `DEP0005` deprecation warning, thanks to an upstream `postgres-bytea` bump ([#&#8203;29538](prisma/orm#29538), from [@&#8203;kolia-zamnius](https://github.com/kolia-zamnius)).
- **[@&#8203;prisma/adapter-ppg](https://github.com/prisma/adapter-ppg)**: `ColumnNotFound` (`P2022`) errors now parse both quoted and unquoted PostgreSQL column names, including identifiers containing spaces, matching the fix previously applied to `adapter-pg` ([#&#8203;29737](prisma/orm#29737), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- **[@&#8203;prisma/adapter-mssql](https://github.com/prisma/adapter-mssql)**: Setting a `Bytes?` (`@db.VarBinary`) field to `null` no longer fails with an implicit-conversion error; the adapter now sends the parameter typed as `VarBinary` instead of letting SQL Server default it to `nvarchar` ([#&#8203;29630](prisma/orm#29630), from [@&#8203;AnupamKumar-1](https://github.com/AnupamKumar-1)).

**Schema Engine**

- `prisma migrate status` now reports a rolled-back migration that still exists on disk as *unapplied*, instead of incorrectly treating the schema as up to date ([prisma/prisma-engines#5817](prisma/prisma-engines#5817), from [@&#8203;goutamadwant](https://github.com/goutamadwant)).
- Primary-key constraint renames are now rendered as separate `ALTER TABLE` statements on PostgreSQL, avoiding a database error when a single table has multiple changes in one migration ([prisma/prisma-engines#4906](prisma/prisma-engines#4906), from [@&#8203;eruditmorina](https://github.com/eruditmorina)).

##### Security

- Resolved the `hono` security advisories at their source: `@prisma/dev` was updated to a version that no longer depends on `hono` at all, so the CLI is no longer exposed to those advisories through that path. We also patched moderate-severity advisories in `ajv` and `uuid` across production dependencies ([#&#8203;29514](prisma/orm#29514)).
- Hardened the Prisma Platform credentials file (`~/.config/prisma-platform/auth.json`) and its directory to `0o600` / `0o700` so OAuth tokens are no longer world-readable, bringing Prisma in line with the GitHub, AWS, and Google Cloud CLIs ([#&#8203;29568](prisma/orm#29568), from Jaeyoung Yun).
- Bumped the `openssl` crate in the schema engine binaries from 0.10.74 to 0.10.81 ([prisma/prisma-engines#5815](prisma/prisma-engines#5815)).

##### Prisma Studio

The bundled Prisma Studio moves from `0.27.3` to `0.33.0` ([#&#8203;29720](prisma/orm#29720)), gathering up everything shipped in the Studio releases in between.

##### Migrations view

Studio can now visualise your **migration history**. This view is powered by **[Prisma Next](https://www.prisma.io/docs/orm/next)** — the next major version of Prisma ORM, a full TypeScript rewrite (available now in [Early Access](https://www.prisma.io/docs/next/getting-started)) that keeps the schema-first workflow and model-first queries you know, but treats your schema as a versioned, inspectable **contract** instead of compiling it into a heavy generated client. Prisma Next records every migration and its contract snapshots in the database, and Studio reads them to draw the timeline and diff below. Databases managed with classic Prisma Migrate don't carry this ledger, so the view simply stays hidden there.

When the connected database has a Prisma Next migration ledger, a **Migrations** entry appears in the sidebar: a newest-first timeline of every applied migration with its name, apply time, operation count, and compact chips summarizing what changed (`+2 models`, `~2 models +3 fields`, `+1 model`, …). Selecting a migration opens a visual, FigJam-style diff canvas — added, removed, and changed models as colour-coded cards (`NEW` / `UPDATED` / `UNCHANGED`) with per-field before → after details, enum cards, and relation edges — next to a SQL panel of the executed statements and a Prisma-schema line diff. Switching migrations morphs the canvas rather than rebuilding it.

![The Studio Migrations view: walking a Prisma Next migration history, the diff canvas morphing between migrations](https://github.com/user-attachments/assets/2633b77a-b1d9-4c3f-b5c4-c10908f040d9)

<!-- On publishing: drag wip/demos/prisma-studio-migrations.webp into the GitHub release editor so it becomes a user-attachments URL. -->

##### Prisma Streams browser

Studio gains first-class support for Prisma Streams: a dedicated stream browser, live stream aggregations, stream diagnostics, routing-key browsing, and a WAL-history handoff straight from your tables, plus richer stream request observability with concise event-log and OpenTelemetry span summaries.

##### Working with SQL

- SQL execution, linting, and navigation are now **schema-aware**: unqualified identifiers resolve against the schema you've selected instead of always falling back to the adapter's default schema.
- SQL result visualizations are rendered with Studio-owned chart configuration, and there's an optional **Queries** view backed by query-insights snapshots.
- Added copy actions to the Query Details view.

##### Fixes

- Fixed editing PostgreSQL text-array cells when queries are compiled with inline values.
- Avoided cancelling and repeating introspection requests when Studio first mounts, removing duplicate startup work.

##### Thanks to our contributors

A heartfelt thank you to the community members whose contributions shaped this release:

[@&#8203;AmirSa12](https://github.com/AmirSa12), [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m), [@&#8203;nfl1ryxditimo12](https://github.com/nfl1ryxditimo12), [@&#8203;jibin7jose](https://github.com/jibin7jose), [@&#8203;santichausis](https://github.com/santichausis), [@&#8203;kolia-zamnius](https://github.com/kolia-zamnius), [@&#8203;goutamadwant](https://github.com/goutamadwant), [@&#8203;eruditmorina](https://github.com/eruditmorina), [@&#8203;lazerg](https://github.com/lazerg), [@&#8203;AnupamKumar-1](https://github.com/AnupamKumar-1), [@&#8203;Swapanrishi](https://github.com/Swapanrishi), [@&#8203;anupamme](https://github.com/anupamme), and [@&#8203;oyi77](https://github.com/oyi77).

##### Prisma Compute is now in public beta

**"Push code, it runs."** [Prisma Compute](https://www.prisma.io/compute) — managed hosting for TypeScript apps that run right next to your database — is now available in [public beta](https://blog.prisma.io/blog/launching-prisma-compute-public-beta), and free to use while the beta lasts.

Compute deploys your app as a long-lived process on Bun, colocated with your Prisma Postgres database, so there are no cold starts, no request timeouts, and no separate hosting vendor to wire up. It's a fit for REST and GraphQL APIs, full-stack apps, streaming and gRPC, and the long-running, stateful AI agents that keep connections open and hold in-process caches — "self-hosting, without the painful parts".

- **Push-to-deploy** from the CLI or via GitHub integration. Every deployment is an immutable, versioned release with its own preview URL, and rolling back is simply promoting a previous version.
- **Branch-based environments** — each branch gets its own app and database, so you can preview a change before promoting it to production.
- **Auto-wires with Prisma Postgres** (or bring any database), with automatic health checks and self-recovery.
- **[Custom domains](https://blog.prisma.io/blog/prisma-compute-custom-domains)** — point a single CNAME at Prisma and Compute provisions and renews the TLS certificate for you, with no manual certificate uploads or private-key handling.

With Prisma ORM for type-safe data access, Prisma Postgres for the managed database, and now Prisma Compute for hosting, the whole stack lives in one place. Read the full story in the [Prisma Compute blog series](https://blog.prisma.io/blog/series/prisma-compute).

##### Enterprise support

Thousands of teams use Prisma and many of them already tap into our Enterprise & Agency Support Program for hands-on help with everything from schema integrations and performance tuning to security and compliance.

With this program you also get priority issue triage and bug fixes, expert scalability advice, and custom training so that your Prisma-powered apps stay rock-solid at any scale. Learn more or join: <https://prisma.io/enterprise>.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNzIuMSIsInVwZGF0ZWRJblZlciI6IjQzLjI3Mi4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/30
lh0x00 pushed a commit to lh0x00/prisma that referenced this pull request Aug 9, 2026
`prisma init` now installs the
[prisma/skills](https://github.com/prisma/skills) catalog into freshly
scaffolded projects, so AI agents working in them start with current,
version-relevant Prisma knowledge instead of stale training data. First
slice (S1) of the Agent-Native Prisma ORM project — spec and plan in
`docs/plans/agent-native/` and `projects/agent-native/` (prisma#29688).

## Changes

- **Skill-install runner** (`packages/cli/src/init/skill-install.ts`):
executes `<runner> skills@1.5.14 add prisma/skills --agent cursor
claude-code codex windsurf --skill '*' --copy -y` via execa, streaming
output. The runner adapts to the invoking package manager (`npx --yes` /
`pnpm dlx` / `yarn dlx` / `bunx`), detected from
`npm_config_user_agent`, then the Bun runtime, then a lockfile sniff,
defaulting to npm. Yarn 1 routes through npx — classic yarn has no
`dlx`. `installSkills` never throws: any failure resolves to `{ ok:
false, manualCommand }`.
- **Init wiring** (`packages/cli/src/Init.ts`): the install runs after
file scaffolding (both default and Prisma Postgres new-project flows);
`--no-skills` opts out (arg spec + help). Success appends
`.claude/skills/`, `.windsurf/skills/`, `.agents/skills/`,
`skills-lock.json` to the init summary; failure prints a warning with
the copy-pasteable manual command and init still exits 0. The PPG
existing-project path (which scaffolds nothing) skips the install.
- **Tests**: 43 passing in `packages/cli` — 17 runner unit tests
(command assembly per package manager, detection fallbacks, failure
shapes; injected exec, no network, no module mocks) and 26 Init tests
including 4 new integration cases (default invokes the runner,
`--no-skills` skips, failure is non-fatal, help lists the flag).
Snapshot updates are exactly the new summary lines.

## Why

- **Default-on with a clean opt-out** implements the project spec's
distribution goal (zero-configuration agent readiness), following the
prisma-next precedent — with two deliberate deviations: the `skills` CLI
version is **pinned** (supply-chain hygiene; bumped via Renovate) and
install failure is **non-fatal** (the stable CLI must never fail
scaffolding over an auxiliary network step).
- **`--copy` instead of the default symlink layout**: skills@1.5.14 with
multiple `--agent` values writes only the universal `.agents/skills/`
tree and silently skips the per-agent symlinks its own plan output
promises (verified empirically; upstream bug report prepared). `--copy`
materializes real `.claude/skills/` and `.windsurf/skills/` copies so
Claude Code and Windsurf find skills where they actually look.
- **Default-branch install for now**: prisma/skills has no release tags
yet; a prepared ask requests per-ORM-minor tags so the install can pin
`prisma/skills#v<minor>` in a follow-up.

## Verification (live runs, built CLI, clean env)

- **Default `prisma init`**: exit 0; all 8 catalog skills present in
each of `.claude/skills/`, `.windsurf/skills/`, `.agents/skills/` (24
`SKILL.md` files, zero symlinks); `skills-lock.json` written; summary
matches disk.
- **Forced failure** (unreachable registry): exit 0; scaffolding intact;
warning printed with the manual command.
- **`--no-skills`**: exit 0; no agent artifacts.

Full evidence and the two prepared external filings (tagging ask for
prisma/skills; symlink bug for vercel-labs/skills) live in
`projects/agent-native/slices/init-skill-install/verification.md` on the
project branch (prisma#29688).

**Linear:**
[TML-2968](https://linear.app/prisma-company/issue/TML-2968/s1-install-prisma-skills-during-prisma-init)
lh0x00 pushed a commit to lh0x00/prisma that referenced this pull request Aug 9, 2026
…#29690)

> **Stacked PR** — based on prisma#29689 (S1, the skill-install runner); will
be retargeted to `main` once prisma#29689 merges. The diff here is only S2's
two commits.

Existing projects (which never ran the new `prisma init`) get exactly
one polite, interactive, time-limited offer to install the
[prisma/skills](https://github.com/prisma/skills) catalog, shown after a
successful `prisma generate`. Second slice (S2) of the Agent-Native
Prisma ORM project (prisma#29688).

## Changes

- **Offer module** (`packages/cli/src/utils/skills/skills-offer.ts`):
`handleSkillsOffer()` runs the full NPS-style gate chain — prior
acknowledgement, already-installed detection, interactive TTY, Deno
guard, CI, git hook, npm lifecycle hook, container, and "first Prisma
command ≥ 1 day ago" — then asks one yes/no question with a 30-second
timeout defaulting to No. Every outcome (`accepted` / `declined` /
`timeout` / `already-installed`) persists `skills-offer.json` in the OS
config dir, so the offer fires **once ever per machine** (unlike the NPS
survey's once-per-timeframe). Accepting runs S1's pinned skill-install
runner; failure prints the manual command, non-fatally. The whole body
never throws — an offer failure can never fail `generate`.
- **Generate wiring** (`packages/cli/src/Generate.ts`): the offer runs
in the existing `!hideHints` non-watch success block, before the NPS
survey; if the offer prompted, the survey is skipped for that run — at
most one prompt per generate. Injectable handler mirroring the existing
`surveyHandler` seam.
- **Shared helper** (`packages/cli/src/utils/prompt-timeout.ts`): the
`timeout()` racer extracted verbatim from `nps/survey.ts`; both prompts
now share it.
- **Telemetry**: a single `skills_offer_resolved` `{ outcome, cliVersion
}` event through the existing PostHog capture path, only when a prompt
was actually shown.
- **Tests**: 27 unit tests for the module (every gate short-circuit,
input variants, fake-timer timeout, four failure-isolation cases) + 4
Generate-level tests (ordering, mutual exclusion both ways, `--no-hints`
and watch suppression). Injection over module mocking throughout.

## Why

- **Once-ever, not once-per-timeframe**: a declined offer should never
nag again; `prisma init` (S1) and docs remain the discovery paths.
- **Acknowledgement only after a prompt resolves**: gated-out runs (CI,
non-TTY) write nothing, so a developer whose first runs are in CI still
gets the offer later on a real TTY.
- **Ordering inside the resolution path** (acknowledge → install →
telemetry) makes once-ever survive a crash mid-install and keeps an
offline telemetry endpoint from robbing an accepting user of the
install.
- **Mutual exclusion with NPS** keeps the post-generate moment to a
single question, ever.

## Verification (live pty runs, built CLI, isolated config dirs)

- First interactive run: offer shown; `n` persists `outcome:
"declined"`; second run silent.
- Accept run: skills land via the S1 runner (24 SKILL.md across
`.claude`/`.windsurf`/`.agents` + `skills-lock.json`); `outcome:
"accepted"`.
- Non-TTY run: no prompt, no acknowledgement written, generate output
normal.
- In prompted runs the offer was the only prompt (NPS skipped; mechanism
also pinned by unit tests).

Full captures:
`projects/agent-native/slices/generate-skill-offer/verification.md` on
the project branch (prisma#29688).

**Linear:**
[TML-2971](https://linear.app/prisma-company/issue/TML-2971/s2-one-time-skill-offer-on-prisma-generate)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lgtm This PR has been approved by a maintainer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants