
VibeClaude 的功能
VibeClaude 是一个 Claude Code 插件,可通过 Intiface Central 和 buttplug.io 将编码活动转换为设备反馈。Claude Code 事件会发送到本地守护进程,该进程通过 WebSocket 与 Intiface Central 通信,然后控制已配对的振动设备。
Claude Code — hooks 模块 — HTTP — 守护进程 — WebSocket — Intiface Central — BLE — 设备该插件会响应流式模型输出、工具调用、权限提示、已完成的待办事项、子代理、中断,以及回合或会话生命周期事件。插件适用于私密、舒适的环境,请负责任地使用兼容硬件。
要求
- 支持 function-hooks 插件的 Claude Code。VibeClaude 基于此早期访问 API 的 2.1.291 版本构建。
- 系统中可通过
PATH中的node使用 Node.js 22 或更高版本。 - 运行着 WebSocket 服务器的 Intiface Central。默认地址为
ws://127.0.0.1:12345。 - 已在 Intiface Central 中配对的振动控制器。
- 适合使用已连接设备的私密环境。
安装 VibeClaude
将代码仓库克隆到 Claude 配置目录,并安装其依赖:
git clone https://github.com/transkatgirl/vibeclaude.git ~/.claude/vibeclaude
cd ~/.claude/vibeclaude && npm install你可以为单个 Claude Code 会话加载插件:
claude --plugin-dir ~/.claude/vibeclaude也可以在 Claude Code 中永久安装:
/plugin marketplace add ~/.claude/vibeclaude
/plugin install vibeclaude@vibeclaude-local安装后重启 Claude Code。插件会在新会话开始时加载。
检查依赖位置
守护进程会从 Claude Code 用于加载插件的目录运行,并且要求该目录中存在 node_modules。通过市场安装的插件可能会被复制到不包含原始克隆目录中已安装依赖的位置。
如果 Claude Code 显示缺少 buttplug npm 软件包,请在提示信息所指示的目录中运行 npm install。
连接设备
- 启动 Intiface Central,然后按下其服务器启动按钮。
- 在 Claude Code 中运行
/intiface。 - 等待连接和扫描完成。
- 从结果中选择一个振动设备。
- 确认设备已连接且适合当前环境后,开始使用 Claude Code。
/intiface 命令会打开一个对话框,显示连接和扫描状态。使用方向键或 Tab 键浏览设备,按 Enter 或点击来选择设备,按 Escape 离开对话框。
在你选择设备之前,不会向设备发送任何内容。VibeClaude 一次只控制一个选定的设备。之后启动新的 Claude Code 会话时,插件会尝试重新连接 Intiface Central,并在之前选定的设备可用时恢复连接。
插件命令
/intiface:连接到 Intiface、扫描设备并选择设备。/intiface-connect:连接到配置的 Intiface 服务器,并在之前选定的设备可用时恢复连接。/intiface-disconnect:断开连接并停止所有设备输出。/intiface-intensity [0.0-1.0]:设置全局强度乘数;未提供数字时,报告当前值。
这些命令在插件内部运行,不会启动模型回合或消耗令牌。它们也不会在对话中留下命令输出,并且可以在回合运行期间使用。
了解反馈模式
VibeClaude 将每个事件表示为固定时长、恒定强度的模式。在同一对话中,最近的事件会替代之前的事件。选择事件后,再应用全局强度乘数。
- 流式思考和文本:每个片段产生一个 70 毫秒的脉冲,强度根据平均输出速度在 0.35 到 0.8 之间变化。响应速度计算在每秒 40 个字符时达到上限。
- 完整响应:未使用流式传输的响应到达时,产生一个强度为 0.4、持续 150 毫秒的脉冲。
- 工具调用:模型开始编写工具调用时,产生一个强度为 0.5、持续 120 毫秒的脉冲。
- 编辑操作:编写并应用
Edit、Write、MultiEdit或NotebookEdit操作期间,以 0.3 的强度持续输出。 - 成功的工具调用:产生一个强度为 0.7、持续 180 毫秒的脉冲。
- 失败、被拒绝或遭拒的工具调用:产生一个强度为 1.0、持续 280 毫秒的脉冲。
- 已完成的待办事项:产生一个强度为 0.8 的脉冲,随后立即被工具成功模式替代。
- 权限提示:产生三个强度为 0.85、持续 90 毫秒的脉冲,随后暂停并重复,直到提示得到处理。
- 回合完成:产生三个强度为 1.0、持续 100 毫秒的脉冲。
- 中断或失败的回合:当前输出停止,随后产生回合完成时使用的三个脉冲。
- 会话结束:停止所有输出。
多个会话和子代理
每个打开的 Claude Code 会话都会跟踪自己的工具、提示、待办事项和子代理。当多个模式处于活动状态时,使用强度最高的模式。该模式结束后,设备可以恢复到另一个会话中的活动模式。
子代理会与启动它们的对话混合显示。它们的流式输出、工具调用、权限提示、待办事项以及完成或失败事件都会独立呈现。结束主会话会停止其所有子代理。
调整强度
使用强度命令降低或禁用输出:
/intiface-intensity 0.5默认乘数为 1.0。值为 0 时会禁用反馈,介于 0 和 1 之间的值会按比例缩放每个活动模式。更改会立即生效,包括对已经播放的模式,并会一直保存,直到再次更改。
重要事件限制
由于 Claude Code 向插件公开的信息有限,某些行为必然只能近似处理:
- 思考:只有在 Claude Code 将思考内容显示出来的情况下,才能表示思考。例如,在无头模式的
claude -p运行期间无法获取思考内容。 - 权限响应:Claude Code 不会报告权限提示得到回答的确切时刻。相关工具完成、失败或被拒绝时,提示模式通常会结束。某些终端后台运行提示可能会使其更早停止。
- 工具输出:插件无法在命令输出流式传输时接收这些输出,因此工具输出会通过工具结果表示,而不是通过每一行打印内容表示。
配置插件
启用插件时,Claude Code 会询问插件选项。之后可以通过 /plugin 和插件管理界面进行更改。
wsAddress:Intiface Central WebSocket 地址。默认值为ws://127.0.0.1:12345。
更改后的 WebSocket 地址会在守护进程下次启动时生效。请结束会话,或直接使用以下命令停止守护进程:
node daemon/daemon.mjs stopVibeClaude 会将所选设备、强度和 daemon.log 存储在 ~/.config/vibeclaude 下。如果 TCP 端口 12350 已被占用,请创建 ~/.config/vibeclaude/config.json 并指定其他端口:
{ "port": 12351 }从 Shell 使用守护进程
守护进程可以独立于 Claude Code 斜杠命令进行控制。以下命令使用默认配置目录和 WebSocket 地址:
node daemon/daemon.mjs scan:连接并扫描三秒,然后列出支持振动的设备。node daemon/daemon.mjs select <index>:从扫描结果中选择设备。node daemon/daemon.mjs connect和disconnect:连接 Intiface 或断开与 Intiface 的连接。node daemon/daemon.mjs intensity [value]:设置或显示强度乘数。node daemon/daemon.mjs start:确保守护进程正在运行并打印其端口。node daemon/daemon.mjs status:检查守护进程是否响应。node daemon/daemon.mjs stop:停止所有输出并退出守护进程。node daemon/daemon.mjs:在前台运行守护进程。
使用 --home <dir> 选择其他配置目录,使用 --ws <address> 指定其他 Intiface 地址。要在每个事件到达时记录日志,请设置调试环境变量:
VIBECLAUDE_DEBUG=1 node daemon/daemon.mjs无硬件测试
仓库包含一个模拟 Intiface 服务器,它会打印本应接收的电机级别。在端口 12345 上启动它:
node test/mock-intiface.mjs 12345然后运行测试套件:
npm test测试会通过模拟服务器对守护进程进行端到端测试,并测试 hooks 模块,让你无需实体控制器即可检查安装是否正常。
架构工作原理
hooks/register.tsx 在 Claude Code 内部运行。它会观察流式回合步骤、工具调用、权限检查、子代理创建以及会话或回合生命周期变化等钩子事件。随后,它会将这些事件压缩为包含大小和标识符的小型消息,而不是模型文本,并按顺序通过回环地址 127.0.0.1:12350 发送给守护进程。
hooks 模块还会注册斜杠命令、显示设备选择对话框,并将守护进程通知显示为 Toast。由于 hooks 模块无法访问 Node.js,因此不能自行运行 Buttplug 客户端或维护 Intiface WebSocket 连接。
daemon/daemon.mjs 负责官方 Buttplug 客户端、Intiface 连接、所选设备、振动引擎和事件处理程序。由于设备的响应速度可能慢于模型输出到达的速度,守护进程会发送最新请求的级别,而不是建立积压队列。
第一个会话需要守护进程时,守护进程会启动;最后一个会话结束后,守护进程会退出。它会监控与每个会话关联的 Claude Code 进程,并清理意外消失的会话。如果无法确定哪个进程已结束,则会在 30 分钟没有活动后退出。
隐私与自动关闭
插件只会向你在本机配置的 Intiface 地址发送设备命令。守护进程监听回环地址,并接受发往 127.0.0.1 或 localhost 的 JSON 请求;它不会为浏览器页面提供网络服务。VibeClaude 不包含遥测功能。
切换设备、结束会话、断开连接、失去 Intiface 连接或守护进程退出时,输出都会自动停止。如果设备与 Intiface 断开连接,它会被取消选择;使用 /intiface 重新连接。暂时消失的设备在重新出现后可以再次选择。
结论
VibeClaude 通过本地 Node.js 守护进程将 Claude Code 钩子连接到 Intiface Central,把编码事件转化为可配置的设备反馈。安装插件和依赖项,启动 Intiface Central,使用 /intiface 选择设备,并通过 /intiface-intensity 调整体验。进行故障排查和开发时,可使用 shell 守护进程命令、调试日志以及随附的模拟服务器。
本项目依据 MIT 许可证 授权。但 Buttplug 和 Intiface 是 Nonpolynomial Labs, LLC 的商标。
