{"record":{"id":"bf048e7206949e01","repo":"paperclipai/paperclip","slug":"managed-installs-require-node-js-20-or-newer-foun","errorCode":null,"errorMessage":"Managed installs require Node.js 20 or newer (found ${process.version}).","messagePattern":"Managed installs require Node\\.js 20 or newer \\(found (.+?)\\)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/install.ts","lineNumber":89,"sourceCode":"      const dependencies = packageJson[section];\n      if (!dependencies || typeof dependencies !== \"object\") continue;\n      for (const dependencyName of Object.keys(dependencies)) {\n        if (dependencyName.startsWith(\"@paperclipai/\")) visit(dependencyName);\n      }\n    }\n    visiting.delete(packageName);\n    visited.add(packageName);\n    ordered.push(entry);\n  };\n\n  visit(\"@paperclipai/server\");\n  return ordered;\n}\n\nfunction assertSupportedNodeVersion(): void {\n  const major = Number(process.versions.node.split(\".\")[0]);\n  if (!Number.isFinite(major) || major < 20) {\n    throw new Error(`Managed installs require Node.js 20 or newer (found ${process.version}).`);\n  }\n}\n\nexport function resolveNpmInstallRequest(options: InstallOptions): {\n  spec: string;\n  channel: InstallChannel;\n} {\n  if (options.canary && options.version) throw new Error(\"Choose either --canary or --version, not both.\");\n  if (options.version) {\n    const version = options.version.trim();\n    if (!EXACT_VERSION_PATTERN.test(version)) {\n      throw new Error(`--version requires an exact published version, received '${options.version}'.`);\n    }\n    return { spec: version, channel: \"pinned\" };\n  }\n  return options.canary ? { spec: \"canary\", channel: \"canary\" } : { spec: \"latest\", channel: \"latest\" };\n}\n","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/paperclipai/paperclip/blob/67001ec6eb96ae601aa27bc91d9b2415d665334a/cli/src/commands/install.ts#L71-L107","documentation":"Thrown by assertSupportedNodeVersion (install.ts:89) when the running Node.js major version is below 20 or unparseable. The managed installer requires Node 20+ for the runtime APIs and ESM features it relies on; older versions are rejected before any install work begins.","triggerScenarios":"Invoking the managed installer under Node 18.x, 16.x, or older. process.versions.node is split on '.' and the major is parsed; non-finite or < 20 fails.","commonSituations":"A system with an outdated default Node, an nvm/fnm shell that did not switch, a CI image pinned to an old Node LTS, or a container with the wrong tag.","solutions":["Upgrade to Node 20 or newer (prefer an LTS): nvm install 20 && nvm use 20, or update fnm/volta.","In CI, set the image/node-version to >=20.","Confirm with `node --version` before re-running the installer."],"exampleFix":"# before\nnode --version  # v18.x\n# after\nnvm install 20 && nvm use 20 && node --version  # v20.x","handlingStrategy":"validation","validationCode":"function assertNode20(): void {\n  const major = Number(process.versions.node.split('.')[0]);\n  if (!Number.isFinite(major) || major < 20) {\n    throw new Error(`Node 20+ required, found ${process.version}.`);\n  }\n}\n\nassertNode20();","typeGuard":"function isNodeVersionSupported(): boolean {\n  const major = Number(process.versions.node.split('.')[0]);\n  return Number.isFinite(major) && major >= 20;\n}","tryCatchPattern":null,"preventionTips":["Pin your environment to a Node 20+ LTS.","In CI, set the node-version to >=20.","Run `node --version` before invoking the managed installer."],"tags":["cli","install","node-version","runtime-requirements"],"backgroundTag":null,"analyzedSha":"67001ec6eb96ae601aa27bc91d9b2415d665334a","analyzedAt":"2026-08-12T12:05:45.408Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}