feat(beads): integrate Beads Mode backend, MCP tools, and GUI support
This commit is contained in:
+44
-2
@@ -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 = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user