| name | beads |
| description | Expert knowledge for the bd (beads) CLI issue tracker. Use when working with beads issues, bd commands, .beads/ config files, or dependency management workflows. |
Beads (bd) CLI Expert
Beads is a lightweight, dependency-aware issue tracker with first-class
support for agent workflows, Git integration, and Dolt-powered storage.
The CLI is bd. This skill provides comprehensive reference for all
commands, flags, and workflows.
When to Use This Skill
Invoke this skill when:
- Running
bd commands (create, update, close, show, list, etc.)
- Managing issue dependencies and blockers
- Setting up beads in a new repository
- Debugging
.beads/ configuration or Dolt server issues
- Building automation around the bd CLI
- Understanding the issue lifecycle and status transitions
- Working with molecules (multi-step workflows), epics, or swarms
Core Concepts
Issue Lifecycle
Issues flow through these statuses:
- open — unstarted work, eligible for
bd ready
- in_progress — claimed and active
- blocked — has unresolved blockers (use
bd blocked to see these)
- deferred — hidden until a future date
- hooked — assigned to an agent's hook
- closed — completed
No done or complete status exists — only closed.
Dependency Semantics (Critical)
Dependencies express "X needs Y", not "X comes before Y":
bd dep add <dependent> <prerequisite>
WRONG mental model (temporal): "phase-1 blocks phase-2"
bd dep add phase1 phase2
CORRECT mental model (requirement): "phase-2 needs phase-1"
bd dep add phase2 phase1
Also: bd dep <blocker> --blocks <blocked> is a shorthand that reads
naturally: "blocker blocks blocked".
Issue IDs
IDs are prefixed per-project (e.g., bd-42, be-218, gt-7, hq-abc).
The prefix identifies which rig/database owns the issue.
bd commands auto-route to the correct database by prefix.
.beads/ Directory
Created by bd init. Contains:
*.db — SQLite or Dolt database redirect file
config.yaml — Project-level configuration
- Gitignored by default in most setups
Key Commands Reference
Finding Work
bd ready
bd ready --mol bd-abc
bd list --status open
bd blocked
bd list --all
bd list -t bug -a alice -l security -p 0
bd list --label-any "P0,P1" --type feature
bd search "authentication"
Viewing Issues
bd show bd-42
bd show bd-42 --short
bd show bd-42 --long
bd show bd-42 --children
bd show bd-42 --refs
bd show bd-42 --watch
bd show bd-42 --as-of <commit-hash>
Creating Issues
bd create "Issue title"
bd create "Fix auth bug" \
-t bug \
-p 1 \
-d "Description of the problem" \
-a alice \
-l security,authentication \
--due +2d
bd create "Phase 2 work" \
--deps "discovered-from:bd-10,bd-11"
bd q "Quick note"
bd create "Bug in gastown" --rig gastown
bd create "Bug" --prefix gt-
bd create "Test" --dry-run
bd create -f issues.md
bd create "Temporary note" --ephemeral
Issue Types: bug, feature, task, epic, chore, decision
- Aliases:
enhancement/feat → feature, dec/adr → decision
Priority: 0 (critical) through 4 (backlog), default 2
Updating Issues
bd update bd-42 --title "New title"
bd update bd-42 --status in_progress
bd update bd-42 -p 1 -a bob
bd update bd-42 --notes "Progress update"
bd update bd-42 --append-notes "Additional note"
bd update bd-42 --claim
bd update bd-42 --add-label security
bd update bd-42 --remove-label wontfix
bd update bd-42 --set-labels "security,high-priority"
bd update bd-42 --defer "2025-06-01"
bd update bd-42 --defer "+3d"
bd update bd-42 --defer ""
bd update bd-42 --due "+1w"
bd update bd-42 --due "next monday"
bd update bd-42 --due ""
bd update --notes "Progress"
Date formats: +6h, +1d, +2w, tomorrow, next monday,
2025-01-15, RFC3339
Closing Issues
bd close bd-42 --reason "Completed implementation"
bd close bd-42 --reason "no-changes: already fixed in bd-10"
bd close bd-42 --suggest-next
bd close bd-42 --continue
bd close bd-42 --force
bd done bd-42 --reason "Done"
Dependencies
bd dep add bd-42 bd-10
bd dep bd-10 --blocks bd-42
bd dep remove bd-42 bd-10
bd dep list bd-42
bd dep cycles
bd dep tree bd-42
bd dep relate bd-42 bd-55
Labels
bd label add bd-42 security
bd label remove bd-42 security
bd label list bd-42
bd label list-all
bd label propagate bd-42 security
Epics and Hierarchy
bd create "Large feature" -t epic
bd create "Subtask" --parent bd-epic
bd epic list
bd show bd-epic --children
Molecules (Multi-Step Workflows)
Molecules are structured sequences of steps (wisps) with a formula
template. Used by Gas Town agents for multi-phase work.
bd mol current
bd mol list
bd mol status
bd promote bd-wisp-xyz
Swarms
bd swarm --help
Environment Variables
| Variable | Default | Purpose |
|---|
BEADS_DOLT_PORT | 3307 | Dolt server port |
BEADS_DOLT_PASSWORD | (empty) | MySQL password for Dolt |
BD_ACTOR | git user.name or $USER | Actor name for audit trail |
BD_DEBUG_ROUTING | (unset) | Set to 1 to debug rig routing |
Development isolation: Use port 3308 for dev/test Dolt servers
to avoid touching the production server on 3307.
Global Flags
Available on all commands:
| Flag | Description |
|---|
--json | Output in JSON format (essential for scripting) |
--actor STRING | Override actor name for audit trail |
--db PATH | Override database path (default: auto-discover .beads/*.db) |
--dolt-auto-commit on|off|batch | Dolt commit policy |
--quiet / -q | Errors only |
--verbose / -v | Debug output |
--readonly | Block write operations |
--sandbox | Disable auto-sync |
--rig STRING | Query different rig (e.g., --rig gastown, --rig gt-) |
Configuration
bd config list
bd config set jira.url "https://company.atlassian.net"
bd config set status.custom "awaiting_review,awaiting_testing"
bd config set doctor.suppress.pending-migrations true
bd config get jira.url
bd config unset jira.url
Common namespaces: jira.*, linear.*, github.*, custom.*,
status.*, doctor.suppress.*
Dolt Server Management
Beads uses Dolt (a version-controlled MySQL-compatible database) as its
storage backend.
bd dolt start
bd dolt stop
bd dolt status
bd dolt commit
bd dolt push
bd dolt pull
bd dolt set port 3308
bd dolt set database myproject
bd dolt set host 127.0.0.1
bd dolt set data-dir /path/to/dolt-data
bd dolt show
bd dolt test
bd dolt clean-databases
bd dolt killall
NEVER use rm -rf on Dolt data directories. Use bd dolt cleanup
or bd dolt clean-databases instead.
Git Worktrees
bd worktree create feature-auth
bd worktree create bugfix --branch fix-1
bd worktree list
bd worktree remove feature-auth
bd worktree info
Worktrees automatically share the same .beads/ database via redirect
files, ensuring consistent issue state across all worktrees.
Initialization and Setup
bd init
bd init -p myprefix
bd init --stealth
bd setup claude
bd setup cursor
bd setup aider
bd doctor
bd prime
bd bootstrap
Sync and Versioning
bd dolt push
bd dolt pull
bd history bd-42
bd diff bd-42
bd branch list
bd branch create feature-work
Maintenance
bd status
bd stale
bd count --type bug --status open
bd compact
bd gc
bd export > issues.jsonl
bd init --from-jsonl
bd preflight
Common Agent Workflows
Claim and work on an issue
bd ready
bd update bd-42 --claim
bd close bd-42 --reason "Done"
File a discovered issue with context
bd create "Found bug in auth" \
-t bug -p 1 \
-d "Detailed description" \
--deps "discovered-from:bd-parent"
Multi-rig routing
bd create "Bug in CLI tool" --rig beads
bd create "Gas Town issue" --rig gastown
bd show hq-abc
bd show gt-7
Temporal dependency ordering
Rule: "X needs Y" not "X comes before Y"
bd dep add phase2-id phase1-id
bd blocked
JSON Output
Use --json for all programmatic access. Key fields in issue JSON:
{
"id": "bd-42",
"title": "Fix the bug",
"status": "open",
"type": "bug",
"priority": 1,
"assignee": "alice",
"labels": ["security"],
"description": "...",
"notes": "...",
"design": "...",
"acceptance": "...",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-02T00:00:00Z",
"due_at": null,
"defer_until": null,
"parent": null,
"deps": [{"type": "needs", "id": "bd-10"}]
}
Gotchas
-
bd ready vs bd list --ready: NOT equivalent. bd ready uses
blocker-aware semantics; bd list --ready only filters by stored status.
-
Dependency direction: bd dep add A B means "A needs B" (B must
complete before A can start). Think requirements, not time order.
-
--claim is atomic: Fails if already claimed by another agent.
This is intentional for agent coordination.
-
No done/complete status: Valid statuses are open,
in_progress, blocked, deferred, hooked, closed.
-
Dolt port conflicts: Dev/test MUST use port 3308, never 3307
(production). Set with bd dolt set port 3308.
-
Auto-routing by prefix: bd show be-42 routes to the beads_el
rig, bd show gt-7 routes to gastown. Set BD_DEBUG_ROUTING=1 to
debug.
-
--rig vs --prefix: --rig takes a rig name (e.g., gastown);
--prefix takes the issue prefix (e.g., gt- or gt).