claude-code-tools 1.27.0__tar.gz → 1.27.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 (139) hide show
  1. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/PKG-INFO +1 -1
  2. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/__init__.py +1 -1
  3. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/cli.py +35 -1
  4. claude_code_tools-1.27.1/claude_code_tools/amux/filters.py +67 -0
  5. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/pyproject.toml +2 -2
  6. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/.gitignore +0 -0
  7. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/LICENSE +0 -0
  8. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/README.md +0 -0
  9. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/action_rpc.py +0 -0
  10. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/__init__.py +0 -0
  11. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/backends.py +0 -0
  12. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/cli.py +0 -0
  13. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/config.py +0 -0
  14. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/convert.py +0 -0
  15. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/discord_bot.py +0 -0
  16. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/locking.py +0 -0
  17. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/paths.py +0 -0
  18. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/registry.py +0 -0
  19. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/session.py +0 -0
  20. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/store.py +0 -0
  21. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/tmux.py +0 -0
  22. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/agent_tunnel/trust.py +0 -0
  23. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/aichat.py +0 -0
  24. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/__init__.py +0 -0
  25. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/__main__.py +0 -0
  26. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/activity.py +0 -0
  27. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/cache.py +0 -0
  28. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/detect.py +0 -0
  29. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/model.py +0 -0
  30. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/render.py +0 -0
  31. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/amux/scan.py +0 -0
  32. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/claude_continue.py +0 -0
  33. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/cli_passthrough.py +0 -0
  34. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_app_server_rpc.py +0 -0
  35. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_continue.py +0 -0
  36. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server.py +0 -0
  37. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_callback.py +0 -0
  38. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_cli.py +0 -0
  39. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_fingerprint.py +0 -0
  40. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_generation.py +0 -0
  41. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_legacy.py +0 -0
  42. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_models.py +0 -0
  43. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_process.py +0 -0
  44. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_reservation.py +0 -0
  45. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_resume.py +0 -0
  46. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_retry.py +0 -0
  47. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_reuse.py +0 -0
  48. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_state.py +0 -0
  49. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_supervisor.py +0 -0
  50. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_wait.py +0 -0
  51. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/codex_server_worker.py +0 -0
  52. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/config.py +0 -0
  53. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/csv2gsheet.py +0 -0
  54. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/delete_session.py +0 -0
  55. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/dotenv_vault.py +0 -0
  56. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/env_safe.py +0 -0
  57. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/export_all.py +0 -0
  58. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/export_claude_session.py +0 -0
  59. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/export_codex_session.py +0 -0
  60. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/export_session.py +0 -0
  61. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/find_claude_session.py +0 -0
  62. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/find_codex_session.py +0 -0
  63. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/find_original_session.py +0 -0
  64. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/find_session.py +0 -0
  65. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/find_trimmed_sessions.py +0 -0
  66. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/fix_session.py +0 -0
  67. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/gdoc2docx.py +0 -0
  68. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/gdoc2md.py +0 -0
  69. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/github_wake.py +0 -0
  70. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/github_watch_daemon.py +0 -0
  71. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/github_watch_store.py +0 -0
  72. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/gsheet2csv.py +0 -0
  73. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/helper_sessions.py +0 -0
  74. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/issue_reply_delivery.py +0 -0
  75. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/legacy_session_wrappers.py +0 -0
  76. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/md2gdoc.py +0 -0
  77. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/move_account.py +0 -0
  78. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/__init__.py +0 -0
  79. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/cli.py +0 -0
  80. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/hooks.py +0 -0
  81. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/migrations.py +0 -0
  82. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/models.py +0 -0
  83. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/prompt_detect.py +0 -0
  84. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/store.py +0 -0
  85. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/msg/watcher.py +0 -0
  86. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/node_menu_ui.py +0 -0
  87. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/port_claude_noise.py +0 -0
  88. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/port_claude_to_codex.py +0 -0
  89. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/port_codex_flatten.py +0 -0
  90. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/port_codex_to_claude.py +0 -0
  91. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/port_render.py +0 -0
  92. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/port_service.py +0 -0
  93. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/resolve_session.py +0 -0
  94. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/resolve_session_names.py +0 -0
  95. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/resolve_session_render.py +0 -0
  96. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/search_index.py +0 -0
  97. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_cli_resolution.py +0 -0
  98. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_lineage.py +0 -0
  99. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_menu.py +0 -0
  100. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_menu_cli.py +0 -0
  101. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_resolution.py +0 -0
  102. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_selection.py +0 -0
  103. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/session_utils.py +0 -0
  104. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/smart_trim.py +0 -0
  105. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/smart_trim_core.py +0 -0
  106. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/tmux_cli_controller.py +0 -0
  107. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/tmux_execution_helpers.py +0 -0
  108. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/tmux_remote_controller.py +0 -0
  109. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/trim_in_place.py +0 -0
  110. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/trim_session.py +0 -0
  111. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/trim_session_claude.py +0 -0
  112. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/trim_session_codex.py +0 -0
  113. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli.py +0 -0
  114. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_contract.py +0 -0
  115. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_formatting.py +0 -0
  116. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_identity_policy.py +0 -0
  117. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_manifest.py +0 -0
  118. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_projection.py +0 -0
  119. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_rendering.py +0 -0
  120. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_snapshots.py +0 -0
  121. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_cli_store_backends.py +0 -0
  122. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_processes.py +0 -0
  123. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_runs.py +0 -0
  124. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_store_io.py +0 -0
  125. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/claude_code_tools/workflow_validation.py +0 -0
  126. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/agent-tunnel-spec.md +0 -0
  127. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/claude-code-tmux-tutorials.md +0 -0
  128. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/dot-zshrc.md +0 -0
  129. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/find-claude-session.md +0 -0
  130. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/intercom-spec.md +0 -0
  131. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/lmsh.md +0 -0
  132. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/local-llm-setup.md +0 -0
  133. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/tmux-cli-instructions.md +0 -0
  134. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/docs/vault-documentation.md +0 -0
  135. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/hatch_build.py +0 -0
  136. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/node_ui/action_config.js +0 -0
  137. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/node_ui/menu.js +0 -0
  138. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/node_ui/package-lock.json +0 -0
  139. {claude_code_tools-1.27.0 → claude_code_tools-1.27.1}/node_ui/package.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-tools
