skillscope

Every SKILL.md across every agentic-CLI harness on your machine — in one TUI, in one keystroke.

github → claude code codex cursor opencode antigravity
Install — Linux + macOS
curl -sSL https://heidihowilson.github.io/skillscope/install.sh | sh

No Go required. Picks a writable directory on your PATH, sha256-verified against the release's checksums.txt. Windows, Homebrew, and other methods ↓

What it looks like

Matrix view: rows = skills, columns = scope, dots = harnesses that have the skill at that scope.

┌─ 1 Matrix ─┐ 2 Tree 3 Diff Harnesses: claude-code codex cursor opencode antigravity skill user project local ──────────────────────────────────────────────────────────────────────────── ag-skill · · bad-fm ! · · codex-skill · · cursor-skill · · git-helper · · local-skill · · multi-scope-skill · opencode-skill · · project-skill · · test-skill · · present ◐ shadowed (higher scope wins) · absent ! parse error [/] search [f] filter [p] preview [c] copy [m] move [d] delete [?] help

What it does

5 harnesses out of the box

Claude Code, Codex CLI, Cursor, OpenCode, Antigravity — each with their real brand colors and correct scope conventions.

3 visualizations

Matrix (default), Tree (scope-grouped with harness dots), Diff (LCS-aligned master/detail).

Safe writes

Copy / move / delete refuse read-only scopes and never follow symlinks. Delete requires retyping the skill name.

Plugin-based

Adding a new harness or view is one self-registering Go file. The core never has to know about it.

Headless mode

--json dumps every skill as a single versioned JSON document for scripting and CI checks.

Single static binary

No CGO. Linux / macOS / Windows. Ships pre-built via GitHub Releases on every tag.

Other ways to install

Homebrew (macOS + Linux)

brew install heidihowilson/tap/skillscope

Scoop (Windows)

scoop bucket add heidihowilson https://github.com/heidihowilson/scoop-bucket
scoop install skillscope

go install

go install github.com/heidihowilson/skillscope/cmd/skillscope@latest

Pre-built binaries also live on the Releases page. Pin a version with the curl-pipe installer via SKILLSCOPE_VERSION=v0.2.0.

Update

Use the same channel you installed from. Check what you're running with skillscope --version.

curl-pipecurl -sSL https://heidihowilson.github.io/skillscope/install.sh | sh
Homebrewbrew update && brew upgrade skillscope
Scoopscoop update skillscope
go installgo install github.com/heidihowilson/skillscope/cmd/skillscope@latest

Keymap, in one screen

Global

q · Ctrl+Cquit
?help overlay
/fuzzy search
Escclose preview / clear filter
19jump to view
v · Vcycle views
fcycle harness filter
scycle scope filter
gtoggle "shadowed only"
Rre-scan filesystem

Skill actions

ppreview: off → raw → rendered
eopen in $EDITOR
ccopy to scope (numbered picker, then 19)
mmove to scope
ddelete (re-type skill name to confirm)
yyank skill path

Extend it

The plugin surface is the whole point. Adding a harness is one self-registering file:

package myharness

import (
    "path/filepath"
    "github.com/charmbracelet/lipgloss"
    "github.com/heidihowilson/skillscope/internal/harness"
)

type h struct{}

func (h) ID() string            { return "myharness" }
func (h) Name() string          { return "My Harness" }
func (h) Color() lipgloss.Color { return lipgloss.Color("#FF66CC") }

func (h) Scopes(ctx harness.Context) []harness.Scope {
    scopes := []harness.Scope{{
        Harness: "myharness", Kind: harness.User,
        Path: filepath.Join(ctx.HomeDir, ".myharness", "skills"),
    }}
    if ctx.RepoRoot != "" {
        scopes = append(scopes, harness.Scope{
            Harness: "myharness", Kind: harness.Project,
            Path: filepath.Join(ctx.RepoRoot, ".myharness", "skills"),
        })
    }
    return scopes
}

func init() { harness.Register(h{}) }

Add a blank-import line in cmd/skillscope/main.go and it shows up in the tab bar. See CONTRIBUTING.md for adding a new view.

Why?

Agentic-CLI tools all converged on the same pattern: a SKILL.md file with YAML frontmatter living in a directory under ~/.<tool>/skills/ or ./.<tool>/skills/. The trouble is, once you use more than one tool, you have skills sprawled across 5 different conventions and you stop knowing what you have where. skillscope reads all of them, in one place, and lets you move things between scopes without leaving the terminal.