{"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":"Error","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/01e15490f04e29cfefe3896951f43db46994d8ee/scripts/lib/package-manager.js#L238-L274","documentation":"Thrown by setPreferredPackageManager when saveConfig(config) throws while writing the global preference file (~/.claude/package-manager.json via getConfigPath). The underlying write error (permission, ENOSPC, ENOENT for a missing ~/.claude, EISDIR) is wrapped with context so the caller knows the preference was validated but could not be persisted. The in-memory config is not rolled back because saveConfig is the failing step.","triggerScenarios":"Fires in the catch of saveConfig inside setPreferredPackageManager. Occurs when writeFile to getConfigPath() fails: ~/.claude does not exist, the path is not writable by the current user, the disk is full, the path resolves to a directory, or a read-only HOME (container/sandbox).","commonSituations":"First run on a system where ~/.claude was never created and utils.writeFile does not mkdir; HOME points to a read-only or non-existent dir; running as a user without write access to HOME; disk full; ~/.claude accidentally turned into a regular file or owned by root.","solutions":["Create ~/.claude and ensure it is writable: mkdir -p ~/.claude && chown -R $USER ~/.claude.","Verify HOME is set and writable: echo $HOME and touch \"$HOME/.claude/test\".","Free disk space if ENOSPC; remove the path if it is a directory/file conflict (EISDIR/EEXIST).","Run the tool as the user that owns HOME rather than a restricted service account."],"exampleFix":"# before: ~/.claude missing or owned by root\nsetPreferredPackageManager('pnpm'); // throws [297]\n\n# after: ensure writable config dir\nmkdir -p ~/.claude\nsudo chown -R \"$USER:$USER\" ~/.claude\n# then re-run\nsetPreferredPackageManager('pnpm');","handlingStrategy":"try-catch","validationCode":"const fs = require('fs'); const path = require('path');\nfunction assertGlobalConfigWritable() {\n  const { getClaudeDir } = require('./scripts/lib/utils');\n  const dir = getClaudeDir();\n  fs.mkdirSync(dir, { recursive: true });\n  const probe = path.join(dir, '.ecc-write-probe');\n  fs.writeFileSync(probe, ''); fs.unlinkSync(probe);\n}\nassertGlobalConfigWritable();\nsetPreferredPackageManager('pnpm');","typeGuard":"null","tryCatchPattern":"try {\n  setPreferredPackageManager(pmName);\n} catch (err) {\n  if (/Failed to save package manager preference/.test(err.message)) {\n    // ensure ~/.claude exists and is writable, then retry once\n    fs.mkdirSync(path.join(os.homedir(), '.claude'), { recursive: true });\n    setPreferredPackageManager(pmName);\n  } else throw err;\n}","preventionTips":["Ensure ~/.claude exists and is owned by the current user before first run.","Verify HOME is set and writable in containers/CI.","Free disk space if writes start failing with ENOSPC.","Run ECC as the user that owns HOME, not as a service account without a real home."],"tags":["package-manager","filesystem","permissions","global-config","write-error"],"backgroundTag":null,"analyzedSha":"01e15490f04e29cfefe3896951f43db46994d8ee","analyzedAt":"2026-08-13T00:31:08.655Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}