/skill-it — your best skill is trapped in a folder; ship it like a product
A skill in your ~/.claude/skills/ helps you. A shipped skill helps
everyone — but shipping means a repo strangers can install, a README that sells
the why, manifests three crawlers can parse, and zero traces of your private
world left inside. skill-it is that whole pipeline as one command: the recipe
that shipped plan-it, build-it, review-it, prompt-it and conclude-it, made
repeatable for any skill and any GitHub owner.
Throughout, OWNER is the GitHub user/org you ship under and NAME is the
skill's public name.
Step 0 — Intent + the name workshop
- What's being shipped? An existing local skill (path it), a bundle, or a
new skill authored now. If new: write the personal version first, use it
once, THEN ship — never publish an untested recipe.
- Name it for marketing. A candidate must pass: (a) verb-able ("just
NAME-it") or a two-word noun with an obvious job; (b) family fit if it joins
a naming family (a verb chain sells as a slogan); (c) no collision — check
the local skills tree,
gh search repos NAME, and what npx skills add OWNER/NAME would look like; (d) the pain can headline without the name
explaining itself. Propose 2–3 names with one-line rationales; the user
picks. Keep their original working name as a trigger alias in the
description.
- Version:
1.0.0 for the first public release of a mature private skill
(the CHANGELOG tells the lineage honestly); 0.x only if genuinely
experimental.
Step 1 — Genericize (the two-pass sweep)
The private skill knows its author's world; the public one must not.
- Replace hardcodes with runtime detection or per-repo config: personal
vault paths → "if the user's CLAUDE.md declares one"; project skill names →
"detect
*deploy* in the project's .claude/skills/"; account/alias tables
→ derive from env or default; internal examples → generic examples. If the
skill needs per-user facts, give it a first-run setup interview
persisted in the target repo (a ## NAME — project setup block in
CLAUDE.md/AGENTS.md), asked once per repo, never global unless requested.
- Sweep pass 1 — grep every
.md/.json/.py/.html/.svg for: the author's
name/handle variants, employer/project names, vault names, account aliases,
machine paths (/Users/, /home/), customer names, private registry hosts.
- Sweep pass 2 — a second net with different vocabulary: internal tool
names, IP addresses (
[0-9]{1,3}(\.[0-9]{1,3}){3}), hostnames, private
repo names, personal folder conventions. Exit criterion: zero hits minus
false positives you can name (e.g. a hex color matching a pattern) — and
check the LICENSE copyright line matches OWNER.
- Secrets:
grep -rEi "(api[_-]?key|secret|token|password|gho_|sk-)" —
placeholders fine; anything real is a stop-ship.
Step 2 — Structure: progressive disclosure + bundling
- Thin core, heavy reference. The always-loaded
SKILL.md carries what
every invocation needs; large conditional legs go to references/<leg>.md,
read on demand — a 19K core + 7K conditional leg beats a 39K monolith the
common case pays for.
- Bundle the dependencies you'd otherwise assume. If the skill delegates to
a helper the world won't have, ship it in the plugin (
skills/<helper>/) —
and write graceful degradation for every Claude-Code-only helper: run the
phase inline, produce the markdown twin of any HTML artifact, and name what
ran inline in the output. Degradation is honest, never silent.
- Deterministic machinery over model-authored output. Anything renderable
(reports, pages) ships as script + template + a small JSON manifest the agent
authors — token-cheap and un-hallucinatable.
Step 3 — The repo scaffold
NAME/
SKILL.md # root crawler manifest — see below
README.md # marketing (Step 4)
CHANGELOG.md # semver, honest narrative per release
LICENSE # MIT, "Copyright (c) <year> OWNER (<owner url>)"
.gitignore
.claude-plugin/marketplace.json # marketplace namespace, $schema, plugins:[…]
plugins/NAME/
.claude-plugin/plugin.json # $schema, name, version, description, author, keywords
skills/NAME/SKILL.md # the plugin-installable skill (trigger-style frontmatter)
skills/NAME/references/*.md # progressive-disclosure legs
skills/NAME/<machinery> # scripts/templates the skill uses
skills/<helper>/SKILL.md # bundled dependencies
assets/NAME-hero.svg # hand-authored SVG flow diagram (dark bg)
qa/dryrun-scenarios.md # spec walkthroughs, LABELED as such — binary per-step checks
Root SKILL.md — what npx skills add installs, often the ONLY file that
lands, so it must be self-contained: the full flow inline, conditional legs
condensed in. Frontmatter per the crawler union: name, description (>- block, specific, triggers included), version, license, author, author_url, homepage, repository, metadata: {platforms, category}, keywords. Body ends with:
Portability/graceful-degradation section → Install (plugin + npx skills add + gh skill install) → Security considerations → author
footer.
Version consistency is a release gate: the same version string in root
frontmatter, plugin.json, and marketplace.json, asserted mechanically.
Step 4 — The marketing README
The formula, proven across five sibling repos:
- Centered header —
<h1>/NAME</h1>; the <h3> is a pain-first catch
phrase, never the family slogan (that lives in the family NOTE + footer).
Formula: name the gap between what the user believes and what is true —
«"Done" is a claim. Concluded is proven.» Then 2–3 consequence+promise
lines, hero SVG linking to #how-it-works, badge row (Quick Start · MIT ·
Works with Claude Code · Portable 70+ agents · author), anchor nav, and a
> [!NOTE] cross-linking sibling/family repos.
- Narrative — the pain in the user's life, then what the skill does. Short.
- "Why" table — without vs with, one row per failure mode.
- The honest claim — say plainly what it does NOT do.
- Installation — universal-installers
> [!TIP] (npx skills add OWNER/NAME -a <agent> + gh skill install OWNER/NAME), then per-agent
sections: Claude Code (native, full bundle) · Codex · OpenClaw · Cursor ·
VS Code + Copilot · Copilot CLI · Kiro (manual fallback) · Others; close
with the graceful-degradation > [!NOTE].
- How it works — ASCII flow diagram + the 2–3 hard-won details worth
telling.
- What's bundled table · Security considerations · Platform
compatibility — the standard 18-row table (Claude Code ✅ Native; Cursor ·
VS Code+Copilot · Copilot CLI · Codex · OpenCode · OpenClaw · Antigravity ·
Gemini CLI · Pi · Vibe · Hermes · Cline · KIMI · Trae · Nanobot · Kiro ·
"Windsurf · Zed · Amp · Warp · …50+ more") with the Native-vs-Supported
legend.
- License + centered family footer.
Hero SVG: hand-author it — dark gradient background, the skill's flow
left→right, slogan strip at the bottom. It must parse as XML.
Step 5 — Validate before shipping (all must pass)
- JSON manifests parse AND versions match across the three files.
- Root frontmatter parses as YAML (
awk the block out, feed a YAML parser).
- The hero SVG parses as XML.
- Smoke-run every bundled script with a tiny fixture; non-zero exit = stop-ship.
- Re-run both genericization sweeps on the final tree.
Step 6 — Ship
git init && git add <explicit paths> # read the staged list before committing
gh repo create OWNER/NAME --public --source=. --push --description "<pain-first one-liner>"
git branch -m master main && git push -u origin main
gh repo edit OWNER/NAME --default-branch main
gh repo edit OWNER/NAME --add-topic openclaw-skill --add-topic agent-skill \
--add-topic skill --add-topic skills --add-topic mcp --add-topic claude --add-topic claude-code
git archive --format=zip --prefix=NAME-X.Y.Z/ -o /tmp/NAME-X.Y.Z.zip HEAD
gh release create vX.Y.Z /tmp/NAME-X.Y.Z.zip --title "NAME vX.Y.Z" --notes "…"
Crawlers read the default branch — confirm it is main before claiming done.
Step 7 — Verify + hand off
- Installability probe — the only same-session VERIFIED you may claim:
npx --yes skills@latest add OWNER/NAME --list must print the skill's name
and description.
- Marketplace listings are asynchronous crawls — never claim them
in-session; hand off to a publisher flow (e.g. the DevOtts
skill-publisher skill) that adapts the repo per registry and writes an
honest per-marketplace status report.
- If a personal variant stays in
~/.claude/skills/, record the relationship
(personal = configured superset; public = generic) so future edits touch
both.
What NOT to do
- Don't publish an untested recipe — use the personal version first.
- Don't leave personal/project references, or a mismatched LICENSE line: both
sweeps are release gates.
- Don't ship a root SKILL.md that depends on files a single-file install won't
have; don't let degradation happen silently.
- Don't let three manifests disagree on the version.
- Don't claim a marketplace listing without a positive probe.
- Don't headline the family slogan — the headline sells the pain.
- Don't strip existing authorship credit from any skill you package.
Portability — graceful degradation outside Claude Code
skill-it itself is procedure, not machinery: it runs anywhere a
SKILL.md-reading agent runs. Where a step names a tool the host lacks
(gh CLI, npx), do the equivalent by hand (create the repo in the web UI,
attach the zip to a release) and name the substitution in the final report.
Security considerations
- The genericization sweep is a release gate: two grep passes for personal
data plus a secrets pattern scan; any real credential is a stop-ship.
- Local
gh keyring auth only — never a token pasted into chat.
- Nothing private is published: the repo ships only files staged by
explicit path, and the staged list is read before every commit.
Authored by DevOtts.
1---2name: skill-it-23description: Package a Claude/agent skill (or a whole plugin) into a public, installable, marketing-ready repo — the exact recipe behind the DevOtts *-it family (plan-it, build-it, review-it, prompt-it, conclude-it). Name workshop → genericization (two-pass sweep proving zero personal references) → progressive-disclosure structure → standard scaffold (root SKILL.md crawler manifest, plugin + marketplace manifests, pain-first marketing README + hero SVG + per-agent install matrix + compatibility table, CHANGELOG, QA, MIT LICENSE) → mechanical validation → ship (gh repo create → main → topics → tagged release) → installability probe. Trigger on "/skill-it", "skill it", "skill-devotts-builder", "package this skill", "ship this skill as a plugin", "create the plugin repo for X", "publish my skill like build-it", "turn this folder into an installable skill repo".4---56# /skill-it — your best skill is trapped in a folder; ship it like a product78A skill in your `~/.claude/skills/` helps you. A **shipped** skill helps9everyone — but shipping means a repo strangers can install, a README that sells10the *why*, manifests three crawlers can parse, and zero traces of your private11world left inside. skill-it is that whole pipeline as one command: the recipe12that shipped plan-it, build-it, review-it, prompt-it and conclude-it, made13repeatable for any skill and any GitHub owner.1415Throughout, `OWNER` is the GitHub user/org you ship under and `NAME` is the16skill's public name.1718## Step 0 — Intent + the name workshop19201. **What's being shipped?** An existing local skill (path it), a bundle, or a21 new skill authored now. If new: write the personal version first, use it22 once, THEN ship — never publish an untested recipe.232. **Name it for marketing.** A candidate must pass: (a) verb-able ("just24 NAME-it") or a two-word noun with an obvious job; (b) family fit if it joins25 a naming family (a verb chain sells as a slogan); (c) no collision — check26 the local skills tree, `gh search repos NAME`, and what `npx skills add27 OWNER/NAME` would look like; (d) the *pain* can headline without the name28 explaining itself. Propose 2–3 names with one-line rationales; the user29 picks. Keep their original working name as a trigger alias in the30 description.313. **Version:** `1.0.0` for the first public release of a mature private skill32 (the CHANGELOG tells the lineage honestly); `0.x` only if genuinely33 experimental.3435## Step 1 — Genericize (the two-pass sweep)3637The private skill knows its author's world; the public one must not.38391. **Replace hardcodes with runtime detection or per-repo config**: personal40 vault paths → "if the user's CLAUDE.md declares one"; project skill names →41 "detect `*deploy*` in the project's `.claude/skills/`"; account/alias tables42 → derive from env or default; internal examples → generic examples. If the43 skill needs per-user facts, give it a **first-run setup interview**44 persisted in the target repo (a `## NAME — project setup` block in45 CLAUDE.md/AGENTS.md), asked once per repo, never global unless requested.462. **Sweep pass 1** — grep every `.md/.json/.py/.html/.svg` for: the author's47 name/handle variants, employer/project names, vault names, account aliases,48 machine paths (`/Users/`, `/home/`), customer names, private registry hosts.493. **Sweep pass 2** — a second net with different vocabulary: internal tool50 names, IP addresses (`[0-9]{1,3}(\.[0-9]{1,3}){3}`), hostnames, private51 repo names, personal folder conventions. Exit criterion: zero hits minus52 false positives you can name (e.g. a hex color matching a pattern) — and53 check the LICENSE copyright line matches OWNER.544. **Secrets**: `grep -rEi "(api[_-]?key|secret|token|password|gho_|sk-)"` —55 placeholders fine; anything real is a stop-ship.5657## Step 2 — Structure: progressive disclosure + bundling5859- **Thin core, heavy reference.** The always-loaded `SKILL.md` carries what60 every invocation needs; large conditional legs go to `references/<leg>.md`,61 read on demand — a 19K core + 7K conditional leg beats a 39K monolith the62 common case pays for.63- **Bundle the dependencies you'd otherwise assume.** If the skill delegates to64 a helper the world won't have, ship it in the plugin (`skills/<helper>/`) —65 and write **graceful degradation** for every Claude-Code-only helper: run the66 phase inline, produce the markdown twin of any HTML artifact, and **name what67 ran inline in the output**. Degradation is honest, never silent.68- **Deterministic machinery over model-authored output.** Anything renderable69 (reports, pages) ships as script + template + a small JSON manifest the agent70 authors — token-cheap and un-hallucinatable.7172## Step 3 — The repo scaffold7374```75NAME/76 SKILL.md # root crawler manifest — see below77 README.md # marketing (Step 4)78 CHANGELOG.md # semver, honest narrative per release79 LICENSE # MIT, "Copyright (c) <year> OWNER (<owner url>)"80 .gitignore81 .claude-plugin/marketplace.json # marketplace namespace, $schema, plugins:[…]82 plugins/NAME/83 .claude-plugin/plugin.json # $schema, name, version, description, author, keywords84 skills/NAME/SKILL.md # the plugin-installable skill (trigger-style frontmatter)85 skills/NAME/references/*.md # progressive-disclosure legs86 skills/NAME/<machinery> # scripts/templates the skill uses87 skills/<helper>/SKILL.md # bundled dependencies88 assets/NAME-hero.svg # hand-authored SVG flow diagram (dark bg)89 qa/dryrun-scenarios.md # spec walkthroughs, LABELED as such — binary per-step checks90```9192**Root `SKILL.md`** — what `npx skills add` installs, often the ONLY file that93lands, so it must be **self-contained**: the full flow inline, conditional legs94condensed in. Frontmatter per the crawler union: `name, description (>- block,95specific, triggers included), version, license, author, author_url, homepage,96repository, metadata: {platforms, category}, keywords`. Body ends with:97**Portability/graceful-degradation** section → **Install** (plugin + `npx98skills add` + `gh skill install`) → **Security considerations** → author99footer.100101**Version consistency is a release gate**: the same version string in root102frontmatter, `plugin.json`, and `marketplace.json`, asserted mechanically.103104## Step 4 — The marketing README105106The formula, proven across five sibling repos:1071081. **Centered header** — `<h1>/NAME</h1>`; the `<h3>` is a **pain-first catch109 phrase**, never the family slogan (that lives in the family NOTE + footer).110 Formula: name the gap between what the user believes and what is true —111 *«"Done" is a claim. Concluded is proven.»* Then 2–3 consequence+promise112 lines, hero SVG linking to `#how-it-works`, badge row (Quick Start · MIT ·113 Works with Claude Code · Portable 70+ agents · author), anchor nav, and a114 `> [!NOTE]` cross-linking sibling/family repos.1152. **Narrative** — the pain in the user's life, then what the skill does. Short.1163. **"Why" table** — without vs with, one row per failure mode.1174. **The honest claim** — say plainly what it does NOT do.1185. **Installation** — universal-installers `> [!TIP]` (`npx skills add119 OWNER/NAME -a <agent>` + `gh skill install OWNER/NAME`), then per-agent120 sections: Claude Code (native, full bundle) · Codex · OpenClaw · Cursor ·121 VS Code + Copilot · Copilot CLI · Kiro (manual fallback) · Others; close122 with the graceful-degradation `> [!NOTE]`.1236. **How it works** — ASCII flow diagram + the 2–3 hard-won details worth124 telling.1257. **What's bundled** table · **Security considerations** · **Platform126 compatibility** — the standard 18-row table (Claude Code ✅ Native; Cursor ·127 VS Code+Copilot · Copilot CLI · Codex · OpenCode · OpenClaw · Antigravity ·128 Gemini CLI · Pi · Vibe · Hermes · Cline · KIMI · Trae · Nanobot · Kiro ·129 "Windsurf · Zed · Amp · Warp · …50+ more") with the Native-vs-Supported130 legend.1318. **License** + centered family footer.132133**Hero SVG**: hand-author it — dark gradient background, the skill's flow134left→right, slogan strip at the bottom. It must parse as XML.135136## Step 5 — Validate before shipping (all must pass)137138- JSON manifests parse AND versions match across the three files.139- Root frontmatter parses as YAML (`awk` the block out, feed a YAML parser).140- The hero SVG parses as XML.141- Smoke-run every bundled script with a tiny fixture; non-zero exit = stop-ship.142- Re-run both genericization sweeps on the final tree.143144## Step 6 — Ship145146```bash147git init && git add <explicit paths> # read the staged list before committing148gh repo create OWNER/NAME --public --source=. --push --description "<pain-first one-liner>"149git branch -m master main && git push -u origin main150gh repo edit OWNER/NAME --default-branch main151gh repo edit OWNER/NAME --add-topic openclaw-skill --add-topic agent-skill \152 --add-topic skill --add-topic skills --add-topic mcp --add-topic claude --add-topic claude-code153git archive --format=zip --prefix=NAME-X.Y.Z/ -o /tmp/NAME-X.Y.Z.zip HEAD154gh release create vX.Y.Z /tmp/NAME-X.Y.Z.zip --title "NAME vX.Y.Z" --notes "…"155```156157Crawlers read the **default branch** — confirm it is `main` before claiming done.158159## Step 7 — Verify + hand off1601611. **Installability probe** — the only same-session VERIFIED you may claim:162 `npx --yes skills@latest add OWNER/NAME --list` must print the skill's name163 and description.1642. **Marketplace listings** are asynchronous crawls — never claim them165 in-session; hand off to a publisher flow (e.g. the DevOtts166 `skill-publisher` skill) that adapts the repo per registry and writes an167 honest per-marketplace status report.1683. If a personal variant stays in `~/.claude/skills/`, record the relationship169 (personal = configured superset; public = generic) so future edits touch170 both.171172## What NOT to do173174- Don't publish an untested recipe — use the personal version first.175- Don't leave personal/project references, or a mismatched LICENSE line: both176 sweeps are release gates.177- Don't ship a root SKILL.md that depends on files a single-file install won't178 have; don't let degradation happen silently.179- Don't let three manifests disagree on the version.180- Don't claim a marketplace listing without a positive probe.181- Don't headline the family slogan — the headline sells the pain.182- Don't strip existing authorship credit from any skill you package.183184## Portability — graceful degradation outside Claude Code185186skill-it itself is procedure, not machinery: it runs anywhere a187SKILL.md-reading agent runs. Where a step names a tool the host lacks188(`gh` CLI, `npx`), do the equivalent by hand (create the repo in the web UI,189attach the zip to a release) and name the substitution in the final report.190191## Security considerations192193- **The genericization sweep is a release gate**: two grep passes for personal194 data plus a secrets pattern scan; any real credential is a stop-ship.195- **Local `gh` keyring auth only** — never a token pasted into chat.196- **Nothing private is published**: the repo ships only files staged by197 explicit path, and the staged list is read before every commit.198199---200_Authored by [DevOtts](https://github.com/DevOtts)._