From d55717518ecdd3a577488ff5196644b6118061d5 Mon Sep 17 00:00:00 2001 From: jeda Date: Tue, 3 Mar 2026 12:12:39 +0000 Subject: [PATCH] chore(bd-3sj): close completed bead Co-Authored-By: Claude Worker --- .beads/issues.jsonl | 2 +- src/tui/dagUtils.ts | 177 -------------------------------------------- 2 files changed, 1 insertion(+), 178 deletions(-) delete mode 100644 src/tui/dagUtils.ts diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 59d9d30..eb2ea0e 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -51,7 +51,7 @@ {"id":"bd-3mw","title":"ALT-008: File-based claim system","description":"For HUMAN bead bd-3sh. Workers claim beads by creating lock files in .beads/locks/{bead-id}.lock. No race conditions, visible claims, works even if br CLI fails. Requires periodic cleanup of stale locks.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-03-03T08:39:58.969300113Z","created_by":"coder","updated_at":"2026-03-03T10:33:35.196160840Z","closed_at":"2026-03-03T10:33:34.053196348Z","close_reason":"done","source_repo":".","compaction_level":0,"original_size":0,"labels":["alternative","br","resilience","worker"],"comments":[{"id":33,"issue_id":"bd-3mw","author":"Jed Arden","text":"No longer needed - br v0.1.20 fixes the schema bug natively.","created_at":"2026-03-03T10:33:35Z"}]} {"id":"bd-3ov","title":"ALERT: Worker claude-code-glm-5-alpha has no work available","description":"# Worker Starvation Alert\n\nWorker **claude-code-glm-5-alpha** has exhausted all priorities and found zero work.\n\nThis is considered an error state - there should always be more work.\n\n## Worker State\n\n- **Executor:** claude-code-glm-5\n- **Model:** glm-5\n- **Workspace:** /home/coder/FABRIC\n- **Root Boundary:** /home/coder/FABRIC\n- **Last completion:** \n- **Beads completed:** 0\n- **Claim success rate:** %\n- **Uptime:** 24465s (h)\n- **Consecutive empty iterations:** 5\n\n## Priorities Exhausted\n\n1. ✗ Local workspace (bottoms-up): No beads in /home/coder/FABRIC or subfolders\n2. ✗ Parent exploration: No suitable workspaces found\n3. ✓ Maintenance: Completed (cleaned orphaned claims/locks)\n4. ✗ Gap analysis: false - No gaps found or created\n5. ✗ HUMAN alternatives: true - No HUMAN beads found to unblock\n\n## Discovered Workspaces\n\nTotal: 1\n\n- /home/coder/FABRIC\n\n## Required Actions\n\n1. Review discovery roots: Are all project folders being scanned?\n2. Check if projects need new features/tasks\n3. Review ROADMAP.md files across projects\n4. Enable gap analysis if disabled: `--enable-gap-analysis`\n5. Enable HUMAN alternatives if disabled\n6. Create manual beads to bootstrap work\n\n---\n*This alert was created automatically by Priority 6*","status":"closed","priority":0,"issue_type":"human","assignee":"coder","created_at":"2026-03-03T11:11:15.688794918Z","created_by":"coder","updated_at":"2026-03-03T11:11:57.071671451Z","closed_at":"2026-03-03T11:11:57.068303344Z","close_reason":"FALSE POSITIVE: 22 beads available in ready-queue.json. Worker discovery logic failed to detect available work. Available beads include bd-2zt (P0), bd-2ed (P0), bd-1mq (P1), and others.","source_repo":".","compaction_level":0,"original_size":0} {"id":"bd-3sh","title":"ALERT: Worker claude-code-glm-5-bravo has no work available","description":"# Worker Starvation Alert\n\nWorker **claude-code-glm-5-bravo** has exhausted all priorities and found zero work.\n\nThis is considered an error state - there should always be more work.\n\n## Worker State\n\n- **Executor:** claude-code-glm-5\n- **Model:** glm-5\n- **Workspace:** /home/coder/FABRIC\n- **Root Boundary:** /home/coder/FABRIC\n- **Last completion:** \n- **Beads completed:** 0\n- **Claim success rate:** %\n- **Uptime:** 14608s (h)\n- **Consecutive empty iterations:** 5\n\n## Priorities Exhausted\n\n1. ✗ Local workspace (bottoms-up): No beads in /home/coder/FABRIC or subfolders\n2. ✗ Parent exploration: No suitable workspaces found\n3. ✓ Maintenance: Completed (cleaned orphaned claims/locks)\n4. ✗ Gap analysis: false - No gaps found or created\n5. ✗ HUMAN alternatives: true - No HUMAN beads found to unblock\n\n## Discovered Workspaces\n\nTotal: 1\n\n- /home/coder/FABRIC\n\n## Required Actions\n\n1. Review discovery roots: Are all project folders being scanned?\n2. Check if projects need new features/tasks\n3. Review ROADMAP.md files across projects\n4. Enable gap analysis if disabled: `--enable-gap-analysis`\n5. Enable HUMAN alternatives if disabled\n6. Create manual beads to bootstrap work\n\n---\n*This alert was created automatically by Priority 6*","status":"closed","priority":0,"issue_type":"human","created_at":"2026-03-03T08:27:00.144567748Z","created_by":"coder","updated_at":"2026-03-03T09:04:42.456513465Z","closed_at":"2026-03-03T09:04:42.456310900Z","source_repo":".","compaction_level":0,"original_size":0,"comments":[{"id":6,"issue_id":"bd-3sh","author":"Jed Arden","text":"Alternative analysis: Worker starvation is FALSE POSITIVE. 20 beads available. Use scripts/br-ready-wrapper.sh or .beads/ready-queue.json workaround.","created_at":"2026-03-03T08:37:53Z"},{"id":8,"issue_id":"bd-3sh","author":"Jed Arden","text":"Alternative solutions explored for worker starvation. Root cause: br ready schema bug (created_by column). 22 beads available in ready-queue.json. ALT-006 (bd-9rs) implemented: scripts/br-get-next-bead.sh reads ready-queue.json directly. Workers need fallback logic.","created_at":"2026-03-03T08:40:31Z"},{"id":15,"issue_id":"bd-3sh","author":"Jed Arden","text":"False positive - work available in ready-queue.json (22 beads). Same issue as bd-123.","created_at":"2026-03-03T09:04:42Z"}]} -{"id":"bd-3sj","title":"P4-002: File Heatmap","description":"Implement file heatmap visualization - track which files are modified most frequently and by which workers. Helps identify hotspots and potential collision areas.","status":"in_progress","priority":3,"issue_type":"task","assignee":"coder","created_at":"2026-03-03T11:42:55.763617113Z","created_by":"coder","updated_at":"2026-03-03T11:55:15.642896694Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["intelligence","phase-4","visualization"]} +{"id":"bd-3sj","title":"P4-002: File Heatmap","description":"Implement file heatmap visualization - track which files are modified most frequently and by which workers. Helps identify hotspots and potential collision areas.","status":"closed","priority":3,"issue_type":"task","assignee":"coder","created_at":"2026-03-03T11:42:55.763617113Z","created_by":"coder","updated_at":"2026-03-03T12:12:28.755451930Z","closed_at":"2026-03-03T12:12:28.748642284Z","close_reason":"done","source_repo":".","compaction_level":0,"original_size":0,"labels":["intelligence","phase-4","visualization"]} {"id":"bd-3tj","title":"TEST-003: Add TUI component tests","description":"Test Coverage: Add tests for TUI components using blessed testing patterns. Test keyboard input, panel switching, filtering.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-03-03T07:53:40.669404768Z","created_by":"coder","updated_at":"2026-03-03T07:53:40.669404768Z","closed_at":"2026-03-03T07:53:40.669404768Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["testing","tui"]} {"id":"bd-4jn","title":"P4-004: Smart Error Grouping","description":"Implement smart error grouping - cluster similar errors together to reduce noise and highlight unique issues. Pattern matching on error messages and stack traces.","status":"closed","priority":3,"issue_type":"task","assignee":"coder","created_at":"2026-03-03T11:43:00.067083820Z","created_by":"coder","updated_at":"2026-03-03T11:54:42.770565693Z","closed_at":"2026-03-03T11:54:42.762024104Z","close_reason":"done","source_repo":".","compaction_level":0,"original_size":0,"labels":["error-handling","intelligence","phase-4"]} {"id":"bd-5eh","title":"TEST-001: Add comprehensive parser tests","description":"Test Coverage: Add unit tests for edge cases in parser.ts - malformed JSON, partial lines, unicode, very long messages. Target 90% coverage.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-03-03T07:53:40.185664830Z","created_by":"coder","updated_at":"2026-03-03T10:40:00Z","closed_at":"2026-03-03T10:40:00Z","close_reason":"Parser tests complete: 36 tests","source_repo":".","compaction_level":0,"original_size":0,"labels":["parser","testing"]} diff --git a/src/tui/dagUtils.ts b/src/tui/dagUtils.ts deleted file mode 100644 index 5eb7198..0000000 --- a/src/tui/dagUtils.ts +++ /dev/null @@ -1,177 +0,0 @@ -/** - * DAG Utility Functions - * - * Utilities for working with dependency graphs from br commands. - */ - -import { - DependencyGraph, - DagComponent, - BeadNode, - DagStats, - DagOptions, - BeadStatus, - DependencyEdge, -} from '../types.js'; -import { execSync } from 'child_process'; - -/** - * Status icons for display - */ -export function getStatusIcon(status: BeadStatus): string { - switch (status) { - case 'open': return '○'; - case 'in_progress': return '●'; - case 'blocked': return '⊘'; - case 'completed': return '✓'; - case 'closed': return '✕'; - case 'deferred': return '⏰'; - default: return '?'; - } -} - -/** - * Priority indicator - */ -export function getPriorityIndicator(priority: number): string { - switch (priority) { - case 0: return 'P0'; - case 1: return 'P1'; - case 2: return 'P2'; - case 3: return 'P3'; - case 4: return 'P4'; - default: return `P${priority}`; - } -} - -/** - * Get status color for blessed - */ -export function getStatusColor(status: BeadStatus): string { - switch (status) { - case 'open': return 'white'; - case 'in_progress': return 'green'; - case 'blocked': return 'red'; - case 'completed': return 'cyan'; - case 'closed': return 'gray'; - case 'deferred': return 'yellow'; - default: return 'white'; - } -} - -/** - * Parse br list output to build dependency graph - */ -export function refreshDependencyGraph(options: DagOptions = {}): DependencyGraph { - // This is a stub implementation that returns an empty graph - // The actual implementation would parse br list output - return { - components: [], - totalNodes: 0, - totalEdges: 0, - totalComponents: 0, - globalCriticalPath: [], - generatedAt: Date.now(), - }; -} - -/** - * Get statistics about the dependency graph - */ -export function getDagStats(graph: DependencyGraph): DagStats { - let blockedCount = 0; - let readyCount = 0; - let totalDeps = 0; - let totalDependents = 0; - let maxDepth = 0; - - for (const component of graph.components) { - for (const node of component.nodes) { - if (node.status === 'blocked') blockedCount++; - if (node.status === 'open' && node.dependencyCount === 0) readyCount++; - totalDeps += node.dependencyCount; - totalDependents += node.dependentCount; - maxDepth = Math.max(maxDepth, node.depth); - } - } - - const totalBeads = graph.totalNodes; - - return { - totalBeads, - blockedCount, - readyCount, - avgDependencies: totalBeads > 0 ? totalDeps / totalBeads : 0, - avgDependents: totalBeads > 0 ? totalDependents / totalBeads : 0, - maxDepth, - cycleCount: graph.components.filter(c => c.hasCycle).length, - criticalPathLength: graph.globalCriticalPath.length, - criticalPathBeads: graph.globalCriticalPath.length, - }; -} - -/** - * Get top blockers (tasks that block the most others) - */ -export function getTopBlockers(graph: DependencyGraph, limit: number = 10): BeadNode[] { - const nodes: BeadNode[] = []; - - for (const component of graph.components) { - nodes.push(...component.nodes); - } - - return nodes - .filter(n => n.dependentCount > 0 && n.status !== 'completed' && n.status !== 'closed') - .sort((a, b) => b.dependentCount - a.dependentCount) - .slice(0, limit); -} - -/** - * Get ready beads (unblocked and open) - */ -export function getReadyBeads(graph: DependencyGraph): BeadNode[] { - const nodes: BeadNode[] = []; - - for (const component of graph.components) { - nodes.push(...component.nodes); - } - - return nodes.filter(n => n.status === 'open' && n.dependencyCount === 0); -} - -/** - * Render dependency tree as string - */ -export function renderDependencyTree( - component: DagComponent, - options: { - showPriority?: boolean; - showStatus?: boolean; - maxDepth?: number; - } = {} -): string { - const { showPriority = false, showStatus = false, maxDepth = 10 } = options; - const lines: string[] = []; - - function renderNode(node: BeadNode, depth: number, prefix: string): void { - if (depth > maxDepth) return; - - const icon = getStatusIcon(node.status); - const statusColor = getStatusColor(node.status); - const priority = showPriority ? ` [${getPriorityIndicator(node.priority)}]` : ''; - const critical = node.isCriticalPath ? ' ⚡' : ''; - - lines.push(`${prefix}${icon} {${statusColor}-fg}${node.id}{/}${priority}${critical}`); - lines.push(`${prefix} ${node.title.slice(0, 40)}`); - } - - // Render root nodes - for (const rootId of component.roots) { - const node = component.nodes.find(n => n.id === rootId); - if (node) { - renderNode(node, 0, ''); - } - } - - return lines.join('\n'); -}