Source Cursor rule: .cursor/rules/infra.mdc.
Original Cursor alwaysApply: false.
Infrastructure
Package Manager
Use bun, never npm/yarn/pnpm.
bun install # Install deps
bun add <pkg> # Add package
bun add -D <pkg> # Add dev dependency
bun run <script> # Run script
bunx <cmd> # Execute binary
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
# Multi-package (via turbo)
bun run build # Build all
bun run lint # Lint all
bun run typecheck # Type check all
bun run dev # Dev all
# Single package
bun run -F apps/app dev
bun run -F @trycompai/db prisma:generate
turbo build --filter=@trycompai/ui
Importing Between Packages
// ✅ Import from package name
import { Button } from '@trycompai/design-system';
import { prisma } from '@trycompai/db';
// ❌ Never relative paths across packages
import { Button } from '../../../packages/ui/src/button';
Adding Dependencies
# To specific package
bun add axios -F apps/app
bun add -D vitest -F @trycompai/ui
# To root (dev tools only)
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 = SomeTypeinstead
Common ESLint Fixes
- Unused variables: Remove or prefix with
_ - Any type: Add proper typing
- Empty object type: Use
typeinstead ofinterface
Creating a New Package
mkdir packages/my-package
// packages/my-package/package.json
{
"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"
}
}
// packages/my-package/tsconfig.json
{
"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