claude-team-mcp 0.5.0__tar.gz → 0.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. claude_team_mcp-0.6.1/.beads/issues.jsonl +75 -0
  2. claude_team_mcp-0.6.1/.claude/settings.json +5 -0
  3. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/.claude/settings.local.json +5 -2
  4. claude_team_mcp-0.6.1/.pebbles/.gitignore +1 -0
  5. claude_team_mcp-0.6.1/.pebbles/config.json +3 -0
  6. claude_team_mcp-0.6.1/.pebbles/events.jsonl +59 -0
  7. claude_team_mcp-0.5.0/.beads/beads.db-shm → claude_team_mcp-0.6.1/.pebbles/pebbles.db +0 -0
  8. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/CHANGELOG.md +17 -0
  9. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/CLAUDE.md +51 -27
  10. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/PKG-INFO +16 -3
  11. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/README.md +15 -2
  12. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/commands/check-workers.md +2 -2
  13. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/commands/merge-worker.md +1 -1
  14. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/commands/pr-worker.md +3 -3
  15. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/commands/spawn-workers.md +12 -10
  16. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/commands/team-summary.md +3 -3
  17. claude_team_mcp-0.6.1/config/mcporter.json +11 -0
  18. claude_team_mcp-0.6.1/docs/ISSUE_TRACKER_ABSTRACTION.md +122 -0
  19. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/pyproject.toml +1 -1
  20. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/cli_backends/codex.py +3 -4
  21. claude_team_mcp-0.6.1/src/claude_team_mcp/issue_tracker/__init__.py +132 -0
  22. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/__init__.py +2 -2
  23. claude_team_mcp-0.6.1/src/claude_team_mcp/tools/issue_tracker_help.py +50 -0
  24. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/message_workers.py +10 -3
  25. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/spawn_workers.py +137 -62
  26. claude_team_mcp-0.6.1/src/claude_team_mcp/utils/__init__.py +25 -0
  27. claude_team_mcp-0.6.1/src/claude_team_mcp/utils/constants.py +209 -0
  28. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/utils/worktree_detection.py +37 -15
  29. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/worker_prompt.py +120 -34
  30. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_cli_backends.py +7 -7
  31. claude_team_mcp-0.6.1/tests/test_issue_tracker.py +103 -0
  32. claude_team_mcp-0.6.1/tests/test_issue_tracker_integration.py +390 -0
  33. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_worker_prompt.py +104 -58
  34. claude_team_mcp-0.6.1/tests/test_worktree_detection.py +118 -0
  35. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/uv.lock +1 -1
  36. claude_team_mcp-0.5.0/.beads/.gitignore +0 -44
  37. claude_team_mcp-0.5.0/.beads/README.md +0 -81
  38. claude_team_mcp-0.5.0/.beads/beads.db +0 -0
  39. claude_team_mcp-0.5.0/.beads/beads.db-wal +0 -0
  40. claude_team_mcp-0.5.0/.beads/config.yaml +0 -62
  41. claude_team_mcp-0.5.0/.beads/daemon.lock +0 -7
  42. claude_team_mcp-0.5.0/.beads/daemon.log +0 -14956
  43. claude_team_mcp-0.5.0/.beads/daemon.pid +0 -1
  44. claude_team_mcp-0.5.0/.beads/deletions.jsonl.migrated +0 -54
  45. claude_team_mcp-0.5.0/.beads/issues.jsonl +0 -140
  46. claude_team_mcp-0.5.0/.beads/metadata.json +0 -5
  47. claude_team_mcp-0.5.0/src/claude_team_mcp/tools/bd_help.py +0 -42
  48. claude_team_mcp-0.5.0/src/claude_team_mcp/utils/__init__.py +0 -17
  49. claude_team_mcp-0.5.0/src/claude_team_mcp/utils/constants.py +0 -87
  50. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/.claude-plugin/marketplace.json +0 -0
  51. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/.claude-plugin/plugin.json +0 -0
  52. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/.gitattributes +0 -0
  53. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/.gitignore +0 -0
  54. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/.mcp.json +0 -0
  55. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/HAPPY_INTEGRATION_RESEARCH.md +0 -0
  56. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/Makefile +0 -0
  57. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/NOTES.md +0 -0
  58. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/commands/cleanup-worktrees.md +0 -0
  59. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/scripts/install-commands.py +0 -0
  60. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/settings.json +0 -0
  61. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/__init__.py +0 -0
  62. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/__main__.py +0 -0
  63. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/cli_backends/__init__.py +0 -0
  64. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/cli_backends/base.py +0 -0
  65. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/cli_backends/claude.py +0 -0
  66. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/colors.py +0 -0
  67. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/formatting.py +0 -0
  68. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/idle_detection.py +0 -0
  69. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/iterm_utils.py +0 -0
  70. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/names.py +0 -0
  71. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/profile.py +0 -0
  72. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/registry.py +0 -0
  73. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/schemas/__init__.py +0 -0
  74. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/schemas/codex.py +0 -0
  75. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/server.py +0 -0
  76. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/session_state.py +0 -0
  77. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/subprocess_cache.py +0 -0
  78. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/adopt_worker.py +0 -0
  79. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/annotate_worker.py +0 -0
  80. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/check_idle_workers.py +0 -0
  81. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/close_workers.py +0 -0
  82. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/discover_workers.py +0 -0
  83. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/examine_worker.py +0 -0
  84. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/list_workers.py +0 -0
  85. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/list_worktrees.py +0 -0
  86. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/read_worker_logs.py +0 -0
  87. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/tools/wait_idle_workers.py +0 -0
  88. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/utils/errors.py +0 -0
  89. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/src/claude_team_mcp/worktree.py +0 -0
  90. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/__init__.py +0 -0
  91. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_codex_schema.py +0 -0
  92. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_colors.py +0 -0
  93. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_formatting.py +0 -0
  94. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_idle_detection.py +0 -0
  95. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_iterm_utils.py +0 -0
  96. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_names.py +0 -0
  97. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_registry.py +0 -0
  98. {claude_team_mcp-0.5.0 → claude_team_mcp-0.6.1}/tests/test_session_state.py +0 -0
