feat(beads): integrate Beads Mode backend, MCP tools, and GUI support

This commit is contained in:
2026-05-06 13:48:47 -04:00
parent b1ddaa50f4
commit 2b66f3569b
17 changed files with 525 additions and 77 deletions
+44 -2
View File
@@ -234,6 +234,7 @@ class AppController:
self.ui_project_git_dir: str = ""
self.ui_project_main_context: str = ""
self.ui_project_system_prompt: str = ""
self.ui_project_execution_mode: str = "native"
self.ui_gemini_cli_path: str = "gemini"
self.ui_word_wrap: bool = True
self.ui_auto_add_history: bool = False
@@ -954,6 +955,25 @@ class AppController:
elapsed = end_time - start_time
self._completed_ticket_count += 1
self._avg_ticket_time = ((self._avg_ticket_time * (self._completed_ticket_count - 1)) + elapsed) / self._completed_ticket_count
elif action == "bead_updated":
payload = task.get("payload", {})
bid = payload.get("bead_id")
status = payload.get("status")
if bid and status:
stream_id = "Tier 2"
msg = f"\n[BEAD UPDATE] {bid} -> status: {status}\n"
if stream_id not in self.mma_streams:
self.mma_streams[stream_id] = ""
self.mma_streams[stream_id] += msg
elif action == "bead_updated":
payload = task.get("payload", {})
bead_id = payload.get("bead_id")
status = payload.get("status")
stream_id = "Tier 2 (Tech Lead)"
if stream_id not in self.mma_streams:
self.mma_streams[stream_id] = ""
self.mma_streams[stream_id] += f"[BEAD UPDATE] {bead_id} -> status: {status}\n"
except Exception as e:
import traceback
sys.stderr.write(f"[DEBUG] Error executing GUI task: {e}\n{traceback.format_exc()}\n")
@@ -2367,8 +2387,8 @@ class AppController:
description=state.metadata.name,
tickets=tickets
)
# Keep dicts for UI table (or convert models.Ticket objects back to dicts if needed)
self.active_tickets = [asdict(t) if not isinstance(t, dict) else t for t in tickets]
# Keep dicts for UI table
self._load_active_tickets()
# Load track-scoped history
history = project_manager.load_track_history(track_id, self.active_project_root)
with self._disc_entries_lock:
@@ -3143,4 +3163,26 @@ class AppController:
)
project_manager.save_track_state(self.active_track.id, state, self.active_project_root)
def _load_active_tickets(self) -> None:
"""Populates self.active_tickets based on the current execution mode."""
if getattr(self, "ui_project_execution_mode", "native") == "beads":
from src import beads_client
bclient = beads_client.BeadsClient(Path(self.active_project_root))
beads = bclient.list_beads()
self.active_tickets = []
for b in beads:
self.active_tickets.append({
"id": b.id,
"title": b.title,
"description": b.description,
"status": b.status,
"assigned_to": "tier3-worker",
"target_file": "",
"depends_on": []
})
else:
if self.active_track:
self.active_tickets = [asdict(t) if not isinstance(t, dict) else t for t in self.active_track.tickets]
else:
self.active_tickets = []