# Beads Documentation (Complete) > This file contains the complete beads documentation for LLM consumption. > Generated automatically from the documentation source files. > For the web version, visit: https://steveyegge.github.io/beads/ --- # Beads Documentation **Beads** (`bd`) is a git-backed issue tracker designed for AI-supervised coding workflows. ## Why Beads? Traditional issue trackers (Jira, GitHub Issues) weren't designed for AI agents. Beads was built from the ground up for: - **AI-native workflows** - Hash-based IDs prevent collisions when multiple agents work concurrently - **Git-backed storage** - Issues sync via JSONL files, enabling collaboration across branches - **Dependency-aware execution** - `bd ready` shows only unblocked work - **Formula system** - Declarative templates for repeatable workflows - **Multi-agent coordination** - Routing, gates, and molecules for complex workflows ## Quick Start ```bash # Install via Homebrew (macOS/Linux) brew install beads # Or quick install (macOS/Linux/FreeBSD) curl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash # Initialize in your project cd your-project bd init --quiet # Create your first issue bd create "Set up database" -p 1 -t task # See ready work bd ready ``` ## Core Concepts | Concept | Description | |---------|-------------| | **Issues** | Work items with priorities, types, labels, and dependencies | | **Dependencies** | `blocks`, `parent-child`, `discovered-from`, `related` | | **Daemon** | Background process for auto-sync and performance | | **Formulas** | Declarative workflow templates (TOML or JSON) | | **Molecules** | Work graphs with parent-child relationships | | **Gates** | Async coordination primitives (human, timer, GitHub) | ## For AI Agents Beads is optimized for AI coding agents: ```bash # Always use --json for programmatic access bd list --json bd show bd-42 --json # Track discovered work during implementation bd create "Found bug in auth" --description="Details..." \ --deps discovered-from:bd-100 --json # Sync at end of session bd sync ``` See the [Claude Code integration](/integrations/claude-code) for detailed agent instructions. ## Architecture ``` SQLite DB (.beads/beads.db, gitignored) ↕ auto-sync (5s debounce) JSONL (.beads/issues.jsonl, git-tracked) ↕ git push/pull Remote JSONL (shared across machines) ``` The magic is automatic synchronization between a local SQLite database and git-tracked JSONL files. ## Next Steps - [Installation](/getting-started/installation) - Get bd installed - [Quick Start](/getting-started/quickstart) - Create your first issues - [CLI Reference](/cli-reference) - All available commands - [Workflows](/workflows) - Formulas, molecules, and gates # IDE Setup for AI Agents Configure your IDE for optimal beads integration. ## Claude Code The recommended approach for Claude Code: ```bash # Setup Claude Code integration bd setup claude ``` This installs: - **SessionStart hook** - Runs `bd prime` when Claude Code starts - **PreCompact hook** - Ensures `bd sync` before context compaction **How it works:** 1. SessionStart hook runs `bd prime` automatically 2. `bd prime` injects ~1-2k tokens of workflow context 3. You use `bd` CLI commands directly 4. Git hooks auto-sync the database **Verify installation:** ```bash bd setup claude --check ``` ### Manual Setup If you prefer manual configuration, add to your Claude Code hooks: ```json { "hooks": { "SessionStart": ["bd prime"], "PreCompact": ["bd sync"] } } ``` ## Cursor IDE ```bash # Setup Cursor integration bd setup cursor ``` This creates `.cursor/rules/beads.mdc` with beads-aware rules. **Verify:** ```bash bd setup cursor --check ``` ## Aider ```bash # Setup Aider integration bd setup aider ``` This creates/updates `.aider.conf.yml` with beads context. **Verify:** ```bash bd setup aider --check ``` ## Context Injection with `bd prime` All integrations use `bd prime` to inject context: ```bash bd prime ``` This outputs a compact (~1-2k tokens) workflow reference including: - Available commands - Current project status - Workflow patterns - Best practices **Why context efficiency matters:** - Compute cost scales with tokens - Latency increases with context size - Models attend better to smaller, focused contexts ## MCP Server (Alternative) For MCP-only environments (Claude Desktop, no shell access): ```bash # Install MCP server pip install beads-mcp ``` Add to Claude Desktop config: ```json { "mcpServers": { "beads": { "command": "beads-mcp" } } } ``` **Trade-offs:** - Works in MCP-only environments - Higher context overhead (10-50k tokens for tool schemas) - Additional latency from MCP protocol See [MCP Server](/integrations/mcp-server) for detailed configuration. ## Git Hooks Ensure git hooks are installed for auto-sync: ```bash bd hooks install ``` This installs: - **pre-commit** - Validates changes before commit - **post-merge** - Imports changes after pull - **pre-push** - Ensures sync before push **Check hook status:** ```bash bd info # Shows warnings if hooks are outdated ``` ## Verifying Your Setup Run a complete health check: ```bash # Check version bd version # Check daemon bd info # Check hooks bd hooks status # Check editor integration bd setup claude --check # or cursor, aider ``` # Installing bd Complete installation guide for all platforms. ## Quick Install (Recommended) ### Homebrew (macOS/Linux) ```bash brew install beads ``` **Why Homebrew?** - Simple one-command install - Automatic updates via `brew upgrade` - No need to install Go - Handles PATH setup automatically ### Quick Install Script (All Platforms) ```bash curl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash ``` The installer will: - Detect your platform (macOS/Linux/FreeBSD, amd64/arm64) - Install via `go install` if Go is available - Fall back to building from source if needed - Guide you through PATH setup if necessary ## Platform-Specific Installation ### macOS **Via Homebrew** (recommended): ```bash brew install beads ``` **Via go install**: ```bash go install github.com/steveyegge/beads/cmd/bd@latest ``` **From source**: ```bash git clone https://github.com/steveyegge/beads cd beads go build -o bd ./cmd/bd sudo mv bd /usr/local/bin/ ``` ### Linux **Via Homebrew** (works on Linux too): ```bash brew install beads ``` **Arch Linux** (AUR): ```bash # Install from AUR yay -S beads-git # or paru -S beads-git ``` **Via go install**: ```bash go install github.com/steveyegge/beads/cmd/bd@latest ``` ### FreeBSD **Via quick install script**: ```bash curl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash ``` **Via go install**: ```bash go install github.com/steveyegge/beads/cmd/bd@latest ``` ### Windows 11 Beads ships with native Windows support—no MSYS or MinGW required. **Prerequisites:** - [Go 1.24+](https://go.dev/dl/) installed (add `%USERPROFILE%\go\bin` to your `PATH`) - Git for Windows **Via PowerShell script**: ```pwsh irm https://raw.githubusercontent.com/steveyegge/beads/main/install.ps1 | iex ``` **Via go install**: ```pwsh go install github.com/steveyegge/beads/cmd/bd@latest ``` ## IDE and Editor Integrations ### CLI + Hooks (Recommended) The recommended approach for Claude Code, Cursor, Windsurf, and other editors with shell access: ```bash # 1. Install bd CLI (see Quick Install above) brew install bd # 2. Initialize in your project cd your-project bd init --quiet # 3. Setup editor integration (choose one) bd setup claude # Claude Code - installs SessionStart/PreCompact hooks bd setup cursor # Cursor IDE - creates .cursor/rules/beads.mdc bd setup aider # Aider - creates .aider.conf.yml ``` **How it works:** - Editor hooks/rules inject `bd prime` automatically on session start - `bd prime` provides ~1-2k tokens of workflow context - You use `bd` CLI commands directly - Git hooks (installed by `bd init`) auto-sync the database **Why this is recommended:** - **Context efficient** - ~1-2k tokens vs 10-50k for MCP tool schemas - **Lower latency** - Direct CLI calls, no MCP protocol overhead - **Universal** - Works with any editor that has shell access ### MCP Server (Alternative) Use MCP only when CLI is unavailable (Claude Desktop, Sourcegraph Amp without shell): ```bash # Using uv (recommended) uv tool install beads-mcp # Or using pip pip install beads-mcp ``` **Configuration for Claude Desktop** (macOS): Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: ```json { "mcpServers": { "beads": { "command": "beads-mcp" } } } ``` ## Verifying Installation After installing, verify bd is working: ```bash bd version bd help ``` ## Troubleshooting ### `bd: command not found` bd is not in your PATH: ```bash # Check if installed go list -f {{.Target}} github.com/steveyegge/beads/cmd/bd # Add Go bin to PATH (add to ~/.bashrc or ~/.zshrc) export PATH="$PATH:$(go env GOPATH)/bin" ``` ### `zsh: killed bd` or crashes on macOS This is typically caused by CGO/SQLite compatibility issues: ```bash # Build with CGO enabled CGO_ENABLED=1 go install github.com/steveyegge/beads/cmd/bd@latest ``` ## Updating bd ### Homebrew ```bash brew upgrade bd ``` ### go install ```bash go install github.com/steveyegge/beads/cmd/bd@latest ``` ## Next Steps After installation: 1. **Initialize a project**: `cd your-project && bd init` 2. **Learn the basics**: See [Quick Start](/getting-started/quickstart) 3. **Configure your agent**: See [IDE Setup](/getting-started/ide-setup) # Beads Quick Start Get up and running with Beads in 2 minutes. ## Initialize First time in a repository: ```bash # Basic setup bd init # For AI agents (non-interactive) bd init --quiet # OSS contributor (fork workflow) bd init --contributor # Team member (branch workflow) bd init --team # Protected main branch (GitHub/GitLab) bd init --branch beads-sync ``` The wizard will: - Create `.beads/` directory and database - Import existing issues from git (if any) - Prompt to install git hooks (recommended) - Prompt to configure git merge driver (recommended) - Auto-start daemon for sync ## Your First Issues ```bash # Create a few issues bd create "Set up database" -p 1 -t task bd create "Create API" -p 2 -t feature bd create "Add authentication" -p 2 -t feature # List them bd list ``` **Note:** Issue IDs are hash-based (e.g., `bd-a1b2`, `bd-f14c`) to prevent collisions when multiple agents/branches work concurrently. ## Hierarchical Issues (Epics) For large features, use hierarchical IDs to organize work: ```bash # Create epic (generates parent hash ID) bd create "Auth System" -t epic -p 1 # Returns: bd-a3f8e9 # Create child tasks (automatically get .1, .2, .3 suffixes) bd create "Design login UI" -p 1 # bd-a3f8e9.1 bd create "Backend validation" -p 1 # bd-a3f8e9.2 bd create "Integration tests" -p 1 # bd-a3f8e9.3 # View hierarchy bd dep tree bd-a3f8e9 ``` Output: ``` Dependency tree for bd-a3f8e9: > bd-a3f8e9: Auth System [epic] [P1] (open) > bd-a3f8e9.1: Design login UI [P1] (open) > bd-a3f8e9.2: Backend validation [P1] (open) > bd-a3f8e9.3: Integration tests [P1] (open) ``` ## Add Dependencies ```bash # API depends on database bd dep add bd-2 bd-1 # Auth depends on API bd dep add bd-3 bd-2 # View the tree bd dep tree bd-3 ``` Output: ``` Dependency tree for bd-3: > bd-3: Add authentication [P2] (open) > bd-2: Create API [P2] (open) > bd-1: Set up database [P1] (open) ``` ## Find Ready Work ```bash bd ready ``` Output: ``` Ready work (1 issues with no blockers): 1. [P1] bd-1: Set up database ``` Only bd-1 is ready because bd-2 and bd-3 are blocked! ## Work the Queue ```bash # Start working on bd-1 bd update bd-1 --status in_progress # Complete it bd close bd-1 --reason "Database setup complete" # Check ready work again bd ready ``` Now bd-2 is ready! ## Track Progress ```bash # See blocked issues bd blocked # View statistics bd stats ``` ## Database Location By default, the database is in `.beads/beads.db` (gitignored). The JSONL file `.beads/issues.jsonl` is git-tracked and syncs automatically. ## Next Steps - Add labels: `bd create "Task" -l "backend,urgent"` - Filter ready work: `bd ready --priority 1` - Search issues: `bd list --status open` - Detect cycles: `bd dep cycles` - See [CLI Reference](/cli-reference) for all commands # Upgrading bd How to upgrade bd and keep your projects in sync. ## Checking for Updates ```bash # Current version bd version # What's new in recent versions bd info --whats-new bd info --whats-new --json # Machine-readable ``` ## Upgrading ### Homebrew ```bash brew upgrade bd ``` ### go install ```bash go install github.com/steveyegge/beads/cmd/bd@latest ``` ### From Source ```bash cd beads git pull go build -o bd ./cmd/bd sudo mv bd /usr/local/bin/ ``` ## After Upgrading **Important:** After upgrading, update your hooks and restart daemons: ```bash # 1. Check what changed bd info --whats-new # 2. Update git hooks to match new version bd hooks install # 3. Restart all daemons bd daemons killall # 4. Check for any outdated hooks bd info # Shows warnings if hooks are outdated ``` **Why update hooks?** Git hooks are versioned with bd. Outdated hooks may miss new auto-sync features or bug fixes. ## Database Migrations After major upgrades, check for database migrations: ```bash # Inspect migration plan (AI agents) bd migrate --inspect --json # Preview migration changes bd migrate --dry-run # Apply migrations bd migrate # Migrate and clean up old files bd migrate --cleanup --yes ``` ## Daemon Version Mismatches If you see daemon version mismatch warnings: ```bash # List all running daemons bd daemons list --json # Check for version mismatches bd daemons health --json # Restart all daemons with new version bd daemons killall --json ``` ## Troubleshooting Upgrades ### Old daemon still running ```bash bd daemons killall ``` ### Hooks out of date ```bash bd hooks install ``` ### Database schema changed ```bash bd migrate --dry-run bd migrate ``` ### Import errors after upgrade Check the import configuration: ```bash bd config get import.orphan_handling bd import -i .beads/issues.jsonl --orphan-handling allow ``` # Core Concepts Understanding the fundamental concepts behind beads. ## Design Philosophy Beads was built with these principles: 1. **Git as source of truth** - Issues sync via JSONL files, enabling collaboration across branches 2. **AI-native workflows** - Hash-based IDs, JSON output, dependency-aware execution 3. **Local-first operation** - SQLite database for fast queries, background sync 4. **Declarative workflows** - Formulas define repeatable patterns ## Key Components ### Issues Work items with: - **ID** - Hash-based (e.g., `bd-a1b2`) or hierarchical (e.g., `bd-a1b2.1`) - **Type** - `bug`, `feature`, `task`, `epic`, `chore` - **Priority** - 0 (critical) to 4 (backlog) - **Status** - `open`, `in_progress`, `closed` - **Labels** - Flexible tagging - **Dependencies** - Blocking relationships ### Dependencies Four types of relationships: | Type | Description | Affects Ready Queue | |------|-------------|---------------------| | `blocks` | Hard dependency (X blocks Y) | Yes | | `parent-child` | Epic/subtask relationship | No | | `discovered-from` | Track issues found during work | No | | `related` | Soft relationship | No | ### Daemon Background process per workspace: - Auto-starts on first command - Handles auto-sync with 5s debounce - Socket at `.beads/bd.sock` - Manage with `bd daemons` commands ### JSONL Sync The synchronization mechanism: ``` SQLite DB (.beads/beads.db) ↕ auto-sync JSONL (.beads/issues.jsonl) ↕ git Remote repository ``` ### Formulas Declarative workflow templates: - Define steps with dependencies - Variable substitution - Gates for async coordination - Aspect-oriented transformations ## Navigation - [Issues & Dependencies](/core-concepts/issues) - [Daemon Architecture](/core-concepts/daemon) - [JSONL Sync](/core-concepts/jsonl-sync) - [Hash-based IDs](/core-concepts/hash-ids) # Daemon Architecture Beads runs a background daemon for auto-sync and performance. ## Overview Each workspace gets its own daemon process: - Auto-starts on first `bd` command - Handles database ↔ JSONL synchronization - Listens on `.beads/bd.sock` (Unix) or `.beads/bd.pipe` (Windows) - Version checking prevents mismatches after upgrades ## How It Works ``` CLI Command ↓ RPC to Daemon ↓ Daemon executes ↓ Auto-sync to JSONL (5s debounce) ``` Without daemon, commands access the database directly (slower, no auto-sync). ## Managing Daemons ```bash # List all running daemons bd daemons list bd daemons list --json # Check health and version mismatches bd daemons health bd daemons health --json # View daemon logs bd daemons logs . -n 100 # Restart all daemons bd daemons killall bd daemons killall --json ``` ## Daemon Info ```bash bd info ``` Shows: - Daemon status (running/stopped) - Daemon version vs CLI version - Socket location - Auto-sync status ## Disabling Daemon Use `--no-daemon` flag to bypass the daemon: ```bash bd --no-daemon ready bd --no-daemon list ``` **When to disable:** - Git worktrees (required) - CI/CD pipelines - Resource-constrained environments - Debugging sync issues ## Event-Driven Mode (Experimental) Event-driven mode replaces 5-second polling with instant reactivity: ```bash # Enable globally export BEADS_DAEMON_MODE=events bd daemons killall # Restart to apply ``` **Benefits:** - Less than 500ms latency (vs 5s polling) - ~60% less CPU usage - Instant sync after changes **How to verify:** ```bash bd info | grep "daemon mode" ``` ## Troubleshooting ### Daemon not starting ```bash # Check if socket exists ls -la .beads/bd.sock # Try direct mode bd --no-daemon info # Restart daemon bd daemons killall bd info ``` ### Version mismatch After upgrading bd: ```bash bd daemons killall bd info # Should show matching versions ``` ### Sync not happening ```bash # Force sync bd sync # Check daemon logs bd daemons logs . -n 50 # Verify git status git status .beads/ ``` ### Port/socket conflicts ```bash # Kill all daemons bd daemons killall # Remove stale socket rm -f .beads/bd.sock # Restart bd info ``` ## Configuration Daemon behavior can be configured: ```bash # Set sync debounce interval bd config set daemon.sync_interval 10s # Disable auto-start bd config set daemon.auto_start false # Set log level bd config set daemon.log_level debug ``` See [Configuration](/reference/configuration) for all options. # Hash-based IDs Understanding beads' collision-resistant ID system. ## The Problem Traditional sequential IDs (`#1`, `#2`, `#3`) break when: - Multiple agents create issues simultaneously - Different branches have independent numbering - Forks diverge and later merge ## The Solution Beads uses hash-based IDs: ``` bd-a1b2c3 # Short hash bd-f14c # Even shorter bd-a3f8e9.1 # Hierarchical (child of bd-a3f8e9) ``` **Properties:** - Globally unique (content-based hash) - No coordination needed between creators - Merge-friendly across branches - Predictable length (configurable) ## How Hashes Work IDs are generated from: - Issue title - Creation timestamp - Random salt ```bash # Create issue - ID assigned automatically bd create "Fix authentication bug" # Returns: bd-7x2f # The ID is deterministic for same content+timestamp ``` ## Hierarchical IDs For epics and subtasks: ```bash # Parent epic bd create "Auth System" -t epic # Returns: bd-a3f8e9 # Children auto-increment bd create "Design UI" --parent bd-a3f8e9 # bd-a3f8e9.1 bd create "Backend" --parent bd-a3f8e9 # bd-a3f8e9.2 bd create "Tests" --parent bd-a3f8e9 # bd-a3f8e9.3 ``` Benefits: - Clear parent-child relationship - No namespace collision (parent hash is unique) - Up to 3 levels of nesting ## ID Configuration Configure ID prefix and length: ```bash # Set prefix (default: bd) bd config set id.prefix myproject # Set hash length (default: 4) bd config set id.hash_length 6 # New issues use new format bd create "Test" # Returns: myproject-a1b2c3 ``` ## Collision Handling While rare, collisions are handled automatically: 1. On import, if hash collision detected 2. Beads appends disambiguator 3. Both issues preserved ```bash # Check for collisions bd info --schema --json | jq '.collision_count' ``` ## Working with IDs ```bash # Partial ID matching bd show a1b2 # Finds bd-a1b2... bd show auth # Fuzzy match by title # Full ID required for ambiguous cases bd show bd-a1b2c3d4 # List with full IDs bd list --full-ids ``` ## Migration from Sequential IDs If migrating from a system with sequential IDs: ```bash # Import preserves original IDs in metadata bd import -i old-issues.json # View original ID bd show bd-new --json | jq '.original_id' ``` ## Best Practices 1. **Use short references** - `bd-a1b2` is usually unique enough 2. **Use `--json` for scripts** - Parse full ID programmatically 3. **Reference by hash in commits** - `Fixed bd-a1b2` in commit messages 4. **Let hierarchies form naturally** - Create epics, add children as needed # Issues & Dependencies Understanding the issue model in beads. ## Issue Structure Every issue has: ```bash bd show bd-42 --json ``` ```json { "id": "bd-42", "title": "Implement authentication", "description": "Add JWT-based auth", "type": "feature", "status": "open", "priority": 1, "labels": ["backend", "security"], "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T10:30:00Z" } ``` ## Issue Types | Type | Use Case | |------|----------| | `bug` | Something broken that needs fixing | | `feature` | New functionality | | `task` | Work item (tests, docs, refactoring) | | `epic` | Large feature with subtasks | | `chore` | Maintenance (dependencies, tooling) | ## Priorities | Priority | Level | Examples | |----------|-------|----------| | 0 | Critical | Security, data loss, broken builds | | 1 | High | Major features, important bugs | | 2 | Medium | Nice-to-have features, minor bugs | | 3 | Low | Polish, optimization | | 4 | Backlog | Future ideas | ## Creating Issues ```bash # Basic issue bd create "Fix login bug" -t bug -p 1 # With description bd create "Add password reset" \ --description="Users need to reset forgotten passwords via email" \ -t feature -p 2 # With labels bd create "Update dependencies" -t chore -l "maintenance,security" # JSON output for agents bd create "Task" -t task --json ``` ## Dependencies ### Blocking Dependencies The `blocks` relationship affects the ready queue: ```bash # Add dependency: bd-2 depends on bd-1 bd dep add bd-2 bd-1 # View dependencies bd dep tree bd-2 # See blocked issues bd blocked # See ready work (not blocked) bd ready ``` ### Structural Relationships These don't affect the ready queue: ```bash # Parent-child (epic subtasks) bd create "Epic" -t epic bd create "Subtask" --parent bd-42 # Discovered-from (found during work) bd create "Found bug" --deps discovered-from:bd-42 # Related (soft link) bd relate bd-1 bd-2 ``` ### Dependency Types | Type | Description | Ready Queue Impact | |------|-------------|-------------------| | `blocks` | Hard dependency | Yes - blocked items not ready | | `parent-child` | Epic/subtask hierarchy | No | | `discovered-from` | Tracks origin of discovery | No | | `related` | Soft relationship | No | ## Hierarchical Issues For large features, use hierarchical IDs: ```bash # Create epic bd create "Auth System" -t epic -p 1 # Returns: bd-a3f8e9 # Child tasks auto-number bd create "Design login UI" --parent bd-a3f8e9 # bd-a3f8e9.1 bd create "Backend validation" --parent bd-a3f8e9 # bd-a3f8e9.2 # View hierarchy bd dep tree bd-a3f8e9 ``` ## Updating Issues ```bash # Change status bd update bd-42 --status in_progress # Change priority bd update bd-42 --priority 0 # Add labels bd update bd-42 --add-label urgent # Multiple changes bd update bd-42 --status in_progress --priority 1 --add-label "in-review" ``` ## Closing Issues ```bash # Simple close bd close bd-42 # With reason bd close bd-42 --reason "Implemented in PR #123" # JSON output bd close bd-42 --json ``` ## Searching and Filtering ```bash # By status bd list --status open bd list --status in_progress # By priority bd list --priority 1 bd list --priority 0,1 # Multiple # By type bd list --type bug bd list --type feature,task # By label bd list --label-any urgent,critical bd list --label-all backend,security # Combined filters bd list --status open --priority 1 --type bug --json ``` # JSONL Sync How beads synchronizes issues across git. ## The Magic Beads uses a dual-storage architecture: ``` SQLite DB (.beads/beads.db, gitignored) ↕ auto-sync (5s debounce) JSONL (.beads/issues.jsonl, git-tracked) ↕ git push/pull Remote JSONL (shared across machines) ``` **Why this design?** - SQLite for fast local queries - JSONL for git-friendly versioning - Automatic sync keeps them aligned ## Auto-Sync Behavior ### Export (SQLite → JSONL) Triggers: - Any database change - After 5 second debounce (batches multiple changes) - Manual `bd sync` ```bash # Force immediate export bd sync # Check what would be exported bd export --dry-run ``` ### Import (JSONL → SQLite) Triggers: - After `git pull` (via git hooks) - When JSONL is newer than database - Manual `bd import` ```bash # Force import bd import -i .beads/issues.jsonl # Preview import bd import -i .beads/issues.jsonl --dry-run ``` ## Git Hooks Install hooks for seamless sync: ```bash bd hooks install ``` Hooks installed: - **pre-commit** - Exports to JSONL before commit - **post-merge** - Imports from JSONL after pull - **pre-push** - Ensures sync before push ## Manual Sync ```bash # Full sync cycle: export + commit + push bd sync # Just export bd export # Just import bd import -i .beads/issues.jsonl ``` ## Conflict Resolution When JSONL conflicts occur during git merge: ### With Merge Driver (Recommended) The beads merge driver handles JSONL conflicts automatically: ```bash # Install merge driver bd init # Prompts for merge driver setup ``` The driver: - Merges non-conflicting changes - Preserves both sides for real conflicts - Uses latest timestamp for same-issue edits ### Without Merge Driver Manual resolution: ```bash # After merge conflict git checkout --ours .beads/issues.jsonl # or --theirs bd import -i .beads/issues.jsonl bd sync ``` ## Orphan Handling When importing issues with missing parents: ```bash # Configure orphan handling bd config set import.orphan_handling allow # Import anyway (default) bd config set import.orphan_handling resurrect # Restore deleted parents bd config set import.orphan_handling skip # Skip orphans bd config set import.orphan_handling strict # Fail on orphans ``` Per-command override: ```bash bd import -i issues.jsonl --orphan-handling resurrect ``` ## Deletion Tracking Deleted issues are tracked in `.beads/deletions.jsonl`: ```bash # Delete issue (records to manifest) bd delete bd-42 # View deletions bd deleted bd deleted --since=30d # Deletions propagate via git git pull # Imports deletions from remote ``` ## Troubleshooting Sync ### JSONL out of sync ```bash # Force full sync bd sync # Check sync status bd info ``` ### Import errors ```bash # Check import status bd import -i .beads/issues.jsonl --dry-run # Allow orphans if needed bd import -i .beads/issues.jsonl --orphan-handling allow ``` ### Duplicate detection ```bash # Find duplicates after import bd duplicates # Auto-merge duplicates bd duplicates --auto-merge ``` # Architecture Overview This document explains how Beads' three-layer architecture works: Git, JSONL, and SQLite. ## The Three Layers Beads uses a layered architecture where each layer serves a specific purpose: ```mermaid flowchart TD subgraph GIT["🗂️ Layer 1: Git Repository"] G[(".beads/*.jsonl
Historical Source of Truth")] end subgraph JSONL["📄 Layer 2: JSONL Files"] J[("issues.jsonl
Operational Source of Truth")] end subgraph SQL["⚡ Layer 3: SQLite"] D[("beads.db
Fast Queries / Derived State")] end G <-->|"bd sync"| J J -->|"rebuild"| D D -->|"append"| J U((👤 User)) -->|"bd create
bd update"| D D -->|"bd list
bd show"| U style GIT fill:#2d5a27,stroke:#4a9c3e,color:#fff style JSONL fill:#1a4a6e,stroke:#3a8ac4,color:#fff style SQL fill:#6b3a6b,stroke:#a45ea4,color:#fff ``` :::info Historical vs Operational Truth **Git** is the *historical* source of truth—commits preserve the full history of your issues and can be recovered from any point in time. **JSONL** is the *operational* source of truth—when recovering from database corruption, Beads rebuilds SQLite from JSONL files, not directly from Git commits. This layered model enables recovery: if SQLite is corrupted but JSONL is intact, run `bd sync --import-only` to rebuild. If JSONL is corrupted, recover it from Git history first. ::: ### Layer 1: Git Repository Git is the *historical* source of truth. All issue data lives in the repository alongside your code, with full history preserved in commits. **Why Git?** - Issues travel with the code - No external service dependency - Full history via Git log (recover any point in time) - Works offline - Enables multi-machine and multi-agent workflows ### Layer 2: JSONL Files JSONL (JSON Lines) files store issue data in an append-only format. This is the *operational* source of truth—SQLite databases are rebuilt from JSONL. **Location:** `.beads/*.jsonl` **Why JSONL?** - Human-readable and inspectable - Git-mergeable (append-only reduces conflicts) - Portable across systems - Can be recovered from Git history - **Recovery source**: `bd sync --import-only` rebuilds SQLite from JSONL ### Layer 3: SQLite Database SQLite provides fast local queries without network latency. This is *derived state*—it can always be rebuilt from JSONL. **Location:** `.beads/beads.db` **Why SQLite?** - Instant queries (no network) - Complex filtering and sorting - Derived from JSONL (always rebuildable) - Safe to delete and rebuild: `rm .beads/beads.db* && bd sync --import-only` ## Data Flow ### Write Path ```text User runs bd create → SQLite updated → JSONL appended → Git commit (on sync) ``` ### Read Path ```text User runs bd list → SQLite queried → Results returned immediately ``` ### Sync Path ```text User runs bd sync → Git pull → JSONL merged → SQLite rebuilt if needed → Git push ``` ### Sync Modes Beads provides specialized sync modes for different recovery scenarios: #### Standard Sync ```bash bd sync ``` Normal bidirectional sync: pulls remote changes, merges JSONL, rebuilds SQLite if needed, pushes local changes. #### Import-Only Mode ```bash bd sync --import-only ``` Rebuilds the SQLite database from JSONL without pushing changes. Use this when: - SQLite is corrupted or missing - Recovering from a fresh clone - Rebuilding after database migration issues This is the safest recovery option when JSONL is intact. #### Force Rebuild Mode ```bash bd sync --force-rebuild ``` Forces complete SQLite rebuild from JSONL, discarding any SQLite-only state. Use with caution: - More aggressive than `--import-only` - May lose any uncommitted database state - Recommended when standard sync fails repeatedly ### Multi-Machine Sync Considerations When working across multiple machines or clones: 1. **Always sync before switching machines** ```bash bd sync # Push changes before leaving ``` 2. **Pull before creating new issues** ```bash bd sync # Pull changes first on new machine bd create "New issue" ``` 3. **Avoid parallel edits** - If two machines create issues simultaneously without syncing, conflicts may occur See [Sync Failures Recovery](/recovery/sync-failures) for data loss prevention in multi-machine workflows (Pattern A5/C3). ## The Daemon The Beads daemon (`bd daemon`) handles background synchronization: - Watches for file changes - Triggers sync on changes - Keeps SQLite in sync with JSONL - Manages lock files :::tip The daemon is optional but recommended for multi-agent workflows. ::: ### Running Without the Daemon For CI/CD pipelines, containers, and single-use scenarios, run commands without spawning a daemon: ```bash bd --no-daemon create "CI-generated issue" bd --no-daemon sync ``` **When to use `--no-daemon`:** - CI/CD pipelines (Jenkins, GitHub Actions) - Docker containers - Ephemeral environments - Scripts that should not leave background processes - Debugging daemon-related issues ### Daemon in Multi-Clone Scenarios :::warning Race Conditions in Multi-Clone Workflows When multiple git clones of the same repository run daemons simultaneously, race conditions can occur during push/pull operations. This is particularly common in: - Multi-agent AI workflows (multiple Claude/GPT instances) - Developer workstations with multiple checkouts - Worktree-based development workflows **Prevention:** 1. Use `bd daemons killall` before switching between clones 2. Ensure only one clone's daemon is active at a time 3. Consider `--no-daemon` mode for automated workflows ::: See [Sync Failures Recovery](/recovery/sync-failures) for daemon race condition troubleshooting (Pattern B2). ## Recovery Model The three-layer architecture makes recovery straightforward because each layer can rebuild from the one above it: 1. **Lost SQLite?** → Rebuild from JSONL: `bd sync --import-only` 2. **Lost JSONL?** → Recover from Git history: `git checkout HEAD~1 -- .beads/issues.jsonl` 3. **Conflicts?** → Git merge, then rebuild ### Universal Recovery Sequence The following sequence demonstrates how the architecture enables quick recovery. For detailed procedures, see [Recovery Runbooks](/recovery). This sequence resolves the majority of reported issues: ```bash bd daemons killall # Stop daemons (prevents race conditions) git worktree prune # Clean orphaned worktrees rm .beads/beads.db* # Remove potentially corrupted database bd sync --import-only # Rebuild from JSONL source of truth ``` :::danger Never Use `bd doctor --fix` Analysis of 54 GitHub issues revealed that `bd doctor --fix` frequently causes **more damage** than the original problem: - Deletes "circular" dependencies that are actually valid parent-child relationships - False positive detection removes legitimate issue links - Recovery after `--fix` is harder than recovery from the original issue **Safe alternatives:** - `bd doctor` — Diagnostic only, no changes made - `bd blocked` — Check which issues are blocked and why - `bd show ` — Inspect a specific issue's state If `bd doctor` reports problems, investigate each one manually before taking any action. ::: See [Recovery](/recovery) for specific procedures and [Database Corruption Recovery](/recovery/database-corruption) for `bd doctor --fix` recovery (Pattern D4). ## Design Decisions ### Why not just SQLite? SQLite alone doesn't travel with Git or merge well across branches. Binary database files create merge conflicts that are nearly impossible to resolve. ### Why not just JSONL? JSONL is slow for complex queries. Scanning thousands of lines for filtering and sorting is inefficient. SQLite provides indexed lookups in milliseconds. ### Why append-only JSONL? Append-only format minimizes Git merge conflicts. When two branches add issues, Git can cleanly merge by concatenating the additions. Edit operations append new records rather than modifying existing lines. ### Why not a server? Beads is designed for offline-first, local-first development. No server means no downtime, no latency, no vendor lock-in, and full functionality on airplanes or in restricted networks. ### Trade-offs | Benefit | Trade-off | |---------|-----------| | Works offline | No real-time collaboration | | Git-native history | Requires Git knowledge | | No server dependency | No web UI or mobile app | | Local-first speed | Manual sync required | | Append-only merging | JSONL files grow over time | ### When NOT to use Beads Beads is not suitable for: - **Large teams (10+)** — Git-based sync doesn't scale well for high-frequency concurrent edits - **Non-developers** — Requires Git and command-line familiarity - **Real-time collaboration** — No live updates; requires explicit sync - **Cross-repository tracking** — Issues are scoped to a single repository - **Rich media attachments** — Designed for text-based issue tracking For these use cases, consider GitHub Issues, Linear, or Jira. ## Related Documentation - [Recovery Runbooks](/recovery) — Step-by-step procedures for common issues - [CLI Reference](/cli-reference) — Complete command documentation - [Getting Started](/) — Installation and first steps
# CLI Reference Complete reference for all `bd` commands. ## Command Structure ```bash bd [global-flags] [command-flags] [arguments] ``` ### Global Flags | Flag | Description | |------|-------------| | `--db ` | Use specific database file | | `--no-daemon` | Bypass daemon, direct database access | | `--json` | Output in JSON format | | `--quiet` | Suppress non-essential output | | `--verbose` | Verbose output | | `--version` | Show version | | `--help` | Show help | ## Command Categories ### Essential Commands Most frequently used: | Command | Description | |---------|-------------| | `bd create` | Create new issue | | `bd list` | List issues with filters | | `bd show` | Show issue details | | `bd update` | Update issue fields | | `bd close` | Close an issue | | `bd ready` | Show unblocked work | | `bd sync` | Force sync to git | ### Issue Management | Command | Description | |---------|-------------| | `bd create` | Create issue | | `bd show` | Show details | | `bd update` | Update fields | | `bd close` | Close issue | | `bd delete` | Delete issue | | `bd reopen` | Reopen closed issue | ### Dependencies | Command | Description | |---------|-------------| | `bd dep add` | Add dependency | | `bd dep remove` | Remove dependency | | `bd dep tree` | Show dependency tree | | `bd dep cycles` | Detect circular dependencies | | `bd blocked` | Show blocked issues | | `bd ready` | Show unblocked issues | ### Labels & Comments | Command | Description | |---------|-------------| | `bd label add` | Add label to issue | | `bd label remove` | Remove label | | `bd label list` | List all labels | | `bd comment add` | Add comment | | `bd comment list` | List comments | ### Sync & Export | Command | Description | |---------|-------------| | `bd sync` | Full sync cycle | | `bd export` | Export to JSONL | | `bd import` | Import from JSONL | | `bd migrate` | Migrate database schema | ### System | Command | Description | |---------|-------------| | `bd init` | Initialize beads in project | | `bd info` | Show system info | | `bd version` | Show version | | `bd config` | Manage configuration | | `bd daemons` | Manage daemons | | `bd hooks` | Manage git hooks | ### Workflows | Command | Description | |---------|-------------| | `bd pour` | Instantiate formula as molecule | | `bd wisp` | Create ephemeral wisp | | `bd mol` | Manage molecules | | `bd pin` | Pin work to agent | | `bd hook` | Show pinned work | ## Quick Reference ### Creating Issues ```bash # Basic bd create "Title" -t task -p 2 # With description bd create "Title" --description="Details here" -t bug -p 1 # With labels bd create "Title" -l "backend,urgent" # As child of epic bd create "Subtask" --parent bd-42 # With discovered-from link bd create "Found bug" --deps discovered-from:bd-42 # JSON output bd create "Title" --json ``` ### Querying Issues ```bash # All open issues bd list --status open # High priority bugs bd list --status open --priority 0,1 --type bug # With specific labels bd list --label-any urgent,critical # JSON output bd list --json ``` ### Working with Dependencies ```bash # Add: bd-2 depends on bd-1 bd dep add bd-2 bd-1 # View tree bd dep tree bd-2 # Find cycles bd dep cycles # What's ready to work? bd ready # What's blocked? bd blocked ``` ### Syncing ```bash # Full sync (export + commit + push) bd sync # Force export bd export # Import from file bd import -i .beads/issues.jsonl ``` ## See Also - [Essential Commands](/cli-reference/essential) - [Issue Commands](/cli-reference/issues) - [Dependency Commands](/cli-reference/dependencies) - [Label Commands](/cli-reference/labels) - [Sync Commands](/cli-reference/sync) # Dependency Commands Commands for managing issue dependencies. ## bd dep add Add a dependency between issues. ```bash bd dep add [flags] ``` **Semantics:** `` depends on `` (dependency blocks dependent). **Flags:** ```bash --type Dependency type (blocks|related|discovered-from) --json JSON output ``` **Examples:** ```bash # bd-2 depends on bd-1 (bd-1 blocks bd-2) bd dep add bd-2 bd-1 # Soft relationship bd dep add bd-2 bd-1 --type related # JSON output bd dep add bd-2 bd-1 --json ``` ## bd dep remove Remove a dependency. ```bash bd dep remove [flags] ``` **Examples:** ```bash bd dep remove bd-2 bd-1 bd dep remove bd-2 bd-1 --json ``` ## bd dep tree Display dependency tree. ```bash bd dep tree [flags] ``` **Flags:** ```bash --depth Maximum depth to display --json JSON output ``` **Examples:** ```bash bd dep tree bd-42 bd dep tree bd-42 --depth 3 bd dep tree bd-42 --json ``` **Output:** ``` Dependency tree for bd-42: > bd-42: Add authentication [P2] (open) > bd-41: Create API [P2] (open) > bd-40: Set up database [P1] (closed) ``` ## bd dep cycles Detect circular dependencies. ```bash bd dep cycles [flags] ``` **Flags:** ```bash --json JSON output ``` **Examples:** ```bash bd dep cycles bd dep cycles --json ``` ## bd ready Show issues with no blockers. ```bash bd ready [flags] ``` **Flags:** ```bash --priority Filter by priority --type Filter by type --label Filter by label --json JSON output ``` **Examples:** ```bash bd ready bd ready --priority 1 bd ready --type bug bd ready --json ``` **Output:** ``` Ready work (3 issues with no blockers): 1. [P1] bd-40: Set up database 2. [P2] bd-45: Write tests 3. [P3] bd-46: Update docs ``` ## bd blocked Show blocked issues and their blockers. ```bash bd blocked [flags] ``` **Flags:** ```bash --json JSON output ``` **Examples:** ```bash bd blocked bd blocked --json ``` **Output:** ``` Blocked issues (2 issues): bd-42: Add authentication Blocked by: bd-41 (open) bd-41: Create API Blocked by: bd-40 (in_progress) ``` ## bd relate Create a soft relationship between issues. ```bash bd relate [flags] ``` **Examples:** ```bash bd relate bd-42 bd-43 bd relate bd-42 bd-43 --json ``` ## bd duplicate Mark an issue as duplicate. ```bash bd duplicate --of [flags] ``` **Examples:** ```bash bd duplicate bd-43 --of bd-42 bd duplicate bd-43 --of bd-42 --json ``` ## bd supersede Mark an issue as superseding another. ```bash bd supersede --with [flags] ``` **Examples:** ```bash bd supersede bd-42 --with bd-50 bd supersede bd-42 --with bd-50 --json ``` ## Understanding Dependencies ### Blocking vs Non-blocking | Type | Blocks Ready Queue | Use Case | |------|-------------------|----------| | `blocks` | Yes | Hard dependency | | `parent-child` | No | Epic/subtask hierarchy | | `discovered-from` | No | Track origin | | `related` | No | Soft link | | `duplicates` | No | Mark duplicate | | `supersedes` | No | Version chain | ### Dependency Direction ```bash # bd-2 depends on bd-1 # Meaning: bd-1 must complete before bd-2 can start bd dep add bd-2 bd-1 # After bd-1 closes: bd close bd-1 bd ready # bd-2 now appears ``` ### Avoiding Cycles ```bash # Check before adding complex dependencies bd dep cycles # If cycle detected, remove one dependency bd dep remove bd-A bd-B ``` # Essential Commands The most important commands for daily use. ## bd create Create a new issue. ```bash bd create [flags] ``` **Flags:** | Flag | Short | Description | |------|-------|-------------| | `--type` | `-t` | Issue type: bug, feature, task, epic, chore | | `--priority` | `-p` | Priority: 0-4 (0=critical, 4=backlog) | | `--description` | `-d` | Detailed description | | `--labels` | `-l` | Comma-separated labels | | `--parent` | | Parent issue ID (for hierarchical) | | `--deps` | | Dependencies (e.g., `discovered-from:bd-42`) | | `--json` | | JSON output | **Examples:** ```bash bd create "Fix login bug" -t bug -p 1 bd create "Add dark mode" -t feature -p 2 --description="User requested" bd create "Subtask" --parent bd-42 -p 2 bd create "Found during work" --deps discovered-from:bd-42 --json ``` ## bd list List issues with filters. ```bash bd list [flags] ``` **Flags:** | Flag | Description | |------|-------------| | `--status` | Filter by status: open, in_progress, closed | | `--priority` | Filter by priority (comma-separated) | | `--type` | Filter by type (comma-separated) | | `--label-any` | Issues with any of these labels | | `--label-all` | Issues with all of these labels | | `--json` | JSON output | **Examples:** ```bash bd list --status open bd list --priority 0,1 --type bug bd list --label-any urgent,critical --json ``` ## bd show Show issue details. ```bash bd show <id> [flags] ``` **Examples:** ```bash bd show bd-42 bd show bd-42 --json bd show bd-42 bd-43 bd-44 # Multiple issues ``` ## bd update Update issue fields. ```bash bd update <id> [flags] ``` **Flags:** | Flag | Description | |------|-------------| | `--status` | New status | | `--priority` | New priority | | `--title` | New title | | `--description` | New description | | `--add-label` | Add label | | `--remove-label` | Remove label | | `--json` | JSON output | **Examples:** ```bash bd update bd-42 --status in_progress bd update bd-42 --priority 0 --add-label urgent bd update bd-42 --title "Updated title" --json ``` ## bd close Close an issue. ```bash bd close <id> [flags] ``` **Flags:** | Flag | Description | |------|-------------| | `--reason` | Closure reason | | `--json` | JSON output | **Examples:** ```bash bd close bd-42 bd close bd-42 --reason "Fixed in PR #123" bd close bd-42 --json ``` ## bd ready Show issues ready to work on (no blockers). ```bash bd ready [flags] ``` **Flags:** | Flag | Description | |------|-------------| | `--priority` | Filter by priority | | `--type` | Filter by type | | `--json` | JSON output | **Examples:** ```bash bd ready bd ready --priority 1 bd ready --json ``` ## bd blocked Show blocked issues and their blockers. ```bash bd blocked [flags] ``` **Examples:** ```bash bd blocked bd blocked --json ``` ## bd sync Force immediate sync to git. ```bash bd sync [flags] ``` Performs: 1. Export database to JSONL 2. Git add `.beads/issues.jsonl` 3. Git commit 4. Git push **Examples:** ```bash bd sync bd sync --json ``` ## bd info Show system information. ```bash bd info [flags] ``` **Flags:** | Flag | Description | |------|-------------| | `--whats-new` | Show recent version changes | | `--schema` | Show database schema | | `--json` | JSON output | **Examples:** ```bash bd info bd info --whats-new bd info --json ``` ## bd stats Show project statistics. ```bash bd stats [flags] ``` **Examples:** ```bash bd stats bd stats --json ``` </document> <document path="docs/cli-reference/issues.md"> # Issue Commands Commands for managing issues. ## bd create Create a new issue. ```bash bd create <title> [flags] ``` **All flags:** ```bash --type, -t Issue type (bug|feature|task|epic|chore) --priority, -p Priority 0-4 --description, -d Detailed description --design Design notes --acceptance Acceptance criteria --notes Additional notes --labels, -l Comma-separated labels --parent Parent issue ID --deps Dependencies (type:id format) --assignee Assigned user --json JSON output ``` **Examples:** ```bash # Bug with high priority bd create "Login fails with special chars" -t bug -p 1 # Feature with description bd create "Add export to PDF" -t feature -p 2 \ --description="Users want to export reports as PDF files" # Feature with design, acceptance, and notes bd create "Implement user authentication" -t feature -p 1 \ --description="Add JWT-based authentication" \ --design="Use bcrypt for password hashing, JWT for sessions" \ --acceptance="All tests pass, security audit complete" \ --notes="Consider rate limiting for login attempts" # Task with labels bd create "Update CI config" -t task -l "ci,infrastructure" # Epic with children bd create "Auth System" -t epic -p 1 bd create "Design login UI" --parent bd-42 bd create "Implement backend" --parent bd-42 # Discovered issue bd create "Found SQL injection" -t bug -p 0 \ --deps discovered-from:bd-42 --json ``` ## bd show Display issue details. ```bash bd show <id>... [flags] ``` **Flags:** ```bash --full Show all fields including comments --json JSON output ``` **Examples:** ```bash bd show bd-42 bd show bd-42 --full bd show bd-42 bd-43 bd-44 --json ``` ## bd update Update issue fields. ```bash bd update <id> [flags] ``` **All flags:** ```bash --status New status (open|in_progress|closed) --priority New priority (0-4) --title New title --description New description --type New type --add-label Add label(s) --remove-label Remove label(s) --assignee New assignee --json JSON output ``` **Examples:** ```bash # Start work bd update bd-42 --status in_progress # Escalate priority bd update bd-42 --priority 0 --add-label urgent # Change title and description bd update bd-42 --title "New title" --description="Updated description" # Multiple changes bd update bd-42 --status in_progress --priority 1 --add-label "in-review" --json ``` ## bd close Close an issue. ```bash bd close <id> [flags] ``` **Flags:** ```bash --reason Closure reason (stored in comment) --json JSON output ``` **Examples:** ```bash bd close bd-42 bd close bd-42 --reason "Fixed in commit abc123" bd close bd-42 --reason "Duplicate of bd-43" --json ``` ## bd reopen Reopen a closed issue. ```bash bd reopen <id> [flags] ``` **Examples:** ```bash bd reopen bd-42 bd reopen bd-42 --json ``` ## bd delete Delete an issue. ```bash bd delete <id> [flags] ``` **Flags:** ```bash --force, -f Skip confirmation --json JSON output ``` **Examples:** ```bash bd delete bd-42 bd delete bd-42 -f --json ``` **Note:** Deletions are tracked in `.beads/deletions.jsonl` for sync. ## bd search Search issues by text. ```bash bd search <query> [flags] ``` **Flags:** ```bash --status Filter by status --type Filter by type --json JSON output ``` **Examples:** ```bash bd search "authentication" bd search "login bug" --status open bd search "API" --type feature --json ``` ## bd duplicates Find and manage duplicate issues. ```bash bd duplicates [flags] ``` **Flags:** ```bash --auto-merge Automatically merge all duplicates --dry-run Preview without changes --json JSON output ``` **Examples:** ```bash bd duplicates bd duplicates --auto-merge bd duplicates --dry-run --json ``` ## bd merge Merge duplicate issues. ```bash bd merge <source>... --into <target> [flags] ``` **Flags:** ```bash --into Target issue to merge into --dry-run Preview without changes --json JSON output ``` **Examples:** ```bash bd merge bd-42 bd-43 --into bd-41 bd merge bd-42 bd-43 --into bd-41 --dry-run --json ``` </document> <document path="docs/cli-reference/labels.md"> # Labels & Comments Commands for managing labels and comments. ## Labels ### Adding Labels ```bash # During creation bd create "Task" -l "backend,urgent" # To existing issue bd update bd-42 --add-label urgent bd update bd-42 --add-label "backend,security" ``` ### Removing Labels ```bash bd update bd-42 --remove-label urgent ``` ### Listing Labels ```bash # All labels in use bd label list bd label list --json # Issues with specific labels bd list --label-any urgent,critical bd list --label-all backend,security ``` ### Label Conventions Suggested label categories: | Category | Examples | Purpose | |----------|----------|---------| | Type | `bug`, `feature`, `docs` | Issue classification | | Priority | `urgent`, `critical` | Urgency markers | | Area | `backend`, `frontend`, `api` | Code area | | Status | `blocked`, `needs-review` | Workflow state | | Size | `small`, `medium`, `large` | Effort estimate | ## Comments ### Adding Comments ```bash bd comment add bd-42 "Working on this now" bd comment add bd-42 --message "Found the bug in auth.go:45" ``` ### Listing Comments ```bash bd comment list bd-42 bd comment list bd-42 --json ``` ### Viewing with Issue ```bash bd show bd-42 --full # Includes comments ``` ## Filtering by Labels ### Any Match (OR) ```bash # Issues with urgent OR critical bd list --label-any urgent,critical ``` ### All Match (AND) ```bash # Issues with BOTH backend AND security bd list --label-all backend,security ``` ### Combined Filters ```bash # Open bugs with urgent label bd list --status open --type bug --label-any urgent --json ``` ## Bulk Operations ### Add Label to Multiple Issues ```bash # Using shell for id in bd-42 bd-43 bd-44; do bd update $id --add-label "sprint-1" done ``` ### Find and Label ```bash # Label all open bugs as needs-triage bd list --status open --type bug --json | \ jq -r '.[].id' | \ xargs -I {} bd update {} --add-label needs-triage ``` ## Best Practices 1. **Keep labels lowercase** - `backend` not `Backend` 2. **Use hyphens for multi-word** - `needs-review` not `needs_review` 3. **Be consistent** - Establish team conventions 4. **Don't over-label** - 2-4 labels per issue is typical 5. **Review periodically** - Remove unused labels </document> <document path="docs/cli-reference/sync.md"> # Sync & Export Commands Commands for synchronizing with git. ## bd sync Full sync cycle: export, commit, push. ```bash bd sync [flags] ``` **What it does:** 1. Exports database to `.beads/issues.jsonl` 2. Stages the JSONL file 3. Commits with auto-generated message 4. Pushes to remote **Flags:** ```bash --json JSON output --dry-run Preview without changes ``` **Examples:** ```bash bd sync bd sync --json ``` **When to use:** - End of work session - Before switching branches - After significant changes ## bd export Export database to JSONL. ```bash bd export [flags] ``` **Flags:** ```bash --output, -o Output file (default: .beads/issues.jsonl) --dry-run Preview without writing --json JSON output ``` **Examples:** ```bash bd export bd export -o backup.jsonl bd export --dry-run ``` ## bd import Import from JSONL file. ```bash bd import -i <file> [flags] ``` **Flags:** ```bash --input, -i Input file (required) --dry-run Preview without changes --orphan-handling How to handle missing parents --dedupe-after Run duplicate detection after import --json JSON output ``` **Orphan handling modes:** | Mode | Behavior | |------|----------| | `allow` | Import orphans without validation (default) | | `resurrect` | Restore deleted parents as tombstones | | `skip` | Skip orphaned children with warning | | `strict` | Fail if parent missing | **Examples:** ```bash bd import -i .beads/issues.jsonl bd import -i backup.jsonl --dry-run bd import -i issues.jsonl --orphan-handling resurrect bd import -i issues.jsonl --dedupe-after --json ``` ## bd migrate Migrate database schema. ```bash bd migrate [flags] ``` **Flags:** ```bash --inspect Show migration plan (for agents) --dry-run Preview without changes --cleanup Remove old files after migration --yes Skip confirmation --json JSON output ``` **Examples:** ```bash bd migrate --inspect --json bd migrate --dry-run bd migrate bd migrate --cleanup --yes ``` ## bd hooks Manage git hooks. ```bash bd hooks <subcommand> [flags] ``` **Subcommands:** | Command | Description | |---------|-------------| | `install` | Install git hooks | | `uninstall` | Remove git hooks | | `status` | Check hook status | **Examples:** ```bash bd hooks install bd hooks status bd hooks uninstall ``` ## Auto-Sync Behavior ### With Daemon (Default) The daemon handles sync automatically: - Exports to JSONL after changes (5s debounce) - Imports from JSONL when newer ### Without Daemon Use `--no-daemon` flag: - Changes only written to SQLite - Must manually export/sync ```bash bd --no-daemon create "Task" bd export # Manual export needed ``` ## Conflict Resolution ### Merge Driver (Recommended) Install the beads merge driver: ```bash bd init # Prompts for merge driver setup ``` The driver automatically: - Merges non-conflicting changes - Preserves both sides for real conflicts - Uses latest timestamp for same-issue edits ### Manual Resolution ```bash # After merge conflict git checkout --ours .beads/issues.jsonl bd import -i .beads/issues.jsonl bd sync ``` ## Deletion Tracking Deletions sync via `.beads/deletions.jsonl`: ```bash # Delete issue bd delete bd-42 # View deletions bd deleted bd deleted --since=30d # Deletions propagate via git git pull # Imports deletions from remote ``` ## Best Practices 1. **Always sync at session end** - `bd sync` 2. **Install git hooks** - `bd hooks install` 3. **Use merge driver** - Avoids manual conflict resolution 4. **Check sync status** - `bd info` shows daemon/sync state </document> <document path="docs/workflows/index.md"> # Workflows Beads provides powerful workflow primitives for complex, multi-step processes. ## Chemistry Metaphor Beads uses a molecular chemistry metaphor: | Phase | Storage | Synced | Use Case | |-------|---------|--------|----------| | **Proto** (solid) | Built-in | N/A | Reusable templates | | **Mol** (liquid) | `.beads/` | Yes | Persistent work | | **Wisp** (vapor) | `.beads-wisp/` | No | Ephemeral operations | ## Core Concepts ### Formulas Declarative workflow templates in TOML or JSON: ```toml formula = "feature-workflow" version = 1 type = "workflow" [[steps]] id = "design" title = "Design the feature" type = "human" [[steps]] id = "implement" title = "Implement the feature" needs = ["design"] ``` ### Molecules Work graphs with parent-child relationships: - Created by instantiating formulas with `bd pour` - Steps have dependencies (`needs`) - Progress tracked via issue status ### Gates Async coordination primitives: - **Human gates** - Wait for human approval - **Timer gates** - Wait for duration - **GitHub gates** - Wait for PR merge, CI, etc. ### Wisps Ephemeral operations that don't sync to git: - Created with `bd wisp` - Stored in `.beads-wisp/` (gitignored) - Auto-expire after completion ## Workflow Commands | Command | Description | |---------|-------------| | `bd pour` | Instantiate formula as molecule | | `bd wisp` | Create ephemeral wisp | | `bd mol list` | List molecules | | `bd pin` | Pin work to agent | | `bd hook` | Show pinned work | ## Simple Example ```bash # Create a release workflow bd pour release --var version=1.0.0 # View the molecule bd mol show release-1.0.0 # Work through steps bd update release-1.0.0.1 --status in_progress bd close release-1.0.0.1 # Next step becomes ready... ``` ## Navigation - [Molecules](/workflows/molecules) - Work graphs and execution - [Formulas](/workflows/formulas) - Declarative templates - [Gates](/workflows/gates) - Async coordination - [Wisps](/workflows/wisps) - Ephemeral operations </document> <document path="docs/workflows/formulas.md"> # Formulas Formulas are declarative workflow templates. ## Formula Format Formulas can be written in TOML (preferred) or JSON: ### TOML Format ```toml formula = "feature-workflow" description = "Standard feature development workflow" version = 1 type = "workflow" [vars.feature_name] description = "Name of the feature" required = true [[steps]] id = "design" title = "Design {{feature_name}}" type = "human" description = "Create design document" [[steps]] id = "implement" title = "Implement {{feature_name}}" needs = ["design"] [[steps]] id = "review" title = "Code review" needs = ["implement"] type = "human" [[steps]] id = "merge" title = "Merge to main" needs = ["review"] ``` ### JSON Format ```json { "formula": "feature-workflow", "description": "Standard feature development workflow", "version": 1, "type": "workflow", "vars": { "feature_name": { "description": "Name of the feature", "required": true } }, "steps": [ { "id": "design", "title": "Design {{feature_name}}", "type": "human" }, { "id": "implement", "title": "Implement {{feature_name}}", "needs": ["design"] } ] } ``` ## Formula Types | Type | Description | |------|-------------| | `workflow` | Standard step sequence | | `expansion` | Template for expansion operator | | `aspect` | Cross-cutting concerns | ## Variables Define variables with defaults and constraints: ```toml [vars.version] description = "Release version" required = true pattern = "^\\d+\\.\\d+\\.\\d+$" [vars.environment] description = "Target environment" default = "staging" enum = ["staging", "production"] ``` Use variables in steps: ```toml [[steps]] title = "Deploy {{version}} to {{environment}}" ``` ## Step Types | Type | Description | |------|-------------| | `task` | Normal work step (default) | | `human` | Requires human action | | `gate` | Async coordination point | ## Dependencies ### Sequential ```toml [[steps]] id = "step1" title = "First step" [[steps]] id = "step2" title = "Second step" needs = ["step1"] ``` ### Parallel then Join ```toml [[steps]] id = "test-unit" title = "Unit tests" [[steps]] id = "test-integration" title = "Integration tests" [[steps]] id = "deploy" title = "Deploy" needs = ["test-unit", "test-integration"] # Waits for both ``` ## Gates Add gates for async coordination: ```toml [[steps]] id = "approval" title = "Manager approval" type = "human" [steps.gate] type = "human" approvers = ["manager"] [[steps]] id = "deploy" title = "Deploy to production" needs = ["approval"] ``` ## Aspects (Cross-cutting) Apply transformations to matching steps: ```toml formula = "security-scan" type = "aspect" [[advice]] target = "*.deploy" # Match all deploy steps [advice.before] id = "security-scan-{step.id}" title = "Security scan before {step.title}" ``` ## Formula Locations Formulas are searched in order: 1. `.beads/formulas/` (project-level) 2. `~/.beads/formulas/` (user-level) 3. Built-in formulas ## Using Formulas ```bash # List available formulas bd mol list # Pour formula into molecule bd pour <formula-name> --var key=value # Preview what would be created bd pour <formula-name> --dry-run ``` ## Creating Custom Formulas 1. Create file: `.beads/formulas/my-workflow.formula.toml` 2. Define structure (see examples above) 3. Use with: `bd pour my-workflow` ## Example: Release Formula ```toml formula = "release" description = "Standard release workflow" version = 1 [vars.version] required = true pattern = "^\\d+\\.\\d+\\.\\d+$" [[steps]] id = "bump-version" title = "Bump version to {{version}}" [[steps]] id = "changelog" title = "Update CHANGELOG" needs = ["bump-version"] [[steps]] id = "test" title = "Run full test suite" needs = ["changelog"] [[steps]] id = "build" title = "Build release artifacts" needs = ["test"] [[steps]] id = "tag" title = "Create git tag v{{version}}" needs = ["build"] [[steps]] id = "publish" title = "Publish release" needs = ["tag"] type = "human" ``` </document> <document path="docs/workflows/gates.md"> # Gates Gates are async coordination primitives for workflow orchestration. ## What are Gates? Gates block step progression until a condition is met: - Human approval - Timer expiration - External event (GitHub PR, CI, etc.) ## Gate Types ### Human Gate Wait for human approval: ```toml [[steps]] id = "deploy-approval" title = "Approval for production deploy" type = "human" [steps.gate] type = "human" approvers = ["team-lead", "security"] require_all = false # Any approver can approve ``` ### Timer Gate Wait for a duration: ```toml [[steps]] id = "cooldown" title = "Wait for cooldown period" [steps.gate] type = "timer" duration = "24h" ``` Durations: `30m`, `2h`, `24h`, `7d` ### GitHub Gate Wait for GitHub events: ```toml [[steps]] id = "wait-for-ci" title = "Wait for CI to pass" [steps.gate] type = "github" event = "check_suite" status = "success" ``` ```toml [[steps]] id = "wait-for-merge" title = "Wait for PR merge" [steps.gate] type = "github" event = "pull_request" action = "closed" merged = true ``` ## Gate States | State | Description | |-------|-------------| | `pending` | Waiting for condition | | `open` | Condition met, can proceed | | `closed` | Step completed | ## Using Gates in Workflows ### Approval Flow ```toml formula = "production-deploy" [[steps]] id = "build" title = "Build production artifacts" [[steps]] id = "staging" title = "Deploy to staging" needs = ["build"] [[steps]] id = "qa-approval" title = "QA sign-off" needs = ["staging"] type = "human" [steps.gate] type = "human" approvers = ["qa-team"] [[steps]] id = "production" title = "Deploy to production" needs = ["qa-approval"] ``` ### Scheduled Release ```toml formula = "scheduled-release" [[steps]] id = "prepare" title = "Prepare release" [[steps]] id = "wait-window" title = "Wait for release window" needs = ["prepare"] [steps.gate] type = "timer" duration = "2h" [[steps]] id = "deploy" title = "Deploy release" needs = ["wait-window"] ``` ### CI Integration ```toml formula = "ci-gated-deploy" [[steps]] id = "create-pr" title = "Create pull request" [[steps]] id = "wait-ci" title = "Wait for CI" needs = ["create-pr"] [steps.gate] type = "github" event = "check_suite" status = "success" [[steps]] id = "merge" title = "Merge PR" needs = ["wait-ci"] type = "human" ``` ## Gate Operations ### Check Gate Status ```bash bd show bd-xyz.3 # Shows gate state bd show bd-xyz.3 --json | jq '.gate' ``` ### Manual Gate Override For human gates: ```bash bd gate approve bd-xyz.3 --approver "team-lead" ``` ### Skip Gate (Emergency) ```bash bd gate skip bd-xyz.3 --reason "Emergency deploy" ``` ## waits-for Dependency The `waits-for` dependency type creates fan-in patterns: ```toml [[steps]] id = "test-a" title = "Test suite A" [[steps]] id = "test-b" title = "Test suite B" [[steps]] id = "integration" title = "Integration tests" waits_for = ["test-a", "test-b"] # Fan-in: waits for all ``` ## Best Practices 1. **Use human gates for critical decisions** - Don't auto-approve production 2. **Add timeout to timer gates** - Prevent indefinite blocking 3. **Document gate requirements** - Make approvers clear 4. **Use CI gates for quality** - Block on test failures </document> <document path="docs/workflows/molecules.md"> # Molecules Molecules are work graphs created from formulas. ## What is a Molecule? A molecule is a persistent instance of a formula: - Contains steps with dependencies - Tracked in `.beads/` (syncs with git) - Steps map to issues with parent-child relationships ## Creating Molecules ### From Formula ```bash # Pour a formula into a molecule bd pour <formula-name> [--var key=value] ``` **Example:** ```bash bd pour release --var version=1.0.0 ``` This creates: - Parent issue: `bd-xyz` (the molecule root) - Child issues: `bd-xyz.1`, `bd-xyz.2`, etc. (the steps) ### Listing Molecules ```bash bd mol list bd mol list --json ``` ### Viewing a Molecule ```bash bd mol show <molecule-id> bd dep tree <molecule-id> # Shows full hierarchy ``` ## Working with Molecules ### Step Dependencies Steps have `needs` dependencies: ```toml [[steps]] id = "implement" title = "Implement feature" needs = ["design"] # Must complete design first ``` The `bd ready` command respects these: ```bash bd ready # Only shows steps with completed dependencies ``` ### Progressing Through Steps ```bash # Start a step bd update bd-xyz.1 --status in_progress # Complete a step bd close bd-xyz.1 --reason "Done" # Check what's ready next bd ready ``` ### Viewing Progress ```bash # See blocked steps bd blocked # See molecule stats bd stats ``` ## Molecule Lifecycle ``` Formula (template) ↓ bd pour Molecule (instance) ↓ work steps Completed Molecule ↓ optional cleanup Archived ``` ## Advanced Features ### Bond Points Formulas can define bond points for composition: ```toml [compose] [[compose.bond_points]] id = "entry" step = "design" position = "before" ``` ### Hooks Execute actions on step completion: ```toml [[steps]] id = "build" title = "Build project" [steps.on_complete] run = "make build" ``` ### Pinning Work Assign molecules to agents: ```bash # Pin to current agent bd pin bd-xyz --start # Check what's pinned bd hook ``` ## Example Workflow ```bash # 1. Create molecule from formula bd pour feature-workflow --var name="dark-mode" # 2. View structure bd dep tree bd-xyz # 3. Start first step bd update bd-xyz.1 --status in_progress # 4. Complete and progress bd close bd-xyz.1 bd ready # Shows next steps # 5. Continue until complete ``` ## See Also - [Formulas](/workflows/formulas) - Creating templates - [Gates](/workflows/gates) - Async coordination - [Wisps](/workflows/wisps) - Ephemeral workflows </document> <document path="docs/workflows/wisps.md"> # Wisps Wisps are ephemeral workflows that don't sync to git. ## What are Wisps? Wisps are "vapor phase" molecules: - Stored in `.beads-wisp/` (gitignored) - Don't sync with git - Auto-expire after completion - Perfect for temporary operations ## Use Cases | Scenario | Why Wisp? | |----------|-----------| | Local experiments | No need to pollute git history | | CI/CD pipelines | Ephemeral by nature | | Scratch workflows | Quick throwaway work | | Agent coordination | Local-only coordination | ## Creating Wisps ```bash # Create wisp from formula bd wisp create <formula> [--var key=value] # Example bd wisp create quick-check --var target=auth-module ``` ## Wisp Commands ```bash # List wisps bd wisp list bd wisp list --json # Show wisp details bd wisp show <wisp-id> # Delete wisp bd wisp delete <wisp-id> # Delete all completed wisps bd wisp cleanup ``` ## Wisp vs Molecule | Aspect | Molecule | Wisp | |--------|----------|------| | Storage | `.beads/` | `.beads-wisp/` | | Git sync | Yes | No | | Persistence | Permanent | Ephemeral | | Use case | Tracked work | Temporary ops | ## Phase Control Use `bd mol bond` to control phase: ```bash # Force liquid (persistent molecule) bd mol bond <formula> <target> --pour # Force vapor (ephemeral wisp) bd mol bond <formula> <target> --wisp ``` ## Example: Quick Check Workflow Create a wisp for running checks: ```toml # .beads/formulas/quick-check.formula.toml formula = "quick-check" description = "Quick local checks" [[steps]] id = "lint" title = "Run linter" [[steps]] id = "test" title = "Run tests" needs = ["lint"] [[steps]] id = "build" title = "Build project" needs = ["test"] ``` Use as wisp: ```bash bd wisp create quick-check # Work through steps... bd wisp cleanup # Remove when done ``` ## Auto-Expiration Wisps can auto-expire: ```toml [wisp] expires_after = "24h" # Auto-delete after 24 hours ``` Or cleanup manually: ```bash bd wisp cleanup --all # Remove all wisps bd wisp cleanup --completed # Remove only completed ``` ## Best Practices 1. **Use wisps for local-only work** - Don't sync to git 2. **Clean up regularly** - `bd wisp cleanup` 3. **Use molecules for tracked work** - Wisps are ephemeral 4. **Consider CI/CD wisps** - Perfect for pipeline steps </document> <document path="docs/multi-agent/index.md"> # Multi-Agent Coordination Beads supports coordination between multiple AI agents and repositories. ## Overview Multi-agent features enable: - **Routing** - Automatic issue routing to correct repositories - **Cross-repo dependencies** - Dependencies across repository boundaries - **Agent coordination** - Work assignment and handoff between agents ## Key Concepts ### Routes Routes define which repository handles which issues: ```jsonl {"pattern": "frontend/*", "target": "frontend-repo"} {"pattern": "backend/*", "target": "backend-repo"} {"pattern": "*", "target": "main-repo"} ``` ### Work Assignment Pin work to specific agents: ```bash bd pin bd-42 --for agent-1 --start bd hook --agent agent-1 # Show pinned work ``` ### Cross-repo Dependencies Track dependencies across repositories: ```bash bd dep add bd-42 external:other-repo/bd-100 ``` ## Architecture ``` ┌─────────────────┐ │ Main Repo │ │ (coordinator) │ └────────┬────────┘ │ routes ┌────┴────┐ │ │ ┌───▼───┐ ┌───▼───┐ │Frontend│ │Backend│ │ Repo │ │ Repo │ └────────┘ └────────┘ ``` ## Getting Started 1. **Single repo**: Standard beads workflow 2. **Multi-repo**: Configure routes and cross-repo deps 3. **Multi-agent**: Add work assignment and handoff ## Navigation - [Routing](/multi-agent/routing) - Auto-routing configuration - [Coordination](/multi-agent/coordination) - Agent coordination patterns </document> <document path="docs/multi-agent/coordination.md"> # Agent Coordination Patterns for coordinating work between multiple AI agents. ## Work Assignment ### Pinning Work Assign work to a specific agent: ```bash # Pin issue to agent bd pin bd-42 --for agent-1 # Pin and start work bd pin bd-42 --for agent-1 --start # Unpin work bd unpin bd-42 ``` ### Checking Pinned Work ```bash # What's on my hook? bd hook # What's on agent-1's hook? bd hook --agent agent-1 # JSON output bd hook --json ``` ## Handoff Patterns ### Sequential Handoff Agent A completes work, hands off to Agent B: ```bash # Agent A bd close bd-42 --reason "Ready for review" bd pin bd-42 --for agent-b # Agent B picks up bd hook # Sees bd-42 bd update bd-42 --status in_progress ``` ### Parallel Work Multiple agents work on different issues: ```bash # Coordinator bd pin bd-42 --for agent-a --start bd pin bd-43 --for agent-b --start bd pin bd-44 --for agent-c --start # Each agent works independently # Coordinator monitors progress bd list --status in_progress --json ``` ### Fan-Out / Fan-In Split work, then merge: ```bash # Fan-out bd create "Part A" --parent bd-epic bd create "Part B" --parent bd-epic bd create "Part C" --parent bd-epic bd pin bd-epic.1 --for agent-a bd pin bd-epic.2 --for agent-b bd pin bd-epic.3 --for agent-c # Fan-in: wait for all parts bd dep add bd-merge bd-epic.1 bd-epic.2 bd-epic.3 ``` ## Agent Discovery Find available agents: ```bash # List known agents (if using agent registry) bd agents list # Check agent status bd agents status agent-1 ``` ## Conflict Prevention ### File Reservations Prevent concurrent edits: ```bash # Reserve files before editing bd reserve auth.go --for agent-1 # Check reservations bd reservations list # Release when done bd reserve --release auth.go ``` ### Issue Locking ```bash # Lock issue for exclusive work bd lock bd-42 --for agent-1 # Unlock when done bd unlock bd-42 ``` ## Communication Patterns ### Via Comments ```bash # Agent A leaves note bd comment add bd-42 "Completed API, needs frontend integration" # Agent B reads bd show bd-42 --full ``` ### Via Labels ```bash # Mark for review bd update bd-42 --add-label "needs-review" # Agent B filters bd list --label-any needs-review ``` ## Best Practices 1. **Clear ownership** - Always pin work to specific agent 2. **Document handoffs** - Use comments to explain context 3. **Use labels for status** - `needs-review`, `blocked`, `ready` 4. **Avoid conflicts** - Use reservations for shared files 5. **Monitor progress** - Regular status checks </document> <document path="docs/multi-agent/routing.md"> # Multi-Repo Routing Automatic issue routing across repositories. ## Overview Routing enables: - Issues created in one repo routed to another - Pattern-based routing rules - Fallback to default repository ## Configuration Create `.beads/routes.jsonl`: ```jsonl {"pattern": "frontend/**", "target": "frontend-repo", "priority": 10} {"pattern": "backend/**", "target": "backend-repo", "priority": 10} {"pattern": "docs/**", "target": "docs-repo", "priority": 5} {"pattern": "*", "target": "main-repo", "priority": 0} ``` ## Route Fields | Field | Description | |-------|-------------| | `pattern` | Glob pattern to match | | `target` | Target repository | | `priority` | Higher = checked first | ## Pattern Matching Patterns match against: - Issue title - Labels - Explicit path prefix **Examples:** ```jsonl {"pattern": "frontend/*", "target": "frontend"} {"pattern": "*api*", "target": "backend"} {"pattern": "label:docs", "target": "docs-repo"} ``` ## Commands ```bash # Show routing table bd routes list bd routes list --json # Test routing bd routes test "Fix frontend button" bd routes test --label frontend # Add route bd routes add "frontend/**" --target frontend-repo --priority 10 # Remove route bd routes remove "frontend/**" ``` ## Auto-Routing When creating issues, beads checks routes: ```bash bd create "Fix frontend button alignment" -t bug # Auto-routed to frontend-repo based on title match ``` Override with explicit target: ```bash bd create "Fix button" --repo backend-repo ``` ## Cross-Repo Dependencies Track dependencies across repos: ```bash # In frontend-repo bd dep add bd-42 external:backend-repo/bd-100 # View cross-repo deps bd dep tree bd-42 --cross-repo ``` ## Hydration Pull related issues from other repos: ```bash # Hydrate issues from related repos bd hydrate # Preview hydration bd hydrate --dry-run # Hydrate specific repo bd hydrate --from backend-repo ``` ## Best Practices 1. **Use specific patterns** - Avoid overly broad matches 2. **Set priorities** - Ensure specific patterns match first 3. **Default fallback** - Always have a `*` pattern with lowest priority 4. **Test routes** - Use `bd routes test` before committing </document> <document path="docs/integrations/aider.md"> # Aider Integration How to use beads with Aider. ## Setup ### Quick Setup ```bash bd setup aider ``` This creates/updates `.aider.conf.yml` with beads context. ### Verify Setup ```bash bd setup aider --check ``` ## Configuration The setup adds to `.aider.conf.yml`: ```yaml # Beads integration read: - .beads/issues.jsonl # Optional: Auto-run bd prime auto-commits: false ``` ## Workflow ### Start Session ```bash # Aider will have access to issues via .aider.conf.yml aider # Or manually inject context bd prime | aider --message-file - ``` ### During Work Use bd commands alongside aider: ```bash # In another terminal or after exiting aider bd create "Found bug during work" --deps discovered-from:bd-42 --json bd update bd-42 --status in_progress bd ready ``` ### End Session ```bash bd sync ``` ## Best Practices 1. **Keep issues visible** - Aider reads `.beads/issues.jsonl` 2. **Sync regularly** - Run `bd sync` after significant changes 3. **Use discovered-from** - Track issues found during work 4. **Document context** - Include descriptions in issues ## Example Workflow ```bash # 1. Check ready work bd ready # 2. Start aider with issue context aider --message "Working on bd-42: Fix auth bug" # 3. Work in aider... # 4. Create discovered issues bd create "Found related bug" --deps discovered-from:bd-42 --json # 5. Complete and sync bd close bd-42 --reason "Fixed" bd sync ``` ## Troubleshooting ### Config not loading ```bash # Check config exists cat .aider.conf.yml # Regenerate bd setup aider ``` ### Issues not visible ```bash # Check JSONL exists ls -la .beads/issues.jsonl # Export if missing bd export ``` ## See Also - [Claude Code](/integrations/claude-code) - [IDE Setup](/getting-started/ide-setup) </document> <document path="docs/integrations/claude-code.md"> # Claude Code Integration How to use beads with Claude Code. ## Setup ### Quick Setup ```bash bd setup claude ``` This installs: - **SessionStart hook** - Runs `bd prime` on session start - **PreCompact hook** - Runs `bd sync` before context compaction ### Manual Setup Add to your Claude Code hooks configuration: ```json { "hooks": { "SessionStart": ["bd prime"], "PreCompact": ["bd sync"] } } ``` ### Verify Setup ```bash bd setup claude --check ``` ## How It Works 1. **Session starts** → `bd prime` injects ~1-2k tokens of context 2. **You work** → Use `bd` CLI commands directly 3. **Session compacts** → `bd sync` saves work to git 4. **Session ends** → Changes synced via git ## Essential Commands for Agents ### Creating Issues ```bash # Always include description for context bd create "Fix authentication bug" \ --description="Login fails with special characters in password" \ -t bug -p 1 --json # Link discovered issues bd create "Found SQL injection" \ --description="User input not sanitized in query builder" \ --deps discovered-from:bd-42 --json ``` ### Working on Issues ```bash # Find ready work bd ready --json # Start work bd update bd-42 --status in_progress --json # Complete work bd close bd-42 --reason "Fixed in commit abc123" --json ``` ### Querying ```bash # List open issues bd list --status open --json # Show issue details bd show bd-42 --json # Check blocked issues bd blocked --json ``` ### Syncing ```bash # ALWAYS run at session end bd sync ``` ## Best Practices ### Always Use `--json` ```bash bd list --json # Parse programmatically bd create "Task" --json # Get issue ID from output bd show bd-42 --json # Structured data ``` ### Always Include Descriptions ```bash # Good bd create "Fix auth bug" \ --description="Login fails when password contains quotes" \ -t bug -p 1 --json # Bad - no context for future work bd create "Fix auth bug" -t bug -p 1 --json ``` ### Link Related Work ```bash # When you discover issues during work bd create "Found related bug" \ --deps discovered-from:bd-current --json ``` ### Sync Before Session End ```bash # ALWAYS run before ending bd sync ``` ## Plugin (Optional) For enhanced UX with slash commands: ```bash # In Claude Code /plugin marketplace add steveyegge/beads /plugin install beads # Restart Claude Code ``` Adds slash commands: - `/beads:ready` - Show ready work - `/beads:create` - Create issue - `/beads:show` - Show issue - `/beads:update` - Update issue - `/beads:close` - Close issue ## Troubleshooting ### Context not injected ```bash # Check hook setup bd setup claude --check # Manually prime bd prime ``` ### Changes not syncing ```bash # Force sync bd sync # Check daemon bd info bd daemons health ``` ### Database not found ```bash # Initialize beads bd init --quiet ``` ## See Also - [MCP Server](/integrations/mcp-server) - For MCP-only environments - [IDE Setup](/getting-started/ide-setup) - Other editors </document> <document path="docs/integrations/mcp-server.md"> # MCP Server Use beads in MCP-only environments. ## When to Use MCP Use MCP server when CLI is unavailable: - Claude Desktop (no shell access) - Sourcegraph Amp without shell - Other MCP-only environments **Prefer CLI + hooks** when shell is available - it's more context efficient. ## Installation ### Using uv (Recommended) ```bash uv tool install beads-mcp ``` ### Using pip ```bash pip install beads-mcp ``` ## Configuration ### Claude Desktop (macOS) Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: ```json { "mcpServers": { "beads": { "command": "beads-mcp" } } } ``` ### Claude Desktop (Windows) Add to `%APPDATA%\Claude\claude_desktop_config.json`: ```json { "mcpServers": { "beads": { "command": "beads-mcp" } } } ``` ### Sourcegraph Amp Add to MCP settings: ```json { "beads": { "command": "beads-mcp", "args": [] } } ``` ## Available Tools The MCP server exposes these tools: | Tool | Description | |------|-------------| | `beads_create` | Create new issue | | `beads_list` | List issues | | `beads_show` | Show issue details | | `beads_update` | Update issue | | `beads_close` | Close issue | | `beads_ready` | Show ready work | | `beads_sync` | Sync to git | | `beads_dep_add` | Add dependency | | `beads_dep_tree` | Show dependency tree | ## Usage Once configured, use naturally: ``` Create an issue for fixing the login bug with priority 1 ``` The MCP server translates to appropriate `bd` commands. ## Trade-offs | Aspect | CLI + Hooks | MCP Server | |--------|-------------|------------| | Context overhead | ~1-2k tokens | 10-50k tokens | | Latency | Direct calls | MCP protocol | | Setup | Hooks config | MCP config | | Availability | Shell required | MCP environments | ## Troubleshooting ### Server won't start Check if `beads-mcp` is in PATH: ```bash which beads-mcp ``` If not found: ```bash # Reinstall pip uninstall beads-mcp pip install beads-mcp ``` ### Tools not appearing 1. Restart Claude Desktop 2. Check MCP config JSON syntax 3. Verify server path ### Permission errors ```bash # Check directory permissions ls -la .beads/ # Initialize if needed bd init --quiet ``` ## See Also - [Claude Code](/integrations/claude-code) - CLI integration - [Installation](/getting-started/installation) - Full install guide </document> <document path="docs/recovery/index.md"> # Recovery Overview This section provides step-by-step recovery procedures for common Beads issues. Each runbook follows a consistent format: Symptoms, Diagnosis, Solution (5 steps max), and Prevention. ## Common Issues | Issue | Symptoms | Runbook | |-------|----------|---------| | Database Corruption | SQLite errors, missing data | [Database Corruption](/recovery/database-corruption) | | Merge Conflicts | JSONL conflicts during sync | [Merge Conflicts](/recovery/merge-conflicts) | | Circular Dependencies | Cycle detection errors | [Circular Dependencies](/recovery/circular-dependencies) | | Sync Failures | `bd sync` errors | [Sync Failures](/recovery/sync-failures) | ## Quick Diagnostic Before diving into specific runbooks, try these quick checks: ```bash # Check Beads status bd status # Verify daemon is running bd daemon status # Check for blocked issues bd blocked ``` :::tip Most issues can be diagnosed with `bd status`. Start there before following specific runbooks. ::: ## Getting Help If these runbooks don't resolve your issue: 1. Check the [FAQ](/reference/faq) 2. Search [existing issues](https://github.com/steveyegge/beads/issues) 3. Open a new issue with diagnostic output </document> <document path="docs/recovery/circular-dependencies.md"> # Circular Dependencies Recovery This runbook helps you detect and break circular dependency cycles in your issues. ## Symptoms - "circular dependency detected" errors - `bd blocked` shows unexpected results - Issues that should be ready appear blocked ## Diagnosis ```bash # Check for blocked issues bd blocked # View dependencies for a specific issue bd show <issue-id> # List all dependencies bd dep tree ``` ## Solution **Step 1:** Identify the cycle ```bash bd blocked --verbose ``` **Step 2:** Map the dependency chain ```bash bd show <issue-a> bd show <issue-b> # Follow the chain until you return to <issue-a> ``` **Step 3:** Determine which dependency to remove Consider: Which dependency is least critical to the workflow? **Step 4:** Remove the problematic dependency ```bash bd dep remove <dependent-issue> <blocking-issue> ``` **Step 5:** Verify the cycle is broken ```bash bd blocked bd ready ``` ## Prevention - Think "X needs Y" not "X before Y" when adding dependencies - Use `bd blocked` after adding dependencies to check for cycles - Keep dependency chains shallow when possible </document> <document path="docs/recovery/database-corruption.md"> # Database Corruption Recovery This runbook helps you recover from SQLite database corruption in Beads. ## Symptoms - SQLite error messages during `bd` commands - "database is locked" errors that persist - Missing issues that should exist - Inconsistent state between JSONL and database ## Diagnosis ```bash # Check database integrity bd status # Look for corruption indicators ls -la .beads/beads.db* ``` If you see `-wal` or `-shm` files alongside `beads.db`, a transaction may have been interrupted. ## Solution :::warning Back up your `.beads/` directory before proceeding. ::: **Step 1:** Stop the daemon ```bash bd daemon stop ``` **Step 2:** Back up current state ```bash cp -r .beads .beads.backup ``` **Step 3:** Rebuild from JSONL (source of truth) ```bash bd doctor --fix ``` **Step 4:** Verify recovery ```bash bd status bd list ``` **Step 5:** Restart daemon ```bash bd daemon start ``` ## Prevention - Avoid interrupting `bd sync` operations - Let the daemon handle synchronization - Use `bd daemon stop` before system shutdown </document> <document path="docs/recovery/merge-conflicts.md"> # Merge Conflicts Recovery This runbook helps you resolve JSONL merge conflicts that occur during Git operations. ## Symptoms - Git merge conflicts in `.beads/*.jsonl` files - `bd sync` fails with conflict errors - Different issue states between clones ## Diagnosis ```bash # Check for conflicted files git status # Look for conflict markers grep -l "<<<<<<" .beads/*.jsonl ``` ## Solution :::warning JSONL files are append-only logs. Manual editing requires care. ::: **Step 1:** Identify conflicted files ```bash git diff --name-only --diff-filter=U ``` **Step 2:** For each conflicted JSONL file, keep both versions ```bash # Accept both changes (append-only is safe) git checkout --ours .beads/issues.jsonl git add .beads/issues.jsonl ``` **Step 3:** Force rebuild to reconcile ```bash bd doctor --fix ``` **Step 4:** Verify state ```bash bd list bd status ``` **Step 5:** Complete the merge ```bash git commit -m "Resolved beads merge conflicts" ``` ## Prevention - Sync before and after Git operations - Use `bd sync` regularly - Avoid concurrent modifications from multiple clones </document> <document path="docs/recovery/sync-failures.md"> # Sync Failures Recovery This runbook helps you recover from `bd sync` failures. ## Symptoms - `bd sync` hangs or times out - Network-related error messages - "failed to push" or "failed to pull" errors - Daemon not responding ## Diagnosis ```bash # Check daemon status bd daemon status # Check sync state bd status # View daemon logs cat .beads/daemon.log | tail -50 ``` ## Solution **Step 1:** Stop the daemon ```bash bd daemon stop ``` **Step 2:** Check for lock files ```bash ls -la .beads/*.lock # Remove stale locks if daemon is definitely stopped rm -f .beads/*.lock ``` **Step 3:** Force a fresh sync ```bash bd doctor --fix ``` **Step 4:** Restart daemon ```bash bd daemon start ``` **Step 5:** Verify sync works ```bash bd sync bd status ``` ## Common Causes | Cause | Solution | |-------|----------| | Network timeout | Retry with better connection | | Stale lock file | Remove lock after stopping daemon | | Corrupted state | Use `bd doctor --fix` | | Git conflicts | See [Merge Conflicts](/recovery/merge-conflicts) | ## Prevention - Ensure stable network before sync - Let sync complete before closing terminal - Use `bd daemon stop` before system shutdown </document> <document path="docs/reference/advanced.md"> # Advanced Features Advanced beads functionality. ## Issue Rename Rename issues while preserving references: ```bash bd rename bd-42 bd-new-id bd rename bd-42 bd-new-id --dry-run # Preview ``` Updates: - All dependencies pointing to old ID - All references in other issues - Comments and descriptions ## Issue Merge Merge duplicate issues: ```bash bd merge bd-42 bd-43 --into bd-41 bd merge bd-42 bd-43 --into bd-41 --dry-run ``` What gets merged: - Dependencies → target - Text references updated across all issues - Source issues closed with merge reason ## Database Compaction Reduce database size by compacting old issues: ```bash # View compaction statistics bd admin compact --stats # Preview candidates (30+ days closed) bd admin compact --analyze --json # Apply agent-generated summary bd admin compact --apply --id bd-42 --summary summary.txt # Immediate deletion (CAUTION!) bd admin cleanup --force ``` **When to compact:** - Database > 10MB with old closed issues - After major milestones - Before archiving project phase ## Restore from History View deleted or compacted issues from git: ```bash bd restore bd-42 --show bd restore bd-42 --to-file issue.json ``` ## Database Inspection ```bash # Schema info bd info --schema --json # Raw database query (advanced) sqlite3 .beads/beads.db "SELECT * FROM issues LIMIT 5" ``` ## Custom Tables Extend the database with custom tables: ```go // In Go code using beads as library storage.UnderlyingDB().Exec(` CREATE TABLE IF NOT EXISTS custom_table (...) `) ``` See [EXTENDING.md](https://github.com/steveyegge/beads/blob/main/docs/EXTENDING.md). ## Event System Subscribe to beads events: ```bash # View recent events bd events list --since 1h # Watch events in real-time bd events watch ``` Events: - `issue.created` - `issue.updated` - `issue.closed` - `dependency.added` - `sync.completed` ## Batch Operations ### Create Multiple ```bash cat issues.jsonl | bd import -i - ``` ### Update Multiple ```bash bd list --status open --priority 4 --json | \ jq -r '.[].id' | \ xargs -I {} bd update {} --priority 3 ``` ### Close Multiple ```bash bd list --label "sprint-1" --status open --json | \ jq -r '.[].id' | \ xargs -I {} bd close {} --reason "Sprint complete" ``` ## API Access Use beads as a Go library: ```go import "github.com/steveyegge/beads/internal/storage" db, _ := storage.NewSQLite(".beads/beads.db") issues, _ := db.ListIssues(storage.ListOptions{ Status: "open", }) ``` ## Performance Tuning ### Large Databases ```bash # Enable WAL mode bd config set database.wal_mode true # Increase cache bd config set database.cache_size 10000 ``` ### Many Concurrent Agents ```bash # Use event-driven daemon export BEADS_DAEMON_MODE=events bd daemons killall ``` ### CI/CD Optimization ```bash # Disable daemon in CI export BEADS_NO_DAEMON=true bd --no-daemon list ``` </document> <document path="docs/reference/configuration.md"> # Configuration Complete configuration reference for beads. ## Configuration Locations 1. **Project config**: `.beads/config.toml` (highest priority) 2. **User config**: `~/.beads/config.toml` 3. **Environment variables**: `BEADS_*` 4. **Command-line flags**: (highest priority) ## Managing Configuration ```bash # Get config value bd config get import.orphan_handling # Set config value bd config set import.orphan_handling allow # List all config bd config list # Reset to default bd config reset import.orphan_handling ``` ## Configuration Options ### Database ```toml [database] path = ".beads/beads.db" # Database file location ``` ### ID Generation ```toml [id] prefix = "bd" # Issue ID prefix hash_length = 4 # Hash length in IDs ``` ### Import ```toml [import] orphan_handling = "allow" # allow|resurrect|skip|strict dedupe_on_import = false # Run duplicate detection after import ``` | Mode | Behavior | |------|----------| | `allow` | Import orphans without validation (default) | | `resurrect` | Restore deleted parents as tombstones | | `skip` | Skip orphaned children with warning | | `strict` | Fail if parent missing | ### Export ```toml [export] path = ".beads/issues.jsonl" # Export file location auto_export = true # Auto-export on changes debounce_seconds = 5 # Debounce interval ``` ### Daemon ```toml [daemon] auto_start = true # Auto-start daemon sync_interval = "5s" # Sync check interval log_level = "info" # debug|info|warn|error mode = "poll" # poll|events (experimental) ``` ### Git ```toml [git] auto_commit = true # Auto-commit on sync auto_push = true # Auto-push on sync commit_message = "bd sync" # Default commit message ``` ### Hooks ```toml [hooks] pre_commit = true # Enable pre-commit hook post_merge = true # Enable post-merge hook pre_push = true # Enable pre-push hook ``` ### Deletions ```toml [deletions] retention_days = 30 # Keep deletion records for N days prune_on_sync = true # Auto-prune old records ``` ## Environment Variables | Variable | Description | |----------|-------------| | `BEADS_DB` | Database path | | `BEADS_NO_DAEMON` | Disable daemon | | `BEADS_DAEMON_MODE` | Daemon mode (poll/events) | | `BEADS_LOG_LEVEL` | Log level | | `BEADS_CONFIG` | Config file path | ## Per-Command Override ```bash # Override database bd --db /tmp/test.db list # Disable daemon for single command bd --no-daemon create "Task" ``` ## Example Configuration `.beads/config.toml`: ```toml [id] prefix = "myproject" hash_length = 6 [import] orphan_handling = "resurrect" dedupe_on_import = true [daemon] auto_start = true sync_interval = "10s" mode = "events" [git] auto_commit = true auto_push = true [deletions] retention_days = 90 ``` ## Viewing Active Configuration ```bash bd info --json | jq '.config' ``` </document> <document path="docs/reference/faq.md"> # Frequently Asked Questions ## General ### Why beads instead of GitHub Issues or Jira? Beads was designed specifically for AI-supervised coding workflows: - **Hash-based IDs** prevent collisions with concurrent agents - **Git-backed storage** enables branch-based workflows - **Dependency-aware** ready queue for automated work selection - **Formula system** for declarative workflow templates ### What does "beads" stand for? Nothing specific - it's a metaphor for linked work items (like beads on a string). ### Is beads production-ready? Yes, beads is used in production for AI-assisted development. The API is stable with semantic versioning. ## Architecture ### Why SQLite + JSONL instead of just one? - **SQLite** for fast local queries and complex filtering - **JSONL** for git-friendly versioning and sync - Auto-sync keeps them aligned ### Why hash-based IDs instead of sequential? Sequential IDs (`#1`, `#2`) break when: - Multiple agents create issues simultaneously - Different branches have independent numbering - Forks diverge and merge Hash-based IDs are globally unique without coordination. ### Why a daemon? The daemon provides: - Auto-sync with 5-second debounce - Batched operations for performance - Background monitoring Use `--no-daemon` when not needed (CI, worktrees). ## Usage ### How do I sync issues to git? ```bash # Auto-sync via daemon (default) # Or manual sync: bd sync ``` ### How do I handle merge conflicts? Install the beads merge driver: ```bash bd init # Prompts for merge driver ``` Or manually resolve and reimport. ### Can multiple agents work on the same repo? Yes! That's what beads was designed for: - Hash IDs prevent collisions - Pin work to specific agents - Track who's working on what ### How do I use beads in CI/CD? ```bash # Disable daemon in CI export BEADS_NO_DAEMON=true # Or per-command bd --no-daemon list ``` ## Workflows ### What are formulas? Declarative workflow templates in TOML or JSON. Pour them to create molecules (instances). ### What are gates? Async coordination primitives: - Human gates wait for approval - Timer gates wait for duration - GitHub gates wait for CI/PR events ### What's the difference between molecules and wisps? - **Molecules** persist in `.beads/` and sync with git - **Wisps** are ephemeral in `.beads-wisp/` and don't sync ## Integration ### Should I use CLI or MCP? **Use CLI + hooks** when shell is available (Claude Code, Cursor, etc.): - Lower context overhead (~1-2k vs 10-50k tokens) - Faster execution - Universal across editors **Use MCP** when CLI unavailable (Claude Desktop). ### How do I integrate with my editor? ```bash bd setup claude # Claude Code bd setup cursor # Cursor bd setup aider # Aider ``` ### Can beads import from GitHub Issues? Yes: ```bash bd import --from github --repo owner/repo ``` ## Troubleshooting ### Why is the daemon not starting? ```bash # Remove stale socket rm -f .beads/bd.sock # Restart bd daemons killall bd info ``` ### Why aren't my changes syncing? ```bash # Check daemon status bd info # Force sync bd sync # Check hooks bd hooks status ``` ### How do I report a bug? 1. Check existing issues: https://github.com/steveyegge/beads/issues 2. Include: `bd version`, `bd info --json`, reproduction steps 3. File at: https://github.com/steveyegge/beads/issues/new </document> <document path="docs/reference/git-integration.md"> # Git Integration How beads integrates with git. ## Overview Beads uses git for: - **JSONL sync** - Issues stored in `.beads/issues.jsonl` - **Deletion tracking** - `.beads/deletions.jsonl` - **Conflict resolution** - Custom merge driver - **Hooks** - Auto-sync on git operations ## File Structure ``` .beads/ ├── beads.db # SQLite database (gitignored) ├── issues.jsonl # Issue data (git-tracked) ├── deletions.jsonl # Deletion manifest (git-tracked) ├── config.toml # Project config (git-tracked) └── bd.sock # Daemon socket (gitignored) ``` ## Git Hooks ### Installation ```bash bd hooks install ``` Installs: - **pre-commit** - Exports database to JSONL - **post-merge** - Imports from JSONL after pull - **pre-push** - Ensures sync before push ### Status ```bash bd hooks status ``` ### Uninstall ```bash bd hooks uninstall ``` ## Merge Driver ### Purpose The beads merge driver handles JSONL conflicts automatically: - Merges non-conflicting changes - Uses latest timestamp for same-issue edits - Preserves both sides for real conflicts ### Installation ```bash bd init # Prompts for merge driver setup ``` Or manually add to `.gitattributes`: ```gitattributes .beads/issues.jsonl merge=beads .beads/deletions.jsonl merge=beads ``` And `.git/config`: ```ini [merge "beads"] name = Beads JSONL merge driver driver = bd merge-driver %O %A %B ``` ## Protected Branches For protected main branches: ```bash bd init --branch beads-sync ``` This: - Creates a separate `beads-sync` branch - Syncs issues to that branch - Avoids direct commits to main ## Git Worktrees Beads requires `--no-daemon` in git worktrees: ```bash # In worktree bd --no-daemon create "Task" bd --no-daemon list ``` Why: Daemon uses `.beads/bd.sock` which conflicts across worktrees. ## Branch Workflows ### Feature Branch ```bash git checkout -b feature-x bd create "Feature X" -t feature # Work... bd sync git push ``` ### Fork Workflow ```bash # In fork bd init --contributor # Work in separate planning repo... bd sync ``` ### Team Workflow ```bash bd init --team # All team members share issues.jsonl git pull # Auto-imports via hook ``` ## Conflict Resolution ### With Merge Driver Automatic - driver handles most conflicts. ### Manual Resolution ```bash # After conflict git checkout --ours .beads/issues.jsonl bd import -i .beads/issues.jsonl bd sync git add .beads/ git commit ``` ### Duplicate Detection After merge: ```bash bd duplicates --auto-merge ``` ## Best Practices 1. **Install hooks** - `bd hooks install` 2. **Use merge driver** - Avoid manual conflict resolution 3. **Sync regularly** - `bd sync` at session end 4. **Pull before work** - Get latest issues 5. **Use `--no-daemon` in worktrees** </document> <document path="docs/reference/troubleshooting.md"> # Troubleshooting Common issues and solutions. ## Installation Issues ### `bd: command not found` ```bash # Check if installed which bd go list -f {{.Target}} github.com/steveyegge/beads/cmd/bd # Add Go bin to PATH export PATH="$PATH:$(go env GOPATH)/bin" # Or reinstall go install github.com/steveyegge/beads/cmd/bd@latest ``` ### `zsh: killed bd` on macOS CGO/SQLite compatibility issue: ```bash CGO_ENABLED=1 go install github.com/steveyegge/beads/cmd/bd@latest ``` ### Permission denied ```bash chmod +x $(which bd) ``` ## Database Issues ### Database not found ```bash # Initialize beads bd init --quiet # Or specify database bd --db .beads/beads.db list ``` ### Database locked ```bash # Stop daemon bd daemons killall # Try again bd list ``` ### Corrupted database ```bash # Restore from JSONL rm .beads/beads.db bd import -i .beads/issues.jsonl ``` ## Daemon Issues ### Daemon not starting ```bash # Check status bd info # Remove stale socket rm -f .beads/bd.sock # Restart bd daemons killall bd info ``` ### Version mismatch After upgrading bd: ```bash bd daemons killall bd info ``` ### High CPU usage ```bash # Switch to event-driven mode export BEADS_DAEMON_MODE=events bd daemons killall ``` ## Sync Issues ### Changes not syncing ```bash # Force sync bd sync # Check daemon bd info | grep daemon # Check hooks bd hooks status ``` ### Import errors ```bash # Allow orphans bd import -i .beads/issues.jsonl --orphan-handling allow # Check for duplicates after bd duplicates ``` ### Merge conflicts ```bash # Use merge driver bd init # Setup merge driver # Or manual resolution git checkout --ours .beads/issues.jsonl bd import -i .beads/issues.jsonl bd sync ``` ## Git Hook Issues ### Hooks not running ```bash # Check if installed ls -la .git/hooks/ # Reinstall bd hooks install ``` ### Hook errors ```bash # Check hook script cat .git/hooks/pre-commit # Run manually .git/hooks/pre-commit ``` ## Dependency Issues ### Circular dependencies ```bash # Detect cycles bd dep cycles # Remove one dependency bd dep remove bd-A bd-B ``` ### Missing dependencies ```bash # Check orphan handling bd config get import.orphan_handling # Allow orphans bd config set import.orphan_handling allow ``` ## Performance Issues ### Slow queries ```bash # Check database size ls -lh .beads/beads.db # Compact if large bd admin compact --analyze ``` ### High memory usage ```bash # Reduce cache bd config set database.cache_size 1000 ``` ## Getting Help ### Debug output ```bash bd --verbose list ``` ### Logs ```bash bd daemons logs . -n 100 ``` ### System info ```bash bd info --json ``` ### File an issue ```bash # Include this info bd version bd info --json uname -a ``` Report at: https://github.com/steveyegge/beads/issues </document> --- # End of Documentation For updates and contributions, visit: https://github.com/steveyegge/beads