publish-skill

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

When to invoke

调用时机

  • User says "publish skill", "update skill", "push skill changes", "/publish-skill"
  • After editing a skill locally in
    .agents/skills/
  • 用户输入“publish skill”、“update skill”、“push skill changes”或“/publish-skill”
  • 在本地编辑
    .agents/skills/
    中的技能之后

Steps

步骤

1. Pre-flight

1. 预检查

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:
bash
git -C "$AI_SKILLS_PATH" status --porcelain
If non-empty: STOP. Tell user to commit or stash ai-skills changes first.
按以下顺序定位ai-skills路径:
  1. 环境变量
    $AI_SKILLS_REPO
  2. ~/projects/camacho/ai-skills
  3. 询问用户
然后检查该仓库是否干净:
bash
git -C "$AI_SKILLS_PATH" status --porcelain
如果输出非空:终止操作。告知用户先提交或暂存ai-skills中的更改。

2. Detect new and modified skills

2. 检测新增和修改的技能

For each directory in
.agents/skills/
:
bash
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_hash
    empty → 🆕 NEW
  • local_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.
遍历
.agents/skills/
中的每个目录:
bash
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 "")
分类:
  • remote_hash
    为空 → 🆕 新增
  • local_hash != remote_hash
    → ✏️ 修改
  • 哈希相等 → 无变化,跳过
展示列表。继续操作前需征得用户确认。记录每个
local_hash
——步骤7的安全检查需要用到。

3. Snapshot (rollback point)

3. 创建快照(回滚点)

For each approved skill:
bash
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:
bash
git checkout ".agents/skills/$skill_name/"
针对每个获批准的技能:
bash
git add -f ".agents/skills/$skill_name/SKILL.md"
git commit -m "chore(skills): snapshot $skill_name before publish [publish-skill rollback point]"
如果后续发布步骤失败,可通过以下命令恢复:
bash
git checkout ".agents/skills/$skill_name/"

4. Code review

4. 代码审核

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.
对SKILL.md的差异(本地版本与ai-skills版本)运行
code-reviewer
agent。 审核重点:正确性、无危险bash代码、无提示注入漏洞。
发现P0/P1级问题 → 终止操作。修复后再继续。 发现P2级问题 → 记录但不阻止操作。

5. Copy to ai-skills and push

5. 复制至ai-skills并推送

bash
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:
bash
git -C "$AI_SKILLS_PATH" push
Confirm with user before pushing — this affects all repos using these skills.
bash
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"
所有技能提交完成后:
bash
git -C "$AI_SKILLS_PATH" push
推送前需征得用户确认——此操作会影响所有使用这些技能的仓库。

6. Install locally

6. 本地安装

bash
npx skills add camacho/ai-skills --skill "$skill_name" -a claude-code -a codex -y
npx skills add
updates
skills-lock.json
automatically.
bash
npx skills add camacho/ai-skills --skill "$skill_name" -a claude-code -a codex -y
npx skills add
会自动更新
skills-lock.json

7. Safety hash check

7. 哈希安全检查

For each installed skill:
bash
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.
针对每个已安装的技能:
bash
after_hash=$(git hash-object ".agents/skills/$skill_name/SKILL.md" 2>/dev/null)
after_hash
与步骤2中记录的发布前
local_hash
进行对比。
如果不匹配:
  • 恢复:
    git checkout ".agents/skills/$skill_name/"
  • 向用户发出警报。终止操作。

8. Drop tracking + commit lockfile

8. 取消跟踪 + 提交锁文件

bash
for skill_name in $approved_skills; do
  git rm --cached ".agents/skills/$skill_name/SKILL.md"
done
git add skills-lock.json
git commit -m "chore(skills): publish $approved_skills_csv — drop tracking, update lockfile"

LOCKFILE_SHA=$(git rev-parse HEAD)
bash
for skill_name in $approved_skills; do
  git rm --cached ".agents/skills/$skill_name/SKILL.md"
done
git add skills-lock.json
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

9. 将锁文件提交cherry-pick至TARGET分支

Default
TARGET=main
. Check for conflict:
bash
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.
默认
TARGET=main
。检查冲突:
bash
git fetch origin "$TARGET"
git checkout "$TARGET"
git cherry-pick --no-commit "$LOCKFILE_SHA"
git status --porcelain
如果
skills-lock.json
存在冲突:终止操作。告知用户。 如果无冲突:执行
git cherry-pick --continue
(或在
--no-commit
后执行
git commit
),然后推送。
如果CI服务不可用:调用
/local-merge
命令,指定BRANCH=当前分支、TARGET=$TARGET,替代cherry-pick + 推送操作。

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).
替代:
/elevate-skill
(仅处理本地技能)。 搭配使用:
/build-skill
(创建新技能)和
/local-merge
(步骤9中CI不可用时的备选方案)。