{"record":{"id":"e04a2bca4c2ac1f8","repo":"yarnpkg/yarn","slug":"linkmissing","errorCode":null,"errorMessage":"linkMissing","messagePattern":"linkMissing","errorType":"exception","errorClass":"MessageError","httpStatus":null,"severity":"error","filePath":"src/cli/commands/link.js","lineNumber":48,"sourceCode":"export function setFlags(commander: Object) {\n  commander.description('Symlink a package folder during development.');\n}\n\nexport async function run(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {\n  if (args.length) {\n    for (const name of args) {\n      const src = path.join(config.linkFolder, name);\n\n      if (await fs.exists(src)) {\n        const folder = await getRegistryFolder(config, name);\n        const dest = path.join(folder, name);\n\n        await fs.unlink(dest);\n        await fs.mkdirp(path.dirname(dest));\n        await fs.symlink(src, dest);\n        reporter.success(reporter.lang('linkUsing', name));\n      } else {\n        throw new MessageError(reporter.lang('linkMissing', name));\n      }\n    }\n  } else {\n    // add cwd module to the global registry\n    const manifest = await config.readRootManifest();\n    const name = manifest.name;\n    if (!name) {\n      throw new MessageError(reporter.lang('unknownPackageName'));\n    }\n\n    const linkLoc = path.join(config.linkFolder, name);\n    if (await fs.exists(linkLoc)) {\n      reporter.warn(reporter.lang('linkCollision', name));\n    } else {\n      await fs.mkdirp(path.dirname(linkLoc));\n      await fs.symlink(config.cwd, linkLoc);\n\n      // If there is a `bin` defined in the package.json,","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/yarnpkg/yarn/blob/c2dda503f3759b5be5f0e24ecd9cf5c97a540147/src/cli/commands/link.js#L30-L66","documentation":"`yarn link <name>` consumes a link previously registered in the global link folder (config.linkFolder). The code builds `src = path.join(config.linkFolder, name)` at link.js:45 and only symlinks when `fs.exists(src)` is true; otherwise it throws linkMissing. So the named package was never `yarn link`-registered in its own directory.","triggerScenarios":"Running `yarn link foo` when `foo` was never made linkable (no prior `yarn link` run inside foo's dir), or when the registered name differs (typo, scoped-name casing).","commonSituations":"Forgetting the producer-side `yarn link` step; cross-machine where links live per-user; scoped package registered as `@scope/name` but consumed as `name`.","solutions":["In the package you want to consume, `cd` into its directory and run `yarn link` (registers it in config.linkFolder).","Then run `yarn link <name>` in the consumer, using the exact `name` from the producer's package.json.","Verify the link folder: `ls $(yarn global dir)/node_modules` to see registered link names.","Check for typos / scope prefix mismatch against the producer package.json `name` field."],"exampleFix":"# before (in consumer)\n$ yarn link mylib  # throws linkMissing\n# after\n$ cd ~/code/mylib && yarn link   # producer side\n$ cd ~/code/consumer && yarn link mylib","handlingStrategy":"validation","validationCode":"const path = require('path');\nconst fsp = require('fs').promises;\nasync function assertLinkable(config, name) {\n  const src = path.join(config.linkFolder, name);\n  try {\n    await fsp.access(src);\n    return true;\n  } catch {\n    throw new Error(`No link registered for '${name}'. Run 'yarn link' in its package dir first.`);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  await runYarn(['link', name]);\n} catch (e) {\n  if (/linkMissing/.test(e.message)) {\n    console.error(`'${name}' is not registered. Create it first with 'yarn link' in its source dir.`);\n    return;\n  }\n  throw e;\n}","preventionTips":["Always run the producer-side `yarn link` before the consumer-side `yarn link <name>`.","Use the exact `name` from the producer's package.json, including scope.","List registered links under `$(yarn global dir)/node_modules` to verify before consuming."],"tags":["cli","link","symlink","global"],"backgroundTag":null,"analyzedSha":"c2dda503f3759b5be5f0e24ecd9cf5c97a540147","analyzedAt":"2026-08-13T04:17:06.305Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}