Commit Graph

1441 Commits

Author SHA1 Message Date
gastown/crew/gus
a9e70e3fe5 fix: Add cross-rig routing support to bd close
The close command now properly routes to different beads directories
based on issue ID prefix, matching the behavior of bd show/update.

Changes:
- Check needsRouting() for each ID in both daemon and direct mode
- Handle routed IDs via resolveAndGetIssueWithRouting()
- Close issues in the correct remote store

Fixes bd-3jrb

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 11:26:18 -08:00
beads/crew/wolf
33cf09ba3b feat: add --pretty flag to bd ready (bd-vjas)
Adds --pretty flag to bd ready for consistency with bd list.
Uses the same displayPrettyList() function to show issues in
a tree format with status/priority symbols.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 11:17:31 -08:00
gastown/polecats/nux
628ab911a0 fix: bd update supports cross-rig bead updates via prefix routing (gt-wq1wb)
The bd update command now checks needsRouting() before attempting daemon
RPC resolution. When an issue ID (like hq-eggh5) routes to a different
beads directory, the update bypasses the daemon and uses direct mode with
the routed storage.

This enables polecats in gastown to update HQ beads (hq-* prefix) and
vice versa. The fix mirrors the routing pattern already used by bd show.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 11:14:20 -08:00
beads/crew/emma
363c5a3819 fix: bd sync fails with exit 128 in bare repo worktrees (GH#827)
Two fixes for bare repo worktree setups:

1. fork_protection.go: Use git.GetGitDir() instead of hardcoding .git
   In worktrees, .git is a file containing gitdir path, not a directory.
   Using GetGitDir() handles this correctly.

2. sync_git.go: Simplify gitHasBeadsChanges to use absolute paths
   The previous code used git -C main-repo-root status, but in bare
   repo worktrees GetMainRepoRoot() returns the parent of the bare repo
   which is not a valid working tree. Using absolute paths without -C
   lets git find the repo from cwd, which always works.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 11:05:05 -08:00
beads/crew/emma
edc0fea02f fix: restore last-touched to gitignore template (GH#838)
The last-touched file was accidentally removed from GitignoreTemplate
in commit 310d374 (GH#814 fix). This restores it and adds it to
requiredPatterns so bd doctor will detect outdated gitignores.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 10:58:16 -08:00
cbarber
7a9db35c79 Fix shebang env (#817)
* fix: use /usr/bin/env to PATH search sh (nixos compatiblity)

* fix: reconcile repo hooks with template /usr/bin/env change
2026-01-01 10:54:22 -08:00
beads/crew/emma
829c8d1caf feat: add --notes flag to bd create command (GH#830)
Add --notes flag to bd create command, enabling agents to set notes
during issue creation instead of requiring a separate update command.

Motivation: AI agents repeatedly tried to use --notes with bd create.
Context is fresh at creation time - forcing a two-step process means
context loss or workflow interruption.

Changes:
- cmd/bd/flags.go: Added --notes flag to common issue flags
- cmd/bd/create.go: Read and pass notes in both RPC and direct modes
- cmd/bd/update.go: Removed duplicate --notes flag definition
- internal/rpc/protocol.go: Added Notes field to CreateArgs
- internal/rpc/server_issues_epics.go: Process Notes in handleCreate
- cmd/bd/create_notes_test.go: Comprehensive test coverage
- website/docs/cli-reference/issues.md: Documentation

Also adds gitignore entries for Augment AI and .beads/redirect.

Co-authored-by: Leon Letto <lettol@vmware.com>
2026-01-01 10:53:59 -08:00
Jordan Hubbard
aa2ea48bf2 feat: add FreeBSD release builds (#832)
* feat: add FreeBSD release builds

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* chore: allow manual release dispatch

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: stabilize release workflow on fork

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: clean zig download artifact

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: use valid zig target for freebsd arm

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: disable freebsd arm release build

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: switch freebsd build to pure go

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: skip release publishing on forks

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: satisfy golangci-lint for release PR

---------

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-01-01 10:51:51 -08:00
Peter Chanthamynavong
f3f713d77a fix(fork-protection): only apply protection to actual beads forks (#823) (#828)
The fork protection logic incorrectly treated all repos where
origin != steveyegge/beads as forks, including user's own projects
that just use beads as a tool.

Changes:
- Add isForkOfBeads() that scans ALL remotes for steveyegge/beads
- Only apply protection when a beads-related remote exists
- Add git config opt-out: `git config beads.fork-protection false`
  (per-clone, never tracked, matches beads.role pattern)

Test coverage for 8 scenarios plus edge cases for config values.
2026-01-01 10:51:22 -08:00
beads/crew/dave
00d0eb0192 fix: add gosec annotations to doctor/gitignore.go (GH#832)
Adds #nosec G204 annotations to exec.Command calls that use
hardcoded paths. Fixes pre-existing lint failure exposed by PR #832.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2026-01-01 10:49:47 -08:00
Peter Chanthamynavong
9801102aa2 fix(daemon): Use syncbranch.IsConfigured() for autoPull (#837)
* test(daemon): Prove autoPull reads sync.branch from SQLite

- Verify daemon reads sync.branch from SQLite config source
- Show config.yaml sync-branch is ignored (YAML-only key)
- Add skipped tracer bullet test for issue #831

Coverage: daemon autoPull config resolution

* fix(daemon): Use syncbranch.IsConfigured() for autoPull

Problem:
- Daemon's periodic sync never activated when sync-branch configured in config.yaml
- autoPull check only read sync.branch from SQLite, missing YAML-only configuration

Solution:
- Replace SQLite-only check with syncbranch.IsConfigured()
- Update test to validate correct detection of YAML-configured sync branch

Impact:
- Periodic sync now activates correctly when sync-branch is configured in config.yaml
- Fixes daemon hanging issue for users with YAML-only configuration
2026-01-01 10:48:14 -08:00
Gero Hillebrandt
a1f706d17a fix: prevent nil context panic in multi-repo hydration (#840) 2026-01-01 10:46:56 -08:00
beads/crew/fang
5e8a834b38 fix: bd sync now follows .beads/redirect for worktree path (bd-e2q9, bd-kvus)
When .beads/redirect exists, bd sync was using GetRepoRoot(cwd) to find
the git worktree location. This failed because the worktree should be
in the same repo as the beads directory, not the current working directory.

Fix: Use getRepoRootFromPath(beadsDir) to derive the repo root from
the actual beads location after following the redirect.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:32:17 -08:00
beads/crew/dave
b362b36824 feat: add session_id field to issue close/update mutations (bd-tksk)
Adds closed_by_session tracking for entity CV building per Gas Town
decision 009-session-events-architecture.md.

Changes:
- Add ClosedBySession field to Issue struct
- Add closed_by_session column to issues table (migration 034)
- Add --session flag to bd close command
- Support CLAUDE_SESSION_ID env var as fallback
- Add --session flag to bd update for status=closed
- Display closed_by_session in bd show output
- Update Storage interface to include session parameter in CloseIssue

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2025-12-31 13:14:15 -08:00
beads/crew/fang
7c9b975436 feat: add display guards for large molecules in bd mol current (bd-vln0)
For molecules with >100 steps, shows summary instead of full step list:
- Counts children first using efficient GetMoleculeProgress query
- Shows progress summary with pointer to bd mol progress
- Add --limit flag to cap output (e.g., --limit 50)
- Add --range flag for specific ranges (e.g., --range 1-50)

Also closes epic bd-5nu1 (mega-molecule progress support).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:08:41 -08:00
beads/crew/fang
f3224278a8 fix: use lightweight molecule discovery in bd mol progress
Replace findInProgressMolecules (which loads full subgraphs) with
findInProgressMoleculeIDs (which only returns IDs). This ensures
auto-discovery is efficient for mega-molecules.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:04:19 -08:00
beads/crew/emma
21de43538d fix: eliminate 5+ second delays from stale daemon.lock files (bd-htwx)
Root cause: When a bd daemon crashes, its daemon.lock file remains with
the old PID. If that PID gets reused by an unrelated process, the code
would wait 5 seconds for a socket that will never appear.

Fix: Use flock-based check as authoritative source for daemon liveness.
The OS releases flocks when a process dies, so this is immune to PID reuse.

Changes:
- handleExistingSocket: Check daemon flock before waiting for socket
- acquireStartLock: Verify daemon lock is held before waiting
- handleStaleLock: Use flock check to detect stale startlocks
- lockfile/process_*.go: Add pid <= 0 check to prevent false positives
  (PID 0 signals process group on Unix, not a specific process)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:03:49 -08:00
beads/crew/grip
e2121a2e07 fix(refile): address code review feedback
- Warn if source issue is already closed
- Copy all issue fields (SourceRepo, Ephemeral, MolType, RoleType, Rig)
- Log warnings on label copy failures instead of silently ignoring
- Schedule auto-flush when source is local store
- Remove stale comment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:01:20 -08:00
beads/crew/wolf
54d15252fa Add BEADS_NO_AUTO_STAGE opt-out for pre-commit auto-staging (GH#826)
Users with conflicting git hooks (e.g., hooks that read the staging
area like GGA) can now set BEADS_NO_AUTO_STAGE=1 to disable auto-staging
and get check-and-block behavior instead.

Default behavior unchanged - auto-staging still works for most users.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:58:54 -08:00
beads/crew/fang
0a96b10bba feat: add bd mol progress command for efficient molecule monitoring (bd-8xnf)
Adds a new `bd mol progress` command that shows molecule progress using
indexed queries instead of loading all steps into memory. This makes it
suitable for mega-molecules with millions of steps.

Features:
- Efficient SQL-based counting via idx_dependencies_depends_on_type index
- Progress display: completed / total (percentage)
- Current step identification
- Rate calculation from closure timestamps
- ETA estimation
- JSON output support

New storage interface method: GetMoleculeProgress(ctx, moleculeID)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:35:41 -08:00
beads/crew/grip
3593ba8d66 feat: add bd refile command to move issues between rigs (bd-1eak)
Implements `bd refile <source-id> <target-rig>` which:
- Gets source issue via routing
- Creates new issue in target rig with same content
- Closes source with "Refiled to <new-id>"
- Appends "(Refiled from <old-id>)" to description

Target rig accepts rig names (beads), prefixes (bd-), or prefix shorthand (bd).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:34:18 -08:00
beads/crew/emma
3108000f72 fix: add text reference updates to deleteBatchFallback
Code review found that deleteBatchFallback was missing the text
reference update step (replacing "issue-id" with "[deleted:issue-id]"
in connected issues). This aligns the fallback path with the SQLite
batch delete behavior.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:24:17 -08:00
beads/crew/emma
b161e22144 fix: support delete in --no-db mode (GH#822)
Add CreateTombstone() to MemoryStorage and deleteBatchFallback() to
handle deletion when SQLite is not available. This fixes the error
"tombstone operation not supported by this storage backend" when
using bd delete with --no-db flag.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 11:45:52 -08:00
beads/crew/fang
ee51298fd5 feat: add Obsidian Tasks markdown export format (GH#819)
Merge PR #819 from justbry with improvements:
- Add --format obsidian option to bd export
- Generate Obsidian Tasks-compatible markdown
- Default output to ai_docs/changes-log.md
- Map status to checkboxes, priority to emoji, type to tags
- Support parent-child hierarchy with indentation
- Use official Obsidian Tasks format (🆔,  emojis)

Improvement over PR: replaced O(n²) bubble sort with slices.SortFunc
for date ordering.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: justbry <justbu42@proton.me>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 11:39:17 -08:00
beads/crew/emma
ee34a74e90 feat: implement Step.Condition evaluation in bd cook (bd-7zka.1)
Add compile-time step filtering based on formula variables:
- New EvaluateStepCondition function for {{var}} truthy and equality checks
- FilterStepsByCondition to exclude steps based on conditions
- Integration into pour, wisp, and mol bond commands
- Supports: {{var}}, {{var}} == value, {{var}} != value

Steps with conditions that evaluate to false are excluded from the
cooked formula, along with their children.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 00:33:11 -08:00
beads/crew/dave
82611834df feat: add version sync check to bd preflight --check (bd-lfak.5)
- Implement runVersionSyncCheck() to compare version.go and default.nix
- Reports version mismatch as hard failure
- Gracefully skips if default.nix is missing
- Fix version mismatch: update default.nix from 0.37.0 to 0.42.0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2025-12-31 00:08:40 -08:00
beads/crew/dave
6298359b60 feat: add nix-hash staleness detection to bd preflight --check (bd-lfak.4)
- Add Warning field to CheckResult for soft failures
- Implement runNixHashCheck() that detects go.sum changes
- Warnings (⚠) shown separately from failures (✗)
- Warnings don't fail the overall preflight result
- Summary shows warning count separately
- Add test for warning state

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2025-12-31 00:05:53 -08:00
beads/crew/dave
1b432ad9b6 feat: add lint check to bd preflight --check (bd-lfak.3)
- Add Skipped field to CheckResult for graceful handling of missing tools
- Implement runLintCheck() that runs golangci-lint run ./...
- Skip lint check gracefully if golangci-lint not in PATH
- Update summary to show skipped count separately
- Add test for skipped state

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2025-12-31 00:02:59 -08:00
beads/crew/dave
64c65974f0 fix: align preflight tests with implementation (bd-lfak.2)
Fix test file to match the actual preflight.go implementation:
- Remove capitalizeFirst test (function doesn't exist)
- Rename PreflightResults -> PreflightResult
- Update truncation test to use actual truncateOutput function
- Update test data to match current Name format

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2025-12-30 23:32:57 -08:00
beads/polecats/basalt
8dcfdda186 feat: implement bd preflight --check flag with test runner (bd-lfak.2)
- Add CheckResult and PreflightResults structs for check outcomes
- Implement runTestCheck() to execute go test -short ./...
- Wire up --check flag to actually run tests instead of placeholder
- Add ✓/✗ output formatting with command and truncated output
- Support --json flag for programmatic consumption
- Exit with non-zero code when tests fail
- Add tests for new preflight functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 22:22:15 -08:00
beads/polecats/jade
44853d1690 fix: bd cook now looks up formula names from registry (bd-hp8g)
bd cook previously treated its argument as a file path only. Now it first
tries to load by name from the formula registry (.beads/formulas/), and
only falls back to parsing as a file path if that fails.

This enables commands like `bd cook beads-release` to work without
specifying the full path to the formula file.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 22:08:06 -08:00
beads/crew/emma
4c063d9783 chore: bump version to 0.42.0 2025-12-30 21:21:46 -08:00
beads/crew/emma
9800302033 docs: add v0.42.0 changelog and whats-new entries 2025-12-30 21:21:46 -08:00
Steve Yegge
23dccff03a fix: bypass external direct-commit when sync.branch is configured (bd-n663)
When .beads/redirect points to another location that crosses directory
boundaries, isExternalBeadsDir() can return true even when both paths
are in the same git repo. Previously, this would trigger the direct
commit mode, bypassing the configured sync.branch workflow.

Now we check hasSyncBranchConfig before entering the external path.
When sync.branch is configured, we skip direct-commit mode and use
the sync.branch worktree workflow instead, which properly handles
copying JSONL files regardless of where the source .beads lives.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 21:05:27 -08:00
beads/crew/fang
f77b290d43 fix: git hook chaining now works correctly (GH#816)
Two fixes:
1. `bd init` chaining was broken - the code referenced `.old` hooks but
   never actually renamed the existing hooks. Added the missing os.Rename().

2. `bd hooks install` now supports --chain flag to chain with existing hooks
   (e.g., pre-commit framework). When used, existing hooks are renamed to
   .old and bd hooks run will call them before the bd logic.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 20:40:09 -08:00
Steve Yegge
310d374264 fix: prevent .beads/redirect from being committed (GH#814)
- Add redirect to GitignoreTemplate with explanatory comment
- Add redirect to requiredPatterns for outdated gitignore detection
- Add CheckRedirectNotTracked() to detect already-tracked redirect files
- Add FixRedirectTracking() to untrack via git rm --cached
- Register check in bd doctor under Git Integration category
- Add 6 tests for the new functionality

The redirect file contains a relative path that only works in the
original worktree. When committed, it causes warnings in other clones:
"Warning: redirect target does not exist"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:29:03 -08:00
Steve Yegge
2e55f2838a fix: show "No changes to commit" when sync-branch worktree has no changes
Follow-up to #812 fix. When useSyncBranch is true, we always call
CommitToSyncBranch (bypassing gitHasBeadsChanges). If the worktree
has no actual changes, we now show "→ No changes to commit" for
consistent UX with the non-sync-branch code path.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:20:33 -08:00
Steve Yegge
202a617bb5 test: add coverage for GH#807 sync.branch main/master rejection
- Add TestSet cases for main/master rejection in syncbranch_test.go
- Add TestInitWithSyncBranch to verify --branch flag works
- Add TestInitWithoutBranchFlag to verify no auto-detection (root cause)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:19:53 -08:00
Steve Yegge
9158c23ec8 Add bd preflight command with static checklist (Phase 1)
Scaffolds bd preflight for PR readiness checks. Currently prints a
static checklist of common pre-PR validation items:
- Tests pass
- Lint passes
- No beads pollution
- Nix hash current
- Version sync

--check and --fix flags are documented but not yet implemented
(see bd-lfak.2 through bd-lfak.5 for roadmap).

(bd-lfak.1)

Cherry-picked from polecat/amber-1767146829144

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:13:57 -08:00
Steve Yegge
8f4af0a242 Fix bd sync failing to copy local changes to beads-sync worktree (GH#810)
The root cause was isExternalBeadsDir() incorrectly identifying bare repo
worktrees as "external" repos. This caused bd sync to take the "external
beads dir" code path instead of the worktree-based sync branch path.

The bug: isExternalBeadsDir() compared syncbranch.GetRepoRoot() (which returns
incorrect values for bare repo worktrees) with getRepoRootFromPath() (which
uses --show-toplevel). These returned different values for bare repo
worktrees, causing local worktrees to be treated as external.

The fix: Use git rev-parse --git-common-dir for comparison instead of repo
root. This correctly identifies that worktrees of the same repo share the
same git directory, regardless of bare repo setup.

Also added:
- getGitCommonDir() helper function
- Tests for both getGitCommonDir and isExternalBeadsDir

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:11:08 -08:00
Steve Yegge
9cc385debc feat: Add --claim flag to bd update for work queue semantics (gt-il2p7)
Adds atomic claim operation for work queue messages:

- New --claim flag on bd update command
- Sets assignee to claimer and status to in_progress
- Fails with clear error if already claimed by someone else
- Works in both daemon and direct modes
- Includes comprehensive tests for claim functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:09:34 -08:00
Steve Yegge
cf4aff1cb4 fix: bypass gitHasBeadsChanges when using sync-branch (#812)
When using sync-branch with aggressive gitignore on code branches
(.beads/* ignored), gitHasBeadsChanges() returns false because git
does not track the files. This caused bd sync to skip CommitToSyncBranch
entirely, even though CommitToSyncBranch has its own internal change
detection that checks the worktree where gitignore is different.

The fix bypasses gitHasBeadsChanges when useSyncBranch is true, letting
CommitToSyncBranch determine if there are actual changes in the worktree.

Closes #812

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:04:26 -08:00
Steve Yegge
38a6097512 fix(doctor): wire up CheckRedirectNotTracked and FixRedirectTracking
Completes the work from #813 by actually calling the new functions:
- Add Check 14b in doctor.go for redirect file tracking detection
- Add Redirect Not Tracked case in doctor_fix.go switch statement

Without this wiring, bd doctor would not detect or fix already-tracked
redirect files, only prevent new ones via the updated .gitignore template.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
2025-12-30 18:01:58 -08:00
Peter Chanthamynavong
c98f5827bf fix(doctor): add redirect to .gitignore template for worktree support (#813)
When bd worktree creates a worktree, it writes a .beads/redirect file
pointing back to the main repo's .beads/. If this file is accidentally
committed (e.g., via git add .), it causes "redirect target does not exist"
warnings when cloned or used in other worktrees.

Changes:
- Add 'redirect' to GitignoreTemplate to prevent future accidental commits
- Add 'redirect' to requiredPatterns so bd doctor detects outdated .gitignore
- Add CheckRedirectNotTracked() to detect already-tracked redirect files
- Add FixRedirectTracking() to untrack accidentally committed redirects

Tests: 8 new tests covering template, detection, and fix scenarios
2025-12-30 18:00:50 -08:00
Steve Yegge
aff38708e0 fix: bd doctor false positive for molecule/wisp prefix variants
The prefix mismatch check in bd doctor was reporting warnings when
issues were created via molecule workflows (bd mol pour), which
intentionally use a different prefix pattern (<base>-mol instead
of just <base>).

Added recognition of valid workflow prefix variants:
- <prefix>-mol (molecules from bd mol pour)
- <prefix>-wisp (ephemeral wisps)
- <prefix>-eph (ephemeral issues)

These are intentional prefix extensions for visual distinction, not
actual mismatches. The check now only warns for truly mismatched
prefixes (e.g., different project entirely).

Added comprehensive regression tests for all prefix variant cases.

Fixes #811

Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:43:47 -08:00
Steve Yegge
4ab85eeb9d Add unit tests to improve cmd/bd CLI coverage (bd-llfl)
Added 479 lines of new tests:

- utils_unit_test.go: Tests for utility functions (truncateString,
  pluralize, formatTimeAgo, containsLabel, extractIDSuffix, truncate,
  truncateDescription, showCleanupDeprecationHint, clearAutoFlushState)

- hooks_test.go: Tests for FormatHookWarnings, isRebaseInProgress,
  hasBeadsJSONL

- list_test.go: Tests for formatIssueLong, formatIssueCompact

- version_tracking_test.go: Fixed flaky tests by setting BEADS_DIR
  env var to prevent git worktree detection from finding the actual
  .beads directory instead of the temp directory

Coverage increased from 21.6% to 22.0%. The remaining 78% of untested
code involves daemon/RPC operations, command handlers requiring
database/daemon setup, and git operations that would require
integration tests with mocked dependencies.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:14:55 -08:00
Steve Yegge
def4cf4efa Add sync branch integrity guards for force-push detection (bd-hlsw.4)
This implements sync branch integrity guards that detect when the remote
sync branch has been force-pushed since the last sync, preventing silent
data corruption.

Changes:
- Add internal/syncbranch/integrity.go with:
  - CheckForcePush() - detects force-push via stored remote SHA comparison
  - UpdateStoredRemoteSHA() - stores current remote SHA after successful sync
  - ClearStoredRemoteSHA() - clears stored SHA when resetting
  - GetStoredRemoteSHA() - retrieves stored SHA for inspection

- Update cmd/bd/sync.go to:
  - Add --accept-rebase flag for non-interactive reset to remote
  - Add force-push detection before sync branch pull operations
  - Prompt user for confirmation when force-push detected
  - Update stored remote SHA after successful sync

The implementation:
1. Tracks the remote sync branch commit SHA in config after each sync
2. On subsequent syncs, checks if stored SHA is ancestor of current remote
3. If not (force-push detected), warns user with details and prompts
4. User can accept reset or abort to investigate manually
5. --accept-rebase flag allows scripted/non-interactive recovery

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:07:25 -08:00
Steve Yegge
da550f0e1b Add close_reason to JSONL format documentation and tests (bd-lxzx)
- Add comprehensive JSONL Issue Schema section to docs/ARCHITECTURE.md
  documenting all exported fields including close_reason
- Add TestCloseReasonRoundTrip test in export_import_test.go to verify
  close_reason is preserved through JSONL export/import cycle

Closes: bd-lxzx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:05:48 -08:00
Steve Yegge
a34f189153 Add 'last touched' issue tracking for update/close without ID
When no issue ID is provided to `bd update` or `bd close`, use the last
touched issue from the most recent create, update, show, or close operation.

This addresses the common workflow where you create an issue and then
immediately want to add more details (like changing priority from P2 to P4)
without re-typing the issue ID.

Implementation:
- New file last_touched.go with Get/Set/Clear functions
- Store last touched ID in .beads/last-touched (gitignored)
- Track on create, update, show, and close operations
- Allow update/close with zero args to use last touched

(bd-s2t)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 16:58:10 -08:00
Steve Yegge
8eccc3d4f1 Add debug logging for YAML parse errors in autoimport (bd-mql4)
When config.yaml has malformed YAML, getLocalSyncBranch and
isNoDbModeConfigured were silently returning empty/false with no
feedback, making debugging difficult. Now they log a warning via
debug.Logf when YAML parsing fails.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 16:51:14 -08:00