tommybobb/crabdeck

GitHub: tommybobb/crabdeck

将 AKP03 系列 Stream Deck 的 LCD 按键转化为 Claude Code 用量信息的实时物理仪表盘。

Stars: 1 | Forks: 0

# crabdeck [![测试](https://github.com/yuin/goldmark/actions?query=workflow:test](https://static.pigsec.cn/wp-content/uploads/repos/cas/96/96516d7a51f21139fae950e3129296fedeb5ab5f68f6a4dd1d280445b5bfdb15.svg)](https://github.com/tommybobb/crabdeck/actions/workflows/test.yml) [![发布](https://img.shields.io/github/v/release/tommybobb/crabdeck)](https://github.com/tommybobb/crabdeck/releases) [![许可证](https://img.shields.io/github/license/tommybobb/crabdeck)](LICENSE) 将 Ajazz/Mirabox/Mars-Gaming AKP03 系列 stream deck 上的 LCD 按键转换为 Claude Code 使用情况的实时显示——包括 5 小时会话百分比、每周百分比、实时 会话数、运行中的 subagent 以及消耗速率 ETA。 ![crabdeck 显示全部 6 个磁贴:WEEK, 5HOUR, REFRESH, LIVE, AGENTS, BURN](https://static.pigsec.cn/wp-content/uploads/repos/cas/90/90ffc1c858679fe262fb892f1bc9ba47eeab8be5421a921b2d713cca8f6e3037.jpg) 该项目最初是一个单一设备的逆向工程计划(完整的协议分析请参阅 `docs/NOTES.md`),后来扩展到了下方的整个设备系列,因为它们在不同的 USB ID 下 共享同一套命令词汇表。 **仅限 Windows。** 使用 `ctypes.windll` 进行前台窗口检测并 使用 `.bat` 启动脚本;目前没有 Mac/Linux 移植版本 (欢迎提交 PR——HID 协议层本身,即 `deck.py`/`devices.py`,并不是 Windows 专属的)。 ## 环境要求 - Windows 10/11 - Python 3.9+ - 已安装 [Claude Code CLI](https://docs.claude.com/en/docs/claude-code) 并 配置在 `PATH` 中(crabdeck 会通过 shell 调用 `claude -p /usage`) - 下方列出的[支持的设备](#supported-devices)之一 ## 隐私 crabdeck 会读取 Claude Code 的本地会话文件(`~/.claude/sessions/*.json`) 和记录(`~/.claude/projects/**/*.jsonl`),以驱动 LIVE/AGENTS 磁贴。它仅提取会话状态和工具调用 ID——绝不包含消息 内容——且仅从你本人机器上已有的文件中读取。除了那一次 `claude -p /usage` 调用本身之外,不会向任何地方发送任何内容,该调用会与你 已配置的 Claude 账户进行通信,就像在正常会话中运行 `/usage` 一样。 ## 安装 ``` git clone https://github.com/tommybobb/crabdeck.git cd crabdeck pip install -r requirements.txt ``` 然后运行 `start.bat`。首次运行会自动检测你的设备并将其保存到 `config.json`;后续运行将直接使用该配置。如果插入了多个受支持的设备, 它会询问你选择哪一个。(如果你在此 文件夹中安装了 `.venv`,`start.bat` 会自动使用它;否则它将回退到 `PATH` 中的 `python`。) ## 支持的设备 9 个按键(6 个带有 LCD 显示屏)+ 3 个旋钮,60x60 JPEG 磁贴: | VID:PID | 名称 | 状态 | |---|---|---| | `0B00:1001` | Mars Gaming MSD-TWO | 已在硬件上验证 | | `0300:1001` | Ajazz AKP03 | 未测试 | | `0300:1002` | Ajazz AKP03E | 未测试 | | `0300:1003` | Ajazz AKP03R | 未测试 | | `0300:3002` | Ajazz AKP03E (rev. 2) | 未测试 | | `0300:3003` | Ajazz AKP03R (rev. 2) | 未测试 | | `6602:1002` | Mirabox N3 | 未测试 | | `6603:1002` | Mirabox N3CN (rev. 3) | 未测试 | | `6603:1003` | Mirabox N3EN | 未测试 | | `1500:3001` | Soomfon Stream Controller SE | 未测试 | | `5548:1001` | TreasLin N3 | 未测试 | | `0200:2000` | Redragon Skyrider SS-551 | 未测试 | “未测试”表示 USB ID 和协议版本来源于上游 (参见鸣谢),但尚无人使用此代码在该确切设备上进行过验证。 如果你拥有该设备并且它能够工作(或不能工作),请提交 issue/PR——我们有 专门针对此情况的 issue 模板。 **不支持**:18 键/0 旋钮的 AKP153 系列(例如 Mars Gaming MSD-ONE)—— 其几何结构和数据包布局完全不同,需要建立自己的设备 表。欢迎提交 PR。 ### 添加设备 如果你的 deck 未被列出,但共享了 `CRT`/`BAT`/`STP`/`CLE`/`LIG` 命令 词汇表,请在 `devices.py` 的 `DEVICES` 中添加一行: ``` (0xVVVV, 0xPPPP): ("Your Device Name", protocol_version, False), ``` 对于旧版固件(1024 字节数据包,无旋转),`protocol_version` 为 2; 对于较新的固件(1024 字节数据包,图像顺时针旋转 90°),则为 3——以 `0x3` 开头的 PID 通常是 pv3。在信任它之前,请运行 `tools/probe_input.py` 并确认打印出的输入代码与 `deck.INPUT_CODES` 匹配。 ## 独立使用协议层 `deck.py` + `devices.py` 不依赖于 Claude 用量相关的代码: ``` import deck dev = deck.open() # auto-detect/config/prompt, opens interface 0 dev.send_image(1, jpeg_bytes) # jpeg_bytes sized/rotated for dev.profile dev.clear_key(1) dev.close() ``` ## 开发 `tests/test_devices.py` 是唯一不需要硬件的测试(使用 `pytest`,或者 直接运行 `python tests/test_devices.py`)。`claude_state.py` 和 `usage.py` 在 `if __name__ == "__main__":` 下也有内置的自检功能。 `tools/` 包含手动硬件探测脚本(`probe_input.py`、`probe_size.py`、 `probe_orient.py`、`probe_clear_key.py`、`probe_clear_all.py`)——这些脚本会向 真实连接的设备写入数据,且不会被 CI 运行。 ## 更多细节 `docs/NOTES.md` 包含了完整的逆向工程日志:USB 捕获方法、 固件特性、供应商应用程序的场景切换行为,以及过程中犯过的错误。
标签:Claude Code, Python, 安全规则引擎, 无后门, 桌面外设, 状态监控, 硬件控制, 逆向工具