Beads - Distributed Git-Backed Issue Tracker
This skill activates when working with Beads (bd) for task management, dependency tracking, and AI agent workflows.
When to Use This Skill
Activate when:
- Managing tasks with dependencies in a git repository
- Working with AI agents that need task queue access
- Running multi-branch parallel development workflows
- Needing collision-resistant task IDs across distributed teams
- Tracking task hierarchies and dependency graphs
- Integrating issue tracking directly into version control
What is Beads?
Beads is a distributed git-backed graph issue tracker designed for AI agents and modern development workflows:
- Hash-based IDs: Collision-resistant task identifiers (8+ hex characters)
- Git-native storage: Tasks stored as JSONL in
.beads/directory - Dependency-aware: Query ready tasks with
bd ready - JSON output: Machine-readable format for AI agent integration
- SQLite cache: Fast local queries with git sync
Installation
npm (Recommended)
npm install -g @anthropic/beadsHomebrew (macOS)
brew install anthropic/tap/beadsGo Install
go install github.com/steveyegge/beads/cmd/bd@latestmise (Multi-Architecture)
Add to your mise.toml:
[tools."github:steveyegge/beads"]
version = "latest"
[tools."github:steveyegge/beads".platforms]
linux-x64 = { asset_pattern = "beads_*_linux_amd64.tar.gz" }
macos-arm64 = { asset_pattern = "beads_*_darwin_arm64.tar.gz" }See templates/multi-arch.md for platform-specific patterns.
Getting Started
Initialize Beads
# Full mode - syncs to remote (shared with team)
bd init
# Stealth mode - local only, no commits
bd init --stealth
# Contributor mode - pull only, no push
bd init --contributorCreate Tasks
# Create a task with title
bd create "Implement user authentication"
# Create with description
bd create "Fix login bug" --description "Users cannot log in with special characters"
# Create with labels
bd create "Add dark mode" --labels "feature,ui"
# Create with assignee
bd create "Review PR" --assignee "alice"List Tasks
# List all open tasks
bd list
# List ready tasks (no blockers)
bd ready
# JSON output for agents
bd list --json
bd ready --json
# Filter by status
bd list --status open
bd list --status closed
# Filter by label
bd list --labels "bug"
# Filter by assignee
bd list --assignee "bob"Show Task Details
# Show task by ID (use first 4+ characters)
bd show abc1
# Full JSON output
bd show abc1 --json
# Show with comments
bd show abc1 --commentsManage Dependencies
# Add dependency (task2 depends on task1)
bd dep add task2 task1
# Remove dependency
bd dep remove task2 task1
# View dependency graph
bd dep graph
# List blockers for a task
bd dep blockers task2
# List tasks blocked by a task
bd dep blocking task1Update Tasks
# Close a task
bd close abc1
# Reopen a task
bd reopen abc1
# Add a comment
bd comment abc1 "Working on this now"
# Update labels
bd label abc1 --add "priority:high"
bd label abc1 --remove "wip"
# Assign task
bd assign abc1 alice
# Unassign
bd unassign abc1Sync with Git
# Sync changes to remote
bd sync
# Pull changes from remote
bd pull
# Check sync status
bd statusJSON Output for AI Agents
All commands support --json for machine-readable output:
List Ready Tasks (JSON)
bd ready --jsonOutput:
[
{
"id": "abc12345",
"title": "Implement login form",
"status": "open",
"labels": ["feature", "frontend"],
"created": "2024-01-15T10:30:00Z",
"dependencies": [],
"blocking": ["def67890"]
}
]Show Task Details (JSON)
bd show abc1 --jsonOutput:
{
"id": "abc12345",
"title": "Implement login form",
"description": "Create a login form with email and password fields",
"status": "open",
"labels": ["feature", "frontend"],
"assignee": "alice",
"created": "2024-01-15T10:30:00Z",
"updated": "2024-01-16T14:20:00Z",
"dependencies": [],
"blocking": ["def67890"],
"comments": [
{
"author": "bob",
"body": "Should we add OAuth support?",
"created": "2024-01-15T11:00:00Z"
}
]
}Parse JSON in Scripts
# Get first ready task ID
TASK_ID=$(bd ready --json | jq -r '.[0].id')
# Count open tasks
bd list --json | jq 'length'
# Get task titles
bd list --json | jq -r '.[].title'Task Hierarchies
Parent-Child Relationships
# Create parent task
bd create "Authentication system"
# Returns: Created task auth123
# Create child tasks
bd create "Login form" --parent auth123
bd create "Password reset" --parent auth123
bd create "Session management" --parent auth123
# List children
bd list --parent auth123
# View hierarchy
bd tree auth123Epic/Story/Task Pattern
# Create epic
bd create "User Management Epic" --labels "epic"
# Create stories under epic
bd create "User registration story" --parent epic123 --labels "story"
bd create "User profile story" --parent epic123 --labels "story"
# Create tasks under stories
bd create "Design registration form" --parent story456 --labels "task"
bd create "Implement validation" --parent story456 --labels "task"Dependency Management
Dependency Types
# Task A blocks Task B (B depends on A)
bd dep add taskB taskA
# View what blocks a task
bd dep blockers taskB
# View what a task blocks
bd dep blocking taskA
# Circular dependency detection
bd dep add taskA taskB # Error if creates cycleReady Tasks Query
The bd ready command shows tasks with no unresolved dependencies:
# All ready tasks
bd ready
# Ready tasks with label
bd ready --labels "priority:high"
# Ready tasks for assignee
bd ready --assignee "alice"Storage and Sync
File Structure
.beads/
├── tasks.jsonl # Task data (append-only)
├── comments.jsonl # Comments (append-only)
└── deps.jsonl # Dependencies (append-only)
.beads.sqlite # Local cache (not committed)Sync Modes
| Mode | bd init Flag | Commits | Pushes | Use Case |
|---|---|---|---|---|
| Full | (default) | Yes | Yes | Team shared |
| Stealth | --stealth | No | No | Local only |
| Contributor | --contributor | Yes | No | Pull-only |
Conflict Resolution
Beads uses append-only JSONL and hash-based IDs to minimize conflicts:
# Pull remote changes
bd pull
# Resolve conflicts in .beads/ files
git mergetool .beads/tasks.jsonl
# Rebuild cache after conflict resolution
bd rebuildWorkflow Examples
PR-Based Development Workflow
The recommended workflow for git repositories integrates beads with feature branches and pull requests:
Session Start
git checkout main && git pull # Start fresh
bd ready # Find available tasks
bd show <id> # Read task requirementsTask Execution
git checkout -b feature/<name> # Create feature branch
bd update <id> --status in_progress # Claim task
# Do the work:
# - Read existing code to understand patterns
# - Implement following TDD (tests first when practical)
# - Run quality gates (tests, linters, formatters)
git add <files> # Stage changes
git commit -m "type(scope): description" # CommitPR Creation
git push -u origin <branch>
gh pr create --title "type(scope): description" --body "- Change one
- Change two"
# Notify user: "PR created: <url>"Watch CI & Close Tasks
Watch CI until it passes, then close tasks:
gh pr checks --watch # Wait for CI to complete
bd close <id> # Close completed task
git add .beads/ && git commit -m "chore(beads): close <id>"
git push # Push closure to branchNotify user: "CI passed, tasks closed. Ready for merge review."
Cleanup & Continue
After user merges:
git checkout main && git pull # Sync with merged changes
git branch -d <branch> # Delete feature branch
bd ready # Find next taskKey Principles
- One task = one branch = one PR - Keep changes atomic
- Claim before working -
bd update --status in_progress - Close with completion - Document what was done
- Minimal PRs - Title + bullets only, no templates
- Wait for user - Never auto-merge or assume approval
- Clean up - Delete local branch after merge
AI Agent Task Loop (Automated)
For automated processing without PRs:
#!/bin/bash
# Agent picks up ready tasks until none remain
while true; do
TASK=$(bd ready --json | jq -r '.[0] // empty')
if [ -z "$TASK" ]; then
echo "No ready tasks"
break
fi
TASK_ID=$(echo "$TASK" | jq -r '.id')
TITLE=$(echo "$TASK" | jq -r '.title')
echo "Working on: $TITLE ($TASK_ID)"
# Do work...
bd close "$TASK_ID"
bd sync
doneFeature Branch Workflow
# Create feature tasks
bd create "Feature: Dark Mode" --labels "feature"
bd create "Add theme toggle" --parent feat123
bd create "Update color palette" --parent feat123
bd dep add toggle456 palette789 # Toggle depends on palette
# Work on branch
git checkout -b feature/dark-mode
# Complete tasks as you go
bd close palette789
bd sync
# Toggle is now ready
bd ready # Shows toggle456Sprint Planning
# Create sprint container
bd create "Sprint 42" --labels "sprint"
# Add sprint items
bd create "User story 1" --parent sprint42
bd create "User story 2" --parent sprint42
bd create "Bug fix 1" --parent sprint42
# Assign work
bd assign story1 alice
bd assign story2 bob
bd assign bug1 charlie
# Track progress
bd list --parent sprint42 --json | jq '[.[] | select(.status=="closed")] | length'Claude Teams Epic Workflow
When using Claude Agent Teams (CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1) with beads, the team lead decomposes an epic into beads tasks and mirrors them into Claude's built-in task list for real-time coordination. The claude-teams skill should be available for full guidance on team setup.
Step 1: Team Lead Plans and Decomposes
# Create epic with stories
bd create "Auth System Epic" --labels "epic"
bd create "Login API endpoint" --parent epic123 --labels "story,skill:security"
bd create "Session middleware" --parent epic123 --labels "story,skill:twelve-factor"
bd create "Login UI form" --parent epic123 --labels "story,skill:accessibility"
# Set dependencies
bd dep add session456 login789 # Session depends on Login APIStep 2: Mirror into Claude Task List
For each beads task, create a matching Claude task with [bd:ID] in the subject for cross-referencing:
TaskCreate subject="[bd:login789] Login API endpoint"
description="Implement POST /api/auth/login. Skills: security. See bd show login789 for full spec."
TaskCreate subject="[bd:session456] Session middleware"
description="JWT session management. Skills: twelve-factor. See bd show session456 for full spec."
TaskCreate subject="[bd:ui321] Login UI form"
description="Login form with validation. Skills: accessibility. See bd show ui321 for full spec."
# Mirror dependencies
TaskUpdate taskId="session-task" addBlockedBy=["login-task"]Step 3: Teammates Claim and Execute
Each teammate checks both systems:
# 1. Find available work
TaskList # See unblocked Claude tasks
bd show <id> # Get full spec from beads
# 2. Claim in both systems
bd update <id> --status in_progress
TaskUpdate taskId="<claude-id>" status="in_progress"
# 3. Do the work, then close both
bd close <id>
TaskUpdate taskId="<claude-id>" status="completed"Step 4: Dual-System Sync Rules
| Event | Beads Action | Claude Task Action |
|---|---|---|
| Task created | bd create | TaskCreate with [bd:ID] subject |
| Work started | bd update --status in_progress | TaskUpdate status="in_progress" |
| Work completed | bd close (first) | TaskUpdate status="completed" (second) |
| Work blocked | bd comment with blocker | TaskUpdate addBlockedBy |
Beads is the persistent source of truth (git-backed). Claude's task list is the ephemeral coordination layer (session-scoped). Always update beads first.
See references/teams-integration.md for the full mirroring protocol.
Best Practices
Task ID References
- Use at least 4 characters of the hash ID
- Full IDs are 8+ characters (e.g.,
abc12345) - Shorter prefixes work if unique in the repo
Commit Messages
Reference task IDs in commits:
git commit -m "Implement login form
Closes: abc12345"Labels Convention
type:bug, type:feature, type:chore
priority:high, priority:medium, priority:low
status:wip, status:blocked, status:review
sprint:42, epic:auth
skill:git, skill:security, skill:rust # Suggested skills for task executionDependency Best Practices
- Keep dependency chains shallow (< 5 levels)
- Use
bd readyto find actionable tasks - Avoid circular dependencies (bd detects these)
- Document blocking reasons in comments
AI Agent Integration
- Use
--jsonfor all programmatic access - Poll
bd readyfor task queue - Close tasks atomically after completion
- Sync frequently in multi-agent scenarios
Skills-Aware Task Creation
When creating tasks, analyze the task domain and suggest relevant marketplace skills using skill: labels. This helps the beads-worker agent (and humans) know which skills to activate during execution.
How to suggest skills:
- Identify the task domain from its title, description, and labels
- Consult
references/skill-catalog.mdfor the keyword-to-skill mapping (Tier 1: static catalog) - Check available skills in the current session for additional matches beyond the catalog (Tier 2: runtime discovery)
- Add 1-3
skill:labels for the most relevant skills from either tier
Matching priority: explicit skill: labels > static catalog keyword match > runtime skill description match.
Note: skill: labels work with any installed skill, not just those in the static catalog. If a user has third-party skills loaded, those can be suggested and activated by the worker.
Example with skill suggestions:
bd create "Add pre-commit gitleaks scanning" \
--labels "type:feature,skill:security,skill:git" \
--description "## Task
Integrate gitleaks pre-commit hook for secret detection.
## Suggested Skills
- security: gitleaks configuration and scanning patterns
- git: pre-commit hook setup and git workflow integration"Include a ## Suggested Skills block in the description when skills need context beyond the label name. This tells the worker *why* each skill is relevant.
IDE Integration
VS Code Extensions
Two extensions enhance the beads experience in VS Code:
Beads Extension (planet57.vscode-beads)
Core beads integration for VS Code:
- Task list sidebar view
- Create, edit, and close tasks from the editor
- Syntax highlighting for
.beads/files - Task ID autocompletion in commit messages
Install via Extensions panel or:
code --install-extension planet57.vscode-beadsBeads Kanban (DavidCForbes.beads-kanban)
Visual kanban board for beads tasks:
- Drag-and-drop task management
- Status columns (open, in-progress, closed)
- Filter by labels and assignees
- Dependency visualization
Install via Extensions panel or:
code --install-extension DavidCForbes.beads-kanbanRecommended VS Code Settings
Add to .vscode/settings.json for beads projects:
{
"files.associations": {
"*.jsonl": "json"
},
"files.exclude": {
".beads.sqlite": true
}
}Troubleshooting
Cache Issues
# Rebuild SQLite cache from JSONL
bd rebuild
# Clear and rebuild
rm .beads.sqlite
bd rebuildSync Conflicts
# Check status
bd status
# Manual conflict resolution
git status .beads/
git mergetool .beads/tasks.jsonl
bd rebuildID Collisions
Hash collisions are rare but possible:
# Use more characters if ambiguous
bd show abc1234 # Instead of abc1
# Full IDs are always unique
bd show abc12345678References
references/skill-catalog.md: Skill catalog with keyword triggers for task matchingreferences/teams-integration.md: Full protocol for mirroring beads tasks into Claude's task list for Agent Teams coordination
Key Principles
- Git-native: Tasks live in the repo, versioned with code
- Collision-resistant: Hash IDs work across branches and forks
- Dependency-aware: Query ready tasks, manage blockers
- AI-friendly: JSON output for programmatic access
- Distributed: No central server, sync via git