#!/usr/bin/env python3 """Stop — frontend/src 미커밋 변경이 직전 tsc 통과 이후 바뀌었으면 npx tsc --noEmit (90초).""" import hashlib import os import subprocess import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from _lib import git, project_dir, read_stdin_json # noqa: E402 def main() -> int: data = read_stdin_json() if data.get("stop_hook_active"): return 0 root = project_dir(data) _, st = git(["status", "--porcelain", "--", "frontend/src"], root) files = [l[3:].strip() for l in st.splitlines() if l.strip()] if not files: return 0 h = hashlib.sha1() for f in sorted(files): p = os.path.join(root, f) try: h.update(f.encode() + str(os.stat(p).st_mtime_ns).encode()) except OSError: h.update(f.encode() + b"deleted") digest = h.hexdigest() stamp = os.path.join(os.environ.get("HARNESS_STATE_DIR", os.path.join(root, ".claude")), ".tsc_stamp") try: if open(stamp).read().strip() == digest: return 0 except OSError: pass fe = os.path.join(root, "frontend") cmd = os.environ.get("HARNESS_TSC_CMD") argv = ["bash", "-c", cmd] if cmd else ["npx", "--no-install", "tsc", "--noEmit"] try: p = subprocess.run(argv, cwd=fe, capture_output=True, text=True, timeout=90) except subprocess.TimeoutExpired: sys.stderr.write("[harness] tsc 90초 초과 — 건너뜀\n") return 0 except Exception: return 0 if p.returncode != 0: tail = "\n".join((p.stdout + p.stderr).strip().splitlines()[:30]) sys.stderr.write(f"[harness] frontend 타입 체크 실패(tsc --noEmit). 수정 후 마치라:\n{tail}\n") return 2 try: open(stamp, "w").write(digest) except OSError: pass return 0 if __name__ == "__main__": sys.exit(main())