| name | infra |
| description | Use when working with packages, dependencies, monorepo structure, or build configuration |
Source Cursor rule: .cursor/rules/infra.mdc.
Original Cursor alwaysApply: false.
Infrastructure
Package Manager
Use bun, never npm/yarn/pnpm.
bun install
bun add <pkg>
bun add -D <pkg>
bun run <script>
bunx <cmd>
Monorepo Structure
comp/
├── apps/
│ ├── api/ # NestJS backend
│ ├── app/ # Next.js main app
│ └── portal/ # Next.js portal
├── packages/
│ ├── db/ # Prisma (@trycompai/db)
│ ├── ui/ # Legacy UI (@trycompai/ui); prefer @trycompai/design-system
│ └── ...
├── turbo.json
└── package.json
Running Commands
bun run build
bun run lint
bun run typecheck
bun run dev
bun run -F apps/app dev
bun run -F @trycompai/db prisma:generate
turbo build --filter=@trycompai/ui
Importing Between Packages
import { Button } from '@trycompai/design-system';
import { prisma } from '@trycompai/db';
import { Button } from '../../../packages/ui/src/button';
Adding Dependencies
bun add axios -F apps/app
bun add -D vitest -F @trycompai/ui
bun add -D -w prettier typescript
After Code Changes
Always run checks:
bun run typecheck
bun run lint
Fix all errors before committing.
Common TypeScript Fixes
- Property does not exist: Check interface definitions
- Type mismatch: Verify expected vs actual type
- Empty interface extends: Use
type X = SomeType instead
Common ESLint Fixes
- Unused variables: Remove or prefix with
_
- Any type: Add proper typing
- Empty object type: Use
type instead of interface
Creating a New Package
mkdir packages/my-package
{
"name": "@trycompai/my-package",
"version": "0.0.0",
"private": true,
"main": "./src/index.ts",
"scripts": {
"build": "tsup src/index.ts --format cjs,esm --dts",
"typecheck": "tsc --noEmit"
}
}
{
"extends": "@trycompai/tsconfig/base.json",
"include": ["src"]
}
Package Boundaries
✅ Create packages for:
- Code used by 2+ apps
- Self-contained, focused functionality
❌ Don't create packages for:
- Code only used in one app (colocate instead)
- App-specific business logic