@@ -0,0 +1,75 @@
1
+ {"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"}
2
+ {"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"}
3
+ {"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"}
4
+ {"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"}
5
+ {"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"}
6
+ {"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"}]}
7
+ {"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"}]}
8
+ {"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"}]}
9
+ {"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"}
10
+ {"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"}]}
11
+ {"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"}
12
+ {"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"}]}
13
+ {"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"}]}
14
+ {"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"}
15
+ {"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"}
16
+ {"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"}
17
+ {"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"}
18
+ {"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"}]}
19
+ {"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"}
20
+ {"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"}
21
+ {"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"}
22
+ {"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"}
23
+ {"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"}
24
+ {"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"}]}
25
+ {"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"}
26
+ {"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"}
27
+ {"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"}
28
+ {"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"}
29
+ {"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"}
30
+ {"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"}
31
+ {"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"}
32
+ {"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"}]}
33
+ {"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"}
34
+ {"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"}
35
+ {"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"}]}
36
+ {"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"}
37
+ {"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"}]}
38
+ {"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"}]}
39
+ {"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"}
40
+ {"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"}
41
+ {"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"}
42
+ {"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"}]}
43
+ {"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"}
44
+ {"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"}]}
45
+ {"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"}]}
46
+ {"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"}]}
47
+ {"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"}
48
+ {"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"}
49
+ {"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"}]}
50
+ {"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"}]}
51
+ {"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"}
52
+ {"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"}]}
53
+ {"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"}
54
+ {"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"}]}
55
+ {"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"}
56
+ {"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"}]}
57
+ {"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"}]}
58
+ {"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"}]}
59
+ {"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"}]}
60
+ {"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"}]}
61
+ {"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"}
62
+ {"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"}]}
63
+ {"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"}]}
64
+ {"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"}]}
65
+ {"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"}]}
66
+ {"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"}
67
+ {"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"}
68
+ {"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"}]}
69
+ {"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"}
70
+ {"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"}]}
71
+ {"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"}
72
+ {"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"}
73
+ {"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"}]}
74
+ {"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"}]}
75
+ {"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"}]}
@@ -0,0 +1,5 @@
1
+ {
2
+ "enabledPlugins": {
3
+ "claude-opus-4-5-migration@claude-code-plugins": false
4
+ }
5
+ }
@@ -10,9 +10,12 @@
10
10
  "Bash(bd list:*)",
