Skip to content

v0.2.7 — one root: ~/.quiver

Choose a tag to compare

@c-wenlong c-wenlong released this 19 Aug 17:55
· 1631 commits to main since this release

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 init creates 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 --migrate moves a pre-0.2.7 ~/.config/swe into place. Unrecognised files go to config/ rather than being dropped, and existing destinations are never clobbered. --check for a dry run, --force to back up and replace real files.
  • swe list --usage and --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. --links shows 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.py is now the single owner of the layout. Three modules each had their own hardcoded copy of the shared skills root, which is what broke swe skills tree when 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 ~/.quiver

775 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.