Repository navigation
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.