ccguard
Version:
Automated enforcement of net-negative LOC, complexity constraints, and quality standards for Claude code
77 lines • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.run = run;
const processHookData_1 = require("../hooks/processHookData");
const fs_1 = require("fs");
const path_1 = require("path");
const os_1 = require("os");
// Debug logging
const debugLog = (message) => {
const logPath = (0, path_1.join)((0, os_1.homedir)(), '.guard', 'debug.log');
(0, fs_1.appendFileSync)(logPath, `${new Date().toISOString()} - ${JSON.stringify(message)}\n`);
};
const FileStorage_1 = require("../storage/FileStorage");
const validator_1 = require("../validation/validator");
const ConfigLoader_1 = require("../config/ConfigLoader");
async function run(input, sessionId) {
const storage = new FileStorage_1.FileStorage(sessionId);
const configLoader = new ConfigLoader_1.ConfigLoader();
const validator = await (0, validator_1.createValidator)(storage, configLoader);
return (0, processHookData_1.processHookData)(input, {
storage,
validator,
configLoader,
});
}
// Only run if this is the main module
if (require.main === module) {
// Handle command line arguments
if (process.argv.length > 2) {
console.error('guard: Claude Code hook - no arguments expected');
process.exit(1);
}
let inputData = '';
process.stdin.setEncoding('utf8');
// Start reading immediately
process.stdin.resume();
// Set a timeout to prevent hanging
const timeout = setTimeout(() => {
console.error('guard: timeout waiting for input');
process.exit(1);
}, 5000);
process.stdin.on('data', (chunk) => {
inputData += chunk;
debugLog({ event: 'data_chunk', chunk });
});
process.stdin.on('end', async () => {
clearTimeout(timeout);
debugLog({ event: 'stdin_end', inputData });
try {
// Extract session ID from input if available
let sessionId;
try {
const parsed = JSON.parse(inputData);
sessionId = parsed.session_id;
}
catch {
// Ignore parse errors
}
const result = await run(inputData, sessionId);
debugLog({ event: 'result', result });
console.log(JSON.stringify(result));
}
catch (error) {
console.error('Failed to process hook data:', error);
const errorResult = {
decision: 'block',
reason: 'Error processing request. Please try again.',
};
console.log(JSON.stringify(errorResult));
}
finally {
process.exit(0);
}
});
}
//# sourceMappingURL=guard.js.map