11
11
  "WebSearch",
12
12
  "mcp__claude-team__spawn_team",
13
- "mcp__claude-team__send_message"
13
+ "mcp__claude-team__send_message",
14
+ "mcp__claude-team__read_worker_logs"
14
15
  ]
15
16
  },
16
17
  "enableAllProjectMcpServers": true,
17
- "enabledMcpjsonServers": ["claude-team"]
18
+ "enabledMcpjsonServers": [
19
+ "claude-team"
20
+ ]
18
21
  }
@@ -0,0 +1 @@
1
+ pebbles.db
@@ -0,0 +1,3 @@
1
+ {
2
+ "prefix": "cic"
3
+ }
@@ -0,0 +1,59 @@
1
+ {"type":"create","timestamp":"2025-12-15T00:33:52.292079Z","issue_id":"cic-une","payload":{"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.","priority":"2","title":"Add coordinator messaging - allow workers to send messages back to coordinator","type":"feature"}}
2
+ {"type":"create","timestamp":"2025-12-15T01:56:09.65449Z","issue_id":"cic-h75","payload":{"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.","priority":"2","title":"Claude Team TUI Companion App","type":"epic"}}
3
+ {"type":"create","timestamp":"2025-12-16T17:20:11.113365Z","issue_id":"cic-l8u","payload":{"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.","priority":"2","title":"Shell-only terminal sessions for long-running processes","type":"epic"}}
4
+ {"type":"create","timestamp":"2025-12-16T17:20:34.630863Z","issue_id":"cic-avg","payload":{"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.","priority":"2","title":"Add spawn_shell MCP tool","type":"task"}}
5
+ {"type":"create","timestamp":"2025-12-16T17:20:45.501187Z","issue_id":"cic-q6l","payload":{"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.","priority":"2","title":"Add send_to_shell MCP tool","type":"task"}}
6
+ {"type":"create","timestamp":"2025-12-16T17:20:50.891408Z","issue_id":"cic-hr4","payload":{"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.","priority":"2","title":"Add get_shell_output MCP tool","type":"task"}}
7
+ {"type":"create","timestamp":"2025-12-16T17:20:56.307156Z","issue_id":"cic-2q6","payload":{"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.","priority":"2","title":"Support mixed layouts with shell and Claude sessions","type":"task"}}
8
+ {"type":"create","timestamp":"2025-12-16T17:21:01.708275Z","issue_id":"cic-7pt","payload":{"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.","priority":"2","title":"Add shell session lifecycle management","type":"task"}}
9
+ {"type":"create","timestamp":"2025-12-17T04:38:23.214042Z","issue_id":"cic-x5t","payload":{"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.","priority":"3","title":"Thought experiment: close_team / batch session close","type":"chore"}}
10
+ {"type":"create","timestamp":"2025-12-17T04:38:23.497704Z","issue_id":"cic-1vn","payload":{"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.","priority":"3","title":"Thought experiment: team tracking / team_id concept","type":"chore"}}
11
+ {"type":"create","timestamp":"2025-12-17T04:42:36.631081Z","issue_id":"cic-bcf","payload":{"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.","priority":"3","title":"Thought experiment: wait_for_completion / wait_for_team","type":"chore"}}
12
+ {"type":"create","timestamp":"2025-12-21T06:17:51.72494Z","issue_id":"cic-7on","payload":{"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.","priority":"2","title":"Enhance read_worker_logs output formatting","type":"feature"}}
13
+ {"type":"create","timestamp":"2025-12-23T04:33:57.891092Z","issue_id":"cic-ivhu","payload":{"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.","priority":"2","title":"Return immediately on slash command messages","type":"feature"}}
14
+ {"type":"create","timestamp":"2025-12-23T04:36:31.89944Z","issue_id":"cic-5xot","payload":{"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","priority":"1","title":"Comprehensive Terminal Abstraction Layer","type":"epic"}}
15
+ {"type":"create","timestamp":"2025-12-23T04:37:13.825284Z","issue_id":"cic-bt3a","payload":{"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","priority":"2","title":"Migrate existing code to terminal abstraction","type":"task"}}
16
+ {"type":"create","timestamp":"2026-01-13T19:23:23.632251Z","issue_id":"cic-d9j","payload":{"description":"When listing or examining workers, the agent_type field (claude vs codex) is not included in the output. Coordinators need this to know which type of worker they're managing.","priority":"2","title":"agent_type not shown in list_workers/examine_worker","type":"bug"}}
17
+ {"type":"create","timestamp":"2026-01-13T22:26:56.533366Z","issue_id":"cic-fgx","payload":{"description":"When the MCP server is running inside iTerm2, automatically detect the coordinator's window and prefer spawning workers there (when space is available) before falling back to find_available_window().\n\n## Background\niTerm2 sets ITERM_SESSION_ID in the environment for processes running inside it. We can use this to detect the coordinator's session and find its parent window.\n\n## Implementation\n1. In spawn_workers.py, check os.environ.get('ITERM_SESSION_ID')\n2. If present, use iTerm2 API to look up that session\n3. Use get_window_for_session() to find the coordinator's window\n4. When layout='auto', prefer that window first (if it has space)\n5. Fall back to existing find_available_window() logic if coordinator window is full\n\n## Existing Infrastructure\n- get_window_for_session(app, session) already exists in iterm_utils.py:1098-1117\n- split_pane() supports incremental pane addition\n- find_available_window() handles the general case\n\n## Notes\n- Only affects layout='auto' mode\n- Gracefully degrades if not running in iTerm or window is full\n- No new parameters needed - this is transparent behavior improvement","priority":"2","title":"Auto-detect coordinator's iTerm window and prefer it for spawning workers","type":"feature"}}
18
+ {"type":"create","timestamp":"2026-01-13T23:13:50.495475Z","issue_id":"cic-7ni","payload":{"description":"Add name sets featuring famous Romans from antiquity to names.py, covering multiple worker configurations (1, 2, 3, and 4 workers).\n\n## Requirements\n- Add entries to SOLOS, DUOS, TRIOS, QUARTETS dicts in src/claude_team_mcp/names.py\n- Follow existing naming conventions (lowercase keys with underscores)\n- Choose historically notable Romans and groupings","priority":"3","title":"Add famous Romans from antiquity to worker name sets","type":"feature"}}
19
+ {"type":"comment","timestamp":"2025-12-15T19:38:22Z","issue_id":"cic-une","payload":{"body":"Author: rabsef-bicrym\nPartial 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."}}
20
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:17.258226Z","issue_id":"cic-l8u","payload":{"dep_type":"blocks","depends_on":"cic-avg"}}
21
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:27.546817Z","issue_id":"cic-l8u","payload":{"dep_type":"blocks","depends_on":"cic-q6l"}}
22
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:32.679775Z","issue_id":"cic-l8u","payload":{"dep_type":"blocks","depends_on":"cic-hr4"}}
23
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:37.820296Z","issue_id":"cic-l8u","payload":{"dep_type":"blocks","depends_on":"cic-2q6"}}
24
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:42.959352Z","issue_id":"cic-l8u","payload":{"dep_type":"blocks","depends_on":"cic-7pt"}}
25
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:54.814672Z","issue_id":"cic-q6l","payload":{"dep_type":"blocks","depends_on":"cic-avg"}}
26
+ {"type":"dep_add","timestamp":"2025-12-16T17:21:59.958568Z","issue_id":"cic-hr4","payload":{"dep_type":"blocks","depends_on":"cic-avg"}}
27
+ {"type":"dep_add","timestamp":"2025-12-16T17:22:05.095812Z","issue_id":"cic-2q6","payload":{"dep_type":"blocks","depends_on":"cic-avg"}}
28
+ {"type":"dep_add","timestamp":"2025-12-23T04:37:23.162209Z","issue_id":"cic-5xot","payload":{"dep_type":"blocks","depends_on":"cic-bt3a"}}
29
+ {"type":"comment","timestamp":"2026-01-13T23:10:14.082126Z","issue_id":"cic-fgx","payload":{"body":"Close reason: Implemented auto-detect coordinator window with proper ITERM_SESSION_ID parsing and 3-pane layout"}}
30
+ {"type":"close","timestamp":"2026-01-13T23:10:14.082126Z","issue_id":"cic-fgx","payload":{}}
31
+ {"type":"create","timestamp":"2026-01-20T04:09:10.311493Z","issue_id":"cic-367","payload":{"description":"Abstract claude-team issue tracking so it can work with either Beads (bd) or Pebbles (pb), including detection and prompt/help updates.","priority":"1","title":"Issue tracker abstraction","type":"epic"}}
32
+ {"type":"create","timestamp":"2026-01-20T04:09:16.716586Z","issue_id":"cic-90d","payload":{"description":"Add an issue tracker abstraction module with backend registry, command templates, capabilities, and detection (beads vs pebbles).","priority":"1","title":"Phase 1: Issue tracker abstraction module","type":"task"}}
33
+ {"type":"create","timestamp":"2026-01-20T04:09:21.078029Z","issue_id":"cic-107","payload":{"description":"Update worktree detection to return tracker-specific env var paths (e.g., BEADS_DIR or Pebbles equivalent).","priority":"1","title":"Phase 2: Worktree detection for tracker env","type":"task"}}
34
+ {"type":"create","timestamp":"2026-01-20T04:09:26.691584Z","issue_id":"cic-7c5","payload":{"description":"Replace Beads-specific prompt/help strings with backend data (worker_prompt, constants, bd_help/message hint).","priority":"1","title":"Phase 3: Tracker-neutral prompts and help","type":"task"}}
35
+ {"type":"create","timestamp":"2026-01-20T04:09:32.962712Z","issue_id":"cic-a97","payload":{"description":"Update docs and tests to remove Beads-only language and align with the new abstraction.","priority":"2","title":"Phase 4: Tracker-neutral docs and tests","type":"task"}}
36
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:38.868502Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-90d"}}
37
+ {"type":"create","timestamp":"2026-01-20T04:09:41.079133Z","issue_id":"cic-b54","payload":{"description":"Update tests and documentation to be tracker-neutral. Adjust tests/test_worker_prompt.py, CLAUDE.md, README.md, and commands/*.md.","priority":"1","title":"Phase 4: Update docs and tests","type":"task"}}
38
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:41.09764Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-90d"}}
39
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:41.116226Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-107"}}
40
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:41.133989Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-7c5"}}
41
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:41.16431Z","issue_id":"cic-107","payload":{"dep_type":"blocks","depends_on":"cic-90d"}}
42
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:41.183647Z","issue_id":"cic-7c5","payload":{"dep_type":"blocks","depends_on":"cic-107"}}
43
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:44.032047Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-107"}}
44
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:47.87402Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-7c5"}}
45
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:51.578675Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-a97"}}
46
+ {"type":"close","timestamp":"2026-01-20T04:09:52.39411Z","issue_id":"cic-a97","payload":{}}
47
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:52.415024Z","issue_id":"cic-367","payload":{"dep_type":"blocks","depends_on":"cic-b54"}}
48
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:52.434493Z","issue_id":"cic-b54","payload":{"dep_type":"blocks","depends_on":"cic-7c5"}}
49
+ {"type":"dep_add","timestamp":"2026-01-20T04:09:54.91112Z","issue_id":"cic-107","payload":{"dep_type":"blocks","depends_on":"cic-90d"}}
50
+ {"type":"dep_add","timestamp":"2026-01-20T04:10:00.488585Z","issue_id":"cic-7c5","payload":{"dep_type":"blocks","depends_on":"cic-107"}}
51
+ {"type":"dep_add","timestamp":"2026-01-20T04:10:06.055452Z","issue_id":"cic-a97","payload":{"dep_type":"blocks","depends_on":"cic-7c5"}}
52
+ {"type":"status_update","timestamp":"2026-01-20T05:05:20.944388Z","issue_id":"cic-b54","payload":{"status":"in_progress"}}
53
+ {"type":"close","timestamp":"2026-01-20T05:18:20.542131Z","issue_id":"cic-b54","payload":{}}
54
+ {"type":"create","timestamp":"2026-01-21T19:06:11.932386Z","issue_id":"cic-c09","payload":{"description":"Three tests in test_cli_backends.py are failing because they expect --full-auto flag but implementation uses --dangerously-bypass-approvals-and-sandbox. Need to investigate which is correct and update either the implementation or tests accordingly.","priority":"2","title":"Fix failing Codex CLI tests","type":"task"}}
55
+ {"type":"status_update","timestamp":"2026-01-21T19:06:35.580259Z","issue_id":"cic-c09","payload":{"status":"in_progress"}}
56
+ {"type":"close","timestamp":"2026-01-21T19:08:45.621746Z","issue_id":"cic-c09","payload":{}}
57
+ {"type":"create","timestamp":"2026-01-21T19:49:17.679651Z","issue_id":"cic-13e","payload":{"description":"Codex CLI should use --dangerously-bypass-approvals-and-sandbox instead of --full-auto when skip_permissions is requested.","priority":"1","title":"Fix Codex skip permissions flag","type":"bug"}}
58
+ {"type":"status_update","timestamp":"2026-01-21T19:49:19.650961Z","issue_id":"cic-13e","payload":{"status":"in_progress"}}
59
+ {"type":"close","timestamp":"2026-01-21T19:50:32.252535Z","issue_id":"cic-13e","payload":{}}
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.6.1] - 2026-01-21
11
+
12
+ ### Fixed
13
+ - Correct Codex skip-permissions flag (use `--dangerously-bypass-approvals-and-sandbox`)
14
+
15
+ ## [0.6.0] - 2026-01-21
16
+
17
+ ### Added
18
+ - **Issue tracker abstraction**: Support for both Beads and Pebbles issue trackers
19
+ - Auto-detection of issue tracker based on project structure (`.beads/` vs `.pebbles/`)
20
+ - `issue_tracker_help` tool replaces `bd_help` with tracker-agnostic guidance
21
+ - Comprehensive test suite for issue tracker detection and integration
22
+
23
+ ### Changed
24
+ - Worker prompts now use generic issue tracker commands instead of hardcoded Beads
25
+ - Worktree detection improved with better branch name parsing
26
+
10
27
  ## [0.5.0] - 2026-01-13
