paperclipai/paperclip · error
Refusing to modify non-regular shell rc file
Error message
Refusing to modify non-regular shell rc file ${rcPath}. What it means
addManagedPathBlock lstat'ed the shell rc file and found it is not a regular unlinked file, so the guard refuses to append the PATH block to unsafe rc files (e.g. symlinks).
Solutions
- Ensure ${rcPath} is a regular file (not a symlink or device) owned by you, then retry.
- Update your shell rc file manually.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at cli/src/install-store.ts:428 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-08-18).
Data as JSON: /api/errors/38af71133f796e4c.
Report an issue: GitHub.
Appendix: source
Thrown at cli/src/install-store.ts:434
fs.rmSync(paths.shimPath, { force: true });
return true;
} catch (error) {
if ((error as NodeJS.ErrnoException).code === "ENOENT") return true;
throw error;
}
}
export function managedPathBlock(): string {
return `${PATH_BLOCK_START}\nexport PATH="$HOME/.local/bin:$PATH"\n${PATH_BLOCK_END}`;
}
export function addManagedPathBlock(rcPath: string): boolean {
let existing = "";
let mode = 0o600;
try {
const stat = fs.lstatSync(rcPath);
if (!stat.isFile() || stat.isSymbolicLink()) {
throw new Error(`Refusing to modify non-regular shell rc file ${rcPath}.`);
}
assertOwnedByCurrentUser(stat, rcPath);
mode = stat.mode & 0o777;
existing = fs.readFileSync(rcPath, "utf8");
} catch (error) {
if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
}
if (existing.includes(PATH_BLOCK_START)) return false;
fs.mkdirSync(path.dirname(rcPath), { recursive: true });
const prefix = existing.length > 0 && !existing.endsWith("\n") ? "\n" : "";
writeFileAtomic(rcPath, `${existing}${prefix}${managedPathBlock()}\n`, mode);
return true;
}
export function removeManagedPathBlock(rcPath: string): boolean {
let existing: string;
let mode: number;
try {View on GitHub (pinned to 01ad858492)