Commit Graph

787 Commits

Author SHA1 Message Date
Steve Yegge
b4e489f2de bd sync: 2025-11-23 14:14:18 2025-11-23 14:14:18 -08:00
Steve Yegge
49e8ac315b bd sync: 2025-11-23 14:14:00 2025-11-23 14:14:00 -08:00
Steve Yegge
5b77ddb215 Fix TestAddCommentUpdatesTimestamp timing flake on Windows
The test was failing on Windows CI because of insufficient time resolution
between creating an issue and adding a comment. Both operations could
complete within the same time unit, causing identical timestamps.

Added a 2ms sleep between operations to ensure updated_at is strictly
after the original timestamp, even on systems with lower time resolution.

Fixes: bd-pi7u

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 10:57:29 -08:00
matt wilkie
c50695b3d4 Monitor Web UI fixes and updates
Fixes status filter bug, adds multi-select priority filter, find-as-you-type search, and interactive stats cards. Includes visual improvements for hover effects and alignment.

Co-authored-by: maphew <matt.wilkie@yukon.ca>
2025-11-23 10:32:22 -08:00
Steve Yegge
12f839369c bd sync: 2025-11-22 18:34:53 2025-11-22 18:34:53 -08:00
Steve Yegge
0dc8452c56 feat: Respect BEADS_SYNC_BRANCH environment variable
Fixes daemon and bd sync to honor BEADS_SYNC_BRANCH environment variable
as documented in PROTECTED_BRANCHES.md for CI/CD temporary overrides.

Changes:
- Updated internal/syncbranch.Get() to prioritize env var over DB config
- Both daemon sync and bd sync CLI now use syncbranch.Get()
- Added comprehensive tests for env var override behavior
- Validates branch names using git-style rules

This enables CI/CD workflows to override sync branch per-job without
mutating database config.

Based on PR #364 by Charles P. Cross <cpdata@users.noreply.github.com>
Co-authored-by: Charles P. Cross <cpdata@users.noreply.github.com>
2025-11-22 18:17:19 -08:00
Steve Yegge
72aa0d1097 bd sync: 2025-11-22 17:48:56 2025-11-22 17:48:57 -08:00
Steve Yegge
3effab3714 bd sync: 2025-11-22 16:49:53 2025-11-22 16:49:53 -08:00
Steve Yegge
599c40c703 Fix Windows and Nix test failures
Windows test fixes (bd-web8):
- Add sanitizeMetadataKey() to replace colons with underscores
- Windows absolute paths (e.g., C:\...) contain colons that conflict with
  metadata key separator ':'
- Update tests to use sanitized keys when checking metadata
- Tests now pass on Windows by auto-sanitizing path-based keys

Nix flake fixes (bd-8y1a):
- Update vendorHash in default.nix to match current Go module dependencies
- Hash mismatch was causing Nix build failures in CI

Test improvements:
- Rename TestUpdateExportMetadataInvalidKeySuffix to reflect new behavior
- Test now verifies sanitization instead of rejection
- All tests pass locally

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 10:59:40 -08:00
Steve Yegge
b409870ce5 Fix linter issues and test failures
- Fix spelling: cancelled → canceled, cancelling → canceling
- Remove unused error return from performFlush() function
- Check cmd.Help() error return in search.go
- Fix file permissions in gitignore.go (0644 → 0600)
- Update tests to match performFlush signature change
- Remove unused os import from flush_manager.go
2025-11-22 00:11:45 -08:00
Steve Yegge
09e094ab52 bd sync: 2025-11-22 00:02:18 2025-11-22 00:02:18 -08:00
Steve Yegge
84097185f1 bd sync: 2025-11-21 23:58:45 2025-11-21 23:58:45 -08:00
Steve Yegge
87ee3a674e Improve bd doctor JSONL checks to focus on real problems
Previously bd doctor warned about using beads.jsonl vs issues.jsonl, but
users should be free to configure any name they want. The real problems are:
1. Having multiple JSONL files (sync/merge conflicts)
2. Configuration not matching reality

