[Architecture]: Replace the PowerShell Windows release runtime with a native executable
背景 / Context
当前 Windows Release 虽然以 Setup.exe 交付,安装、托盘、启动、恢复和卸载控制层仍由隐藏的 Windows PowerShell 5.1 脚本执行。普通用户不需要打开终端,但发布版仍受 PowerShell 执行策略、Constrained Language、企业策略、脚本编码/参数转义和杀毒软件行为规则影响。
Issue #235 继续按现有架构做兼容性热修;本 issue 记录后续正式迁移,不扩大 #235 的修复范围。
The current Windows release is delivered as Setup.exe, but its install bootstrap, tray, launch, restore, and uninstall control plane still runs through hidden Windows PowerShell 5.1 scripts. This issue tracks replacing that release-time dependency with a compiled Windows executable.
目标 / Goal
交付编译后的 Windows 控制程序,例如 CodexDreamSkin.exe,让普通 Release 工作流不再启动或依赖 powershell.exe / pwsh.exe。
第一阶段保留当前内置 Node.js 和 injector.mjs,只替换 Windows 控制层,避免同时重写已经验证过的 CDP 注入核心。
范围 / Scope
- 原生托盘菜单、状态刷新、通知和文件选择器。
- Codex Store 包发现、清单/签名/路径校验和进程身份校验。
- 启动、重启确认、CDP 参数、端口选择、失败回滚和普通 Codex 重开。
- 安装初始化、运行时完整性校验、快捷方式、开机启动、升级和卸载清理。
- 主题切换、暂停/恢复、导入 ZIP、打开主题目录和 Studio/Gallery 入口。
- 兼容现有
%LOCALAPPDATA%\CodexDreamSkin状态、活动主题、已保存主题和配置备份。 - Inno Setup 改为只调用编译后的控制程序,不再调用
setup-bootstrap.ps1。 - 为核心 Windows API、状态迁移、进程控制和失败回滚增加自动化测试。
技术决策 / Technical decision
实现前先写一个简短 ADR,对 C#/.NET 与 Rust 做有证据的比较,至少覆盖:
- Windows 托盘、COM/Appx、进程和文件对话框 API 的成熟度;
- 是否需要自包含运行时、安装体积和冷启动;
- Windows 10/11 普通用户兼容性;
- 代码签名、自动更新和供应链维护成本;
- CI 可测试性和故障诊断能力。
ADR 确认后只保留一种生产实现,不长期维护两套启动器。
验收标准 / Acceptance criteria
- Release
Setup.exe的安装、首次启动、日常托盘、启动皮肤、恢复和卸载全过程均不创建powershell.exe或pwsh.exe进程。 - 安装目录和快捷方式中不再以
.ps1作为发布版入口,也不设置ExecutionPolicy。 - Windows 10/11、普通非管理员用户和企业 PowerShell 禁用环境均可完成安装与日常使用。
- 保持 CDP 仅绑定
127.0.0.1,并保留当前 Store 包、可执行文件、监听进程和 Browser ID 的严格验证。 - Codex 已运行、Store 自动更新、端口占用、启动失败、Access Denied 和注入器异常均有可恢复行为与明确提示。
- 覆盖安装不会丢失活动主题、已保存主题、导入图片或配置备份;旧 PowerShell 版快捷方式可安全迁移/清理。
- Windows CI 构建可发布的
Setup.exe,执行单元/集成测试,并对安装、启动、托盘、恢复和卸载做冒烟验证。 - 中英文文档和 changelog 明确新的运行时边界。
非目标 / Non-goals
- 本阶段不重写 Node/CDP renderer injector。
- 不修改、复制、接管权限或重新签名官方 Codex Store 包。
- 不把 #235 的紧急兼容修复阻塞在本次架构迁移上。
Related: #235, #236.
Source: Fei-Away/Codex-Dream-Skin