claude-team-mcp 0.8.0__tar.gz → 0.9.0__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.
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.pebbles/events.jsonl +46 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.pebbles/pebbles.db +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/CHANGELOG.md +27 -1
- claude_team_mcp-0.9.0/PKG-INFO +565 -0
- claude_team_mcp-0.9.0/README.md +534 -0
- claude_team_mcp-0.9.0/docs/design/unified-worker-state.md +190 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/pyproject.toml +1 -1
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/config.py +12 -3
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/config_cli.py +7 -0
- claude_team_mcp-0.9.0/src/claude_team_mcp/registry.py +817 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/server.py +75 -1
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/terminal_backends/tmux.py +7 -9
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/__init__.py +2 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/list_workers.py +34 -6
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/poll_worker_changes.py +8 -1
- claude_team_mcp-0.9.0/src/claude_team_mcp/tools/worker_events.py +273 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/worktree.py +2 -2
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_config.py +46 -2
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_config_cli.py +36 -0
- claude_team_mcp-0.9.0/tests/test_poll_worker_changes.py +62 -0
- claude_team_mcp-0.9.0/tests/test_recover_from_events.py +705 -0
- claude_team_mcp-0.9.0/tests/test_recovered_session.py +313 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_registry.py +40 -0
- claude_team_mcp-0.9.0/tests/test_startup_recovery.py +413 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_tmux_backend.py +27 -0
- claude_team_mcp-0.9.0/tests/test_worker_events.py +539 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/uv.lock +1 -1
- claude_team_mcp-0.8.0/PKG-INFO +0 -427
- claude_team_mcp-0.8.0/README.md +0 -396
- claude_team_mcp-0.8.0/src/claude_team_mcp/registry.py +0 -443
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.claude/settings.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.claude/settings.local.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.claude-plugin/marketplace.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.claude-plugin/plugin.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.gitattributes +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.gitignore +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.mcp.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.pebbles/.gitignore +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/.pebbles/config.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/AGENTS.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/CLAUDE.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/HAPPY_INTEGRATION_RESEARCH.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/Makefile +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/NOTES.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/commands/check-workers.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/commands/cleanup-worktrees.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/commands/merge-worker.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/commands/pr-worker.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/commands/spawn-workers.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/commands/team-summary.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/config/mcporter.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/docs/ISSUE_TRACKER_ABSTRACTION.md +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/scripts/install-commands.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/scripts/team-status.sh +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/settings.json +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team/events.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team/idle_detection.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team/poller.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/__main__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/cli_backends/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/cli_backends/base.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/cli_backends/claude.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/cli_backends/codex.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/colors.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/formatting.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/idle_detection.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/issue_tracker/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/iterm_utils.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/names.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/profile.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/schemas/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/schemas/codex.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/session_state.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/subprocess_cache.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/terminal_backends/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/terminal_backends/base.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/terminal_backends/iterm.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/adopt_worker.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/annotate_worker.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/check_idle_workers.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/close_workers.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/discover_workers.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/examine_worker.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/issue_tracker_help.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/list_worktrees.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/message_workers.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/read_worker_logs.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/spawn_workers.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/tools/wait_idle_workers.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/utils/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/utils/constants.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/utils/errors.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/utils/worktree_detection.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/src/claude_team_mcp/worker_prompt.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/__init__.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/conftest.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_cli_backends.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_codex_schema.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_colors.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_events.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_formatting.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_idle_detection.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_idle_detection_module.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_issue_tracker.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_issue_tracker_integration.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_iterm_utils.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_names.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_poller.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_session_state.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_spawn_workers_defaults.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_terminal_backends.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_worker_prompt.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_worktree.py +0 -0
- {claude_team_mcp-0.8.0 → claude_team_mcp-0.9.0}/tests/test_worktree_detection.py +0 -0
|
@@ -182,3 +182,49 @@
|
|
|
182
182
|
{"type":"create","timestamp":"2026-01-30T17:41:16.111959Z","issue_id":"cic-345","payload":{"description":"Currently the tmux backend uses a single global 'claude-team' session for all workers. Instead, create a separate tmux session per project path. This makes it easier to monitor workers by project when using tmux locally.\n\nScope: investigate current session naming, identify all touch points, propose naming scheme, assess impact on discovery/adoption/cleanup.","priority":"2","title":"Per-project tmux sessions instead of global claude-team session","type":"task"}}
|
|
183
183
|
{"type":"status_update","timestamp":"2026-01-30T17:45:04.28959Z","issue_id":"cic-345","payload":{"status":"in_progress"}}
|
|
184
184
|
{"type":"close","timestamp":"2026-01-30T17:52:20.629185Z","issue_id":"cic-345","payload":{}}
|
|
185
|
+
{"type":"create","timestamp":"2026-01-31T16:47:58.166575Z","issue_id":"cic-bbd","payload":{"description":"## Problem\n\nTwo disconnected views of worker state:\n\n1. **list_workers (MCP)** — in-memory SessionRegistry, wiped on restart. No persistence.\n2. **Event log (events.jsonl)** — persistent lifecycle events, but no MCP query API. External consumers resort to shell scripts to parse it.\n\nAfter restart, list_workers returns empty even if workers are alive. Event log has history but no programmatic access.\n\n## Proposed Solution (Option C)\n\n### Part 1: Enhance list_workers with event log recovery\n- On startup, reconstruct known worker state from event log snapshots\n- list_workers becomes single source of truth for current state\n\n### Part 2: New worker_events MCP tool\n- Wraps read_events_since() as MCP tool\n- Returns state transitions, completions, stuck workers\n- Supersedes closed cic-467 (poll_worker_changes)\n\n## Context\n- events.py has read_events_since(), get_latest_snapshot() — not wired to MCP\n- Registry has tmux adoption but doesn't use event log for recovery\n- Monitoring agents currently shell out to parse events.jsonl directly","priority":"1","title":"Unified worker state API — merge registry + event log","type":"feature"}}
|
|
186
|
+
{"type":"status_update","timestamp":"2026-01-31T16:48:32.350157Z","issue_id":"cic-bbd","payload":{"status":"in_progress"}}
|
|
187
|
+
{"type":"close","timestamp":"2026-01-31T17:00:14.556752Z","issue_id":"cic-bbd","payload":{}}
|
|
188
|
+
{"type":"create","timestamp":"2026-01-31T17:00:32.968359Z","issue_id":"cic-68b","payload":{"description":"## Problem\n\nWhen Codex has a pending update, it shows an interactive TUI prompt (Update now / Skip / Skip until next version) that blocks the session from becoming interactive. The claude-team spawn logic times out at 30s waiting for Codex to be ready, but the prompt is sitting there waiting for user input.\n\nThis is a silent failure — the server logs show a timeout but there's no indication it's an update prompt specifically.\n\n## Immediate Workaround\n\nSet `check_for_update_on_startup = false` in `~/.codex/config.toml`. Done for Josh's machine.\n\n## Proposed Solution for claude-team\n\n### Option A: Detect and auto-dismiss (recommended)\nAfter spawning Codex in tmux, scrape the pane for update prompt indicators (e.g. 'Update now', 'Skip until next version') and send key '2' (Skip) automatically. This keeps the user's codex up-to-date awareness while not blocking automation.\n\n### Option B: Set env/config to suppress\nHave claude-team set an env var or write a temporary config overlay that disables the update check for spawned workers. Codex supports `check_for_update_on_startup = false` in config.toml.\n\n### Option C: Document and warn\nAdd to spawn_workers output a warning when Codex times out, suggesting the config flag.\n\n## Context\n- Codex source: `codex-rs/tui/src/update_prompt.rs` — uses `get_upgrade_version_for_popup(config)`\n- Config flag: `check_for_update_on_startup` (defaults true)\n- Dismiss mechanism: option 3 persists to `~/.codex/version.json` dismissed_version field\n- The prompt accepts key inputs: 1=Update, 2=Skip, 3=Skip until next version, Esc=Skip","priority":"1","title":"Handle Codex update prompt blocking worker spawn","type":"bug"}}
|
|
189
|
+
{"type":"status_update","timestamp":"2026-01-31T22:34:51.762832Z","issue_id":"cic-bbd","payload":{"status":"open"}}
|
|
190
|
+
{"type":"update","timestamp":"2026-01-31T22:34:51.762832Z","issue_id":"cic-bbd","payload":{"type":"epic"}}
|
|
191
|
+
{"type":"create","timestamp":"2026-01-31T22:35:00.158594Z","issue_id":"cic-fd1","payload":{"description":"Create a lightweight RecoveredSession type in registry.py that represents sessions restored from the event log.\n\n## Requirements\n- Fields: session_id, name, project_path, terminal_id, agent_type, status, last_activity, created_at\n- Implement to_dict() matching ManagedSession output format\n- Add source field: 'event_log' (vs 'registry' for live sessions)\n- Add event_state field: 'idle' | 'active' | 'closed'\n- Add recovered_at and last_event_ts timestamps\n- is_idle() should return based on snapshot state only (no JSONL access)\n\n## State Mapping\n- event state 'idle' -\u003e SessionStatus.READY\n- event state 'active' -\u003e SessionStatus.BUSY\n- event state 'closed' -\u003e new or virtual status\n\n## Files\n- src/claude_team_mcp/registry.py\n\n## Design Doc\ndocs/design/unified-worker-state.md — 'Recovered session representation' section","priority":"1","title":"RecoveredSession dataclass","type":"task"}}
|
|
192
|
+
{"type":"create","timestamp":"2026-01-31T22:35:07.170878Z","issue_id":"cic-169","payload":{"description":"Add a recovery method to SessionRegistry that merges event log state into the registry without overwriting live sessions.\n\n## Signature\nrecover_from_events(snapshot: dict | None, events: list[WorkerEvent]) -\u003e RecoveryReport\n\n## Behavior\n- Input: output of get_latest_snapshot() + read_events_since(snapshot_ts)\n- If session already exists in registry, skip (don't override live state)\n- If session only in event log, create RecoveredSession entry\n- If session closed by events, mark closed in recovered state\n- Return RecoveryReport with counts (added, skipped, closed)\n\n## Integration\n- list_all() should return merged list of ManagedSession + RecoveredSession\n- list_by_status() should include recovered entries\n\n## Dependencies\n- Depends on: cic-fd1 (RecoveredSession dataclass)\n\n## Files\n- src/claude_team_mcp/registry.py\n\n## Design Doc\ndocs/design/unified-worker-state.md — 'Proposed recovery entry point' section","priority":"1","title":"SessionRegistry.recover_from_events() method","type":"task"}}
|
|
193
|
+
{"type":"create","timestamp":"2026-01-31T22:35:13.527812Z","issue_id":"cic-80f","payload":{"description":"Wire recover_from_events() into server startup so list_workers returns useful data after restart.\n\n## Approach\n- Eager recovery at startup: call get_latest_snapshot() + read_events_since() and feed into registry.recover_from_events()\n- Add lazy fallback in list_workers: if registry is empty on first call, attempt recovery\n- Log recovery results (added/skipped/closed counts)\n\n## Integration Point\n- Server lifespan in src/claude_team_mcp/server.py (AppContext setup)\n\n## Dependencies\n- Depends on: cic-169 (recover_from_events method)\n\n## Files\n- src/claude_team_mcp/server.py\n\n## Design Doc\ndocs/design/unified-worker-state.md — 'Recovery timing' section","priority":"1","title":"Startup recovery — seed registry from event log on boot","type":"task"}}
|
|
194
|
+
{"type":"create","timestamp":"2026-01-31T22:35:20.470243Z","issue_id":"cic-22e","payload":{"description":"New MCP tool exposing event log queries. Supersedes closed cic-467.\n\n## Tool Signature\nworker_events(\n since: str | None = None,\n limit: int = 1000,\n include_snapshot: bool = False,\n include_summary: bool = False,\n stale_threshold_minutes: int = 10,\n project_filter: str | None = None,\n) -\u003e dict\n\n## Response Shape\n{\n events: [{ts, type, worker_id, data}],\n count: N,\n summary: {started, closed, idle, active, stuck, last_event_ts}, // if include_summary\n snapshot: {ts, data} // if include_snapshot\n}\n\n## Summary Semantics\n- started/closed/idle/active: lists from event window\n- stuck: active workers with last_activity \u003e stale_threshold_minutes\n- last_event_ts: newest event timestamp\n\n## Implementation\n- Wraps events.read_events_since() and events.get_latest_snapshot()\n- New file: src/claude_team_mcp/tools/worker_events.py\n- Register in src/claude_team_mcp/tools/__init__.py\n\n## Design Doc\ndocs/design/unified-worker-state.md — 'Part 2' section","priority":"1","title":"worker_events MCP tool","type":"task"}}
|
|
195
|
+
{"type":"create","timestamp":"2026-01-31T22:35:26.908995Z","issue_id":"cic-71d","payload":{"description":"Extend list_workers output with provenance fields so clients can distinguish live vs recovered sessions.\n\n## New Fields in Worker Output\n- source: 'registry' | 'event_log'\n- event_state: 'idle' | 'active' | 'closed' (only for recovered entries)\n- recovered_at: ISO timestamp (only for recovered entries)\n- last_event_ts: ISO timestamp of last applied event (only for recovered entries)\n\n## Backward Compatibility\n- Existing fields (status, session_id, name, etc.) unchanged\n- New fields are additive only\n- Live sessions get source='registry', no event_state/recovered_at fields\n\n## Dependencies\n- Depends on: cic-fd1 (RecoveredSession with these fields)\n\n## Files\n- src/claude_team_mcp/tools/list_workers.py","priority":"2","title":"list_workers: add source and event_state fields","type":"task"}}
|
|
196
|
+
{"type":"create","timestamp":"2026-01-31T22:35:34.422147Z","issue_id":"cic-c8e","payload":{"description":"Comprehensive tests for the unified worker state feature.\n\n## Test Cases\n\n### RecoveredSession\n- Construction from snapshot data\n- to_dict() output matches expected format\n- State mapping (idle-\u003eready, active-\u003ebusy, closed)\n- is_idle() returns snapshot-based state\n\n### recover_from_events()\n- Recovery from snapshot only (no events)\n- Recovery from snapshot + events\n- Live sessions not overwritten\n- Closed sessions marked correctly\n- Empty snapshot/events returns empty recovery\n- RecoveryReport counts are accurate\n\n### Startup recovery\n- Server startup seeds registry from event log\n- Lazy fallback triggers on empty registry\n\n### worker_events tool\n- Basic since/limit filtering\n- include_snapshot flag\n- include_summary with stuck detection\n- project_filter\n- Empty event log returns empty result\n\n## Dependencies\n- Depends on: cic-fd1, cic-169, cic-80f, cic-22e","priority":"1","title":"Tests for recovery + worker_events","type":"task"}}
|
|
197
|
+
{"type":"rename","timestamp":"2026-01-31T22:35:46.410975Z","issue_id":"cic-fd1","payload":{"new_id":"cic-bbd.1"}}
|
|
198
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:46.410983Z","issue_id":"cic-bbd.1","payload":{"dep_type":"parent-child","depends_on":"cic-bbd"}}
|
|
199
|
+
{"type":"rename","timestamp":"2026-01-31T22:35:46.475283Z","issue_id":"cic-169","payload":{"new_id":"cic-bbd.2"}}
|
|
200
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:46.47529Z","issue_id":"cic-bbd.2","payload":{"dep_type":"parent-child","depends_on":"cic-bbd"}}
|
|
201
|
+
{"type":"rename","timestamp":"2026-01-31T22:35:46.547381Z","issue_id":"cic-80f","payload":{"new_id":"cic-bbd.3"}}
|
|
202
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:46.547389Z","issue_id":"cic-bbd.3","payload":{"dep_type":"parent-child","depends_on":"cic-bbd"}}
|
|
203
|
+
{"type":"rename","timestamp":"2026-01-31T22:35:46.776865Z","issue_id":"cic-22e","payload":{"new_id":"cic-bbd.4"}}
|
|
204
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:46.776871Z","issue_id":"cic-bbd.4","payload":{"dep_type":"parent-child","depends_on":"cic-bbd"}}
|
|
205
|
+
{"type":"rename","timestamp":"2026-01-31T22:35:47.05952Z","issue_id":"cic-71d","payload":{"new_id":"cic-bbd.5"}}
|
|
206
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:47.059527Z","issue_id":"cic-bbd.5","payload":{"dep_type":"parent-child","depends_on":"cic-bbd"}}
|
|
207
|
+
{"type":"rename","timestamp":"2026-01-31T22:35:47.216144Z","issue_id":"cic-c8e","payload":{"new_id":"cic-bbd.6"}}
|
|
208
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:47.216151Z","issue_id":"cic-bbd.6","payload":{"dep_type":"parent-child","depends_on":"cic-bbd"}}
|
|
209
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:52.361655Z","issue_id":"cic-bbd.2","payload":{"dep_type":"blocks","depends_on":"cic-bbd.1"}}
|
|
210
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:52.436176Z","issue_id":"cic-bbd.3","payload":{"dep_type":"blocks","depends_on":"cic-bbd.2"}}
|
|
211
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:52.519314Z","issue_id":"cic-bbd.5","payload":{"dep_type":"blocks","depends_on":"cic-bbd.1"}}
|
|
212
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:52.717406Z","issue_id":"cic-bbd.6","payload":{"dep_type":"blocks","depends_on":"cic-bbd.1"}}
|
|
213
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:52.91719Z","issue_id":"cic-bbd.6","payload":{"dep_type":"blocks","depends_on":"cic-bbd.2"}}
|
|
214
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:53.301899Z","issue_id":"cic-bbd.6","payload":{"dep_type":"blocks","depends_on":"cic-bbd.3"}}
|
|
215
|
+
{"type":"dep_add","timestamp":"2026-01-31T22:35:53.507305Z","issue_id":"cic-bbd.6","payload":{"dep_type":"blocks","depends_on":"cic-bbd.4"}}
|
|
216
|
+
{"type":"status_update","timestamp":"2026-01-31T22:53:29.845364Z","issue_id":"cic-bbd.1","payload":{"status":"in_progress"}}
|
|
217
|
+
{"type":"status_update","timestamp":"2026-01-31T22:53:31.744371Z","issue_id":"cic-bbd.4","payload":{"status":"in_progress"}}
|
|
218
|
+
{"type":"close","timestamp":"2026-01-31T22:55:03.007686Z","issue_id":"cic-bbd.4","payload":{}}
|
|
219
|
+
{"type":"close","timestamp":"2026-01-31T22:55:09.910056Z","issue_id":"cic-bbd.1","payload":{}}
|
|
220
|
+
{"type":"status_update","timestamp":"2026-02-01T00:03:44.3476Z","issue_id":"cic-bbd.5","payload":{"status":"in_progress"}}
|
|
221
|
+
{"type":"status_update","timestamp":"2026-02-01T00:03:49.271441Z","issue_id":"cic-bbd.2","payload":{"status":"in_progress"}}
|
|
222
|
+
{"type":"close","timestamp":"2026-02-01T00:05:11.852731Z","issue_id":"cic-bbd.5","payload":{}}
|
|
223
|
+
{"type":"close","timestamp":"2026-02-01T00:06:14.749225Z","issue_id":"cic-bbd.2","payload":{}}
|
|
224
|
+
{"type":"status_update","timestamp":"2026-02-01T00:14:33.94628Z","issue_id":"cic-bbd.3","payload":{"status":"in_progress"}}
|
|
225
|
+
{"type":"close","timestamp":"2026-02-01T00:16:29.352825Z","issue_id":"cic-bbd.3","payload":{}}
|
|
226
|
+
{"type":"status_update","timestamp":"2026-02-01T01:37:20.777219Z","issue_id":"cic-bbd.6","payload":{"status":"in_progress"}}
|
|
227
|
+
{"type":"close","timestamp":"2026-02-01T01:40:51.835629Z","issue_id":"cic-bbd.6","payload":{}}
|
|
228
|
+
{"type":"create","timestamp":"2026-02-02T23:29:52.330658Z","issue_id":"cic-ebd","payload":{"description":"tmux_session_name_for_project() hashes the full project_path. Worktree paths produce unique hashes, creating one tmux session per worker instead of one per project. Fix: resolve worktree paths to main repo before hashing.","priority":"1","title":"tmux: worktree paths create separate sessions instead of sharing per-project session","type":"bug"}}
|
|
229
|
+
{"type":"status_update","timestamp":"2026-02-02T23:30:32.877924Z","issue_id":"cic-ebd","payload":{"status":"in_progress"}}
|
|
230
|
+
{"type":"close","timestamp":"2026-02-02T23:33:33.785116Z","issue_id":"cic-ebd","payload":{}}
|
|
Binary file
|
|
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.0] - 2026-02-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Event log recovery**: On startup, the registry reconstructs worker state from `events.jsonl`. `list_workers` now shows all known workers (live + recovered) instead of returning empty after restart.
|
|
14
|
+
- `RecoveredSession` dataclass for restored workers (read-only, no terminal handle)
|
|
15
|
+
- `RecoveryReport` with counts of added/skipped/closed sessions
|
|
16
|
+
- Eager recovery at boot + lazy fallback in `list_workers`
|
|
17
|
+
- **`worker_events` MCP tool**: Query the event log programmatically with timestamp filters, summaries, stuck worker detection, and project filtering. Replaces shell-script parsing of `events.jsonl`.
|
|
18
|
+
- **`stale_threshold_minutes` config**: Configurable via `~/.claude-team/config.json` (`events.stale_threshold_minutes`, default: 10). `poll_worker_changes` reads from config when param not passed, tool param overrides.
|
|
19
|
+
- **`source` field in `list_workers`**: Distinguishes `"registry"` (live) vs `"event_log"` (recovered) workers.
|
|
20
|
+
- 98 new tests across 6 test files for recovery, worker_events, config, and poll_worker_changes.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **README**: Comprehensive rewrite — documents tmux backend, config file, Codex support, `poll_worker_changes`, HTTP mode, correct worktree paths, updated architecture diagram.
|
|
24
|
+
|
|
25
|
+
## [0.8.2] - 2026-02-02
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
- **tmux session naming**: Worktree paths no longer create separate tmux sessions per worker. Removed hash from session names — format is now `claude-team-{slug}` (e.g. `claude-team-pagedrop-infra`). All workers for the same project share one tmux session with separate windows.
|
|
29
|
+
|
|
10
30
|
## [0.8.0] - 2026-01-30
|
|
11
31
|
|
|
12
32
|
### Added
|
|
@@ -124,7 +144,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
124
144
|
- Worker monitoring and log reading
|
|
125
145
|
- Basic MCP server implementation
|
|
126
146
|
|
|
127
|
-
[Unreleased]: https://github.com/Martian-Engineering/claude-team/compare/v0.
|
|
147
|
+
[Unreleased]: https://github.com/Martian-Engineering/claude-team/compare/v0.9.0...HEAD
|
|
148
|
+
[0.9.0]: https://github.com/Martian-Engineering/claude-team/compare/v0.8.2...v0.9.0
|
|
149
|
+
[0.8.2]: https://github.com/Martian-Engineering/claude-team/compare/v0.8.0...v0.8.2
|
|
150
|
+
[0.8.0]: https://github.com/Martian-Engineering/claude-team/compare/v0.7.0...v0.8.0
|
|
151
|
+
[0.7.0]: https://github.com/Martian-Engineering/claude-team/compare/v0.6.1...v0.7.0
|
|
152
|
+
[0.6.1]: https://github.com/Martian-Engineering/claude-team/compare/v0.6.0...v0.6.1
|
|
153
|
+
[0.6.0]: https://github.com/Martian-Engineering/claude-team/compare/v0.5.0...v0.6.0
|
|
128
154
|
[0.5.0]: https://github.com/Martian-Engineering/claude-team/compare/v0.4.0...v0.5.0
|
|
129
155
|
[0.4.0]: https://github.com/Martian-Engineering/claude-team/compare/v0.3.2...v0.4.0
|
|
130
156
|
[0.3.2]: https://github.com/Martian-Engineering/claude-team/compare/v0.3.1...v0.3.2
|