publish-repo
Deploys the current repository to the skills.sh ecosystem. There is no publish
API — deployment = a public, installable repo plus a first real install that
seeds the catalogue telemetry. This skill makes that sequence deliberate.
Slash-invoked only: it flips repository visibility, which is socially hard to
undo (everything ever pushed becomes visible).
When NOT to use
- Writing or fixing a skill →
add-skill.
- Scaffolding a new repo →
create-skill-repo.
- The repo has zero skills under
skills/ → build first; never publish an
empty catalogue.
- Routine pushes to an already-public repo → plain git (done by the owner).
Workflow
- Pre-flight (hard gates — stop on any failure): the working tree must be
clean and pushed by the owner — this skill never runs
git commit or
git push; if there are uncommitted changes, stop and hand the list to the
owner instead.git status --porcelain # must be empty
make check 2>/dev/null || python3 scripts/validate_skills.py # repo validator, if present
npx skills@latest add . --list # every skill under skills/ discovered (@latest: a stale npx cache lies)
gh skill publish --dry-run # spec validation (needs gh >= 2.90; older gh: skip, use the step-6 fallback)
env | grep -E 'DISABLE_TELEMETRY|DO_NOT_TRACK|^CI=' || true # any hit -> the step-7 seed MUST use env -u
skills.sh.json, when present, must match the schema shape — top-level
groupings (required) with title/description/skills per group; the
schema rejects unknown keys like groups/name and skills.sh silently
ignores a non-conforming file.
Triage every gh skill warning: add missing license: frontmatter; a
.claude/skills/ warning is expected when the repo deliberately bundles its
own first-party dev skills. Bundled dev skills must carry
metadata.internal: true in their frontmatter so consumer installs skip
them (they must not appear in add . --list; maintainers opt back in with
INSTALL_INTERNAL_SKILLS=1 or --include-internal). Verify README catalogue + CHANGELOG current and
every skill description benefit-led (it is the listing copy); CI green.
- Manual blockers — require explicit user confirmation, never assume:
- full-history secret scan (gitleaks/trufflehog) done;
- personal/private-file review done (everything ever committed goes public).
With
--dry-run in $ARGUMENTS, stop here and report readiness instead.
- Groupings: ensure
skills.sh.json lists every skill in exactly one group
with an engaging one-sentence description per group — it is the repo's
landing copy on skills.sh.
- Flip visibility (confirm with the user immediately before):
gh repo edit <owner>/<repo> --visibility public --accept-visibility-change-consequences
- Protections (public repo unlocks them):
gh api repos/<owner>/<repo>/private-vulnerability-reporting --method PUT
Add a default-branch ruleset — solo-maintainer default: block force pushes
and deletions only (require-PR would block the owner's direct-push workflow);
upgrade to require-PR + code-owner review + required checks when outside
contributors arrive. Add a tag ruleset on v* (block update + deletion)
so releases are immutable.
- Release — cut a versioned GitHub release matching
.claude-plugin/plugin.json (or the repo's version source):gh skill publish --tag v<version>
It re-validates, adds the agent-skills topic if missing, and creates the
release with auto-generated notes. Add skills-sh too:
gh repo edit <owner>/<repo> --add-topic skills-sh.
gh < 2.90 has no gh skill — equivalent fallback:gh release create v<version> --generate-notes
gh repo edit <owner>/<repo> --add-topic agent-skills --add-topic skills-sh
- Verify like a consumer, and seed the catalogue. The first real install is
what lists the repo — and the CLI reports it ONLY when
DISABLE_TELEMETRY,
DO_NOT_TRACK, and CI variables are all fully unset (any value disables,
even 0 or false — env strings are truthy). Run locally, never in CI, with
the opt-outs explicitly unset for these commands only:npx skills@latest add <owner>/<repo> --list
mkdir -p /tmp/skills-verify && cd /tmp/skills-verify
env -u DISABLE_TELEMETRY -u DO_NOT_TRACK npx skills@latest add <owner>/<repo> -a claude-code -y # NO --skill '*': the wildcard opts into internal dev skills
npx skills list -a claude-code
Then confirm the listing: curl -sIL https://skills.sh/<owner>/<repo> turns
200 within minutes of a valid seed (canonical URL is lowercase on
www.skills.sh; the search API lags the page). Still 404 after ~15 minutes
means the telemetry never fired — re-check the env, don't wait on "cache".
Publishing SEVERAL repos? Seed them ONE at a time, ~5 minutes apart, and
confirm each page before the next: burst install events for multiple
unlisted repos from one machine are throttled server-side — the security
audit still runs but the listings never materialize, and re-seeding inside
the burst does nothing. A single spaced event lists within ~5 minutes.
- Polish: README badge
[](https://skills.sh/<owner>/<repo>);
homepage via gh repo edit --homepage (e.g. the skills.sh page); social
preview image (manual UI step — remind the owner).
- Report: repo URL, skills.sh page URL, install command, release tag,
protections applied, anything skipped with its unlock condition, and the note
that the skills.sh page appears only after telemetry processes the seed
install (pages are cached).
Output spec
Public repo installable via npx skills add <owner>/<repo> (verified by an
actual install), PVR enabled, rulesets active, groupings valid, release cut,
seed install performed, owner told exactly what to expect next.
Gotchas
- The visibility flip is the point of no return for history — step 2 demands
explicit confirmation and never self-certifies.
npx skills add . --list reporting "No skills found" means frontmatter or
layout problems — fix via the repo validator's output, never by restructuring
blindly.
- Telemetry opt-outs silently kill the listing:
DISABLE_TELEMETRY or
DO_NOT_TRACK set to ANY value (even 0/false) stops the install report —
the page then 404s forever while every install "succeeds". Always seed via
env -u DISABLE_TELEMETRY -u DO_NOT_TRACK.
- Pin
npx skills@latest — npx happily reuses a stale cached CLI version.
- The badge endpoint (
skills.sh/b/...) returns 200 even for unlisted repos —
it proves nothing; only the repo page URL does.
- The page appears within minutes of a valid seed install; the search API
and leaderboard lag longer. A 404 beyond ~15 minutes = suppressed telemetry
— or a burst: seeding several unlisted repos back-to-back from one machine
gets throttled; space seeds ~5 minutes apart, one repo at a time.
- Agent harnesses may permission-block the visibility flip and release
commands (public-surface actions): hand the exact command to the owner to
run themselves instead of retrying.
- No Node on the machine? The consumer verification and seed install must run
somewhere with Node ≥18 — report it as pending, never as done.
1---2name: publish-repo3description: Publishes the current Agent Skills repository to skills.sh - pre-flight checks, public visibility flip, protections (PVR, rulesets), a gh skill release, consumer-style install verification, telemetry seeding, and repo-page groupings. Use when the user asks to publish, deploy, release, go public, or get listed on skills.sh. Not for authoring skills or scaffolding repositories.4license: MIT5---67# publish-repo89Deploys the current repository to the skills.sh ecosystem. There is no publish10API — deployment = a public, installable repo plus a first real install that11seeds the catalogue telemetry. This skill makes that sequence deliberate.12Slash-invoked only: it flips repository visibility, which is socially hard to13undo (everything ever pushed becomes visible).1415## When NOT to use1617- Writing or fixing a skill → `add-skill`.18- Scaffolding a new repo → `create-skill-repo`.19- The repo has zero skills under `skills/` → build first; never publish an20 empty catalogue.21- Routine pushes to an already-public repo → plain git (done by the owner).2223## Workflow24251. **Pre-flight (hard gates — stop on any failure):** the working tree must be26 clean and pushed **by the owner** — this skill never runs `git commit` or27 `git push`; if there are uncommitted changes, stop and hand the list to the28 owner instead.29 ```bash30 git status --porcelain # must be empty31 make check 2>/dev/null || python3 scripts/validate_skills.py # repo validator, if present32 npx skills@latest add . --list # every skill under skills/ discovered (@latest: a stale npx cache lies)33 gh skill publish --dry-run # spec validation (needs gh >= 2.90; older gh: skip, use the step-6 fallback)34 env | grep -E 'DISABLE_TELEMETRY|DO_NOT_TRACK|^CI=' || true # any hit -> the step-7 seed MUST use env -u35 ```36 `skills.sh.json`, when present, must match the schema shape — top-level37 `groupings` (required) with `title`/`description`/`skills` per group; the38 schema rejects unknown keys like `groups`/`name` and skills.sh silently39 ignores a non-conforming file.40 Triage every `gh skill` warning: add missing `license:` frontmatter; a41 `.claude/skills/` warning is expected when the repo deliberately bundles its42 own first-party dev skills. Bundled dev skills must carry43 `metadata.internal: true` in their frontmatter so consumer installs skip44 them (they must not appear in `add . --list`; maintainers opt back in with45 `INSTALL_INTERNAL_SKILLS=1` or `--include-internal`). Verify README catalogue + CHANGELOG current and46 every skill description benefit-led (it is the listing copy); CI green.472. **Manual blockers — require explicit user confirmation, never assume:**48 - full-history secret scan (gitleaks/trufflehog) done;49 - personal/private-file review done (everything ever committed goes public).50 With `--dry-run` in `$ARGUMENTS`, stop here and report readiness instead.513. **Groupings:** ensure `skills.sh.json` lists every skill in exactly one group52 with an engaging one-sentence description per group — it is the repo's53 landing copy on skills.sh.544. **Flip visibility** (confirm with the user immediately before):55 ```bash56 gh repo edit <owner>/<repo> --visibility public --accept-visibility-change-consequences57 ```585. **Protections** (public repo unlocks them):59 ```bash60 gh api repos/<owner>/<repo>/private-vulnerability-reporting --method PUT61 ```62 Add a default-branch ruleset — solo-maintainer default: block force pushes63 and deletions only (require-PR would block the owner's direct-push workflow);64 upgrade to require-PR + code-owner review + required checks when outside65 contributors arrive. Add a **tag ruleset** on `v*` (block update + deletion)66 so releases are immutable.676. **Release** — cut a versioned GitHub release matching68 `.claude-plugin/plugin.json` (or the repo's version source):69 ```bash70 gh skill publish --tag v<version>71 ```72 It re-validates, adds the `agent-skills` topic if missing, and creates the73 release with auto-generated notes. Add `skills-sh` too:74 `gh repo edit <owner>/<repo> --add-topic skills-sh`.75 `gh` < 2.90 has no `gh skill` — equivalent fallback:76 ```bash77 gh release create v<version> --generate-notes78 gh repo edit <owner>/<repo> --add-topic agent-skills --add-topic skills-sh79 ```807. **Verify like a consumer, and seed the catalogue.** The first real install is81 what lists the repo — and the CLI reports it ONLY when `DISABLE_TELEMETRY`,82 `DO_NOT_TRACK`, and CI variables are all **fully unset** (any value disables,83 even `0` or `false` — env strings are truthy). Run locally, never in CI, with84 the opt-outs explicitly unset for these commands only:85 ```bash86 npx skills@latest add <owner>/<repo> --list87 mkdir -p /tmp/skills-verify && cd /tmp/skills-verify88 env -u DISABLE_TELEMETRY -u DO_NOT_TRACK npx skills@latest add <owner>/<repo> -a claude-code -y # NO --skill '*': the wildcard opts into internal dev skills89 npx skills list -a claude-code90 ```91 Then confirm the listing: `curl -sIL https://skills.sh/<owner>/<repo>` turns92 200 within minutes of a valid seed (canonical URL is lowercase on93 www.skills.sh; the search API lags the page). Still 404 after ~15 minutes94 means the telemetry never fired — re-check the env, don't wait on "cache".95 Publishing SEVERAL repos? Seed them ONE at a time, ~5 minutes apart, and96 confirm each page before the next: burst install events for multiple97 unlisted repos from one machine are throttled server-side — the security98 audit still runs but the listings never materialize, and re-seeding inside99 the burst does nothing. A single spaced event lists within ~5 minutes.1008. **Polish:** README badge101 `[](https://skills.sh/<owner>/<repo>)`;102 homepage via `gh repo edit --homepage` (e.g. the skills.sh page); social103 preview image (manual UI step — remind the owner).1049. **Report:** repo URL, skills.sh page URL, install command, release tag,105 protections applied, anything skipped with its unlock condition, and the note106 that the skills.sh page appears only after telemetry processes the seed107 install (pages are cached).108109## Output spec110111Public repo installable via `npx skills add <owner>/<repo>` (verified by an112actual install), PVR enabled, rulesets active, groupings valid, release cut,113seed install performed, owner told exactly what to expect next.114115## Gotchas116117- The visibility flip is the point of no return for history — step 2 demands118 explicit confirmation and never self-certifies.119- `npx skills add . --list` reporting "No skills found" means frontmatter or120 layout problems — fix via the repo validator's output, never by restructuring121 blindly.122- **Telemetry opt-outs silently kill the listing**: `DISABLE_TELEMETRY` or123 `DO_NOT_TRACK` set to ANY value (even `0`/`false`) stops the install report —124 the page then 404s forever while every install "succeeds". Always seed via125 `env -u DISABLE_TELEMETRY -u DO_NOT_TRACK`.126- Pin `npx skills@latest` — npx happily reuses a stale cached CLI version.127- The badge endpoint (`skills.sh/b/...`) returns 200 even for unlisted repos —128 it proves nothing; only the repo page URL does.129- The page appears within minutes of a **valid** seed install; the search API130 and leaderboard lag longer. A 404 beyond ~15 minutes = suppressed telemetry131 — or a burst: seeding several unlisted repos back-to-back from one machine132 gets throttled; space seeds ~5 minutes apart, one repo at a time.133- Agent harnesses may permission-block the visibility flip and release134 commands (public-surface actions): hand the exact command to the owner to135 run themselves instead of retrying.136- No Node on the machine? The consumer verification and seed install must run137 somewhere with Node ≥18 — report it as pending, never as done.