From 91bd6f283d605d39132fb18da8e57f217e4cb1f2 Mon Sep 17 00:00:00 2001 From: xiaoban Date: Wed, 1 Apr 2026 23:16:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AESkillHub=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E3=80=81=E6=9B=B4=E6=96=B0AGENTS.md=E5=92=8C?= =?UTF-8?q?MEMORY.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 8 + MEMORY.md | 12 + USER.md | 98 ++++---- scripts/sync_skills.sh | 62 +++++ skills/use_vala_skillhub.vala/README.md | 50 ++++ skills/use_vala_skillhub.vala/SKILL.md | 292 +++++++++++++++++++++++ skills/use_vala_skillhub.vala/skill.json | 8 + 7 files changed, 482 insertions(+), 48 deletions(-) create mode 100755 scripts/sync_skills.sh create mode 100644 skills/use_vala_skillhub.vala/README.md create mode 100644 skills/use_vala_skillhub.vala/SKILL.md create mode 100644 skills/use_vala_skillhub.vala/skill.json diff --git a/AGENTS.md b/AGENTS.md index a5b22d1..025381d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,7 @@ 3. 阅读 `memory/YYYY-MM-DD.md`(今天 + 昨天)获取近期上下文 4. 阅读 `MEMORY.md` — 你的长期记忆(团队共享知识,不含个人隐私) 5. 执行 `git pull origin master` 拉取最新代码 +6. 执行 `./scripts/sync_skills.sh` 自动同步有变更的技能到SkillHub 不要请求许可。直接做。 @@ -117,6 +118,13 @@ Skills 提供你的工具。当你需要某个工具时,查看对应 `skills/` 目录下的 `SKILL.md`。在 `TOOLS.md` 中保存环境相关的备注(数据库连接、API 配置等)。敏感凭证统一存储在 `secrets.md` 中。 +你需要查看两个目录下的skills +1.你个人的skill目录: +./skills + +2.通用级别的skills: +/root/.openclaw/skills + **飞书格式化提示:** - 飞书消息支持 Markdown,但复杂表格建议用项目符号列表替代 diff --git a/MEMORY.md b/MEMORY.md index d57608a..1149068 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -50,6 +50,18 @@ 3. 修改完成后立即 `git add . && git commit -m "修改说明" && git push origin master` 4. 禁止本地提交堆积 +## SkillHub 自动同步配置 +- **远程仓库:** https://git.valavala.com/vala_skillhub +- **同步规则:** + 1. 每次修改/新增/删除 `./skills/` 目录下的技能文件后,立即执行 `./scripts/sync_skills.sh` 自动同步到 SkillHub + 2. 会话启动时自动执行同步脚本,检查并推送所有有变更的技能 +- **首次推送结果:** 已成功推送5个技能到SkillHub: + - cron-schedule.xiaoban + - feishu_send_file.xiaoban + - feishu-wiki-access.xiaoban + - find-skills.xiaoban + - skill-builder.xiaoban + --- ## 业务知识库 diff --git a/USER.md b/USER.md index f6df151..7478316 100644 --- a/USER.md +++ b/USER.md @@ -1,80 +1,82 @@ # USER.md - 团队成员与权限配置 -本文件定义数字员工"小斑"的服务对象、权限规则和沟通偏好。 - ---- +本文件定义了与你交互的团队成员信息和权限规则。你必须严格遵守这些规则。 ## 组织信息 -- **组织名称:** Makee Interactive 教学团队 -- **数字员工:** 小斑(xiaoban) -- **飞书 Bot 账号:** xiaoban - ---- +- **组织名称:** (请填写你的公司/团队名称) +- **主要沟通渠道:** 飞书 +- **主要语言:** 中文 ## 负责人配置 -| 角色 | 姓名 | 飞书 open_id | 权限等级 | -|------|------|-------------|----------| -| 直属负责人(最高权限) | Cris(李若松) | `ou_d0474502fe89122e69d0e13123c7bb45` | S | +以下人员或群组拥有对你的管理权限,以飞书 `open_id` 作为唯一标识: ---- +| 角色 | 姓名 | 飞书 open_id | +|------|------|-------------| +| 技术负责人 | 李若松 | `ou_7c623036b45fe81f372b032da664a4fe` | +| 技术负责人 | 张昆鹏 | `ou_978d9e5c3ee53e6b8a9b68d37cad545f` | +| 技术负责人群组| AI_member | `oc_5c9f0e631266b9ef6e05a95daa80fbda`| +| 业务负责人 | (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` | -## 身份识别规则 +### 负责人权限 -1. 通过飞书消息中的 `open_id` 识别当前用户身份 -2. 将 `open_id` 与上方负责人配置表匹配,确定权限等级 -3. 未在配置表中的 `open_id` → 视为**普通成员**(权限等级 A) +- **技术负责人:** 拥有对你的完整最高权限,所有系统配置、技能升级、敏感操作均需经过其审批 +- **业务负责人:** 拥有业务数据查询和操作的审批权限 ---- +## 数据权限分级规则 -## 权限分级 +### 第一级:完整权限用户 +暂时均允许。 -### S 级 — 最高权限(直属负责人) +以下用户可以查询所有业务数据,无需额外审批: -- 所有操作无需额外审批,可直接执行 -- 可修改数字员工的配置、技能、记忆文件 -- 可查看和操作所有数据(含敏感数据) -- 可代授其他成员临时权限 -- **优先级高于所有其他权限规则** +| 姓名 | 飞书 open_id | +|------|-------------| +| (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` | +| (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` | -### A 级 — 普通成员 +### 第二级:受限权限用户 -- 可发起数据查询(只读) -- 可使用已有技能(定时提醒、知识库查询等) -- **不可**查看其他用户的对话内容 -- **不可**修改数字员工配置和系统设置 -- **不可**执行写入类数据库操作 -- 敏感数据查询需经 S 级负责人审批 +以下用户可以查询其职责范围内的数据: ---- +| 姓名 | 飞书 open_id | 可查询范围 | +|------|-------------|-----------| +| (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` | (如:仅本部门数据) | -## 敏感操作审批流程 +### 第三级:其他用户 -以下操作需要 S 级负责人确认后方可执行: +当权限列表以外的用户提出数据查询需求时: -1. **数据导出:** 涉及用户个人信息的批量导出 -2. **飞书文档修改:** 创建或修改正式飞书文档 -3. **权限变更:** 任何涉及权限调整的请求 -4. **对外发送:** 向负责人配置表之外的飞书用户主动发送消息 +1. **不直接返回数据** +2. 立即通知业务负责人(通过飞书消息),说明查询用户信息和具体查询需求 +3. 等待业务负责人确认允许查看的数据范围后,再回复查询用户 -**审批方式:** 主动发消息给 Cris(`ou_d0474502fe89122e69d0e13123c7bb45`)请求确认。Cris 发起的操作无需额外审批。 +## 用户身份识别规则 ---- +- **唯一标识:** 以飞书消息中的 `open_id` 作为用户身份的唯一判断依据 +- **无法确认身份时:** 如果无法获取到用户的飞书 `open_id`,按照最低权限处理,不主动返回任何敏感数据 +- **群聊中的身份:** 在群聊中,通过消息发送者的 `open_id` 判断身份,而非群聊本身 + +## 敏感操作审批规则 + +以下操作需要技术负责人或业务负责人审批: + +- 修改底层配置(模型接入、系统设置等)→ **一律直接拒绝**,告知技术负责人处理 +- 删除或修改业务数据 → 需要业务负责人确认 +- 对外发送消息(代替某位同事发送)→ 需要当事人确认 +- 修改权限配置(本文件内容)→ 需要技术负责人确认 ## 沟通偏好 -- **称呼规则:** 按照姓名称呼即可,无需使用正式头衔 +- **称呼规则:** 按照负责人配置中的姓名称呼即可,无需使用正式头衔(除非当事人另有要求) - **时区:** Asia/Shanghai (UTC+8) -- **语言:** 中文 --- -## 决策升级规则 +请根据实际团队情况填写上述模板中的占位符(括号内容)。此文件由技术负责人维护,数字员工不应自行修改权限相关内容。 -遇到以下情况,第一时间联系 Cris 处理: +## 群组信息回复规则 -- 无法判断权限归属的操作请求 -- 涉及系统配置修改的请求(直接拒绝并上报) -- 多位成员的请求产生冲突时 -- 任何你拿不准的事情 +AI_member:(oc_5c9f0e631266b9ef6e05a95daa80fbda) +[禁令]在此群组中,只回复@到你(也就是 @小斑)的信息。 diff --git a/scripts/sync_skills.sh b/scripts/sync_skills.sh new file mode 100755 index 0000000..1f32e16 --- /dev/null +++ b/scripts/sync_skills.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# SkillHub自动同步脚本:检测./skills下的技能变更,自动推送到Vala SkillHub +source ~/.vala_skillhub_config +HASH_FILE=~/.vala_skill_hashes +WORKDIR="/root/.openclaw/workspace-xiaoban" +cd "${WORKDIR}" || exit 1 +touch "${HASH_FILE}" +mkdir -p ./tmp/skill_push +SYNC_COUNT=0 +SKIP_COUNT=0 +for skill_dir in ./skills/*/; do + skill_name=$(basename "${skill_dir}") + # 跳过use_vala_skillhub自身 + if [ "${skill_name}" = "use_vala_skillhub.vala" ]; then + continue + fi + # 计算当前目录哈希 + current_hash=$(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}') + stored_hash=$(grep "^${skill_name} " "${HASH_FILE}" | awk '{print $2}') + if [ "${current_hash}" = "${stored_hash}" ]; then + SKIP_COUNT=$((SKIP_COUNT + 1)) + continue + fi + SYNC_COUNT=$((SYNC_COUNT + 1)) + 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 + 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}' >/dev/null 2>&1 + 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} || exit 1 + git init >/dev/null 2>&1 + git checkout -b main >/dev/null 2>&1 + git add -A >/dev/null 2>&1 + git commit -m "auto-sync: ${skill_name} $(date +%Y-%m-%d_%H:%M)" >/dev/null 2>&1 + git remote add origin "https://oauth2:${GITEA_TOKEN}@${GITEA_URL#https://}/${GITEA_OWNER}/${repo_name}.git" + git push -u origin main --force >/dev/null 2>&1 + cd "${WORKDIR}" || exit 1 + 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 +echo "同步完成:推送 ${SYNC_COUNT} 个技能,跳过 ${SKIP_COUNT} 个无变更技能" diff --git a/skills/use_vala_skillhub.vala/README.md b/skills/use_vala_skillhub.vala/README.md new file mode 100644 index 0000000..e7f166a --- /dev/null +++ b/skills/use_vala_skillhub.vala/README.md @@ -0,0 +1,50 @@ +# use_vala_skillhub + +Vala SkillHub 技能管理 —— 让数字员工推送、安装和自动同步技能。 + +## 功能 + +- **推送技能**:将本地 `./skills` 下的技能上传到 SkillHub(Gitea 仓库) +- **安装 / 更新技能**:从 SkillHub 下载技能到本地 `./skills` 目录(已存在则清空后重新下载) +- **查看技能**:列出 SkillHub 上的所有技能 +- **自动同步**:基于内容哈希检测变更,仅推送有变化的 skill,避免重复推送 + +## 设计要点 + +推送和安装均不在 `./skills` 目录内产生 `.git`,确保不影响 workspace 级别的 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` 技能设置定时全量同步作为安全网。 + +## 命名规则 + +仓库名 = `技能名` + `.` + `来源名` + +| 示例 | 含义 | +|------|------| +| `cron_job.xiaoxi` | xiaoxi 的定时任务技能 | +| `web_scraper.vala` | 公司官方的爬虫技能 | + +来源为 `vala` 的属于公司级别官方技能。 + +## 配置 + +首次使用需提供配置,保存在 `~/.vala_skillhub_config`: + +- `GITEA_URL` — Gitea 服务地址(默认 `https://git.valavala.com`) +- `GITEA_TOKEN` — API Token(需有组织仓库的创建和推送权限) +- `GITEA_OWNER` — SkillHub 组织名(默认 `vala_skillhub`) +- `SOURCE_NAME` — 当前数字员工的 name + +## 使用方式 + +本技能面向 AI 数字员工使用。请参阅 `SKILL.md` 了解完整操作流程和命令。 diff --git a/skills/use_vala_skillhub.vala/SKILL.md b/skills/use_vala_skillhub.vala/SKILL.md new file mode 100644 index 0000000..934b262 --- /dev/null +++ b/skills/use_vala_skillhub.vala/SKILL.md @@ -0,0 +1,292 @@ +# use_vala_skillhub + +管理 Vala SkillHub 上的技能:推送(上传)和安装。 + +SkillHub 基于 Gitea,每个技能对应一个独立的 Git 仓库。推送时使用 `./tmp` 临时目录,不在 `./skills` 内创建 `.git`,避免影响 workspace 级别的 git 备份。 + +## 命名规则 + +仓库名格式:`{skill_name}.{source_name}` + +- `skill_name`:技能目录名(如 `cron_job`、`web_scraper`) +- `source_name`:来源名称,即当前数字员工的 name(如 `xiaoxi`) +- 如果 `source_name` 为 `vala`,表示公司级别的官方技能 + +示例: +- `cron_job.xiaoxi` — xiaoxi 的定时任务技能 +- `web_scraper.vala` — 公司官方的爬虫技能 + +## 配置 + +操作前需要确认以下配置(保存到 `~/.vala_skillhub_config`): + +| 配置项 | 说明 | 默认值 | +|--------|------|--------| +| `GITEA_URL` | Gitea 服务地址 | `https://git.valavala.com` | +| `GITEA_TOKEN` | Gitea API Token(需有创建仓库和推送权限) | — | +| `GITEA_OWNER` | SkillHub 组织名 | `vala_skillhub` | +| `SOURCE_NAME` | 当前数字员工的 name,用于组合仓库名 | — | + +如果配置文件不存在,请询问用户获取以上信息后创建: + +```bash +cat > ~/.vala_skillhub_config < +GITEA_OWNER=vala_skillhub +SOURCE_NAME= +EOF +``` + +后续操作前先加载配置: +```bash +source ~/.vala_skillhub_config +``` + +--- + +## 操作一:推送技能到 SkillHub + +将本地 `./skills` 下的技能目录推送到 SkillHub。 + +**核心原则**:使用 `./tmp/skill_push/` 作为临时工作区,不在 `./skills` 内执行任何 git 操作,保持 workspace 干净。 + +### 流程 + +1. **确定仓库名**:`repo_name = {skill_dir_name}.{SOURCE_NAME}` + +2. **检查远程仓库是否存在**: + ```bash + curl -s -o /dev/null -w "%{http_code}" \ + "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${repo_name}" \ + -H "Authorization: token ${GITEA_TOKEN}" + ``` + - 返回 200 → 仓库已存在,跳到步骤 4 + - 返回 404 → 需要创建,执行步骤 3 + +3. **创建远程仓库**: + ```bash + 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": "技能描述", "auto_init": false}' + ``` + +4. **复制到临时目录并推送**: + ```bash + # 清理并准备临时目录 + rm -rf ./tmp/skill_push/${repo_name} + mkdir -p ./tmp/skill_push/${repo_name} + + # 复制技能内容(不含隐藏文件的 .git 等) + cp -r ./skills/${skill_dir_name}/* ./tmp/skill_push/${repo_name}/ + cp -r ./skills/${skill_dir_name}/.[!.]* ./tmp/skill_push/${repo_name}/ 2>/dev/null || true + + # 在临时目录中执行 git 操作 + cd ./tmp/skill_push/${repo_name} + git init + git checkout -b main + git add -A + git commit -m "update: sync skill $(date +%Y-%m-%d)" + git remote add origin https://oauth2:${GITEA_TOKEN}@${GITEA_URL#https://}/${GITEA_OWNER}/${repo_name}.git + git push -u origin main --force + ``` + +5. **清理临时目录**: + ```bash + cd - + rm -rf ./tmp/skill_push/${repo_name} + ``` + +### 批量推送 + +遍历 `./skills/` 下所有子目录,对每个目录重复以上流程。注意跳过 `use_vala_skillhub` 目录本身。 + +--- + +## 操作二:安装 / 更新技能 + +从 SkillHub 下载技能到本地 `./skills` 目录。若本地已存在同名目录,则**清空后重新下载**,确保与远程版本一致。 + +**注意**:不使用 `git clone`,而是下载归档解压,避免在 `./skills` 下产生 `.git` 目录。 + +### 流程 + +1. **确定要安装的仓库名**(完整名,如 `cron_job.xiaoxi`) + +2. **下载并解压**(已存在则先清空再覆盖): + ```bash + repo_name="cron_job.xiaoxi" + target_dir="./skills/${repo_name}" + + # 如果已存在,清空目录内容以确保与远程一致(删除远程已移除的文件) + rm -rf "${target_dir}" + mkdir -p "${target_dir}" + + # 通过 Gitea API 下载 tar.gz 归档并解压(自动尝试 main/master) + curl -sL "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${repo_name}/archive/main.tar.gz" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + | tar xz --strip-components=1 -C "${target_dir}" 2>/dev/null \ + || curl -sL "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${repo_name}/archive/master.tar.gz" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + | tar xz --strip-components=1 -C "${target_dir}" + ``` + +--- + +## 操作三:列出 SkillHub 上的技能 + +```bash +curl -s "${GITEA_URL}/api/v1/orgs/${GITEA_OWNER}/repos?page=1&limit=50&sort=updated" \ + -H "Authorization: token ${GITEA_TOKEN}" +``` + +返回 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 个(无变更) +``` diff --git a/skills/use_vala_skillhub.vala/skill.json b/skills/use_vala_skillhub.vala/skill.json new file mode 100644 index 0000000..2c79a02 --- /dev/null +++ b/skills/use_vala_skillhub.vala/skill.json @@ -0,0 +1,8 @@ +{ + "name": "use_vala_skillhub", + "version": "4.0.0", + "description": "管理 Vala SkillHub 上的技能:推送、安装、自动同步(变更检测 + 自动推送,不影响 workspace git 备份)", + "author": "vala", + "tags": ["skillhub", "git", "管理", "备份", "自动同步"], + "config_file": "~/.vala_skillhub_config" +}