1. 多工具 Skills 目录分散,手动同步到底有多痛
如果你同时用 Cursor 和 Claude Code 写代码,大概率经历过这种场景:在 Cursor 里调好一个git-commitSkill,提示词、模板、脚本都打磨得顺手了,过几天切到 Claude Code 想复用,发现那边还是两个月前的旧版本。更糟的是,你根本记不清自己全局到底装了几个 Skill、哪些是重复的、哪个版本才是最新的。
问题的根源在于各家 AI 编程工具对 Skills 的存放路径各搞一套。Cursor 默认读~/.cursor/skills,Claude Code 读~/.claude/skills,Codex 读~/.codex/skills,Gemini CLI、OpenCode、Amp 又各有各的目录。这些目录还都是隐藏文件夹,平时ls根本看不见,想手动比对只能一个个cd进去翻。我试过用diff -r对比两个目录,结果发现同一个 Skill 在两边内容只差一个换行,但版本号已经不同步了。
手动同步的另一个坑是「复制粘贴式维护」。你从 Cursor 目录cp -r到 Claude 目录,看似解决了,但下次在 Cursor 里改了 Skill,又得重新复制一遍。时间一长,哪个目录是「源」、哪个是「副本」完全混乱。如果还用了 Codex 或 Gemini,那就是三份、四份拷贝,磁盘空间浪费是小事,版本漂移才是致命的——AI 拿着旧版 Skill 给你生成代码,你还以为它「变笨了」。
这篇要解决的问题很具体:用一份中心仓库 + 软链接的方式,让 Cursor、Claude Code 等工具共享同一套 Skills 源文件,改一处、全端生效。适合同时使用两个以上 AI 编程工具、已经被 Skills 目录搞晕的开发者。下面从目录结构设计讲到可复制的同步脚本,再到两端验证生效的完整步骤,跟着做就能跑通。
2. TaoToken 前置:给 Skills 配一个统一的模型入口
Skills 解决的是「AI 怎么干活」的问题,但 Skill 本身要调用模型才能跑起来。如果你在 Cursor 和 Claude Code 里分别配了不同的 API Key、不同的 Base URL,那 Skills 同步了、模型入口却没同步,等于白搭。所以第一步先把模型访问层统一掉。
TaoToken 在这里的角色是「一个 Base URL + 一个 Key 覆盖多工具」。它的 API 地址是https://taotoken.net/api,兼容 OpenAI 风格的/v1/chat/completions和 Anthropic 风格的/v1/messages。这意味着 Cursor 走 OpenAI 兼容协议、Claude Code 走 Anthropic 协议,都能指向同一个入口,不用为每个工具单独申请 Key。
具体操作上,先去控制台创建一个 API Key。打开https://taotoken.net/console,登录后在 API Keys 页面点「新建」,复制生成的sk-开头的字符串。这个 Key 后面会同时填进 Cursor 的模型配置和 Claude Code 的环境变量里。
模型 ID 方面,Claude Code 场景常用claude-sonnet-4-5这类标识,Cursor 里如果走 OpenAI 兼容模式,可以填gpt-4o或claude-sonnet-4-5(取决于你想让哪个模型执行 Skill)。关键是两端填同一个模型 ID,这样 Skill 的行为才一致。
如果你还没决定用哪种接入方式,可以先在模型对话页试一下连通性:https://taotoken.net/models。输入一句「用一句话说明什么是 Agent Skill」,能正常返回就说明 Key 和网络都没问题。这一步花两分钟,能省掉后面排查 401 的半小时。
需要提醒的是,TaoToken 只是模型访问入口,不替代 Cursor 或 Claude Code 本身的编辑器功能。Skills 的目录管理、软链接同步还是靠本地脚本完成,两者是配合关系。把模型入口统一之后,接下来就可以专心处理 Skills 目录的同步了。
3. 可复制配置:中心仓库 + 软链接同步脚本
核心思路是「一份源文件,多处软链接」。先在用户目录下建一个中心仓库~/.skillshub,所有 Skill 的真实文件只存这里。然后在 Cursor、Claude Code 的 Skills 目录里创建指向中心仓库的软链接(macOS/Linux 用 symlink,Windows 用 junction)。这样改中心仓库的文件,两端读到的都是最新版。
先建目录结构。打开终端执行:
mkdir -p ~/.skillshub/skills mkdir -p ~/.cursor/skills mkdir -p ~/.claude/skills假设你有一个git-commitSkill,把它放进中心仓库:
# 从 Cursor 现有目录迁移到中心仓库 mv ~/.cursor/skills/git-commit ~/.skillshub/skills/git-commit然后创建软链接。macOS/Linux 用ln -s:
ln -s ~/.skillshub/skills/git-commit ~/.cursor/skills/git-commit ln -s ~/.skillshub/skills/git-commit ~/.claude/skills/git-commitWindows 下用mklink /J(需要管理员权限的 cmd):
mklink /J "%USERPROFILE%\.cursor\skills\git-commit" "%USERPROFILE%\.skillshub\skills\git-commit" mklink /J "%USERPROFILE%\.claude\skills\git-commit" "%USERPROFILE%\.skillshub\skills\git-commit"如果 Skill 多了,手动一个个建链接太累,写个同步脚本。下面这个sync-skills.sh会遍历中心仓库里的每个 Skill,自动在目标工具目录建链接:
#!/bin/bash # sync-skills.sh - 将 ~/.skillshub/skills 同步到各 AI 工具目录 CENTRAL="$HOME/.skillshub/skills" TARGETS=( "$HOME/.cursor/skills" "$HOME/.claude/skills" "$HOME/.codex/skills" ) for target in "${TARGETS[@]}"; do mkdir -p "$target" for skill in "$CENTRAL"/*/; do name=$(basename "$skill") link="$target/$name" if [ -L "$link" ] || [ -e "$link" ]; then rm -rf "$link" fi ln -s "$skill" "$link" echo "linked: $name -> $target" done done保存后加执行权限chmod +x sync-skills.sh,运行./sync-skills.sh就能一次性把中心仓库的所有 Skill 链接到 Cursor、Claude Code、Codex 三个目录。以后新增 Skill 只需放进~/.skillshub/skills,再跑一次脚本。
Cursor 的模型配置放在~/.cursor/config.json(部分版本在设置界面里),关键字段是 Base URL 和 Key:
{ "models": { "custom": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的Key", "model": "claude-sonnet-4-5" } } }Claude Code 用环境变量或~/.claude/settings.json。settings 方式更持久:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }注意 Claude Code 的 Base URL 填https://taotoken.net/api即可,它会自动拼接/v1/messages。三件套(Base URL + Key + Model ID)在两端保持一致,Skill 执行时调用的模型才是同一个。
4. 验证请求:确认 Skills 在两端真的生效
配置写完不代表生效,得实际验证。先确认软链接建对了。在终端执行:
ls -la ~/.cursor/skills/ ls -la ~/.claude/skills/输出里应该看到git-commit -> /Users/你的用户名/.skillshub/skills/git-commit这样的箭头指向。如果显示的是普通目录而不是链接,说明脚本没跑成功,检查ln -s是否被已有目录挡住了。
接着验证「改一处、两端同步」。在中心仓库改一个 Skill 文件:
echo "# 测试同步" >> ~/.skillshub/skills/git-commit/SKILL.md然后分别读两端的文件:
tail -1 ~/.cursor/skills/git-commit/SKILL.md tail -1 ~/.claude/skills/git-commit/SKILL.md两边都应该输出# 测试同步。如果只有一边变了,说明另一边不是软链接而是真实拷贝,回到上一步重建链接。
再验证模型入口。在 Cursor 里打开一个项目,用Cmd+K调出 AI 面板,输入「用 git-commit skill 帮我生成提交信息」。如果 Skill 生效,它会按你定义的模板输出;如果报 401,说明 Key 没填对;如果报model not found,检查模型 ID 是否和 TaoToken 支持的列表一致。
Claude Code 端在项目目录下执行:
claude "用 git-commit skill 生成提交信息"正常情况会看到它读取~/.claude/skills/git-commit/SKILL.md的内容并按模板执行。如果提示找不到 Skill,用claude --debug看它实际扫描了哪个目录。
成功的结果是:两端执行同一个 Skill,输出的格式、模板、调用逻辑完全一致,因为它们读的是同一个文件、调的是同一个模型。这时候你才算真正做到了「一次配置、多端一致」。
5. 本篇常见错排查:401、软链接失效与模型不匹配
报错一:401 Unauthorized。这是最常见的。先检查 Key 有没有多余空格,sk-后面是否完整复制。Claude Code 里如果用了ANTHROPIC_API_KEY但环境里还有旧的ANTHROPIC_AUTH_TOKEN,两者冲突也会 401。执行env | grep ANTHROPIC看有没有残留变量,有就unset掉。Cursor 的 config.json 里如果 Key 字段名写成了api_key而不是apiKey,同样会认证失败。
报错二:local proxy failed / connection refused。这个通常出现在 Base URL 写错端口或协议的情况。确认填的是https://taotoken.net/api,不要多加/v1(Claude Code 会自动拼),也不要少https。如果本地开了其他网络工具占用端口,先关掉再试。这个报错和 Skills 本身无关,纯粹是模型入口没通。
报错三:reading choices / unexpected response shape。说明请求发出去了但返回格式不对。常见原因是 Cursor 走了 OpenAI 兼容模式,但模型 ID 填了 Anthropic 专有名称,或者反过来。检查两端模型 ID 是否统一,Cursor 里如果配置了openai协议,模型填gpt-4o;如果配置了anthropic协议,填claude-sonnet-4-5。混用会导致解析失败。
报错四:OAuth token expired / authentication failed。Claude Code 如果之前登录过官方账号,本地可能缓存了 OAuth token,优先级高于 API Key。执行claude logout清掉缓存,再重新用环境变量或 settings.json 里的 Key 认证。清完后claude --version确认能正常启动。
报错五:软链接变成普通文件。某些编辑器保存文件时会「另存为」而不是原地写入,导致软链接被替换成真实文件。表现是改中心仓库后,某一端不再同步。用ls -la检查,如果箭头消失就重新跑sync-skills.sh。建议在编辑器里关闭「保存时创建备份副本」选项。
报错六:Skill 目录名大小写不一致。macOS 默认文件系统不区分大小写,但 Linux 和部分工具区分。中心仓库里叫Git-Commit,链接目标写git-commit,在 macOS 上能跑,换到 Linux 就找不到。统一用小写加连字符命名,避免跨平台踩坑。
排查顺序建议:先确认软链接(ls -la),再确认模型入口(curl 测一下),最后确认 Skill 内容(cat看文件)。三步定位,基本能覆盖九成问题。
6. 把 Skills 管起来之后,模型入口也别落下
Skills 目录统一之后,你会发现真正影响效率的还有模型访问层。Cursor 和 Claude Code 各自配一套 Key、各自记一个 Base URL,时间长了同样会乱。把 TaoToken 作为统一入口,两端填同一个https://taotoken.net/api和同一个 Key,Skill 同步 + 模型同步才算完整。
如果你主要用 Claude Code 做长期编码任务,可以了解一下 Coding Plan,它针对 Agent 类高频调用做了额度优化:https://taotoken.net/coding-plan。如果只是想先验证模型通不通,模型对话页最直接:https://taotoken.net/models。Key 的管理和新建都在 API Keys 页面:https://taotoken.net/api-keys。接入细节和参数说明看文档:https://taotoken.net/doc。
回到 Skills 本身,中心仓库 + 软链接这套方案的好处是「非侵入」——Cursor 和 Claude Code 都以为自己在读本地目录,实际上读的是同一份文件。你不需要改任何工具的源码,也不需要装额外的同步服务,一个 shell 脚本就搞定。新增工具时,只要把它的 Skills 目录加进TARGETS数组,跑一次脚本就接入了。
最后留一个实用技巧:把sync-skills.sh加到 crontab 或 git hook 里,每次git pull中心仓库后自动同步。这样团队协作时,别人更新了 Skill,你拉下来一跑脚本,Cursor 和 Claude Code 同时生效,再也不用问「你那边是哪个版本」。