@gcavanunez/slinky
v0.4.0
Published
Standalone CLI and TUI for managing a separate agent skills repository.
Maintainers
Readme
Slinky
skills host global agent stores
├─ skills/ ┐ ~/.agents/skills/
├─ vendor/ ├─ slinky ─> ~/.claude/skills/
└─ skills.manifest.json ┘ project-local skillsSlinky keeps your coding-agent skills in one versioned repository and reconciles them into the global stores agents read from. Skills you write live in skills/; skills you pull from others are vendored under vendor/ with their upstream provenance, so they can be updated, diffed, and shared across machines through git.
Install
npm install --global @gcavanunez/slinky
npx skills add gcavanunez/slinky --skill slinky --global --yes # the agent-facing skillThe npm package installs a standalone binary for macOS and glibc Linux on ARM64 and x64; Bun is not required at runtime. Archives are also attached to each GitHub release. Slinky needs Git, tar, diff, and Node.js/npx on PATH.
Quick start
slinky init /path/to/my-agent-skills # record the host repo
slinky bootstrap --dry-run # see what would change
slinky bootstrap # back up, materialise, verify
slinky # open the TUIOn another machine, clone and set up in one step:
slinky bootstrap --clone=https://github.com/you/my-agent-skills.gitStarting from nothing? The guide shows how to create an empty host.
Everyday use
slinky status # catalog, live state, drift
slinky enable <skill> # or disable, or profile apply <name>
slinky autoinvoke <skill> off # keep installed; activate explicitly in OpenCode
slinky skills add owner/repo --skill x # vendor a skill from skills.sh
slinky update --check # anything new upstream?
slinky update # review and accept changes
slinky sync # save, pull, reconcile, restoresync is the whole loop: it commits reviewed catalog changes, pulls the upstream, rebuilds the global stores, and resets live vendor copies to the catalog. Preview it with --dry-run.
To keep other machines current without logging into each one, register them on the machine that can push and let it drive them over ssh:
slinky fleet add devbox me@devbox # once per follower
slinky fleet sync # sync + push here, then each follower pulls and restoresThe guide covers the details.
The TUI
One catalog tree on the left, the selected skill's documentation on the right.

| key | does |
| --------------- | ------------------------------------------------------------------------------------- |
| j/k h/l | move; fold or unfold a group |
| space | toggle a skill, or every skill in a group from its heading |
| A | cycle OpenCode invocation: manual, automatic, inherit |
| z / Z | fold one group / fold all |
| / | filter the catalog, or search the document |
| enter i | open the document / show details |
| d u | diff a drifting vendor skill / check upstream |
| e a L p | edit, index/adopt a skill, link into a project, manage profiles |
| 1 2 3 | available here, all skills, skills waiting to be adopted |
| F | fork a vendor skill into skills/ as your own copy |
| S | run slinky sync (on a leader, the whole fleet); the tab row shows ⇣ N to pull |
| m | the fleet: add, edit, remove, and check the followers this machine leads |
| t | pick a theme (27 available, previewed live) |
| x v < > | zoom, cycle layouts, resize |
| ? | everything else |
How it fits together
- Local skills in
skills/are symlinked into~/.agents/skills. When OpenCode invocation metadata is needed, the symlink points to a generated copy refreshed during reconciliation. - Vendor skills in
vendor/are committed baselines, copied into the store sonpx skillscan update them;slinky updateshows you the diff before anything changes in the catalog. - Profiles in the manifest are shared enabled sets; a machine following one gets its edits on sync, and can still enable or disable a skill for itself. Machine state (
.local/state.json, gitignored) records what this machine follows or disables, and which projects have links. - Project links copy or symlink a catalog skill into another repository, excluded from that repo's git by default.
OpenCode invocation
Keep a skill available for explicit use without advertising it to OpenCode's model:
slinky autoinvoke make-pr off --dry-run
slinky autoinvoke make-pr off
slinky autoinvoke make-pr on # explicitly allow automatic discovery
slinky autoinvoke make-pr inherit # follow the skill's frontmatter againPreferences live in the catalog's gitignored .local/state.json and survive disable/re-enable and profile changes. status shows the effective setting and whether it comes from this host, upstream metadata, compatibility translation, or the default.
Slinky adds metadata.opencode/autoinvoke to global installations while preserving catalog sources and upstream provenance. Without a host preference, explicit upstream OpenCode metadata wins; otherwise disable-model-invocation: true translates to manual invocation. Skills with neither field retain OpenCode's default behavior.
off keeps explicit activation available. It does not change slash-command visibility. These preferences apply to global copies; project-local definitions and higher-priority OpenCode sources can take precedence. See OpenCode V2's skill documentation for discovery rules.
The catalog repo is yours; Slinky only owns the tooling. Save it with slinky save, share it with slinky push, and each machine's slinky sync keeps up.
Documentation
- Guide: every workflow in depth, TUI bindings, safety notes, and the full CLI reference.
- Data contract: the manifest, state, lock, and config formats.
- Slinky skill: what an agent reads to drive Slinky for you.
Development
git clone https://github.com/gcavanunez/slinky.git
cd slinky
bun install
bun test
bun run typecheck
bun run build:bin # dist/slinky for this platformBun 1.3 or newer. bun run package:smoke builds and installs the npm package the way a release does.
Credits
This project draws inspiration from and utilities from:
