gendesign/scripts/claude-hooks/statusline.py
bot-backend 4a33347aee chore(claude): security hardening — hooks/settings в git, dangerous-commands hook, restricted DB для reviewer/qa
- .claude/settings.json закоммичен (секретов нет): бот-окна и чистые checkout
  получают hooks/deny/statusLine вместо молчаливого их отсутствия
- новый PreToolUse hook check-dangerous-commands.py: ловит force/amend/no-verify/
  rm -rf/reset --hard/push в main И внутри powershell-обёрток (deny-префиксы позиционны);
  24/24 тест-кейсов; + Read-deny **/.env
- postgres MCP reviewer/qa → --access-mode=restricted (декларируемый read-only
  теперь enforced, не проза)
- auto-analyst: принята throttle-политика ready>=10 (конфликт с work-as-analyst устранён,
  just-in-time нарезка)
- defaultMode:auto перенесён на project-уровень (глобально снят — balance_platform
  вернулся к обычным промптам)
2026-07-02 18:10:26 +03:00

47 lines
1.2 KiB
Python

#!/usr/bin/env python3
"""
Claude Code statusLine — `⎇ <branch> · <model> · <dir>`.
Wired in `.claude/settings.json` statusLine. Reads session JSON from stdin
(model.display_name, workspace.current_dir). Branch via a 1s git probe in cwd.
Why: 3-5 parallel bg-windows on shared worktrees → branch/persona confusion is a
documented fail-class (orphan commits). A persistent branch+model line кат this risk.
Always exits 0; never blocks.
"""
from __future__ import annotations
import json
import os
import subprocess
import sys
def main() -> int:
try:
data = json.load(sys.stdin)
except Exception:
data = {}
model = (data.get("model") or {}).get("display_name") or "?"
cwd = (data.get("workspace") or {}).get("current_dir") or data.get("cwd") or os.getcwd()
base = os.path.basename(str(cwd).rstrip("/\\")) or str(cwd)
branch = "?"
try:
out = subprocess.run(
["git", "-C", str(cwd), "rev-parse", "--abbrev-ref", "HEAD"],
capture_output=True,
text=True,
timeout=1,
)
branch = out.stdout.strip() or "?"
except Exception:
pass
print(f"{branch} · {model} · {base}")
return 0
if __name__ == "__main__":
sys.exit(main())