feat: TODO DB迁移+no_agent执行器+阻塞升级机制

- 创建 mofin.db → todos 表(id/title/status/priority/fix_action/retry机制)
- 创建 self_todo_executor.py:no_agent脚本,纯代码逻辑
  - 有fix_action→执行→验证→标记completed
  - 无fix_action→标记blocked→输出通知
  - 失败重试3次→超限标blocked
  - 新blocked项首次输出后缓存不重复
- 修改 morning_health_check:
  - TODO写入DB取代JSON(sqlite3,无row_factory依赖)
  - 去重:含completed查重
  - 输出阻塞TODO列表
- 替换cron:LLM cron(2h间距) → no_agent(10min间距)
- 修复:deliver=origin两任务改为local
- 清理:废弃todo.json退役
This commit is contained in:
知微
2026-06-24 20:55:56 +08:00
parent a76240b52d
commit a55d241f30
2 changed files with 48 additions and 11 deletions
+24 -11
View File
@@ -134,18 +134,18 @@ def write_todos_for_issues():
level = issue["level"]
pri = todo_priority.get(level, "medium")
# 去重:检查是否已有相同 title
existing = conn.execute(
"SELECT id, status FROM todos WHERE title=? AND status IN ('pending','in_progress','blocked')",
# 去重:检查是否已存在(含completed的也要查,避免重复加)
r_exist = conn.execute(
"SELECT id, status FROM todos WHERE title=?",
(title,)
).fetchone()
if existing:
if existing["status"] == "blocked":
if r_exist:
if r_exist[1] == "blocked":
# 已阻塞的重新打开
conn.execute(
"UPDATE todos SET status='pending', priority=?, note='已重新打开', updated_at=CURRENT_TIMESTAMP WHERE id=?",
(pri, existing["id"])
(pri, r_exist[0])
)
else:
# 生成fix_action(如果可推导)
@@ -160,18 +160,15 @@ def write_todos_for_issues():
new_count += 1
conn.commit()
conn.close()
if new_count > 0:
print()
print(f"📋 已加入TODO({new_count}条):")
# 重新查刚插入的pending记录
cur2 = conn.cursor()
for r2 in cur2.execute(
for r2 in conn.execute(
"SELECT title, priority FROM todos WHERE status='pending' AND source='health_check' "
"ORDER BY created_at DESC LIMIT ?", (new_count,)
).fetchall():
print(f" [{r2['priority']}] {r2['title'][:70]}")
print(f" [{r2[1]}] {r2[0][:70]}")
conn.close()
except Exception as e:
print(f" TODO写入异常: {e}")
@@ -660,6 +657,22 @@ def main():
if entry["level"] in ("critical", "error"):
print(f" [{entry['level'].upper()}] {entry['category']}: {entry['msg']}")
# 检查是否有阻塞的 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"
).fetchall()
if blocked:
print()
print("⛔ 阻塞TODO(需知微人工处理):")
for b in blocked:
print(f" [{b[2]}] #{b[0]} {b[1][:70]} ({b[3][:10]})")
conn.close()
except:
pass
# 将异常写入 TODO 系统
write_todos_for_issues()