LLM-powered zsh completion scaffolding for arbitrary CLIs
Project description
completion-ai
LLM-powered zsh completion scaffolding for arbitrary CLIs. Point it at any
command on your PATH and it will:
- Recursively run
<cmd> --help(and discovered subcommand--helps). Subcommand discovery is done by the LLM, not regex — soinstall [options],plugin|plugins, and other oddly-formatted entries are picked up. - Ask Qwen (via DashScope OpenAI-compatible API) to extract a structured schema of flags, subcommands, and positional arguments.
- Render a
#compdefzsh completion script using a deterministic template (the LLM never writes shell directly). - Run
zsh -nagainst the result and warn on syntax errors.
The output is meant to be reviewed by a human before installation — it's a scaffold, not a runtime completion engine.
Install
Recommended (global CLI, isolated venv managed by uv):
uv tool install -e .
Other options:
uv pip install -e . # into the current uv venv
pip install -e . # into the active python (conda, system, ...)
Requires DASHSCOPE_API_KEY in the environment.
Usage
completion-ai claude # writes ./_claude
completion-ai claude --install # install straight into oh-my-zsh
completion-ai claude -o ~/.zsh/completions/_claude
completion-ai docker --depth 3 -v # crawl deeper, verbose
completion-ai gh --dump-schema gh.json # also save intermediate schema
Options
| Flag | Default | Notes |
|---|---|---|
-o, --output PATH |
./_<cmd> |
Where to write the completion script |
-d, --depth N |
2 |
How deep to crawl subcommand help |
--model ID |
qwen-plus |
Override via COMPLETION_AI_MODEL too |
--dump-schema PATH |
— | Also save the JSON the LLM produced |
--no-syntax-check |
off | Skip zsh -n validation |
--install |
off | Install into $ZSH/custom/plugins/completion-ai/ |
-v, --verbose |
off | Progress logs to stderr |
Environment
DASHSCOPE_API_KEY— requiredCOMPLETION_AI_MODEL— defaults toqwen-plusCOMPLETION_AI_BASE_URL— defaults to DashScope OpenAI-compatible endpointZSH— oh-my-zsh root, used by--install(defaults to~/.oh-my-zsh)
Installing the generated completion
Option A — oh-my-zsh users (recommended)
completion-ai claude --install
This creates $ZSH/custom/plugins/completion-ai/_claude plus a
plugin stub. First time only, add the plugin to ~/.zshrc:
plugins=(git ... completion-ai)
Then refresh:
rm -f ~/.zcompdump* && exec zsh
Subsequent completion-ai <cmd> --install calls drop new completions into the
same plugin directory — no zshrc edits needed.
Option B — plain zsh
completion-ai claude -o ~/.zsh/completions/_claude
# in ~/.zshrc (one-time):
fpath=(~/.zsh/completions $fpath)
autoload -U compinit && compinit
How it works
[crawler] run `<cmd> --help`
↓
[llm] discover subcommand names from help text (1 call per node)
↓
[crawler] recursively run discovered subcommands' --help
↓
[llm] extract structured JSON schema from all help texts (1 call)
↓
[renderer] JSON → #compdef zsh template (deterministic, not LLM)
↓
[validator] zsh -n syntax check
For depth=2, that's 2 LLM calls total (1 discover + 1 extract).
Limitations
- Static only: dynamic completions (e.g.
git checkout <branch>) are not generated — the script may suggest a hint type (branch,host, ...) but won't query live state. - The LLM may miss hidden flags or mislabel value hints. Always diff against
<cmd> --helpbefore trusting. - Only zsh for now.
Development
git clone <repo> && cd completion-ai
uv venv && source .venv/bin/activate
uv pip install -e .
Benchmark
eval/check_claude.py 用 claude --help 及若干子命令的 help 文本作为
golden fixture,验证 discover_subcommands 和 _extract_node 的输出是
否符合预期。每次改 prompt 都应该跑一次。
# 用 uv(自动激活项目环境)
uv run python -m eval.check_claude
# 或直接用项目 venv
.venv/bin/python -m eval.check_claude
需要 DASHSCOPE_API_KEY。退出码 0/1,可直接接 CI。
样例输出:
=== claude ===
[discover] precision=1.00 recall=1.00 f1=1.00 -> PASS
[flags] 39/39 recall=1.00 -> PASS
[positionals] prompt OK -> PASS
[details] 11/11 rate=1.00 -> PASS
=== claude auth ===
[discover] precision=1.00 recall=1.00 f1=1.00 -> PASS
...
=== Summary ===
PASS claude
PASS claude auth
PASS claude mcp add
overall: PASS
评估维度与阈值
| 维度 | 含义 | 阈值 |
|---|---|---|
discover |
子命令集合 precision/recall/F1 | F1 ≥ 0.95 |
flags |
must-have flag 命中率 | recall ≥ 0.90 |
positionals |
名称与 repeatable 是否匹配 |
全中 |
details |
抽样 flag 的 short/takes_value/choices | 通过率 ≥ 0.85 |
扩展 fixture
加新用例只要两步,不用改脚本:
- 把目标命令的 help 文本存到
eval/fixtures/<name>_help.txtdocker buildx build --help > eval/fixtures/docker_buildx_build_help.txt
- 在
eval/fixtures/claude_expected.json的cases[]里追加一项:{ "path": ["docker", "buildx", "build"], "help_file": "docker_buildx_build_help.txt", "subcommands": [], "positionals": [{"name": "PATH"}], "must_have_flags": ["--tag", "--file", "--platform"], "flag_details": [ {"long": "--tag", "short": "-t", "takes_value": true} ] }
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file completion_ai-0.2.2.tar.gz.
File metadata
- Download URL: completion_ai-0.2.2.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
822921dab242213edbdfb83bebd2dd4bc2b19c26a7829d9e73813504b377fe1d
|
|
| MD5 |
7c60e486e1d6aa0a66784f58377caf50
|
|
| BLAKE2b-256 |
f1316e185f026400b6571222a461891a3b75efe00769d2de13902493e4231856
|
File details
Details for the file completion_ai-0.2.2-py3-none-any.whl.
File metadata
- Download URL: completion_ai-0.2.2-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06fe325fb255e756292b9b51b4afeacd0173c00f028a7bac787e3ebe10d67af5
|
|
| MD5 |
84a56772168fa0238090c5eccff10641
|
|
| BLAKE2b-256 |
748e5d86297de3dc93e3646b20fd41bf16b36a95897ad95631b097613b48416b
|