{"record":{"id":"2375597ffb8e701a","repo":"nocobase/nocobase","slug":"cannot-determine-nocobase-devtools-version-becaus","errorCode":null,"errorMessage":"Cannot determine @nocobase/devtools version because dependencies[\"@nocobase/app\"] is missing.","messagePattern":"Cannot determine @nocobase/devtools version because dependencies\\[\"@nocobase/app\"\\] is missing\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/cli/src/lib/app-managed-resources.ts","lineNumber":579,"sourceCode":"    onStartTask?: (message: string) => void;\n    onSucceedTask?: (message: string) => void;\n    onFailTask?: (message: string) => void;\n  },\n): Promise<void> {\n  if (runtime.source !== 'npm') {\n    return;\n  }\n\n  let taskStarted = false;\n  try {\n    const packageJson = await readPackageJson(runtime.projectRoot);\n    const appVersion = getStringDependency(packageJson, 'dependencies', '@nocobase/app');\n    const devtoolsVersion = getStringDependency(packageJson, 'devDependencies', '@nocobase/devtools');\n    let updatedPackageJson = false;\n\n    if (!devtoolsVersion) {\n      if (!appVersion) {\n        throw new Error(\n          'Cannot determine @nocobase/devtools version because dependencies[\"@nocobase/app\"] is missing.',\n        );\n      }\n      const devDependencies = ensureDevDependencies(packageJson);\n      devDependencies['@nocobase/devtools'] = appVersion;\n      updatedPackageJson = true;\n      await writeFile(\n        path.join(runtime.projectRoot, 'package.json'),\n        `${JSON.stringify(packageJson, null, 2)}\\n`,\n        'utf-8',\n      );\n    }\n\n    const needsInstall = updatedPackageJson || !hasNpmSourceDevtools(runtime.projectRoot);\n    if (!needsInstall) {\n      return;\n    }\n","sourceCodeStart":561,"sourceCodeEnd":597,"githubUrl":"https://github.com/nocobase/nocobase/blob/fa42722fefe44265490dff2c27d79e2882bce4fa/packages/core/cli/src/lib/app-managed-resources.ts#L561-L597","documentation":"In an npm-sourced local app, ensureNpmSourceDevDependencies pins `@nocobase/devtools` in devDependencies to the same version as `@nocobase/app`. If package.json has no devtools version AND no dependencies['@nocobase/app'], the target version cannot be determined, so this explicit Error is thrown.","triggerScenarios":"Calling ensureNpmSourceDevDependencies (via `run`) on a project whose package.json lacks both devDependencies['@nocobase/devtools'] and dependencies['@nocobase/app'].","commonSituations":"A hand-edited or pruned package.json that removed @nocobase/app; initializing devtools tooling in a project that was not created from the NocoBase app template; dependency renamed or moved to another section.","solutions":["Add \"@nocobase/app\" to dependencies in the project's package.json with the intended version.","Alternatively add \"@nocobase/devtools\" to devDependencies explicitly so no version inference is needed.","Recreate the project via the official scaffold to get a correct package.json.","Ensure you are running the command in the intended projectRoot (the package.json read there may be the wrong one)."],"exampleFix":"// before (package.json)\n{\n  \"dependencies\": {}\n}\n// after\n{\n  \"dependencies\": {\n    \"@nocobase/app\": \"1.x.x\"\n  }\n}","handlingStrategy":"validation","validationCode":"const pkg = JSON.parse(await fs.readFile(path.join(projectRoot, 'package.json'), 'utf-8'));\nif (!pkg.dependencies?.['@nocobase/app'] && !pkg.devDependencies?.['@nocobase/devtools']) {\n  throw new Error('Add @nocobase/app to dependencies or @nocobase/devtools to devDependencies first.');\n}","typeGuard":"function hasDevtoolsVersion(pkg: unknown): pkg is { devDependencies: { '@nocobase/devtools': string } } {\n  return typeof pkg === 'object' && pkg !== null &&\n    typeof (pkg as any).devDependencies?.['@nocobase/devtools'] === 'string';\n}","tryCatchPattern":"try {\n  await ensureNpmSourceDevDependencies(runtime, opts);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('@nocobase/app')) {\n    // fix package.json, then retry\n  }\n  throw e;\n}","preventionTips":["Never remove @nocobase/app from dependencies of an npm-sourced project.","Create projects only via the official NocoBase scaffold.","Validate package.json after manual edits (npm pkg get dependencies.'@nocobase/app').","Pin @nocobase/devtools explicitly if you manage versions by hand."],"tags":["cli","package-json","dependencies","configuration"],"backgroundTag":"missing-dependency","analyzedSha":"fa42722fefe44265490dff2c27d79e2882bce4fa","analyzedAt":"2026-09-01T00:54:31.202Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}