Repository navigation
Releases: winglight9/headless-knight
Release list
无头骑士大师 1.3
这一版修的是「结束了却没结束」
点「结束外出模式」,设置没有恢复
真机反馈原话:
这个蓝牙恢复,好像我点了结束外出模式没恢复,要点了我知道了,才恢复。不知道是因为需要时间,还是真的点我知道了,才会开始恢复?
不是时间问题。旧版把「还原设置」挂在报告页那个按钮上,finishAwayNow 只负责读日志、出报告。于是点完「结束外出模式」,机器仍然停在蓝牙关着、pmset 被改过的状态;用户看完报告把窗口一关,就永远停在那儿了,而他还以为已经结束了。
现在点「结束外出模式」= 这一趟就结束了:统计、还原设置、出报告一口气做完。还原失败才需要人管——失败项写进这份报告,状态文件保留,首页出现「重试恢复」。
统计页那句提示也改成了「正在统计唤醒记录,并把设置恢复原样」。
报告页的「知道了」改成「完成」
用户点了结束,事情就该办完了,不需要再确认一次「我知道了」。
- 点「完成」,窗口直接关掉,跟别的 Mac 软件里的结果窗口一样。
- 不点也行:点屏幕别处窗口自动收起,同样算结束。下次点图标看到的是干净的首页,不是一份旧报告。
- 顺手删掉报告页那句「全程没有被打扰」——标题已经说了「这次很干净」。
测试
新增 finishAwayRestoresImmediately:跑完一趟外出、不点任何按钮,断言 pmset 和蓝牙已经回到原值、状态文件已清;再点「完成」,断言恢复动作次数一次都没增加。全套 203 个测试通过。
完整校验值
SHA-256 454673337e5e0feb6511f7d082ea9f099abc72db42f8329ecfc64cc53e940819 Knight.dmg
v1.2 · 不再倒计时,窗口不再消失
这一版全部来自真机反馈
没有新功能。改的是两件事:用起来吓人,和界面在关键时刻不该消失。
1. 检测页不再自己数 20 秒
旧版是个 20 秒倒计时,数完自动退出你列出来的那些程序。
一个会自己关掉你程序的界面,等多久都吓人——而且数着数,你还没看完清单就得做决定。
倒计时整个删掉了。现在只有一个动作:一键全部关闭。点了才动手,不点就一直在那儿等你。
2. 自动关闭时,鼠标不再卡
卡顿的根因是同步子进程跑在主线程上:
system_profiler读蓝牙状态 —— 0.5 到 2.5 秒pmset -g assertions加每个进程一次ps—— 几百毫秒- 后台服务的 Unix socket 往返 —— 最长等 8 秒
这些全在主线程。主线程一停,整个界面包括鼠标指针就跟着停。
现在全部挪到后台队列执行。并且加了一条回归测试:主线程每 20 毫秒打一次心跳,同时连跑两次最重的查询,断言中间最大空档小于 400 毫秒。旧的同步写法要 0.5–2.5 秒才回来,差一个数量级,这个阈值不会误报。
3. 窗口不会在关键时刻消失了
旧版窗口是 NSPopover,规则是「焦点一离开就收起来」。于是你看到的是:
点「一键关闭」→ 窗口没了 → 鼠标卡一下 → 再点图标才看见「可以拔掉显示器了」
换成不随失焦隐藏的浮动面板。扫描、检测、自动关闭、阻塞、可以拔线、外出中这几页被标成「必须一直看着」:失焦不收,被收走还会自己摆回来。流程中点菜单栏图标也不是「关掉窗口」了,只把它提到前面。
另外补了一个「正在自动关闭」页:逐条打勾,当前这一步转圈。以前那几秒是一个不动的窗口,你只能猜它是不是死了。
4. 左上角的黄点变成带字的标签
一个没有文字的彩色圆点,确实不知道是干嘛用的。现在是胶囊标签,直接写「在家」「准备中」「处理中」「可以拔线」「外出中」「需要处理」「统计中」「已回来」。
5. 检测页不再让你回来汇报
旧版选了「我自己关」之后,关完还要回来点「我关好了,继续」。
关没关掉,机器自己查得出来。现在检测页每 1.5 秒重扫一遍:你关掉一个程序,清单就少一行;全关干净了,自动往下走。一个按钮都不需要点。
6. 文案
- 检测页从四行 10pt 灰字砍到两行,字号提到 11–12pt。小字堆成一片等于没写。
- 所有界面文案去掉句末的「。」——那是文章的写法。
- 按钮上方加一句直白的提示:「手动关掉它们,或者点下面一键关闭」。
7. 修掉「点让电脑睡眠,屏幕反复黑屏亮屏」
这一条是 1.2 发布前几分钟才在真机上撞到的,一起并进这一版。
根因不是睡眠逻辑错了,是重试次数错了。 显示器还插着的时候,pmset sleepnow 的实际效果是:
屏幕黑一下 → WindowServer 立刻抓一个
PreventSystemSleep把系统拽回来 → 屏幕又亮
旧版固定重试 3 次,就是连闪三下,最后报一句「系统没有进入睡眠」——循环论证,你听完还是不知道为什么。
- 现在只在线真拔了的时候重试 3 次。显示器还插着时只试一次:成不成一次就看出来了,第二次只是再闪一下。
- 失败原因说人话:插着线时说「显示器还插着,系统刚睡下就被叫醒了。拔掉线之后它会自己睡」。
- 拔线页那句「会自动重试」在没拔线时是假话(后台看门狗压根不会重试),改成「拔掉线之后它会自己睡,不用再点」。
- 按钮从「现在就让电脑睡眠」改名「我已经拔线了,让它睡」。它本来就是「我拔了、你没发现」的兜底,旧名字会让人当成「我想现在睡」去点,而那一按注定只会闪一下。
顺带:跑测试不再往你的 app.log 里灌假记录(查这次闪屏时就被它带偏过)。
安装
- 下载
Knight.dmg,打开,把 Knight 拖进「应用程序」。 - 第一次打开如果提示「无法验证开发者」:右键点图标 →「打开」→ 再点「打开」。只需要做一次。
- 首次使用会要一次管理员授权(装一个最小的后台服务,用来改系统睡眠设置和关共享服务)。密码只在安装时输入一次。
校验
SHA-256 d676a32f08d7c15389943d0c432e52cf80176e27533fee1f39c3b9b59fe85114
其它
- 测试 198 → 201,全绿。
- 系统要求:macOS 13 或更高。
- 免费、开源、无广告、不联网。
完整改动见 CHANGELOG.md。
v1.1 · 第一个公开版本
第一个公开版本。
出门:锁定 pmset(sleep / womp / powernap / tcpkeepalive / disablesleep)、只关正在监听的共享服务、关蓝牙、暂停 Time Machine、退出挡睡眠的程序——每个程序会写清它挡的是什么(正在放音频 / 不许电脑空闲睡眠 / 只让屏幕不灭)和该怎么办,20 秒倒计时后自动退出,只挡屏幕的不动。
拔线:按显示器身份(ID 基线 + EDID)确认真的拔了才睡,插回来立刻取消。
回来:一键恢复原样,再从 pmset -g log 里读出这趟到底睡没睡、被什么唤醒、电池掉了多少。
强力模式:没结束外出、机器又连续醒着满 10 分钟,就发通知、倒计时 30 秒、强制再睡一次。
首次打开请 右键 →「打开」(ad-hoc 签名,未公证)。