
publish-skill
Detect new or modified skills in .agents/skills/ by comparing git hashes against ai-skills, snapshot for rollback, review, publish to ai-skills, install locally, and cherry-pick lockfile to TARGET. Replaces /elevate-skill.
- Installs
- 399
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/camacho/ai-skills --skill publish-skill- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads publish-skill automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
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):
$AI_SKILLS_REPOenv var~/projects/camacho/ai-skills- Ask user
Then check it's clean:
git -C "$AI_SKILLS_PATH" status --porcelain
If 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" push
Confirm 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"
fi
npx 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
fi
No -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 --porcelain
If 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).
FAQ
What does the publish-skill skill do?
Detect new or modified skills in .agents/skills/ by comparing git hashes against ai-skills, snapshot for rollback, review, publish to ai-skills, install locally, and cherry-pick lockfile to TARGET. Replaces /elevate-skill.
How do I install publish-skill?
Run npx skills add https://github.com/camacho/ai-skills --skill publish-skill in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/publish-skill/ (personal) or .claude/skills/publish-skill/ (project).
Which AI agents can use publish-skill?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is publish-skill safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains publish-skill?
It is published by camacho in camacho/ai-skills. It has 399 recorded installs.
More from camacho/ai-skills
archive
camacho/ai-skills
Fills Outcomes & Learnings in a plan file and renames it to .done.md.
bail
camacho/ai-skills
Reflects, updates GitHub Issue, closes PR if open, cleans up worktree/branch.
capture
camacho/ai-skills
Creates a draft GitHub Issue with triage label from natural language description.
plan-review
camacho/ai-skills
Auto-assembles review panel using deterministic rules, dispatches agents against plan file, collects verdicts.
orient
camacho/ai-skills
Fetches issue context, auto-detects task type, maps to branch prefix, presents brief.
reflect
camacho/ai-skills
Use after merging a branch or completing a task to consolidate learnings into memory layers, close out issues, and verify the phase gate.
Popular code quality & workflow skills
grill-me
mattpocock/skills
A relentless interview to sharpen a plan or design.
improve-codebase-architecture
mattpocock/skills
Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.
handoff
mattpocock/skills
Compact the current conversation into a handoff document for another agent to pick up.
domain-modeling
mattpocock/skills
Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a GLOSSARY.md, or recording or editing an ADR.
codebase-design
mattpocock/skills
Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.