Commit Graph

360 Commits

Author SHA1 Message Date
Steve Yegge
6bf5c9d2b9 bd sync: 2025-10-26 17:55:32 2025-10-26 17:55:32 -07:00
Steve Yegge
fcff20a735 Reduce auto-sync delays for better UX
- Reduce flush debounce from 5s to 1s (BEADS_FLUSH_DEBOUNCE)
- Reduce daemon poll interval from 10s to 2s
- Makes issue changes sync much faster to JSONL and git
2025-10-26 17:14:25 -07:00
Steve Yegge
0f27c5abf1 Add bd daemons list and health subcommand tasks (bd-158, bd-157) 2025-10-26 17:11:08 -07:00
Steve Yegge
e657931186 Fix two daemon bugs: race condition on deletion (bd-155) and wrong project context (bd-156)
- bd-155: Add pre-import flush in daemon sync cycle to prevent deleted issues from being re-imported
- bd-155: Reduce default daemon polling interval from 5 minutes to 10 seconds
- bd-156: Fix hardcoded 'vc.db' - now properly detects existing .db files in local .beads/ directory
2025-10-26 17:09:20 -07:00
Steve Yegge
9f9ea48ec1 Update beads.jsonl 2025-10-26 13:24:18 -07:00
Steve Yegge
dde640a502 Add bd-144 for bd edit follow-ups 2025-10-26 13:24:18 -07:00
Steve Yegge
9cebb65410 Auto-update beads.jsonl 2025-10-26 13:21:49 -07:00
Steve Yegge
5228108d41 Update beads.jsonl: close bd-142, create bd-143 2025-10-26 13:21:49 -07:00
Steve Yegge
ec7d824897 Fix bd init --quiet and clarify agent usage in docs
- Fix: bd init --quiet now skips interactive prompts and auto-installs hooks
- Docs: Add Git Workflow & Auto-Sync section to README
- Docs: Update AGENTS.md with --quiet flag guidance for agents
- Docs: Update WORKFLOW.md to explain auto-import after git pull
- Docs: Add FAQ entries about auto-sync behavior and who runs init
- Closes bd-127, bd-140, bd-141

Amp-Thread-ID: https://ampcode.com/threads/T-72f55d41-f16c-4541-b72a-8acc9013e87b
Co-authored-by: Amp <amp@ampcode.com>
2025-10-26 12:53:50 -07:00
Steve Yegge
c91e83e993 Add bd sync --import-only flag and git pull integration test (bd-124, bd-125)
- Add --import-only flag to bd sync command for manual JSONL import after git pull
- Show import summary output instead of suppressing it
- Add comprehensive integration test for git pull sync scenario
- Test covers non-daemon auto-import and bd sync command
- Verify performance of import operations

Closes bd-123, bd-114, bd-124, bd-125, bd-136, bd-137

Amp-Thread-ID: https://ampcode.com/threads/T-7d8dc20f-baf2-4d1d-add1-57fa67028c15
Co-authored-by: Amp <amp@ampcode.com>
2025-10-26 12:37:46 -07:00
Steve Yegge
8fe0586080 Update bd-132 with current status and next steps 2025-10-26 12:11:24 -07:00
Steve Yegge
897bc6ace8 Merge duplicate bd-135 into bd-132 2025-10-26 11:59:55 -07:00
Steve Yegge
ada7bd0b73 Refactor autoImportIfNewer to internal/autoimport package (bd-128)
- Extracted auto-import logic from cmd/bd/main.go to internal/autoimport
- Removed global dependencies (store, dbPath) by using parameters
- Uses callback pattern (ImportFunc) for flexible import implementation
- Both CLI and daemon can now call auto-import after detecting staleness
- Added detailed ID remapping output for collision resolution
- Improved error reporting for parse failures
- All tests passing

