Guide for using Beads (bd) distributed git-backed graph issue tracker. Use when managing tasks, tracking dependencies, working with AI agents, or running multi-branch parallel workflows.
Manages git-backed tasks and dependencies with AI-friendly JSON output for distributed workflows.
npx claudepluginhub vinnie357/claude-skillsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
agents/beads-worker.mdreferences/skill-catalog.mdreferences/teams-integration.mdtemplates/mise.tomlThis skill activates when working with Beads (bd) for task management, dependency tracking, and AI agent workflows.
Activate when:
Beads is a distributed git-backed graph issue tracker designed for AI agents and modern development workflows:
.beads/ directorybd readynpm install -g @anthropic/beads
brew install anthropic/tap/beads
go install github.com/steveyegge/beads/cmd/bd@latest
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.
# 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 --contributor
# 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 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 by ID (use first 4+ characters)
bd show abc1
# Full JSON output
bd show abc1 --json
# Show with comments
bd show abc1 --comments
# 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 task1
# 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 abc1
# Sync changes to remote
bd sync
# Pull changes from remote
bd pull
# Check sync status
bd status
All commands support --json for machine-readable output:
bd ready --json
Output:
[
{
"id": "abc12345",
"title": "Implement login form",
"status": "open",
"labels": ["feature", "frontend"],
"created": "2024-01-15T10:30:00Z",
"dependencies": [],
"blocking": ["def67890"]
}
]
bd show abc1 --json
Output:
{
"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"
}
]
}
# 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'
# 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 auth123
# 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"
# 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 cycle
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"
.beads/
├── tasks.jsonl # Task data (append-only)
├── comments.jsonl # Comments (append-only)
└── deps.jsonl # Dependencies (append-only)
.beads.sqlite # Local cache (not committed)
| 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 |
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 rebuild
The recommended workflow for git repositories integrates beads with feature branches and pull requests:
git checkout main && git pull # Start fresh
bd ready # Find available tasks
bd show <id> # Read task requirements
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" # Commit
git push -u origin <branch>
gh pr create --title "type(scope): description" --body "- Change one
- Change two"
# Notify user: "PR created: <url>"
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 branch
Notify user: "CI passed, tasks closed. Ready for merge review."
After user merges:
git checkout main && git pull # Sync with merged changes
git branch -d <branch> # Delete feature branch
bd ready # Find next task
bd update --status in_progressFor 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
done
# 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 toggle456
# 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'
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.
# 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 API
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"]
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"
| 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.
abc12345)Reference task IDs in commits:
git commit -m "Implement login form
Closes: abc12345"
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 execution
bd ready to find actionable tasks--json for all programmatic accessbd ready for task queueWhen 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:
references/skill-catalog.md for the keyword-to-skill mapping (Tier 1: static catalog)skill: labels for the most relevant skills from either tierMatching 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.
Two extensions enhance the beads experience in VS Code:
planet57.vscode-beads)Core beads integration for VS Code:
.beads/ filesInstall via Extensions panel or:
code --install-extension planet57.vscode-beads
DavidCForbes.beads-kanban)Visual kanban board for beads tasks:
Install via Extensions panel or:
code --install-extension DavidCForbes.beads-kanban
Add to .vscode/settings.json for beads projects:
{
"files.associations": {
"*.jsonl": "json"
},
"files.exclude": {
".beads.sqlite": true
}
}
# Rebuild SQLite cache from JSONL
bd rebuild
# Clear and rebuild
rm .beads.sqlite
bd rebuild
# Check status
bd status
# Manual conflict resolution
git status .beads/
git mergetool .beads/tasks.jsonl
bd rebuild
Hash collisions are rare but possible:
# Use more characters if ambiguous
bd show abc1234 # Instead of abc1
# Full IDs are always unique
bd show abc12345678
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 coordinationActivates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
This skill should be used when the user wants to "create a skill", "add a skill to plugin", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.