xy-link · diff

v1.0.1 to v1.0.3

2 added, 3 removed. Audit A to A.

---
name: xy-link
slug: xy-link
- version: 1.0.1
+ version: 1.0.3
displayName: 桥接
display_name: "桥接"
display_name_en: "桥接"
- description_zh: "把一个 skill 或整个 skills/ 目录用软链挂到本机已安装的各个 Agent 宿主(公共入口 ~/.agents/skills、Claude Code、WorkBuddy、Trae 等专属入口,Grok 生成薄 bridge),也负责查桥接状态和拆桥。用户说「桥接这个 skill」「把 skill 接到 Codex/豆包/WorkBuddy」「让所有 Agent 都能用」「桥好了没」「取消桥接」「拆桥」时使用。|作者微信:LZJ5460,欢迎交流反馈。|出品:小爷操盘系统"
visibility: "public"
- description: 【桥接】把一个 skill 或整个 skills/ 目录用软链挂到本机已安装的各个 Agent 宿主(公共入口 ~/.agents/skills、Claude Code、WorkBuddy、Trae 等专属入口,Grok 生成薄 bridge),也负责查桥接状态和拆桥。用户说「桥接这个 skill」「把 skill 接到 Codex/豆包/WorkBuddy」「让所有 Agent 都能用」「桥好了没」「取消桥接」「拆桥」时使用。
+ description: 【桥接】把一个 skill 或整个 skills/ 目录用软链挂到本机已安装的各个 Agent 宿主(公共入口 ~/.agents/skills、Claude Code、WorkBuddy、Trae 等专属入口,Grok 生成薄 bridge),也负责查桥接状态和拆桥。用户说「桥接这个 skill」「把 skill 接到 Codex/豆包/WorkBuddy」「让所有 Agent 都能用」「桥好了没」「取消桥接」「拆桥」时使用。|小爷出品
---
# 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 或在设置里指定目录(若该版本提供)。
---
## 六条硬规则
1. **只放软链,不复制。** 复制就是版本分叉的开始。
2. **不给没装的宿主建目录。** 唯一例外是 `~/.agents/skills`。
3. **不覆盖真实目录。** 目标位置若是真实目录/文件,保留并报告,让用户自己决定。
4. **拆桥、查状态都要校验指向。** 同名软链若指向别的源,不删、不算桥好,报出来。
5. **`private/`、`.private/`、`knowledge/_internal/` 永不桥接。** 脚本会直接拒绝这些源,批量桥接时也跳过。
6. **用脚本,不临场手写 `ln -s`。** 所有判断都在脚本里,别绕开。
---
## 确定源
用户可能给的形式:skill 名(`xy-selection`)、仓库相对路径(`skills/xy-selection`)、绝对路径、外部 skill 目录、skill 集合目录(本仓库 `skills/` 或任意含多个 skill 子目录的目录)、或只说"这个 skill"。
**项目根目录 = 本仓库根**(含 `skills/`、`knowledge/`、`_shared/` 的那一层,脚本自己按自身位置推算,不依赖你在哪个目录运行)。解析顺序:
1. 绝对路径 → 直接用。
2. 相对路径 → 先按当前工作目录,再按仓库根。
3. 只有名字 → 先当前工作目录下同名目录,再仓库 `skills/<name>`。
4. "这个 skill" → 当前对话刚建、刚改、刚讨论的那个。
5. 还不确定 → 看当前目录和 `skills/` 下最近改动的。
6. 仍不确定 → 只问一句:`桥接哪个 skill?给名字或路径。`
合格的源:目录里有 `SKILL.md`;或一级子目录里有若干 `SKILL.md`(批量)。
---
## 三个动作
在仓库根运行(或用绝对路径调脚本,效果一样):
```bash
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;源不动。
---
## 回报格式
桥接完成:
```markdown
已桥接 `<name>`(真源:`<source-path>`)
- 公共入口:~/.agents/skills/<name> ✓
- 专属入口:<列出实际写入的宿主>;<未安装的宿主一律不列>
- Grok:~/.grok/skills/<name>/SKILL.md ✓(或:本机无 Grok,跳过)
- 旧入口清理:<有则列,无则省略>
```
遇到冲突:
```markdown
保留了 `<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`。」
## 中文输出纪律
面向用户的每句输出遵守 `_shared/chinese-writing.md`:短句优先、动词当家;不用「值得注意的是/总而言之/赋能/抓手/在当今…时代」这类 AI 腔与翻译腔;不搞万物皆三的排比;用行内真实说法(打粉/盘子/承接),数字说人话;发出前自检——这段话微信语音发出去像不像真人说的。用户用英文或其它语言提问时,全程用对方的语言回答,同样遵守"像真人说话"的标准。