feat: full pipeline fixes - CI status branch lookup, review webhook routing, auto-advance, plane sync
- handle_ci_status: fallback git branch -r --contains when branches[] empty - webhook router: handle pull_request_approved event type - handle_pr: map review.type to review.state for new Gitea format - launcher: auto-advance stage after agent completion (_try_advance_stage) - plane_sync: notify Plane on stage changes - stages.py: stage machine with QG definitions - notifications.py: stage change notifications - safe.directory fix for container git operations
This commit is contained in:
56
src/db.py
56
src/db.py
@@ -22,6 +22,7 @@ def init_db():
|
||||
CREATE TABLE IF NOT EXISTS tasks (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
plane_id TEXT,
|
||||
work_item_id TEXT,
|
||||
repo TEXT NOT NULL,
|
||||
branch TEXT,
|
||||
stage TEXT DEFAULT 'created',
|
||||
@@ -40,3 +41,58 @@ def init_db():
|
||||
);
|
||||
""")
|
||||
conn.close()
|
||||
|
||||
|
||||
def get_task_by_plane_id(plane_id: str) -> dict | None:
|
||||
"""Find task by Plane work item ID (checks plane_id and plane_issue_id)."""
|
||||
conn = get_db()
|
||||
row = conn.execute(
|
||||
"SELECT * FROM tasks WHERE plane_id = ? OR plane_issue_id = ?", (plane_id, plane_id)
|
||||
).fetchone()
|
||||
conn.close()
|
||||
if row:
|
||||
return dict(row)
|
||||
return None
|
||||
|
||||
|
||||
def get_task_by_repo_branch(repo: str, branch: str) -> dict | None:
|
||||
"""Find task by repo and branch name."""
|
||||
conn = get_db()
|
||||
row = conn.execute(
|
||||
"SELECT * FROM tasks WHERE repo = ? AND branch = ?", (repo, branch)
|
||||
).fetchone()
|
||||
conn.close()
|
||||
if row:
|
||||
return dict(row)
|
||||
return None
|
||||
|
||||
|
||||
def update_task_stage(task_id: int, stage: str):
|
||||
"""Update task stage and timestamp."""
|
||||
conn = get_db()
|
||||
conn.execute(
|
||||
"UPDATE tasks SET stage = ?, updated_at = datetime('now') WHERE id = ?",
|
||||
(stage, task_id),
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
def get_next_work_item_id(repo: str) -> str:
|
||||
"""Generate next work item ID (e.g., ET-003)."""
|
||||
conn = get_db()
|
||||
row = conn.execute(
|
||||
"SELECT work_item_id FROM tasks WHERE repo = ? AND work_item_id IS NOT NULL ORDER BY id DESC LIMIT 1",
|
||||
(repo,),
|
||||
).fetchone()
|
||||
conn.close()
|
||||
|
||||
if row and row["work_item_id"]:
|
||||
# Parse ET-003 -> 3, increment
|
||||
prefix, num = row["work_item_id"].rsplit("-", 1)
|
||||
next_num = int(num) + 1
|
||||
else:
|
||||
prefix = "ET"
|
||||
next_num = 1
|
||||
|
||||
return f"{prefix}-{next_num:03d}"
|
||||
|
||||
Reference in New Issue
Block a user