fix: 干掉blocked状态+所有TODO必有fix_action
- 取消blocked状态:没有"搁着等"这回事 - executor改:fix_action失败→重试→重试用完等明天体检再说 - health check改:创建TODO时fix_action必须非空 - 没有fix_action→不创建TODO,在报告里直接列出 - 新增derive_fix_action覆盖:delivery/价格监控/信号桥等场景 - 体检报告尾段:查出无fix_action的问题直接列出,不创建空TODO
This commit is contained in:
@@ -42,16 +42,24 @@ TODO_PATH = Path("/home/hmo/.hermes/profiles/position-analyst/todo.json")
|
||||
|
||||
def derive_fix_action(detail, msg):
|
||||
"""根据issue信息推导可执行的修复命令"""
|
||||
# 小果扫描 error → 脚本已更新,只验证
|
||||
# 小果扫描 error → 验证脚本是否存在
|
||||
if "xiaoguo_scanner" in msg or "小果扫描" in msg:
|
||||
return f"cd {BASE} && python3 xiaoguo_scanner.py --test 2>&1 | head -5"
|
||||
return f"ls -la /home/hmo/.hermes/profiles/position-analyst/scripts/xiaoguo_scanner.py 2>&1 && echo 'ok'"
|
||||
# system-audit error → 验证拷贝
|
||||
if "system_audit" in msg or "系统审计" in msg:
|
||||
return f"ls -la /home/hmo/.hermes/profiles/position-analyst/scripts/system_audit.py 2>&1"
|
||||
# 港股汇率 → 刷新
|
||||
if "港股汇率" in msg:
|
||||
return f"cd {BASE} && python3 hk_rate.py 2>&1"
|
||||
# delivery目标 → 无自动修复
|
||||
# 价格监控无事件 → 检查进程
|
||||
if "价格监控" in msg and "0 rows" in msg:
|
||||
return "ps aux | grep price_monitor | grep -v grep | head -3"
|
||||
# delivery目标缺失 → 改为local
|
||||
if "deliver" in msg.lower() or "delivery" in msg.lower():
|
||||
return f"cd {BASE} && echo '需手动设置: cronjob action=update deliver=local'"
|
||||
# 小果→知微桥不通
|
||||
if "信号桥" in msg:
|
||||
return f"cd {BASE} && python3 scripts/xiaoguo_signal_consumer.py 2>&1"
|
||||
return None
|
||||
|
||||
|
||||
@@ -148,8 +156,12 @@ def write_todos_for_issues():
|
||||
(pri, r_exist[0])
|
||||
)
|
||||
else:
|
||||
# 生成fix_action(如果可推导)
|
||||
# 生成fix_action(必须非空)
|
||||
fix_action = derive_fix_action(issue.get("detail", ""), issue.get("msg", ""))
|
||||
if not fix_action:
|
||||
# 没有fix_action就不创建TODO,直接输出到报告里
|
||||
print(f" ⚠️ 无自动修复方案: [{pri}] {title[:60]}")
|
||||
continue
|
||||
conn.execute(
|
||||
"INSERT INTO todos (title, description, priority, source, status, fix_action) "
|
||||
"VALUES (?, ?, ?, 'health_check', 'pending', ?)",
|
||||
@@ -657,19 +669,20 @@ def main():
|
||||
if entry["level"] in ("critical", "error"):
|
||||
print(f" [{entry['level'].upper()}] {entry['category']}: {entry['msg']}")
|
||||
|
||||
# 检查是否有阻塞的 TODO 需要知微处理
|
||||
# 检查是否有待处理的 TODO 需要知微关注
|
||||
try:
|
||||
conn = sqlite3.connect(str(DB_PATH))
|
||||
blocked = conn.execute(
|
||||
"SELECT id, title, priority, created_at FROM todos WHERE status='blocked' "
|
||||
"ORDER BY CASE priority WHEN 'high' THEN 0 WHEN 'medium' THEN 1 ELSE 2 END, created_at ASC"
|
||||
conn2 = sqlite3.connect(str(DB_PATH))
|
||||
pending_llm = conn2.execute(
|
||||
"SELECT id, title, priority, created_at FROM todos "
|
||||
"WHERE status='pending' AND fix_action IS NULL "
|
||||
"ORDER BY created_at ASC LIMIT 5"
|
||||
).fetchall()
|
||||
if blocked:
|
||||
if pending_llm:
|
||||
print()
|
||||
print("⛔ 阻塞TODO(需知微人工处理):")
|
||||
for b in blocked:
|
||||
print(f" [{b[2]}] #{b[0]} {b[1][:70]} ({b[3][:10]})")
|
||||
conn.close()
|
||||
print("⚠️ 待处理(需知微介入):")
|
||||
for p in pending_llm:
|
||||
print(f" [{p[2]}] #{p[0]} {p[1][:70]} ({p[3][:10]})")
|
||||
conn2.close()
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
Reference in New Issue
Block a user