3
- Version: 1.27.0
3
+ Version: 1.27.1
4
4
  Summary: Collection of tools for working with Claude Code
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -1,3 +1,3 @@
1
1
  """Claude Code Tools - Collection of utilities for Claude Code."""
2
2
 
3
- __version__ = "1.27.0"
3
+ __version__ = "1.27.1"
@@ -20,6 +20,7 @@ import subprocess
20
20
  import sys
21
21
 
22
22
  from . import cache, render, scan
23
+ from .filters import directory_argument, select_agents
23
24
  from .model import Agent
24
25
 
25
26
  _FZF_HEADER = (
@@ -46,6 +47,9 @@ def _agents_for_display(max_age: float) -> tuple[list[Agent], bool]:
46
47
 
47
48
  def _display(agents: list[Agent], args: argparse.Namespace) -> list[Agent]:
48
49
  """Refresh ages even for cached rows, then apply the requested view."""
50
+ agents = select_agents(
51
+ agents, getattr(args, "repo", None), getattr(args, "directory", None),
52
+ )
49
53
  for agent in agents:
50
54
  agent.classify_inactivity(args.dormant_hours)
51
55
  if args.dormant:
@@ -112,6 +116,14 @@ def cmd_pick(args: argparse.Namespace) -> int:
112
116
  f" --dormant-hours {args.dormant_hours} --sort {args.sort}"
113
117
  + (" --dormant" if args.dormant else "")
114
118
  )
119
+ # Keep user values out of fzf's action/placeholder parser as well as the shell.
120
+ reload_env = dict(os.environ)
121
+ if args.repo is not None:
122
+ reload_env["AMUX_RELOAD_REPO"] = args.repo
123
+ view_flags += ' --repo="$AMUX_RELOAD_REPO"'
124
+ if args.directory is not None:
125
+ reload_env["AMUX_RELOAD_DIR"] = args.directory
126
+ view_flags += ' --dir="$AMUX_RELOAD_DIR"'
115
127
  binds = [
116
128
  f"ctrl-r:reload({self_cmd} rows --refresh{view_flags})",
117
129
  # Opening on cached rows is what makes this instant; refresh the
@@ -153,6 +165,7 @@ def cmd_pick(args: argparse.Namespace) -> int:
153
165
  input=render.picker_lines(agents),
154
166
  stdout=subprocess.PIPE,
155
167
  text=True,
168
+ env=reload_env,
156
169
  )
157
170
  if proc.returncode != 0 or not proc.stdout.strip():
158
171
  return 0
@@ -215,6 +228,14 @@ def build_parser() -> argparse.ArgumentParser:
215
228
  help="seconds a cached scan stays usable (default: 30)",
