claude-team-mcp 0.6.1__py3-none-any.whl → 0.7.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.
@@ -224,11 +224,42 @@ def create_worktree(
224
224
  return worktree_path
225
225
 
226
226
 
227
+ def _resolve_worktree_base(repo_path: Path, base: str) -> str:
228
+ # Resolve base ref to a commit hash to avoid worktree-locked branch refs.
229
+ def _rev_parse(ref: str) -> Optional[str]:
230
+ result = subprocess.run(
231
+ ["git", "-C", str(repo_path), "rev-parse", "--verify", ref],
232
+ capture_output=True,
233
+ text=True,
234
+ )
235
+ if result.returncode == 0:
236
+ return result.stdout.strip()
237
+ return None
238
+
239
+ commit = _rev_parse(f"{base}^{{commit}}")
240
+ if commit:
241
+ return commit
242
+
243
+ normalized_base = base.removeprefix("refs/heads/")
244
+ try:
245
+ for worktree in list_git_worktrees(repo_path):
246
+ if worktree.get("branch") == normalized_base and worktree.get("commit"):
247
+ return worktree["commit"]
248
+ except WorktreeError:
249
+ pass
250
+
251
+ raise WorktreeError(
252
+ f"Base ref not found: {base}. Ensure it exists locally or fetch it."
253
+ )
254
+
255
+
227
256
  def create_local_worktree(
228
257
  repo_path: Path,
229
258
  worker_name: str,
230
259
  bead_id: Optional[str] = None,
231
260
  annotation: Optional[str] = None,
261
+ branch: Optional[str] = None,
262
+ base: Optional[str] = None,
232
263
  ) -> Path:
233
264
  """
234
265
  Create a git worktree in the repo's .worktrees/ directory.
@@ -237,18 +268,23 @@ def create_local_worktree(
237
268
  {repo}/.worktrees/{bead_id}-{annotation}/ (if bead_id provided)
238
269
  {repo}/.worktrees/{worker_name}-{uuid}-{annotation}/ (otherwise)
239
270
 
240
- The branch name matches the worktree directory name for consistency.
271
+ The branch name matches the worktree directory name for consistency unless
272
+ an explicit branch is provided.
241
273
  Automatically adds .worktrees to .gitignore if not present.
242
274
 
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.
275
+ If a generated worktree path or branch already exists, appends an
276
+ incrementing suffix (-1, -2, etc.) until an available name is found.
277
+ This allows multiple workers to work on the same bead in parallel.
278
+ When an explicit branch is provided, pre-existing branches are treated
279
+ as an error.
246
280
 
247
281
  Args:
248
282
  repo_path: Path to the main repository
249
283
  worker_name: Name of the worker (used in fallback naming)
250
284
  bead_id: Optional bead issue ID (e.g., "cic-abc123")
251
285
  annotation: Optional annotation for the worktree
286
+ branch: Optional branch name to create for the worktree
287
+ base: Optional base ref/branch for the new branch
252
288
 
253
289
  Returns:
254
290
  Path to the created worktree
@@ -319,17 +355,30 @@ def create_local_worktree(
319
355
  worktree_path = worktrees_dir / dir_name
320
356
  suffix = 0
321
357
 
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
358
+ if branch:
359
+ if branch_exists(branch):
360
+ raise WorktreeError(f"Branch already exists: {branch}")
361
+ while worktree_path.exists():
362
+ suffix += 1
363
+ dir_name = f"{base_dir_name}-{suffix}"
364
+ worktree_path = worktrees_dir / dir_name
365
+ branch_name = branch
366
+ else:
367
+ while worktree_path.exists() or branch_exists(dir_name):
368
+ suffix += 1
369
+ dir_name = f"{base_dir_name}-{suffix}"
370
+ worktree_path = worktrees_dir / dir_name
371
+ branch_name = dir_name
326
372
 
327
- # Branch name matches directory name for clarity
328
- branch_name = dir_name
373
+ resolved_base = None
374
+ if base:
375
+ resolved_base = _resolve_worktree_base(repo_path, base)
329
376
 
330
377
  # Build the git worktree add command.
331
378
  # Branch is guaranteed not to exist (collision loop checked for it).
332
379
  cmd = ["git", "-C", str(repo_path), "worktree", "add", "-b", branch_name, str(worktree_path)]
380
+ if resolved_base:
381
+ cmd.append(resolved_base)
333
382
 
334
383
  result = subprocess.run(cmd, capture_output=True, text=True)
335
384
 
@@ -537,5 +586,3 @@ def list_local_worktrees(repo_path: Path) -> list[dict]:
537
586
  })
538
587
 
539
588
  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.7.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,52 @@
1
+ claude_team/__init__.py,sha256=vDgDXeillUkQr0QDv-wcscJIuSgA6lctbMQrWfxhGJ0,293
2
+ claude_team/events.py,sha256=USQ7ywFNvDmdsD-739CEntTLVu4LDwue7J4GWgEfHMY,14899
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/formatting.py,sha256=tcBmKyaZm15nkeJfssuIMkoFQTlmwDllf7ulZvWkcv4,3831
9
+ claude_team_mcp/idle_detection.py,sha256=KRnhObbVM--S8HPowWq7UkjXxq5AMpGdVHY5UUv3Z0o,16331
10
+ claude_team_mcp/iterm_utils.py,sha256=Imp4yUwq06avwdEw3bOSaO168DpCUveazc71Q8AZOFw,37621
11
+ claude_team_mcp/names.py,sha256=qUJlO2WlFjxB4Q1vLLTcEjTvKA63fJ3i2QBz80ABgnQ,15978
12
+ claude_team_mcp/profile.py,sha256=yqytAE0dIe6NQ6FodldSepO-ZIeR7-C0UfK3FsO7Pn4,12326
13
+ claude_team_mcp/registry.py,sha256=LWOoXxZ2VUhY-qZbKM0riCGrDdC1EbIKrKNprafUZNY,14945
14
+ claude_team_mcp/server.py,sha256=8cBe4hB5ipWyhxyur41pIQ-dsQY_JUOxikL4hVBfZDY,14019
15
+ claude_team_mcp/session_state.py,sha256=DFNPWog7yyc5yF1_lMhDMcBMpCRGi22YRI6IdoIEf0o,46814
16
+ claude_team_mcp/subprocess_cache.py,sha256=6Q1NIMn2X5_75S4s_a9iPBka-UCz6RW0EMxPSPEaLxo,3612
17
+ claude_team_mcp/worker_prompt.py,sha256=NvzUrR6Zqjp8HuL-xOeAncdvACHbyN7O0nISWyySHq4,15771
18
+ claude_team_mcp/worktree.py,sha256=enlgqsqAj3BaytHWd4cBOfgBDm9gKwfI5YIuQCt6MYo,18729
19
+ claude_team_mcp/cli_backends/__init__.py,sha256=9lpklc5lGWn-AdHoVqFMHau3UgzsN276grC1istHI2k,1038
20
+ claude_team_mcp/cli_backends/base.py,sha256=dArm2Yqjzs3smN0JpSGR79e9I_kQYJFgQ8gYpNrmS-o,3923
21
+ claude_team_mcp/cli_backends/claude.py,sha256=5axMph_IX-wX-DMulq0B_xQ3mVbhlwZjIi_WqjQwyL4,3268
22
+ claude_team_mcp/cli_backends/codex.py,sha256=OTTAw9P4EKBggGmKK32-BYQkF7jpfZSOiIfa77wxG1Q,3408
23
+ claude_team_mcp/issue_tracker/__init__.py,sha256=JYcVEdXkqDKXd9BAUoz3emYyZ9bvVRsuTB7Vxfw3jhU,3792
24
+ claude_team_mcp/schemas/__init__.py,sha256=IingbdgdQx9C0ZLBOhZ-doqIJRbO7aeAQjuCHMuVA84,99
25
+ claude_team_mcp/schemas/codex.py,sha256=KwUkTmD70kQLZvzl366tHAsuwKbtsk86ySTOW6b9wDk,5949
26
+ claude_team_mcp/terminal_backends/__init__.py,sha256=g4xbZByDSkSXjRDqVMjD_0TXglq9qiOlgOGR-CtFr9Q,781
27
+ claude_team_mcp/terminal_backends/base.py,sha256=9GrFDm-Jah8y6DALQrq8dei9UgWeZkWXYbbcrfkFAHA,3202
28
+ claude_team_mcp/terminal_backends/iterm.py,sha256=A5klhOpzDrZ-636aN1Hlnnfxk4OA-Rz_OuaQi1ABz0Y,9317
29
+ claude_team_mcp/terminal_backends/tmux.py,sha256=BDqq5w8Vhb3hL-5W3IUvaq2lE36WTSNx7OOf6nqbE3M,23218
30
+ claude_team_mcp/tools/__init__.py,sha256=YPKaGC81WDHouee6MQlVOhk2teI0adYvbo949LCCKd0,1593
31
+ claude_team_mcp/tools/adopt_worker.py,sha256=P4HlUaKqS5piOh-0Or27h935WRtkfEXtznCZ_cQF1j4,6897
32
+ claude_team_mcp/tools/annotate_worker.py,sha256=mBo4YMaaaNQxQBduYK1DPA-Ioift-ZQ9tYlBM6S15t8,1639
33
+ claude_team_mcp/tools/check_idle_workers.py,sha256=IjDNDeal9M7lTONWjKZrt8bXu7O277ossHz_2oyLRcY,3374
34
+ claude_team_mcp/tools/close_workers.py,sha256=MlxyEKkDBJEP3FXY8ESQ1x7cjulzJi-fVNCsC4Z2Aig,7878
35
+ claude_team_mcp/tools/discover_workers.py,sha256=yc-c4voHRktBYhcpg8J-EMZMerJ6TyhcZJDqv5udvq4,11834
36
+ claude_team_mcp/tools/examine_worker.py,sha256=7Nd3EOdsGVDjMJ8ov9NhmcrjN8K9IE4i_noXHOP1uI8,1620
37
+ claude_team_mcp/tools/issue_tracker_help.py,sha256=KxgjFhXp3NCUDjqTl3UnIiFV-Y5DM80C1EoZXfA82QM,1668
38
+ claude_team_mcp/tools/list_workers.py,sha256=EqKXNsVH-eOmmE6YpVwgXacA7sf3nqarKETKDcdcomg,3710
39
+ claude_team_mcp/tools/list_worktrees.py,sha256=_EIwpwoCMLaQh4dHws-jO53MS-E-L7hC7oPT7xC26lw,3665
40
+ claude_team_mcp/tools/message_workers.py,sha256=pWZYcbDyezrNeWrkmFcLHROWtJqKmKaXgvd7aj8-h3Y,13260
41
+ claude_team_mcp/tools/poll_worker_changes.py,sha256=xR2yeSPnM7fjKxst-DFfF4sec6wBcy_Q-V-A8iTElYQ,7770
42
+ claude_team_mcp/tools/read_worker_logs.py,sha256=9gccM6MSaoxu97Xjsk7nUalLEU8XHV7r3SKggBRpNww,5913
43
+ claude_team_mcp/tools/spawn_workers.py,sha256=nIZApkFoLUA22BMVc687LmvP7MG9D1simxt4sWwl0x8,36728
44
+ claude_team_mcp/tools/wait_idle_workers.py,sha256=EAPBinBsrRtisADQJZQGPHR8CAIB6lYrXMe5DmeMciM,5279
45
+ claude_team_mcp/utils/__init__.py,sha256=Jyc-N1RXZnMdXLjSgRBB2ih04v-h0woUzZcVYYfc7wQ,647
46
+ claude_team_mcp/utils/constants.py,sha256=FGDHeo0reZ89365fuXJGIl2Y5MFQAoKfWtmYr7UQzhQ,5815
47
+ claude_team_mcp/utils/errors.py,sha256=kP0MPjLIpEOZkbGAzDxonMFERbsjwfID5VVY5qAR2II,2949
48
+ claude_team_mcp/utils/worktree_detection.py,sha256=oMGcb7p1jvr7qWs06sxUMTAV8jRialcVqziCTCdW7XU,3251
49
+ claude_team_mcp-0.7.0.dist-info/METADATA,sha256=ffya6G-3AGXo7wuXD9EQ09wtpqxK44QyYxB0_hTRccc,16020
50
+ claude_team_mcp-0.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
51
+ claude_team_mcp-0.7.0.dist-info/entry_points.txt,sha256=cmk5dmK50RVquExT-k_J72akl3qKIerPpVqfit7kQtQ,53
52
+ claude_team_mcp-0.7.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,,