@prisma/orm-mongo 8.0.0-rc.5 → 8.0.0-rc.5-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/package.json +11 -10
  2. package/skills/prisma-8/SKILL.md +84 -0
  3. package/skills/prisma-8/references/build.md +142 -0
  4. package/skills/prisma-8/references/contract.md +417 -0
  5. package/skills/prisma-8/references/debug.md +141 -0
  6. package/skills/prisma-8/references/feedback.md +251 -0
  7. package/skills/prisma-8/references/migration-review.md +224 -0
  8. package/skills/prisma-8/references/migrations.md +519 -0
  9. package/skills/prisma-8/references/queries-mongo.md +236 -0
  10. package/skills/prisma-8/references/queries-postgres.md +415 -0
  11. package/skills/prisma-8/references/queries.md +168 -0
  12. package/skills/prisma-8/references/quickstart.md +326 -0
  13. package/skills/prisma-8/references/runtime.md +344 -0
  14. package/skills/prisma-8/references/supabase.md +244 -0
  15. package/skills/prisma-8/references/upgrade-app.md +101 -0
  16. package/skills/prisma-8/references/upgrade-extension.md +105 -0
  17. package/skills/prisma-8/upgrading/app/upgrades/0.10-to-0.11/instructions.md +56 -0
  18. package/skills/prisma-8/upgrading/app/upgrades/0.11-to-0.12/instructions.md +381 -0
  19. package/skills/prisma-8/upgrading/app/upgrades/0.11-to-0.12/re-emit-closed-mongo-contracts.ts +202 -0
  20. package/skills/prisma-8/upgrading/app/upgrades/0.11-to-0.12/re-emit-domain-namespaced-contracts.ts +201 -0
  21. package/skills/prisma-8/upgrading/app/upgrades/0.11-to-0.12/re-emit-postgres-public-default.ts +198 -0
  22. package/skills/prisma-8/upgrading/app/upgrades/0.11-to-0.12/strip-migration-labels-hints.ts +340 -0
  23. package/skills/prisma-8/upgrading/app/upgrades/0.12-to-0.13/instructions.md +339 -0
  24. package/skills/prisma-8/upgrading/app/upgrades/0.12-to-0.13/re-emit-mti-variant-link-columns.ts +229 -0
  25. package/skills/prisma-8/upgrading/app/upgrades/0.13-to-0.14/instructions.md +543 -0
  26. package/skills/prisma-8/upgrading/app/upgrades/0.13-to-0.14/migration-op-factories-to-methods.ts +290 -0
  27. package/skills/prisma-8/upgrading/app/upgrades/0.13-to-0.14/uuid-preset-rename.ts +43 -0
  28. package/skills/prisma-8/upgrading/app/upgrades/0.14-to-0.15/instructions.md +359 -0
  29. package/skills/prisma-8/upgrading/app/upgrades/0.15-to-0.16/instructions.md +173 -0
  30. package/skills/prisma-8/upgrading/app/upgrades/0.16-to-0.17/instructions.md +805 -0
  31. package/skills/prisma-8/upgrading/app/upgrades/0.16-to-0.17/strip-sha256-hash-prefixes.ts +382 -0
  32. package/skills/prisma-8/upgrading/app/upgrades/0.17-to-8.0.0-rc.1/instructions.md +72 -0
  33. package/skills/prisma-8/upgrading/app/upgrades/0.7-to-0.8/instructions.md +8 -0
  34. package/skills/prisma-8/upgrading/app/upgrades/0.8-to-0.9/instructions.md +36 -0
  35. package/skills/prisma-8/upgrading/app/upgrades/0.8-to-0.9/strip-inline-contracts.ts +226 -0
  36. package/skills/prisma-8/upgrading/app/upgrades/0.9-to-0.10/instructions.md +86 -0
  37. package/skills/prisma-8/upgrading/app/upgrades/0.9-to-0.10/stamp-storage-types-kind.ts +360 -0
  38. package/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.1-to-8.0.0-rc.2/instructions.md +588 -0
  39. package/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.2-to-8.0.0-rc.3/instructions.md +5 -0
  40. package/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.3-to-8.0.0-rc.4/instructions.md +158 -0
  41. package/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.4-to-8.0.0-rc.5/instructions.md +42 -0
  42. package/skills/prisma-8/upgrading/extension/upgrades/0.10-to-0.11/instructions.md +276 -0
  43. package/skills/prisma-8/upgrading/extension/upgrades/0.11-to-0.12/instructions.md +738 -0
  44. package/skills/prisma-8/upgrading/extension/upgrades/0.11-to-0.12/migrate-contract-testing-imports.ts +97 -0
  45. package/skills/prisma-8/upgrading/extension/upgrades/0.11-to-0.12/regenerate-extension-public-baseline.ts +223 -0
  46. package/skills/prisma-8/upgrading/extension/upgrades/0.11-to-0.12/strip-migration-labels-hints.ts +340 -0
  47. package/skills/prisma-8/upgrading/extension/upgrades/0.12-to-0.13/instructions.md +266 -0
  48. package/skills/prisma-8/upgrading/extension/upgrades/0.13-to-0.14/instructions.md +522 -0
  49. package/skills/prisma-8/upgrading/extension/upgrades/0.13-to-0.14/migration-op-factories-to-methods.ts +290 -0
  50. package/skills/prisma-8/upgrading/extension/upgrades/0.13-to-0.14/uuid-preset-rename.ts +43 -0
  51. package/skills/prisma-8/upgrading/extension/upgrades/0.14-to-0.15/instructions.md +803 -0
  52. package/skills/prisma-8/upgrading/extension/upgrades/0.15-to-0.16/instructions.md +219 -0
  53. package/skills/prisma-8/upgrading/extension/upgrades/0.16-to-0.17/instructions.md +731 -0
  54. package/skills/prisma-8/upgrading/extension/upgrades/0.16-to-0.17/strip-sha256-hash-prefixes.ts +382 -0
  55. package/skills/prisma-8/upgrading/extension/upgrades/0.17-to-8.0.0-rc.1/instructions.md +194 -0
  56. package/skills/prisma-8/upgrading/extension/upgrades/0.7-to-0.8/instructions.md +8 -0
  57. package/skills/prisma-8/upgrading/extension/upgrades/0.8-to-0.9/instructions.md +57 -0
  58. package/skills/prisma-8/upgrading/extension/upgrades/0.8-to-0.9/strip-inline-contracts.ts +226 -0
  59. package/skills/prisma-8/upgrading/extension/upgrades/0.9-to-0.10/instructions.md +150 -0
  60. package/skills/prisma-8/upgrading/extension/upgrades/0.9-to-0.10/stamp-storage-types-kind.ts +360 -0
  61. package/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.1-to-8.0.0-rc.2/instructions.md +746 -0
  62. package/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.2-to-8.0.0-rc.3/instructions.md +5 -0
  63. package/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.3-to-8.0.0-rc.4/instructions.md +137 -0
  64. package/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.4-to-8.0.0-rc.5/instructions.md +129 -0