Amp-Thread-ID: https://ampcode.com/threads/T-b7faaa33-fc52-409f-82b3-28db143b335d
Co-authored-by: Amp <amp@ampcode.com>
2025-10-26 11:55:24 -07:00
Steve Yegge
744d7b67dc Merge duplicate issue bd-135 into bd-132 2025-10-26 11:49:55 -07:00
Steve Yegge
8eca47c4fb Fix database: restore clean 135 issues and add exclusive lock docs 2025-10-25 23:39:26 -07:00
Steve Yegge
e42868c8e5 Update beads.jsonl after auto-import 2025-10-25 23:23:14 -07:00
Steve Yegge
ab69b6b744 Close bd-114: Add configurable SortPolicy to GetReadyWork
Amp-Thread-ID: https://ampcode.com/threads/T-da75f81b-41b9-4c99-b159-ffd67bfb670b
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 23:22:40 -07:00
Steve Yegge
8bd0ceb0d9 Clean up database: delete 41 duplicates/cruft and renumber to bd-1 through bd-135
Amp-Thread-ID: https://ampcode.com/threads/T-d238b838-793e-464b-a1b0-1d2efa0aeaf6
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 23:16:04 -07:00
Steve Yegge
fbaaedce53 Update beads database: close bd-159, bd-160, create bd-166
Amp-Thread-ID: https://ampcode.com/threads/T-b554e049-aff8-4a24-8bf3-3305483b7f5a
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 23:11:52 -07:00
Steve Yegge
daa25db720 Implement timestamp tracking and staleness detection (bd-159, bd-160)
- bd-159: Track last_import_time in metadata after auto-import
- bd-160: Add staleness check to daemon before serving requests
  - Detects when JSONL mtime > last import time
  - Currently logs warning (needs bd-166 for actual import trigger)
- Add lastImportTime field to RPC Server struct with getter/setter
- Add checkAndAutoImportIfStale() method to detect stale JSONL

This is part of bd-158 epic to fix daemon showing stale data after git pull.

Amp-Thread-ID: https://ampcode.com/threads/T-b554e049-aff8-4a24-8bf3-3305483b7f5a
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 23:07:30 -07:00
Steve Yegge
362d7172c0 Mark bd-149 as in_progress 2025-10-25 22:56:06 -07:00
Steve Yegge
91411d7c82 Update beads database with new epics and child issues 2025-10-25 22:50:42 -07:00
Steve Yegge
1e770a2f2e Add critical daemon and sync issues: singleton enforcement, exclusive locks, git pull auto-sync
Amp-Thread-ID: https://ampcode.com/threads/T-1d43dd4a-cee3-40c5-b6aa-c071c664d093
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 22:48:24 -07:00
Steve Yegge
8660cb631b Close bd-146 (duplicate) and bd-147 (sort policy implemented) 2025-10-25 18:54:24 -07:00
Steve Yegge
09c11a26e6 Add configurable sort policy for GetReadyWork (bd-147)
- Add SortPolicy type with hybrid, priority, oldest constants
- Add SortPolicy field to WorkFilter
- Implement buildOrderByClause() for SQL generation
- Add --sort flag to bd ready command
- Add comprehensive tests for all 3 sort policies
- Update RPC protocol to support sort policy
- Update documentation with sort policy examples

Enables autonomous systems like VC to use strict priority ordering
while preserving hybrid behavior for interactive use.

Amp-Thread-ID: https://ampcode.com/threads/T-9d7ea9db-8d6d-4498-9daa-48a7e104ce1f
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 18:54:00 -07:00
Steve Yegge
b855c444d4 Enable errcheck linter and fix all production code warnings
- Enabled errcheck linter (previously disabled)
- Set tests: false in .golangci.yml to focus on production code
- Fixed 27 errcheck warnings using Go best practices:
  * Database resources: defer func() { _ = rows.Close() }()
  * Transaction rollbacks: defer func() { _ = tx.Rollback() }()
  * Best-effort closers: _ = store.Close(), _ = client.Close()
  * File writes: proper error checking on Close()
  * Interactive input: handle EOF gracefully
  * File ops: ignore ENOENT on os.Remove()
- All tests pass
- Closes bd-58

Amp-Thread-ID: https://ampcode.com/threads/T-57c9afd3-9adf-40c2-8be7-3e493d200361
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 18:44:38 -07:00
Steve Yegge
bb33007036 Fix revive style issues (bd-56)
- Fix 14 unused-parameter warnings (rename to _)
- Fix 2 redefines-builtin-id (max→maxCount, min→minInt)
- Fix 3 indent-error-flow issues with gofmt
- Merged duplicate bd-126 into bd-116
2025-10-25 18:13:49 -07:00
Steve Yegge
14e14f647e Fix goconst linter issues (bd-116)
- Use windowsOS constant in reinit_test.go
- Use testIssueBD1 constant in compact_test.go and counter_sync_test.go
- Merged duplicate bd-126 into bd-116
2025-10-25 18:04:05 -07:00
Steve Yegge
37e5dcf4f8 Close bd-78: flaky test already fixed 2025-10-25 18:00:41 -07:00
Steve Yegge
ec43028dc9 Sync beads issues 2025-10-25 17:40:09 -07:00
Steve Yegge
744563e87f Add health checks and reconnection logic for stale daemon sockets (bd-137)
- Add ping() and health() methods to BdDaemonClient for connection verification
- Implement _health_check_client() to verify cached client connections
- Add _reconnect_client() with exponential backoff (0.1s, 0.2s, 0.4s, max 3 retries)
- Update _get_client() to health-check before returning cached clients
- Automatically detect and remove stale connections from pool
- Add comprehensive test suite with 14 tests covering all scenarios
- Handle daemon restarts, upgrades, and long-idle connections gracefully

