claude-team-mcp 0.6.1__py3-none-any.whl → 0.8.0__py3-none-any.whl

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 (35) hide show
  1. claude_team/__init__.py +11 -0
  2. claude_team/events.py +501 -0
  3. claude_team/idle_detection.py +173 -0
  4. claude_team/poller.py +245 -0
  5. claude_team_mcp/cli_backends/__init__.py +4 -2
  6. claude_team_mcp/cli_backends/claude.py +45 -5
  7. claude_team_mcp/cli_backends/codex.py +44 -3
  8. claude_team_mcp/config.py +350 -0
  9. claude_team_mcp/config_cli.py +263 -0
  10. claude_team_mcp/idle_detection.py +16 -3
  11. claude_team_mcp/issue_tracker/__init__.py +68 -3
  12. claude_team_mcp/iterm_utils.py +5 -73
  13. claude_team_mcp/registry.py +43 -26
  14. claude_team_mcp/server.py +164 -61
  15. claude_team_mcp/session_state.py +364 -2
  16. claude_team_mcp/terminal_backends/__init__.py +49 -0
  17. claude_team_mcp/terminal_backends/base.py +106 -0
  18. claude_team_mcp/terminal_backends/iterm.py +251 -0
  19. claude_team_mcp/terminal_backends/tmux.py +683 -0
  20. claude_team_mcp/tools/__init__.py +4 -2
  21. claude_team_mcp/tools/adopt_worker.py +89 -32
  22. claude_team_mcp/tools/close_workers.py +39 -10
  23. claude_team_mcp/tools/discover_workers.py +176 -32
  24. claude_team_mcp/tools/list_workers.py +29 -0
  25. claude_team_mcp/tools/message_workers.py +35 -5
  26. claude_team_mcp/tools/poll_worker_changes.py +227 -0
  27. claude_team_mcp/tools/spawn_workers.py +254 -153
  28. claude_team_mcp/tools/wait_idle_workers.py +1 -0
  29. claude_team_mcp/utils/errors.py +7 -3
  30. claude_team_mcp/worktree.py +73 -12
  31. {claude_team_mcp-0.6.1.dist-info → claude_team_mcp-0.8.0.dist-info}/METADATA +1 -1
  32. claude_team_mcp-0.8.0.dist-info/RECORD +54 -0
  33. claude_team_mcp-0.6.1.dist-info/RECORD +0 -43
  34. {claude_team_mcp-0.6.1.dist-info → claude_team_mcp-0.8.0.dist-info}/WHEEL +0 -0
  35. {claude_team_mcp-0.6.1.dist-info → claude_team_mcp-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -34,7 +34,7 @@ def error_response(
34
34
  HINTS = {
35
35
  "session_not_found": (
36
36
  "Run list_workers to see available workers, or discover_workers "
37
- "to find orphaned iTerm2 sessions that can be adopted"
37
+ "to find orphaned terminal sessions that can be adopted"
38
38
  ),
39
39
  "project_path_missing": (
40
40
  "Verify the path exists. For git worktrees, check 'git worktree list'. "
@@ -44,9 +44,13 @@ HINTS = {
44
44
  "Ensure iTerm2 is running and Python API is enabled: "
45
45
  "iTerm2 → Preferences → General → Magic → Enable Python API"
46
46
  ),
47
+ "terminal_backend_required": (
48
+ "This tool only supports the iTerm2 or tmux backends. "
49
+ "Set CLAUDE_TEAM_TERMINAL_BACKEND=iterm or tmux, or run inside a supported terminal."
50
+ ),
47
51
  "registry_empty": (
48
52
  "No workers are being managed. Use spawn_workers to create new workers, "
49
- "or discover_workers to find existing Claude sessions in iTerm2"
53
+ "or discover_workers to find existing Claude sessions in a supported terminal"
50
54
  ),
51
55
  "no_jsonl_file": (
52
56
  "Claude may not have started yet or the session file doesn't exist. "
@@ -73,7 +77,7 @@ def get_session_or_error(
73
77
 
74
78
  Args:
75
79
  registry: The session registry to search
76
- session_id: ID to resolve (supports session_id, iterm_session_id, or name)
80
+ session_id: ID to resolve (supports session_id, terminal_id, or name)
77
81
 
78
82
  Returns:
79
83
  ManagedSession if found, or error dict with hint if not found
@@ -64,6 +64,20 @@ def slugify(text: str) -> str:
64
64
  return text
65
65
 
66
66
 
67
+ def short_slug(text: str, max_length: int = 30) -> str:
68
+ """
69
+ Create a slug suitable for compact identifiers.
70
+
71
+ Truncates long slugs to keep branch and directory names short,
72
+ while preserving the leading portion of the slug.
73
+ """
74
+ slug = slugify(text)
75
+ if len(slug) <= max_length:
76
+ return slug
77
+ return slug[:max_length].rstrip("-")
78
+
79
+
80
+
67
81
  def ensure_gitignore_entry(repo_path: Path, entry: str) -> bool:
68
82
  """
69
83
  Ensure an entry exists in the repository's .gitignore file.
@@ -224,11 +238,42 @@ def create_worktree(
224
238
  return worktree_path
225
239
 
226
240
 
241
+ def _resolve_worktree_base(repo_path: Path, base: str) -> str:
242
+ # Resolve base ref to a commit hash to avoid worktree-locked branch refs.
243
+ def _rev_parse(ref: str) -> Optional[str]:
244
+ result = subprocess.run(
245
+ ["git", "-C", str(repo_path), "rev-parse", "--verify", ref],
246
+ capture_output=True,
247
+ text=True,
248
+ )
249
+ if result.returncode == 0:
250
+ return result.stdout.strip()
251
+ return None
252
+
253
+ commit = _rev_parse(f"{base}^{{commit}}")
254
+ if commit:
255
+ return commit
256
+
257
+ normalized_base = base.removeprefix("refs/heads/")
258
+ try:
259
+ for worktree in list_git_worktrees(repo_path):
260
+ if worktree.get("branch") == normalized_base and worktree.get("commit"):
261
+ return worktree["commit"]
262
+ except WorktreeError:
263
+ pass
264
+
265
+ raise WorktreeError(
266
+ f"Base ref not found: {base}. Ensure it exists locally or fetch it."
267
+ )
268
+
269
+
227
270
  def create_local_worktree(
228
271
  repo_path: Path,
229
272
  worker_name: str,
230
273
  bead_id: Optional[str] = None,
231
274
  annotation: Optional[str] = None,
275
+ branch: Optional[str] = None,
276
+ base: Optional[str] = None,
232
277
  ) -> Path:
233
278
  """
234
279
  Create a git worktree in the repo's .worktrees/ directory.
@@ -237,18 +282,23 @@ def create_local_worktree(
237
282
  {repo}/.worktrees/{bead_id}-{annotation}/ (if bead_id provided)
238
283
  {repo}/.worktrees/{worker_name}-{uuid}-{annotation}/ (otherwise)
239
284
 
240
- The branch name matches the worktree directory name for consistency.
285
+ The branch name matches the worktree directory name for consistency unless
286
+ an explicit branch is provided.
241
287
  Automatically adds .worktrees to .gitignore if not present.
242
288
 
243
- If a worktree path or branch already exists, appends an incrementing
244
- suffix (-1, -2, etc.) until an available name is found. This allows
245
- multiple workers to work on the same bead in parallel.
289
+ If a generated worktree path or branch already exists, appends an
290
+ incrementing suffix (-1, -2, etc.) until an available name is found.
291
+ This allows multiple workers to work on the same bead in parallel.
292
+ When an explicit branch is provided, pre-existing branches are treated
293
+ as an error.
246
294
 
247
295
  Args:
248
296
  repo_path: Path to the main repository
249
297
  worker_name: Name of the worker (used in fallback naming)
250
298
  bead_id: Optional bead issue ID (e.g., "cic-abc123")
251
299
  annotation: Optional annotation for the worktree
300
+ branch: Optional branch name to create for the worktree
301
+ base: Optional base ref/branch for the new branch
252
302
 
253
303
  Returns:
254
304
  Path to the created worktree
@@ -319,17 +369,30 @@ def create_local_worktree(
319
369
  worktree_path = worktrees_dir / dir_name
320
370
  suffix = 0
321
371
 
322
- while worktree_path.exists() or branch_exists(dir_name):
323
- suffix += 1
324
- dir_name = f"{base_dir_name}-{suffix}"
325
- worktree_path = worktrees_dir / dir_name
372
+ if branch:
373
+ if branch_exists(branch):
374
+ raise WorktreeError(f"Branch already exists: {branch}")
375
+ while worktree_path.exists():
376
+ suffix += 1
377
+ dir_name = f"{base_dir_name}-{suffix}"
378
+ worktree_path = worktrees_dir / dir_name
379
+ branch_name = branch
380
+ else:
381
+ while worktree_path.exists() or branch_exists(dir_name):
382
+ suffix += 1
383
+ dir_name = f"{base_dir_name}-{suffix}"
384
+ worktree_path = worktrees_dir / dir_name
385
+ branch_name = dir_name
326
386
 
327
- # Branch name matches directory name for clarity
328
- branch_name = dir_name
387
+ resolved_base = None
388
+ if base:
389
+ resolved_base = _resolve_worktree_base(repo_path, base)
329
390
 
330
391
  # Build the git worktree add command.
331
392
  # Branch is guaranteed not to exist (collision loop checked for it).
332
393
  cmd = ["git", "-C", str(repo_path), "worktree", "add", "-b", branch_name, str(worktree_path)]
394
+ if resolved_base:
395
+ cmd.append(resolved_base)
333
396
 
334
397
  result = subprocess.run(cmd, capture_output=True, text=True)
335
398
 
@@ -537,5 +600,3 @@ def list_local_worktrees(repo_path: Path) -> list[dict]:
537
600
  })
538
601
 
539
602
  return worktrees
540
-
541
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-team-mcp
3
- Version: 0.6.1
3
+ Version: 0.8.0
4
4
  Summary: MCP server for managing multiple Claude Code sessions via iTerm2
5
5
  Project-URL: Homepage, https://github.com/Martian-Engineering/claude-team
6
6
  Project-URL: Repository, https://github.com/Martian-Engineering/claude-team
@@ -0,0 +1,54 @@
1
+ claude_team/__init__.py,sha256=vDgDXeillUkQr0QDv-wcscJIuSgA6lctbMQrWfxhGJ0,293
2
+ claude_team/events.py,sha256=u-IHZm35J6P_2040CvPQI1b32X79OvHwAlNp4-RJ3oY,15757
3
+ claude_team/idle_detection.py,sha256=x91HZdbp01gizTYMAY2SpMFnkJBMomgi8lSafFmRoao,5627
4
+ claude_team/poller.py,sha256=C4A6Rr_ABTC5suCGPuBhLn_-e_z5tSzSKwSYl-SERlk,8363
5
+ claude_team_mcp/__init__.py,sha256=HnGWRX1P2CxUafElaxq6zXvXznQeUF5XiQBqu9eJU0Q,481
6
+ claude_team_mcp/__main__.py,sha256=JOG9n8ZCjy3JN96T0n97Ro-ZWtOU-RTJks7ahz81NRM,134
7
+ claude_team_mcp/colors.py,sha256=f-PcPep9WkZ7zbt-IF0Ey4OXfZeiY-y2uXERFtiY8Pk,3270
8
+ claude_team_mcp/config.py,sha256=1-aJ6cYLQfEzu52CMFvUEVa3k9xOSFSAQHhQfAKB3M4,10099
9
+ claude_team_mcp/config_cli.py,sha256=2v2kXyK81p5CvBoclivSO9cmq2kQQt6H3PYOdirxwUA,8209
10
+ claude_team_mcp/formatting.py,sha256=tcBmKyaZm15nkeJfssuIMkoFQTlmwDllf7ulZvWkcv4,3831
11
+ claude_team_mcp/idle_detection.py,sha256=KRnhObbVM--S8HPowWq7UkjXxq5AMpGdVHY5UUv3Z0o,16331
12
+ claude_team_mcp/iterm_utils.py,sha256=Imp4yUwq06avwdEw3bOSaO168DpCUveazc71Q8AZOFw,37621
13
+ claude_team_mcp/names.py,sha256=qUJlO2WlFjxB4Q1vLLTcEjTvKA63fJ3i2QBz80ABgnQ,15978
14
+ claude_team_mcp/profile.py,sha256=yqytAE0dIe6NQ6FodldSepO-ZIeR7-C0UfK3FsO7Pn4,12326
15
+ claude_team_mcp/registry.py,sha256=LWOoXxZ2VUhY-qZbKM0riCGrDdC1EbIKrKNprafUZNY,14945
16
+ claude_team_mcp/server.py,sha256=Yblf5W2VpYcNitWN-iacF_zHcF35_7DZ-z-bg0MJtbQ,16363
17
+ claude_team_mcp/session_state.py,sha256=DFNPWog7yyc5yF1_lMhDMcBMpCRGi22YRI6IdoIEf0o,46814
18
+ claude_team_mcp/subprocess_cache.py,sha256=6Q1NIMn2X5_75S4s_a9iPBka-UCz6RW0EMxPSPEaLxo,3612
19
+ claude_team_mcp/worker_prompt.py,sha256=NvzUrR6Zqjp8HuL-xOeAncdvACHbyN7O0nISWyySHq4,15771
20
+ claude_team_mcp/worktree.py,sha256=DWC4wOb6JH278wCdDE1-UKnIt6zpuHNsbUx8HSyLl1w,19096
21
+ claude_team_mcp/cli_backends/__init__.py,sha256=uPIiZ0nxzhtunMfdwfWoNmLIUb7YMaWzoaFaECChKFU,1128
22
+ claude_team_mcp/cli_backends/base.py,sha256=dArm2Yqjzs3smN0JpSGR79e9I_kQYJFgQ8gYpNrmS-o,3923
23
+ claude_team_mcp/cli_backends/claude.py,sha256=r9CW-JHZ3nVEadjf6W0AQ2Ypt4wGCvqSKczl3cRu0MY,4312
24
+ claude_team_mcp/cli_backends/codex.py,sha256=bQvHZFfivF8Oe92gX_3qHDeaHfABDYTjqNg_6aSMido,4479
25
+ claude_team_mcp/issue_tracker/__init__.py,sha256=88wN3ZUUZcSh_lK2jncWH546dYXATY0FShRpAczjAQs,6101
26
+ claude_team_mcp/schemas/__init__.py,sha256=IingbdgdQx9C0ZLBOhZ-doqIJRbO7aeAQjuCHMuVA84,99
27
+ claude_team_mcp/schemas/codex.py,sha256=KwUkTmD70kQLZvzl366tHAsuwKbtsk86ySTOW6b9wDk,5949
28
+ claude_team_mcp/terminal_backends/__init__.py,sha256=qH8JHQPiyisO1LPOLq6aHxGMJv_TU04uR_88k6CZw20,1351
29
+ claude_team_mcp/terminal_backends/base.py,sha256=9GrFDm-Jah8y6DALQrq8dei9UgWeZkWXYbbcrfkFAHA,3202
30
+ claude_team_mcp/terminal_backends/iterm.py,sha256=A5klhOpzDrZ-636aN1Hlnnfxk4OA-Rz_OuaQi1ABz0Y,9317
31
+ claude_team_mcp/terminal_backends/tmux.py,sha256=2wZmKbJOYoAx2AwdA9iWoVrP17i9nDfrznSTGrsq0g4,24546
32
+ claude_team_mcp/tools/__init__.py,sha256=YPKaGC81WDHouee6MQlVOhk2teI0adYvbo949LCCKd0,1593
33
+ claude_team_mcp/tools/adopt_worker.py,sha256=P4HlUaKqS5piOh-0Or27h935WRtkfEXtznCZ_cQF1j4,6897
34
+ claude_team_mcp/tools/annotate_worker.py,sha256=mBo4YMaaaNQxQBduYK1DPA-Ioift-ZQ9tYlBM6S15t8,1639
35
+ claude_team_mcp/tools/check_idle_workers.py,sha256=IjDNDeal9M7lTONWjKZrt8bXu7O277ossHz_2oyLRcY,3374
36
+ claude_team_mcp/tools/close_workers.py,sha256=MlxyEKkDBJEP3FXY8ESQ1x7cjulzJi-fVNCsC4Z2Aig,7878
37
+ claude_team_mcp/tools/discover_workers.py,sha256=wR2wEPRG1jggYuWJhEqC1Sw5ZrOrm9gwgOxEY4HFTD8,11830
38
+ claude_team_mcp/tools/examine_worker.py,sha256=7Nd3EOdsGVDjMJ8ov9NhmcrjN8K9IE4i_noXHOP1uI8,1620
39
+ claude_team_mcp/tools/issue_tracker_help.py,sha256=KxgjFhXp3NCUDjqTl3UnIiFV-Y5DM80C1EoZXfA82QM,1668
40
+ claude_team_mcp/tools/list_workers.py,sha256=EqKXNsVH-eOmmE6YpVwgXacA7sf3nqarKETKDcdcomg,3710
41
+ claude_team_mcp/tools/list_worktrees.py,sha256=_EIwpwoCMLaQh4dHws-jO53MS-E-L7hC7oPT7xC26lw,3665
42
+ claude_team_mcp/tools/message_workers.py,sha256=pWZYcbDyezrNeWrkmFcLHROWtJqKmKaXgvd7aj8-h3Y,13260
43
+ claude_team_mcp/tools/poll_worker_changes.py,sha256=xR2yeSPnM7fjKxst-DFfF4sec6wBcy_Q-V-A8iTElYQ,7770
44
+ claude_team_mcp/tools/read_worker_logs.py,sha256=9gccM6MSaoxu97Xjsk7nUalLEU8XHV7r3SKggBRpNww,5913
45
+ claude_team_mcp/tools/spawn_workers.py,sha256=Md5EsEq5rhXx1WweabX8lPN-em2_s3h1C1xmYezrqS8,37723
46
+ claude_team_mcp/tools/wait_idle_workers.py,sha256=EAPBinBsrRtisADQJZQGPHR8CAIB6lYrXMe5DmeMciM,5279
47
+ claude_team_mcp/utils/__init__.py,sha256=Jyc-N1RXZnMdXLjSgRBB2ih04v-h0woUzZcVYYfc7wQ,647
48
+ claude_team_mcp/utils/constants.py,sha256=FGDHeo0reZ89365fuXJGIl2Y5MFQAoKfWtmYr7UQzhQ,5815
49
+ claude_team_mcp/utils/errors.py,sha256=kP0MPjLIpEOZkbGAzDxonMFERbsjwfID5VVY5qAR2II,2949
50
+ claude_team_mcp/utils/worktree_detection.py,sha256=oMGcb7p1jvr7qWs06sxUMTAV8jRialcVqziCTCdW7XU,3251
51
+ claude_team_mcp-0.8.0.dist-info/METADATA,sha256=q3pjXtrqgdBpasJSMSEvOimny_-D5rNd6xZu33R-VsY,16020
52
+ claude_team_mcp-0.8.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
53
+ claude_team_mcp-0.8.0.dist-info/entry_points.txt,sha256=cmk5dmK50RVquExT-k_J72akl3qKIerPpVqfit7kQtQ,53
54
+ claude_team_mcp-0.8.0.dist-info/RECORD,,
@@ -1,43 +0,0 @@
1
- claude_team_mcp/__init__.py,sha256=HnGWRX1P2CxUafElaxq6zXvXznQeUF5XiQBqu9eJU0Q,481
2
- claude_team_mcp/__main__.py,sha256=JOG9n8ZCjy3JN96T0n97Ro-ZWtOU-RTJks7ahz81NRM,134
3
- claude_team_mcp/colors.py,sha256=f-PcPep9WkZ7zbt-IF0Ey4OXfZeiY-y2uXERFtiY8Pk,3270
4
- claude_team_mcp/formatting.py,sha256=tcBmKyaZm15nkeJfssuIMkoFQTlmwDllf7ulZvWkcv4,3831
5
- claude_team_mcp/idle_detection.py,sha256=_bYN6-43q0Klt64oOPQWY2QCtGOCdeD5j4_c3L0nf20,15869
6
- claude_team_mcp/iterm_utils.py,sha256=XeCVogj5kf8pBLhPtWb7nHaPKJ3R6-adND_rXf7ccmI,40248
7
- claude_team_mcp/names.py,sha256=qUJlO2WlFjxB4Q1vLLTcEjTvKA63fJ3i2QBz80ABgnQ,15978
8
- claude_team_mcp/profile.py,sha256=yqytAE0dIe6NQ6FodldSepO-ZIeR7-C0UfK3FsO7Pn4,12326
9
- claude_team_mcp/registry.py,sha256=y14ggF7qCia-xYYWJZhTsUAnBn5fFEkS7LspfEwhGQI,14399
10
- claude_team_mcp/server.py,sha256=oOYWVJo0-P0izs1wyxeouK1MJP16-P5djRZH8trSrqM,12726
11
- claude_team_mcp/session_state.py,sha256=OcViByS05afdiCrBNRLR9qKrAn77H-2ALTe7yHfUUDs,34837
12
- claude_team_mcp/subprocess_cache.py,sha256=6Q1NIMn2X5_75S4s_a9iPBka-UCz6RW0EMxPSPEaLxo,3612
13
- claude_team_mcp/worker_prompt.py,sha256=NvzUrR6Zqjp8HuL-xOeAncdvACHbyN7O0nISWyySHq4,15771
14
- claude_team_mcp/worktree.py,sha256=s5X4mePVb4AlPzYsTklLGKgLD-4GJX1iokpsF6WwrdU,17015
15
- claude_team_mcp/cli_backends/__init__.py,sha256=9lpklc5lGWn-AdHoVqFMHau3UgzsN276grC1istHI2k,1038
16
- claude_team_mcp/cli_backends/base.py,sha256=dArm2Yqjzs3smN0JpSGR79e9I_kQYJFgQ8gYpNrmS-o,3923
17
- claude_team_mcp/cli_backends/claude.py,sha256=5axMph_IX-wX-DMulq0B_xQ3mVbhlwZjIi_WqjQwyL4,3268
18
- claude_team_mcp/cli_backends/codex.py,sha256=OTTAw9P4EKBggGmKK32-BYQkF7jpfZSOiIfa77wxG1Q,3408
19
- claude_team_mcp/issue_tracker/__init__.py,sha256=JYcVEdXkqDKXd9BAUoz3emYyZ9bvVRsuTB7Vxfw3jhU,3792
20
- claude_team_mcp/schemas/__init__.py,sha256=IingbdgdQx9C0ZLBOhZ-doqIJRbO7aeAQjuCHMuVA84,99
21
- claude_team_mcp/schemas/codex.py,sha256=KwUkTmD70kQLZvzl366tHAsuwKbtsk86ySTOW6b9wDk,5949
22
- claude_team_mcp/tools/__init__.py,sha256=qILDACyNju45dX19QOmtCnVlRWCfGx7y96h5aJ_J5OU,1506
23
- claude_team_mcp/tools/adopt_worker.py,sha256=oWSamOzOqnLPWADWb4tk7qSPHroxIhQXkFDnhy_EOkw,4560
24
- claude_team_mcp/tools/annotate_worker.py,sha256=mBo4YMaaaNQxQBduYK1DPA-Ioift-ZQ9tYlBM6S15t8,1639
25
- claude_team_mcp/tools/check_idle_workers.py,sha256=IjDNDeal9M7lTONWjKZrt8bXu7O277ossHz_2oyLRcY,3374
26
- claude_team_mcp/tools/close_workers.py,sha256=glVUNM5Q32z8DyzvNKpxExN9pDR16rzjuyzEjI-eInM,6633
27
- claude_team_mcp/tools/discover_workers.py,sha256=PkdnURZBex_y0kFx_pv-EgWrEbtQtsg5TjqycNs7BJI,5437
28
- claude_team_mcp/tools/examine_worker.py,sha256=7Nd3EOdsGVDjMJ8ov9NhmcrjN8K9IE4i_noXHOP1uI8,1620
29
- claude_team_mcp/tools/issue_tracker_help.py,sha256=KxgjFhXp3NCUDjqTl3UnIiFV-Y5DM80C1EoZXfA82QM,1668
30
- claude_team_mcp/tools/list_workers.py,sha256=6cvsgHOYtakkSgoZdYez4VEQ3I8aWAKaGWhfiZyPf2c,2390
31
- claude_team_mcp/tools/list_worktrees.py,sha256=_EIwpwoCMLaQh4dHws-jO53MS-E-L7hC7oPT7xC26lw,3665
32
- claude_team_mcp/tools/message_workers.py,sha256=02XAE2EsJkkcZdmjaxQRiyUhAFTN4uB8kYzSkOwbxk0,12220
33
- claude_team_mcp/tools/read_worker_logs.py,sha256=9gccM6MSaoxu97Xjsk7nUalLEU8XHV7r3SKggBRpNww,5913
34
- claude_team_mcp/tools/spawn_workers.py,sha256=A08erciMM-q0TCPaFeVn6KvtVerIWdlbm6bH7P_E5G8,32366
35
- claude_team_mcp/tools/wait_idle_workers.py,sha256=ITnhBiJYCgkz-DGJaYouAyTDh6cPIL_9RrptqC_xHu0,5232
36
- claude_team_mcp/utils/__init__.py,sha256=Jyc-N1RXZnMdXLjSgRBB2ih04v-h0woUzZcVYYfc7wQ,647
37
- claude_team_mcp/utils/constants.py,sha256=FGDHeo0reZ89365fuXJGIl2Y5MFQAoKfWtmYr7UQzhQ,5815
38
- claude_team_mcp/utils/errors.py,sha256=9uPFHp7UJYB5t3p7P_5Sh3PVpYh4_vj_RLzX5GcJPEU,2738
39
- claude_team_mcp/utils/worktree_detection.py,sha256=oMGcb7p1jvr7qWs06sxUMTAV8jRialcVqziCTCdW7XU,3251
40
- claude_team_mcp-0.6.1.dist-info/METADATA,sha256=Au4mhF7eDsGIyGSCerEJUjPPR3fSj_1brDFL9CoC4O8,16020
41
- claude_team_mcp-0.6.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
42
- claude_team_mcp-0.6.1.dist-info/entry_points.txt,sha256=cmk5dmK50RVquExT-k_J72akl3qKIerPpVqfit7kQtQ,53
43
- claude_team_mcp-0.6.1.dist-info/RECORD,,