| name | link-workspace-packages |
| description | Link workspace packages in monorepos (npm, yarn, bun). USE WHEN: (1) you just created or generated new packages and need to wire up their dependencies, (2) user imports from a sibling package and needs to add it as a dependency, (3) you get resolution errors for workspace packages (@org/*) like "cannot find module", "failed to resolve import", "TS2307", or "cannot resolve". DO NOT patch around with tsconfig paths or manual package.json edits - use the package manager's workspace commands to fix actual linking. |
Link Workspace Packages
Add dependencies between packages in a monorepo. All package managers support workspaces but with different syntax.
Detect Package Manager
Check whether there's a packageManager field in the root-level package.json.
Alternatively check lockfile in repo root:
package-lock.json → npm
yarn.lock → yarn
bun.lock / bun.lockb → bun
Workflow
- Identify consumer package (the one importing)
- Identify provider package(s) (being imported)
- Add dependency using package manager's workspace syntax
- Verify symlinks created in consumer's
node_modules/
yarn (v2+/berry)
Also uses workspace: protocol.
yarn workspace @org/app add @org/ui
Result in package.json:
{ "dependencies": { "@org/ui": "workspace:^" } }
npm
No workspace: protocol. npm auto-symlinks workspace packages.
npm install @org/ui --workspace @org/app
Result in package.json:
{ "dependencies": { "@org/ui": "*" } }
npm resolves to local workspace automatically during install.
bun
Supports workspace: protocol.
cd packages/app && bun add @org/ui
Result in package.json:
{ "dependencies": { "@org/ui": "workspace:*" } }
Examples
Example 1: npm - link multiple packages
npm install @org/data-access @org/ui --workspace @org/dashboard
Example 2: Debug "Cannot find module"
- Check if dependency is declared in consumer's
package.json
- If not, add it using appropriate command above
- Run install (
npm install, yarn install, or bun install)
Notes
- Symlinks appear in
<consumer>/node_modules/@org/<package>
- Hoisting differs by manager:
- npm/bun: hoist shared deps to root
node_modules
- yarn berry: uses Plug'n'Play by default (no
node_modules)
- Root
package.json should have "private": true to prevent accidental publish