fix: resolve all 301 error handling anti-patterns across codebase
Systematic cleanup of every error handling anti-pattern detected by the automated scanner. 289 issues fixed via code changes, 12 approved with specific technical justifications. Changes across 90 files: - GENERIC_CATCH (141): Added instanceof Error type discrimination - LARGE_TRY_BLOCK (82): Extracted helper methods to narrow try scope to ≤10 lines - NO_LOGGING_IN_CATCH (65): Added logger/console calls for error visibility - CATCH_AND_CONTINUE_CRITICAL_PATH (10): Added throw/return or approved overrides - ERROR_STRING_MATCHING (2): Approved with rationale (no typed error classes) - ERROR_MESSAGE_GUESSING (1): Replaced chained .includes() with documented pattern array - PROMISE_CATCH_NO_LOGGING (1): Added logging to .catch() handler Also fixes a detector bug where nested try/catch inside a catch block corrupted brace-depth tracking, causing false positives. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
+50
-50
@@ -121,8 +121,8 @@ export function loadClaudeMemEnv(): ClaudeMemEnv {
|
||||
if (parsed.OPENROUTER_API_KEY) result.OPENROUTER_API_KEY = parsed.OPENROUTER_API_KEY;
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
logger.warn('ENV', 'Failed to load .env file', { path: ENV_FILE_PATH }, error as Error);
|
||||
} catch (error: unknown) {
|
||||
logger.warn('ENV', 'Failed to load .env file', { path: ENV_FILE_PATH }, error instanceof Error ? error : new Error(String(error)));
|
||||
return {};
|
||||
}
|
||||
}
|
||||
@@ -131,60 +131,60 @@ export function loadClaudeMemEnv(): ClaudeMemEnv {
|
||||
* Save credentials to ~/.claude-mem/.env
|
||||
*/
|
||||
export function saveClaudeMemEnv(env: ClaudeMemEnv): void {
|
||||
// Ensure directory exists with restricted permissions (owner only)
|
||||
if (!existsSync(DATA_DIR)) {
|
||||
mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });
|
||||
}
|
||||
// Fix permissions on pre-existing directories (mode: is only applied on creation)
|
||||
// Note: On Windows, chmod has no effect — permissions are controlled via ACLs.
|
||||
chmodSync(DATA_DIR, 0o700);
|
||||
|
||||
// Load existing to preserve any extra keys
|
||||
const existing = existsSync(ENV_FILE_PATH)
|
||||
? parseEnvFile(readFileSync(ENV_FILE_PATH, 'utf-8'))
|
||||
: {};
|
||||
|
||||
// Update with new values
|
||||
const updated: Record<string, string> = { ...existing };
|
||||
|
||||
// Only update managed keys
|
||||
if (env.ANTHROPIC_API_KEY !== undefined) {
|
||||
if (env.ANTHROPIC_API_KEY) {
|
||||
updated.ANTHROPIC_API_KEY = env.ANTHROPIC_API_KEY;
|
||||
} else {
|
||||
delete updated.ANTHROPIC_API_KEY;
|
||||
}
|
||||
}
|
||||
if (env.ANTHROPIC_BASE_URL !== undefined) {
|
||||
if (env.ANTHROPIC_BASE_URL) {
|
||||
updated.ANTHROPIC_BASE_URL = env.ANTHROPIC_BASE_URL;
|
||||
} else {
|
||||
delete updated.ANTHROPIC_BASE_URL;
|
||||
}
|
||||
}
|
||||
if (env.GEMINI_API_KEY !== undefined) {
|
||||
if (env.GEMINI_API_KEY) {
|
||||
updated.GEMINI_API_KEY = env.GEMINI_API_KEY;
|
||||
} else {
|
||||
delete updated.GEMINI_API_KEY;
|
||||
}
|
||||
}
|
||||
if (env.OPENROUTER_API_KEY !== undefined) {
|
||||
if (env.OPENROUTER_API_KEY) {
|
||||
updated.OPENROUTER_API_KEY = env.OPENROUTER_API_KEY;
|
||||
} else {
|
||||
delete updated.OPENROUTER_API_KEY;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// Ensure directory exists with restricted permissions (owner only)
|
||||
if (!existsSync(DATA_DIR)) {
|
||||
mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });
|
||||
}
|
||||
// Fix permissions on pre-existing directories (mode: is only applied on creation)
|
||||
// Note: On Windows, chmod has no effect — permissions are controlled via ACLs.
|
||||
chmodSync(DATA_DIR, 0o700);
|
||||
|
||||
// Load existing to preserve any extra keys
|
||||
const existing = existsSync(ENV_FILE_PATH)
|
||||
? parseEnvFile(readFileSync(ENV_FILE_PATH, 'utf-8'))
|
||||
: {};
|
||||
|
||||
// Update with new values
|
||||
const updated: Record<string, string> = { ...existing };
|
||||
|
||||
// Only update managed keys
|
||||
if (env.ANTHROPIC_API_KEY !== undefined) {
|
||||
if (env.ANTHROPIC_API_KEY) {
|
||||
updated.ANTHROPIC_API_KEY = env.ANTHROPIC_API_KEY;
|
||||
} else {
|
||||
delete updated.ANTHROPIC_API_KEY;
|
||||
}
|
||||
}
|
||||
if (env.ANTHROPIC_BASE_URL !== undefined) {
|
||||
if (env.ANTHROPIC_BASE_URL) {
|
||||
updated.ANTHROPIC_BASE_URL = env.ANTHROPIC_BASE_URL;
|
||||
} else {
|
||||
delete updated.ANTHROPIC_BASE_URL;
|
||||
}
|
||||
}
|
||||
if (env.GEMINI_API_KEY !== undefined) {
|
||||
if (env.GEMINI_API_KEY) {
|
||||
updated.GEMINI_API_KEY = env.GEMINI_API_KEY;
|
||||
} else {
|
||||
delete updated.GEMINI_API_KEY;
|
||||
}
|
||||
}
|
||||
if (env.OPENROUTER_API_KEY !== undefined) {
|
||||
if (env.OPENROUTER_API_KEY) {
|
||||
updated.OPENROUTER_API_KEY = env.OPENROUTER_API_KEY;
|
||||
} else {
|
||||
delete updated.OPENROUTER_API_KEY;
|
||||
}
|
||||
}
|
||||
|
||||
writeFileSync(ENV_FILE_PATH, serializeEnvFile(updated), { encoding: 'utf-8', mode: 0o600 });
|
||||
// Explicitly set permissions in case the file already existed before this fix.
|
||||
// writeFileSync's mode option only applies on file creation (O_CREAT), not on overwrites.
|
||||
// Note: On Windows, chmod has no effect — permissions are controlled via ACLs.
|
||||
chmodSync(ENV_FILE_PATH, 0o600);
|
||||
} catch (error) {
|
||||
logger.error('ENV', 'Failed to save .env file', { path: ENV_FILE_PATH }, error as Error);
|
||||
} catch (error: unknown) {
|
||||
logger.error('ENV', 'Failed to save .env file', { path: ENV_FILE_PATH }, error instanceof Error ? error : new Error(String(error)));
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user