We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Martian-Engineering/claude-team'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
issues.jsonl•79.8 kB
{"id":"cic-0ed","title":"Dynamic tab color generation","description":"Implement perceptually distinct color generation for tab colors.\n\n## Algorithm\nUse HSL color space with:\n- Fixed saturation (~60-70%) for vibrant but not garish colors\n- Fixed lightness (~50-60%) for visibility on dark backgrounds\n- Varying hue based on session index\n\n## Color Distribution\n- Use golden ratio or similar for even distribution\n- Avoid clustering similar colors\n- Consider colorblind-friendly palette as option\n\n## Implementation\n```python\ndef generate_tab_color(index: int, total: int = None) -\u003e iterm2.Color:\n # Golden ratio conjugate for even distribution\n golden_ratio = 0.618033988749895\n hue = (index * golden_ratio) % 1.0\n # Convert HSL to RGB\n r, g, b = hsl_to_rgb(hue, 0.65, 0.55)\n return iterm2.Color(int(r*255), int(g*255), int(b*255))\n```\n\n## Persistence\n- Track color assignments in session registry\n- Reuse colors for same session if re-imported","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T09:45:42.881197-08:00","updated_at":"2025-12-12T10:40:08.83691-08:00","closed_at":"2025-12-12T10:40:08.83691-08:00"}
{"id":"cic-100","title":"Implement badge and tab title formatting functions","description":"Create format_session_title(session_name, issue_id, task_desc) returning '[worker-1] cic-3dj: profile module' and format_badge_text(issue_id, task_desc, max_length=25) for abbreviated badge text. Add to new formatting.py module.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T10:37:29.398172-08:00","updated_at":"2025-12-12T10:39:01.422254-08:00","closed_at":"2025-12-12T10:38:47.159212-08:00"}
{"id":"cic-101","title":"Fix spawn_team sequential sleep bottlenecks","description":"Two issues causing spawn_team slowness:\n1. iterm_utils.py:460-471 - sequential 0.5s sleeps per pane\n2. server.py:393-409 - sequential 1s sleeps per session for discover_claude_session\n\nFix: parallelize with asyncio.gather(), use batch sleep, leverage shell readiness detection.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T10:39:59.154889-08:00","updated_at":"2025-12-12T10:42:18.40176-08:00","closed_at":"2025-12-12T10:40:41.551327-08:00"}
{"id":"cic-1be","title":"Add option to spawn sessions with --dangerously-skip-permissions flag","description":"Allow spawn_session tool to optionally start Claude Code with the --dangerously-skip-permissions flag. This enables automated multi-agent workflows where spawned workers don't require manual permission approvals. Should add a parameter like 'skip_permissions: bool = False' to spawn_session.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-11T22:21:18.727097-08:00","updated_at":"2025-12-11T22:24:29.885472-08:00","closed_at":"2025-12-11T22:24:29.885472-08:00"}
{"id":"cic-1vn","title":"Thought experiment: team tracking / team_id concept","description":"Consider tracking which workers were spawned together as a 'team'.\n\n**Context from dogfooding:**\nAfter spawning 4 workers, they become individual sessions with no memory that they were spawned together. If I wanted to 'close the team I just spawned' I had to remember which worker IDs belonged to it.\n\n**Possible approaches:**\n1. spawn_team returns a team_id, sessions store it\n2. list_sessions can filter by team_id\n3. close_team(team_id) closes all sessions in that team\n\n**Open questions:**\n- Is this over-engineering? Coordinator could just track IDs themselves\n- Does this conflict with the 'iconic names' approach? (team = name_set used?)\n- What happens if you spawn multiple teams with same name_set?\n\n**Status:** Thought experiment - not ready to build. Consider independently from main orchestration epic.","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-16T20:38:23.497704-08:00","updated_at":"2025-12-16T20:38:23.497704-08:00"}
{"id":"cic-2q6","title":"Support mixed layouts with shell and Claude sessions","description":"Ensure spawn_team and layout options work with mixed session types. E.g., quad layout with 3 Claude workers + 1 shell running dev server. May need to extend spawn_team API or add spawn_mixed_team.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T09:20:56.307156-08:00","updated_at":"2025-12-16T09:20:56.307156-08:00","dependencies":[{"issue_id":"cic-2q6","depends_on_id":"cic-avg","type":"blocks","created_at":"2025-12-16T09:22:05.095812-08:00","created_by":"phaedrus"}]}
{"id":"cic-2r8","title":"Phase 5: TUI Actions \u0026 Modals","description":"Full TUI interactivity: spawn, kill, assign, message. Create modals/__init__.py, modals/spawn_worker.py (form: project path, skip_permissions), modals/send_message.py (TextArea), modals/assign_task.py (select worker + task). Create screens/__init__.py, screens/session_detail.py (detailed view). Key bindings: s=spawn, k=kill, a=assign, m=message, Enter=details, r=refresh, q=quit.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T17:57:02.778441-08:00","updated_at":"2025-12-20T23:12:58.876275-08:00","closed_at":"2025-12-15T12:49:41.247462-08:00","dependencies":[{"issue_id":"cic-2r8","depends_on_id":"cic-9xc","type":"blocks","created_at":"2025-12-14T17:58:17.310952-08:00","created_by":"phaedrus"}]}
{"id":"cic-2rc","title":"Claude Code MCP configuration","description":"Configure and document how to use the MCP server from within Claude Code.\n\nUpdate ~/.claude/settings.json or project .claude/settings.json with:\n{\n \"mcpServers\": {\n \"claude-team\": {\n \"command\": \"uv\",\n \"args\": [\"run\", \"--directory\", \"/path/to/claude-iterm-controller\", \"python\", \"-m\", \"claude_team_mcp\"]\n }\n }\n}\n\nTest that:\n1. Claude Code can start the MCP server\n2. Tools appear when Claude Code starts\n3. spawn_session creates new Claude Code instances\n4. The manager session can coordinate work across spawned sessions\n\nDocument the workflow:\n- How to start a 'manager' Claude Code session\n- How to spawn worker sessions\n- Patterns for task distribution and result collection","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:59:18.755795-08:00","updated_at":"2025-12-11T22:16:16.817195-08:00","closed_at":"2025-12-11T22:16:16.817195-08:00","dependencies":[{"issue_id":"cic-2rc","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T22:01:33.115111-08:00","created_by":"phaedrus"}]}
{"id":"cic-3dj","title":"Create claude-team iTerm2 profile module","description":"Create a new module for iTerm2 profile management.\n\n## File: src/claude_team_mcp/profile.py\n\n## Profile Settings\n- Font: Source Code Pro 12pt, fallback to Menlo 12pt\n- Window: Maximized but NOT fullscreen (for pane splitting)\n- Light/dark mode: Detect and adapt colors accordingly\n\n## Constants\n- PROFILE_NAME = 'claude-team'\n- FONT_PRIMARY = 'Source Code Pro'\n- FONT_FALLBACK = 'Menlo'\n- FONT_SIZE = 12\n\n## Functions\n- get_or_create_profile(connection) -\u003e profile_name\n- create_session_customizations(session_id, issue_id, task_desc, color) -\u003e LocalWriteOnlyProfile\n- generate_tab_color(index: int) -\u003e iterm2.Color\n- detect_appearance_mode(connection) -\u003e 'light' | 'dark'\n- get_colors_for_mode(mode: str) -\u003e dict\n\n## Tab Title Format\n`[session-name] issue-id: short-description`\nExample: `[worker-1] cic-3dj: profile module`","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T09:45:28.491111-08:00","updated_at":"2025-12-12T10:40:08.836542-08:00","closed_at":"2025-12-12T10:40:08.836542-08:00"}
{"id":"cic-3tv","title":"send_message tool","description":"Implement the send_message MCP tool.\n\nTool signature:\n send_message(\n session_id: str,\n message: str,\n wait_for_response: bool = False,\n timeout: float = 120.0\n ) -\u003e dict\n\nBehavior:\n1. Look up session in registry\n2. Verify session is ready (not busy)\n3. Send message via iTerm2 async_send_text + Enter key (\\x0d)\n4. Update session status to 'busy'\n5. If wait_for_response:\n - Poll JSONL file for new assistant message\n - Return response content when idle_threshold reached\n6. Return {success: bool, response?: str, error?: str}\n\nUse existing primitives: send_prompt, wait_for_response from LinkedSession","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:57:04.18419-08:00","updated_at":"2025-12-11T22:14:40.900666-08:00","closed_at":"2025-12-11T22:14:40.900666-08:00","dependencies":[{"issue_id":"cic-3tv","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T22:00:16.341656-08:00","created_by":"phaedrus"},{"issue_id":"cic-3tv","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T22:00:21.455408-08:00","created_by":"phaedrus"},{"issue_id":"cic-3tv","depends_on_id":"cic-ir7","type":"blocks","created_at":"2025-12-11T22:00:26.572752-08:00","created_by":"phaedrus"}]}
{"id":"cic-566","title":"Windows open fullscreen in new Space despite profile settings","description":"iTerm2 windows created via Python API open in macOS fullscreen mode (new Space) regardless of profile settings.\n\n## Attempted fixes (all failed)\n- Set 'Initial Window Type': 0 (Normal) in dynamic profile\n- Call async_set_fullscreen(False) after creation\n- Call async_set_frame() to resize window\n- Use AppleScript to create window with bounds\n\n## Root cause\nThe iTerm2 Python API's Window.async_create() doesn't respect the profile's window type setting. By the time we can modify the window, it's already in a new Space, and macOS doesn't allow programmatic movement between Spaces.\n\n## Possible solutions to investigate\n- Check if user's Default iTerm2 profile affects API-created windows\n- Look for iTerm2 preference that controls this globally\n- Consider reusing existing windows instead of creating new ones\n- File issue with iTerm2 project","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-12T12:11:28.379031-08:00","updated_at":"2025-12-15T10:01:35.968435-08:00","closed_at":"2025-12-13T09:32:08.85782-08:00"}
{"id":"cic-5ib","title":"Demo: Coordinator Oversight Features","description":"Re-implement the coordinator oversight features from PR #1 for demo purposes. Includes conversation history, JSONL correlation, bd_help tool, and websocket fixes.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-15T09:58:42.402352-08:00","updated_at":"2025-12-19T11:59:45.548116-08:00","closed_at":"2025-12-19T11:59:45.548116-08:00","close_reason":"Closed","dependencies":[{"issue_id":"cic-5ib","depends_on_id":"cic-6l1","type":"blocks","created_at":"2025-12-15T09:59:55.924159-08:00","created_by":"phaedrus"},{"issue_id":"cic-5ib","depends_on_id":"cic-ynr","type":"blocks","created_at":"2025-12-15T10:00:01.077636-08:00","created_by":"phaedrus"},{"issue_id":"cic-5ib","depends_on_id":"cic-ao3","type":"blocks","created_at":"2025-12-15T10:00:06.222446-08:00","created_by":"phaedrus"},{"issue_id":"cic-5ib","depends_on_id":"cic-gvm","type":"blocks","created_at":"2025-12-15T10:00:11.363363-08:00","created_by":"phaedrus"},{"issue_id":"cic-5ib","depends_on_id":"cic-8mm","type":"blocks","created_at":"2025-12-15T10:00:16.495256-08:00","created_by":"phaedrus"},{"issue_id":"cic-5ib","depends_on_id":"cic-2o3","type":"blocks","created_at":"2025-12-15T10:00:21.633946-08:00","created_by":"phaedrus"},{"issue_id":"cic-5ib","depends_on_id":"cic-r24","type":"blocks","created_at":"2025-12-15T10:00:26.777506-08:00","created_by":"phaedrus"}],"comments":[{"id":58,"issue_id":"cic-5ib","author":"rabsef-bicrym","text":"All subtasks complete. Coordinator oversight features are fully implemented: get_conversation_history, bd_help, worker hints, JSONL correlation via Stop hooks, thinking blocks in messages.","created_at":"2025-12-19T19:59:45Z"}]}
{"id":"cic-5xot","title":"Comprehensive Terminal Abstraction Layer","description":"Create a comprehensive terminal abstraction layer that captures full feature parity with both iTerm2 and Zed Terminal CLI backends. The abstraction should be complete and extensible, covering all current and future capabilities.\n\n## Core Features\n- Self-identification (which terminal am I in?)\n- Layout introspection (what panes exist, who are my neighbors?)\n- Splitting panes\n- Spawning new terminals (with or without Claude)\n- Sending text/keys\n- Reading screen content\n- Managing focus\n- Setting titles\n- Layout reorganization\n\n## Advanced Features (iTerm2)\n- Event subscriptions (new session, keystroke, screen update, prompt, location change, custom escape sequences, session terminate, layout change, focus change)\n- Custom control sequences for bidirectional communication\n- Profile customizations (tab colors, badges)\n\n## Advanced Features (Zed)\n- Layout control (TileVertical, TileHorizontal, Consolidate)\n- Layout tree introspection with bounding boxes\n- Move terminal between panes\n- Terminal idle detection\n- in_pane_of targeting for terminal creation","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-22T20:36:31.89944-08:00","updated_at":"2025-12-23T13:51:11.854209-08:00","dependencies":[{"issue_id":"cic-5xot","depends_on_id":"cic-xb8j","type":"blocks","created_at":"2025-12-22T20:37:22.917623-08:00","created_by":"rabsef-bicrym"},{"issue_id":"cic-5xot","depends_on_id":"cic-91ax","type":"blocks","created_at":"2025-12-22T20:37:23.038712-08:00","created_by":"rabsef-bicrym"},{"issue_id":"cic-5xot","depends_on_id":"cic-bt3a","type":"blocks","created_at":"2025-12-22T20:37:23.162209-08:00","created_by":"rabsef-bicrym"}]}
{"id":"cic-61r","title":"spawn_session sends commands before shell is ready - garbled cd/claude commands","description":"When spawning a session, the cd and claude commands are sometimes sent before the shell is fully initialized, resulting in garbled commands like 'escd' and 'sclaude' instead of 'cd' and 'claude'. This causes Claude to start in the wrong directory.\n\nThe start_claude_in_session function likely needs longer delays or shell readiness detection before sending commands.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-11T22:33:10.557911-08:00","updated_at":"2025-12-12T10:26:33.506735-08:00","closed_at":"2025-12-12T10:26:33.506735-08:00"}
{"id":"cic-67n","title":"Add MCP resources for session listing and status","description":"Add MCP resources as an alternative to tool calls for reading session state:\n\n- resource://sessions - List all managed sessions\n- resource://sessions/{session_id} - Get detailed status for a session\n- resource://sessions/{session_id}/screen - Get current screen content\n\nBenefits:\n- Resources can be more efficient for read-only operations\n- Better caching potential\n- Cleaner separation between read (resources) and write (tools) operations\n\nReference: FastMCP resource patterns","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-11T22:36:59.874532-08:00","updated_at":"2025-12-11T22:56:01.618654-08:00","closed_at":"2025-12-11T22:56:01.618654-08:00"}
{"id":"cic-6b2","title":"auto_layout splits into unmanaged windows instead of only claude-team windows","description":"find_available_window() searches all iTerm2 terminal windows, not just windows managed by claude-team. This causes auto_layout to split into random user windows instead of windows we created.\n\n## Root cause\nfind_available_window() in iterm_utils.py iterates over app.terminal_windows without checking if the window is managed by our registry.\n\n## Fix\nShould filter to only windows containing sessions in the claude-team registry, OR track which windows we've created and only reuse those.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T12:19:43.873693-08:00","updated_at":"2025-12-12T12:21:02.224101-08:00","closed_at":"2025-12-12T12:21:02.224101-08:00"}
{"id":"cic-6fw","title":"Worker agents should commit after closing issues","description":"When delegating work to spawned Claude sessions (like quad-1), the agent completed the implementation and closed the beads issue but did not create a git commit.\n\nThe task prompt should explicitly remind agents to:\n1. Mark issue in_progress\n2. Implement changes \n3. Close issue\n4. Create git commit with issue reference\n\nConsider adding this to a standard task template or wrapper.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-11T22:37:40.317585-08:00","updated_at":"2025-12-12T10:38:28.026295-08:00","closed_at":"2025-12-12T10:38:28.026295-08:00"}
{"id":"cic-6l1","title":"Add get_conversation_history tool","description":"Add MCP tool for coordinators to observe worker activity.\n\nFeatures:\n- Reverse pagination from end of conversation (most recent first)\n- Page size of 5 messages\n- Captures text content, tool_use names, and thinking blocks\n- Returns structured message data for coordinator analysis\n\nAPI:\nget_conversation_history(session_id: str, pages: int = 1, offset: int = 0)\n\nImplementation in server.py, uses session_state.py for JSONL parsing.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-15T09:59:10.075922-08:00","updated_at":"2025-12-19T11:54:03.956565-08:00","closed_at":"2025-12-19T11:54:03.956565-08:00","close_reason":"Closed","dependencies":[{"issue_id":"cic-6l1","depends_on_id":"cic-2o3","type":"blocks","created_at":"2025-12-15T10:00:50.68446-08:00","created_by":"phaedrus"},{"issue_id":"cic-6l1","depends_on_id":"cic-ynr","type":"blocks","created_at":"2025-12-15T10:00:55.830318-08:00","created_by":"phaedrus"}],"comments":[{"id":56,"issue_id":"cic-6l1","author":"rabsef-bicrym","text":"Tool exists and works. Dependencies cic-2o3 (thinking blocks) and cic-ynr (correlation) are resolved. get_conversation_history returns paginated messages with text, tool_use, and thinking blocks.","created_at":"2025-12-19T19:53:57Z"}]}
{"id":"cic-6wy","title":"Fix Enter key not sent for pasted text (long messages)","description":"The cic-k0m fix works for short messages but Enter is still not sent after pasting long text. The issue only occurs when Claude Code shows '[Pasted text #1 +XX lines]' indicator. Need to investigate why the Enter key is not being sent after paste mode completes.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T11:33:41.723746-08:00","updated_at":"2025-12-12T11:39:37.84656-08:00","closed_at":"2025-12-12T11:39:37.84656-08:00"}
{"id":"cic-76s","title":"Add spawn_team tool for multi-pane layouts","description":"Add a spawn_team tool that creates a multi-pane window with Claude sessions in one call, using the existing create_multi_claude_layout primitive.\n\nAPI example:\nspawn_team(\n projects={\n 'top_left': '/path/to/frontend',\n 'top_right': '/path/to/backend',\n 'bottom_left': '/path/to/api',\n 'bottom_right': '/path/to/tests'\n },\n layout='quad' # or 'vertical', 'horizontal', 'triple_vertical'\n)\n\nReturns dict with all session IDs mapped to pane names.\n\nThis complements the split_from_session parameter by providing a simpler one-call approach for common multi-agent setups.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-11T22:27:24.172635-08:00","updated_at":"2025-12-11T22:35:17.701729-08:00","closed_at":"2025-12-11T22:35:17.701729-08:00"}
{"id":"cic-7b1","title":"Smart layout management for spawn_session","description":"When spawning new sessions, intelligently reuse existing windows with available pane slots.\n\n## Current Behavior\n- spawn_session always creates a new window (unless split_from_session specified)\n- When workers finish and panes close, remaining panes don't get filled\n- New workers go to new windows, fragmenting the layout\n\n## Desired Behavior\n- Track pane count per window (max 4 ideal)\n- When spawning a new session:\n 1. Find windows with \u003c 4 Claude panes\n 2. Split an existing pane in that window\n 3. Only create new window if all windows have 4+ panes\n- Layout preference: quad (2x2) is ideal\n\n## Implementation Ideas\n- Track window → panes mapping in registry\n- Add `find_available_window()` that returns window with room\n- Modify spawn_session to auto-split when possible\n- Add `layout_preference` setting (quad, vertical, horizontal)\n\n## API Changes\nMaybe add `auto_layout: bool = True` to spawn_session:\n- True: automatically find best window/pane to split\n- False: current behavior (new window)\n\n## Example\n```python\n# Worker-1 finishes, quad window now has 3 panes\n# New spawn_session call:\nspawn_session(project_path=..., auto_layout=True)\n# -\u003e Finds the 3-pane window, splits to fill the 4th slot\n```","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-12T10:40:14.169798-08:00","updated_at":"2025-12-15T07:56:39.435616-08:00","closed_at":"2025-12-12T12:12:04.16957-08:00"}
{"id":"cic-7cd","title":"Task completion detection not checking screen for TASK_COMPLETE","description":"get_task_status returns 'completed' via beads_issue detection (0.6 confidence) even when TASK_COMPLETE is visible on screen.\n\n## Expected\nShould detect TASK_COMPLETE marker on screen with high confidence (0.9+)\n\n## Actual\nDetects via beads closed issues count (38 closed issues) with 0.6 confidence\n\n## Root Cause\nThe screen-based detection for convention markers (TASK_COMPLETE, TASK_FAILED) may not be running or is being outprioritized by beads detection.\n\n## Fix\nEnsure screen content is checked for convention markers and prioritize that signal over beads issue counts.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T11:14:46.782084-08:00","updated_at":"2025-12-12T11:24:45.391848-08:00","closed_at":"2025-12-12T11:24:45.391848-08:00"}
{"id":"cic-7on","title":"Enhance read_worker_logs output formatting","description":"Improve the message format returned by read_worker_logs for better coordinator usability.\n\n## Key Improvements\n\n### Add New Fields\n- `index`: Message number in conversation (1-based) for easy reference\n- `time_ago`: Relative timestamp (e.g., '2 min ago') for quick scanning\n- `content_length`: Character count to know message size before reading\n- `content_preview`: First 200 chars for long messages\n- `tools_summary`: List of readable tool summaries (e.g., 'Read → src/foo.py')\n- `tool_count`: Quick count of tools used\n- `has_thinking`: Boolean flag instead of full thinking text by default\n\n### Remove/Simplify\n- Remove `uuid` from default output (noise for coordinators)\n- Simplify `tool_uses` - summarize large inputs instead of full content\n- Replace full `thinking` blocks with boolean flag by default\n\n### Optional Enhancement\n- Consider adding `format` parameter: 'full' (current), 'compact' (previews only), 'summary' (one-line per message)\n\n## Files to Modify\n- src/claude_team_mcp/session_state.py - Message.to_dict() method\n- src/claude_team_mcp/server.py - read_worker_logs tool\n\n## References\nBased on JSONL Conversation Formatting Review research.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-20T22:17:51.72494-08:00","updated_at":"2025-12-20T22:17:51.72494-08:00"}
{"id":"cic-7pt","title":"Add shell session lifecycle management","description":"Handle shell session lifecycle: detect if process is still running, graceful shutdown (SIGTERM then SIGKILL), restart capability. Reuse close_session or add close_shell. Add is_process_running check.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T09:21:01.708275-08:00","updated_at":"2025-12-16T09:21:01.708275-08:00","dependencies":[{"issue_id":"cic-7pt","depends_on_id":"cic-v7e","type":"blocks","created_at":"2025-12-16T09:22:10.245835-08:00","created_by":"phaedrus"}]}
{"id":"cic-7rb","title":"spawn_team badges should show issue/task info, not pane positions","description":"Currently spawn_team sets badge text to pane position (top-left, etc.) which isn't useful.\n\nThe API needs to accept richer per-pane data:\n- projects dict values should accept either a string (path) or a dict with path, issue_id, task_description\n- Badge should use format_badge_text() with issue_id/task_description like spawn_session does\n\nExample new API:\nprojects={\n 'top_left': {'path': '/path/to/project', 'issue_id': 'cic-123', 'task_description': 'Fix auth bug'},\n 'top_right': '/path/to/other' # backwards compatible\n}","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T13:16:08.207931-08:00","updated_at":"2025-12-12T13:17:27.622025-08:00","closed_at":"2025-12-12T13:17:27.622025-08:00"}
{"id":"cic-7t8","title":"spawn_team is slow due to sequential sleeps","description":"spawn_team takes several seconds between each session starting because of sequential sleeps:\n\n## Root Cause\nTwo sequential loops with per-session sleeps:\n\n1. **iterm_utils.py:460-471** - create_multi_claude_layout:\n ```python\n for pane_name, project_path in projects.items():\n await start_claude_in_session(...)\n await asyncio.sleep(0.5) # 0.5s per pane\n ```\n\n2. **server.py:393-409** - spawn_team registration:\n ```python\n for pane_name, iterm_session in pane_sessions.items():\n managed = registry.add(...)\n await asyncio.sleep(1) # 1s per session\n managed.discover_claude_session()\n ```\n\nFor a quad layout (4 panes): 4×0.5s + 4×1s = **6 seconds** of just sleep!\n\n## Proposed Fix\n1. **Parallelize registration**: Use asyncio.gather() for concurrent discover_claude_session calls\n2. **Batch sleep**: Single sleep after all starts instead of per-pane\n3. **Reduce sleeps**: The 1s sleep may be excessive; could use shell readiness check instead\n\n## Expected Result\nspawn_team should complete in ~2-3 seconds instead of ~8 seconds","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T10:37:58.477365-08:00","updated_at":"2025-12-12T10:42:18.403896-08:00","closed_at":"2025-12-12T10:42:18.403896-08:00"}
{"id":"cic-8g6","title":"Remove beads coupling from MCP server","description":"Remove detect_beads_completion() and related beads-specific code from task_completion.py. Rely on convention markers (TASK_COMPLETE) for completion detection instead. Keep the worktree BEADS_DIR detection as it's helpful and non-intrusive. This decouples the MCP server from beads, making it workflow-agnostic.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-15T08:56:06.855126-08:00","updated_at":"2025-12-20T23:12:58.876947-08:00","closed_at":"2025-12-15T12:45:00.174287-08:00"}
{"id":"cic-96n","title":"auto_layout creates 1-3 stacked layout instead of 2x2 quad grid","description":"When auto_layout fills a window to 4 panes, it creates a 1-3 stacked layout (one pane on left, three stacked on right) instead of a proper 2x2 quad grid.\n\n## Root cause\nThe code uses tab.current_session as the split target, which is typically the last created pane. This causes all horizontal splits to happen on the same side.\n\n## Expected behavior\n- 1→2: vertical split → left | right\n- 2→3: horizontal split of LEFT pane → top-left, bottom-left | right \n- 3→4: horizontal split of RIGHT pane → 2x2 quad\n\n## Fix needed\nTrack pane positions and choose the correct pane to split for each step to achieve a balanced quad layout.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T12:27:12.469648-08:00","updated_at":"2025-12-12T12:34:43.989844-08:00","closed_at":"2025-12-12T12:34:43.989844-08:00"}
{"id":"cic-99e","title":"send_message wait_for_response times out despite response being available","description":"During testing, send_message with wait_for_response=true timed out after 30 seconds, but get_session_status showed the response was already visible in screen_preview and get_response successfully retrieved it. The response detection logic may have timing issues or isn't properly detecting when Claude finishes responding.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-11T22:21:13.609442-08:00","updated_at":"2025-12-11T22:23:17.212626-08:00","closed_at":"2025-12-11T22:23:17.212626-08:00"}
{"id":"cic-9a3","title":"Split pane targets wrong window - splits active pane instead of spawned window","description":"When using split_vertical or split_horizontal layout, the split happens in the currently active iTerm pane (the user's session) rather than in the window/pane created by a previous spawn_session call. This means all split sessions end up in the wrong window and share the same claude_session_id as the user's active session.\n\nExpected: Splits should target the window/tab created by the previous spawn_session\nActual: Splits target whatever pane is currently active in iTerm\n\nThis likely requires tracking the iTerm window/tab ID from spawn_session and explicitly targeting it for subsequent splits.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-11T22:24:21.485265-08:00","updated_at":"2025-12-11T22:25:46.525894-08:00","closed_at":"2025-12-11T22:25:46.525894-08:00"}
{"id":"cic-9wp","title":"iTerm2 profile customization for sessions","description":"Add support for iTerm2 profile customization when spawning sessions.\n\n## Capabilities (via iTerm2 Python API)\n- `profile` param: Use named profiles from iTerm2 preferences\n- `profile_customizations` param: Programmatic customization via LocalWriteOnlyProfile\n - set_tab_color + set_use_tab_color: Color-code tabs\n - set_badge_text: Overlay text (session ID, task, issue)\n - set_background_color: Different backgrounds per session type\n - set_custom_window_title: Custom titles\n - set_subtitle: Additional context\n\n## Use Cases\n- Blue tabs for workers, green for reviewers, red for critical tasks\n- Badge showing beads issue ID (e.g., 'cic-123')\n- Background tint to distinguish session types at a glance\n- Window titles showing project + task\n\n## API Changes\nspawn_session(..., profile: str = None, tab_color: str = None, badge_text: str = None)\nspawn_team(..., profile: str = None, color_scheme: 'rainbow'|'monochrome'|dict = None)\n\n## Predefined Schemes\n- 'rainbow': Each pane gets a distinct color\n- 'role-based': Colors based on session role (worker/reviewer/tester)\n- Custom dict mapping pane names to colors","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-12T08:02:08.806597-08:00","updated_at":"2025-12-12T09:47:38.293369-08:00","closed_at":"2025-12-12T09:47:38.293369-08:00"}
{"id":"cic-9xc","title":"Phase 4: TUI Core Structure","description":"Basic Textual TUI app with session monitoring. Create src/claude_team_mcp/tui/ package: __init__.py, app.py (main App class), client.py (HTTP client for MCP server), beads.py (wrapper for bd CLI calls), widgets/__init__.py, widgets/sessions_table.py (DataTable for workers), widgets/beads_table.py (DataTable for tasks), widgets/logs_view.py (activity log), styles/app.tcss (CSS). Implement polling: 2-second refresh for sessions (via HTTP), 10-second for beads (via bd CLI). Use reactive attributes for auto-updating UI.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T17:56:52.51836-08:00","updated_at":"2025-12-20T23:12:58.877293-08:00","closed_at":"2025-12-15T12:48:50.677488-08:00","dependencies":[{"issue_id":"cic-9xc","depends_on_id":"cic-msz","type":"blocks","created_at":"2025-12-14T17:58:12.185749-08:00","created_by":"phaedrus"}]}
{"id":"cic-a60","title":"Task completion detection","description":"Detect when a delegated task is truly complete, not just when a response is received.\n\n## Problem\nCurrently we can only detect:\n- Message was sent\n- Response was received\n- Session is processing or idle\n\nBut we can't tell if the task was actually completed successfully.\n\n## Detection Strategies\n1. **Convention-based**: Require workers to output specific markers like 'TASK_COMPLETE' or 'TASK_FAILED'\n2. **Git-based**: Monitor for commits on the worker's branch\n3. **Beads-based**: Monitor for issue status changes (closed/in_progress)\n4. **Screen parsing**: Look for patterns like 'Done\\!' or error messages\n5. **JSONL analysis**: Analyze conversation for completion signals\n6. **Explicit acknowledgment**: Worker calls a completion endpoint/tool\n\n## API Design\n- get_task_status(session_id) -\u003e {status: pending|in_progress|completed|failed, details: ...}\n- wait_for_completion(session_id, timeout) -\u003e completion result\n- Webhook/callback on completion\n\n## Integration Points\n- Beads issue tracking\n- Git commit detection\n- AgentMail message patterns","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-12T08:01:52.851101-08:00","updated_at":"2025-12-12T10:30:45.483131-08:00","closed_at":"2025-12-12T10:30:45.483131-08:00"}
{"id":"cic-arq","title":"Fix profile window type: use Normal with calculated screen-filling dimensions","description":"Current profile uses Maximized (type 3) which opens in a new Space unexpectedly. Fix: use Normal (type 0) with dynamically calculated columns/rows based on screen resolution to create a near-fullscreen window that stays in the current Space.\n\n## Implementation\n1. Add calculate_screen_dimensions() to profile.py using system_profiler\n2. Change Initial Window Type from 3 to 0 in _build_dynamic_profile_dict()\n3. Add Columns/Rows to the profile based on calculated dimensions\n4. Update the dynamic profile file after code changes\n5. Apply dimensions at spawn_session time via profile_customizations for runtime flexibility\n\n## Formula\n- Get screen resolution via system_profiler SPDisplaysDataType\n- Detect Retina scale factor (2x if Retina)\n- Calculate logical dimensions\n- Subtract margins for window chrome (~20px width, ~100px height)\n- Divide by cell size (Menlo 12pt: ~7.2px wide, ~14px tall)\n\n## Test\n- Spawn a session and verify it opens as a normal window filling the screen\n- Verify it stays in the current Space (not a new Space)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T11:54:45.586448-08:00","updated_at":"2025-12-12T12:00:25.007445-08:00","closed_at":"2025-12-12T12:00:25.007445-08:00"}
{"id":"cic-avg","title":"Add spawn_shell MCP tool","description":"Create new MCP tool spawn_shell() similar to spawn_session but without starting Claude. Parameters: project_path, session_name, command (optional - command to run), layout. Should create iTerm window/pane, cd to project, optionally run initial command.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T09:20:34.630863-08:00","updated_at":"2025-12-16T09:20:34.630863-08:00","dependencies":[{"issue_id":"cic-avg","depends_on_id":"cic-v7e","type":"blocks","created_at":"2025-12-16T09:21:49.653578-08:00","created_by":"phaedrus"}]}
{"id":"cic-bcf","title":"Thought experiment: wait_for_completion / wait_for_team","description":"Evaluate whether the existing wait_for_completion tool should be kept, modified, or removed.\n\n**Current state:**\n- wait_for_completion exists with 5 min default timeout, polls every 2 seconds\n- Uses multiple detection methods (markers, git, beads, screen, idle time)\n- Unclear if MCP tool timeouts from Claude Code side would even allow 5 min waits\n\n**Concerns:**\n- MCP tool timeout behavior is undocumented\n- Blocking waits don't let coordinator do other work\n- If one worker is slow/blocked, coordinator is stuck\n\n**Alternative pattern (used in dogfooding):**\n- Non-blocking send_message calls\n- Coordinator polls list_sessions / get_conversation_history\n- Coordinator decides when workers are done\n- Each tool call returns quickly, no timeout issues\n\n**Options:**\n1. Keep wait_for_completion as-is (useful for simple single-worker cases?)\n2. Remove it for clarity - polling pattern is safer\n3. Replace with non-blocking check_completion_status\n4. Add wait_for_team that returns when ANY worker finishes (not all)\n\n**Status:** Thought experiment - consider removing existing implementation for clarity.","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-16T20:42:36.631081-08:00","updated_at":"2025-12-16T20:42:36.631081-08:00"}
{"id":"cic-bt3a","title":"Migrate existing code to terminal abstraction","description":"Update existing code in claude_team_mcp to use the new terminal abstraction layer.\n\n## Files to Update\n- server.py - Use TerminalBackend instead of direct iTerm2 connection\n- registry.py - Update ManagedSession to use TerminalHandle\n- tools/*.py - Update all tools to use abstraction\n\n## Migration Strategy\n1. Create TerminalBackend instance in app_lifespan\n2. Update AppContext to hold backend instead of raw connection\n3. Update ensure_connection pattern to work with backend\n4. Migrate iterm_utils.py calls to backend methods\n5. Update ManagedSession to store TerminalHandle instead of iterm_session\n\n## Backwards Compatibility\n- Keep iterm_utils.py as internal implementation detail for now\n- Eventually deprecate direct iterm_utils usage","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T20:37:13.825284-08:00","updated_at":"2025-12-22T20:37:13.825284-08:00","dependencies":[{"issue_id":"cic-bt3a","depends_on_id":"cic-xb8j","type":"blocks","created_at":"2025-12-22T20:37:23.286667-08:00","created_by":"rabsef-bicrym"},{"issue_id":"cic-bt3a","depends_on_id":"cic-91ax","type":"blocks","created_at":"2025-12-22T20:37:23.412205-08:00","created_by":"rabsef-bicrym"}]}
{"id":"cic-clx","title":"Integration testing","description":"Create integration tests for the MCP server.\n\nTests to write:\n1. Server startup/shutdown\n2. spawn_session creates working Claude session\n3. send_message delivers prompt and gets response\n4. list_sessions returns accurate status\n5. close_session properly cleans up\n6. Multiple concurrent sessions work correctly\n7. Session survives manager restart (registry persistence?)\n\nCreate: tests/test_integration.py\nUse pytest-asyncio for async tests.\n\nNote: These tests will actually spawn iTerm2 windows - they're integration tests, not unit tests. May want a --slow flag to skip in CI.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-11T21:57:37.020767-08:00","updated_at":"2025-12-12T10:06:20.448936-08:00","closed_at":"2025-12-12T10:06:20.448936-08:00","dependencies":[{"issue_id":"cic-clx","depends_on_id":"cic-ir7","type":"blocks","created_at":"2025-12-11T22:01:02.452509-08:00","created_by":"phaedrus"},{"issue_id":"cic-clx","depends_on_id":"cic-v98","type":"blocks","created_at":"2025-12-11T22:01:07.552437-08:00","created_by":"phaedrus"},{"issue_id":"cic-clx","depends_on_id":"cic-3tv","type":"blocks","created_at":"2025-12-11T22:01:12.657375-08:00","created_by":"phaedrus"},{"issue_id":"cic-clx","depends_on_id":"cic-f0j","type":"blocks","created_at":"2025-12-11T22:01:17.764995-08:00","created_by":"phaedrus"},{"issue_id":"cic-clx","depends_on_id":"cic-o7m","type":"blocks","created_at":"2025-12-11T22:01:22.873545-08:00","created_by":"phaedrus"},{"issue_id":"cic-clx","depends_on_id":"cic-kiu","type":"blocks","created_at":"2025-12-11T22:01:27.97972-08:00","created_by":"phaedrus"}]}
{"id":"cic-e5t","title":"Import existing Claude Code sessions into MCP registry","description":"Add ability to discover existing Claude Code sessions running in iTerm2 and import them into the MCP server's session registry for orchestration.\n\nUse cases:\n- User has Claude sessions already running before starting MCP server\n- Reconnect to sessions after MCP server restart\n- Adopt orphaned sessions\n\nImplementation ideas:\n- Scan iTerm2 windows/panes for Claude Code indicators\n- Match to JSONL session files in ~/.claude/projects/\n- Create managed session entries pointing to existing iTerm sessions\n- Tool: import_session(iterm_session_id?) or discover_sessions()","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-11T22:35:58.234202-08:00","updated_at":"2025-12-11T22:45:24.642475-08:00","closed_at":"2025-12-11T22:42:02.06357-08:00"}
{"id":"cic-eir","title":"Improve error messages with actionable recovery instructions","description":"When MCP tools fail, provide actionable instructions for recovery.\n\n## Current Behavior\nErrors like `Session not found: worker-6` provide no guidance on what to do next.\n\n## Desired Behavior\nError messages should include recovery instructions:\n\n### Session not found\n```json\n{\n \"error\": \"Session not found: worker-6\",\n \"hint\": \"Session may have been lost during restart. Run discover_sessions to find orphaned Claude sessions, then import_session to re-register them.\"\n}\n```\n\n### Project path does not exist\n```json\n{\n \"error\": \"Project path does not exist: /path/to/worktree\",\n \"hint\": \"The worktree may have been removed. Check 'git worktree list' or use a different project_path.\"\n}\n```\n\n### iTerm connection lost\n```json\n{\n \"error\": \"Failed to connect to iTerm2\",\n \"hint\": \"Ensure iTerm2 is running and Python API is enabled in Preferences \u003e General \u003e Magic.\"\n}\n```\n\n## Implementation\nAdd a `hint` field to error responses in server.py for common failure modes:\n- Session not found → suggest discover/import\n- Path not found → suggest checking worktrees\n- Connection errors → suggest iTerm2 setup\n- Registry empty → suggest discover_sessions if context implies workers exist","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-12T10:54:25.682985-08:00","updated_at":"2025-12-15T07:56:39.436079-08:00","closed_at":"2025-12-12T11:39:37.846342-08:00"}
{"id":"cic-el6","title":"Project setup with uv","description":"Migrate from pip/requirements.txt to uv for dependency management.\n\nTasks:\n- Remove old venv/ directory and requirements.txt\n- Create pyproject.toml with project metadata\n- Add dependencies: mcp (official Python SDK), iterm2\u003e=2.7\n- Set up uv.lock for reproducible builds\n- Create src/claude_team_mcp/ package structure\n- Add dev dependencies for testing\n\nThe package should be installable via 'uv pip install -e .' for development.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-11T21:55:37.86394-08:00","updated_at":"2025-12-11T22:05:29.36596-08:00","closed_at":"2025-12-11T22:05:29.36596-08:00"}
{"id":"cic-f0j","title":"get_response tool","description":"Implement the get_response MCP tool for async response retrieval.\n\nTool signature:\n get_response(\n session_id: str,\n wait: bool = True,\n timeout: float = 60.0,\n since_message_id: Optional[str] = None\n ) -\u003e dict\n\nBehavior:\n1. Look up session in registry\n2. Parse JSONL file for conversation state\n3. If wait=True and session is busy:\n - Poll until idle_threshold reached or timeout\n4. Return {\n status: str (idle/busy),\n last_response: Optional[str],\n message_id: str,\n tool_uses: list[str], # names of tools Claude used\n is_complete: bool\n }\n\nThis allows the manager to check on sessions without blocking.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:57:10.914024-08:00","updated_at":"2025-12-11T22:14:45.99241-08:00","closed_at":"2025-12-11T22:14:45.99241-08:00","dependencies":[{"issue_id":"cic-f0j","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T22:00:31.71265-08:00","created_by":"phaedrus"},{"issue_id":"cic-f0j","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T22:00:36.848838-08:00","created_by":"phaedrus"}]}
{"id":"cic-ga4","title":"Badge text formatting for sessions","description":"Implement badge and tab title formatting for sessions.\n\n## Tab Title Format\n`[session-name] issue-id: short-description`\n\nExamples:\n- `[worker-1] cic-3dj: profile module`\n- `[worker-2] cic-0ed: tab colors`\n- `[quad-top-left] cic-abc: api work`\n- `[worker-1]` (fallback when no issue)\n\n## Badge Text Format\nSame as tab title, or abbreviated if needed:\n- `cic-3dj: profile` (if space limited)\n\n## API\n```python\ndef format_session_title(\n session_name: str,\n issue_id: str = None,\n task_description: str = None,\n) -\u003e str:\n # Returns: '[worker-1] cic-3dj: profile module'\n \ndef format_badge_text(\n issue_id: str = None,\n task_description: str = None,\n max_length: int = 25\n) -\u003e str:\n # Abbreviated version for badge overlay\n```\n\n## Integration\n- spawn_session accepts optional issue_id and task_description params\n- Both tab title and badge use consistent format","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T09:45:56.910913-08:00","updated_at":"2025-12-12T10:40:08.837175-08:00","closed_at":"2025-12-12T10:40:08.837175-08:00"}
{"id":"cic-gvm","title":"Add worker hints to send_message/broadcast_message","description":"Append helpful hints to messages sent to workers.\n\nImplementation:\n- Define WORKER_MESSAGE_HINT constant with guidance about bd_help tool\n- Append hint to message content in send_message()\n- Append hint to message content in broadcast_message()\n\nHint content should tell workers:\n- They can call bd_help for beads guidance\n- Remind them to track progress in beads issues","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-15T09:59:26.661694-08:00","updated_at":"2025-12-19T11:54:04.06354-08:00","closed_at":"2025-12-19T11:54:04.06354-08:00","close_reason":"Closed","dependencies":[{"issue_id":"cic-gvm","depends_on_id":"cic-ao3","type":"blocks","created_at":"2025-12-15T10:00:37.856169-08:00","created_by":"phaedrus"}],"comments":[{"id":57,"issue_id":"cic-gvm","author":"rabsef-bicrym","text":"Implemented. WORKER_MESSAGE_HINT constant is appended to all messages in send_message() and broadcast_message(). Points workers to bd_help tool.","created_at":"2025-12-19T19:53:57Z"}]}
{"id":"cic-h75","title":"Claude Team TUI Companion App","description":"Add a Textual-based TUI companion app to claude-team for managing workers, viewing session state, and integrating with beads task tracking. Key features: dual transport (stdio+HTTP), real-time session monitoring, worker spawn/kill, beads task assignment, advisory messages to lead session.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-14T17:56:09.65449-08:00","updated_at":"2025-12-19T17:51:29.137799-08:00","dependencies":[{"issue_id":"cic-h75","depends_on_id":"cic-hzx","type":"blocks","created_at":"2025-12-14T17:57:24.952828-08:00","created_by":"phaedrus"},{"issue_id":"cic-h75","depends_on_id":"cic-msz","type":"blocks","created_at":"2025-12-14T17:57:30.072336-08:00","created_by":"phaedrus"},{"issue_id":"cic-h75","depends_on_id":"cic-0fq","type":"blocks","created_at":"2025-12-14T17:57:35.19651-08:00","created_by":"phaedrus"},{"issue_id":"cic-h75","depends_on_id":"cic-9xc","type":"blocks","created_at":"2025-12-14T17:57:40.318257-08:00","created_by":"phaedrus"},{"issue_id":"cic-h75","depends_on_id":"cic-2r8","type":"blocks","created_at":"2025-12-14T17:57:45.447801-08:00","created_by":"phaedrus"},{"issue_id":"cic-h75","depends_on_id":"cic-jh2","type":"blocks","created_at":"2025-12-14T17:57:50.568965-08:00","created_by":"phaedrus"},{"issue_id":"cic-h75","depends_on_id":"cic-vju","type":"blocks","created_at":"2025-12-14T18:15:30.74394-08:00","created_by":"phaedrus"}]}
{"id":"cic-hr4","title":"Add get_shell_output MCP tool","description":"Create MCP tool to read terminal output from shell-only sessions. Use iTerm2 screen content API (already have this in get_session_status). Return recent lines of output. May want options for line count, follow mode.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T09:20:50.891408-08:00","updated_at":"2025-12-16T09:20:50.891408-08:00","dependencies":[{"issue_id":"cic-hr4","depends_on_id":"cic-avg","type":"blocks","created_at":"2025-12-16T09:21:59.958568-08:00","created_by":"phaedrus"}]}
{"id":"cic-hzk","title":"Claude Desktop configuration","description":"Document and test Claude Desktop integration.\n\nCreate: README.md section on Claude Desktop setup\nCreate: claude_desktop_config.json example\n\nConfiguration example:\n{\n \"mcpServers\": {\n \"claude-team\": {\n \"command\": \"uv\",\n \"args\": [\"run\", \"--directory\", \"/path/to/claude-iterm-controller\", \"python\", \"-m\", \"claude_team_mcp\"],\n \"env\": {}\n }\n }\n}\n\nTest that:\n1. Claude Desktop can start the server\n2. Tools appear in Claude's tool list\n3. Spawning sessions works from Claude Desktop","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-11T21:57:44.009288-08:00","updated_at":"2025-12-11T21:59:13.59696-08:00","closed_at":"2025-12-11T21:59:13.59696-08:00"}
{"id":"cic-i22","title":"Add script to install slash commands to user level","description":"Create a script that copies slash commands from .claude/commands/ to ~/.claude/commands/ so they're available globally.\n\nCurrently the repo has:\n- .claude/commands/spawn-workers.md\n\nThe script should:\n- Copy commands from repo's .claude/commands/ to ~/.claude/commands/\n- Handle existing files (prompt or overwrite)\n- Be runnable via uv run or as standalone script","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T12:52:12.359612-08:00","updated_at":"2025-12-12T12:59:21.357998-08:00","closed_at":"2025-12-12T12:59:21.357998-08:00"}
{"id":"cic-iex","title":"iTerm2 Profile System for claude-team","description":"Create a dedicated iTerm2 profile system for claude-team sessions to provide consistent, visually-organized terminal windows.\n\n## Goals\n- Avoid hijacking user's default profile (which may be full-screen)\n- Provide visual distinction between sessions via dynamic tab colors\n- Show context via badge text (issue ID + task description)\n- Use consistent, legible font sizing\n- Create professional, organized multi-agent workspace\n\n## Key Features\n1. Built-in 'claude-team' profile with controlled window sizing\n2. Dynamic tab colors - each window gets unique, perceptually distinct color\n3. Badge text showing: beads issue + short task description\n4. Source Code Pro font with fallback (Menlo or Monaco)\n5. Reasonable window size (not full-screen)\n\n## Non-Goals\n- Custom backgrounds (keep simple)\n- Complex theming system\n- User-configurable everything (sensible defaults)\n\n## Open Questions\n- Window dimensions and spawn position\n- Light/dark mode handling\n- Profile persistence strategy\n- First-run profile creation","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-12T09:45:13.371557-08:00","updated_at":"2025-12-15T10:01:35.969052-08:00","closed_at":"2025-12-13T09:32:08.856117-08:00","dependencies":[{"issue_id":"cic-iex","depends_on_id":"cic-3dj","type":"blocks","created_at":"2025-12-12T09:46:37.352363-08:00","created_by":"phaedrus"},{"issue_id":"cic-iex","depends_on_id":"cic-0ed","type":"blocks","created_at":"2025-12-12T09:46:42.524832-08:00","created_by":"phaedrus"},{"issue_id":"cic-iex","depends_on_id":"cic-ga4","type":"blocks","created_at":"2025-12-12T09:46:47.685037-08:00","created_by":"phaedrus"},{"issue_id":"cic-iex","depends_on_id":"cic-ntq","type":"blocks","created_at":"2025-12-12T09:46:52.856903-08:00","created_by":"phaedrus"},{"issue_id":"cic-iex","depends_on_id":"cic-ms7","type":"blocks","created_at":"2025-12-12T09:46:58.008276-08:00","created_by":"phaedrus"}]}
{"id":"cic-ir7","title":"spawn_session tool","description":"Implement the spawn_session MCP tool.\n\nTool signature:\n spawn_session(\n project_path: str,\n session_name: Optional[str] = None,\n layout: str = 'new_window', # or 'split_vertical', 'split_horizontal'\n resume_session: Optional[str] = None\n ) -\u003e dict\n\nBehavior:\n1. Validate project_path exists\n2. Create iTerm2 window/pane based on layout parameter\n3. Start Claude Code in the new session\n4. Wait for Claude to initialize (with timeout)\n5. Discover Claude session ID from JSONL\n6. Register in SessionRegistry\n7. Return {session_id, project_path, status, claude_session_id}\n\nUse existing primitives: create_window, split_pane, start_claude, find_active_session","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:56:50.490822-08:00","updated_at":"2025-12-11T22:14:30.729012-08:00","closed_at":"2025-12-11T22:14:30.729012-08:00","dependencies":[{"issue_id":"cic-ir7","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T21:59:50.759651-08:00","created_by":"phaedrus"},{"issue_id":"cic-ir7","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T21:59:55.884867-08:00","created_by":"phaedrus"},{"issue_id":"cic-ir7","depends_on_id":"cic-yo7","type":"blocks","created_at":"2025-12-11T22:00:00.999312-08:00","created_by":"phaedrus"}]}
{"id":"cic-ivhu","title":"Return immediately on slash command messages","description":"When message_workers receives a message that begins with forward slash (/), return immediately despite wait conditions. Interpret this as an attempt at a slash command which doesn't produce reliable telemetry (no stop hook fires). Include in the return that we detected a slash command and recommend the coordinator read the conversation logs to verify success.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-22T20:33:57.891092-08:00","updated_at":"2025-12-22T20:33:57.891092-08:00"}
{"id":"cic-jh2","title":"Phase 6: Entry Points \u0026 Configuration","description":"Add entry points and configuration. Modify pyproject.toml: add claude-team-tui script entry point, add optional-dependencies [tui] = textual\u003e=0.89.0, httpx\u003e=0.27.0. Environment variables: CLAUDE_TEAM_HTTP_PORT (default 8765), CLAUDE_TEAM_SERVER_URL (default http://127.0.0.1:8765). Update registry.py to add lead_session tracking for advisory messages.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T17:57:13.355622-08:00","updated_at":"2025-12-20T23:12:58.877588-08:00","closed_at":"2025-12-15T12:49:41.248189-08:00","dependencies":[{"issue_id":"cic-jh2","depends_on_id":"cic-9xc","type":"blocks","created_at":"2025-12-14T17:58:22.4333-08:00","created_by":"phaedrus"}]}
{"id":"cic-k0m","title":"send_message not submitting - Enter key not sent","description":"When send_message sends a prompt to a session, the text is pasted but Enter is not sent to submit it.\n\n## Reproduction\n1. spawn_team or spawn_session\n2. send_message with any text\n3. Observe: text appears at prompt but isn't submitted\n\n## Expected\nText should be submitted (Enter pressed after paste)\n\n## Actual \nText sits at prompt, requires manual Enter\n\n## Investigation\n- send_prompt() calls async_send_text(KEYS['enter']) which is \\x0d\n- Manual Python script sending \\x0d works\n- Something in the MCP tool chain is failing\n\n## Workaround\nManually send Enter via direct iTerm2 API call","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-12T11:14:41.490711-08:00","updated_at":"2025-12-12T11:24:45.391533-08:00","closed_at":"2025-12-12T11:24:45.391533-08:00"}
{"id":"cic-kiu","title":"close_session tool","description":"Implement the close_session MCP tool.\n\nTool signature:\n close_session(\n session_id: str,\n force: bool = False\n ) -\u003e dict\n\nBehavior:\n1. Look up session in registry\n2. If not force and session is busy, return error\n3. Send Ctrl+C to interrupt any running operation\n4. Send '/exit' or Escape to exit Claude\n5. Optionally close the iTerm2 pane/window\n6. Remove from registry\n7. Return {success: bool, final_status: str}\n\nHandle edge cases: session already closed, iTerm2 window closed externally.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-11T21:57:23.924286-08:00","updated_at":"2025-12-11T22:14:56.166827-08:00","closed_at":"2025-12-11T22:14:56.166827-08:00","dependencies":[{"issue_id":"cic-kiu","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T22:00:52.233455-08:00","created_by":"phaedrus"},{"issue_id":"cic-kiu","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T22:00:57.34777-08:00","created_by":"phaedrus"}]}
{"id":"cic-kv2","title":"discover_sessions converts hyphens to slashes in project path","description":"Path detection parses 'claude-iterm-controller' from prompt as 'claude/iterm/controller'. The screen parsing logic incorrectly converts hyphens to directory separators, causing import_session to fail with 'Project path does not exist' when no explicit project_path is provided.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-11T22:50:11.518064-08:00","updated_at":"2025-12-11T22:57:14.842-08:00","closed_at":"2025-12-11T22:57:14.842-08:00"}
{"id":"cic-l8u","title":"Shell-only terminal sessions for long-running processes","description":"Allow claude-team to spawn terminal sessions that do NOT run Claude Code. Useful for long-running shell programs like dev servers (npm run dev), build watchers, database clients, etc. Sessions should be trackable and manageable like Claude sessions but without JSONL/conversation tracking.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-16T09:20:11.113365-08:00","updated_at":"2025-12-16T09:20:11.113365-08:00","dependencies":[{"issue_id":"cic-l8u","depends_on_id":"cic-avg","type":"blocks","created_at":"2025-12-16T09:21:17.258226-08:00","created_by":"phaedrus"},{"issue_id":"cic-l8u","depends_on_id":"cic-v7e","type":"blocks","created_at":"2025-12-16T09:21:22.402335-08:00","created_by":"phaedrus"},{"issue_id":"cic-l8u","depends_on_id":"cic-q6l","type":"blocks","created_at":"2025-12-16T09:21:27.546817-08:00","created_by":"phaedrus"},{"issue_id":"cic-l8u","depends_on_id":"cic-hr4","type":"blocks","created_at":"2025-12-16T09:21:32.679775-08:00","created_by":"phaedrus"},{"issue_id":"cic-l8u","depends_on_id":"cic-2q6","type":"blocks","created_at":"2025-12-16T09:21:37.820296-08:00","created_by":"phaedrus"},{"issue_id":"cic-l8u","depends_on_id":"cic-7pt","type":"blocks","created_at":"2025-12-16T09:21:42.959352-08:00","created_by":"phaedrus"}]}
{"id":"cic-ms7","title":"Profile auto-creation on first use","description":"Automatically create the claude-team profile if it doesn't exist.\n\n## Detection\n- Check if 'claude-team' profile exists in iTerm2\n- Use iterm2.PartialProfile.async_get() or similar\n\n## Profile Properties to Set\n- Name: 'claude-team'\n- Font: Source Code Pro 12pt (fallback: Menlo 12pt)\n- Window style: Maximized (NOT fullscreen)\n- Rows/Columns: Large enough for splitting (e.g., 200x60)\n- Close on exit: automatic\n- Colors: Adapt to system light/dark mode\n\n## Creation Flow\n1. On first spawn_session call, check for profile\n2. If missing, create with all settings\n3. Log: 'Created claude-team iTerm2 profile'\n4. Cache result to avoid repeated checks\n\n## Fallback Strategy\nIf profile creation fails:\n- Log warning\n- Use default profile with LocalWriteOnlyProfile customizations\n- Still apply tab colors and badge\n\n## iTerm2 API\n- iterm2.Profile for reading existing\n- May need to use iTerm2's dynamic profiles or scripting","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T09:46:25.561999-08:00","updated_at":"2025-12-15T07:56:39.436405-08:00","closed_at":"2025-12-12T11:39:37.845975-08:00","dependencies":[{"issue_id":"cic-ms7","depends_on_id":"cic-3dj","type":"blocks","created_at":"2025-12-12T09:47:26.478313-08:00","created_by":"phaedrus"}]}
{"id":"cic-msz","title":"Phase 2: REST API Layer","description":"Expose session state and actions via HTTP endpoints. Create new files: src/claude_team_mcp/api/__init__.py, api/routes.py (REST endpoints), api/schemas.py (Pydantic models). Endpoints: GET /api/sessions (list all), GET /api/sessions/{id} (single session), GET /api/sessions/{id}/screen (terminal content), POST /api/actions/spawn (create worker), POST /api/actions/kill/{id} (terminate worker), POST /api/actions/message/{id} (send message). Implement advisory message pattern to notify lead session of TUI actions.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T17:56:29.239229-08:00","updated_at":"2025-12-20T23:12:58.877849-08:00","closed_at":"2025-12-15T12:48:20.936525-08:00","dependencies":[{"issue_id":"cic-msz","depends_on_id":"cic-hzx","type":"blocks","created_at":"2025-12-14T17:58:01.944961-08:00","created_by":"phaedrus"}]}
{"id":"cic-ntq","title":"Integrate profile system into spawn_session","description":"Update spawn_session and spawn_team to use the claude-team profile.\n\n## Changes to spawn_session\n- Use claude-team profile instead of default\n- Apply dynamic tab color\n- Set badge text from new optional params\n- New parameters:\n - issue_id: str = None\n - task_description: str = None \n - tab_color: iterm2.Color = None (override auto-color)\n\n## Changes to spawn_team\n- Each pane gets unique color from sequence\n- Badge shows pane position + issue if provided\n- Optional color_scheme param for future expansion\n\n## Changes to iterm_utils.py\n- Update create_window() to accept profile_customizations\n- Update split functions similarly\n\n## Backwards Compatibility\n- Existing calls work unchanged (colors auto-assigned)\n- New params are optional","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-12T09:46:11.217176-08:00","updated_at":"2025-12-15T07:56:39.436683-08:00","closed_at":"2025-12-12T11:39:37.845138-08:00","dependencies":[{"issue_id":"cic-ntq","depends_on_id":"cic-3dj","type":"blocks","created_at":"2025-12-12T09:47:10.987043-08:00","created_by":"phaedrus"},{"issue_id":"cic-ntq","depends_on_id":"cic-0ed","type":"blocks","created_at":"2025-12-12T09:47:16.157357-08:00","created_by":"phaedrus"},{"issue_id":"cic-ntq","depends_on_id":"cic-ga4","type":"blocks","created_at":"2025-12-12T09:47:21.320758-08:00","created_by":"phaedrus"}]}
{"id":"cic-o7m","title":"get_session_status tool","description":"Implement the get_session_status MCP tool.\n\nTool signature:\n get_session_status(session_id: str) -\u003e dict\n\nReturns detailed status:\n{\n session_id: str,\n status: str (spawning/ready/busy/closed),\n project_path: str,\n is_responsive: bool, # Can we read screen?\n last_activity: str,\n conversation_stats: {\n total_messages: int,\n user_messages: int,\n assistant_messages: int,\n last_user_prompt: Optional[str],\n last_assistant_response_preview: Optional[str]\n },\n screen_preview: str # Last few lines of terminal\n}\n\nCombines iTerm2 screen reading with JSONL parsing for full picture.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:57:17.40743-08:00","updated_at":"2025-12-11T22:14:51.082816-08:00","closed_at":"2025-12-11T22:14:51.082816-08:00","dependencies":[{"issue_id":"cic-o7m","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T22:00:41.982891-08:00","created_by":"phaedrus"},{"issue_id":"cic-o7m","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T22:00:47.114277-08:00","created_by":"phaedrus"}]}
{"id":"cic-oz0","title":"Set BEADS_DIR when spawning sessions in worktrees","description":"When spawning Claude sessions in git worktrees, set the BEADS_DIR environment variable to point to the main repo's .beads directory.\n\nBackground: Beads has known worktree limitations (see steveyegge/beads PR #478). The database discovery fails because git rev-parse --show-toplevel returns the worktree path instead of the main repo.\n\nImplementation:\n- Detect if project_path is a worktree (check if .git is a file)\n- If so, resolve main repo path and set BEADS_DIR=/path/to/main/.beads\n- Pass this env var to start_claude_in_session()\n\nWorkarounds that work today:\n- bd --no-db (used by e5t-worker)\n- BEADS_NO_DAEMON=1\n- --sandbox mode","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-11T22:44:31.543033-08:00","updated_at":"2025-12-11T22:57:14.842885-08:00","closed_at":"2025-12-11T22:57:14.842885-08:00"}
{"id":"cic-q6l","title":"Add send_to_shell MCP tool","description":"Create MCP tool to send commands/input to shell-only sessions. Similar to send_message but for raw shell input. Should handle Enter key properly. May want option to wait for command completion.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T09:20:45.501187-08:00","updated_at":"2025-12-16T09:20:45.501187-08:00","dependencies":[{"issue_id":"cic-q6l","depends_on_id":"cic-avg","type":"blocks","created_at":"2025-12-16T09:21:54.814672-08:00","created_by":"phaedrus"}]}
{"id":"cic-qzu","title":"Claude Code Team Manager MCP Server","description":"Build an MCP server that allows one Claude Code session to spawn and manage a team of other Claude Code sessions via iTerm2. The server maintains persistent state tracking which iTerm windows/panes correspond to which Claude sessions, enabling coordination between multiple AI coding agents.\n\nKey capabilities:\n- Spawn new Claude Code sessions in iTerm2 windows/panes\n- Send prompts to managed sessions\n- Read responses and conversation state from sessions\n- Check session status (idle, processing, waiting)\n- Coordinate multi-session workflows\n\nTech stack:\n- Python with uv (replacing pip/venv)\n- Official MCP Python SDK (FastMCP)\n- Existing iTerm2 primitives from this project\n- JSONL session parsing for state access","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-11T21:55:24.81561-08:00","updated_at":"2025-12-12T10:06:49.231408-08:00","closed_at":"2025-12-12T10:06:49.231408-08:00","dependencies":[{"issue_id":"cic-qzu","depends_on_id":"cic-el6","type":"blocks","created_at":"2025-12-11T21:58:00.016924-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T21:58:05.136279-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T21:58:10.25382-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-ir7","type":"blocks","created_at":"2025-12-11T21:58:15.370467-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-v98","type":"blocks","created_at":"2025-12-11T21:58:20.494682-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-3tv","type":"blocks","created_at":"2025-12-11T21:58:25.637636-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-f0j","type":"blocks","created_at":"2025-12-11T21:58:30.766309-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-o7m","type":"blocks","created_at":"2025-12-11T21:58:35.890778-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-kiu","type":"blocks","created_at":"2025-12-11T21:58:41.016919-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-yo7","type":"blocks","created_at":"2025-12-11T21:58:46.137259-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-clx","type":"blocks","created_at":"2025-12-11T21:58:51.270767-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-hzk","type":"blocks","created_at":"2025-12-11T21:58:56.405378-08:00","created_by":"phaedrus"},{"issue_id":"cic-qzu","depends_on_id":"cic-2rc","type":"blocks","created_at":"2025-12-11T22:01:38.24671-08:00","created_by":"phaedrus"}]}
{"id":"cic-sic","title":"Core MCP server skeleton","description":"Create the basic FastMCP server structure with stdio transport.\n\nFiles to create:\n- src/claude_team_mcp/server.py - Main MCP server using FastMCP\n- src/claude_team_mcp/__init__.py - Package init\n- src/claude_team_mcp/__main__.py - Entry point for 'python -m claude_team_mcp'\n\nThe server should:\n- Use FastMCP for simple tool registration\n- Support stdio transport (for Claude Desktop integration)\n- Have a lifespan context manager for managing iTerm2 connection\n- Log startup/shutdown events\n\nReference the MCP Python SDK FastMCP patterns.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-11T21:55:50.916268-08:00","updated_at":"2025-12-11T22:07:27.445469-08:00","closed_at":"2025-12-11T22:07:27.445469-08:00","dependencies":[{"issue_id":"cic-sic","depends_on_id":"cic-el6","type":"blocks","created_at":"2025-12-11T21:59:35.404951-08:00","created_by":"phaedrus"}]}
{"id":"cic-une","title":"Add coordinator messaging - allow workers to send messages back to coordinator","description":"Currently send_message only works FROM coordinator TO workers. Workers have no way to message back to the coordinator because the coordinator doesn't have a session_id in the registry.\n\nProposed solution: Add a 'coordinator inbox' mechanism where:\n1. Workers can call something like send_to_coordinator(message)\n2. Coordinator can poll/read inbox via get_coordinator_messages()\n\nThis would enable async communication patterns without workers writing to temp files.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:33:52.292079-08:00","updated_at":"2025-12-14T16:33:52.292079-08:00","comments":[{"id":1,"issue_id":"cic-une","author":"rabsef-bicrym","text":"Partial progress: Added get_conversation_history tool (cic-8mk) which allows coordinator to observe worker activity with reverse pagination. This addresses the OBSERVATION part of the problem. The back-channel messaging (workers sending TO coordinator) still needs a queue/inbox system since coordinator isn't in iTerm.","created_at":"2025-12-15T06:04:45Z"}]}
{"id":"cic-uw8","title":"close_session should close iTerm2 pane/window","description":"Currently close_session removes the session from the registry but leaves the iTerm2 pane/window open. It should optionally (or by default) close the actual iTerm2 pane.\n\nConsider:\n- close_pane parameter (default true?)\n- If pane is last in window, close window\n- If pane is last in tab, close tab\n- Handle gracefully if iTerm2 session is already closed","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-11T22:35:52.972446-08:00","updated_at":"2025-12-11T22:56:01.61782-08:00","closed_at":"2025-12-11T22:56:01.61782-08:00"}
{"id":"cic-v6x","title":"send_message does not submit after paste - Enter key not working","description":"When send_message sends a multi-line message, it gets pasted (bracketed paste mode shows '[Pasted text #1 +20 lines]') but the message is not submitted. Short single-line messages work fine.\n\nThe issue appears specific to bracketed paste mode. Possible causes:\n- Claude Code may require a different key sequence after bracketed paste\n- There may be a timing issue needing delay after paste before submission key\n- The submission key after paste might not be Enter (\\x0d)\n\nNote: Single-line messages submit correctly with \\x0d.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-11T22:31:49.11264-08:00","updated_at":"2025-12-12T10:26:33.506541-08:00","closed_at":"2025-12-12T10:26:33.506541-08:00"}
{"id":"cic-v98","title":"list_sessions tool","description":"Implement the list_sessions MCP tool.\n\nTool signature:\n list_sessions(\n status_filter: Optional[str] = None # ready, busy, all\n ) -\u003e list[dict]\n\nReturns list of:\n{\n session_id: str,\n session_name: str,\n project_path: str,\n status: str,\n claude_session_id: Optional[str],\n last_activity: str (ISO timestamp),\n message_count: int (from JSONL if available)\n}\n\nShould refresh status for each session before returning (check if Claude is idle or processing).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:56:57.538829-08:00","updated_at":"2025-12-11T22:14:35.813415-08:00","closed_at":"2025-12-11T22:14:35.813415-08:00","dependencies":[{"issue_id":"cic-v98","depends_on_id":"cic-sic","type":"blocks","created_at":"2025-12-11T22:00:06.110642-08:00","created_by":"phaedrus"},{"issue_id":"cic-v98","depends_on_id":"cic-y5n","type":"blocks","created_at":"2025-12-11T22:00:11.229202-08:00","created_by":"phaedrus"}]}
{"id":"cic-vcp","title":"Use internal .worktrees/ directory for worker worktrees","description":"Change worktree creation to use an internal .worktrees/ directory instead of cluttering the parent directory.\n\n## Current Behavior\n- Worktrees created in parent: `../project-cic-123`\n- Clutters parent directory\n- Requires manual cleanup path awareness\n\n## Proposed Behavior\n- Worktrees created in: `.worktrees/cic-123`\n- Self-contained within repo\n- Already gitignored (committed in 57733a8)\n- Easier cleanup (just delete .worktrees/)\n\n## Changes Required\n\n### /spawn-workers command (.claude/commands/spawn-workers.md)\nUpdate worktree creation instruction:\n```bash\n# Before\ngit worktree add ../\u003cproject\u003e-\u003cissue-id\u003e -b \u003cissue-id\u003e/\u003cdesc\u003e\n\n# After \ngit worktree add .worktrees/\u003cissue-id\u003e -b \u003cissue-id\u003e/\u003cdesc\u003e\n```\n\n### get_worktree_beads_dir() (server.py)\nNo changes needed - already handles internal worktrees correctly.\nThe `git rev-parse --git-common-dir` detection works regardless of worktree location.\n\n### Cleanup commands in /spawn-workers\n```bash\n# Before\ngit worktree remove ../\u003cproject\u003e-\u003cissue-id\u003e\n\n# After\ngit worktree remove .worktrees/\u003cissue-id\u003e\n```\n\n## Benefits\n- Cleaner parent directory\n- All worktrees visible with `ls .worktrees/`\n- Self-documenting structure\n- Simpler paths in commands","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-12T10:14:42.452387-08:00","updated_at":"2025-12-12T10:43:20.775556-08:00","closed_at":"2025-12-12T10:43:20.775556-08:00"}
{"id":"cic-vju","title":"Add HTTP integration tests","description":"Add pytest integration tests for the HTTP API layer. Tests should: 1) Start HTTP server in background fixture, 2) Test health endpoint, 3) Test /api/sessions endpoints with mocked registry (no iTerm2), 4) Test /api/actions endpoints. Use httpx async client. Document manual testing steps for full validation with iTerm2.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T18:15:11.636741-08:00","updated_at":"2025-12-20T23:12:58.878334-08:00","closed_at":"2025-12-15T12:48:50.678077-08:00","dependencies":[{"issue_id":"cic-vju","depends_on_id":"cic-msz","type":"blocks","created_at":"2025-12-14T18:15:25.652727-08:00","created_by":"phaedrus"}]}
{"id":"cic-x5t","title":"Thought experiment: close_team / batch session close","description":"Consider adding a close_team() or close_all_sessions() helper for batch closing workers.\n\n**Context from dogfooding:**\nWhen coordinating a team of 4 workers, had to call close_session 4 times sequentially. Minor friction but noticeable.\n\n**Open questions:**\n- Should this close all sessions, or just sessions from a specific spawn_team call?\n- If the latter, need team tracking (see related spike)\n- Is this worth the API surface area or is 4 close calls fine?\n\n**Status:** Thought experiment - not ready to build. Consider independently from main orchestration epic.","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-16T20:38:23.214042-08:00","updated_at":"2025-12-16T20:38:23.214042-08:00"}
{"id":"cic-xdj","title":"Broadcast messaging to multiple sessions","description":"Add ability to send the same message to multiple sessions at once.\n\n## Use Cases\n- 'All workers: run tests before committing'\n- 'All sessions: git pull to get latest changes'\n- 'Frontend team: rebuild and check for errors'\n\n## API Design Options\n1. New tool: broadcast_message(session_ids: list[str], message: str)\n2. Extend send_message with session_ids list parameter\n3. Session groups + broadcast_to_group(group: str, message: str)\n\n## Implementation Considerations\n- Parallel execution (don't wait for each sequentially)\n- Return aggregated results or individual results?\n- Error handling: fail-fast vs collect all errors\n- Option to wait_for_all_responses with combined timeout\n- Consider integration with session tags/groups feature","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-12T08:01:36.801126-08:00","updated_at":"2025-12-12T10:26:33.506898-08:00","closed_at":"2025-12-12T10:26:33.506898-08:00"}
{"id":"cic-y5n","title":"Session registry module","description":"Create a session registry to track all spawned Claude sessions.\n\nFile: src/claude_team_mcp/registry.py\n\nThe SessionRegistry class should track:\n- session_id: str (unique identifier we assign)\n- iterm_session: iterm2.Session object\n- project_path: str (where Claude is running)\n- claude_session_id: Optional[str] (from JSONL file)\n- status: enum (spawning, ready, busy, closed)\n- created_at: datetime\n- last_activity: datetime\n\nMethods:\n- add(session_id, iterm_session, project_path) -\u003e ManagedSession\n- get(session_id) -\u003e Optional[ManagedSession]\n- list_all() -\u003e list[ManagedSession]\n- remove(session_id)\n- update_status(session_id, status)\n\nThis is the core state that makes the MCP server useful - it persists across tool calls.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:56:44.224268-08:00","updated_at":"2025-12-11T22:11:38.801878-08:00","closed_at":"2025-12-11T22:11:38.801878-08:00","dependencies":[{"issue_id":"cic-y5n","depends_on_id":"cic-el6","type":"blocks","created_at":"2025-12-11T21:59:40.523402-08:00","created_by":"phaedrus"}]}
{"id":"cic-ynr","title":"Implement marker-based JSONL correlation","description":"Fix JSONL session discovery to accurately correlate iTerm panes with their JSONL files.\n\nProblem: Multiple Claude sessions in same project share JSONL path prefix, can't tell which pane maps to which file.\n\nSolution:\n1. Send unique marker message to each spawned session\n2. Search all JSONL files for that marker\n3. Use marker presence to correlate pane → file\n\nImplementation:\n- Add marker generation in registry.py\n- Update spawn flow to send marker and wait for response\n- Search JSONL files for marker to find correct file\n- Store discovered claude_session_id in ManagedSession","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-15T09:59:15.609423-08:00","updated_at":"2025-12-19T11:54:03.843174-08:00","closed_at":"2025-12-19T11:54:03.843174-08:00","close_reason":"Closed","comments":[{"id":55,"issue_id":"cic-ynr","author":"rabsef-bicrym","text":"Solved via Stop hook implementation. Pre-generated session IDs are baked into Stop hooks as markers [worker-done:SESSION_ID]. JSONL correlation happens by finding these markers in hookInfos[].command. No separate marker-sending step needed.","created_at":"2025-12-19T19:53:57Z"}]}
{"id":"cic-yo7","title":"Refactor primitives for MCP server","description":"Extract and organize reusable code from existing files for the MCP server.\n\nCreate: src/claude_team_mcp/iterm_utils.py\n- Move key codes, send_text, send_key, send_prompt, read_screen from primitives.py\n- Add proper async context management for iTerm2 connection\n- Add connection pooling/reuse\n\nCreate: src/claude_team_mcp/session_state.py \n- Move/adapt SessionParser, SessionState, Message from session_parser.py\n- Add caching for parsed sessions\n- Add methods for incremental updates (only parse new lines)\n\nKeep existing files working (they're useful for testing) but have them import from the new modules.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-11T21:57:30.493975-08:00","updated_at":"2025-12-11T22:09:39.949798-08:00","closed_at":"2025-12-11T22:09:39.949798-08:00","dependencies":[{"issue_id":"cic-yo7","depends_on_id":"cic-el6","type":"blocks","created_at":"2025-12-11T21:59:45.644071-08:00","created_by":"phaedrus"}]}