VibeKarma 是一个用 Tauri 2、React 19 和 Rust 构建的 Codex 桌面伴侣。它覆盖在真实 Codex 桌面窗口上,把“惩罚一下”和“奖励一下”做成可操作的互动反馈,并让本机 Codex CLI 将这次反馈写成第一人称反省日记。
桌面窗口识别与互动覆盖层支持 Windows 和 macOS;两个系统使用各自的原生窗口 API,互不影响。
前往 GitHub Releases 下载最新版本。
- Windows 普通用户:下载
VibeKarma_*_x64-setup.exe - Windows 企业部署:下载
VibeKarma_*_x64_en-US.msi - Apple Silicon Mac:下载
VibeKarma_*_aarch64.dmg - Intel Mac:下载
VibeKarma_*_x64.dmg(滑到最底下的Assets展开)
当前版本为预发布版本,安装包尚未进行代码签名。Windows SmartScreen 或 macOS Gatekeeper 可能显示安全提醒。推荐在本机独立安装并登录 Codex CLI;未找到外部 CLI 时,VibeKarma 会尝试使用 Codex 桌面客户端内部 CLI 作为备用。
- 自动识别当前可见的 Codex 桌面窗口,并在窗口范围内打开透明覆盖层。
- 鞭子会跟随鼠标按物理链条摆动;高速甩动时产生抽击、声音、震动和鞭痕反馈。
- 触发阈值经过降低,普通鼠标甩动也比较容易打出有效抽击。
- 一次覆盖层内可以连续抽击,但最终只记录一次惩罚。
- 单击放手并结束,
Esc或鼠标右键撤回本次惩罚。
- 按钮文案为“奖励一下 / 画个大饼,现场兑现”。
- 悬停时,笔会沿着饼的轮廓完成绘制动效。
- 进入覆盖层后按住鼠标画饼,松手时校验轨迹;有效轨迹会现场变成一张真正的大饼。
- 轨迹太短或范围太小时不会提交,可以直接重画;
Esc或鼠标右键退出。
- 每次有效奖励或惩罚都会静默记录一次反馈,并异步启动独立的 Codex CLI 日记进程。
- CLI 按“手动指定 → 外部独立 CLI(推荐)→ 桌面客户端内部 CLI(备用)”的顺序自动查找。
- 控制栏设置按钮可以切换自动检测,或手动选择 Codex CLI 文件。
- 找不到或无法运行 CLI 时,错误窗口会提供一段可直接复制给 Codex 的安装求助提示。
- 当前只有“奖励日记”和“挨打日记”,没有自动生成的“收工日记”。
- 日记参考当前 Codex 窗口的近期内容,以及最近三篇日记,用来保持角色和旧梗的连续性。
- 原因输入是可选的;留空时 Codex 根据窗口上下文判断,不再传递冗余的“用户补充”字段。
- 标题最多 20 个字符;正文不限制固定字数或段数。
- 日记正文按实际渲染尺寸自动分页,当前页放不下的内容会原样续到下一页,不会压缩、截断或覆盖页脚。
- 日记本支持拖动翻页,并使用独立的前封面与后封面插画。
点击奖惩按钮
→ 检查并定位真实 Codex 桌面窗口
→ 在目标窗口上显示透明互动层
→ 用户完成抽鞭子或画大饼
→ 静默记录一次反馈
→ 独立 Codex CLI 进程生成日记
→ 写入本地 SQLite
→ 日记本收到事件并显示新日记
奖惩反馈不会注入、打断或改写当前 Codex 任务。Rust 后端只读取可见窗口的近期文本作为日记素材,日记生成与正在工作的 Codex 会话彼此独立。
src/:React 界面、透明覆盖层、奖惩动效和日记本分页。src/components/WhipPhysics.tsx:鼠标驱动的鞭子物理与命中判断。src/components/DrawPieIcon.tsx:奖励按钮的画饼动效。src/components/DiaryBook.tsx:封面、翻页和基于 DOM 测量的正文分页。src-tauri/src/codex_window.rs:跨平台窗口识别入口、覆盖层定位和窗口模式。src-tauri/src/codex_window/macos.rs:使用 macOS Core Graphics 识别并跟随 Codex 窗口。src-tauri/src/codex.rs:反馈队列、日记提示词和独立 Codex CLI 调用。src-tauri/src/codex/resolver.rs:统一的 CLI 优先级、状态和错误提示。src-tauri/src/codex/windows.rs:Windows 外部 CLI 与桌面客户端备用 CLI 发现。src-tauri/src/codex/macos.rs:macOS 外部 CLI 与应用 Bundle 备用 CLI 发现。src-tauri/src/storage.rs:设置、事件日志和 SQLite 日记存储。
主控制器默认为 580 × 400,打开日记本时切换为 1000 × 700。透明覆盖窗口只在奖惩互动期间显示。
- Windows 10/11,或运行在 Intel / Apple Silicon 上的 macOS。
- Node.js 22 或更高版本。
- pnpm 10。
- Rust stable 工具链。
- Windows 开发需要 Visual C++ Build Tools、Windows SDK 和 WebView2 Runtime;macOS 开发需要 Xcode Command Line Tools。
- 推荐安装并登录可正常运行的外部 Codex CLI;桌面客户端内部 CLI 仅作为兼容性备用。
- 已打开且可见的 Codex 桌面客户端窗口。
VibeKarma 不保存 OpenAI API Key。日记进程继承本机 Codex CLI 已有的登录、Provider 和 CODEX_HOME 配置;应用设置可以手动指定 Codex 可执行文件,本地 settings.json 仍可配置独立 CODEX_HOME 或额外环境变量。
Windows 和 macOS 使用相同优先级:
用户手动指定的 CLI
→ 外部独立安装的 CLI(推荐)
→ Codex 桌面客户端内部 CLI(兼容性备用)
→ 显示包含安装求助提示的错误信息
外部 CLI 是公开、稳定的调用入口。桌面客户端内部文件可能随客户端更新改变,因此只用于兜底。VibeKarma 不会复制、打包或重新分发任何 Codex 二进制文件。
自动检测会用短超时的 codex --version 检查候选 CLI;损坏的外部 CLI 会被自动跳过,再尝试其他外部安装或桌面客户端内部 CLI。旧设置中的 codex、codex.cmd 等命令名仍会从系统 PATH 解析,无需用户重新选择文件。
Windows 商店版桌面客户端位于系统管理的 WindowsApps 目录,其内部 CLI 可能不允许其他应用直接启动。VibeKarma 会把这种情况识别为“检测到但不可用”,并引导安装外部 CLI;请勿通过取得目录所有权或修改系统 ACL 来绕过限制。
pnpm install
pnpm run tauri dev如果 1420 端口已被旧的 Vite 进程占用,需要先关闭旧开发进程,再重新运行上述命令。
构建和测试:
pnpm test
pnpm build
cargo test --manifest-path src-tauri/Cargo.toml只运行已构建的前端与 Tauri 后端:
pnpm build
cargo run --manifest-path src-tauri/Cargo.toml --features tauri/custom-protocol有 D 盘时,应用默认使用 D:\VibeKarmaData;否则回退到系统应用数据目录。可以通过 VIBEKARMA_DATA_DIR 覆盖数据位置。
settings.json
events/YYYY-MM-DD.jsonl
vibekarma.sqlite3
旧版本的 diaries/index.json 会在首次启动时导入 SQLite,原文件不会被删除。
日记进程使用临时会话、read-only 沙箱和 never 审批策略。它的工作目录是 VibeKarma 数据目录,不会修改用户项目。
推送 v* 标签会触发 GitHub Actions,创建草稿 Release,并构建四种安装包:Windows x64 NSIS、Windows x64 MSI、macOS Intel DMG 和 macOS Apple Silicon DMG。Windows 与 macOS 都会识别并跟随各自平台上的 Codex 桌面窗口。
git tag v0.1.1
git push origin v0.1.1未配置代码签名时,Windows SmartScreen 和 macOS Gatekeeper 可能提示应用未签名。签名证书、SSH 私钥、API Key 和本地认证文件都不应提交到仓库。
- React 前端不能直接执行任意系统命令。
- 奖惩交互只覆盖已经识别到的可见 Codex 窗口。
- 当前反馈流程不会模拟键盘输入,也不会写入系统剪贴板或当前 Codex 任务。
- Codex 登录信息由本机 Codex CLI 管理,VibeKarma 不复制凭据。
- 日记生成失败时记录本地错误,不会伪造一篇成功生成的日记。
output/、tmp/、日志、数据库、本地配置和badclaude/参考项目均不进入版本库。
更完整的安全说明见 SECURITY.md。
Copyright 2026 LiRuiZhe. See NOTICE for attribution information.
Bundled font assets remain under the SIL Open Font License 1.1; their license
texts are included in src/assets/fonts/.