11
28
 
12
29
  ### Added
@@ -11,6 +11,7 @@ src/claude_team_mcp/
11
11
  ├── session_state.py # JSONL parsing for Claude conversation logs
12
12
  ├── iterm_utils.py # Low-level iTerm2 API wrappers
13
13
  ├── idle_detection.py # Stop hook completion detection
14
+ ├── issue_tracker/ # Issue tracker abstraction + detection
14
15
  ├── profile.py # iTerm2 profile/theme management
15
16
  ├── colors.py # Golden ratio tab color generation
16
17
  ├── formatting.py # Title/badge formatting utilities
@@ -31,7 +32,7 @@ src/claude_team_mcp/
31
32
  │ ├── discover_workers.py # Find orphaned iTerm sessions
32
33
  │ ├── adopt_worker.py # Import orphaned sessions
33
34
  │ ├── list_worktrees.py # List git worktrees
34
- │ └── bd_help.py # Beads quick reference
35
+ │ └── bd_help.py # Beads quick reference (Pebbles uses pb help)
35
36
  └── utils/ # Shared utilities
36
37
  ├── constants.py # Shared constants
37
38
  ├── errors.py # Error response helpers
@@ -117,22 +118,40 @@ uv run python -m claude_team_mcp
117
118
 
118
119
  ## Development Workflow
