/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.
Install
Claude Code (plugin, recommended):
/plugin marketplace add DevOtts/skill-it
/plugin install skill-it@devotts
Any SKILL.md-compatible agent:
npx skills add DevOtts/skill-it -a <agent> # peek first: npx skills add DevOtts/skill-it --list
gh skill install DevOtts/skill-it # GitHub CLI alternative
Getting started: point it at a skill —
/skill-it package ~/.claude/skills/my-standup-notes as a public repo under my GitHub
You get the name workshop, the genericization sweep with receipts, the full
scaffold, mechanical validation, the shipped GitHub repo with a tagged release —
and an installability probe as proof.
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-it3description: 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). Takes a local skill folder (or an idea for one), genericizes it (two-pass sweep proving zero personal/project references), applies progressive disclosure (thin SKILL.md + references/ legs), scaffolds the standard repo (root SKILL.md crawler manifest, Claude Code plugin + marketplace manifests, marketing README with a pain-first headline + hero SVG + per-agent install matrix + 18-row compatibility table, CHANGELOG, QA walkthroughs, MIT LICENSE), validates everything mechanically (JSON/YAML/SVG parse, version consistency, script smoke tests), then ships: gh repo create → main → discovery topics → tagged release with zip — and verifies installability with the skills CLI before claiming anything. Trigger on "/skill-it", "skill it", "package this skill", "ship this skill as a plugin", "create the plugin repo for m4license: MIT5---67# /skill-it — your best skill is trapped in a folder; ship it like a product89A skill in your `~/.claude/skills/` helps you. A **shipped** skill helps10everyone — but shipping means a repo strangers can install, a README that sells11the *why*, manifests three crawlers can parse, and zero traces of your private12world left inside. skill-it is that whole pipeline as one command: the recipe13that shipped plan-it, build-it, review-it, prompt-it and conclude-it, made14repeatable for any skill and any GitHub owner.1516Throughout, `OWNER` is the GitHub user/org you ship under and `NAME` is the17skill's public name.1819## Step 0 — Intent + the name workshop20211. **What's being shipped?** An existing local skill (path it), a bundle, or a22 new skill authored now. If new: write the personal version first, use it23 once, THEN ship — never publish an untested recipe.242. **Name it for marketing.** A candidate must pass: (a) verb-able ("just25 NAME-it") or a two-word noun with an obvious job; (b) family fit if it joins26 a naming family (a verb chain sells as a slogan); (c) no collision — check27 the local skills tree, `gh search repos NAME`, and what `npx skills add28 OWNER/NAME` would look like; (d) the *pain* can headline without the name29 explaining itself. Propose 2–3 names with one-line rationales; the user30 picks. Keep their original working name as a trigger alias in the31 description.323. **Version:** `1.0.0` for the first public release of a mature private skill33 (the CHANGELOG tells the lineage honestly); `0.x` only if genuinely34 experimental.3536## Step 1 — Genericize (the two-pass sweep)3738The private skill knows its author's world; the public one must not.39401. **Replace hardcodes with runtime detection or per-repo config**: personal41 vault paths → "if the user's CLAUDE.md declares one"; project skill names →42 "detect `*deploy*` in the project's `.claude/skills/`"; account/alias tables43 → derive from env or default; internal examples → generic examples. If the44 skill needs per-user facts, give it a **first-run setup interview**45 persisted in the target repo (a `## NAME — project setup` block in46 CLAUDE.md/AGENTS.md), asked once per repo, never global unless requested.472. **Sweep pass 1** — grep every `.md/.json/.py/.html/.svg` for: the author's48 name/handle variants, employer/project names, vault names, account aliases,49 machine paths (`/Users/`, `/home/`), customer names, private registry hosts.503. **Sweep pass 2** — a second net with different vocabulary: internal tool51 names, IP addresses (`[0-9]{1,3}(\.[0-9]{1,3}){3}`), hostnames, private52 repo names, personal folder conventions. Exit criterion: zero hits minus53 false positives you can name (e.g. a hex color matching a pattern) — and54 check the LICENSE copyright line matches OWNER.554. **Secrets**: `grep -rEi "(api[_-]?key|secret|token|password|gho_|sk-)"` —56 placeholders fine; anything real is a stop-ship.5758## Step 2 — Structure: progressive disclosure + bundling5960- **Thin core, heavy reference.** The always-loaded `SKILL.md` carries what61 every invocation needs; large conditional legs go to `references/<leg>.md`,62 read on demand — a 19K core + 7K conditional leg beats a 39K monolith the63 common case pays for.64- **Bundle the dependencies you'd otherwise assume.** If the skill delegates to65 a helper the world won't have, ship it in the plugin (`skills/<helper>/`) —66 and write **graceful degradation** for every Claude-Code-only helper: run the67 phase inline, produce the markdown twin of any HTML artifact, and **name what68 ran inline in the output**. Degradation is honest, never silent.69- **Deterministic machinery over model-authored output.** Anything renderable70 (reports, pages) ships as script + template + a small JSON manifest the agent71 authors — token-cheap and un-hallucinatable.7273## Step 3 — The repo scaffold7475```76NAME/77 SKILL.md # root crawler manifest — see below78 README.md # marketing (Step 4)79 CHANGELOG.md # semver, honest narrative per release80 LICENSE # MIT, "Copyright (c) <year> OWNER (<owner url>)"81 .gitignore82 .claude-plugin/marketplace.json # marketplace namespace, $schema, plugins:[…]83 plugins/NAME/84 .claude-plugin/plugin.json # $schema, name, version, description, author, keywords85 skills/NAME/SKILL.md # the plugin-installable skill (trigger-style frontmatter)86 skills/NAME/references/*.md # progressive-disclosure legs87 skills/NAME/<machinery> # scripts/templates the skill uses88 skills/<helper>/SKILL.md # bundled dependencies89 assets/NAME-hero.svg # hand-authored SVG flow diagram (dark bg)90 qa/dryrun-scenarios.md # spec walkthroughs, LABELED as such — binary per-step checks91```9293**Root `SKILL.md`** — what `npx skills add` installs, often the ONLY file that94lands, so it must be **self-contained**: the full flow inline, conditional legs95condensed in. Frontmatter per the crawler union: `name, description (>- block,96specific, triggers included), version, license, author, author_url, homepage,97repository, metadata: {platforms, category}, keywords`. Body ends with:98**Portability/graceful-degradation** section → **Install** (plugin + `npx99skills add` + `gh skill install`) → **Security considerations** → author100footer.101102**Version consistency is a release gate**: the same version string in root103frontmatter, `plugin.json`, and `marketplace.json`, asserted mechanically.104105## Step 4 — The marketing README106107The formula, proven across five sibling repos:1081091. **Centered header** — `<h1>/NAME</h1>`; the `<h3>` is a **pain-first catch110 phrase**, never the family slogan (that lives in the family NOTE + footer).111 Formula: name the gap between what the user believes and what is true —112 *«"Done" is a claim. Concluded is proven.»* Then 2–3 consequence+promise113 lines, hero SVG linking to `#how-it-works`, badge row (Quick Start · MIT ·114 Works with Claude Code · Portable 70+ agents · author), anchor nav, and a115 `> [!NOTE]` cross-linking sibling/family repos.1162. **Narrative** — the pain in the user's life, then what the skill does. Short.1173. **"Why" table** — without vs with, one row per failure mode.1184. **The honest claim** — say plainly what it does NOT do.1195. **Installation** — universal-installers `> [!TIP]` (`npx skills add120 OWNER/NAME -a <agent>` + `gh skill install OWNER/NAME`), then per-agent121 sections: Claude Code (native, full bundle) · Codex · OpenClaw · Cursor ·122 VS Code + Copilot · Copilot CLI · Kiro (manual fallback) · Others; close123 with the graceful-degradation `> [!NOTE]`.1246. **How it works** — ASCII flow diagram + the 2–3 hard-won details worth125 telling.1267. **What's bundled** table · **Security considerations** · **Platform127 compatibility** — the standard 18-row table (Claude Code ✅ Native; Cursor ·128 VS Code+Copilot · Copilot CLI · Codex · OpenCode · OpenClaw · Antigravity ·129 Gemini CLI · Pi · Vibe · Hermes · Cline · KIMI · Trae · Nanobot · Kiro ·130 "Windsurf · Zed · Amp · Warp · …50+ more") with the Native-vs-Supported131 legend.1328. **License** + centered family footer.133134**Hero SVG**: hand-author it — dark gradient background, the skill's flow135left→right, slogan strip at the bottom. It must parse as XML.136137## Step 5 — Validate before shipping (all must pass)138139- JSON manifests parse AND versions match across the three files.140- Root frontmatter parses as YAML (`awk` the block out, feed a YAML parser).141- The hero SVG parses as XML.142- Smoke-run every bundled script with a tiny fixture; non-zero exit = stop-ship.143- Re-run both genericization sweeps on the final tree.144145## Step 6 — Ship146147```bash148git init && git add <explicit paths> # read the staged list before committing149gh repo create OWNER/NAME --public --source=. --push --description "<pain-first one-liner>"150git branch -m master main && git push -u origin main151gh repo edit OWNER/NAME --default-branch main152gh repo edit OWNER/NAME --add-topic openclaw-skill --add-topic agent-skill \153 --add-topic skill --add-topic skills --add-topic mcp --add-topic claude --add-topic claude-code154git archive --format=zip --prefix=NAME-X.Y.Z/ -o /tmp/NAME-X.Y.Z.zip HEAD155gh release create vX.Y.Z /tmp/NAME-X.Y.Z.zip --title "NAME vX.Y.Z" --notes "…"156```157158Crawlers read the **default branch** — confirm it is `main` before claiming done.159160## Step 7 — Verify + hand off1611621. **Installability probe** — the only same-session VERIFIED you may claim:163 `npx --yes skills@latest add OWNER/NAME --list` must print the skill's name164 and description.1652. **Marketplace listings** are asynchronous crawls — never claim them166 in-session; hand off to a publisher flow (e.g. the DevOtts167 `skill-publisher` skill) that adapts the repo per registry and writes an168 honest per-marketplace status report.1693. If a personal variant stays in `~/.claude/skills/`, record the relationship170 (personal = configured superset; public = generic) so future edits touch171 both.172173## What NOT to do174175- Don't publish an untested recipe — use the personal version first.176- Don't leave personal/project references, or a mismatched LICENSE line: both177 sweeps are release gates.178- Don't ship a root SKILL.md that depends on files a single-file install won't179 have; don't let degradation happen silently.180- Don't let three manifests disagree on the version.181- Don't claim a marketplace listing without a positive probe.182- Don't headline the family slogan — the headline sells the pain.183- Don't strip existing authorship credit from any skill you package.184185## Portability — graceful degradation outside Claude Code186187skill-it itself is procedure, not machinery: it runs anywhere a188SKILL.md-reading agent runs. Where a step names a tool the host lacks189(`gh` CLI, `npx`), do the equivalent by hand (create the repo in the web UI,190attach the zip to a release) and name the substitution in the final report.191192## Install193194**Claude Code (plugin, recommended):**195196```197/plugin marketplace add DevOtts/skill-it198/plugin install skill-it@devotts199```200201**Any SKILL.md-compatible agent:**202203```204npx skills add DevOtts/skill-it -a <agent> # peek first: npx skills add DevOtts/skill-it --list205gh skill install DevOtts/skill-it # GitHub CLI alternative206```207208**Getting started:** point it at a skill —209210```211/skill-it package ~/.claude/skills/my-standup-notes as a public repo under my GitHub212```213214You get the name workshop, the genericization sweep with receipts, the full215scaffold, mechanical validation, the shipped GitHub repo with a tagged release —216and an installability probe as proof.217218## Security considerations219220- **The genericization sweep is a release gate**: two grep passes for personal221 data plus a secrets pattern scan; any real credential is a stop-ship.222- **Local `gh` keyring auth only** — never a token pasted into chat.223- **Nothing private is published**: the repo ships only files staged by224 explicit path, and the staged list is read before every commit.225226---227_Authored by [DevOtts](https://github.com/DevOtts)._