Skip to content

v0.0.35

Choose a tag to compare

@github-actions github-actions released this 08 Oct 10:36
· 325 commits to main since this release

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

修法(三处同源,缺一处仍会复发):

  1. 安装脚本:装前清掉孤儿元数据(否则 pip 空转)+ 装完复核包目录,不在就抛错
    (不再只信 pip 的退出码)。
  2. 主进程:新增元数据目录的单一真相源 pipMetadataDirs。
  3. 卸载 + 安装复核:卸载 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 解析(Windows Lib/site-packages,
    mac lib/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 会拦)

  1. 右键点 App → 选「打开」(不要双击);
  2. 或在终端执行: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)。它不影响判定
    (判定只看包目录),只是一个失效的入口文件。