Files
seewis-hsl-ui/.codex/hooks/user-prompt-submit.py
T

77 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
"""VibeCoding Athena Codex UserPromptSubmit hook v9.6.
仅在用户 prompt 看起来是"开发请求" 时, 提示当前 PACE 状态, 帮助 model 路由.
不强制添加任何内容, 单纯增强 context.
参考: https://developers.openai.com/codex/hooks
"""
import json
import os
import re
import sys
import datetime
PROJECT_DIR = os.environ.get("CODEX_PROJECT_DIR") or os.getcwd()
STATE_DIR = os.path.join(PROJECT_DIR, ".ai_state")
INDEX_PATH = os.path.join(STATE_DIR, "_index.md")
DEV_KEYWORDS = re.compile(
r"(实现|开发|新增|加上|做|搭|跑|写|改|修|fix|implement|build|add|create|refactor|review|test|debug)",
re.IGNORECASE,
)
def main():
raw = sys.stdin.read()
try:
event = json.loads(raw)
except Exception:
sys.exit(0)
return
prompt = event.get("prompt") or event.get("user_prompt") or ""
if not DEV_KEYWORDS.search(prompt):
sys.exit(0)
return
if not os.path.exists(INDEX_PATH):
sys.exit(0)
return
try:
content = open(INDEX_PATH).read()
m = re.match(r"^---\n(.*?)\n---", content, re.DOTALL)
if not m:
sys.exit(0)
return
fm = m.group(1)
path_m = re.search(r'^ path: "([^"]*)"$', fm, re.MULTILINE)
stage_m = re.search(r'^ stage: "([^"]*)"$', fm, re.MULTILINE)
path_val = path_m.group(1) if path_m else ""
stage_val = stage_m.group(1) if stage_m else ""
if path_val and stage_val:
msg = f"[Athena] 当前 PACE 状态: {path_val}/{stage_val}. 如果是延续任务, 请走 pace skill 既有流程; 如果是新任务, 评估是否升路径."
sys.stderr.write(msg + "\n")
print(json.dumps({"systemMessage": msg}))
try:
line = json.dumps({
"ts": datetime.datetime.utcnow().isoformat() + "Z",
"hook": "user-prompt-submit",
"path": path_val, "stage": stage_val
}) + "\n"
with open(os.path.join(STATE_DIR, "hook-trace.jsonl"), "a") as f:
f.write(line)
except Exception:
pass
except Exception as e:
sys.stderr.write(f"[user-prompt-submit] failed: {e}\n")
sys.exit(0)
if __name__ == "__main__":
main()