@@ -0,0 +1,168 @@
1
+
2
+ # Prisma Next — Queries
3
+
4
+ > **Edit your data contract. Prisma handles the rest.**
5
+
6
+ Once the contract is emitted and the DB is up to date, this skill covers everything you do *with* the data: reading, writing, eager-loading relations, aggregating, and the choice between the ORM and the lower-level query lane.
7
+
8
+ ## When to Use
9
+
10
+ - User wants to read, write, update, or delete data.
11
+ - User wants to include / eager-load relations.
12
+ - User wants to paginate, sort, filter, project.
13
+ - User wants to wrap operations in a transaction (`db.transaction(...)` — Postgres and SQLite).
14
+ - User wants to aggregate (`count`, `sum`, `avg`, …).
15
+ - User asks about query lanes (ORM vs SQL builder / query builder).
16
+ - User mentions: *query, select, where, orderBy, take, skip, include, eager load, first, all, count, aggregate, create, update, delete, upsert, returning, drizzle-style, kysely-style, prisma client*.
17
+
18
+ ## When Not to Use
19
+
20
+ - User wants to add / change a model → `references/contract.md`.
21
+ - User wants to wire `db.ts` or add middleware → `references/runtime.md`.
22
+ - User is querying through a Supabase role-bound db (`asUser` / `asAnon` / `asServiceRole`, RLS, `auth.*` admin reads) → `references/supabase.md` for the role-binding surface; everything in this skill then applies to the returned `RoleBoundDb`.
23
+ - User wants to debug a query failure (structured error envelope) → `references/debug.md`.
24
+
25
+ ## Pick your target
26
+
27
+ Prisma Next ships **two query lanes per target** on the same `db` value from `src/prisma/db.ts`. **Before writing queries, read `db.ts` and load the matching target guide:**
28
+
29
+ | Runtime import in `db.ts` | Load |
30
+ |---|---|
31
+ | `@internal/postgres/runtime` | [`queries-postgres.md`](./queries-postgres.md) — `db.orm.<Model>` + `db.sql.<table>` |
32
+ | `@internal/mongo/runtime` | [`queries-mongo.md`](./queries-mongo.md) — `db.orm.<root>` + `db.query.from(...)` |
33
+ | `@internal/extension-supabase/runtime` | [`queries-postgres.md`](./queries-postgres.md) — a Supabase `RoleBoundDb` is a Postgres surface (`db.orm.<Model>` + `db.sql.<table>`); bind a role first via `references/supabase.md` |
34
+
35
+ Both targets share the contract and connection on one `db` value. Reach for the ORM first; drop to the lower-level lane when the ORM can't express the shape. Lane choice is local — one query function picks one lane, not the whole app.
36
+
37
+ **Do not mix target examples.** Postgres uses PascalCase model roots (`db.orm.User`) and `db.sql.user`; Mongo uses lowercased plural roots (`db.orm.users`) and `db.query.from('users')`. There is no `db.sql` on Mongo and no `db.query` SQL-builder equivalent on Postgres.
38
+
39
+ ## Namespace-aware accessors
40
+
41
+ When a contract declares more than one namespace (e.g. `public` and `auth`), models and tables are addressed by namespace coordinate:
42
+
43
+ - **ORM**: `db.orm.<namespace>.<Model>` — e.g. `db.orm.public.User`, `db.orm.auth.User`
44
+ - **SQL builder**: `db.sql.<namespace>.<table>` — e.g. `db.sql.public.users`, `db.sql.auth.users`
45
+
46
+ The flat `db.orm.User` / `db.sql.users` form still works for single-namespace contracts (or when all table names are unique across namespaces). When the same bare name appears in more than one namespace, you must use the namespace coordinate.
47
+
48
+ See [`queries-postgres.md` § Namespace-aware accessors](./queries-postgres.md#namespace-aware-accessors) for a worked example.
49
+
50
+ ## Consuming the result: `await`, `.toArray()`, or `for await`
51
+
52
+ Critical to get right early — on **both Postgres and Mongo**, `.all()` returns an **`AsyncIterableResult<Row>`**, which is *both* a `PromiseLike<Row[]>` and an `AsyncIterable<Row>`. That means three consumption forms all work, and the canonical one is the shortest:
53
+
54
+ ```typescript
55
+ const users = await db.orm.User.select('id', 'email').all();
56
+ // ^? Row[] ← the Thenable resolves to a real array. This is the default idiom.
57
+ ```
58
+
59
+ You do **not** need a `collect()` / `toArray()` helper — `await` is enough. Internally `await` invokes the result's `then(...)`, which buffers the rows into an array. Two equivalent alternatives exist for the cases where they read better:
60
+
61
+ ```typescript
62
+ // `.toArray()` returns a genuine `Promise<Row[]>`. Reach for it only when
63
+ // something needs a real `Promise` and not merely a thenable: a slot typed
64
+ // `Promise<Row[]>` (an `AsyncIterableResult` has only `then`, not `catch` /
65
+ // `finally`, so it does not satisfy that annotation), or a runtime
66
+ // `instanceof Promise` check. Note that `await` and the `Promise.all` /
67
+ // `Promise.race` combinators all accept the thenable directly — those are
68
+ // NOT reasons to call `.toArray()`. Whenever you are just going to await it
69
+ // here, use `await ...all()` and skip `.toArray()`.
70
+ const rows: Promise<User[]> = db.orm.User.select('id', 'email').all().toArray();
71
+
72
+ // Streaming — process rows one at a time without buffering the whole result.
73
+ // Use for genuinely large result sets (anything that wouldn't fit comfortably
74
+ // in memory) or pipelines where you can start work before all rows arrive.
75
+ for await (const user of db.orm.User.select('id', 'email').all()) {
76
+ process(user);
77
+ }
78
+ ```
79
+
80
+ Two single-row shortcuts also exist on the result, in addition to the collection-level `.first()` (which issues `LIMIT 1` on Postgres):
81
+
82
+ ```typescript
83
+ const user = await db.orm.User.where({ id }).all().first();
84
+ // ^? Row | null ← buffers, returns the first row or null. Issues no LIMIT.
85
+ const required = await db.orm.User.where({ id }).all().firstOrThrow();
86
+ // ^? Row ← buffers; throws `RUNTIME.NO_ROWS` if empty.
87
+ ```
88
+
89
+ For genuine single-row reads, prefer the *collection*-level `.first()` (which adds `LIMIT 1` to the SQL on Postgres) over `.all().first()` (which fetches all rows and discards the rest). The result-level helpers are for cases where you already need the full result and want the first row without an extra round-trip.
90
+
91
+ **The result is single-consumption.** Each `AsyncIterableResult` instance can be consumed once — by `await`, by `.toArray()`, or by `for await`. Trying to consume it a second time throws **`RUNTIME.ITERATOR_CONSUMED`**. The fix is almost always to store the array in a variable on first consumption and reuse the variable:
92
+
93
+ ```typescript
94
+ // Bad — second await throws RUNTIME.ITERATOR_CONSUMED.
95
+ const result = db.orm.User.select('id', 'email').all();
96
+ const a = await result;
97
+ const b = await result;
98
+
99
+ // Good — buffer once, reuse the array.
100
+ const users = await db.orm.User.select('id', 'email').all();
101
+ const a = users;
102
+ const b = users;
103
+ ```
104
+
105
+ If you've seen `collect(...)` / `toArray(...)` helpers in a codebase wrapping `.all()`, they're vestigial — `await` does the same thing for free. Remove them when you touch the surrounding code.
106
+
107
+ ## Running queries from a short script
108
+
109
+ When the user is running a one-off `tsx my-script.ts` (not a long-lived server), call `await db.close()` at the end so the process exits cleanly — on Postgres the façade-owned pool keeps Node's event loop alive; on Mongo the façade-owned `MongoClient` does the same. See `references/runtime.md` § *Running as a script (teardown)* for the full pattern including `await using`.
110
+
111
+ ```typescript
112
+ // src/scripts/seed.ts
113
+ import { db } from '../prisma/db';
114
+
115
+ // Postgres — PascalCase model root from contract
116
+ for (const u of users) {
117
+ await db.orm.User.create(u);
118
+ }
119
+
120
+ // Mongo — lowercased plural root from contract (e.g. users, not User)
121
+ // for (const u of users) {
122
+ // await db.orm.users.create(u);
123
+ // }
124
+
125
+ console.log('Seeded.');
126
+ await db.close();
127
+ ```
128
+
129
+ ## Common Pitfalls (cross-target)
130
+
131
+ 1. **Using Postgres examples on a Mongo project (or vice versa).** Check `db.ts` and load the correct target guide ([`queries-postgres.md`](./queries-postgres.md) or [`queries-mongo.md`](./queries-mongo.md)).
132
+ 2. **Writing a `collect()` / `toArray()` helper to convert `.all()` to an array.** `.all()` returns an `AsyncIterableResult<Row>` which *is* a `PromiseLike<Row[]>` — `await collection.all()` directly yields `Row[]`. See *Consuming the result* above.
133
+ 3. **Consuming an `AsyncIterableResult` twice.** Each result is single-use. The second consumer throws `RUNTIME.ITERATOR_CONSUMED`. Buffer once into a variable and reuse the variable.
134
+
135
+ Target-specific pitfalls live in the per-target guides.
136
+
137
+ ## What Prisma Next doesn't do yet
138
+
139
+ - **N:M `.include()` across a junction table.** The contract IR supports many-to-many relations with a `through` junction table, and `N:M` relations appear as valid relation names on the ORM collection. However, `.include()` on an N:M relation does not emit the two-step junction join — the query plan builder only handles the direct join columns (`localColumn` / `targetColumn`) and ignores the `through` metadata. Attempting it either produces wrong results or an error. Workaround: express the N:M traversal through `db.sql.<table>` with an explicit join on the junction table.
140
+ - **N:M nested mutations.** `mutation-executor.ts` explicitly throws `'N:M nested mutations are not supported yet'` for nested creates/links through an N:M relation.
141
+ - **`and` / `or` / `not` combinators in the postgres façade.** The combinators currently import from `@internal/sql-orm-client` (an internal package). Workaround today: import them from `@internal/sql-orm-client` directly, the way the example apps do. If you want them on `@internal/postgres/runtime`, file a feature request via `references/feedback.md`.
142
+ - **`.orderBy(...)` / `.take(...)` on grouped aggregates (Postgres).** `db.orm.<Model>.groupBy(...).aggregate(...)` materializes a `Promise<Array<Group & Aggregates>>` and exposes neither ordering nor row limits at the DB layer. Result: a "top-N groups by SUM" query falls back to JS-side sort + slice over the full grouped result, which is fine at small cardinalities and bad at scale. Workarounds: (a) drop to `db.sql.<table>` and write the `GROUP BY` + `ORDER BY` + `LIMIT` against the aggregated table directly; (b) live with the JS-side sort/slice if the grouped cardinality is bounded. File a feature request via `references/feedback.md` if this is hitting you in production.
143
+ - **A raw-SQL lane.** This one exists. Write whole-query raw SQL through the client's raw lane: ``db.raw.sql`SELECT ...`.returnsRow({ ... }).build()`` for rows, or `.affectedCount()` for a mutation's row count. Each declared column names the codec that decodes it, so the row stays typed. For an expression fragment inside a builder query, use `fns.raw` in a `.select(...)` callback instead.
144
+ - **TypedSQL (`.sql` files compiled into typed callables).** Not implemented. Workaround: stick to the SQL builder; for repeated queries, extract a function that returns the built plan and call `db.runtime().execute(plan)` at the call site. If you want a `.sql`-file compile path, file a feature request via `references/feedback.md`.
145
+ - **`EXPLAIN` / query-plan inspection.** Prisma Next does not expose an `.explain()` method. Workaround: connect a `pg.Pool` you control via the runtime's `pg:` binding (see `references/runtime.md`) and issue `EXPLAIN ANALYZE` through it. If you want a first-class plan-inspection surface, file a feature request via `references/feedback.md`.
146
+ - **Streaming large result sets.** No `.stream()` cursor today. Workaround: paginate via `.skip(n).take(m)` for moderate sizes; for very large sets, hold a `pg.Client` from the runtime's `pg:` binding and stream through it directly. If you want a built-in streaming surface, file a feature request via `references/feedback.md`.
147
+ - **Multi-statement batching (Prisma-7-style `db.$transaction([call1, call2])`).** Prisma Next runs each call sequentially. Workaround: wrap atomically-related work in `db.transaction(async (tx) => { ... })` on Postgres. If you want batch-as-array semantics, file a feature request via `references/feedback.md`.
148
+ - **Mongo façade transactions.** `@internal/mongo/runtime` does not expose `db.transaction(...)`. Multi-document atomicity is not yet wrapped in the Prisma Next Mongo façade. Workaround: use the MongoDB driver's session API directly if you control the client binding (`mongoClient:` option). File a feature request via `references/feedback.md` if you need a first-class façade surface.
149
+ - **Mongo ORM aggregates.** No `.aggregate(...)` / `.groupBy(...)` on `db.orm.<root>`. Workaround: express aggregations through `db.query.from(...).group(...).build()` and `runtime.execute(plan)`.
150
+ - **Mongo filter helpers on the façade.** Rich filters (`.in`, ranges, boolean composition) currently import from `@internal/mongo-query-ast/execution` (`MongoFieldFilter`, etc.) — not yet re-exported on `@internal/mongo/runtime`. Workaround: use object equality `.where({ field: value })` where possible; import from the internal package only when necessary. Tracked alongside façade-completeness gaps in Linear `TML-2526`.
151
+ - **Automatic N+1 detection.** Prisma Next does not warn when an `.include(...)` is missing. Workaround: be deliberate about `.include(...)` in code review; the `lints` middleware (see `references/runtime.md`) catches the more common authoring slips (missing `WHERE` on a `DELETE` / `UPDATE`, missing `LIMIT` on a `SELECT`).
152
+
153
+ ## Reference Files
154
+
155
+ This skill is split for selective loading. Target-specific reference paths live in the per-target guides:
156
+
157
+ - **Postgres** — [`queries-postgres.md` § Reference Files](./queries-postgres.md#reference-files)
158
+ - **Mongo** — [`queries-mongo.md` § Reference Files](./queries-mongo.md#reference-files)
159
+
160
+ ## Checklist
161
+
162
+ - [ ] Confirmed the active target from `db.ts` and loaded the matching guide ([`queries-postgres.md`](./queries-postgres.md) or [`queries-mongo.md`](./queries-mongo.md)).
163
+ - [ ] For multi-namespace contracts, used `db.orm.<ns>.<Model>` / `db.sql.<ns>.<table>` coordinates when the same bare name exists in more than one namespace.
164
+ - [ ] Chose the right lane (ORM by default; lower-level builder for shapes the ORM doesn't express).
165
+ - [ ] Used `.first()` / `.first({ pk })` (Postgres) or `.where({ ... }).first()` (Mongo) for single-row reads — not `.all()`.
166
+ - [ ] Consumed `.all()` with plain `await` (not a `collect()` / `toArray()` helper). Used `for await` only when streaming is actually wanted, and never iterated the same result twice.
167
+ - [ ] Did NOT use `db.sql` on a Mongo project or `db.query` where the Postgres SQL builder is meant.
168
+ - [ ] Completed the target-specific checklist in the loaded guide.
@@ -0,0 +1,326 @@
1
+
2
+ # Prisma Next — Quickstart (Adoption)
3
+
4
+ > **Edit your data contract. Prisma handles the rest.**
5
+
6
+ This skill takes the user from zero (or near-zero) to a first working query against Prisma Next. Three paths — and they all converge on the same first arc: **connect → write → read**. Schema editing comes *after* the first arc, not before.
7
+
8
+ - **First-touch orientation** — the user has arrived at a Prisma Next project for the first time (a scaffold tool like `npx createprisma` dropped them in, they cloned a teammate's repo, or they ran `prisma orm init` themselves and now want to make their first move) and they're asking *"what can I do with Prisma Next?"*, *"where do I start?"*, or *"what's next?"*. The goal is to anchor them on the contract, get them connected to a database, round-trip one row, and let further commands surface organically.
9
+ - **Greenfield** — new project, fresh database. User runs `prisma orm init` themselves. `init` seeds a starter contract with a sample model, so the path joins the first-touch orientation arc as soon as the database is initialised.
10
+ - **Brownfield-DB** — existing database, no contract yet. Infer the contract from the database with `contract infer`, sign the marker with `db sign`, then write queries against one of the existing tables.
11
+
12
+ This skill does **not** cover migrating from another ORM (Drizzle, Prisma 6/7, Sequelize, TypeORM, Kysely, Knex, raw drivers). Those are separately-installable skills.
13
+
14
+ ## When to Use
15
+
16
+ - User asks *"what can I do with Prisma Next?"*, *"what can I do next with Prisma?"*, *"where do I start?"*, *"what should I do first?"* — and a PN project already exists on disk. **First-touch orientation** path below.
17
+ - User just ran `createprisma` (or equivalent scaffold tool) and is asking what to do next. **First-touch orientation** path.
18
+ - User is starting a new project and wants to use Prisma Next. **Greenfield** path.
19
+ - User has an existing database (no PN contract) and wants to introduce PN. **Brownfield-DB** path.
20
+ - User typed *"prisma orm init"*, *"get started with PN"*, *"set up PN"*, *"how do I scaffold a project"*. **Greenfield** path.
21
+ - User says *"I have an existing Postgres/Mongo, how do I start using PN?"*. **Brownfield-DB** path.
22
+
23
+ ## When Not to Use
24
+
25
+ - User already has a PN project and wants to add a model → `references/contract.md`.
26
+ - User wants to migrate FROM a specific ORM → install `@internal/migrate-from-<orm>-skill` (separate).
27
+ - User wants to wire `db.ts` in a project that already has a contract → `references/runtime.md`.
28
+ - User wants to integrate Prisma Next with a build tool (Vite plugin, Next.js, …) → `references/build.md`.
29
+
30
+ ## Key Concepts
31
+
32
+ - **Contract**: the data model. Authored as `contract.prisma` (PSL, the canonical surface) or `contract.ts` (TypeScript builder). The framework reads it and emits two artefacts: `contract.json` (runtime IR) and `contract.d.ts` (types).
33
+ - **Target**: the backing store. Today: `postgres` or `mongodb`. Picked at `init` time; baked into the `@internal/<target>` façade the scaffold imports from.
34
+ - **Authoring mode**: how you write the contract. `psl` (Prisma Schema Language, default) or `typescript` (programmatic builder, optionally paired with the Vite plugin for auto-emit during `vite dev` — see `references/build.md`).
35
+ - **Façade packages.** The scaffold installs exactly one façade per target — `@internal/postgres` (or `@internal/mongo`). User code imports from façade subpaths (`@internal/postgres/config`, `@internal/postgres/runtime`, `@internal/postgres/contract-builder`). The façade bakes in the family / target / adapter / driver wiring; never reach past it. See `references/contract.md` for the full list.
36
+ - **`db.ts`**: the runtime entry point. Lives next to the contract source at `src/prisma/db.ts`. Imports the contract artefacts and exports a `db` value the rest of the app uses.
37
+ - **Marker**: a `pn_meta_marker` row in your database that records the contract hash. Lets PN detect drift between contract and live DB. Created by `db init` (greenfield / first-touch orientation) or `db sign` (brownfield).
38
+
39
+ ### Canonical on-disk layout
40
+
41
+ Every application that consumes Prisma Next uses the same shape:
42
+
43
+ ```text
44
+ <app-root>/
45
+ ├── prisma.config.ts ← project config at repo root
46
+ ├── src/
47
+ │ └── prisma/
48
+ │ ├── contract.prisma ← (or contract.ts) — schema source you author
49
+ │ ├── contract.json ← emitted by `contract emit` — do not edit
50
+ │ ├── contract.d.ts ← emitted by `contract emit` — do not edit
51
+ │ └── db.ts ← runtime entry; the rest of `src/` imports from here
52
+ └── migrations/
53
+ ├── snapshots/ ← content-addressed contract store, shared across spaces
54
+ │ └── <hex>/
55
+ │ ├── contract.json
56
+ │ └── contract.d.ts
57
+ └── app/ ← created on first `migration plan` / `db init`
58
+ ├── refs/head.json
59
+ └── <timestamp>_<slug>/
60
+ ├── migration.json
61
+ ├── ops.json
62
+ └── migration.ts
63
+ ```
64
+
65
+ Three things to internalise:
66
+
67
+ - **`src/prisma/` is the home for the contract** — source + emitted artefacts + `db.ts` all colocated. The rest of `src/` imports from `./prisma/db` (or `../prisma/db`, depending on file depth).
68
+ - **`migrations/app/`** — the `app/` segment is the consuming application's space-id. Extensions you depend on get sibling directories under `migrations/` (one per extension contract-space), but you don't write into those — only the `app/` subtree is your migrations.
69
+ - **`prisma.config.ts` lives at the repo root**, not under `src/`. Every command resolves paths relative to the config's directory.
70
+
71
+ **Contributors building extension packages or aggregate-root monorepo packages use a different layout** — `src/contract.{prisma,ts}` (no `prisma/` subdir) + `migrations/<timestamp>_<slug>/` (no `app/` segment). That distinction is intentional; see `references/contract.md` for which path applies to you.
72
+
73
+ > **Heads up — `prisma orm init` currently scaffolds the wrong layout.** It writes `prisma/contract.{prisma,ts}` and `prisma/db.ts` at the repo root instead of under `src/prisma/`. Tracked as [TML-2532](https://linear.app/prisma-company/issue/TML-2532). Until the fix lands, either pass `--schema-path src/prisma/contract.prisma` to `init`, or move the scaffolded `prisma/` directory into `src/prisma/` after `init` and update the `contract` path in `prisma.config.ts` to match. The canonical layout above is what the demo example uses and what the rest of the framework expects.
74
+
75
+ ## Your first arc — connect, write, read
76
+
77
+ All three paths in this skill converge here. Once the project is scaffolded and the database is reachable, the first move is **always** the same: connect, write a row, read it back, against whatever model the contract already declares. Don't touch the contract source on this first move — extend it later, after the round-trip works.
78
+
79
+ Write the snippet in a fresh file directly under `src/` (e.g. `src/first-arc.ts`) so the relative import resolves to one level deep:
80
+
81
+ ```typescript
82
+ // src/first-arc.ts
83
+ import 'dotenv/config';
84
+ import { db } from './prisma/db';
85
+
86
+ // Write a row against the starter model. Adapt the field names to whatever
87
+ // model your contract source actually declares — read it first.
88
+ await db.orm.User.create({ email: 'alice@example.com' });
89
+
90
+ // Read it back.
91
+ const users = await db.orm.User.select('id', 'email').all();
92
+ console.log(users);
93
+ ```
94
+
95
+ If that prints `[{ id: 1, email: 'alice@example.com' }]`, the project is wired end-to-end and the user has crossed from *"I have a project"* to *"I'm building."*
96
+
97
+ `db.orm.<Model>` is the default ORM lane — model-shaped, fully typed against the contract, lazily connects to the database on first use (it picks up `DATABASE_URL` from `.env` via the runtime's `dotenv/config`-loaded environment). The deeper `references/queries.md` reference covers the rest of the supported surface (filters, joins, transactions, the SQL builder) when the user is ready — and names the gaps (raw SQL and TypedSQL are not currently available).
98
+
99
+ > **Mongo target:** the snippet above is SQL-target shape. On `@internal/mongo`, `db.orm` is keyed by the collection's storage name (`@@map(...)`, or the lowercased model name if no `@@map`), so the same arc reads `await db.orm.users.create(...)` / `await db.orm.users.select('id', 'email').all()` — not `db.orm.User`. Full rule and rewrite recipe in `references/queries.md` § *MongoDB ORM addressing*.
100
+
101
+ **Prerequisites for the arc to work.** All three paths leave these in place by the time you reach the arc:
102
+
103
+ - `prisma.config.ts` exists at the repo root and declares the target + contract source (typically `src/prisma/contract.prisma` or `src/prisma/contract.ts`).
104
+ - The contract source exists at `src/prisma/contract.{prisma,ts}` (a starter model from `init`, or the inferred contract from `contract infer`, or whatever the bootstrap tool generated).
105
+ - `src/prisma/db.ts` exists and instantiates the runtime with the emitted contract.
106
+ - `DATABASE_URL` is set in `.env` (or wherever the runtime's config tells it to look).
107
+ - The database has been initialised (`db init`) or marker-signed (`db sign`), so the marker row exists and the schema matches the contract.
108
+
109
+ The three workflows below each describe how their path gets the user to that state. After that, the arc above is the same.
110
+
111
+ ## Workflow — First-touch orientation
112
+
113
+ Triggers: *"what can I do with Prisma Next?"*, *"what can I do next with Prisma?"*, *"where do I start?"*, *"I just ran createprisma"*, *"what's next?"*, or any close variant — paired with a PN project already on disk (scaffolded by `createprisma`, by `prisma orm init`, by a teammate, however).
114
+
115
+ The user's high-level intent is *"I want to be running an application against my database, against this thing called Prisma Next."* The job of this workflow is to anchor them on the contract, get one round-trip working, and let further commands surface organically as their next move requires them. **It is orientation, not a tour, not a feature inventory, not a syllabus.**
116
+
117
+ ### Concept — what to communicate first
118
+
119
+ Prisma Next is contract-first. Everything the framework does — query types, migrations, runtime types, drift detection — flows from a single source of truth: the **contract**. The contract describes the user's application's data model. The framework reads it; the framework derives the rest. Lead with this.
120
+
121
+ The first response to *"what can I do with Prisma Next?"* names the contract path, frames its role in one sentence, and then steers toward getting the user's application running. Don't open with a feature inventory. Don't open with a list of commands. Open with: *"Your contract is at `<path>`. It describes your application — your query types, migrations, and runtime types all flow from it. Let's get you connected to a database so your app can actually run against it."*
122
+
123
+ The first **arc** — once oriented — is **connect → write → read**. Not edit-the-contract-first, not plan-a-migration-first. The user's win is *I have application code running against my database*.
124
+
125
+ ### Step 1 — Read the project, name the contract
126
+
127
+ Before saying anything specific to the user, read:
128
+
129
+ - `prisma.config.ts` at the repo root — what target (`postgres` / `mongodb`) is wired, what `contract:` path it declares, what extensions are installed.
130
+ - The contract source the config declares (canonically `src/prisma/contract.prisma` or `src/prisma/contract.ts`; a project that pre-dates [TML-2532](https://linear.app/prisma-company/issue/TML-2532) may have it at `prisma/contract.{prisma,ts}` instead — check the `contract` field of the config) — what starter models, if any, exist.
131
+ - `src/prisma/db.ts` (next to the contract) — the runtime entry point.
132
+ - `.env` / `.env.example` — is `DATABASE_URL` set, or only the example?
133
+ - Optionally `pnpm prisma-cli db verify` — does the live DB match the contract?
134
+
135
+ Then **say the contract path back to the user, with its role attached**. Something like: *"Your contract is at `src/prisma/contract.prisma`, and it currently declares a `User` model. The contract describes your app — every query type, migration, and runtime type the framework gives you flows from this file. Let's get your app connected to a database next."* The exact wording is up to the agent; what matters is that the user leaves the first response knowing *where the contract is* and *that it is the source of truth*.
136
+
137
+ ### Step 2 — Get the user's app connected and round-tripping
138
+
139
+ The motivation is *"so your app can actually run against your database"*, not *"so the prerequisite checklist passes"*. The mechanics depend on what's already in place from Step 1:
140
+
141
+ - **Everything already wired.** Go straight to writing and reading a row (see *Your first arc — connect, write, read* above). Adapt the snippet to whatever model the contract declares.
142
+ - **`DATABASE_URL` not set.** Have the user set it in `.env` (not in `prisma.config.ts` — see Pitfall 5). Then `pnpm prisma-cli db init` to apply the current contract to that database and write the marker row. Now the app can connect.
143
+ - **Database is connectable but not yet aware of the contract** (marker row missing; `db verify` reports drift). Run `pnpm prisma-cli db init`. (`db update` is the alternative for quick dev cycles — it's looser, doesn't write a migration history, and is what users reach for when they want to iterate on the schema fast. Mention it if the user asks how to make schema changes flow to the DB; don't pre-explain it.)
144
+ - **Contract is empty** (bootstrap left the source blank). Add **one** model with **two** fields (e.g. `User { id, email }`), `pnpm prisma-cli contract emit`, then `pnpm prisma-cli db init`. Minimal — get the round-trip working, *then* extend.
145
+
146
+ The user encounters `db init` (and optionally `db update`, `contract emit`) here because they're the commands their current move *requires*. They learn what those commands are by using them.
147
+
148
+ ### Step 3 — Round-trip a row
149
+
150
+ Run the snippet from *Your first arc — connect, write, read* above against whatever model the contract declares. When it prints the row back, the user has crossed from *"I have a project"* to *"my app runs against my database"*. That's the win.
151
+
152
+ ### Step 4 — Hand off to the next move
153
+
154
+ Now ask the user what they want to build. Route to the skill that owns that move:
155
+
156
+ - More queries (filters, joins, transactions) → `references/queries.md`.
157
+ - Add a model, change a field, add a relation → `references/contract.md`. They'll touch `contract emit` and `db update` (or `migration plan` + `db migrate`) as part of that workflow.
158
+ - Middleware, environment config, multiple targets → `references/runtime.md`.
159
+ - Vite / Next.js / dev-server integration → `references/build.md`.
160
+ - They want a fuller toolbelt overview at this point — *Commands you'll use day-to-day* below is the one-glance summary.
161
+
162
+ ### Anti-patterns on this path
163
+
164
+ - **Leading with a feature tour or capability inventory.** The user asked what they can *do*. Get them doing it.
165
+ - **Listing commands before any have been used.** Commands belong to specific moves; surface them when the move requires them.
166
+ - **Diving into migration concepts before one query has run.** Migrations exist; their value lands later.
167
+ - **Adding several models in one go.** Add one, get one query green, then iterate.
168
+ - **Walking the user through `prisma.config.ts` keys.** The scaffold's defaults are correct; revisit when the user needs to change something.
169
+ - **Skipping the contract framing.** Even one line — *"your contract is at `<path>`, it's the source of truth"* — anchors the user; without it, the rest of the workflow lands as disconnected ceremony.
170
+
171
+ ## Workflow — Greenfield
172
+
173
+ The concept: `prisma orm init` is one CLI command that scaffolds config, schema, runtime, dependencies, and the contract emit step. It operates on the current working directory — there is no positional project-name argument. Make the directory, `cd` in, then run init.
174
+
175
+ ```bash
176
+ mkdir my-app && cd my-app
177
+ pnpm init # if no package.json yet
178
+ pnpm dlx @prisma/cli@next orm init # interactive
179
+ # or non-interactive (CI / agent runs):
180
+ pnpm dlx @prisma/cli@next orm init --yes --target postgres --authoring psl
181
+ ```
182
+
183
+ > **Telemetry is opt-out.** The CLI collects anonymous usage data by default. Every command — including `init` — prints a one-time notice to **stderr** on first use, then sends; there is no interactive consent prompt. Opt out anytime by running `prisma telemetry disable`, or with `DO_NOT_TRACK=1` or `PRISMA_NEXT_DISABLE_TELEMETRY=1`. The command stores `"enableTelemetry": false` in your user config for you (the CLI's per-user config dir, **not** `prisma.config.ts`). Run `prisma telemetry status` to see what's currently in effect. This is relevant for agent-driven runs — the CLI records that an agent invoked it. What's collected, the per-user config path, and how to fully reset are documented in `docs/Telemetry.md`.
184
+
185
+ The flags `init` accepts (run `prisma orm init --help` for the source of truth):
186
+
187
+ - `--target <db>` — `postgres` or `mongodb`.
188
+ - `--authoring <style>` — `psl` or `typescript`.
189
+ - `--schema-path <path>` — defaults to `prisma/contract.prisma` (or `prisma/contract.ts`). **Pass `--schema-path src/prisma/contract.prisma` (or `.../contract.ts`)** to scaffold into the canonical `src/prisma/` location directly — `init`'s default is wrong today, see [TML-2532](https://linear.app/prisma-company/issue/TML-2532).
190
+ - `--confirm <directory name>` — grant the reinit consent non-interactively. Re-running init in a scaffolded directory asks you to type the directory name back before it overwrites; non-interactive runs pass the name with this flag instead.
191
+ - `--write-env` — also write `.env` (default writes only `.env.example`; `.env` stays under your control).
192
+ - `--probe-db` — connect to `DATABASE_URL` once and check the server version against the target's minimum.
193
+ - `--strict-probe` — fail init if the probe fails (no-op without `--probe-db`).
194
+ - `--skip-install` — skip dependency install + initial contract emit.
195
+ - `--skip-skills` — skip Prisma Next skills installation (air-gapped / restricted environments). The skill cluster is always installed at the project level — never globally — so its version stays locked to the project's Prisma Next version.
196
+
197
+ `init` writes (when it runs cleanly):
198
+
199
+ - `prisma.config.ts` at the project root.
200
+ - The contract source at `--schema-path` — `src/prisma/contract.prisma` if you passed the canonical override, `prisma/contract.prisma` if you accepted the (currently-wrong) default.
201
+ - `db.ts` in the same directory as the contract source.
202
+ - `prisma-next.md` — a human quick-reference.
203
+ - `.env.example` (and `.env` if `--write-env`).
204
+ - Updates `package.json` (deps + scripts) and `tsconfig.json` (required compiler options).
205
+ - Installs deps and runs `prisma-cli contract emit` once (the project-local bin `@prisma/cli` installs).
206
+ - Registers Prisma Next skills with the local agent runtime.
207
+
208
+ **If you took `init`'s default and ended up with a top-level `prisma/` directory** (TML-2532), the cleanup is one move + one config edit:
209
+
210
+ ```bash
211
+ mkdir -p src && mv prisma src/prisma
212
+ # Then update prisma.config.ts so `contract` reads
213
+ # 'src/prisma/contract.prisma' (or .ts) instead of 'prisma/contract.prisma'.
214
+ pnpm prisma-cli contract emit # re-emits contract.json + contract.d.ts under src/prisma/
215
+ ```
216
+
217
+ Do this before running `db init` — once the marker row is written, restructuring is harder.
218
+
219
+ After init succeeds, the path converges on *Your first arc — connect, write, read* above. `init` has already seeded a starter contract with `User` and `Post` models (with a relation between them) and run `contract emit` once; the only remaining prerequisites are setting `DATABASE_URL` and initialising the database. Two commands:
220
+
221
+ 1. Set `DATABASE_URL` in `.env` (copy from `.env.example`).
222
+ 2. Initialise the database: `pnpm prisma-cli db init`. Creates tables, indexes, constraints, and writes the marker row — using the starter contract `init` generated.
223
+
224
+ Then run the snippet from *Your first arc* above against the `User` model. When the user is ready to extend the contract — add more models, change fields, add relations — chain to `references/contract.md`. For more queries, chain to `references/queries.md`.
225
+
226
+ **Why this is queries-first, not schema-editing-first.** `init` ships with `User` and `Post` on purpose: the user shouldn't have to design a schema to prove their setup works. Extending the contract is the next move *after* the first arc lands, not part of getting there. If the user asks you to skip straight to *"add a Comment model"* — sure, do that — but get one query green against `User` or `Post` first if there's any doubt the project is wired correctly.
227
+
228
+ ## Workflow — Brownfield-DB (existing database, no contract)
229
+
230
+ The concept: against an existing database with no PN contract, `contract infer` walks the live schema (tables, columns, indexes — including expression and partial ones — constraints, and RLS enablement + policies) and writes a PSL contract that describes it. Where authoring would generate a CHECK constraint the database does not carry (the element-non-null check on a list column), infer emits `@noCheck(elementNotNull)` on that field, so the contract declares exactly what the database enforces. The reverse gap is closed too: a hand-written CHECK constraint the database enforces that authoring would never have generated comes back as `@@check(expression: <reprint>, map: "<name>")`, so it is a declared object from the first pull instead of an invisible extra a later destructive plan could drop. That inferred check warns (`PN_EXACT_NAME_BODY_COMPARISON`) the next time you run `contract emit` — expected, not a defect: the warning fires on any `map:` body regardless of who wrote it, and the comparison stays sound because both sides are Postgres's own reprint. The result is a *starting point*, not the final contract — review and clean it up, then `db sign` to record the current contract hash as the marker (instead of letting `db init` try to recreate the schema from scratch).
231
+
232
+ ```bash
233
+ mkdir my-app && cd my-app
234
+ pnpm init
235
+ pnpm dlx @prisma/cli@next orm init --yes --target postgres --authoring psl \
236
+ --schema-path src/prisma/contract.prisma
237
+ # scaffold lands; you'll overwrite the starter schema below
238
+ ```
239
+
240
+ Then, with `DATABASE_URL` set in `.env`:
241
+
242
+ ```bash
243
+ pnpm prisma-cli contract infer --db "$DATABASE_URL" --output src/prisma/contract.prisma
244
+ ```
245
+
246
+ (Note: the flag is `--output`, not `--out`. Run `prisma contract infer --help` for the full surface.)
247
+
248
+ The agent should pause here and read the inferred PSL. Symptoms a re-author pass is needed:
249
+
250
+ - Tables PN couldn't categorise (e.g. legacy linking tables you could express as relations).
251
+ - Columns where PN's type guess is wrong (e.g. `String` where you want an extension type like `pgvector.Vector(length: 1536)`).
252
+ - Missing `@unique` / `@index` hints PN couldn't see.
253
+ - Field names you'd prefer to alias.
254
+
255
+ Then re-emit and sign:
256
+
257
+ ```bash
258
+ pnpm prisma-cli contract emit
259
+ pnpm prisma-cli db sign
260
+ pnpm prisma-cli db verify # clean immediately after a pull; reports drift if the DB changes later
261
+ ```
262
+
263
+ Then run the snippet from *Your first arc — connect, write, read* above, using one of your existing tables in place of the starter model. The arc is the same; only the path that got you there differs.
264
+
265
+ ## Commands you'll use day-to-day
266
+
267
+ A reference table — not a script to recite at the user. Commands surface in the workflow above as the user's next move requires them; this table is here for the moment the user asks for a wider view (typically after the first round-trip), and as a one-glance summary anyone newly oriented to Prisma Next can scan. For flag-level detail, run `<command> --help`; the help output is the source of truth.
268
+
269
+ | What you want to do | Command | Deeper skill |
270
+ |---|---|---|
271
+ | Apply the current contract to the DB the first time | `prisma db init` | this skill |
272
+ | Re-emit `contract.json` + `contract.d.ts` after editing the contract source | `prisma contract emit` | `references/contract.md` |
273
+ | Quick dev-only schema sync (no migration history kept) | `prisma db update` | `references/migrations.md` |
274
+ | Plan a migration from a contract diff | `prisma migration plan --name <slug>` | `references/migrations.md` |
275
+ | Apply pending migrations | `prisma db migrate` | `references/migrations.md` |
276
+ | Inspect the live database | `prisma db schema` | `references/debug.md` |
277
+ | Confirm the DB matches the contract (drift check) | `prisma db verify` | `references/debug.md` |
278
+ | Bring an existing DB into a PN contract | `prisma contract infer --db "$DATABASE_URL"` | this skill (brownfield) |
279
+ | Decode a structured error envelope | (read the `code` / `why` / `fix` fields) | `references/debug.md` |
280
+ | Report a bug or request a feature | (file via the feedback skill) | `references/feedback.md` |
281
+
282
+ ## Decision — PSL vs TypeScript authoring
283
+
284
+ - **PSL** (`contract.prisma`) — the default. Concise, declarative, familiar to anyone who has used Prisma. Recommended for most projects.
285
+ - **TypeScript** (`contract.ts`) — a programmatic builder. Use when the contract is genuinely computed (multi-tenant per-tenant variants), when you reuse contract fragments across files, or when an extension requires constructs PSL doesn't yet express (e.g. pgvector's parameterised storage-type registration). Pairs with the Vite plugin from `references/build.md` for auto-emit on save.
286
+
287
+ Switch authoring later by re-running `prisma orm init` in the same directory. The init flow detects the existing scaffold and prompts to reinit (non-interactive runs grant the consent with `--confirm <directory name>`). Existing contract content is *not* automatically translated — you'll re-author by hand in the target language.
288
+
289
+ ## Common Pitfalls
290
+
291
+ 1. **Running `prisma orm init <project-name>` with a positional argument.** `init` operates on the current working directory; there is no positional project-name argument. `mkdir foo && cd foo && pnpm dlx @prisma/cli@next orm init`.
292
+ 2. **`init` doesn't connect to your database.** It only scaffolds files and installs dependencies (and runs the initial `contract emit`). You connect with `db init` / `db update` / `db migrate`. If `init` succeeds and queries fail, the issue is `DATABASE_URL`, not `init`.
293
+ 3. **Treating inferred PSL as the final contract.** `contract infer` produces a starting point. Don't `db sign` against a contract you haven't read.
294
+ 4. **Forgetting to emit after editing the contract.** The contract artefacts (`contract.json`, `contract.d.ts`) are stale until you run `contract emit`. If the type-checker says a model "doesn't exist", you skipped emit.
295
+ 5. **Setting `DATABASE_URL` in `prisma.config.ts` instead of `.env`.** The config reads `.env` automatically via `dotenv/config`. Hardcoding the URL leaks credentials and bypasses per-environment overrides. See `references/runtime.md`.
296
+ 6. **Hand-editing `contract.json` or `contract.d.ts`.** They're emitted artefacts; the next `contract emit` overwrites your changes. Edit the source instead.
297
+ 7. **Using `--out` for `contract infer`.** The flag is `--output`.
298
+
299
+ ## What Prisma Next doesn't do yet
300
+
301
+ - **Migration from another ORM.** Prisma Next doesn't migrate your schema *from* Drizzle / Prisma 6/7 / Sequelize / TypeORM / Kysely / Knex / a raw driver. Workaround: install the matching `@internal/migrate-from-<orm>-skill` if one exists for your source, or treat the source as a brownfield database and `contract infer` from it. If you need a guided migration flow built-in, file a feature request via the `references/feedback.md` skill.
302
+ - **`prisma db push`-style production sync.** `db update` is the quick development path; for production, use migrations (`migration plan` + `db migrate`). PN deliberately does not offer a "push-to-prod-without-a-migration" surface — see `references/migrations.md`.
303
+ - **Studio / GUI database browser.** Use `prisma db schema` for a CLI tree-style summary of the live DB. If you need an interactive UI, file a feature request via the `references/feedback.md` skill.
304
+
305
+ ## Reference Files
306
+
307
+ This skill is intentionally body-only; `prisma orm init --help`, `contract infer --help`, and `db sign --help` are the authoritative surfaces for flag-level detail. When in doubt, run `--help` and read the actual command's description rather than guessing from this skill.
308
+
309
+ ## Checklist
310
+
311
+ - [ ] Confirmed which path applies (first-touch orientation / greenfield / brownfield) before proposing commands.
312
+ - [ ] **First-touch orientation:** named the contract path back to the user and framed its role (*source of truth from which query types, migrations, and runtime types flow*) before proposing any commands.
313
+ - [ ] **All paths:** brought the project to the *Your first arc* prerequisites (config, contract source, `db.ts`, `DATABASE_URL`, marker row) *before* writing application code.
314
+ - [ ] **All paths:** ran the first arc — one `create` + one `select` against the starter (or inferred) model — and got the round-trip working green.
315
+ - [ ] **All paths:** did *not* edit the contract source as part of the first arc. Schema extension is the *next* move, not the first.
316
+ - [ ] **All paths:** did *not* lead with a feature tour, capability inventory, or recital of CLI commands. Commands surfaced as the user's current move required them.
317
+ - [ ] Confirmed the user's target (`postgres` / `mongodb`) and authoring mode (`psl` / `typescript`).
318
+ - [ ] **First-touch orientation:** read `prisma.config.ts`, the contract source, `db.ts`, and `.env` before proposing anything — didn't assume what the scaffold tool / teammate left in place.
319
+ - [ ] **Greenfield path:** ran `prisma orm init` from the project directory — no positional project-name argument.
320
+ - [ ] **All paths:** the project ended up in the canonical `src/prisma/contract.{prisma,ts}` + `src/prisma/db.ts` + `migrations/app/` layout — including moving the scaffolded directory out of a top-level `prisma/` if `init` produced one (TML-2532).
321
+ - [ ] **Brownfield path:** ran `contract infer --db "$DATABASE_URL" --output src/prisma/contract.prisma`, reviewed the result, then `contract emit` + `db sign`.
322
+ - [ ] Set `DATABASE_URL` in `.env` and confirmed the value is reachable.
323
+ - [ ] Initialised the DB (`db init` greenfield / first-touch orientation) or signed the marker (`db sign` brownfield).
324
+ - [ ] Did NOT hand-edit `contract.json` or `contract.d.ts`.
325
+ - [ ] Did NOT set `DATABASE_URL` in `prisma.config.ts`.
326
+ - [ ] Confirmed the user understands what the *next* skill is for their workflow (typically `references/queries.md` for more queries, then `references/contract.md` when they're ready to extend the schema).