Problem
claude-code-tools ships ~17 CLI tools in one PyPI package. Installing any one tool (e.g. just voice-type) pulls the base dependencies for all of them, and there is no way to say "give me only this tool."
Options
A. Slim base + per-tool extras (cheap; no restructure)
Move heavy base deps (tantivy, mcp, questionary, ...) into per-tool optional-dependency groups so the base install is a skeleton. Each tool documents its extra: uv tool install "claude-code-tools[voice-mlx]", `[aichat]", etc. All entry points still land on PATH (unavoidable within one package) but dependency weight becomes pay-per-tool. Cost: existing users must add the right extra; imports must stay lazy (mostly already true).
B. uvx-first docs (zero work)
uvx --from "claude-code-tools[voice-mlx]" voice-type avoids any permanent install. Complements A; doesn't reduce resolution weight.
C. Extract voice-type as a uv workspace member publishing its own PyPI package
Give claude_code_tools/voice_type/ its own pyproject.toml as a uv workspace member in this same repo (no code moves, monorepo intact). Publishes as voice-type -> users run uvx voice-type. claude-code-tools[voice] then depends on it, so existing users are unaffected. voice-type is the easiest candidate: fully self-contained subpackage, zero imports from the rest of the repo. Cost: second publish target in Makefile/commitizen, PyPI name claim. Also the best marketing story (standalone Show-HN-able tool).
Non-options
uv tool install/pipx have no "subset of entry points" flag.
- PEP 735 dependency groups aren't consumable by end users from PyPI.
Recommendation
A now (pyproject-only, benefits every tool), C for voice-type when we want to promote it standalone.
Context: raised while building voice-type on PR #114.
Problem
claude-code-toolsships ~17 CLI tools in one PyPI package. Installing any one tool (e.g. justvoice-type) pulls the base dependencies for all of them, and there is no way to say "give me only this tool."Options
A. Slim base + per-tool extras (cheap; no restructure)
Move heavy base deps (tantivy, mcp, questionary, ...) into per-tool optional-dependency groups so the base install is a skeleton. Each tool documents its extra:
uv tool install "claude-code-tools[voice-mlx]", `[aichat]", etc. All entry points still land on PATH (unavoidable within one package) but dependency weight becomes pay-per-tool. Cost: existing users must add the right extra; imports must stay lazy (mostly already true).B. uvx-first docs (zero work)
uvx --from "claude-code-tools[voice-mlx]" voice-typeavoids any permanent install. Complements A; doesn't reduce resolution weight.C. Extract voice-type as a uv workspace member publishing its own PyPI package
Give
claude_code_tools/voice_type/its ownpyproject.tomlas a uv workspace member in this same repo (no code moves, monorepo intact). Publishes asvoice-type-> users runuvx voice-type.claude-code-tools[voice]then depends on it, so existing users are unaffected. voice-type is the easiest candidate: fully self-contained subpackage, zero imports from the rest of the repo. Cost: second publish target in Makefile/commitizen, PyPI name claim. Also the best marketing story (standalone Show-HN-able tool).Non-options
uv tool install/pipx have no "subset of entry points" flag.Recommendation
A now (pyproject-only, benefits every tool), C for voice-type when we want to promote it standalone.
Context: raised while building voice-type on PR #114.