data-repository-pattern
**Impact: CRITICAL**
$ npx -y skills add calcom/cal.com --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
**Impact: CRITICAL**
Agent definition
data-repository-pattern.mdtitle: Isolate Technology Choices Behind Repositories
impact: CRITICAL
impactDescription: Enables technology changes without codebase-wide refactors
tags: data, repository, prisma, orm, isolation
Isolate Technology Choices Behind Repositories
**Impact: CRITICAL**
Technology choices must not seep through the application. The Prisma problem illustrates this perfectly: we currently have references to Prisma scattered across hundreds of files. This creates massive coupling and makes technology changes prohibitively expensive.
**Incorrect (Prisma leaking throughout codebase):**
// In a service file
import { prisma } from "@calcom/prisma";
async function getBooking(id: number) {
// Direct Prisma usage in service
return prisma.booking.findFirst({
where: { id },
include: { user: true }
});
}**Correct (Repository abstraction):**
// In repository file
import { prisma } from "@calcom/prisma";
export class BookingRepository {
async findById(id: number): Promise<BookingDTO | null> {
const booking = await prisma.booking.findFirst({
where: { id },
select: { id: true, title: true, userId: true }
});
return booking ? this.toDTO(booking) : null;
}
}
// In service file - no Prisma knowledge
import { BookingRepository } from "./repositories/BookingRepository";
async function getBooking(id: number) {
return this.bookingRepository.findById(id);
}**The standard:**
- All database access must go through Repository classes
- Repositories are the only code that knows about Prisma (or any other ORM)
- No business logic should be in repositories
- Repositories are injected via Dependency Injection containers
**Benefits:** If we ever switch from Prisma to Drizzle or another ORM, the only changes required are:
- Repository implementations
- DI container wiring for new repositories
- Nothing else in the codebase should care or change
Reference: [Cal.diy Engineering Blog](https://cal.com/blog/engineering-in-2026-and-beyond)
Read more
title: Isolate Technology Choices Behind Repositories impact: CRITICAL impactDescription: Enables technology changes without codebase-wide refactors tags: data, repository, prisma, orm, isolation
Isolate Technology Choices Behind Repositories
**Impact: CRITICAL**
Technology choices must not seep through the application. The Prisma problem illustrates this perfectly: we currently have references to Prisma scattered across hundreds of files. This creates massive coupling and makes technology changes prohibitively expensive.
**Incorrect (Prisma leaking throughout codebase):**
// In a service file
import { prisma } from "@calcom/prisma";
async function getBooking(id: number) {
// Direct Prisma usage in service
return prisma.booking.findFirst({
where: { id },
include: { user: true }
});
}**Correct (Repository abstraction):**
// In repository file
import { prisma } from "@calcom/prisma";
export class BookingRepository {
async findById(id: number): Promise<BookingDTO | null> {
const booking = await prisma.booking.findFirst({
where: { id },
select: { id: true, title: true, userId: true }
});
return booking ? this.toDTO(booking) : null;
}
}
// In service file - no Prisma knowledge
import { BookingRepository } from "./repositories/BookingRepository";
async function getBooking(id: number) {
return this.bookingRepository.findById(id);
}**The standard:**
- All database access must go through Repository classes
- Repositories are the only code that knows about Prisma (or any other ORM)
- No business logic should be in repositories
- Repositories are injected via Dependency Injection containers
**Benefits:** If we ever switch from Prisma to Drizzle or another ORM, the only changes required are:
- Repository implementations
- DI container wiring for new repositories
- Nothing else in the codebase should care or change
Reference: [Cal.diy Engineering Blog](https://cal.com/blog/engineering-in-2026-and-beyond)
Repo: calcom/cal.com
Other agents on caldiy.
- knowledge-base
This file contains domain knowledge about the Cal.diy product and codebase. For coding guidelines and rules, see [`rules/`](rules/).
Open agent - api-no-breaking-changes
**Impact: CRITICAL**
Open agent - api-thin-controllers
**Impact: HIGH**
Open agent - architecture-circular-dependencies
**Impact: CRITICAL**
Open agent - architecture-feature-boundaries
**Impact: CRITICAL**
Open agent - architecture-features-modules
The `packages/features` package should contain only framework-agnostic code: - Repositories (data access layer) - Services (business logic) - Core utilities and helpers - Types and interfaces
Open agent

