46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
/**
|
|
* event-collector.js
|
|
* Called automatically by Claude Code PostToolUse hook.
|
|
* Reads tool payload from stdin, appends a lightweight JSONL entry to logs/events.jsonl.
|
|
* Never throws — a crash here would interrupt Claude Code sessions.
|
|
*/
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
const LOG_FILE = path.join(__dirname, '../logs/events.jsonl');
|
|
|
|
// Only track tools that indicate real work
|
|
const TRACKED_TOOLS = new Set(['Edit', 'Write', 'Bash', 'NotebookEdit']);
|
|
|
|
let raw = '';
|
|
process.stdin.setEncoding('utf8');
|
|
process.stdin.on('data', chunk => { raw += chunk; });
|
|
process.stdin.on('end', () => {
|
|
try {
|
|
const payload = JSON.parse(raw);
|
|
const tool = payload.tool_name;
|
|
|
|
if (!TRACKED_TOOLS.has(tool)) process.exit(0);
|
|
|
|
const input = payload.tool_input || {};
|
|
const entry = {
|
|
ts: new Date().toISOString(),
|
|
tool,
|
|
// file_path for Edit/Write, truncated command for Bash
|
|
target: input.file_path
|
|
? path.basename(input.file_path)
|
|
: (input.command || '').slice(0, 80) || null,
|
|
ok: !(payload.tool_response?.is_error ?? false)
|
|
};
|
|
|
|
fs.appendFileSync(LOG_FILE, JSON.stringify(entry) + '\n', 'utf8');
|
|
} catch {
|
|
// Silent fail — never interrupt Claude Code
|
|
}
|
|
process.exit(0);
|
|
});
|