Repository navigation
Releases: c-wenlong/quiver
Release list
v1.0.0: first stable release
First stable release. swe (the CLI) and the Quiver macOS app share one data model under ~/.quiver. Every --json command uses the {schema, data} envelope, and the design is documented in docs/.
Highlights since 0.2.10
swe
- Cursor's Grok Bot allowance in
swe list --usage. - Harness display names and primary colours (
swe edit --display-name,--primary-color). - Devin's exhausted quota reads as 100% used.
- Changed:
swe harness discover,swe mcp discover,swe skills discoverandswe setupwith--jsonnow use the standard envelope, andswe setup --json --applyprints one document.
Quiver app
- Accounts, menu bar and desktop widgets: per-account projections, live previews, widgets that fill their space, and harness logos everywhere.
- Overview: a fixed-scale trend chart, a heatmap that responds on every square, cached ranges, and a scan that skips a broken source log with SQLite's real message.
- Compute: RAM, CPU and GPU trends in each harness's colour, a top-5 process fold, and cards for idle harnesses.
- Plugins and skills: browse and edit your own (display-name renames, manifest forms, a large file editor, add or remove parts, deletes go to the Trash), with marketplaces as collapsible cards.
- MCP servers in one Local/Remote list with folder git details inline. Service status cards start collapsed. API keys can be checked (salted fingerprints only) and renamed in place.
- Widgets render again: bundle versions are plain numbers, so WidgetKit accepts them.
Audits
- Databases and caches: docs/data-model.md.
- App structure and swe contracts: docs/app-architecture.md, docs/json-contracts.md.
- swe controller / service / model layering: docs/backend-architecture.md.
- Tests and coverage: Python above an 84% floor, QuiverCore at 86.75%. See docs/testing.md.
Full details are in CHANGELOG.md.
v0.2.9 — fixes v0.2.8
v0.2.8 could not start on Python 3.10 or 3.11. Upgrade if you installed it.
swe find's summary line used a nested f-string with implicit concatenation inside a replacement field:
print(f"\n {c('dim', f'{total} skills · {len(linked)} roots synced · '
f'{len(other)} left alone')}\n")That is PEP 701, valid only on 3.12+. The project's declared floor is 3.10, where it raises SyntaxError on import, so the CLI would not start at all. It parsed fine locally because the dev interpreter is 3.12.
Added: a syntax-floor test
Compiles every file in src/ with an interpreter at or below requires-python, so this class of bug fails locally rather than in a release.
Two earlier attempts at that guard passed while the bug was sitting in the tree, which is worth recording:
| Attempt | Why it silently passed |
|---|---|
ast.parse(feature_version=(3, 10)) |
feature_version gates a short list of AST features, not f-string tokenization. It accepts this syntax even at (3, 8). |
py_compile(cfile='/dev/null') |
Raises FileExistsError before it reaches the parser, and the test only caught PyCompileError, so the offender list stayed empty. |
It uses the builtin compile() now, and was verified the only way that means anything: by reintroducing the v0.2.8 defect and confirming it fails with the right file and line.
Everything in v0.2.8 is included here.
v0.2.8 — swe find
Broken. Use v0.2.9. This release raises
SyntaxErroron import on Python 3.10 and 3.11, so the CLI does not start.
swe init answers "what would change". There was no way to ask "what is there", which is the question you have when a slash command has gone missing or a harness is not picking something up.
swe find
swe find amd # AGENTS.md and every harness pointing at it
swe find skills # skills, plugins, and every harness skill root
swe find # bothRead-only, and it shares swe init's classification so the two cannot drift apart.
Where it scans
| default | the current directory, recursively |
--root / -r |
from wherever ~/.quiver lives, recursively |
What it shows: --scope=global\|local\|all, default global
A file is global when it sits directly in a harness root (~/.<tool>/ or ~/.config/<tool>/), or when it is symlinked to the shared copy. That rule alone cuts 112 AGENTS.md files on a real machine down to the 10 a harness actually loads into every session.
One level deeper inside a harness directory is neither global nor local: plugin caches, vendored repos, editor extensions, sandbox workspaces. Those ship their own instructions and never appear while you are coding, which makes them the interesting surface for injected text. They are counted in every view and listed under --scope=all:
10 found · 9 synced to the shared copy
41 more inside harness directories (plugin caches, vendored repos) — see --scope=all
So the number is always in front of you, and an unexplained jump after installing a plugin is visible without drowning the default view.
Two things the implementation needed
Pruning. Walking a home directory naively visits 107,803 directories in 9.3s, dominated by package-manager caches (~/.npm alone is ~20k). Pruning those plus build output and vendored checkouts brings it to 1.4s. There is no useful depth cap to apply instead, since real hits reach depth 14.
Middle elision. Paths shorten from the middle rather than the left. Nearly every one of these files is called AGENTS.md or CLAUDE.md, so left-truncation preserved the half carrying no information. The head is what distinguishes .codex from .cursor from .antigravity.
Removed
The ~/.agents legacy alias, along with the 74 per-skill symlinks six harnesses kept pointing into it. 42 of those were already broken. Those roots link to ~/.quiver/skills directly now.
40 tests on find, 867 passing overall. One asserts that swe find never writes to the filesystem.
v0.2.7 — one root: ~/.quiver
Quiver owned two directories: ~/.quiver for the assets harnesses read, and ~/.config/swe for its own state. Authored files lived in both, while 330 KB of cache sat next to tools.json. They are now one root, split by lifecycle rather than by audience, so ~/.quiver can be a git repo.
~/.quiver/
├── AGENTS.md symlinked into 9 harnesses under each one's own filename
├── skills/ symlinked in as every harness's skills/ (14 roots)
├── config/ tools, stars, mcp, providers, skill links ← version this
├── cache/ session + rate-limit caches ← gitignored
├── completions/ reports/ backups/
└── .gitignore
The root sits in $HOME rather than $HOME/.config to match the harnesses it manages: 24 of 28 harness config directories live there.
Added
swe initcreates the layout and symlinks each harness's instruction file and skills root to the shared copy. Filenames (CLAUDE.md,QWEN.md,CRUSH.md,GEMINI.md) were confirmed against the installed binaries; harnesses whose convention could not be confirmed are skipped rather than guessed at.swe init --migratemoves a pre-0.2.7~/.config/sweinto place. Unrecognised files go toconfig/rather than being dropped, and existing destinations are never clobbered.--checkfor a dry run,--forceto back up and replace real files.swe list --usageand--links. Usage was the only networked part of the listing, so it is now opt-in. The default runs in ~70 ms against ~870 ms on a cold cache, and the table narrowed from 146 to 128 columns.--linksshows AGENTS.md and skills link status.
Fixed
- The rate-limit cache never covered providers that report nothing. A fetcher returning no data was absent from the cache, so it counted as a miss and re-ran on every invocation. For antigravity that meant spawning two subprocesses per
swe list, 70 ms even on a warm cache. Negative results are now remembered for the same TTL, taking the warm path to 0.1 ms. Fetchers that hit the deadline are still retried rather than recorded as empty. paths.pyis now the single owner of the layout. Three modules each had their own hardcoded copy of the shared skills root, which is what brokeswe skills treewhen that tree moved.- Removed 331 KB of dead single-file-era source from the config directory (
mcp.py,mcp_formats.py,mcp_server.py,tests/,__pycache__/,archive/). Nothing referenced it: not the package, not any MCP config, not the shell profiles.
Upgrading
swe init --check # see what would change
swe init --migrate # move ~/.config/swe into ~/.quiver775 tests pass, 26 of them new and specific to the migration: no path constant escapes the root, caches never land in the versioned half, contents survive byte for byte, unknown files are kept rather than dropped, existing destinations are not overwritten, and a second run is a no-op.
v0.2.5
Skills management
swe skills discover— scan ~/Desktop and ~/Documents for skill catalogsswe skills catalog add|list|remove— register extra skill directories (catalog .for cwd)swe skills tree [--sync]— inspect harness symlink layoutswe skills link|unlink|move— manage symlinks and move skills between rootsswe skills help <topic>— per-topic help (catalog, discover, tree, link, unlink, move, scope)- Skills list shows VISIBLE VIA column for symlinked harness scopes
Docs
- README Skills section with discover, catalog, symlink, and move workflows
- Expanded
swe helpfor skills, setup, and discover
Install: pipx install git+https://github.com/c-wenlong/quiver.git@v0.2.5
v0.2.2
What's new
swe mcp discover— scan tool MCP configs vs~/.config/swe/mcp.jsonswe setup— now 3 steps: harnesses, MCP servers, skills-root symlinks- Social preview —
assets/social-preview.png(1280×640) - README — documents
setup,discover, andharness discover
Install
pipx install git+https://github.com/c-wenlong/quiver.git@v0.2.2v0.1.0 — Initial release
First public release of quiver — a central manager for AI coding CLI tools.
Install
pipx install git+https://github.com/c-wenlong/quiver.git
swe --helpHighlights
- Tool registry with tags, aliases, and 100-day usage sorting (
swe list) - Launch any registered CLI (
swe use) - Cross-agent session resume (
swe session) - Model usage analytics (
swe models) - Skills discovery across all skill roots (
swe skills) - MCP server sync between tools (
swe mcp)
See CHANGELOG.md for full details.