Commit Graph
103 Commits
Author SHA1 Message Date
胡飞 fa6ca0d1b1 fix(windows): 宿主自嵌 Common-Controls v6 清单,修 v0.20.1 启动即死
v0.20.1 的 Windows 产物(zip / portable / MSI 里装的是同一个 navop.exe)启动即失败:
「navop.exe - 无法找到入口 / 无法定位程序输入点 TaskDialogIndirect 于动态链接库
…\AppData\Local\Temp\navop-update\staged-<pid>-<ms>\navop.exe 上」。加载器在 `main`
之前就以 STATUS_ENTRYPOINT_NOT_FOUND(0xC0000139) 退出,所以更新表现成「什么都没发生」。

根因不是缺 comctl32.dll,而是产物**没有任何应用程序清单**:

- gpui 的 Windows 层在 `PlatformWindow::prompt` 中静态导入 `comctl32!TaskDialogIndirect`
  (实测 v0.20.1 的 navop.exe:IMPORT 表里有该符号、DELAY_IMPORT 目录为空 ⇒ load-time 导入);
- 该导出只存在于 Common-Controls v6 的 SxS 程序集,只有 exe 自己的清单声明了
  `Microsoft.Windows.Common-Controls 6.0.0.0` 才会激活 v6;没有清单就挂 System32 里的
  5.82(不导出该符号)⇒ 加载器失败;
- 实测 v0.20.1 的 navop.exe 全文件搜 `Common-Controls` / `<assembly` /
  `requestedExecutionLevel` 零命中 ⇒ 清单确实没被嵌进去。

清单的责任方在 v0.20.1 变了:`gpui-fast 0.1.8` 的 build.rs 是
`embed_resource_unless_host_provides_it()`,而 gpui-kit 声明了
`windows-manifest-provided-by-host`(`cargo tree -e features -p main -i gpui-fast` 可核)。
Cargo 特性只做并集、下游关不掉 ⇒ 这份清单只能由宿主 navop 自己提供。
v0.20.0 走旧门面 `gpui-pre`,它是无条件 embed 的,所以此前没暴露。

- `resources/windows/navop.manifest.xml`(新增):宿主清单,与上游 Zed 的
  `crates/gpui/resources/windows/gpui.manifest.xml` 对齐(asInvoker + supportedOS Win10 +
  Common-Controls 6.0.0.0 + `dpiAware true/pm` / `dpiAwareness PerMonitorV2` /
  `heapType SegmentHeap`)。DPI 与堆这一段刻意与 v0.20.0 保持一致:gpui 两代都**不**在运行时
  调 `SetProcessDpiAwareness`(全仓 grep 无命中),清单是 DPI 感知的唯一来源,漏掉会退回
  DPI-unaware(高 DPI 下整窗被系统位图拉伸)。文件不带 XML 声明:winresource 是把清单按 RC
  字符串逐行写成 `" <line> "`,声明前出现空白不是合法的 XML prolog。
- `main/build.rs`:加 `set_version_info(VersionInfo::FILETYPE, 1)` +
  `set_manifest(include_str!("../resources/windows/navop.manifest.xml"))`。前者不是可选项 ——
  winresource 只在 `VersionInfo::FILETYPE` 存在时才写清单块(`winresource-0.1.31/lib.rs:578`),
  漏了会**静默不嵌清单**。用 `set_manifest` 而非 `set_manifest_file`,避开 rc 的路径转义。
- `script/validate-windows-exe.mjs`(新增):PE 层门禁,解析节表定位 `.rsrc` 并在其原始区间内查
  三条必需串,另外判别「静态导入 TaskDialogIndirect 却无清单」这一真实故障组合;失败退出码 1
  并打印含 `0xC0000139` 的修法。判据**必须同时搜 ASCII 与 UTF-16LE**:实测 llvm-rc 对纯 ASCII
  清单写的是 8 位,MSVC rc.exe 才写 UTF-16,只搜一种编码必漏。
- `.github/workflows/release.yml`:Windows 腿在 `Build release binary (Windows)` 之后、
  `Package (Windows)` 之前插入 `Validate Windows executable manifest`。这段代码在 macOS/Linux 上
  根本不参与编译,而「清单没嵌进去」在编译期没有任何信号,只能在真实产物上校验。
- `script/test-release-packaging.mjs`:加合成 PE fixture(`peFixtureWithResource`)与两个用例
  —— 断言清单内容、`main/build.rs` 的三处调用、workflow 步骤的存在与顺序;以及门禁对
  正样本 / 负样本 / 非 PE 三种输入的退出码与报错内容。

验证(本机为 macOS,无法编译 Windows target):

- `node --test script/test-release-packaging.mjs` = 33 passed / 0 failed
- `cfg(target_os = "windows")` 块在 macOS 上不参与编译,`cargo check` 给不了信号。因此建探针
  工程把 `main/build.rs` **逐字复制、只删掉那行 `#[cfg]`**,配
  `[build-dependencies] winresource = "0.1"` ⇒ 该块**编译通过**(`set_version_info` /
  `set_manifest` 的签名与 `winresource 0.1.31` 一致)。
