Prisma
How CodePilot uses Prisma ORM for database schema management, migrations, and data access.
CodePilot uses Prisma 7 as its ORM. The Prisma schema, migrations, and generated client live in the packages/database package (@repo/db), shared across all applications.
Schema Location
packages/database/
├── prisma/
│ ├── schema.prisma # Database schema definition
│ └── migrations/ # Migration history
├── src/
│ └── index.ts # Re-exports Prisma client
└── package.jsonKey Models
The Prisma schema defines the following core models:
User & Authentication
model User {
id String @id @default(cuid())
email String @unique
name String?
avatar String?
accounts Account[]
sessions Session[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Account {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
provider String // "github"
providerAccountId String
accessToken String?
refreshToken String?
}
model Session {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
token String @unique
expiresAt DateTime
}Repository & Ingestion
model Repository {
id String @id @default(cuid())
name String
fullName String @unique // "owner/repo"
defaultBranch String @default("main")
language String?
description String?
ingestions RepositoryIngestion[]
files RepositoryFile[]
chunks CodeChunk[]
embeddings CodeEmbedding[]
overview RepositoryOverview?
health RepositoryHealth?
}
model RepositoryIngestion {
id String @id @default(cuid())
repositoryId String
repository Repository @relation(fields: [repositoryId], references: [id])
status String // "pending", "processing", "completed", "failed"
startedAt DateTime?
completedAt DateTime?
error String?
}Code Analysis
model CodeChunk {
id String @id @default(cuid())
repositoryId String
repository Repository @relation(fields: [repositoryId], references: [id])
filePath String
content String
startLine Int
endLine Int
type String // "function", "class", "component", etc.
name String?
language String
embedding CodeEmbedding?
}
model CodeEmbedding {
id String @id @default(cuid())
chunkId String @unique
chunk CodeChunk @relation(fields: [chunkId], references: [id])
embedding Unsupported("vector(768)")
repositoryId String
repository Repository @relation(fields: [repositoryId], references: [id])
}GitHub Integration
model GithubInstallation {
id String @id @default(cuid())
installationId Int @unique
accountLogin String
accountType String // "User" or "Organization"
}
model PullRequest {
id String @id @default(cuid())
repositoryId String
number Int
title String
reviews PullRequestReview[]
}Database Commands
Generate the Prisma client after schema changes:
pnpm --filter @repo/db run db:generateCreate and apply a new migration during development:
pnpm --filter @repo/db run db:migrateApply pending migrations in production (no prompts):
pnpm --filter @repo/db run db:deployOpen Prisma Studio for visual database browsing:
pnpm --filter @repo/db run db:studioUsage Across Apps
All applications import the Prisma client from @repo/db:
import { prisma } from "@repo/db";
// Use in API routes
const repositories = await prisma.repository.findMany({
where: { userId: user.id },
include: { ingestions: true },
});Workspace Package
The @repo/db package is defined in packages/database/package.json and referenced via pnpm workspace protocol (workspace:*) in consuming apps.
pgvector Integration
Since Prisma doesn't natively support pgvector types, vector operations use raw SQL:
// Similarity search
const results = await prisma.$queryRaw`
SELECT ce."id", cc."content", cc."filePath",
ce."embedding" <=> ${queryVector}::vector AS distance
FROM "CodeEmbedding" ce
JOIN "CodeChunk" cc ON cc."id" = ce."chunkId"
WHERE ce."repositoryId" = ${repositoryId}
ORDER BY ce."embedding" <=> ${queryVector}::vector
LIMIT 10
`;