{"record":{"id":"da0409b431590f21","repo":"affaan-m/ECC","slug":"failed-to-save-package-manager-preference-err-m","errorCode":null,"errorMessage":"Failed to save package manager preference: ${err.message}","messagePattern":"Failed to save package manager preference: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/package-manager.js","lineNumber":256,"sourceCode":"  };\n}\n\n/**\n * Set user's preferred package manager (global)\n */\nfunction setPreferredPackageManager(pmName) {\n  if (!PACKAGE_MANAGERS[pmName]) {\n    throw new Error(`Unknown package manager: ${pmName}`);\n  }\n\n  const config = loadConfig() || {};\n  config.packageManager = pmName;\n  config.setAt = new Date().toISOString();\n\n  try {\n    saveConfig(config);\n  } catch (err) {\n    throw new Error(`Failed to save package manager preference: ${err.message}`);\n  }\n\n  return config;\n}\n\n/**\n * Set project's preferred package manager\n */\nfunction setProjectPackageManager(pmName, projectDir = process.cwd()) {\n  if (!PACKAGE_MANAGERS[pmName]) {\n    throw new Error(`Unknown package manager: ${pmName}`);\n  }\n\n  const configDir = path.join(projectDir, '.claude');\n  const configPath = path.join(configDir, 'package-manager.json');\n\n  const config = {\n    packageManager: pmName,","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/package-manager.js#L238-L274","documentation":"After validating the package manager name, setPreferredPackageManager persists the choice via saveConfig; if persistence fails, the original error is wrapped as 'Failed to save package manager preference: <reason>'. The write step is intentionally guarded so I/O problems surface with context.","triggerScenarios":"saveConfig throws because the config directory is missing/unwritable, a permission error occurs on ~/.claude or the config file, or the disk is full. The inner err.message is appended to the thrown message.","commonSituations":"Read-only home directory or NFS mount; ~/.claude path owned by another user; corrupted config JSON that saveConfig cannot rewrite; running in a container with a read-only filesystem.","solutions":["Read the appended err.message to identify the underlying cause (EACCES, ENOSPC, EROFS, syntax error).","Ensure the config directory exists and is writable by the current user (check ownership of ~/.claude).","Fix or delete a corrupted config file so saveConfig can rewrite it.","Free disk space if the error indicates ENOSPC, then retry the setter."],"exampleFix":"// before\nsetPreferredPackageManager('pnpm'); // throws: Failed to save... EACCES\n// after\ntry {\n  setPreferredPackageManager('pnpm');\n} catch (e) {\n  console.error('Config write failed:', e.message); // inspect underlying cause\n  fs.mkdirSync(configDir, { recursive: true });\n  setPreferredPackageManager('pnpm');\n}","handlingStrategy":"try-catch","validationCode":"import fs from 'node:fs';\nconst configDir = os.homedir() + '/.claude';\nfs.accessSync(configDir, fs.constants.W_OK); // throws early if not writable","typeGuard":"null","tryCatchPattern":"try {\n  setPreferredPackageManager('pnpm');\n} catch (e) {\n  if (e.message.startsWith('Failed to save package manager preference')) {\n    // inspect e.message for EACCES/ENOSPC/EROFS and remediate\n    console.error(e.message);\n  } else throw e;\n}","preventionTips":["Verify the global config directory exists and is writable before setting preferences","Watch for read-only home/NFS mounts in containers","Fix corrupted config files promptly instead of retrying blindly","Surface the wrapped err.message in your tooling for diagnosis"],"tags":["filesystem","config","persistence"],"backgroundTag":"file-write-failed","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}