- 取 winresource 真实生成的 `resource.rc` 手工喂 `llvm-rc`:退出码 0,`.res` 资源目录读出
  `VERSION 1 / ICON 1..6 / GROUP_ICON 1 / RT_MANIFEST 1(1120 字节)`—— 清单落在加载器唯一认的
  「type 24 / id 1」位置。
- 把该 `.res` 当 `.rsrc` 负荷塞进合成 PE:门禁判 OK;对**真实 v0.20.1 的 navop.exe** 判 FAIL
  (退出码 1,报错含 `TaskDialogIndirect` 与 `0xC0000139`)。
- 未在本机验证:MSVC rc.exe / link.exe 真实产物能否正常启动、DPI 表现如何(需 Windows)。
  CI 的 `windows-2022` 腿会编译这段代码。
2026-10-13 19:54:41 +08:00
胡飞 95ae24f351 test: packaging test follows the gpui-webview pin to the gpui-kit fork
The workspace no longer aliases upstream's pre-rename gpui-wry; the
embedded webview now rides the same gpui-kit rev (and GPUI Fast
backend) as the rest of the UI stack.
2026-10-11 09:15:11 +08:00
胡飞 7d66a491ed test(release-packaging): 跟随 gpui-webview 重命名更新断言
上游 #3395 把 gpui-wry 改名为 gpui-webview 后,ai_chat_view 的依赖 key
变成 gpui-webview(workspace 里用 package="gpui-wry" 钉回旧实现)。
打包测试的两处断言仍写死 dep:gpui-wry,Linux 上先跑到这条就挂了;
改成新 key,并补一条断言把 workspace 里的 pin 形态也锁住。CLAUDE.md
里的 crate 名说明一并跟上。
2026-10-08 15:17:38 +08:00
胡飞 24abe96da8 fix(release): Windows MSI 快捷方式不再引用图标表,图标取自 exe 内嵌资源(issue #325)
issue #325 报告桌面上的 Navop 快捷方式图标退化成通用白纸。仓库里没有任何隐藏快捷
方式箭头或桌面图标的功能,现象落回安装包给出的快捷方式图标上:navop.wxs 的两个
<Shortcut> 都带 Icon="NavopIcon",即引用 Icon 表。MSI 会把 Icon 表里的图标另存成
一份独立文件作为快捷方式的图标来源(文档还要求这类图标与目标扩展名一致,而我们
是 .ico 对 navop.exe),这份文件一旦被清理或图标缓存失效,快捷方式就只能显示通用
白纸图标;而 navop.exe 自己其实已内嵌同一份图标(main/build.rs 的 set_icon)。

因此两个快捷方式一律不再引用 Icon 表,图标改由目标 exe 的内嵌资源提供,与
file_association.rs 的 DefaultIcon = "<exe>,0" 保持同一口径。控制面板「应用和功能」
的图标仍走 Icon 表,<Icon Id="NavopIcon"> 与 ARPPRODUCTICON 原样保留。

契约收紧:test-release-packaging.mjs 新增用例断言两个 <Shortcut> 不带 Icon=、卸载项
图标仍走 Icon 表、且 build.rs 确实内嵌 resources/windows/navop.ico,保证「留空」不是
「没图标」;validate-windows-msi.ps1 新增 Assert-MsiEmptyValue 并直接校验安装产物里
Shortcut.Icon_ 为空,把这条规则钉在 Windows release 阶段。

验证:
- node --test script/test-release-packaging.mjs:31 passed / 0 failed(含新增用例)
- 变异验证:把 Icon="NavopIcon" 临时加回 Desktop 快捷方式,新增用例转红;还原后转绿
- validate-windows-msi.ps1 未在本机执行:macOS 无 pwsh、无 WindowsInstaller COM,
  只在 Windows release CI 里跑;MSI 装完快捷方式图标的真实表现需 Windows 实机验收
2026-10-07 17:35:25 +08:00
胡飞 320bc63c01 fix(ci): R2 清理按真实输出解析版本列表
aws s3api list-objects-v2 --query "CommonPrefixes[].Prefix" --output text 对扁平
列表返回的是「一行、tab 拼接」,而清理步骤用 ^...$ 逐行锚定解析,结果恒为空,
于是存在性护栏每次都拦下删除:

  Refusing to prune: releases/<tag>/ is not present in R2

扩展仓用 gbase8s-v0.1.25 试点时就是这样失败的:一个对象都没删(护栏按设计保护
住了),但清理也从未真正执行。本地用假 S3 端点 + aws-cli 2.35.21 复现确认。

修法:列表先 tr '\t' '\n' 归一成一行一个再锚定解析(CLI 若真按行输出也不受影响),
并打印实际读到的版本,下次失败能直接从日志看到桶里有什么。

测试桩原来按「一行一个」输出,正好把真实现场的形态掩盖过去;现在桩按真实的
单行/tab 形态输出,并强制要求带 --delimiter。变异校验:去掉 tr 归一化或去掉
--delimiter,测试都会失败。
2026-10-07 09:45:41 +08:00
胡飞 e99ddd18a5 ci(r2): 补回被 c1db9f1cd 覆盖掉的 R2 保留策略
c1db9f1cd(docs-site 更新到 v0.19.5)是在一份以 main 为基准的索引上提交的,
顺带把 74d0e0595 的三个文件恢复成了旧内容,清理逻辑与测试一起丢失。
这里按 74d0e0595 原样取回,内容未作改动。

- .github/workflows/upload-r2.yml:上传校验通过后清理其余 releases/<tag>/
- script/test-release-packaging.mjs:契约测试 + 假 aws 行为测试
- .github/RELEASE.md:记录「R2 只保留最新版本」的保留策略

本地 node --test script/test-release-packaging.mjs 30/30 通过。
2026-10-06 23:30:08 +08:00
胡飞 c1db9f1cd1 docs(docs-site): 更新到 v0.19.5
首页三语言发布亮点整体更新:个人同步 WebDAV 后端、SSH Agent 转发、表设计器「刷新表结构」、终端粘贴确认弹窗「打开设置 / 不再提示」、外部驱动按调用类别区分请求超时(连接高级设置新增「请求超时(秒)」)、事务提交按钮 loading,以及中文过滤输入崩溃、Linux 退出 SIGABRT、macOS Touch Bar 关窗闪退等修复。

指南章节:teams-sync-security 补 WebDAV 后端与「目录不可用」处理;ssh-terminal 补 ssh-agent 转发与 ForwardAgent;schema-tools 补「刷新表结构」;database-connections 补按调用类别的请求超时与连接级覆盖。
2026-10-06 23:21:51 +08:00
胡飞 74d0e05951 ci(r2): 上传校验通过后只保留最新版本
R2 桶里越堆越多的是历次版本的安装包,而下载入口只认最新一份:
updates/latest.json 只指向本次 tag,旧版本另有 GitHub Release 与
CNB 镜像存档。所以在上传并逐对象校验成功之后,清掉其余
releases/<tag>/ 前缀。

护栏:
- 排在验证步骤之后且不带 always(),上传失败时一个对象都不删;
- 只处理 releases/ 前缀,更新清单所在的前缀永不触碰;
- 本次 tag 不在桶里就拒绝清理,宁可留下旧版本也不删最后一份可用包;
- 非稳定 tag(预发布)跳过清理,不会带走上一个稳定版本的安装包。

顺带补上契约测试与行为测试(抽出的脚本配假 aws 跑真实清理逻辑),
并在 .github/RELEASE.md 记录这条保留策略。
2026-10-06 23:21:37 +08:00
胡飞 a246ef8bfd macos: 关掉「关闭即隐藏」开关,窗口重新走 remove_window()
上游 zed#65186(gpui_macos: Fix crash closing windows on Touch Bar Macs)把根因
修掉了:accesskit 不再用 SubclassingAdapter 动态替换内容视图的类,改成挂在
GPUIView 上的普通 Adapter。那次「还原类」正是破坏 AppKit Touch Bar 观察者 KVO
状态、让窗口关闭时抛异常的动作。该提交随 zed upstream/main 合进 fork,发布为
gpui-pre fork-0.3.124。

因此:
- release.yml 不再给 x86_64-apple-darwin 传 macos-touchbar-window-hide,
  extra_features 变量与其分支一并删除,三个平台交付同一形态:关闭即销毁。
- script/test-release-packaging.mjs 同步改成断言这一步不再出现 --features /
  extra_features,29 项全过。
- 机制整套保留(HIDE_WINDOWS_ON_CLOSE 常量、隐藏路径、关闭漏斗三态、弹窗登记表
  与全部契约测试),现在恒为 false;重新打开只需给对应 target 传该 feature。
  已验证 --features macos-touchbar-window-hide 下 one-core 仍以 -D warnings
  干净编译,回退路径可用。

改动只涉及构建开关、注释与文档,Rust 逻辑未动:one-core 关窗/弹窗契约测试
(8 + 14)、remote_file_editor 契约测试 6 项、main 的 -D warnings 编译均通过。
本次没有真机验证 —— 手上没有 Touch Bar 机型;判定依据是上游把出问题的那条
代码路径整个删掉了。若闪退复现,第一动作是重新打开这个开关。
2026-10-06 17:16:42 +08:00
胡飞 eaad024e62 fix(core): Touch Bar「关闭即隐藏」收进 macos-touchbar-window-hide 开关,只为 Intel Mac 生效
关闭窗口时销毁原生 NSWindow 会触发 AppKit 的 Touch Bar 观察者注销路径
(navop#262 / #308 / #314 的 SIGABRT)。前一版修法是「一律不销毁、只隐藏」,
但它对所有平台生效:隐藏的原生窗口会一直占着 NSWindow / CAMetalLayer 直到进程退出,
而 Touch Bar 只存在于 x86_64 机型 —— ARM macOS、Windows、Linux 付了代价却没有任何收益。

- 新增 cargo feature `macos-touchbar-window-hide`(crates/core,main 转发),
  整条链路只读一个常量
  `HIDE_WINDOWS_ON_CLOSE = cfg!(all(target_os = "macos", feature = "macos-touchbar-window-hide"))`:
  `hide_for_reuse` 直接拒绝隐藏、`install_popup_close_routes` 什么都不装、
  `open_popup_window_inner` 不登记窗口、编辑器窗口的 `hide_for_reuse` 同样退回销毁。
  用常量而不是散落的 `#[cfg]`,是因为这三处必须同时成立,任何一处单独打开都会静默错配
  (隐藏了却不登记 = 业务 view 不卸载;登记了却不隐藏 = 条目永远探活失败)。
- 复用键从 `&'static str` 改成 `String`:同类弹窗会为不同目标各开一个(同时编辑两个连接、
  同时连两台远程桌面),只按「弹窗种类」复用会把先开的窗口顶掉。
- 发布流水线只为 `x86_64-apple-darwin` 传该 feature(`extra_features`),
  打包契约测试钉住三点:feature 只出现一次、只挂在 x86_64 判定下、两条编译命令都消费它。
- 契约测试 `the_hide_switch_gates_every_link_of_the_chain` 门控链上的每一环。

验证:`cargo check -p main`(feature 关)exit 0;`cargo check -p main --features
macos-touchbar-window-hide`(Intel Mac 交付形态)exit 0;`cargo test -p one-core --lib`
两种配置各 698 passed;`cargo test -p remote_file_editor --lib` 70 passed;
`node script/test-release-packaging.mjs` 29 passed。
2026-09-28 20:58:00 +08:00
胡飞 0b3a5c0a9b build: HTML 预览的 embedded-webview 改为全平台默认关闭
- `main` 与 `crates/ai_chat_view` 的 `default` 都去掉 `embedded-webview`,
  需要时显式 `--features embedded-webview` 打开
- 删除 `script/linux-release-features.sh`:Linux 不再需要专属 feature 列表,
  三个平台发同一种形态,`release.yml` 的 Linux 分支回到默认构建
- 移除 `NAVOP_LINUX_EMBEDDED_WEBVIEW` 开关;Windows 32 位的显式列表
  (默认集减 shell-plugins)同步去掉该 feature,避免 win32 成为唯一的另一种形态
- `ci.yml` 补编 opt-in 形态(`cargo check -p main --features embedded-webview`
  与 `cargo check -p ai_chat_view --features embedded-webview --tests`):
  默认形态由 `cargo test --all` 覆盖,两个半边都得有地方编到
- `test-release-packaging.mjs` 改为锁「没有平台构建打开该 feature」+ opt-in 形态有 CI 覆盖
- 注释同步:`main/Cargo.toml`(原因与降级行为)、`install-linux.sh`、
  `package-linux-gpu-stack.py`、`AGENTS.md`

动机:WebKitGTK 4.1 无法随 Linux 发布包提供(带它的发行版都在 glibc 2.39+ 上、
`WebKitWebProcess` 按编译期路径解析),而只让 Linux 关掉会让三个平台各发一种形态,
需要多测一套、多维护一个平台专属列表。关闭后 HTML 预览弹窗降级为
「无法创建 HTML 预览 webview,已保留源码视图」,「用浏览器打开」「下载 HTML」不受影响。

验证:`cargo check -p main`(默认形态)、`cargo check -p main --features embedded-webview`、
`cargo check -p ai_chat_view --features embedded-webview --tests` 三者均通过;
`node --test script/test-release-packaging.mjs` 29/29;两个 workflow YAML 解析通过。
2026-09-22 17:24:06 +08:00
胡飞 ed6d1f3306 build(linux): Linux 发布包不再链接 WebKitGTK 4.1
- 新增 `script/linux-release-features.sh` 作为 Linux 发布 feature 集的唯一真源,
  默认输出 `wasm-components,windows-native-rdp,shell-plugins`(默认集减去
  `embedded-webview`)
- `release.yml` 的 Linux 构建改为 `--no-default-features --features "$(...)"`;
  只有设了 `NAVOP_LINUX_EMBEDDED_WEBVIEW=1` 且 pkg-config 真能看到
  `webkit2gtk-4.1` 时才把该 feature 加回来
- `ci.yml` 在 Linux 上补编一次发布形态:`cargo test --all` 走的是默认特性全开,
  覆盖不到关掉 feature 的那半边代码
- `test-release-packaging.mjs` 锁住默认列表、opt-in 路径(stub pkg-config 的
  成功/失败两种结果)以及两个工作流对脚本的接线
- `install-linux.sh`、`package-linux-gpu-stack.py` 的注释同步:WebKitGTK 只服务于
  可选的 `embedded-webview`,不再是发布二进制的必然依赖

带 WebKitGTK 4.1 的发行版都构建在 glibc 2.39+ 上、与发布包的 2.28 基线不相配,
且 `WebKitWebProcess` 是按编译期路径解析的独立 ELF,所以这个库无法随依赖包提供。
UOS / 麒麟这类只带 4.0 的发行版此前会直接以
`error while loading shared libraries: libwebkit2gtk-4.1.so.0` 失败。
2026-09-22 16:41:12 +08:00
胡飞 e38a35df99 build(linux): 渲染依赖独立成包,便携版改为同一二进制加标记文件
- 新增 script/package-linux-gpu-stack{,.py,-build.sh,-docker.sh} 与
  script/linux-gpu-stack-install.sh:在 Rocky 8 容器里收集 Mesa/EGL/LLVM
  闭包,产出 navop-<version>-linux-<x64|arm64>-gpu-stack.tar.gz;安装脚本
  按 ldconfig 只补宿主缺失的库,支持 --dry-run/--force/--uninstall,卸载
  只回放自己安装过的文件
- 删除 Linux portable 变体:musl 启动器 script/linux-portable-launcher.c、
  script/package-linux-portable.{py,sh},发布矩阵移除 linux-x64-portable
  与 linux-arm64-portable
- Linux 应用包统一为默认 feature 的裸二进制,构建走
  cargo zigbuild --target <triple>.2.28,不再拆 --no-default-features 分支
- 便携包回归:Package (Linux) 用同一个二进制平铺、加一个空的
  navop.portable 标记打成 -portable.tar.gz,不新增矩阵项、不二次编译
- upload-r2.yml 的 targetFor() 识别 -portable./-gpu-stack. 后缀并映射到
  对应 target,避免这两类资产被归入 universal
- 三语言 install-update.md 更新下载表,新增图形依赖包与便携版说明
- 重写 script/test-release-packaging.mjs:退役 portable 打包器用例,新增
  依赖包三方契约、便携标记跨平台锁定、install.sh 增量卸载等断言
2026-09-22 13:45:05 +08:00
胡飞 1142f2f843 chore(deps): 依赖地址改为 gpui-kit 仓库
上游 longbridge/gpui-component 已改名为 longbridge/gpui-kit,fork 同步改名,
所有 gpui-* 依赖、patch、文档与同步脚本里的仓库地址一并更新。

同步脚本同时修掉了三处与旧仓库名绑定的匹配逻辑:守卫条件改为按 gpui-kit
仓库名匹配、Cargo.lock 校验的 rev 正则允许缺少 ".git"、依赖行允许只锁定
rev 而没有 version 字段。
2026-09-20 10:24:22 +08:00
胡飞 416b81400e ci: 发布 PR 只跑发布元数据校验,跳过全平台测试
只改 CHANGELOG.md / main/Cargo.toml / Cargo.lock 的发布 PR 此前仍要跑
macOS / Linux / Windows 三平台全量测试(Windows job 约 25 分钟),而改动里
没有任何代码,这些测试没有意义。

- ci.yml 新增 classify job:PR 场景下用 script/release_pr.py 判定是否只包含
  发布改动,是则跳过 test 与 windows-rdp-probe,改为就地校验发布元数据
- script/release_pr.py:分类规则为「改动文件全部属于发布白名单」且
  「Cargo.toml / Cargo.lock 的差异只有 version = "..." 行」;命中后校验
  main/Cargo.toml 与 Cargo.lock 中 main 包版本一致,且该版本的双语
  changelog 条目完整(更新内容/修复与优化 + What's New/Fixes and
  Improvements,含 CNB 镜像行);无法算出 diff 时回退到全量测试
- ci-gate 仍是唯一必需状态检查,分类或校验失败都会拦住合并
- .github/RELEASE.md 记录该快速通道
- windows_rdp_host 契约测试钉住 classify/needs/if 结构与脚本白名单

验证:
- python3 -m unittest discover -s script/tests -p "test_release_pr.py" — 16 passed
- cargo test -p windows_rdp_host --test contract — 40 passed
- ruby -ryaml 解析 ci.yml,核对 classify/test/windows-rdp-probe/ci-gate 的
  needs 与 if 表达式
- rustfmt --edition 2024 --check crates/windows_rdp_host/tests/contract.rs
2026-09-19 12:55:35 +08:00
胡飞 1712e6ffe1 ci: sccache 安装失败时退化为无缓存构建,不再让 job 失败
mozilla-actions/sccache-action 从 GitHub Release CDN 下载 sccache 二进制失败
(CI run 35347089674 上连续两次 HTTP 504)会直接让整个 test job 变红,
Windows 测试根本没跑到,ci-gate 随之拦截合并。sccache 只是构建加速器,
不应成为测试或发布 job 的可用性依赖。

- Setup sccache 标记为 continue-on-error: true;该 action 的 post step 复用同一个
  Pipelines.ActionStep,因此继续性错误同样覆盖 post step 失败
- Initialize sccache 在 steps.sccache.outcome != 'success' 时输出 warning,并向
  GITHUB_ENV 写入空 RUSTC_WRAPPER,让后续 cargo 走无缓存构建;空值与 ci.yml
  中 windows-rdp-probe job 的 RUSTC_WRAPPER: "" 是同一语义
- 同步 release.yml 的同一段路径,避免发布 job 被同类瞬时故障打断
- script/test-release-packaging.mjs 的共享缓存策略契约补上 best-effort 断言,
  防止后续改动把这两个步骤改回硬依赖

验证:
- ruby -ryaml 解析两个 workflow:jobs 与步骤结构不变
- node --test script/test-release-packaging.mjs:26 passed / 0 failed
- cargo test -p windows_rdp_host --test contract:39 passed / 0 failed
- 变异验证:临时删掉 ci.yml 的 continue-on-error,共享缓存策略契约立即转红
- 本地 RUSTC_WRAPPER="" cargo check 正常,确认空值等价于不启用 wrapper
2026-09-19 00:10:02 +08:00
胡飞 224c8c62a6 test(release): 同步发布配置断言到 fat LTO / panic=abort / 180min
这三条断言在之前的发布 profile 改造后就没跟上,CI(ci.yml 会跑
`node --test script/test-release-packaging.mjs`)一直是红的:

- 超时:改为断言统一的 `timeout-minutes: 180`(原表达式已删除)
- Cargo.toml:`lto = "thin"`/`codegen-units = 16` → `lto = "fat"`/
  `codegen-units = 1`,并补 `panic = "abort"`
- Windows 构建:feature 已收进 `$features` 数组,改断言
  `"windows-native-rdp"`(原 `--features windows-native-rdp` 不再出现)

验证:node --test script/test-release-packaging.mjs 全绿。
2026-09-17 16:41:01 +08:00
胡飞 7815ce5a28 perf(deps): gpui-component 升级到 resvg 0.46,去掉重复的 usvg/tiny-skia
component fork 的 Windows 原生菜单固定 resvg 0.45.1,gpui-pre 用 0.46.0,
每个下游二进制都链两份 usvg/tiny-skia。fork 侧 6df86ef8 把 resvg 提到 0.46.0,
navop 侧 rev 跟到 6df86ef8(含 rquickjs)。

同时清掉脚本/文档里改名前的 gpui-ce 标识:
- sync-gpui-component.sh 的 -p 包名(原值实跑报 did not match any packages)
- update_gpui_component_revision.py 的包名映射
- gpui-component-external.md 的旧仓库地址与 rev
- gpui-shell-extension-design.md / home-theme-sidebar-refinement.md 的旧包名与 rev

验证:Cargo.lock 里 resvg/usvg/tiny-skia/tiny-skia-path 各只剩 1 个版本;
cargo check -p main 通过;resvg 调用序列探针对 0.46.0 编译通过。
未跑 Windows 构建:唯一调用点是 native_menu/windows.rs(Windows 专用)。
已知遗留:update_gpui_component_revision.py 仍不能跑(依赖行需含
gpui-component.git + version =,SHELL_VERSION_FILES 锚点已不存在)。
2026-09-17 15:51:15 +08:00
胡飞 b1f41f81c7 perf(release): 关掉展开/开 fat LTO,裁剪 wasmtime 未用 feature
macOS arm64 二进制 177,369,216B → 112,557,680B(-36.5%)。

1. [profile.release] lto=thin→fat、codegen-units=16→1、panic=abort。
   __eh_frame 16.0→0.07MiB、__gcc_except_tab 8.6→0.02MiB、
   __unwind_info 2.8→0.29MiB,展开元数据共省约 27MB。
   代价:release 下 catch_unwind 不再拦 panic(terminal 录制 observer、
   windows_rdp_host event 回调);dev/test profile 不变,测试照样跑。
2. extension-wasm 只用 async/cache/component-model/cranelift/gc/runtime/std/
   threads,wasmtime 与 wasmtime-wasi 都关 default-features;
   wat 解析器移入 dev-dependencies(只有 fixtures/*.wat 测试用)。
   掉包:wiggle、wiggle-generate、wiggle-macro、witx、wast、leb128。
3. bundle-macos-dmg.sh:按 staging 目录实际大小显式 -size(首次 +512MB,
   重试逐次放大),制完删 staging 拷贝。hdiutil 自动估算偏小时会报
   "No space left on device",与磁盘剩余空间无关(已本地复现)。
2026-09-17 11:24:04 +08:00
胡飞 e65fa85272 fix(release): macOS DMG 前清理 target 并去掉写死的 200m 镜像大小
runner 磁盘被 release target 目录占满导致
hdiutil create: No space left on device;DMG 又写在 target/ 下。
打包 app 后清理 deps/build/incremental/.fingerprint 再制 DMG;
同时去掉 -size 200m(app 二进制已约 208MB,写死尺寸不够)。
2026-09-17 09:04:00 +08:00
胡飞 832c259471 fix(release): 版本 bump 走发布 PR,发布脚本只校验并打 tag
main 受保护(PR + CI gate 且 enforce_admins),release-tag.sh 原先
直接提交并推送版本变更会被 GH006 拒绝。改为:版本 bump 随 dev -> main
发布 PR 合入,脚本只校验版本/changelog 后创建并推送 tag。

- release-tag.sh: 去掉直推分支与自动 bump,新增 main 分支与版本一致性校验
- 删除 bump-version.sh(会基于未推送的提交直接打 tag,与保护规则冲突)
- RELEASE.md / CONTRIBUTING.md / CLAUDE.md 同步为 PR + tag 流程
2026-09-16 20:18:59 +08:00
user.email d548f07ab1 build: shell-plugins 进 main 的 default,四个发布产物统一带 Shell 页
`shell-plugins` 此前只在自建构建里开,于是 `crates/universal-plugins/src/
shell_plugin_host/**` 在默认构建、CI(`cargo test --all`)与发版里整段不参与
编译——改共享契约漏改构造点会静默通过(2026-09-15 给 `BindingContext` 加
`connection` 字段时就是这样漏的)。改为:

- `main` 的 `default` 追加 `shell-plugins`,于是 macOS/Linux(走 default)与
  Windows(`--features windows-native-rdp`,default 仍在)的发布产物都带上;
- portable Linux 用 `--no-default-features`,不继承 default,故显式写成
  `--features wasm-components,shell-plugins`;
- `crates/universal-plugins` 的 `default` 保持为空:该开关只关掉当前被选中包
  的 default,若给 crate 也设 default,`main --no-default-features` 会把 Shell
  页漏回来,feature 门失效。

`script/test-release-packaging.mjs` 里两处按字面量断言 default 行与 portable
命令,一并同步;`AGENTS.md` 那条 lesson 的验证方式改为「默认态与关闭态都必须
各跑一次」——漏编永远发生在没编到的那一侧。

验证:`cargo check -p main --locked` EXIT=0;关闭态 `--no-default-features
--features wasm-components,embedded-webview,windows-native-rdp` EXIT=0;
`node --test script/test-release-packaging.mjs` 26/26。
portable 目标本机无 zig/cargo-zigbuild,未预验证(该 job 现在要编 quickjs 的
C 源码,`quickjs-jit/sys/build.rs` 经 `cc` crate)。
2026-09-15 15:21:48 +08:00
user.email 9ec827f263 docs(publish-gpui-pre-fork): use https fork-url in examples (repo is public) 2026-09-10 20:28:26 +08:00
user.email 6a1e7f6dd0 feat(remote_desktop_view): restore dynamic texture via a self-maintained gpui-pre fork
The dynamic-texture API only exists on our zed dynamic-texture branch, so
the published gpui-pre-* snapshot predates it. Instead of a path patch
that ties the build to one host, point the [patch.crates-io] block at a
git fork we own:

    feigeCode/gpui-pre, tag fork-0.3.99

The fork is cut from zed@cae01216cb with gpui-component's
script/bump-gpui.ts pipeline. Re-publish with
script/publish-gpui-pre-fork.py and move the patch with
script/migrate-to-git-fork.py; both live in script/.

With the API available again, revert the eda5371ae RenderImage fallback
in remote_desktop_view:

- surface.rs uses DynamicTexture directly; the backing framebuffer
  becomes the upload source for paint_dynamic_texture.
- render.rs paints dirty rects via update_dynamic_texture /
  paint_dynamic_texture instead of a whole-frame paint_image, and
  releases retired handles with drop_dynamic_texture.
- view.rs drops the placeholder handles; the contract tests assert the
  dynamic-texture path.

cargo check --workspace --locked: clean. cargo test -p
remote_desktop_view --lib: 241 passed.
2026-09-10 20:17:50 +08:00
user.email 0fda3ead6f merge: 同步上游 feigeCode/dev(已合并 PR #175)进本地 dev
以本地 dev 的未完成重构(资源工作台/表单引擎)为准解决冲突:
- 保留 dev 的 universal-plugins/connection_form 表单引擎与 resource-workbench 代码
- 保留 dev 内置 MQTT/TDengine 栈(mqtt_view/mqtt-runtime/taos/rumqttc)
- 恢复 dev 版本的核心存储、主程序与受影响的 crates
- 保留上游仅新增的迁移文件 20260828000001_middleware_extension_connections.sql
- 更新 workspace 依赖(mqtt-runtime/mqtt_view/taos/rumqttc)与 Cargo.lock
- cargo check --workspace 通过
2026-09-10 08:15:50 +08:00
user.email ee1f052cbc merge: 解决 PR #175 与 feigeCode/dev 的冲突并移除 .agent-teams
- 将 feigeCode/navop:dev(b8d90a629)合并入 PR 头,逐文件解决 21 处冲突
- 按 PR 意图移除内置中间件/TDengine 实现:删除 mqtt_view、middleware_form、
  navigation_quick_open、main 内 extension_connection_form(迁至 crates/universal-plugins)
- 保留 base 侧结构(universal-plugins crate、home 重构),融合 PR 的 SSH 隧道/
  统一凭据解析增强;crates/universal-plugins 与 main 全量 cargo check 通过
- 移除误提交的 .agent-teams 目录(共 8 个 JSONL/JSON 文件)
2026-09-09 23:24:51 +08:00
胡飞 d43f7e22b0 fix(ci): align release-packaging contract with universal-plugins feature and drop dead test helper
- test-release-packaging: shell-plugins optional deps moved into crates/universal-plugins; assert the new main feature forwarding there
- extension-runtime: remove unused append_executable_bytes (dead under -D warnings)
2026-09-09 18:19:01 +08:00
胡飞 cb723be834 perf(release): use parallel thin LTO builds 2026-09-05 08:04:37 +08:00
胡飞 6ce900ba55 fix(main): keep gpui shell out of default release builds 2026-09-05 05:10:32 +08:00
胡飞 a6786444e9 fix(ci): 合并 windows-rdp-probe 到 test job 并修复 CI 全红
- ci.yml: 删除独立 windows-rdp-probe job,probe 步骤并入 test job 的 Windows
  分支(保留 i686,先 rustup target add i686-pc-windows-msvc)
- contract.rs: 去掉已删除 build-windows-msi.yml 的断言,更新 ci.yml 结构断言
- test-release-packaging.mjs: main default features 断言补 builtin-mqtt
- 修复 -D warnings 下 unused imports/unused_mut 编译错误
2026-09-04 15:05:25 +08:00
胡飞 6bd63dc3a7 chore(workflow): 精简 GitHub workflows,发布链路改从 main 触发并加 PR 合并保护
- 删除废弃 workflow:build-windows-msi / build-windows-rdp-smoke /
  repair-release-assets / validate-linux-arm64-packages / validate-linux-x64-packages
- test-release-packaging.mjs 移除对 build-windows-msi 的引用,
  Windows MSI 校验改为以 release.yml 为准
- release-trigger.yml 与 release.yml 的 dispatch --ref 由 dev 改为 main(main=release)
- ci.yml 增加 CI gate 汇总 job,供 main 分支保护强制检查
- RELEASE.md 更新分支模型:dev=beta、main=release(PR 合并)
2026-09-04 11:01:13 +08:00
胡飞 a5f7884991 chore: v0.16.0 发布前整理与测试补充
- refactor(notes): 移除 Markdown Split 分栏模式,旧配置自动迁移到 Source
- test(credential_vault): 补充列表渲染边界测试并添加 debug selector
- docs(extension-resource-plugins): 新增开发指南与 README 关联
- style: 统一 rustfmt 格式(notes/db/sftp/one_ui 等)
- chore: 同步 Cargo.lock 与脚本
2026-09-03 22:34:31 +08:00
胡飞 3d18ae010e feat(plugins): add universal resource shell views 2026-09-02 12:21:55 +08:00
胡飞 2eee74d39e chore(release): 强化 skill 与脚本对 CNB 镜像下载行的强制校验
- navop-release-notes skill: Prepare 阶段改为硬性 checklist,CNB 下载行列为必选项并附 grep 校验;Common Mistakes 新增遗漏 CNB 行条目
- script/changelog.py: 新增 CNB_MIRROR_LINE_RE,upsert 生成新条目与 validate 命令(release-tag/bump 闸门)强制包含 CNB 镜像下载行,extract 保持宽松以兼容无 CNB 行的旧条目
- 同步三层嵌套 skill 副本为同一最新版本
- 补充 upsert/validate 缺 CNB 行报错、extract 对旧条目宽松的测试
2026-08-30 17:10:00 +08:00
胡飞 84bdfdb6ae chore(release-notes): drop language headings and add CNB download line 2026-08-29 15:05:26 +08:00
胡飞 dcfcddc8d1 feat(release): versioned public package names with win32 label, keep updater asset names 2026-08-24 17:37:57 +08:00
胡飞 51b57d9995 fix(release): 完善 R2 与 CNB 发布资产同步 2026-08-24 11:56:23 +08:00
胡飞 d42859b6dc test(db): add real database integration coverage 2026-08-22 08:52:57 +08:00
胡飞 a40c8dc161 ci(windows): allow Visual Studio 18 RDP probe 2026-08-19 16:42:49 +08:00
胡飞 1e50b59313 fix(windows): configure MSVC for native RDP builds 2026-08-19 00:19:19 +08:00
胡飞 25a75d8984 fix(windows): include native RDP in app builds 2026-08-19 00:18:16 +08:00
胡飞 d0f1f1abdb fix(remote-desktop): restore Windows native CI contracts 2026-08-18 22:27:01 +08:00
胡飞 81fc4760c3 feat(remote-desktop): enforce Windows RDP callback quiescence 2026-08-18 22:27:00 +08:00
胡飞 6259417a09 feat(remote-desktop): add versioned Windows RDP host ABI 2026-08-18 22:27:00 +08:00
胡飞 c9c13b8cc2 fix(remote-desktop): import the system RDP type library 2026-08-18 22:27:00 +08:00
胡飞 ed2a9c3639 feat(remote-desktop): add Windows RDP toolchain probe 2026-08-18 22:27:00 +08:00
胡飞 73cf3bea38 fix(release): bundle Wayland runtime libraries 2026-08-15 11:33:52 +08:00
胡飞 f4576839e8 fix(release): resolve usrmerge package ownership 2026-08-15 08:45:52 +08:00
胡飞 082721ac0e fix(ci): check cargo-zigbuild version correctly 2026-08-15 00:37:39 +08:00
胡飞 02beac37a0 feat(release): add portable x64 Linux package 2026-08-14 23:35:14 +08:00