Changes:
- Rewrote CheckLegacyJSONLFilename to scan for ALL .jsonl files
- Now filters out merge artifacts (backup, .orig, .bak, etc.)
- Warns only when multiple real JSONL files exist
- Added CheckDatabaseConfig to detect when configured paths do not match
  what actually exists on disk
- Updated tests to verify backup files are ignored
- Added test cases for custom JSONL filenames

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 23:44:26 -08:00
Steve Yegge
3573470d6b bd sync: 2025-11-21 23:34:10 2025-11-21 23:34:10 -08:00
Steve Yegge
a517ec98aa Fix: TestGetAssignedStatus - Missing rootCtx initialization
Failure Type: Real
Root Cause: Test was not initializing the global rootCtx variable that getAssignedStatus depends on, causing it to return nil
Fix Applied: Added rootCtx initialization with proper cleanup using defer, matching the pattern used in other tests
Verification: All tests now pass (go test ./...)

Fixes bd-9f86-baseline-test

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 23:22:12 -08:00
Steve Yegge
a40f17c9a5 Update bd JSONL 2025-11-21 23:06:20 -08:00
Steve Yegge
d6959d8f8c bd sync: 2025-11-21 22:49:21 2025-11-21 22:49:21 -05:00
Steve Yegge
caf89c7899 bd sync: 2025-11-21 22:48:49 2025-11-21 22:48:49 -05:00
Steve Yegge
3065db261e feat: Add label operations to bd update command
Implements bd-au0.2, completing all P0 tasks in the command standardization epic.

Changes:
- Add --add-label, --remove-label, --set-labels flags to bd update
- Support multiple labels via repeatable flags
- Implement in both daemon and direct modes
- Add comprehensive tests for all label operations

The bd update command now supports:
  bd update <id> --add-label <label>       # Add one or more labels
  bd update <id> --remove-label <label>    # Remove one or more labels
  bd update <id> --set-labels <labels>     # Replace all labels

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 22:17:26 -05:00
Steve Yegge
ae4cd00e52 bd sync: 2025-11-21 21:59:27 2025-11-21 21:59:27 -05:00
Steve Yegge
99e3d21f35 Merge branch 'main' of https://github.com/steveyegge/beads 2025-11-21 21:57:26 -05:00
Steve Yegge
2e2b8d7c2c feat: Accept both integer and P-format for priority flags in bd list
Implements bd-au0.4: Standardize priority flag parsing across all commands.

Changes:
- Use registerPriorityFlag() for main priority flag (was IntP)
- Change priority-min/max from Int to String flags
- Add validation import and use ValidatePriority() for all priority parsing
- Update both direct mode and daemon RPC code paths

