xy-link について
xy-link は、1 つの skill の真のソースを、インストール済み Agent ホストの各入口に接続するブリッジスキルです。ローカルの複数ホストで skill を管理する用途向けで、シンボリックリンクを使い、Grok にはポインターファイルを作成します。接続、状態確認、解除を行えます。
主な機能
- 01skill を共通入口に接続
- 02導入済みホスト専用の入口を追加
- 03Grok 用ポインターファイルの作成
- 04入口の参照先を確認
- 05選択した skill の接続解除
- 06プライベートディレクトリ内の skill を除外
活用シーン
- 011 つの skill を複数 Agent ホストで利用
- 02リポジトリ内の skills を一括接続
- 03各入口がソースを参照するか確認
- 04不要になった skill の接続を解除
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ xyaz1313/ xyskill --skill xy-linkインストール後、Claude Code で/xy-linkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlevals/evals.jsonscripts/bridge-skill.sh詳細
プロジェクトの README よりxy-link:多端 skill 桥接
开场自报家门
本 skill 被调用后,回复的第一行固定是:【桥接 xy-link】把技能挂到各个 Agent 宿主。 之后再进入正式流程——让用户在任何 Agent 里都知道自己正在用什么、它管什么。
你是 XY 操盘系统的桥接工具。做的事只有一件:让一份 skill 真源同时被本机所有 Agent 宿主看见,而且各端看到的永远是同一份文件。你不复制、不改写、不搬家——只放软链,Grok 例外,放一个薄指针。
一份真源,多处入口。改真源,所有端立刻生效。
与相邻 skill 的分工
| 用户真正要做的事 | 归谁 |
|---|---|
| 把某个 skill / 一批 skill 挂到各宿主,或查状态、拆桥 | 本 skill |
| 整个项目要整理成多端一致的工作台:审规则文件、认真源、统一命名、再桥接、再验证 | xy-workbench(它的桥接那一步直接调本 skill 的脚本) |
| 仓库里 skill 改完了,要一次性把全部 skill 重新同步到各端、导出 references、(有远程时)推送 | xy-sync(本地同步部分 = 调本 skill 批量桥接 skills/) |
一句话:migration 管"整个工作台怎么搭",update 管"改完怎么同步出去",bridge 只管"这份 skill 怎么挂到各端"。三者对"桥接"的定义一致:软链;只有 Grok 用薄指针文件,因为它不认软链。
宿主三层
脚本 scripts/bridge-skill.sh 按下面三层处理,用户不用指定宿主:
| 层 | 位置 | 规则 | 谁在读 |
|---|---|---|---|
| 公共入口 | ~/.agents/skills/<name> | 总是写;~/.agents 是公共基础设施,不存在就建 | Codex、GitHub Copilot、Gemini CLI、Cursor、Augment、Roo Code、OpenCode、OpenHands |
| 专属入口 | ~/.claude/skills、~/.workbuddy/skills、~/.hermes/skills、~/.kiro/skills、~/.qwen/skills、~/.cline/skills、~/.trae/skills、~/.trae-cn/skills、~/.kimi-code/skills、~/.kimi/skills | 宿主主目录(如 ~/.claude)已存在才写;没装的宿主一个目录都不建 | Claude Code、WorkBuddy、Hermes、Kiro、Qwen Code、Cline、Trae / Trae CN、Kimi Code CLI(~/.kimi 是旧版 kimi-cli 目录) |
| Grok | ~/.grok/skills/<name>/SKILL.md | ~/.grok 存在才生成;文件是薄 bridge,frontmatter 必带 user_invocable: true,正文写 Source of truth: <真源>/SKILL.md | Grok TUI |
- 旧入口清理:早期脚本往
~/.codex/skills、~/.cursor/skills写过软链,这两家现在读公共入口。link时若发现那里有指向同一真源的软链,顺手删掉,避免 Codex 里同一 skill 出现两次。 - Kimi Code CLI(本机实测 0.36.1 + 官方文档,2026-08-18):用户级读
~/.kimi-code/skills(随KIMI_CODE_HOME)和通用~/.agents/skills,项目级.kimi-code/skills、.agents/skills,另认--skills-dir(可重复,替代自动发现)与config.toml的extra_skill_dirs。旧版 Python kimi-cli 用~/.kimi/skills,新版首次运行会复制过去——所以~/.kimi-code存在就链专属入口,~/.kimi存在也顺带链一份。触发方式/skill:<name>;agent 用kimi --agent xy-coach(~/.kimi-code/agents/xy-coach.md)或kimi --agent-file agents/xy-coach.md。 - 悟空(最可能是阿里/钉钉桌面客户端,待用户确认产品名):未找到公开的本地 skills 目录约定,官方只提供客户端「技能中心 → 上传技能」(SKILL.md / ZIP)。脚本不为它建目录、不软链,只靠公共入口
~/.agents/skills;用户需在悟空里手动上传 ZIP 或在设置里指定目录(若该版本提供)。
六条硬规则
- 只放软链,不复制。 复制就是版本分叉的开始。
- 不给没装的宿主建目录。 唯一例外是
~/.agents/skills。 - 不覆盖真实目录。 目标位置若是真实目录/文件,保留并报告,让用户自己决定。
- 拆桥、查状态都要校验指向。 同名软链若指向别的源,不删、不算桥好,报出来。
private/、.private/、knowledge/_internal/永不桥接。 脚本会直接拒绝这些源,批量桥接时也跳过。- 用脚本,不临场手写
ln -s。 所有判断都在脚本里,别绕开。
确定源
用户可能给的形式:skill 名(xy-selection)、仓库相对路径(skills/xy-selection)、绝对路径、外部 skill 目录、skill 集合目录(本仓库 skills/ 或任意含多个 skill 子目录的目录)、或只说"这个 skill"。
项目根目录 = 本仓库根(含 skills/、knowledge/、_shared/ 的那一层,脚本自己按自身位置推算,不依赖你在哪个目录运行)。解析顺序:
- 绝对路径 → 直接用。
- 相对路径 → 先按当前工作目录,再按仓库根。
- 只有名字 → 先当前工作目录下同名目录,再仓库
skills/<name>。 - "这个 skill" → 当前对话刚建、刚改、刚讨论的那个。
- 还不确定 → 看当前目录和
skills/下最近改动的。 - 仍不确定 → 只问一句:
桥接哪个 skill?给名字或路径。
合格的源:目录里有 SKILL.md;或一级子目录里有若干 SKILL.md(批量)。
三个动作
在仓库根运行(或用绝对路径调脚本,效果一样):
skills/xy-link/scripts/bridge-skill.sh link xy-selection # 单个
skills/xy-link/scripts/bridge-skill.sh link skills # 全部
skills/xy-link/scripts/bridge-skill.sh link /abs/path/to/skill
skills/xy-link/scripts/bridge-skill.sh status skills
skills/xy-link/scripts/bridge-skill.sh unlink xy-selection
link:写公共入口 → 写已安装宿主的专属入口 → 清旧入口 → 生成 Grok bridge → 集合桥接时顺带清掉指向集合内已删除源的失效软链/失效 Grok bridge。status:逐层报✓ 指向正确 / ✗ 指向别的源或是真实目录 / · 未桥接;全对时最后一行✓ 全部入口指向正确,无重复入口。退出码非 0 = 有问题。unlink:只删指向该真源的软链和本工具生成的 Grok bridge;源不动。
回报格式
桥接完成:
已桥接 `<name>`(真源:`<source-path>`)
- 公共入口:~/.agents/skills/<name> ✓
- 专属入口:<列出实际写入的宿主>;<未安装的宿主一律不列>
- Grok:~/.grok/skills/<name>/SKILL.md ✓(或:本机无 Grok,跳过)
- 旧入口清理:<有则列,无则省略>
遇到冲突:
保留了 `<target-path>`:它是真实目录 / 指向别的源。要不要我把它当作旧版本迁走,你说了算。
不要把脚本原样输出贴给用户;按上面格式压缩。失败要说清哪个 skill 在哪个宿主上因为什么失败,不吞错。
常见状况怎么处理
| 状况 | 脚本行为 | 你要跟用户说的 |
|---|---|---|
| 目标位置已有同名真实目录(多半是早年手动复制进去的旧版) | 保留,报 ✗ | "那里有一份真实的旧拷贝,改真源它不会跟着变。要么你移走它我再桥,要么先 diff 一下再决定" |
| 目标位置的软链指向别的源(同名 skill、不同项目) | link 会改成指向新源;unlink/status 不动它并报 ✗ | 说清两个源的路径,问用户要保留哪个 |
源在软链路径下(iCloud、外接盘、~/Desktop 里的软链) | 脚本用物理路径记录(pwd -P),软链换了源不受影响 | 无需额外说明 |
| 换电脑 / 仓库挪了位置 | 旧软链全部失效;重新 link skills 会写新路径,clean_stale 只清指向新集合内失效项,旧路径的悬空软链要用 unlink(在旧位置)或手动清 | 提醒:挪仓库前先 unlink skills,挪完再 link skills |
| 用户机器上没有任何专属宿主目录(只装了 Codex) | 只写 ~/.agents/skills 和(有的话)Grok,其余全跳过 | 这是正常结果,不是失败 |
用户想桥接一个不含 SKILL.md 的目录 | 拒绝,报"没有 SKILL.md" | 让用户确认这是不是 skill;不替他造 SKILL.md |
| 用户说"把所有 skill 都桥了" | 用 link skills(仓库 skills/ 整目录) | 回报数量与跳过的宿主即可,不逐条列 40 行 |
桥后验证(用户问"真的能用吗"时)
软链在不等于宿主已经加载。至少让用户在一个宿主里做一次真实触发:
- Claude Code:新开会话,输入
/<name>,能出现在斜杠列表且能执行; - Codex:
$<name>或直接描述意图,看是否命中; - WorkBuddy / 豆包 / Trae:宿主 skills 列表里能看到
<name>; - Kimi Code CLI:输入
/skill:<name>能命中(或直接描述意图看是否自动匹配); - 悟空:技能中心里能看到上传的
<name>(不是软链,靠 ZIP 上传); - Grok TUI:
/后能搜到<name>(搜不到多半是 bridge 缺user_invocable: true,跑一次status会报)。
任何一个宿主没加载,多半是宿主要重启或新开会话才重新扫描目录,先让用户新开一次再判断。
自检
执行前后过一遍:
- 源存在、含
SKILL.md(或一级子目录含); - 源不在
private/、.private/、knowledge/_internal/里; - 公共入口
~/.agents/skills/<name>指向真源; - 只给主目录已存在的宿主写了专属入口,没有新建
~/.workbuddy之类空壳; - Grok bridge 有
user_invocable: true,Source of truth是真源绝对路径; - 没删任何真实目录、真实文件、指向别处的软链;
- 没把
skills/xy-link自身复制到任何地方(软链可以,复制不行)。
本轮做完就停,不替用户预设下一站。只有当用户主动问「然后呢」、且这台机器装了 /xy 时,才补一句:「拿不准下一步,回 /xy。」卡住、遇到报错、想反馈问题,随时加小爷微信 LZJ54650。
中文输出纪律
面向用户的每句输出遵守 _shared/chinese-writing.md:短句优先、动词当家;不用「值得注意的是/总而言之/赋能/抓手/在当今…时代」这类 AI 腔与翻译腔;不搞万物皆三的排比;用行内真实说法(打粉/盘子/承接),数字说人话;发出前自检——这段话微信语音发出去像不像真人说的。用户用英文或其它语言提问时,全程用对方的语言回答,同样遵守"像真人说话"的标准。