39 lines
1.2 KiB
Python
Executable File
39 lines
1.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""PostToolUse:Edit/Write — append one-line audit record to .claude/audit.jsonl."""
|
|
import datetime as dt
|
|
import json
|
|
import os
|
|
import sys
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
from _lib import read_input, warn_to_stderr # noqa
|
|
|
|
REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
AUDIT = os.path.join(REPO, ".claude", "audit.jsonl")
|
|
|
|
|
|
def main() -> None:
|
|
data = read_input()
|
|
target = data.get("tool_input", {}).get("file_path") or data.get("tool_input", {}).get("notebook_path") or ""
|
|
if target.startswith(REPO + "/"):
|
|
target = target[len(REPO) + 1:]
|
|
|
|
record = {
|
|
"ts": dt.datetime.now(dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
"tool": data.get("tool_name", "unknown"),
|
|
"file": target,
|
|
"ok": data.get("tool_response", {}).get("success", True),
|
|
}
|
|
try:
|
|
with open(AUDIT, "a") as f:
|
|
f.write(json.dumps(record) + "\n")
|
|
except Exception:
|
|
pass # never block tool execution on audit-write failure
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except Exception as e:
|
|
warn_to_stderr(f"[audit hook error] {e}")
|
|
sys.exit(0)
|