Files
everything-claude-code/scripts/hooks/check-console-log.js
Affaan Mustafa 18c5a76a96 fix: improve error handling, fix bugs, and optimize core libraries
utils.js:
- Fix countInFile: enforce global flag on regex to prevent silent
  under-counting (match() without /g returns only first match)
- Add 5s timeout to readStdinJson to prevent hooks hanging forever
- Handle EEXIST race condition in ensureDir
- Pre-compile regex patterns in getGitModifiedFiles to avoid N*M
  compilations and catch invalid patterns before filtering
- Add JSDoc documentation to all improved functions

session-manager.js:
- Fix getSessionById triple file read: pass pre-read content to
  getSessionStats instead of re-reading from disk
- Allow getSessionStats to accept content string directly

session-aliases.js:
- Wrap temp file cleanup in try/catch to prevent cascading errors

check-console-log.js:
- Refactor to use shared utils (isGitRepo, getGitModifiedFiles, log)
  instead of raw execSync calls
- Add exclusion patterns for test files, config files, and scripts/
  where console.log is intentional

session-end.js:
- Log count of skipped unparseable transcript lines for diagnostics

suggest-compact.js:
- Guard against NaN from corrupted counter files

package-manager.js:
- Remove dead fallbackOrder parameter (unused after #162 fix)
2026-02-12 07:06:53 -08:00

66 lines
1.6 KiB
JavaScript
Executable File

#!/usr/bin/env node
/**
* Stop Hook: Check for console.log statements in modified files
*
* Cross-platform (Windows, macOS, Linux)
*
* Runs after each response and checks if any modified JavaScript/TypeScript
* files contain console.log statements. Provides warnings to help developers
* remember to remove debug statements before committing.
*
* Exclusions: test files, config files, and scripts/ directory (where
* console.log is often intentional).
*/
const fs = require('fs');
const { isGitRepo, getGitModifiedFiles, log } = require('../lib/utils');
// Files where console.log is expected and should not trigger warnings
const EXCLUDED_PATTERNS = [
/\.test\.[jt]sx?$/,
/\.spec\.[jt]sx?$/,
/\.config\.[jt]s$/,
/scripts\//,
/__tests__\//,
/__mocks__\//,
];
let data = '';
process.stdin.on('data', chunk => {
data += chunk;
});
process.stdin.on('end', () => {
try {
if (!isGitRepo()) {
console.log(data);
process.exit(0);
}
const files = getGitModifiedFiles(['\\.tsx?$', '\\.jsx?$'])
.filter(f => fs.existsSync(f))
.filter(f => !EXCLUDED_PATTERNS.some(pattern => pattern.test(f)));
let hasConsole = false;
for (const file of files) {
const content = fs.readFileSync(file, 'utf8');
if (content.includes('console.log')) {
log(`[Hook] WARNING: console.log found in ${file}`);
hasConsole = true;
}
}
if (hasConsole) {
log('[Hook] Remove console.log statements before committing');
}
} catch {
// Silently ignore errors (git might not be available, etc.)
}
// Always output the original data
console.log(data);
});