Files
beads/cmd/bd/info.go
beads/crew/emma 9bbcee38d0 chore: Bump version to 0.49.1
Executed-By: beads/crew/emma
Rig: beads
Role: crew
2026-01-25 21:01:51 -08:00

1027 lines
44 KiB
Go

package main
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/spf13/cobra"
"github.com/steveyegge/beads/internal/types"
)
var infoCmd = &cobra.Command{
Use: "info",
GroupID: "setup",
Short: "Show database and daemon information",
Long: `Display information about the current database path and daemon status.
This command helps debug issues where bd is using an unexpected database
or daemon connection. It shows:
- The absolute path to the database file
- Daemon connection status (daemon or direct mode)
- If using daemon: socket path, health status, version
- Database statistics (issue count)
- Schema information (with --schema flag)
- What's new in recent versions (with --whats-new flag)
Examples:
bd info
bd info --json
bd info --schema --json
bd info --whats-new
bd info --whats-new --json
bd info --thanks`,
Run: func(cmd *cobra.Command, args []string) {
schemaFlag, _ := cmd.Flags().GetBool("schema")
whatsNewFlag, _ := cmd.Flags().GetBool("whats-new")
thanksFlag, _ := cmd.Flags().GetBool("thanks")
// Handle --thanks flag
if thanksFlag {
printThanksPage()
return
}
// Handle --whats-new flag
if whatsNewFlag {
showWhatsNew()
return
}
// Get database path (absolute)
absDBPath, err := filepath.Abs(dbPath)
if err != nil {
absDBPath = dbPath
}
// Build info structure
info := map[string]interface{}{
"database_path": absDBPath,
"mode": daemonStatus.Mode,
}
// Add daemon details if connected
if daemonClient != nil {
info["daemon_connected"] = true
info["socket_path"] = daemonStatus.SocketPath
// Get daemon health
health, err := daemonClient.Health()
if err == nil {
info["daemon_version"] = health.Version
info["daemon_status"] = health.Status
info["daemon_compatible"] = health.Compatible
info["daemon_uptime"] = health.Uptime
}
// Get issue count from daemon
resp, err := daemonClient.Stats()
if err == nil {
var stats types.Statistics
if jsonErr := json.Unmarshal(resp.Data, &stats); jsonErr == nil {
info["issue_count"] = stats.TotalIssues
}
}
} else {
// Direct mode
info["daemon_connected"] = false
if daemonStatus.FallbackReason != "" && daemonStatus.FallbackReason != FallbackNone {
info["daemon_fallback_reason"] = daemonStatus.FallbackReason
}
if daemonStatus.Detail != "" {
info["daemon_detail"] = daemonStatus.Detail
}
// Get issue count from direct store
if store != nil {
ctx := rootCtx
// Check database freshness before reading
// Skip check when using daemon (daemon auto-imports on staleness)
if daemonClient == nil {
if err := ensureDatabaseFresh(ctx); err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
}
filter := types.IssueFilter{}
issues, err := store.SearchIssues(ctx, "", filter)
if err == nil {
info["issue_count"] = len(issues)
}
}
}
// Add config to info output (requires direct mode to access config table)
// Save current daemon state
wasDaemon := daemonClient != nil
var tempErr error
if wasDaemon {
// Temporarily switch to direct mode to read config
tempErr = ensureDirectMode("info: reading config")
}
if store != nil {
ctx := rootCtx
configMap, err := store.GetAllConfig(ctx)
if err == nil && len(configMap) > 0 {
info["config"] = configMap
}
}
// Note: We don't restore daemon mode since info is a read-only command
// and the process will exit immediately after this
_ = tempErr // silence unused warning
// Add schema information if requested
if schemaFlag && store != nil {
ctx := rootCtx
// Get schema version
schemaVersion, err := store.GetMetadata(ctx, "bd_version")
if err != nil {
schemaVersion = "unknown"
}
// Get tables
tables := []string{"issues", "dependencies", "labels", "config", "metadata"}
// Get config
configMap := make(map[string]string)
prefix, _ := store.GetConfig(ctx, "issue_prefix")
if prefix != "" {
configMap["issue_prefix"] = prefix
}
// Get sample issue IDs
filter := types.IssueFilter{}
issues, err := store.SearchIssues(ctx, "", filter)
sampleIDs := []string{}
detectedPrefix := ""
if err == nil && len(issues) > 0 {
// Get first 3 issue IDs as samples
maxSamples := 3
if len(issues) < maxSamples {
maxSamples = len(issues)
}
for i := 0; i < maxSamples; i++ {
sampleIDs = append(sampleIDs, issues[i].ID)
}
// Detect prefix from first issue
if len(issues) > 0 {
detectedPrefix = extractPrefix(issues[0].ID)
}
}
info["schema"] = map[string]interface{}{
"tables": tables,
"schema_version": schemaVersion,
"config": configMap,
"sample_issue_ids": sampleIDs,
"detected_prefix": detectedPrefix,
}
}
// JSON output
if jsonOutput {
outputJSON(info)
return
}
// Human-readable output
fmt.Println("\nBeads Database Information")
fmt.Println("===========================")
fmt.Printf("Database: %s\n", absDBPath)
fmt.Printf("Mode: %s\n", daemonStatus.Mode)
if daemonClient != nil {
fmt.Println("\nDaemon Status:")
fmt.Printf(" Connected: yes\n")
fmt.Printf(" Socket: %s\n", daemonStatus.SocketPath)
health, err := daemonClient.Health()
if err == nil {
fmt.Printf(" Version: %s\n", health.Version)
fmt.Printf(" Health: %s\n", health.Status)
if health.Compatible {
fmt.Printf(" Compatible: ✓ yes\n")
} else {
fmt.Printf(" Compatible: ✗ no (restart recommended)\n")
}
fmt.Printf(" Uptime: %.1fs\n", health.Uptime)
}
} else {
fmt.Println("\nDaemon Status:")
fmt.Printf(" Connected: no\n")
if daemonStatus.FallbackReason != "" && daemonStatus.FallbackReason != FallbackNone {
fmt.Printf(" Reason: %s\n", daemonStatus.FallbackReason)
}
if daemonStatus.Detail != "" {
fmt.Printf(" Detail: %s\n", daemonStatus.Detail)
}
}
// Show issue count
if count, ok := info["issue_count"].(int); ok {
fmt.Printf("\nIssue Count: %d\n", count)
}
// Show schema information if requested
if schemaFlag {
if schemaInfo, ok := info["schema"].(map[string]interface{}); ok {
fmt.Println("\nSchema Information:")
fmt.Printf(" Tables: %v\n", schemaInfo["tables"])
if version, ok := schemaInfo["schema_version"].(string); ok {
fmt.Printf(" Schema Version: %s\n", version)
}
if prefix, ok := schemaInfo["detected_prefix"].(string); ok && prefix != "" {
fmt.Printf(" Detected Prefix: %s\n", prefix)
}
if samples, ok := schemaInfo["sample_issue_ids"].([]string); ok && len(samples) > 0 {
fmt.Printf(" Sample Issues: %v\n", samples)
}
}
}
// Check git hooks status
hookStatuses := CheckGitHooks()
if warning := FormatHookWarnings(hookStatuses); warning != "" {
fmt.Printf("\n%s\n", warning)
}
fmt.Println()
},
}
// extractPrefix extracts the prefix from an issue ID (e.g., "bd-123" -> "bd")
// Uses the last hyphen before a numeric suffix, so "beads-vscode-1" -> "beads-vscode"
func extractPrefix(issueID string) string {
// Try last hyphen first (handles multi-part prefixes like "beads-vscode-1")
lastIdx := strings.LastIndex(issueID, "-")
if lastIdx <= 0 {
return ""
}
suffix := issueID[lastIdx+1:]
// Check if suffix is numeric
if len(suffix) > 0 {
numPart := suffix
if dotIdx := strings.Index(suffix, "."); dotIdx > 0 {
numPart = suffix[:dotIdx]
}
var num int
if _, err := fmt.Sscanf(numPart, "%d", &num); err == nil {
return issueID[:lastIdx]
}
}
// Suffix is not numeric, fall back to first hyphen
firstIdx := strings.Index(issueID, "-")
if firstIdx <= 0 {
return ""
}
return issueID[:firstIdx]
}
// VersionChange represents agent-relevant changes for a specific version
type VersionChange struct {
Version string `json:"version"`
Date string `json:"date"`
Changes []string `json:"changes"`
}
// versionChanges contains agent-actionable changes for recent versions
var versionChanges = []VersionChange{
{
Version: "0.49.1",
Date: "2026-01-25",
Changes: []string{
"NEW: Dolt backend fully supported - Extensively tested and ready for community evaluation",
"NOTE: Dolt is not enabled by default - We encourage users to try it and report feedback!",
"NEW: bd activity --details/-d - Full issue information in activity feed (#1317)",
"NEW: bd export --id/--parent - Targeted exports with filters (#1292)",
"NEW: bd update --append-notes - Append to existing notes (#1304)",
"NEW: bd show --id - For IDs that look like flags",
"NEW: bd doctor --server - Dolt server mode health checks",
"NEW: Dolt server mode - Multi-client access for shared Dolt databases",
"NEW: Dolt auto-commit on writes with explicit commit authors (#1267)",
"FIX: Daemon stack overflow on empty database path (#1288, #1313)",
"FIX: bd list --json optimization - Fetch only needed dependencies (#1316)",
"FIX: Import custom issue types (#1322)",
"FIX: SQLite transaction improvements (#1272, #1276)",
"FIX: Multiple Dolt backend fixes for hooks, routing, and daemon compatibility",
"DOCS: Comprehensive docs/DOLT.md guide (#1310)",
},
},
{
Version: "0.49.0",
Date: "2026-01-21",
Changes: []string{
"NEW: Dolt federation - Peer-to-peer issue sync with bd federation sync command",
"NEW: SQLite to Dolt migration - bd migrate dolt converts existing repos",
"NEW: bd children <id> - Display child issues for a parent",
"NEW: bd rename <old> <new> - Rename issue IDs",
"NEW: bd view - Alias for bd show command",
"NEW: bd config validate - Validate sync configuration",
"NEW: Jujutsu (jj) VCS support - Beads now works with jj repositories",
"NEW: Per-field merge strategies for conflict resolution",
"NEW: -m flag as alias for --description in bd create",
"CHANGED: Auto-routing disabled by default - Enable with routing.mode: auto (#1177)",
"CHANGED: Gas Town types removed from core - Use types.custom configuration",
"FIX: Daemon zombie state after DB replacement (#1213)",
"FIX: WSL2 Docker Desktop - Detect bind mounts and disable WAL mode (#1224)",
"FIX: Daemon stack overflow in handleStaleLock (#1238)",
"FIX: Molecule steps excluded from bd ready (#1246)",
"FIX: Tree ordering stabilization for consistent --tree output (#1228)",
},
},
{
Version: "0.48.0",
Date: "2026-01-17",
Changes: []string{
"NEW: VersionedStorage interface - Abstract storage layer with history/diff/branch operations",
"NEW: bd types command - List valid issue types with descriptions",
"NEW: bd close -m flag - Alias for --reason (git commit convention)",
"NEW: RepoContext API - Centralized git operations context",
"WIP: Dolt backend improvements - Bootstrap from JSONL, hook infrastructure, bd compact --dolt",
"FIX: Doctor sync branch check - Removed destructive --fix behavior (GH#1062)",
"FIX: Duplicate merge target - Use combined weight for better selection (GH#1022)",
"FIX: Worktree exclude paths - Correct --git-common-dir usage (GH#1053)",
"FIX: Daemon git.author - Apply configured author to sync commits",
"FIX: Windows CGO-free builds - Enable building without CGO (#1117)",
"FIX: Git hooks in worktrees - Fix hook execution in linked worktrees (#1126)",
},
},
{
Version: "0.47.2",
Date: "2026-01-14",
Changes: []string{
"NEW: Dolt backend (experimental) - bd init --backend=dolt for version-controlled storage",
"NEW: bd show --children flag - Display child issues inline with parent",
"NEW: Comprehensive NixOS support - Improved flake and home-manager integration",
"FIX: Redirect + sync-branch incompatibility - bd sync works in redirected repos (bd-wayc3)",
"FIX: Doctor project-level settings - Detects plugins/hooks/MCP in .claude/settings.json",
"FIX: Contributor routing - bd init --contributor correctly sets up routing (#1088)",
"CHANGED: Release workflow modernized - bump-version.sh replaced with molecule pointer",
"DOCS: EXTENDING.md deprecated - Custom SQLite tables approach deprecated for Dolt migration",
},
},
{
Version: "0.47.1",
Date: "2026-01-12",
Changes: []string{
"NEW: bd list --ready flag - Show only issues with no blockers (bd-ihu31)",
"NEW: Markdown rendering in comments - Enhanced display for notes (#1019)",
"FIX: Nil pointer in wisp create - Prevent panic in molecule creation",
"FIX: Route prefix for rig issues - Use correct prefix when creating (#1028)",
"FIX: Duplicate merge target - Prefer issues with children/deps (GH#1022)",
"FIX: SQLite cache rebuild after rename-prefix (GH#1016)",
"FIX: MCP custom types - Support non-built-in types/statuses (#1023)",
"FIX: Hyphenated prefix validation - Support hyphens in prefixes (#1013)",
"FIX: Git worktree initialization - Prevent bd init in worktrees (#1026)",
},
},
{
Version: "0.47.0",
Date: "2026-01-11",
Changes: []string{
"NEW: Pull-first sync with 3-way merge - Reconciles local/remote before push (#918)",
"NEW: bd resolve-conflicts command - Mechanical JSONL conflict resolution (bd-7e7ddffa)",
"NEW: bd create --dry-run - Preview issue creation without side effects (bd-0hi7)",
"NEW: bd ready --gated - Find molecules waiting on gates (bd-lhalq)",
"NEW: Gate auto-discovery - Auto-discover workflow run ID in bd gate check (bd-fbkd)",
"NEW: Multi-repo custom types - bd doctor discovers types across repos (bd-62g22)",
"NEW: Stale DB handling - Read-only commands auto-import on stale DB (#977, #982)",
"NEW: Linear project filter - linear.project_id config for sync (#938)",
"FIX: Windows infinite loop in findLocalBeadsDir (GH#996)",
"FIX: bd init hangs on Windows when not in git repo (#991)",
"FIX: Daemon socket for deep paths - Long workspace paths now work (GH#1001)",
"FIX: Prevent closing issues with open blockers (GH#962)",
"FIX: bd edit parses EDITOR with args (GH#987)",
"FIX: Worktree/redirect handling - Skip restore when redirected (bd-lmqhe)",
"CHANGE: Daemon CLI refactored to subcommands (#1006)",
},
},
{
Version: "0.46.0",
Date: "2026-01-06",
Changes: []string{
"NEW: Custom type support - Configure custom issue types in config.yaml (bd-649s)",
"NEW: Gas Town types extraction - Core Gas Town types in beads package (bd-i54l)",
"FIX: Gate workflow discovery - Better matching of GitHub Actions runs (bd-m8ew)",
},
},
{
Version: "0.45.0",
Date: "2026-01-06",
Changes: []string{
"NEW: Dynamic shell completions - Tab complete issue IDs in bash/zsh/fish (#935)",
"NEW: Android/Termux support - Native ARM64 binaries (#887)",
"NEW: Deep pre-commit integration - bd doctor checks pre-commit configs (bd-28r5)",
"NEW: Rig identity bead type - New 'rig' type for Gas Town tracking (gt-zmznh)",
"NEW: --filter-parent alias - Alternative to --parent in bd list (bd-3p4u)",
"NEW: Unified auto-sync config - Simpler daemon config for agents (#904)",
"NEW: BD_SOCKET env var - Test isolation for daemon socket paths (#914)",
"FIX: Init branch persistence - --branch flag persists to config.yaml (#934)",
"FIX: Worktree resolution - Resolve worktrees by name from git registry (#921)",
"FIX: Sync with redirect - Handle .beads/redirect in git status and import",
"FIX: Doctor improvements - skip-worktree flag, duplicate detection, metadata queries",
"FIX: Update prefix routing - bd update routes like bd show (bd-618f)",
},
},
{
Version: "0.44.0",
Date: "2026-01-04",
Changes: []string{
"NEW: Recipe-based setup - bd init refactored to modular recipes (bd-i3ed)",
"NEW: Gate evaluation phases 2-4 - Timer, GitHub, cross-rig gate support",
"NEW: bd gate check/discover/add-waiter/show - Gate workflow commands",
"NEW: --blocks flag for bd dep add - Natural dependency syntax (GH#884)",
"NEW: --blocked-by/--depends-on aliases for bd dep add (bd-09kt)",
"NEW: Multi-prefix support - allowed_prefixes config option (#881)",
"NEW: Sync divergence detection - JSONL/SQLite/git consistency checks (GH#885)",
"NEW: PRIME.md override - Custom prime output per project (GH#876)",
"NEW: Compound visualization - bd mol show displays compound structure (bd-iw4z)",
"NEW: /handoff skill - Session cycling slash command (bd-xwvo)",
"FIX: bd ready now shows in_progress issues (#894)",
"FIX: macOS case-insensitive path handling for worktrees/daemon (GH#880)",
"FIX: Sync metadata timing - finalize after commit not push (GH#885)",
"FIX: Sparse checkout isolation - prevent config leak to main repo (GH#886)",
"FIX: close_reason preserved during merge/sync (GH#891)",
"FIX: Hyphenated rig names supported in agent IDs (GH#854, GH#868)",
},
},
{
Version: "0.43.0",
Date: "2026-01-02",
Changes: []string{
"NEW: Step.Gate evaluation Phase 1 - Human gates for workflow control",
"NEW: bd lint command - Template validation against schema",
"NEW: bd ready --pretty - Formatted human-friendly output",
"FIX: Cross-rig routing for bd close and bd update",
"FIX: Agent ID validation accepts any rig prefix (GH#827)",
"FIX: bd sync in bare repo worktrees - Exit 128 error (GH#827)",
"FIX: bd --no-db dep tree shows complete tree (GH#836)",
},
},
{
Version: "0.42.0",
Date: "2025-12-30",
Changes: []string{
"NEW: llms.txt standard support - AI agent discoverability endpoint (#784)",
"NEW: bd preflight command - PR readiness checks (Phase 1)",
"NEW: --claim flag for bd update - Atomic work queue semantics",
"NEW: bd state/set-state commands - Label-based state management",
"NEW: bd activity --town - Cross-rig aggregated activity feed",
"NEW: Convoy issue type - Reactive completion with 'tracks' relation",
"NEW: prepare-commit-msg hook - Agent identity trailers in commits",
"NEW: Daemon RPC endpoints - Config and mol stale queries",
"NEW: Non-TTY auto-detection - Cleaner output in pipes",
"FIX: Git hook chaining now works correctly (GH#816)",
"FIX: .beads/redirect not committed - Prevents worktree conflicts (GH#814)",
"FIX: bd sync with sync-branch - Worktree copy direction fixed (GH#810, #812)",
"FIX: sync.branch validation - Rejects main/master as sync branch (GH#807)",
"FIX: Read operations read-only - No DB writes on list/ready/show (GH#804)",
"FIX: bd list defaults - Non-closed issues, 50 limit (GH#788)",
"FIX: External direct-commit bypass when sync.branch configured (bd-n663)",
"FIX: Migration 022 SQL syntax error on v0.30.3 upgrade",
"FIX: MCP plugin follows .beads/redirect files",
"FIX: Jira sync error message when Python script not found (GH#803)",
},
},
{
Version: "0.41.0",
Date: "2025-12-29",
Changes: []string{
"NEW: bd swarm commands - Create/status/validate for multi-agent batch coordination",
"NEW: bd repair command - Detect and repair orphaned foreign key references",
"NEW: bd compact --purge-tombstones - Dependency-aware tombstone cleanup",
"NEW: bd init --from-jsonl - Preserve manual JSONL edits on reinit",
"NEW: bd human command - Focused help menu for humans",
"NEW: bd show --short - Compact output mode for scripting",
"NEW: bd delete --reason - Audit trail for deletions",
"NEW: 'hooked' status - Hook-based work assignment for orchestrators",
"NEW: mol_type schema field - Molecule classification tracking",
"FIX: --var flag allows commas in values (GH#786)",
"FIX: bd sync in bare repo worktrees (GH#785)",
"FIX: bd delete --cascade recursive deletion (GH#787)",
"FIX: bd doctor pre-push hook detection (GH#799)",
"FIX: Illumos/Solaris disk space check (GH#798)",
"FIX: hq- prefix routing - Correctly finds town root for routes.jsonl",
"FIX: Pre-migration orphan cleanup - Avoids chicken-and-egg failures",
"CHANGED: CLI command consolidation - Reduced top-level surface area",
"CHANGED: Code organization - Split large cmd/bd files to meet 800-line limit",
},
},
{
Version: "0.39.1",
Date: "2025-12-27",
Changes: []string{
"NEW: bd where command - Show active beads location after following redirects",
"NEW: --parent flag for bd update - Reparent issues between epics",
"NEW: Redirect info in bd prime - Shows when database is redirected",
"FIX: bd doctor follows redirects - Multi-clone compatibility",
"FIX: Remove 8-char prefix limit - bd rename-prefix allows longer prefixes",
"CHANGED: Git context consolidation - Internal refactor for efficiency",
"DOCS: Database Redirects section - ADVANCED.md documentation",
"DOCS: Community Tools update - Added opencode-beads to README",
},
},
{
Version: "0.39.0",
Date: "2025-12-27",
Changes: []string{
"NEW: bd orphans command - Detect issues mentioned in commits but never closed",
"NEW: bd admin parent command - Consolidated cleanup/compact/reset under bd admin",
"NEW: --prefix flag for bd create - Create issues in other rigs from any directory",
"CHANGED: bd mol catalog → bd formula list - Aligns with formula terminology",
"CHANGED: bd info --thanks - Contributors list moved under bd info",
"CHANGED: Removed unused bd pin/unpin/hook commands - Use gt mol commands",
"CHANGED: bd doctor --check=pollution - Test pollution check integrated into doctor",
"FIX: macOS codesigning in bump-version.sh --install - Prevents quarantine issues",
"FIX: Lint errors and Nix vendorHash - Clean builds on all platforms",
"DOCS: Issue Statuses section in CLI_REFERENCE.md - Comprehensive status docs",
"DOCS: Consolidated duplicate UI_PHILOSOPHY files - Single source of truth",
"DOCS: README and PLUGIN.md fixes - Corrected installation instructions",
},
},
{
Version: "0.38.0",
Date: "2025-12-27",
Changes: []string{
"NEW: Prefix-based routing - bd commands auto-route to correct rig via routes.jsonl",
"NEW: Cross-rig ID auto-resolve - bd dep add auto-resolves IDs across rigs",
"NEW: bd mol pour/wisp moved under bd mol subcommand - cleaner command hierarchy",
"NEW: bd show displays comments - Comments now visible in issue details",
"NEW: created_by field on issues - Track issue creator for audit trail",
"NEW: Database corruption recovery in bd doctor --fix - Auto-repair corrupted databases",
"NEW: JSONL integrity check in bd doctor - Detect and fix malformed JSONL",
"NEW: Git hygiene checks in bd doctor - Detect stale branches and sync issues",
"NEW: pre-commit config for local lint enforcement - Consistent code quality",
"NEW: Chaos testing flag for release script - --run-chaos-tests for thorough validation",
"CHANGED: Sync backoff and tips consolidation - Smarter daemon sync timing",
"CHANGED: Wisp/Ephemeral name finalized as 'wisp' - bd mol wisp is the canonical command",
"FIX: Comments display outside dependents block - Proper formatting",
"FIX: no-db mode storeActive initialization - JSONL-only mode works correctly",
"FIX: --resolution alias restored for bd close - Backwards compatibility",
"FIX: bd graph works with daemon running - Graph generation no longer conflicts",
"FIX: created_by field in RPC path - Daemon correctly propagates creator",
"FIX: Migration 028 idempotency - Migration handles partial/re-runs",
"FIX: Routed IDs bypass daemon in show command - Cross-rig show works correctly",
"FIX: Storage connections closed per iteration - Prevents resource leaks",
"FIX: Modern git init compatibility - Tests use --initial-branch=main",
"FIX: golangci-lint errors resolved - Clean lint on all platforms",
"IMPROVED: Test coverage - doctor, daemon, storage, RPC client paths covered",
},
},
{
Version: "0.37.0",
Date: "2025-12-26",
Changes: []string{
"BREAKING: Ephemeral API rename - Wisp→Ephemeral: JSON 'wisp'→'ephemeral', bd wisp→bd ephemeral",
"NEW: bd gate create/show/list/close/wait - Async coordination primitives for agent workflows",
"NEW: bd gate eval - Evaluate timer gates and GitHub gates (gh:run, gh:pr, mail)",
"NEW: bd gate approve - Human gate approval command",
"NEW: bd close --suggest-next - Show newly unblocked issues after close",
"NEW: bd ready/blocked --parent - Scope by epic or parent bead",
"NEW: TOML support for formulas - .formula.toml files alongside JSON",
"NEW: Fork repo auto-detection - Offer to configure .git/info/exclude",
"NEW: Control flow operators - loop and gate operators for formula composition",
"NEW: Aspect composition - Cross-cutting concerns via aspects field in formulas",
"NEW: Runtime expansion - on_complete and for-each dynamic step generation",
"NEW: bd formula list/show - Discover and inspect available formulas",
"NEW: bd mol stale - Detect complete-but-unclosed molecules",
"NEW: Stale molecules check in bd doctor - Proactive detection",
"NEW: Distinct ID prefixes - bd-proto-xxx, bd-mol-xxx, bd-wisp-xxx",
"NEW: no-git-ops config - bd config set no-git-ops true for manual git control",
"NEW: beads-release formula - 18-step molecular workflow for version releases",
"CHANGED: Formula format YAML→JSON - Formulas now use .formula.json extension",
"CHANGED: bd mol run removed - Orchestration moved to gt commands",
"CHANGED: Wisp architecture simplified - Single DB with Wisp=true flag",
"FIX: Gate await fields preserved during upsert - Multirepo sync fix",
"FIX: Tombstones retain closed_at timestamp - Preserves close time in soft deletes",
"FIX: Git detection caching - Eliminates worktree slowness",
"FIX: installed_plugins.json v2 format - bd doctor handles new Claude Code format",
"FIX: git.IsWorktree() hang on Windows - bd init no longer hangs outside git repos",
"FIX: Skill files deleted by bd sync - .claude/ files now preserved",
"FIX: doctor false positives - Skips interactions.jsonl and molecules.jsonl",
"FIX: bd sync commits non-.beads files - Now only commits .beads/ directory",
"FIX: Aspect self-matching recursion - Prevents infinite loops",
"FIX: Map expansion nested matching - Correctly matches child steps",
"FIX: Content-level merge for divergence - Better conflict resolution",
"FIX: Windows MCP graceful fallback - Daemon mode on Windows",
"FIX: Windows npm postinstall file locking - Install reliability",
},
},
{
Version: "0.36.0",
Date: "2025-12-24",
Changes: []string{
"NEW: Formula system - bd cook <formula> for declarative workflow templates",
"NEW: Gate issue type - bd gate create/open/close for async coordination",
"NEW: bd list --pretty --watch - Built-in colorized viewer with live updates",
"NEW: bd search --after/--before/--priority/--content - Enhanced search filters",
"NEW: bd compact --prune - Standalone tombstone pruning",
"NEW: bd export --priority - Exact priority filter for exports",
"NEW: --resolution alias for --reason on bd close",
"NEW: Config-based close hooks - Custom scripts on issue close",
"CHANGED: bd mol spawn removed - Use bd pour/bd wisp create only",
"CHANGED: bd ready excludes workflow types by default",
"FIX: Child→parent deps now blocked - Prevents LLM temporal reasoning trap",
"FIX: Dots in prefix handling - my.project prefixes work correctly",
"FIX: Child counter updates - Explicit child IDs update counters",
"FIX: Comment timestamps preserved during import",
"FIX: sync.remote config respected in daemon",
"FIX: Multi-hyphen prefixes - my-project-name works correctly",
"FIX: Stealth mode uses .git/info/exclude - Truly local",
"FIX: MCP output_schema=None for Claude Code",
"IMPROVED: Test coverage - daemon 72%, compact 82%, setup 54%",
},
},
{
Version: "0.35.0",
Date: "2025-12-23",
Changes: []string{
"NEW: bd activity command - Real-time state feed for molecule monitoring",
"NEW: Dynamic molecule bonding - bd mol bond --ref <id> attaches protos at runtime",
"NEW: waits-for dependency type - Fanout gates for parallel step coordination",
"NEW: Parallel step detection - Molecules auto-detect parallelizable steps",
"NEW: bd list --parent flag - Filter issues by parent",
"NEW: Molecule navigation - bd mol next/prev/current for step traversal",
"NEW: Entity tracking types - Creator and Validations fields for work attribution",
"IMPROVED: bd doctor --fix replaces manual commands",
"IMPROVED: bd dep tree shows external dependencies",
"IMPROVED: Performance indexes for large databases",
"FIX: Rich mutation events emitted for status changes",
"FIX: External deps filtered from GetBlockedIssues",
"FIX: bd create -f works with daemon mode",
"FIX: Parallel execution migration race conditions",
},
},
{
Version: "0.34.0",
Date: "2025-12-22",
Changes: []string{
"NEW: Wisp commands - bd wisp create/list/gc for ephemeral molecule management",
"NEW: Chemistry UX - bd pour, bd mol bond --wisp/--pour for phase control",
"NEW: Cross-project deps - external:<repo>:<id> syntax, bd ship command",
"BREAKING: bd repo add/remove now writes to .beads/config.yaml (not DB)",
"FIX: Wisps use Wisp=true flag in main database (not exported to JSONL)",
},
},
{
Version: "0.33.2",
Date: "2025-12-21",
Changes: []string{
"FIX: P0 priority preserved - omitempty removed from Priority field",
"FIX: nil pointer check in markdown parsing",
"CHORE: Remove dead deprecated wrapper functions from deletion_tracking.go",
},
},
{
Version: "0.33.1",
Date: "2025-12-21",
Changes: []string{
"BREAKING: Ephemeral → Wisp rename - JSON field changed from 'ephemeral' to 'wisp'",
"BREAKING: CLI flag changed from --ephemeral to --wisp (bd cleanup)",
"NOTE: SQLite column remains 'ephemeral' (no migration needed)",
},
},
{
Version: "0.33.0",
Date: "2025-12-21",
Changes: []string{
"NEW: Wisp molecules - use 'bd wisp create' for ephemeral wisps",
"NEW: Wisp issues live only in SQLite, never export to JSONL (prevents zombie resurrection)",
"NEW: Use 'bd pour' for persistent mols, 'bd wisp create' for ephemeral wisps",
"NEW: bd mol squash compresses wisp children into digest issue",
"NEW: --summary flag on bd mol squash for agent-provided AI summaries",
"FIX: DeleteIssue now cascades to comments table",
},
},
{
Version: "0.32.1",
Date: "2025-12-21",
Changes: []string{
"NEW: MCP output control params - brief, brief_deps, fields, max_description_length",
"NEW: MCP filtering params - labels, labels_any, query, unassigned, sort_policy",
"NEW: BriefIssue, BriefDep, OperationResult models for 97% context reduction",
"FIX: Pin field not in allowed update fields - bd update --pinned now works",
},
},
{
Version: "0.32.0",
Date: "2025-12-20",
Changes: []string{
"REMOVED: bd mail commands (send, inbox, read, ack, reply) - Mail is orchestration, not data plane",
"NOTE: Data model unchanged - type=message, Sender, Ephemeral, replies_to fields remain",
"NOTE: Orchestration tools should implement mail UI on top of beads data model",
"FIX: Symlink preservation in atomicWriteFile - bd setup no longer clobbers nix/home-manager configs",
"FIX: Broken link to LABELS.md in examples",
},
},
{
Version: "0.31.0",
Date: "2025-12-20",
Changes: []string{
"NEW: bd defer/bd undefer commands - Deferred status for icebox issues",
"NEW: Agent audit trail - .beads/interactions.jsonl with bd audit record/label",
"NEW: Directory-aware label scoping for monorepos - Auto-filter by directory.labels config",
"NEW: Molecules catalog - Templates in separate molecules.jsonl with hierarchical loading",
"NEW: Git commit config - git.author and git.no-gpg-sign options",
"NEW: create.require-description config option",
"CHANGED: bd stats merged into bd status - stats is now alias, colorized output",
"CHANGED: Thin hook shims - Hooks delegate to bd hooks run, no more version drift",
"CHANGED: MCP context tool consolidation - set_context/where_am_i/init merged into single context tool",
"FIX: relates-to excluded from cycle detection",
"FIX: Doctor checks .local_version instead of deprecated LastBdVersion",
"FIX: Read-only gitignore in stealth mode prints manual instructions",
},
},
{
Version: "0.30.7",
Date: "2025-12-19",
Changes: []string{
"FIX: bd graph no longer crashes with nil pointer on epics",
"FIX: Windows npm installer no longer fails with file lock error",
"NEW: Version Bump molecule template for repeatable release workflows",
},
},
{
Version: "0.30.6",
Date: "2025-12-18",
Changes: []string{
"bd graph command shows dependency counts using subgraph formatting",
"types.StatusPinned for persistent beads that survive cleanup",
"CRITICAL: Fixed dependency resurrection bug in 3-way merge - removals now win",
},
},
{
Version: "0.30.5",
Date: "2025-12-18",
Changes: []string{
"REMOVED: YAML simple template system - --from-template flag removed from bd create",
"REMOVED: Embedded templates (bug.yaml, epic.yaml, feature.yaml) - Use Beads templates instead",
"Templates are now purely Beads-based - Create epic with 'template' label, use bd template instantiate",
},
},
{
Version: "0.30.4",
Date: "2025-12-18",
Changes: []string{
"bd template instantiate - Create beads issues from Beads templates",
"--assignee flag for template instantiate - Auto-assign during instantiation",
"bd mail inbox --identity fix - Now properly filters by identity parameter",
"Orphan detection fixes - No longer warns about closed issues or tombstones",
"EXPERIMENTAL: Graph link fields (relates_to, replies_to, duplicate_of, superseded_by) and mail commands are subject to breaking changes",
},
},
{
Version: "0.30.3",
Date: "2025-12-17",
Changes: []string{
"SECURITY: Data loss race condition fixed - Removed unsafe ClearDirtyIssues() method",
"Stale database warning - Commands now warn when DB is out of sync with JSONL",
"Staleness check error handling improved - Proper warnings on check failures",
},
},
{
Version: "0.30.2",
Date: "2025-12-16",
Changes: []string{
"bd setup droid - Factory.ai (Droid) IDE support",
"Messaging schema fields - New 'message' issue type, sender/wisp/replies_to/relates_to/duplicate_of/superseded_by fields",
"New dependency types: replies-to, relates-to, duplicates, supersedes",
"Windows build fixes - gosec lint errors resolved",
"Issue ID prefix extraction fix - Word-like suffixes now parse correctly",
"Legacy deletions.jsonl code removed - Fully migrated to inline tombstones",
},
},
{
Version: "0.30.1",
Date: "2025-12-16",
Changes: []string{
"bd reset command - Complete beads removal from a repository",
"bd update --type flag - Change issue type after creation",
"bd q silent mode - Quick-capture without output for scripting",
"bd show displays dependent issue status - Shows status for blocked-by/blocking issues",
"claude.local.md support - Local-only documentation, gitignored by default",
"Auto-disable daemon in git worktrees - Prevents database conflicts",
"Inline tombstones for soft-delete - Deleted issues become tombstones in issues.jsonl",
"bd migrate-tombstones command - Converts legacy deletions.jsonl to inline tombstones",
"Enhanced Git Worktree Support - Shared .beads database across worktrees",
},
},
{
Version: "0.30.0",
Date: "2025-12-15",
Changes: []string{
"TOMBSTONE ARCHITECTURE - Deleted issues become inline tombstones in issues.jsonl",
"bd migrate-tombstones - Convert legacy deletions.jsonl to inline tombstones",
"bd doctor tombstone health checks - Detects orphaned/expired tombstones",
"Git Worktree Support - Shared database across worktrees, worktree-aware hooks",
"MCP Context Engineering - 80-90% context reduction for MCP responses",
"bd thanks command - List contributors to your project",
"BD_NO_INSTALL_HOOKS env var - Disable automatic git hook installation",
"Claude Code skill marketplace - Install beads skill via marketplace",
"Daemon delete auto-sync - Delete operations trigger auto-sync",
"close_reason persistence - Close reasons now saved to database on close",
"JSONL-only mode improvements - GetReadyWork/GetBlockedIssues for memory storage",
"Lock file improvements - Fast fail on stale locks, 98% test coverage",
},
},
{
Version: "0.29.0",
Date: "2025-12-03",
Changes: []string{
"--estimate flag for bd create/update - Add time estimates to issues in minutes",
"bd doctor improvements - SQLite integrity check, config validation, stale sync branch detection",
"bd doctor --output flag - Export diagnostics to file for sharing/debugging",
"bd doctor --dry-run flag - Preview fixes without applying them",
"bd doctor per-fix confirmation mode - Approve each fix individually",
"--readonly flag - Read-only mode for worker sandboxes",
"bd sync safety improvements - Auto-push after merge, diverged history handling",
"Auto-resolve merge conflicts deterministically - All field conflicts resolved without prompts",
"3-char all-letter base36 hash support - Fixes prefix extraction edge case",
},
},
{
Version: "0.28.0",
Date: "2025-12-01",
Changes: []string{
"bd daemon --local flag - Run daemon without git operations for multi-repo/worktree setups",
"bd daemon --foreground flag - Run in foreground for systemd/supervisord integration",
"bd migrate-sync command - Migrate to sync.branch workflow for cleaner main branch",
"Database migration: close_reason column - Fixes sync loops with close_reason",
"Multi-repo prefix filtering - Issues filtered by prefix when flushing from non-primary repos",
"Parent-child dependency UX - Fixed documentation and UI labels for dependencies",
"sync.branch workflow fixes - Fixed .beads/ restoration and doctor detection",
"Jira API migration - Updated from deprecated v2 to v3 API",
},
},
{
Version: "0.27.2",
Date: "2025-11-30",
Changes: []string{
"CRITICAL: Mass database deletion protection - Safety guard prevents purging entire DB on JSONL reset",
"Fresh Clone Initialization - bd init auto-detects prefix from existing JSONL, works without --prefix flag",
"3-Character Hash Support - ExtractIssuePrefix now handles base36 hashes 3+ chars",
"Import Warnings - New warning when issues skipped due to deletions manifest",
},
},
{
Version: "0.27.0",
Date: "2025-11-29",
Changes: []string{
"Git hooks now sync.branch aware - pre-commit/pre-push skip .beads checks when sync.branch configured",
"Custom Status States - Define project-specific statuses via config (testing, blocked, review)",
"Contributor Fork Workflows - `bd init --contributor` auto-configures sync.remote=upstream",
"Git Worktree Support - Full support for worktrees in hooks and detection",
"CRITICAL: Sync corruption prevention - Hash-based staleness + reverse ZFC checks",
"Out-of-Order Dependencies - JSONL import handles deps before targets exist",
"--from-main defaults to noGitHistory=true - Prevents spurious deletions",
"bd sync --squash - Batch multiple sync commits into one",
"Fresh Clone Detection - bd doctor suggests 'bd init' when JSONL exists but no DB",
},
},
{
Version: "0.26.0",
Date: "2025-11-27",
Changes: []string{
"bd doctor --check-health - Lightweight health checks for startup hooks (exit 0 on success)",
"--no-git-history flag - Prevent spurious deletions when git history is unreliable",
"gh2jsonl --id-mode hash - Hash-based ID generation for GitHub imports",
"MCP Protocol Fix - Subprocess stdin no longer breaks MCP JSON-RPC",
"Git Worktree Staleness Fix - Staleness check works after writes in worktrees",
"Multi-Part Prefix Support - Handles prefixes like 'my-app-123' correctly",
"bd sync Commit Scope Fixed - Only commits .beads/ files, not other staged files",
},
},
{
Version: "0.25.1",
Date: "2025-11-25",
Changes: []string{
"Zombie Resurrection Prevention - Stale clones can no longer resurrect deleted issues",
"bd sync commit scope fixed - Now commits entire .beads/ directory before pull",
"bd prime ephemeral branch detection - Auto-detects ephemeral branches and adjusts workflow",
"JSONL Canonicalization - Default JSONL filename is now issues.jsonl; legacy beads.jsonl still supported",
},
},
{
Version: "0.25.0",
Date: "2025-11-25",
Changes: []string{
"Deletion Propagation - Deletions now sync across clones via deletions manifest",
"Stealth Mode - `bd init --stealth` for invisible beads usage",
"Ephemeral Branch Sync - `bd sync --from-main` to sync from main without pushing",
},
},
{
Version: "0.24.4",
Date: "2025-11-25",
Changes: []string{
"Transaction API - Full transactional support for atomic multi-operation workflows",
"Tip System Infrastructure - Smart contextual hints for users",
"Sorting for bd list/search - New `--sort` and `--reverse` flags",
"Claude Integration Verification - New bd doctor checks",
"ARM Linux Support - GoReleaser now builds for linux/arm64",
"Orphan Detection Migration - Identifies orphaned child issues",
},
},
{
Version: "0.24.3",
Date: "2025-11-24",
Changes: []string{
"BD_GUIDE.md Generation - Version-stamped documentation for AI agents",
"Configurable Export Error Policies - Flexible error handling for export operations",
"Command Set Standardization - Global verbosity, dry-run, and label flags",
"Auto-Migration on Version Bump - Automatic database schema updates",
"Monitor Web UI Enhancements - Interactive stats cards, multi-select priority",
},
},
{
Version: "0.24.1",
Date: "2025-11-22",
Changes: []string{
"bd search filters - Date and priority filters added",
"bd count - New command for counting and grouping issues",
"Test Infrastructure - Automatic skip list for tests",
},
},
{
Version: "0.24.0",
Date: "2025-11-20",
Changes: []string{
"bd doctor --fix - Automatic repair functionality",
"bd clean - Remove temporary merge artifacts",
".beads/README.md Generation - Auto-generated during bd init",
"blocked_issues_cache Table - Performance optimization for GetReadyWork",
"Commit Hash in Version Output - Enhanced version reporting",
},
},
{
Version: "0.23.0",
Date: "2025-11-08",
Changes: []string{
"Agent Mail integration - Python adapter library with 98.5% reduction in git traffic",
"`bd info --whats-new` - Quick upgrade summaries for agents (shows last 3 versions)",
"`bd hooks install` - Embedded git hooks command (replaces external script)",
"`bd cleanup` - Bulk deletion for agent-driven compaction",
"`bd new` alias added - Agents often tried this instead of `bd create`",
"`bd list` now one-line-per-issue by default - Prevents agent miscounting (use --long for old format)",
"3-way JSONL merge auto-invoked on conflicts - No manual intervention needed",
"Daemon crash recovery - Panic handler with socket cleanup prevents orphaned processes",
"Auto-import when database missing - `bd import` now auto-initializes",
"Stale database export prevention - ID-based staleness detection",
},
},
}
// showWhatsNew displays agent-relevant changes from recent versions
func showWhatsNew() {
currentVersion := Version // from version.go
if jsonOutput {
outputJSON(map[string]interface{}{
"current_version": currentVersion,
"recent_changes": versionChanges,
})
return
}
// Human-readable output
fmt.Printf("\n🆕 What's New in bd (Current: v%s)\n", currentVersion)
fmt.Println("=" + strings.Repeat("=", 60))
fmt.Println()
for _, vc := range versionChanges {
// Highlight if this is the current version
versionMarker := ""
if vc.Version == currentVersion {
versionMarker = " ← current"
}
fmt.Printf("## v%s (%s)%s\n\n", vc.Version, vc.Date, versionMarker)
for _, change := range vc.Changes {
fmt.Printf(" • %s\n", change)
}
fmt.Println()
}
fmt.Println("💡 Tip: Use `bd info --whats-new --json` for machine-readable output")
fmt.Println()
}
func init() {
infoCmd.Flags().Bool("schema", false, "Include schema information in output")
infoCmd.Flags().Bool("whats-new", false, "Show agent-relevant changes from recent versions")
infoCmd.Flags().Bool("thanks", false, "Show thank you page for contributors")
infoCmd.Flags().BoolVar(&jsonOutput, "json", false, "Output in JSON format")
rootCmd.AddCommand(infoCmd)
}