Pulled ALL skills from 15 source repositories: - anthropics/skills: 16 (docs, design, MCP, testing) - obra/superpowers: 14 (TDD, debugging, agents, planning) - coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth) - better-auth/skills: 5 (auth patterns) - vercel-labs/agent-skills: 5 (React, design, Vercel) - antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo) - Plus 13 individual skills from various repos Mosaic Stack is not limited to coding — the Orchestrator and subagents serve coding, business, design, marketing, writing, logistics, analysis, and more. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
127 lines
1.9 KiB
Markdown
127 lines
1.9 KiB
Markdown
# Boundaries
|
|
|
|
**Experimental feature** - See [RFC](https://github.com/vercel/turborepo/discussions/9435)
|
|
|
|
Full docs: https://turborepo.dev/docs/reference/boundaries
|
|
|
|
Boundaries enforce package isolation by detecting:
|
|
|
|
1. Imports of files outside the package's directory
|
|
2. Imports of packages not declared in `package.json` dependencies
|
|
|
|
## Usage
|
|
|
|
```bash
|
|
turbo boundaries
|
|
```
|
|
|
|
Run this to check for workspace violations across your monorepo.
|
|
|
|
## Tags
|
|
|
|
Tags allow you to create rules for which packages can depend on each other.
|
|
|
|
### Adding Tags to a Package
|
|
|
|
```json
|
|
// packages/ui/turbo.json
|
|
{
|
|
"tags": ["internal"]
|
|
}
|
|
```
|
|
|
|
### Configuring Tag Rules
|
|
|
|
Rules go in root `turbo.json`:
|
|
|
|
```json
|
|
// turbo.json
|
|
{
|
|
"boundaries": {
|
|
"tags": {
|
|
"public": {
|
|
"dependencies": {
|
|
"deny": ["internal"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
This prevents `public`-tagged packages from importing `internal`-tagged packages.
|
|
|
|
### Rule Types
|
|
|
|
**Allow-list approach** (only allow specific tags):
|
|
|
|
```json
|
|
{
|
|
"boundaries": {
|
|
"tags": {
|
|
"public": {
|
|
"dependencies": {
|
|
"allow": ["public"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Deny-list approach** (block specific tags):
|
|
|
|
```json
|
|
{
|
|
"boundaries": {
|
|
"tags": {
|
|
"public": {
|
|
"dependencies": {
|
|
"deny": ["internal"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Restrict dependents** (who can import this package):
|
|
|
|
```json
|
|
{
|
|
"boundaries": {
|
|
"tags": {
|
|
"private": {
|
|
"dependents": {
|
|
"deny": ["public"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Using Package Names
|
|
|
|
Package names work in place of tags:
|
|
|
|
```json
|
|
{
|
|
"boundaries": {
|
|
"tags": {
|
|
"private": {
|
|
"dependents": {
|
|
"deny": ["@repo/my-pkg"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Key Points
|
|
|
|
- Rules apply transitively (dependencies of dependencies)
|
|
- Helps enforce architectural boundaries at scale
|
|
- Catches violations before runtime/build errors
|