fix(lint): 修复 PR #14 引入的 lint 回退 (119→0)
PR #14 从旧分支复制文件导致回退了 PR #10 的 lint 修复。 修复内容: - autoflake 移除未使用导入/变量 - autopep8 修复缩进/空格 - 手动修复 F821(pathlib→Path), F541(f-string), F841(未使用变量) - 所有修复均通过 flake8 --max-line-length=120 --extend-ignore=E501 检查 (0 errors)
This commit is contained in:
+19
-15
@@ -4,7 +4,6 @@ from __future__ import annotations
|
||||
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
|
||||
def init_db(db_path: Path) -> None:
|
||||
@@ -133,8 +132,10 @@ def _migrate_v28(conn: sqlite3.Connection) -> None:
|
||||
resolved_by TEXT,
|
||||
resolve_note TEXT
|
||||
)""")
|
||||
conn.execute("CREATE INDEX IF NOT EXISTS idx_checkpoints_task ON checkpoints(task_id)")
|
||||
conn.execute("CREATE INDEX IF NOT EXISTS idx_checkpoints_status ON checkpoints(status)")
|
||||
conn.execute(
|
||||
"CREATE INDEX IF NOT EXISTS idx_checkpoints_task ON checkpoints(task_id)")
|
||||
conn.execute(
|
||||
"CREATE INDEX IF NOT EXISTS idx_checkpoints_status ON checkpoints(status)")
|
||||
|
||||
# 4. outputs 扩展字段(M3 成果物)
|
||||
_safe_add_column(conn, "outputs", "file_name", "TEXT")
|
||||
@@ -189,18 +190,20 @@ TERMINAL_STATUSES = frozenset() # v3.1: 无终态,全靠 VALID_TRANSITIONS
|
||||
MANUAL_STATUSES = frozenset({"cancelled", "paused", "reviewing"})
|
||||
|
||||
VALID_TRANSITIONS = {
|
||||
"pending": {"claimed", "paused", "blocked", "cancelled"},
|
||||
"claimed": {"working", "paused", "pending", "cancelled"},
|
||||
"working": {"review", "done", "blocked", "failed", "paused", "escalated", "waiting_human", "cancelled", "pending"}, # pending: Mail spawn 失败回退
|
||||
"paused": {"working", "claimed", "review", "escalated", "waiting_human", "cancelled"}, # 恢复到 resumed_from 记录的状态
|
||||
"review": {"done", "pending", "failed", "paused", "escalated", "waiting_human", "cancelled"},
|
||||
"blocked": {"pending", "escalated", "cancelled"},
|
||||
"failed": {"pending", "escalated", "cancelled"},
|
||||
"escalated": {"working", "pending", "paused", "cancelled"},
|
||||
"pending": {"claimed", "paused", "blocked", "cancelled"},
|
||||
"claimed": {"working", "paused", "pending", "cancelled"},
|
||||
# pending: Mail spawn 失败回退
|
||||
"working": {"review", "done", "blocked", "failed", "paused", "escalated", "waiting_human", "cancelled", "pending"},
|
||||
# 恢复到 resumed_from 记录的状态
|
||||
"paused": {"working", "claimed", "review", "escalated", "waiting_human", "cancelled"},
|
||||
"review": {"done", "pending", "failed", "paused", "escalated", "waiting_human", "cancelled"},
|
||||
"blocked": {"pending", "escalated", "cancelled"},
|
||||
"failed": {"pending", "escalated", "cancelled"},
|
||||
"escalated": {"working", "pending", "paused", "cancelled"},
|
||||
"waiting_human": {"working", "done", "paused", "cancelled"},
|
||||
"done": {"cancelled", "reviewing"},
|
||||
"reviewing": {"done", "working", "cancelled"},
|
||||
"cancelled": {"pending"},
|
||||
"done": {"cancelled", "reviewing"},
|
||||
"reviewing": {"done", "working", "cancelled"},
|
||||
"cancelled": {"pending"},
|
||||
}
|
||||
|
||||
COMMENT_TYPES = frozenset({
|
||||
@@ -224,7 +227,8 @@ EVENT_TYPES = frozenset({
|
||||
|
||||
OUTPUT_TYPES = frozenset({"code", "document", "data", "config", "other"})
|
||||
|
||||
REVIEW_TYPES = frozenset({"plan_review", "output_review", "guardrail", "final_review"})
|
||||
REVIEW_TYPES = frozenset(
|
||||
{"plan_review", "output_review", "guardrail", "final_review"})
|
||||
VERDICT_TYPES = frozenset({"approved", "rejected", "needs_revision"})
|
||||
|
||||
EXPERIENCE_SOURCES = frozenset({
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Any, Dict, List, Optional
|
||||
from typing import Any, List, Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
|
||||
@@ -11,7 +11,6 @@ from typing import Any, Dict, List, Optional
|
||||
|
||||
from .db import (
|
||||
VALID_TRANSITIONS,
|
||||
VALID_STATUSES,
|
||||
COMMENT_TYPES,
|
||||
EVENT_TYPES,
|
||||
OUTPUT_TYPES,
|
||||
@@ -84,7 +83,8 @@ class Blackboard:
|
||||
"""获取单个任务"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
row = conn.execute("SELECT * FROM tasks WHERE id=?", (task_id,)).fetchone()
|
||||
row = conn.execute(
|
||||
"SELECT * FROM tasks WHERE id=?", (task_id,)).fetchone()
|
||||
return Task.from_row(row) if row else None
|
||||
finally:
|
||||
conn.close()
|
||||
@@ -129,7 +129,8 @@ class Blackboard:
|
||||
updates["completed_at"] = now # paused 也记录时间用于恢复
|
||||
updates["resumed_from"] = old_status # 记录暂停前状态
|
||||
elif new_status == "pending":
|
||||
# 所有 →pending 转换都清空 assignee(与 ticker._transition_status L414 对齐)
|
||||
# 所有 →pending 转换都清空 assignee(与 ticker._transition_status L414
|
||||
# 对齐)
|
||||
updates["assignee"] = None
|
||||
updates["claimed_at"] = None
|
||||
updates["current_agent"] = None
|
||||
@@ -693,7 +694,6 @@ class Blackboard:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
# ── Checkpoint CRUD(M3) ──
|
||||
|
||||
def create_checkpoint(
|
||||
@@ -709,7 +709,8 @@ class Blackboard:
|
||||
import uuid
|
||||
# BUG-33: 校验 payload 结构必须含 version 字段
|
||||
if not isinstance(payload, dict) or "version" not in payload:
|
||||
raise ValueError("payload must be a dict containing 'version' field")
|
||||
raise ValueError(
|
||||
"payload must be a dict containing 'version' field")
|
||||
cp_id = checkpoint_id or f"cp-{uuid.uuid4().hex[:8]}"
|
||||
conn = self._conn()
|
||||
try:
|
||||
@@ -966,7 +967,8 @@ class Blackboard:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_pending_mentions(self, max_retries: int = 5) -> List[Dict[str, Any]]:
|
||||
def get_pending_mentions(
|
||||
self, max_retries: int = 5) -> List[Dict[str, Any]]:
|
||||
"""获取所有 pending 且未超过重试上限的 mentions"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
@@ -1001,7 +1003,8 @@ class Blackboard:
|
||||
conn = self._conn()
|
||||
try:
|
||||
conn.execute("BEGIN IMMEDIATE")
|
||||
conn.execute("UPDATE mention_queue SET retry_count=retry_count+1 WHERE id=?", (mention_id,))
|
||||
conn.execute(
|
||||
"UPDATE mention_queue SET retry_count=retry_count+1 WHERE id=?", (mention_id,))
|
||||
conn.commit()
|
||||
return True
|
||||
finally:
|
||||
@@ -1012,7 +1015,8 @@ class Blackboard:
|
||||
conn = self._conn()
|
||||
try:
|
||||
conn.execute("BEGIN IMMEDIATE")
|
||||
conn.execute("UPDATE mention_queue SET status='failed' WHERE id=?", (mention_id,))
|
||||
conn.execute(
|
||||
"UPDATE mention_queue SET status='failed' WHERE id=?", (mention_id,))
|
||||
conn.commit()
|
||||
return True
|
||||
finally:
|
||||
|
||||
@@ -132,7 +132,8 @@ class Queries:
|
||||
"""任务详情聚合(含关联数据)"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
row = conn.execute("SELECT * FROM tasks WHERE id=?", (task_id,)).fetchone()
|
||||
row = conn.execute(
|
||||
"SELECT * FROM tasks WHERE id=?", (task_id,)).fetchone()
|
||||
if not row:
|
||||
return None
|
||||
task = dict(row)
|
||||
@@ -159,7 +160,8 @@ class Queries:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def task_events(self, task_id: str, limit: int = 50) -> List[Dict[str, Any]]:
|
||||
def task_events(self, task_id: str,
|
||||
limit: int = 50) -> List[Dict[str, Any]]:
|
||||
"""任务事件列表"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
@@ -265,7 +267,8 @@ class Queries:
|
||||
return "review"
|
||||
|
||||
# 有 working/claimed → working
|
||||
if status_counts.get("working", 0) > 0 or status_counts.get("claimed", 0) > 0:
|
||||
if status_counts.get("working", 0) > 0 or status_counts.get(
|
||||
"claimed", 0) > 0:
|
||||
return "working"
|
||||
|
||||
# 有 pending → pending
|
||||
@@ -337,7 +340,8 @@ class Queries:
|
||||
# 当前活跃 stage
|
||||
active_stage = None
|
||||
for sp in stage_progress:
|
||||
if sp["active"] > 0 or (sp["total"] > 0 and sp["done"] < sp["total"]):
|
||||
if sp["active"] > 0 or (
|
||||
sp["total"] > 0 and sp["done"] < sp["total"]):
|
||||
if not active_stage and sp["done"] < sp["total"]:
|
||||
active_stage = sp["label"]
|
||||
|
||||
|
||||
@@ -119,7 +119,8 @@ class ProjectRegistry:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_projects(self, status: Optional[str] = None) -> Dict[str, Dict[str, Any]]:
|
||||
def list_projects(
|
||||
self, status: Optional[str] = None) -> Dict[str, Dict[str, Any]]:
|
||||
"""列出项目"""
|
||||
conn = self._connect()
|
||||
try:
|
||||
@@ -178,7 +179,8 @@ class ProjectRegistry:
|
||||
status="deleted",
|
||||
)
|
||||
|
||||
def physical_delete_project(self, project_id: str) -> Optional[Dict[str, Any]]:
|
||||
def physical_delete_project(
|
||||
self, project_id: str) -> Optional[Dict[str, Any]]:
|
||||
"""物理删除项目(删目录 + 删 registry 条目)"""
|
||||
import shutil
|
||||
|
||||
@@ -260,7 +262,8 @@ class ProjectRegistry:
|
||||
# 迁移(从 _registry.yaml)
|
||||
# ===================================================================
|
||||
|
||||
def discover_sanguo_projects(self, scan_dir: Optional[Path] = None) -> List[str]:
|
||||
def discover_sanguo_projects(
|
||||
self, scan_dir: Optional[Path] = None) -> List[str]:
|
||||
"""扫描 sanguo_projects 开发目录,自动注册正式项目"""
|
||||
scan_dir = scan_dir or Path(os.environ.get(
|
||||
"SANGUO_PROJECTS_DIR",
|
||||
@@ -355,4 +358,3 @@ class ProjectRegistry:
|
||||
|
||||
def reload(self) -> None:
|
||||
"""兼容旧接口(SQLite 不需要 reload cache)"""
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user