119
120
 
120
- This project uses **Beads** for issue tracking instead of markdown todos. Key commands:
121
+ This project supports **Pebbles** (`pb`) and **Beads** (`bd --no-db`) for issue tracking.
122
+ The tracker is auto-detected by marker directories in the project root:
123
+
124
+ - `.pebbles` → Pebbles
125
+ - `.beads` → Beads
126
+
127
+ If both markers exist, Pebbles is selected by default.
128
+
129
+ Use the matching CLI for the commands below:
121
130
 
122
131
  ```bash
123
- bd list # List all issues
124
- bd ready # Show issues ready to work (no blockers)
125
- bd show <issue-id> # Show issue details
126
- bd update <issue-id> --status in_progress
127
- bd close <issue-id>
128
- bd dep tree <issue-id> # Visualize dependencies
132
+ # Pebbles
133
+ pb list # List all issues
134
+ pb ready # Show issues ready to work (no blockers)
135
+ pb show <issue-id> # Show issue details
136
+ pb update <issue-id> --status in_progress
137
+ pb close <issue-id>
138
+ pb dep tree <issue-id> # Visualize dependencies
139
+
140
+ # Beads
141
+ bd --no-db list # List all issues
142
+ bd --no-db ready # Show issues ready to work (no blockers)
143
+ bd --no-db show <issue-id> # Show issue details
144
+ bd --no-db update <issue-id> --status in_progress
145
+ bd --no-db close <issue-id>
146
+ bd --no-db dep tree <issue-id> # Visualize dependencies
129
147
  ```
