CodePilot
Database

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.json

Key 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:generate

Create and apply a new migration during development:

pnpm --filter @repo/db run db:migrate

Apply pending migrations in production (no prompts):

pnpm --filter @repo/db run db:deploy

Open Prisma Studio for visual database browsing:

pnpm --filter @repo/db run db:studio

Usage 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
`;

On this page