Amp-Thread-ID: https://ampcode.com/threads/T-2366ef1b-389c-4293-8145-7613037c9dfa
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 17:39:21 -07:00
Steve Yegge
15790ea664 Auto-sync beads database 2025-10-25 16:44:32 -07:00
Steve Yegge
c2056152e6 Add bd info command to show database path and daemon status
Implements bd-145. Users can now easily determine which database file bd is using
and check daemon connection status.

Features:
- Shows absolute database path
- Displays daemon status (connected/mode/health/version)
- Shows issue count
- Supports --json output for programmatic use
- Works in both daemon and direct modes

Example output:
  bd info                    # Human-readable
  bd info --json             # JSON for agents
  bd info --no-daemon        # Force direct mode

Updated documentation in README.md and AGENTS.md.

Amp-Thread-ID: https://ampcode.com/threads/T-a33c0762-f800-4fea-9510-6a803d8aece8
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 16:43:44 -07:00
Steve Yegge
aada5d9ac6 Fix bd-144: Update main .db file timestamp after import (WAL mode)
- Added CheckpointWAL method to SQLite storage
- Import now checkpoints WAL after completion
- Updates main .db file modification time for staleness detection
- PRAGMA wal_checkpoint(FULL) flushes WAL to main database
2025-10-25 16:37:54 -07:00
Steve Yegge
de03466da9 Fix bd-143: Prevent daemon auto-sync from wiping out issues.jsonl with empty database
- Added safety check to exportToJSONLWithStore (daemon path)
- Refuses to export 0 issues over non-empty JSONL file
- Added --force flag to override safety check when intentional
- Added test coverage for empty database export protection
- Prevents data loss when daemon has wrong/empty database

Amp-Thread-ID: https://ampcode.com/threads/T-de18e0ad-bd17-46ec-994b-0581e257dcde
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 16:36:18 -07:00
Steve Yegge
3241b7fbfc updated bd-135 epic 2025-10-25 14:29:33 -07:00
Steve Yegge
9a370b5b3c Fix gosec security warnings (bd-57)
- Changed file permissions from 0644 → 0600 for JSONL exports and config files
- Changed directory permissions from 0755 → 0750 in all test code
- Updated .golangci.yml with proper exclusions for false positives
- Reduced gosec warnings from 102 to 22 (all remaining are acceptable)

Closes bd-57

Amp-Thread-ID: https://ampcode.com/threads/T-f754d957-9e42-4e74-861e-57235c7e6436
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 13:50:32 -07:00
Steve Yegge
47c915ef10 Fix goconst linter warnings by converting repeated strings to constants
- Added testUserAlice constant for 'alice' in test files
- Added windowsOS constant for 'windows' in test files
- Added testIssueBD1/testIssueBD2 constants for 'bd-1'/'bd-2' in test files
- Added testVersion100 constant for '1.0.0' in version tests
- Added testIssueCustom1 constant for 'custom-1' in lazy init tests

Closes bd-54

Amp-Thread-ID: https://ampcode.com/threads/T-0a4e5d44-2d95-4948-8f4a-d8facf8657c7
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 13:33:51 -07:00
Steve Yegge
94fb9fa531 Refactor high-complexity test functions (gocyclo)
Extracted helper structs for 5 complex test functions, reducing cyclomatic complexity from 31-35 to <10:

- TestLibraryIntegration: integrationTestHelper with create/assert methods
- TestExportImport: exportImportHelper with JSONL encoding/validation
- TestListCommand: listTestHelper with search and assertions
- TestGetEpicsEligibleForClosure: epicTestHelper with epic-specific queries
- TestCreateIssues: createIssuesTestHelper with batch creation helpers

All tests pass. Closes bd-55.

Amp-Thread-ID: https://ampcode.com/threads/T-39807355-8790-4646-a98d-d40472e1bd2c
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 13:20:16 -07:00
Steve Yegge
f6e37bd25d Refactor DeleteIssues to reduce complexity (37 → <10)
Extracted 10 helper functions:
- buildIDSet: ID deduplication
- resolveDeleteSet: Mode routing (cascade/force/validate)
- expandWithDependents: Recursive dependent collection
- validateNoDependents: Dependency validation
- checkSingleIssueValidation: Per-issue dependent check
- trackOrphanedIssues: Force-mode orphan tracking
- collectOrphansForID: Per-issue orphan collection
- buildSQLInClause: SQL placeholder generation
- populateDeleteStats: Dry-run statistics
- executeDelete: Actual deletion

