diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 8c7f09dd..2e8e8e30 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -920,7 +920,7 @@ {"id":"bd-xtf5","title":"Code smell: Multiple CLI command files exceed 1000 lines","description":"Several CLI command files are very large and could benefit from splitting:\n\n| File | Lines | Notes |\n|------|-------|-------|\n| init.go | 1928 | Multiple init modes, contributor/team setup |\n| show.go | 1592 | Display formatting, tree views, output modes |\n| doctor.go | 1295 | Many health checks |\n| sync.go | 1201 | Sync branch operations |\n| compact.go | 1199 | Compaction logic |\n| linear.go | 1190 | Linear integration |\n| main.go | 1148 | Entry point and globals |\n\nConsider:\n1. Splitting init.go into init_core.go, init_contributor.go (already exists), init_team.go (already exists)\n2. Moving show.go formatters to internal/ui package\n3. Doctor checks could be individual files under doctor/ subpackage (already started)\n\nLocation: cmd/bd/*.go","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-28T15:32:23.233091-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T18:05:09.921186-08:00","closed_at":"2025-12-28T18:05:09.921186-08:00","dependencies":[{"issue_id":"bd-xtf5","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.278433-08:00","created_by":"daemon"}],"comments":[{"id":7,"issue_id":"bd-xtf5","author":"stevey","text":"Completed init.go refactoring:\n\n- Split from 1928 → 705 lines (under 800 target)\n- Extracted 4 new files:\n - init_git_hooks.go (~480 lines): Git hooks and merge driver\n - init_stealth.go (~310 lines): Stealth mode, fork detection\n - init_agent.go (~170 lines): AGENTS.md and Claude settings\n - init_templates.go (~180 lines): config.yaml and README templates\n\nRemaining files still over 800 lines:\n- show.go (1592)\n- doctor.go (1295)\n- sync.go (1201)\n- compact.go (1199)\n- linear.go (1190)\n- main.go (1148)\n- list.go (1052)\n- template.go (1051)\n- gate.go (1048)\n\nCommit: c5f03b7b","created_at":"2025-12-29T01:27:43Z"}]} {"id":"bd-xtl9","title":"Test Second Parent","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-27T22:16:14.971605-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T22:16:35.925357-08:00","deleted_at":"2025-12-27T22:16:35.925357-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"bd-xurv","title":"Restart daemon with 0.33.2","description":"Restart the bd daemon to pick up new version:\n\n```bash\nbd daemon --stop\nbd daemon --start\nbd daemon --health # Verify Version: 0.33.2\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760884-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"bd-xwvo","title":"bd create --rig flag loses event fields (event_kind, actor, payload)","description":"## Bug\n\nWhen creating events with `--rig` flag, the event-specific fields are not stored:\n- event_kind\n- actor\n- target\n- payload\n\n## Reproduction\n\n```bash\n# Without --rig (works)\nbd create --type=event --title='Test' --event-category=session.ended --event-actor=test --event-payload='{\"x\":1}' --silent\n# Fields are stored correctly\n\n# With --rig (broken)\nbd create --type=event --title='Test' --event-category=session.ended --event-actor=test --event-payload='{\"x\":1}' --rig=gastown --silent\n# event_kind, actor, payload are NOT stored\n```\n\n## Impact\n\nThe `gt costs record` command needs to create session events in rig-specific beads, but cannot use `--rig` flag due to this bug.\n\n## Workaround\n\nRun `bd create` from within the rig directory so it auto-detects the correct beads location.","status":"open","priority":2,"issue_type":"bug","created_at":"2026-01-02T13:23:21.936098-08:00","created_by":"gastown/polecats/capable","updated_at":"2026-01-02T13:23:21.936098-08:00"} +{"id":"bd-xwvo","title":"bd create --rig flag loses event fields (event_kind, actor, payload)","description":"## Bug\n\nWhen creating events with `--rig` flag, the event-specific fields are not stored:\n- event_kind\n- actor\n- target\n- payload\n\n## Reproduction\n\n```bash\n# Without --rig (works)\nbd create --type=event --title='Test' --event-category=session.ended --event-actor=test --event-payload='{\"x\":1}' --silent\n# Fields are stored correctly\n\n# With --rig (broken)\nbd create --type=event --title='Test' --event-category=session.ended --event-actor=test --event-payload='{\"x\":1}' --rig=gastown --silent\n# event_kind, actor, payload are NOT stored\n```\n\n## Impact\n\nThe `gt costs record` command needs to create session events in rig-specific beads, but cannot use `--rig` flag due to this bug.\n\n## Workaround\n\nRun `bd create` from within the rig directory so it auto-detects the correct beads location.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-02T13:23:21.936098-08:00","created_by":"gastown/polecats/capable","updated_at":"2026-01-02T17:06:09.247746-08:00","closed_at":"2026-01-02T17:06:09.247746-08:00","close_reason":"Fixed: createInRig now extracts all missing fields from cmd.Flags() instead of relying on parameters"} {"id":"bd-y0e4","title":"Code smell: Storage interface has 50+ methods - consider interface segregation","description":"The Storage interface in internal/storage/storage.go has 50+ methods covering:\n\n- Issue CRUD (CreateIssue, GetIssue, UpdateIssue, DeleteIssue, SearchIssues)\n- Dependencies (AddDependency, RemoveDependency, GetDependencies, GetDependents, etc.)\n- Labels (AddLabel, RemoveLabel, GetLabels, etc.)\n- Ready work (GetReadyWork, GetBlockedIssues, etc.)\n- Events/Comments\n- Statistics\n- Dirty tracking\n- Export hash tracking\n- ID generation\n- Config/Metadata\n- Transactions\n- Lifecycle\n\nWhile this is a valid design for a storage abstraction, consider the Interface Segregation Principle:\n\n1. Split into smaller interfaces: IssueStorage, DependencyStorage, LabelStorage, etc.\n2. Compose them: `type Storage interface { IssueStorage; DependencyStorage; ... }`\n3. This allows more focused testing and clearer API contracts\n\nLocation: internal/storage/storage.go:79-197","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-28T15:32:54.005169-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T17:21:44.466226-08:00","closed_at":"2025-12-28T17:21:44.466226-08:00","dependencies":[{"issue_id":"bd-y0e4","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.296641-08:00","created_by":"daemon"}]} {"id":"bd-y0fj","title":"Issue lifecycle hooks (on-close, on-complete)","description":"Add hooks that fire on issue state transitions, enabling automation like closing linked GitHub issues.\n\n## Problem\n\nWe have `external_ref` to link beads issues to external systems (GitHub, Linear, Jira), but no mechanism to trigger actions when issues close. Currently:\n\n```\nbd-u2sc (external_ref: gh-692) closes → nothing happens\n```\n\n## Proposed Solution\n\n### Phase 1: Shell Hooks\n\nAdd `.beads-hooks/on-close.sh` (and similar lifecycle hooks):\n\n```bash\n# .beads-hooks/on-close.sh\n# Called by bd close with issue JSON on stdin\n#\\!/bin/bash\nissue=$(cat)\nexternal_ref=$(echo \"$issue\" | jq -r '.external_ref // empty')\nif [[ \"$external_ref\" == gh-* ]]; then\n number=\"${external_ref#gh-}\"\n gh issue close \"$number\" --repo steveyegge/beads \\\n --comment \"Completed via beads epic $(echo $issue | jq -r .id)\"\nfi\n```\n\n### Lifecycle Events\n\n| Event | Trigger | Use Cases |\n|-------|---------|-----------|\n| `on-close` | Issue closed | Close external refs, notify, archive |\n| `on-complete` | Epic children all done | Roll-up completion, close parent refs |\n| `on-status-change` | Any status transition | Sync to external systems |\n\n### Phase 2: Molecule Completion Handlers\n\nMolecules could define completion actions:\n\n```yaml\nname: github-issue-tracker\non_complete:\n - action: shell\n command: gh issue close {{external_ref}} --repo {{repo}}\n - action: mail\n to: mayor/\n subject: \"Epic {{id}} completed\"\n```\n\n### Phase 3: Gas Town Integration\n\nFor full Gas Town deployments:\n- Witness observes closures via beads events\n- Routes to integration agents via mail\n- Agents handle external system interactions\n\n## Implementation Notes\n\n- Hooks should be async (don't block bd close)\n- Pass full issue JSON to hook via stdin\n- Support hook timeout and failure handling\n- Consider `--no-hooks` flag for bulk operations\n\n## Related\n\n- `external_ref` field already exists (GH#142)\n- Cross-project deps: bd-h807, bd-d9mu\n- Git hooks: .beads-hooks/ pattern established\n\n## Use Cases\n\n1. **GitHub integration**: Close GH issues when beads epic completes\n2. **Linear sync**: Update Linear status when beads status changes \n3. **Notifications**: Send mail/Slack when high-priority issues close\n4. **Audit**: Log all closures to external system","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T14:46:04.846657-08:00","updated_at":"2025-12-22T14:50:40.35447-08:00","closed_at":"2025-12-22T14:50:40.35447-08:00"} {"id":"bd-y2v","title":"Refactor duplicate JSONL-from-git parsing code","description":"Both readFirstIssueFromGit() in init.go and importFromGit() in autoimport.go have similar code patterns for:\n1. Running git show \u003cref\u003e:\u003cpath\u003e\n2. Scanning the output with bufio.Scanner\n3. Parsing JSON lines\n\nCould be refactored to share a helper like:\n- readJSONLFromGit(gitRef, path string) ([]byte, error)\n- Or a streaming version: streamJSONLFromGit(gitRef, path string) (io.Reader, error)\n\nFiles:\n- cmd/bd/autoimport.go:225-256 (importFromGit)\n- cmd/bd/init.go:1212-1243 (readFirstIssueFromGit)\n\nPriority is low since code duplication is minimal and both functions work correctly.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T14:51:18.41124-08:00","updated_at":"2025-12-23T22:37:15.770825-08:00","closed_at":"2025-12-23T22:37:15.770825-08:00"}