- Extract atlas/ into 15 focused modules (hook, event handler, tool policies, types, etc.) - Split auto-update-checker into checker/ and hook/ subdirectories with single-purpose files - Decompose session-recovery into separate recovery strategy files per error type - Extract todo-continuation-enforcer from monolith to directory with dedicated modules - Split background-task/tools.ts into individual tool creator files - Extract command-executor, tmux-utils into focused sub-modules - Split config/schema.ts into domain-specific schema files - Decompose cli/config-manager.ts into focused modules - Rollback skill-mcp-manager, model-availability, index.ts splits that broke tests - Fix all import path depths for moved files (../../ -> ../../../) - Add explicit type annotations to resolve TS7006 implicit any errors Typecheck: 0 errors Tests: 2359 pass, 5 fail (all pre-existing)
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
interface NodeError extends Error {
|
|
code?: string
|
|
}
|
|
|
|
function isPermissionError(err: unknown): boolean {
|
|
const nodeErr = err as NodeError
|
|
return nodeErr?.code === "EACCES" || nodeErr?.code === "EPERM"
|
|
}
|
|
|
|
function isFileNotFoundError(err: unknown): boolean {
|
|
const nodeErr = err as NodeError
|
|
return nodeErr?.code === "ENOENT"
|
|
}
|
|
|
|
export function formatErrorWithSuggestion(err: unknown, context: string): string {
|
|
if (isPermissionError(err)) {
|
|
return `Permission denied: Cannot ${context}. Try running with elevated permissions or check file ownership.`
|
|
}
|
|
|
|
if (isFileNotFoundError(err)) {
|
|
return `File not found while trying to ${context}. The file may have been deleted or moved.`
|
|
}
|
|
|
|
if (err instanceof SyntaxError) {
|
|
return `JSON syntax error while trying to ${context}: ${err.message}. Check for missing commas, brackets, or invalid characters.`
|
|
}
|
|
|
|
const message = err instanceof Error ? err.message : String(err)
|
|
|
|
if (message.includes("ENOSPC")) {
|
|
return `Disk full: Cannot ${context}. Free up disk space and try again.`
|
|
}
|
|
|
|
if (message.includes("EROFS")) {
|
|
return `Read-only filesystem: Cannot ${context}. Check if the filesystem is mounted read-only.`
|
|
}
|
|
|
|
return `Failed to ${context}: ${message}`
|
|
}
|