Three pieces of software all tried to bridge the same events on my Mac. The wrong one won.
The symptom
- Source label: Claude
- Title: [Image 1] dashboard:f5ec2df1-2ae...
- Click the card to jump back: nothing happens
Three integrations on a collision course
Json
{
"hooks": {
"UserPromptSubmit": [{
"hooks": [{
"command": "$HOME/.vibe-island/bin/vibe-island-bridge --source claude",
"type": "command"
}]
}]
}
}
Text
OpenCode event
→ oh-my-openagent compat layer
→ vibe-island-bridge --source claude
→ Vibe Island socket
→ recorded as source=claude
Why click-to-jump silently failed
Yaml
jump: bid=nil iterm=nil tmux=false tty=nil ideWin=nil pid=<server-pid>
jump: done 0ms
The fix
Json
{
"plugin": [
"./plugins/vibe-island.js",
"oh-my-openagent@latest"
]
}
Json
{
"disabledHooks": {
"PreToolUse": ["vibe-island-bridge"],
"PostToolUse": ["vibe-island-bridge"],
"UserPromptSubmit": ["vibe-island-bridge"],
"Stop": ["vibe-island-bridge"],
"PreCompact": ["vibe-island-bridge"]
}
}
Js
const lines = ps.split(/\n/)
.map((line) => line.match(/^(\d+)\s+(\d+)\s+(\S+)\s+(.+)$/))
.filter(Boolean)
.map((m) => ({ pid: +m[1], ppid: +m[2], tty: m[3], args: m[4] }))
.filter((p) => p.tty !== "??" && /opencode\s+attach/.test(p.args));
const exact = key ? lines.filter((p) => p.args.includes(`--dir ${key}`)) : [];
const chosen = (exact.length ? exact : lines).sort((a, b) => b.pid - a.pid)[0];
Js
raw
.replace(/<auto-slash-command>[\s\S]*?<\/auto-slash-command>/gi, " ")
.replace(/<command-instruction>[\s\S]*?<\/command-instruction>/gi, " ")
.replace(/\[Image\s+\d+\]\s*(?:[^\s:]+:[A-Za-z0-9_-]+(?:\s+[A-Za-z0-9_-]+)*)?/gi, " ")
.trim();
What I learned
The plugin
三个软件在我的 Mac 上同时想"桥接"同一组事件。结果是错的那个赢了。
症状
- 来源标签:Claude
- 标题:[Image 1] dashboard:f5ec2df1-2ae...
- 点卡片跳转:什么也不发生
三个集成同时生效
Json
{
"hooks": {
"UserPromptSubmit": [{
"hooks": [{
"command": "$HOME/.vibe-island/bin/vibe-island-bridge --source claude",
"type": "command"
}]
}]
}
}
Text
OpenCode 事件
→ oh-my-openagent 兼容层
→ vibe-island-bridge --source claude
→ Vibe Island socket
→ 记成 source=claude
为什么点击跳转静默失败
Yaml
jump: bid=nil iterm=nil tmux=false tty=nil ideWin=nil pid=<server-pid>
jump: done 0ms
修复
Json
{
"plugin": [
"./plugins/vibe-island.js",
"oh-my-openagent@latest"
]
}
Json
{
"disabledHooks": {
"PreToolUse": ["vibe-island-bridge"],
"PostToolUse": ["vibe-island-bridge"],
"UserPromptSubmit": ["vibe-island-bridge"],
"Stop": ["vibe-island-bridge"],
"PreCompact": ["vibe-island-bridge"]
}
}
Js
const lines = ps.split(/\n/)
.map((line) => line.match(/^(\d+)\s+(\d+)\s+(\S+)\s+(.+)$/))
.filter(Boolean)
.map((m) => ({ pid: +m[1], ppid: +m[2], tty: m[3], args: m[4] }))
.filter((p) => p.tty !== "??" && /opencode\s+attach/.test(p.args));
const exact = key ? lines.filter((p) => p.args.includes(`--dir ${key}`)) : [];
const chosen = (exact.length ? exact : lines).sort((a, b) => b.pid - a.pid)[0];
Js
raw
.replace(/<auto-slash-command>[\s\S]*?<\/auto-slash-command>/gi, " ")
.replace(/<command-instruction>[\s\S]*?<\/command-instruction>/gi, " ")
.replace(/\[Image\s+\d+\]\s*(?:[^\s:]+:[A-Za-z0-9_-]+(?:\s+[A-Za-z0-9_-]+)*)?/gi, " ")
.trim();