diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 577c6c08..6b9ce722 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,165 +1,183 @@ -{"id":"ralph-tui-08z","title":"Image Paste Feedback \u0026 Error Handling","description":"## Description\nProvide user feedback when images are attached or when errors occur.\n\n## Acceptance Criteria\n- [ ] Success toast: \"Image attached\" when image successfully stored\n- [ ] Error toast: \"Invalid image path\" when file doesn't exist\n- [ ] Error toast: \"Unsupported format\" when file isn't supported image type\n- [ ] Error toast: \"Failed to read clipboard\" when clipboard tool fails\n- [ ] Error toast: \"Failed to save image\" when storage fails\n- [ ] Info toast on missing tools with install hint:\n - macOS: \"Install pngpaste: `brew install pngpaste`\"\n - Linux: \"Install xclip: `sudo apt install xclip`\"\n- [ ] Missing tool message shown only once per session\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Integrate with Toast component (or create inline if Toast not ready)\n- Graceful degradation: if clipboard tools missing, file path paste still works\n\n## Dependencies\n- Paste Event Integration in ChatView (ralph-tui-xcq)\n\n## Estimate\n2 points","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:25.017919+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:52:00.233597+11:00","closed_at":"2026-01-17T02:52:00.233597+11:00","close_reason":"Implemented toast notification system for image paste feedback. Created useToast hook, Toast component, and useImageAttachmentWithFeedback wrapper. Provides success/error toasts and platform-specific install hints shown once per session. ChatView accepts toasts prop. All quality checks pass.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-08z","depends_on_id":"ralph-tui-xcq","type":"blocks","created_at":"2026-01-16T21:22:25.019421+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-08z","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.318931+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-0t7","title":"Toggle between task details and output in details panel","description":"## User Story\nAs a user viewing a task, I want to toggle between task details and iteration output views, so that I can maximize screen space for whichever view I need.\n\n## Current Behavior\n- Details panel shows both task metadata AND iteration output stacked vertically\n- Limited space for output when task has long description\n- Cannot focus on just the output\n\n## Acceptance Criteria\n- [ ] Press 'o' to toggle between details view and output view\n- [ ] Details view shows: task title, ID, status, description, dependencies\n- [ ] Output view shows: full-height scrollable iteration output\n- [ ] Visual indicator shows which mode is active\n- [ ] Default to details view, switch to output when iteration starts\n\n## Technical Notes\n- File: src/tui/components/RightPanel.tsx\n- Add state for view mode (details | output)\n- Update keyboard handler in RunApp.tsx for 'o' key","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T12:29:15.106618817Z","created_by":"Subsy","updated_at":"2026-01-12T13:58:18.151348872Z","closed_at":"2026-01-12T13:58:18.151348872Z","close_reason":"Implemented toggle between details and output views in RightPanel with 'o' key. Details view shows task metadata, output view shows full-height scrollable iteration output. Auto-switches to output when iteration starts.","labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-0t7","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T12:35:11.547966532Z","created_by":"Subsy"}]} -{"id":"ralph-tui-12c","title":"Story 1.4: Image Cleanup on Exit","description":"## Description\nClean up stored images when ralph-tui process exits, respecting user configuration.\n\n## Acceptance Criteria\n- [ ] Delete all files in `.ralph-tui/images/` on process exit\n- [ ] Respect `cleanupImages` config option (default: `true`)\n- [ ] Handle cleanup on normal exit, SIGINT, and SIGTERM\n- [ ] Don't fail silently - log cleanup errors\n- [ ] Don't delete the `.ralph-tui/images/` directory itself (only contents)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Register cleanup handlers in main entry points (`run.tsx`, `create-prd.tsx`, `resume.tsx`)\n- Use `process.on('exit')`, `process.on('SIGINT')`, `process.on('SIGTERM')`\n- Check config via `storedConfig?.cleanupImages ?? true`\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:05.797708+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-12m","title":"Validate full workflow","description":"End-to-end test of the complete beads-rust workflow","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.740341622Z","created_by":"plgeek","updated_at":"2026-01-21T01:00:56.811932631Z","dependencies":[{"issue_id":"ralph-tui-12m","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-01-21T01:00:56.742092264Z","created_by":"plgeek"},{"issue_id":"ralph-tui-12m","depends_on_id":"ralph-tui-ez4","type":"blocks","created_at":"2026-01-21T01:00:56.794812801Z","created_by":"plgeek"},{"issue_id":"ralph-tui-12m","depends_on_id":"ralph-tui-exe","type":"blocks","created_at":"2026-01-21T01:00:56.811913926Z","created_by":"plgeek"}]} -{"id":"ralph-tui-1aj","title":"Verify CRUD operations","description":"Test create, read, update, close operations work correctly","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.164609961Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.460731387Z","deleted_at":"2026-01-21T00:42:45.46072778Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task"} -{"id":"ralph-tui-33e","title":"Test ready command filtering","description":"Verify br ready only shows unblocked issues","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.191745148Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.460008383Z","deleted_at":"2026-01-21T00:42:45.460004656Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task"} -{"id":"ralph-tui-348","title":"Subagent Tracing","description":"Add visibility into subagent execution within ralph-tui. When Claude Code spawns subagents via the Task tool, provide observability into subagent activity with real-time hierarchy display, configurable detail levels, and full trace persistence to iteration logs.","status":"closed","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-12T14:03:41.464239637Z","created_by":"Subsy","updated_at":"2026-01-12T21:17:10.63164444Z","closed_at":"2026-01-12T21:17:10.63164444Z","close_reason":"Completed - subagent tracing implemented, UI improvements done, core orchestrator functional","labels":["feature","ralph"]} -{"id":"ralph-tui-348.1","title":"US-001: Agent plugin declares tracing capabilities","description":"As a plugin developer, I want to declare whether my agent supports structured output so ralph-tui knows when subagent tracing is available.\n\n**Acceptance Criteria:**\n- [ ] Add `supportsSubagentTracing: boolean` to `AgentPluginMeta` interface\n- [ ] Add optional `structuredOutputFormat?: 'json' | 'jsonl'` to meta\n- [ ] Claude plugin declares `supportsSubagentTracing: true`\n- [ ] OpenCode plugin declares `supportsSubagentTracing: false` (initially)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:03:50.27639331Z","created_by":"Subsy","updated_at":"2026-01-12T14:40:50.700229791Z","closed_at":"2026-01-12T14:40:50.700229791Z","close_reason":"Implemented: Added supportsSubagentTracing and structuredOutputFormat to AgentPluginMeta interface. Claude plugin declares true with jsonl format, OpenCode declares false.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.1","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:03:50.277015393Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.10","title":"US-010: Display subagent summary in iteration history","description":"As a user viewing past iterations, I want to see a summary of subagent activity so I understand what happened.\n\n**Acceptance Criteria:**\n- [ ] Show subagent count in iteration list: '5 subagents'\n- [ ] Show failure indicator if any subagent failed\n- [ ] In detail view, show expandable subagent tree\n- [ ] Load trace data lazily (only when viewing details)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:56.522496283Z","created_by":"Subsy","updated_at":"2026-01-12T15:21:19.553751564Z","closed_at":"2026-01-12T15:21:19.553751564Z","close_reason":"Implemented subagent summary display in iteration history: count in list view, failure indicator, expandable tree in detail view, lazy loading of trace data","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.10","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:56.523124388Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.10","depends_on_id":"ralph-tui-348.9","type":"blocks","created_at":"2026-01-12T14:06:12.746093906Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.2","title":"US-002: Enable JSON output mode for Claude agent","description":"As a user, I want ralph-tui to automatically use Claude Code's `--output-format json` when subagent tracing is enabled so structured events are captured.\n\n**Acceptance Criteria:**\n- [ ] Add `--output-format json` to Claude agent's buildArgs() when tracing enabled\n- [ ] Parse JSONL output stream instead of raw text\n- [ ] Fall back gracefully if JSON parsing fails (show raw output)\n- [ ] Add `subagentTracing: boolean` to agent execute options\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:03:57.373249781Z","created_by":"Subsy","updated_at":"2026-01-12T14:44:48.659545122Z","closed_at":"2026-01-12T14:44:48.659545122Z","close_reason":"Implemented JSON output mode for Claude agent: added subagentTracing option, --output-format json flag when enabled, JSONL parsing with fallback, and streaming parser support","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.2","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:03:57.373898675Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.2","depends_on_id":"ralph-tui-348.1","type":"blocks","created_at":"2026-01-12T14:06:11.662425532Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.3","title":"US-003: Parse subagent lifecycle events","description":"As a developer, I need to parse Claude Code's JSON output to detect when subagents are spawned, running, and completed.\n\n**Acceptance Criteria:**\n- [ ] Create `SubagentEvent` type with: id, type (spawn|progress|complete|error), timestamp, agentType, description, parentId\n- [ ] Create `SubagentTraceParser` class that processes JSONL stream\n- [ ] Detect Task tool invocations as subagent spawn events\n- [ ] Track subagent completion with exit status and duration\n- [ ] Build parent-child hierarchy from nested Task calls\n- [ ] Emit events via callback for real-time updates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:04.706949345Z","created_by":"Subsy","updated_at":"2026-01-12T14:48:56.77396013Z","closed_at":"2026-01-12T14:48:56.77396013Z","close_reason":"Implemented SubagentTraceParser with types for parsing Task tool lifecycle events from Claude JSONL","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.3","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:04.707787616Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.3","depends_on_id":"ralph-tui-348.2","type":"blocks","created_at":"2026-01-12T14:06:11.829065594Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.4","title":"US-004: Add subagent state tracking to engine","description":"As the engine, I need to maintain state about active and completed subagents during an iteration.\n\n**Acceptance Criteria:**\n- [ ] Create `SubagentState` interface: id, type, description, status, startedAt, completedAt, parentId, children[]\n- [ ] Add `subagents: Map\u003cstring, SubagentState\u003e` to iteration state\n- [ ] Update state as parser emits events\n- [ ] Calculate duration and nesting depth\n- [ ] Expose `getSubagentTree()` method for TUI\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:11.429801742Z","created_by":"Subsy","updated_at":"2026-01-12T14:53:50.920712974Z","closed_at":"2026-01-12T14:53:50.920712974Z","close_reason":"Implemented subagent state tracking in engine: EngineSubagentState interface with id/type/description/status/startedAt/completedAt/parentId/children/durationMs/depth fields, subagents Map in EngineState, integration with SubagentTraceParser via handleSubagentEvent callback, getSubagentTree() method for TUI rendering. Typecheck and lint pass.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.4","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:11.432866403Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.4","depends_on_id":"ralph-tui-348.3","type":"blocks","created_at":"2026-01-12T14:06:11.977351196Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.5","title":"US-005: Create SubagentTreePanel TUI component","description":"As a user, I want to see a dedicated panel showing the subagent hierarchy so I can understand what the agent is working on.\n\n**Acceptance Criteria:**\n- [ ] Create `SubagentTreePanel` component showing tree structure\n- [ ] Display: agent type, description (truncated), status icon, duration\n- [ ] Status icons: spinner (running), checkmark (complete), X (failed)\n- [ ] Indent nested subagents to show hierarchy\n- [ ] Highlight currently active subagent\n- [ ] Auto-scroll to show newest activity\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Verify in TUI manually","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:19.023232322Z","created_by":"Subsy","updated_at":"2026-01-12T15:14:05.69948397Z","closed_at":"2026-01-12T15:14:05.69948397Z","close_reason":"Implemented SubagentTreePanel component with tree structure, status icons (spinner/checkmark/X), indentation for nested subagents, active subagent highlighting, and auto-scroll support. Typecheck and lint pass.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.5","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:19.028019321Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.5","depends_on_id":"ralph-tui-348.4","type":"blocks","created_at":"2026-01-12T14:06:12.127810919Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.6","title":"US-006: Add collapsible subagent sections in output panel","description":"As a user, I want subagent activity shown inline in the output with collapsible sections so I can see context without switching panels.\n\n**Acceptance Criteria:**\n- [ ] Insert subagent start marker in output: `[Subagent: type] description`\n- [ ] Insert subagent end marker with status and duration\n- [ ] Make sections collapsible (toggle with Enter key when focused)\n- [ ] Collapsed sections show one-line summary\n- [ ] Expanded sections show full subagent output\n- [ ] Visually distinguish subagent output (different color/indent)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Verify in TUI manually","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:26.628830267Z","created_by":"Subsy","updated_at":"2026-01-12T15:10:54.675319089Z","closed_at":"2026-01-12T15:10:54.675319089Z","close_reason":"Implemented collapsible subagent sections in output panel with: SubagentSection component for hierarchical display, collapse state management, subagent tree threading from engine to RightPanel, color-coded status indicators, depth-based indentation, and trace level indicator in title bar.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.6","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:26.632621037Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.6","depends_on_id":"ralph-tui-348.4","type":"blocks","created_at":"2026-01-12T14:06:12.278390568Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.7","title":"US-007: Add detail level configuration","description":"As a user, I want to configure how much subagent detail is shown so I can balance information vs noise.\n\n**Acceptance Criteria:**\n- [ ] Add `subagentTracing.detailLevel` to config: 'off' | 'minimal' | 'moderate' | 'full'\n- [ ] 'off': No tracing, use raw output (current behavior)\n- [ ] 'minimal': Show start/complete events only\n- [ ] 'moderate': Show events + description + duration\n- [ ] 'full': Show events + nested output + hierarchy panel\n- [ ] Add keyboard shortcut to cycle detail levels (e.g., 't')\n- [ ] Persist preference to config file\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:34.235166981Z","created_by":"Subsy","updated_at":"2026-01-12T15:04:40.612013969Z","closed_at":"2026-01-12T15:04:40.612013969Z","close_reason":"Implemented subagent tracing detail level configuration with type definition, Zod validation, Settings UI, 't' keyboard shortcut, and config persistence","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.7","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:34.238650962Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.8","title":"US-008: Toggle subagent panel visibility","description":"As a user, I want to show/hide the subagent panel to maximize space for output when needed.\n\n**Acceptance Criteria:**\n- [ ] Add keyboard shortcut 'T' (shift+t) to toggle subagent panel\n- [ ] Panel shows on right side, resizable\n- [ ] Remember panel state in session\n- [ ] When hidden, still track subagents (just don't display panel)\n- [ ] Update help overlay to show new shortcuts\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:41.865427955Z","created_by":"Subsy","updated_at":"2026-01-12T15:27:25.507101946Z","closed_at":"2026-01-12T15:27:25.507101946Z","close_reason":"Implemented subagent panel toggle with 'T' key. Panel shows on right side, is resizable, state persists to session, and subagents continue tracking when hidden. Help overlay updated.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.8","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:41.866045389Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.8","depends_on_id":"ralph-tui-348.5","type":"blocks","created_at":"2026-01-12T14:06:12.425228209Z","created_by":"Subsy"}]} -{"id":"ralph-tui-348.9","title":"US-009: Persist subagent trace to iteration logs","description":"As a user, I want subagent trace data saved to iteration logs so I can analyze agent behavior after the fact.\n\n**Acceptance Criteria:**\n- [ ] Add `subagentTrace` section to iteration log format\n- [ ] Include: full event timeline, hierarchy tree, aggregate stats\n- [ ] Stats: total subagents, by type, total duration, failure count\n- [ ] Maintain backward compatibility (logs without trace still readable)\n- [ ] Update `loadIterationLog()` to parse trace section\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:49.838575561Z","created_by":"Subsy","updated_at":"2026-01-12T14:57:53.88561738Z","closed_at":"2026-01-12T14:57:53.88561738Z","close_reason":"Implemented subagent trace persistence to iteration logs with backward compatibility","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.9","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-01-12T14:04:49.839241016Z","created_by":"Subsy"},{"issue_id":"ralph-tui-348.9","depends_on_id":"ralph-tui-348.4","type":"blocks","created_at":"2026-01-12T14:06:12.579545097Z","created_by":"Subsy"}]} -{"id":"ralph-tui-35v","title":"Image Storage Manager","description":"## Description\nCreate a system to store attached images in a predictable location accessible to agents.\n\n## Acceptance Criteria\n- [ ] Store images in `.ralph-tui/images/` directory (created if not exists)\n- [ ] Generate unique filenames: `img-{sha256-prefix-12chars}.{ext}` (deduplicates identical images)\n- [ ] For file path attachments, copy file to storage location\n- [ ] For clipboard/base64 attachments, decode and write to storage location\n- [ ] Return absolute path to stored image\n- [ ] Provide method to list all session images\n- [ ] Provide method to delete all/individual session images\n- [ ] Handle storage errors gracefully\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/image-storage.ts`\n- Use Node.js `crypto` module for SHA256 hashing\n- Use `Bun.write()` for file operations\n- Storage path: `path.join(process.cwd(), '.ralph-tui', 'images')`\n\n## Estimate\n3 points","notes":"Implemented image-storage.ts module with: storeImageFromPath, storeImageFromBase64, storeImageFromBuffer for storing images; listStoredImages for listing; deleteStoredImage and deleteAllStoredImages for cleanup; SHA256-based deduplication; bun run typecheck and build pass","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:21:22.228112+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:27:00.507537+11:00","closed_at":"2026-01-17T02:27:00.507555+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-35v","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:21.524095+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-3az","title":"Validate full workflow","description":"End-to-end test of the complete beads-rust workflow","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.207326581Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.459335363Z","deleted_at":"2026-01-21T00:42:45.459332528Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task"} -{"id":"ralph-tui-3bm","title":"Test dependency tracking","description":"Verify dependencies are tracked and block correctly","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.178295457Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.457875669Z","deleted_at":"2026-01-21T00:42:45.457869428Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task"} -{"id":"ralph-tui-3l4","title":"Story 5.1: Create Toast Notification Component","description":"## Description\nCreate a reusable toast notification component for transient messages.\n\n## Acceptance Criteria\n- [ ] Toast appears in top-right corner of screen\n- [ ] Auto-dismisses after 3 seconds\n- [ ] Supports variants: `success`, `error`, `info`, `warning`\n- [ ] Shows icon + message text\n- [ ] Non-blocking (doesn't prevent other interactions)\n- [ ] Queue multiple toasts if needed\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/components/Toast.tsx`\n- Create: `src/tui/hooks/useToast.ts` for state management\n- Use absolute positioning with OpenTUI's `\u003cbox\u003e` component\n- Icons: ✓ (success), ✗ (error), ℹ (info), ⚠ (warning)\n\n## Priority\nMedium\n\n## Estimate\n3 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:19:11.803485+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-3od","title":"Story 3.3: Display Attached Images Indicator","description":"## Description\nShow visual indicator of attached images in the input area.\n\n## Acceptance Criteria\n- [ ] Display count of attached images near input: `📎 2 images attached`\n- [ ] Use subtle styling that doesn't clutter the interface\n- [ ] Show indicator only when images are attached\n- [ ] Position: above the textarea, left-aligned\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Add to ChatView.tsx input area section\n- Use existing color scheme: `colors.fg.muted` for text, `colors.accent.tertiary` for icon/count\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n- Story 1.3: Image Storage System (ralph-tui-sdc)\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:48.825959+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-3uo","title":"Verify CRUD operations","description":"Test create, read, update, close operations work correctly","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.680756343Z","created_by":"plgeek","updated_at":"2026-01-21T08:38:42.34435675Z","close_reason":"All CRUD operation tests now pass. Fixed test assertions to match actual implementation: getTasks, getTask, getNextTask, completeTask, and updateTaskStatus all verified.","dependencies":[{"issue_id":"ralph-tui-3uo","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-01-21T01:00:56.692598064Z","created_by":"plgeek"}]} -{"id":"ralph-tui-3uu","title":"Story 3.2: Integrate Image Detection into ChatView Paste Handler","description":"## Description\nModify ChatView to detect and handle image pastes.\n\n## Acceptance Criteria\n- [ ] Intercept paste events before inserting text\n- [ ] Check if pasted content is an image (file path or base64)\n- [ ] If image: store it, add to attachments, insert placeholder `[Image N]`\n- [ ] If not image: paste text normally (existing behavior)\n- [ ] Support pasting multiple images (each gets sequential placeholder)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify `src/tui/components/ChatView.tsx`\n- Use `keyHandler.on(\"paste\", ...)` from OpenTUI\n- Insert `[Image 1]`, `[Image 2]`, etc. as placeholders in textarea\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n- Story 1.3: Image Storage System (ralph-tui-sdc)\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:44.721992+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-41q","title":"Gemini CLI Agent Plugin","description":"Add a new agent plugin for Google's Gemini CLI to ralph-tui, enabling users to orchestrate AI coding tasks using Gemini models. Supports streaming JSONL output for subagent tracing, file context via directories, and full autonomy mode.","status":"open","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:14.220603891Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:14.220603891Z","labels":["feature","ralph"]} -{"id":"ralph-tui-41q.1","title":"US-001: Create Gemini CLI plugin skeleton","description":"As a developer, I want the basic plugin class structure so that I can build out the Gemini CLI integration.\n\n## Acceptance Criteria\n- [ ] Create src/plugins/agents/builtin/gemini.ts\n- [ ] File starts with ABOUTME comment explaining purpose\n- [ ] Class GeminiCliAgentPlugin extends BaseAgentPlugin\n- [ ] Define AgentPluginMeta with id: gemini-cli, name: Gemini CLI\n- [ ] Set defaultCommand: 'gemini'\n- [ ] Set supportsStreaming: true, supportsInterrupt: true, supportsFileContext: true\n- [ ] Set supportsSubagentTracing: true and structuredOutputFormat: 'jsonl'\n- [ ] Export factory function createGeminiCliAgent\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","notes":"Created Gemini CLI plugin skeleton and registered builtin factory.","status":"open","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:21.934809461Z","created_by":"Subsy","updated_at":"2026-01-17T00:58:16.636355+11:00","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.1","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:52:21.935808175Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.10","title":"US-010: Update documentation for Gemini CLI plugin","description":"As a user, I want documentation for the Gemini CLI plugin so that I know how to configure and use it.\n\n## Acceptance Criteria\n- [ ] Add Gemini CLI to README.md agent list (if agents are listed)\n- [ ] Create website/content/docs/agents/gemini-cli.mdx documentation page\n- [ ] Document supported models (gemini-2.5-pro, gemini-2.5-flash, gemini-3-pro-preview, gemini-3-flash-preview)\n- [ ] Document default model (gemini-3-pro-preview)\n- [ ] Document authentication prerequisites (Google Cloud or API key - user's responsibility)\n- [ ] Document CLI flags used (--yolo, --output-format stream-json, --include-directories)\n- [ ] Add gemini-cli page to website/lib/navigation.ts (if navigation config exists)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:55:36.486413566Z","created_by":"Subsy","updated_at":"2026-01-16T09:55:36.486413566Z","labels":["docs","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.10","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:55:36.487441115Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.10","depends_on_id":"ralph-tui-41q.8","type":"blocks","created_at":"2026-01-16T09:56:18.915957292Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.11","title":"US-011: Verify Gemini CLI sandbox compatibility","description":"As a developer, I want to verify that the Gemini CLI plugin works correctly in sandboxed mode so that users can safely run it with bwrap/sandbox-exec isolation.\n\n## Acceptance Criteria\n- [ ] Gemini CLI executes successfully inside bwrap sandbox on Linux\n- [ ] Auth paths (~/.config/gemini, ~/.config/gcloud) are correctly mounted read-write\n- [ ] Binary paths are mounted read-only\n- [ ] Network access works when sandbox.network is not disabled\n- [ ] OAuth token refresh works (auth paths are writable)\n- [ ] Test with `ralph run --sandbox` using the gemini agent\n\n## Test Plan\n1. Configure ralph to use gemini agent\n2. Run `ralph run --sandbox` with a simple task\n3. Verify the agent can:\n - Authenticate (OAuth or API key)\n - Make API calls to Gemini\n - Read/write to the working directory\n - Complete the task successfully\n\n## Notes\nThis validates that getSandboxRequirements() returns the correct paths for Gemini CLI authentication and execution.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-16T11:49:39.446958365Z","created_by":"Subsy","updated_at":"2026-01-16T11:49:39.446958365Z","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-41q.11","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T11:49:39.448214064Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.11","depends_on_id":"ralph-tui-41q.7","type":"blocks","created_at":"2026-01-16T11:49:46.652827615Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.11","depends_on_id":"ralph-tui-41q.8","type":"blocks","created_at":"2026-01-16T11:49:46.691797778Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.2","title":"US-002: Implement command argument building","description":"As a developer, I want the plugin to build correct CLI arguments so that Gemini CLI executes in headless mode with proper configuration.\n\n## Acceptance Criteria\n- [ ] Override buildArgs() method\n- [ ] Include -p flag for headless mode (prompt passed via stdin)\n- [ ] Include --output-format stream-json for structured output\n- [ ] Include --yolo flag for auto-approval\n- [ ] Include --model flag when model is configured\n- [ ] Default model is gemini-3-pro-preview when not specified\n- [ ] Override getStdinInput() to pass prompt via stdin (avoid shell escaping)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:29.455407103Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:29.455407103Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.2","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:52:29.456337378Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.2","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-01-16T09:53:29.209993174Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.3","title":"US-003: Implement file context support","description":"As a developer, I want the plugin to pass file context to Gemini CLI so that it can work with relevant project files.\n\n## Acceptance Criteria\n- [ ] Extract unique directories from file paths (like Claude plugin)\n- [ ] Add --include-directories flag for each directory\n- [ ] Handle empty file list gracefully (no flags added)\n- [ ] Handle files without directory paths gracefully\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:34.78934111Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:34.78934111Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.3","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:52:34.790237532Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.3","depends_on_id":"ralph-tui-41q.2","type":"blocks","created_at":"2026-01-16T09:53:29.236172954Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.4","title":"US-004: Implement streaming JSONL parser","description":"As a developer, I want to parse Gemini's stream-json output so that ralph-tui can display subagent activity and track costs.\n\n## Acceptance Criteria\n- [ ] Create createStreamingJsonlParser() static method (similar to Claude plugin)\n- [ ] Parser handles chunked data with line buffering\n- [ ] Parse event types: init, message, tool_use, tool_result, error, result\n- [ ] Extract and accumulate: messages, tool calls, token usage, cost info\n- [ ] Parser exposes .push(chunk), .flush(), .getState() methods\n- [ ] Create parseJsonlLine() and parseJsonlOutput() helper methods\n- [ ] Define GeminiJsonlMessage and GeminiParserState types\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:42.826565255Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:42.826565255Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.4","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:52:42.82745282Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.4","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-01-16T09:53:29.261953832Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.5","title":"US-005: Implement model validation","description":"As a developer, I want flexible model validation so that users can specify any Gemini model.\n\n## Acceptance Criteria\n- [ ] Override validateModel() method\n- [ ] Accept empty string (uses default model)\n- [ ] Accept any non-empty string (flexible validation, let CLI handle errors)\n- [ ] Store model in private model property via initialize()\n- [ ] Override buildModelString() to return configured model\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:48.116752238Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:48.116752238Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.5","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:52:48.117426711Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.5","depends_on_id":"ralph-tui-41q.2","type":"blocks","created_at":"2026-01-16T09:53:29.287210701Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.6","title":"US-006: Implement detection and readiness check","description":"As a developer, I want the plugin to detect if Gemini CLI is installed so that ralph-tui can show appropriate setup guidance.\n\n## Acceptance Criteria\n- [ ] Override detect() method\n- [ ] Run 'gemini --version' to check availability\n- [ ] Parse version string from output\n- [ ] Return AgentDetectResult with version, executable path, or error\n- [ ] isReady() returns true if detection succeeds\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:54.001235097Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:54.001235097Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.6","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:52:54.001883852Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.6","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-01-16T09:53:29.311968659Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.7","title":"US-007: Implement sandbox requirements","description":"As a developer, I want the plugin to declare sandbox requirements so that Gemini CLI can run in sandboxed mode.\n\n## Acceptance Criteria\n- [ ] Override getSandboxRequirements() method\n- [ ] Include authPaths: ~/.config/gcloud, ~/.config/gemini (Google credentials)\n- [ ] Include binaryPaths: /usr/local/bin, ~/.local/bin\n- [ ] Include runtimePaths: empty array (no runtime dependencies)\n- [ ] Set requiresNetwork: true (API calls required)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:53:00.124155796Z","created_by":"Subsy","updated_at":"2026-01-16T09:53:00.124155796Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.7","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:53:00.125354038Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.7","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-01-16T09:53:29.336626698Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.8","title":"US-008: Register plugin in builtin registry","description":"As a developer, I want the Gemini CLI plugin registered as a builtin so that users can select it.\n\n## Acceptance Criteria\n- [ ] Import createGeminiCliAgent in src/plugins/agents/builtin/index.ts\n- [ ] Add to registerBuiltinAgents() function\n- [ ] Plugin appears in 'ralph-tui plugins agents' output\n- [ ] Plugin selectable via --agent gemini-cli\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:53:05.888510333Z","created_by":"Subsy","updated_at":"2026-01-16T09:53:05.888510333Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:53:05.889095757Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.3","type":"blocks","created_at":"2026-01-16T09:53:29.360555Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.4","type":"blocks","created_at":"2026-01-16T09:53:29.385196798Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.5","type":"blocks","created_at":"2026-01-16T09:53:29.409592522Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.6","type":"blocks","created_at":"2026-01-16T09:53:29.434119213Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.7","type":"blocks","created_at":"2026-01-16T09:53:29.458279002Z","created_by":"Subsy"}]} -{"id":"ralph-tui-41q.9","title":"US-009: Add unit tests for Gemini CLI plugin","description":"As a developer, I want unit tests to verify the plugin implementation.\n\n## Acceptance Criteria\n- [ ] Create src/plugins/agents/builtin/gemini.test.ts\n- [ ] Test buildArgs() produces correct flags\n- [ ] Test buildArgs() with and without model override\n- [ ] Test buildArgs() with file context (directories extracted correctly)\n- [ ] Test validateModel() accepts valid inputs\n- [ ] Test JSONL parser handles complete events\n- [ ] Test JSONL parser handles chunked/partial data\n- [ ] Test getSandboxRequirements() returns expected paths\n- [ ] All tests pass with bun run test\n- [ ] bun run typecheck passes","status":"open","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:53:12.016036768Z","created_by":"Subsy","updated_at":"2026-01-16T09:53:12.016036768Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.9","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-01-16T09:53:12.016680132Z","created_by":"Subsy"},{"issue_id":"ralph-tui-41q.9","depends_on_id":"ralph-tui-41q.8","type":"blocks","created_at":"2026-01-16T09:53:29.481996787Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r","title":"Ralph TUI - AI Agent Loop Orchestrator","description":"Terminal UI and execution engine for orchestrating AI agent loops. Replaces shell scripts (ralph.sh, ralph-beads.sh) with a proper TUI application.\n\n## Goals\n- Real-time observability into agent iterations and task progress\n- Support pause/resume and graceful interruption\n- Plugin architecture for agent providers (claude, opencode)\n- Plugin architecture for issue trackers (json, beads, beads+bv)\n- Session persistence to resume interrupted runs\n- npm installable: `npm install -g ralph-tui`\n\n## Tech Stack\n- TypeScript + OpenTUI (React reconciler with Zig-powered rendering)","status":"closed","priority":1,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-11T10:38:31.360442838Z","created_by":"Subsy","updated_at":"2026-01-12T21:17:10.641923602Z","closed_at":"2026-01-12T21:17:10.641923602Z","close_reason":"Completed - subagent tracing implemented, UI improvements done, core orchestrator functional","labels":["feature","ralph"]} -{"id":"ralph-tui-45r.1","title":"US-001: Project Scaffolding and Package Setup","description":"As a developer, I want to set up the ralph-tui repository with proper TypeScript/OpenTUI structure so I can start development.\n\n## Acceptance Criteria\n- Initialize with pnpm init (if not already done)\n- Set up TypeScript with strict mode\n- Install OpenTUI dependencies (@opentui/core, @opentui/react)\n- Install Zig (required by OpenTUI) or document requirement\n- Set up directory structure: src/, src/commands/, src/tui/, src/plugins/agents/, src/plugins/trackers/\n- Add tsconfig.json with proper config\n- Add build scripts in package.json\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:39:43.042076624Z","created_by":"Subsy","updated_at":"2026-01-11T11:21:01.897703261Z","closed_at":"2026-01-11T11:21:01.897703261Z","close_reason":"Project scaffolding complete: pnpm init, TypeScript strict mode, OpenTUI deps, directory structure (src/commands, src/tui, src/plugins/agents, src/plugins/trackers), ESLint 9 flat config, build/typecheck/lint scripts all passing","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.1","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:39:43.042804326Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.10","title":"US-010: Beads + Beads Viewer Tracker Plugin (Smart Mode)","description":"As a user, I want a Beads+BV tracker plugin for smart dependency-aware task selection.\n\n## Acceptance Criteria\n- Implement TrackerPlugin interface extending Beads tracker\n- detect(): Check for .beads/ directory, bd binary, and bv binary\n- getNextTask(): Execute bv --robot-triage, filter for epic children\n- Parse JSON output for recommendations with scores and reasons\n- Select unblocked tasks first based on bv scoring\n- Provide \"why this task\" reasoning to TUI via getTaskReasoning()\n- Fall back to beads-only behavior if bv unavailable\n- Bidirectional: sync local changes back to beads\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:09.965727759Z","created_by":"Subsy","updated_at":"2026-01-11T13:55:42.585209209Z","closed_at":"2026-01-11T13:55:42.585209209Z","close_reason":"Implemented BeadsBvTrackerPlugin with bv --robot-triage integration, PageRank-based task selection, reasoning exposure, and graceful fallback to beads-only when bv unavailable","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.10","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:09.966227113Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.10","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-01-11T10:43:09.9671895Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.10","depends_on_id":"ralph-tui-45r.9","type":"blocks","created_at":"2026-01-11T10:43:09.96785649Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.11","title":"US-011: Core TUI Layout with OpenTUI React","description":"As a user, I want a well-organized TUI layout so I can see all relevant information at a glance.\n\n## Acceptance Criteria\n- Use OpenTUI framework with React reconciler (@opentui/core, @opentui/react)\n- Header: Ralph status, epic/project name, elapsed time, tracker name\n- Left panel: Task list with status indicators (done/active/pending/blocked)\n- Right panel: Current iteration details or selected task details\n- Footer: Keyboard shortcuts, progress bar\n- Responsive layout that adapts to terminal size\n- Styled components using OpenTUI primitives\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:28.944816892Z","created_by":"Subsy","updated_at":"2026-01-11T12:01:33.059108169Z","closed_at":"2026-01-11T12:01:33.059108169Z","close_reason":"Implemented core TUI layout with OpenTUI React: Header, Footer, LeftPanel, RightPanel components with responsive layout, Tokyo Night theme, and keyboard navigation. Verified in terminal.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.11","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:28.945708816Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.11","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:43:28.947400692Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.12","title":"US-012: Task List View","description":"As a user, I want to see all tasks in the loop with their status so I can understand overall progress.\n\n## Acceptance Criteria\n- List all tasks from active tracker plugin\n- Status indicators: ✓ (done), ▶ (active), ○ (pending), ⊘ (blocked)\n- Show task ID and title (truncated to fit)\n- Highlight currently active task\n- Keyboard navigation (j/k or arrows)\n- Press Enter to drill into task details\n- Show task count: \"5/12 complete\"\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:29.161985335Z","created_by":"Subsy","updated_at":"2026-01-11T12:46:54.687838157Z","closed_at":"2026-01-11T12:46:54.687838157Z","close_reason":"Implemented Task List View with status indicators (✓/▶/○/⊘), task ID display with truncation, X/Y complete counter in footer, and Enter key navigation for task details - Verified in terminal","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.12","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:29.162811336Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.12","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-01-11T10:43:29.164345433Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.13","title":"US-013: Task Detail View","description":"As a user, I want to drill into task details so I can see full description and acceptance criteria.\n\n## Acceptance Criteria\n- Show full task title and ID\n- Show complete description (scrollable if long)\n- Show acceptance criteria as checklist\n- Show priority and labels/tags\n- Show dependencies (blocked by / blocks) - if tracker supports it\n- Show completion notes if closed\n- Press Esc to return to list view\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:29.382186357Z","created_by":"Subsy","updated_at":"2026-01-11T14:09:56.952480903Z","closed_at":"2026-01-11T14:09:56.952480903Z","close_reason":"Implemented Task Detail View with full task details display, acceptance criteria checklist, dependency visualization, and Esc navigation to return to list","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.13","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:29.382736236Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.13","depends_on_id":"ralph-tui-45r.12","type":"blocks","created_at":"2026-01-11T10:43:29.38377608Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.14","title":"US-014: Iteration History View","description":"As a user, I want to see all iterations with key events so I can track what happened in each.\n\n## Acceptance Criteria\n- List all iterations: \"Iteration 1 of 10\"\n- Show iteration status: completed/running/pending\n- Show task worked on in each iteration\n- Show duration of each iteration\n- Show outcome: success/failure/interrupted\n- Keyboard navigation through iterations\n- Press Enter to drill into iteration details\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:29.551507696Z","created_by":"Subsy","updated_at":"2026-01-11T12:52:37.163307314Z","closed_at":"2026-01-11T12:52:37.163307314Z","close_reason":"Implemented Iteration History View with status indicators, duration, task ID, outcome display. Added keyboard navigation, i key toggle, Enter drill-down.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.14","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:29.552243856Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.14","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-01-11T10:43:29.553939188Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.15","title":"US-015: Iteration Detail View","description":"As a user, I want to drill into iteration details to see agent output and key events.\n\n## Acceptance Criteria\n- Show iteration number and status\n- Show task ID and title worked on\n- Show start time, end time, duration\n- Show key events timeline (task started, commit made, task closed, etc.)\n- Show agent output (scrollable, potentially large)\n- Syntax highlighting for code blocks in output\n- Link to persisted output file\n- Press Esc to return to iteration list\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:45.934584402Z","created_by":"Subsy","updated_at":"2026-01-11T14:15:36.331527026Z","closed_at":"2026-01-11T14:15:36.331527026Z","close_reason":"Implemented IterationDetailView with: iteration metadata (number, status, task), timing info (start/end/duration), events timeline, scrollable agent output with syntax highlighting, persisted output file link, Esc to return navigation","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.15","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:45.935321735Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.15","depends_on_id":"ralph-tui-45r.14","type":"blocks","created_at":"2026-01-11T10:43:45.936888624Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.16","title":"US-016: Progress Dashboard","description":"As a user, I want to see overall progress and time estimates so I know how the run is going.\n\n## Acceptance Criteria\n- Show progress bar: tasks completed / total tasks\n- Show iteration progress: current / max iterations\n- Show elapsed time since start\n- Calculate and show estimated time remaining based on average iteration time\n- Show current status: Running / Paused / Completed / Failed\n- Show agent name and tracker name in use\n- Auto-update every second when running\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:46.149575869Z","created_by":"Subsy","updated_at":"2026-01-11T14:21:06.766512309Z","closed_at":"2026-01-11T14:21:06.766512309Z","close_reason":"Implemented Progress Dashboard with task/iteration progress bars, elapsed time, ETA calculation, status display, agent/tracker names, and 'd' key toggle","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.16","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:46.150155714Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.16","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-01-11T10:43:46.151384185Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.17","title":"US-017: Pause and Resume","description":"As a user, I want to pause and resume Ralph so I can take breaks or handle interruptions.\n\n## Acceptance Criteria\n- Press p to pause after current iteration completes\n- Show \"Pausing after current iteration...\" status\n- Show \"Paused\" status when paused\n- Press p again to resume\n- State persisted to session file\n- Can quit while paused and resume later with ralph-tui resume\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:46.328809679Z","created_by":"Subsy","updated_at":"2026-01-11T14:27:28.538117621Z","closed_at":"2026-01-11T14:27:28.538117621Z","close_reason":"Implemented pause/resume: 'p' to pause after iteration, 'p' again to resume. State persisted to session file for ralph-tui resume.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.17","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:46.329632152Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.17","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-01-11T10:43:46.331289963Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.18","title":"US-018: Graceful Interruption","description":"As a user, I want to interrupt Ralph with confirmation so I don't accidentally lose work.\n\n## Acceptance Criteria\n- Press Ctrl+C shows confirmation dialog\n- Dialog: \"Interrupt Ralph? Current iteration will be terminated. [y/N]\"\n- Press y to confirm: send SIGINT to agent, save state, exit\n- Press n or Esc to cancel and continue\n- Press Ctrl+C twice quickly to force quit immediately\n- Agent process is properly terminated\n- Session state saved before exit\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:46.50322632Z","created_by":"Subsy","updated_at":"2026-01-11T14:34:39.021078383Z","closed_at":"2026-01-11T14:34:39.021078383Z","close_reason":"Implemented graceful Ctrl+C interruption with confirmation dialog, double-press force quit, state persistence, and proper agent termination","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.18","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:46.503807397Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.18","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-01-11T10:43:46.504951358Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.19","title":"US-019: Session Persistence","description":"As a user, I want Ralph to save session state so I can resume interrupted runs.\n\n## Acceptance Criteria\n- Session file: .ralph-tui-session.json in project root\n- Save: current iteration, task statuses, start time, pause state, tracker state\n- Save after each iteration completes\n- ralph-tui resume command to continue from saved state\n- ralph-tui status command to check if resumable session exists\n- Prompt to resume or start fresh when existing session found\n- Clean up session file on successful completion\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:02.619503745Z","created_by":"Subsy","updated_at":"2026-01-11T12:59:42.410158876Z","closed_at":"2026-01-11T12:59:42.410158876Z","close_reason":"Implemented session persistence with .ralph-tui-session.json, resume command, status command, and automatic cleanup on completion","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.19","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:02.620096164Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.19","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:44:02.621585617Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.2","title":"US-002: Configuration System","description":"As a developer, I want a configuration system that supports global defaults and per-project settings so Ralph remembers my preferences.\n\n## Acceptance Criteria\n- Global config at ~/.config/ralph-tui/config.yaml\n- Project config at .ralph-tui.yaml in project root\n- Project config overrides global config\n- Config schema includes: tracker, tracker_options, agent, agent_options, max_iterations, auto_commit\n- Config validation with helpful error messages using Zod\n- ralph-tui config show command displays merged configuration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:41:43.604394295Z","created_by":"Subsy","updated_at":"2026-01-11T13:42:40.775563082Z","closed_at":"2026-01-11T13:42:40.775563082Z","close_reason":"Implemented config system with Zod validation, project-level .ralph-tui.yaml support, and config show command","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.2","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:41:43.605078776Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.2","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:41:43.606647705Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.20","title":"US-020: Iteration Output Persistence","description":"As a user, I want iteration output saved to files so I can review them later.\n\n## Acceptance Criteria\n- Create .ralph-tui/iterations/ directory in project root\n- Save each iteration output to iteration-{N}-{taskId}.log\n- Include: timestamp, task details, full agent stdout/stderr, duration, outcome\n- Structured header with metadata, raw output below\n- ralph-tui logs command to list/view past iteration logs\n- ralph-tui logs --iteration 5 to view specific iteration\n- ralph-tui logs --task US-005 to view iterations for a task\n- Clean up old logs with ralph-tui logs --clean --keep 10\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:02.810594718Z","created_by":"Subsy","updated_at":"2026-01-11T15:24:28.599122516Z","closed_at":"2026-01-11T15:24:28.599122516Z","close_reason":"Implemented iteration output persistence to .ralph-tui/iterations/ with structured logs, ralph-tui logs command for list/view/filter/clean","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.20","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:02.811107787Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.20","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:44:02.812252529Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.21","title":"US-021: Single Instance Lock","description":"As a user, I want Ralph to prevent concurrent runs in the same git repository so I don't corrupt state.\n\n## Acceptance Criteria\n- Create lock file .ralph-tui.lock when starting\n- Lock file contains: PID, start time, session ID\n- Check for existing lock on startup\n- If lock exists, check if PID is still running\n- If running: error with \"Ralph already running in this repo (PID: X)\"\n- If stale lock: warn and offer to remove\n- Remove lock file on clean exit\n- Remove lock file on crash recovery\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:12.71020759Z","created_by":"Subsy","updated_at":"2026-01-11T15:29:12.934227607Z","closed_at":"2026-01-11T15:29:12.934227607Z","close_reason":"Implemented single instance lock with proper error messages, stale lock detection with interactive prompt, and crash recovery handlers","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.21","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:12.711375907Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.21","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:44:12.713234778Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.22","title":"US-022: Execution Engine","description":"As a developer, I want a robust execution engine that runs agent iterations so the loop is reliable.\n\n## Acceptance Criteria\n- Iteration loop: select task (via tracker) → inject prompt → run agent → check result → update tracker\n- Parse agent output for completion signals (\u003cpromise\u003eCOMPLETE\u003c/promise\u003e or tracker-specific)\n- Handle agent errors gracefully (retry? skip? abort?)\n- Respect max iterations limit\n- Emit events for TUI to consume (task started, task completed, iteration done, etc.)\n- Configurable inter-iteration delay\n- Save iteration output to file after each iteration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:25.065085012Z","created_by":"Subsy","updated_at":"2026-01-11T12:37:36.69208703Z","closed_at":"2026-01-11T12:37:36.69208703Z","close_reason":"Added error handling strategies (retry/skip/abort), ErrorHandlingConfig, CLI overrides, new events (iteration:retrying, iteration:skipped), and isTaskReady() interface method","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.22","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:25.065897677Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.22","depends_on_id":"ralph-tui-45r.4","type":"blocks","created_at":"2026-01-11T10:44:25.067555328Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.22","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-01-11T10:44:25.068692125Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.23","title":"US-023: Prompt Template System","description":"As a user, I want customizable prompt templates so I can tailor agent instructions to my project.\n\n## Acceptance Criteria\n- Default templates bundled in package (one per tracker type)\n- Custom template path in config: prompt_template: ./my-prompt.md\n- Template variables: {{taskId}}, {{taskTitle}}, {{taskDescription}}, {{acceptanceCriteria}}, {{epicId}}, {{epicTitle}}, {{trackerName}}\n- Use Handlebars template engine\n- ralph-tui template show to display current template\n- ralph-tui template init to copy default template for customization\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:25.265428634Z","created_by":"Subsy","updated_at":"2026-01-11T15:36:31.27528751Z","closed_at":"2026-01-11T15:36:31.27528751Z","close_reason":"Implemented Handlebars template system with default templates for each tracker, custom template config, template show/init commands","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.23","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:25.266119448Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.23","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:44:25.267508572Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.24","title":"US-024: PRD Creation Command","description":"As a user, I want to create a PRD from a feature description so I can start a new Ralph project.\n\n## Acceptance Criteria\n- ralph-tui init command starts interactive PRD creation\n- Prompt for feature description\n- Ask 3-5 clarifying questions (similar to PRD skill)\n- Generate markdown PRD following the standard format\n- Save to ./tasks/prd-[feature-name].md\n- Option to immediately convert to target tracker format\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","notes":"Implemented interactive PRD creation wizard with init command, 5 clarifying questions, markdown and prd.json output","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:43.569032801Z","created_by":"Subsy","updated_at":"2026-01-11T15:50:35.768649838Z","closed_at":"2026-01-11T15:50:35.768652173Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.24","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:43.569678351Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.24","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:44:43.571113321Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.25","title":"US-025: PRD to JSON Conversion","description":"As a user, I want to convert a markdown PRD to prd.json so I can use the JSON tracking mode.\n\n## Acceptance Criteria\n- ralph-tui convert --to json ./tasks/prd-feature.md\n- Parse user stories from markdown (US-XXX sections)\n- Extract title, description, acceptance criteria\n- Assign priorities based on story order (1, 2, 3...)\n- Generate valid prd.json with passes: false for all\n- Prompt for branch name\n- Save to ./prd.json or custom path\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:43.772859798Z","created_by":"Subsy","updated_at":"2026-01-11T15:55:07.506973615Z","closed_at":"2026-01-11T15:55:07.506973615Z","close_reason":"Implemented PRD to JSON conversion command with markdown parser for US-XXX sections","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.25","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:43.773393075Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.25","depends_on_id":"ralph-tui-45r.8","type":"blocks","created_at":"2026-01-11T10:44:43.774662412Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.26","title":"US-026: PRD to Beads Conversion","description":"As a user, I want to convert a markdown PRD to Beads issues so I can use the beads tracking mode.\n\n## Acceptance Criteria\n- ralph-tui convert --to beads ./tasks/prd-feature.md\n- Parse user stories from markdown\n- Create epic bead for the feature\n- Create child beads for each user story\n- Set up dependencies based on story order or explicit deps\n- Apply ralph label to all created beads\n- Run bd sync after creation\n- Display created bead IDs\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:43.974225436Z","created_by":"Subsy","updated_at":"2026-01-11T16:00:21.967036926Z","closed_at":"2026-01-11T16:00:21.967036926Z","close_reason":"Implemented beads format support in convert command - creates epic and child beads from markdown PRD with labels, dependencies, and sync","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.26","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:43.974776868Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.26","depends_on_id":"ralph-tui-45r.9","type":"blocks","created_at":"2026-01-11T10:44:43.976138399Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.27","title":"US-027: Run Command","description":"As a user, I want a simple run command to start Ralph so I can begin working.\n\n## Acceptance Criteria\n- ralph-tui run starts execution with current config\n- ralph-tui run --epic EPIC_ID to specify epic (beads trackers)\n- ralph-tui run --prd ./prd.json to specify prd file (json tracker)\n- ralph-tui run --agent claude --model opus to override agent settings\n- ralph-tui run --tracker beads-bv to override tracker\n- ralph-tui run --iterations 20 to override max iterations\n- Check for existing session and prompt to resume or start fresh\n- Check for existing lock and error if running\n- Validate configuration before starting\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:44.181268125Z","created_by":"Subsy","updated_at":"2026-01-11T12:26:33.132046109Z","closed_at":"2026-01-11T12:26:33.132046109Z","close_reason":"Implemented run command with CLI argument parsing, configuration system, session/lock management, and execution engine integration with TUI","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.27","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:44:44.181768721Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.27","depends_on_id":"ralph-tui-45r.22","type":"blocks","created_at":"2026-01-11T10:44:44.182961533Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.27","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-01-11T10:44:44.183932768Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.28","title":"US-028: Status Command (Headless)","description":"As a user, I want a status command for CI/scripts so I can check Ralph status without the TUI.\n\n## Acceptance Criteria\n- ralph-tui status shows current run status (JSON output with --json)\n- Show: running/paused/completed/no-session\n- Show task progress: 5/12 completed\n- Show current iteration: 3/10\n- Show elapsed time\n- Show active tracker and agent\n- Exit code: 0 (completed), 1 (running/paused), 2 (failed)\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","notes":"Implemented headless status command with --json flag, proper exit codes (0/1/2), lock check, progress display, and updated CLI help","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.243473472Z","created_by":"Subsy","updated_at":"2026-01-11T16:04:36.025371481Z","closed_at":"2026-01-11T16:04:36.025374016Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.28","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:45:01.244055712Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.28","depends_on_id":"ralph-tui-45r.19","type":"blocks","created_at":"2026-01-11T10:45:01.245608284Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.29","title":"US-029: Log Output Mode","description":"As a user, I want a non-interactive log mode for CI/scripts so I can run Ralph headlessly.\n\n## Acceptance Criteria\n- ralph-tui run --no-tui runs without TUI\n- Stream structured log output to stdout\n- Log format: [timestamp] [level] [component] message\n- Progress updates: [INFO] [progress] Iteration 3/10: Working on US-005\n- Agent output streamed with [AGENT] prefix\n- Supports all the same flags as TUI mode\n- Still saves iteration output to files\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.446594763Z","created_by":"Subsy","updated_at":"2026-01-11T16:09:17.359318182Z","closed_at":"2026-01-11T16:09:17.359318182Z","close_reason":"Implemented --no-tui flag with structured log output: [timestamp] [level] [component] message format, progress updates, agent output with [AGENT] prefix","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.29","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:45:01.44716465Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.29","depends_on_id":"ralph-tui-45r.27","type":"blocks","created_at":"2026-01-11T10:45:01.448457211Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.3","title":"US-003: Interactive Project Setup","description":"As a user running Ralph in a new project, I want to be asked setup questions so I can configure Ralph for my project.\n\n## Acceptance Criteria\n- Detect when no .ralph-tui.yaml exists in current directory\n- Prompt: \"Which issue tracker?\" (list installed tracker plugins)\n- Show tracker-specific follow-up questions (e.g., epic ID for beads)\n- Prompt: \"Which agent CLI?\" with auto-detection of installed agents\n- Prompt: \"Max iterations per run?\" (default: 10)\n- Prompt: \"Auto-commit on task completion?\" (yes/no)\n- Save answers to .ralph-tui.yaml\n- Option to skip setup with --no-setup flag\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:09.255718369Z","created_by":"Subsy","updated_at":"2026-01-11T13:50:39.481304874Z","closed_at":"2026-01-11T13:50:39.481304874Z","close_reason":"Implemented interactive setup wizard with tracker/agent detection, follow-up questions, and YAML config generation","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.3","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:42:09.256436814Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.3","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:42:09.257759559Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.30","title":"US-030: Help and Documentation","description":"As a user, I want comprehensive help so I can learn how to use Ralph.\n\n## Acceptance Criteria\n- ralph-tui --help shows all commands with descriptions\n- ralph-tui \u003ccommand\u003e --help shows command-specific help\n- ralph-tui plugins --help shows plugin management help\n- ralph-tui docs opens documentation in browser (or shows URL)\n- In-TUI help: press ? to show keyboard shortcuts\n- README.md with installation, quick start, configuration reference\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.641739301Z","created_by":"Subsy","updated_at":"2026-01-11T16:51:29.984964153Z","closed_at":"2026-01-11T16:51:29.984964153Z","close_reason":"Implemented comprehensive help and documentation: --help flags on all commands, docs command to open browser, in-TUI help overlay with ? key showing keyboard shortcuts","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.30","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:45:01.643048603Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.30","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:45:01.645216377Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.31","title":"US-031: npm Package Configuration","description":"As a developer, I want proper npm package setup so users can easily install Ralph.\n\n## Acceptance Criteria\n- package.json with proper name, version, bin fields\n- Binary entry point: bin: { \"ralph-tui\": \"./dist/cli.js\" }\n- Shebang in CLI entry: #!/usr/bin/env node\n- files field to include only necessary files\n- engines field specifying Node.js version requirement\n- npm pack produces valid tarball\n- npm install -g . works locally\n- npx ralph-tui --help works\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.848123434Z","created_by":"Subsy","updated_at":"2026-01-11T15:41:33.200496974Z","closed_at":"2026-01-11T15:41:33.200496974Z","close_reason":"Configured npm package: bin=ralph-tui, shebang=bun, engines=bun\u003e=1.0.0. Verified build, pack, link, and bunx work.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.31","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:45:01.849260491Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.31","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:45:01.850763109Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.33","title":"US-032: README and OSS Documentation","description":"As a potential user or contributor, I want comprehensive README documentation so I can understand and use Ralph TUI.\n\n## Acceptance Criteria\n- Create README.md in repo root with:\n - Project description and goals\n - Features list\n - Installation instructions (npm install -g ralph-tui)\n - Quick start guide\n - Configuration options\n - Usage examples for different trackers (beads, json)\n - Usage examples for different agents (claude, opencode)\n - CLI command reference\n - Contributing guidelines section\n - License section (MIT)\n- Add LICENSE file with MIT license text\n- Add CONTRIBUTING.md with basic contribution guidelines\n- Ensure all documentation is accurate for current implementation","notes":"Created README.md with comprehensive documentation (features, installation, CLI reference, configuration, usage examples), LICENSE with MIT text, and CONTRIBUTING.md with development guidelines","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T13:05:15.027695089Z","created_by":"Subsy","updated_at":"2026-01-11T15:45:17.334212682Z","closed_at":"2026-01-11T15:45:17.334215236Z","labels":["docs","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.33","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T13:05:15.028722377Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.35","title":"BUG: Fix incorrect docs URL pointing to anthropics/ralph-tui","description":"The `ralph-tui docs` command opens the wrong URL.\n\n## Current Behavior\nOpens: https://github.com/anthropics/ralph-tui#readme\n\n## Expected Behavior\nShould open the correct repository URL (subsy/ralph-tui or detect from git remote).\n\n## Steps to Reproduce\n```bash\nbunx ralph-tui docs\n```\n\n## Acceptance Criteria\n- [ ] Fix hardcoded URL in docs command\n- [ ] Either use correct repo URL or detect from git remote origin\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T19:37:44.536185942Z","created_by":"Subsy","updated_at":"2026-01-11T20:34:20.335349013Z","closed_at":"2026-01-11T20:34:20.335349013Z","close_reason":"Fixed incorrect docs URL by detecting repo from git remote origin. Handles both SSH and HTTPS URLs, falls back to subsy/ralph-tui when not in git repo.","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.35","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T19:37:44.540282983Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.36","title":"BUG: TUI should not close automatically - only by user command","description":"The TUI closes on its own unexpectedly. It should only close when the user explicitly requests it (q, Ctrl+C with confirmation, etc).\n\n## Current Behavior\nTUI closes automatically (possibly after no tasks found or some error condition)\n\n## Expected Behavior\nTUI should remain open and display status/errors, only closing on explicit user action.\n\n## Acceptance Criteria\n- [ ] TUI stays open even when no tasks are found\n- [ ] TUI stays open on errors (displays error in UI)\n- [ ] TUI only closes on: q key, Ctrl+C (with confirmation), or explicit quit action\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","notes":"TUI now stays open after engine stops (all tasks done, no tasks, max iterations, or error). Added 'complete' and 'idle' status types for clear UX. TUI only closes on explicit user action (q/Ctrl+C).","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T20:12:13.848148688Z","created_by":"Subsy","updated_at":"2026-01-11T20:42:50.268748608Z","closed_at":"2026-01-11T20:42:50.268753177Z","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.36","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T20:12:13.848740495Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.37","title":"BUG: TUI should show in_progress tasks","description":"The TUI only fetches tasks with status 'open', missing tasks that are 'in_progress'.\n\n## Current Behavior\nTUI filters for status=['open'] only, showing \"No tasks\" when all tasks are in_progress or closed.\n\n## Expected Behavior\nTUI should show tasks with status 'open' OR 'in_progress'.\n\n## Acceptance Criteria\n- [ ] Tracker getTasks() includes both 'open' and 'in_progress' statuses\n- [ ] in_progress tasks displayed in task list\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T20:12:14.163460658Z","created_by":"Subsy","updated_at":"2026-01-11T20:37:44.052155128Z","closed_at":"2026-01-11T20:37:44.052155128Z","close_reason":"Added tasks array to engine:started event, implemented status mapping in RunApp to display both open and in_progress tasks on TUI startup","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.37","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T20:12:14.164062613Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.38","title":"FEAT: Show closed tasks greyed out in TUI for drill-down","description":"Users want to see closed tasks in the TUI so they can observe completed work and drill down into iteration history.\n\n## Current Behavior\nClosed tasks are not displayed in the TUI task list.\n\n## Expected Behavior\nClosed tasks should be shown in the task list, greyed out, and users should be able to drill down into their details and iteration history.\n\n## Acceptance Criteria\n- [ ] Closed tasks appear in task list with greyed out styling\n- [ ] Closed tasks are visually distinct from open/in_progress tasks\n- [ ] Users can select closed tasks and view their details\n- [ ] Users can drill down into closed task iteration history\n- [ ] Consider toggle/filter to show/hide closed tasks\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T20:12:14.487349691Z","created_by":"Subsy","updated_at":"2026-01-11T20:48:36.786702513Z","closed_at":"2026-01-11T20:48:36.786702513Z","close_reason":"Implemented closed tasks display with greyed-out styling, 'h' key toggle filter, drill-down support","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.38","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T20:12:14.488046165Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.39","title":"FEAT: Show epic hierarchy in task list with indented children","description":"The task list should display epics with their child tasks in a hierarchical view, making it easy to see the structure of work.\n\n## Current Behavior\nTask list shows a flat list of tasks without hierarchy indication.\n\n## Expected Behavior\n- Epics appear as parent items in the task list\n- Child tasks appear indented under their parent epic\n- In beads mode, all open epics should be shown (not just filtered by config epicId)\n- Visual distinction between epic rows and child task rows\n\n## Implementation Notes\n- Modify LeftPanel component to render hierarchical structure\n- Update getTasks to fetch epics + children grouped together\n- Add indentation styling for child tasks (2-4 spaces or tree lines)\n- Epic rows could use different styling (bold, different icon)\n\n## Acceptance Criteria\n- [ ] Epics display as top-level items in task list\n- [ ] Child tasks display indented under their parent epic\n- [ ] All open epics are visible when using beads tracker (not filtered to single epicId)\n- [ ] Visual distinction between epic and child task rows\n- [ ] Collapsed/expanded state for epics (optional, nice-to-have)\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:04:08.636626155Z","created_by":"Subsy","updated_at":"2026-01-11T22:51:11.064656319Z","closed_at":"2026-01-11T22:51:11.064656319Z","close_reason":"Added epic hierarchy display: parentId field in TaskItem, buildIndentMap() helper, TaskRow indentation with 2 spaces per level. Children tasks display indented under their parent epic.","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.39","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:04:08.6373499Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.4","title":"US-004: Agent Plugin Architecture","description":"As a developer, I want a plugin system for agent providers so I can easily add support for new AI agent CLIs.\n\n## Acceptance Criteria\n- Define AgentPlugin TypeScript interface: name, detect(), execute(prompt, files), interrupt()\n- Plugin discovery from ~/.config/ralph-tui/plugins/agents/ directory\n- Built-in plugins: claude, opencode\n- Plugin config in yaml: command path, default flags, timeout\n- Plugins are separate TypeScript modules that implement the interface\n- ralph-tui plugins agents shows available agent plugins\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:35.882797784Z","created_by":"Subsy","updated_at":"2026-01-11T12:17:52.84847224Z","closed_at":"2026-01-11T12:17:52.84847224Z","close_reason":"Implemented agent plugin architecture: AgentPlugin interface (name, detect, execute, interrupt), AgentRegistry singleton, plugin discovery from ~/.config/ralph-tui/plugins/agents/, built-in claude and opencode stubs, YAML config support, and 'ralph-tui plugins agents' CLI command. All quality checks pass.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.4","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:42:35.883847824Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.4","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:42:35.885460657Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.40","title":"FEAT: Select epic from TUI to start Ralph run","description":"Users should be able to select any epic from the task list to start a Ralph run on that epic, without needing to specify --epic on the command line.\n\n## Current Behavior\n- Ralph run uses the epicId from config file (.ralph-tui.yaml)\n- No way to switch epics from within the TUI\n- Must restart with different --epic flag to work on different epic\n\n## Expected Behavior\n- TUI shows all available epics in the task list\n- User can navigate to an epic and press Enter (or dedicated key) to start a run on it\n- The selected epic becomes the active work context\n- Child tasks of selected epic become the work queue\n\n## User Flow\n1. Launch TUI (no --epic required)\n2. See list of all open epics with their children\n3. Navigate to desired epic\n4. Press Enter or 'r' to \"Run on this epic\"\n5. Ralph starts processing child tasks of selected epic\n\n## Implementation Notes\n- Add \"Run on epic\" action when epic row is selected\n- Update ExecutionEngine to accept runtime epic selection\n- May need new view mode: \"epic selection\" vs \"running\"\n- Store selected epic in session state\n\n## Acceptance Criteria\n- [ ] TUI can launch without --epic flag (shows all open epics)\n- [ ] User can select an epic from the task list\n- [ ] Pressing Enter or 'r' on an epic starts a Ralph run on that epic\n- [ ] Only child tasks of selected epic are processed\n- [ ] Selected epic is displayed in header/status area\n- [ ] Can return to epic selection after run completes\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:04:21.198948672Z","created_by":"Subsy","updated_at":"2026-01-11T22:48:47.845882221Z","closed_at":"2026-01-11T22:48:47.845882221Z","close_reason":"Added epic selection TUI: getEpics() method in TrackerPlugin, EpicSelectionView/App components, run.tsx shows selection when --epic not specified","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.40","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:04:21.200412743Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.40","depends_on_id":"ralph-tui-45r.39","type":"blocks","created_at":"2026-01-11T22:05:03.220002978Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.41","title":"FEAT: Add 'r' keyboard shortcut to refresh task list","description":"Add keyboard shortcut to manually refresh the task list from the tracker.\n\n## Current Behavior\nTask list only updates when engine events occur. No way to manually refresh to see external changes (e.g., tasks closed by another process, new tasks created).\n\n## Expected Behavior\n- Pressing 'r' refreshes the task list from the tracker\n- Visual feedback during refresh (brief loading indicator or status message)\n- Updated task list reflects current tracker state\n\n## Implementation Notes\n- Add 'r' handler in RunApp keyboard handler\n- Call tracker.getTasks() and update state\n- Consider debouncing to prevent rapid refreshes\n- Show brief \"Refreshing...\" status or spinner\n\n## Acceptance Criteria\n- [ ] Pressing 'r' triggers a refresh of the task list\n- [ ] Task list updates to reflect current tracker state\n- [ ] Visual feedback indicates refresh is happening\n- [ ] Works when engine is idle (not running an iteration)\n- [ ] Help overlay (?) shows 'r' shortcut\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","notes":"Added 'r' keyboard shortcut to refresh task list - implemented refreshTasks() method in ExecutionEngine, tasks:refreshed event, and keyboard handler in RunApp","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:07:01.557945341Z","created_by":"Subsy","updated_at":"2026-01-11T23:05:50.013089726Z","closed_at":"2026-01-11T23:05:50.013094064Z","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.41","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:07:01.558622762Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.42","title":"FEAT: Configure all settings from within the TUI","description":"Add ability to view and modify ralph-tui configuration from within the TUI interface.\n\n## Current Behavior\n- Configuration is stored in .ralph-tui.yaml\n- Must edit file manually or re-run setup wizard\n- No way to change settings during a TUI session\n\n## Expected Behavior\n- Settings accessible via keyboard shortcut (e.g., 's' for settings)\n- View current configuration values\n- Modify settings: tracker, agent, epic, labels, max iterations, recipe, etc.\n- Changes persist to .ralph-tui.yaml\n- Some changes may require restart, others apply immediately\n\n## Configurable Settings\n- tracker: beads, beads-bv, json\n- trackerOptions: epicId, beadsDir, labels, recipe\n- agent: claude, opencode\n- agentOptions: model, flags\n- maxIterations\n- autoCommit\n\n## Implementation Notes\n- Add settings view/modal component\n- Implement config writer (symmetric to config reader)\n- Consider which settings can hot-reload vs require restart\n- Form validation for setting values\n\n## Acceptance Criteria\n- [ ] Press 's' opens settings view/modal\n- [ ] All current config values are displayed\n- [ ] Can modify tracker, agent, and related options\n- [ ] Can modify maxIterations\n- [ ] Changes are saved to .ralph-tui.yaml\n- [ ] Invalid values show validation errors\n- [ ] Help overlay (?) shows 's' shortcut\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:11:30.544305286Z","created_by":"Subsy","updated_at":"2026-01-11T23:12:09.16205958Z","closed_at":"2026-01-11T23:12:09.16205958Z","close_reason":"Added SettingsView TUI component with ',' keyboard shortcut, form validation, and config persistence to .ralph-tui.yaml","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.42","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:11:30.544998275Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.43","title":"FEAT: Show all tasks with status indicators (actionable/blocked/closed)","description":"Always show all tasks in an epic with clear visual indicators for their actionability state.\n\n## Current Behavior\n- With `recipe: actionable`, blocked tasks are hidden entirely\n- Users can't see the full picture of work in an epic\n- No visual distinction between actionable and blocked tasks\n\n## Expected Behavior\nAlways show ALL tasks in an epic with distinct visual indicators:\n- **Actionable** (ready to work): Green indicator (e.g., ● or ▶)\n- **Blocked** (has unresolved dependencies): Red/orange indicator (e.g., ⊘) \n- **Closed/Completed**: Greyed out text\n- **In Progress**: Blue/active indicator (e.g., ◐)\n\n## Visual Design\n```\nTasks\n──────────────────────────\n▶ ralph-tui-45r.39 Show epic hierarchy... [actionable]\n⊘ ralph-tui-45r.40 Select epic to start... [blocked by .39]\n▶ ralph-tui-45r.41 Add 'r' refresh shortcut [actionable]\n✓ ralph-tui-45r.36 TUI should not close... [closed - greyed]\n```\n\n## Implementation Notes\n- Fetch ALL tasks regardless of blocked status\n- Query bv or check dependencies to determine blocked state\n- Update LeftPanel to render appropriate indicators\n- Blocked tasks should show what they're blocked by (tooltip or detail view)\n- Consider sorting: actionable first, then blocked, then closed\n\n## Acceptance Criteria\n- [ ] All tasks in epic are shown (not filtered by recipe)\n- [ ] Actionable tasks have distinct green/ready indicator\n- [ ] Blocked tasks have distinct red/orange indicator\n- [ ] Closed tasks are greyed out\n- [ ] In-progress tasks have active indicator\n- [ ] Blocked tasks show their blocker in detail view\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:17:03.533120905Z","created_by":"Subsy","updated_at":"2026-01-11T22:43:17.924473938Z","closed_at":"2026-01-11T22:43:17.924473938Z","close_reason":"Added actionable/blocked status indicators based on dependency resolution. Tasks sorted by status: active → actionable → blocked → closed. Detail view shows blocker titles.","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.43","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:17:03.533832228Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.44","title":"TASK: Remove bv recipe option from tracker settings","description":"Remove the recipe configuration option since the TUI will always show all tasks with visual indicators.\n\n## Context\nWith the implementation of \"Show all tasks with status indicators\" (.43), the recipe filtering is no longer needed. The TUI will always display all tasks and indicate their state visually instead of hiding blocked tasks.\n\n## Changes Required\n1. Remove `recipe` from trackerOptions in config schema\n2. Remove recipe from setup wizard questions\n3. Remove recipe handling from beads-bv tracker (or always use 'default')\n4. Update any documentation mentioning recipe setting\n\n## Files to Modify\n- src/config/types.ts - remove recipe from TrackerOptions\n- src/setup/index.ts - remove recipe question from wizard\n- src/plugins/trackers/builtin/beads-bv.ts - ignore/remove recipe usage\n- .ralph-tui.yaml template - remove recipe line\n\n## Acceptance Criteria\n- [ ] recipe option removed from config schema\n- [ ] Setup wizard no longer asks about recipe\n- [ ] Existing configs with recipe setting don't break (gracefully ignored)\n- [ ] beads-bv tracker fetches all tasks regardless of former recipe setting\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T22:17:14.283975325Z","created_by":"Subsy","updated_at":"2026-01-11T23:15:12.294692746Z","closed_at":"2026-01-11T23:15:12.294692746Z","close_reason":"Removed bv recipe option from beads-bv tracker: deleted useRecipe field, config parsing, setup question, and recipe flag usage in getNextTask and refreshTriage","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.44","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:17:14.284743395Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.44","depends_on_id":"ralph-tui-45r.43","type":"blocks","created_at":"2026-01-11T22:17:18.624846808Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.45","title":"FEAT: TUI should not auto-start engine - wait for user to select and start","description":"The TUI should launch in an interactive \"ready\" state, not immediately start processing tasks. Users select an epic and explicitly start the run.\n\n## Current Behavior\n- TUI launches and immediately calls engine.start()\n- Tasks begin processing automatically\n- No opportunity to review/select before execution\n\n## Expected Behavior\n- TUI launches in \"ready\" or \"idle\" state\n- User sees list of epics/tasks\n- User navigates and selects an epic\n- User presses Enter or dedicated key (e.g., 's' for start) to begin\n- THEN engine.start() is called\n\n## User Flow\n1. Run `ralph-tui run` (or just `ralph-tui`)\n2. TUI shows epic list in idle state\n3. User browses epics, sees task counts, reviews what's available\n4. User selects desired epic\n5. User presses Enter or 's' to start\n6. Engine begins processing selected epic's tasks\n7. After completion, returns to epic selection (or shows results)\n\n## Rationale\n- Headless mode (`--no-tui`) exists for automated/CI runs\n- TUI mode should be interactive and user-controlled\n- Allows review before committing to a run\n- Matches user expectation of GUI applications\n\n## Implementation Notes\n- Remove auto engine.start() from runWithTui\n- Add \"Start\" action on Enter key when epic selected\n- Show \"Ready\" or \"Select epic to start\" in header\n- May need new engine state: 'ready' before 'running'\n- Footer could show \"[Enter] Start [q] Quit [?] Help\"\n\n## Acceptance Criteria\n- [ ] TUI launches without auto-starting the engine\n- [ ] Header shows \"Ready\" or similar idle state\n- [ ] User can browse tasks/epics before starting\n- [ ] Pressing Enter on selected epic starts the run\n- [ ] Engine only starts after explicit user action\n- [ ] Headless mode (--no-tui) still auto-starts as before\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:21:33.190760335Z","created_by":"Subsy","updated_at":"2026-01-11T22:56:00.190832351Z","closed_at":"2026-01-11T22:56:00.190832351Z","close_reason":"TUI now launches in ready state - users press Enter/s to start. Added ready status, updated UI components.","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.45","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:21:33.191461098Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.45","depends_on_id":"ralph-tui-45r.40","type":"blocks","created_at":"2026-01-11T22:21:37.762279172Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.46","title":"BUG: TUI status unclear - can't tell if engine is running or what it's doing","description":"The TUI doesn't clearly communicate what's happening. Users can't tell at a glance if the engine is running, idle, or what task is being processed.\n\n## Current Problem\n- Status indicator not prominent enough\n- When tasks are blocked, unclear if engine is running or stuck\n- No clear \"what's happening RIGHT NOW\" indicator\n- Hard to distinguish between \"running but waiting\" vs \"idle\" vs \"error\"\n\n## User Report\n\"I can only see 4 blocked tasks. I can't tell if anything's running??\"\n\n## Expected Behavior\nAt a glance, user should immediately know:\n1. **Engine state**: Running / Paused / Idle / Error\n2. **Current action**: \"Processing task X\" / \"Waiting for tasks\" / \"All complete\"\n3. **Progress**: X of Y tasks done, iteration N of M\n\n## Proposed UX Improvements\n\n### Header Area (always visible)\n```\n┌─────────────────────────────────────────────────────────┐\n│ ▶ RUNNING Processing: ralph-tui-45r.39 ⏱ 2m 34s │\n│ Task 2/6 │ Iteration 3/10 │ Agent: claude │\n└─────────────────────────────────────────────────────────┘\n```\n\n### Status States (with distinct colors)\n- 🟢 **RUNNING** - Green, animated indicator, shows current task\n- 🟡 **PAUSED** - Yellow, \"Press p to resume\" \n- 🔵 **IDLE** - Blue, \"Select epic and press Enter to start\"\n- 🔴 **ERROR** - Red, shows error message\n- ✅ **COMPLETE** - Green checkmark, \"All tasks done\"\n\n### Current Task Highlight\n- In task list, currently processing task should be VERY obvious\n- Pulsing/animated indicator or highlighted row\n- Show elapsed time on current task\n\n## Acceptance Criteria\n- [ ] Engine state (running/paused/idle/error/complete) clearly visible in header\n- [ ] Current task name shown prominently when running\n- [ ] Progress (tasks done, iterations) always visible\n- [ ] Distinct colors for each state\n- [ ] Currently processing task highlighted in list\n- [ ] \"No actionable tasks\" state clearly communicated\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T22:25:08.957705965Z","created_by":"Subsy","updated_at":"2026-01-11T23:01:57.69602646Z","closed_at":"2026-01-11T23:01:57.69602646Z","close_reason":"Added granular status states (selecting/executing), task ID/title display in Header and ProgressDashboard, clearer status labels","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.46","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:25:08.958304084Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.47","title":"BUG: Tasks stuck in_progress when TUI killed or crashes","description":"When the TUI is killed (Ctrl+C, kill -9, crash), tasks remain in \"in_progress\" status with no way to know they're stale.\n\n## Current Behavior\n- TUI sets task to in_progress when it starts working on it\n- If TUI is killed/crashes, task stays in_progress forever\n- Next TUI launch sees stale in_progress tasks\n- User confusion: \"Is something still running?\"\n\n## Expected Behavior\n- On graceful shutdown: reset in_progress tasks to open (or previous state)\n- On startup: detect stale in_progress from previous crashed session and offer to reset\n- Or: track which session owns the in_progress status\n\n## Possible Solutions\n\n### Option A: Reset on shutdown\n- In gracefulShutdown, reset any in_progress tasks back to open\n- Con: loses info about what was being worked on\n\n### Option B: Session ownership\n- Store session ID with in_progress status\n- On startup, check if session is still active\n- If not, prompt user: \"Found stale in_progress tasks from crashed session. Reset?\"\n\n### Option C: Timeout-based\n- Track when task was set to in_progress\n- If older than X minutes with no activity, consider stale\n\n## Acceptance Criteria\n- [ ] Graceful shutdown resets in_progress tasks to open\n- [ ] Startup detects stale in_progress from dead sessions\n- [ ] User is notified/prompted about stale tasks\n- [ ] No tasks left orphaned in in_progress state\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T22:35:39.295802635Z","created_by":"Subsy","updated_at":"2026-01-11T23:20:43.950431767Z","closed_at":"2026-01-11T23:20:43.950431767Z","close_reason":"Implemented session-owned task tracking with activeTaskIds field. On graceful shutdown, active in_progress tasks are reset back to open. On startup, stale in_progress tasks from crashed sessions are detected and user is prompted to reset them (auto-reset in headless mode).","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.47","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T22:35:39.296641958Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.5","title":"US-005: Tracker Plugin Architecture","description":"As a developer, I want a plugin system for issue trackers so I can easily add support for new tracking backends.\n\n## Acceptance Criteria\n- Define TrackerPlugin TypeScript interface (getTasks, getNextTask, completeTask, isComplete, sync, etc.)\n- Plugin discovery from ~/.config/ralph-tui/plugins/trackers/ directory\n- Built-in plugins: json (default), beads, beads-bv\n- Plugin config in yaml with tracker-specific options\n- Plugins are separate TypeScript modules that implement the interface\n- ralph-tui plugins trackers shows available tracker plugins\n- Each tracker plugin defines its own setup questions\n- Interface supports bidirectional sync for trackers that need it\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:43.561266336Z","created_by":"Subsy","updated_at":"2026-01-11T12:08:59.709254422Z","closed_at":"2026-01-11T12:08:59.709254422Z","close_reason":"Implemented TrackerPlugin interface, plugin registry with discovery, built-in plugin stubs (json, beads, beads-bv), and CLI command for listing trackers","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.5","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:42:43.562337927Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.5","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-01-11T10:42:43.564197565Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.6","title":"US-006: Claude Code Agent Plugin","description":"As a user, I want Ralph to execute iterations using Claude Code CLI so I can use my preferred agent.\n\n## Acceptance Criteria\n- Implement AgentPlugin interface for Claude Code\n- Auto-detect claude binary in PATH using which\n- Execute with -p (print mode), --dangerously-skip-permissions\n- Support --model flag passthrough\n- Capture stdout/stderr and parse for completion signals\n- Handle graceful interruption (send SIGINT via Node child_process)\n- Timeout handling with configurable duration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:53.439215509Z","created_by":"Subsy","updated_at":"2026-01-11T13:59:24.089260013Z","closed_at":"2026-01-11T13:59:24.089260013Z","close_reason":"Implemented Claude Code agent plugin with: binary auto-detection via which, print mode (-p), --dangerously-skip-permissions, --model flag passthrough, file context via --add-dir, timeout handling, and setup questions","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.6","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:42:53.439904378Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.6","depends_on_id":"ralph-tui-45r.4","type":"blocks","created_at":"2026-01-11T10:42:53.441386584Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.7","title":"US-007: OpenCode Agent Plugin","description":"As a user, I want Ralph to execute iterations using OpenCode CLI so I can use my preferred agent.\n\n## Acceptance Criteria\n- Implement AgentPlugin interface for OpenCode\n- Auto-detect opencode binary in PATH\n- Execute with opencode run --agent general\n- Support --model and --file flag passthrough\n- Capture stdout/stderr and parse for completion signals\n- Handle graceful interruption\n- Timeout handling with configurable duration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:53.635617693Z","created_by":"Subsy","updated_at":"2026-01-11T14:04:00.983088472Z","closed_at":"2026-01-11T14:04:00.983088472Z","close_reason":"Implemented OpenCode AgentPlugin with: detect() using which+--version, buildArgs() for opencode run --agent syntax, --model/--file passthrough, timeout handling, setup questions and validation","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.7","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:42:53.63630024Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.7","depends_on_id":"ralph-tui-45r.4","type":"blocks","created_at":"2026-01-11T10:42:53.637637212Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.8","title":"US-008: JSON Tracker Plugin (prd.json)","description":"As a user, I want a JSON file tracker as the default so I can use the simpler file-based tracking mode.\n\n## Acceptance Criteria\n- Implement TrackerPlugin interface for JSON\n- Set as default tracker when no tracker specified\n- Parse prd.json file format\n- getTasks(): Read user stories with id, title, description, acceptanceCriteria, priority, passes\n- getNextTask(): Select highest priority where passes: false\n- completeTask(): Update passes: true in file\n- isComplete(): Check all stories have passes: true\n- Setup questions: path to prd.json, branch name\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:09.615923641Z","created_by":"Subsy","updated_at":"2026-01-11T12:41:59.720072089Z","closed_at":"2026-01-11T12:41:59.720072089Z","close_reason":"Implemented full JSON tracker plugin with prd.json format support, file I/O with caching, task CRUD operations, dependency support, and setup questions for path/branch configuration","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.8","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:09.616459293Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.8","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-01-11T10:43:09.617455425Z","created_by":"Subsy"}]} -{"id":"ralph-tui-45r.9","title":"US-009: Beads Tracker Plugin","description":"As a user, I want a Beads tracker plugin so I can use the git-native issue tracker.\n\n## Acceptance Criteria\n- Implement TrackerPlugin interface for Beads\n- detect(): Check for .beads/ directory and bd binary\n- getTasks(): Execute bd list --parent=EPIC --status=open --json\n- getNextTask(): Select first open task by priority\n- getTaskDetail(): Execute bd show ID\n- completeTask(): Execute bd update ID --status=closed\n- isComplete(): Check all epic children are closed\n- Bidirectional: sync local changes back to beads\n- Setup questions: epic ID\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:09.800786069Z","created_by":"Subsy","updated_at":"2026-01-11T12:29:57.763498023Z","closed_at":"2026-01-11T12:29:57.763499856Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.9","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-01-11T10:43:09.801315469Z","created_by":"Subsy"},{"issue_id":"ralph-tui-45r.9","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-01-11T10:43:09.802350765Z","created_by":"Subsy"}]} -{"id":"ralph-tui-488","title":"US-009: Missing Tool Guidance","description":"## User Story\nAs a user without clipboard tools installed, I want helpful guidance on how to install them so that I can enable image paste support.\n\n## Acceptance Criteria\n- [ ] Detect missing tools on startup (non-blocking check)\n- [ ] On first paste attempt without tools, show actionable message:\n - macOS: \"Install pngpaste for image support: `brew install pngpaste`\"\n - Linux: \"Install xclip for image support: `sudo apt install xclip`\"\n - Windows: (PowerShell built-in, handle edge cases)\n- [ ] Message shown only once per session\n- [ ] Image paste gracefully degrades (text paste still works)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-002: Platform Clipboard Abstraction (ralph-tui-kha)\n\n## Estimate\n1 point","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:56.015096+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-488","depends_on_id":"ralph-tui-kha","type":"blocks","created_at":"2026-01-16T21:13:56.016529+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-4ie","title":"Story 1.1: Image File Path Detection","description":"## Description\nDetect when pasted text is a valid image file path and handle it as an image attachment rather than plain text.\n\n## Acceptance Criteria\n- [ ] Detect absolute and relative file paths ending in supported extensions: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`\n- [ ] Validate that the file exists on disk before treating as image\n- [ ] Support paths with spaces (quoted or escaped)\n- [ ] Case-insensitive extension matching\n- [ ] If path doesn't exist or isn't an image, paste as raw text (graceful fallback)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create new module: `src/tui/utils/image-detection.ts`\n- Use `Bun.file().exists()` for validation\n- Regex pattern: `/^[\"']?(.+\\.(jpe?g|png|gif|webp))[\"']?$/i`\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:17:58.272573+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-4nb","title":"Remove duplicate progress bar from footer","description":"## User Story\nAs a user viewing the TUI, I want to see progress information in only one place, so that the interface is clean and not redundant.\n\n## Current Behavior\n- Progress bar appears in both the top dashboard and the footer\n- This wastes vertical space and creates visual clutter\n\n## Acceptance Criteria\n- [ ] Remove progress bar from footer component\n- [ ] Footer shows only essential info (keyboard hints, status)\n- [ ] Progress info remains visible in top dashboard\n\n## Technical Notes\n- File: src/tui/components/Footer.tsx\n- The ProgressDashboard already shows task completion progress","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T12:29:05.961703242Z","created_by":"Subsy","updated_at":"2026-01-12T14:01:37.157910018Z","closed_at":"2026-01-12T14:01:37.157910018Z","close_reason":"Removed duplicate progress bar from footer. Progress is now shown only in the top dashboard ProgressDashboard component. Footer simplified to display keyboard shortcuts only.","labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-4nb","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T12:35:11.525391141Z","created_by":"Subsy"}]} -{"id":"ralph-tui-5n7","title":"Test Beads-Rust Tracker Integration","description":"Epic to test ralph-tui beads-rust tracker plugin functionality","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-21T00:47:33.595016482Z","created_by":"plgeek","updated_at":"2026-01-21T00:47:33.595016482Z"} -{"id":"ralph-tui-5rl","title":"Redesign TUI header for clarity and space efficiency","description":"## User Story\nAs a user running Ralph, I want a clean, focused header that shows only essential information, so that I can quickly understand the current state without visual noise.\n\n## Current Behavior\n- Header and ProgressDashboard are cluttered with redundant info\n- Multiple areas showing similar data (status, progress, task info)\n- Wastes valuable vertical screen real estate\n- Hard to scan quickly for the info that matters\n\n## Acceptance Criteria\n- [ ] Single-line or two-line header maximum\n- [ ] Show only: status indicator, current task (if running), progress (X/Y tasks), elapsed time\n- [ ] Remove or consolidate: epic name, tracker name, agent name (move to footer or settings)\n- [ ] Clean typography with clear visual hierarchy\n- [ ] Progress shown as compact 'X/Y' or mini bar, not full dashboard\n- [ ] Consider: make dashboard toggleable (already 'd' key) but off by default\n\n## Technical Notes\n- Files: src/tui/components/Header.tsx, ProgressDashboard.tsx\n- May want to merge Header and ProgressDashboard into single component\n- Preserve info accessibility via settings or help overlay","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T12:29:26.688953288Z","created_by":"Subsy","updated_at":"2026-01-12T13:54:37.706832901Z","closed_at":"2026-01-12T13:54:37.706832901Z","close_reason":"Header redesigned: reduced to 1 line, shows status/task/progress(X/Y)/elapsed. Dashboard off by default. Removed redundant epic/tracker/agent from header.","labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-5rl","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T12:35:11.568535267Z","created_by":"Subsy"}]} -{"id":"ralph-tui-5zr","title":"US-001: Image Storage Manager","description":"## User Story\nAs a developer, I want an image storage service that manages saved clipboard images so that images are stored predictably and duplicates are avoided.\n\n## Acceptance Criteria\n- [ ] Creates `.ralph-tui/images/` directory if it doesn't exist\n- [ ] Saves images with SHA256-prefix naming (`img-{hash12}.png`)\n- [ ] Returns absolute file path after save\n- [ ] Handles duplicate detection (same hash = same file, no re-save)\n- [ ] Provides method to list all session images\n- [ ] Provides method to delete all session images\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Use Node.js `crypto` module for SHA256 hashing\n- Store image metadata in memory for session tracking\n- Consider `.ralph-tui/images/.manifest.json` for persistence across crashes\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:04.034148+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-74q","title":"Image Configuration Options","description":"## Description\nAdd configuration options for image paste behavior.\n\n## Acceptance Criteria\n- [ ] Add `[images]` section to config schema\n- [ ] Support `enabled` boolean (default: true)\n- [ ] Support `cleanup_policy` enum: \"on_exit\" | \"manual\" | \"never\" (default: \"on_exit\")\n- [ ] Support `skip_cleanup_confirmation` boolean (default: false)\n- [ ] Support `max_images_per_message` number (default: 10, 0 = unlimited)\n- [ ] Config readable from both global and project-level config\n- [ ] Project config overrides global config\n- [ ] Add to SettingsView.tsx for UI toggles\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Update `src/config/types.ts` - add to `RalphConfig` type\n- Update `src/config/schema.ts` - add Zod validation\n- Update `src/tui/components/SettingsView.tsx` - add toggles\n\n## Estimate\n2 points","notes":"Implemented image configuration options: added [images] section to config schema with enabled, cleanup_policy, skip_cleanup_confirmation, and max_images_per_message options. Added Zod validation schemas, mergeConfigs support for project config override, and UI toggles in SettingsView. Both typecheck and build pass.","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:21:44.356025+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:56:50.491116+11:00","closed_at":"2026-01-17T02:56:50.491126+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-74q","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.082137+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-77n","title":"Exit Cleanup with Confirmation","description":"## Description\nClean up stored images on exit with user confirmation.\n\n## Acceptance Criteria\n- [ ] On exit, if `cleanup_policy = \"on_exit\"` and images exist, show confirmation:\n ```\n Clean up 3 session images?\n • img-a1b2c3d4e5f6.png\n • img-b2c3d4e5f6a1.png\n [Y] Yes [N] No [A] Always (don't ask again)\n ```\n- [ ] If `skip_cleanup_confirmation = true`, delete without prompting\n- [ ] If `cleanup_policy = \"manual\"` or `\"never\"`, skip cleanup\n- [ ] Handle Ctrl+C / SIGTERM gracefully\n- [ ] \"Always\" option updates config atomically\n- [ ] Don't delete `.ralph-tui/images/` directory itself\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Register cleanup handlers in entry points (`run.tsx`, `create-prd.tsx`, `resume.tsx`)\n- Use `process.on('exit')`, `process.on('SIGINT')`, `process.on('SIGTERM')`\n\n## Dependencies\n- Image Storage Manager (ralph-tui-35v)\n- Image Configuration Options (ralph-tui-74q)\n\n## Estimate\n3 points","notes":"Implemented exit cleanup with user confirmation. Created exit-cleanup.ts utility module with: cleanup confirmation prompt showing image filenames, Yes/No/Always options, atomic config update for 'Always' choice. Integrated cleanup handlers into run.tsx, create-prd.tsx, and resume.tsx entry points. Respects cleanup_policy (on_exit/manual/never) and skip_cleanup_confirmation settings. Handles SIGINT/SIGTERM gracefully. Does not delete .ralph-tui/images/ directory itself - only image files. bun run typecheck and bun run build pass.","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:31.40575+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T03:09:28.134336+11:00","closed_at":"2026-01-17T03:09:28.134343+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-77n","depends_on_id":"ralph-tui-35v","type":"blocks","created_at":"2026-01-16T21:22:31.407303+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-77n","depends_on_id":"ralph-tui-74q","type":"blocks","created_at":"2026-01-16T21:22:31.408579+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-77n","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.396215+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-7pp","title":"Comprehensive Test Suite for Ralph-TUI","description":"Implement a comprehensive test suite using Bun's built-in test runner, targeting 80%+ code coverage across core modules. The test infrastructure will include unit tests, integration tests, CI/CD pipeline with coverage enforcement, and contributor-friendly documentation.\n\n## Success Metrics\n- 80%+ code coverage on core modules (engine, plugins, config)\n- All tests pass in CI before merge\n- Test execution time under 30 seconds for full suite\n- Clear documentation enabling contributors to write tests\n\n## Quality Gates (apply to all stories)\n- bun run typecheck passes\n- bun run lint passes\n- bun run build passes","status":"open","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-15T16:32:19.500032712Z","created_by":"Subsy","updated_at":"2026-01-15T16:32:19.500032712Z","labels":["feature","ralph"]} -{"id":"ralph-tui-7pp.1","title":"US-1: Test Infrastructure Setup","description":"As a developer, I want a properly configured test framework with Bun's test runner so that I can run tests locally and in CI with minimal friction.\n\n## Acceptance Criteria\n- [ ] Bun test runner configured with TypeScript support\n- [ ] `bun test` command runs all tests\n- [ ] `bun test:watch` for development\n- [ ] `bun test:coverage` generates coverage reports\n- [ ] Test configuration in bunfig.toml or package.json\n- [ ] Tests colocated with source files (`*.test.ts`) for discoverability\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Test infrastructure setup complete: Bun test runner configured with TypeScript support, test/test:watch/test:coverage scripts added, bunfig.toml created, sample test file colocated in src/config/types.test.ts, all quality gates pass","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:32:59.205685229Z","created_by":"Subsy","updated_at":"2026-01-15T16:38:40.364684676Z","closed_at":"2026-01-15T16:38:40.364688232Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.1","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:32:59.206577963Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.10","title":"US-10: Testing Documentation","description":"As a contributor, I want clear documentation on writing and running tests so that I can contribute tests effectively.\n\n## Acceptance Criteria\n- [ ] CONTRIBUTING.md section on testing with:\n - How to run tests locally\n - How to write new tests\n - Test file naming conventions\n - Using factories and mocks\n - Coverage requirements\n- [ ] README.md section with:\n - Quick test commands\n - Coverage badge\n - Link to detailed testing docs\n- [ ] Example test file demonstrating patterns\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Added comprehensive testing documentation to CONTRIBUTING.md (test commands, naming conventions, directory structure, factories, mocks, coverage), testing section to README.md with quick commands and link to detailed docs, and example-patterns.test.ts demonstrating all testing patterns.","status":"closed","priority":4,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:06.104107842Z","created_by":"Subsy","updated_at":"2026-01-15T17:32:37.06934348Z","closed_at":"2026-01-15T17:32:37.069347247Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.10","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:06.104780862Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.10","depends_on_id":"ralph-tui-7pp.9","type":"blocks","created_at":"2026-01-15T16:33:30.928025304Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.2","title":"US-2: Test Utilities and Helpers","description":"As a test author, I want shared test utilities, mocks, and factory functions so that I can write tests efficiently without duplicating setup code.\n\n## Acceptance Criteria\n- [ ] `tests/` directory with shared utilities\n- [ ] `tests/fixtures/` for static test data (sample configs, PRD files)\n- [ ] `tests/factories/` with builder functions for complex objects\n- [ ] `tests/mocks/` with reusable mock implementations\n- [ ] Mock implementations for: file system operations, child process spawning, agent responses\n- [ ] Type-safe factory functions for: AgentConfig, TrackerConfig, SessionState, PRDData\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented test utilities: tests/fixtures/ with sample PRD/config files, tests/factories/ with type-safe builders for AgentConfig/TrackerConfig/SessionState/PRDData, tests/mocks/ with file system, child process, and agent response mocks. All quality gates pass.","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:32:59.854303348Z","created_by":"Subsy","updated_at":"2026-01-15T16:42:41.998093328Z","closed_at":"2026-01-15T16:42:41.998097405Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.2","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:32:59.855212503Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.2","depends_on_id":"ralph-tui-7pp.1","type":"blocks","created_at":"2026-01-15T16:33:24.145942118Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.3","title":"US-3: Configuration Module Tests","description":"As a developer, I want comprehensive tests for configuration loading and validation so that config-related bugs are caught before runtime.\n\n## Acceptance Criteria\n- [ ] Unit tests for all Zod schemas in `src/config/schema.ts`\n- [ ] Tests for config file discovery and merging logic\n- [ ] Tests for environment variable expansion\n- [ ] Tests for default value application\n- [ ] Edge cases: missing files, invalid YAML, schema violations\n- [ ] Coverage target: 85%+ for `src/config/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive configuration module tests with 97 tests covering Zod schemas, config loading/merging, error handling, and edge cases. All quality gates pass.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:00.485602443Z","created_by":"Subsy","updated_at":"2026-01-15T17:15:31.774805324Z","closed_at":"2026-01-15T17:15:31.774809432Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.3","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:00.486175434Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.3","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-01-15T16:33:24.812250572Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.4","title":"US-4: Engine Core Tests","description":"As a developer, I want thorough tests for the Ralph loop engine so that the core orchestration logic is reliable and regression-free.\n\n## Acceptance Criteria\n- [ ] Unit tests for RalphLoop state machine transitions\n- [ ] Unit tests for IterationEngine iteration logic\n- [ ] Tests for rate limit detection across all patterns (Claude, OpenCode, generic)\n- [ ] Tests for error classification (rate limit vs crash vs completion)\n- [ ] Tests for session state persistence and recovery\n- [ ] Tests for the SELECT → BUILD → EXECUTE → DETECT cycle\n- [ ] Integration tests for engine + mock agents\n- [ ] Coverage target: 85%+ for `src/engine/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive engine core tests with 100 tests covering: state machine transitions, rate limit detection (Claude/OpenCode/generic), iteration logic, error classification, and integration tests for SELECT → BUILD → EXECUTE → DETECT cycle. All quality gates pass.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:01.115724347Z","created_by":"Subsy","updated_at":"2026-01-15T16:57:22.167876602Z","closed_at":"2026-01-15T16:57:22.167879878Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.4","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:01.116282039Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.4","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-01-15T16:33:27.414864779Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.5","title":"US-5: Plugin System Tests","description":"As a developer, I want tests for the plugin architecture so that plugins can be developed and registered reliably.\n\n## Acceptance Criteria\n- [ ] Unit tests for AgentPluginRegistry and TrackerPluginRegistry\n- [ ] Tests for plugin discovery and registration\n- [ ] Tests for ClaudeAgentPlugin prompt building and response parsing\n- [ ] Tests for OpenCodeAgentPlugin with its specific behaviors\n- [ ] Tests for JsonTrackerPlugin file operations\n- [ ] Tests for BeadsTrackerPlugin CLI interactions\n- [ ] Mock-based tests that don't require actual agents\n- [ ] Coverage target: 80%+ for `src/plugins/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive plugin system tests covering AgentRegistry, TrackerRegistry, ClaudeAgentPlugin, OpenCodeAgentPlugin, JsonTrackerPlugin, and BeadsTrackerPlugin. All 187 plugin tests pass. Quality gates satisfied.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:02.003363808Z","created_by":"Subsy","updated_at":"2026-01-15T17:06:05.422267791Z","closed_at":"2026-01-15T17:06:05.422272289Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.5","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:02.004846906Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.5","depends_on_id":"ralph-tui-7pp.4","type":"blocks","created_at":"2026-01-15T16:33:28.071910758Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.6","title":"US-6: TUI Component Tests","description":"As a developer, I want tests for TUI state management and event handling so that UI logic is correct even without visual verification.\n\n## Acceptance Criteria\n- [ ] Unit tests for TuiState state management\n- [ ] Tests for event handlers and state transitions\n- [ ] Tests for EventBus pub/sub functionality\n- [ ] Tests for log parsing and formatting\n- [ ] Tests do NOT require actual terminal rendering\n- [ ] Coverage target: 75%+ for `src/tui/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive TUI component tests: output-parser tests (33 tests), theme tests (36 tests), and state-utils tests (28 tests). Tests cover log parsing, formatting, StreamingOutputParser, theme constants, utility functions, status conversion, and dependency status calculation. All 775 tests pass. Quality gates pass.","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:02.787828723Z","created_by":"Subsy","updated_at":"2026-01-15T17:28:49.683946715Z","closed_at":"2026-01-15T17:28:49.683950703Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.6","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:02.788455966Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.6","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-01-15T16:33:28.711836228Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.7","title":"US-7: Utility Function Tests","description":"As a developer, I want tests for all utility modules so that foundational code is rock-solid.\n\n## Acceptance Criteria\n- [ ] Tests for `src/utils/files.ts` - path operations, file discovery\n- [ ] Tests for `src/utils/logger.ts` - log formatting, levels\n- [ ] Tests for `src/utils/process.ts` - process spawning helpers\n- [ ] Tests for `src/utils/retry.ts` - retry logic, backoff calculations\n- [ ] Tests for `src/utils/validation.ts` - input validation helpers\n- [ ] Coverage target: 90%+ for `src/utils/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented utility modules (files, logger, process, retry, validation) with comprehensive tests (192 passing tests). All quality gates pass.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:03.523772097Z","created_by":"Subsy","updated_at":"2026-01-15T16:49:51.846794219Z","closed_at":"2026-01-15T16:49:51.846797345Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.7","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:03.524409389Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.7","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-01-15T16:33:26.378701996Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.8","title":"US-8: CLI Command Tests","description":"As a developer, I want integration tests for CLI commands so that the user-facing interface works correctly.\n\n## Acceptance Criteria\n- [ ] Integration tests for `ralph run` command flow\n- [ ] Integration tests for `ralph status` output\n- [ ] Integration tests for `ralph config` validation\n- [ ] Tests use mock agents and trackers\n- [ ] Tests verify exit codes and stdout/stderr\n- [ ] Coverage target: 70%+ for `src/cli/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented CLI command tests: 102 tests for ralph run, status, and config commands covering argument parsing, exit codes, status determination, config validation, and output formatting. All tests pass.","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:04.857309159Z","created_by":"Subsy","updated_at":"2026-01-15T17:21:24.739705605Z","closed_at":"2026-01-15T17:21:24.739708971Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.8","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:04.870833363Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.8","depends_on_id":"ralph-tui-7pp.5","type":"blocks","created_at":"2026-01-15T16:33:29.443829381Z","created_by":"Subsy"}]} -{"id":"ralph-tui-7pp.9","title":"US-9: CI/CD Pipeline","description":"As a maintainer, I want automated test execution in CI so that PRs cannot be merged without passing tests.\n\n## Acceptance Criteria\n- [ ] GitHub Actions workflow for test execution\n- [ ] Tests run on: push to main, all PRs\n- [ ] Coverage report generation and upload\n- [ ] Coverage threshold enforcement (fail if below 80%)\n- [ ] Coverage badge in README\n- [ ] Test results visible in PR checks\n- [ ] Matrix testing for Node 20+ and Bun latest\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"CI/CD pipeline implemented with: GitHub Actions workflow for test execution, tests run on push to main and all PRs, coverage report generation with Codecov upload, 80% coverage threshold enforcement, CI and coverage badges in README, matrix testing for Node 20+ and Bun latest","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:05.513464337Z","created_by":"Subsy","updated_at":"2026-01-15T17:23:03.637422023Z","closed_at":"2026-01-15T17:23:03.63742608Z","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.9","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-01-15T16:33:05.514291468Z","created_by":"Subsy"},{"issue_id":"ralph-tui-7pp.9","depends_on_id":"ralph-tui-7pp.8","type":"blocks","created_at":"2026-01-15T16:33:30.114185751Z","created_by":"Subsy"}]} -{"id":"ralph-tui-816","title":"Story 4.1: Append Image References to Agent Prompts","description":"## Description\nWhen sending a prompt to an agent, append the list of attached image paths.\n\n## Acceptance Criteria\n- [ ] Image paths appended at the end of user's prompt text\n- [ ] Format: `\\n\\nRelevant images you should review before you begin are in:\\n- {absolute_path_1}\\n- {absolute_path_2}`\n- [ ] Only append if images are attached\n- [ ] Clear attached images after prompt is sent\n- [ ] Works for both PRD chat and Run command prompts\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify prompt construction in `PrdChatApp.tsx` (for PRD flow)\n- Modify prompt construction in `RunApp.tsx` / engine invocation (for run flow)\n- Use `getPromptSuffix()` from useImageAttachment hook\n\n## Dependencies\n- Story 3.1: Create useImageAttachment Hook (ralph-tui-z42)\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:19:00.608184+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-9g3","title":"Inline Image Indicators","description":"## Description\nDisplay `[Image N]` indicators in text input when images are pasted.\n\n## Acceptance Criteria\n- [ ] Insert `[Image N]` at cursor position when image pasted\n- [ ] Indicators numbered sequentially (1, 2, 3...)\n- [ ] Indicators styled distinctly (dimmed or colored if terminal supports)\n- [ ] Backspace over indicator removes the image attachment\n- [ ] Indicators persist correctly when editing surrounding text\n- [ ] Display count above input: `📎 2 images attached` (when images present)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Store image references as metadata alongside text content\n- Indicators are \"atomic\" - can't partially delete them\n- Consider using special Unicode markers internally for tracking\n\n## Dependencies\n- useImageAttachment Hook (ralph-tui-zey)\n\n## Estimate\n3 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:07.512209+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:39:17.440592+11:00","closed_at":"2026-01-17T02:39:17.440592+11:00","close_reason":"Implemented inline image indicators: useInlineImageIndicators hook for atomic [Image N] placeholders with sequential numbering, backspace/delete handling for atomic removal, ImageAttachmentCount component showing '📎 N images attached' above input, ChatView integration with attachedImageCount prop. Uses zero-width Unicode markers for invisible boundary tracking. TypeCheck and build pass.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-9g3","depends_on_id":"ralph-tui-zey","type":"blocks","created_at":"2026-01-16T21:22:07.513985+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-9g3","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:21.926279+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-b1t","title":"Display sandbox status in TUI header","description":"As a user, I want to see sandbox status in the TUI header so I know if sandboxing is active and what mode it's using.\n\n## Context\nWhen running with --sandbox, users have no visual confirmation that sandboxing is active. The header shows agent, model, tracker, and rate limit status, but not sandbox status.\n\n## Acceptance Criteria\n- [ ] Add sandbox status indicator to TUI header (right side, near agent/tracker info)\n- [ ] Show sandbox mode: 🔒 bwrap or 🔒 docker\n- [ ] Show (no-net) suffix when network is disabled\n- [ ] Don't show anything when sandbox is disabled (clean UI)\n- [ ] Pass sandbox config from engine/RunApp to Header component\n- [ ] Update HeaderProps interface with sandbox config\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T10:12:13.201453264Z","created_by":"Subsy","updated_at":"2026-01-16T21:19:45.740507+11:00","closed_at":"2026-01-16T10:17:34.764735237Z","labels":["enhancement","ralph","tui"]} -{"id":"ralph-tui-bge","title":"Story 6.1: Support General File Path Detection","description":"## Description\nExtend the system to detect any file path pastes, not just images.\n\n## Acceptance Criteria\n- [ ] Detect file paths that aren't images\n- [ ] For non-image files: paste the raw path text (no special handling)\n- [ ] For non-existent paths: paste as raw text\n- [ ] Maintain image-specific behavior for image files\n- [ ] Log detection results for debugging\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- This is essentially the \"graceful fallback\" behavior from Story 1.1\n- Ensures pasting `/some/code/file.ts` just pastes the text normally\n- Only image files get the special attachment treatment\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n\n## Priority\nLow\n\n## Estimate\n3 points","status":"tombstone","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:19:32.368566+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-bjd","title":"US-010: Error Toast Notifications","description":"## User Story\nAs a user, I want to see non-blocking error notifications when image paste fails so that I understand what went wrong without interrupting my workflow.\n\n## Acceptance Criteria\n- [ ] Clipboard read failure: \"Failed to read clipboard image\"\n- [ ] File save failure: \"Failed to save image\"\n- [ ] Errors appear as toast/status bar notification\n- [ ] Auto-dismiss after 3 seconds\n- [ ] Don't block text input or other operations\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-004: Paste Event Interception (ralph-tui-q97)\n\n## Estimate\n1 point","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:59.035055+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-bjd","depends_on_id":"ralph-tui-q97","type":"blocks","created_at":"2026-01-16T21:13:59.036273+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-d1e","title":"Image Paste Support","description":"## Overview\nEnable users to paste images into ralph-tui text inputs so agents can analyze visual content.\n\n## Features\nSupports multiple input methods:\n1. **Clipboard paste** (Cmd+V with image copied) - via platform tools (pngpaste, xclip)\n2. **File path paste** (paste `/path/to/image.png` as text)\n3. **Base64/OSC 52** (for iTerm2, Kitty, WezTerm terminals)\n\n## User Flow\n1. User copies image (screenshot, from browser, etc.)\n2. User pastes in ralph-tui text input\n3. Image saved to `.ralph-tui/images/` with hash-based naming\n4. `[Image 1]` indicator appears in text input\n5. On submit, image paths appended to prompt for agent\n\n## Included Stories\n- Image Storage Manager\n- Image File Path Detection \n- Platform Clipboard Image Reader\n- useImageAttachment Hook\n- Paste Event Integration\n- Inline Image Indicators\n- Prompt Image Path Injection\n- Configuration Options\n- Exit Cleanup\n- Toast Notifications\n- Error Handling","status":"open","priority":0,"issue_type":"epic","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:27:14.308128+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:27:14.308128+11:00","labels":["image-paste"]} -{"id":"ralph-tui-dsx","title":"US-006: Multi-Image Accumulation","description":"## User Story\nAs a user, I want to paste multiple images before sending a message so that I can share several screenshots in one prompt.\n\n## Acceptance Criteria\n- [ ] Each paste appends a new image (doesn't replace)\n- [ ] Images numbered in paste order\n- [ ] Respects `max_images_per_message` config limit\n- [ ] Shows warning if limit reached: \"Maximum images reached (10)\"\n- [ ] All accumulated images cleared after message sent\n- [ ] Provides way to remove individual images (backspace over indicator)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-005: Inline Image Indicators (ralph-tui-orx)\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:46.764858+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-dsx","depends_on_id":"ralph-tui-orx","type":"blocks","created_at":"2026-01-16T21:13:46.766445+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-dui","title":"Factory Droid Agent Plugin","description":"Add a new agent plugin that integrates Factory Droid CLI (droid) with ralph-tui, enabling Factory Droid as a first-class autonomous agent alongside the existing Claude Code and OpenCode plugins.","status":"open","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:22.613355715Z","created_by":"Subsy","updated_at":"2026-01-14T22:59:22.613355715Z","labels":["feature","ralph"]} -{"id":"ralph-tui-dui.1","title":"US-1: Basic Agent Execution with Working Directory Support","description":"As a ralph-tui user, I want to configure Factory Droid as my agent so that I can use my preferred AI coding assistant with ralph-tui's task orchestration.\n\n## Acceptance Criteria\n- [ ] Create plugin structure at src/plugins/agents/droid/ with index.ts, config.ts, commandBuilder.ts\n- [ ] Plugin can be selected via agentCommand: 'droid' in config\n- [ ] Agent spawns droid process with --print and -p flags for non-interactive mode\n- [ ] --cwd flag is set to the project's working directory\n- [ ] Task prompts are passed correctly to the agent\n- [ ] Agent output is captured and displayed in TUI\n- [ ] Implement AgentPlugin interface from src/plugins/agents/types.ts\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:29.810284334Z","created_by":"Subsy","updated_at":"2026-01-14T23:12:43.219316493Z","closed_at":"2026-01-14T23:12:43.219316493Z","close_reason":"Added Factory Droid agent plugin, config alias, and non-interactive command builder; ran typecheck/lint/build.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.1","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-01-14T22:59:29.811518313Z","created_by":"Subsy"}]} -{"id":"ralph-tui-dui.2","title":"US-2: Subagent Tracing with JSONL Output Parsing","description":"As a ralph-tui user, I want to see detailed execution metrics from Factory Droid so that I can monitor tool usage, costs, and execution flow.\n\n## Acceptance Criteria\n- [ ] Create outputParser.ts to parse Factory Droid's JSONL streaming output\n- [ ] Plugin uses --output-format stream-json flag when tracing enabled\n- [ ] JSONL output is parsed for tool calls, assistant messages, and result events\n- [ ] Cost information is extracted and aggregated when available (input/output tokens, cache stats)\n- [ ] Tool call names and arguments are extracted and displayed\n- [ ] Error messages and status codes are properly handled\n- [ ] Tracing can be disabled via enableTracing: false config option\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:36.177334787Z","created_by":"Subsy","updated_at":"2026-01-14T23:51:33.964982692Z","closed_at":"2026-01-14T23:51:33.964982692Z","close_reason":"Added coverage for stream-json fields (toolId, value, completion finalText) and exit error handling.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.2","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-01-14T22:59:36.178241628Z","created_by":"Subsy"},{"issue_id":"ralph-tui-dui.2","depends_on_id":"ralph-tui-dui.1","type":"blocks","created_at":"2026-01-14T22:59:59.785264364Z","created_by":"Subsy"}]} -{"id":"ralph-tui-dui.3","title":"US-3: Skip Permissions Mode for Autonomous Execution","description":"As a ralph-tui user running automated workflows, I want to run Factory Droid without permission prompts so that tasks can execute autonomously without manual intervention.\n\n## Acceptance Criteria\n- [ ] Add skipPermissions option to DroidAgentConfig schema\n- [ ] skipPermissions: true maps to --skip-permissions-unsafe flag\n- [ ] Warning is logged when skip permissions is enabled\n- [ ] Default is false (safe by default)\n- [ ] Config validation ensures boolean type\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:42.109930599Z","created_by":"Subsy","updated_at":"2026-01-14T23:25:11.697715204Z","closed_at":"2026-01-14T23:25:11.697715204Z","close_reason":"Added skipPermissions config flag mapping and warning; validated build.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.3","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-01-14T22:59:42.111226855Z","created_by":"Subsy"},{"issue_id":"ralph-tui-dui.3","depends_on_id":"ralph-tui-dui.1","type":"blocks","created_at":"2026-01-14T22:59:59.830190945Z","created_by":"Subsy"}]} -{"id":"ralph-tui-dui.4","title":"US-4: Model and Reasoning Effort Configuration","description":"As a ralph-tui user, I want to specify which model Factory Droid should use so that I can balance cost, speed, and capability for my tasks.\n\n## Acceptance Criteria\n- [ ] Add model option to DroidAgentConfig schema (string, optional)\n- [ ] Add reasoningEffort option to DroidAgentConfig schema ('low' | 'medium' | 'high', optional)\n- [ ] model config option is passed via --model flag when specified\n- [ ] reasoningEffort config option maps to --reasoning-effort flag when specified\n- [ ] Both options use Factory Droid's defaults when not specified\n- [ ] Config validation ensures valid reasoningEffort values\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:47.643515599Z","created_by":"Subsy","updated_at":"2026-01-14T23:21:45.691305339Z","closed_at":"2026-01-14T23:21:45.691305339Z","close_reason":"Added Droid model/reasoning-effort options with validation and CLI flags.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.4","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-01-14T22:59:47.64439564Z","created_by":"Subsy"},{"issue_id":"ralph-tui-dui.4","depends_on_id":"ralph-tui-dui.1","type":"blocks","created_at":"2026-01-14T22:59:59.860547854Z","created_by":"Subsy"}]} -{"id":"ralph-tui-dui.5","title":"US-5: Plugin Documentation","description":"As a ralph-tui user, I want documentation for the Factory Droid plugin so that I can understand how to configure and use it.\n\n## Acceptance Criteria\n- [ ] Create README.md in src/plugins/agents/droid/\n- [ ] Document all configuration options (model, reasoningEffort, skipPermissions, enableTracing)\n- [ ] Include example configuration snippets\n- [ ] Document prerequisites (droid CLI installed, FACTORY_API_KEY configured)\n- [ ] Document JSONL output format and what metrics are captured\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:53.447350129Z","created_by":"Subsy","updated_at":"2026-01-14T23:54:50.547302727Z","closed_at":"2026-01-14T23:54:50.547302727Z","close_reason":"Added Factory Droid plugin README with config, prerequisites, and JSONL tracing details; verified typecheck, lint, build.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-01-14T22:59:53.448207076Z","created_by":"Subsy"},{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui.2","type":"blocks","created_at":"2026-01-14T22:59:59.889929273Z","created_by":"Subsy"},{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui.3","type":"blocks","created_at":"2026-01-14T22:59:59.921504893Z","created_by":"Subsy"},{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui.4","type":"blocks","created_at":"2026-01-14T22:59:59.952240467Z","created_by":"Subsy"}]} -{"id":"ralph-tui-e8u","title":"Toast Notification Component","description":"## Description\nCreate a reusable toast notification component for transient messages.\n\n## Acceptance Criteria\n- [ ] Toast appears in top-right corner of screen\n- [ ] Auto-dismisses after 3 seconds\n- [ ] Supports variants: `success`, `error`, `info`, `warning`\n- [ ] Shows icon + message text (✓/✗/ℹ/⚠)\n- [ ] Non-blocking (doesn't prevent other interactions)\n- [ ] Queue multiple toasts if needed\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/components/Toast.tsx`\n- Create: `src/tui/hooks/useToast.ts` for state management\n- Use absolute positioning with OpenTUI's `\u003cbox\u003e` component\n\n## Estimate\n3 points","notes":"Implementation complete - Toast.tsx and useToast.ts created with all required functionality: top-right positioning, 3-second auto-dismiss, all 4 variants with icons, non-blocking via absolute positioning, and queue support (MAX_TOASTS=5). Code was implemented as part of repos-08z bead. typecheck and build pass.","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:19.047021+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:53:09.897581+11:00","closed_at":"2026-01-17T02:53:09.897598+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-e8u","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.238423+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-ed1","title":"US-011: Manual Cleanup Command","description":"## User Story\nAs a user, I want a command to manually clean up session images so that I can free disk space during long sessions.\n\n## Acceptance Criteria\n- [ ] Slash command `/clear-images` removes all session images\n- [ ] Shows confirmation with count: \"Cleared 5 images\"\n- [ ] Also clears any pending image attachments in current input\n- [ ] Works regardless of `cleanup_policy` setting\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-001: Image Storage Manager (ralph-tui-5zr)\n\n## Estimate\n1 point","status":"tombstone","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:14:09.206655+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-ed1","depends_on_id":"ralph-tui-5zr","type":"blocks","created_at":"2026-01-16T21:14:09.208417+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-exe","title":"Test ready command filtering","description":"Verify br ready only shows unblocked issues","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.721976092Z","created_by":"plgeek","updated_at":"2026-01-21T01:00:56.778435432Z","dependencies":[{"issue_id":"ralph-tui-exe","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-01-21T01:00:56.724680654Z","created_by":"plgeek"},{"issue_id":"ralph-tui-exe","depends_on_id":"ralph-tui-3uo","type":"blocks","created_at":"2026-01-21T01:00:56.778419242Z","created_by":"plgeek"}]} -{"id":"ralph-tui-ey2","title":"US-007: Prompt Image Path Injection","description":"## User Story\nAs a user, I want my pasted images to be automatically included in the prompt sent to the agent so that the agent can access and analyze them.\n\n## Acceptance Criteria\n- [ ] Images appended to prompt in structured format\n- [ ] Uses absolute paths for reliability\n- [ ] Format:\n ```\n [user message]\n\n [Attached Images]\n - Image 1: /path/to/img-abc123.png\n - Image 2: /path/to/img-def456.png\n ```\n- [ ] No \"[Attached Images]\" section if no images\n- [ ] Works with all agent types (Claude, custom agents)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Inject at prompt construction time in agent invocation\n- Ensure paths are properly escaped if they contain spaces\n\n## Dependencies\n- US-003: Configuration Schema Extension (ralph-tui-skz)\n- US-005: Inline Image Indicators (ralph-tui-orx)\n\n## Estimate\n2 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:34.68937+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-ey2","depends_on_id":"ralph-tui-skz","type":"blocks","created_at":"2026-01-16T21:13:34.690728+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-ey2","depends_on_id":"ralph-tui-orx","type":"blocks","created_at":"2026-01-16T21:13:34.691924+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-ez4","title":"Test dependency tracking","description":"Verify dependencies are tracked and block correctly","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.705908056Z","created_by":"plgeek","updated_at":"2026-01-21T01:00:56.757760265Z","dependencies":[{"issue_id":"ralph-tui-ez4","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-01-21T01:00:56.70792959Z","created_by":"plgeek"},{"issue_id":"ralph-tui-ez4","depends_on_id":"ralph-tui-3uo","type":"blocks","created_at":"2026-01-21T01:00:56.757738794Z","created_by":"plgeek"}]} -{"id":"ralph-tui-g0o","title":"Platform Clipboard Image Reader","description":"## Description\nRead actual image data from system clipboard using platform-specific tools.\n\n## Acceptance Criteria\n- [ ] Detects if clipboard contains image data (vs text)\n- [ ] Reads image data as PNG buffer on macOS using `pngpaste`\n- [ ] Reads image data as PNG buffer on Linux using `xclip` (X11) or `wl-paste` (Wayland)\n- [ ] Reads image data as PNG buffer on Windows using PowerShell\n- [ ] Returns `null` gracefully if no image in clipboard\n- [ ] Returns meaningful error if clipboard tool not installed\n- [ ] Provides installation hints for missing tools\n- [ ] All operations async with reasonable timeout (5s)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/clipboard-image.ts`\n- macOS: Check for `pngpaste` via `which`, fallback to `osascript`\n- Linux: Try `xclip`, then `xsel`, then `wl-paste` (Wayland)\n- Windows: Use `powershell -command \"Get-Clipboard -Format Image | ...\"`\n\n## Estimate\n5 points","notes":"Implementation complete and verified. All acceptance criteria met: image detection (hasClipboardImage), macOS support (pngpaste + osascript fallback), Linux support (wl-paste, xclip), Windows support (PowerShell), graceful null return for missing images, meaningful errors with installation hints (getInstallHints), 5s default timeout. Both typecheck and build pass.","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:21:31.055053+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T23:40:52.658123+11:00","closed_at":"2026-01-16T23:40:52.65815+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-g0o","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:21.691494+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-ivd","title":"Fix refresh (r) not picking up new tasks added to epic","description":"## User Story\nAs a user who adds new beads to an epic while Ralph is running, I want to press 'r' to refresh and see the new tasks, so that I can continue working without restarting the TUI.\n\n## Current Behavior\n- Press 'r' to refresh task list\n- New beads added to the epic (via bd create) do not appear\n- Likely same issue with json tracker when prd.json is modified externally\n\n## Expected Behavior\n- Press 'r' refreshes from tracker source\n- New tasks appear in the task list\n- Removed tasks are removed from display (or marked appropriately)\n\n## Investigation Areas\n- [ ] Check engine.refreshTasks() implementation\n- [ ] Verify tracker.getTasks() is being called with correct filters\n- [ ] Check if epic filter is being applied on refresh\n- [ ] Test with both beads and json trackers\n- [ ] Verify tasks:refreshed event is being emitted and handled\n\n## Technical Notes\n- Files: src/engine/index.ts (refreshTasks), src/commands/run.tsx (keyboard handler)\n- The 'r' key calls engine.refreshTasks() at line ~600 in RunApp.tsx\n- May need to pass epicId filter to getTasks on refresh","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T12:31:19.378276049Z","created_by":"Subsy","updated_at":"2026-01-12T13:51:04.901152464Z","closed_at":"2026-01-12T13:51:04.901152464Z","close_reason":"Bug already fixed in commit 1eba384. The double-filtering issue (bd list --parent already filtered by parent, but filterTasks was filtering again by parentId which bd list --json doesn't include) was resolved. Verified: typecheck passes, lint passes, bd commands return correct results.","labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-ivd","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T12:35:11.59059238Z","created_by":"Subsy"}]} -{"id":"ralph-tui-jlu","title":"Story 2.1: Add cleanupImages Config Option","description":"## Description\nAdd configuration option to control whether images are cleaned up on exit.\n\n## Acceptance Criteria\n- [ ] Add `cleanupImages` boolean to config schema\n- [ ] Default value: `true`\n- [ ] Support in both global (`~/.config/ralph-tui/config.toml`) and project-level config\n- [ ] Add to SettingsView.tsx for UI toggle\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Update `src/config/types.ts` - add to `RalphConfig` type\n- Update `src/config/schema.ts` - add Zod validation\n- Update `src/tui/components/SettingsView.tsx` - add toggle\n\n## Config Example\n```toml\n# Keep attached images after ralph-tui exits\ncleanupImages = false\n```\n\n## Dependencies\n- Story 1.4: Image Cleanup on Exit (ralph-tui-12c)\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:25.321358+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-kha","title":"US-002: Platform Clipboard Abstraction","description":"## User Story\nAs a user on any platform, I want Ralph TUI to read images from my clipboard so that I can paste screenshots regardless of my operating system.\n\n## Acceptance Criteria\n- [ ] Detects if clipboard contains image data (vs text)\n- [ ] Reads image data as PNG buffer on macOS using `pngpaste`\n- [ ] Reads image data as PNG buffer on Linux using `xclip`\n- [ ] Reads image data as PNG buffer on Windows using PowerShell\n- [ ] Returns `null` gracefully if no image in clipboard\n- [ ] Returns meaningful error if clipboard tool not installed\n- [ ] Provides installation hints for missing tools\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- macOS: Check for `pngpaste` via `which`, fallback to `osascript`\n- Linux: Try `xclip`, then `xsel`, then `wl-paste` (Wayland)\n- Windows: Use `powershell -command \"Get-Clipboard -Format Image | ...\"`\n- All operations should be async with reasonable timeout (5s)\n\n## Estimate\n5 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:11.12331+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-n1x","title":"Manual Cleanup Command","description":"## Description\nSlash command to manually clean up session images.\n\n## Acceptance Criteria\n- [ ] Slash command `/clear-images` removes all session images\n- [ ] Shows confirmation with count: \"Cleared 5 images\"\n- [ ] Also clears any pending image attachments in current input\n- [ ] Works regardless of `cleanup_policy` setting\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- Image Storage Manager (ralph-tui-35v)\n\n## Estimate\n1 point","status":"closed","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:36.790482+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T03:23:06.056298+11:00","closed_at":"2026-01-17T03:23:06.056298+11:00","close_reason":"Implemented /clear-images slash command. Created slash-commands.ts utility with isSlashCommand, parseSlashCommand, executeSlashCommand functions. Integrated into PrdChatApp to intercept slash commands before sending to agent. Clears all session images (from storage) and pending attachments, shows toast confirmation with count. Works regardless of cleanup_policy. TypeCheck and build pass.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-n1x","depends_on_id":"ralph-tui-35v","type":"blocks","created_at":"2026-01-16T21:22:36.791799+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-n1x","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.471242+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-n3v","title":"Sandbox Mode Refactor: Remove Docker, Add macOS sandbox-exec","description":"Refactor sandbox implementation to remove Docker support (which doesn't work well with agent binaries and auth) and add native macOS sandbox-exec support. Update documentation to reflect these changes and recommend WSL for Windows users.\n\n## Rationale\n- Docker sandboxing requires pre-built images with agents installed - maintenance nightmare\n- Auth/API keys are tricky to get working across container boundaries\n- bwrap on Linux works great (mounts host binaries)\n- macOS has native sandbox-exec that can provide similar isolation\n- Windows users can use WSL2 with bwrap for sandboxing","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-16T10:35:23.631393032Z","created_by":"Subsy","updated_at":"2026-01-16T10:57:58.520832878Z","closed_at":"2026-01-16T10:57:58.520832878Z","close_reason":"Completed sandbox refactor: removed Docker (maintenance nightmare), added macOS sandbox-exec with Seatbelt profiles, updated documentation with Windows/WSL guidance","labels":["ralph","refactor"]} -{"id":"ralph-tui-n3v.1","title":"US-001: Remove Docker sandboxing support","description":"As a maintainer, I want to remove Docker sandboxing support because it doesn't work well with agent binaries and auth credentials.\n\n## Context\nDocker sandboxing requires:\n- Pre-built images with agents installed (maintenance burden)\n- Auth/API keys to work across container boundaries (complex)\n- Network access for LLM API calls anyway\n- The default ubuntu:22.04 image has no agents installed\n\nbwrap on Linux solves these problems by mounting host binaries read-only.\n\n## Acceptance Criteria\n- [ ] Remove 'docker' from SandboxMode type in src/sandbox/types.ts\n- [ ] Remove wrapWithDocker() method from src/sandbox/wrapper.ts\n- [ ] Remove docker detection from src/sandbox/detect.ts\n- [ ] Remove 'image' field from SandboxConfig type\n- [ ] Remove DEFAULT_SANDBOX_CONFIG.image\n- [ ] Update detectSandboxMode() to only check for bwrap on Linux (macOS will be added separately)\n- [ ] Remove any Docker-related tests\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-16T10:35:34.294387874Z","created_by":"Subsy","updated_at":"2026-01-16T10:47:01.387601802Z","closed_at":"2026-01-16T10:47:01.387601802Z","close_reason":"Removed Docker sandboxing: removed 'docker' from SandboxMode type, removed 'image' field, removed wrapWithDocker() method, updated detect.ts, CLI flags, and Zod schema","labels":["ralph","refactor","task"],"dependencies":[{"issue_id":"ralph-tui-n3v.1","depends_on_id":"ralph-tui-n3v","type":"parent-child","created_at":"2026-01-16T10:35:34.295191981Z","created_by":"Subsy"}]} -{"id":"ralph-tui-n3v.2","title":"US-002: Add macOS sandbox-exec support","description":"As a macOS user, I want native sandboxing using sandbox-exec so I can isolate agent execution without Docker.\n\n## Context\nmacOS has a native sandboxing mechanism called sandbox-exec that:\n- Uses Seatbelt profiles (.sb files) to define permissions\n- Can restrict filesystem access, network, and system calls\n- Is used by Apple for App Store apps\n- Works with host-installed binaries (no container needed)\n\n## Implementation Notes\nsandbox-exec syntax:\n```bash\nsandbox-exec -f profile.sb command args...\n```\n\nProfile example:\n```scheme\n(version 1)\n(deny default)\n(allow file-read* (subpath \"/usr\"))\n(allow file-read* file-write* (subpath \"/path/to/project\"))\n(allow network*) ; or deny for no-network mode\n(allow process-exec)\n```\n\n## Acceptance Criteria\n- [ ] Add 'sandbox-exec' to SandboxMode type in src/sandbox/types.ts\n- [ ] Add wrapWithSandboxExec() method to src/sandbox/wrapper.ts\n- [ ] Generate dynamic Seatbelt profile based on config and agent requirements\n- [ ] Support network enable/disable via profile\n- [ ] Mount project directory read-write\n- [ ] Mount agent auth paths read-only (e.g., ~/.claude)\n- [ ] Mount system paths read-only (/usr, /bin, /Applications, etc.)\n- [ ] Update detectSandboxMode() to detect macOS and use sandbox-exec\n- [ ] Handle the deprecated warning from sandbox-exec gracefully (it still works)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Test on macOS (manual verification)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-16T10:35:47.976440117Z","created_by":"Subsy","updated_at":"2026-01-16T10:52:33.054535996Z","closed_at":"2026-01-16T10:52:33.054535996Z","close_reason":"Implemented macOS sandbox-exec: added SandboxMode type, Seatbelt profile generation, detectSandboxMode() for darwin, CLI flag, and wrapper method","labels":["feature","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-n3v.2","depends_on_id":"ralph-tui-n3v","type":"parent-child","created_at":"2026-01-16T10:35:47.977200882Z","created_by":"Subsy"},{"issue_id":"ralph-tui-n3v.2","depends_on_id":"ralph-tui-n3v.1","type":"blocks","created_at":"2026-01-16T10:36:40.730269793Z","created_by":"Subsy"}]} -{"id":"ralph-tui-n3v.3","title":"US-003: Update sandbox documentation","description":"As a user, I want updated documentation that accurately reflects the sandbox options available on each platform.\n\n## Changes Required\n\n### Remove Docker content:\n- Remove Docker mode from sandbox modes table\n- Remove docker CLI flag documentation\n- Remove Docker image configuration option\n- Remove Docker examples\n- Remove Docker installation instructions\n\n### Add sandbox-exec content:\n- Add sandbox-exec to sandbox modes table\n- Document that it's macOS-only and automatic when available\n- Explain that it uses Seatbelt profiles under the hood\n- Note the deprecation warning users may see (Apple deprecated it but it still works)\n\n### Add Windows/WSL guidance:\n- Add new section: 'Sandboxing on Windows'\n- Explain that native Windows sandboxing is not supported\n- Recommend WSL2 for Windows users who want sandboxing\n- Provide brief WSL2 setup guidance:\n 1. Install WSL2\n 2. Install ralph-tui inside WSL\n 3. Install bwrap inside WSL\n 4. Use --sandbox flag normally\n\n### Update platform requirements table:\n- Linux: bwrap (recommended)\n- macOS: sandbox-exec (automatic)\n- Windows: Not supported natively, use WSL2\n\n## Acceptance Criteria\n- [ ] Remove all Docker sandbox references from website/content/docs/configuration/sandbox.mdx\n- [ ] Add sandbox-exec section for macOS users\n- [ ] Add Windows/WSL section with guidance\n- [ ] Update platform requirements table\n- [ ] Update sandbox modes table (remove docker, add sandbox-exec)\n- [ ] Update CLI flags section (remove --sandbox=docker)\n- [ ] Remove image configuration option from docs\n- [ ] Update examples section (remove Docker examples)\n- [ ] bun run typecheck passes (if any code refs docs)\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-16T10:36:01.452227054Z","created_by":"Subsy","updated_at":"2026-01-16T10:57:51.911999151Z","closed_at":"2026-01-16T10:57:51.911999151Z","close_reason":"Updated sandbox documentation: removed Docker, added sandbox-exec for macOS, added Windows/WSL guidance, updated platform table and examples","labels":["docs","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-n3v.3","depends_on_id":"ralph-tui-n3v","type":"parent-child","created_at":"2026-01-16T10:36:01.453107435Z","created_by":"Subsy"},{"issue_id":"ralph-tui-n3v.3","depends_on_id":"ralph-tui-n3v.1","type":"blocks","created_at":"2026-01-16T10:36:40.77697088Z","created_by":"Subsy"},{"issue_id":"ralph-tui-n3v.3","depends_on_id":"ralph-tui-n3v.2","type":"blocks","created_at":"2026-01-16T10:36:40.809711688Z","created_by":"Subsy"}]} -{"id":"ralph-tui-no2","title":"OSC 52 / Base64 Image Detection","description":"## Description\nDetect base64-encoded images pasted via OSC 52 protocol (iTerm2, Kitty, WezTerm) or data URIs.\n\n## Acceptance Criteria\n- [ ] Detect OSC 52 escape sequences containing image data\n- [ ] Detect data URI format: `data:image/png;base64,...`\n- [ ] Extract and decode base64 image payload\n- [ ] Detect image format from magic bytes: PNG (`iVBOR`), JPEG (`/9j/`), GIF (`R0lGOD`), WebP (`UklGR`)\n- [ ] Fall back to raw text paste if not valid image data\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- OSC 52 format: `\\x1b]52;c;\u003cbase64-data\u003e\\x07`\n- Add to `src/tui/utils/image-detection.ts`\n\n## Estimate\n5 points","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:21:39.114106+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T03:13:48.855665+11:00","closed_at":"2026-01-17T03:13:48.855665+11:00","close_reason":"Implemented OSC 52 and base64 image detection: detectOsc52Image for terminal escape sequences, detectDataUriImage for data URIs, detectRawBase64Image for raw base64, and unified detectBase64Image function. All functions detect PNG/JPEG/GIF/WebP from magic bytes and gracefully return isBase64Image=false for non-image data. 57 tests pass, typecheck and build pass.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-no2","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.16131+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-oqe","title":"Fix Windows ENOENT error when spawning opencode agent","description":"On Windows, the opencode agent integration failed with 'ENOENT: no such file or directory, uv_spawn opencode' because spawn() was using shell: false. Windows requires shell: true to execute wrapper scripts (.cmd, .bat, .ps1). Fixed by conditionally setting shell: true on win32 platform in base.ts execute() method.","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-14T20:50:18.098294361Z","created_by":"Subsy","updated_at":"2026-01-14T20:56:07.148152814Z","closed_at":"2026-01-14T20:56:07.148152814Z","close_reason":"Fixed by using shell: true on Windows platform in base.ts execute() method","labels":["windows"]} -{"id":"ralph-tui-oqv","title":"US-012: First-Time Paste Hint","description":"## User Story\nAs a new user, I want to learn about image paste support when I paste text so that I discover this feature naturally.\n\n## Acceptance Criteria\n- [ ] On first text paste of session, show transient hint\n- [ ] Hint: \"Tip: You can paste images too (Ctrl+V with image in clipboard)\"\n- [ ] Only shown once per session\n- [ ] Dismisses automatically after 3 seconds or on keypress\n- [ ] Can be disabled in config: `show_paste_hints = false`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-004: Paste Event Interception (ralph-tui-q97)\n\n## Estimate\n1 point","status":"tombstone","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:14:12.443943+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-oqv","depends_on_id":"ralph-tui-q97","type":"blocks","created_at":"2026-01-16T21:14:12.445332+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-orx","title":"US-005: Inline Image Indicators","description":"## User Story\nAs a user, I want to see `[Image 1]` indicators in my text input when I paste images so that I know my images were captured successfully.\n\n## Acceptance Criteria\n- [ ] Insert `[Image N]` at cursor position when image pasted\n- [ ] Indicators are numbered sequentially (1, 2, 3...)\n- [ ] Indicators are styled distinctly (dimmed or colored if terminal supports)\n- [ ] Backspace over indicator removes the image attachment\n- [ ] Indicators persist correctly when editing surrounding text\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Store image references as metadata alongside text content\n- Indicators are \"atomic\" - can't partially delete them\n- Consider using special Unicode markers internally for tracking\n\n## Dependencies\n- US-004: Paste Event Interception (ralph-tui-q97)\n\n## Estimate\n2 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:26.938887+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-orx","depends_on_id":"ralph-tui-q97","type":"blocks","created_at":"2026-01-16T21:13:26.940568+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-p6u","title":"Story 5.2: Show Feedback for Image Attachment Actions","description":"## Description\nProvide user feedback when images are attached or when errors occur.\n\n## Acceptance Criteria\n- [ ] Success toast: \"Image attached\" when image is successfully stored\n- [ ] Error toast: \"Invalid image path\" when file doesn't exist\n- [ ] Error toast: \"Unsupported format\" when file isn't a supported image type\n- [ ] Error toast: \"Failed to save image\" when storage fails\n- [ ] Info toast: \"Images will be cleaned up on exit\" (shown once per session when first image attached, if cleanup enabled)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Integrate toast into ChatView and other input components\n- Use useToast hook for triggering notifications\n\n## Dependencies\n- Story 5.1: Create Toast Notification Component (ralph-tui-3l4)\n- Story 3.2: Integrate Image Detection into ChatView Paste Handler (ralph-tui-3uu)\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:19:19.94888+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-q97","title":"US-004: Paste Event Interception","description":"## User Story\nAs a user, I want to paste images using the standard Ctrl+V / Cmd+V shortcut so that image pasting feels natural and intuitive.\n\n## Acceptance Criteria\n- [ ] Ctrl+V / Cmd+V triggers clipboard inspection\n- [ ] If clipboard has image: save image, insert indicator, prevent default text paste\n- [ ] If clipboard has text: paste text normally\n- [ ] Works in all textarea components (main input, iteration input, etc.)\n- [ ] Paste handling is debounced to prevent double-processing\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Hook into OpenTUI's input handling or React's onPaste\n- May need to use Ink's `useInput` hook with raw mode detection\n- Check clipboard content type before attempting image read\n\n## Dependencies\n- US-001: Image Storage Manager (ralph-tui-5zr)\n- US-002: Platform Clipboard Abstraction (ralph-tui-kha)\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:19.698836+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-q97","depends_on_id":"ralph-tui-5zr","type":"blocks","created_at":"2026-01-16T21:13:19.700315+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-q97","depends_on_id":"ralph-tui-kha","type":"blocks","created_at":"2026-01-16T21:13:19.701575+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-rh7","title":"Add command palette (Ctrl+K) to PRD chat interface","description":"Add a command palette modal that opens with Ctrl+K in the PRD chat interface.\n\n## Implementation Details\n\n- **Trigger**: Ctrl+K opens modal, Esc closes\n- **Component**: CommandPalette.tsx (modal overlay)\n- **UI**: Arrow key navigation, Enter to execute, type to filter\n- **Commands to include**:\n - /clear - Clear chat history\n - /help - Show help\n - /exit - Exit the chat\n - (future: /export, /settings, etc.)\n\n## Rationale\n\nThe current slash command system requires typing the full command. A command palette provides:\n1. Discoverability - users can see available commands\n2. Keyboard-driven workflow - no need to remember exact syntax\n3. Quick access - Ctrl+K is a common pattern (VS Code, Slack, etc.)\n\n## Notes\n\nWas partially implemented then reverted during the image attachment work. The component structure was:\n- Modal overlay with dark background\n- Filtered list of commands\n- Highlight current selection\n- Execute on Enter","status":"open","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-17T19:00:54.736402+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T19:00:54.736402+11:00","labels":["enhancement","tui"]} -{"id":"ralph-tui-rtd","title":"Paste not working in TUI chat input when creating PRD","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-13T07:49:27.520504051Z","created_by":"Subsy","updated_at":"2026-01-13T08:16:52.85905047Z","closed_at":"2026-01-13T08:16:52.85905047Z","close_reason":"Fixed paste in PRD chat input by subscribing to OpenTUI paste events. Also filtered modifier keys to prevent system shortcuts from inserting characters."} -{"id":"ralph-tui-sdc","title":"Story 1.3: Image Storage System","description":"## Description\nCreate a system to store attached images in a predictable location accessible to agents.\n\n## Acceptance Criteria\n- [ ] Store images in `.ralph-tui/images/` directory (created if not exists)\n- [ ] Generate unique filenames: `{timestamp}-{uuid}.{ext}` (e.g., `1705420800000-a1b2c3d4.png`)\n- [ ] For file path attachments, copy file to storage location\n- [ ] For base64 attachments, decode and write to storage location\n- [ ] Return absolute path to stored image\n- [ ] Handle storage errors gracefully\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/image-storage.ts`\n- Use `Bun.write()` for file operations\n- Storage path: `path.join(process.cwd(), '.ralph-tui', 'images')`\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:02.204693+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-skz","title":"US-003: Configuration Schema Extension","description":"## User Story\nAs a user, I want to configure image paste behavior through ralph-tui's config file so that I can control cleanup policy and other settings.\n\n## Acceptance Criteria\n- [ ] Add `[images]` section to config schema\n- [ ] Support `enabled` boolean (default: true)\n- [ ] Support `cleanup_policy` enum: \"on_exit\" | \"manual\" | \"never\"\n- [ ] Support `skip_cleanup_confirmation` boolean (default: false)\n- [ ] Support `max_images_per_message` number (default: 10, 0 = unlimited)\n- [ ] Config is readable from both global and project-level config\n- [ ] Project config overrides global config\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Estimate\n2 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:12:58.276359+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-tzw","title":"(EPIC) Ralph TUI Follow-up - UI/UX Improvements","description":"Follow-up improvements for Ralph TUI based on initial usage feedback.\n\n## Goals\n- Fix visual/layout issues (status bar off-screen, help dialog background)\n- Improve keyboard shortcuts (remove confusing ones, better defaults)\n- Add prompt customization support\n- Better default behavior for task visibility\n\n## Success Criteria\n- TUI displays correctly on standard terminal sizes\n- Keyboard shortcuts are intuitive and consistent\n- Custom prompts can be specified\n- Closed items visible by default","status":"closed","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:07.898579331Z","created_by":"Subsy","updated_at":"2026-01-12T21:17:10.637855358Z","closed_at":"2026-01-12T21:17:10.637855358Z","close_reason":"Completed - subagent tracing implemented, UI improvements done, core orchestrator functional","labels":["epic","ralph"]} -{"id":"ralph-tui-tzw.1","title":"BUG: Bottom of TUI off-screen - status bar and shortcut hints not visible","description":"## User Story\nAs a user running Ralph TUI, I want to see the status bar and keyboard shortcut hints at the bottom of the screen, so that I can understand the current state and available actions.\n\n## Current Behavior\n- The bottom portion of the TUI is cut off below the visible terminal area\n- Status bar showing current state is not visible\n- Keyboard shortcut hints are not visible\n- Users must guess what shortcuts are available\n\n## Expected Behavior\n- TUI fits within the terminal viewport\n- Status bar is always visible at the bottom\n- Keyboard shortcut hints are visible\n- Layout adapts to terminal size\n\n## Technical Investigation Needed\n- Check if terminal height detection is correct\n- Review OpenTUI Box/layout constraints\n- Check for off-by-one errors in height calculations\n- Test with different terminal sizes (80x24, 120x40, etc.)\n\n## Acceptance Criteria\n- [ ] Status bar visible at bottom of screen\n- [ ] Keyboard shortcut hints visible\n- [ ] Works on standard 80x24 terminal\n- [ ] Works on larger terminals (120x40+)\n- [ ] No content clipped at bottom\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:44.847723998Z","created_by":"Subsy","updated_at":"2026-01-12T09:31:15.149067632Z","closed_at":"2026-01-12T09:31:15.149067632Z","close_reason":"Fixed TUI layout issue by adding fixed height to ProgressDashboard and accounting for it in contentHeight calculation. Footer and status bar are now visible on all terminal sizes.","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.1","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T08:45:44.848462551Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.10","title":"BUG: Tracker displays as 'beads' when beads-bv is selected","description":"As a user, I want to see 'beads-bv' when that tracker is selected, not just 'beads', so I know which variant is active.\n\n## Context\nThe beads-bv tracker inherits from beads but has different behavior (uses bv for triage). The display should reflect the actual plugin in use.\n\n## Acceptance Criteria\n- [ ] When beads-bv tracker is configured, display shows \"beads-bv\" not \"beads\"\n- [ ] When beads tracker is configured, display shows \"beads\"\n- [ ] Plugin ID from meta is used for display, not parent class name\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:42.895891575Z","created_by":"Subsy","updated_at":"2026-01-12T14:33:54.913460607Z","closed_at":"2026-01-12T14:33:54.913460607Z","close_reason":"Fixed tracker display to show actual plugin ID (beads-bv) by prioritizing trackerType prop from resolved config over storedConfig fallbacks","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.10","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T14:13:42.896466891Z","created_by":"Subsy"},{"issue_id":"ralph-tui-tzw.10","depends_on_id":"ralph-tui-tzw.9","type":"blocks","created_at":"2026-01-12T14:18:32.703406209Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.11","title":"BUG: Timer runs continuously instead of only during execution","description":"As a user, I want the timer in the top right to only run when Ralph is actively executing an iteration, so I can see actual execution time.\n\n## Context\nThe timer currently starts and runs continuously. It should only tick while an agent is running, pausing between iterations and when idle.\n\n## Acceptance Criteria\n- [ ] Timer is paused/stopped when engine is idle (no iteration running)\n- [ ] Timer runs only during active iteration execution\n- [ ] Timer resets or accumulates based on UX decision (clarify with user if needed)\n- [ ] Timer displays correctly formatted time (mm:ss or hh:mm:ss)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:43.110324395Z","created_by":"Subsy","updated_at":"2026-01-12T14:27:22.362647307Z","closed_at":"2026-01-12T14:27:22.362647307Z","close_reason":"Timer now only runs during 'executing' status, pausing when idle or between iterations. Total execution time accumulates across iterations.","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.11","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T14:13:43.110842592Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.12","title":"FEAT: Show start/end/elapsed times in output detail pane","description":"As a user viewing iteration output details, I want to see start time, end time, and elapsed duration as summary metrics at the top of the detail pane.\n\n## Context\nWhen viewing output details for a completed iteration, timing information helps understand execution performance.\n\n## Acceptance Criteria\n- [ ] Output detail pane shows \"Started:\" with timestamp at top\n- [ ] Output detail pane shows \"Ended:\" with timestamp at top\n- [ ] Output detail pane shows \"Duration:\" with elapsed time (e.g., \"2m 34s\")\n- [ ] Metrics appear as a summary section before the raw output\n- [ ] For in-progress iterations, show \"Started:\" and \"Running...\" for duration\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Verify in TUI manually","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:43.309625651Z","created_by":"Subsy","updated_at":"2026-01-12T14:25:25.853815085Z","closed_at":"2026-01-12T14:25:25.853815085Z","close_reason":"Implemented timing summary in output detail pane showing start time, end time, and duration. Works for both in-progress (Running...) and completed iterations.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.12","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T14:13:43.310258194Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.13","title":"TASK: Remove Enter as start key - only use 's'","description":"As a user, I want only 's' to start Ralph execution, removing Enter as an alternative start key.\n\n## Context\nHaving Enter as a start key can cause accidental starts. The 's' key is more intentional.\n\n## Acceptance Criteria\n- [ ] Remove Enter key binding for starting execution\n- [ ] 's' key remains the only way to start execution\n- [ ] Help overlay updated to reflect this change\n- [ ] Footer hints updated to show only 's' for start\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:43.514208289Z","created_by":"Subsy","updated_at":"2026-01-12T14:20:13.568283294Z","closed_at":"2026-01-12T14:20:13.568283294Z","close_reason":"Removed Enter key binding for starting execution. Now only 's' key starts Ralph execution. Updated footer hints and help overlay to reflect the change.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.13","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T14:13:43.514867994Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.14","title":"FEAT: --prd flag auto-switches to JSON tracker mode","description":"As a user, I want to specify `--prd \u003cpath\u003e` to automatically use JSON tracker mode with that file, so I don't have to separately configure the tracker.\n\n## Context\nWhen using Ralph's prd.json workflow, users shouldn't need to manually configure the JSON tracker. The --prd flag should imply JSON mode for the session.\n\n## Acceptance Criteria\n- [ ] Add `--prd \u003cpath\u003e` flag to run command argument parsing\n- [ ] When --prd specified, override tracker to 'json' for this session\n- [ ] Set JSON tracker's file path to the specified prd.json path\n- [ ] Works with both absolute and relative paths\n- [ ] Error if specified file doesn't exist or isn't valid JSON\n- [ ] Help text updated to document --prd flag\n- [ ] Does NOT persist to config (session only)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T15:49:45.873036209Z","created_by":"Subsy","updated_at":"2026-01-12T16:01:23.751740013Z","closed_at":"2026-01-12T16:01:23.751740013Z","close_reason":"Implemented --prd flag auto-switch to JSON tracker mode. Added file validation, help text updates, and all acceptance criteria met.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.14","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T15:49:45.873696595Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.2","title":"FEAT: Help dialog should overlay main TUI instead of pink background","description":"## User Story\nAs a user viewing the help dialog, I want it to appear as an overlay on top of the main TUI, so that I maintain context and the visual experience is professional.\n\n## Current Behavior\n- Help dialog displays with a bright pink background\n- Main TUI content is completely hidden\n- Jarring visual transition when opening/closing help\n- Unprofessional appearance\n\n## Expected Behavior\n- Help dialog appears as a modal/overlay\n- Main TUI remains visible (dimmed) behind the dialog\n- Smooth visual transition\n- Professional, consistent color scheme\n\n## Technical Approach\n- Use OpenTUI modal/overlay component if available\n- Or implement semi-transparent backdrop\n- Ensure help content is readable with proper contrast\n- Handle keyboard events properly (Esc to close, etc.)\n\n## Acceptance Criteria\n- [ ] Help dialog renders as overlay on main TUI\n- [ ] No bright pink background\n- [ ] Main TUI visible (dimmed) behind help\n- [ ] Consistent color scheme with rest of TUI\n- [ ] Esc key closes help dialog\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.025531947Z","created_by":"Subsy","updated_at":"2026-01-12T09:59:38.355918231Z","closed_at":"2026-01-12T09:59:38.355918231Z","close_reason":"Fixed pink overlay backgrounds by replacing rgba() syntax with 8-character hex colors (#RRGGBBAA). OpenTUI's color parser doesn't support CSS rgba() and falls back to magenta for invalid colors.","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.2","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T08:45:45.026257697Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.3","title":"TASK: Remove 't' shortcut and change 'i' shortcut to 'v'","description":"## User Story\nAs a user navigating the TUI, I want intuitive and non-conflicting keyboard shortcuts, so that I can efficiently interact with the interface without confusion.\n\n## Current Behavior\n- 't' shortcut exists (purpose unclear/redundant)\n- 'i' shortcut used for some action\n- Shortcuts may conflict or be unintuitive\n\n## Expected Behavior\n- 't' shortcut removed entirely\n- 'i' shortcut functionality moved to 'v' key\n- 'v' is more intuitive (likely \"view\" action)\n- Help dialog updated to reflect changes\n\n## Changes Required\n1. Find and remove 't' key handler in RunApp.tsx\n2. Find 'i' key handler and change to 'v'\n3. Update help text/shortcut hints\n4. Update any documentation\n\n## Acceptance Criteria\n- [ ] 't' key no longer triggers any action\n- [ ] 'v' key performs action previously on 'i'\n- [ ] 'i' key no longer triggers that action\n- [ ] Help dialog shows updated shortcuts\n- [ ] Status bar hints updated\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.19310748Z","created_by":"Subsy","updated_at":"2026-01-12T09:56:35.419291486Z","closed_at":"2026-01-12T09:56:35.419291486Z","close_reason":"Removed 't' shortcut (was redundant), changed 'i' to 'v' for view toggle, updated help documentation","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.3","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T08:45:45.19381222Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.4","title":"BUG: Toggle closed shortcut (h) not working + show closed by default","description":"## User Story\nAs a user viewing the task list, I want to see closed items by default and toggle their visibility with 'h', so that I have full context of completed work and can hide it when needed.\n\n## Current Behavior\n- 'h' shortcut to toggle closed items doesn't work\n- Closed items may be hidden by default\n- Users can't see what work has been completed\n\n## Expected Behavior\n- Closed items shown by default (greyed out)\n- 'h' key toggles visibility of closed items\n- Clear visual distinction for closed items\n- Toggle state persists during session\n\n## Technical Investigation\n- Check 'h' key handler in RunApp.tsx\n- Verify showClosed state management\n- Check if filter logic is correct\n- Test with beads that have closed children\n\n## Changes Required\n1. Fix 'h' key handler if broken\n2. Change default showClosed to true\n3. Ensure closed items render with greyed styling\n4. Verify toggle actually filters/shows items\n\n## Acceptance Criteria\n- [ ] Closed items visible by default\n- [ ] Closed items styled differently (greyed out)\n- [ ] 'h' key toggles closed item visibility\n- [ ] Toggle is responsive (no delay)\n- [ ] State persists during session\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.361002536Z","created_by":"Subsy","updated_at":"2026-01-12T09:54:48.078204892Z","closed_at":"2026-01-12T09:54:48.078204892Z","close_reason":"Fixed by adding --all flag to bd list in beads tracker getTasks() method. Root cause: bd list excludes closed issues by default, so the TUI never received closed tasks to display/toggle.","labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.4","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T08:45:45.361612637Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.5","title":"FEAT: Add --prompt option to specify custom prompt file","description":"## User Story\nAs a user running Ralph TUI, I want to specify a custom prompt file via --prompt option, so that I can customize the AI agent's behavior for different use cases.\n\n## Current Behavior\n- No --prompt option available\n- Prompts hardcoded or implicit\n- Can't customize agent behavior without code changes\n\n## Expected Behavior\n- New --prompt \u003cpath\u003e CLI option\n- Defaults based on tracker mode:\n - json mode: prompt.md\n - beads mode: prompt-beads.md\n - beads-bv mode: prompt-beads.md\n- Prompt files read from ~/.config/ralph-tui/\n- TUI ensures prompt files exist on install/first run\n\n## Technical Implementation\n\n### CLI Changes\n- Add --prompt option to run command\n- Validate file exists and is readable\n- Pass to ExecutionEngine\n\n### Config Directory Setup\n- Create ~/.config/ralph-tui/ on first run\n- Copy default prompt files from bundled templates\n- scripts/ralph/prompt.md → ~/.config/ralph-tui/prompt.md\n- scripts/ralph/prompt-beads.md → ~/.config/ralph-tui/prompt-beads.md\n\n### Prompt Resolution Order\n1. --prompt CLI argument (explicit path)\n2. ~/.config/ralph-tui/{mode-specific}.md\n3. Bundled default (fallback)\n\n## File Locations\n- Source templates: scripts/ralph/prompt.md, scripts/ralph/prompt-beads.md\n- User config: ~/.config/ralph-tui/prompt.md, ~/.config/ralph-tui/prompt-beads.md\n\n## Acceptance Criteria\n- [ ] --prompt \u003cpath\u003e option added to run command\n- [ ] Default prompt selected based on tracker mode\n- [ ] ~/.config/ralph-tui/ created on first run\n- [ ] Default prompt files copied to config dir\n- [ ] Custom prompt file content passed to agent\n- [ ] Error message if --prompt file doesn't exist\n- [ ] Help text documents --prompt option\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.527660798Z","created_by":"Subsy","updated_at":"2026-01-12T09:49:53.829037118Z","closed_at":"2026-01-12T09:49:53.829037118Z","close_reason":"Added --prompt CLI option with full prompt resolution chain (CLI \u003e user config \u003e built-in). Includes init-prompts command for user customization.","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.5","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T08:45:45.528320082Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.6","title":"TASK: Remove demo data functionality entirely","description":"## User Story\nAs a user learning Ralph TUI, I want the interface to only show real data from my configured tracker, so that I'm not confused by fake demo tasks mixed with real work.\n\n## Current Behavior\n- Demo data functionality exists in the codebase\n- May show fake/sample tasks to new users\n- Confusing when mixed with real tracker data\n- Unclear what's real vs demo\n- Extra code complexity for marginal benefit\n\n## Expected Behavior\n- No demo data functionality\n- TUI shows only real data from configured tracker\n- Empty state shown if no tasks configured\n- Clear onboarding flow for new users instead of fake data\n\n## Changes Required\n1. Find and remove demo data generation code\n2. Remove demo data types/interfaces\n3. Remove any demo mode flags/config\n4. Update empty state to show helpful setup instructions\n5. Clean up any demo-related tests\n\n## Files to Investigate\n- src/trackers/ - check for demo data in tracker plugins\n- src/tui/components/ - check for demo mode rendering\n- src/commands/run.tsx - check for demo flags\n\n## Acceptance Criteria\n- [ ] All demo data code removed\n- [ ] No fake tasks appear in TUI\n- [ ] Empty state shows setup instructions (not demo)\n- [ ] No demo-related CLI flags or config options\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T09:08:35.430868543Z","created_by":"Subsy","updated_at":"2026-01-12T09:42:07.661698212Z","closed_at":"2026-01-12T09:42:07.661698212Z","close_reason":"Removed all demo data functionality: deleted defaultTasks array from App.tsx, updated createDefaultState to use empty tasks by default, added helpful setup instructions in RightPanel for empty state","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.6","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T09:08:35.431468635Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.7","title":"FEAT: Add 'l' shortcut to load/switch epic (tracker-plugin specific)","description":"## User Story\nAs a user working on multiple epics, I want to press 'l' to load a different epic without restarting the TUI, so that I can switch context efficiently.\n\n## Current Behavior\n- Must restart TUI with different --epic flag to switch\n- No way to change epic mid-session\n- Workflow interruption when switching projects\n\n## Expected Behavior\n- Press 'l' to open epic loader dialog\n- Behavior is tracker-plugin specific:\n - **json mode**: Prompt for file path, validate exists\n - **beads/beads-bv mode**: Show list of open epics (filtered by configured label tag), allow selection\n - **future linear plugin**: Query Linear API for open epics, show selection\n- After selection, TUI reloads with new epic's tasks\n- Engine stops current work before switching\n\n## Technical Implementation\n\n### TrackerPlugin Interface Extension\nAdd method to TrackerPlugin interface:\n```typescript\ninterface TrackerPlugin {\n // ... existing methods\n \n // Returns available epics for selection\n // Implementation varies by tracker type\n getAvailableEpics(): Promise\u003cEpic[]\u003e;\n \n // Or for file-based trackers\n promptForEpicSource(): Promise\u003cstring | null\u003e;\n}\n```\n\n### Tracker-Specific Implementations\n\n**JsonTrackerPlugin:**\n- Show file path input prompt\n- Validate file exists and is valid JSON\n- Return path or null if cancelled\n\n**BeadsTrackerPlugin / BeadsBvTrackerPlugin:**\n- Query `bd list --type=epic --status=open --labels={configuredLabel}`\n- Show selectable list of epics\n- Return selected epic ID\n\n**Future LinearTrackerPlugin:**\n- Query Linear API for projects/epics\n- Show selectable list\n- Return selected epic/project ID\n\n### TUI Integration\n1. 'l' key handler opens epic loader\n2. Calls tracker.getAvailableEpics() or promptForEpicSource()\n3. Shows appropriate UI based on tracker type\n4. On selection: stop engine, update config, reload tasks\n\n## Acceptance Criteria\n- [ ] 'l' key opens epic loader dialog\n- [ ] json mode: prompts for file path with validation\n- [ ] beads mode: shows list of open epics with configured label\n- [ ] beads-bv mode: shows list of open epics with configured label\n- [ ] Selected epic loads correctly\n- [ ] Current engine work stops before switch\n- [ ] Task list refreshes with new epic's tasks\n- [ ] TrackerPlugin interface extended appropriately\n- [ ] Help dialog shows 'l' shortcut\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T09:08:35.623615313Z","created_by":"Subsy","updated_at":"2026-01-12T09:39:17.15369552Z","closed_at":"2026-01-12T09:39:17.15369552Z","close_reason":"Implemented 'l' shortcut to load/switch epic with tracker-plugin specific behavior. EpicLoaderOverlay supports list mode for beads and file-prompt mode for json tracker. Typecheck and lint pass.","labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.7","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T09:08:35.624243798Z","created_by":"Subsy"}]} -{"id":"ralph-tui-tzw.8","title":"Test bead for refresh testing","status":"tombstone","priority":4,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T13:49:16.270118313Z","created_by":"Subsy","updated_at":"2026-01-12T13:50:32.478221757Z","labels":["ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.8","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T13:49:16.270939412Z","created_by":"Subsy"}],"deleted_at":"2026-01-12T13:50:32.478221757Z","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} -{"id":"ralph-tui-tzw.9","title":"FEAT: Restore agent and tracker info to top bar","description":"As a user, I want to see which agent and tracker are selected in the top bar so I know my configuration at a glance.\n\n## Context\nThe top bar was recently simplified but became too minimal, removing useful context about the current configuration.\n\n## Acceptance Criteria\n- [ ] Top bar shows selected agent plugin name (e.g., \"claude\", \"opencode\")\n- [ ] Top bar shows selected tracker plugin name (e.g., \"beads\", \"beads-bv\", \"json\")\n- [ ] Information fits without overcrowding the header\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:42.683904329Z","created_by":"Subsy","updated_at":"2026-01-12T14:29:53.578932999Z","closed_at":"2026-01-12T14:29:53.578932999Z","close_reason":"Implemented agent and tracker display in header. Added agentName/trackerName to HeaderProps, updated Header component to display them compactly (agent/tracker format), and connected config values from RunApp. All acceptance criteria met: typecheck and lint pass.","labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.9","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-01-12T14:13:42.684757849Z","created_by":"Subsy"}]} -{"id":"ralph-tui-u9i","title":"Story 1.2: OSC 52 Base64 Image Detection","description":"## Description\nDetect base64-encoded images pasted via OSC 52 protocol (supported by iTerm2, Kitty, WezTerm).\n\n## Acceptance Criteria\n- [ ] Detect OSC 52 escape sequences containing image data\n- [ ] Extract and decode base64 image payload\n- [ ] Detect image format from magic bytes or data URI prefix\n- [ ] Fall back to raw text paste if not valid image data\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- OSC 52 format: `\\x1b]52;c;\u003cbase64-data\u003e\\x07`\n- Also handle data URI format: `data:image/png;base64,...`\n- Detect format from base64 magic bytes: PNG (`iVBOR`), JPEG (`/9j/`), GIF (`R0lGOD`), WebP (`UklGR`)\n\n## Priority\nMedium\n\n## Estimate\n5 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:13.384349+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-v45","title":"Test Beads-Rust Tracker Integration","description":"Epic to test ralph-tui beads-rust tracker plugin functionality","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2026-01-21T00:39:11.04703841Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.458609925Z","deleted_at":"2026-01-21T00:42:45.458603813Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"epic"} -{"id":"ralph-tui-v8k","title":"Clean up untracked sandbox artifacts","description":"Address untracked files in repo (coverage artifacts and sandbox helper files) left from previous iterations.","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T00:05:39.194818478Z","created_by":"Subsy","updated_at":"2026-01-16T00:05:39.194818478Z","labels":["chore"]} -{"id":"ralph-tui-wwf","title":"US-008: Exit Cleanup with Confirmation","description":"## User Story\nAs a user, I want ralph-tui to offer to clean up session images when I exit so that I don't accumulate orphaned files.\n\n## Acceptance Criteria\n- [ ] On exit, if `cleanup_policy = \"on_exit\"` and images exist, show confirmation\n- [ ] Confirmation lists image filenames\n- [ ] Options: [Y] Yes, [N] No, [A] Always (sets `skip_cleanup_confirmation`)\n- [ ] If `skip_cleanup_confirmation = true`, delete without prompting\n- [ ] If `cleanup_policy = \"manual\"` or `\"never\"`, skip cleanup entirely\n- [ ] Handle Ctrl+C / SIGTERM gracefully (still prompt if possible)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Use Ink's exit handling hooks\n- Write config update for \"Always\" option atomically\n- Log cleanup actions for debugging\n\n## Dependencies\n- US-003: Configuration Schema Extension (ralph-tui-skz)\n\n## Estimate\n3 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:13:51.893141+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:10.120439+11:00","labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-wwf","depends_on_id":"ralph-tui-skz","type":"blocks","created_at":"2026-01-16T21:13:51.894517+11:00","created_by":"Jesse Merhi"}],"deleted_at":"2026-01-16T21:21:10.120439+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-x09","title":"Image File Path Detection","description":"## Description\nDetect when pasted text is a valid image file path and handle it as an image attachment.\n\n## Acceptance Criteria\n- [ ] Detect absolute and relative file paths ending in: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`\n- [ ] Validate that the file exists on disk before treating as image\n- [ ] Support paths with spaces (quoted or escaped)\n- [ ] Case-insensitive extension matching\n- [ ] If path doesn't exist or isn't an image, paste as raw text (graceful fallback)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/image-detection.ts`\n- Use `Bun.file().exists()` for validation\n- Regex pattern: `/^[\"']?(.+\\.(jpe?g|png|gif|webp))[\"']?$/i`\n\n## Estimate\n3 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:21:25.281156+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T00:57:53.303827+11:00","closed_at":"2026-01-17T00:57:53.303837+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-x09","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:21.612508+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-xcq","title":"Paste Event Integration in ChatView","description":"## Description\nIntegrate image detection into ChatView paste handling.\n\n## Acceptance Criteria\n- [ ] Ctrl+V / Cmd+V triggers unified image detection:\n 1. First check clipboard for actual image data\n 2. Then check if pasted text is a file path\n 3. Then check for base64/OSC 52 data\n 4. Fall back to normal text paste\n- [ ] If image detected: save to storage, insert `[Image N]` placeholder\n- [ ] If not image: paste text normally (existing behavior)\n- [ ] Works in all textarea components (main input, iteration input, etc.)\n- [ ] Paste handling is debounced to prevent double-processing\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify `src/tui/components/ChatView.tsx`\n- Use `keyHandler.on(\"paste\", ...)` from OpenTUI or Ink's `useInput`\n\n## Dependencies\n- useImageAttachment Hook (ralph-tui-zey)\n\n## Estimate\n3 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:02.416395+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:44:15.032713+11:00","closed_at":"2026-01-17T02:44:15.032713+11:00","close_reason":"Implemented paste event integration: usePaste hook with debouncing for OpenTUI paste events, ChatView onPaste callback prop for unified image detection (clipboard to file path to base64 to text fallback). Works in all textarea components via usePaste hook. Debouncing (100ms default) prevents double-processing. TypeCheck and build pass.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-xcq","depends_on_id":"ralph-tui-zey","type":"blocks","created_at":"2026-01-16T21:22:02.417922+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-xcq","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:21.850296+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-xj9","title":"Add warning when --no-network conflicts with agent requirements","description":"As a user, I want a clear warning when I use --no-network with an agent that requires network access, so I understand why things might not work.\n\n## Context\nAll current agents (Claude, OpenCode, Gemini) require network access to communicate with their LLM APIs. Using --no-network would completely break them. However, future agents (local LLMs like Ollama) might not need network.\n\nThe AgentSandboxRequirements.requiresNetwork field exists but is currently only informational - no validation occurs.\n\n## Acceptance Criteria\n- [ ] In sandbox wrapper or engine, check if sandbox.network === false AND agent.getSandboxRequirements().requiresNetwork === true\n- [ ] Emit a warning (not error) to stderr or via engine event: 'Warning: Agent declares network required but --no-network is enabled. API calls will fail.'\n- [ ] Warning should be visible in both TUI and headless modes\n- [ ] Update website/content/docs/configuration/sandbox.mdx with:\n - Explanation that --no-network disables ALL network access including LLM API calls\n - Note that current agents (claude, opencode, gemini-cli) all require network\n - Use case: future local LLM agents (Ollama, llama.cpp) won't need network\n - Warning about using --no-network with cloud-based agents\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T10:00:48.31516452Z","created_by":"Subsy","updated_at":"2026-01-16T10:06:16.775715237Z","closed_at":"2026-01-16T10:06:16.775715237Z","close_reason":"Closed","labels":["docs","enhancement","ralph"]} -{"id":"ralph-tui-y2a","title":"Default TUI launch should behave like 'ralph-tui run'","description":"## User Story\nAs a user launching ralph-tui without arguments, I want it to start in a useful mode (like 'run'), so that I can immediately begin working without needing to know specific commands.\n\n## Current Behavior\n- Running `ralph-tui` with no arguments enters a strange mode\n- Can't really do anything useful\n- ESC immediately quits\n- Serves no apparent purpose\n\n## Expected Behavior\n- `ralph-tui` (no args) should behave the same as `ralph-tui run`\n- User lands in the main task orchestration view\n- Can immediately see tasks, start work, etc.\n\n## Acceptance Criteria\n- [ ] `ralph-tui` with no arguments launches run mode\n- [ ] Existing `ralph-tui run` command continues to work\n- [ ] Help text updated if needed to reflect default behavior\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-13T08:19:17.768615009Z","created_by":"Subsy","updated_at":"2026-01-13T08:24:40.56383705Z","closed_at":"2026-01-13T08:24:40.56383705Z","close_reason":"Default launch now behaves like 'run' command. Removed unused launchTui() and bare App TUI."} -{"id":"ralph-tui-yd5","title":"Prompt Image Path Injection","description":"## Description\nAppend image paths to prompts sent to agents.\n\n## Acceptance Criteria\n- [ ] Images appended to prompt in structured format:\n ```\n [user message]\n\n [Attached Images]\n - Image 1: /absolute/path/to/img-abc123.png\n - Image 2: /absolute/path/to/img-def456.png\n ```\n- [ ] Uses absolute paths for reliability\n- [ ] No \"[Attached Images]\" section if no images\n- [ ] Clear attached images after prompt is sent\n- [ ] Works for both PRD chat and Run command prompts\n- [ ] Respects `max_images_per_message` config limit\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify prompt construction in `PrdChatApp.tsx` and `RunApp.tsx`\n- Use `getPromptSuffix()` from useImageAttachment hook\n- Ensure paths are properly escaped if they contain spaces\n\n## Dependencies\n- useImageAttachment Hook (ralph-tui-zey)\n- Image Configuration Options (ralph-tui-74q)\n\n## Estimate\n2 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:12.5904+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T03:04:32.555468+11:00","closed_at":"2026-01-17T03:04:32.555468+11:00","close_reason":"Implemented prompt image path injection for PRD chat. Images appended in structured format with absolute paths, respecting max_images_per_message config. Clear images after prompt sent.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-yd5","depends_on_id":"ralph-tui-zey","type":"blocks","created_at":"2026-01-16T21:22:12.592318+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-yd5","depends_on_id":"ralph-tui-74q","type":"blocks","created_at":"2026-01-16T21:22:12.593703+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-yd5","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.002726+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-z42","title":"Story 3.1: Create useImageAttachment Hook","description":"## Description\nCreate a React hook that manages image attachments for text input components.\n\n## Acceptance Criteria\n- [ ] Hook returns: `{ attachedImages, attachImage, removeImage, clearImages, getPromptSuffix }`\n- [ ] `attachImage(input: string)` - detects and processes image from pasted text\n- [ ] `removeImage(index: number)` - removes an attachment\n- [ ] `clearImages()` - removes all attachments\n- [ ] `getPromptSuffix()` - returns formatted string for appending to prompt\n- [ ] Track images with: `{ id: string, originalPath: string, storedPath: string, displayName: string }`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/hooks/useImageAttachment.ts`\n- Prompt suffix format: `\\n\\nRelevant images you should review before you begin are in:\\n- /absolute/path/to/image1.png\\n- /absolute/path/to/image2.jpg`\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n- Story 1.3: Image Storage System (ralph-tui-sdc)\n\n## Priority\nHigh\n\n## Estimate\n5 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:18:39.747681+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-16T21:21:11.14167+11:00","labels":["image-attachment"],"deleted_at":"2026-01-16T21:21:11.14167+11:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"ralph-tui-zey","title":"useImageAttachment Hook","description":"## Description\nCreate a React hook that manages image attachments for text input components, unifying all detection methods.\n\n## Acceptance Criteria\n- [ ] Hook returns: `{ attachedImages, attachImage, removeImage, clearImages, getPromptSuffix }`\n- [ ] `attachImage(input: string)` - detects image from:\n - File path paste (e.g., `/path/to/image.png`)\n - Clipboard image data (Ctrl+V with image copied)\n - Base64/OSC 52 data\n- [ ] `removeImage(index: number)` - removes an attachment\n- [ ] `clearImages()` - removes all attachments\n- [ ] `getPromptSuffix()` - returns formatted string for appending to prompt\n- [ ] Track images with: `{ id, originalSource, storedPath, displayName }`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/hooks/useImageAttachment.ts`\n- Prompt suffix format:\n ```\n [Attached Images]\n - Image 1: /absolute/path/to/img-abc123.png\n - Image 2: /absolute/path/to/img-def456.png\n ```\n\n## Dependencies\n- Image Storage Manager (ralph-tui-35v)\n- Image File Path Detection (ralph-tui-x09)\n- Platform Clipboard Image Reader (ralph-tui-g0o)\n\n## Estimate\n5 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:21:54.106199+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T02:34:56.222915+11:00","closed_at":"2026-01-17T02:34:56.222915+11:00","close_reason":"Implemented useImageAttachment hook that unifies all image detection methods (file paths, clipboard, base64). Hook provides attachedImages state, attachImage(), attachFromClipboard(), removeImage(), clearImages(), getPromptSuffix() and hasImages. Tracks images with {id, originalSource, storedPath, displayName}. TypeCheck and build pass.","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-35v","type":"blocks","created_at":"2026-01-16T21:21:54.110458+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-x09","type":"blocks","created_at":"2026-01-16T21:21:54.112227+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-g0o","type":"blocks","created_at":"2026-01-16T21:21:54.113301+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:21.774353+11:00","created_by":"Jesse Merhi"}]} -{"id":"ralph-tui-zmu","title":"First-Time Paste Hint","description":"## Description\nShow hint to new users about image paste support.\n\n## Acceptance Criteria\n- [ ] On first text paste of session, show transient hint\n- [ ] Hint: \"Tip: You can paste images too (file paths or Ctrl+V with image copied)\"\n- [ ] Only shown once per session\n- [ ] Dismisses automatically after 3 seconds or on keypress\n- [ ] Can be disabled in config: `show_paste_hints = false`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- Paste Event Integration in ChatView (ralph-tui-xcq)\n\n## Estimate\n1 point","notes":"Implemented first-time paste hint feature. Created usePasteHint hook that shows info toast on first text paste of session. Hint auto-dismisses after 3 seconds or on any keypress. Added show_paste_hints config option (default: true) to ImageConfig. Integrated into PrdChatApp and added settings toggle. All acceptance criteria met: typecheck and build pass.","status":"closed","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T21:22:40.933348+11:00","created_by":"Jesse Merhi","updated_at":"2026-01-17T03:19:31.947257+11:00","closed_at":"2026-01-17T03:19:31.947264+11:00","labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-zmu","depends_on_id":"ralph-tui-xcq","type":"blocks","created_at":"2026-01-16T21:22:40.934839+11:00","created_by":"Jesse Merhi"},{"issue_id":"ralph-tui-zmu","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-01-16T21:27:22.543885+11:00","created_by":"Jesse Merhi"}]} +{"id":"ralph-tui-08z","title":"Image Paste Feedback & Error Handling","description":"## Description\nProvide user feedback when images are attached or when errors occur.\n\n## Acceptance Criteria\n- [ ] Success toast: \"Image attached\" when image successfully stored\n- [ ] Error toast: \"Invalid image path\" when file doesn't exist\n- [ ] Error toast: \"Unsupported format\" when file isn't supported image type\n- [ ] Error toast: \"Failed to read clipboard\" when clipboard tool fails\n- [ ] Error toast: \"Failed to save image\" when storage fails\n- [ ] Info toast on missing tools with install hint:\n - macOS: \"Install pngpaste: `brew install pngpaste`\"\n - Linux: \"Install xclip: `sudo apt install xclip`\"\n- [ ] Missing tool message shown only once per session\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Integrate with Toast component (or create inline if Toast not ready)\n- Graceful degradation: if clipboard tools missing, file path paste still works\n\n## Dependencies\n- Paste Event Integration in ChatView (ralph-tui-xcq)\n\n## Estimate\n2 points","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:25.017919Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:52:00.233597Z","closed_at":"2026-01-16T15:52:00.233597Z","close_reason":"Implemented toast notification system for image paste feedback. Created useToast hook, Toast component, and useImageAttachmentWithFeedback wrapper. Provides success/error toasts and platform-specific install hints shown once per session. ChatView accepts toasts prop. All quality checks pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-08z","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-08z","depends_on_id":"ralph-tui-xcq","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-0t7","title":"Toggle between task details and output in details panel","description":"## User Story\nAs a user viewing a task, I want to toggle between task details and iteration output views, so that I can maximize screen space for whichever view I need.\n\n## Current Behavior\n- Details panel shows both task metadata AND iteration output stacked vertically\n- Limited space for output when task has long description\n- Cannot focus on just the output\n\n## Acceptance Criteria\n- [ ] Press 'o' to toggle between details view and output view\n- [ ] Details view shows: task title, ID, status, description, dependencies\n- [ ] Output view shows: full-height scrollable iteration output\n- [ ] Visual indicator shows which mode is active\n- [ ] Default to details view, switch to output when iteration starts\n\n## Technical Notes\n- File: src/tui/components/RightPanel.tsx\n- Add state for view mode (details | output)\n- Update keyboard handler in RunApp.tsx for 'o' key","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T12:29:15.106618817Z","created_by":"Subsy","updated_at":"2026-01-12T13:58:18.151348872Z","closed_at":"2026-01-12T13:58:18.151348872Z","close_reason":"Implemented toggle between details and output views in RightPanel with 'o' key. Details view shows task metadata, output view shows full-height scrollable iteration output. Auto-switches to output when iteration starts.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-0t7","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-12c","title":"Story 1.4: Image Cleanup on Exit","description":"## Description\nClean up stored images when ralph-tui process exits, respecting user configuration.\n\n## Acceptance Criteria\n- [ ] Delete all files in `.ralph-tui/images/` on process exit\n- [ ] Respect `cleanupImages` config option (default: `true`)\n- [ ] Handle cleanup on normal exit, SIGINT, and SIGTERM\n- [ ] Don't fail silently - log cleanup errors\n- [ ] Don't delete the `.ralph-tui/images/` directory itself (only contents)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Register cleanup handlers in main entry points (`run.tsx`, `create-prd.tsx`, `resume.tsx`)\n- Use `process.on('exit')`, `process.on('SIGINT')`, `process.on('SIGTERM')`\n- Check config via `storedConfig?.cleanupImages ?? true`\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:05.797708Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-12m","title":"Validate full workflow","description":"End-to-end test of the complete beads-rust workflow","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.740341622Z","created_by":"plgeek","updated_at":"2026-01-21T01:00:56.811932631Z","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-12m","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-12m","depends_on_id":"ralph-tui-exe","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-12m","depends_on_id":"ralph-tui-ez4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-147h","title":"Sequential Epic Queue from Load Epic Screen","description":"Enable queueing epics from Load Epic during active runs. Selected epics run sequentially in FIFO order after current epic completes, with optional explicit switch-now action.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2026-02-28T23:40:02.864858Z","created_by":"mat","updated_at":"2026-02-28T23:59:02.241248Z","source_repo":".","deleted_at":"2026-02-28T23:59:02.241245Z","deleted_by":"mat","delete_reason":"moved to feature/sequential-epic-queue","original_type":"epic","compaction_level":0,"original_size":0} +{"id":"ralph-tui-147h.1","title":"US-001: Persist Epic Queue in Session State","description":"As a user, I want queued epics saved in session state so that pause/resume keeps my planned run order.\n\n## Acceptance Criteria\n- [ ] Add queue snapshot fields to persisted session tracker state with backward-compatible defaults\n- [ ] Queue order is serialized/deserialized as FIFO and restored on resume\n- [ ] Existing sessions without queue fields still load safely\n- [ ] Unit tests cover persistence round-trip and legacy-state fallback\n- [ ] Failing test added first and observed failing (TDD red)\n- [ ] Minimal implementation added (TDD green)\n- [ ] Relevant tests pass after fix\n- [ ] Verification evidence captured from fresh command output\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"tombstone","priority":1,"issue_type":"task","created_at":"2026-02-28T23:40:02.903184Z","created_by":"mat","updated_at":"2026-02-28T23:59:02.239475Z","source_repo":".","deleted_at":"2026-02-28T23:59:02.239473Z","deleted_by":"mat","delete_reason":"moved to feature/sequential-epic-queue","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-147h.2","title":"US-002: Queue Epic from Load Epic While Running","description":"As an operator, I want selecting an epic during active execution to queue it so that current epic continues uninterrupted.\n\n## Acceptance Criteria\n- [ ] l opens Load Epic while status is running/executing/selecting/paused/ready/idle/complete/error (local mode only)\n- [ ] In active run states, primary select action queues selected epic instead of immediate switch\n- [ ] Duplicate queued epic IDs are prevented with clear user feedback\n- [ ] Existing immediate-switch path remains available via explicit switch-now action with confirmation\n- [ ] Keyboard/help text reflects queue vs switch behavior\n- [ ] Failing test added first and observed failing (TDD red)\n- [ ] Minimal implementation added (TDD green)\n- [ ] Relevant tests pass after fix\n- [ ] Verification evidence captured from fresh command output\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"tombstone","priority":1,"issue_type":"task","created_at":"2026-02-28T23:40:02.937021Z","created_by":"mat","updated_at":"2026-02-28T23:59:02.240847Z","source_repo":".","deleted_at":"2026-02-28T23:59:02.240844Z","deleted_by":"mat","delete_reason":"moved to feature/sequential-epic-queue","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-147h.3","title":"US-003: Auto-Advance to Next Queued Epic","description":"As an operator, I want next queued epic to start automatically after completion so that queued work runs end-to-end sequentially.\n\n## Acceptance Criteria\n- [ ] On current epic completion, next queued epic becomes active epic and tasks refresh from tracker\n- [ ] Next queued epic starts automatically without extra keypress\n- [ ] If active epic fails/stops with unresolved work, queue execution halts and remaining queue is preserved\n- [ ] Queue depletion leaves system in normal complete/idle behavior\n- [ ] Persistence updates current epic + remaining queue after each transition\n- [ ] Failing test added first and observed failing (TDD red)\n- [ ] Minimal implementation added (TDD green)\n- [ ] Relevant tests pass after fix\n- [ ] Verification evidence captured from fresh command output\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"tombstone","priority":1,"issue_type":"task","created_at":"2026-02-28T23:40:02.969294Z","created_by":"mat","updated_at":"2026-02-28T23:59:02.240437Z","source_repo":".","deleted_at":"2026-02-28T23:59:02.240434Z","deleted_by":"mat","delete_reason":"moved to feature/sequential-epic-queue","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-147h.4","title":"US-004: Show and Manage Queue in TUI","description":"As an operator, I want visibility and basic control over queued epics so that I can validate and adjust run order.\n\n## Acceptance Criteria\n- [ ] Main run UI shows compact queued-epic count badge\n- [ ] Load Epic overlay shows queued epics in order, separate from currently active epic\n- [ ] User can remove a queued epic (without reorder) from queue management controls\n- [ ] Removal updates persisted queue immediately\n- [ ] Queue view clearly marks current epic vs queued epics\n- [ ] Failing test added first and observed failing (TDD red)\n- [ ] Minimal implementation added (TDD green)\n- [ ] Relevant tests pass after fix\n- [ ] Verification evidence captured from fresh command output\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-02-28T23:40:03.000870Z","created_by":"mat","updated_at":"2026-02-28T23:59:02.241643Z","source_repo":".","deleted_at":"2026-02-28T23:59:02.241640Z","deleted_by":"mat","delete_reason":"moved to feature/sequential-epic-queue","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-147h.5","title":"US-005: Regression Coverage for Queue Lifecycle","description":"As a maintainer, I want regression tests for queue lifecycle so that future changes do not break sequential epic orchestration.\n\n## Acceptance Criteria\n- [ ] Tests cover queueing during active run, auto-transition on completion, and halt-on-failure policy\n- [ ] Tests cover resume path with pre-populated queue from session file\n- [ ] Tests cover explicit switch-now behavior not corrupting queued order\n- [ ] Tests cover local-only scope guard for remote tabs\n- [ ] Failing test added first and observed failing (TDD red)\n- [ ] Minimal implementation added (TDD green)\n- [ ] Relevant tests pass after fix\n- [ ] Verification evidence captured from fresh command output\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"tombstone","priority":1,"issue_type":"task","created_at":"2026-02-28T23:40:03.032364Z","created_by":"mat","updated_at":"2026-02-28T23:59:02.240005Z","source_repo":".","deleted_at":"2026-02-28T23:59:02.240001Z","deleted_by":"mat","delete_reason":"moved to feature/sequential-epic-queue","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-1aj","title":"Verify CRUD operations","description":"Test create, read, update, close operations work correctly","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.164609961Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.460731387Z","closed_at":"2026-01-21T00:42:45.460731387Z","source_repo":".","deleted_at":"2026-01-21T00:42:45.460727780Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-33e","title":"Test ready command filtering","description":"Verify br ready only shows unblocked issues","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.191745148Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.460008383Z","closed_at":"2026-01-21T00:42:45.460008383Z","source_repo":".","deleted_at":"2026-01-21T00:42:45.460004656Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-348","title":"Subagent Tracing","description":"Add visibility into subagent execution within ralph-tui. When Claude Code spawns subagents via the Task tool, provide observability into subagent activity with real-time hierarchy display, configurable detail levels, and full trace persistence to iteration logs.","status":"closed","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-12T14:03:41.464239637Z","created_by":"Subsy","updated_at":"2026-01-12T21:17:10.631644440Z","closed_at":"2026-01-12T21:17:10.631644440Z","close_reason":"Completed - subagent tracing implemented, UI improvements done, core orchestrator functional","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"]} +{"id":"ralph-tui-348.1","title":"US-001: Agent plugin declares tracing capabilities","description":"As a plugin developer, I want to declare whether my agent supports structured output so ralph-tui knows when subagent tracing is available.\n\n**Acceptance Criteria:**\n- [ ] Add `supportsSubagentTracing: boolean` to `AgentPluginMeta` interface\n- [ ] Add optional `structuredOutputFormat?: 'json' | 'jsonl'` to meta\n- [ ] Claude plugin declares `supportsSubagentTracing: true`\n- [ ] OpenCode plugin declares `supportsSubagentTracing: false` (initially)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:03:50.276393310Z","created_by":"Subsy","updated_at":"2026-01-12T14:40:50.700229791Z","closed_at":"2026-01-12T14:40:50.700229791Z","close_reason":"Implemented: Added supportsSubagentTracing and structuredOutputFormat to AgentPluginMeta interface. Claude plugin declares true with jsonl format, OpenCode declares false.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.1","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.10","title":"US-010: Display subagent summary in iteration history","description":"As a user viewing past iterations, I want to see a summary of subagent activity so I understand what happened.\n\n**Acceptance Criteria:**\n- [ ] Show subagent count in iteration list: '5 subagents'\n- [ ] Show failure indicator if any subagent failed\n- [ ] In detail view, show expandable subagent tree\n- [ ] Load trace data lazily (only when viewing details)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:56.522496283Z","created_by":"Subsy","updated_at":"2026-01-12T15:21:19.553751564Z","closed_at":"2026-01-12T15:21:19.553751564Z","close_reason":"Implemented subagent summary display in iteration history: count in list view, failure indicator, expandable tree in detail view, lazy loading of trace data","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.10","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.10","depends_on_id":"ralph-tui-348.9","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.2","title":"US-002: Enable JSON output mode for Claude agent","description":"As a user, I want ralph-tui to automatically use Claude Code's `--output-format json` when subagent tracing is enabled so structured events are captured.\n\n**Acceptance Criteria:**\n- [ ] Add `--output-format json` to Claude agent's buildArgs() when tracing enabled\n- [ ] Parse JSONL output stream instead of raw text\n- [ ] Fall back gracefully if JSON parsing fails (show raw output)\n- [ ] Add `subagentTracing: boolean` to agent execute options\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:03:57.373249781Z","created_by":"Subsy","updated_at":"2026-01-12T14:44:48.659545122Z","closed_at":"2026-01-12T14:44:48.659545122Z","close_reason":"Implemented JSON output mode for Claude agent: added subagentTracing option, --output-format json flag when enabled, JSONL parsing with fallback, and streaming parser support","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.2","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.2","depends_on_id":"ralph-tui-348.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.3","title":"US-003: Parse subagent lifecycle events","description":"As a developer, I need to parse Claude Code's JSON output to detect when subagents are spawned, running, and completed.\n\n**Acceptance Criteria:**\n- [ ] Create `SubagentEvent` type with: id, type (spawn|progress|complete|error), timestamp, agentType, description, parentId\n- [ ] Create `SubagentTraceParser` class that processes JSONL stream\n- [ ] Detect Task tool invocations as subagent spawn events\n- [ ] Track subagent completion with exit status and duration\n- [ ] Build parent-child hierarchy from nested Task calls\n- [ ] Emit events via callback for real-time updates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:04.706949345Z","created_by":"Subsy","updated_at":"2026-01-12T14:48:56.773960130Z","closed_at":"2026-01-12T14:48:56.773960130Z","close_reason":"Implemented SubagentTraceParser with types for parsing Task tool lifecycle events from Claude JSONL","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.3","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.3","depends_on_id":"ralph-tui-348.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.4","title":"US-004: Add subagent state tracking to engine","description":"As the engine, I need to maintain state about active and completed subagents during an iteration.\n\n**Acceptance Criteria:**\n- [ ] Create `SubagentState` interface: id, type, description, status, startedAt, completedAt, parentId, children[]\n- [ ] Add `subagents: Map` to iteration state\n- [ ] Update state as parser emits events\n- [ ] Calculate duration and nesting depth\n- [ ] Expose `getSubagentTree()` method for TUI\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:11.429801742Z","created_by":"Subsy","updated_at":"2026-01-12T14:53:50.920712974Z","closed_at":"2026-01-12T14:53:50.920712974Z","close_reason":"Implemented subagent state tracking in engine: EngineSubagentState interface with id/type/description/status/startedAt/completedAt/parentId/children/durationMs/depth fields, subagents Map in EngineState, integration with SubagentTraceParser via handleSubagentEvent callback, getSubagentTree() method for TUI rendering. Typecheck and lint pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.4","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.4","depends_on_id":"ralph-tui-348.3","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.5","title":"US-005: Create SubagentTreePanel TUI component","description":"As a user, I want to see a dedicated panel showing the subagent hierarchy so I can understand what the agent is working on.\n\n**Acceptance Criteria:**\n- [ ] Create `SubagentTreePanel` component showing tree structure\n- [ ] Display: agent type, description (truncated), status icon, duration\n- [ ] Status icons: spinner (running), checkmark (complete), X (failed)\n- [ ] Indent nested subagents to show hierarchy\n- [ ] Highlight currently active subagent\n- [ ] Auto-scroll to show newest activity\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Verify in TUI manually","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:19.023232322Z","created_by":"Subsy","updated_at":"2026-01-12T15:14:05.699483970Z","closed_at":"2026-01-12T15:14:05.699483970Z","close_reason":"Implemented SubagentTreePanel component with tree structure, status icons (spinner/checkmark/X), indentation for nested subagents, active subagent highlighting, and auto-scroll support. Typecheck and lint pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.5","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.5","depends_on_id":"ralph-tui-348.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.6","title":"US-006: Add collapsible subagent sections in output panel","description":"As a user, I want subagent activity shown inline in the output with collapsible sections so I can see context without switching panels.\n\n**Acceptance Criteria:**\n- [ ] Insert subagent start marker in output: `[Subagent: type] description`\n- [ ] Insert subagent end marker with status and duration\n- [ ] Make sections collapsible (toggle with Enter key when focused)\n- [ ] Collapsed sections show one-line summary\n- [ ] Expanded sections show full subagent output\n- [ ] Visually distinguish subagent output (different color/indent)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Verify in TUI manually","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:26.628830267Z","created_by":"Subsy","updated_at":"2026-01-12T15:10:54.675319089Z","closed_at":"2026-01-12T15:10:54.675319089Z","close_reason":"Implemented collapsible subagent sections in output panel with: SubagentSection component for hierarchical display, collapse state management, subagent tree threading from engine to RightPanel, color-coded status indicators, depth-based indentation, and trace level indicator in title bar.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.6","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.6","depends_on_id":"ralph-tui-348.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.7","title":"US-007: Add detail level configuration","description":"As a user, I want to configure how much subagent detail is shown so I can balance information vs noise.\n\n**Acceptance Criteria:**\n- [ ] Add `subagentTracing.detailLevel` to config: 'off' | 'minimal' | 'moderate' | 'full'\n- [ ] 'off': No tracing, use raw output (current behavior)\n- [ ] 'minimal': Show start/complete events only\n- [ ] 'moderate': Show events + description + duration\n- [ ] 'full': Show events + nested output + hierarchy panel\n- [ ] Add keyboard shortcut to cycle detail levels (e.g., 't')\n- [ ] Persist preference to config file\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:34.235166981Z","created_by":"Subsy","updated_at":"2026-01-12T15:04:40.612013969Z","closed_at":"2026-01-12T15:04:40.612013969Z","close_reason":"Implemented subagent tracing detail level configuration with type definition, Zod validation, Settings UI, 't' keyboard shortcut, and config persistence","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.7","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.8","title":"US-008: Toggle subagent panel visibility","description":"As a user, I want to show/hide the subagent panel to maximize space for output when needed.\n\n**Acceptance Criteria:**\n- [ ] Add keyboard shortcut 'T' (shift+t) to toggle subagent panel\n- [ ] Panel shows on right side, resizable\n- [ ] Remember panel state in session\n- [ ] When hidden, still track subagents (just don't display panel)\n- [ ] Update help overlay to show new shortcuts\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:41.865427955Z","created_by":"Subsy","updated_at":"2026-01-12T15:27:25.507101946Z","closed_at":"2026-01-12T15:27:25.507101946Z","close_reason":"Implemented subagent panel toggle with 'T' key. Panel shows on right side, is resizable, state persists to session, and subagents continue tracking when hidden. Help overlay updated.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.8","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.8","depends_on_id":"ralph-tui-348.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-348.9","title":"US-009: Persist subagent trace to iteration logs","description":"As a user, I want subagent trace data saved to iteration logs so I can analyze agent behavior after the fact.\n\n**Acceptance Criteria:**\n- [ ] Add `subagentTrace` section to iteration log format\n- [ ] Include: full event timeline, hierarchy tree, aggregate stats\n- [ ] Stats: total subagents, by type, total duration, failure count\n- [ ] Maintain backward compatibility (logs without trace still readable)\n- [ ] Update `loadIterationLog()` to parse trace section\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:04:49.838575561Z","created_by":"Subsy","updated_at":"2026-01-12T14:57:53.885617380Z","closed_at":"2026-01-12T14:57:53.885617380Z","close_reason":"Implemented subagent trace persistence to iteration logs with backward compatibility","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-348.9","depends_on_id":"ralph-tui-348","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-348.9","depends_on_id":"ralph-tui-348.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-35v","title":"Image Storage Manager","description":"## Description\nCreate a system to store attached images in a predictable location accessible to agents.\n\n## Acceptance Criteria\n- [ ] Store images in `.ralph-tui/images/` directory (created if not exists)\n- [ ] Generate unique filenames: `img-{sha256-prefix-12chars}.{ext}` (deduplicates identical images)\n- [ ] For file path attachments, copy file to storage location\n- [ ] For clipboard/base64 attachments, decode and write to storage location\n- [ ] Return absolute path to stored image\n- [ ] Provide method to list all session images\n- [ ] Provide method to delete all/individual session images\n- [ ] Handle storage errors gracefully\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/image-storage.ts`\n- Use Node.js `crypto` module for SHA256 hashing\n- Use `Bun.write()` for file operations\n- Storage path: `path.join(process.cwd(), '.ralph-tui', 'images')`\n\n## Estimate\n3 points","notes":"Implemented image-storage.ts module with: storeImageFromPath, storeImageFromBase64, storeImageFromBuffer for storing images; listStoredImages for listing; deleteStoredImage and deleteAllStoredImages for cleanup; SHA256-based deduplication; bun run typecheck and build pass","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:21:22.228112Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:27:00.507537Z","closed_at":"2026-01-16T15:27:00.507555Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-35v","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3az","title":"Validate full workflow","description":"End-to-end test of the complete beads-rust workflow","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.207326581Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.459335363Z","closed_at":"2026-01-21T00:42:45.459335363Z","source_repo":".","deleted_at":"2026-01-21T00:42:45.459332528Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-3bm","title":"Test dependency tracking","description":"Verify dependencies are tracked and block correctly","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-01-21T00:39:53.178295457Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.457875669Z","closed_at":"2026-01-21T00:42:45.457875669Z","source_repo":".","deleted_at":"2026-01-21T00:42:45.457869428Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-3l4","title":"Story 5.1: Create Toast Notification Component","description":"## Description\nCreate a reusable toast notification component for transient messages.\n\n## Acceptance Criteria\n- [ ] Toast appears in top-right corner of screen\n- [ ] Auto-dismisses after 3 seconds\n- [ ] Supports variants: `success`, `error`, `info`, `warning`\n- [ ] Shows icon + message text\n- [ ] Non-blocking (doesn't prevent other interactions)\n- [ ] Queue multiple toasts if needed\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/components/Toast.tsx`\n- Create: `src/tui/hooks/useToast.ts` for state management\n- Use absolute positioning with OpenTUI's `` component\n- Icons: ✓ (success), ✗ (error), ℹ (info), ⚠ (warning)\n\n## Priority\nMedium\n\n## Estimate\n3 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:19:11.803485Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-3od","title":"Story 3.3: Display Attached Images Indicator","description":"## Description\nShow visual indicator of attached images in the input area.\n\n## Acceptance Criteria\n- [ ] Display count of attached images near input: `📎 2 images attached`\n- [ ] Use subtle styling that doesn't clutter the interface\n- [ ] Show indicator only when images are attached\n- [ ] Position: above the textarea, left-aligned\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Add to ChatView.tsx input area section\n- Use existing color scheme: `colors.fg.muted` for text, `colors.accent.tertiary` for icon/count\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n- Story 1.3: Image Storage System (ralph-tui-sdc)\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:48.825959Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-3uo","title":"Verify CRUD operations","description":"Test create, read, update, close operations work correctly","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.680756343Z","created_by":"plgeek","updated_at":"2026-01-21T08:38:42.344356750Z","close_reason":"All CRUD operation tests now pass. Fixed test assertions to match actual implementation: getTasks, getTask, getNextTask, completeTask, and updateTaskStatus all verified.","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3uo","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3uu","title":"Story 3.2: Integrate Image Detection into ChatView Paste Handler","description":"## Description\nModify ChatView to detect and handle image pastes.\n\n## Acceptance Criteria\n- [ ] Intercept paste events before inserting text\n- [ ] Check if pasted content is an image (file path or base64)\n- [ ] If image: store it, add to attachments, insert placeholder `[Image N]`\n- [ ] If not image: paste text normally (existing behavior)\n- [ ] Support pasting multiple images (each gets sequential placeholder)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify `src/tui/components/ChatView.tsx`\n- Use `keyHandler.on(\"paste\", ...)` from OpenTUI\n- Insert `[Image 1]`, `[Image 2]`, etc. as placeholders in textarea\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n- Story 1.3: Image Storage System (ralph-tui-sdc)\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:44.721992Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-3v5w","title":"Session-Level Worktree Support","description":"Add a --worktree flag that creates an isolated git worktree for the entire ralph-tui session. Keeps the user's main working tree clean while ralph-tui operates in a dedicated branch. On successful completion, changes are auto-merged back to the original branch. On failure, the worktree is preserved for manual recovery.\n\nDiffers from the existing parallel worktree system (per-worker worktrees inside --parallel mode). Session-level worktrees wrap the entire run — sequential or parallel — in a single isolated workspace.\n\n## Goals\n- Run ralph-tui in an isolated worktree with a single flag\n- Auto-merge completed work back on success\n- Preserve worktrees on failure for recovery\n- Support config file option (worktree = true) and CLI flag\n- Work with any task source (epic, PRD, default tracker)\n- Compose with --parallel (parallel worktrees nest inside session worktree)\n- Ensure tracker data (beads exports, prd.json) is available in the worktree\n\nGitHub Issue: https://github.com/subsy/ralph-tui/issues/345","status":"open","priority":1,"issue_type":"epic","created_at":"2026-02-28T06:45:18.247586Z","created_by":"mat","updated_at":"2026-02-28T06:45:18.247586Z","source_repo":".","compaction_level":0,"original_size":0} +{"id":"ralph-tui-3v5w.1","title":"US-001: Add --worktree CLI flag and config option","description":"As a user, I want to pass --worktree (or --worktree ) on the command line so that ralph-tui runs in an isolated git worktree.\n\n## Acceptance Criteria\n- [ ] --worktree flag is parsed in parseRunArgs() in src/commands/run.tsx\n- [ ] --worktree with no value defaults to auto-generated name based on task source (epic ID, PRD filename, or session ID)\n- [ ] --worktree uses the provided name for the branch and directory\n- [ ] worktree field added to RuntimeOptions in src/config/types.ts as worktree?: boolean | string\n- [ ] worktree field added to StoredConfig in src/config/types.ts as worktree?: boolean | string\n- [ ] Config file option worktree = true or worktree = \"my-branch\" is supported in .ralph-tui/config.toml\n- [ ] CLI flag overrides config file value\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":1,"issue_type":"task","created_at":"2026-02-28T06:45:29.973131Z","created_by":"mat","updated_at":"2026-02-28T06:53:28.865028Z","closed_at":"2026-02-28T06:53:28.865013Z","close_reason":"Added --worktree CLI flag parsing and worktree config option to RuntimeOptions and StoredConfig","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.1","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:45:29.973131Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.2","title":"US-002: Create session worktree before execution","description":"As a user, I want ralph-tui to create a git worktree at session start so that all task execution happens in an isolated copy of the repo.\n\n## Acceptance Criteria\n- [ ] When --worktree is active, a git worktree is created before the execution engine starts\n- [ ] Branch naming follows pattern ralph-session/{name} where name is derived from epic ID, PRD filename, custom name, or session short ID\n- [ ] Worktree is created as a sibling directory using the existing getWorktreeBaseDir() pattern (outside the project tree)\n- [ ] The worktree directory name matches the branch name suffix (e.g., worker-session or the custom name)\n- [ ] .ralph-tui/config.toml is copied into the worktree (reuse existing copyConfig() logic)\n- [ ] The execution engine cwd is set to the worktree path\n- [ ] Disk space is checked before creation (reuse existing checkDiskSpace() logic)\n- [ ] If worktree creation fails, ralph-tui exits with a clear error message\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":1,"issue_type":"task","created_at":"2026-02-28T06:45:40.690158Z","created_by":"mat","updated_at":"2026-02-28T06:57:11.873230Z","closed_at":"2026-02-28T06:57:11.873214Z","close_reason":"Implemented session worktree creation: new module src/session-worktree.ts with createSessionWorktree/deriveSessionName, integrated into executeRunCommand to create worktree before engine start when --worktree is active","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.2","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:45:40.690158Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.2","depends_on_id":"ralph-tui-3v5w.1","type":"blocks","created_at":"2026-02-28T06:48:17.647575Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.3","title":"US-003: Copy tracker data into session worktree","description":"As a user, I want my tracker data (beads issues, prd.json) to be available in the worktree so that the agent can read and update tasks.\n\n## Acceptance Criteria\n- [ ] After worktree creation, tracker data files are copied from the main repo into the worktree (following the same pattern as the existing copyConfig() method in worktree-manager.ts)\n- [ ] For beads-rust tracker: run br sync --flush-only in the main repo before copying to ensure the JSONL export is up to date with the SQLite database\n- [ ] For beads-rust tracker: copy the entire .beads/ directory (including issues.jsonl, config.yaml, metadata.json) into the worktree, excluding git-ignored files (*.db, *.db-shm, *.db-wal, *.lock, last-touched)\n- [ ] For beads (legacy) tracker: same approach as beads-rust — sync then copy .beads/ excluding git-ignored files\n- [ ] For JSON tracker: copy the prd.json file (or configured PRD path) into the worktree if it exists in the main repo\n- [ ] The copy step happens after worktree creation but before engine initialization\n- [ ] If br sync --flush-only fails (e.g., br not installed), log a warning and continue — the worktree will still have whatever was in git at HEAD\n- [ ] Tracker data copy is implemented as a new method (e.g., copyTrackerData()) alongside the existing copyConfig() in the worktree management code\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":1,"issue_type":"task","created_at":"2026-02-28T06:47:15.752252Z","created_by":"mat","updated_at":"2026-02-28T07:00:21.543793Z","closed_at":"2026-02-28T07:00:21.543776Z","close_reason":"Implemented copyTrackerData() for beads-rust, beads, beads-bv, and json trackers with sync-before-copy and exclusion of git-ignored files","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.3","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:47:15.752252Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.3","depends_on_id":"ralph-tui-3v5w.2","type":"blocks","created_at":"2026-02-28T06:48:17.678862Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.4","title":"US-004: Auto-merge on successful completion","description":"As a user, I want ralph-tui to automatically merge the worktree branch back to my original branch when all tasks complete successfully.\n\n## Acceptance Criteria\n- [ ] On successful session completion (all tasks done, no fatal errors), ralph-tui switches back to the original branch\n- [ ] Attempts fast-forward merge first (git merge --ff-only)\n- [ ] Falls back to merge commit if fast-forward is not possible (git merge --no-edit)\n- [ ] On successful merge, the worktree directory is removed and the branch is deleted\n- [ ] If merge fails (conflicts), the worktree and branch are preserved with a clear message showing the worktree path and branch name\n- [ ] A log message confirms successful merge with the branch name\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-02-28T06:47:23.768556Z","created_by":"mat","updated_at":"2026-02-28T07:03:33.523319Z","closed_at":"2026-02-28T07:03:33.523296Z","close_reason":"Implemented auto-merge on successful session completion with ff-only then merge commit fallback","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.4","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:47:23.768556Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.4","depends_on_id":"ralph-tui-3v5w.2","type":"blocks","created_at":"2026-02-28T06:48:17.708779Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.5","title":"US-005: Preserve worktree on failure","description":"As a user, I want the worktree to be preserved if the session fails so I can inspect or recover the work.\n\n## Acceptance Criteria\n- [ ] If the session exits due to error (agent crash, max iterations with incomplete tasks, user interrupt), the worktree and branch are preserved\n- [ ] A clear message is printed showing: worktree path, branch name, and how to manually merge or clean up\n- [ ] The message includes example commands: git merge and git worktree remove \n- [ ] Iteration logs from the worktree are copied to the main project before the session ends (reuse existing preserveIterationLogs() pattern)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-02-28T06:47:41.415890Z","created_by":"mat","updated_at":"2026-02-28T07:05:53.525010Z","closed_at":"2026-02-28T07:05:53.524994Z","close_reason":"Implemented worktree preservation on failure","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.5","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:47:41.415890Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.5","depends_on_id":"ralph-tui-3v5w.2","type":"blocks","created_at":"2026-02-28T06:48:17.743318Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.6","title":"US-006: Compose with parallel execution","description":"As a user, I want --worktree and --parallel to work together so that parallel workers create their worktrees inside the session worktree context.\n\n## Acceptance Criteria\n- [ ] When both --worktree and --parallel are used, the session worktree is created first\n- [ ] The parallel executor runs inside the session worktree (its cwd is the session worktree path)\n- [ ] Parallel worker worktrees are created as siblings of the session worktree (following existing getWorktreeBaseDir() pattern)\n- [ ] On completion, parallel worker branches merge into the session branch first, then the session branch merges back to the original branch\n- [ ] Cleanup removes both parallel worktrees and the session worktree on success\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-02-28T06:47:50.401152Z","created_by":"mat","updated_at":"2026-02-28T07:09:08.781264Z","closed_at":"2026-02-28T07:09:08.781248Z","close_reason":"Composed --worktree and --parallel: forces directMerge so workers merge into session branch, places worker worktrees as siblings of session worktree","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.6","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:47:50.401152Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.6","depends_on_id":"ralph-tui-3v5w.3","type":"blocks","created_at":"2026-02-28T06:48:17.803738Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.6","depends_on_id":"ralph-tui-3v5w.4","type":"blocks","created_at":"2026-02-28T06:48:17.774695Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.7","title":"US-007: Session worktree name derivation","description":"As a user, I want sensible default worktree names based on my task source so I don't have to specify one manually.\n\n## Acceptance Criteria\n- [ ] When --worktree is used with --epic , name is derived from the epic ID (sanitized for git branch names)\n- [ ] When --worktree is used with --prd , name is derived from the PRD filename (without extension, sanitized)\n- [ ] When --worktree is used alone (no epic/PRD), name uses the session short ID\n- [ ] When --worktree is used, the custom name is used directly (sanitized)\n- [ ] All names are sanitized using the existing sanitizeBranchName() function (export it from worktree-manager.ts if needed)\n- [ ] Branch format is ralph-session/{derived-name}\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-02-28T06:47:58.521310Z","created_by":"mat","updated_at":"2026-02-28T07:10:37.120450Z","closed_at":"2026-02-28T07:10:37.120429Z","close_reason":"Consolidated sanitizeBranchName from worktree-manager.ts, exported it, and used it in session-worktree.ts deriveSessionName()","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.7","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:47:58.521310Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.7","depends_on_id":"ralph-tui-3v5w.1","type":"blocks","created_at":"2026-02-28T06:48:17.832939Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-3v5w.8","title":"US-008: Update documentation for worktree support","description":"As a contributor or user, I want the documentation to reflect the new --worktree flag and config option so I can discover and understand the feature.\n\n## Acceptance Criteria\n- [ ] README.md — Add --worktree to the \"Common Options\" section with examples: ralph-tui run --epic abc-123 --worktree and ralph-tui run --worktree my-feature --prd ./prd.json\n- [ ] README.md — Add \"Session Worktrees\" entry to the Features list describing isolated execution with auto-merge\n- [ ] testing/TESTING.md — Add a test scenario section for session worktree testing covering: basic worktree creation, tracker data availability, auto-merge on success, preservation on failure, composition with --parallel\n- [ ] src/commands/run.tsx — Update the help text to include --worktree [name] with description \"Run in an isolated git worktree (auto-merges on success)\"\n- [ ] All new source files include ABOUTME header comments per project convention\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":3,"issue_type":"task","created_at":"2026-02-28T06:48:09.764782Z","created_by":"mat","updated_at":"2026-02-28T07:12:42.306666Z","closed_at":"2026-02-28T07:12:42.306644Z","close_reason":"Documentation updated: README.md (--worktree in Common Options + Session Worktrees feature), TESTING.md (worktree test scenarios), help text updated","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-3v5w.8","depends_on_id":"ralph-tui-3v5w","type":"parent-child","created_at":"2026-02-28T06:48:09.764782Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.8","depends_on_id":"ralph-tui-3v5w.4","type":"blocks","created_at":"2026-02-28T06:48:17.863512Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.8","depends_on_id":"ralph-tui-3v5w.5","type":"blocks","created_at":"2026-02-28T06:48:17.893950Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.8","depends_on_id":"ralph-tui-3v5w.6","type":"blocks","created_at":"2026-02-28T06:48:17.923328Z","created_by":"mat","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-3v5w.8","depends_on_id":"ralph-tui-3v5w.7","type":"blocks","created_at":"2026-02-28T06:48:17.952110Z","created_by":"mat","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q","title":"Gemini CLI Agent Plugin","description":"Add a new agent plugin for Google's Gemini CLI to ralph-tui, enabling users to orchestrate AI coding tasks using Gemini models. Supports streaming JSONL output for subagent tracing, file context via directories, and full autonomy mode.","status":"open","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:14.220603891Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:14.220603891Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"]} +{"id":"ralph-tui-41q.1","title":"US-001: Create Gemini CLI plugin skeleton","description":"As a developer, I want the basic plugin class structure so that I can build out the Gemini CLI integration.\n\n## Acceptance Criteria\n- [ ] Create src/plugins/agents/builtin/gemini.ts\n- [ ] File starts with ABOUTME comment explaining purpose\n- [ ] Class GeminiCliAgentPlugin extends BaseAgentPlugin\n- [ ] Define AgentPluginMeta with id: gemini-cli, name: Gemini CLI\n- [ ] Set defaultCommand: 'gemini'\n- [ ] Set supportsStreaming: true, supportsInterrupt: true, supportsFileContext: true\n- [ ] Set supportsSubagentTracing: true and structuredOutputFormat: 'jsonl'\n- [ ] Export factory function createGeminiCliAgent\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","notes":"Created Gemini CLI plugin skeleton and registered builtin factory.","status":"open","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:21.934809461Z","created_by":"Subsy","updated_at":"2026-01-16T13:58:16.636355Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.1","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.10","title":"US-010: Update documentation for Gemini CLI plugin","description":"As a user, I want documentation for the Gemini CLI plugin so that I know how to configure and use it.\n\n## Acceptance Criteria\n- [ ] Add Gemini CLI to README.md agent list (if agents are listed)\n- [ ] Create website/content/docs/agents/gemini-cli.mdx documentation page\n- [ ] Document supported models (gemini-2.5-pro, gemini-2.5-flash, gemini-3-pro-preview, gemini-3-flash-preview)\n- [ ] Document default model (gemini-3-pro-preview)\n- [ ] Document authentication prerequisites (Google Cloud or API key - user's responsibility)\n- [ ] Document CLI flags used (--yolo, --output-format stream-json, --include-directories)\n- [ ] Add gemini-cli page to website/lib/navigation.ts (if navigation config exists)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:55:36.486413566Z","created_by":"Subsy","updated_at":"2026-01-16T09:55:36.486413566Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["docs","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.10","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.10","depends_on_id":"ralph-tui-41q.8","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.11","title":"US-011: Verify Gemini CLI sandbox compatibility","description":"As a developer, I want to verify that the Gemini CLI plugin works correctly in sandboxed mode so that users can safely run it with bwrap/sandbox-exec isolation.\n\n## Acceptance Criteria\n- [ ] Gemini CLI executes successfully inside bwrap sandbox on Linux\n- [ ] Auth paths (~/.config/gemini, ~/.config/gcloud) are correctly mounted read-write\n- [ ] Binary paths are mounted read-only\n- [ ] Network access works when sandbox.network is not disabled\n- [ ] OAuth token refresh works (auth paths are writable)\n- [ ] Test with `ralph run --sandbox` using the gemini agent\n\n## Test Plan\n1. Configure ralph to use gemini agent\n2. Run `ralph run --sandbox` with a simple task\n3. Verify the agent can:\n - Authenticate (OAuth or API key)\n - Make API calls to Gemini\n - Read/write to the working directory\n - Complete the task successfully\n\n## Notes\nThis validates that getSandboxRequirements() returns the correct paths for Gemini CLI authentication and execution.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-16T11:49:39.446958365Z","created_by":"Subsy","updated_at":"2026-01-16T11:49:39.446958365Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-41q.11","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.11","depends_on_id":"ralph-tui-41q.7","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.11","depends_on_id":"ralph-tui-41q.8","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.2","title":"US-002: Implement command argument building","description":"As a developer, I want the plugin to build correct CLI arguments so that Gemini CLI executes in headless mode with proper configuration.\n\n## Acceptance Criteria\n- [ ] Override buildArgs() method\n- [ ] Include -p flag for headless mode (prompt passed via stdin)\n- [ ] Include --output-format stream-json for structured output\n- [ ] Include --yolo flag for auto-approval\n- [ ] Include --model flag when model is configured\n- [ ] Default model is gemini-3-pro-preview when not specified\n- [ ] Override getStdinInput() to pass prompt via stdin (avoid shell escaping)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:29.455407103Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:29.455407103Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.2","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.2","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.3","title":"US-003: Implement file context support","description":"As a developer, I want the plugin to pass file context to Gemini CLI so that it can work with relevant project files.\n\n## Acceptance Criteria\n- [ ] Extract unique directories from file paths (like Claude plugin)\n- [ ] Add --include-directories flag for each directory\n- [ ] Handle empty file list gracefully (no flags added)\n- [ ] Handle files without directory paths gracefully\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:34.789341110Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:34.789341110Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.3","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.3","depends_on_id":"ralph-tui-41q.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.4","title":"US-004: Implement streaming JSONL parser","description":"As a developer, I want to parse Gemini's stream-json output so that ralph-tui can display subagent activity and track costs.\n\n## Acceptance Criteria\n- [ ] Create createStreamingJsonlParser() static method (similar to Claude plugin)\n- [ ] Parser handles chunked data with line buffering\n- [ ] Parse event types: init, message, tool_use, tool_result, error, result\n- [ ] Extract and accumulate: messages, tool calls, token usage, cost info\n- [ ] Parser exposes .push(chunk), .flush(), .getState() methods\n- [ ] Create parseJsonlLine() and parseJsonlOutput() helper methods\n- [ ] Define GeminiJsonlMessage and GeminiParserState types\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:42.826565255Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:42.826565255Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.4","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.4","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.5","title":"US-005: Implement model validation","description":"As a developer, I want flexible model validation so that users can specify any Gemini model.\n\n## Acceptance Criteria\n- [ ] Override validateModel() method\n- [ ] Accept empty string (uses default model)\n- [ ] Accept any non-empty string (flexible validation, let CLI handle errors)\n- [ ] Store model in private model property via initialize()\n- [ ] Override buildModelString() to return configured model\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:48.116752238Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:48.116752238Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.5","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.5","depends_on_id":"ralph-tui-41q.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.6","title":"US-006: Implement detection and readiness check","description":"As a developer, I want the plugin to detect if Gemini CLI is installed so that ralph-tui can show appropriate setup guidance.\n\n## Acceptance Criteria\n- [ ] Override detect() method\n- [ ] Run 'gemini --version' to check availability\n- [ ] Parse version string from output\n- [ ] Return AgentDetectResult with version, executable path, or error\n- [ ] isReady() returns true if detection succeeds\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:52:54.001235097Z","created_by":"Subsy","updated_at":"2026-01-16T09:52:54.001235097Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.6","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.6","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.7","title":"US-007: Implement sandbox requirements","description":"As a developer, I want the plugin to declare sandbox requirements so that Gemini CLI can run in sandboxed mode.\n\n## Acceptance Criteria\n- [ ] Override getSandboxRequirements() method\n- [ ] Include authPaths: ~/.config/gcloud, ~/.config/gemini (Google credentials)\n- [ ] Include binaryPaths: /usr/local/bin, ~/.local/bin\n- [ ] Include runtimePaths: empty array (no runtime dependencies)\n- [ ] Set requiresNetwork: true (API calls required)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:53:00.124155796Z","created_by":"Subsy","updated_at":"2026-01-16T09:53:00.124155796Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.7","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.7","depends_on_id":"ralph-tui-41q.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.8","title":"US-008: Register plugin in builtin registry","description":"As a developer, I want the Gemini CLI plugin registered as a builtin so that users can select it.\n\n## Acceptance Criteria\n- [ ] Import createGeminiCliAgent in src/plugins/agents/builtin/index.ts\n- [ ] Add to registerBuiltinAgents() function\n- [ ] Plugin appears in 'ralph-tui plugins agents' output\n- [ ] Plugin selectable via --agent gemini-cli\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:53:05.888510333Z","created_by":"Subsy","updated_at":"2026-01-16T09:53:05.888510333Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.3","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.6","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.8","depends_on_id":"ralph-tui-41q.7","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-41q.9","title":"US-009: Add unit tests for Gemini CLI plugin","description":"As a developer, I want unit tests to verify the plugin implementation.\n\n## Acceptance Criteria\n- [ ] Create src/plugins/agents/builtin/gemini.test.ts\n- [ ] Test buildArgs() produces correct flags\n- [ ] Test buildArgs() with and without model override\n- [ ] Test buildArgs() with file context (directories extracted correctly)\n- [ ] Test validateModel() accepts valid inputs\n- [ ] Test JSONL parser handles complete events\n- [ ] Test JSONL parser handles chunked/partial data\n- [ ] Test getSandboxRequirements() returns expected paths\n- [ ] All tests pass with bun run test\n- [ ] bun run typecheck passes","status":"open","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T09:53:12.016036768Z","created_by":"Subsy","updated_at":"2026-01-16T09:53:12.016036768Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-41q.9","depends_on_id":"ralph-tui-41q","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-41q.9","depends_on_id":"ralph-tui-41q.8","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r","title":"Ralph TUI - AI Agent Loop Orchestrator","description":"Terminal UI and execution engine for orchestrating AI agent loops. Replaces shell scripts (ralph.sh, ralph-beads.sh) with a proper TUI application.\n\n## Goals\n- Real-time observability into agent iterations and task progress\n- Support pause/resume and graceful interruption\n- Plugin architecture for agent providers (claude, opencode)\n- Plugin architecture for issue trackers (json, beads, beads+bv)\n- Session persistence to resume interrupted runs\n- npm installable: `npm install -g ralph-tui`\n\n## Tech Stack\n- TypeScript + OpenTUI (React reconciler with Zig-powered rendering)","status":"closed","priority":1,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-11T10:38:31.360442838Z","created_by":"Subsy","updated_at":"2026-01-12T21:17:10.641923602Z","closed_at":"2026-01-12T21:17:10.641923602Z","close_reason":"Completed - subagent tracing implemented, UI improvements done, core orchestrator functional","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"]} +{"id":"ralph-tui-45r.1","title":"US-001: Project Scaffolding and Package Setup","description":"As a developer, I want to set up the ralph-tui repository with proper TypeScript/OpenTUI structure so I can start development.\n\n## Acceptance Criteria\n- Initialize with pnpm init (if not already done)\n- Set up TypeScript with strict mode\n- Install OpenTUI dependencies (@opentui/core, @opentui/react)\n- Install Zig (required by OpenTUI) or document requirement\n- Set up directory structure: src/, src/commands/, src/tui/, src/plugins/agents/, src/plugins/trackers/\n- Add tsconfig.json with proper config\n- Add build scripts in package.json\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:39:43.042076624Z","created_by":"Subsy","updated_at":"2026-01-11T11:21:01.897703261Z","closed_at":"2026-01-11T11:21:01.897703261Z","close_reason":"Project scaffolding complete: pnpm init, TypeScript strict mode, OpenTUI deps, directory structure (src/commands, src/tui, src/plugins/agents, src/plugins/trackers), ESLint 9 flat config, build/typecheck/lint scripts all passing","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.1","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.10","title":"US-010: Beads + Beads Viewer Tracker Plugin (Smart Mode)","description":"As a user, I want a Beads+BV tracker plugin for smart dependency-aware task selection.\n\n## Acceptance Criteria\n- Implement TrackerPlugin interface extending Beads tracker\n- detect(): Check for .beads/ directory, bd binary, and bv binary\n- getNextTask(): Execute bv --robot-triage, filter for epic children\n- Parse JSON output for recommendations with scores and reasons\n- Select unblocked tasks first based on bv scoring\n- Provide \"why this task\" reasoning to TUI via getTaskReasoning()\n- Fall back to beads-only behavior if bv unavailable\n- Bidirectional: sync local changes back to beads\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:09.965727759Z","created_by":"Subsy","updated_at":"2026-01-11T13:55:42.585209209Z","closed_at":"2026-01-11T13:55:42.585209209Z","close_reason":"Implemented BeadsBvTrackerPlugin with bv --robot-triage integration, PageRank-based task selection, reasoning exposure, and graceful fallback to beads-only when bv unavailable","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.10","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.10","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.10","depends_on_id":"ralph-tui-45r.9","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.11","title":"US-011: Core TUI Layout with OpenTUI React","description":"As a user, I want a well-organized TUI layout so I can see all relevant information at a glance.\n\n## Acceptance Criteria\n- Use OpenTUI framework with React reconciler (@opentui/core, @opentui/react)\n- Header: Ralph status, epic/project name, elapsed time, tracker name\n- Left panel: Task list with status indicators (done/active/pending/blocked)\n- Right panel: Current iteration details or selected task details\n- Footer: Keyboard shortcuts, progress bar\n- Responsive layout that adapts to terminal size\n- Styled components using OpenTUI primitives\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:28.944816892Z","created_by":"Subsy","updated_at":"2026-01-11T12:01:33.059108169Z","closed_at":"2026-01-11T12:01:33.059108169Z","close_reason":"Implemented core TUI layout with OpenTUI React: Header, Footer, LeftPanel, RightPanel components with responsive layout, Tokyo Night theme, and keyboard navigation. Verified in terminal.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.11","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.11","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.12","title":"US-012: Task List View","description":"As a user, I want to see all tasks in the loop with their status so I can understand overall progress.\n\n## Acceptance Criteria\n- List all tasks from active tracker plugin\n- Status indicators: ✓ (done), ▶ (active), ○ (pending), ⊘ (blocked)\n- Show task ID and title (truncated to fit)\n- Highlight currently active task\n- Keyboard navigation (j/k or arrows)\n- Press Enter to drill into task details\n- Show task count: \"5/12 complete\"\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:29.161985335Z","created_by":"Subsy","updated_at":"2026-01-11T12:46:54.687838157Z","closed_at":"2026-01-11T12:46:54.687838157Z","close_reason":"Implemented Task List View with status indicators (✓/▶/○/⊘), task ID display with truncation, X/Y complete counter in footer, and Enter key navigation for task details - Verified in terminal","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.12","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.12","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.13","title":"US-013: Task Detail View","description":"As a user, I want to drill into task details so I can see full description and acceptance criteria.\n\n## Acceptance Criteria\n- Show full task title and ID\n- Show complete description (scrollable if long)\n- Show acceptance criteria as checklist\n- Show priority and labels/tags\n- Show dependencies (blocked by / blocks) - if tracker supports it\n- Show completion notes if closed\n- Press Esc to return to list view\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:29.382186357Z","created_by":"Subsy","updated_at":"2026-01-11T14:09:56.952480903Z","closed_at":"2026-01-11T14:09:56.952480903Z","close_reason":"Implemented Task Detail View with full task details display, acceptance criteria checklist, dependency visualization, and Esc navigation to return to list","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.13","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.13","depends_on_id":"ralph-tui-45r.12","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.14","title":"US-014: Iteration History View","description":"As a user, I want to see all iterations with key events so I can track what happened in each.\n\n## Acceptance Criteria\n- List all iterations: \"Iteration 1 of 10\"\n- Show iteration status: completed/running/pending\n- Show task worked on in each iteration\n- Show duration of each iteration\n- Show outcome: success/failure/interrupted\n- Keyboard navigation through iterations\n- Press Enter to drill into iteration details\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:29.551507696Z","created_by":"Subsy","updated_at":"2026-01-11T12:52:37.163307314Z","closed_at":"2026-01-11T12:52:37.163307314Z","close_reason":"Implemented Iteration History View with status indicators, duration, task ID, outcome display. Added keyboard navigation, i key toggle, Enter drill-down.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.14","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.14","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.15","title":"US-015: Iteration Detail View","description":"As a user, I want to drill into iteration details to see agent output and key events.\n\n## Acceptance Criteria\n- Show iteration number and status\n- Show task ID and title worked on\n- Show start time, end time, duration\n- Show key events timeline (task started, commit made, task closed, etc.)\n- Show agent output (scrollable, potentially large)\n- Syntax highlighting for code blocks in output\n- Link to persisted output file\n- Press Esc to return to iteration list\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:45.934584402Z","created_by":"Subsy","updated_at":"2026-01-11T14:15:36.331527026Z","closed_at":"2026-01-11T14:15:36.331527026Z","close_reason":"Implemented IterationDetailView with: iteration metadata (number, status, task), timing info (start/end/duration), events timeline, scrollable agent output with syntax highlighting, persisted output file link, Esc to return navigation","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.15","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.15","depends_on_id":"ralph-tui-45r.14","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.16","title":"US-016: Progress Dashboard","description":"As a user, I want to see overall progress and time estimates so I know how the run is going.\n\n## Acceptance Criteria\n- Show progress bar: tasks completed / total tasks\n- Show iteration progress: current / max iterations\n- Show elapsed time since start\n- Calculate and show estimated time remaining based on average iteration time\n- Show current status: Running / Paused / Completed / Failed\n- Show agent name and tracker name in use\n- Auto-update every second when running\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:46.149575869Z","created_by":"Subsy","updated_at":"2026-01-11T14:21:06.766512309Z","closed_at":"2026-01-11T14:21:06.766512309Z","close_reason":"Implemented Progress Dashboard with task/iteration progress bars, elapsed time, ETA calculation, status display, agent/tracker names, and 'd' key toggle","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.16","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.16","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.17","title":"US-017: Pause and Resume","description":"As a user, I want to pause and resume Ralph so I can take breaks or handle interruptions.\n\n## Acceptance Criteria\n- Press p to pause after current iteration completes\n- Show \"Pausing after current iteration...\" status\n- Show \"Paused\" status when paused\n- Press p again to resume\n- State persisted to session file\n- Can quit while paused and resume later with ralph-tui resume\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:46.328809679Z","created_by":"Subsy","updated_at":"2026-01-11T14:27:28.538117621Z","closed_at":"2026-01-11T14:27:28.538117621Z","close_reason":"Implemented pause/resume: 'p' to pause after iteration, 'p' again to resume. State persisted to session file for ralph-tui resume.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.17","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.17","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.18","title":"US-018: Graceful Interruption","description":"As a user, I want to interrupt Ralph with confirmation so I don't accidentally lose work.\n\n## Acceptance Criteria\n- Press Ctrl+C shows confirmation dialog\n- Dialog: \"Interrupt Ralph? Current iteration will be terminated. [y/N]\"\n- Press y to confirm: send SIGINT to agent, save state, exit\n- Press n or Esc to cancel and continue\n- Press Ctrl+C twice quickly to force quit immediately\n- Agent process is properly terminated\n- Session state saved before exit\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:46.503226320Z","created_by":"Subsy","updated_at":"2026-01-11T14:34:39.021078383Z","closed_at":"2026-01-11T14:34:39.021078383Z","close_reason":"Implemented graceful Ctrl+C interruption with confirmation dialog, double-press force quit, state persistence, and proper agent termination","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.18","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.18","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.19","title":"US-019: Session Persistence","description":"As a user, I want Ralph to save session state so I can resume interrupted runs.\n\n## Acceptance Criteria\n- Session file: .ralph-tui-session.json in project root\n- Save: current iteration, task statuses, start time, pause state, tracker state\n- Save after each iteration completes\n- ralph-tui resume command to continue from saved state\n- ralph-tui status command to check if resumable session exists\n- Prompt to resume or start fresh when existing session found\n- Clean up session file on successful completion\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:02.619503745Z","created_by":"Subsy","updated_at":"2026-01-11T12:59:42.410158876Z","closed_at":"2026-01-11T12:59:42.410158876Z","close_reason":"Implemented session persistence with .ralph-tui-session.json, resume command, status command, and automatic cleanup on completion","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.19","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.19","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.2","title":"US-002: Configuration System","description":"As a developer, I want a configuration system that supports global defaults and per-project settings so Ralph remembers my preferences.\n\n## Acceptance Criteria\n- Global config at ~/.config/ralph-tui/config.yaml\n- Project config at .ralph-tui.yaml in project root\n- Project config overrides global config\n- Config schema includes: tracker, tracker_options, agent, agent_options, max_iterations, auto_commit\n- Config validation with helpful error messages using Zod\n- ralph-tui config show command displays merged configuration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:41:43.604394295Z","created_by":"Subsy","updated_at":"2026-01-11T13:42:40.775563082Z","closed_at":"2026-01-11T13:42:40.775563082Z","close_reason":"Implemented config system with Zod validation, project-level .ralph-tui.yaml support, and config show command","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.2","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.2","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.20","title":"US-020: Iteration Output Persistence","description":"As a user, I want iteration output saved to files so I can review them later.\n\n## Acceptance Criteria\n- Create .ralph-tui/iterations/ directory in project root\n- Save each iteration output to iteration-{N}-{taskId}.log\n- Include: timestamp, task details, full agent stdout/stderr, duration, outcome\n- Structured header with metadata, raw output below\n- ralph-tui logs command to list/view past iteration logs\n- ralph-tui logs --iteration 5 to view specific iteration\n- ralph-tui logs --task US-005 to view iterations for a task\n- Clean up old logs with ralph-tui logs --clean --keep 10\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:02.810594718Z","created_by":"Subsy","updated_at":"2026-01-11T15:24:28.599122516Z","closed_at":"2026-01-11T15:24:28.599122516Z","close_reason":"Implemented iteration output persistence to .ralph-tui/iterations/ with structured logs, ralph-tui logs command for list/view/filter/clean","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.20","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.20","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.21","title":"US-021: Single Instance Lock","description":"As a user, I want Ralph to prevent concurrent runs in the same git repository so I don't corrupt state.\n\n## Acceptance Criteria\n- Create lock file .ralph-tui.lock when starting\n- Lock file contains: PID, start time, session ID\n- Check for existing lock on startup\n- If lock exists, check if PID is still running\n- If running: error with \"Ralph already running in this repo (PID: X)\"\n- If stale lock: warn and offer to remove\n- Remove lock file on clean exit\n- Remove lock file on crash recovery\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:12.710207590Z","created_by":"Subsy","updated_at":"2026-01-11T15:29:12.934227607Z","closed_at":"2026-01-11T15:29:12.934227607Z","close_reason":"Implemented single instance lock with proper error messages, stale lock detection with interactive prompt, and crash recovery handlers","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.21","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.21","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.22","title":"US-022: Execution Engine","description":"As a developer, I want a robust execution engine that runs agent iterations so the loop is reliable.\n\n## Acceptance Criteria\n- Iteration loop: select task (via tracker) → inject prompt → run agent → check result → update tracker\n- Parse agent output for completion signals (COMPLETE or tracker-specific)\n- Handle agent errors gracefully (retry? skip? abort?)\n- Respect max iterations limit\n- Emit events for TUI to consume (task started, task completed, iteration done, etc.)\n- Configurable inter-iteration delay\n- Save iteration output to file after each iteration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:25.065085012Z","created_by":"Subsy","updated_at":"2026-01-11T12:37:36.692087030Z","closed_at":"2026-01-11T12:37:36.692087030Z","close_reason":"Added error handling strategies (retry/skip/abort), ErrorHandlingConfig, CLI overrides, new events (iteration:retrying, iteration:skipped), and isTaskReady() interface method","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.22","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.22","depends_on_id":"ralph-tui-45r.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.22","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.23","title":"US-023: Prompt Template System","description":"As a user, I want customizable prompt templates so I can tailor agent instructions to my project.\n\n## Acceptance Criteria\n- Default templates bundled in package (one per tracker type)\n- Custom template path in config: prompt_template: ./my-prompt.md\n- Template variables: {{taskId}}, {{taskTitle}}, {{taskDescription}}, {{acceptanceCriteria}}, {{epicId}}, {{epicTitle}}, {{trackerName}}\n- Use Handlebars template engine\n- ralph-tui template show to display current template\n- ralph-tui template init to copy default template for customization\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:25.265428634Z","created_by":"Subsy","updated_at":"2026-01-11T15:36:31.275287510Z","closed_at":"2026-01-11T15:36:31.275287510Z","close_reason":"Implemented Handlebars template system with default templates for each tracker, custom template config, template show/init commands","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.23","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.23","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.24","title":"US-024: PRD Creation Command","description":"As a user, I want to create a PRD from a feature description so I can start a new Ralph project.\n\n## Acceptance Criteria\n- ralph-tui init command starts interactive PRD creation\n- Prompt for feature description\n- Ask 3-5 clarifying questions (similar to PRD skill)\n- Generate markdown PRD following the standard format\n- Save to ./tasks/prd-[feature-name].md\n- Option to immediately convert to target tracker format\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","notes":"Implemented interactive PRD creation wizard with init command, 5 clarifying questions, markdown and prd.json output","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:43.569032801Z","created_by":"Subsy","updated_at":"2026-01-11T15:50:35.768649838Z","closed_at":"2026-01-11T15:50:35.768652173Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.24","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.24","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.25","title":"US-025: PRD to JSON Conversion","description":"As a user, I want to convert a markdown PRD to prd.json so I can use the JSON tracking mode.\n\n## Acceptance Criteria\n- ralph-tui convert --to json ./tasks/prd-feature.md\n- Parse user stories from markdown (US-XXX sections)\n- Extract title, description, acceptance criteria\n- Assign priorities based on story order (1, 2, 3...)\n- Generate valid prd.json with passes: false for all\n- Prompt for branch name\n- Save to ./prd.json or custom path\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:43.772859798Z","created_by":"Subsy","updated_at":"2026-01-11T15:55:07.506973615Z","closed_at":"2026-01-11T15:55:07.506973615Z","close_reason":"Implemented PRD to JSON conversion command with markdown parser for US-XXX sections","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.25","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.25","depends_on_id":"ralph-tui-45r.8","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.26","title":"US-026: PRD to Beads Conversion","description":"As a user, I want to convert a markdown PRD to Beads issues so I can use the beads tracking mode.\n\n## Acceptance Criteria\n- ralph-tui convert --to beads ./tasks/prd-feature.md\n- Parse user stories from markdown\n- Create epic bead for the feature\n- Create child beads for each user story\n- Set up dependencies based on story order or explicit deps\n- Apply ralph label to all created beads\n- Run bd sync after creation\n- Display created bead IDs\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:43.974225436Z","created_by":"Subsy","updated_at":"2026-01-11T16:00:21.967036926Z","closed_at":"2026-01-11T16:00:21.967036926Z","close_reason":"Implemented beads format support in convert command - creates epic and child beads from markdown PRD with labels, dependencies, and sync","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.26","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.26","depends_on_id":"ralph-tui-45r.9","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.27","title":"US-027: Run Command","description":"As a user, I want a simple run command to start Ralph so I can begin working.\n\n## Acceptance Criteria\n- ralph-tui run starts execution with current config\n- ralph-tui run --epic EPIC_ID to specify epic (beads trackers)\n- ralph-tui run --prd ./prd.json to specify prd file (json tracker)\n- ralph-tui run --agent claude --model opus to override agent settings\n- ralph-tui run --tracker beads-bv to override tracker\n- ralph-tui run --iterations 20 to override max iterations\n- Check for existing session and prompt to resume or start fresh\n- Check for existing lock and error if running\n- Validate configuration before starting\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes\n- Verify in terminal using dev-browser skill","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:44:44.181268125Z","created_by":"Subsy","updated_at":"2026-01-11T12:26:33.132046109Z","closed_at":"2026-01-11T12:26:33.132046109Z","close_reason":"Implemented run command with CLI argument parsing, configuration system, session/lock management, and execution engine integration with TUI","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.27","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.27","depends_on_id":"ralph-tui-45r.11","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.27","depends_on_id":"ralph-tui-45r.22","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.28","title":"US-028: Status Command (Headless)","description":"As a user, I want a status command for CI/scripts so I can check Ralph status without the TUI.\n\n## Acceptance Criteria\n- ralph-tui status shows current run status (JSON output with --json)\n- Show: running/paused/completed/no-session\n- Show task progress: 5/12 completed\n- Show current iteration: 3/10\n- Show elapsed time\n- Show active tracker and agent\n- Exit code: 0 (completed), 1 (running/paused), 2 (failed)\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","notes":"Implemented headless status command with --json flag, proper exit codes (0/1/2), lock check, progress display, and updated CLI help","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.243473472Z","created_by":"Subsy","updated_at":"2026-01-11T16:04:36.025371481Z","closed_at":"2026-01-11T16:04:36.025374016Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.28","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.28","depends_on_id":"ralph-tui-45r.19","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.29","title":"US-029: Log Output Mode","description":"As a user, I want a non-interactive log mode for CI/scripts so I can run Ralph headlessly.\n\n## Acceptance Criteria\n- ralph-tui run --no-tui runs without TUI\n- Stream structured log output to stdout\n- Log format: [timestamp] [level] [component] message\n- Progress updates: [INFO] [progress] Iteration 3/10: Working on US-005\n- Agent output streamed with [AGENT] prefix\n- Supports all the same flags as TUI mode\n- Still saves iteration output to files\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.446594763Z","created_by":"Subsy","updated_at":"2026-01-11T16:09:17.359318182Z","closed_at":"2026-01-11T16:09:17.359318182Z","close_reason":"Implemented --no-tui flag with structured log output: [timestamp] [level] [component] message format, progress updates, agent output with [AGENT] prefix","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.29","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.29","depends_on_id":"ralph-tui-45r.27","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.3","title":"US-003: Interactive Project Setup","description":"As a user running Ralph in a new project, I want to be asked setup questions so I can configure Ralph for my project.\n\n## Acceptance Criteria\n- Detect when no .ralph-tui.yaml exists in current directory\n- Prompt: \"Which issue tracker?\" (list installed tracker plugins)\n- Show tracker-specific follow-up questions (e.g., epic ID for beads)\n- Prompt: \"Which agent CLI?\" with auto-detection of installed agents\n- Prompt: \"Max iterations per run?\" (default: 10)\n- Prompt: \"Auto-commit on task completion?\" (yes/no)\n- Save answers to .ralph-tui.yaml\n- Option to skip setup with --no-setup flag\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:09.255718369Z","created_by":"Subsy","updated_at":"2026-01-11T13:50:39.481304874Z","closed_at":"2026-01-11T13:50:39.481304874Z","close_reason":"Implemented interactive setup wizard with tracker/agent detection, follow-up questions, and YAML config generation","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.3","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.3","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.30","title":"US-030: Help and Documentation","description":"As a user, I want comprehensive help so I can learn how to use Ralph.\n\n## Acceptance Criteria\n- ralph-tui --help shows all commands with descriptions\n- ralph-tui --help shows command-specific help\n- ralph-tui plugins --help shows plugin management help\n- ralph-tui docs opens documentation in browser (or shows URL)\n- In-TUI help: press ? to show keyboard shortcuts\n- README.md with installation, quick start, configuration reference\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.641739301Z","created_by":"Subsy","updated_at":"2026-01-11T16:51:29.984964153Z","closed_at":"2026-01-11T16:51:29.984964153Z","close_reason":"Implemented comprehensive help and documentation: --help flags on all commands, docs command to open browser, in-TUI help overlay with ? key showing keyboard shortcuts","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.30","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.30","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.31","title":"US-031: npm Package Configuration","description":"As a developer, I want proper npm package setup so users can easily install Ralph.\n\n## Acceptance Criteria\n- package.json with proper name, version, bin fields\n- Binary entry point: bin: { \"ralph-tui\": \"./dist/cli.js\" }\n- Shebang in CLI entry: #!/usr/bin/env node\n- files field to include only necessary files\n- engines field specifying Node.js version requirement\n- npm pack produces valid tarball\n- npm install -g . works locally\n- npx ralph-tui --help works\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:45:01.848123434Z","created_by":"Subsy","updated_at":"2026-01-11T15:41:33.200496974Z","closed_at":"2026-01-11T15:41:33.200496974Z","close_reason":"Configured npm package: bin=ralph-tui, shebang=bun, engines=bun>=1.0.0. Verified build, pack, link, and bunx work.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.31","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.31","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.33","title":"US-032: README and OSS Documentation","description":"As a potential user or contributor, I want comprehensive README documentation so I can understand and use Ralph TUI.\n\n## Acceptance Criteria\n- Create README.md in repo root with:\n - Project description and goals\n - Features list\n - Installation instructions (npm install -g ralph-tui)\n - Quick start guide\n - Configuration options\n - Usage examples for different trackers (beads, json)\n - Usage examples for different agents (claude, opencode)\n - CLI command reference\n - Contributing guidelines section\n - License section (MIT)\n- Add LICENSE file with MIT license text\n- Add CONTRIBUTING.md with basic contribution guidelines\n- Ensure all documentation is accurate for current implementation","notes":"Created README.md with comprehensive documentation (features, installation, CLI reference, configuration, usage examples), LICENSE with MIT text, and CONTRIBUTING.md with development guidelines","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T13:05:15.027695089Z","created_by":"Subsy","updated_at":"2026-01-11T15:45:17.334212682Z","closed_at":"2026-01-11T15:45:17.334215236Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["docs","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.33","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.35","title":"BUG: Fix incorrect docs URL pointing to anthropics/ralph-tui","description":"The `ralph-tui docs` command opens the wrong URL.\n\n## Current Behavior\nOpens: https://github.com/anthropics/ralph-tui#readme\n\n## Expected Behavior\nShould open the correct repository URL (subsy/ralph-tui or detect from git remote).\n\n## Steps to Reproduce\n```bash\nbunx ralph-tui docs\n```\n\n## Acceptance Criteria\n- [ ] Fix hardcoded URL in docs command\n- [ ] Either use correct repo URL or detect from git remote origin\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T19:37:44.536185942Z","created_by":"Subsy","updated_at":"2026-01-11T20:34:20.335349013Z","closed_at":"2026-01-11T20:34:20.335349013Z","close_reason":"Fixed incorrect docs URL by detecting repo from git remote origin. Handles both SSH and HTTPS URLs, falls back to subsy/ralph-tui when not in git repo.","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.35","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.36","title":"BUG: TUI should not close automatically - only by user command","description":"The TUI closes on its own unexpectedly. It should only close when the user explicitly requests it (q, Ctrl+C with confirmation, etc).\n\n## Current Behavior\nTUI closes automatically (possibly after no tasks found or some error condition)\n\n## Expected Behavior\nTUI should remain open and display status/errors, only closing on explicit user action.\n\n## Acceptance Criteria\n- [ ] TUI stays open even when no tasks are found\n- [ ] TUI stays open on errors (displays error in UI)\n- [ ] TUI only closes on: q key, Ctrl+C (with confirmation), or explicit quit action\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","notes":"TUI now stays open after engine stops (all tasks done, no tasks, max iterations, or error). Added 'complete' and 'idle' status types for clear UX. TUI only closes on explicit user action (q/Ctrl+C).","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T20:12:13.848148688Z","created_by":"Subsy","updated_at":"2026-01-11T20:42:50.268748608Z","closed_at":"2026-01-11T20:42:50.268753177Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.36","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.37","title":"BUG: TUI should show in_progress tasks","description":"The TUI only fetches tasks with status 'open', missing tasks that are 'in_progress'.\n\n## Current Behavior\nTUI filters for status=['open'] only, showing \"No tasks\" when all tasks are in_progress or closed.\n\n## Expected Behavior\nTUI should show tasks with status 'open' OR 'in_progress'.\n\n## Acceptance Criteria\n- [ ] Tracker getTasks() includes both 'open' and 'in_progress' statuses\n- [ ] in_progress tasks displayed in task list\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T20:12:14.163460658Z","created_by":"Subsy","updated_at":"2026-01-11T20:37:44.052155128Z","closed_at":"2026-01-11T20:37:44.052155128Z","close_reason":"Added tasks array to engine:started event, implemented status mapping in RunApp to display both open and in_progress tasks on TUI startup","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.37","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.38","title":"FEAT: Show closed tasks greyed out in TUI for drill-down","description":"Users want to see closed tasks in the TUI so they can observe completed work and drill down into iteration history.\n\n## Current Behavior\nClosed tasks are not displayed in the TUI task list.\n\n## Expected Behavior\nClosed tasks should be shown in the task list, greyed out, and users should be able to drill down into their details and iteration history.\n\n## Acceptance Criteria\n- [ ] Closed tasks appear in task list with greyed out styling\n- [ ] Closed tasks are visually distinct from open/in_progress tasks\n- [ ] Users can select closed tasks and view their details\n- [ ] Users can drill down into closed task iteration history\n- [ ] Consider toggle/filter to show/hide closed tasks\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T20:12:14.487349691Z","created_by":"Subsy","updated_at":"2026-01-11T20:48:36.786702513Z","closed_at":"2026-01-11T20:48:36.786702513Z","close_reason":"Implemented closed tasks display with greyed-out styling, 'h' key toggle filter, drill-down support","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.38","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.39","title":"FEAT: Show epic hierarchy in task list with indented children","description":"The task list should display epics with their child tasks in a hierarchical view, making it easy to see the structure of work.\n\n## Current Behavior\nTask list shows a flat list of tasks without hierarchy indication.\n\n## Expected Behavior\n- Epics appear as parent items in the task list\n- Child tasks appear indented under their parent epic\n- In beads mode, all open epics should be shown (not just filtered by config epicId)\n- Visual distinction between epic rows and child task rows\n\n## Implementation Notes\n- Modify LeftPanel component to render hierarchical structure\n- Update getTasks to fetch epics + children grouped together\n- Add indentation styling for child tasks (2-4 spaces or tree lines)\n- Epic rows could use different styling (bold, different icon)\n\n## Acceptance Criteria\n- [ ] Epics display as top-level items in task list\n- [ ] Child tasks display indented under their parent epic\n- [ ] All open epics are visible when using beads tracker (not filtered to single epicId)\n- [ ] Visual distinction between epic and child task rows\n- [ ] Collapsed/expanded state for epics (optional, nice-to-have)\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:04:08.636626155Z","created_by":"Subsy","updated_at":"2026-01-11T22:51:11.064656319Z","closed_at":"2026-01-11T22:51:11.064656319Z","close_reason":"Added epic hierarchy display: parentId field in TaskItem, buildIndentMap() helper, TaskRow indentation with 2 spaces per level. Children tasks display indented under their parent epic.","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.39","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.4","title":"US-004: Agent Plugin Architecture","description":"As a developer, I want a plugin system for agent providers so I can easily add support for new AI agent CLIs.\n\n## Acceptance Criteria\n- Define AgentPlugin TypeScript interface: name, detect(), execute(prompt, files), interrupt()\n- Plugin discovery from ~/.config/ralph-tui/plugins/agents/ directory\n- Built-in plugins: claude, opencode\n- Plugin config in yaml: command path, default flags, timeout\n- Plugins are separate TypeScript modules that implement the interface\n- ralph-tui plugins agents shows available agent plugins\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:35.882797784Z","created_by":"Subsy","updated_at":"2026-01-11T12:17:52.848472240Z","closed_at":"2026-01-11T12:17:52.848472240Z","close_reason":"Implemented agent plugin architecture: AgentPlugin interface (name, detect, execute, interrupt), AgentRegistry singleton, plugin discovery from ~/.config/ralph-tui/plugins/agents/, built-in claude and opencode stubs, YAML config support, and 'ralph-tui plugins agents' CLI command. All quality checks pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.4","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.4","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.40","title":"FEAT: Select epic from TUI to start Ralph run","description":"Users should be able to select any epic from the task list to start a Ralph run on that epic, without needing to specify --epic on the command line.\n\n## Current Behavior\n- Ralph run uses the epicId from config file (.ralph-tui.yaml)\n- No way to switch epics from within the TUI\n- Must restart with different --epic flag to work on different epic\n\n## Expected Behavior\n- TUI shows all available epics in the task list\n- User can navigate to an epic and press Enter (or dedicated key) to start a run on it\n- The selected epic becomes the active work context\n- Child tasks of selected epic become the work queue\n\n## User Flow\n1. Launch TUI (no --epic required)\n2. See list of all open epics with their children\n3. Navigate to desired epic\n4. Press Enter or 'r' to \"Run on this epic\"\n5. Ralph starts processing child tasks of selected epic\n\n## Implementation Notes\n- Add \"Run on epic\" action when epic row is selected\n- Update ExecutionEngine to accept runtime epic selection\n- May need new view mode: \"epic selection\" vs \"running\"\n- Store selected epic in session state\n\n## Acceptance Criteria\n- [ ] TUI can launch without --epic flag (shows all open epics)\n- [ ] User can select an epic from the task list\n- [ ] Pressing Enter or 'r' on an epic starts a Ralph run on that epic\n- [ ] Only child tasks of selected epic are processed\n- [ ] Selected epic is displayed in header/status area\n- [ ] Can return to epic selection after run completes\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:04:21.198948672Z","created_by":"Subsy","updated_at":"2026-01-11T22:48:47.845882221Z","closed_at":"2026-01-11T22:48:47.845882221Z","close_reason":"Added epic selection TUI: getEpics() method in TrackerPlugin, EpicSelectionView/App components, run.tsx shows selection when --epic not specified","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.40","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.40","depends_on_id":"ralph-tui-45r.39","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.41","title":"FEAT: Add 'r' keyboard shortcut to refresh task list","description":"Add keyboard shortcut to manually refresh the task list from the tracker.\n\n## Current Behavior\nTask list only updates when engine events occur. No way to manually refresh to see external changes (e.g., tasks closed by another process, new tasks created).\n\n## Expected Behavior\n- Pressing 'r' refreshes the task list from the tracker\n- Visual feedback during refresh (brief loading indicator or status message)\n- Updated task list reflects current tracker state\n\n## Implementation Notes\n- Add 'r' handler in RunApp keyboard handler\n- Call tracker.getTasks() and update state\n- Consider debouncing to prevent rapid refreshes\n- Show brief \"Refreshing...\" status or spinner\n\n## Acceptance Criteria\n- [ ] Pressing 'r' triggers a refresh of the task list\n- [ ] Task list updates to reflect current tracker state\n- [ ] Visual feedback indicates refresh is happening\n- [ ] Works when engine is idle (not running an iteration)\n- [ ] Help overlay (?) shows 'r' shortcut\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","notes":"Added 'r' keyboard shortcut to refresh task list - implemented refreshTasks() method in ExecutionEngine, tasks:refreshed event, and keyboard handler in RunApp","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:07:01.557945341Z","created_by":"Subsy","updated_at":"2026-01-11T23:05:50.013089726Z","closed_at":"2026-01-11T23:05:50.013094064Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.41","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.42","title":"FEAT: Configure all settings from within the TUI","description":"Add ability to view and modify ralph-tui configuration from within the TUI interface.\n\n## Current Behavior\n- Configuration is stored in .ralph-tui.yaml\n- Must edit file manually or re-run setup wizard\n- No way to change settings during a TUI session\n\n## Expected Behavior\n- Settings accessible via keyboard shortcut (e.g., 's' for settings)\n- View current configuration values\n- Modify settings: tracker, agent, epic, labels, max iterations, recipe, etc.\n- Changes persist to .ralph-tui.yaml\n- Some changes may require restart, others apply immediately\n\n## Configurable Settings\n- tracker: beads, beads-bv, json\n- trackerOptions: epicId, beadsDir, labels, recipe\n- agent: claude, opencode\n- agentOptions: model, flags\n- maxIterations\n- autoCommit\n\n## Implementation Notes\n- Add settings view/modal component\n- Implement config writer (symmetric to config reader)\n- Consider which settings can hot-reload vs require restart\n- Form validation for setting values\n\n## Acceptance Criteria\n- [ ] Press 's' opens settings view/modal\n- [ ] All current config values are displayed\n- [ ] Can modify tracker, agent, and related options\n- [ ] Can modify maxIterations\n- [ ] Changes are saved to .ralph-tui.yaml\n- [ ] Invalid values show validation errors\n- [ ] Help overlay (?) shows 's' shortcut\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:11:30.544305286Z","created_by":"Subsy","updated_at":"2026-01-11T23:12:09.162059580Z","closed_at":"2026-01-11T23:12:09.162059580Z","close_reason":"Added SettingsView TUI component with ',' keyboard shortcut, form validation, and config persistence to .ralph-tui.yaml","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.42","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.43","title":"FEAT: Show all tasks with status indicators (actionable/blocked/closed)","description":"Always show all tasks in an epic with clear visual indicators for their actionability state.\n\n## Current Behavior\n- With `recipe: actionable`, blocked tasks are hidden entirely\n- Users can't see the full picture of work in an epic\n- No visual distinction between actionable and blocked tasks\n\n## Expected Behavior\nAlways show ALL tasks in an epic with distinct visual indicators:\n- **Actionable** (ready to work): Green indicator (e.g., ● or ▶)\n- **Blocked** (has unresolved dependencies): Red/orange indicator (e.g., ⊘) \n- **Closed/Completed**: Greyed out text\n- **In Progress**: Blue/active indicator (e.g., ◐)\n\n## Visual Design\n```\nTasks\n──────────────────────────\n▶ ralph-tui-45r.39 Show epic hierarchy... [actionable]\n⊘ ralph-tui-45r.40 Select epic to start... [blocked by .39]\n▶ ralph-tui-45r.41 Add 'r' refresh shortcut [actionable]\n✓ ralph-tui-45r.36 TUI should not close... [closed - greyed]\n```\n\n## Implementation Notes\n- Fetch ALL tasks regardless of blocked status\n- Query bv or check dependencies to determine blocked state\n- Update LeftPanel to render appropriate indicators\n- Blocked tasks should show what they're blocked by (tooltip or detail view)\n- Consider sorting: actionable first, then blocked, then closed\n\n## Acceptance Criteria\n- [ ] All tasks in epic are shown (not filtered by recipe)\n- [ ] Actionable tasks have distinct green/ready indicator\n- [ ] Blocked tasks have distinct red/orange indicator\n- [ ] Closed tasks are greyed out\n- [ ] In-progress tasks have active indicator\n- [ ] Blocked tasks show their blocker in detail view\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:17:03.533120905Z","created_by":"Subsy","updated_at":"2026-01-11T22:43:17.924473938Z","closed_at":"2026-01-11T22:43:17.924473938Z","close_reason":"Added actionable/blocked status indicators based on dependency resolution. Tasks sorted by status: active → actionable → blocked → closed. Detail view shows blocker titles.","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.43","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.44","title":"TASK: Remove bv recipe option from tracker settings","description":"Remove the recipe configuration option since the TUI will always show all tasks with visual indicators.\n\n## Context\nWith the implementation of \"Show all tasks with status indicators\" (.43), the recipe filtering is no longer needed. The TUI will always display all tasks and indicate their state visually instead of hiding blocked tasks.\n\n## Changes Required\n1. Remove `recipe` from trackerOptions in config schema\n2. Remove recipe from setup wizard questions\n3. Remove recipe handling from beads-bv tracker (or always use 'default')\n4. Update any documentation mentioning recipe setting\n\n## Files to Modify\n- src/config/types.ts - remove recipe from TrackerOptions\n- src/setup/index.ts - remove recipe question from wizard\n- src/plugins/trackers/builtin/beads-bv.ts - ignore/remove recipe usage\n- .ralph-tui.yaml template - remove recipe line\n\n## Acceptance Criteria\n- [ ] recipe option removed from config schema\n- [ ] Setup wizard no longer asks about recipe\n- [ ] Existing configs with recipe setting don't break (gracefully ignored)\n- [ ] beads-bv tracker fetches all tasks regardless of former recipe setting\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T22:17:14.283975325Z","created_by":"Subsy","updated_at":"2026-01-11T23:15:12.294692746Z","closed_at":"2026-01-11T23:15:12.294692746Z","close_reason":"Removed bv recipe option from beads-bv tracker: deleted useRecipe field, config parsing, setup question, and recipe flag usage in getNextTask and refreshTriage","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.44","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.44","depends_on_id":"ralph-tui-45r.43","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.45","title":"FEAT: TUI should not auto-start engine - wait for user to select and start","description":"The TUI should launch in an interactive \"ready\" state, not immediately start processing tasks. Users select an epic and explicitly start the run.\n\n## Current Behavior\n- TUI launches and immediately calls engine.start()\n- Tasks begin processing automatically\n- No opportunity to review/select before execution\n\n## Expected Behavior\n- TUI launches in \"ready\" or \"idle\" state\n- User sees list of epics/tasks\n- User navigates and selects an epic\n- User presses Enter or dedicated key (e.g., 's' for start) to begin\n- THEN engine.start() is called\n\n## User Flow\n1. Run `ralph-tui run` (or just `ralph-tui`)\n2. TUI shows epic list in idle state\n3. User browses epics, sees task counts, reviews what's available\n4. User selects desired epic\n5. User presses Enter or 's' to start\n6. Engine begins processing selected epic's tasks\n7. After completion, returns to epic selection (or shows results)\n\n## Rationale\n- Headless mode (`--no-tui`) exists for automated/CI runs\n- TUI mode should be interactive and user-controlled\n- Allows review before committing to a run\n- Matches user expectation of GUI applications\n\n## Implementation Notes\n- Remove auto engine.start() from runWithTui\n- Add \"Start\" action on Enter key when epic selected\n- Show \"Ready\" or \"Select epic to start\" in header\n- May need new engine state: 'ready' before 'running'\n- Footer could show \"[Enter] Start [q] Quit [?] Help\"\n\n## Acceptance Criteria\n- [ ] TUI launches without auto-starting the engine\n- [ ] Header shows \"Ready\" or similar idle state\n- [ ] User can browse tasks/epics before starting\n- [ ] Pressing Enter on selected epic starts the run\n- [ ] Engine only starts after explicit user action\n- [ ] Headless mode (--no-tui) still auto-starts as before\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-11T22:21:33.190760335Z","created_by":"Subsy","updated_at":"2026-01-11T22:56:00.190832351Z","closed_at":"2026-01-11T22:56:00.190832351Z","close_reason":"TUI now launches in ready state - users press Enter/s to start. Added ready status, updated UI components.","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.45","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.45","depends_on_id":"ralph-tui-45r.40","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.46","title":"BUG: TUI status unclear - can't tell if engine is running or what it's doing","description":"The TUI doesn't clearly communicate what's happening. Users can't tell at a glance if the engine is running, idle, or what task is being processed.\n\n## Current Problem\n- Status indicator not prominent enough\n- When tasks are blocked, unclear if engine is running or stuck\n- No clear \"what's happening RIGHT NOW\" indicator\n- Hard to distinguish between \"running but waiting\" vs \"idle\" vs \"error\"\n\n## User Report\n\"I can only see 4 blocked tasks. I can't tell if anything's running??\"\n\n## Expected Behavior\nAt a glance, user should immediately know:\n1. **Engine state**: Running / Paused / Idle / Error\n2. **Current action**: \"Processing task X\" / \"Waiting for tasks\" / \"All complete\"\n3. **Progress**: X of Y tasks done, iteration N of M\n\n## Proposed UX Improvements\n\n### Header Area (always visible)\n```\n┌─────────────────────────────────────────────────────────┐\n│ ▶ RUNNING Processing: ralph-tui-45r.39 ⏱ 2m 34s │\n│ Task 2/6 │ Iteration 3/10 │ Agent: claude │\n└─────────────────────────────────────────────────────────┘\n```\n\n### Status States (with distinct colors)\n- 🟢 **RUNNING** - Green, animated indicator, shows current task\n- 🟡 **PAUSED** - Yellow, \"Press p to resume\" \n- 🔵 **IDLE** - Blue, \"Select epic and press Enter to start\"\n- 🔴 **ERROR** - Red, shows error message\n- ✅ **COMPLETE** - Green checkmark, \"All tasks done\"\n\n### Current Task Highlight\n- In task list, currently processing task should be VERY obvious\n- Pulsing/animated indicator or highlighted row\n- Show elapsed time on current task\n\n## Acceptance Criteria\n- [ ] Engine state (running/paused/idle/error/complete) clearly visible in header\n- [ ] Current task name shown prominently when running\n- [ ] Progress (tasks done, iterations) always visible\n- [ ] Distinct colors for each state\n- [ ] Currently processing task highlighted in list\n- [ ] \"No actionable tasks\" state clearly communicated\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T22:25:08.957705965Z","created_by":"Subsy","updated_at":"2026-01-11T23:01:57.696026460Z","closed_at":"2026-01-11T23:01:57.696026460Z","close_reason":"Added granular status states (selecting/executing), task ID/title display in Header and ProgressDashboard, clearer status labels","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.46","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.47","title":"BUG: Tasks stuck in_progress when TUI killed or crashes","description":"When the TUI is killed (Ctrl+C, kill -9, crash), tasks remain in \"in_progress\" status with no way to know they're stale.\n\n## Current Behavior\n- TUI sets task to in_progress when it starts working on it\n- If TUI is killed/crashes, task stays in_progress forever\n- Next TUI launch sees stale in_progress tasks\n- User confusion: \"Is something still running?\"\n\n## Expected Behavior\n- On graceful shutdown: reset in_progress tasks to open (or previous state)\n- On startup: detect stale in_progress from previous crashed session and offer to reset\n- Or: track which session owns the in_progress status\n\n## Possible Solutions\n\n### Option A: Reset on shutdown\n- In gracefulShutdown, reset any in_progress tasks back to open\n- Con: loses info about what was being worked on\n\n### Option B: Session ownership\n- Store session ID with in_progress status\n- On startup, check if session is still active\n- If not, prompt user: \"Found stale in_progress tasks from crashed session. Reset?\"\n\n### Option C: Timeout-based\n- Track when task was set to in_progress\n- If older than X minutes with no activity, consider stale\n\n## Acceptance Criteria\n- [ ] Graceful shutdown resets in_progress tasks to open\n- [ ] Startup detects stale in_progress from dead sessions\n- [ ] User is notified/prompted about stale tasks\n- [ ] No tasks left orphaned in in_progress state\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-11T22:35:39.295802635Z","created_by":"Subsy","updated_at":"2026-01-11T23:20:43.950431767Z","closed_at":"2026-01-11T23:20:43.950431767Z","close_reason":"Implemented session-owned task tracking with activeTaskIds field. On graceful shutdown, active in_progress tasks are reset back to open. On startup, stale in_progress tasks from crashed sessions are detected and user is prompted to reset them (auto-reset in headless mode).","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-45r.47","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.5","title":"US-005: Tracker Plugin Architecture","description":"As a developer, I want a plugin system for issue trackers so I can easily add support for new tracking backends.\n\n## Acceptance Criteria\n- Define TrackerPlugin TypeScript interface (getTasks, getNextTask, completeTask, isComplete, sync, etc.)\n- Plugin discovery from ~/.config/ralph-tui/plugins/trackers/ directory\n- Built-in plugins: json (default), beads, beads-bv\n- Plugin config in yaml with tracker-specific options\n- Plugins are separate TypeScript modules that implement the interface\n- ralph-tui plugins trackers shows available tracker plugins\n- Each tracker plugin defines its own setup questions\n- Interface supports bidirectional sync for trackers that need it\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:43.561266336Z","created_by":"Subsy","updated_at":"2026-01-11T12:08:59.709254422Z","closed_at":"2026-01-11T12:08:59.709254422Z","close_reason":"Implemented TrackerPlugin interface, plugin registry with discovery, built-in plugin stubs (json, beads, beads-bv), and CLI command for listing trackers","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.5","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.5","depends_on_id":"ralph-tui-45r.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.6","title":"US-006: Claude Code Agent Plugin","description":"As a user, I want Ralph to execute iterations using Claude Code CLI so I can use my preferred agent.\n\n## Acceptance Criteria\n- Implement AgentPlugin interface for Claude Code\n- Auto-detect claude binary in PATH using which\n- Execute with -p (print mode), --dangerously-skip-permissions\n- Support --model flag passthrough\n- Capture stdout/stderr and parse for completion signals\n- Handle graceful interruption (send SIGINT via Node child_process)\n- Timeout handling with configurable duration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:53.439215509Z","created_by":"Subsy","updated_at":"2026-01-11T13:59:24.089260013Z","closed_at":"2026-01-11T13:59:24.089260013Z","close_reason":"Implemented Claude Code agent plugin with: binary auto-detection via which, print mode (-p), --dangerously-skip-permissions, --model flag passthrough, file context via --add-dir, timeout handling, and setup questions","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.6","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.6","depends_on_id":"ralph-tui-45r.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.7","title":"US-007: OpenCode Agent Plugin","description":"As a user, I want Ralph to execute iterations using OpenCode CLI so I can use my preferred agent.\n\n## Acceptance Criteria\n- Implement AgentPlugin interface for OpenCode\n- Auto-detect opencode binary in PATH\n- Execute with opencode run --agent general\n- Support --model and --file flag passthrough\n- Capture stdout/stderr and parse for completion signals\n- Handle graceful interruption\n- Timeout handling with configurable duration\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:42:53.635617693Z","created_by":"Subsy","updated_at":"2026-01-11T14:04:00.983088472Z","closed_at":"2026-01-11T14:04:00.983088472Z","close_reason":"Implemented OpenCode AgentPlugin with: detect() using which+--version, buildArgs() for opencode run --agent syntax, --model/--file passthrough, timeout handling, setup questions and validation","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.7","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.7","depends_on_id":"ralph-tui-45r.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.8","title":"US-008: JSON Tracker Plugin (prd.json)","description":"As a user, I want a JSON file tracker as the default so I can use the simpler file-based tracking mode.\n\n## Acceptance Criteria\n- Implement TrackerPlugin interface for JSON\n- Set as default tracker when no tracker specified\n- Parse prd.json file format\n- getTasks(): Read user stories with id, title, description, acceptanceCriteria, priority, passes\n- getNextTask(): Select highest priority where passes: false\n- completeTask(): Update passes: true in file\n- isComplete(): Check all stories have passes: true\n- Setup questions: path to prd.json, branch name\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:09.615923641Z","created_by":"Subsy","updated_at":"2026-01-11T12:41:59.720072089Z","closed_at":"2026-01-11T12:41:59.720072089Z","close_reason":"Implemented full JSON tracker plugin with prd.json format support, file I/O with caching, task CRUD operations, dependency support, and setup questions for path/branch configuration","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.8","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.8","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-45r.9","title":"US-009: Beads Tracker Plugin","description":"As a user, I want a Beads tracker plugin so I can use the git-native issue tracker.\n\n## Acceptance Criteria\n- Implement TrackerPlugin interface for Beads\n- detect(): Check for .beads/ directory and bd binary\n- getTasks(): Execute bd list --parent=EPIC --status=open --json\n- getNextTask(): Select first open task by priority\n- getTaskDetail(): Execute bd show ID\n- completeTask(): Execute bd update ID --status=closed\n- isComplete(): Check all epic children are closed\n- Bidirectional: sync local changes back to beads\n- Setup questions: epic ID\n- pnpm build succeeds\n- pnpm typecheck passes\n- pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-11T10:43:09.800786069Z","created_by":"Subsy","updated_at":"2026-01-11T12:29:57.763498023Z","closed_at":"2026-01-11T12:29:57.763499856Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-45r.9","depends_on_id":"ralph-tui-45r","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-45r.9","depends_on_id":"ralph-tui-45r.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-488","title":"US-009: Missing Tool Guidance","description":"## User Story\nAs a user without clipboard tools installed, I want helpful guidance on how to install them so that I can enable image paste support.\n\n## Acceptance Criteria\n- [ ] Detect missing tools on startup (non-blocking check)\n- [ ] On first paste attempt without tools, show actionable message:\n - macOS: \"Install pngpaste for image support: `brew install pngpaste`\"\n - Linux: \"Install xclip for image support: `sudo apt install xclip`\"\n - Windows: (PowerShell built-in, handle edge cases)\n- [ ] Message shown only once per session\n- [ ] Image paste gracefully degrades (text paste still works)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-002: Platform Clipboard Abstraction (ralph-tui-kha)\n\n## Estimate\n1 point","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:56.015096Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-488","depends_on_id":"ralph-tui-kha","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-4ie","title":"Story 1.1: Image File Path Detection","description":"## Description\nDetect when pasted text is a valid image file path and handle it as an image attachment rather than plain text.\n\n## Acceptance Criteria\n- [ ] Detect absolute and relative file paths ending in supported extensions: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`\n- [ ] Validate that the file exists on disk before treating as image\n- [ ] Support paths with spaces (quoted or escaped)\n- [ ] Case-insensitive extension matching\n- [ ] If path doesn't exist or isn't an image, paste as raw text (graceful fallback)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create new module: `src/tui/utils/image-detection.ts`\n- Use `Bun.file().exists()` for validation\n- Regex pattern: `/^[\"']?(.+\\.(jpe?g|png|gif|webp))[\"']?$/i`\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:17:58.272573Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-4nb","title":"Remove duplicate progress bar from footer","description":"## User Story\nAs a user viewing the TUI, I want to see progress information in only one place, so that the interface is clean and not redundant.\n\n## Current Behavior\n- Progress bar appears in both the top dashboard and the footer\n- This wastes vertical space and creates visual clutter\n\n## Acceptance Criteria\n- [ ] Remove progress bar from footer component\n- [ ] Footer shows only essential info (keyboard hints, status)\n- [ ] Progress info remains visible in top dashboard\n\n## Technical Notes\n- File: src/tui/components/Footer.tsx\n- The ProgressDashboard already shows task completion progress","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T12:29:05.961703242Z","created_by":"Subsy","updated_at":"2026-01-12T14:01:37.157910018Z","closed_at":"2026-01-12T14:01:37.157910018Z","close_reason":"Removed duplicate progress bar from footer. Progress is now shown only in the top dashboard ProgressDashboard component. Footer simplified to display keyboard shortcuts only.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-4nb","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-5n7","title":"Test Beads-Rust Tracker Integration","description":"Epic to test ralph-tui beads-rust tracker plugin functionality","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-21T00:47:33.595016482Z","created_by":"plgeek","updated_at":"2026-01-21T00:47:33.595016482Z","source_repo":".","compaction_level":0,"original_size":0} +{"id":"ralph-tui-5rl","title":"Redesign TUI header for clarity and space efficiency","description":"## User Story\nAs a user running Ralph, I want a clean, focused header that shows only essential information, so that I can quickly understand the current state without visual noise.\n\n## Current Behavior\n- Header and ProgressDashboard are cluttered with redundant info\n- Multiple areas showing similar data (status, progress, task info)\n- Wastes valuable vertical screen real estate\n- Hard to scan quickly for the info that matters\n\n## Acceptance Criteria\n- [ ] Single-line or two-line header maximum\n- [ ] Show only: status indicator, current task (if running), progress (X/Y tasks), elapsed time\n- [ ] Remove or consolidate: epic name, tracker name, agent name (move to footer or settings)\n- [ ] Clean typography with clear visual hierarchy\n- [ ] Progress shown as compact 'X/Y' or mini bar, not full dashboard\n- [ ] Consider: make dashboard toggleable (already 'd' key) but off by default\n\n## Technical Notes\n- Files: src/tui/components/Header.tsx, ProgressDashboard.tsx\n- May want to merge Header and ProgressDashboard into single component\n- Preserve info accessibility via settings or help overlay","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T12:29:26.688953288Z","created_by":"Subsy","updated_at":"2026-01-12T13:54:37.706832901Z","closed_at":"2026-01-12T13:54:37.706832901Z","close_reason":"Header redesigned: reduced to 1 line, shows status/task/progress(X/Y)/elapsed. Dashboard off by default. Removed redundant epic/tracker/agent from header.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-5rl","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-5zr","title":"US-001: Image Storage Manager","description":"## User Story\nAs a developer, I want an image storage service that manages saved clipboard images so that images are stored predictably and duplicates are avoided.\n\n## Acceptance Criteria\n- [ ] Creates `.ralph-tui/images/` directory if it doesn't exist\n- [ ] Saves images with SHA256-prefix naming (`img-{hash12}.png`)\n- [ ] Returns absolute file path after save\n- [ ] Handles duplicate detection (same hash = same file, no re-save)\n- [ ] Provides method to list all session images\n- [ ] Provides method to delete all session images\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Use Node.js `crypto` module for SHA256 hashing\n- Store image metadata in memory for session tracking\n- Consider `.ralph-tui/images/.manifest.json` for persistence across crashes\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:04.034148Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"]} +{"id":"ralph-tui-74q","title":"Image Configuration Options","description":"## Description\nAdd configuration options for image paste behavior.\n\n## Acceptance Criteria\n- [ ] Add `[images]` section to config schema\n- [ ] Support `enabled` boolean (default: true)\n- [ ] Support `cleanup_policy` enum: \"on_exit\" | \"manual\" | \"never\" (default: \"on_exit\")\n- [ ] Support `skip_cleanup_confirmation` boolean (default: false)\n- [ ] Support `max_images_per_message` number (default: 10, 0 = unlimited)\n- [ ] Config readable from both global and project-level config\n- [ ] Project config overrides global config\n- [ ] Add to SettingsView.tsx for UI toggles\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Update `src/config/types.ts` - add to `RalphConfig` type\n- Update `src/config/schema.ts` - add Zod validation\n- Update `src/tui/components/SettingsView.tsx` - add toggles\n\n## Estimate\n2 points","notes":"Implemented image configuration options: added [images] section to config schema with enabled, cleanup_policy, skip_cleanup_confirmation, and max_images_per_message options. Added Zod validation schemas, mergeConfigs support for project config override, and UI toggles in SettingsView. Both typecheck and build pass.","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:21:44.356025Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:56:50.491116Z","closed_at":"2026-01-16T15:56:50.491126Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-74q","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-77n","title":"Exit Cleanup with Confirmation","description":"## Description\nClean up stored images on exit with user confirmation.\n\n## Acceptance Criteria\n- [ ] On exit, if `cleanup_policy = \"on_exit\"` and images exist, show confirmation:\n ```\n Clean up 3 session images?\n • img-a1b2c3d4e5f6.png\n • img-b2c3d4e5f6a1.png\n [Y] Yes [N] No [A] Always (don't ask again)\n ```\n- [ ] If `skip_cleanup_confirmation = true`, delete without prompting\n- [ ] If `cleanup_policy = \"manual\"` or `\"never\"`, skip cleanup\n- [ ] Handle Ctrl+C / SIGTERM gracefully\n- [ ] \"Always\" option updates config atomically\n- [ ] Don't delete `.ralph-tui/images/` directory itself\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Register cleanup handlers in entry points (`run.tsx`, `create-prd.tsx`, `resume.tsx`)\n- Use `process.on('exit')`, `process.on('SIGINT')`, `process.on('SIGTERM')`\n\n## Dependencies\n- Image Storage Manager (ralph-tui-35v)\n- Image Configuration Options (ralph-tui-74q)\n\n## Estimate\n3 points","notes":"Implemented exit cleanup with user confirmation. Created exit-cleanup.ts utility module with: cleanup confirmation prompt showing image filenames, Yes/No/Always options, atomic config update for 'Always' choice. Integrated cleanup handlers into run.tsx, create-prd.tsx, and resume.tsx entry points. Respects cleanup_policy (on_exit/manual/never) and skip_cleanup_confirmation settings. Handles SIGINT/SIGTERM gracefully. Does not delete .ralph-tui/images/ directory itself - only image files. bun run typecheck and bun run build pass.","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:31.405750Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T16:09:28.134336Z","closed_at":"2026-01-16T16:09:28.134343Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-77n","depends_on_id":"ralph-tui-35v","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-77n","depends_on_id":"ralph-tui-74q","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-77n","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp","title":"Comprehensive Test Suite for Ralph-TUI","description":"Implement a comprehensive test suite using Bun's built-in test runner, targeting 80%+ code coverage across core modules. The test infrastructure will include unit tests, integration tests, CI/CD pipeline with coverage enforcement, and contributor-friendly documentation.\n\n## Success Metrics\n- 80%+ code coverage on core modules (engine, plugins, config)\n- All tests pass in CI before merge\n- Test execution time under 30 seconds for full suite\n- Clear documentation enabling contributors to write tests\n\n## Quality Gates (apply to all stories)\n- bun run typecheck passes\n- bun run lint passes\n- bun run build passes","status":"open","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-15T16:32:19.500032712Z","created_by":"Subsy","updated_at":"2026-01-15T16:32:19.500032712Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"]} +{"id":"ralph-tui-7pp.1","title":"US-1: Test Infrastructure Setup","description":"As a developer, I want a properly configured test framework with Bun's test runner so that I can run tests locally and in CI with minimal friction.\n\n## Acceptance Criteria\n- [ ] Bun test runner configured with TypeScript support\n- [ ] `bun test` command runs all tests\n- [ ] `bun test:watch` for development\n- [ ] `bun test:coverage` generates coverage reports\n- [ ] Test configuration in bunfig.toml or package.json\n- [ ] Tests colocated with source files (`*.test.ts`) for discoverability\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Test infrastructure setup complete: Bun test runner configured with TypeScript support, test/test:watch/test:coverage scripts added, bunfig.toml created, sample test file colocated in src/config/types.test.ts, all quality gates pass","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:32:59.205685229Z","created_by":"Subsy","updated_at":"2026-01-15T16:38:40.364684676Z","closed_at":"2026-01-15T16:38:40.364688232Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.1","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.10","title":"US-10: Testing Documentation","description":"As a contributor, I want clear documentation on writing and running tests so that I can contribute tests effectively.\n\n## Acceptance Criteria\n- [ ] CONTRIBUTING.md section on testing with:\n - How to run tests locally\n - How to write new tests\n - Test file naming conventions\n - Using factories and mocks\n - Coverage requirements\n- [ ] README.md section with:\n - Quick test commands\n - Coverage badge\n - Link to detailed testing docs\n- [ ] Example test file demonstrating patterns\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Added comprehensive testing documentation to CONTRIBUTING.md (test commands, naming conventions, directory structure, factories, mocks, coverage), testing section to README.md with quick commands and link to detailed docs, and example-patterns.test.ts demonstrating all testing patterns.","status":"closed","priority":4,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:06.104107842Z","created_by":"Subsy","updated_at":"2026-01-15T17:32:37.069343480Z","closed_at":"2026-01-15T17:32:37.069347247Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.10","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.10","depends_on_id":"ralph-tui-7pp.9","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.2","title":"US-2: Test Utilities and Helpers","description":"As a test author, I want shared test utilities, mocks, and factory functions so that I can write tests efficiently without duplicating setup code.\n\n## Acceptance Criteria\n- [ ] `tests/` directory with shared utilities\n- [ ] `tests/fixtures/` for static test data (sample configs, PRD files)\n- [ ] `tests/factories/` with builder functions for complex objects\n- [ ] `tests/mocks/` with reusable mock implementations\n- [ ] Mock implementations for: file system operations, child process spawning, agent responses\n- [ ] Type-safe factory functions for: AgentConfig, TrackerConfig, SessionState, PRDData\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented test utilities: tests/fixtures/ with sample PRD/config files, tests/factories/ with type-safe builders for AgentConfig/TrackerConfig/SessionState/PRDData, tests/mocks/ with file system, child process, and agent response mocks. All quality gates pass.","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:32:59.854303348Z","created_by":"Subsy","updated_at":"2026-01-15T16:42:41.998093328Z","closed_at":"2026-01-15T16:42:41.998097405Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.2","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.2","depends_on_id":"ralph-tui-7pp.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.3","title":"US-3: Configuration Module Tests","description":"As a developer, I want comprehensive tests for configuration loading and validation so that config-related bugs are caught before runtime.\n\n## Acceptance Criteria\n- [ ] Unit tests for all Zod schemas in `src/config/schema.ts`\n- [ ] Tests for config file discovery and merging logic\n- [ ] Tests for environment variable expansion\n- [ ] Tests for default value application\n- [ ] Edge cases: missing files, invalid YAML, schema violations\n- [ ] Coverage target: 85%+ for `src/config/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive configuration module tests with 97 tests covering Zod schemas, config loading/merging, error handling, and edge cases. All quality gates pass.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:00.485602443Z","created_by":"Subsy","updated_at":"2026-01-15T17:15:31.774805324Z","closed_at":"2026-01-15T17:15:31.774809432Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.3","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.3","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.4","title":"US-4: Engine Core Tests","description":"As a developer, I want thorough tests for the Ralph loop engine so that the core orchestration logic is reliable and regression-free.\n\n## Acceptance Criteria\n- [ ] Unit tests for RalphLoop state machine transitions\n- [ ] Unit tests for IterationEngine iteration logic\n- [ ] Tests for rate limit detection across all patterns (Claude, OpenCode, generic)\n- [ ] Tests for error classification (rate limit vs crash vs completion)\n- [ ] Tests for session state persistence and recovery\n- [ ] Tests for the SELECT → BUILD → EXECUTE → DETECT cycle\n- [ ] Integration tests for engine + mock agents\n- [ ] Coverage target: 85%+ for `src/engine/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive engine core tests with 100 tests covering: state machine transitions, rate limit detection (Claude/OpenCode/generic), iteration logic, error classification, and integration tests for SELECT → BUILD → EXECUTE → DETECT cycle. All quality gates pass.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:01.115724347Z","created_by":"Subsy","updated_at":"2026-01-15T16:57:22.167876602Z","closed_at":"2026-01-15T16:57:22.167879878Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.4","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.4","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.5","title":"US-5: Plugin System Tests","description":"As a developer, I want tests for the plugin architecture so that plugins can be developed and registered reliably.\n\n## Acceptance Criteria\n- [ ] Unit tests for AgentPluginRegistry and TrackerPluginRegistry\n- [ ] Tests for plugin discovery and registration\n- [ ] Tests for ClaudeAgentPlugin prompt building and response parsing\n- [ ] Tests for OpenCodeAgentPlugin with its specific behaviors\n- [ ] Tests for JsonTrackerPlugin file operations\n- [ ] Tests for BeadsTrackerPlugin CLI interactions\n- [ ] Mock-based tests that don't require actual agents\n- [ ] Coverage target: 80%+ for `src/plugins/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive plugin system tests covering AgentRegistry, TrackerRegistry, ClaudeAgentPlugin, OpenCodeAgentPlugin, JsonTrackerPlugin, and BeadsTrackerPlugin. All 187 plugin tests pass. Quality gates satisfied.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:02.003363808Z","created_by":"Subsy","updated_at":"2026-01-15T17:06:05.422267791Z","closed_at":"2026-01-15T17:06:05.422272289Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.5","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.5","depends_on_id":"ralph-tui-7pp.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.6","title":"US-6: TUI Component Tests","description":"As a developer, I want tests for TUI state management and event handling so that UI logic is correct even without visual verification.\n\n## Acceptance Criteria\n- [ ] Unit tests for TuiState state management\n- [ ] Tests for event handlers and state transitions\n- [ ] Tests for EventBus pub/sub functionality\n- [ ] Tests for log parsing and formatting\n- [ ] Tests do NOT require actual terminal rendering\n- [ ] Coverage target: 75%+ for `src/tui/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented comprehensive TUI component tests: output-parser tests (33 tests), theme tests (36 tests), and state-utils tests (28 tests). Tests cover log parsing, formatting, StreamingOutputParser, theme constants, utility functions, status conversion, and dependency status calculation. All 775 tests pass. Quality gates pass.","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:02.787828723Z","created_by":"Subsy","updated_at":"2026-01-15T17:28:49.683946715Z","closed_at":"2026-01-15T17:28:49.683950703Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.6","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.6","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.7","title":"US-7: Utility Function Tests","description":"As a developer, I want tests for all utility modules so that foundational code is rock-solid.\n\n## Acceptance Criteria\n- [ ] Tests for `src/utils/files.ts` - path operations, file discovery\n- [ ] Tests for `src/utils/logger.ts` - log formatting, levels\n- [ ] Tests for `src/utils/process.ts` - process spawning helpers\n- [ ] Tests for `src/utils/retry.ts` - retry logic, backoff calculations\n- [ ] Tests for `src/utils/validation.ts` - input validation helpers\n- [ ] Coverage target: 90%+ for `src/utils/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented utility modules (files, logger, process, retry, validation) with comprehensive tests (192 passing tests). All quality gates pass.","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:03.523772097Z","created_by":"Subsy","updated_at":"2026-01-15T16:49:51.846794219Z","closed_at":"2026-01-15T16:49:51.846797345Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.7","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.7","depends_on_id":"ralph-tui-7pp.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.8","title":"US-8: CLI Command Tests","description":"As a developer, I want integration tests for CLI commands so that the user-facing interface works correctly.\n\n## Acceptance Criteria\n- [ ] Integration tests for `ralph run` command flow\n- [ ] Integration tests for `ralph status` output\n- [ ] Integration tests for `ralph config` validation\n- [ ] Tests use mock agents and trackers\n- [ ] Tests verify exit codes and stdout/stderr\n- [ ] Coverage target: 70%+ for `src/cli/`\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"Implemented CLI command tests: 102 tests for ralph run, status, and config commands covering argument parsing, exit codes, status determination, config validation, and output formatting. All tests pass.","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:04.857309159Z","created_by":"Subsy","updated_at":"2026-01-15T17:21:24.739705605Z","closed_at":"2026-01-15T17:21:24.739708971Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.8","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.8","depends_on_id":"ralph-tui-7pp.5","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-7pp.9","title":"US-9: CI/CD Pipeline","description":"As a maintainer, I want automated test execution in CI so that PRs cannot be merged without passing tests.\n\n## Acceptance Criteria\n- [ ] GitHub Actions workflow for test execution\n- [ ] Tests run on: push to main, all PRs\n- [ ] Coverage report generation and upload\n- [ ] Coverage threshold enforcement (fail if below 80%)\n- [ ] Coverage badge in README\n- [ ] Test results visible in PR checks\n- [ ] Matrix testing for Node 20+ and Bun latest\n\n## Quality Gates\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","notes":"CI/CD pipeline implemented with: GitHub Actions workflow for test execution, tests run on push to main and all PRs, coverage report generation with Codecov upload, 80% coverage threshold enforcement, CI and coverage badges in README, matrix testing for Node 20+ and Bun latest","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-15T16:33:05.513464337Z","created_by":"Subsy","updated_at":"2026-01-15T17:23:03.637422023Z","closed_at":"2026-01-15T17:23:03.637426080Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-7pp.9","depends_on_id":"ralph-tui-7pp","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-7pp.9","depends_on_id":"ralph-tui-7pp.8","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-816","title":"Story 4.1: Append Image References to Agent Prompts","description":"## Description\nWhen sending a prompt to an agent, append the list of attached image paths.\n\n## Acceptance Criteria\n- [ ] Image paths appended at the end of user's prompt text\n- [ ] Format: `\\n\\nRelevant images you should review before you begin are in:\\n- {absolute_path_1}\\n- {absolute_path_2}`\n- [ ] Only append if images are attached\n- [ ] Clear attached images after prompt is sent\n- [ ] Works for both PRD chat and Run command prompts\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify prompt construction in `PrdChatApp.tsx` (for PRD flow)\n- Modify prompt construction in `RunApp.tsx` / engine invocation (for run flow)\n- Use `getPromptSuffix()` from useImageAttachment hook\n\n## Dependencies\n- Story 3.1: Create useImageAttachment Hook (ralph-tui-z42)\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:19:00.608184Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-9g3","title":"Inline Image Indicators","description":"## Description\nDisplay `[Image N]` indicators in text input when images are pasted.\n\n## Acceptance Criteria\n- [ ] Insert `[Image N]` at cursor position when image pasted\n- [ ] Indicators numbered sequentially (1, 2, 3...)\n- [ ] Indicators styled distinctly (dimmed or colored if terminal supports)\n- [ ] Backspace over indicator removes the image attachment\n- [ ] Indicators persist correctly when editing surrounding text\n- [ ] Display count above input: `📎 2 images attached` (when images present)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Store image references as metadata alongside text content\n- Indicators are \"atomic\" - can't partially delete them\n- Consider using special Unicode markers internally for tracking\n\n## Dependencies\n- useImageAttachment Hook (ralph-tui-zey)\n\n## Estimate\n3 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:07.512209Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:39:17.440592Z","closed_at":"2026-01-16T15:39:17.440592Z","close_reason":"Implemented inline image indicators: useInlineImageIndicators hook for atomic [Image N] placeholders with sequential numbering, backspace/delete handling for atomic removal, ImageAttachmentCount component showing '📎 N images attached' above input, ChatView integration with attachedImageCount prop. Uses zero-width Unicode markers for invisible boundary tracking. TypeCheck and build pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-9g3","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-9g3","depends_on_id":"ralph-tui-zey","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-b1t","title":"Display sandbox status in TUI header","description":"As a user, I want to see sandbox status in the TUI header so I know if sandboxing is active and what mode it's using.\n\n## Context\nWhen running with --sandbox, users have no visual confirmation that sandboxing is active. The header shows agent, model, tracker, and rate limit status, but not sandbox status.\n\n## Acceptance Criteria\n- [ ] Add sandbox status indicator to TUI header (right side, near agent/tracker info)\n- [ ] Show sandbox mode: 🔒 bwrap or 🔒 docker\n- [ ] Show (no-net) suffix when network is disabled\n- [ ] Don't show anything when sandbox is disabled (clean UI)\n- [ ] Pass sandbox config from engine/RunApp to Header component\n- [ ] Update HeaderProps interface with sandbox config\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T10:12:13.201453264Z","created_by":"Subsy","updated_at":"2026-01-16T10:19:45.740507Z","closed_at":"2026-01-16T10:17:34.764735237Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["enhancement","ralph","tui"]} +{"id":"ralph-tui-bge","title":"Story 6.1: Support General File Path Detection","description":"## Description\nExtend the system to detect any file path pastes, not just images.\n\n## Acceptance Criteria\n- [ ] Detect file paths that aren't images\n- [ ] For non-image files: paste the raw path text (no special handling)\n- [ ] For non-existent paths: paste as raw text\n- [ ] Maintain image-specific behavior for image files\n- [ ] Log detection results for debugging\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- This is essentially the \"graceful fallback\" behavior from Story 1.1\n- Ensures pasting `/some/code/file.ts` just pastes the text normally\n- Only image files get the special attachment treatment\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n\n## Priority\nLow\n\n## Estimate\n3 points","status":"tombstone","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:19:32.368566Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-bjd","title":"US-010: Error Toast Notifications","description":"## User Story\nAs a user, I want to see non-blocking error notifications when image paste fails so that I understand what went wrong without interrupting my workflow.\n\n## Acceptance Criteria\n- [ ] Clipboard read failure: \"Failed to read clipboard image\"\n- [ ] File save failure: \"Failed to save image\"\n- [ ] Errors appear as toast/status bar notification\n- [ ] Auto-dismiss after 3 seconds\n- [ ] Don't block text input or other operations\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-004: Paste Event Interception (ralph-tui-q97)\n\n## Estimate\n1 point","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:59.035055Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-bjd","depends_on_id":"ralph-tui-q97","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-d1e","title":"Image Paste Support","description":"## Overview\nEnable users to paste images into ralph-tui text inputs so agents can analyze visual content.\n\n## Features\nSupports multiple input methods:\n1. **Clipboard paste** (Cmd+V with image copied) - via platform tools (pngpaste, xclip)\n2. **File path paste** (paste `/path/to/image.png` as text)\n3. **Base64/OSC 52** (for iTerm2, Kitty, WezTerm terminals)\n\n## User Flow\n1. User copies image (screenshot, from browser, etc.)\n2. User pastes in ralph-tui text input\n3. Image saved to `.ralph-tui/images/` with hash-based naming\n4. `[Image 1]` indicator appears in text input\n5. On submit, image paths appended to prompt for agent\n\n## Included Stories\n- Image Storage Manager\n- Image File Path Detection \n- Platform Clipboard Image Reader\n- useImageAttachment Hook\n- Paste Event Integration\n- Inline Image Indicators\n- Prompt Image Path Injection\n- Configuration Options\n- Exit Cleanup\n- Toast Notifications\n- Error Handling","status":"open","priority":0,"issue_type":"epic","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:27:14.308128Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:27:14.308128Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"]} +{"id":"ralph-tui-dsx","title":"US-006: Multi-Image Accumulation","description":"## User Story\nAs a user, I want to paste multiple images before sending a message so that I can share several screenshots in one prompt.\n\n## Acceptance Criteria\n- [ ] Each paste appends a new image (doesn't replace)\n- [ ] Images numbered in paste order\n- [ ] Respects `max_images_per_message` config limit\n- [ ] Shows warning if limit reached: \"Maximum images reached (10)\"\n- [ ] All accumulated images cleared after message sent\n- [ ] Provides way to remove individual images (backspace over indicator)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-005: Inline Image Indicators (ralph-tui-orx)\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:46.764858Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-dsx","depends_on_id":"ralph-tui-orx","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-dui","title":"Factory Droid Agent Plugin","description":"Add a new agent plugin that integrates Factory Droid CLI (droid) with ralph-tui, enabling Factory Droid as a first-class autonomous agent alongside the existing Claude Code and OpenCode plugins.","status":"open","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:22.613355715Z","created_by":"Subsy","updated_at":"2026-01-14T22:59:22.613355715Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"]} +{"id":"ralph-tui-dui.1","title":"US-1: Basic Agent Execution with Working Directory Support","description":"As a ralph-tui user, I want to configure Factory Droid as my agent so that I can use my preferred AI coding assistant with ralph-tui's task orchestration.\n\n## Acceptance Criteria\n- [ ] Create plugin structure at src/plugins/agents/droid/ with index.ts, config.ts, commandBuilder.ts\n- [ ] Plugin can be selected via agentCommand: 'droid' in config\n- [ ] Agent spawns droid process with --print and -p flags for non-interactive mode\n- [ ] --cwd flag is set to the project's working directory\n- [ ] Task prompts are passed correctly to the agent\n- [ ] Agent output is captured and displayed in TUI\n- [ ] Implement AgentPlugin interface from src/plugins/agents/types.ts\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:29.810284334Z","created_by":"Subsy","updated_at":"2026-01-14T23:12:43.219316493Z","closed_at":"2026-01-14T23:12:43.219316493Z","close_reason":"Added Factory Droid agent plugin, config alias, and non-interactive command builder; ran typecheck/lint/build.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.1","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-dui.2","title":"US-2: Subagent Tracing with JSONL Output Parsing","description":"As a ralph-tui user, I want to see detailed execution metrics from Factory Droid so that I can monitor tool usage, costs, and execution flow.\n\n## Acceptance Criteria\n- [ ] Create outputParser.ts to parse Factory Droid's JSONL streaming output\n- [ ] Plugin uses --output-format stream-json flag when tracing enabled\n- [ ] JSONL output is parsed for tool calls, assistant messages, and result events\n- [ ] Cost information is extracted and aggregated when available (input/output tokens, cache stats)\n- [ ] Tool call names and arguments are extracted and displayed\n- [ ] Error messages and status codes are properly handled\n- [ ] Tracing can be disabled via enableTracing: false config option\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:36.177334787Z","created_by":"Subsy","updated_at":"2026-01-14T23:51:33.964982692Z","closed_at":"2026-01-14T23:51:33.964982692Z","close_reason":"Added coverage for stream-json fields (toolId, value, completion finalText) and exit error handling.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.2","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-dui.2","depends_on_id":"ralph-tui-dui.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-dui.3","title":"US-3: Skip Permissions Mode for Autonomous Execution","description":"As a ralph-tui user running automated workflows, I want to run Factory Droid without permission prompts so that tasks can execute autonomously without manual intervention.\n\n## Acceptance Criteria\n- [ ] Add skipPermissions option to DroidAgentConfig schema\n- [ ] skipPermissions: true maps to --skip-permissions-unsafe flag\n- [ ] Warning is logged when skip permissions is enabled\n- [ ] Default is false (safe by default)\n- [ ] Config validation ensures boolean type\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:42.109930599Z","created_by":"Subsy","updated_at":"2026-01-14T23:25:11.697715204Z","closed_at":"2026-01-14T23:25:11.697715204Z","close_reason":"Added skipPermissions config flag mapping and warning; validated build.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.3","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-dui.3","depends_on_id":"ralph-tui-dui.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-dui.4","title":"US-4: Model and Reasoning Effort Configuration","description":"As a ralph-tui user, I want to specify which model Factory Droid should use so that I can balance cost, speed, and capability for my tasks.\n\n## Acceptance Criteria\n- [ ] Add model option to DroidAgentConfig schema (string, optional)\n- [ ] Add reasoningEffort option to DroidAgentConfig schema ('low' | 'medium' | 'high', optional)\n- [ ] model config option is passed via --model flag when specified\n- [ ] reasoningEffort config option maps to --reasoning-effort flag when specified\n- [ ] Both options use Factory Droid's defaults when not specified\n- [ ] Config validation ensures valid reasoningEffort values\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:47.643515599Z","created_by":"Subsy","updated_at":"2026-01-14T23:21:45.691305339Z","closed_at":"2026-01-14T23:21:45.691305339Z","close_reason":"Added Droid model/reasoning-effort options with validation and CLI flags.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.4","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-dui.4","depends_on_id":"ralph-tui-dui.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-dui.5","title":"US-5: Plugin Documentation","description":"As a ralph-tui user, I want documentation for the Factory Droid plugin so that I can understand how to configure and use it.\n\n## Acceptance Criteria\n- [ ] Create README.md in src/plugins/agents/droid/\n- [ ] Document all configuration options (model, reasoningEffort, skipPermissions, enableTracing)\n- [ ] Include example configuration snippets\n- [ ] Document prerequisites (droid CLI installed, FACTORY_API_KEY configured)\n- [ ] Document JSONL output format and what metrics are captured\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] bun run build passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-14T22:59:53.447350129Z","created_by":"Subsy","updated_at":"2026-01-14T23:54:50.547302727Z","closed_at":"2026-01-14T23:54:50.547302727Z","close_reason":"Added Factory Droid plugin README with config, prerequisites, and JSONL tracing details; verified typecheck, lint, build.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui.3","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-dui.5","depends_on_id":"ralph-tui-dui.4","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-e8u","title":"Toast Notification Component","description":"## Description\nCreate a reusable toast notification component for transient messages.\n\n## Acceptance Criteria\n- [ ] Toast appears in top-right corner of screen\n- [ ] Auto-dismisses after 3 seconds\n- [ ] Supports variants: `success`, `error`, `info`, `warning`\n- [ ] Shows icon + message text (✓/✗/ℹ/⚠)\n- [ ] Non-blocking (doesn't prevent other interactions)\n- [ ] Queue multiple toasts if needed\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/components/Toast.tsx`\n- Create: `src/tui/hooks/useToast.ts` for state management\n- Use absolute positioning with OpenTUI's `` component\n\n## Estimate\n3 points","notes":"Implementation complete - Toast.tsx and useToast.ts created with all required functionality: top-right positioning, 3-second auto-dismiss, all 4 variants with icons, non-blocking via absolute positioning, and queue support (MAX_TOASTS=5). Code was implemented as part of repos-08z bead. typecheck and build pass.","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:19.047021Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:53:09.897581Z","closed_at":"2026-01-16T15:53:09.897598Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-e8u","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-ed1","title":"US-011: Manual Cleanup Command","description":"## User Story\nAs a user, I want a command to manually clean up session images so that I can free disk space during long sessions.\n\n## Acceptance Criteria\n- [ ] Slash command `/clear-images` removes all session images\n- [ ] Shows confirmation with count: \"Cleared 5 images\"\n- [ ] Also clears any pending image attachments in current input\n- [ ] Works regardless of `cleanup_policy` setting\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-001: Image Storage Manager (ralph-tui-5zr)\n\n## Estimate\n1 point","status":"tombstone","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:14:09.206655Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-ed1","depends_on_id":"ralph-tui-5zr","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-exe","title":"Test ready command filtering","description":"Verify br ready only shows unblocked issues","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.721976092Z","created_by":"plgeek","updated_at":"2026-01-21T01:00:56.778435432Z","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-exe","depends_on_id":"ralph-tui-3uo","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-exe","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-ey2","title":"US-007: Prompt Image Path Injection","description":"## User Story\nAs a user, I want my pasted images to be automatically included in the prompt sent to the agent so that the agent can access and analyze them.\n\n## Acceptance Criteria\n- [ ] Images appended to prompt in structured format\n- [ ] Uses absolute paths for reliability\n- [ ] Format:\n ```\n [user message]\n\n [Attached Images]\n - Image 1: /path/to/img-abc123.png\n - Image 2: /path/to/img-def456.png\n ```\n- [ ] No \"[Attached Images]\" section if no images\n- [ ] Works with all agent types (Claude, custom agents)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Inject at prompt construction time in agent invocation\n- Ensure paths are properly escaped if they contain spaces\n\n## Dependencies\n- US-003: Configuration Schema Extension (ralph-tui-skz)\n- US-005: Inline Image Indicators (ralph-tui-orx)\n\n## Estimate\n2 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:34.689370Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-ey2","depends_on_id":"ralph-tui-orx","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-ey2","depends_on_id":"ralph-tui-skz","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-ez4","title":"Test dependency tracking","description":"Verify dependencies are tracked and block correctly","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-21T01:00:56.705908056Z","created_by":"plgeek","updated_at":"2026-01-21T01:00:56.757760265Z","source_repo":".","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"ralph-tui-ez4","depends_on_id":"ralph-tui-3uo","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-ez4","depends_on_id":"ralph-tui-5n7","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-g0o","title":"Platform Clipboard Image Reader","description":"## Description\nRead actual image data from system clipboard using platform-specific tools.\n\n## Acceptance Criteria\n- [ ] Detects if clipboard contains image data (vs text)\n- [ ] Reads image data as PNG buffer on macOS using `pngpaste`\n- [ ] Reads image data as PNG buffer on Linux using `xclip` (X11) or `wl-paste` (Wayland)\n- [ ] Reads image data as PNG buffer on Windows using PowerShell\n- [ ] Returns `null` gracefully if no image in clipboard\n- [ ] Returns meaningful error if clipboard tool not installed\n- [ ] Provides installation hints for missing tools\n- [ ] All operations async with reasonable timeout (5s)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/clipboard-image.ts`\n- macOS: Check for `pngpaste` via `which`, fallback to `osascript`\n- Linux: Try `xclip`, then `xsel`, then `wl-paste` (Wayland)\n- Windows: Use `powershell -command \"Get-Clipboard -Format Image | ...\"`\n\n## Estimate\n5 points","notes":"Implementation complete and verified. All acceptance criteria met: image detection (hasClipboardImage), macOS support (pngpaste + osascript fallback), Linux support (wl-paste, xclip), Windows support (PowerShell), graceful null return for missing images, meaningful errors with installation hints (getInstallHints), 5s default timeout. Both typecheck and build pass.","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:21:31.055053Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T12:40:52.658123Z","closed_at":"2026-01-16T12:40:52.658150Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-g0o","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-ivd","title":"Fix refresh (r) not picking up new tasks added to epic","description":"## User Story\nAs a user who adds new beads to an epic while Ralph is running, I want to press 'r' to refresh and see the new tasks, so that I can continue working without restarting the TUI.\n\n## Current Behavior\n- Press 'r' to refresh task list\n- New beads added to the epic (via bd create) do not appear\n- Likely same issue with json tracker when prd.json is modified externally\n\n## Expected Behavior\n- Press 'r' refreshes from tracker source\n- New tasks appear in the task list\n- Removed tasks are removed from display (or marked appropriately)\n\n## Investigation Areas\n- [ ] Check engine.refreshTasks() implementation\n- [ ] Verify tracker.getTasks() is being called with correct filters\n- [ ] Check if epic filter is being applied on refresh\n- [ ] Test with both beads and json trackers\n- [ ] Verify tasks:refreshed event is being emitted and handled\n\n## Technical Notes\n- Files: src/engine/index.ts (refreshTasks), src/commands/run.tsx (keyboard handler)\n- The 'r' key calls engine.refreshTasks() at line ~600 in RunApp.tsx\n- May need to pass epicId filter to getTasks on refresh","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T12:31:19.378276049Z","created_by":"Subsy","updated_at":"2026-01-12T13:51:04.901152464Z","closed_at":"2026-01-12T13:51:04.901152464Z","close_reason":"Bug already fixed in commit 1eba384. The double-filtering issue (bd list --parent already filtered by parent, but filterTasks was filtering again by parentId which bd list --json doesn't include) was resolved. Verified: typecheck passes, lint passes, bd commands return correct results.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","ralph-tui-tzw"],"dependencies":[{"issue_id":"ralph-tui-ivd","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-jlu","title":"Story 2.1: Add cleanupImages Config Option","description":"## Description\nAdd configuration option to control whether images are cleaned up on exit.\n\n## Acceptance Criteria\n- [ ] Add `cleanupImages` boolean to config schema\n- [ ] Default value: `true`\n- [ ] Support in both global (`~/.config/ralph-tui/config.toml`) and project-level config\n- [ ] Add to SettingsView.tsx for UI toggle\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Update `src/config/types.ts` - add to `RalphConfig` type\n- Update `src/config/schema.ts` - add Zod validation\n- Update `src/tui/components/SettingsView.tsx` - add toggle\n\n## Config Example\n```toml\n# Keep attached images after ralph-tui exits\ncleanupImages = false\n```\n\n## Dependencies\n- Story 1.4: Image Cleanup on Exit (ralph-tui-12c)\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:25.321358Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-kha","title":"US-002: Platform Clipboard Abstraction","description":"## User Story\nAs a user on any platform, I want Ralph TUI to read images from my clipboard so that I can paste screenshots regardless of my operating system.\n\n## Acceptance Criteria\n- [ ] Detects if clipboard contains image data (vs text)\n- [ ] Reads image data as PNG buffer on macOS using `pngpaste`\n- [ ] Reads image data as PNG buffer on Linux using `xclip`\n- [ ] Reads image data as PNG buffer on Windows using PowerShell\n- [ ] Returns `null` gracefully if no image in clipboard\n- [ ] Returns meaningful error if clipboard tool not installed\n- [ ] Provides installation hints for missing tools\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- macOS: Check for `pngpaste` via `which`, fallback to `osascript`\n- Linux: Try `xclip`, then `xsel`, then `wl-paste` (Wayland)\n- Windows: Use `powershell -command \"Get-Clipboard -Format Image | ...\"`\n- All operations should be async with reasonable timeout (5s)\n\n## Estimate\n5 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:11.123310Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"]} +{"id":"ralph-tui-n1x","title":"Manual Cleanup Command","description":"## Description\nSlash command to manually clean up session images.\n\n## Acceptance Criteria\n- [ ] Slash command `/clear-images` removes all session images\n- [ ] Shows confirmation with count: \"Cleared 5 images\"\n- [ ] Also clears any pending image attachments in current input\n- [ ] Works regardless of `cleanup_policy` setting\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- Image Storage Manager (ralph-tui-35v)\n\n## Estimate\n1 point","status":"closed","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:36.790482Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T16:23:06.056298Z","closed_at":"2026-01-16T16:23:06.056298Z","close_reason":"Implemented /clear-images slash command. Created slash-commands.ts utility with isSlashCommand, parseSlashCommand, executeSlashCommand functions. Integrated into PrdChatApp to intercept slash commands before sending to agent. Clears all session images (from storage) and pending attachments, shows toast confirmation with count. Works regardless of cleanup_policy. TypeCheck and build pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-n1x","depends_on_id":"ralph-tui-35v","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-n1x","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-n3v","title":"Sandbox Mode Refactor: Remove Docker, Add macOS sandbox-exec","description":"Refactor sandbox implementation to remove Docker support (which doesn't work well with agent binaries and auth) and add native macOS sandbox-exec support. Update documentation to reflect these changes and recommend WSL for Windows users.\n\n## Rationale\n- Docker sandboxing requires pre-built images with agents installed - maintenance nightmare\n- Auth/API keys are tricky to get working across container boundaries\n- bwrap on Linux works great (mounts host binaries)\n- macOS has native sandbox-exec that can provide similar isolation\n- Windows users can use WSL2 with bwrap for sandboxing","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-16T10:35:23.631393032Z","created_by":"Subsy","updated_at":"2026-01-16T10:57:58.520832878Z","closed_at":"2026-01-16T10:57:58.520832878Z","close_reason":"Completed sandbox refactor: removed Docker (maintenance nightmare), added macOS sandbox-exec with Seatbelt profiles, updated documentation with Windows/WSL guidance","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","refactor"]} +{"id":"ralph-tui-n3v.1","title":"US-001: Remove Docker sandboxing support","description":"As a maintainer, I want to remove Docker sandboxing support because it doesn't work well with agent binaries and auth credentials.\n\n## Context\nDocker sandboxing requires:\n- Pre-built images with agents installed (maintenance burden)\n- Auth/API keys to work across container boundaries (complex)\n- Network access for LLM API calls anyway\n- The default ubuntu:22.04 image has no agents installed\n\nbwrap on Linux solves these problems by mounting host binaries read-only.\n\n## Acceptance Criteria\n- [ ] Remove 'docker' from SandboxMode type in src/sandbox/types.ts\n- [ ] Remove wrapWithDocker() method from src/sandbox/wrapper.ts\n- [ ] Remove docker detection from src/sandbox/detect.ts\n- [ ] Remove 'image' field from SandboxConfig type\n- [ ] Remove DEFAULT_SANDBOX_CONFIG.image\n- [ ] Update detectSandboxMode() to only check for bwrap on Linux (macOS will be added separately)\n- [ ] Remove any Docker-related tests\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-16T10:35:34.294387874Z","created_by":"Subsy","updated_at":"2026-01-16T10:47:01.387601802Z","closed_at":"2026-01-16T10:47:01.387601802Z","close_reason":"Removed Docker sandboxing: removed 'docker' from SandboxMode type, removed 'image' field, removed wrapWithDocker() method, updated detect.ts, CLI flags, and Zod schema","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","refactor","task"],"dependencies":[{"issue_id":"ralph-tui-n3v.1","depends_on_id":"ralph-tui-n3v","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-n3v.2","title":"US-002: Add macOS sandbox-exec support","description":"As a macOS user, I want native sandboxing using sandbox-exec so I can isolate agent execution without Docker.\n\n## Context\nmacOS has a native sandboxing mechanism called sandbox-exec that:\n- Uses Seatbelt profiles (.sb files) to define permissions\n- Can restrict filesystem access, network, and system calls\n- Is used by Apple for App Store apps\n- Works with host-installed binaries (no container needed)\n\n## Implementation Notes\nsandbox-exec syntax:\n```bash\nsandbox-exec -f profile.sb command args...\n```\n\nProfile example:\n```scheme\n(version 1)\n(deny default)\n(allow file-read* (subpath \"/usr\"))\n(allow file-read* file-write* (subpath \"/path/to/project\"))\n(allow network*) ; or deny for no-network mode\n(allow process-exec)\n```\n\n## Acceptance Criteria\n- [ ] Add 'sandbox-exec' to SandboxMode type in src/sandbox/types.ts\n- [ ] Add wrapWithSandboxExec() method to src/sandbox/wrapper.ts\n- [ ] Generate dynamic Seatbelt profile based on config and agent requirements\n- [ ] Support network enable/disable via profile\n- [ ] Mount project directory read-write\n- [ ] Mount agent auth paths read-only (e.g., ~/.claude)\n- [ ] Mount system paths read-only (/usr, /bin, /Applications, etc.)\n- [ ] Update detectSandboxMode() to detect macOS and use sandbox-exec\n- [ ] Handle the deprecated warning from sandbox-exec gracefully (it still works)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Test on macOS (manual verification)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-16T10:35:47.976440117Z","created_by":"Subsy","updated_at":"2026-01-16T10:52:33.054535996Z","closed_at":"2026-01-16T10:52:33.054535996Z","close_reason":"Implemented macOS sandbox-exec: added SandboxMode type, Seatbelt profile generation, detectSandboxMode() for darwin, CLI flag, and wrapper method","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-n3v.2","depends_on_id":"ralph-tui-n3v","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-n3v.2","depends_on_id":"ralph-tui-n3v.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-n3v.3","title":"US-003: Update sandbox documentation","description":"As a user, I want updated documentation that accurately reflects the sandbox options available on each platform.\n\n## Changes Required\n\n### Remove Docker content:\n- Remove Docker mode from sandbox modes table\n- Remove docker CLI flag documentation\n- Remove Docker image configuration option\n- Remove Docker examples\n- Remove Docker installation instructions\n\n### Add sandbox-exec content:\n- Add sandbox-exec to sandbox modes table\n- Document that it's macOS-only and automatic when available\n- Explain that it uses Seatbelt profiles under the hood\n- Note the deprecation warning users may see (Apple deprecated it but it still works)\n\n### Add Windows/WSL guidance:\n- Add new section: 'Sandboxing on Windows'\n- Explain that native Windows sandboxing is not supported\n- Recommend WSL2 for Windows users who want sandboxing\n- Provide brief WSL2 setup guidance:\n 1. Install WSL2\n 2. Install ralph-tui inside WSL\n 3. Install bwrap inside WSL\n 4. Use --sandbox flag normally\n\n### Update platform requirements table:\n- Linux: bwrap (recommended)\n- macOS: sandbox-exec (automatic)\n- Windows: Not supported natively, use WSL2\n\n## Acceptance Criteria\n- [ ] Remove all Docker sandbox references from website/content/docs/configuration/sandbox.mdx\n- [ ] Add sandbox-exec section for macOS users\n- [ ] Add Windows/WSL section with guidance\n- [ ] Update platform requirements table\n- [ ] Update sandbox modes table (remove docker, add sandbox-exec)\n- [ ] Update CLI flags section (remove --sandbox=docker)\n- [ ] Remove image configuration option from docs\n- [ ] Update examples section (remove Docker examples)\n- [ ] bun run typecheck passes (if any code refs docs)\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-16T10:36:01.452227054Z","created_by":"Subsy","updated_at":"2026-01-16T10:57:51.911999151Z","closed_at":"2026-01-16T10:57:51.911999151Z","close_reason":"Updated sandbox documentation: removed Docker, added sandbox-exec for macOS, added Windows/WSL guidance, updated platform table and examples","source_repo":".","compaction_level":0,"original_size":0,"labels":["docs","ralph","task"],"dependencies":[{"issue_id":"ralph-tui-n3v.3","depends_on_id":"ralph-tui-n3v","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-n3v.3","depends_on_id":"ralph-tui-n3v.1","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-n3v.3","depends_on_id":"ralph-tui-n3v.2","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-no2","title":"OSC 52 / Base64 Image Detection","description":"## Description\nDetect base64-encoded images pasted via OSC 52 protocol (iTerm2, Kitty, WezTerm) or data URIs.\n\n## Acceptance Criteria\n- [ ] Detect OSC 52 escape sequences containing image data\n- [ ] Detect data URI format: `data:image/png;base64,...`\n- [ ] Extract and decode base64 image payload\n- [ ] Detect image format from magic bytes: PNG (`iVBOR`), JPEG (`/9j/`), GIF (`R0lGOD`), WebP (`UklGR`)\n- [ ] Fall back to raw text paste if not valid image data\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- OSC 52 format: `\\x1b]52;c;\\x07`\n- Add to `src/tui/utils/image-detection.ts`\n\n## Estimate\n5 points","status":"closed","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:21:39.114106Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T16:13:48.855665Z","closed_at":"2026-01-16T16:13:48.855665Z","close_reason":"Implemented OSC 52 and base64 image detection: detectOsc52Image for terminal escape sequences, detectDataUriImage for data URIs, detectRawBase64Image for raw base64, and unified detectBase64Image function. All functions detect PNG/JPEG/GIF/WebP from magic bytes and gracefully return isBase64Image=false for non-image data. 57 tests pass, typecheck and build pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-no2","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-oqe","title":"Fix Windows ENOENT error when spawning opencode agent","description":"On Windows, the opencode agent integration failed with 'ENOENT: no such file or directory, uv_spawn opencode' because spawn() was using shell: false. Windows requires shell: true to execute wrapper scripts (.cmd, .bat, .ps1). Fixed by conditionally setting shell: true on win32 platform in base.ts execute() method.","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-14T20:50:18.098294361Z","created_by":"Subsy","updated_at":"2026-01-14T20:56:07.148152814Z","closed_at":"2026-01-14T20:56:07.148152814Z","close_reason":"Fixed by using shell: true on Windows platform in base.ts execute() method","source_repo":".","compaction_level":0,"original_size":0,"labels":["windows"]} +{"id":"ralph-tui-oqv","title":"US-012: First-Time Paste Hint","description":"## User Story\nAs a new user, I want to learn about image paste support when I paste text so that I discover this feature naturally.\n\n## Acceptance Criteria\n- [ ] On first text paste of session, show transient hint\n- [ ] Hint: \"Tip: You can paste images too (Ctrl+V with image in clipboard)\"\n- [ ] Only shown once per session\n- [ ] Dismisses automatically after 3 seconds or on keypress\n- [ ] Can be disabled in config: `show_paste_hints = false`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- US-004: Paste Event Interception (ralph-tui-q97)\n\n## Estimate\n1 point","status":"tombstone","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:14:12.443943Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-oqv","depends_on_id":"ralph-tui-q97","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-orx","title":"US-005: Inline Image Indicators","description":"## User Story\nAs a user, I want to see `[Image 1]` indicators in my text input when I paste images so that I know my images were captured successfully.\n\n## Acceptance Criteria\n- [ ] Insert `[Image N]` at cursor position when image pasted\n- [ ] Indicators are numbered sequentially (1, 2, 3...)\n- [ ] Indicators are styled distinctly (dimmed or colored if terminal supports)\n- [ ] Backspace over indicator removes the image attachment\n- [ ] Indicators persist correctly when editing surrounding text\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Store image references as metadata alongside text content\n- Indicators are \"atomic\" - can't partially delete them\n- Consider using special Unicode markers internally for tracking\n\n## Dependencies\n- US-004: Paste Event Interception (ralph-tui-q97)\n\n## Estimate\n2 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:26.938887Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-orx","depends_on_id":"ralph-tui-q97","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-p6u","title":"Story 5.2: Show Feedback for Image Attachment Actions","description":"## Description\nProvide user feedback when images are attached or when errors occur.\n\n## Acceptance Criteria\n- [ ] Success toast: \"Image attached\" when image is successfully stored\n- [ ] Error toast: \"Invalid image path\" when file doesn't exist\n- [ ] Error toast: \"Unsupported format\" when file isn't a supported image type\n- [ ] Error toast: \"Failed to save image\" when storage fails\n- [ ] Info toast: \"Images will be cleaned up on exit\" (shown once per session when first image attached, if cleanup enabled)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Integrate toast into ChatView and other input components\n- Use useToast hook for triggering notifications\n\n## Dependencies\n- Story 5.1: Create Toast Notification Component (ralph-tui-3l4)\n- Story 3.2: Integrate Image Detection into ChatView Paste Handler (ralph-tui-3uu)\n\n## Priority\nMedium\n\n## Estimate\n2 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:19:19.948880Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-q97","title":"US-004: Paste Event Interception","description":"## User Story\nAs a user, I want to paste images using the standard Ctrl+V / Cmd+V shortcut so that image pasting feels natural and intuitive.\n\n## Acceptance Criteria\n- [ ] Ctrl+V / Cmd+V triggers clipboard inspection\n- [ ] If clipboard has image: save image, insert indicator, prevent default text paste\n- [ ] If clipboard has text: paste text normally\n- [ ] Works in all textarea components (main input, iteration input, etc.)\n- [ ] Paste handling is debounced to prevent double-processing\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Hook into OpenTUI's input handling or React's onPaste\n- May need to use Ink's `useInput` hook with raw mode detection\n- Check clipboard content type before attempting image read\n\n## Dependencies\n- US-001: Image Storage Manager (ralph-tui-5zr)\n- US-002: Platform Clipboard Abstraction (ralph-tui-kha)\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:19.698836Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-q97","depends_on_id":"ralph-tui-5zr","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-q97","depends_on_id":"ralph-tui-kha","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-rh7","title":"Add command palette (Ctrl+K) to PRD chat interface","description":"Add a command palette modal that opens with Ctrl+K in the PRD chat interface.\n\n## Implementation Details\n\n- **Trigger**: Ctrl+K opens modal, Esc closes\n- **Component**: CommandPalette.tsx (modal overlay)\n- **UI**: Arrow key navigation, Enter to execute, type to filter\n- **Commands to include**:\n - /clear - Clear chat history\n - /help - Show help\n - /exit - Exit the chat\n - (future: /export, /settings, etc.)\n\n## Rationale\n\nThe current slash command system requires typing the full command. A command palette provides:\n1. Discoverability - users can see available commands\n2. Keyboard-driven workflow - no need to remember exact syntax\n3. Quick access - Ctrl+K is a common pattern (VS Code, Slack, etc.)\n\n## Notes\n\nWas partially implemented then reverted during the image attachment work. The component structure was:\n- Modal overlay with dark background\n- Filtered list of commands\n- Highlight current selection\n- Execute on Enter","status":"open","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-17T08:00:54.736402Z","created_by":"Jesse Merhi","updated_at":"2026-01-17T08:00:54.736402Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["enhancement","tui"]} +{"id":"ralph-tui-rtd","title":"Paste not working in TUI chat input when creating PRD","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-13T07:49:27.520504051Z","created_by":"Subsy","updated_at":"2026-01-13T08:16:52.859050470Z","closed_at":"2026-01-13T08:16:52.859050470Z","close_reason":"Fixed paste in PRD chat input by subscribing to OpenTUI paste events. Also filtered modifier keys to prevent system shortcuts from inserting characters.","source_repo":".","compaction_level":0,"original_size":0} +{"id":"ralph-tui-sdc","title":"Story 1.3: Image Storage System","description":"## Description\nCreate a system to store attached images in a predictable location accessible to agents.\n\n## Acceptance Criteria\n- [ ] Store images in `.ralph-tui/images/` directory (created if not exists)\n- [ ] Generate unique filenames: `{timestamp}-{uuid}.{ext}` (e.g., `1705420800000-a1b2c3d4.png`)\n- [ ] For file path attachments, copy file to storage location\n- [ ] For base64 attachments, decode and write to storage location\n- [ ] Return absolute path to stored image\n- [ ] Handle storage errors gracefully\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/image-storage.ts`\n- Use `Bun.write()` for file operations\n- Storage path: `path.join(process.cwd(), '.ralph-tui', 'images')`\n\n## Priority\nHigh\n\n## Estimate\n3 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:02.204693Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-skz","title":"US-003: Configuration Schema Extension","description":"## User Story\nAs a user, I want to configure image paste behavior through ralph-tui's config file so that I can control cleanup policy and other settings.\n\n## Acceptance Criteria\n- [ ] Add `[images]` section to config schema\n- [ ] Support `enabled` boolean (default: true)\n- [ ] Support `cleanup_policy` enum: \"on_exit\" | \"manual\" | \"never\"\n- [ ] Support `skip_cleanup_confirmation` boolean (default: false)\n- [ ] Support `max_images_per_message` number (default: 10, 0 = unlimited)\n- [ ] Config is readable from both global and project-level config\n- [ ] Project config overrides global config\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Estimate\n2 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:12:58.276359Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"]} +{"id":"ralph-tui-sqt5","title":"Auto-refresh test epic","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2026-03-17T04:24:35.024152Z","created_by":"mat","updated_at":"2026-03-17T04:40:10.308429Z","source_repo":".","deleted_at":"2026-03-17T04:40:10.308421Z","deleted_by":"mat","delete_reason":"delete","original_type":"epic","compaction_level":0,"original_size":0} +{"id":"ralph-tui-sqt5.1","title":"Create a sibling bead","description":"Your job is to create a new bead (task) in this epic using the br CLI. Run this exact command: br create \"Auto-created bead\" --type task --parent ralph-tui-sqt5 --priority 2 --description \"This bead was auto-created by an agent to test auto-refresh.\" Then report that you successfully created the bead.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-03-17T04:24:41.202469Z","created_by":"mat","updated_at":"2026-03-17T04:40:10.264232Z","closed_at":"2026-03-17T04:26:27.771543Z","close_reason":"Successfully created sibling bead ralph-tui-sqt5.2 under epic ralph-tui-sqt5","source_repo":".","deleted_at":"2026-03-17T04:40:10.264227Z","deleted_by":"mat","delete_reason":"delete","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-sqt5.2","title":"Auto-created bead","description":"This bead was auto-created by an agent to test auto-refresh.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2026-03-17T04:26:21.725340Z","created_by":"mat","updated_at":"2026-03-17T04:40:10.213215Z","closed_at":"2026-03-17T04:26:52.677495Z","close_reason":"Test bead validated - auto-refresh picked up this auto-created bead successfully","source_repo":".","deleted_at":"2026-03-17T04:40:10.213211Z","deleted_by":"mat","delete_reason":"delete","original_type":"task","compaction_level":0,"original_size":0} +{"id":"ralph-tui-tzw","title":"(EPIC) Ralph TUI Follow-up - UI/UX Improvements","description":"Follow-up improvements for Ralph TUI based on initial usage feedback.\n\n## Goals\n- Fix visual/layout issues (status bar off-screen, help dialog background)\n- Improve keyboard shortcuts (remove confusing ones, better defaults)\n- Add prompt customization support\n- Better default behavior for task visibility\n\n## Success Criteria\n- TUI displays correctly on standard terminal sizes\n- Keyboard shortcuts are intuitive and consistent\n- Custom prompts can be specified\n- Closed items visible by default","status":"closed","priority":2,"issue_type":"epic","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:07.898579331Z","created_by":"Subsy","updated_at":"2026-01-12T21:17:10.637855358Z","closed_at":"2026-01-12T21:17:10.637855358Z","close_reason":"Completed - subagent tracing implemented, UI improvements done, core orchestrator functional","source_repo":".","compaction_level":0,"original_size":0,"labels":["epic","ralph"]} +{"id":"ralph-tui-tzw.1","title":"BUG: Bottom of TUI off-screen - status bar and shortcut hints not visible","description":"## User Story\nAs a user running Ralph TUI, I want to see the status bar and keyboard shortcut hints at the bottom of the screen, so that I can understand the current state and available actions.\n\n## Current Behavior\n- The bottom portion of the TUI is cut off below the visible terminal area\n- Status bar showing current state is not visible\n- Keyboard shortcut hints are not visible\n- Users must guess what shortcuts are available\n\n## Expected Behavior\n- TUI fits within the terminal viewport\n- Status bar is always visible at the bottom\n- Keyboard shortcut hints are visible\n- Layout adapts to terminal size\n\n## Technical Investigation Needed\n- Check if terminal height detection is correct\n- Review OpenTUI Box/layout constraints\n- Check for off-by-one errors in height calculations\n- Test with different terminal sizes (80x24, 120x40, etc.)\n\n## Acceptance Criteria\n- [ ] Status bar visible at bottom of screen\n- [ ] Keyboard shortcut hints visible\n- [ ] Works on standard 80x24 terminal\n- [ ] Works on larger terminals (120x40+)\n- [ ] No content clipped at bottom\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":1,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:44.847723998Z","created_by":"Subsy","updated_at":"2026-01-12T09:31:15.149067632Z","closed_at":"2026-01-12T09:31:15.149067632Z","close_reason":"Fixed TUI layout issue by adding fixed height to ProgressDashboard and accounting for it in contentHeight calculation. Footer and status bar are now visible on all terminal sizes.","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.1","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.10","title":"BUG: Tracker displays as 'beads' when beads-bv is selected","description":"As a user, I want to see 'beads-bv' when that tracker is selected, not just 'beads', so I know which variant is active.\n\n## Context\nThe beads-bv tracker inherits from beads but has different behavior (uses bv for triage). The display should reflect the actual plugin in use.\n\n## Acceptance Criteria\n- [ ] When beads-bv tracker is configured, display shows \"beads-bv\" not \"beads\"\n- [ ] When beads tracker is configured, display shows \"beads\"\n- [ ] Plugin ID from meta is used for display, not parent class name\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:42.895891575Z","created_by":"Subsy","updated_at":"2026-01-12T14:33:54.913460607Z","closed_at":"2026-01-12T14:33:54.913460607Z","close_reason":"Fixed tracker display to show actual plugin ID (beads-bv) by prioritizing trackerType prop from resolved config over storedConfig fallbacks","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.10","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-tzw.10","depends_on_id":"ralph-tui-tzw.9","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.11","title":"BUG: Timer runs continuously instead of only during execution","description":"As a user, I want the timer in the top right to only run when Ralph is actively executing an iteration, so I can see actual execution time.\n\n## Context\nThe timer currently starts and runs continuously. It should only tick while an agent is running, pausing between iterations and when idle.\n\n## Acceptance Criteria\n- [ ] Timer is paused/stopped when engine is idle (no iteration running)\n- [ ] Timer runs only during active iteration execution\n- [ ] Timer resets or accumulates based on UX decision (clarify with user if needed)\n- [ ] Timer displays correctly formatted time (mm:ss or hh:mm:ss)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:43.110324395Z","created_by":"Subsy","updated_at":"2026-01-12T14:27:22.362647307Z","closed_at":"2026-01-12T14:27:22.362647307Z","close_reason":"Timer now only runs during 'executing' status, pausing when idle or between iterations. Total execution time accumulates across iterations.","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.11","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.12","title":"FEAT: Show start/end/elapsed times in output detail pane","description":"As a user viewing iteration output details, I want to see start time, end time, and elapsed duration as summary metrics at the top of the detail pane.\n\n## Context\nWhen viewing output details for a completed iteration, timing information helps understand execution performance.\n\n## Acceptance Criteria\n- [ ] Output detail pane shows \"Started:\" with timestamp at top\n- [ ] Output detail pane shows \"Ended:\" with timestamp at top\n- [ ] Output detail pane shows \"Duration:\" with elapsed time (e.g., \"2m 34s\")\n- [ ] Metrics appear as a summary section before the raw output\n- [ ] For in-progress iterations, show \"Started:\" and \"Running...\" for duration\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes\n- [ ] Verify in TUI manually","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:43.309625651Z","created_by":"Subsy","updated_at":"2026-01-12T14:25:25.853815085Z","closed_at":"2026-01-12T14:25:25.853815085Z","close_reason":"Implemented timing summary in output detail pane showing start time, end time, and duration. Works for both in-progress (Running...) and completed iterations.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.12","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.13","title":"TASK: Remove Enter as start key - only use 's'","description":"As a user, I want only 's' to start Ralph execution, removing Enter as an alternative start key.\n\n## Context\nHaving Enter as a start key can cause accidental starts. The 's' key is more intentional.\n\n## Acceptance Criteria\n- [ ] Remove Enter key binding for starting execution\n- [ ] 's' key remains the only way to start execution\n- [ ] Help overlay updated to reflect this change\n- [ ] Footer hints updated to show only 's' for start\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:43.514208289Z","created_by":"Subsy","updated_at":"2026-01-12T14:20:13.568283294Z","closed_at":"2026-01-12T14:20:13.568283294Z","close_reason":"Removed Enter key binding for starting execution. Now only 's' key starts Ralph execution. Updated footer hints and help overlay to reflect the change.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.13","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.14","title":"FEAT: --prd flag auto-switches to JSON tracker mode","description":"As a user, I want to specify `--prd ` to automatically use JSON tracker mode with that file, so I don't have to separately configure the tracker.\n\n## Context\nWhen using Ralph's prd.json workflow, users shouldn't need to manually configure the JSON tracker. The --prd flag should imply JSON mode for the session.\n\n## Acceptance Criteria\n- [ ] Add `--prd ` flag to run command argument parsing\n- [ ] When --prd specified, override tracker to 'json' for this session\n- [ ] Set JSON tracker's file path to the specified prd.json path\n- [ ] Works with both absolute and relative paths\n- [ ] Error if specified file doesn't exist or isn't valid JSON\n- [ ] Help text updated to document --prd flag\n- [ ] Does NOT persist to config (session only)\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":1,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T15:49:45.873036209Z","created_by":"Subsy","updated_at":"2026-01-12T16:01:23.751740013Z","closed_at":"2026-01-12T16:01:23.751740013Z","close_reason":"Implemented --prd flag auto-switch to JSON tracker mode. Added file validation, help text updates, and all acceptance criteria met.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.14","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.2","title":"FEAT: Help dialog should overlay main TUI instead of pink background","description":"## User Story\nAs a user viewing the help dialog, I want it to appear as an overlay on top of the main TUI, so that I maintain context and the visual experience is professional.\n\n## Current Behavior\n- Help dialog displays with a bright pink background\n- Main TUI content is completely hidden\n- Jarring visual transition when opening/closing help\n- Unprofessional appearance\n\n## Expected Behavior\n- Help dialog appears as a modal/overlay\n- Main TUI remains visible (dimmed) behind the dialog\n- Smooth visual transition\n- Professional, consistent color scheme\n\n## Technical Approach\n- Use OpenTUI modal/overlay component if available\n- Or implement semi-transparent backdrop\n- Ensure help content is readable with proper contrast\n- Handle keyboard events properly (Esc to close, etc.)\n\n## Acceptance Criteria\n- [ ] Help dialog renders as overlay on main TUI\n- [ ] No bright pink background\n- [ ] Main TUI visible (dimmed) behind help\n- [ ] Consistent color scheme with rest of TUI\n- [ ] Esc key closes help dialog\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.025531947Z","created_by":"Subsy","updated_at":"2026-01-12T09:59:38.355918231Z","closed_at":"2026-01-12T09:59:38.355918231Z","close_reason":"Fixed pink overlay backgrounds by replacing rgba() syntax with 8-character hex colors (#RRGGBBAA). OpenTUI's color parser doesn't support CSS rgba() and falls back to magenta for invalid colors.","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.2","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.3","title":"TASK: Remove 't' shortcut and change 'i' shortcut to 'v'","description":"## User Story\nAs a user navigating the TUI, I want intuitive and non-conflicting keyboard shortcuts, so that I can efficiently interact with the interface without confusion.\n\n## Current Behavior\n- 't' shortcut exists (purpose unclear/redundant)\n- 'i' shortcut used for some action\n- Shortcuts may conflict or be unintuitive\n\n## Expected Behavior\n- 't' shortcut removed entirely\n- 'i' shortcut functionality moved to 'v' key\n- 'v' is more intuitive (likely \"view\" action)\n- Help dialog updated to reflect changes\n\n## Changes Required\n1. Find and remove 't' key handler in RunApp.tsx\n2. Find 'i' key handler and change to 'v'\n3. Update help text/shortcut hints\n4. Update any documentation\n\n## Acceptance Criteria\n- [ ] 't' key no longer triggers any action\n- [ ] 'v' key performs action previously on 'i'\n- [ ] 'i' key no longer triggers that action\n- [ ] Help dialog shows updated shortcuts\n- [ ] Status bar hints updated\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.193107480Z","created_by":"Subsy","updated_at":"2026-01-12T09:56:35.419291486Z","closed_at":"2026-01-12T09:56:35.419291486Z","close_reason":"Removed 't' shortcut (was redundant), changed 'i' to 'v' for view toggle, updated help documentation","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.3","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.4","title":"BUG: Toggle closed shortcut (h) not working + show closed by default","description":"## User Story\nAs a user viewing the task list, I want to see closed items by default and toggle their visibility with 'h', so that I have full context of completed work and can hide it when needed.\n\n## Current Behavior\n- 'h' shortcut to toggle closed items doesn't work\n- Closed items may be hidden by default\n- Users can't see what work has been completed\n\n## Expected Behavior\n- Closed items shown by default (greyed out)\n- 'h' key toggles visibility of closed items\n- Clear visual distinction for closed items\n- Toggle state persists during session\n\n## Technical Investigation\n- Check 'h' key handler in RunApp.tsx\n- Verify showClosed state management\n- Check if filter logic is correct\n- Test with beads that have closed children\n\n## Changes Required\n1. Fix 'h' key handler if broken\n2. Change default showClosed to true\n3. Ensure closed items render with greyed styling\n4. Verify toggle actually filters/shows items\n\n## Acceptance Criteria\n- [ ] Closed items visible by default\n- [ ] Closed items styled differently (greyed out)\n- [ ] 'h' key toggles closed item visibility\n- [ ] Toggle is responsive (no delay)\n- [ ] State persists during session\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"bug","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.361002536Z","created_by":"Subsy","updated_at":"2026-01-12T09:54:48.078204892Z","closed_at":"2026-01-12T09:54:48.078204892Z","close_reason":"Fixed by adding --all flag to bd list in beads tracker getTasks() method. Root cause: bd list excludes closed issues by default, so the TUI never received closed tasks to display/toggle.","source_repo":".","compaction_level":0,"original_size":0,"labels":["bug","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.4","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.5","title":"FEAT: Add --prompt option to specify custom prompt file","description":"## User Story\nAs a user running Ralph TUI, I want to specify a custom prompt file via --prompt option, so that I can customize the AI agent's behavior for different use cases.\n\n## Current Behavior\n- No --prompt option available\n- Prompts hardcoded or implicit\n- Can't customize agent behavior without code changes\n\n## Expected Behavior\n- New --prompt CLI option\n- Defaults based on tracker mode:\n - json mode: prompt.md\n - beads mode: prompt-beads.md\n - beads-bv mode: prompt-beads.md\n- Prompt files read from ~/.config/ralph-tui/\n- TUI ensures prompt files exist on install/first run\n\n## Technical Implementation\n\n### CLI Changes\n- Add --prompt option to run command\n- Validate file exists and is readable\n- Pass to ExecutionEngine\n\n### Config Directory Setup\n- Create ~/.config/ralph-tui/ on first run\n- Copy default prompt files from bundled templates\n- scripts/ralph/prompt.md → ~/.config/ralph-tui/prompt.md\n- scripts/ralph/prompt-beads.md → ~/.config/ralph-tui/prompt-beads.md\n\n### Prompt Resolution Order\n1. --prompt CLI argument (explicit path)\n2. ~/.config/ralph-tui/{mode-specific}.md\n3. Bundled default (fallback)\n\n## File Locations\n- Source templates: scripts/ralph/prompt.md, scripts/ralph/prompt-beads.md\n- User config: ~/.config/ralph-tui/prompt.md, ~/.config/ralph-tui/prompt-beads.md\n\n## Acceptance Criteria\n- [ ] --prompt option added to run command\n- [ ] Default prompt selected based on tracker mode\n- [ ] ~/.config/ralph-tui/ created on first run\n- [ ] Default prompt files copied to config dir\n- [ ] Custom prompt file content passed to agent\n- [ ] Error message if --prompt file doesn't exist\n- [ ] Help text documents --prompt option\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T08:45:45.527660798Z","created_by":"Subsy","updated_at":"2026-01-12T09:49:53.829037118Z","closed_at":"2026-01-12T09:49:53.829037118Z","close_reason":"Added --prompt CLI option with full prompt resolution chain (CLI > user config > built-in). Includes init-prompts command for user customization.","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.5","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.6","title":"TASK: Remove demo data functionality entirely","description":"## User Story\nAs a user learning Ralph TUI, I want the interface to only show real data from my configured tracker, so that I'm not confused by fake demo tasks mixed with real work.\n\n## Current Behavior\n- Demo data functionality exists in the codebase\n- May show fake/sample tasks to new users\n- Confusing when mixed with real tracker data\n- Unclear what's real vs demo\n- Extra code complexity for marginal benefit\n\n## Expected Behavior\n- No demo data functionality\n- TUI shows only real data from configured tracker\n- Empty state shown if no tasks configured\n- Clear onboarding flow for new users instead of fake data\n\n## Changes Required\n1. Find and remove demo data generation code\n2. Remove demo data types/interfaces\n3. Remove any demo mode flags/config\n4. Update empty state to show helpful setup instructions\n5. Clean up any demo-related tests\n\n## Files to Investigate\n- src/trackers/ - check for demo data in tracker plugins\n- src/tui/components/ - check for demo mode rendering\n- src/commands/run.tsx - check for demo flags\n\n## Acceptance Criteria\n- [ ] All demo data code removed\n- [ ] No fake tasks appear in TUI\n- [ ] Empty state shows setup instructions (not demo)\n- [ ] No demo-related CLI flags or config options\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T09:08:35.430868543Z","created_by":"Subsy","updated_at":"2026-01-12T09:42:07.661698212Z","closed_at":"2026-01-12T09:42:07.661698212Z","close_reason":"Removed all demo data functionality: deleted defaultTasks array from App.tsx, updated createDefaultState to use empty tasks by default, added helpful setup instructions in RightPanel for empty state","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.6","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.7","title":"FEAT: Add 'l' shortcut to load/switch epic (tracker-plugin specific)","description":"## User Story\nAs a user working on multiple epics, I want to press 'l' to load a different epic without restarting the TUI, so that I can switch context efficiently.\n\n## Current Behavior\n- Must restart TUI with different --epic flag to switch\n- No way to change epic mid-session\n- Workflow interruption when switching projects\n\n## Expected Behavior\n- Press 'l' to open epic loader dialog\n- Behavior is tracker-plugin specific:\n - **json mode**: Prompt for file path, validate exists\n - **beads/beads-bv mode**: Show list of open epics (filtered by configured label tag), allow selection\n - **future linear plugin**: Query Linear API for open epics, show selection\n- After selection, TUI reloads with new epic's tasks\n- Engine stops current work before switching\n\n## Technical Implementation\n\n### TrackerPlugin Interface Extension\nAdd method to TrackerPlugin interface:\n```typescript\ninterface TrackerPlugin {\n // ... existing methods\n \n // Returns available epics for selection\n // Implementation varies by tracker type\n getAvailableEpics(): Promise;\n \n // Or for file-based trackers\n promptForEpicSource(): Promise;\n}\n```\n\n### Tracker-Specific Implementations\n\n**JsonTrackerPlugin:**\n- Show file path input prompt\n- Validate file exists and is valid JSON\n- Return path or null if cancelled\n\n**BeadsTrackerPlugin / BeadsBvTrackerPlugin:**\n- Query `bd list --type=epic --status=open --labels={configuredLabel}`\n- Show selectable list of epics\n- Return selected epic ID\n\n**Future LinearTrackerPlugin:**\n- Query Linear API for projects/epics\n- Show selectable list\n- Return selected epic/project ID\n\n### TUI Integration\n1. 'l' key handler opens epic loader\n2. Calls tracker.getAvailableEpics() or promptForEpicSource()\n3. Shows appropriate UI based on tracker type\n4. On selection: stop engine, update config, reload tasks\n\n## Acceptance Criteria\n- [ ] 'l' key opens epic loader dialog\n- [ ] json mode: prompts for file path with validation\n- [ ] beads mode: shows list of open epics with configured label\n- [ ] beads-bv mode: shows list of open epics with configured label\n- [ ] Selected epic loads correctly\n- [ ] Current engine work stops before switch\n- [ ] Task list refreshes with new epic's tasks\n- [ ] TrackerPlugin interface extended appropriately\n- [ ] Help dialog shows 'l' shortcut\n- [ ] pnpm typecheck passes\n- [ ] pnpm lint passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-12T09:08:35.623615313Z","created_by":"Subsy","updated_at":"2026-01-12T09:39:17.153695520Z","closed_at":"2026-01-12T09:39:17.153695520Z","close_reason":"Implemented 'l' shortcut to load/switch epic with tracker-plugin specific behavior. EpicLoaderOverlay supports list mode for beads and file-prompt mode for json tracker. Typecheck and lint pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["feature","ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.7","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.8","title":"Test bead for refresh testing","status":"tombstone","priority":4,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T13:49:16.270118313Z","created_by":"Subsy","updated_at":"2026-01-12T13:50:32.478221757Z","closed_at":"2026-01-12T13:50:32.478221757Z","source_repo":".","deleted_at":"2026-01-12T13:50:32.478221757Z","deleted_by":"daemon","delete_reason":"delete","original_type":"task","compaction_level":0,"original_size":0,"labels":["ralph"],"dependencies":[{"issue_id":"ralph-tui-tzw.8","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-tzw.9","title":"FEAT: Restore agent and tracker info to top bar","description":"As a user, I want to see which agent and tracker are selected in the top bar so I know my configuration at a glance.\n\n## Context\nThe top bar was recently simplified but became too minimal, removing useful context about the current configuration.\n\n## Acceptance Criteria\n- [ ] Top bar shows selected agent plugin name (e.g., \"claude\", \"opencode\")\n- [ ] Top bar shows selected tracker plugin name (e.g., \"beads\", \"beads-bv\", \"json\")\n- [ ] Information fits without overcrowding the header\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-12T14:13:42.683904329Z","created_by":"Subsy","updated_at":"2026-01-12T14:29:53.578932999Z","closed_at":"2026-01-12T14:29:53.578932999Z","close_reason":"Implemented agent and tracker display in header. Added agentName/trackerName to HeaderProps, updated Header component to display them compactly (agent/tracker format), and connected config values from RunApp. All acceptance criteria met: typecheck and lint pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["ralph","task"],"dependencies":[{"issue_id":"ralph-tui-tzw.9","depends_on_id":"ralph-tui-tzw","type":"parent-child","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-u9i","title":"Story 1.2: OSC 52 Base64 Image Detection","description":"## Description\nDetect base64-encoded images pasted via OSC 52 protocol (supported by iTerm2, Kitty, WezTerm).\n\n## Acceptance Criteria\n- [ ] Detect OSC 52 escape sequences containing image data\n- [ ] Extract and decode base64 image payload\n- [ ] Detect image format from magic bytes or data URI prefix\n- [ ] Fall back to raw text paste if not valid image data\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- OSC 52 format: `\\x1b]52;c;\\x07`\n- Also handle data URI format: `data:image/png;base64,...`\n- Detect format from base64 magic bytes: PNG (`iVBOR`), JPEG (`/9j/`), GIF (`R0lGOD`), WebP (`UklGR`)\n\n## Priority\nMedium\n\n## Estimate\n5 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:13.384349Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-v45","title":"Test Beads-Rust Tracker Integration","description":"Epic to test ralph-tui beads-rust tracker plugin functionality","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2026-01-21T00:39:11.047038410Z","created_by":"plgeek","updated_at":"2026-01-21T00:42:45.458609925Z","closed_at":"2026-01-21T00:42:45.458609925Z","source_repo":".","deleted_at":"2026-01-21T00:42:45.458603813Z","deleted_by":"plgeek","delete_reason":"Rebuilding with hierarchical IDs","original_type":"epic","compaction_level":0,"original_size":0} +{"id":"ralph-tui-v8k","title":"Clean up untracked sandbox artifacts","description":"Address untracked files in repo (coverage artifacts and sandbox helper files) left from previous iterations.","status":"open","priority":2,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T00:05:39.194818478Z","created_by":"Subsy","updated_at":"2026-01-16T00:05:39.194818478Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["chore"]} +{"id":"ralph-tui-wwf","title":"US-008: Exit Cleanup with Confirmation","description":"## User Story\nAs a user, I want ralph-tui to offer to clean up session images when I exit so that I don't accumulate orphaned files.\n\n## Acceptance Criteria\n- [ ] On exit, if `cleanup_policy = \"on_exit\"` and images exist, show confirmation\n- [ ] Confirmation lists image filenames\n- [ ] Options: [Y] Yes, [N] No, [A] Always (sets `skip_cleanup_confirmation`)\n- [ ] If `skip_cleanup_confirmation = true`, delete without prompting\n- [ ] If `cleanup_policy = \"manual\"` or `\"never\"`, skip cleanup entirely\n- [ ] Handle Ctrl+C / SIGTERM gracefully (still prompt if possible)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Use Ink's exit handling hooks\n- Write config update for \"Always\" option atomically\n- Log cleanup actions for debugging\n\n## Dependencies\n- US-003: Configuration Schema Extension (ralph-tui-skz)\n\n## Estimate\n3 points","status":"tombstone","priority":1,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:13:51.893141Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:10.120439Z","closed_at":"2026-01-16T10:21:10.120439Z","source_repo":".","deleted_at":"2026-01-16T10:21:10.120439Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["clipboard-images"],"dependencies":[{"issue_id":"ralph-tui-wwf","depends_on_id":"ralph-tui-skz","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-x09","title":"Image File Path Detection","description":"## Description\nDetect when pasted text is a valid image file path and handle it as an image attachment.\n\n## Acceptance Criteria\n- [ ] Detect absolute and relative file paths ending in: `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`\n- [ ] Validate that the file exists on disk before treating as image\n- [ ] Support paths with spaces (quoted or escaped)\n- [ ] Case-insensitive extension matching\n- [ ] If path doesn't exist or isn't an image, paste as raw text (graceful fallback)\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create module: `src/tui/utils/image-detection.ts`\n- Use `Bun.file().exists()` for validation\n- Regex pattern: `/^[\"']?(.+\\.(jpe?g|png|gif|webp))[\"']?$/i`\n\n## Estimate\n3 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:21:25.281156Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T13:57:53.303827Z","closed_at":"2026-01-16T13:57:53.303837Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-x09","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-xcq","title":"Paste Event Integration in ChatView","description":"## Description\nIntegrate image detection into ChatView paste handling.\n\n## Acceptance Criteria\n- [ ] Ctrl+V / Cmd+V triggers unified image detection:\n 1. First check clipboard for actual image data\n 2. Then check if pasted text is a file path\n 3. Then check for base64/OSC 52 data\n 4. Fall back to normal text paste\n- [ ] If image detected: save to storage, insert `[Image N]` placeholder\n- [ ] If not image: paste text normally (existing behavior)\n- [ ] Works in all textarea components (main input, iteration input, etc.)\n- [ ] Paste handling is debounced to prevent double-processing\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify `src/tui/components/ChatView.tsx`\n- Use `keyHandler.on(\"paste\", ...)` from OpenTUI or Ink's `useInput`\n\n## Dependencies\n- useImageAttachment Hook (ralph-tui-zey)\n\n## Estimate\n3 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:02.416395Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:44:15.032713Z","closed_at":"2026-01-16T15:44:15.032713Z","close_reason":"Implemented paste event integration: usePaste hook with debouncing for OpenTUI paste events, ChatView onPaste callback prop for unified image detection (clipboard to file path to base64 to text fallback). Works in all textarea components via usePaste hook. Debouncing (100ms default) prevents double-processing. TypeCheck and build pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-xcq","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-xcq","depends_on_id":"ralph-tui-zey","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-xj9","title":"Add warning when --no-network conflicts with agent requirements","description":"As a user, I want a clear warning when I use --no-network with an agent that requires network access, so I understand why things might not work.\n\n## Context\nAll current agents (Claude, OpenCode, Gemini) require network access to communicate with their LLM APIs. Using --no-network would completely break them. However, future agents (local LLMs like Ollama) might not need network.\n\nThe AgentSandboxRequirements.requiresNetwork field exists but is currently only informational - no validation occurs.\n\n## Acceptance Criteria\n- [ ] In sandbox wrapper or engine, check if sandbox.network === false AND agent.getSandboxRequirements().requiresNetwork === true\n- [ ] Emit a warning (not error) to stderr or via engine event: 'Warning: Agent declares network required but --no-network is enabled. API calls will fail.'\n- [ ] Warning should be visible in both TUI and headless modes\n- [ ] Update website/content/docs/configuration/sandbox.mdx with:\n - Explanation that --no-network disables ALL network access including LLM API calls\n - Note that current agents (claude, opencode, gemini-cli) all require network\n - Use case: future local LLM agents (Ollama, llama.cpp) won't need network\n - Warning about using --no-network with cloud-based agents\n- [ ] bun run typecheck passes\n- [ ] bun run lint passes","status":"closed","priority":3,"issue_type":"task","owner":"ben@plgeek.com","created_at":"2026-01-16T10:00:48.315164520Z","created_by":"Subsy","updated_at":"2026-01-16T10:06:16.775715237Z","closed_at":"2026-01-16T10:06:16.775715237Z","close_reason":"Closed","source_repo":".","compaction_level":0,"original_size":0,"labels":["docs","enhancement","ralph"]} +{"id":"ralph-tui-y2a","title":"Default TUI launch should behave like 'ralph-tui run'","description":"## User Story\nAs a user launching ralph-tui without arguments, I want it to start in a useful mode (like 'run'), so that I can immediately begin working without needing to know specific commands.\n\n## Current Behavior\n- Running `ralph-tui` with no arguments enters a strange mode\n- Can't really do anything useful\n- ESC immediately quits\n- Serves no apparent purpose\n\n## Expected Behavior\n- `ralph-tui` (no args) should behave the same as `ralph-tui run`\n- User lands in the main task orchestration view\n- Can immediately see tasks, start work, etc.\n\n## Acceptance Criteria\n- [ ] `ralph-tui` with no arguments launches run mode\n- [ ] Existing `ralph-tui run` command continues to work\n- [ ] Help text updated if needed to reflect default behavior\n- [ ] bun run typecheck passes\n- [ ] bun run build passes","status":"closed","priority":2,"issue_type":"feature","owner":"ben@plgeek.com","created_at":"2026-01-13T08:19:17.768615009Z","created_by":"Subsy","updated_at":"2026-01-13T08:24:40.563837050Z","closed_at":"2026-01-13T08:24:40.563837050Z","close_reason":"Default launch now behaves like 'run' command. Removed unused launchTui() and bare App TUI.","source_repo":".","compaction_level":0,"original_size":0} +{"id":"ralph-tui-yd5","title":"Prompt Image Path Injection","description":"## Description\nAppend image paths to prompts sent to agents.\n\n## Acceptance Criteria\n- [ ] Images appended to prompt in structured format:\n ```\n [user message]\n\n [Attached Images]\n - Image 1: /absolute/path/to/img-abc123.png\n - Image 2: /absolute/path/to/img-def456.png\n ```\n- [ ] Uses absolute paths for reliability\n- [ ] No \"[Attached Images]\" section if no images\n- [ ] Clear attached images after prompt is sent\n- [ ] Works for both PRD chat and Run command prompts\n- [ ] Respects `max_images_per_message` config limit\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Modify prompt construction in `PrdChatApp.tsx` and `RunApp.tsx`\n- Use `getPromptSuffix()` from useImageAttachment hook\n- Ensure paths are properly escaped if they contain spaces\n\n## Dependencies\n- useImageAttachment Hook (ralph-tui-zey)\n- Image Configuration Options (ralph-tui-74q)\n\n## Estimate\n2 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:12.590400Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T16:04:32.555468Z","closed_at":"2026-01-16T16:04:32.555468Z","close_reason":"Implemented prompt image path injection for PRD chat. Images appended in structured format with absolute paths, respecting max_images_per_message config. Clear images after prompt sent.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-yd5","depends_on_id":"ralph-tui-74q","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-yd5","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-yd5","depends_on_id":"ralph-tui-zey","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-z42","title":"Story 3.1: Create useImageAttachment Hook","description":"## Description\nCreate a React hook that manages image attachments for text input components.\n\n## Acceptance Criteria\n- [ ] Hook returns: `{ attachedImages, attachImage, removeImage, clearImages, getPromptSuffix }`\n- [ ] `attachImage(input: string)` - detects and processes image from pasted text\n- [ ] `removeImage(index: number)` - removes an attachment\n- [ ] `clearImages()` - removes all attachments\n- [ ] `getPromptSuffix()` - returns formatted string for appending to prompt\n- [ ] Track images with: `{ id: string, originalPath: string, storedPath: string, displayName: string }`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/hooks/useImageAttachment.ts`\n- Prompt suffix format: `\\n\\nRelevant images you should review before you begin are in:\\n- /absolute/path/to/image1.png\\n- /absolute/path/to/image2.jpg`\n\n## Dependencies\n- Story 1.1: Image File Path Detection (ralph-tui-4ie)\n- Story 1.3: Image Storage System (ralph-tui-sdc)\n\n## Priority\nHigh\n\n## Estimate\n5 points","status":"tombstone","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:18:39.747681Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T10:21:11.141670Z","closed_at":"2026-01-16T10:21:11.141670Z","source_repo":".","deleted_at":"2026-01-16T10:21:11.141670Z","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature","compaction_level":0,"original_size":0,"labels":["image-attachment"]} +{"id":"ralph-tui-zey","title":"useImageAttachment Hook","description":"## Description\nCreate a React hook that manages image attachments for text input components, unifying all detection methods.\n\n## Acceptance Criteria\n- [ ] Hook returns: `{ attachedImages, attachImage, removeImage, clearImages, getPromptSuffix }`\n- [ ] `attachImage(input: string)` - detects image from:\n - File path paste (e.g., `/path/to/image.png`)\n - Clipboard image data (Ctrl+V with image copied)\n - Base64/OSC 52 data\n- [ ] `removeImage(index: number)` - removes an attachment\n- [ ] `clearImages()` - removes all attachments\n- [ ] `getPromptSuffix()` - returns formatted string for appending to prompt\n- [ ] Track images with: `{ id, originalSource, storedPath, displayName }`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Technical Notes\n- Create: `src/tui/hooks/useImageAttachment.ts`\n- Prompt suffix format:\n ```\n [Attached Images]\n - Image 1: /absolute/path/to/img-abc123.png\n - Image 2: /absolute/path/to/img-def456.png\n ```\n\n## Dependencies\n- Image Storage Manager (ralph-tui-35v)\n- Image File Path Detection (ralph-tui-x09)\n- Platform Clipboard Image Reader (ralph-tui-g0o)\n\n## Estimate\n5 points","status":"closed","priority":0,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:21:54.106199Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T15:34:56.222915Z","closed_at":"2026-01-16T15:34:56.222915Z","close_reason":"Implemented useImageAttachment hook that unifies all image detection methods (file paths, clipboard, base64). Hook provides attachedImages state, attachImage(), attachFromClipboard(), removeImage(), clearImages(), getPromptSuffix() and hasImages. Tracks images with {id, originalSource, storedPath, displayName}. TypeCheck and build pass.","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-35v","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-g0o","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-zey","depends_on_id":"ralph-tui-x09","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} +{"id":"ralph-tui-zmu","title":"First-Time Paste Hint","description":"## Description\nShow hint to new users about image paste support.\n\n## Acceptance Criteria\n- [ ] On first text paste of session, show transient hint\n- [ ] Hint: \"Tip: You can paste images too (file paths or Ctrl+V with image copied)\"\n- [ ] Only shown once per session\n- [ ] Dismisses automatically after 3 seconds or on keypress\n- [ ] Can be disabled in config: `show_paste_hints = false`\n- [ ] bun run typecheck passes\n- [ ] bun run build passes\n\n## Dependencies\n- Paste Event Integration in ChatView (ralph-tui-xcq)\n\n## Estimate\n1 point","notes":"Implemented first-time paste hint feature. Created usePasteHint hook that shows info toast on first text paste of session. Hint auto-dismisses after 3 seconds or on any keypress. Added show_paste_hints config option (default: true) to ImageConfig. Integrated into PrdChatApp and added settings toggle. All acceptance criteria met: typecheck and build pass.","status":"closed","priority":2,"issue_type":"feature","owner":"jessejmerhi@gmail.com","created_at":"2026-01-16T10:22:40.933348Z","created_by":"Jesse Merhi","updated_at":"2026-01-16T16:19:31.947257Z","closed_at":"2026-01-16T16:19:31.947264Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["image-paste"],"dependencies":[{"issue_id":"ralph-tui-zmu","depends_on_id":"ralph-tui-d1e","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""},{"issue_id":"ralph-tui-zmu","depends_on_id":"ralph-tui-xcq","type":"blocks","created_at":"2026-02-28T06:44:53Z","created_by":"import","metadata":"{}","thread_id":""}]} diff --git a/src/commands/run.tsx b/src/commands/run.tsx index 19ab9ac6..88be0fe3 100644 --- a/src/commands/run.tsx +++ b/src/commands/run.tsx @@ -1500,6 +1500,10 @@ interface RunAppWrapperProps { onConflictRetry?: () => Promise; /** Callback when user requests to skip a failed merge */ onConflictSkip?: () => void; + /** Refreshed tasks from tracker (parallel mode auto-refresh) */ + parallelRefreshedTasks?: TrackerTask[]; + /** Callback to manually refresh tasks in parallel mode (for 'r' key) */ + onRefreshTasks?: () => void; } /** @@ -1555,6 +1559,8 @@ function RunAppWrapper({ onParallelStart, onConflictRetry, onConflictSkip, + parallelRefreshedTasks, + onRefreshTasks, }: RunAppWrapperProps) { const [showInterruptDialog, setShowInterruptDialog] = useState(false); const [storedConfig, setStoredConfig] = useState(initialStoredConfig); @@ -1782,6 +1788,8 @@ function RunAppWrapper({ onParallelStart={onParallelStart} onConflictRetry={onConflictRetry} onConflictSkip={onConflictSkip} + parallelRefreshedTasks={parallelRefreshedTasks} + onRefreshTasks={onRefreshTasks} /> ); } @@ -2126,6 +2134,7 @@ async function runParallelWithTui( initialTasks: TrackerTask[], directMerge: boolean, storedConfig?: StoredConfig, + tracker?: TrackerPlugin, ): Promise { let currentState = persistedState; let resolveQuitPromise: (() => void) | null = null; @@ -2169,6 +2178,8 @@ async function runParallelWithTui( sessionBranch: null as string | null, /** Original branch before session branch was created */ originalBranch: null as string | null, + /** Refreshed tasks from tracker (set after worker/merge completion) */ + refreshedTasks: undefined as TrackerTask[] | undefined, /** Completion summary lines for in-TUI display */ completionSummaryLines: undefined as string[] | undefined, /** Summary file path for in-TUI display */ @@ -2184,6 +2195,22 @@ async function runParallelWithTui( let executionPromise: Promise | null = null; let shutdownPromise: Promise | null = null; + // Debounced tracker refresh — avoids hammering tracker when multiple workers finish simultaneously + let refreshTimer: ReturnType | null = null; + const scheduleTrackerRefresh = (): void => { + if (!tracker) return; + if (refreshTimer) clearTimeout(refreshTimer); + refreshTimer = setTimeout(async () => { + try { + const freshTasks = await tracker.getTasks({ status: ['open', 'in_progress', 'completed'] }); + parallelState.refreshedTasks = freshTasks; + triggerRerender?.(); + } catch { + // Tracker refresh is best-effort; don't crash the TUI + } + }, 2000); + }; + const resetParallelStateForRestart = (): void => { parallelState.failureMessage = null; parallelState.workers = []; @@ -2351,6 +2378,8 @@ async function runParallelWithTui( event.result.taskCompleted, event.result.commitCount ); + // Refresh task list to pick up any new beads created by the agent + scheduleTrackerRefresh(); break; case 'worker:failed': @@ -2380,6 +2409,8 @@ async function runParallelWithTui( ...parallelState.mergedTaskIds, event.taskId, ]); + // Refresh task list to pick up any new beads created by the agent + scheduleTrackerRefresh(); break; } @@ -2587,6 +2618,10 @@ async function runParallelWithTui( return () => { triggerRerender = null; clearInterval(pollInterval); + if (refreshTimer) { + clearTimeout(refreshTimer); + refreshTimer = null; + } }; }, []); @@ -2684,6 +2719,8 @@ async function runParallelWithTui( clearConflictState(parallelState); triggerRerender?.(); }} + parallelRefreshedTasks={parallelState.refreshedTasks} + onRefreshTasks={() => scheduleTrackerRefresh()} /> ); } @@ -3650,7 +3687,7 @@ export async function executeRunCommand(args: string[]): Promise { if (config.showTui) { // Parallel TUI mode — visualize workers, merges, and conflicts const parallelTuiResult = await runParallelWithTui( - parallelExecutor, persistedState, config, tasks, directMerge, storedConfig + parallelExecutor, persistedState, config, tasks, directMerge, storedConfig, tracker ); persistedState = parallelTuiResult.state; parallelSummaryForGuidance = parallelTuiResult.summary; diff --git a/src/engine/index.test.ts b/src/engine/index.test.ts index 627d9fb5..3afaefad 100644 --- a/src/engine/index.test.ts +++ b/src/engine/index.test.ts @@ -461,4 +461,61 @@ describe('ExecutionEngine', () => { expect(result?.id).toBe('task-1'); }); }); + + describe('refreshTasks', () => { + test('emits tasks:refreshed event with fresh tasks', async () => { + const tasks = [ + createMockTask({ id: 'task-1', status: 'open', title: 'Task 1' }), + createMockTask({ id: 'task-2', status: 'in_progress', title: 'Task 2' }), + ]; + const mockTracker = createMockTracker(tasks); + const engine = new ExecutionEngine(createMockConfig()); + (engine as unknown as { tracker: TrackerPlugin }).tracker = mockTracker; + + const events: Array<{ type: string; tasks?: TrackerTask[] }> = []; + engine.on((event) => { + if (event.type === 'tasks:refreshed') { + events.push({ type: event.type, tasks: event.tasks }); + } + }); + + await engine.refreshTasks(); + + expect(events).toHaveLength(1); + expect(events[0]!.type).toBe('tasks:refreshed'); + expect(events[0]!.tasks).toHaveLength(2); + expect(events[0]!.tasks![0]!.id).toBe('task-1'); + }); + + test('updates totalTasks count with open/in_progress only', async () => { + const tasks = [ + createMockTask({ id: 'task-1', status: 'open' }), + createMockTask({ id: 'task-2', status: 'in_progress' }), + createMockTask({ id: 'task-3', status: 'completed' }), + ]; + const mockTracker = createMockTracker(tasks); + const engine = new ExecutionEngine(createMockConfig()); + (engine as unknown as { tracker: TrackerPlugin }).tracker = mockTracker; + + await engine.refreshTasks(); + + const state = engine.getState(); + expect(state.totalTasks).toBe(2); + }); + + test('is a no-op when no tracker', async () => { + const engine = new ExecutionEngine(createMockConfig()); + // Ensure tracker is null (default state before initialize) + + const events: Array<{ type: string }> = []; + engine.on((event) => events.push({ type: event.type })); + + // Should not throw + await engine.refreshTasks(); + + // Should not emit any events + const refreshEvents = events.filter((e) => e.type === 'tasks:refreshed'); + expect(refreshEvents).toHaveLength(0); + }); + }); }); diff --git a/src/engine/index.ts b/src/engine/index.ts index 74c65448..04c3fb35 100644 --- a/src/engine/index.ts +++ b/src/engine/index.ts @@ -1343,6 +1343,19 @@ export class ExecutionEngine { await this.handleAutoCommit(task, iteration); } + // Refresh task list to pick up any new beads created by the agent. + // Skip in worker mode (forcedTask) since workers don't own the TUI. + if (taskCompleted && !this.forcedTask) { + try { + await this.refreshTasks(); + } catch (error) { + console.warn( + `[tasks] Refresh failed after completion for task ${task.id}:`, + error + ); + } + } + // Determine iteration status let status: IterationStatus; if (agentResult.interrupted) { diff --git a/src/tui/components/RunApp.tsx b/src/tui/components/RunApp.tsx index 2ea4ce11..b78533db 100644 --- a/src/tui/components/RunApp.tsx +++ b/src/tui/components/RunApp.tsx @@ -217,6 +217,10 @@ export interface RunAppProps { onConflictRetry?: () => void; /** Callback when user requests to skip a failed merge (s key in failure state) */ onConflictSkip?: () => void; + /** Refreshed tasks from tracker (parallel mode auto-refresh after worker/merge completion) */ + parallelRefreshedTasks?: TrackerTask[]; + /** Callback to manually refresh tasks in parallel mode (for 'r' key when no engine) */ + onRefreshTasks?: () => void; } /** @@ -546,6 +550,8 @@ export function RunApp({ onParallelStart, onConflictRetry, onConflictSkip, + parallelRefreshedTasks, + onRefreshTasks, }: RunAppProps): ReactNode { const { width, height } = useTerminalDimensions(); const renderer = useRenderer(); @@ -565,6 +571,13 @@ export function RunApp({ } return []; }); + // Update task list when parallel mode provides refreshed tasks from tracker + useEffect(() => { + if (parallelRefreshedTasks) { + setTasks(convertTasksWithDependencyStatus(parallelRefreshedTasks)); + } + }, [parallelRefreshedTasks]); + const [selectedIndex, setSelectedIndex] = useState(0); // Start in 'ready' state if we have onStart callback (waiting for user to start) const [status, setStatus] = useState(onStart ? 'ready' : 'running'); @@ -2344,6 +2357,8 @@ export function RunApp({ instanceManager.sendRemoteCommand('refreshTasks'); } else if (engine) { engine.refreshTasks(); + } else if (onRefreshTasks) { + onRefreshTasks(); } break; @@ -2659,7 +2674,7 @@ export function RunApp({ break; } }, - [displayedTasks, selectedIndex, status, engine, onQuit, viewMode, iterations, iterationSelectedIndex, iterationHistoryLength, onIterationDrillDown, showInterruptDialog, onInterruptConfirm, onInterruptCancel, showHelp, showSettings, showQuitDialog, showKillDialog, showParallelSummaryOverlay, showEpicLoader, showRemoteManagement, onStart, storedConfig, onSaveSettings, onLoadEpics, subagentDetailLevel, onSubagentPanelVisibilityChange, currentIteration, maxIterations, renderer, detailsViewMode, subagentPanelVisible, focusedPane, navigateSubagentTree, instanceTabs, selectedTabIndex, onSelectTab, isViewingRemote, displayStatus, instanceManager, isParallelMode, parallelWorkers, parallelConflicts, showConflictPanel, onParallelKill, onParallelPause, onParallelResume, onParallelStart, parallelDerivedStatus] + [displayedTasks, selectedIndex, status, engine, onQuit, viewMode, iterations, iterationSelectedIndex, iterationHistoryLength, onIterationDrillDown, showInterruptDialog, onInterruptConfirm, onInterruptCancel, showHelp, showSettings, showQuitDialog, showKillDialog, showParallelSummaryOverlay, showEpicLoader, showRemoteManagement, onStart, storedConfig, onSaveSettings, onLoadEpics, subagentDetailLevel, onSubagentPanelVisibilityChange, currentIteration, maxIterations, renderer, detailsViewMode, subagentPanelVisible, focusedPane, navigateSubagentTree, instanceTabs, selectedTabIndex, onSelectTab, isViewingRemote, displayStatus, instanceManager, isParallelMode, parallelWorkers, parallelConflicts, showConflictPanel, onParallelKill, onParallelPause, onParallelResume, onParallelStart, parallelDerivedStatus, onRefreshTasks] ); useKeyboard(handleKeyboard);