prisma-schema — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited prisma-schema (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Create/modify schema for: $ARGUMENTS
Always define schemas in the datasource block. This enables organizing models into logical namespaces and is supported by PostgreSQL, CockroachDB, and SQL Server.
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
schemas = ["base", "billing", "inventory"]
}Every model and enum must declare its schema with @@schema("name"). Pick the schema that matches the model's domain. If only one schema is needed, use a single entry like schemas = ["public"].
model EntityName {
id String @id @default(uuid())
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
// Business fields
status EntityStatus @default(ACTIVE)
name String
amount Decimal @db.Decimal(36, 18)
// Relations
accountId String @map("account_id")
account Account @relation(fields: [accountId], references: [id])
// Indexes
@@index([accountId])
@@index([status])
@@index([createdAt])
// Table and schema mapping
@@map("entity_names")
@@schema("base")
}
enum EntityStatus {
ACTIVE
INACTIVE
DELETED
@@schema("base")
}Models in different schemas can reference each other. Both schemas must be listed in schemas.
// schema: "base"
model User {
id Int @id
orders Order[]
@@schema("base")
}
// schema: "billing"
model Order {
id Int @id
user User @relation(fields: [userId], references: [id])
userId Int
@@schema("billing")
}When two schemas have tables with the same name, use unique model names and @@map to disambiguate:
model BaseConfig {
id Int @id
@@map("Config")
@@schema("base")
}
model UserConfig {
id Int @id
@@map("Config")
@@schema("users")
}InvoicePayment)accountId)@map("account_id")@@map("invoice_payments")"billing", "inventory", "auth")id String @id @default(uuid())
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at") // Soft deleteamount Decimal @db.Decimal(36, 18) // High precisionUse Decimal for any financial value. Float is not acceptable for money.
// One-to-Many
accountId String @map("account_id")
account Account @relation(fields: [accountId], references: [id])
// Many-to-Many (use explicit join table for control)@@index([accountId]) // Foreign keys
@@index([status, createdAt]) // Common query patterns
@@unique([accountId, nonce]) // Business uniqueness constraintsAdd indexes based on actual query patterns, not speculative.
prisma validateprisma formatprisma generateprisma migrate dev --name add_entity_nameDetect the package manager from the repo (lockfile or packageManager in package.json) and prefix commands accordingly (npx, pnpm exec, yarn exec, bunx, or direct if globally installed).
Moving a model from one schema to another drops the table in the source schema and recreates it in the target. Back up data before applying such migrations.
schemas array defined in datasource block@@schema("...")~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.