repomix
Version:
A tool to pack repository contents to single file for AI consumption
94 lines (90 loc) • 2.87 kB
JavaScript
import { constants } from 'node:fs';
import * as fs from 'node:fs/promises';
import { platform } from 'node:os';
import { logger } from '../../shared/logger.js';
export class PermissionError extends Error {
path;
code;
constructor(message, path, code) {
super(message);
this.path = path;
this.code = code;
this.name = 'PermissionError';
}
}
export const checkDirectoryPermissions = async (dirPath) => {
try {
await fs.readdir(dirPath);
const details = {
read: false,
write: false,
execute: false,
};
try {
await fs.access(dirPath, constants.R_OK);
details.read = true;
}
catch { }
try {
await fs.access(dirPath, constants.W_OK);
details.write = true;
}
catch { }
try {
await fs.access(dirPath, constants.X_OK);
details.execute = true;
}
catch { }
const hasAllPermissions = details.read && details.write && details.execute;
if (!hasAllPermissions) {
return {
hasAllPermission: false,
details,
};
}
return {
hasAllPermission: true,
details,
};
}
catch (error) {
if (error instanceof Error && 'code' in error) {
switch (error.code) {
case 'EPERM':
case 'EACCES':
case 'EISDIR':
return {
hasAllPermission: false,
error: new PermissionError(getMacOSPermissionMessage(dirPath, error.code), dirPath, error.code),
};
default:
logger.debug('Directory permission check error:', error);
return {
hasAllPermission: false,
error: error,
};
}
}
return {
hasAllPermission: false,
error: error instanceof Error ? error : new Error(String(error)),
};
}
};
const getMacOSPermissionMessage = (dirPath, errorCode) => {
if (platform() === 'darwin') {
return `Permission denied: Cannot access '${dirPath}', error code: ${errorCode}.
This error often occurs when macOS security restrictions prevent access to the directory.
To fix this:
1. Open System Settings
2. Navigate to Privacy & Security > Files and Folders
3. Find your terminal app (Terminal.app, iTerm2, VS Code, etc.)
4. Grant necessary folder access permissions
If your terminal app is not listed:
- Try running repomix command again
- When prompted by macOS, click "Allow"
- Restart your terminal app if needed
`;
}
return `Permission denied: Cannot access '${dirPath}'`;
};