File size: 3,493 Bytes
520a2d0 87887dd 520a2d0 87887dd 9a8c959 87887dd 9a8c959 87887dd 520a2d0 87887dd 520a2d0 87887dd 520a2d0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #!/usr/bin/env python3
import os
import sys
import platform
import stat
import json
from pathlib import Path
def setup():
print(f"[ai-log] Detecting OS: {platform.system()}")
is_windows = platform.system() == "Windows"
# UNIVERSAL POLYGLOT COMMAND: Works on Linux (Bash), Windows CMD, and PowerShell.
# Uses sys.executable to always pick the correct Python binary.
# Uses subprocess.run() directly (no os.system shell overhead).
# Uses subprocess.DEVNULL for cross-platform stderr suppression
# (avoids 2>nul which creates junk files on Linux, and 2>/dev/null which fails on CMD).
# Tries python3 first (Linux default), falls back to python (Windows default).
def get_universal_cmd(tool):
logic = "import sys,subprocess;subprocess.run([sys.executable,'scripts/log_hook.py','--tool','" + tool + "'],stderr=subprocess.DEVNULL)"
return 'python3 -c "' + logic + '" || python -c "' + logic + '"'
# 1. Setup Git Pre-push Hook
if Path(".git").exists():
python_cmd = "python" if is_windows else "python3"
hook_path = Path(".git/hooks/pre-push")
hook_path.parent.mkdir(parents=True, exist_ok=True)
hook_content = f"#!/bin/sh\n{python_cmd} scripts/submit_log.py\nexit 0\n"
with open(hook_path, "w", newline="\n") as f:
f.write(hook_content)
if not is_windows:
os.chmod(hook_path, os.stat(hook_path).st_mode | stat.S_IEXEC)
print(f"[ai-log] Git pre-push hook installed.")
# 2. Update Tool Configs with OS-Specific Command
def recursive_fix(obj, tool_name):
if isinstance(obj, dict):
for k, v in obj.items():
if k == "command" and isinstance(v, str) and ("log_hook.py" in v):
obj[k] = get_universal_cmd(tool_name)
else:
recursive_fix(v, tool_name)
elif isinstance(obj, list):
for item in obj:
recursive_fix(item, tool_name)
configs = {
".codex/hooks.json": "codex",
".gemini/settings.json": "gemini",
".cursor/hooks.json": "cursor",
".claude/settings.json": "claude",
".github/hooks/hooks.json": "copilot"
}
for path_str, tool in configs.items():
path = Path(path_str)
if not path.exists(): continue
try:
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
# Special case for Copilot which has bash/powershell keys
if tool == "copilot" and "hooks" in data:
for k in data["hooks"]:
for h in data["hooks"][k]:
if h.get("type") == "command":
h["bash"] = f"python3 scripts/log_hook.py"
h["powershell"] = f"python scripts/log_hook.py"
else:
recursive_fix(data, tool)
with open(path, "w", newline="\n", encoding="utf-8") as f:
json.dump(data, f, indent=2)
print(f"[ai-log] Synchronized {path} (Universal Command)")
except Exception as e:
print(f"[ai-log] Failed to update {path}: {e}")
# 3. Create .ai-log directory
log_dir = Path(".ai-log")
log_dir.mkdir(exist_ok=True)
(log_dir / ".gitkeep").touch()
print("[ai-log] Setup complete. Repository is now cross-platform and git-safe.")
if __name__ == "__main__":
setup()
|