tribunal-kit 4.2.0 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +21 -14
- package/.agent/agents/swarm-worker-contracts.md +5 -5
- package/.agent/agents/ui-ux-auditor.md +292 -0
- package/.agent/rules/GEMINI.md +8 -8
- package/.agent/scripts/__pycache__/_colors.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/_utils.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/case_law_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/_colors.js +18 -0
- package/.agent/scripts/_utils.js +42 -0
- package/.agent/scripts/auto_preview.js +197 -0
- package/.agent/scripts/bundle_analyzer.js +290 -0
- package/.agent/scripts/case_law_manager.js +684 -0
- package/.agent/scripts/checklist.js +266 -0
- package/.agent/scripts/colors.js +17 -0
- package/.agent/scripts/compress_skills.js +141 -0
- package/.agent/scripts/consolidate_skills.js +149 -0
- package/.agent/scripts/context_broker.js +609 -0
- package/.agent/scripts/deep_compress.js +150 -0
- package/.agent/scripts/dependency_analyzer.js +272 -0
- package/.agent/scripts/graph_builder.js +199 -0
- package/.agent/scripts/graph_zoom.js +154 -0
- package/.agent/scripts/inner_loop_validator.js +465 -0
- package/.agent/scripts/lint_runner.js +187 -0
- package/.agent/scripts/minify_context.js +100 -0
- package/.agent/scripts/patch_skills_meta.js +156 -0
- package/.agent/scripts/patch_skills_output.js +244 -0
- package/.agent/scripts/schema_validator.js +297 -0
- package/.agent/scripts/security_scan.js +303 -0
- package/.agent/scripts/session_manager.js +276 -0
- package/.agent/scripts/skill_evolution.js +644 -0
- package/.agent/scripts/skill_integrator.js +313 -0
- package/.agent/scripts/strengthen_skills.js +193 -0
- package/.agent/scripts/strip_tribunal.js +47 -0
- package/.agent/scripts/swarm_dispatcher.js +360 -0
- package/.agent/scripts/test_runner.js +193 -0
- package/.agent/scripts/utils.js +32 -0
- package/.agent/scripts/verify_all.js +256 -0
- package/.agent/skills/agent-organizer/SKILL.md +12 -4
- package/.agent/skills/agentic-patterns/SKILL.md +12 -4
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +12 -4
- package/.agent/skills/api-patterns/SKILL.md +209 -201
- package/.agent/skills/api-security-auditor/SKILL.md +12 -4
- package/.agent/skills/app-builder/SKILL.md +12 -4
- package/.agent/skills/app-builder/templates/SKILL.md +76 -68
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +1 -1
- package/.agent/skills/appflow-wireframe/SKILL.md +12 -4
- package/.agent/skills/architecture/SKILL.md +12 -4
- package/.agent/skills/authentication-best-practices/SKILL.md +12 -4
- package/.agent/skills/bash-linux/SKILL.md +12 -4
- package/.agent/skills/behavioral-modes/SKILL.md +12 -4
- package/.agent/skills/brainstorming/SKILL.md +12 -4
- package/.agent/skills/building-native-ui/SKILL.md +12 -4
- package/.agent/skills/clean-code/SKILL.md +12 -4
- package/.agent/skills/code-review-checklist/SKILL.md +12 -4
- package/.agent/skills/config-validator/SKILL.md +12 -4
- package/.agent/skills/csharp-developer/SKILL.md +12 -4
- package/.agent/skills/data-validation-schemas/SKILL.md +290 -282
- package/.agent/skills/database-design/SKILL.md +202 -194
- package/.agent/skills/deployment-procedures/SKILL.md +12 -4
- package/.agent/skills/devops-engineer/SKILL.md +12 -4
- package/.agent/skills/devops-incident-responder/SKILL.md +12 -4
- package/.agent/skills/doc.md +1 -1
- package/.agent/skills/documentation-templates/SKILL.md +12 -4
- package/.agent/skills/edge-computing/SKILL.md +12 -4
- package/.agent/skills/error-resilience/SKILL.md +390 -382
- package/.agent/skills/extract-design-system/SKILL.md +12 -4
- package/.agent/skills/framer-motion-expert/SKILL.md +206 -199
- package/.agent/skills/frontend-design/SKILL.md +163 -155
- package/.agent/skills/game-design-expert/SKILL.md +12 -4
- package/.agent/skills/game-engineering-expert/SKILL.md +12 -4
- package/.agent/skills/geo-fundamentals/SKILL.md +12 -4
- package/.agent/skills/github-operations/SKILL.md +12 -4
- package/.agent/skills/gsap-core/SKILL.md +54 -48
- package/.agent/skills/gsap-frameworks/SKILL.md +54 -48
- package/.agent/skills/gsap-performance/SKILL.md +54 -48
- package/.agent/skills/gsap-plugins/SKILL.md +54 -48
- package/.agent/skills/gsap-react/SKILL.md +54 -48
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +54 -48
- package/.agent/skills/gsap-timeline/SKILL.md +54 -48
- package/.agent/skills/gsap-utils/SKILL.md +54 -48
- package/.agent/skills/i18n-localization/SKILL.md +12 -4
- package/.agent/skills/intelligent-routing/SKILL.md +41 -33
- package/.agent/skills/knowledge-graph/SKILL.md +36 -0
- package/.agent/skills/lint-and-validate/SKILL.md +12 -4
- package/.agent/skills/llm-engineering/SKILL.md +12 -4
- package/.agent/skills/local-first/SKILL.md +12 -4
- package/.agent/skills/mcp-builder/SKILL.md +12 -4
- package/.agent/skills/mobile-design/SKILL.md +225 -217
- package/.agent/skills/monorepo-management/SKILL.md +296 -288
- package/.agent/skills/motion-engineering/SKILL.md +195 -187
- package/.agent/skills/nextjs-react-expert/SKILL.md +196 -188
- package/.agent/skills/nodejs-best-practices/SKILL.md +12 -4
- package/.agent/skills/observability/SKILL.md +12 -4
- package/.agent/skills/parallel-agents/SKILL.md +12 -4
- package/.agent/skills/performance-profiling/SKILL.md +12 -4
- package/.agent/skills/plan-writing/SKILL.md +12 -4
- package/.agent/skills/platform-engineer/SKILL.md +12 -4
- package/.agent/skills/playwright-best-practices/SKILL.md +12 -4
- package/.agent/skills/powershell-windows/SKILL.md +12 -4
- package/.agent/skills/project-idioms/SKILL.md +12 -4
- package/.agent/skills/python-patterns/SKILL.md +12 -4
- package/.agent/skills/python-pro/SKILL.md +285 -277
- package/.agent/skills/react-specialist/SKILL.md +239 -231
- package/.agent/skills/readme-builder/SKILL.md +12 -4
- package/.agent/skills/realtime-patterns/SKILL.md +12 -4
- package/.agent/skills/red-team-tactics/SKILL.md +12 -4
- package/.agent/skills/rust-pro/SKILL.md +12 -4
- package/.agent/skills/seo-fundamentals/SKILL.md +12 -4
- package/.agent/skills/server-management/SKILL.md +12 -4
- package/.agent/skills/shadcn-ui-expert/SKILL.md +12 -4
- package/.agent/skills/skill-creator/SKILL.md +12 -4
- package/.agent/skills/sql-pro/SKILL.md +12 -4
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +12 -4
- package/.agent/skills/swiftui-expert/SKILL.md +12 -4
- package/.agent/skills/systematic-debugging/SKILL.md +12 -4
- package/.agent/skills/tailwind-patterns/SKILL.md +12 -4
- package/.agent/skills/tdd-workflow/SKILL.md +12 -4
- package/.agent/skills/test-result-analyzer/SKILL.md +12 -4
- package/.agent/skills/testing-patterns/SKILL.md +12 -4
- package/.agent/skills/trend-researcher/SKILL.md +12 -4
- package/.agent/skills/typescript-advanced/SKILL.md +297 -289
- package/.agent/skills/ui-ux-pro-max/SKILL.md +12 -4
- package/.agent/skills/ui-ux-researcher/SKILL.md +12 -4
- package/.agent/skills/vue-expert/SKILL.md +237 -229
- package/.agent/skills/vulnerability-scanner/SKILL.md +12 -4
- package/.agent/skills/web-accessibility-auditor/SKILL.md +12 -4
- package/.agent/skills/web-design-guidelines/SKILL.md +12 -4
- package/.agent/skills/webapp-testing/SKILL.md +12 -4
- package/.agent/skills/whimsy-injector/SKILL.md +12 -4
- package/.agent/skills/workflow-optimizer/SKILL.md +12 -4
- package/.agent/workflows/audit.md +6 -6
- package/.agent/workflows/deploy.md +1 -1
- package/.agent/workflows/generate.md +23 -6
- package/.agent/workflows/session.md +5 -5
- package/.agent/workflows/swarm.md +2 -2
- package/README.md +242 -186
- package/bin/tribunal-kit.js +297 -57
- package/package.json +81 -77
- package/scripts/changelog.js +167 -0
- package/scripts/sync-version.js +81 -0
- package/scripts/validate-payload.js +73 -0
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/scripts/auto_preview.py +0 -180
- package/.agent/scripts/bundle_analyzer.py +0 -259
- package/.agent/scripts/case_law_manager.py +0 -755
- package/.agent/scripts/checklist.py +0 -209
- package/.agent/scripts/compress_skills.py +0 -167
- package/.agent/scripts/consolidate_skills.py +0 -173
- package/.agent/scripts/deep_compress.py +0 -202
- package/.agent/scripts/dependency_analyzer.py +0 -247
- package/.agent/scripts/lint_runner.py +0 -188
- package/.agent/scripts/minify_context.py +0 -80
- package/.agent/scripts/patch_skills_meta.py +0 -177
- package/.agent/scripts/patch_skills_output.py +0 -285
- package/.agent/scripts/schema_validator.py +0 -279
- package/.agent/scripts/security_scan.py +0 -224
- package/.agent/scripts/session_manager.py +0 -261
- package/.agent/scripts/skill_evolution.py +0 -563
- package/.agent/scripts/skill_integrator.py +0 -234
- package/.agent/scripts/strengthen_skills.py +0 -220
- package/.agent/scripts/strip_tribunal.py +0 -41
- package/.agent/scripts/swarm_dispatcher.py +0 -350
- package/.agent/scripts/test_runner.py +0 -192
- package/.agent/scripts/test_swarm_dispatcher.py +0 -163
- package/.agent/scripts/verify_all.py +0 -195
|
@@ -1,292 +1,292 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: monorepo-management
|
|
3
|
-
description: Monorepo architecture and tooling mastery. Turborepo, Nx, pnpm workspaces, shared package design, task pipelines, dependency hoisting, change detection, versioning strategies (independent vs. fixed), shared TypeScript configs, internal packages, and CI optimization for monorepos. Use when setting up monorepos, managing shared code across apps, or optimizing build pipelines.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version: 1.0.0
|
|
6
|
-
last-updated: 2026-04-17
|
|
7
|
-
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Hallucination Traps (Read First)
|
|
11
|
-
- ❌ Publishing internal packages to npm when they're meant to stay private -> ✅ Internal packages use `"private": true` and workspace protocol `"workspace:*"`
|
|
12
|
-
- ❌ Putting all shared code in a single `packages/shared` dump -> ✅ Split by domain: `packages/ui`, `packages/config`, `packages/utils`
|
|
13
|
-
- ❌ Running all tests on every PR regardless of what changed -> ✅ Use affected/changed detection (Turborepo `--filter`, Nx `affected`)
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
# Monorepo Management — Scaling Multi-Package Projects
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Tool Selection
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
┌──────────────────────────────────────────────────────────────┐
|
|
25
|
-
│ When to Use What │
|
|
26
|
-
├──────────────────────────────────────────────────────────────┤
|
|
27
|
-
│ pnpm workspaces │ Package linking only, no build orchestration│
|
|
28
|
-
│ Turborepo │ Fast builds, simple config, Vercel ecosystem│
|
|
29
|
-
│ Nx │ Enterprise, generators, dependency graph UI │
|
|
30
|
-
│ npm workspaces │ Zero-dep, basic linking (limited features) │
|
|
31
|
-
│ Yarn workspaces │ Legacy projects already using Yarn │
|
|
32
|
-
├──────────────────────────────────────────────────────────────┤
|
|
33
|
-
│ Recommendation: pnpm + Turborepo for most projects │
|
|
34
|
-
└──────────────────────────────────────────────────────────────┘
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Directory Structure
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
my-monorepo/
|
|
43
|
-
├── apps/
|
|
44
|
-
│ ├── web/ # Next.js frontend
|
|
45
|
-
│ │ ├── package.json
|
|
46
|
-
│ │ └── tsconfig.json
|
|
47
|
-
│ ├── api/ # Fastify/Express backend
|
|
48
|
-
│ │ ├── package.json
|
|
49
|
-
│ │ └── tsconfig.json
|
|
50
|
-
│ └── mobile/ # React Native app
|
|
51
|
-
│ └── package.json
|
|
52
|
-
├── packages/
|
|
53
|
-
│ ├── ui/ # Shared React components
|
|
54
|
-
│ │ ├── src/
|
|
55
|
-
│ │ ├── package.json
|
|
56
|
-
│ │ └── tsconfig.json
|
|
57
|
-
│ ├── config/ # Shared ESLint, TypeScript, Prettier configs
|
|
58
|
-
│ │ ├── eslint/
|
|
59
|
-
│ │ ├── typescript/
|
|
60
|
-
│ │ └── package.json
|
|
61
|
-
│ ├── utils/ # Shared pure functions
|
|
62
|
-
│ │ └── package.json
|
|
63
|
-
│ └── db/ # Shared database client + schemas
|
|
64
|
-
│ └── package.json
|
|
65
|
-
├── turbo.json
|
|
66
|
-
├── pnpm-workspace.yaml
|
|
67
|
-
├── package.json # Root — devDependencies only
|
|
68
|
-
└── tsconfig.base.json # Shared TS config extended by all
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## pnpm Workspace Setup
|
|
74
|
-
|
|
75
|
-
```yaml
|
|
76
|
-
# pnpm-workspace.yaml
|
|
77
|
-
packages:
|
|
78
|
-
- "apps/*"
|
|
79
|
-
- "packages/*"
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
```json
|
|
83
|
-
// Root package.json
|
|
84
|
-
{
|
|
85
|
-
"name": "my-monorepo",
|
|
86
|
-
"private": true,
|
|
87
|
-
"scripts": {
|
|
88
|
-
"dev": "turbo run dev",
|
|
89
|
-
"build": "turbo run build",
|
|
90
|
-
"lint": "turbo run lint",
|
|
91
|
-
"test": "turbo run test",
|
|
92
|
-
"clean": "turbo run clean"
|
|
93
|
-
},
|
|
94
|
-
"devDependencies": {
|
|
95
|
-
"turbo": "^2.0.0"
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
```json
|
|
101
|
-
// packages/ui/package.json
|
|
102
|
-
{
|
|
103
|
-
"name": "@myorg/ui",
|
|
104
|
-
"version": "0.0.0",
|
|
105
|
-
"private": true,
|
|
106
|
-
"main": "./src/index.ts",
|
|
107
|
-
"types": "./src/index.ts",
|
|
108
|
-
"exports": {
|
|
109
|
-
".": "./src/index.ts",
|
|
110
|
-
"./button": "./src/button.tsx",
|
|
111
|
-
"./card": "./src/card.tsx"
|
|
112
|
-
},
|
|
113
|
-
"peerDependencies": {
|
|
114
|
-
"react": "^19.0.0",
|
|
115
|
-
"react-dom": "^19.0.0"
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
```json
|
|
121
|
-
// apps/web/package.json — consuming internal package
|
|
122
|
-
{
|
|
123
|
-
"name": "web",
|
|
124
|
-
"dependencies": {
|
|
125
|
-
"@myorg/ui": "workspace:*",
|
|
126
|
-
"@myorg/utils": "workspace:*"
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## Turborepo Configuration
|
|
134
|
-
|
|
135
|
-
```json
|
|
136
|
-
// turbo.json
|
|
137
|
-
{
|
|
138
|
-
"$schema": "https://turbo.build/schema.json",
|
|
139
|
-
"globalDependencies": ["**/.env.*local"],
|
|
140
|
-
"tasks": {
|
|
141
|
-
"build": {
|
|
142
|
-
"dependsOn": ["^build"],
|
|
143
|
-
"outputs": ["dist/**", ".next/**", "!.next/cache/**"]
|
|
144
|
-
},
|
|
145
|
-
"dev": {
|
|
146
|
-
"cache": false,
|
|
147
|
-
"persistent": true
|
|
148
|
-
},
|
|
149
|
-
"lint": {
|
|
150
|
-
"dependsOn": ["^build"]
|
|
151
|
-
},
|
|
152
|
-
"test": {
|
|
153
|
-
"dependsOn": ["^build"],
|
|
154
|
-
"outputs": ["coverage/**"]
|
|
155
|
-
},
|
|
156
|
-
"clean": {
|
|
157
|
-
"cache": false
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
Key concepts:
|
|
165
|
-
"^build" = Run build in dependencies FIRST (topological)
|
|
166
|
-
"dependsOn" = Task ordering — lint waits for build
|
|
167
|
-
"outputs" = What gets cached — skip re-runs if unchanged
|
|
168
|
-
"persistent" = Long-running (dev servers) — never cached
|
|
169
|
-
"cache: false" = Always run, never skip
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
## Shared TypeScript Configuration
|
|
175
|
-
|
|
176
|
-
```json
|
|
177
|
-
// tsconfig.base.json (root)
|
|
178
|
-
{
|
|
179
|
-
"compilerOptions": {
|
|
180
|
-
"strict": true,
|
|
181
|
-
"target": "ES2022",
|
|
182
|
-
"module": "ESNext",
|
|
183
|
-
"moduleResolution": "bundler",
|
|
184
|
-
"esModuleInterop": true,
|
|
185
|
-
"skipLibCheck": true,
|
|
186
|
-
"forceConsistentCasingInFileNames": true,
|
|
187
|
-
"declaration": true,
|
|
188
|
-
"declarationMap": true,
|
|
189
|
-
"sourceMap": true,
|
|
190
|
-
"isolatedModules": true,
|
|
191
|
-
"resolveJsonModule": true
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
```json
|
|
197
|
-
// apps/web/tsconfig.json
|
|
198
|
-
{
|
|
199
|
-
"extends": "../../tsconfig.base.json",
|
|
200
|
-
"compilerOptions": {
|
|
201
|
-
"jsx": "preserve",
|
|
202
|
-
"lib": ["dom", "dom.iterable", "ES2022"],
|
|
203
|
-
"outDir": "./dist"
|
|
204
|
-
},
|
|
205
|
-
"include": ["src/**/*", "../../packages/*/src/**/*"]
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## Change Detection (Only Build What Changed)
|
|
212
|
-
|
|
213
|
-
```bash
|
|
214
|
-
# Turborepo — filter by affected packages
|
|
215
|
-
turbo run build --filter=...[HEAD~1] # packages changed since last commit
|
|
216
|
-
turbo run test --filter=web... # web app + its dependencies
|
|
217
|
-
turbo run lint --filter=@myorg/ui # specific package only
|
|
218
|
-
|
|
219
|
-
# CI: Only run tests for changed packages
|
|
220
|
-
turbo run test --filter="[origin/main...HEAD]"
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
```yaml
|
|
224
|
-
# GitHub Actions — with Turborepo cache
|
|
225
|
-
- name: Build & Test (cached)
|
|
226
|
-
run: npx turbo run build test lint --filter="[origin/main...HEAD]"
|
|
227
|
-
env:
|
|
228
|
-
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
|
229
|
-
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## Versioning Strategies
|
|
235
|
-
|
|
236
|
-
```
|
|
237
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
238
|
-
│ Fixed (recommended for apps) │
|
|
239
|
-
│ All packages share one version. Simple. One changelog. │
|
|
240
|
-
│ Example: v1.2.3 applies to web, api, ui, utils, db │
|
|
241
|
-
├─────────────────────────────────────────────────────────────┤
|
|
242
|
-
│ Independent (for published libraries) │
|
|
243
|
-
│ Each package has its own version + changelog. │
|
|
244
|
-
│ Example: @myorg/ui@2.1.0, @myorg/utils@1.4.2 │
|
|
245
|
-
│ Tools: Changesets, Lerna │
|
|
246
|
-
├─────────────────────────────────────────────────────────────┤
|
|
247
|
-
│ Recommendation: │
|
|
248
|
-
│ Internal monorepo (1 team) → Fixed versioning │
|
|
249
|
-
│ Open-source multi-package → Independent + Changesets │
|
|
250
|
-
└─────────────────────────────────────────────────────────────┘
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
## Internal Package Design Rules
|
|
256
|
-
|
|
257
|
-
```
|
|
258
|
-
✅ Internal packages are "private": true — never published to npm
|
|
259
|
-
✅ Use workspace protocol: "@myorg/ui": "workspace:*"
|
|
260
|
-
✅ Export raw TypeScript (src/index.ts) — let the consuming app bundle it
|
|
261
|
-
✅ One package per domain: ui, utils, config, db — NOT one giant "shared"
|
|
262
|
-
✅ Peer dependencies for React/framework — don't bundle the framework
|
|
263
|
-
|
|
264
|
-
❌ Don't create a package for 1-2 functions — inline until it's reused 3+ times
|
|
265
|
-
❌ Don't publish internal packages to npm "just in case"
|
|
266
|
-
❌ Don't share mutable state across packages — each package is a pure module
|
|
267
|
-
❌ Don't put app-specific code in packages/ — only truly shared code
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## Anti-Patterns
|
|
273
|
-
|
|
274
|
-
```
|
|
275
|
-
❌ Running all CI checks on every package for every PR — use affected detection
|
|
276
|
-
❌ Circular dependencies between packages — topological ordering must be acyclic
|
|
277
|
-
❌ Mixing CommonJS and ESM in the same monorepo — standardize on ESM
|
|
278
|
-
❌ Installing devDependencies in every package — hoist shared devDeps to root
|
|
279
|
-
❌ No lockfile — pnpm-lock.yaml MUST be committed
|
|
280
|
-
❌ Using relative paths (../../packages/ui) — use workspace:* protocol
|
|
281
|
-
❌ Giant "shared" package — splits into domain-focused packages
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
---
|
|
1
|
+
---
|
|
2
|
+
name: monorepo-management
|
|
3
|
+
description: Monorepo architecture and tooling mastery. Turborepo, Nx, pnpm workspaces, shared package design, task pipelines, dependency hoisting, change detection, versioning strategies (independent vs. fixed), shared TypeScript configs, internal packages, and CI optimization for monorepos. Use when setting up monorepos, managing shared code across apps, or optimizing build pipelines.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
last-updated: 2026-04-17
|
|
7
|
+
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Hallucination Traps (Read First)
|
|
11
|
+
- ❌ Publishing internal packages to npm when they're meant to stay private -> ✅ Internal packages use `"private": true` and workspace protocol `"workspace:*"`
|
|
12
|
+
- ❌ Putting all shared code in a single `packages/shared` dump -> ✅ Split by domain: `packages/ui`, `packages/config`, `packages/utils`
|
|
13
|
+
- ❌ Running all tests on every PR regardless of what changed -> ✅ Use affected/changed detection (Turborepo `--filter`, Nx `affected`)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Monorepo Management — Scaling Multi-Package Projects
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Tool Selection
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
25
|
+
│ When to Use What │
|
|
26
|
+
├──────────────────────────────────────────────────────────────┤
|
|
27
|
+
│ pnpm workspaces │ Package linking only, no build orchestration│
|
|
28
|
+
│ Turborepo │ Fast builds, simple config, Vercel ecosystem│
|
|
29
|
+
│ Nx │ Enterprise, generators, dependency graph UI │
|
|
30
|
+
│ npm workspaces │ Zero-dep, basic linking (limited features) │
|
|
31
|
+
│ Yarn workspaces │ Legacy projects already using Yarn │
|
|
32
|
+
├──────────────────────────────────────────────────────────────┤
|
|
33
|
+
│ Recommendation: pnpm + Turborepo for most projects │
|
|
34
|
+
└──────────────────────────────────────────────────────────────┘
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Directory Structure
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
my-monorepo/
|
|
43
|
+
├── apps/
|
|
44
|
+
│ ├── web/ # Next.js frontend
|
|
45
|
+
│ │ ├── package.json
|
|
46
|
+
│ │ └── tsconfig.json
|
|
47
|
+
│ ├── api/ # Fastify/Express backend
|
|
48
|
+
│ │ ├── package.json
|
|
49
|
+
│ │ └── tsconfig.json
|
|
50
|
+
│ └── mobile/ # React Native app
|
|
51
|
+
│ └── package.json
|
|
52
|
+
├── packages/
|
|
53
|
+
│ ├── ui/ # Shared React components
|
|
54
|
+
│ │ ├── src/
|
|
55
|
+
│ │ ├── package.json
|
|
56
|
+
│ │ └── tsconfig.json
|
|
57
|
+
│ ├── config/ # Shared ESLint, TypeScript, Prettier configs
|
|
58
|
+
│ │ ├── eslint/
|
|
59
|
+
│ │ ├── typescript/
|
|
60
|
+
│ │ └── package.json
|
|
61
|
+
│ ├── utils/ # Shared pure functions
|
|
62
|
+
│ │ └── package.json
|
|
63
|
+
│ └── db/ # Shared database client + schemas
|
|
64
|
+
│ └── package.json
|
|
65
|
+
├── turbo.json
|
|
66
|
+
├── pnpm-workspace.yaml
|
|
67
|
+
├── package.json # Root — devDependencies only
|
|
68
|
+
└── tsconfig.base.json # Shared TS config extended by all
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
285
72
|
|
|
73
|
+
## pnpm Workspace Setup
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
# pnpm-workspace.yaml
|
|
77
|
+
packages:
|
|
78
|
+
- "apps/*"
|
|
79
|
+
- "packages/*"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
// Root package.json
|
|
84
|
+
{
|
|
85
|
+
"name": "my-monorepo",
|
|
86
|
+
"private": true,
|
|
87
|
+
"scripts": {
|
|
88
|
+
"dev": "turbo run dev",
|
|
89
|
+
"build": "turbo run build",
|
|
90
|
+
"lint": "turbo run lint",
|
|
91
|
+
"test": "turbo run test",
|
|
92
|
+
"clean": "turbo run clean"
|
|
93
|
+
},
|
|
94
|
+
"devDependencies": {
|
|
95
|
+
"turbo": "^2.0.0"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
// packages/ui/package.json
|
|
102
|
+
{
|
|
103
|
+
"name": "@myorg/ui",
|
|
104
|
+
"version": "0.0.0",
|
|
105
|
+
"private": true,
|
|
106
|
+
"main": "./src/index.ts",
|
|
107
|
+
"types": "./src/index.ts",
|
|
108
|
+
"exports": {
|
|
109
|
+
".": "./src/index.ts",
|
|
110
|
+
"./button": "./src/button.tsx",
|
|
111
|
+
"./card": "./src/card.tsx"
|
|
112
|
+
},
|
|
113
|
+
"peerDependencies": {
|
|
114
|
+
"react": "^19.0.0",
|
|
115
|
+
"react-dom": "^19.0.0"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
// apps/web/package.json — consuming internal package
|
|
122
|
+
{
|
|
123
|
+
"name": "web",
|
|
124
|
+
"dependencies": {
|
|
125
|
+
"@myorg/ui": "workspace:*",
|
|
126
|
+
"@myorg/utils": "workspace:*"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Turborepo Configuration
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
// turbo.json
|
|
137
|
+
{
|
|
138
|
+
"$schema": "https://turbo.build/schema.json",
|
|
139
|
+
"globalDependencies": ["**/.env.*local"],
|
|
140
|
+
"tasks": {
|
|
141
|
+
"build": {
|
|
142
|
+
"dependsOn": ["^build"],
|
|
143
|
+
"outputs": ["dist/**", ".next/**", "!.next/cache/**"]
|
|
144
|
+
},
|
|
145
|
+
"dev": {
|
|
146
|
+
"cache": false,
|
|
147
|
+
"persistent": true
|
|
148
|
+
},
|
|
149
|
+
"lint": {
|
|
150
|
+
"dependsOn": ["^build"]
|
|
151
|
+
},
|
|
152
|
+
"test": {
|
|
153
|
+
"dependsOn": ["^build"],
|
|
154
|
+
"outputs": ["coverage/**"]
|
|
155
|
+
},
|
|
156
|
+
"clean": {
|
|
157
|
+
"cache": false
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
Key concepts:
|
|
165
|
+
"^build" = Run build in dependencies FIRST (topological)
|
|
166
|
+
"dependsOn" = Task ordering — lint waits for build
|
|
167
|
+
"outputs" = What gets cached — skip re-runs if unchanged
|
|
168
|
+
"persistent" = Long-running (dev servers) — never cached
|
|
169
|
+
"cache: false" = Always run, never skip
|
|
170
|
+
```
|
|
286
171
|
|
|
287
172
|
---
|
|
288
173
|
|
|
289
|
-
##
|
|
174
|
+
## Shared TypeScript Configuration
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
// tsconfig.base.json (root)
|
|
178
|
+
{
|
|
179
|
+
"compilerOptions": {
|
|
180
|
+
"strict": true,
|
|
181
|
+
"target": "ES2022",
|
|
182
|
+
"module": "ESNext",
|
|
183
|
+
"moduleResolution": "bundler",
|
|
184
|
+
"esModuleInterop": true,
|
|
185
|
+
"skipLibCheck": true,
|
|
186
|
+
"forceConsistentCasingInFileNames": true,
|
|
187
|
+
"declaration": true,
|
|
188
|
+
"declarationMap": true,
|
|
189
|
+
"sourceMap": true,
|
|
190
|
+
"isolatedModules": true,
|
|
191
|
+
"resolveJsonModule": true
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
```json
|
|
197
|
+
// apps/web/tsconfig.json
|
|
198
|
+
{
|
|
199
|
+
"extends": "../../tsconfig.base.json",
|
|
200
|
+
"compilerOptions": {
|
|
201
|
+
"jsx": "preserve",
|
|
202
|
+
"lib": ["dom", "dom.iterable", "ES2022"],
|
|
203
|
+
"outDir": "./dist"
|
|
204
|
+
},
|
|
205
|
+
"include": ["src/**/*", "../../packages/*/src/**/*"]
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Change Detection (Only Build What Changed)
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Turborepo — filter by affected packages
|
|
215
|
+
turbo run build --filter=...[HEAD~1] # packages changed since last commit
|
|
216
|
+
turbo run test --filter=web... # web app + its dependencies
|
|
217
|
+
turbo run lint --filter=@myorg/ui # specific package only
|
|
218
|
+
|
|
219
|
+
# CI: Only run tests for changed packages
|
|
220
|
+
turbo run test --filter="[origin/main...HEAD]"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```yaml
|
|
224
|
+
# GitHub Actions — with Turborepo cache
|
|
225
|
+
- name: Build & Test (cached)
|
|
226
|
+
run: npx turbo run build test lint --filter="[origin/main...HEAD]"
|
|
227
|
+
env:
|
|
228
|
+
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
|
229
|
+
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Versioning Strategies
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
238
|
+
│ Fixed (recommended for apps) │
|
|
239
|
+
│ All packages share one version. Simple. One changelog. │
|
|
240
|
+
│ Example: v1.2.3 applies to web, api, ui, utils, db │
|
|
241
|
+
├─────────────────────────────────────────────────────────────┤
|
|
242
|
+
│ Independent (for published libraries) │
|
|
243
|
+
│ Each package has its own version + changelog. │
|
|
244
|
+
│ Example: @myorg/ui@2.1.0, @myorg/utils@1.4.2 │
|
|
245
|
+
│ Tools: Changesets, Lerna │
|
|
246
|
+
├─────────────────────────────────────────────────────────────┤
|
|
247
|
+
│ Recommendation: │
|
|
248
|
+
│ Internal monorepo (1 team) → Fixed versioning │
|
|
249
|
+
│ Open-source multi-package → Independent + Changesets │
|
|
250
|
+
└─────────────────────────────────────────────────────────────┘
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Internal Package Design Rules
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
✅ Internal packages are "private": true — never published to npm
|
|
259
|
+
✅ Use workspace protocol: "@myorg/ui": "workspace:*"
|
|
260
|
+
✅ Export raw TypeScript (src/index.ts) — let the consuming app bundle it
|
|
261
|
+
✅ One package per domain: ui, utils, config, db — NOT one giant "shared"
|
|
262
|
+
✅ Peer dependencies for React/framework — don't bundle the framework
|
|
263
|
+
|
|
264
|
+
❌ Don't create a package for 1-2 functions — inline until it's reused 3+ times
|
|
265
|
+
❌ Don't publish internal packages to npm "just in case"
|
|
266
|
+
❌ Don't share mutable state across packages — each package is a pure module
|
|
267
|
+
❌ Don't put app-specific code in packages/ — only truly shared code
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Anti-Patterns
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
❌ Running all CI checks on every package for every PR — use affected detection
|
|
276
|
+
❌ Circular dependencies between packages — topological ordering must be acyclic
|
|
277
|
+
❌ Mixing CommonJS and ESM in the same monorepo — standardize on ESM
|
|
278
|
+
❌ Installing devDependencies in every package — hoist shared devDeps to root
|
|
279
|
+
❌ No lockfile — pnpm-lock.yaml MUST be committed
|
|
280
|
+
❌ Using relative paths (../../packages/ui) — use workspace:* protocol
|
|
281
|
+
❌ Giant "shared" package — splits into domain-focused packages
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
|
|
290
290
|
|
|
291
291
|
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
292
292
|
|
|
@@ -298,7 +298,7 @@ AI coding assistants often fall into specific bad habits when dealing with this
|
|
|
298
298
|
|
|
299
299
|
---
|
|
300
300
|
|
|
301
|
-
|
|
301
|
+
|
|
302
302
|
|
|
303
303
|
**Slash command: `/review` or `/tribunal-full`**
|
|
304
304
|
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
@@ -309,7 +309,7 @@ AI coding assistants often fall into specific bad habits when dealing with this
|
|
|
309
309
|
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
310
310
|
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
311
311
|
|
|
312
|
-
|
|
312
|
+
|
|
313
313
|
|
|
314
314
|
Review these questions before confirming output:
|
|
315
315
|
```
|
|
@@ -323,4 +323,12 @@ Review these questions before confirming output:
|
|
|
323
323
|
|
|
324
324
|
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
325
325
|
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
326
|
-
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
326
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
## Pre-Flight Checklist
|
|
330
|
+
- [ ] Have I reviewed the user's specific constraints and requests?
|
|
331
|
+
- [ ] Have I checked the environment for relevant existing implementations?
|
|
332
|
+
|
|
333
|
+
## VBC Protocol (Verification-Before-Completion)
|
|
334
|
+
You MUST verify existing code signatures and variables before attempting to modify or call them. No hallucination is permitted.
|