Now supports both formats consistently:
- Numeric: --priority 0, --priority-min 1, --priority-max 2
- P-format: --priority P0, --priority-min P1, --priority-max P2

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 21:57:23 -05:00
Steve Yegge
76ebb2a7b9 chore: Update bd JSONL (todo list from GH #298 work) 2025-11-21 20:52:54 -05:00
Steve Yegge
ddd209e26a fix: Correct git merge driver placeholders from %L/%R to %A/%B
Git merge drivers only support three placeholders:
- %O (ancestor/base)
- %A (current version)
- %B (other branch's version)

The code was incorrectly using %L and %R, which don't exist in git,
causing them to be passed through literally and breaking JSONL merges.

Changes:
- Fixed merge driver config in init.go, merge.go, README.md, docs
- Added detection in bd doctor with clear error messages
- Added auto-fix in bd doctor --fix
- Added proactive warning in bd sync before git pull
- Added reactive error detection after merge failures
- Updated all tests to use correct placeholders

Now users get helpful guidance at every step:
1. bd doctor detects the issue
2. bd doctor --fix auto-corrects it
3. bd sync warns before pulling if misconfigured
4. Error messages suggest bd doctor --fix when merge fails

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 20:40:18 -05:00
Steve Yegge
ce433bb2e8 Merge branch 'main' of https://github.com/steveyegge/beads 2025-11-21 20:26:42 -05:00
Steve Yegge
c8bf6a6590 bd sync: 2025-11-21 20:22:28 2025-11-21 20:22:28 -05:00
Steve Yegge
364cedee5d bug: File bd-7yg for merge driver placeholder issue
Documents critical bug affecting all users where git merge driver
uses invalid %L/%R placeholders instead of standard %A/%B.

Discovered while resolving merge conflict - automatic JSONL merge
fails with 'open 7: no such file or directory' error.
2025-11-21 19:52:18 -05:00
Steve Yegge
5ae76d24d4 chore: Close 4 test coverage issues (bd-yxy, bd-nbc, bd-lln, bd-gra)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 19:33:12 -05:00
Steve Yegge
3f17627a39 test: Mark TestAutoFlushDebounce as obsolete
Debouncing functionality has been refactored from module-level variables
to the FlushManager, which is thoroughly tested in flush_manager_test.go.

The TestAutoFlushDebounce test referenced old variables (flushDebounce, etc.)
that no longer exist in the codebase. Rather than rewriting it to test the old
auto-flush code paths, we skip it and rely on the comprehensive FlushManager tests.

Fixes + Opts completed from MAIN_TEST_OPTIMIZATION_PLAN.md:
-  Fix 1: rootCtx initialization (already done)
-  Fix 2: Reduced sleep durations (already done)
-  Opt 3: Fixed TestAutoFlushDebounce (marked obsolete)

All TestAuto* tests now pass in 1.9s.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 19:00:44 -05:00
Steve Yegge
822baa0bc9 fix(test): Fix hanging tests by initializing rootCtx (bd-n25)
Problem:
- 10 tests in main_test.go were hanging indefinitely
- Tests calling flushToJSONL() or autoImportIfNewer() would timeout
- Root cause: rootCtx was nil in test environment

Solution:
1. Initialize rootCtx with 30s timeout in all affected tests:
   - TestAutoFlushOnExit
   - TestAutoFlushJSONLContent
   - TestAutoFlushErrorHandling
   - TestAutoImportIfNewer
   - TestAutoImportDisabled
   - TestAutoImportWithUpdate
   - TestAutoImportNoUpdate
   - TestAutoImportMergeConflict
   - TestAutoImportConflictMarkerFalsePositive
   - TestAutoImportClosedAtInvariant

2. Reduce sleep durations by 10x (200ms→20ms, 100ms→10ms)

3. Fix JSONL path issue in TestAutoFlushJSONLContent

Results:
- Before: Tests hung indefinitely (∞)
- After: All 16 tests complete in ~1-2 seconds
- 15 passing, 1 skipped (TestAutoFlushDebounce needs config fix)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 18:47:38 -05:00
Steve Yegge
6f3b0e7c99 doc: Document main_test.go refactoring analysis (bd-1rh)
Analysis shows main_test.go is NOT a good candidate for shared DB pattern
due to global state manipulation and integration test characteristics.

Changes:
- Added MAIN_TEST_REFACTOR_NOTES.md documenting findings
- Fixed unused import in duplicates_test.go (from recent pull)

Key findings:
- 18 tests with 14 newTestStore() calls
- Tests manipulate global state (autoFlushEnabled, isDirty, etc.)
- Tests simulate workflows (flush, import) not just CRUD
- Shared DB causes deadlocks between flush ops and cleanup
- Integration tests need process-level isolation

Recommendation: Leave as-is or use Option 2 (grouped tests without
shared DB). Focus P2 efforts on integrity_test.go instead.

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 18:00:23 -05:00
Steve Yegge
8ac10a28f2 Update bd JSONL
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 15:52:36 -05:00
Steve Yegge
e16265515a ran bd cleanup 2025-11-21 15:12:22 -05:00
Steve Yegge
1c91c65d69 bd sync: 2025-11-21 15:11:55 2025-11-21 15:11:55 -05:00
Steve Yegge
bdc1487f48 Close bd-ar2, bd-dvd, and bd-ymj: Complete code review follow-up work
Closes three tickets related to GitHub #334 and #278:

- bd-dvd: Parent resurrection fix (GetNextChildID now resurrects parents)
- bd-ymj: Export metadata fix (prevents false JSONL changed errors)
- bd-ar2: Code review epic with 12 subtasks (all completed)

All fixes implemented in commit 4c5f99c and follow-up improvements.
Updated GH #334 with fix details and marked as triaged.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 15:10:32 -05:00
Steve Yegge
032e6a72d2 bd sync: 2025-11-21 14:40:35 2025-11-21 14:40:35 -05:00
Steve Yegge
cd8cb8b86a Fix bd-ar2 code review issues: metadata tracking and multi-repo support
This commit addresses critical code review findings from bd-dvd and bd-ymj fixes:

## Completed Tasks

### bd-ar2.1: Extract duplicated metadata update code
- Created `updateExportMetadata()` helper function
- Eliminated 22-line duplication between createExportFunc and createSyncFunc
- Single source of truth for metadata updates

### bd-ar2.2: Add multi-repo support to export metadata updates
- Added per-repo metadata key tracking with keySuffix parameter
- Both export and sync functions now update metadata for all repos

### bd-ar2.3: Fix tests to use actual daemon functions
- TestExportUpdatesMetadata now calls updateExportMetadata() directly
- Added TestUpdateExportMetadataMultiRepo() for multi-repo testing
- Fixed export_mtime_test.go tests to call updateExportMetadata()

### bd-ar2.9: Fix variable shadowing in GetNextChildID
- Changed `err` to `resurrectErr` to avoid shadowing
- Improves code clarity and passes linter checks

### bd-ar2.10: Fix hasJSONLChanged to support per-repo keys
- Updated hasJSONLChanged() to accept keySuffix parameter
- Reads metadata with correct per-repo keys
- All callers updated (validatePreExport, daemon import, sync command)

### bd-ar2.11: Use stable repo identifiers instead of paths
- Added getRepoKeyForPath() helper function
- Uses stable identifiers like ".", "../frontend" instead of absolute paths
- Metadata keys now portable across machines and clones
- Prevents orphaned metadata when repos are moved

## Files Changed
- cmd/bd/daemon_sync.go: Helper functions, metadata updates
- cmd/bd/integrity.go: hasJSONLChanged() with keySuffix support
- cmd/bd/sync.go: Updated to use getRepoKeyForPath()
- cmd/bd/*_test.go: Tests updated for new signatures
- internal/storage/sqlite/hash_ids.go: Fixed variable shadowing

## Testing
All export, sync, and integrity tests pass.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 11:28:25 -05:00
Steve Yegge
ff2a2250f3 Close bd-9f86-baseline-test: test compilation errors fixed 2025-11-21 11:04:34 -05:00
Steve Yegge
1dd307159d bd sync: 2025-11-21 10:29:36 2025-11-21 10:29:36 -05:00
Steve Yegge
4c5f99c5bd Fix bd-dvd and bd-ymj: Parent resurrection and export metadata
Bug 1 (bd-dvd): GetNextChildID now attempts parent resurrection from JSONL
before failing. Added TryResurrectParent call to match CreateIssue behavior.

Bug 2 (bd-ymj): Export now updates last_import_hash metadata to prevent
'JSONL content has changed' errors on subsequent exports.

Files changed:
- internal/storage/sqlite/hash_ids.go: Add resurrection attempt
- cmd/bd/daemon_sync.go: Add metadata updates after export
- Tests added for both fixes
- Fixed pre-existing bug in integrity_content_test.go

Follow-up work tracked in epic bd-ar2 (9 issues for improvements).

Fixes GH #334
2025-11-21 10:29:30 -05:00
Steve Yegge
1806183d5f feat: Add bd search command for efficient text queries (#347)
Adds a new `bd search` command optimized for quick text searches,
addressing the issue where Claude using MCP bd list consumes 30k tokens.

Features:
- Searches across title, description, and ID with OR logic
- Default limit of 50 results (vs unlimited for bd list)
- Supports key filters: --status, --assignee, --type, --label
- Works in both daemon and direct modes
- Provides --json and --long output formats

Examples:
  bd search "performance" --status open
  bd search "database" --label backend --limit 10
  bd search "bd-5q"  # Search by partial ID

This provides a more efficient alternative to bd list when users
just want to find issues quickly without loading all results.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 22:44:19 -05:00
Steve Yegge
81c741ba05 bd sync: apply DB changes after import 2025-11-20 22:04:22 -05:00
Steve Yegge
a630f9fd62 Update bd JSONL 2025-11-20 22:02:59 -05:00
Steve Yegge
e28e3ea5f1 Close bd-khnb: Auto-import resurrection bug fixed
The critical bug where git operations could resurrect deleted issues
has been resolved with content-based staleness detection.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 22:00:33 -05:00
Steve Yegge
a17e4af725 Fix context propagation lifecycle bugs
Critical fixes to context propagation implementation (bd-rtp, bd-yb8, bd-2o2):

1. Fix rootCtx lifecycle in main.go:
   - Removed premature defer rootCancel() from PersistentPreRun (line 132)
   - Added proper cleanup in PersistentPostRun (lines 544-547)
   - Context now properly spans from setup through command execution to cleanup

2. Fix test context contamination in cli_fast_test.go:
   - Reset rootCtx and rootCancel to nil in test cleanup (lines 139-140)
   - Prevents cancelled contexts from affecting subsequent tests

3. Fix export tests missing context in export_test.go:
   - Added rootCtx initialization in 5 export test subtests
   - Tests now properly set up context before calling exportCmd.Run()

These fixes ensure:
- Signal-aware contexts work correctly for graceful cancellation
- Ctrl+C properly cancels import/export operations
- Database integrity is maintained after cancellation
- All cancellation tests pass (TestImportCancellation, TestExportCommand)

Tested:
- go build ./cmd/bd ✓
- go test ./cmd/bd -run TestImportCancellation ✓
- go test ./cmd/bd -run TestExportCommand ✓

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:54:11 -05:00
Steve Yegge
be37a13ceb bd sync: 2025-11-20 21:47:55 2025-11-20 21:47:55 -05:00
Steve Yegge
0444271cc3 bd sync: Update beads.jsonl after rebase
Merge metadata updates from remote.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:38:11 -05:00
Steve Yegge
a42e84ca9c Add issues bd-gdn, bd-5xt, bd-i00 for future improvements 2025-11-20 21:24:39 -05:00
Steve Yegge
a9b2f9f553 Fix race condition in auto-flush mechanism (issue bd-52)
Critical fixes to code review findings:

1. Remove global state access from flushToJSONLWithState
   - FlushManager now has true single ownership of flush state
   - No more race conditions from concurrent global state access
   - flushToJSONLWithState trusts only the flushState parameter
   - Legacy wrapper handles success detection via failure count

2. Fix shutdown timeout data loss risk
   - Increased timeout from 5s → 30s to prevent data loss
   - Added detailed comments explaining the timeout rationale
   - Better error message indicates potential data loss scenario

Implementation details:
- New FlushManager uses event-driven single-owner pattern
- Channels eliminate shared mutable state (markDirtyCh, flushNowCh, etc.)
- Comprehensive race detector tests verify concurrency safety
- Backward compatible with existing tests via legacy code path
- ARCHITECTURE.md documents design principles and guarantees

Test results:
- All race detector tests pass (TestFlushManager*)
- Legacy API compatibility verified (TestMarkDirtyAndScheduleFlush*)
- No race conditions detected under concurrent load

Future improvements tracked as beads:
- bd-gdn: Add functional tests for flush correctness verification
- bd-5xt: Log errors from timer-triggered flushes
- bd-i00: Convert magic numbers to named constants

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:24:31 -05:00
Steve Yegge
4a566edaa6 bd sync: Update issue metadata
- Update comment IDs for bd-1h8, bd-8ql
- Add new issues bd-1pj6, bd-49kw

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:23:50 -05:00