eliBenven/freemicro

GitHub: eliBenven/freemicro

让 OpenAI Codex Micro 宏键盘脱离 ChatGPT 桌面应用、直接接入 Claude Code 生命周期的驱动工具,通过 LED 灯效和按键映射实现对多个并行 AI 编程项目的物理状态感知与快速切换。

Stars: 1 | Forks: 0

# ⌨️💡 FreeMicro ### 你的 **Codex Micro** 会显示你的哪些 **Claude Code** 项目需要你,按下按键即可跳转过去。 六个 Agent Key,对应六个代码仓库,每个按键各司其职。当项目的 agent 正在思考时按键会显示蓝色,当需要你介入时显示琥珀色,完成时显示绿色。按下亮起的按键,其对应的终端就会置于最前。 [![许可证: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/) [![零依赖](https://img.shields.io/badge/core-zero%20deps-brightgreen.svg)](pyproject.toml) [![欢迎 PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) [![按键 + LED:硬件已验证](https://img.shields.io/badge/keys%20%2B%20LEDs-verified%20on%20hardware-brightgreen.svg)](docs/PROTOCOL.md) [![USB + Bluetooth](https://img.shields.io/badge/USB%20%2B%20Bluetooth-both%20verified-brightgreen.svg)](docs/PROTOCOL.md) [![平台:macOS](https://img.shields.io/badge/pad%20support-macOS-lightgrey.svg)](#honest-status) ``` ○ idle ◍ working… ◐ needs you ● done ✖ error #FFFFFF #304FFE #FF6D00 #00FF4C #FF0033 ```
## 日常使用效果 三个项目同时开启,只需一个控制板。这是 slot resolver(槽位解析器)产生的真实运行记录,而非简单示意图: | 时刻 | AG00 | AG01 | AG02 | |---|---|---|---| | 开始处理 `api` | `api` 蓝色 | 暗色 | 暗色 | | 打开 `web` 并开始任务 | `api` 蓝色 | `web` 蓝色 | 暗色 | | 打开 `docs` | `api` 蓝色 | `web` 蓝色 | `docs` 蓝色 | | `api` 请求权限 | **`api` 琥珀色** | `web` 蓝色 | `docs` 蓝色 | | 你按下 AG00 | *api 的终端标签页置于最前* | | | | `web` 完成 | `api` 琥珀色 | **`web` 绿色** | `docs` 蓝色 | | 3 分钟后,未读的绿色淡化 | `api` 琥珀色 | `web` 白色 | `docs` 蓝色 | | 你关闭了 `docs` 的终端 | `api` 琥珀色 | `web` 白色 | 暗色 | **按键位置永远不会变动。** `api` 是你最先接触的项目,所以它在一整天里都会占据 `AG00` 的位置,不管围绕它的活动顺序如何变动。这块控制板会逐渐形成你的肌肉记忆,不亮的按键意味着“此处无项目”,而不是“变暗了”,因此亮起的按键数量就是正在运行的项目数量,无需阅读任何文字即可一目了然。 按键绑定的是**项目目录**,而不是 session id。目录可以经受住 `/clear`、崩溃的标签页、系统重启和合上屏幕;而 session UUID 做不到这一点。毕竟,一块需要你反复重新配置的控制板,还不如没有控制板。 **完整设计说明(包括槽位稳定性规则和确切的颜色定义):[`docs/AGENT-KEYS.md`](docs/AGENT-KEYS.md)。** ## 开发初衷 OpenAI 的 **Codex Micro** 拥有六个华丽的顶部 **Agent Keys**,它们会根据你 agent 的实时状态发出光芒。但有一个痛点:**这种灯光效果是由 ChatGPT 桌面应用推送的,而且仅限 Codex 使用。** 如果你在终端中使用 Claude Code,这些按键就会黯淡无光。更糟糕的是,这块控制板的按键根本不会发出普通的扫描码,所以如果没有那个应用,它们甚至连打字都不行。对于其他任何 agent 来说,它开箱即是一个昂贵的镇纸。 FreeMicro 重新接管了这块控制板。它直接使用设备原生的供应商协议进行通信,因此能够**读取每一次按键**并**控制每一个 LED**,并直接接入 Claude Code 真实的生命周期 hooks,全程无需任何供应商应用介入。 该协议已详细记录在 **[`docs/PROTOCOL.md`](docs/PROTOCOL.md)** 中,据我们所知,这是目前互联网上对该协议的首份公开文档。 ## 快速开始 只需两条命令。第二条命令在进行任何更改前都会先询问你,并明确告诉你该怎么操作。 ``` pipx install git+https://github.com/eliBenven/freemicro # not on PyPI yet freemicro start ``` `freemicro start` 会按顺序引导完成整个设置过程:它会检查所有 macOS 权限,并主动为你打开对应的“系统设置”面板;接着寻找你的控制板(支持 USB 或 Bluetooth);如果你电脑上的 ChatGPT 应用正在争抢同一个 LED 的控制权,它会向你发出警告;然后写入你的配置,并询问是否驱动 LED(默认选择为**否**);接着提供安装 Claude Code hooks 的选项,并通过触发一个模拟的 session 来**验证它们是否正常工作**;之后提供安装后台守护进程的选项;最后通过让控制板遍历亮起每一种状态色来结束流程,让你直观看到效果。当你发现配置出现偏差时,随时都可以安全地重新运行它。此外,每个提示都有默认选项,因此在脚本中使用 `freemicro start --yes` 也是完全可行的。 然后在第一天,有两件事值得了解: ``` freemicro config --web # the visual editor: click a key on a picture of your pad freemicro menubar # a status item that tells you when FreeMicro has stopped working freemicro lights --enable # let FreeMicro drive the LEDs (off until you say so) ``` **请使用 `pipx`。** 它会将 FreeMicro 放入其专属的 virtualenv 中,并将可执行文件置于你的 `PATH` 路径下,这正是 Claude Code hooks 和后台守护进程所必需的;而且它会安装在 `~/.local` 目录下,而不是 macOS 禁止后台进程读取的某些位置。使用 `pip install --user` 也可以。如果你还没有安装 `pipx`,请运行:`brew install pipx && pipx ensurepath`。
更倾向于通过 clone 安装(用于贡献代码或阅读源码)? ``` git clone https://github.com/eliBenven/freemicro cd freemicro python3 -m venv .venv ./.venv/bin/python -m pip install --upgrade pip # editable installs need pip >= 21.3 ./.venv/bin/python -m pip install -e . export PATH="$PWD/.venv/bin:$PATH" # add to ~/.zshrc to make it stick freemicro --version ```
想完全手动操作?`start` 执行的每一个步骤都有对应的独立命令: ``` freemicro doctor # every permission, the pad, and a real round-trip write freemicro install # wire FreeMicro into Claude Code's hooks freemicro selftest # prove the hook → state → LED loop, no agent needed freemicro run # keys in, agent state out. No flags needed. ``` `freemicro run` 无需任何 flag 且绝不会崩溃:它可以在控制板插入前就启动,当控制板断开连接时能自动重连,并且会在状态发生变化时实时将每一次改动打印到终端中,这样你甚至可以在拔下控制板的情况下观察整个循环的运行状态。 ## 可视化编辑器 ``` freemicro config --web ``` 这是一个用于绘制你控制板布局的本地网页。点击你想修改的按键,用自然的结果描述(而不是 FreeMicro 的专业术语)来说明你希望它执行的动作,并选择实际安装的键帽样式。如果控制板已连接,当你拖动颜色滑块时,所选的颜色会直接显示在**硬件**上。 仅使用标准库:没有 Electron,没有 npm,没有构建步骤,也不会留下任何后台进程。它通过每次运行生成的独立 token 授权,在随机端口上绑定 `127.0.0.1`,并拒绝绑定其他任何地址。**[`docs/WEB-UI.md`](docs/WEB-UI.md)** ## 菜单栏项 ``` freemicro menubar ``` 控制板本身是提供环境感知的,因此用来反馈其状态的工具同样是隐形的:位于角落的状态项,它会显示当前解析出的状态、传输方式、电池电量、哪个进程正在占用控制板;并且只有在出现异常时,才会显示一个可点击的行,引导你直接进行修复。 这个界面能明确告诉你 FreeMicro 已经**停止**工作。被撤销的权限、死掉的守护进程或彻底掉线的控制板,在一块暗淡的控制板上看起来的状态都和“没有需要你处理的任务”一模一样;而如果你不再信任某个状态显示,你早晚会把它卸载掉。**[`docs/MENUBAR.md`](docs/MENUBAR.md)** ## 从此告别保持终端开启 由于控制板的按键不会发出普通的扫描码,当没有程序监听时,硬件就是**死**的:既不能打字也不会亮起。在终端中运行 `freemicro run` 只能在终端存活期间解决问题。而安装守护进程则能永久解决它: ``` freemicro daemon install # a LaunchAgent: starts at login, restarts if it dies freemicro daemon status # is it alive, what's its pid, who holds the pad freemicro daemon logs # the last 50 lines it printed freemicro daemon uninstall # stops it and removes the plist, completely ``` 只有一个进程能有效地占用此设备,因此如果守护进程正在运行,而你也运行了 `freemicro run`,FreeMicro 会直接告诉你谁正在使用控制板,而不是去争抢控制权。 ## 开启 LED 灯光(选择开启,只需一条命令) ``` freemicro lights --enable # and --disable to hand the pad back ``` FreeMicro 在首次启动时**不会**强行接管你的控制板 LED。因为 macOS 是共享该设备的,如果 ChatGPT 应用也在运行,两个程序会同时重绘相同的灯光,导致你根本无法分辨是哪个程序出了问题。一旦你选择开启,按键就会在 Claude Code 工作时变为蓝色,需要你介入时变为琥珀色,完成时变为绿色,并且使用的是**原厂标准的精确颜色**,让你觉得它就像你刚买回来时一样。 不想退出 ChatGPT 应用?使用 `freemicro lights --coexist` 可以只驱动按键背光,这是 ChatGPT 应用唯一不会干预的灯光区域。 ## 无论有线还是无线,都能完美运行 控制板内置电池,并且**所有功能在无束缚状态下都能工作**:按键、旋钮、摇杆、LED 和 RPC 通道在 Bluetooth 和 USB 模式下均已全面通过验证。`freemicro doctor` 会打印出你当前使用的连接方式,以及电池电量和充电状态。唯一的区别在于内部机制(不同传输方式下的数据写入帧格式有所不同),而 FreeMicro 会自动为你处理这一切。 ## 两项 macOS 权限(均为必需) macOS 将 FreeMicro 所需的两项核心功能限制在两个不同的设置区域中。请务必为**你运行 `freemicro` 的终端应用**(Terminal、iTerm2、Ghostty、VS Code 等)授权这两项权限,然后**重启该应用**:macOS 只在应用启动时才会重新读取权限授予状态。 | 权限 | FreeMicro 需要它的原因 | 位置 | |---|---|---| | **Input Monitoring(输入监控)** | 用于*读取*控制板。它的按键输入依赖于供应商的 HID 通道,而打开任何同时暴露键盘集合的 HID 设备都需要此权限。没有此权限,控制板根本无法被打开,同时由于 LED 控制也走相同的通道,因此点亮灯光同样需要它。 | 系统设置 → 隐私与安全性 → **Input Monitoring(输入监控)** | | **Accessibility(辅助功能)** | 用于为你*输入*内容。按键绑定最终会作为合成击键指令发送给最前方的应用。如果没有此权限,macOS 会**静默**丢弃这些指令。 | 系统设置 → 隐私与安全性 → **Accessibility(辅助功能)** | 如果你遗漏了其中一项,可能会遇到以下症状: * *“找到了 Codex Micro 但无法打开”* → 缺少 Input Monitoring 权限。 * 按键日志显示 `FAILED: … not allowed …` 且无法输入任何内容 → 缺少 Accessibility 权限。 * 看起来一切正常但什么也没发生 → 你授予了权限,但没有重启终端。 ## 打造你的专属体验 `freemicro config --web` 是最简单的配置方式。它写入的所有内容都保存在一个完全属于你的单一 JSON 文件中,因此你也可以直接对其进行编辑: ``` freemicro config --edit # creates it if needed, opens it in $EDITOR freemicro keys --list # confirm what FreeMicro resolved ``` ``` "bindings": { "AG00": { "action": "focus_session" }, "ACT09": { "action": "key", "key": "escape" }, "ACT10": { "action": "hold", "key": "ctrl+option+cmd+d" }, "ACT12": { "action": "app", "name": "Ghostty", "cycle": true }, "AG05": { "action": "none" } }, "lighting": { "enabled": true, "zones": ["agent_keys"], "states": { "waiting": { "color": "#FF6D00", "effect": "solid" } } } ``` 内置了八种动作类型:**输入文本**(可选附带 Return)、**按下按键**、在按住控制板按键期间**保持按下某个键**、**运行 shell 命令**、**运行 AppleScript**、**聚焦/切换应用**、**移动或点击鼠标**,以及**空操作(no-op)**。添加第九种动作只需实现一个带装饰器的函数。颜色设置支持 `#RRGGBB`、`[r,g,b]` 或整数格式;灯光效果包括 `off / solid / snake / rainbow / breath / gradient / shallow-breath`。 每一个输入按键都可以进行绑定:`AG00`-`AG05`,`ACT06`-`ACT12`,旋钮(`ENC_CLK` 按下,`ENC_CW` / `ENC_CC` 旋转)以及四个摇杆拨动动作。不知道哪个物理按键对应哪个 id?运行 `freemicro keys --dry-run` 然后按下该按键即可查看。 摇杆默认处于 `"mode": "pointer"` 模式:这是一个模拟光标,类似于 ThinkPad 的 TrackPoint。你推摇杆的幅度决定了光标的*速度*,只要持续推住,光标就会持续移动。你可以将其设置为 `"mode": "directions"`,从而恢复使用那四个可绑定的拨动动作。 **完整参考文档:[`docs/CUSTOMIZING.md`](docs/CUSTOMIZING.md)。** 包含每种动作类型、每个按键名称、摇杆调校、LED 区域以及搜索路径。 ### 麦克风键与你的听写应用 麦克风键默认处于未绑定状态,这是有意为之:为你并不拥有的应用猜测一个快捷键,结果只会是按键毫无反应。请在 `freemicro config --web` 中(或在运行 `freemicro start` 时)选择你的听写应用,FreeMicro 会自动写入匹配的快捷键。记得在应用本身中也分配**相同**的快捷键。 对于切换类应用,使用 `{"action": "key"}` 即可;如果你想要真正的按下并保持效果,请使用 `{"action": "hold", "": "…"}`,因为控制板会同时上报按下和释放动作,所以 FreeMicro 能够精准地在你按住期间保持目标按键处于按下状态。 ## 命令 | 命令 | 功能描述 | |---|---| | `freemicro start` | **从这里开始。** 引导式设置:涵盖两项权限、控制板、配置、hooks、守护进程,每一项都会经过检测、解释和验证。操作具备幂等性;在脚本中可使用 `--yes`。 | | `freemicro run` | 日常运行命令。负责捕获按键输入、输出 agent 状态灯光,作为单一进程运行,并在控制板断开时自动重连。 | | `freemicro config --web` | 可视化编辑器。通过点击控制板示意图上的按键进行配置。 | | `freemicro menubar` | 状态项:显示状态、传输方式、电池电量及异常信息。 | | `freemicro doctor` | 预检诊断。检查两项权限、hooks 是否已安装且*依然指向当前二进制文件*、守护进程、传输方式、电池电量、ChatGPT 应用是否存在冲突,并执行真实的往返写入测试。**遇到任何问题都请从这里开始排查。** | | `freemicro selftest` | 在没有 agent 运行的情况下证明整个循环是否正常:通过你 Claude 设置中的真实命令触发一个合成 session,并检查每种状态下的状态值*和* LED 消息。支持在 CI 中使用 `--json`。 | | `freemicro daemon` | 用于管理 LaunchAgent(确保 FreeMicro 在登录时自动后台运行)的 `install` / `uninstall` / `status` / `logs` 命令。 | | `freemicro lights` | LED 控制。使用 `--enable` / `--disable` 选择开启或关闭;使用 `--coexist`、`--cycle`、`--color`、`--effect` 进行实验。 | | `freemicro keys` | 仅涉及按键桥接功能。支持 `--list`、`--init`、`--dry-run`、`--config`。 | | `freemicro config` | 显示配置文件路径及当前生效内容,使用 `--edit` 打开并编辑。 | | `freemicro install` | 将 FreeMicro 的 hooks 添加到 Claude Code 的设置中(幂等,支持自修复,使用 `--uninstall` 移除)。除非传入 `--no-verify`,否则之后会自动运行 `selftest`。 | | `freemicro uninstall` | 执行另一方向的彻底卸载:停止运行中的进程,熄灭控制板灯光,移除 hooks、LaunchAgent 以及 `~/.freemicro` 目录。执行前会显示列表并询问。支持 `--dry-run`、`--yes`、`--keep-config`。 | | `freemicro status` | 显示每个活跃 session 所处的状态,以及是否有进程正在驱动控制板。 | | `freemicro detect` | 只读的 HID 探测;输出的 `--json` 结果可作为能力数据库的输入。 | | `freemicro demo` | 无需 agent 和硬件即可遍历演示所有状态。 | 此外还存在 `freemicro emit`、`render` 和 `renderers` 命令,主要用于在开发时调试状态引擎。运行 `freemicro --help` 可查看所有可用命令。 ## 工作原理 ``` flowchart LR A[Claude Code
lifecycle hooks] -->|stdin JSON| B[State Engine
one state per project] B -->|idle / working / waiting / done / error| C[micro-leds] C -->|v.oai.thstatus| P[Codex Micro
vendor HID 0xFF00] P -->|key + joystick events| K[Input Bridge] K -->|your keymap| T[Frontmost app] ``` 控制板本身就**是**显示屏。FreeMicro 没有第二块显示 surface,没有备用灯光,也没有屏幕上的 chip 组件:如果控制板未连接,`freemicro run` 只会将每次状态变化打印到你的终端,仅此而已。这是有意删减的功能,并非遗漏。详情请参阅 [`SPEC.md`](SPEC.md) §5.3。 ## 真实状态 **已在实体零售版设备上验证**(VID `0x303A` / PID `0x8360`,固件版本 v0.4.1,2026-07-23): * ✅ **读取所有输入。** 包含六个 Agent Keys、七个动作按键、旋钮(按压*及*旋转)以及摇杆,均通过控制板的 `0xFF00` 供应商 HID 通道完成。 * ✅ **驱动 LED。** 通过 `v.oai.thstatus` 单独控制六个 Agent Keys,并通过 `v.oai.rgbcfg` 控制底光和背光。已通过肉眼确认。 * ✅ **双重传输模式。** 输入、灯光和 RPC 均已在未连接线缆的情况下,通过 **USB 和 Bluetooth** 完成验证。 * ✅ **在硬件上跑通完整的“hook → 状态 → 灯光”循环。** 真实的 Claude Code hook JSON 输入至 stdin → 进入状态存储 → 传递给 `freemicro run` → 控制 Agent Keys 按顺序展示全部五种状态颜色(全程通过 Bluetooth 进行)。`freemicro selftest` 可以按需重新执行上述所有环节,唯一的例外是它不会直接点亮你的控制板 LED(而是断言校验确切的协议消息)。 **尚未实现/待定项:** 悬而未决的协议问题(`v.oai.rgbcfg` 与 `lights.preview` 的对比、`magic` 字段、编码器 `act` 值)已在它们应在的位置被详细记录,见 [`docs/PROTOCOL.md`](docs/PROTOCOL.md)。 FreeMicro 是基于**我们自有硬件上观察到的设备行为**进行的独立重新实现,并进行了互操作性相关的文档化记录。本文档/项目中未复制或引入任何供应商源代码。 ## FreeMicro 横向对比 | | **FreeMicro** | OpenMicro | VibeSignal | codex-micro.com | |---|---|---|---|---| | 驱动 **真实 Codex Micro 的** LED | ✅ 已验证 | ❌ 仅限游戏手柄 | ❌ | ✅(克隆板) | | 读取 **真实 Codex Micro 的** 按键 | ✅ 已验证 | ❌ | ❌ | ✅(克隆板) | | **一个按键对应一个项目**,并显示该项目自身状态灯 | ✅ | ❌ | ❌ | ❌ | | 按下亮起的按键跳转至对应终端 | ✅ | ❌ | ❌ | ❌ | | 支持 **Claude Code** | ✅ | ✅ | ✅ | ✅ | | **开源** | ✅ MIT | ✅ MIT | ✅ | ❌ 付费 | | 完全支持用户重定义按键及 LED 映射 | ✅ 可视化编辑器 + 单一 JSON 文件 | 部分 | ❌ | 部分 | | 支持 Bluetooth 连接 | ✅ 已验证 | - | - | ? | | 在你明确要求前不对控制板进行任何操作 | ✅ 手动选择开启 LED | ❌ | n/a | ❌ | | 公开通信协议文档 | ✅ [`docs/PROTOCOL.md`](docs/PROTOCOL.md) | ❌ | ❌ | ❌ | ## 故障排除 **请先运行 `freemicro doctor`。** 它能检测出程序层面可检查的一切问题,包含一次真实的往返写入测试。如果是*灯光*出现问题,`freemicro selftest` 能提供更具体的诊断:它会通过真实的 hook 命令模拟推送整个 session,并告诉你哪一个环节断开了。 | 症状 | 修复方法 | |---|---| | **Claude 运行时 LED 毫无变化** | 运行 `freemicro selftest`。十有八九是因为 hooks 根本没安装,或者指向了一个已经移动过的 virtualenv。运行 `freemicro install` 即可修复这两点。 | | `hooks registered on every lifecycle event: FAIL` | 运行 `freemicro install`,然后**重启 Claude Code**:它仅在启动时才会读取 `settings.json`。 | | 已安装 hooks,依然没有反应 | 有程序在监听吗?在终端里运行 `freemicro run`,或者运行 `freemicro daemon install` 让其常驻后台。`freemicro status` 会显示状态引擎是否确实接收到了你的 session。 | | 守护进程无法启动 | 运行 `freemicro daemon logs`。如果出现 `PermissionError … pyvenv.cfg`,说明二进制文件位于 `~/Desktop`/`~/Documents`/`~/Downloads` 目录下,而 macOS 不允许后台 agent 读取这些路径:请使用 `pipx` 重新安装。如果控制板无法打开,说明守护进程需要获得属于自己的 Input Monitoring 权限(见上文)。 | | `Codex Micro not found` | 插入 USB 线或通过 Bluetooth 配对,两者皆可。`freemicro detect` 应当列出 `303a:8360`。 | | `could not open it` | 缺少 Input Monitoring 权限,授权后请**重启终端**。 | | 按键日志显示 `FAILED` | 缺少 Accessibility 权限,授权后请重启终端。 | | `… already has the pad` | 有其他程序正在占用设备,通常是守护进程。`freemicro daemon status` 会指出其名称;可以加上 `--take-pad` 强行接管,但这两者会发生冲突。 | | 按键输入到了错误的窗口 | 击键指令会发送给**最前方**的应用。请将焦点切回你的 Claude Code 终端。 | | LED 未发生变化 | 你是否运行了 `freemicro lights --enable`?如果 ChatGPT 应用处于打开状态,它会驱动相同的 LED;运行 `freemicro lights --coexist` 可避免两者发生冲突。 | | 旋钮毫无反应 | 请绑定 `ENC_CW` / `ENC_CC`,而不仅仅是 `ENC_CLK`。`--dry-run` 可以显示接收到的旋转动作。 | | 所有操作都显示“成功”却毫无动静 | 在此设备上,写入的返回码毫无意义。`freemicro doctor` 会执行唯一真实有效的测试:一次 `device.status` 往返验证。 | | 修改配置后毫无作用 | 运行 `freemicro config`,它会打印出最终实际生效的是哪个文件。 | | `command not found: freemicro` | 你跳过了安装步骤,或者 `.venv/bin` 未添加到 PATH 中。使用 `pipx install` 可以彻底避免此问题。你永远不需要设置 `PYTHONPATH`。 | | `freemicro watch` / `--no-screen` 提示已被移除 | 这是正常的。它们曾驱动的渲染器已被移除;`freemicro run` 会接管其任务,并将每一次状态变化打印在这里。 | | 本来一切正常,然后突然停止 | 某些设备会出现 USB 间歇性断连。重新插拔一下线缆;`freemicro run` 会报告控制板不存在,并在其重新连接前保持正常运行状态。 | ## 卸载 只需一条命令,它在进行任何更改前会先展示要删除的列表。 ``` freemicro uninstall --dry-run # exactly what would go, and nothing happens freemicro uninstall # the same list, then asks ``` 它将按顺序执行以下操作:停止守护进程及其他任何占用控制板的进程,并确认它们已停止;在相关的控制代码仍安装着时,**将控制板的 LED 恢复为熄灭状态**;移除 LaunchAgent;从 `~/.claude/settings.json` 中删除 FreeMicro 的 hook 条目,但保留你的所有其他 hooks 不受影响;最后删除 `~/.freemicro` 目录——这包含键位映射及其备份、引擎设置、保存的布局、session 状态、槽位分配、锁文件、守护进程日志以及原始 hook 日志。 | Flag 标志 | 功能 | |---|---| | `--dry-run` | 打印完整列表后终止操作,不做更改。 | | `--yes` | 跳过确认步骤,专为脚本设计。如果在无终端环境下且未提供此 flag,它会直接拒绝执行而不是乱猜。 | | `--keep-config` | 保留 `keymap.json`、`keymap.json.bak`、`config.json` 以及 `layouts/`,这样在你重新安装时就能完全延续之前的配置。其余所有内容仍将被删除。 | 它会按名称报告每一个步骤。如果某一项内容无法被移除——例如文件正在使用中或存在权限问题——它会明确指出是哪一项,同时坚持清理剩余内容,并以非零状态码退出。它绝不会打印不实的总结信息;无论你是运行两次,还是在一台根本没有安装过任何相关内容的机器上运行它,它都会成功执行并告诉你没有任何需要移除的内容。 **有两件事它做不到,并且会通过精确的路径提示告诉你:** * **macOS 权限授予。** Input Monitoring 和 Accessibility 属于 TCC 条目,你的机器上没有任何程序能代你撤销它们。请前往“系统设置” → “隐私与安全性” → 找到这两项,手动关闭 FreeMicro 的开关。 * **安装包本身。** `freemicro uninstall` 移除的是 FreeMicro 的*状态数据*,而不是 FreeMicro 本身。请使用你当初安装它时的对应方式来完成最后的清理: pipx uninstall freemicro 如果使用了 pipx(推荐) pip uninstall freemicro # 如果使用了 pip rm -rf /.venv # 如果是通过 clone 仓库运行 随后请重启 Claude Code,以让它停止调用已经不复存在的 hooks。 ## 许可证 [MIT](LICENSE)。*FreeMicro 是一个独立的开源项目。“Codex”、“Codex Micro”和“OpenAI”是 OpenAI 的商标;“Work Louder”和“Creator Micro”是 Work Louder 的商标。FreeMicro 与上述双方不存在任何附属或背书关系;文中涉及名称仅出于描述兼容性之目的进行指代使用。*