skill自动触发推送

This commit is contained in:
crislee 2026-04-01 23:11:21 +08:00
parent b4e474c7ca
commit 37c06abdce
3 changed files with 164 additions and 5 deletions

View File

@ -1,18 +1,29 @@
# use_vala_skillhub
Vala SkillHub 技能管理 —— 让数字员工推送和安装技能。
Vala SkillHub 技能管理 —— 让数字员工推送、安装和自动同步技能。
## 功能
- **推送技能**:将本地 `./skills` 下的技能上传到 SkillHubGitea 仓库)
- **安装 / 更新技能**:从 SkillHub 下载技能到本地 `./skills` 目录(已存在则清空后重新下载)
- **查看技能**:列出 SkillHub 上的所有技能
- **自动同步**:基于内容哈希检测变更,仅推送有变化的 skill避免重复推送
## 设计要点
推送和安装均不在 `./skills` 目录内产生 `.git`,确保不影响 workspace 级别的 git 备份:
- **推送**:复制到 `./tmp/skill_push/` 临时目录,完成 git 推送后清理
- **推送 / 自动同步**:复制到 `./tmp/skill_push/` 临时目录,完成 git 推送后清理
- **安装**:通过 Gitea API 下载归档解压,不使用 git clone
- **变更检测**:通过 `~/.vala_skill_hashes` 记录每个 skill 的内容哈希,对比检测变更
## 自动同步机制
数字员工在新增或修改 skill 后,**必须自动执行 check_and_push**
1. 计算 skill 目录的综合哈希(含文件路径 + 内容)
2. 与 `~/.vala_skill_hashes` 中的历史哈希对比
3. 仅推送有变更的 skill推送成功后更新哈希记录
可选配合 `cron_job` 技能设置定时全量同步作为安全网。
## 命名规则

148
SKILL.md
View File

