Take inventory of a local directory into a workbench you can browse, search, and click open.
It's a set with the other two:star-your-harness is responsible forbuilding, better-your-harness is responsible forcheckups, this one is responsible forday-to-day viewing。
Checkups answer "what's wrong around here"; the workbench answers "what do I have around here". The latter is a prerequisite for the former— with 155 Skills you simply can't remember what's there, and with 2000 notes scattered across 52 directories you can't find them either; what you need at times like that isn't a report, it's a shelf you can flip through.
Iron Rules
1. Read-only. This Skill does not modify any of the user's files.
The server has no write, modify, or delete interfaces; this is a design constraint, not a todo. The boundary of "actionable" is just open and locate—
call the system's open to hand files over to the user's own editor and Finder. If the user wants to change something, let them change it in the editor,
or go use better-your-harness's fix commands. Don't secretly add write interfaces just to be "more convenient".
2. All paths must be verified to fall within root.
serve.py 's safe_join resolves and compares, returning 403 if out of bounds. Skill cards' absolute paths have an additional whitelist
~/.claude and ~/.codex。When changing server-side code, do not bypass this layer—it is the local service's only boundary.
3. Numbers can only come from index.py; you are not allowed to make them up in conversation.
File counts, Skill counts, invocation counts are all based on index.json . For quantities the script hasn't counted, say "not counted".
Process
1. Start the service
python3 ~/.claude/skills/view-your-harness/scripts/serve.py <目录>
It will first run an index pass (a few seconds to half a minute, depending on directory size), then start the service and automatically open the browser. The terminal will print the port and the actual path being scanned. Ctrl-C to stop.
Common parameters:
| Parameter | Purpose |
|---|---|
--port 7799 |
Specify port. If occupied, it will automatically shift to the next one; generally no need to worry about it |
--no-open |
Don't automatically open the browser (remote/headless environment) |
--no-usage |
Skip session log statistics. Can be much faster when there are many logs, at the cost of no invocation counts |
This is a foreground process. Use run_in_background to start it, report the URL to the user, and don't foolishly wait for it to exit.
2. Delivery
Telling the user three things is enough: the address, which directory is being scanned, and press Ctrl-C to stop. Then use one or two sentences to say what stands out most in the inventory results (e.g. "130 of 155 Skills have never been invoked").
**Do not read the file list aloud in the conversation.** The list is right on the page; reading it aloud turns the workbench back into a chat log.
When you only want data, not the interface
If you need the inventory results for other analysis (e.g. feeding them to another Skill), just run the indexer separately:
python3 ~/.claude/skills/view-your-harness/scripts/index.py <目录> -o /tmp/index.json
What's in the workbench
Top bar: directory path, file count, directory count, total size, Skill count, used / not used.
One search box simultaneously searches file names, document titles, Skill names, and descriptions. Press / to focus,Esc to close the drawer.
Files page
- First-level directories on the left sorted by file count; click to drill down
- Cards show the document title (Markdown frontmatter title or the first
#, far more useful than the file name), type, size, last modified - Filter by type (document/code/data/image/audio-video/config), sort by last modified / size / name
Skills page
- One card per Skill: name, description,actual invocation count, file count, size, last updated
- Filter: All / Used / Never invoked / Incomplete metadata / Project-level
- The left side lists all source directories of the Skill, as well as the bare
skills/files under the.mdroot— those are not Skills, will never be loaded, and are things that should be cleaned up
Drawer: click any card to slide it out from the right. View the contents of text files, display images directly, and view the full SKILL.md for Skills. Three actions: Open (hand off to the system default program), Reveal in Finder, Copy absolute path.
Skills with the same name will be collapsed. It is very common to have one installed globally and another bundled by a plugin marketplace; keep the highest-priority entry by project > global > plugin, otherwise "how many have been used" will be double-counted, producing self-contradictory numbers like "8 used but only 10 invocations."
Basis for invocation counts
Only tool_use(name="Skill") of input.skillin session logs count as invocations; a Skill appearing in the system prompt's available list does not count.
These two bases can differ by two orders of magnitude—every round of conversation includes the list of all available Skills, and grepping by keyword would count every Skill as "used." If you see another tool report "Skill usage rate 100%," it has basically fallen into this trap.
The statistics cover all jsonl under ~/.claude/projects and ~/.codex/sessions (up to 1,200 files).
If you have switched clients or cleared logs, they cannot be counted; in that case the page will show "invocation count not counted" rather than showing 0.
Limitations
State it clearly proactively; do not let users think it can prove what it cannot prove:
- It only describes the current state of directories; it does not evaluate file quality, nor judge which Skill should be kept or deleted
- By default it indexes at most 20,000 files; if exceeded, it will be marked in the top bar as
+, not a full scan - It will skip build and cache directories such as
node_modules、.git、dist、.obsidianand other build and cache directories - The card wall renders at most 300 cards at a time; the rest rely on search to narrow down the range, not infinite scrolling
- "Never invoked" does not mean "useless"—newly installed ones, ones whose reference was manually viewed, and ones referenced internally by other Skills will all show as never invoked. This is a clue, not a verdict
Files
view-your-harness/
├── SKILL.md
└── scripts/
├── index.py 目录 + Skill 清点 → index.json(纯事实,不做判断)
├── serve.py 本地只读服务,零依赖,只绑 127.0.0.1
└── ui.html 单页工作台,原生 JS,跟随系统深浅色