130
148
 
131
- Current epics are tracked with dependencies. Check `bd list` to see all issues and `bd ready` for unblocked work.
149
+ Current epics are tracked with dependencies. Check `pb list` / `bd --no-db list` to see all issues and
150
+ `pb ready` / `bd --no-db ready` for unblocked work.
132
151
 
133
152
  ### Beginning Work
134
153
 
135
- IMPORTANT: Before doing any work, always create a beads issue or, if appropriate, epic.
154
+ IMPORTANT: Before doing any work, always create an issue (or epic) in the active tracker.
136
155
 
137
156
  ### Plan Mode Workflow
138
157
 
@@ -140,11 +159,12 @@ When working on complex features that require planning (via `EnterPlanMode`), fo
140
159
 
141
160
  1. **During plan mode**: Explore the codebase, understand patterns, and write a detailed plan to the plan file
142
161
  2. **Before exiting plan mode**: Ensure the plan captures all subtasks, configuration decisions, and dependencies
143
- 3. **First implementation step**: After exiting plan mode, **always** create beads issues before writing any code:
162
+ 3. **First implementation step**: After exiting plan mode, **always** create issues in the active tracker before writing any code:
144
163
  - Create an **epic** for the overall feature/deployment
145
- - Create **subtasks** as individual beads issues, one per discrete piece of work
146
- - Each issue description should capture relevant context from the plan (what to implement, key decisions, file paths)
147
- - Set up **dependencies** using `bd dep add <epic-id> <subtask-id>` so the epic depends on its subtasks
164
+ - Create **subtasks** as individual pebbles issues, one per discrete piece of work
165
+ - Each issue description should capture relevant context from the plan (what to implement, key decisions, file paths)
166
+ - Set up **dependencies** using `pb dep add <epic-id> <subtask-id>` or
167
+ `bd --no-db dep add <epic-id> <subtask-id>` so the epic depends on its subtasks
148
168
  - Subtasks that depend on each other should also have dependencies set
