feat: Add batch deletion support (bd-127)

- Add DeleteIssues() method in sqlite.go for atomic batch deletion
- Support multiple issue IDs as arguments or from file
- Add --from-file flag to read IDs from file (supports comments)
- Add --dry-run mode for safe preview without deleting
- Add --cascade flag for recursive deletion of dependents
- Add --force flag to orphan dependents instead of failing
- Pre-collect connected issues before deletion for text reference updates
- Add orphan deduplication to prevent duplicate IDs
- Add rows.Err() checks in all row iteration loops
- Full transaction safety - all deletions succeed or none do
- Comprehensive statistics tracking (deleted, dependencies, labels, events)
- Update README and CHANGELOG with batch deletion docs

Fixed critical code review issues:
- Dry-run mode now properly uses dryRun parameter instead of deleting data
- Text references are pre-collected before deletion so they update correctly
- Added orphan deduplication and error checks
- Updated defer rollback pattern per Go best practices
This commit is contained in:
Steve Yegge
2025-10-17 21:13:23 -07:00
parent c6ce88ebc7
commit ee94d817ed
5 changed files with 649 additions and 9 deletions

View File

@@ -315,6 +315,58 @@ bd update bd-1 --status in_progress --json
bd close bd-1 --json
```
### Deleting Issues
Delete one or more issues, with automatic cleanup of references and dependencies:
```bash
# Single issue deletion (preview mode)
bd delete bd-1
# Force single deletion
bd delete bd-1 --force
# Batch deletion
bd delete bd-1 bd-2 bd-3 --force
# Delete from file (one ID per line, supports # comments)
bd delete --from-file deletions.txt --force
# Dry-run mode (preview without changes)
bd delete --from-file deletions.txt --dry-run
# Cascade deletion (recursively delete dependents)
bd delete bd-1 --cascade --force
# Force deletion (orphan dependents instead of failing)
bd delete bd-1 --force
# JSON output
bd delete bd-1 bd-2 --force --json
```
The delete operation:
- Removes all dependency links (both directions)
- Updates text references to `[deleted:ID]` in connected issues
- Deletes the issue from database and JSONL
- Atomic: all deletions succeed or none do
**Dependency handling:**
- **Default**: Fails if any issue has dependents not in deletion set
- **`--cascade`**: Recursively deletes all dependent issues
- **`--force`**: Deletes and orphans dependents (use with caution)
**File format** for `--from-file`:
```text
# Cleanup test issues
bd-100
bd-101
bd-102
# Another batch
bd-200
```
### Renaming Prefix
Change the issue prefix for all issues in your database. This is useful if your prefix is too long or you want to standardize naming.