Dicklesworthstone

bv

@Dicklesworthstone/bv
Dicklesworthstone
9
0 forks
Updated 1/6/2026
View on GitHub

Beads Viewer - graph-aware triage engine for Beads issue tracker with 9 graph metrics (PageRank, betweenness, HITS, etc.), dependency-aware planning, and purpose-built robot protocol for AI agents.

Installation

$skills install @Dicklesworthstone/bv
Claude Code
Cursor
Copilot
Codex
Antigravity

Details

Pathskills/bv/SKILL.md
Branchmain
Scoped Name@Dicklesworthstone/bv

Usage

After installing, this skill will be available to your AI coding assistant.

Verify installation:

skills list

Skill Instructions


name: bv description: "Beads Viewer - graph-aware triage engine for Beads issue tracker with 9 graph metrics (PageRank, betweenness, HITS, etc.), dependency-aware planning, and purpose-built robot protocol for AI agents."

BV - Beads Viewer

A high-performance TUI and graph-aware triage engine for the Beads issue tracker. Treats your project as a Directed Acyclic Graph (DAG), computing 9 graph-theoretic metrics to surface hidden dependencies, bottlenecks, and optimal work ordering.

CRITICAL: Robot Mode Required for AI Agents

NEVER run bare bv - it launches an interactive TUI that blocks your session!

# WRONG - blocks terminal with TUI
bv

# CORRECT - JSON output for agents
bv --robot-triage
bv --robot-plan
bv --robot-insights

Always use --robot-* flags for machine-readable output.


Quick Reference for AI Agents

The Mega-Command: Start Here

# THE SINGLE ENTRY POINT - returns everything you need
bv --robot-triage

Returns:

  • quick_ref: at-a-glance counts + top 3 picks
  • recommendations: ranked actionable items with scores, reasons, unblock info
  • quick_wins: low-effort high-impact items
  • blockers_to_clear: items that unblock the most downstream work
  • project_health: status/type/priority distributions, graph metrics
  • commands: copy-paste shell commands for next steps

Minimal Alternative

# Just the single top pick + claim command
bv --robot-next

Why Use BV

Graph Intelligence vs. List Thinking

Traditional trackers treat issues as a flat list sorted by priority. BV sees your project as a dependency graph and answers questions like:

Traditional QuestionBV's Graph-Aware Answer
"What's highest priority?""What unblocks the most work?"
"What should I work on?""What's on the critical path with zero slack?"
"Is this issue important?""What's its PageRank? Betweenness? Does it bridge clusters?"
"Are we making progress?""Did we resolve cycles? Is density improving?"

Use Cases

# "What should I work on next?"
bv --robot-triage | jq '.recommendations[0]'

# "What's blocking the most progress?"
bv --robot-triage | jq '.blockers_to_clear'

# "Can multiple agents work in parallel?"
bv --robot-plan | jq '.tracks'

# "Are there circular dependencies?" (structural bugs!)
bv --robot-insights | jq '.Cycles'

# "What changed since last release?"
bv --robot-diff --diff-since v1.0.0

The 9 Graph Metrics

BV computes these metrics to surface hidden project dynamics:

#MetricWhat It MeasuresActionable Insight
1PageRankRecursive dependency importanceFoundational blockers
2BetweennessShortest-path trafficBottlenecks & bridges
3HITS HubsDependency aggregatorsEpics/milestones
4HITS AuthoritiesDepended-on utilitiesCore infrastructure
5Critical PathLongest dependency chainZero-slack keystones
6EigenvectorInfluence via neighborsStrategic dependencies
7DegreeDirect connection countsImmediate blockers/blocked
8DensityEdge-to-node ratioProject coupling health
9CyclesCircular dependenciesStructural bugs (must fix!)

Understanding the Metrics

PageRank (Foundational Blocks) High PageRank = bedrock of your project. Rarely user-facing features; usually schemas, core libraries, or architectural decisions. Breaking them breaks the graph.

Betweenness (Gatekeepers) High betweenness = choke point. Might be an API contract both mobile and server teams wait on. Delay here doesn't just block one thread—it prevents sub-teams from synchronizing.

HITS (Epics vs. Utilities)

  • High Hub Score: Epics/Product Features that aggregate many dependencies
  • High Authority Score: Utilities that provide value to many consumers

Critical Path (Keystones) Any delay on keystone tasks translates 1:1 into project delivery delay. These have zero "slack."

Cycles (Structural Bugs) Circular dependencies are logical impossibilities. They indicate:

  • Misclassified dependencies
  • Missing intermediate tasks
  • Scope confusion (should be merged)

Command Reference

Triage & Planning

# THE MEGA-COMMAND: comprehensive triage
bv --robot-triage

