--- name: monorepo-architect description: "Expert guide for designing and managing scalable monorepos using Turborepo, pnpm workspaces, and shared packages / Panduan ahli untuk merancang dan mengelola monorepo skalabel menggunakan Turborepo dan pnpm workspaces." author: "Antigravity" --- # Monorepo & Workspace Architect [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Overview The **Monorepo & Workspace Architect** skill provides best practices for setting up, managing, and scaling a monorepo architecture. It focuses on using modern tooling like **Turborepo** and **pnpm workspaces** to handle multiple applications and shared packages within a single Git repository. ### Trigger Conditions Use this skill when: - The user wants to split a monolithic application into multiple apps (e.g., public site, admin dashboard, API). - The user needs to share UI components, TypeScript types, or utility functions across different projects. - The user is setting up `turbo.json` or `pnpm-workspace.yaml`. - The user is facing dependency issues or slow build times in a large repository. ### Core Architecture Guidelines #### 1. Folder Structure Maintain a strict separation between deployable applications (`apps/`) and shared libraries (`packages/`). ```text . ├── apps/ │ ├── web/ # Main public-facing application (Next.js) │ ├── admin/ # Internal admin dashboard (Vite/React) │ └── api/ # Backend API services (Node/Bun/Rust) ├── packages/ │ ├── ui/ # Shared React components (Tailwind, shadcn) │ ├── types/ # Shared TypeScript interfaces & DTOs │ ├── config-eslint/ # Shared ESLint configurations │ ├── config-ts/ # Shared tsconfig.json bases │ └── db/ # Database schema and ORM client (Prisma/Drizzle) ├── turbo.json # Turborepo configuration ├── pnpm-workspace.yaml └── package.json ``` #### 2. Workspace Management (pnpm) Always prefer `pnpm` for monorepos due to its strict dependency resolution and speed. - Define `pnpm-workspace.yaml` explicitly: ```yaml packages: - "apps/*" - "packages/*" ``` - Use the `workspace:*` protocol when linking internal packages to ensure the latest local version is always used. #### 3. Turborepo Configuration (`turbo.json`) Maximize build cache and parallel execution. Ensure inputs and outputs are correctly defined. ```json { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env.*local"], "tasks": { "build": { "dependsOn": ["^build"], "outputs": [".next/**", "!.next/cache/**", "dist/**"] }, "lint": { "dependsOn": ["^lint"] }, "dev": { "cache": false, "persistent": true } } } ``` #### 4. The Shared UI Package (`@repo/ui`) When sharing UI components (e.g., Tailwind CSS + React): - Do not transpile the UI package locally; let the consumer apps (Next.js/Vite) transpile it. This avoids complex build steps in the `packages/ui` folder. - Ensure the consumer app's `tailwind.config.ts` includes the UI package in its `content` path to scan for classes. - Use `transpilePackages: ["@repo/ui"]` in Next.js `next.config.mjs`. #### 5. CI/CD & Remote Caching - Utilize Vercel Remote Cache or GitHub Actions cache to drastically reduce CI build times. - Only run tests and deployments on packages that have changed by using `turbo run build --filter=...[origin/main]`. --- ## Bahasa Indonesia ### Ringkasan Skill **Monorepo & Workspace Architect** memberikan praktik terbaik untuk menyiapkan, mengelola, dan menskalakan arsitektur monorepo. Skill ini berfokus pada penggunaan alat modern seperti **Turborepo** dan **pnpm workspaces** untuk mengelola beberapa aplikasi dan paket (library) yang digunakan bersama dalam satu repositori Git. ### Kondisi Pemicu Gunakan skill ini ketika: - Pengguna ingin memecah aplikasi monolitik menjadi beberapa aplikasi terpisah (misalnya: situs publik, dasbor admin, API). - Pengguna perlu membagikan komponen UI, tipe TypeScript, atau fungsi utilitas ke berbagai proyek berbeda. - Pengguna sedang mengonfigurasi `turbo.json` atau `pnpm-workspace.yaml`. - Pengguna menghadapi masalah dependensi atau waktu *build* yang lambat di repositori yang besar. ### Panduan Arsitektur Inti #### 1. Struktur Folder Pertahankan pemisahan yang ketat antara aplikasi yang dapat di-deploy (`apps/`) dan library yang dibagikan (`packages/`). ```text . ├── apps/ │ ├── web/ # Aplikasi utama untuk publik (Next.js) │ ├── admin/ # Dasbor admin internal (Vite/React) │ └── api/ # Layanan backend API (Node/Bun/Rust) ├── packages/ │ ├── ui/ # Komponen React bersama (Tailwind, shadcn) │ ├── types/ # Interface & DTO TypeScript bersama │ ├── config-eslint/ # Konfigurasi ESLint bersama │ ├── config-ts/ # Base tsconfig.json bersama │ └── db/ # Skema database dan ORM client (Prisma/Drizzle) ├── turbo.json # Konfigurasi Turborepo ├── pnpm-workspace.yaml └── package.json ``` #### 2. Manajemen Workspace (pnpm) Selalu prioritaskan `pnpm` untuk monorepo karena kecepatan dan resolusi dependensinya yang ketat. - Definisikan `pnpm-workspace.yaml` secara eksplisit: ```yaml packages: - "apps/*" - "packages/*" ``` - Gunakan protokol `workspace:*` (misal: `"@repo/ui": "workspace:*"`) saat menautkan paket internal agar versi lokal terbaru selalu digunakan. #### 3. Konfigurasi Turborepo (`turbo.json`) Maksimalkan penggunaan *cache* dan eksekusi paralel. Pastikan `inputs` dan `outputs` terdefinisi dengan benar untuk menghindari *cache miss*. ```json { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env.*local"], "tasks": { "build": { "dependsOn": ["^build"], "outputs": [".next/**", "!.next/cache/**", "dist/**"] }, "lint": { "dependsOn": ["^lint"] }, "dev": { "cache": false, "persistent": true } } } ``` #### 4. Paket UI Bersama (`@repo/ui`) Saat berbagi komponen UI (misal: Tailwind CSS + React): - Jangan lakukan proses *transpile* (build) pada paket UI secara lokal; biarkan aplikasi konsumen (Next.js/Vite) yang melakukan *transpile*. Ini menghindari kerumitan konfigurasi *build* di dalam folder `packages/ui`. - Pastikan `tailwind.config.ts` di aplikasi konsumen menyertakan path paket UI di bagian `content` agar Tailwind bisa memindai *utility classes*-nya. - Gunakan konfigurasi `transpilePackages: ["@repo/ui"]` di `next.config.mjs` Next.js. #### 5. CI/CD & Remote Caching - Manfaatkan *Vercel Remote Cache* atau *GitHub Actions cache* untuk memangkas waktu *build* di CI secara drastis. - Hanya jalankan pengujian dan *deployment* pada paket yang mengalami perubahan dengan menggunakan perintah `turbo run build --filter=...[origin/main]`.