feat: Wire MQ lifecycle events to gt feed display (gt-lak31)

- Add MQ event types and logging in mrqueue/events.go
- Have refinery emit merge_started, merged, merge_failed, merge_skipped events
- Create MQEventSource to read from mq_events.jsonl
- Add MultiSource to combine events from bd activity and MQ events
- Add color coding: green for merged, red for failed
- Update feed help with MQ event symbols

Events are stored in .beads/mq_events.jsonl and displayed in the feed TUI
with appropriate symbols and colors.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-30 01:02:22 -08:00
parent ff37dc3d60
commit 4f9bf643bd
10 changed files with 1008 additions and 22 deletions

View File

@@ -65,6 +65,12 @@ Event symbols:
✗ failed - Step or issue failed
⊘ deleted - Issue removed
MQ (Merge Queue) event symbols:
⚙ merge_started - Refinery began processing an MR
✓ merged - MR successfully merged (green)
✗ merge_failed - Merge failed (conflict, tests, etc.) (red)
⊘ merge_skipped - MR skipped (already merged, etc.)
Examples:
gt feed # Launch TUI dashboard
gt feed --plain # Plain text output (bd activity)
@@ -181,16 +187,28 @@ func runFeedDirect(workDir string, bdArgs []string) error {
// runFeedTUI runs the interactive TUI feed.
func runFeedTUI(workDir string) error {
var sources []feed.EventSource
// Create event source from bd activity
source, err := feed.NewBdActivitySource(workDir)
bdSource, err := feed.NewBdActivitySource(workDir)
if err != nil {
return fmt.Errorf("creating event source: %w", err)
return fmt.Errorf("creating bd activity source: %w", err)
}
defer source.Close()
sources = append(sources, bdSource)
// Create MQ event source (optional - don't fail if not available)
mqSource, err := feed.NewMQEventSourceFromWorkDir(workDir)
if err == nil {
sources = append(sources, mqSource)
}
// Combine all sources
multiSource := feed.NewMultiSource(sources...)
defer multiSource.Close()
// Create model and connect event source
m := feed.NewModel()
m.SetEventChannel(source.Events())
m.SetEventChannel(multiSource.Events())
// Run the TUI
p := tea.NewProgram(m, tea.WithAltScreen())