#!/usr/bin/env python3 """SessionStart — 브랜치·미커밋·origin/main 대비·KST 장 상태·alembic head·3줄 요약 주입.""" import glob import json import os import re import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from _lib import git, kst_now, market_state, project_dir, read_stdin_json # noqa: E402 def alembic_head(root: str) -> str: revs: dict[str, str | None] = {} for f in glob.glob(os.path.join(root, "backend/alembic/versions/*.py")): try: t = open(f, encoding="utf-8").read(4000) except OSError: continue r = re.search(r"^revision\s*(?::[^=]+)?=\s*['\"]([^'\"]+)['\"]", t, re.M) d = re.search(r"^down_revision\s*(?::[^=]+)?=\s*(.+)$", t, re.M) if r: revs[r.group(1)] = d.group(1) if d else None downs = set() for d in revs.values(): if d: downs.update(re.findall(r"['\"]([^'\"]+)['\"]", d)) heads = [r for r in revs if r not in downs] return ", ".join(sorted(heads)) or "?" def main() -> int: data = read_stdin_json() root = project_dir(data) _, br = git(["rev-parse", "--abbrev-ref", "HEAD"], root) _, st = git(["status", "--porcelain"], root) dirty = len([l for l in st.splitlines() if l.strip()]) rc, ahead = git(["rev-list", "--count", "origin/main..HEAD"], root) rc2, behind = git(["rev-list", "--count", "HEAD..origin/main"], root) now = kst_now() ctx = ( f"[auto-stock 세션 상태] 브랜치 {br.strip() or '?'} / 미커밋 {dirty}개 / " f"origin/main 대비 앞섬 {ahead.strip() if rc == 0 else '?'}·뒤처짐 {behind.strip() if rc2 == 0 else '?'}(로컬 ref 기준) / " f"KST {now:%Y-%m-%d %H:%M} {'월화수목금토일'[now.weekday()]}요일 {market_state(now)} / alembic head {alembic_head(root)}\n" "1) 로컬 백엔드·docker compose up 기동 금지(NAS 와 KIS 앱키 공유 → 토큰 무효화). 검증은 격리 pytest 만.\n" "2) 배포는 /deploy 스킬(.claude/scripts/deploy.sh) — 장중(평일 08:30~15:40)은 재기동이 매매에 영향.\n" '3) 테스트: cd backend && DATABASE_URL="postgresql+asyncpg://x:x@localhost/autostock_test" ' "../.venv/bin/python -m pytest tests/ --ignore=tests/integration -q (DB 이름 *_test 필수)" ) json.dump({"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": ctx}}, sys.stdout, ensure_ascii=False) return 0 if __name__ == "__main__": sys.exit(main())