Repository navigation
v0.0.35
v0.0.35 发版说明
本版主题:让「安装」这件事的结果如实反映实际。上一版(v0.0.33)修的是「工具装不上」,
本版修的是更隐蔽的一类 ——「装上了/没装上,界面说的是另一回事」,以及 mac 侧同族缺口的补齐。
版本号说明:10-07 深夜曾发过 v0.1.0,随即按你的要求叫停撤销(CI 已取消、远端 tag 已删、
Release 从未创建),但 main 上的版本提交(2e21cfe)按当时决定保留 ⇒package.json一度停在
0.1.0而线上最新 release 是 v0.0.33。本版回到 0.0.x 线发 0.0.35,对真实用户是
从 0.0.33 的正常升级(0.0.34 未发布,版本号连续递增,应用内「检查更新」能正常收到)。
0.1.0 那次的要点已并入本版 —— 那两个提交的改动确实是随本版第一次到用户手上的。
一、修了什么
1. 「开发工具安装完不更新」—— 点多少次都一样(本版主问题)
现象:点「下载」→ 顶部绿条「开发工具安装成功,Codex 引擎已刷新」→ 卡片仍显示「下载」。
根因是三个口径各自为政(现场用 markitdown 取证):
| 环节 | 实际依据 |
|---|---|
卡片判定 runtimeInstalled |
site-packages 里的包目录 |
安装动作 pip install |
dist-info 元数据 |
卸载 runtimeUninstallTargets |
只删包目录(元数据留下) |
卸载过一次(或历史上任何一种「包目录没了、元数据还在」)就进入不可恢复状态:
python -c "import markitdown"→ModuleNotFoundError(真的没装)python -m pip show markitdown→ 说装着(读的是markitdown-0.1.8.dist-info)python -m pip install markitdown[…]→Requirement already satisfied且 exit 0(什么都不做)- ⇒ 安装脚本 exit 0 → 界面报「安装成功」→ 判定仍是「未安装」→ 点多少次都一样
- 实测现场:包目录 83 个文件全丢,只剩一个
dist-info
修法(三处同源,缺一处仍会复发):
- 安装脚本:装前清掉孤儿元数据(否则 pip 空转)+ 装完复核包目录,不在就抛错
(不再只信 pip 的退出码)。 - 主进程:新增元数据目录的单一真相源
pipMetadataDirs。 - 卸载 + 安装复核:卸载 pip 包时连元数据一起删;
runtime:install的三条真实安装路径
装完一律回读runtimeInstalled—— 从此「安装成功」必须与卡片同源。
第 3 条是整类拦网:任何「命令退出码 0 但东西没落地」的假成功,今后都会当场变成
「复核未通过 + 原因」,而不是演成「绿条 + 卡片未安装」的自相矛盾。
影响面:三个 pip 包(文档转换 markitdown、Laya、手机控制 phone-harness)共用这条链,
一次全修。
2. 引擎启动瞬时失败被当成「安装失败」(技能 / 插件 / 官方市场 / 专家市场)
现象:技能或插件装到一半报「重启 Codex 引擎失败:Codex app-server exited (1)」,
但文件其实已经装好了。
根因:引擎 0.157 起启动时要初始化 sqlite 状态库,偶发失败并直接 exit 1;
宿主侧两处把瞬时故障放大成用户可见故障 —— ① 重启时不等旧进程真正退出就拉起新进程
(两个进程在同一 codex-home 重叠,正是 sqlite 初始化失败的条件);② 自动重启被一个
「仍被占用、注定失败的启动 promise」挡回去,既不 spawn 也不报错(日志实测「引擎退出后 8 秒内
没有任何拉起」)。
修法:启动拆成「重试序列 + 单次拉起」,首次 + 2 次重试(退避 300/900 ms);重启改为
等旧进程真退出(3 秒兜底)再拉;重试期间不再把状态点打红;四条安装链(技能 / 插件 /
官方市场 / 专家市场)不再把「引擎重启失败」报成「安装失败」 —— 文件已落盘就如实说
「已安装,引擎稍后自动刷新」。
3. 市场页不再重复显示已装的项 + 卸载统一走确认框
技能 / 插件 / MCP 三个市场里已经装过的项不再混在可安装列表中,统一放到各自的
「已安装 / 已接入」分组里管理;卸载统一弹全局确认框。同时补掉了官方市场插件卸载的一个
幽灵残留:只调引擎卸载、不删落盘目录与 marketplace.json 条目,会让它在两处都失去入口
却仍占着磁盘。
4. 开发工具卸载 / 判定不同源(四个根因一起堵)
上一版遗留的「卸载了但仍显示已安装」在本版收口:卸载落点不再按 marker 首段推导(会删到多个
工具的共同家目录)、npm 类卸载遍历全部候选落位、包体路径不再多拼一层 node_modules、
分批删除失败如实报错而不是被吞成成功。
5. macOS:补齐「装没装」判定的 mac 半边
python的判定原先写成&& !IS_MAC⇒ darwin 上只查python/bin/python3一个文件,
而 Windows 侧 10-01 修掉的「有 exe 但没 pip 却显示已安装」在 mac 上原样存在
(mac 的ensurepip失败还被 try/catch 吞成 optional)。本版两平台共用「pip 模块必须在」
这条判据,路径经统一的 site-packages 解析(WindowsLib/site-packages,
maclib/pythonX.Y/site-packages,版本号不写死)。- 全套工具逐个核对(判定点 / 实际落盘 / PATH 三条线):mac 的 16 条平台 marker 与
install-runtimes.cjs的mainMac()安装面逐条对得上;未单列的 12 项都由专用分支覆盖
(npm 包双落位、pw-browsers/cloak-cache与两个下载环境变量同源、pip 的
lib/pythonX.Y、系统级安装、mac 隐藏项、随包插件)。augmentedPath()两平台清单已比对,无缺口。
6. 其它
- 开发工具下载可取消(杀进程树 + 清掉半截压缩包);卸载有分批进度,删除前二次确认。
- 开发工具页按用途重新分组(基础运行时 / 桌面与浏览器自动化 / 开发工具链 / 媒体与文档 /
本地智能 / 系统级安装)。 - 修复安装弹窗被困在滚动容器里、文件追踪遍历预算截断导致漏报/误报、mac 断点诊断落盘。
二、macOS 适配审计(发版清单第 0 步)
用 node scripts/mac-audit.mjs v0.0.33 扫 v0.0.33..HEAD 的新增行
(electron/ + src/ + scripts/ + build/,47 个文件、1543 行新增)。
| 模式 | 命中 | 判读 |
|---|---|---|
exe |
8 | 全部无害:6 条是 scripts/ 里的注释与断言夹具;1 条是 mac 平台常量(Windows 版 Miniconda 安装器 URL,与 mac 分支各自独立);1 条是 python.exe + _tkinter.pyd,它在 if (IS_MAC) return … 之后,只对 Windows 生效 |
win32 |
5 | 全部无害:taskkill 杀进程树在 process.platform === "win32" 门控内;npm 布局探测是 win32 ? [win, posix] : [posix, win] 的双向写法;其余两条是注释 |
darwin |
12 | 全部无害:本版新增的 mac 说明注释(含 python 判定那条)+ 既有断言夹具,无一处是「只判 win32 而漏了 darwin」 |
backslash |
5 | 全部无害:断言夹具与 Windows 侧 marker: "bin\\ffmpeg.exe"(mac 有独立的 ffmpeg/bin/ffmpeg 分支) |
powershell |
2 | 无害:开发工具页「开发工具链」分组的 id 列表文字,mingw 在 mac 是隐藏项 |
ctrl-key / winpath / appdata |
0 / 0 / 0 | — |
扫描器内置正则自证门禁(8 条正则的正/负人造样本都必须符合预期,否则直接失败退出)——
本版自证 8/8 通过,所以上面的 0 命中是「真的没有」,不是「正则写坏了」式的假通过。
判读结论:无 macOS 真缺口。 本版在 mac 上只有正向修复(python 判定补齐 + 上一批
工具安装/下载的 mac 修复随本版首次到用户手上)。
三、macOS 首次打开(安装包未签名,Gatekeeper 会拦)
- 右键点 App → 选「打开」(不要双击);
- 或在终端执行:
xattr -cr "/Applications/Codex Harness Desktop.app"。
Apple 芯片(M 系列)请下 …-arm64-mac.zip,Intel 请下 …-x64-mac.zip。
四、安装包
- Windows x64:
Codex.Harness.Desktop-0.0.35-win-x64.exe - macOS Apple 芯片:
Codex.Harness.Desktop-0.0.35-arm64-mac.zip - macOS Intel:
Codex.Harness.Desktop-0.0.35-x64-mac.zip
五、本版怎么验的
- 真机实证主问题:修复前 markitdown 的
import报ModuleNotFoundError、pip install只回
already satisfied;修复后同一命令输出Installing collected packages: markitdown→
Successfully installed,包目录回来、import通过。 - 逐个工具审计:28 个开发工具全部核对「判定 / 落盘 / 卸载点」,本版前只有 markitdown 一项
处于卡死态,其余 27 项口径一致(不是遍地开花,是一条链)。 - 类型与守卫:
tsc -b与tsc -p electron均 0 错;预检 20 项硬失败全为构建机环境类
(沙箱封锁子进程 / 缺 python 的tomllib),与改动无关(改动前后均为 20);
check-bag-types/check-dead-imports/check-require-paths全绿。 - 新增守卫【286】5 条钉住「元数据单一真相源 / 卸载连删 / 装前清残留 / 装完复核 / 三条安装路径
回读判定」,【241】随平台无关化更新,防同类复发。
六、已知遗留(本版未改,下一版处理)
- 「内置」工具损坏后没有应用内修复入口:卡片对
builtIn项只显示「内置」徽章、不给按钮,
而runtime:install对builtIn直接早退 ⇒ 如果某个随包工具坏了(例如 python 的 pip 目录被
删掉),界面会显示「未安装」但点不到任何修复动作。当前需手工执行
node scripts/install-runtimes.cjs <工具 id>恢复。Windows 与 mac 都有此问题(本版让 mac 的
python 判定变严后才更容易被看到)。修它要动可见交互,故单独排期。 - pip 包卸载后可能残留一个 console 脚本外壳(如
python/Scripts/markitdown.exe)。它不影响判定
(判定只看包目录),只是一个失效的入口文件。