# Minimal: just the top pick
bv --robot-next

# Parallel execution tracks (for multi-agent work)
bv --robot-plan

# Priority misalignment detection
bv --robot-priority

Graph Analysis

# Full metrics: PageRank, betweenness, HITS, eigenvector, critical path, cycles
bv --robot-insights

# Label-based analysis
bv --robot-label-health           # Per-label health (healthy|warning|critical)
bv --robot-label-flow             # Cross-label dependencies, bottleneck labels
bv --robot-label-attention        # Attention-ranked labels
bv --robot-label-attention --attention-limit=5

History & Change Tracking

# Bead-to-commit correlations
bv --robot-history
bv --robot-history --bead-history BV-123   # Single bead focus
bv --robot-history --min-confidence 0.7     # High-confidence only

# Changes since a reference point
bv --robot-diff --diff-since HEAD~10
bv --robot-diff --diff-since v1.0.0
bv --robot-diff --diff-since "2024-01-01"

Sprint & Forecasting

# Sprint burndown
bv --robot-burndown "Sprint 42"

# ETA predictions with dependency-aware scheduling
bv --robot-forecast all
bv --robot-forecast BV-123

# Alerts: stale issues, blocking cascades, priority mismatches
bv --robot-alerts

# Hygiene suggestions: duplicates, missing deps, cycle breaks
bv --robot-suggest

Graph Export

# JSON (default)
bv --robot-graph

# Graphviz DOT (for rendering)
bv --robot-graph --graph-format=dot

# Mermaid (for docs)
bv --robot-graph --graph-format=mermaid

# Focused subgraph
bv --robot-graph --graph-root=BV-123 --graph-depth=3

# Interactive HTML visualization
bv --export-graph graph.html
bv --export-graph sprint.html --graph-title "Sprint 42"

Scoping & Filtering

# Scope to label's subgraph
bv --robot-plan --label backend

# Historical point-in-time analysis
bv --robot-insights --as-of HEAD~30
bv --robot-insights --as-of v1.0.0
bv --robot-insights --as-of "2024-01-15"

# Pre-filter with recipes
bv --recipe actionable --robot-plan    # Ready to work (no blockers)
bv --recipe high-impact --robot-triage # Top PageRank scores
bv --recipe bottlenecks --robot-plan   # High betweenness nodes

# Group triage output
bv --robot-triage --robot-triage-by-track  # By parallel work streams
bv --robot-triage --robot-triage-by-label  # By domain

Export & Reporting

# Markdown report with Mermaid diagrams
bv --export-md report.md

# Static site for stakeholder sharing
bv --pages                              # Interactive wizard
bv --export-pages ./dashboard           # Local export
bv --export-pages ./bv-pages --pages-title "Sprint 42 Status"
bv --preview-pages ./dir                # Preview locally

Understanding Robot Output

All Robot JSON Includes

FieldPurpose
data_hashFingerprint of beads.jsonl (verify consistency across calls)
statusPer-metric state: computed|approx|timeout|skipped + elapsed_ms
as_of / as_of_commitPresent when using --as-of; contains ref and resolved SHA

Two-Phase Analysis

BV uses async computation with intelligent timeouts:

PhaseMetricsLatencyNotes
Phase 1Degree, topo sort, densityInstantAlways available
Phase 2PageRank, betweenness, HITS, eigenvector, cycles500ms timeoutCheck status flags

For large graphs (>500 nodes): Some Phase 2 metrics may be approx or skipped. Always check the status field.

Caching

Results are cached by data_hash. Repeat calls with unchanged beads.jsonl return instantly.


jq Quick Reference

# At-a-glance summary
bv --robot-triage | jq '.quick_ref'

# Top recommendation
bv --robot-triage | jq '.recommendations[0]'

# Best unblock target
bv --robot-plan | jq '.plan.summary.highest_impact'

# Check metric readiness
bv --robot-insights | jq '.status'

# Find circular dependencies (MUST FIX!)
bv --robot-insights | jq '.Cycles'

# Critical labels needing attention
bv --robot-label-health | jq '.results.labels[] | select(.health_level == "critical")'

# All bottleneck issues
bv --robot-insights | jq '.bottlenecks'

Response Shapes

Triage Response

{
  "quick_ref": {
    "total_open": 42,
    "actionable": 15,
    "blocked": 12,
    "top_picks": ["BV-123", "BV-456", "BV-789"]
  },
  "recommendations": [
    {
      "id": "BV-123",
      "title": "Refactor auth module",
      "score": 0.85,
      "reasons": ["High PageRank", "Unblocks 5 tasks"],
      "unblocks": ["BV-200", "BV-201", "BV-202", "BV-203", "BV-204"]
    }
  ],
  "quick_wins": [...],
  "blockers_to_clear": [...],
  "project_health": {
    "status_distribution": {...},
    "priority_distribution": {...},
    "graph_density": 0.045,
    "cycle_count": 0
  },
  "commands": {
    "claim_top": "bd update BV-123 --status in_progress"
  },
  "data_hash": "abc123...",
  "status": {...}
}

