agent-cli 0.94.0__tar.gz → 0.94.2__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 (395) hide show
  1. {agent_cli-0.94.0 → agent_cli-0.94.2}/.pre-commit-config.yaml +2 -2
  2. {agent_cli-0.94.0 → agent_cli-0.94.2}/PKG-INFO +1 -1
  3. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/deps.py +7 -2
  4. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/worktree.py +53 -6
  5. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/cli.py +37 -9
  6. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_worktree.py +43 -0
  7. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_requires_extras.py +66 -0
  8. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_server_tts.py +74 -0
  9. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_server_whisper.py +60 -0
  10. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  11. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  12. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude-plugin/README.md +0 -0
  13. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude-plugin/marketplace.json +0 -0
  14. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude-plugin/plugin.json +0 -0
  15. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  16. {agent_cli-0.94.0 → agent_cli-0.94.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  17. {agent_cli-0.94.0 → agent_cli-0.94.2}/.cursorrules +0 -0
  18. {agent_cli-0.94.0 → agent_cli-0.94.2}/.dockerignore +0 -0
  19. {agent_cli-0.94.0 → agent_cli-0.94.2}/.env.example +0 -0
  20. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/logo.svg +0 -0
  21. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/release-drafter.yml +0 -0
  22. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/renovate.json +0 -0
  23. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/scripts/check_extras_sync.py +0 -0
  24. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
  25. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/scripts/sync_extras.py +0 -0
  26. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/scripts/sync_requirements.py +0 -0
  27. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/automerge.yml +0 -0
  28. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/docker.yml +0 -0
  29. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/docs.yml +0 -0
  30. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/markdown-code-runner.yml +0 -0
  31. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/pytest.yml +0 -0
  32. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/release-drafter.yml +0 -0
  33. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/release.yml +0 -0
  34. {agent_cli-0.94.0 → agent_cli-0.94.2}/.github/workflows/toc.yaml +0 -0
  35. {agent_cli-0.94.0 → agent_cli-0.94.2}/.gitignore +0 -0
  36. {agent_cli-0.94.0 → agent_cli-0.94.2}/.jscpd.json +0 -0
  37. {agent_cli-0.94.0 → agent_cli-0.94.2}/.prompts/docs-review.md +0 -0
  38. {agent_cli-0.94.0 → agent_cli-0.94.2}/.prompts/pr-review.md +0 -0
  39. {agent_cli-0.94.0 → agent_cli-0.94.2}/CLAUDE.md +0 -0
  40. {agent_cli-0.94.0 → agent_cli-0.94.2}/LICENSE +0 -0
  41. {agent_cli-0.94.0 → agent_cli-0.94.2}/LLAMA_SERVER_USAGE.md +0 -0
  42. {agent_cli-0.94.0 → agent_cli-0.94.2}/README.md +0 -0
  43. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/__init__.py +0 -0
  44. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/__main__.py +0 -0
  45. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_extras.json +0 -0
  46. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/.gitkeep +0 -0
  47. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/audio.txt +0 -0
  48. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/diarization.txt +0 -0
  49. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  50. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/kokoro.txt +0 -0
  51. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/llm.txt +0 -0
  52. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/memory.txt +0 -0
  53. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  54. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/piper.txt +0 -0
  55. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/rag.txt +0 -0
  56. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/server.txt +0 -0
  57. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/speed.txt +0 -0
  58. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/vad.txt +0 -0
  59. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/vectordb.txt +0 -0
  60. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  61. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_requirements/wyoming.txt +0 -0
  62. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/_tools.py +0 -0
  63. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/__init__.py +0 -0
  64. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  65. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/assistant.py +0 -0
  66. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/autocorrect.py +0 -0
  67. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/chat.py +0 -0
  68. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/diarize_live_session.py +0 -0
  69. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/memory/__init__.py +0 -0
  70. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/memory/add.py +0 -0
  71. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/memory/proxy.py +0 -0
  72. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/rag_proxy.py +0 -0
  73. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/speak.py +0 -0
  74. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/speakers.py +0 -0
  75. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/transcribe.py +0 -0
  76. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/transcribe_live.py +0 -0
  77. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/agents/voice_edit.py +0 -0
  78. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/api.py +0 -0
  79. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/cli.py +0 -0
  80. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/config.py +0 -0
  81. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/config_cmd.py +0 -0
  82. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/constants.py +0 -0
  83. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/__init__.py +0 -0
  84. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/alignment.py +0 -0
  85. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/audio.py +0 -0
  86. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/audio_format.py +0 -0
  87. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/chroma.py +0 -0
  88. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/diarization.py +0 -0
  89. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/openai_proxy.py +0 -0
  90. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/process.py +0 -0
  91. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/reranker.py +0 -0
  92. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/speaker_identity.py +0 -0
  93. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/sse.py +0 -0
  94. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/transcription_logger.py +0 -0
  95. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/utils.py +0 -0
  96. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/vad.py +0 -0
  97. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/core/watch.py +0 -0
  98. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/daemon/__init__.py +0 -0
  99. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/daemon/cli.py +0 -0
  100. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/__init__.py +0 -0
  101. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/_branch_name.py +0 -0
  102. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/_config.py +0 -0
  103. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/_output.py +0 -0
  104. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/cleanup.py +0 -0
  105. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/cli.py +0 -0
  106. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  107. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  108. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/base.py +0 -0
  109. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  110. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  111. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  112. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  113. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  114. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  115. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  116. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  117. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/__init__.py +0 -0
  118. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/base.py +0 -0
  119. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/cursor.py +0 -0
  120. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/emacs.py +0 -0
  121. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  122. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/nano.py +0 -0
  123. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/neovim.py +0 -0
  124. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/registry.py +0 -0
  125. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/sublime.py +0 -0
  126. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/vim.py +0 -0
  127. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/vscode.py +0 -0
  128. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/editors/zed.py +0 -0
  129. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/hooks.py +0 -0
  130. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/launch.py +0 -0
  131. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/project.py +0 -0
  132. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/registry.py +0 -0
  133. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/skill/SKILL.md +0 -0
  134. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/skill/examples.md +0 -0
  135. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/__init__.py +0 -0
  136. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  137. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/base.py +0 -0
  138. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/gnome.py +0 -0
  139. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  140. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/kitty.py +0 -0
  141. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/registry.py +0 -0
  142. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/tmux.py +0 -0
  143. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/warp.py +0 -0
  144. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/dev/terminals/zellij.py +0 -0
  145. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/docs_gen.py +0 -0
  146. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/example-config.toml +0 -0
  147. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/__init__.py +0 -0
  148. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/common.py +0 -0
  149. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/extras.py +0 -0
  150. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/hotkeys.py +0 -0
  151. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/launchd.py +0 -0
  152. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/service_config.py +0 -0
  153. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/services.py +0 -0
  154. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/install/systemd.py +0 -0
  155. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/__init__.py +0 -0
  156. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_files.py +0 -0
  157. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_filters.py +0 -0
  158. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_git.py +0 -0
  159. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_indexer.py +0 -0
  160. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_ingest.py +0 -0
  161. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_persistence.py +0 -0
  162. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_prompt.py +0 -0
  163. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_retrieval.py +0 -0
  164. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_store.py +0 -0
  165. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_streaming.py +0 -0
  166. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/_tasks.py +0 -0
  167. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/api.py +0 -0
  168. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/client.py +0 -0
  169. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/engine.py +0 -0
  170. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/entities.py +0 -0
  171. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/memory/models.py +0 -0
  172. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/opts.py +0 -0
  173. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/py.typed +0 -0
  174. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/__init__.py +0 -0
  175. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/_indexer.py +0 -0
  176. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/_indexing.py +0 -0
  177. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/_prompt.py +0 -0
  178. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/_retriever.py +0 -0
  179. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/_store.py +0 -0
  180. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/_utils.py +0 -0
  181. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/api.py +0 -0
  182. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/client.py +0 -0
  183. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/engine.py +0 -0
  184. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/rag/models.py +0 -0
  185. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  186. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/__init__.py +0 -0
  187. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  188. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  189. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  190. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  191. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  192. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  193. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  194. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  195. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  196. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  197. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  198. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  199. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  200. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  201. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  202. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  203. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/setup-linux.sh +0 -0
  204. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  205. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/setup-macos.sh +0 -0
  206. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  207. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  208. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/scripts/start-all-services.sh +0 -0
  209. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/__init__.py +0 -0
  210. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/common.py +0 -0
  211. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/model_manager.py +0 -0
  212. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/model_registry.py +0 -0
  213. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/proxy/__init__.py +0 -0
  214. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/proxy/api.py +0 -0
  215. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/streaming.py +0 -0
  216. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/__init__.py +0 -0
  217. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/api.py +0 -0
  218. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  219. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/backends/base.py +0 -0
  220. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  221. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/backends/piper.py +0 -0
  222. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/model_manager.py +0 -0
  223. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/model_registry.py +0 -0
  224. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  225. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/__init__.py +0 -0
  226. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/api.py +0 -0
  227. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  228. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/backends/base.py +0 -0
  229. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  230. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/backends/mlx.py +0 -0
  231. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  232. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/languages.py +0 -0
  233. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/model_manager.py +0 -0
  234. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/model_registry.py +0 -0
  235. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  236. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/services/__init__.py +0 -0
  237. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/services/_wyoming_utils.py +0 -0
  238. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/services/asr.py +0 -0
  239. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/services/llm.py +0 -0
  240. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/services/tts.py +0 -0
  241. {agent_cli-0.94.0 → agent_cli-0.94.2}/agent_cli/services/wake_word.py +0 -0
  242. {agent_cli-0.94.0 → agent_cli-0.94.2}/docker/docker-compose.yml +0 -0
  243. {agent_cli-0.94.0 → agent_cli-0.94.2}/docker/memory-proxy.Dockerfile +0 -0
  244. {agent_cli-0.94.0 → agent_cli-0.94.2}/docker/rag-proxy.Dockerfile +0 -0
  245. {agent_cli-0.94.0 → agent_cli-0.94.2}/docker/transcribe-proxy.Dockerfile +0 -0
  246. {agent_cli-0.94.0 → agent_cli-0.94.2}/docker/tts.Dockerfile +0 -0
  247. {agent_cli-0.94.0 → agent_cli-0.94.2}/docker/whisper.Dockerfile +0 -0
  248. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/CNAME +0 -0
  249. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/architecture/index.md +0 -0
  250. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/architecture/memory.md +0 -0
  251. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/architecture/rag.md +0 -0
  252. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/assistant.md +0 -0
  253. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/autocorrect.md +0 -0
  254. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/chat.md +0 -0
  255. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/config.md +0 -0
  256. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/daemon.md +0 -0
  257. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/dev.md +0 -0
  258. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/diarize-live-session.md +0 -0
  259. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/index.md +0 -0
  260. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/install-extras.md +0 -0
  261. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/install-hotkeys.md +0 -0
  262. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/install-services.md +0 -0
  263. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/memory.md +0 -0
  264. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/rag-proxy.md +0 -0
  265. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/server/index.md +0 -0
  266. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/server/transcribe-proxy.md +0 -0
  267. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/server/tts.md +0 -0
  268. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/server/whisper.md +0 -0
  269. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/speak.md +0 -0
  270. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/speakers.md +0 -0
  271. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/start-services.md +0 -0
  272. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/transcribe-live.md +0 -0
  273. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/transcribe.md +0 -0
  274. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/commands/voice-edit.md +0 -0
  275. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/configuration.md +0 -0
  276. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/getting-started.md +0 -0
  277. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/iOS_Shortcut_Guide.md +0 -0
  278. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/index.md +0 -0
  279. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/installation/docker.md +0 -0
  280. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/installation/index.md +0 -0
  281. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/installation/linux.md +0 -0
  282. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/installation/macos.md +0 -0
  283. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/installation/nixos.md +0 -0
  284. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/installation/windows.md +0 -0
  285. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/logo-clean.svg +0 -0
  286. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  287. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/run_markdown_code_runner.py +0 -0
  288. {agent_cli-0.94.0 → agent_cli-0.94.2}/docs/system-integration.md +0 -0
  289. {agent_cli-0.94.0 → agent_cli-0.94.2}/example.agent-cli-config.toml +0 -0
  290. {agent_cli-0.94.0 → agent_cli-0.94.2}/justfile +0 -0
  291. {agent_cli-0.94.0 → agent_cli-0.94.2}/pyproject.toml +0 -0
  292. {agent_cli-0.94.0 → agent_cli-0.94.2}/reddit.md +0 -0
  293. {agent_cli-0.94.0 → agent_cli-0.94.2}/shell.nix +0 -0
  294. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/__init__.py +0 -0
  295. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/__init__.py +0 -0
  296. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_fix_my_text.py +0 -0
  297. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_interactive.py +0 -0
  298. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_interactive_extra.py +0 -0
  299. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_memory_add.py +0 -0
  300. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_speak.py +0 -0
  301. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_speak_e2e.py +0 -0
  302. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_speakers.py +0 -0
  303. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_transcribe.py +0 -0
  304. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_transcribe_agent.py +0 -0
  305. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_transcribe_e2e.py +0 -0
  306. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_transcribe_live.py +0 -0
  307. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_transcribe_recovery.py +0 -0
  308. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_tts_common.py +0 -0
  309. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_tts_common_extra.py +0 -0
  310. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_voice_agent_common.py +0 -0
  311. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_voice_edit.py +0 -0
  312. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  313. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/agents/test_wake_word_assistant.py +0 -0
  314. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/conftest.py +0 -0
  315. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/__init__.py +0 -0
  316. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/test_audio.py +0 -0
  317. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/test_audio_format.py +0 -0
  318. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/test_chroma.py +0 -0
  319. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/test_sse.py +0 -0
  320. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/test_vad.py +0 -0
  321. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/core/test_watch.py +0 -0
  322. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/__init__.py +0 -0
  323. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_cleanup.py +0 -0
  324. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_cli.py +0 -0
  325. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_coding_agents.py +0 -0
  326. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_editors.py +0 -0
  327. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_hooks.py +0 -0
  328. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_launch.py +0 -0
  329. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_project.py +0 -0
  330. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_terminals.py +0 -0
  331. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/dev/test_verification.py +0 -0
  332. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/install/__init__.py +0 -0
  333. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/install/test_extras.py +0 -0
  334. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/install/test_launchd.py +0 -0
  335. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/__init__.py +0 -0
  336. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_api_health.py +0 -0
  337. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_api_integration_liveish.py +0 -0
  338. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_client.py +0 -0
  339. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_engine.py +0 -0
  340. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_files.py +0 -0
  341. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_filters.py +0 -0
  342. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_git_integration.py +0 -0
  343. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_indexer.py +0 -0
  344. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_memory_integration.py +0 -0
  345. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_proxy_passthrough.py +0 -0
  346. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_store.py +0 -0
  347. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/memory/test_utils.py +0 -0
  348. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/mocks/__init__.py +0 -0
  349. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/mocks/audio.py +0 -0
  350. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/mocks/llm.py +0 -0
  351. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/mocks/wyoming.py +0 -0
  352. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/__init__.py +0 -0
  353. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_api.py +0 -0
  354. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_engine.py +0 -0
  355. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_history.py +0 -0
  356. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_indexer.py +0 -0
  357. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_indexing.py +0 -0
  358. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_rag_client.py +0 -0
  359. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  360. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  361. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_retriever.py +0 -0
  362. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_store.py +0 -0
  363. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/rag/test_utils.py +0 -0
  364. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_alignment.py +0 -0
  365. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_api.py +0 -0
  366. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_api_integration.py +0 -0
  367. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_asr.py +0 -0
  368. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_asr_recovery.py +0 -0
  369. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_audio_e2e.py +0 -0
  370. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_cli.py +0 -0
  371. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_config.py +0 -0
  372. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_config_cmd.py +0 -0
  373. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_daemon.py +0 -0
  374. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_diarization.py +0 -0
  375. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_diarize_live_session.py +0 -0
  376. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_docs_gen.py +0 -0
  377. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_env_vars.py +0 -0
  378. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_faster_whisper_backend.py +0 -0
  379. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_json_output.py +0 -0
  380. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_llm.py +0 -0
  381. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_llm_gemini.py +0 -0
  382. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_memory_tools.py +0 -0
  383. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_mlx_backend.py +0 -0
  384. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_process_manager.py +0 -0
  385. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_server_streaming.py +0 -0
  386. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_services.py +0 -0
  387. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_speaker_identity.py +0 -0
  388. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_tools.py +0 -0
  389. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_transformers_backend.py +0 -0
  390. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_tts.py +0 -0
  391. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_utils.py +0 -0
  392. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_wake_word.py +0 -0
  393. {agent_cli-0.94.0 → agent_cli-0.94.2}/tests/test_wyoming_utils.py +0 -0
  394. {agent_cli-0.94.0 → agent_cli-0.94.2}/uv.lock +0 -0
  395. {agent_cli-0.94.0 → agent_cli-0.94.2}/zensical.toml +0 -0
@@ -11,13 +11,13 @@ repos:
11
11
  - id: end-of-file-fixer
12
12
  - id: mixed-line-ending
13
13
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
- rev: "v0.15.12"
14
+ rev: "v0.15.13"
15
15
  hooks:
16
16
  - id: ruff
17
17
  args: ["--fix"]
18
18
  - id: ruff-format
19
19
  - repo: https://github.com/pre-commit/mirrors-mypy
20
- rev: "v1.20.2"
20
+ rev: "v2.1.0"
21
21
  hooks:
22
22
  - id: mypy
23
23
  additional_dependencies: ["types-PyYAML"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.94.0
3
+ Version: 0.94.2
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -385,7 +385,11 @@ def _should_skip_extra_check_for_process_control(
385
385
  return process.is_process_running(process_name)
386
386
 
387
387
 
388
- def requires_extras(*extras: str, process_name: str | None = None) -> Callable[[F], F]:
388
+ def requires_extras(
389
+ *extras: str,
390
+ process_name: str | None = None,
391
+ resolve_extras: Callable[[dict[str, object]], tuple[str, ...]] | None = None,
392
+ ) -> Callable[[F], F]:
389
393
  """Decorator to declare required extras for a command.
390
394
 
391
395
  Auto-installs missing extras by default. Disable via AGENT_CLI_NO_AUTO_INSTALL=1
@@ -399,7 +403,8 @@ def requires_extras(*extras: str, process_name: str | None = None) -> Callable[[
399
403
  def wrapper(*args: object, **kwargs: object) -> object:
400
404
  if _should_skip_extra_check_for_process_control(kwargs, process_name):
401
405
  return func(*args, **kwargs)
402
- if _check_and_install_extras(extras):
406
+ required_extras = resolve_extras(kwargs) if resolve_extras is not None else extras
407
+ if _check_and_install_extras(required_extras):
403
408
  raise typer.Exit(1)
404
409
  return func(*args, **kwargs)
405
410
 
@@ -73,6 +73,15 @@ def get_repo_root(path: Path | None = None) -> Path | None:
73
73
  return None
74
74
 
75
75
 
76
+ def _resolve_git_path(path: str, cwd: Path | None = None) -> Path:
77
+ """Resolve a path emitted by Git relative to the command cwd."""
78
+ resolved = Path(path).expanduser()
79
+ if resolved.is_absolute():
80
+ return resolved
81
+ base = cwd if cwd is not None else Path.cwd()
82
+ return (base / resolved).resolve()
83
+
84
+
76
85
  def get_common_dir(path: Path | None = None) -> Path | None:
77
86
  """Get the common git directory (shared across worktrees)."""
78
87
  try:
@@ -82,11 +91,43 @@ def get_common_dir(path: Path | None = None) -> Path | None:
82
91
  # In main repo, resolve relative to toplevel
83
92
  repo_root = get_repo_root(path)
84
93
  return repo_root / ".git" if repo_root else None
85
- return Path(common_dir)
94
+ return _resolve_git_path(common_dir, path)
86
95
  except subprocess.CalledProcessError:
87
96
  return None
88
97
 
89
98
 
99
+ def _is_git_modules_path(path: Path) -> bool:
100
+ """Return True when path points inside a .git/modules directory."""
101
+ parts = path.parts
102
+ return any(
103
+ part == ".git" and parts[i + 1 : i + 2] == ("modules",) for i, part in enumerate(parts)
104
+ )
105
+
106
+
107
+ def _get_configured_worktree(common_dir: Path) -> Path | None:
108
+ """Read core.worktree from a Git dir config, if present."""
109
+ config_file = common_dir / "config"
110
+ if not config_file.exists():
111
+ return None
112
+
113
+ result = _run_git(
114
+ "config",
115
+ "--file",
116
+ str(config_file),
117
+ "--path",
118
+ "core.worktree",
119
+ cwd=common_dir,
120
+ check=False,
121
+ )
122
+ if result.returncode != 0:
123
+ return None
124
+
125
+ worktree = result.stdout.strip()
126
+ if not worktree:
127
+ return None
128
+ return _resolve_git_path(worktree, common_dir)
129
+
130
+
90
131
  def get_main_repo_root(path: Path | None = None) -> Path | None:
91
132
  """Get the main repository root (even when in a worktree).
92
133
 
@@ -100,11 +141,17 @@ def get_main_repo_root(path: Path | None = None) -> Path | None:
100
141
  return common_dir.parent
101
142
  # Check if we're in a submodule (common_dir is inside .git/modules/)
102
143
  # e.g., /path/to/parent/.git/modules/submodule-name
103
- parts = common_dir.parts
104
- for i, part in enumerate(parts[:-1]):
105
- if part == ".git" and parts[i + 1] == "modules":
106
- # For submodules, use --show-toplevel to get the submodule's working directory
107
- return get_repo_root(path)
144
+ if _is_git_modules_path(common_dir):
145
+ # For submodules, use --show-toplevel to get the submodule's working
146
+ # directory. Linked worktrees of submodules can report the internal
147
+ # .git/modules directory instead, so fall back to core.worktree.
148
+ repo_root = get_repo_root(path)
149
+ if repo_root is not None and not _is_git_modules_path(repo_root):
150
+ return repo_root
151
+ configured_worktree = _get_configured_worktree(common_dir)
152
+ if configured_worktree is not None:
153
+ return configured_worktree
154
+ return repo_root
108
155
  # For bare repos or unusual setups, try to go up from common_dir
109
156
  return common_dir.parent
110
157
 
@@ -87,6 +87,13 @@ def _check_server_deps() -> None:
87
87
  raise typer.Exit(1)
88
88
 
89
89
 
90
+ def _resolve_tts_required_extras(kwargs: dict[str, object]) -> tuple[str, ...]:
91
+ """Choose the TTS backend extra after Typer has parsed --backend."""
92
+ backend = kwargs.get("backend")
93
+ backend_extra = backend if backend in ("piper", "kokoro") else "piper|kokoro"
94
+ return ("server", str(backend_extra), "wyoming")
95
+
96
+
90
97
  def _check_tts_deps(backend: str = "auto") -> None:
91
98
  """Check that TTS dependencies are available."""
92
99
  _check_server_deps()
@@ -95,8 +102,8 @@ def _check_tts_deps(backend: str = "auto") -> None:
95
102
  if not _has("kokoro"):
96
103
  err_console.print(
97
104
  "[bold red]Error:[/bold red] Kokoro backend requires kokoro. "
98
- "Run: [cyan]pip install agent-cli\\[tts-kokoro][/cyan] "
99
- "or [cyan]uv sync --extra tts-kokoro[/cyan]",
105
+ "Run: [cyan]pip install agent-cli\\[kokoro][/cyan] "
106
+ "or [cyan]uv sync --extra kokoro[/cyan]",
100
107
  )
101
108
  raise typer.Exit(1)
102
109
  return
@@ -105,8 +112,8 @@ def _check_tts_deps(backend: str = "auto") -> None:
105
112
  if not _has("piper"):
106
113
  err_console.print(
107
114
  "[bold red]Error:[/bold red] Piper backend requires piper-tts. "
108
- "Run: [cyan]pip install agent-cli\\[tts][/cyan] "
109
- "or [cyan]uv sync --extra tts[/cyan]",
115
+ "Run: [cyan]pip install agent-cli\\[piper][/cyan] "
116
+ "or [cyan]uv sync --extra piper[/cyan]",
110
117
  )
111
118
  raise typer.Exit(1)
112
119
  return
@@ -115,8 +122,8 @@ def _check_tts_deps(backend: str = "auto") -> None:
115
122
  if not _has("piper") and not _has("kokoro"):
116
123
  err_console.print(
117
124
  "[bold red]Error:[/bold red] No TTS backend available. "
118
- "Run: [cyan]pip install agent-cli\\[tts][/cyan] for Piper "
119
- "or [cyan]pip install agent-cli\\[tts-kokoro][/cyan] for Kokoro",
125
+ "Run: [cyan]pip install agent-cli\\[piper][/cyan] for Piper "
126
+ "or [cyan]pip install agent-cli\\[kokoro][/cyan] for Kokoro",
120
127
  )
121
128
  raise typer.Exit(1)
122
129
 
@@ -169,7 +176,8 @@ def _check_whisper_deps(backend: str, *, download_only: bool = False) -> None:
169
176
  if not _has("mlx_whisper"):
170
177
  err_console.print(
171
178
  "[bold red]Error:[/bold red] MLX Whisper backend requires mlx-whisper. "
172
- "Run: [cyan]pip install mlx-whisper[/cyan]",
179
+ "Run: [cyan]pip install agent-cli\\[mlx-whisper][/cyan] "
180
+ "or [cyan]uv sync --extra mlx-whisper[/cyan]",
173
181
  )
174
182
  raise typer.Exit(1)
175
183
  return
@@ -233,6 +241,21 @@ def _check_transformers_audio_model_deps(models: list[str]) -> None:
233
241
  raise typer.Exit(1)
234
242
 
235
243
 
244
+ def _resolve_whisper_required_extras(kwargs: dict[str, object]) -> tuple[str, ...]:
245
+ """Choose the Whisper backend extra after Typer has parsed --backend."""
246
+ backend_extras = {
247
+ "faster-whisper": "faster-whisper",
248
+ "mlx": "mlx-whisper",
249
+ "transformers": "whisper-transformers",
250
+ }
251
+ backend = kwargs.get("backend")
252
+ backend_extra = backend_extras.get(
253
+ str(backend),
254
+ "faster-whisper|mlx-whisper|whisper-transformers",
255
+ )
256
+ return ("server", backend_extra, "wyoming")
257
+
258
+
236
259
  def _print_optional_whisper_config(
237
260
  *,
238
261
  default_language: str | None,
@@ -249,7 +272,12 @@ def _print_optional_whisper_config(
249
272
 
250
273
 
251
274
  @app.command("whisper")
252
- @requires_extras("server", "faster-whisper|mlx-whisper|whisper-transformers", "wyoming")
275
+ @requires_extras(
276
+ "server",
277
+ "faster-whisper|mlx-whisper|whisper-transformers",
278
+ "wyoming",
279
+ resolve_extras=_resolve_whisper_required_extras,
280
+ )
253
281
  def whisper_cmd( # noqa: PLR0912, PLR0915
254
282
  model: Annotated[
255
283
  list[str] | None,
@@ -639,7 +667,7 @@ def transcribe_proxy_cmd(
639
667
 
640
668
 
641
669
  @app.command("tts")
642
- @requires_extras("server", "piper|kokoro", "wyoming")
670
+ @requires_extras("server", "piper|kokoro", "wyoming", resolve_extras=_resolve_tts_required_extras)
643
671
  def tts_cmd( # noqa: PLR0915
644
672
  model: Annotated[
645
673
  list[str] | None,
@@ -14,6 +14,7 @@ from agent_cli.dev.worktree import (
14
14
  _pull_lfs,
15
15
  create_worktree,
16
16
  find_worktree_by_name,
17
+ get_common_dir,
17
18
  get_main_repo_root,
18
19
  has_origin_remote,
19
20
  list_worktrees,
@@ -113,6 +114,21 @@ class TestResolveWorktreeBaseDir:
113
114
  assert result == tmp_path / "agent"
114
115
 
115
116
 
117
+ class TestGetCommonDir:
118
+ """Tests for get_common_dir function."""
119
+
120
+ def test_relative_common_dir_resolves_against_git_cwd(self, tmp_path: Path) -> None:
121
+ """Relative git-common-dir output is anchored to the Git command cwd."""
122
+ module_dir = tmp_path / "parent" / ".git" / "modules" / "my-submodule"
123
+ module_dir.mkdir(parents=True)
124
+ mock_run = MagicMock(return_value=MagicMock(stdout=".\n"))
125
+
126
+ with patch("agent_cli.dev.worktree._run_git", mock_run):
127
+ result = get_common_dir(module_dir)
128
+
129
+ assert result == module_dir
130
+
131
+
116
132
  class TestGetMainRepoRoot:
117
133
  """Tests for get_main_repo_root function."""
118
134
 
@@ -154,6 +170,33 @@ class TestGetMainRepoRoot:
154
170
  assert result == submodule_toplevel
155
171
  assert ".git/modules" not in str(result)
156
172
 
173
+ def test_linked_submodule_worktree_uses_configured_main_worktree(
174
+ self,
175
+ tmp_path: Path,
176
+ ) -> None:
177
+ """Linked worktrees of submodules resolve to the submodule checkout.
178
+
179
+ In this layout, git rev-parse --show-toplevel can return the internal
180
+ .git/modules/<name> directory. The main checkout is stored as
181
+ core.worktree in the module config.
182
+ """
183
+ parent = tmp_path / "parent"
184
+ submodule_common_dir = parent / ".git" / "modules" / "my-submodule"
185
+ submodule_common_dir.mkdir(parents=True)
186
+ (submodule_common_dir / "config").write_text(
187
+ "[core]\n\tworktree = ../../../my-submodule\n",
188
+ )
189
+ submodule_toplevel = parent / "my-submodule"
190
+ linked_worktree = parent / "my-submodule-worktrees" / "feature"
191
+
192
+ with (
193
+ patch("agent_cli.dev.worktree.get_common_dir", return_value=submodule_common_dir),
194
+ patch("agent_cli.dev.worktree.get_repo_root", return_value=submodule_common_dir),
195
+ ):
196
+ result = get_main_repo_root(linked_worktree)
197
+
198
+ assert result == submodule_toplevel
199
+
157
200
 
158
201
  class TestListWorktrees:
159
202
  """Tests for list_worktrees function."""
@@ -2,7 +2,9 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import ast
5
6
  import os
7
+ from pathlib import Path
6
8
  from unittest.mock import patch
7
9
 
8
10
  import pytest
@@ -33,6 +35,32 @@ class TestRequiresExtrasDecorator:
33
35
  assert hasattr(sample_command, "_required_extras")
34
36
  assert sample_command._required_extras == ("audio", "llm")
35
37
 
38
+ def test_decorator_uses_runtime_extras_resolver(self) -> None:
39
+ """Commands can choose concrete extras after Typer parses options."""
40
+
41
+ def resolve_extras(kwargs: dict[str, object]) -> tuple[str, ...]:
42
+ backend = kwargs["backend"]
43
+ return ("server", str(backend), "wyoming")
44
+
45
+ @requires_extras(
46
+ "server",
47
+ "piper|kokoro",
48
+ "wyoming",
49
+ resolve_extras=resolve_extras,
50
+ )
51
+ def sample_command(*, backend: str) -> str:
52
+ return f"success:{backend}"
53
+
54
+ with patch("agent_cli.core.deps._check_and_install_extras", return_value=[]) as mock_check:
55
+ assert sample_command(backend="kokoro") == "success:kokoro"
56
+
57
+ mock_check.assert_called_once_with(("server", "kokoro", "wyoming"))
58
+ assert getattr(sample_command, "_required_extras") == ( # noqa: B009
59
+ "server",
60
+ "piper|kokoro",
61
+ "wyoming",
62
+ )
63
+
36
64
  def test__get_install_hint_with_pipe_syntax(self) -> None:
37
65
  """Pipe syntax shows all alternatives in the hint."""
38
66
  hint = _get_install_hint("piper|kokoro")
@@ -43,6 +71,44 @@ class TestRequiresExtrasDecorator:
43
71
  assert "agent-cli\\[piper]" in hint
44
72
  assert "agent-cli\\[kokoro]" in hint
45
73
 
74
+ def test_commands_with_alternative_extras_have_runtime_resolver(self) -> None:
75
+ """Alternative extras on commands need a resolver for explicit backend options."""
76
+ repo_root = Path(__file__).resolve().parents[1]
77
+ violations: list[str] = []
78
+
79
+ for path in (repo_root / "agent_cli").rglob("*.py"):
80
+ tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path))
81
+ for node in ast.walk(tree):
82
+ if not isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
83
+ continue
84
+
85
+ for decorator in node.decorator_list:
86
+ if not isinstance(decorator, ast.Call):
87
+ continue
88
+
89
+ func = decorator.func
90
+ if not isinstance(func, ast.Name) or func.id != "requires_extras":
91
+ continue
92
+
93
+ extras = [
94
+ arg.value
95
+ for arg in decorator.args
96
+ if isinstance(arg, ast.Constant) and isinstance(arg.value, str)
97
+ ]
98
+ if not any("|" in extra for extra in extras):
99
+ continue
100
+
101
+ has_resolver = any(
102
+ keyword.arg == "resolve_extras" for keyword in decorator.keywords
103
+ )
104
+ if not has_resolver:
105
+ violations.append(f"{path.relative_to(repo_root)}:{node.lineno}")
106
+
107
+ assert not violations, (
108
+ "requires_extras alternatives choose a default extra during auto-install. "
109
+ "Pass resolve_extras for commands with alternative extras: " + ", ".join(violations)
110
+ )
111
+
46
112
 
47
113
  class TestExtrasMetadata:
48
114
  """Test the _extras.json metadata is properly structured."""
@@ -6,8 +6,10 @@ from pathlib import Path
6
6
  from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch
7
7
 
8
8
  import pytest
9
+ import typer
9
10
  from fastapi.testclient import TestClient
10
11
 
12
+ from agent_cli.server.cli import _check_tts_deps, _resolve_tts_required_extras
11
13
  from agent_cli.server.model_manager import ModelStats
12
14
  from agent_cli.server.tts.backends import SynthesisResult
13
15
  from agent_cli.server.tts.model_manager import TTSModelConfig, TTSModelManager
@@ -55,6 +57,78 @@ class TestTTSModelConfig:
55
57
  assert config.backend_type == "kokoro"
56
58
 
57
59
 
60
+ class TestTTSDependencyChecks:
61
+ """Tests for server TTS optional dependency handling."""
62
+
63
+ def test_resolve_tts_required_extras_uses_explicit_backend(self) -> None:
64
+ """Explicit TTS backends should install their matching extra."""
65
+ assert _resolve_tts_required_extras({"backend": "kokoro"}) == (
66
+ "server",
67
+ "kokoro",
68
+ "wyoming",
69
+ )
70
+ assert _resolve_tts_required_extras({"backend": "piper"}) == (
71
+ "server",
72
+ "piper",
73
+ "wyoming",
74
+ )
75
+
76
+ def test_resolve_tts_required_extras_keeps_auto_backend_alternatives(self) -> None:
77
+ """Auto backend should keep the existing Piper-or-Kokoro fallback."""
78
+ assert _resolve_tts_required_extras({"backend": "auto"}) == (
79
+ "server",
80
+ "piper|kokoro",
81
+ "wyoming",
82
+ )
83
+
84
+ @pytest.mark.parametrize(
85
+ ("backend", "expected_extra", "unexpected"),
86
+ [
87
+ ("kokoro", "kokoro", "tts-kokoro"),
88
+ ("piper", "piper", "agent-cli\\[tts]"),
89
+ ],
90
+ )
91
+ def test_backend_dependency_hint_uses_existing_extra(
92
+ self,
93
+ backend: str,
94
+ expected_extra: str,
95
+ unexpected: str,
96
+ ) -> None:
97
+ """Missing backend deps should point at existing extras."""
98
+ with (
99
+ patch(
100
+ "agent_cli.server.cli._has",
101
+ side_effect=lambda package: package in {"uvicorn", "fastapi"},
102
+ ),
103
+ patch("agent_cli.server.cli.err_console.print") as mock_print,
104
+ pytest.raises(typer.Exit),
105
+ ):
106
+ _check_tts_deps(backend)
107
+
108
+ message = mock_print.call_args[0][0]
109
+ assert f"agent-cli\\[{expected_extra}]" in message
110
+ assert f"uv sync --extra {expected_extra}" in message
111
+ assert unexpected not in message
112
+
113
+ def test_auto_dependency_hint_uses_backend_extras(self) -> None:
114
+ """Missing auto backend deps should list installable backend extras."""
115
+ with (
116
+ patch(
117
+ "agent_cli.server.cli._has",
118
+ side_effect=lambda package: package in {"uvicorn", "fastapi"},
119
+ ),
120
+ patch("agent_cli.server.cli.err_console.print") as mock_print,
121
+ pytest.raises(typer.Exit),
122
+ ):
123
+ _check_tts_deps("auto")
124
+
125
+ message = mock_print.call_args[0][0]
126
+ assert "agent-cli\\[piper]" in message
127
+ assert "agent-cli\\[kokoro]" in message
128
+ assert "agent-cli\\[tts]" not in message
129
+ assert "tts-kokoro" not in message
130
+
131
+
58
132
  class TestModelStats:
59
133
  """Tests for ModelStats dataclass with TTS-specific fields."""
60
134
 
@@ -9,8 +9,10 @@ from pathlib import Path
9
9
  from unittest.mock import AsyncMock, patch
10
10
 
11
11
  import pytest
12
+ import typer
12
13
  from fastapi.testclient import TestClient
13
14
 
15
+ from agent_cli.server.cli import _check_whisper_deps, _resolve_whisper_required_extras
14
16
  from agent_cli.server.model_manager import ModelStats
15
17
  from agent_cli.server.whisper.backends import TranscriptionResult
16
18
  from agent_cli.server.whisper.backends.base import UnsupportedRequestError
@@ -68,6 +70,64 @@ class TestModelConfig:
68
70
  assert config.trust_remote_code is True
69
71
 
70
72
 
73
+ class TestWhisperDependencyChecks:
74
+ """Tests for server Whisper optional dependency handling."""
75
+
76
+ def test_resolve_whisper_required_extras_uses_explicit_backend(self) -> None:
77
+ """Explicit Whisper backends should install their matching extra."""
78
+ assert _resolve_whisper_required_extras({"backend": "faster-whisper"}) == (
79
+ "server",
80
+ "faster-whisper",
81
+ "wyoming",
82
+ )
83
+ assert _resolve_whisper_required_extras({"backend": "mlx"}) == (
84
+ "server",
85
+ "mlx-whisper",
86
+ "wyoming",
87
+ )
88
+ assert _resolve_whisper_required_extras({"backend": "transformers"}) == (
89
+ "server",
90
+ "whisper-transformers",
91
+ "wyoming",
92
+ )
93
+
94
+ def test_resolve_whisper_required_extras_keeps_auto_backend_alternatives(self) -> None:
95
+ """Auto backend should keep the existing Whisper backend fallback."""
96
+ assert _resolve_whisper_required_extras({"backend": "auto"}) == (
97
+ "server",
98
+ "faster-whisper|mlx-whisper|whisper-transformers",
99
+ "wyoming",
100
+ )
101
+
102
+ @pytest.mark.parametrize(
103
+ ("backend", "expected_extra"),
104
+ [
105
+ ("faster-whisper", "faster-whisper"),
106
+ ("mlx", "mlx-whisper"),
107
+ ("transformers", "whisper-transformers"),
108
+ ],
109
+ )
110
+ def test_backend_dependency_hint_uses_existing_extra(
111
+ self,
112
+ backend: str,
113
+ expected_extra: str,
114
+ ) -> None:
115
+ """Missing backend deps should point at existing extras."""
116
+ with (
117
+ patch(
118
+ "agent_cli.server.cli._has",
119
+ side_effect=lambda package: package in {"uvicorn", "fastapi"},
120
+ ),
121
+ patch("agent_cli.server.cli.err_console.print") as mock_print,
122
+ pytest.raises(typer.Exit),
123
+ ):
124
+ _check_whisper_deps(backend)
125
+
126
+ message = mock_print.call_args[0][0]
127
+ assert f"agent-cli\\[{expected_extra}]" in message
128
+ assert f"uv sync --extra {expected_extra}" in message
129
+
130
+
71
131
  class TestModelStats:
72
132
  """Tests for ModelStats dataclass."""
73
133
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes