多 Agent 并行干活,Skill 目录一冲突就全乱:单一真源 + 镜像同步的完整解法

本文简介:

同一个项目同时用 Cursor 和 WorkBuddy 维护,AI 技能(Skill)该放哪?放 .cursor/skills 还是 .workbuddy/skills?我一开始两边各建一份,结果很快尝到苦头:改了真源另一份没跟上、某个 AI 根本调不到那份技能、git 仓库被三份重复内容撑爆。

这篇文章不讲概念,只讲落地:先把各家到底扫哪个目录查清楚(这一步结论很反直觉),再给出「单一真源 + 自动镜像」的方案、完整操作步骤、以及一份能直接抄走的同步脚本。附我实测踩过的坑清单。

结论先行

三句话:

  1. 问题的本质不是「该用哪个目录」,而是「多份物理文件必然发散」。 只要允许同一个 Skill 存在于多个目录,早晚会分叉——所以必须先确立唯一真源,再解决「各家怎么都能看到它」。
  2. 本机实测结论(2026-10-20):WorkBuddy 项目级 Skill 只认 .workbuddy/skills/,不扫 .agents/,而且没有任何配置项能改扫描路径。 所以「让 WorkBuddy 也去扫 .agents/skills」这条路走不通,镜像不能省。
  3. 最终解法:.agents/skills/ 作唯一真源(只改这里)+ tools/sync_skills.py 自动镜像到另外两个目录(只读)+ 每 30 分钟计划任务兜底 + 镜像不进 git。

下面把每一步都摊开讲清楚。

一、为什么「各建一份」必然出事?

每个 AI 工具都约定了一个自己的 Skill 发现目录。项目里先后接入了 Cursor 与 WorkBuddy,两者目录名不同;如果每个工具都在自己的目录下建 Skill,同一个能力就会分裂成多份物理文件。

现象 根因 实际后果
同名 Skill 重复存在 .cursor/skills/ 与 .workbuddy/skills/ 各存一份 两份内容会逐渐分叉,无法判断哪份是准的
改了一处另一处没改 没有同步机制 按 A agent 的说明做,在 B agent 里失效
某个 agent 根本调不到 它不扫那个目录 Skill 明明在仓库里,agent 却说「没有这个技能」
git 仓库膨胀 三份目录全部入库 重复内容进版本库,冲突解不完
换电脑后行为不一致 各人手动建的目录未同步 换设备/换 agent 后 Skill 集体失灵

关键提醒:上表最后一行「换电脑后行为不一致」是最容易被忽视、但杀伤力最大的一条。很多人的项目在同机时跑得好好的,一换机器、一换 AI 工具就集体失灵,根因就是这些手工目录既没同步也没入库。

二、各家到底扫哪个目录?我把扫描路径查了一遍

要定方案必须先查清 WorkBuddy 到底扫哪些目录,不然全是猜。我查了两处:

  • 程序包 app.asar 里的扫描路径常量;
  • ~/.workbuddy/.skill-list-cache.json 里的 watch.dirs 字段。

结果如下:

候选目录 app.asar 命中 扫描器 watch.dirs 判定
.agents/skills 1 次(且在沙箱白名单) 未列入 用户级 ~/.agents/skills/ 可用;项目级不被 WorkBuddy 扫描
.workbuddy/skills 3 次 已列入 项目级唯一被扫的目录
.cursor/skills 0 次 未列入 WorkBuddy 完全不认

同时确认:~/.workbuddy/settings.json 里只有 sandbox / claw / plugins 相关字段,没有任何配置项能改 Skill 扫描路径。

关键事实(2026-10-20 实测)
WorkBuddy 项目级 Skill 只认 .workbuddy/skills/,不扫 .agents/;且无配置项可改。
因此「单一真源 + 自动镜像」不是权宜之计,是唯一可行解。

2.1 两层放法(最终定案)

既然项目级必须靠镜像,那就分两层管理,各归其位:

层级 位置 规则
项目专属 <项目根>/.agents/skills/ 随 git 提交,走「真源 + 镜像」机制。项目内 Skill 放这里
跨项目通用 ~/.agents/skills/(用户级) 各家通吃:Codex 原生只认它,Cursor / Claude Code / Gemini CLI 兼容扫描,WorkBuddy 也把它列进了沙箱白名单。放这里一份就够,不用镜像

为什么用户级 ~/.agents/skills/ 不用镜像?因为它是文件级目录(真实文件,不是链接),各家都能扫到;一旦放进去,一份就覆盖所有项目。

三、最终解法是什么?单一真源 + 智能镜像

整体结构长这样(箭头是同步方向,镜像只读):

    真源(唯一可写)
    .agents/skills/          ← 所有新增 / 修改只在这里发生
         │
         │  tools/sync_skills.py    每 30 分钟自动跑
         │  规则:mtime 比较,覆盖前自动备份,冲突不覆盖
         ▼
    ┌────────────────┬────────────────┐
    │ .workbuddy/    │ .cursor/       │   镜像(只读)
    │   skills/      │   skills/      │   目录内含提示文件,禁止直接改
    └────────────────┴────────────────┘
         │                  │
         ▼                  ▼
    WorkBuddy            Cursor / Codex
    (只扫这个)        (兼容扫描)
角色 位置 规则
真源(只改这里) .agents/skills/ 新增、修改 Skill 一律在此;随 git 提交;唯一需要人工编辑的位置
镜像(只读) .workbuddy/skills/
.cursor/skills/
由 tools/sync_skills.py 生成,禁止直接改;目录内放有提示文件提醒后来者

3.1 为什么要镜像,而不是目录联接(junction / symlink)

考虑过用符号链接代替拷贝,两个理由否决:

  • 部分扫描器会跳过 symlink —— 链接建了也可能扫不到,等于白建;
  • 链接不随 git 走 —— 换机器后链接全部失效,等于把同一个问题换个地方复现一次。

3.2 为什么镜像不进 git

镜像内容与真源完全相同,入库就是制造三份同一内容、每次提交还要处理重复改动的冲突。做法是:经 git rm -r --cached 移出索引(磁盘文件保留),并在 .gitignore 中排除:

# Skill 镜像目录:真源唯一在 .agents/skills/(2026-10-20)
# 由 tools/sync_skills.py 生成,不进 git,避免同一 skill 两份物理文件
.workbuddy/skills/
.cursor/skills/

换设备后由同步器一次性重建镜像,干净且无冲突。

四、具体怎么落地?四步操作步骤

4.1 日常:修改或新增一个 Skill

标准动作
三步,永远只做第 1 步;第 2 步有自动兜底,做了更快;第 3 步只是保险。

  1. 在真源里改:.agents/skills/<skill名>/ 下编辑 SKILL.md 或 scripts/。
    编辑前先确认自己在真源路径,不是镜像路径——镜像路径下会有提示文件提醒。
  2. 立刻同步(可选,30 分钟内自动也会做):
& "C:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe" tools\sync_skills.py
  1. 提交:把真源改动提交到 git;镜像不入库,不用管。
& git -C $base @who commit -a -m "更新 skill:<skill名> <改了什么>"

4.2 命令行参数

命令 行为
sync_skills.py 智能同步:补缺失文件;真源较新才覆盖镜像(覆盖前自动备份);镜像较新则不覆盖,记入冲突日志
sync_skills.py --check 只报告差异,不修改任何文件。计划任务与排障首选
sync_skills.py --force 忽略时间戳,一律以真源为准覆盖。用于「我确认过镜像里的改动是垃圾」的情况
sync_skills.py --prune 额外删除镜像里真源已不存在的 Skill 目录(默认只记「多余」不删)

4.3 新增一个 Skill

  1. 在 .agents/skills/<新skill名>/ 下建目录,写 SKILL.md。
    文件名必须是 SKILL.md,同步器靠它识别 Skill 目录——这是最容易漏的一步。
  2. 加 scripts/ 等子目录按需。
  3. 跑一次 sync_skills.py,两个镜像自动出现该 Skill。
  4. 提交真源。

4.4 换电脑 / 新 agent 第一次接入

# 1) 拉取仓库(真源随之而来)
# 2) 重建镜像(镜像不在 git 里,必须本地重建)
& "C:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe" tools\sync_skills.py

# 3) 验证
& "C:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe" tools\sync_skills.py --check
# 期望输出:新增 0 / 覆盖 0 / 一致 N / 冲突 0(未修改)

4.5 自动兜底:30 分钟计划任务

已注册 Windows 计划任务 Project-SkillSync,每 30 分钟自动执行一次同步。即使某个 agent 改完 Skill 忘了跑同步命令,最多 30 分钟也会自动拉齐。

项 值
任务名 Project-SkillSync
触发 一次性触发 + 重复间隔 PT30M
执行 python.exe tools\sync_skills.py
工作目录 项目根目录
状态 Ready;上次运行结果 0(成功)
# 查看任务
Get-ScheduledTask -TaskName 'Project-SkillSync'
Get-ScheduledTaskInfo -TaskName 'Project-SkillSync'

# 停用(不再自动同步)
Disable-ScheduledTask -TaskName 'Project-SkillSync'

五、同步器怎么防止误覆盖真源?

同步器最核心的一条规则是不盲目覆盖。判断依据是文件修改时间(mtime):

情形 动作 理由
镜像文件不存在 新增(复制过去) 正常补缺
内容完全一致 跳过 无变化
真源 mtime ≥ 镜像 mtime 覆盖,覆盖前备份到 tools/_sync_backup/<时间戳>/ 以真源为准,符合「只改真源」的纪律
镜像 mtime > 真源 mtime 不覆盖,写入 tools/_sync_backup/last_conflict.txt 有人直接改了镜像,覆盖会丢改动,留给人工判断
镜像里有真源没有的 Skill 默认不删,记为「多余」 可能是别处单独建的,删掉风险高;需 --prune 才删

5.1 产出物位置

路径 内容
tools/_sync_backup/<时间戳>/ 被覆盖文件的自动备份,可随时回滚
tools/_sync_backup/last_conflict.txt 最近一次冲突与多余清单
tools/_sync_backup/last_sync.log 每次同步的汇总与明细,便于后台排障
.workbuddy/skills/_真源在.agents-skills-不要在此直接改.txt 镜像目录内的提示文件,告知后来者「请勿直接改」

六、遇到问题怎么排查?排障手册

6.1 症状 → 原因 → 处理

症状 原因 处理
agent 说「没有这个技能」 镜像未重建(换设备后最常见) 跑 sync_skills.py 重建镜像
改了 Skill 但 agent 行为没变 改在了镜像目录 找到真源 .agents/skills/<名>/ 改,再同步
同步报告有「冲突」 有人在镜像里直接改过 打开 last_conflict.txt;把镜像里的改动搬回真源,或确认是垃圾后 --force
同步报告有「多余」 镜像里存在真源没有的 Skill 确认无用后 --prune 删除
新建的 Skill 没被同步 目录里没有 SKILL.md 补上 SKILL.md(同步器靠它识别 Skill 目录)
git 里出现大量重复文件 镜像曾被入库 git rm -r --cached .cursor/skills .workbuddy/skills(只移索引,磁盘保留)+ 加 .gitignore
同步器报「真源目录不存在」 路径解析错 确认在项目根目录执行;脚本用 __file__ 推导根目录,不受 cwd 影响

6.2 验证机制是否正常

# 快速自检:应输出"新增 0 / 覆盖 0 / 一致 N / 冲突 0(未修改)"
& "C:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe" tools\sync_skills.py --check

# 计划任务是否在跑
Get-ScheduledTaskInfo -TaskName 'Project-SkillSync'   # LastTaskResult 应为 0

# 镜像里有没有提示文件
Get-ChildItem .workbuddy\skills\ -Filter "_真源在*"

七、同步脚本的核心代码长什么样?

完整脚本见文末付费资源包(含同步脚本、计划任务安装脚本、AGENTS.md 纪律条款与 gitignore 片段),这里贴出最关键的冲突判定部分——这是整套方案里最需要理解的地方:

if filecmp.cmp(s, d, shallow=False):
    counters['same'] += 1
    continue
sm, dm = s.stat().st_mtime, d.stat().st_mtime
if args.force or sm >= dm:
    # 真源较新 → 以真源为准,覆盖前先备份
    bk = BACKUP_ROOT / stamp / sk.name / rel
    bk.parent.mkdir(parents=True, exist_ok=True)
    shutil.copy2(d, bk)
    shutil.copy2(s, d)
else:
    # 镜像较新 → 不覆盖,留给人工判断
    conflicts.append(
        f'{mirror.name}/{sk.name}/{rel} 镜像更新于 {dm:%Y-%m-%d %H:%M},'
        f'真源更新于 {sm:%Y-%m-%d %H:%M} → 未覆盖,请人工确认'
    )

八、怎么让 AI agent 自觉只改真源?

我把这几条写进了项目的 AGENTS.md,这样任何 agent 接手都自动知道,不用每次交代:

  1. 要新增或修改 Skill,只改 .agents/skills/;不要直接改 .workbuddy/skills/ 或 .cursor/skills/。
  2. 改完可跑 tools/sync_skills.py 立即同步;不跑也会在 30 分钟内自动同步。
  3. 镜像目录不是真源;不要把镜像里的改动当成本人的工作成果。
  4. 需要跨项目通用的 Skill 放 ~/.agents/skills/(用户级),不用镜像。
  5. 同步器在覆盖前会把旧版备份到 tools/_sync_backup/<时间戳>/,改错了能回滚。

第 5 条那层兜底很重要:正因为「只改真源」是一条需要靠自觉遵守的纪律,同步器才必须做到「覆盖前先备份」——哪怕哪天 agent 判断失误,代价也只是一次恢复,不是丢失。

九、目前这套方案的落地状态如何?

状态项 实测值
真源 Skill 数 4(每个均含 SKILL.md)
镜像一致性 一致 52 / 冲突 0
计划任务 Project-SkillSync,Ready,PT30M
git 策略 真源入库;两个镜像 git rm -r --cached 移出索引,磁盘保留,.gitignore 兜底

遗留说明
本项目曾出现 .agents/skills/typesafe-ai 与 .cursor/skills/typesafe-ai 两份内容相同的副本。已逐文件比对确认一致后去重,真源保留一份,镜像由同步器统一生成,后续不会再出现手工副本。

FAQ:关于 Skill 目录冲突,读者最常问的几个问题

1. 到底该用 .cursor/skills 还是 .workbuddy/skills?

这两个都不是理想答案。理想答案是 .agents/skills/——它是跨工具的事实标准(AGENTS.md 规范),WorkBuddy 虽然目前只扫 .workbuddy/skills,但可以通过镜像机制读到真源。.cursor/skills 是 Cursor 的私有约定,别的工具不认。所以正确做法是:真源放 .agents/skills/,再同步一份到各工具目录。

2. 直接建软链接(symlink/junction)不就行了?为什么要写同步脚本?

软链接在跨平台上有三个硬伤:一是 Windows 管理员权限与开发者模式限制,git 也不记录链接目标;二是各工具扫描时对链接的处理不一致,有的会跳过符号链接目录;三是链接一旦断了,报错信息很难懂,排查成本高。同步脚本虽然多一层,但行为可预期、冲突有报告、覆盖前有备份,在多 agent 协作场景里更稳。

3. 同步会不会把我的改动覆盖掉?

默认不会。同步器按 mtime 比较:真源比镜像新才覆盖,镜像比真源新则跳过并记为冲突,写进 last_conflict.txt 留给人判断。覆盖前还会先把镜像旧版备份到 tools/_sync_backup/<时间戳>/,改错了能回滚。只有显式加 --force 才会无视时间戳强制覆盖。

4. 换一台电脑后 Skill 会消失吗?

按本文这套方案不会——真源在 .agents/skills/ 并随 git 提交,新机器 clone 下来跑一次 tools/sync_skills.py 就有镜像了。但如果没有真源、只在 .cursor/skills/ 里手工存过一份,那只 clone 那一侧,那份就会在换机后彻底消失,同时出现「agent 说没有这个技能」的现象。

5. 用户级的 ~/.agents/skills/ 需要做镜像吗?

不需要。用户级目录是真实文件目录(不是链接),WorkBuddy、Cursor、Codex 都能直接扫到。一份就覆盖所有项目,放进去就全局可见。只有项目级才需要镜像,因为各家只扫自己项目目录下的那份。

6. 同步脚本要多久跑一次?会不会覆盖掉我正在写的东西?

本项目用的是 Windows 计划任务 Project-SkillSync,间隔 PT30M,即每 30 分钟一次。同步时如果发现镜像比真源新(说明有人直接在镜像里改过),不会覆盖,只记冲突。真正需要立即生效时,手动跑一次即可,脚本是幂等的。

付费资源
同步脚本 + 计划任务安装脚本 + AGENTS.md 纪律条款

资源包里到底有什么?一次说清

上面把方案、命令、坑和排障都讲完了,这些内容全部免费读完。下面这份工具包,是给「要立刻在自己项目里落地」的人准备的:把整套方案变成可以直接拷走的脚本与配置片段,解包放进项目根目录,改两行路径就能跑。

① 同步脚本 sync_skills.py · 完整版
文中贴的是最关键的冲突判定片段,包里是能直接跑的完整脚本:补缺失文件、真源较新才覆盖(覆盖前自动备份)、镜像较新就跳过并记冲突。三个镜像目录(.workbuddy / .cursor / .claude)都写好了。
仅用 Python 标准库,3.8+ 即可 · 无需 pip install · 支持 --check / --force / --prune 三个参数
② 计划任务安装脚本 install_sync_task.ps1 · 一键
自动兜底那一层:注册 Windows 计划任务,每 30 分钟跑一次同步,agent 忘了手动同步也不会失联。脚本自带前置检查(解释器在不在、真源在不在),装完自动试跑一次验证。
改顶部两行路径即可 · 不需要管理员权限 · 附查看 / 停用 / 删除命令
③ AGENTS.md 纪律条款片段 · 让 agent 自觉只改真源
整段复制到项目根 AGENTS.md 末尾即可。作用是让任何 agent 接手时自动知道 skill 该改哪里,不必你每次交代一遍——这是整套方案里最省事也最容易被忽略的一环。
含真源 / 镜像对照表 · 五条行为准则 · 换机接入步骤
④ gitignore 片段 · 镜像不进 git
复制到项目 .gitignore 末尾。镜像可由真源加脚本随时重建,入库没意义,还会给 diff 制造噪音。片段里附了「真源被误伤」的检查方法。
附 git check-ignore 验证命令
这包谁用得上
✓ 同一个项目被 Cursor 和 WorkBuddy 前后经手过,skill 已经开始发散
✓ 团队里两三个 agent 都在干活,不知道谁改了哪一份技能
✓ 换电脑 / 换 agent 之后 skill 集体失灵,agent 说「没有这个技能」
✓ 想把「只改真源」这条纪律写进规范,而不是靠人记
拿到手,三步走完
1解包后把 tools/ 整个目录拷到项目根,建好 .agents/skills/<skill名>/SKILL.md(文件名必须是大写 SKILL.md)。
2跑一次 sync_skills.py,两个镜像目录自动建好;再跑 –check 验证:新增 0 / 覆盖 0 / 一致 N / 冲突 0。
3改 install_sync_task.ps1 顶部两行路径后运行,注册 30 分钟自动同步;再把 AGENTS.md 片段贴进项目根 AGENTS.md。
包里另附一份《先看我》,写了四个最容易踩的坑(文件名写成 skill.md、真源被 gitignore 误伤、用目录联接代替镜像、忘了先跑 –check),以及排障速查表。
脚本包 ¥19.9 · 方案与排障手册免费读 · 加入 VIP 享全站免费下载
正文我一分钱没收,全公开。哪家的 agent 扫哪个目录、真源该放哪、脚本怎么写、坑在哪,全部讲清楚了——觉得这套做法对你有用,再考虑要不要把脚本包带走。

作者与更新说明

我是汪斌(老汪),制造业财务出身,专注成本核算、业财融合与 Excel BI 落地,运营「老汪洞察」。这篇文章来自我在真实项目里踩的一次坑——同一个项目被 Cursor 和 WorkBuddy 同时维护,Skill 目录各建一份,很快发散;我花时间把各家的扫描路径逐一查清,才定下「单一真源 + 自动镜像」这套做法,再让 Agent 帮我把同步脚本和排障手册补齐。更新于 2026-10。

汪斌带你开公司 | 老汪洞察 | 小微之家会计服务 · www.accunion.cn

结语

多 Agent 并行干活的最大成本,不是模型能力,而是状态一致性。同一个项目被两三个 AI 工具交替维护时,任何「能改的地方不止一处」的设计,最终都会变成「改了一处忘了另一处」。

所以我的做法是:把「真源在哪」这件事写死在目录约定里,把「同步」这件事交给脚本和计划任务,把「别乱改」这件事写进 agent 行为准则里。 三层各管一段,剩下的就是照着跑。

如果你也在多 AI 工具之间来回切换,这套做法可以直接抄走。


多 Agent 并行干活,Skill 目录一冲突就全乱:单一真源 + 镜像同步的完整解法-小微之家 | 汪斌带你开公司 | 老汪洞察
多 Agent 并行干活,Skill 目录一冲突就全乱:单一真源 + 镜像同步的完整解法
此内容为付费资源,请付费后查看
¥19.99
限时特惠
¥99
立即购买
您当前未登录!建议登陆后购买,可保存购买订单
付费资源
已售 39
© 版权声明
THE END
喜欢就支持一下吧
点赞798 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容