Plan Response

{
  "plan": {
    "tracks": [
      {
        "track_id": "track-A",
        "reason": "Auth system dependency chain",
        "items": [
          { "id": "AUTH-001", "priority": 1, "unblocks": ["AUTH-002", "AUTH-003"] }
        ]
      }
    ],
    "summary": {
      "total_actionable": 8,
      "total_blocked": 12,
      "highest_impact": "AUTH-001",
      "impact_reason": "Unblocks 3 tasks"
    }
  },
  "data_hash": "...",
  "status": {...}
}

Insights Response

{
  "bottlenecks": [{ "id": "CORE-123", "value": 0.45 }],
  "keystones": [{ "id": "API-001", "value": 12.0 }],
  "influencers": [{ "id": "AUTH-007", "value": 0.82 }],
  "hubs": [{ "id": "EPIC-100", "value": 0.67 }],
  "authorities": [{ "id": "UTIL-050", "value": 0.91 }],
  "cycles": [["TASK-A", "TASK-B", "TASK-A"]],
  "clusterDensity": 0.045,
  "stats": {
    "pageRank": {...},
    "betweenness": {...},
    "eigenvector": {...},
    "hubs": {...},
    "authorities": {...},
    "inDegree": {...},
    "outDegree": {...},
    "criticalPathScore": {...},
    "topologicalOrder": [...]
  },
  "status": {
    "pageRank": { "state": "computed", "elapsed_ms": 12 },
    "betweenness": { "state": "computed", "elapsed_ms": 45 },
    "cycles": { "state": "computed", "elapsed_ms": 8 }
  }
}

Recipe System

BV ships with 11 pre-configured recipes for common workflows:

RecipePurpose
defaultAll open issues sorted by priority
actionableReady to work (no blockers)
recentUpdated in last 7 days
blockedWaiting on dependencies
high-impactTop PageRank scores
staleOpen but untouched for 30+ days
triageSorted by computed triage score
closedRecently closed issues
release-cutClosed in last 14 days (for changelogs)
quick-winsEasy P2/P3 items with no blockers
bottlenecksHigh betweenness nodes
bv --recipe actionable --robot-plan
bv --recipe high-impact --robot-triage
bv --recipe bottlenecks --robot-insights

Hybrid Semantic Search

BV supports text + graph metric hybrid search:

# Default text-only search
bv --search "login oauth"

# Hybrid mode with preset
bv --search "login oauth" --search-mode hybrid --search-preset impact-first

# Custom weights
bv --search "login oauth" --search-mode hybrid \
  --search-weights '{"text":0.4,"pagerank":0.2,"status":0.15,"impact":0.1,"priority":0.1,"recency":0.05}'

# Robot JSON output
bv --search "login oauth" --search-mode hybrid --robot-search

Presets: default, bug-hunting, sprint-planning, impact-first, text-only

Environment defaults:

  • BV_SEARCH_MODE (text|hybrid)
  • BV_SEARCH_PRESET
  • BV_SEARCH_WEIGHTS (JSON string)

Time-Travel: Snapshot Diffing

Compare project state across git history:

# View state at any git reference
bv --as-of HEAD~10
bv --as-of v1.0.0
bv --as-of "2024-01-15"
bv --as-of abc1234  # commit SHA

# Diff changes
bv --robot-diff --diff-since HEAD~10
bv --robot-diff --diff-since v1.0.0

What gets tracked:

  • Issues: New, Closed, Reopened, Removed, Modified
  • Fields: Title, Status, Priority, Tags, Dependencies
  • Graph: New Cycles, Resolved Cycles
  • Metrics: Δ PageRank, Δ Betweenness, Δ Density

History View: Git Correlation

BV correlates beads with commits using multiple strategies:

StrategyWeightHow It Works
Explicit Mentions0.5Commit message contains bead ID
Temporal Proximity0.25Commit during bead's active lifecycle
Co-Commit Analysis0.15Files frequently modified together
Path Matching0.10File paths match bead's label scope
# Full history report
bv --robot-history

# Single bead focus
bv --robot-history --bead-history BV-123

# Filter by confidence
bv --robot-history --min-confidence 0.7

# Time range
bv --robot-history --history-since "30 days ago"

Interactive HTML Graph

Generate self-contained HTML visualizations:

