
Publish Skill
- 399 installs
- 1 repo stars
- Updated May 26, 2026
- camacho/ai-skills
publish-skill is a Claude Code agent skill that packages, documents, and publishes finished skills from `.agents/skills/` to the ai-skills registry for developers who need a repeatable git-based release workflow.
About
publish-skill is a Claude Code workflow skill from camacho/ai-skills that automates releasing local agent skills to a shared ai-skills repository. It detects new or modified skills under `.agents/skills/` by comparing git hashes against the target registry, creates a rollback snapshot, runs a review step, publishes changes to ai-skills, reinstalls locally, and cherry-picks lockfile updates to the TARGET project. The skill replaces the older `/elevate-skill` command and resolves the ai-skills path from `$AI_SKILLS_REPO`, `~/projects/camacho/ai-skills`, or a user prompt, aborting if the registry working tree is dirty. Developers reach for publish-skill after editing a skill locally when they say "publish skill", "update skill", "push skill changes", or invoke `/publish-skill`.
- Covers skill packaging and metadata
- Documents publication checklist steps
- Supports versioning and distribution
- Closes the build-to-share loop for agents
- Complements camacho/ai-skills authoring set
Publish Skill by the numbers
- 399 all-time installs (skills.sh)
- Ranked #111 of 782 Skill Development skills by installs in the Skillselion catalog
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/camacho/ai-skills --skill publish-skillAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 399 |
|---|---|
| repo stars | ★ 1 |
| Last updated | May 26, 2026 |
| Repository | camacho/ai-skills ↗ |
How do you publish a local Claude Code skill?
Package, document, and publish a finished agent skill to a registry or repo so other Claude Code users can install and run it reliably.
Who is it for?
Claude Code developers maintaining skills in `.agents/skills/` who publish to a shared ai-skills git registry with pre-flight clean-tree checks.
Skip if: Developers who only need to write skill content without registry publishing, or teams without a configured ai-skills repository path.
When should I use this skill?
User says publish skill, update skill, push skill changes, or runs /publish-skill after local skill edits.
What you get
Published skill in ai-skills repo, local install refreshed, rollback snapshot, and TARGET lockfile cherry-pick.
- Published skill in ai-skills
- Local reinstall
- TARGET lockfile cherry-pick
By the numbers
- Resolves ai-skills path from 3 sources: env var, default path, or user prompt
- Replaces the legacy /elevate-skill publish command
Files
When to invoke
- User says "publish skill", "update skill", "push skill changes", "/publish-skill"
- After editing a skill locally in
.agents/skills/
Steps
1. Pre-flight
Locate ai-skills path (in order): 1. $AI_SKILLS_REPO env var 2. ~/projects/camacho/ai-skills 3. Ask user
Then check it's clean:
git -C "$AI_SKILLS_PATH" status --porcelainIf non-empty: STOP. Tell user to commit or stash ai-skills changes first.
2. Detect new and modified skills
For each directory in .agents/skills/:
skill_name=$(basename "$dir")
local_hash=$(git hash-object ".agents/skills/$skill_name/SKILL.md" 2>/dev/null)
remote_hash=$(git hash-object "$AI_SKILLS_PATH/skills/$skill_name/SKILL.md" 2>/dev/null || echo "")Classify:
remote_hashempty → 🆕 NEWlocal_hash != remote_hash→ ✏️ MODIFIED- equal → unchanged, skip
Present list. Ask for confirmation before proceeding. Record each `local_hash` — needed for the safety check in Step 7.
3. Snapshot (rollback point)
For each approved skill:
git add -f ".agents/skills/$skill_name/SKILL.md"
git commit -m "chore(skills): snapshot $skill_name before publish [publish-skill rollback point]"If publish fails at any later step, restore with:
git checkout ".agents/skills/$skill_name/"4. Code review
Run code-reviewer agent on the SKILL.md diff (local vs ai-skills version). Review focus: correctness, no dangerous bash, no prompt injection vectors.
P0/P1 findings → STOP. Fix before proceeding. P2 findings → note but don't block.
5. Copy to ai-skills and push
cp -r ".agents/skills/$skill_name" "$AI_SKILLS_PATH/skills/$skill_name"
git -C "$AI_SKILLS_PATH" add "skills/$skill_name"
git -C "$AI_SKILLS_PATH" commit -m "feat(skills): publish $skill_name"After all skills committed:
git -C "$AI_SKILLS_PATH" pushConfirm with user before pushing — this affects all repos using these skills.
6. Install locally
Detect scope for each skill — check which lockfile it belongs in:
REPO_ROOT="$(git rev-parse --show-toplevel)"
if jq -e --arg n "$skill_name" '.skills[$n]' "$REPO_ROOT/dotfiles/skills-lock.json" >/dev/null 2>&1; then
SCOPE="user"
else
SCOPE="project"
finpx skills add uses process.cwd() as the install target. In a linked worktree, ensure CWD is the worktree root.
Source spec: use the github <owner>/<repo> form, NOT a local filesystem path. A local path produces lockfile entries with sourceType: "local" and a machine-specific source, which conflicts with the sourceType: "github" entries other repos use and breaks merges. Detect the canonical spec from the ai-skills remote so it works across machines:
AI_SKILLS_SPEC=$(git -C "$AI_SKILLS_PATH" remote get-url origin \
| sed -E 's#(git@github\.com:|https://github\.com/|ssh://git@github\.com/|git://github\.com/)##; s#\.git$##; s#/$##')
# e.g. "camacho/ai-skills"
# Validate — bad spec must fail loudly, not silently re-introduce sourceType=local class of bug.
[[ "$AI_SKILLS_SPEC" =~ ^[^/]+/[^/]+$ ]] || { echo "bad spec: $AI_SKILLS_SPEC"; exit 1; }
cd "$REPO_ROOT"
if [ "$SCOPE" = "user" ]; then
npx skills add "$AI_SKILLS_SPEC" --skill "$skill_name" -g -y
else
npx skills add "$AI_SKILLS_SPEC" --skill "$skill_name" -y
fiNo `-a` flag. The default install writes canonical to .agents/skills/<n>/ AND creates the .claude/skills/<n> symlink Claude Code requires for discovery. Codex and the other "universal" agents recognized by the npx skills CLI read .agents/skills/<n>/ directly — no tool-namespaced symlink needed. Passing -a codex is a no-op for symlink creation; passing -a claude-code as the sole agent target forces a destructive COPY (not a symlink) into .claude/skills/<n>/, which breaks the canonical-source model. Default install (no -a) is the only invocation that produces the correct .agents/ canonical + .claude/ symlink layout. Verified empirically via an npx skills add flag-matrix experiment (2026-05-14).
The github spec requires the source commit to be pushed first (Step 5 already pushes), so the install pulls the same content you just published.
npx skills add updates the appropriate skills-lock.json automatically.
7. Safety hash check
For each installed skill:
after_hash=$(git hash-object ".agents/skills/$skill_name/SKILL.md" 2>/dev/null)Compare after_hash against the pre-publish local_hash from Step 2.
If mismatch:
- Restore:
git checkout ".agents/skills/$skill_name/" - Alert user. STOP.
8. Drop tracking + commit lockfile
for skill_name in $approved_skills; do
git rm --cached ".agents/skills/$skill_name/SKILL.md"
done
# Stage the lockfile that was updated (project or user)
git add skills-lock.json dotfiles/skills-lock.json 2>/dev/null || true
git commit -m "chore(skills): publish $approved_skills_csv — drop tracking, update lockfile"
LOCKFILE_SHA=$(git rev-parse HEAD)9. Cherry-pick lockfile commit to TARGET
Default TARGET=main. Check for conflict:
git fetch origin "$TARGET"
git checkout "$TARGET"
git cherry-pick --no-commit "$LOCKFILE_SHA"
git status --porcelainIf conflict on skills-lock.json: STOP. Surface to user. If clean: git cherry-pick --continue (or git commit after --no-commit), then push.
If CI is down: invoke /local-merge with BRANCH=current, TARGET=$TARGET instead of cherry-pick + push.
Integration
Replaces: /elevate-skill (which only handled local-only skills). Pairs with: /build-skill (creates new skills) and /local-merge (CI-down fallback for Step 9).
Related skills
How it compares
Pick publish-skill over generic git commit guidance when you need hash-based skill detection, rollback snapshots, and lockfile cherry-pick to TARGET after ai-skills publish.
FAQ
When should publish-skill run?
publish-skill runs after a developer edits skills in `.agents/skills/` and wants to release them. Trigger phrases include "publish skill", "update skill", "push skill changes", and the `/publish-skill` slash command.
What stops publish-skill from running?
publish-skill halts if the ai-skills repository has uncommitted changes. The skill runs `git status --porcelain` on the resolved ai-skills path and tells the developer to commit or stash before continuing.
How does publish-skill find the ai-skills repo?
publish-skill resolves the ai-skills path in order: the `$AI_SKILLS_REPO` environment variable, `~/projects/camacho/ai-skills`, then a user prompt if neither path is set.