Skills Social JSON
Read every skill in the skills folder and write a catalog JSON built for sharing: one
entry per skill, each with a fixed category, a one-line tagline, the moment you would
reach for it, and its slash invocation. Never edit a SKILL.md — this skill writes
exactly one file.
Inputs
Defaults; each is overridable by invocation args.
- Skills root: the directory containing this skill —
~/dotfiles/skills - Source of truth:
<root>/*/SKILL.md. Enumerate those directories, never the symlinks in~/.claude/skillsor~/.cursor/skills-cursor— those go stale when a skill is renamed - Output:
<root>/skills-social.json - Author:
git config user.name— never hardcode
Phase 1 — Collect the skills
- List every
<root>/*/SKILL.md. Each one is an entry, includingskills-socialitself. - Read the
nameanddescriptionfrontmatter of each.namemust equal the directory name — report a mismatch rather than silently trusting either. - Note any skill carrying
disable-model-invocation: true; itstriggersays when the user runs it, not when it fires automatically.
Phase 2 — Categorize
Assign exactly one category from this fixed vocabulary, so the rendered image can color-code consistently. Do not invent a new value — widen an existing category instead.
| category | covers | current members |
|---|---|---|
git-workflow |
branches, commits, PRs | reviewable-commits, stacked-pr-splitter, branch-test-plan |
code-quality |
how code gets written and changed | branch-comment-cleanup, minimal-code-changes |
web-audit |
shipping a page or site | a11y-page-audit, prod-page-audit |
tooling |
environment, docs, config plumbing | context7-mcp, env-example-sync |
meta |
skills and dotfiles about themselves | skills-audit, skill-best-practices-sync, shell-aliases-social, skills-social |
Phase 3 — Write the taglines
Rewrite each frontmatter description into image copy. The frontmatter is trigger bait for the model — never copy it verbatim.
description: one sentence, at most 80 characters, present tense, stating the outcome ("Turns a branch diff into a manual QA plan"). No "Use when…", no "This skill".trigger: at most six words naming the moment ("before opening a PR"). Lowercase, no trailing period.invocation:/<name>.
Phase 4 — Write the JSON
{
"meta": {
"author": "<from git config user.name>",
"source": "~/dotfiles/skills",
"generated": "YYYY-MM-DD",
"count": 13
},
"entries": [
{
"name": "branch-test-plan",
"category": "git-workflow",
"description": "Turns a branch diff into a manual QA plan with regression checks",
"trigger": "before opening a PR",
"invocation": "/branch-test-plan"
}
]
}
Sort entries by category in the vocabulary order above, then by name, so regenerating
produces a stable diff. Two-space indent, trailing newline.
Phase 5 — Verify
- Valid JSON:
python3 -c "import json;json.load(open('skills-social.json'))". meta.countequals the number ofentriesequals the number of*/SKILL.mddirectories under the root.- Every
categoryis in the fixed vocabulary, and nodescriptionexceeds 80 characters. - No private paths, hostnames, project IDs or credentials leaked out of any
SKILL.md— the output is committed to a public repo.
Report
Compare against the previous version of the file and print:
## Skills social — <date>
### Added
- <skill — category assigned>
### Removed
- <skill — no longer in the folder>
### Updated
- <skill — what changed: category, tagline, or trigger>
### Still needs human attention
- <name/directory mismatches, skills that resisted a one-line tagline>
Notes & edge cases
- A skill fits no category: widen the closest category's scope rather than adding a value; add one only when three or more skills would share it, and say so in the report.
- Stale symlinks:
~/.claude/skillscan hold dangling links to renamed skills — never enumerate from there. - Self-inclusion:
skills-socialappears in its own output. - Local skills:
~/.skills.localis private and machine-specific. Leave it out on purpose, even thoughmake slink-skillslinks it into~/.claude/skills. - Image generation: out of scope. The JSON is the deliverable, mirroring
zsh/shell-aliases-social.jsonand the image rendered from it.