重构: 文档汇总+进度看板+孤儿任务清理脚本+gitignore 噪音排除
- docs/02 架构设计: 新增 aichat审查/异步审批构想/流式渲染调研/generating状态机/密钥迁移健壮性/工作流脚本执行边界/条件表达式引擎/F-07 trait下沉/Agent架构说明/任务推进构想/功能创意池;更新功能决策记录+归档/对抗论证/文档记录规范/经验记录
- docs/03 模块文档: 新增 AI对话引擎/DAG引擎详解;更新 df-knowledge/df-nodes/df-storage/df-workflow/df-ai
- docs/05 代码审查: 新增 全栈审查/全局review/架构审查/近期改动审查/工作区多角度走查/自研memo流式渲染审查
- docs/09 问题排查: 新增 aichat-apikey-401
- docs/INDEX+README 索引同步;docs/todo 待办看板(2026-06-15 汇总)
- PROGRESS.md Sprint 22-25;URGENT.md 加急清单快照(5 项 P0 已全修)
- scripts/cleanup_orphan_tasks.{py,sh} 孤儿任务清理工具
- .gitignore 补 *.broken.bak + tmp/ 噪音排除
This commit is contained in:
78
scripts/cleanup_orphan_tasks.py
Normal file
78
scripts/cleanup_orphan_tasks.py
Normal file
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env python3
|
||||
"""清理孤儿任务 — 删除不属于任何现有项目的任务记录"""
|
||||
import sqlite3
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 自动定位数据库
|
||||
candidates = []
|
||||
appdata = os.environ.get("APPDATA", "")
|
||||
if appdata:
|
||||
candidates.append(os.path.join(appdata, "top.1216.devflow", "devflow-dev.db"))
|
||||
candidates.append(os.path.join(appdata, "top.1216.devflow", "devflow.db"))
|
||||
|
||||
localappdata = os.environ.get("LOCALAPPDATA", "")
|
||||
if localappdata:
|
||||
candidates.append(os.path.join(localappdata, "top.1216.devflow", "devflow-dev.db"))
|
||||
|
||||
# 也支持命令行传参
|
||||
if len(sys.argv) > 1:
|
||||
candidates.insert(0, sys.argv[1])
|
||||
|
||||
db_path = None
|
||||
for c in candidates:
|
||||
if os.path.isfile(c):
|
||||
db_path = c
|
||||
break
|
||||
|
||||
if not db_path:
|
||||
print("❌ 未找到数据库文件,尝试过的路径:")
|
||||
for c in candidates:
|
||||
print(f" {c}")
|
||||
print("\n请手动指定: python scripts/cleanup_orphan_tasks.py <db_path>")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"📍 数据库: {db_path}\n")
|
||||
|
||||
conn = sqlite3.connect(db_path)
|
||||
conn.execute("PRAGMA foreign_keys = OFF")
|
||||
|
||||
# 查看孤儿任务
|
||||
rows = conn.execute("""
|
||||
SELECT t.id, t.title, t.project_id
|
||||
FROM tasks t
|
||||
LEFT JOIN projects p ON t.project_id = p.id
|
||||
WHERE p.id IS NULL
|
||||
ORDER BY t.project_id, t.created_at
|
||||
""").fetchall()
|
||||
|
||||
print(f"=== 孤儿任务列表({len(rows)} 条)===\n")
|
||||
for tid, title, pid in rows:
|
||||
print(f" [{pid[:8]}...] {title}")
|
||||
print()
|
||||
|
||||
if not rows:
|
||||
print("✅ 无孤儿任务,无需清理。")
|
||||
conn.close()
|
||||
sys.exit(0)
|
||||
|
||||
# 直接删除(无需确认,用户已通过对话授权)
|
||||
conn.execute("""
|
||||
DELETE FROM tasks
|
||||
WHERE project_id NOT IN (SELECT id FROM projects)
|
||||
""")
|
||||
conn.commit()
|
||||
|
||||
# 验证
|
||||
remaining = conn.execute("""
|
||||
SELECT COUNT(*) FROM tasks t
|
||||
LEFT JOIN projects p ON t.project_id = p.id
|
||||
WHERE p.id IS NULL
|
||||
""").fetchone()[0]
|
||||
|
||||
total = conn.execute("SELECT COUNT(*) FROM tasks").fetchone()[0]
|
||||
|
||||
conn.close()
|
||||
|
||||
print(f"✅ 已删除 {len(rows)} 条孤儿任务")
|
||||
print(f"📊 剩余任务: {total} 条(孤儿: {remaining} 条)")
|
||||
Reference in New Issue
Block a user