@ -142,3 +142,151 @@ curl -s "${GITEA_URL}/api/v1/orgs/${GITEA_OWNER}/repos?page=1&limit=50&sort=upda
```
返回 JSON 数组,每个元素包含 `name`、`description`、`updated_at` 等字段。如结果满 50 条,继续翻页 `page=2`
---
## 操作四:自动同步(变更检测 + 自动推送)
当 skill 发生新增或更新时,自动检测变更并仅推送有变化的 skill。
### 哈希状态文件
使用 `~/.vala_skill_hashes` 记录每个 skill 上次推送时的内容哈希,格式为每行一条记录:
```
skill_dir_name hash
```
示例:
```
cron_job a3f2b8c9...
web_scraper 7d1e4f6a...
```
### 计算 skill 目录哈希
对 skill 目录内所有文件(含文件路径)计算综合哈希,确保文件新增、删除、重命名、内容修改都能被检测到:
```bash
compute_skill_hash() {
local skill_dir="$1"
(cd "${skill_dir}" && find . -type f -not -path '*/\.*' | LC_ALL=C sort | while read f; do echo "FILE:$f"; cat "$f"; done | sha256sum | awk '{print $1}')
}
```
### check_and_push 完整流程
1. **加载配置和哈希状态**
```bash
source ~/.vala_skillhub_config
HASH_FILE=~/.vala_skill_hashes
touch "${HASH_FILE}"
```
2. **遍历 `./skills/` 下所有 skill 目录**,对每个 skill
```bash
for skill_dir in ./skills/*/; do
skill_name=$(basename "${skill_dir}")
# 跳过 use_vala_skillhub 自身
if [ "${skill_name}" = "use_vala_skillhub" ]; then
continue
fi
# 计算当前哈希
current_hash=$(compute_skill_hash "${skill_dir}")
# 读取上次推送的哈希
stored_hash=$(grep "^${skill_name} " "${HASH_FILE}" | awk '{print $2}')
if [ "${current_hash}" = "${stored_hash}" ]; then
echo "[skip] ${skill_name} — 无变更"
continue
fi
echo "[sync] ${skill_name} — 检测到变更,开始推送..."
# 执行推送(同操作一的流程)
repo_name="${skill_name}.${SOURCE_NAME}"
# 检查远程仓库是否存在
http_code=$(curl -s -o /dev/null -w "%{http_code}" \
"${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${repo_name}" \
-H "Authorization: token ${GITEA_TOKEN}")
# 如果不存在则创建
if [ "${http_code}" = "404" ]; then
# 从 skill.json 读取描述(如果有)
desc=""
if [ -f "${skill_dir}/skill.json" ]; then
desc=$(cat "${skill_dir}/skill.json" | grep '"description"' | head -1 | sed 's/.*"description"[[:space:]]*:[[:space:]]*"\(.*\)".*/\1/')
fi
curl -s -X POST "${GITEA_URL}/api/v1/orgs/${GITEA_OWNER}/repos" \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"name": "'"${repo_name}"'", "private": false, "description": "'"${desc}"'", "auto_init": false}'
fi
# 复制到临时目录并推送
rm -rf ./tmp/skill_push/${repo_name}
mkdir -p ./tmp/skill_push/${repo_name}
cp -r ${skill_dir}* ./tmp/skill_push/${repo_name}/
cp -r ${skill_dir}.[!.]* ./tmp/skill_push/${repo_name}/ 2>/dev/null || true
cd ./tmp/skill_push/${repo_name}
git init
git checkout -b main
git add -A
git commit -m "auto-sync: ${skill_name} $(date +%Y-%m-%d_%H:%M)"
git remote add origin "https://oauth2:${GITEA_TOKEN}@${GITEA_URL#https://}/${GITEA_OWNER}/${repo_name}.git"
git push -u origin main --force
cd -
# 清理临时目录
rm -rf ./tmp/skill_push/${repo_name}
# 更新哈希状态文件
# 先移除旧记录,再追加新记录
grep -v "^${skill_name} " "${HASH_FILE}" > "${HASH_FILE}.tmp" || true
echo "${skill_name} ${current_hash}" >> "${HASH_FILE}.tmp"
mv "${HASH_FILE}.tmp" "${HASH_FILE}"
echo "[done] ${skill_name} — 推送完成"
done
```
3. **输出同步摘要**:推送完成后,汇总本次同步了哪些 skill跳过了哪些
### 单个 skill 的快速同步
当你明确知道哪个 skill 发生了变更时,可以仅对该 skill 执行 check_and_push无需遍历所有目录
```bash
skill_name="目标skill名"
skill_dir="./skills/${skill_name}"
# 然后执行上面循环体中的逻辑
```
---
## 数字员工行为规范(重要)
作为数字员工,你**必须**在以下场景中自动执行 `check_and_push`
1. **创建新 skill 后** — 在 `./skills/` 下新建了 skill 目录并完成编写后,立即执行同步
2. **修改现有 skill 后** — 对 `./skills/` 下任何 skill 的文件做了修改后,立即执行同步
3. **删除 skill 文件后** — 如果删除了 skill 中的某些文件(重构等),同步以保持远程一致
4. **定时兜底**(可选) — 如果你拥有 `cron_job` 技能,建议设置每日一次的全量 check_and_push 作为安全网
### 推送时机建议
- **立即推送**skill 的功能性变更完成且验证通过后
- **不要推送**:正在编辑中间态、尚未完成的 skill
- **批量场景**:如果一次性修改了多个 skill在全部完成后执行一次全量 check_and_push 即可
### 自动推送日志
每次推送后,建议在控制台输出简短日志,方便追溯:
```
[auto-sync] 2025-04-01 23:00 — 推送 2 个 skill: cron_job, web_scraper | 跳过 3 个(无变更)
```

View File

@ -1,8 +1,8 @@
{
"name": "use_vala_skillhub",
"version": "3.0.0",
"description": "管理 Vala SkillHub 上的技能:推送和安装(通过临时目录,不影响 workspace git 备份)",
"version": "4.0.0",
"description": "管理 Vala SkillHub 上的技能:推送、安装、自动同步(变更检测 + 自动推送,不影响 workspace git 备份)",
"author": "vala",
"tags": ["skillhub", "git", "管理", "备份"],
"tags": ["skillhub", "git", "管理", "备份", "自动同步"],
"config_file": "~/.vala_skillhub_config"
}