216
229
  )
217
230
  for command in (pick, lst, rows):
231
+ command.add_argument(
232
+ "--repo", "--project", dest="repo", metavar="NAME",
233
+ help="exact repository name, including linked Git worktrees",
234
+ )
235
+ command.add_argument(
236
+ "--dir", dest="directory", type=directory_argument, metavar="PATH",
237
+ help="only agents in this directory or its subdirectories",
238
+ )
218
239
  command.add_argument(
219
240
  "--dormant", action="store_true",
220
241
  help="show waiting agents with old known submitted input only",
@@ -238,7 +259,20 @@ def main(argv: list[str] | None = None) -> int:
238
259
  # only ["pick"] -- reparsing dropped global options, so `amux --max-age 0`
239
260
  # silently used the 30s default.
240
261
  known = {"pick", "list", "scan", "rows"}
241
- if not any(tok in known | {"-h", "--help"} for tok in raw):
262
+ value_options = {
263
+ "--repo", "--project", "--dir", "--max-age", "--dormant-hours", "--sort",
264
+ }
265
+ tokens = iter(raw)
266
+ explicit_command = False
267
+ for token in tokens:
268
+ if token in value_options:
269
+ next(tokens, None)
270
+ elif token in known | {"-h", "--help"}:
271
+ explicit_command = True
272
+ break
273
+ elif not token.startswith("-"):
274
+ break
275
+ if not explicit_command:
242
276
  raw.insert(0, "pick")
243
277
  args = parser.parse_args(raw)
244
278
  if not scan.tmux_available():
@@ -0,0 +1,67 @@
1
+ """Repository and directory selection for Amux display views."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ from pathlib import Path
7
+
8
+ from .model import Agent
9
+
10
+
11
+ def directory_argument(value: str) -> str:
12
+ """Resolve an existing directory supplied on the command line."""
13
+ try:
14
+ path = Path(value).expanduser().resolve()
15
+ if path.is_dir():
16
+ return str(path)
17
+ except (OSError, RuntimeError) as exc:
18
+ raise argparse.ArgumentTypeError(str(exc)) from exc
19
+ raise argparse.ArgumentTypeError(f"not a directory: {value!r}")
20
+
21
+
22
+ def repository_name(cwd: str) -> str:
23
+ """Find the shared repository's directory name, including linked worktrees."""
24
+ if not cwd:
25
+ return ""
26
+ try:
27
+ path = Path(cwd).resolve()
28
+ for root in (path, *path.parents):
29
+ marker = root / ".git"
30
+ if marker.is_dir():
31
+ return root.name
32
+ if marker.is_file():
33
+ pointer = marker.read_text().strip()
34
+ if not pointer.startswith("gitdir: "):
35
+ return ""
36
+ git_dir = (root / pointer.removeprefix("gitdir: ")).resolve()
37
+ common_file = git_dir / "commondir"
38
+ if not common_file.is_file():
39
+ return root.name
40
+ common = (git_dir / common_file.read_text().strip()).resolve()
41
+ return common.parent.name if common.name == ".git" else common.name
42
+ except (OSError, RuntimeError, UnicodeError):
43
+ return ""
44
+ return ""
45
+
46
+
47
+ def select_agents(
48
+ agents: list[Agent], repo: str | None, directory: str | None,
49
+ ) -> list[Agent]:
50
+ """Apply exact repository-name and directory-subtree filters together."""
51
+ selected = []
52
+ names: dict[str, str] = {}
53
+ for agent in agents:
54
+ if repo is not None and agent.repo != repo:
55
+ if agent.cwd not in names:
56
+ names[agent.cwd] = repository_name(agent.cwd)
57
+ if names[agent.cwd] != repo:
58
+ continue
59
+ if directory:
60
+ if not agent.cwd:
61
+ continue
62
+ try:
63
+ Path(agent.cwd).resolve().relative_to(directory)
64
+ except (ValueError, OSError, RuntimeError):
65
+ continue
66
+ selected.append(agent)
67
+ return selected
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "claude-code-tools"
3
- version = "1.27.0"
3
+ version = "1.27.1"
4
4
  description = "Collection of tools for working with Claude Code"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -113,7 +113,7 @@ markers = [
113
113
 
114
114
  [tool.commitizen]
115
115
  name = "cz_conventional_commits"
116
- version = "1.27.0"
116
+ version = "1.27.1"
117
117
  tag_format = "v$version"
118
118
  version_files = [
119
119
  "pyproject.toml:version",