bv --export-graph graph.html
bv --export-graph --graph-title "Q4 Sprint"
bv --export-graph --graph-include-closed

Features:

  • Force-directed layout (pan, zoom, filter)
  • Node size by PageRank/betweenness/critical-path
  • Color by status (Open=green, Blocked=red, etc.)
  • Full-text search
  • Path finder (click two nodes to find shortest path)
  • Docked/floating detail panel
  • Light/dark mode
  • Works offline, no server required

Keyboard shortcuts: ? help, F fit all, R reset, L toggle light/dark, P path finder


TUI Features (for Humans)

Launch with bare bv:

Views

KeyViewDescription
(default)ListSplit-view with list + details
bKanban BoardColumnar workflow view
gGraphASCII/Unicode dependency visualization
iInsights6-panel metrics dashboard
hHistoryGit correlation timeline

Navigation

KeyAction
j/kNavigate up/down
h/lNavigate left/right (in board/graph)
EnterOpen in $EDITOR
SpaceFull-screen detail
/Search
TabCycle panels
?Help
qQuit

Filtering

KeyFilter
oOpen only
cClosed only
rReady (unblocked)
F3By label
F5/F6By time

Actions

KeyAction
EExport to Markdown
CCopy issue as Markdown
tTime-travel (compare to git ref)
pToggle priority hints overlay
sCycle sort mode

Composite Impact Scoring

BV computes multi-factor impact scores:

Impact = 0.30Ă—PageRank + 0.30Ă—Betweenness + 0.20Ă—BlockerRatio + 0.10Ă—Staleness + 0.10Ă—PriorityBoost

When computed impact diverges from human-assigned priority, BV flags misalignment:

⚠️ CORE-123 has Impact Score 0.85 but Priority P3. Reason: High PageRank (foundational dependency) + High Betweenness (bottleneck) Recommendation: Consider escalating to P1.


Baseline & Drift Detection

# Check drift from baseline
bv --check-drift
# Exit codes: 0=OK, 1=critical, 2=warning

# Get baseline info
bv --baseline-info

Use --check-drift in CI/CD to catch quality regressions.


Automation Hooks

Configure pre/post-export hooks in .bv/hooks.yaml:

pre_export:
  - command: "validate-issues.sh"
    on_error: fail
post_export:
  - command: "notify-slack.sh"
    on_error: continue
    env:
      CHANNEL: "#dev"

Hook environment includes: BV_EXPORT_PATH, BV_EXPORT_FORMAT, BV_ISSUE_COUNT, BV_TIMESTAMP


Performance Characteristics

OperationLatency
Phase 1 metricsInstant
Phase 2 metrics (<500 nodes)<500ms
Phase 2 metrics (large graphs)May timeout/approx
Cached repeat callsInstant (by data_hash)

Use bv --profile-startup for diagnostics.


Integration with bd (Beads CLI)

BV reads from .beads/beads.jsonl created by bd:

# Initialize beads
bd init

# Create issues
bd create "Implement login" -t feature -p 1

# Update status
bd update BV-123 --status in_progress

# Close
bd close BV-123 --reason "Completed"

Important: .beads/ is authoritative state. Always commit it with code changes.


Ready-to-Paste AGENTS.md Blurb

## bv - Beads Viewer (Graph-Aware Triage Engine)

bv is a graph-aware triage engine for Beads projects (.beads/beads.jsonl). Instead of parsing JSONL or hallucinating graph traversal, use robot flags for deterministic, dependency-aware outputs with precomputed metrics (PageRank, betweenness, HITS, eigenvector, critical path, cycles, k-core).

**⚠️ CRITICAL: Use ONLY `--robot-*` flags. Bare `bv` launches an interactive TUI that blocks your session.**

### The Workflow: Start With Triage
bv --robot-triage        # THE MEGA-COMMAND: start here
bv --robot-next          # Minimal: just the single top pick

### Key Commands
| Command | Returns |
|---------|---------|
| `--robot-triage` | Ranked recommendations, quick wins, blockers to clear |
| `--robot-plan` | Parallel execution tracks with unblocks lists |
| `--robot-insights` | Full metrics: PageRank, betweenness, cycles |
| `--robot-label-health` | Per-label health (healthy\|warning\|critical) |

### jq Quick Reference
bv --robot-triage | jq '.recommendations[0]'   # Top pick
bv --robot-plan | jq '.plan.summary'           # Best unblock target
bv --robot-insights | jq '.Cycles'             # Circular deps (MUST FIX!)

**Performance:** Phase 1 instant, Phase 2 async (500ms timeout). Results cached by data_hash.

Installation

curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/beads_viewer/main/install.sh?$(date +%s)" | bash