quiver 发布:用一个 swe 命令统一管理本机 AI 编码 CLI
c-wenlong/quiver
开源项目 quiver 发布,提供 swe 命令统一管理本机多个 AI 编码 CLI,可启动、恢复会话并读取各工具日志做用量分析。它内置 21 个 AI 编码 CLI 的识别表、15 个工具的会话解析器,并支持在工具间同步 MCP 服务器配置和发现已安装的 Agent 技能。项目要求 Python 3.11+,核心 CLI 无第三方运行时依赖,可通过 pipx、Nix 或源码安装。
One command to launch, resume, and analyze every AI coding CLI on your machine.
Install · Quick start · Commands · Skills · How it works · Contributing
quiver is a central manager for the growing zoo of AI coding command-line tools — Claude Code, Codex, Gemini CLI, Cursor CLI, opencode, Copilot, and many more.
It keeps a small registry of the harnesses you use, launches any of them (by name or short alias), lets you resume recent sessions across any agent, mines read-only usage analytics from each tool's own logs, discovers agent skills installed across your machine, and keeps MCP server configs in sync between tools.
The command you type is swe (short, fits in muscle memory). The project and Python package are named quiver — think of it as the quiver that holds all your arrows (see the mascot above).
$ swe list --usage
AI Coding Tools
│ NAME │ COMMAND │ VERSION │ ALIASES │ 100d │ QUOTA │ INST │ DESCRIPTION
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
★ │ claude │ claude │ 2.1.126 │ cc │ 412 │ ◕ 5h:3h12m │ ✓ │ Claude Code by Anthropic — agentic coding in the terminal
★ │ codex │ codex │ 0.133.0 │ cx │ 288 │ ◑ 5d19h │ ✓ │ OpenAI Codex CLI
│ cursor │ agent │ 2026.06.24 │ cs │ 4 │ — │ ✓ │ Cursor CLI — AI-powered editor agent
│ droid │ droid │ 0.24.0 │ df │ 31 │ — │ ✓ │ Factory Droid CLI
│ gemini │ gemini │ 0.35.1 │ gg │ 12 │ — │ ✓ │ Gemini CLI by Google
│ opencode │ opencode │ 1.17.11 │ oc │ 96 │ — │ ✓ │ opencode — open source terminal agent
6/6 installed · 2 starred · swe use <name> │ swe hs star <name> │ swe hs archive <name> │ swe info <name>
★ = favourited (pinned top, neon border)
tags: agentic coding local
Why quiver?
If you juggle more than one AI coding agent you end up with a mess:
- Different launch commands and resume flags for every tool
- Usage scattered across a dozen log formats
- MCP server definitions copy-pasted between configs
- Skills installed in five different directory trees
quiver puts a single, consistent front door on all of it — without wrapping or replacing the tools themselves. It reads their logs read-only and shells out to the real binaries.
Features
| Area | What you get |
|---|---|
| Registry | List every AI coding CLI with tags, aliases, versions, and install status |
| Launch | Start any tool by name or alias; extra args pass straight through (execvp) |
| Sessions | Unified, time-sorted view of recent sessions across 21 agents + one-command resume |
| Models | Aggregate model usage parsed read-only from each tool's session logs |
| Skills | Discover, list, catalog, symlink, and move skills across harness roots |
| MCP sync | Inspect, compare, validate, and copy MCP servers between tools |
| Rate limits | Remaining quota + reset countdown for starred Codex, Copilot, Claude, Droid, Freebuff, Cursor, and Devin harnesses |
| Favourites | Pin harnesses to the top of swe list and opt them into usage polling |
| Autocomplete | Shell tab-completion for zsh, bash, and fish (tool names, aliases, tags, flags) |
| Providers | Manage API keys and metadata for 27 built-in LLM providers, plus your own |
Install
Requirements: Python 3.11+, and nothing else. The core CLI has no third-party runtime dependencies at all. The MCP history server is the only extra that adds a real dependency, and you opt into it.
On Python 3.10?
v0.2.9is the last release that runs on it; the floor moved to 3.11 afterwards. Pin that tag:pipx install git+https://github.com/c-wenlong/quiver.git@v0.2.9Check with
python3 --version. Ubuntu 22.04 LTS ships 3.10, so it needs the pin or a newer interpreter. Debian 12 (3.11), Ubuntu 24.04 (3.12) and current Fedora and Homebrew are all fine as they are.
pipx (recommended)
pipx install git+https://github.com/c-wenlong/quiver.git swe --help
Nix
nix run github:c-wenlong/quiver -- --help works one-off. To install, add
the flake as an input and put the package on your list:
inputs.quiver = { url = "github:c-wenlong/quiver"; inputs.nixpkgs.follows = "nixpkgs"; }; # then, in home.packages or environment.systemPackages: inputs.quiver.packages.${system}.default
The build runs the test suite, so nix build is also the fastest full check
of a clone. nix develop opens a shell with src/ on PYTHONPATH.
From source
git clone https://github.com/c-wenlong/quiver.git cd quiver python3 -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e . swe --help
Optional: MCP history server
Exposes recent sessions as an MCP tool (requires the server extra):
pip install -e ".[server]"
python -m quiver.mcp_serverQuick start
swe setup # six-stage interactive onboarding wizard swe setup --quick # only missing or actionable setup stages swe setup report # configure coding-session report models only swe setup --apply # apply safe defaults without prompting swe harness discover # scan PATH for unregistered AI CLIs swe mcp discover # find MCP servers not in ~/.quiver/mcp.json swe init # create ~/.quiver and link every harness to it swe list # all registered tools, starred first swe list agentic # filter by tag swe list --usage # add the 100d session count and remaining quota swe list --links # add AGENTS.MD and SKILLS link status instead swe list -n # bypass caches and refresh starred harness usage swe info claude # command, version, path, tags, aliases swe check # probe installed tools and refresh versions swe doctor # diagnose Node/npm/PATH issues, plus registry drift swe find # where shared assets live and what links to them, as counts swe find plugins --full # every plugin row, not just the counts swe find skills --harness=all # include archived harnesses' rows too swe use cc # launch Claude Code (alias for `claude`) swe use codex --help # extra args are passed straight through swe harness star gemini # pin a harness and enable its usage polling (toggle) swe harness archive aider "not a fit" # shelve a harness you ruled out swe edit claude --description "..." # edit registry fields (or interactive mode) swe session # last 10 sessions across ALL agents swe session use 3 # cd into session #3 and resume it swe session --agent claude # filter by agent swe session --here # only sessions in the current directory swe session -d 5 # sessions active during the latest 5 calendar dates swe session -w 3 # sessions active during the latest 3 times 7 dates swe session -s 2026-07-01 -e 2026-07-30 # inclusive explicit date range swe session --search refactor # filter by title/path/agent text swe session -i # arrow-key picker; space previews, Enter resumes swe config setup report # choose cheap summary and strong report models swe report daily # preview cost, confirm, then generate a report swe report weekly --here # weekly report for the current repository swe report followups # list user-owned follow-up work swe report warnings <manifest.json> # warnings recorded for one report swe models # model usage across all tools swe models -t -p # grouped by tool, with provider prefix swe autocomplete zsh # generate + inject shell tab-completion swe skills list # every SKILL.md across all skill roots swe skills refactor # filter skills by name or scope swe skills discover # find skill catalogs on Desktop/Documents swe skills discover --apply # register discovered catalogs swe skills catalog add ~/path/to/skills [label] swe find skills -r # every skill root, and what it links to swe skills help catalog # detailed help for catalog subcommands swe mcp list # matrix of MCP servers across tools swe mcp sync opencode cursor # copy MCP servers between tools
Commands
| Command | Aliases | Description |
|---|---|---|
swe init [--check|--force|--full|--migrate] |
Create ~/.quiver and symlink every harness to it |
|
swe setup [section] [--quick] |
Sectioned wizard for harnesses, providers, MCP, skills, reports, and verification | |
swe list [tag] [--usage|--links] [--scope=…] [-r|-n] |
ls |
List tools; --usage is the only part that touches the network |
swe list edit [--reset] / swe list legend |
Choose which columns show; explain the link glyphs | |
swe info <name|alias> |
Show command, version, path, tags, aliases | |
swe add <name> <cmd> … |
Register or update a tool | |
swe edit <name> [--field val …] |
Edit registry fields (flags or interactive) | |
swe remove <name|alias> |
rm |
Remove from registry (does not uninstall) |
swe harness <subcommand> … |
hs |
Every harness verb: list, edit, star, archive, discover |
swe harness star <name|alias> |
hs star |
Toggle a harness favourite (pins it to top of swe list) |
swe harness archive <name|alias> [why] |
hs archive |
Shelve a harness you've ruled out |
swe check |
Probe live versions and refresh registry | |
swe doctor |
Diagnose Node/npm/PATH issues hiding global installs, plus registry/help drift | |
swe install <name> |
Install a harness via npm and register it | |
swe harness discover [--apply|--apply-all] [--json] [--all] |
Scan PATH and home dirs for unregistered AI coding CLIs | |
swe discover [--apply] |
Alias for swe harness discover |
|
swe find [amd|skills|plugins|mcps] [--full] [--scope=global|local|all] [--harness=active|all] |
Read-only view of shared assets and what links to them | |
swe autocomplete [zsh|bash|fish] |
Generate + inject shell tab-completion | |
swe use <name|alias> [args…] |
run |
Launch a tool (replaces current process) |
swe session [N] [use N] [-i] [--agent X] [--here] [--search T] [date flags] |
List, browse, or resume recent sessions | |
swe report daily|weekly [date flags] |
Preview and summarize coding sessions | |
swe report followups|followup … |
Manage and launch work from persistent follow-ups | |
swe report warnings <manifest.json> |
Print the warnings recorded for one report | |
swe config [get|set|unset|edit|check|setup] |
Manage credential-free Quiver configuration | |
swe models [-t] [-p] |
Model usage analytics | |
swe skills list / swe skills <filter> [-d] |
sk |
List agent skills and paths (bare swe skills prints the overview) |
swe skills tree / swe skills scope list |
Kept for muscle memory; both forward to swe find skills |
|
swe skills link <harness> [target] |
Symlink harness skills root to shared/other | |
swe skills unlink <harness> [--mkdir] |
Break harness symlink (optional empty dir) | |
swe skills move <name> --from A --to B |
Move skill folder between roots | |
swe skills discover [--apply] |
Scan Desktop/Documents for skill catalogs | |
swe skills catalog add [path] [label] |
Register a skills directory (default: .) |
|
swe skills catalog . |
Add the current directory as a catalog | |
swe skills catalog list |
List configured skill catalogs | |
swe skills help [topic] |
Per-topic help (catalog, discover, tree, link, …) | |
swe tags |
List tags and associated tools | |
swe aliases |
List alias → tool mappings | |
swe mcp <subcommand> … |
MCP server management (see below) | |
swe providers [<subcommand>] … |
pv |
Provider API key + metadata management |
swe help [command] |
-h |
Full or per-command help |
Run swe <command> --help for detailed help on any command.
Coding-session reports
swe report daily and swe report weekly read the same local histories shown
by swe session. Before calling a model, Quiver removes startup-only sessions,
reuses digest-cached summaries, groups short meaningful sessions by Git
repository, and displays the planned model-call count and estimated input
tokens. Nothing runs until you confirm. Plans above the configured call or
token limits require typing the exact phrase process all.
The first run opens swe config setup report. Configure an inexpensive Claude
or Codex model for project/session summaries and a stronger model for the final
report. Credentials remain in the harness's existing login or environment.
Reports omit empty sections and persist under ~/.quiver/reports/ with
their manifests, session-summary cache, exclusions, cadence cursors, and
follow-up ledger. Follow-up status is always manual:
swe report followup done fu_1234
swe report followup work fu_1234 --resume
swe report followup work fu_1234 --new --harness codexDate flags use local calendar boundaries: -d N means the latest N dates,
-w N means N times seven dates, and -s YYYY-MM-DD -e YYYY-MM-DD supplies an
inclusive custom range. Custom ranges create reusable summaries without moving
the normal daily or weekly cursor.
Shell autocomplete
swe autocomplete zsh # or bash, fishGenerates a completion script and injects it into your shell profile. After running, restart your terminal or source ~/.zshrc (or equivalent). The completion provides:
- Subcommand names with descriptions (
swe <TAB>) - Tool names and aliases from your registry (
swe use <TAB>) - Tags for filtering (
swe list <TAB>) - Flags (
swe list --<TAB>,swe session --<TAB>)
Idempotent — safe to re-run. Uses a hidden swe __complete command for dynamic completions.
swe providers subcommands
| Subcommand | Description |
|---|---|
swe providers list [-d] [--api-keys-dir=DIR] [<filter>] |
Show every provider with its masked key (- if no key) |
swe providers info <name|alias> |
Full details for one provider + key file path |
swe providers add <name> [desc] [--url URL] [--env ENV, …] [--file NAME] |
Register a provider in ~/.quiver/config/providers.json |
swe providers remove <name> |
Unregister a provider (does not delete your key file) |
Keys live as plain-text files in ~/.api_keys/ (one per provider, filename = canonical slug). quiver stores metadata only — never the key string itself. Mask format: first8 + *** + last4 + (len=N); short keys fall back to first3 + *** + (len=N); missing keys render as -. Override the keys dir per-invocation with --api-keys-dir=DIR.
Built-in providers (27): openai, anthropic, gemini, deepseek, zai, minimax, kimi, qwen, mimo, xai, stepfun, groq, upstage, cerebras, mistral, routing_run, opencode_zen, openrouter, together_ai, fireworks_ai, vercel_gateway, nebius, featherless, cohere, perplexity, github, huggingface. Add your own with swe providers add.
swe mcp subcommands
| Subcommand | Description |
|---|---|
swe mcp discover [--apply] |
Find MCP servers across tool configs |
swe mcp list [tool] |
Matrix view of MCP servers across tools |
swe mcp status [tool] |
List with health checks |
swe mcp sync <source> <target…> |
Copy servers between tools (format conversion) |
swe mcp diff <t1> <t2> |
Compare two tools' MCP configs |
swe mcp edit <tool> <name> |
Edit one server in $EDITOR |
swe mcp validate [tool…] |
Validate MCP config shape |
swe mcp doctor [--strict] |
Deep diagnostics |
Flags for sync: --only=a,b, --all, --force, --skip-conflicts, --dry-run,
--prune, --strict. Every subcommand has its own swe mcp <name> help.
Skills
Agent skills are folders containing a SKILL.md file. quiver scans built-in harness roots (shared, Cursor, Claude, Codex, plugins) plus any catalogs you register.
Typical layout
Most setups symlink every harness to one shared tree:
~/.quiver/skills ← canonical shared skills
~/.codex/skills → shared
~/.claude/skills → shared
~/.cursor/skills → shared
Run swe find skills -r to inspect this layout — it walks the filesystem, so it
sees roots a fixed candidate list would miss. swe skills tree and
swe skills scope list forward to the same view. swe skills link and
swe skills unlink record what they did in ~/.quiver/config/skill_links.json.
Discover and register catalogs
Project skill folders outside the default roots can be registered manually or discovered automatically:
swe skills discover # scan ~/Desktop and ~/Documents for */skills/ swe skills discover --apply # register new catalogs cd ~/Projects/my-app/skills && swe skills catalog . swe skills catalog list
Catalogs live in ~/.quiver/config/skill_catalogs.json. Nested catalogs (e.g. gbrain/skills inside ai-engineering/skills) are collapsed to the outermost match.
Symlinks and moving skills
Link all harnesses to shared (what swe setup step 4 does):
swe skills link codex swe skills link claude shared
Give one harness its own private skills tree:
swe skills unlink codex --mkdir swe skills move my-skill --from shared --to codex
Run swe skills help link, swe skills help move, etc. for detailed usage.
Listing skills
swe skills list # every skill: NAME, SCOPE, PATH swe skills <filter> # filter by name, scope, or harness swe skills <filter> -d # include descriptions swe find skills -r # every root with symlink kind + counts
How it works
flowchart LR
subgraph swe["swe CLI"]
R[Registry]
L[Launch]
S[Sessions]
RP[Reports]
M[Models]
K[Skills]
P[MCP sync]
end
R --> TJ["~/.quiver/config/harness.json"]
S --> Logs["Tool session logs\n(read-only)"]
RP --> Logs
RP --> Reports["~/.quiver/reports\n(manifests + follow-ups)"]
M --> Logs
K --> Roots["Skill roots\n~/.quiver/skills, plugins, …"]
P --> MCP["Per-tool MCP configs"]
L --> Bin["Real CLI binaries\nclaude, codex, …"]
Loading
- Registry — your tool list lives in
~/.quiver/config/harness.json. It starts empty:swe discovermatches what is actually on your PATH against a built-in recognition table, and only what it finds gets registered, so the file describes this machine rather than a wish list. Every entry carries its ownstate(active,starred, orarchived) instead of splitting favourites and shelved tools into separate files. Edited byswe add/remove/check/swe harness star/swe harness archive. Not shipped with the package (seeexamples/tools.example.json). - Launching —
swe useresolves a name or alias and replaces the current process viaos.execvp, so the tool behaves exactly as if you'd typed it directly. - Analytics —
swe sessionandswe modelsparse each tool's on-disk logs (e.g.~/.claude/projects,~/.codex/sessions,~/.local/share/opencode/opencode.db). quiver never writes to those files. - Reports — normalizes those logs into semantic messages, filters startup noise, batches useful sessions by project, and invokes configured Claude/Codex models only after a local cost preview is approved.
- Skills — walks known skill roots under
$HOME(and./.cursor/skills), de-duplicates symlinked paths, reads eachSKILL.mdfront matter. Catalogs fromskill_catalogs.jsonextend the scan;swe skills link/unlink/movemanage harness symlinks without touching skill content. - MCP sync — reads each tool's native MCP config, normalizes to a canonical shape, re-emits in the target format. Nothing is written unless you run a real (non-
--dry-run)syncoredit. - Rate limits —
swe listshows the percentage of quota remaining and fetches usage data only for starred harnesses that expose a rate limit API; Freebuff instead shows remaining/total referral-unlocked GLM 5.2 sessions. Starring is the explicit opt-in for provider traffic. Unstarred harnesses still show registry details and local 100-day session counts without running usage scripts. Codex, Copilot, Claude, Droid, Freebuff, Cursor, and Devin use their authenticated provider endpoints; Cursor shows the more exhausted of its included Auto-mode and named-model (API) usage for the current billing cycle. Antigravity is read through the running app or CLI's loopback-only quota RPC, so quiver never reads its Google OAuth credential directly; the last successful value remains available from the outage cache when Antigravity is closed. Results are cached inrate_limits_cache.json(5-minute TTL);swe list --refresh,swe list -r, andswe list -nbypass the fresh cache for starred harnesses only. The architecture is pluggable — additional fetchers can be registered inharness/rate_limits.py. On macOS python.org builds that lack CA certificates, remote fetchers retry with the operating system's own CA bundle (orcertifiif installed), still fully verified; with no bundle at all they send nothing and print how to fix it.
Configuration
Everything quiver persists lives under one root, ~/.quiver/. It is split by
lifecycle so the directory can be a git repo: config/ and the shared
AGENTS.md / skills/ are worth versioning, cache/ and backups/ are not
(a generated .gitignore covers them).
The root sits in $HOME rather than $HOME/.config deliberately. Quiver
manages coding harnesses, and most harness config directories are $HOME/.<tool>.
| Path | Purpose | Shipped? |
|---|---|---|
AGENTS.md |
Shared instructions, symlinked into each harness under its own filename | No — created by swe init |
skills/ |
Shared skill tree, symlinked in as every harness's skills/ |
No — created by swe init |
.linkignore |
Paths swe init leaves alone, one gitignore-style pattern per line |
No — seeded by swe init |
config/harness.json |
Your tool registry (versions, aliases, and per-harness state for this machine) | No — auto-created |
mcp.json |
MCP source of truth | No — created by swe mcp discover --apply |
config/providers.json |
Provider metadata and key locations | No — auto-created |
config/config.json |
Credential-free Quiver and report runner settings | No — created by swe config |
config/skill_catalogs.json |
Extra skill catalog directories | No — auto-created by discover/add |
config/skill_links.json |
Recorded harness skill-root symlinks | No — written by swe skills link / unlink |
cache/session_cache.json |
Cached session parse results (60s TTL) | No — auto-created |
cache/rate_limits_cache.json |
Cached rate limit fetches (5-minute TTL) | No — auto-created |
completions/ |
Shell completion scripts (zsh/bash/fish) | No — created by swe autocomplete |
reports/ |
Reports, manifests, summary cache, cursors, exclusions, and follow-ups | No — created by swe report |
backups/ |
Anything swe init replaced, timestamped |
No — auto-created |
Upgrading from a pre-0.2.7 install: swe init --migrate moves ~/.config/swe
into this layout and removes the old root.
The MCP subsystem also reads/writes each tool's native config (e.g. ~/.claude.json, ~/.cursor/mcp.json, ~/.config/opencode/opencode.json).
Supported tools
swe discover recognises 21 AI coding CLIs on sight: Claude Code, Codex, Gemini
CLI, GitHub Copilot CLI, Cursor CLI, opencode, Qwen Code, Mistral Vibe,
Crush, Cline, Goose, Aider, Continue, pi, Forge, Factory Droid, Augment, Kiro,
Blackbox, Freebuff, and Ollama. That is a recognition table, not a seed — nothing is
written to your registry until discovery finds the binary on PATH. Register anything
else by hand with swe add.
Session parsers currently cover 15 tools: opencode, Claude Code, Gemini, Codex, Cursor, pi, Freebuff, Droid, Copilot, Continue, Crush, Grok, Cline, Forge, and Devin. Parsers are built on three reusable family engines (SQLite, JSONL, JSON) with declarative per-tool configs. Model analytics cover opencode, Claude Code, Codex, and Freebuff.
Development
python3 -m venv .venv && source .venv/bin/activate pip install -e ".[test]" python -m unittest discover -s tests -p 'test_*.py' test_home="$(mktemp -d)" HOME="$test_home" python -m coverage run -m unittest discover -s tests -p 'test_*.py' python -m coverage combine python -m coverage report
CI runs the suite against a throwaway $HOME, so it never touches real config or
counts machine-local coding sessions as test coverage. Coverage includes child
processes, tracks branches, and must remain above the configured regression
floor. See the dated coverage audit for current risk areas;
the badge at the top of this README follows main live.
Reinstalling after changes
The swe command is a pip-installed console entry point ([project.scripts] in pyproject.toml). With an editable install (pip install -e .), new Python files are picked up automatically. But if you ever installed with a plain pip install . (non-editable), files are copied to site-packages and new modules won't appear until you reinstall:
pip install -e . # switch to editable, or sync site-packages swe list # verify the feature works end-to-end
Common pitfall: unit tests run with
PYTHONPATH=src, so they can pass while the installedswecommand silently fails because it's reading from a stale non-editable site-packages copy. Always verify with the realswecommand after adding files — if the feature doesn't show up, reinstall.
For pipx installs (always non-editable):
pipx install --force git+https://github.com/c-wenlong/quiver.git
E2e verification checklist
Every feature that adds files or modifies cmd_* handlers must pass this checklist before opening a PR:
- ✅ Unit tests pass:
python -m unittest discover -s tests -p 'test_*.py' - ✅ Package reinstalled:
pip install -e . - ✅ Verified with real
swecommand (not justPYTHONPATH=src python -m quiver.cli) - ✅ PR opened with clear description
Renaming
quiver centralizes naming so you can change it:
- CLI command —
CLI_NAMEinsrc/quiver/__init__.pyand[project.scripts]inpyproject.toml, then reinstall - Data dir —
DATA_DIR_NAMEinsrc/quiver/__init__.py; the root becomes~/.<name> - Package name — rename
src/quiver/, update imports andpyproject.toml
Contributing
Issues and pull requests are welcome. CONTRIBUTING.md covers the PR process, one concern per PR, and what CI will check. By taking part you agree to the Code of Conduct. Need help? See SUPPORT.md.
| Document | What it covers |
|---|---|
| AGENTS.md | The brief for coding agents: commands, throwaway-$HOME rule, gotchas log |
| ARCHITECTURE.md | Layering rules, ~/.quiver layout, registry and link states, session engines |
| CONTRIBUTING.md | How to propose and land a change |
| SECURITY.md | Supported versions and how to report a vulnerability |
| SUPPORT.md | Where to get help, in order: docs, swe doctor, issues |
| CODE_OF_CONDUCT.md | Contributor Covenant 2.1 |
| CHANGELOG.md | Release history |
| docs/COVERAGE.md | Dated coverage audit and current risk areas |
License
MIT — see LICENSE.
来源:GitHub · github.com