Code review fix:
- Added rows.Err() check to catch iterator errors

Ref: bd-55
2025-10-25 12:51:29 -07:00
Steve Yegge
5b99e56941 Refactor tryAutoStartDaemon to reduce complexity (34 → <10)
Extracted 7 helper functions:
- debugLog: Centralized debug logging
- isDaemonHealthy: Fast-path health check
- acquireStartLock: Lock acquisition with wait/retry
- handleStaleLock: Stale lock detection
- handleExistingSocket: Socket cleanup/validation
- determineSocketMode: Global vs local daemon logic
- startDaemonProcess: Process spawning and readiness
- setupDaemonIO: I/O redirection

Ref: bd-55
2025-10-25 12:35:32 -07:00
Steve Yegge
36c1c648fc Refactor TestLabelCommands and TestReopenCommand to reduce complexity
- TestLabelCommands: 67 → <10 using labelTestHelper
- TestReopenCommand: 37 → <10 using reopenTestHelper
- All tests pass
- Progress on bd-55

Amp-Thread-ID: https://ampcode.com/threads/T-0a5a623d-42f0-4b36-96ed-809285a748cb
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 11:27:24 -07:00
Steve Yegge
d2084dc3af Fix nil pointer crash in bd reopen command (bd-133)
- Add daemon RPC support to reopen command
- Check daemonClient != nil first, use RPC if available
- Fall back to direct store access with nil check
- Reopened bd-55 for remaining cyclomatic complexity work

Amp-Thread-ID: https://ampcode.com/threads/T-2ea7e226-4672-4a49-96b4-81ab5cf953cd
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 10:39:45 -07:00
Steve Yegge
fe30e0c527 Refactor importIssuesCore to reduce complexity (bd-55)
Reduced cyclomatic complexity from 71 to ~10 by extracting 7 phase functions:
- getOrCreateStore: Store initialization
- handlePrefixMismatch: Prefix validation/renaming
- handleCollisions: Collision detection/resolution
- upsertIssues: Issue creation/updates
- importDependencies: Dependency imports (optimized with set-based deduplication)
- importLabels: Label imports
- importComments: Comment imports (fixed idempotency bug)

Additional improvements:
- Fixed comment deduplication to use author+text only (not timestamp)
- Optimized dependency imports to fetch once per issue (not per dependency)
- Improved error messages to reference CLI flags
- Renamed importIssues -> upsertIssues for clarity

Main function reduced from 317 lines to 50 lines. All tests pass.

Amp-Thread-ID: https://ampcode.com/threads/T-aa67a4e5-b35d-4ba6-a954-5d9ff86c15bf
Co-authored-by: Amp <amp@ampcode.com>
2025-10-25 10:26:56 -07:00
Steve Yegge
c9c4f19a56 Add bd-132: GH#146 terminal color issue
Amp-Thread-ID: https://ampcode.com/threads/T-2939ba4d-023a-4a31-bdca-f36f48c211ee
Co-authored-by: Amp <amp@ampcode.com>
2025-10-24 22:35:13 -07:00
Steve Yegge
afe6fad6e4 Add automatic git hooks installation prompt to bd init
- Prompts user to install hooks on first init if in git repo
- Auto-installs with Y/n prompt (defaults to yes)
- Skips prompt if hooks already installed
- Detects bd hooks by signature comment in files
2025-10-24 22:22:28 -07:00
Steve Yegge
0344e1f08b Fix bd-51: Add git hooks to eliminate auto-flush race condition
- Added --flush-only flag to bd sync command
- Created pre-commit hook to flush pending changes before commit
- Created post-merge hook to import changes after pull/merge
- Added install script for easy setup
- Updated AGENTS.md with git hooks workflow
- Resolves race condition where daemon auto-flush fires after commit

Amp-Thread-ID: https://ampcode.com/threads/T-00b80d3a-4194-4c75-a60e-25a318cf9f91
Co-authored-by: Amp <amp@ampcode.com>
2025-10-24 22:17:06 -07:00
Steve Yegge
c87f9007a5 bd sync: close bd-65 and bd-67 2025-10-24 22:10:29 -07:00
Steve Yegge
3f80d850c9 bd sync: 2025-10-24 21:52:11 2025-10-24 21:52:11 -07:00
Steve Yegge
b0259fe36f Add bd-137: Fix dependency timestamp churn during auto-import 2025-10-24 21:40:05 -07:00