149
169
 
150
170
  4. **Then proceed with implementation**: Work through the subtasks using the normal task workflow
@@ -154,30 +174,34 @@ This ensures planning context is preserved in trackable issues rather than lost
154
174
  **Example**:
155
175
  ```bash
156
176
  # After exiting plan mode for "RDS Deployment" epic:
157
- bd create --title="RDS Deployment & pg-sync Service" --type=epic --description="..."
158
- bd create --title="Create RDS Terraform module" --type=task --description="Create terraform/modules/rds/ with..."
159
- bd create --title="Add RDS to dev environment" --type=task --description="..."
160
- bd dep add <epic-id> <task1-id>
161
- bd dep add <epic-id> <task2-id>
162
- bd dep add <task2-id> <task1-id> # task2 depends on task1
177
+ pb create --title="RDS Deployment & pg-sync Service" --type=epic --description="..."
178
+ pb create --title="Create RDS Terraform module" --type=task --description="Create terraform/modules/rds/ with..."
179
+ pb create --title="Add RDS to dev environment" --type=task --description="..."
180
+ pb dep add <epic-id> <task1-id>
181
+ pb dep add <epic-id> <task2-id>
182
+ pb dep add <task2-id> <task1-id> # task2 depends on task1
163
183
  ```
184
+ Replace `pb` with `bd --no-db` when using Beads.
164
185
 
165
186
  ### Prioritizing Work
166
187
 
167
188
  Always start by checking for in-progress work:
168
189
 
169
- 1. **Check for in-progress epics**: Run `bd list --status in_progress` to see which epics are currently being worked on
190
+ 1. **Check for in-progress epics**: Run `pb list --status in_progress` or
191
+ `bd --no-db list --status in_progress` to see which epics are currently being worked on
170
192
  2. **Focus on epic tasks**: If an epic is in-progress, prioritize tasks that block that epic
171
- 3. **Check ready work**: Use `bd ready` to see unblocked tasks, then choose tasks related to in-progress epics
193
+ 3. **Check ready work**: Use `pb ready` or `bd --no-db ready` to see unblocked tasks, then choose tasks
194
+ related to in-progress epics
172
195
  4. **Mark epics in-progress**: When starting work on an epic's tasks, mark the epic as `in_progress` if not already marked
173
196
 
174
197
  ### Task Workflow
175
198
 
176
199
  When working on individual issues, follow this workflow:
177
200
 
178
- 1. **Start work**: `bd update <issue-id> --status in_progress` (for both epics and tasks)
201
+ 1. **Start work**: `pb update <issue-id> --status in_progress` or
202
+ `bd --no-db update <issue-id> --status in_progress` (for both epics and tasks)
179
203
  2. **Complete the work**: Implement the feature/fix
180
- 3. **Close the issue**: `bd close <issue-id>`
204
+ 3. **Close the issue**: `pb close <issue-id>` or `bd --no-db close <issue-id>`
181
205
  4. **Commit immediately**: Create a git commit after closing each issue with:
182
206
  - Summary of completed issue(s) in the commit message
183
207
  - List of changes made
@@ -189,9 +213,10 @@ This ensures a clean audit trail where commits map directly to completed work it
189
213
 
190
214
  When bugs, inconsistencies, or improvements are discovered during development:
191
215
 
192
- 1. **Create an issue immediately**: Use `bd create` to document the problem as soon as it's discovered
216
+ 1. **Create an issue immediately**: Use `pb create` or `bd --no-db create` to document the problem as soon as it's discovered
193
217
  2. **Err on the side of creating issues**: Better to have tracked issues than forgotten problems
194
- 3. **Link to relevant epics**: Use `bd dep add <epic-id> <issue-id>` to link the new issue to related epics
218
+ 3. **Link to relevant epics**: Use `pb dep add <epic-id> <issue-id>` or
219
+ `bd --no-db dep add <epic-id> <issue-id>` to link the new issue to related epics
195
220
  4. **Don't let issues block current work**: If the discovered issue isn't critical, create it and continue with the current task
196
221
  5. **Document what was found**: Include enough detail in the issue description for someone else (or future you) to understand the problem
197
222
 
@@ -226,4 +251,3 @@ Examples of when to create issues:
226
251
  5. **Await approval** - When epic/issue is complete, wait for explicit confirmation before merging to main
227
252
 
228
253
  Whenever you create new branches or worktrees, hold off on merging them until you get my explicit approval.
229
-