Skip to content

feat(macos): 修复 PHP 插件下载逻辑问题——Part1 - #1004

Merged
1lck merged 14 commits into
previewfrom
codex/plugin-package-signing
Oct 3, 2026
Merged

1lck merged 14 commits into
previewfrom
codex/plugin-package-signing

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

问题

PHP Support 已经按可选插件独立构建,但 macOS 发布 workflow 在没有 Developer ID 证书时会跳过 PHP 插件 zip,因此 GitHub Release 没有可安装的独立包。

改动

  • 新增 LithePluginPackageSigning 和 LithePluginPackageSigner,使用 Ed25519 对完整插件文件树生成 SHA-256 清单和 lithe-plugin-signature.json。
  • PHP manifest 使用 publisherPackage 签名策略;安装时同时验证原生 bundle 代码签名和 publisher 包签名,篡改任意文件、manifest、版本或签名都会被拒绝。
  • 官方插件的签名策略以宿主内置 OfficialPluginCatalog 为信任根;下载包不能把 PHP 的 publisherPackage 降级成 sameTeamAsHost 来跳过 publisher 验签。安装、启动扫描和回滚均执行同一策略检查,verifier 本身也按宿主策略决定是否要求 publisher 签名。
  • stable 和 preview macOS workflow 在两个架构都生成并上传 PHP Support zip,不再以 Developer ID 是否存在作为插件包发布条件。
  • 已同步最新 preview;功能矩阵沿用新的 shared/platform-feature-matrix/features/ 分片结构,不恢复旧的总 JSON/生成 Markdown/CSV。
  • 更新 PHP 插件资源归属、发布策略、CI 构建说明和 Agent Notes。

发布配置

在仓库 Settings → Secrets and variables → Actions → Secrets 中配置:

gh secret set LITHE_PLUGIN_PACKAGE_STABLE_PRIVATE_KEY \
  --repo 1lck/Lithe-IDEA \
  < /secure/path/lithe-plugin-package-private-key

Stable 与 Preview 使用独立 publisher 信任根。Stable workflow 使用 LITHE_PLUGIN_PACKAGE_STABLE_PRIVATE_KEY,并匹配客户端内置 stable 公钥;Preview workflow 使用独立的 LITHE_PLUGIN_PACKAGE_PREVIEW_PRIVATE_KEY,对应公钥通过仓库变量 LITHE_PLUGIN_PACKAGE_PREVIEW_PUBLIC_KEY 注入 Preview App。签名文档绑定 channel 与 channel-specific key ID,跨渠道签名包会被拒绝。私钥只注入独立插件签名 step,不提交到仓库、插件包或日志。

验证

  • swift build --product Lithe
  • swift test --filter PluginPackageSignatureTests
  • swift test --filter PluginPackageStoreTests,包含官方 PHP manifest 将 publisherPackage 篡改为 sameTeamAsHost 时必须在真实安装路径被拒绝的回归测试。
  • 本地生成并验证签名 PHP 包,签名覆盖完整插件文件树;篡改 plugin.json 后验证失败。
  • ./scripts/verify-official-plugins.sh
  • ./scripts/verify-agent-notes.sh
  • ./scripts/verify-platform-feature-matrix.sh
  • ./scripts/verify-runtime-bundle-immutability.sh
  • ./.agents/skills/write-stable-tests/scripts/verify-test-stability.sh

此前 PR 正文中“PluginPackageSignatureTests 被 DebugModuleTests.swift 编译问题阻断”的说明已过时:上一版 macOS Plugin CI 已实际通过 62 项测试并包含 3 项签名单测。当前 HEAD 新增了安装策略降级回归,等待本次 CI 重新验证。

Download and manage the PHP plugin and its Intelephense runtime through Plugin Management, while keeping LSP controls project-scoped. Publish signed macOS plugin archives and validate plugin-owned language-server resources.

Closes #922
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Sep 30, 2026
@xiaoyumuxi xiaoyumuxi changed the title feat(macos): publish independently signed PHP plugin packages feat(macos): 修复 PHP 插件下载逻辑问题——Part1 Sep 30, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as draft September 30, 2026 18:10

@xiaoyumuxi xiaoyumuxi left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整体检查了 publisher Ed25519 包签名、运行时验签、release workflow 和构建脚本。生产发布路径会强制要求私钥,签名覆盖完整文件树的实现也合理;但 debug 包目前存在一个会影响真实安装验证的问题,见 inline comment。当前 CI 全绿,不过现有插件 verifier 不走真实 package-store 的 publisher 验签路径,因此不会捕获这个问题。

Comment thread scripts/build-official-plugins.sh Outdated
exit 1
fi
print -u2 -- "Skipping publisher signature for debug plugin package $package_id"
continue

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里在 debug 且没有发布私钥时继续产出一个 未带 publisher signature 的 PHP 包,但 plugin.json 已永久改成 publisherPackage,真实 MacOfficialPluginSignatureVerifier 会直接以 missingPackageSignature 拒绝它。现在 verify-official-plugins.sh 正好走这条 debug 路径,但它只加载 Bundle/校验声明,不经过 package-store 验签,所以 CI 仍会绿。结果是开发者本地构建出来的 PHP 包不能通过应用的“从磁盘安装”路径做端到端验证,除非拿到生产私钥。建议给 debug 构建提供独立的开发签名/信任路径,或者让测试明确通过真实 package-store 验证生成物,避免生成一个看起来成功但实际不可安装的包。

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已修复:无 LITHE_PLUGIN_PACKAGE_PRIVATE_KEY 时,debug 全量构建会跳过 publisherPackage 的 PHP 包;显式指定该插件时会因无匹配产物而失败;release 构建会强制要求 key。verify-official-plugins.sh 现在还会对实际生成的 PHP 包执行 LithePluginPackageSigner --verify,覆盖 package-store 使用的完整文件树验签路径。相关本地验证已通过。

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

补充修复:review 复核发现 signer 的成功日志会污染 build-official-plugins.sh 的 stdout 路径捕获。已在 1906da8 将 signer 状态日志改写到 stderr,并在 verify-official-plugins.sh 增加返回目录存在性断言,保证 stdout 只保留机器可消费的插件根目录。已重新构建 signer 并通过官方插件验证。

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

另外补上回归断言(53ffe9dd):verify-official-plugins.sh 现在确认 build-official-plugins.sh 返回的是实际目录;提供 publisher key 时还强制确认 PHP 包目录存在,随后逐包执行 signer --verify。无 key 的 debug 验证仍明确跳过 PHP 并通过。

@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 1, 2026 13:35
…ge-signing

# Conflicts:
#	docs/development/platform-parity-matrix.md
…ge-signing

# Conflicts:
#	docs/development/platform-parity-matrix.md
1lck
1lck previously requested changes Oct 2, 2026

@1lck 1lck left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lithe Review|PHP 包签名修复复核

范围:当前 HEAD 09db1ab,重点复核 455818b 及构建、验签和发布直接调用链,不包含 #1006。
旧问题已修复:缺私钥时,普通 debug 在生成 PHP 包前跳过;显式请求 PHP 包或 release 构建会失败,不再留下无法通过安装验签的 unsigned 包。安装器的验签要求没有放宽。

[P1] signer 成功日志污染路径输出,阻断 PHP 发布打包
位置:scripts/build-official-plugins.sh:150–151。

print -rn -- "$LITHE_PLUGIN_PACKAGE_PRIVATE_KEY" | "$signer_binary" "$package_dir"
"$signer_binary" --verify "$package_dir"

新增 signer 在 macos/Tools/LithePluginPackageSigner/main.swift:32、57 用 print 把成功信息写到 stdout,构建脚本未重定向,最后又在 stdout 输出包目录。而 stable 和 preview workflow 用 plugin_root=$(...) 捕获整个输出,再将它作为路径传给 ditto。

触发:提供匹配 key,宿主 API 编译成功,执行现有 PHP release 构建路径。签名和验证成功后,plugin_root 至少包含两行成功日志和目录;拼出的源路径不存在,PHP zip 打包失败。stable/preview 的 arm64 与 x86_64 都受影响。这个问题由本 PR 新增签名流程引入。

plugin_root=$(LITHE_CODESIGN_IDENTITY="${LITHE_CODESIGN_IDENTITY:--}" \
scripts/build-official-plugins.sh \
--configuration release \
--triple "${LITHE_ARCH}-apple-macosx" \
--plugin-id dev.lithe.plugin.php-support \
--output "dist/official-plugins/${LITHE_ARCH}")
ditto -c -k --sequesterRsrc --keepParent \
"$plugin_root/dev.lithe.plugin.php-support" \
"dist/Lithe-PHP-Support-${LITHE_VERSION}-${LITHE_ARCH}.zip"

plugin_root=$(LITHE_CODESIGN_IDENTITY="${LITHE_CODESIGN_IDENTITY:--}" \
scripts/build-official-plugins.sh \
--configuration release \
--triple "${LITHE_ARCH}-apple-macosx" \
--plugin-id dev.lithe.plugin.php-support \
--output "dist/official-plugins/${LITHE_ARCH}")
ditto -c -k --sequesterRsrc --keepParent \
"$plugin_root/dev.lithe.plugin.php-support" \
"dist/Lithe-PHP-Support-${LITHE_VERSION}-${LITHE_ARCH}.zip"

同一输出契约还影响 verify-official-plugins.sh:有 key 的 debug 构建成功后,受污染目录的 glob 为空,可能跳过外层 bundle 检查并输出 Verified 0。

建议把 signer 成功信息及构建日志送到 stderr,保证 stdout 仅为最终目录;增加调用链回归,断言返回值是存在的目录、期望的 PHP 包确实被遍历且完成验证。验证这种输出契约无需使用生产私钥。

Verification
已读取该 HEAD 的 Plugin CI:62 项测试及三项 PluginPackageSignatureTests 实际通过,PR 正文中签名单测仍被旧编译问题阻断的说明已过时。但包检查明确跳过无 key 的 PHP,仅验证 Go,最终 Verified 1,不能证明带 key 的发布路径通过。
https://github.com/1lck/Lithe-IDEA/actions/runs/36996475823

本轮仅静态读取源码及已有 CI,未执行脚本、构建、测试或应用,未读取密钥;没有验证生产 key 配置、真实 PHP release zip 或原生安装。

@xiaoyumuxi
xiaoyumuxi dismissed 1lck’s stale review October 2, 2026 11:26

Fixed in commits 1906da8 and 53ffe9d; signer output is now isolated from the package path and verification asserts the expected PHP package.

@Mucheen Mucheen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lithe Review

结论:存在 2 个 P1 阻塞问题,建议修复后再合并。

范围:preview (8c86fc6c) ← codex/plugin-package-signing (53ffe9dd),审查两者之间的 20 个变更文件及直接调用链。

Findings

  1. [P1] 构建日志仍会污染路径输出,导致 PHP 发布打包失败

    位置:scripts/build-official-plugins.sh:138。

    触发与复现:配置匹配的 publisher key,按 stable/preview workflow 调用 PHP release 构建。新增的 swift build --product LithePluginPackageSigner 没有重定向 stdout,而 SwiftPM 6.3.3 的 build 输出明确写入 stdout。工作流通过 plugin_root=$(...) 捕获全部输出,然后把它作为源目录传给 ditto,最终路径包含构建日志,目录不存在,两个架构的发布均被阻断。

    这是本次新增签名构建流程引入的问题。1906da84 已正确把 signer 的成功信息改到 stderr,但遗漏了构建 signer 的日志。verify-official-plugins.sh 中新增的目录断言会在带 key 时发现问题,不过无 key 的 CI 会跳过这个分支。

    调用方:release-macos.yml:132、release-preview-macos.yml:127。输出行为依据:SwiftPM 6.3.3 的 SwiftBuildCommand 实现,创建 build system 时显式使用 outputStream: TSCBasic.stdoutStream。

  2. [P1] 下载包可以自行降级策略,绕过 publisher 验签

    位置:MacPluginPackageStore.swift:541。

    触发与复现:使用宿主与 PHP bundle 由同一 Developer ID Team 签名的正常发布包,将包外层 plugin.json 的 vendor.signatureRequirement 从 publisherPackage 改成 sameTeamAsHost,再将插件版本改为 0.3.1 或删除 lithe-plugin-signature.json,通过插件管理导入。

    publisher 验签条件取自尚未认证的 manifest,因此会被跳过;后续 Team ID 相等就直接返回成功。plugin.json 位于 PhpSupport.bundle 外,修改它不会破坏 bundle 代码签名。实际的 MacPluginPackageStore.installPackage / ValidatedPluginCatalog 没有检查该策略必须与宿主内置的官方插件策略一致,CLI verifier 的完整 manifest 比较也不是应用安装路径的一部分。

    这是本次新增 publisher 信任机制的绕过路径,使“manifest、版本或包签名被篡改会拒绝安装”的保证在配置 Developer ID 的发布场景下不成立。

Suggestions

  1. 将构建 signer 的日志重定向到 stderr,保证构建脚本 stdout 只有最终目录;补充带签名分支的路径捕获与 zip 打包回归测试,输出契约测试不应依赖生产私钥。
  2. 从宿主可信配置决定 PHP 必须进行 publisher 验签,拒绝 manifest 降级;补充真实安装验证器的策略篡改测试,而不只直接调用签名库。

Scope Check

本 PR 聚焦 PHP 独立包签名与发布,不据此认定 #922 的全部语言按需安装需求已经完成。CryptoKit 复用、平台归属和功能矩阵更新总体合理;两项 Finding 都属于本次改动的职责范围。

Summary

签名方向合理,但发布输出契约和安装认证策略仍存在阻塞问题,建议修复这两条实际调用链后再合并。

Verification

  • 静态检查了全部变更及安装、重装、扫描、发布直接调用链;git diff --check 通过。
  • 最新 head 的 Swift tests、Plugin CI 和两个架构的 app Release package verification 均已通过;PR 正文中签名单测被旧编译问题阻断的说明已过时。
  • Plugin CI 日志 中三个 PluginPackageSignatureTests 实际通过,但包验证步骤明确输出 Skipping publisher-signed debug plugin package dev.lithe.plugin.php-support,最终只验证 Go:Verified 1 official native plugin package(s)。该成功结果不能证明带 publisher key 的 PHP 发布和真实安装路径通过。
  • 本轮为静态审查并读取已有 CI;本机为 Windows,未运行 macOS 构建、测试或应用,未读取生产密钥,未实测真实 PHP release zip 与原生安装。

@1lck 1lck left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lithe Review|stdout 契约修复复核

当前 HEAD 53ffe9d 中,signer 的两条成功日志已移到 stderr;返回目录存在性、有 key 时 PHP 包存在性的断言也已补齐,原来的零包假通过已被阻止。

但上一轮 [P1] 还剩一处:scripts/build-official-plugins.sh:138–140 的嵌套 swift build 仍未重定向 stdout。

swift build \
"${SWIFT_LAYOUT_ARGS[@]}" \
--product LithePluginPackageSigner

已核对固定工具链对应的 SwiftPM 6.3.3:SwiftBuildCommand 把构建输出流设为 stdout,进度跟踪器通过该流输出构建进度和完成消息。
https://github.com/swiftlang/swift-package-manager/blob/swift-6.3.3-RELEASE/Sources/Commands/SwiftBuildCommand.swift#L190-L199
https://github.com/swiftlang/swift-package-manager/blob/swift-6.3.3-RELEASE/Sources/Build/LLBuildProgressTracker.swift#L479-L503

因此提供匹配 key、构建签名成功时,stable/preview 的 plugin_root=$(...) 仍会捕获 Swift 构建日志和最终目录,ditto 源路径仍不成立;带 key 的 debug verifier 现在会在目录断言处明确失败。该问题覆盖两个架构,是原 P1 未处理完的输出,不是这次补丁引入的新问题。

建议将这条普通 swift build 输出重定向 stderr,保留 --show-bin-path 的单独捕获;补不使用生产私钥的 stub 调用链回归,模拟构建器输出进度,断言外层 stdout 严格只有存在的目录,并验证 PHP 包实际被遍历。

Verification
当前 HEAD 六项 CI 均成功,Plugin CI 62 项测试(包含三项签名单测)通过。但日志仍明确跳过无 key 的 PHP,只验证 Go,最终 Verified 1,不覆盖上述带 key 成功路径。
https://github.com/1lck/Lithe-IDEA/actions/runs/37000534957
本轮静态只读,没有执行脚本、构建或测试,也没有访问生产密钥;真实签名发布包和原生安装仍未验证。

@1lck 1lck left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lithe Review|stdout 问题闭环

复核当前 HEAD b9f2c72:此前报告的 stdout 路径污染 P1 已修复。嵌套 Swift 构建日志已重定向 stderr,signer 日志、独立的 --show-bin-path 捕获及目录/PHP 存在性保护均保留,恢复了 stable/preview 调用方所需的路径输出契约。本次静态复核未发现这条调用链的新回归。

swift build \
"${SWIFT_LAYOUT_ARGS[@]}" \
--product LithePluginPackageSigner >&2

当前六项 CI 均成功,Plugin CI 的 62 项测试及三项签名单测通过,但包检查仍跳过无 key 的 PHP、只验证 Go。因此真实签名 PHP 发布与原生安装仍未验收;本轮未执行构建、脚本或测试,也未读取密钥。建议后续保留独立的 stdout 调用链回归,当前一行修复未新增该测试。

此结论仅关闭 stdout 问题。Mucheen 报告的独立签名策略降级 P1 未由本补丁处理,相关安装器文件未变;当前另有合并冲突,不能据此认定整个 PR 已可合并。
#1004 (review)

Copy link
Copy Markdown
Collaborator Author

已按 review 闭环当前阻塞项:

  • 已同步最新 preview 并解决 matrix 迁移冲突,PR 当前可合并(无 merge conflict)。
  • stdout 路径污染修复保留。
  • 修复 publisher 签名策略降级:官方插件签名策略以宿主 OfficialPluginCatalog 为信任根,PHP 包内 plugin.json 不能再把 publisherPackage 改成 sameTeamAsHost 跳过 publisher 验签。
  • MacPluginPackageStore 在安装、已安装包扫描、bundled 扫描和 rollback 都校验官方 trust policy;MacOfficialPluginSignatureVerifier 也按宿主可信策略决定是否要求 publisher package signature,作为额外防御。
  • 新增 PluginPackageStoreTests.officialPublisherPackageCannotDowngradeSignatureRequirement,直接覆盖真实安装路径,并断言在进入 verifier 前拒绝策略降级。
  • 已迁移并更新 shared/platform-feature-matrix/features/php-optional-plugin.json,对应 matrix change gate 已通过。
  • PR 正文中“PluginPackageSignatureTests 被 DebugModuleTests 编译错误阻断”的旧说明已更正;上一版 Plugin CI 已实际通过相关签名单测。

当前 HEAD: 3220df0c7f1d8de1877c024b7bd8970f5f74d28d。
快速门禁中 Verify Agent Notes 与 Verify Platform Feature Matrix 已通过;macOS Plugin CI / macOS CI / Database CI / Windows CI 正在排队或运行。

@xiaoyumuxi
xiaoyumuxi requested a review from Mucheen October 3, 2026 05:31
@1lck
1lck merged commit 34a88e2 into preview Oct 3, 2026
5 checks passed
1lck added a commit that referenced this pull request Oct 3, 2026
* fix(macos): show full-height Markdown outline by default (#1002)

* fix(agent): 统一权限菜单与英文思考强度显示 (#1008)

* Merge pull request #1023 from Mucheen/fix/agent-selector-labels

fix(macos): 收紧 Agent 配置菜单并修复双行说明裁剪

* fix:macOS 项目树支持多选与批量文件操作 (#991)

* fix(macOS): 支持项目树多选与批量文件操作 (#987)

* docs: 记录 #987 macOS 项目树手动验证结果

* docs: 添加 #987 项目树多选手动验证截图

* fix(macOS): 处理 #991 审查意见并补齐项目树批量操作边界

- 批量删除:每项删除前重新检查未保存文档;废纸篓操作期间被改脏的文档保持打开,
  仅关闭未修改的文档;中途失败或被未保存文档阻止时提示剩余项目未移动。
- 快捷键归属:点击项目树后若键盘焦点移到文本框(如全局搜索)或其他控件,
  ⌘A/⌘C/⌘V 交还给当前焦点,不再误复制或粘贴文件。
- Control 点击恢复为 macOS 右键菜单,⌘ 点击负责增减选择;移除为此新增的
  litheContextMenu(capturesControlClick:) 参数。
- 单选高亮跟随活动编辑器文档;去掉 ProjectFileTreeContent 中冗余的可见节点比较。
- 中文“拷贝”与“复制(创建副本)”区分;补齐粘贴校验和批量删除提示的中英文案。
- 新增单元、焦点与应用级集成测试;功能矩阵改回待验证。

* fix(macOS): 项目树快捷键被处理后不再同时传给编辑器

本地事件监听里的 `self?.handle(event) ?? event` 会把表示“已处理”的 nil
展平成原事件,导致 ⌘A/⌘C/⌘V 在项目树处理后仍传给编辑器:⌘A 同时全选编辑器文本,
⌘V 同时把剪贴板文本粘进编辑器。改为直接返回 handle 的结果并补回归测试。

粘贴完成的提示由“已复制文件”改为“已粘贴文件”,避免复制和粘贴各弹一条相同提示。

* fix(macOS): 项目树 ⌘A 按焦点所在目录全选

焦点在展开的子目录内时,⌘A 只选中该目录下的可见项目;焦点在项目顶层时选中项目下全部可见项目(含子目录及其展开内容,不含根行);焦点在根行或无焦点时选中整棵可见树。重复 ⌘A 保持同一范围,并补充同名前缀目录不被误选的测试。

* fix(macOS): 项目树 ⌘A 选中焦点项的同级项目

点击文件夹后按 ⌘A,选中与该文件夹同级的项目,而不是它的内容;焦点在文件上时选中同目录文件;无焦点或焦点在项目行时选中项目顶层项目。同级关系按显示的树结构计算,压缩显示的 Java 包也使用其显示父节点。批量操作会自动包含已选文件夹的内容。

* fix(macOS): 已选文件夹下的展开内容同时显示为选中

文件夹被选中时,其下展开的文件和子目录也显示选中高亮,与批量操作会包含文件夹内容保持一致。这些子项只用于显示,不会重复加入操作集合;在多选组内右键这些子项仍保持整组,单独选中一个文件夹时右键其中的文件则以该文件为目标。

* ci: 重新触发 macOS Plugin CI

上次运行在 960 秒时限内仍在冷编译 LitheTests(Rust 4m39s,正常约 3m),尚未进入测试执行。同一提交的 macOS 主 Swift lane 已通过,本地按相同过滤条件运行 59 项插件测试全部通过。

* fix(macOS): 项目树 Shift/⌘ 点击从鼠标按下事件读取修饰键

SwiftUI Button 的动作在鼠标抬起后才执行,此时 NSApp.currentEvent 已不再是这次点击,
读到的修饰键为空,Shift 点击因此退化成普通单选、范围不生效。

- 新增 ProjectTreeModifiedClick 覆盖在每一行上:只在带 ⌘/Shift 的左键按下时命中,
  直接用该 mouseDown 事件的修饰键更新选择,并且不再传给 Button,因此不会打开文件或折叠目录。
- 普通点击和 Control 点击(右键菜单)都穿透到原有的 Button 和右键捕获视图,行为不变。
- selectRow 改为接收修饰键参数,Button 动作只做普通单选。
- 新增窗口级回归测试,覆盖 Shift 正向/反向范围选择、⌘ 取消选择、修饰点击不触发打开,以及 Control+Shift 不被捕获。

* test(macOS): 项目树修饰点击回归改为经窗口命中测试分发

审查指出原测试直接调用 overlay.mouseDown,绕过 hitTest 和窗口分发,即使
生产 hitTest 恒返回 nil 也会通过。

- 测试改为把合成的鼠标按下/抬起事件交给 NSWindow.sendEvent,由窗口命中测试
  决定交给覆盖层还是底层 Button;覆盖新增普通点击建立锚点、Shift 正反向范围、
  ⌘ 增减选择、修饰点击不触发 Button(不打开文件、不折叠目录)以及 Control
  点击穿透到底层行。
- ProjectTreeModifiedClickView 的当前事件来源改为可替换的 currentEvent,默认仍是
  NSApp.currentEvent。测试进程里经 NSApp 事件队列取出事件会让 swift-testing 的
  主队列提前退出,后续测试不再执行,所以测试只替换这一处查询。
- 反向验证:hitTest 恒返回 nil、或捕获 Control 点击时,新测试均失败。

* fix(macOS): 批量文件操作在整批结束前持有操作锁

处理 #991 审查的 P2/P3:

- 批量创建副本和批量移到废纸篓原来逐项调用单项入口,每项结束后都会先释放
  isPerformingProjectItemOperation 再 await 刷新。刷新期间用户可以启动别的文件操作,
  原批次的后续项随后被入口守卫静默跳过。现在由外层批次持有操作锁直到整批结束,
  内层拆成不自行加锁、不刷新的单项实现,整批完成后只刷新一次。
- 单项粘贴和单项删除仍通过同一实现,行为不变。
- 中文“Copied files”改为“已拷贝文件”,与菜单“拷贝”一致。
- 新增回归:第一组复制暂停时操作锁保持占用、插入的粘贴被拒绝,批量复制和
  批量删除各只在最后一项完成后刷新一次。恢复旧实现时该测试失败。

---------

Co-authored-by: Lichenkang <2188718831@qq.com>

* fix(agent): 修复 Claude 鉴权、会话切换和品牌图标 (#1007)

* fix(agent): 修复 Claude 鉴权、会话切换和品牌图标

通过 Claude 适配器公开会话参数传递 API Key 路由,同时覆盖新建与历史恢复,清除冲突鉴权并保留 Codex gateway 行为。
直接观察所选 Agent 连接,等待会话设置确认后展示模型,防止旧配置闪现及准备期间提交。
统一底栏、模型入口与 Agent 菜单品牌图标,保留原生单选勾选,并补充回归、共享契约、Agent Note 与功能矩阵。

* test(git): bound graph frame sampling to visible viewports

修复 PR #1007 CI:原用例重复绘制完整 1000 行历史,CI 耗时 11.791 秒超过未调整的 10 秒上限。改为开头、中段、末段 40 行视口采样,校验实际像素,保留完整结构、单帧预算与 Release 基线;同步 CI 文档和中文工程笔记。

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全 (#1016)

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全

共享 Host 原本就透传 ACP SessionUpdate,但 macOS 只处理消息、工具、
标题、配置和用量,其余更新被丢弃。本次补齐四类标准更新:

- agent_thought_chunk:独立的可折叠思考块,流式输出时展开、回复或
  工具到达后收起;缓冲按角色切分,思考与回复不再混在一起;导出
  Markdown 以引用块保留,历史消息数不计思考
- plan:计划栏固定在活动统计栏上方,显示进度与当前步骤;每次整体
  替换,空计划清除
- available_commands_update:输入 / 弹出 Agent 上报的命令补全,前缀
  优先;Codex 的 $Skill 补全为 $name(codex-acp 不解析 /$name),
  输入 $ 只列 Skill;macOS 14+ 支持方向键与 Tab
- current_mode_update:Agent 自行切换模式时同步权限模式选择器

另外把模型层的兜底文案、stopReason 提示和工具证据标题改为本地化,
补齐 zh-Hans 翻译。

fixture 新增四类事件样例并加入 Rust 往返测试;更新功能矩阵与
shared-acp Agent Note。真实 Agent 已在协议层确认 Codex/Claude 会上报
命令列表、Claude 会上报思考,界面层验证仍待完成。

* fix(agent): 修复命令补全布局和思考搜索展开

为输入区保留可编辑行,空间不足时在对话布局中显示可点击的命令浮层。搜索临时展开匹配思考块,清空后恢复手动选择。补充三项回归测试并同步功能矩阵与架构笔记。

* fix(ci): release Windows Bun install process trees before retry

---------

Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>

* feat(windows): 活动栏/标题栏/Run 面板图标替换为 IDEA 图标,并对齐 Commit 面板与共用控件 (#1025)

* feat(windows): 共用 UI 组件补齐 IDEA 风格交互基础能力

- 滚动条:修复 ScrollArea 滑块带 flex-1 被拉满整条轨道的问题,改由
  Base UI 按可视比例计算滑块长度(全局所有滚动区域受益)
- 触控板:ScrollArea 的滚轮转发支持横向滑动,仅横向可滚动的容器才
  处理,纵向列表行为不变
- 树行 SidebarTreeRow:
  - 新增 leadingAction 左侧操作位(位于展开箭头之后、图标之前),
    渲染在行按钮外并按缩进定位,避免按钮嵌套交互元素
  - 新增 variant="idea":16px 细线 chevron(IDEA expui 路径、
    tree-chevron 颜色、悬停不变色),箭头/复选框/图标/文字 4px 间距,
    图标与文字垂直居中
  - 文字区增加 data-sidebar-tree-label 供横向滚动测量
- 复选框:支持 indeterminate 半选状态,显示短横
- 拖动会话 document-resize-session:新增 axis: "y",可驱动纵向高度
- 新增对应单测(横向滑动、纵向拖动)

* feat(windows): 默认主题 Git 状态配色与表单控件 token 对齐 IDEA

配色取自 intellij-community expUI 明暗配色方案(FILESTATUS_* 与 *_LINES_COLOR):
- modified / renamed:#0033B3 / #70AEFF;暂存修改为浅蓝派生 #2652BE / #85BAFF
- added:#067D17 / #73BD79;untracked:#B23247 / #E88F89
- 新增可选 token git-file-deleted(删除文件灰 #6C707E / #6F737A);
  git-deleted 仍为红色,继续用于 diff 删除行与 -N 计数
- 新增可选 token git-gutter-added/modified/deleted,编辑器 gutter 使用
  IDEA 浅色行标记(#7FC784/#88ADF7/#767A8A,暗色 #549159/#375FAD/#868A91)
- 变更列表、提交文件树、文件树的状态颜色统一走 git-* token,
  不再使用 text-info / 灰色 / 红色临时映射
- 新增 IDEA 表单控件 token:control-border、checkbox-border、
  checkbox-background、tree-chevron
- 以上新 token 在其他主题中未定义时,均回退到原有颜色
- rebase / patch / 历史改写对话框的警告文案与操作横幅由误用的
  text-git-modified 改回 text-warning,避免随 modified 变蓝

* feat(windows): Commit 面板对齐 IntelliJ(提交区、变更列表、Amend 与视图选项)

面板与入口
- 侧栏 git 入口与面板标题由 Changes / Source Control 更名为 Commit(提交),
  图标换为 IntelliJ commit 图标;中英文案、tooltip、aria 同步
- 移除面板内 Changes / History 标签栏与 git-commit-history 组件,提交历史
  统一通过底部 Git Log 工具窗浏览;命令面板去掉 "Git: Show History"
- 清理仅服务于标签的设置 rememberLastGitPanelMode / gitLastPanelMode /
  gitSidebarTabOrder,并加入 RETIRED_SETTINGS_KEYS 清理升级用户的残留键
- Git 数据控制器不再读取 `git log --all`;"与提交比较"选择器打开时才按需
  加载最近 50 条提交

提交区(对齐 NonModalCommitPanel / CommitInputBorder / CommitLegendComponent)
- 布局:顶部左侧 Amend、右侧已选文件图例(N 添加 / N 修改 / N 删除,未跟踪
  计入添加并显示为“新增+未跟踪”,重命名计入修改,按状态着色);中间提交
  说明框;底部 Commit 与 Commit and Push... 线框按钮,右侧推送/拉取计数、
  AI 与设置
- 与变更列表之间只有一条分割线、无外框;拖动分割线或聚焦后按上/下方向键
  调整说明框高度(变更列表至少 96px,说明框最小 48px),松手后持久化
- 说明框:占位文字 "Commit Message / 提交说明";4px 圆角、1px 控件边框,
  聚焦 2px 强调色,出错时错误色
- 按钮不再因未选文件或说明为空而置灰;点击后按 IntelliJ CommitProgressPanel
  文案提示(请选择要提交的文件 / 请填写提交说明 / 二者合并),修正后消失;
  焦点在提交区内时 Commit 变为蓝色默认按钮
- Amend:勾选时读取当前 HEAD 的完整说明(标题 + 正文,新增
  getHeadCommitMessage,不再取 `git log --all` 列表首条);空草稿自动载入、
  不覆盖已输入内容、取消勾选且未编辑时恢复原草稿;HEAD 无提交时提示;
  Amend 模式下主按钮显示 Amend Commit,Commit and Push... 禁用(修正后
  需要强制推送),多仓库确认对话框按钮同步

变更列表
- 分组改为 IntelliJ 的 "Changes / 更改" 与 "Unversioned Files / 未版本控制
  的文件" 两个可展开树节点,节点名后显示灰色 "N 个文件"
- 文件、文件夹、分组节点的包含复选框移到左侧(箭头之后、图标之前),
  IDEA 新 UI 样式,分组与文件夹支持三态;文件夹名后紧跟灰色文件数
- 去掉文件行末尾的暂存 +/- 按钮及其工具代码
- 长文件名不截断,改为横向滚动:按文字真实小数宽度判断截断并留 1px 余量,
  面板从隐藏切回显示、侧栏改宽或字体加载完成后重新测量;状态刷新不再重置宽度
- 参考 IntelliJ ExpandableItemsHandler:名称超出可视右边缘时,悬停该行在
  行上方弹出完整名称(含文件数或目录),移开、滚动或点击即消失
- 工具栏新增 View Options(眼睛图标),菜单直接列出 "Directory / 目录" 与
  "Flat List / 平铺显示" 并勾选当前项,两次点击切换

其他
- 新增/更新单测:提交面板 Amend 与提示、拖动高度、分组节点与三态、复选框
  位置、行宽测量、悬停提示判断、视图选项切换、数据控制器不读取历史
- 更新 platform-feature-matrix 的 git-status-commit、git-history 行,新增
  git-status-colors-idea-alignment 行,并重新生成视图

* feat(windows): 活动栏、标题栏菜单与 Run 面板图标替换为 IDEA 图标

- 活动栏 Project / Git Log / Terminal / Run / Diagnostics 改用 IntelliJ expui toolwindows 图标
  (project、vcs、terminal、run、problems),亮色与暗色各一套
- 标题栏紧凑菜单开关新增 MenuIcon(expui/general/menu),不影响其他使用 ListIcon 的位置
- 新增 RunToolWindowIcon / ProblemsToolWindowIcon,避免改动全局 25 处使用的 WarningIcon
- Run 面板标题、空状态与命令面板统一使用 RunToolWindowIcon,移除自绘 RunIcon
- generate-idea-icons.ts 支持映射项 destination 字段,用于终端图标这类
  位于 platform/icons/src 之外(Jewel showcase 资源)的素材
- 更新 icons.test.tsx 的导出数量与双色渲染断言

* test(windows): svg-editor 测试结束后还原 locale-provider mock

bun 的 mock.module 在同一进程内会泄漏到后续测试文件。svg-editor.test.tsx
把 @/i18n/locale-provider 替换成只含 useTranslation 的桩且不还原,导致全量运行时
Commit 面板等依赖真实 LocaleProvider 的测试拿到桩而失败。

在安装 happy-dom 之前保存真实模块,并在 afterAll 中还原。buffer.store 的 mock
无法同样处理(导入真实模块会触发 Tauri 窗口 API),保持不变。

* fix(windows): Amend 按实际暂存仓库读取 HEAD,提交说明分隔条从显示高度起算

- Amend 目标由有暂存文件的仓库决定,而不是活动仓库:单仓库参与时读取该仓库的 HEAD,
  多仓库同时有暂存文件时禁用 Amend 并给出提示;目标仓库变化时撤销已加载的说明,
  并在说明未被修改时恢复原草稿
- 提交说明编辑框最多显示视口的 60%,拖动与方向键调整改为从实际显示高度开始,
  渲染与交互共用同一上限常量
- 补充 A 活动 / B 暂存、活动仓库无 HEAD、多仓库禁用、目标变化,以及窗口缩小后
  拖动与键盘调整的回归测试

* fix(git): Amend 绑定到明确的仓库与 HEAD,由 Core 拒绝多仓库改写

Core 建立提交计划时会重新读取所有仓库的暂存状态,而界面只基于缓存的状态读取
并展示了某一个仓库的提交说明。若读取之后又有别的仓库被暂存(例如外部终端,
且关闭了自动刷新),一个全局 amend 会让两个仓库共用同一条说明并同时被改写。

- Core: amend 时有暂存更改的仓库最多一个,否则 invalid_request 且不写入
- Core: 新增可选 amendTarget{repositoryId, expectedHead},拒绝未知目标、
  不一致的暂存仓库以及 HEAD 已移动(新提交或切分支)的请求;重试时目标
  已提交则跳过 HEAD 检查
- Core: 约束只在 prepare 校验,不写入 Plan,避免 macOS 的计划模型丢弃未知
  字段后 amend 悄悄变成普通提交;validate_session 兜底拒绝涉及多个暂存仓库的
  amend 续接。缺省 amendTarget 时保持单仓库下限,macOS 无需改动
- Windows: getHeadCommitMessage 同时返回 HEAD hash;面板记录读取说明的仓库与
  hash,提交与重试时转换为仓库标识发送,无法确认时提示重新加载
- 补充 Rust 单元与真实 Git 集成回归、前端面板与 API 测试
- 更新 rust-core-api 契约与工作区提交 Agent Note

* fix(git): 重试沿用计划记录的 Amend 仓库,父仓库不再被误改写

子仓库 Amend 成功而父仓库提交被钩子拒绝后,父仓库已暂存了新的子模块引用。
重试时 Core 根据当前暂存区重新推断 Amend 目标,会把它当作唯一的暂存仓库并
改写其原 HEAD,用户确认的“新增父引用提交”变成了历史改写。

- Core: Plan 新增 amendRepositoryId,首次建立计划时确定;step 只 Amend 该
  仓库,其余仓库(含只记录子模块引用的父仓库)做普通提交
- Core: 重试沿用 previous.plan 记录的仓库,指定不同 amendTarget 时拒绝;
  validate_session 拒绝指向未知仓库或非 Amend 计划的续接
- Core: 字段缺失(丢弃未知字段的客户端)时退回按暂存路径判断并限制为一个仓库,
  行为与此前一致
- Windows: 重试不再根据组件 ref 推断目标,直接交还上一次计划
- 补充真实 Git 回归(子 Amend 成功、父钩子失败、恢复后重试)及单元、前端测试
- 更新 rust-core-api 契约与工作区提交 Agent Note

* revert(windows): 移除 Commit 面板的 Amend 功能

Amend 在多仓库工作区里需要把“每个仓库的提交意图”做成 Swift 与 Rust 共享的
模型,当前 PR 内无法在 macOS 缺少构建验证的情况下安全完成,且反复引入回归。
本次先移除,Windows 提交面板恢复为只做普通提交。

- Windows: 删除 Amend 复选框、HEAD 说明读取、目标仓库推断、重试目标处理,
  以及确认框的 Amend Commit 文案和相关 i18n 键
- Core: workspace_commit 及其测试、共享契约与 Agent Note 还原为与 preview 一致,
  macOS 的 amend 布尔字段保持不变,Swift 无需改动
- 测试: 删除全部 Amend 用例,新增“提交始终为普通提交且不显示 Amend”断言
- 矩阵: 去掉功能说明中的 Amend 描述并重新生成
- 保留与 Amend 无关的修复:提交说明分隔条按实际显示高度调整、图标替换、
  svg-editor 测试的 locale mock 还原

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全 (#1016)

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全

共享 Host 原本就透传 ACP SessionUpdate,但 macOS 只处理消息、工具、
标题、配置和用量,其余更新被丢弃。本次补齐四类标准更新:

- agent_thought_chunk:独立的可折叠思考块,流式输出时展开、回复或
  工具到达后收起;缓冲按角色切分,思考与回复不再混在一起;导出
  Markdown 以引用块保留,历史消息数不计思考
- plan:计划栏固定在活动统计栏上方,显示进度与当前步骤;每次整体
  替换,空计划清除
- available_commands_update:输入 / 弹出 Agent 上报的命令补全,前缀
  优先;Codex 的 $Skill 补全为 $name(codex-acp 不解析 /$name),
  输入 $ 只列 Skill;macOS 14+ 支持方向键与 Tab
- current_mode_update:Agent 自行切换模式时同步权限模式选择器

另外把模型层的兜底文案、stopReason 提示和工具证据标题改为本地化,
补齐 zh-Hans 翻译。

fixture 新增四类事件样例并加入 Rust 往返测试;更新功能矩阵与
shared-acp Agent Note。真实 Agent 已在协议层确认 Codex/Claude 会上报
命令列表、Claude 会上报思考,界面层验证仍待完成。

* fix(agent): 修复命令补全布局和思考搜索展开

为输入区保留可编辑行,空间不足时在对话布局中显示可点击的命令浮层。搜索临时展开匹配思考块,清空后恢复手动选择。补充三项回归测试并同步功能矩阵与架构笔记。

* fix(ci): release Windows Bun install process trees before retry

---------

Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>

---------

Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
Co-authored-by: lick <2188718831@qq.com>

* refactor(matrix): split capability records and generate views in CI (#1026)

* Merge pull request #1029 from 1lck/fix/macos-release-reliability

fix(release): 修复 macOS 发布超时与 Sparkle 基线下载重试

* Merge pull request #1004 from 1lck/codex/plugin-package-signing

feat(macos): 修复 PHP 插件下载逻辑问题——Part1

---------

Co-authored-by: Xiaoyumuxi <3075514079@qq.com>
Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: Lichenkang <2188718831@qq.com>
Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
Co-authored-by: 若水 <frankw.wang@qq.com>
1lck added a commit that referenced this pull request Oct 3, 2026
* feat(windows): add explorer Git context menu for diff, add and commit (#975)

Add an IDEA-style Git submenu to the project file tree context menu on
Windows, reusing the existing git-diff/git-status API layer without any
new Tauri commands:

- Files with Git changes get a Git submenu: Show Diff opens the file's
  working-tree (or staged) diff buffer, Add stages the file, and Commit
  File… stages it and focuses the Source Control commit panel.
- Directories inside a repository get Show Diff, which routes to the
  owning repository's changes panel.
- Menu visibility is driven by the file's real Git status via async
  repository discovery (nested repositories supported); clean files show
  no Git entries.
- Pure menu capability/builder logic lives in
  file-context-menu-git-file-items.ts with unit tests.
- Adds the git-explorer-context-actions platform feature matrix entry
  (Windows implemented / macOS partial) and an implemented agent note.

* test(windows): cover explorer Git context menu wiring contracts (#975)

Extract the context menu wiring invariants into the lib and pin them
with unit tests:

- hasGitDiffContent guards the empty-diff fallback chain.
- buildGitFileDiffBuffer pins the diff://<staged|unstaged>/<encoded>
  virtual buffer contract shared with use-git-diff-data.ts; changing
  either side would silently break stage/unstage inside the diff view.
- findGitStatusFileForPath covers status entry matching, including
  repositoryRelativePath preference over decorated paths and Windows
  separator normalization.
- isVirtualWorkspacePath keeps remote/wsl/diff paths Git-free.

The hook now consumes these helpers instead of local duplicates.
19 tests total, up from 8.

* docs(notes): 精简 Windows 文件树 Git 右键菜单笔记 (#975)

* fix(windows): dev 文件监视器忽略 Rust target 目录

tauri dev 启动时 vite watcher 会监视 src-tauri/target 下的构建产物,
与 cargo 并发写入在 Windows 上触发 EBUSY 使 watcher 崩溃、拽死 beforeDevCommand。
为 server.watch 增加 **/target/** 忽略,与 test.exclude 的既有排除意图一致。

* fix(windows): 文件树 Git 菜单改用幂等打开源代码管理面板 (#975)

按 PR #989 review 意见:Commit File… 与目录"显示差异"原先调用
toggleSourceControlSidebar(),在 Git 面板已打开的场景会把它反向关闭。
改为直接 setIsSidebarVisible(true) + setActiveView("git") 的幂等打开,
顺序为先 visible 后 view,保证工作区会话快照记录打开状态。
快捷键 Ctrl+Shift+G 的 toggle 语义不受影响。

* fix(windows): Git 菜单动作更名为暂存并打开提交以对齐语义 (#975)

按 PR #989 review 意见①(方案 B):提交面板提交的是当前暂存区全部
内容,无法保证只提交右键的单个文件,故菜单动作由 Commit File…
更名为 Stage and Open Commit…(暂存并打开提交…),行为零改动。
同步修正原注释中"暂存区即只含此文件"的不实表述,并更新功能矩阵
条目与 Agent Note 的措辞。

* fix(windows): Show Diff 改用携带仓库身份的 workingTreeTargets 缓冲 (#975)

按 PR #989 review 意见③:原实现的 diff://staged|unstaged/<相对路径>
buffer 不携带所属仓库,后续刷新/切换会误用工作区根目录,嵌套/多
仓库场景可能读错仓库。改用与 Git 面板单文件 diff 一致的
createSingleFileWorkingTreeDiff 载荷(workingTreeTargets 显式携带
repoPath),刷新按 target.repoPath 重读。取数与 staged 回退链不变,
仅替换打开段;lib 中 buildGitFileDiffBuffer 由
buildWorkingTreeDiffTarget 取代,测试同步 20 个。

* feat(macos): 文件树右键新增 Git 菜单(Add / Stage and Open Commit…)(#975)

按 reviewer 邀请对齐 Windows 端实现,只新增不改既有:
- GitFileContextMenuPlan 纯逻辑判定可见性(无变更不显示;已暂存或
  canToggleStaging=false 隐藏 Add),附 swift-testing 单测 5 例;
- ProjectTreeActions 追加 stageChange / stageAndOpenCommit(复用
  setStaging 与 selectedSidebar=.changes 既有 API);
- fileContextMenuItems 追加 Git 子菜单(Add / Stage and Open Commit…),
  Show Diff 复用既有独立菜单项不重复;目录端已有 Show Git Diff 不动。
矩阵 git-explorer-context-actions 的 macos 由 partial 更新为
implemented(verification 保持 pending,待 macOS CI 与实机验证)。

* feat(windows): add Git gutter with inline diff peek for editor (#1018)

Adds visual Git change markers in the editor gutter with click-to-peek inline diff viewer for Windows.

**New components:**
- GitGutterController: manages gutter decorations, peek widget lifecycle, and Monaco integration
- GitGutterPeekWidget: inline diff viewer with prev/next navigation, displays HEAD vs working tree
- git-gutter-changes: computes line-level diff markers (added/modified/deleted) from Git status and file diff
- use-git-gutter-base: React hook providing gutter data and navigation actions

**Settings:**
- New toggle "git.showGutterChanges" (default true) in Git Settings panel
- Search index updated for "gutter" and "inline diff" keywords

**Behavior:**
- Green bar: added lines; Blue bar: modified lines; Red triangle: deleted lines
- Click marker opens inline diff at that change
- Up/Down arrows navigate between changes
- Widget closes on Escape, editor blur, or file change
- Peek models disposed on widget close to prevent leaks

**Not included (for follow-up):**
- Revert/stage actions in peek widget (depends on PR #1015 merge)
- macOS implementation (Windows-only for now)

Refs #681

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs: update README WeChat group QR code (#1020)

* fix(agent): 统一权限菜单与英文思考强度显示 (#1008)

* Merge pull request #1023 from Mucheen/fix/agent-selector-labels

fix(macos): 收紧 Agent 配置菜单并修复双行说明裁剪

* fix:macOS 项目树支持多选与批量文件操作 (#991)

* fix(macOS): 支持项目树多选与批量文件操作 (#987)

* docs: 记录 #987 macOS 项目树手动验证结果

* docs: 添加 #987 项目树多选手动验证截图

* fix(macOS): 处理 #991 审查意见并补齐项目树批量操作边界

- 批量删除:每项删除前重新检查未保存文档;废纸篓操作期间被改脏的文档保持打开,
  仅关闭未修改的文档;中途失败或被未保存文档阻止时提示剩余项目未移动。
- 快捷键归属:点击项目树后若键盘焦点移到文本框(如全局搜索)或其他控件,
  ⌘A/⌘C/⌘V 交还给当前焦点,不再误复制或粘贴文件。
- Control 点击恢复为 macOS 右键菜单,⌘ 点击负责增减选择;移除为此新增的
  litheContextMenu(capturesControlClick:) 参数。
- 单选高亮跟随活动编辑器文档;去掉 ProjectFileTreeContent 中冗余的可见节点比较。
- 中文“拷贝”与“复制(创建副本)”区分;补齐粘贴校验和批量删除提示的中英文案。
- 新增单元、焦点与应用级集成测试;功能矩阵改回待验证。

* fix(macOS): 项目树快捷键被处理后不再同时传给编辑器

本地事件监听里的 `self?.handle(event) ?? event` 会把表示“已处理”的 nil
展平成原事件,导致 ⌘A/⌘C/⌘V 在项目树处理后仍传给编辑器:⌘A 同时全选编辑器文本,
⌘V 同时把剪贴板文本粘进编辑器。改为直接返回 handle 的结果并补回归测试。

粘贴完成的提示由“已复制文件”改为“已粘贴文件”,避免复制和粘贴各弹一条相同提示。

* fix(macOS): 项目树 ⌘A 按焦点所在目录全选

焦点在展开的子目录内时,⌘A 只选中该目录下的可见项目;焦点在项目顶层时选中项目下全部可见项目(含子目录及其展开内容,不含根行);焦点在根行或无焦点时选中整棵可见树。重复 ⌘A 保持同一范围,并补充同名前缀目录不被误选的测试。

* fix(macOS): 项目树 ⌘A 选中焦点项的同级项目

点击文件夹后按 ⌘A,选中与该文件夹同级的项目,而不是它的内容;焦点在文件上时选中同目录文件;无焦点或焦点在项目行时选中项目顶层项目。同级关系按显示的树结构计算,压缩显示的 Java 包也使用其显示父节点。批量操作会自动包含已选文件夹的内容。

* fix(macOS): 已选文件夹下的展开内容同时显示为选中

文件夹被选中时,其下展开的文件和子目录也显示选中高亮,与批量操作会包含文件夹内容保持一致。这些子项只用于显示,不会重复加入操作集合;在多选组内右键这些子项仍保持整组,单独选中一个文件夹时右键其中的文件则以该文件为目标。

* ci: 重新触发 macOS Plugin CI

上次运行在 960 秒时限内仍在冷编译 LitheTests(Rust 4m39s,正常约 3m),尚未进入测试执行。同一提交的 macOS 主 Swift lane 已通过,本地按相同过滤条件运行 59 项插件测试全部通过。

* fix(macOS): 项目树 Shift/⌘ 点击从鼠标按下事件读取修饰键

SwiftUI Button 的动作在鼠标抬起后才执行,此时 NSApp.currentEvent 已不再是这次点击,
读到的修饰键为空,Shift 点击因此退化成普通单选、范围不生效。

- 新增 ProjectTreeModifiedClick 覆盖在每一行上:只在带 ⌘/Shift 的左键按下时命中,
  直接用该 mouseDown 事件的修饰键更新选择,并且不再传给 Button,因此不会打开文件或折叠目录。
- 普通点击和 Control 点击(右键菜单)都穿透到原有的 Button 和右键捕获视图,行为不变。
- selectRow 改为接收修饰键参数,Button 动作只做普通单选。
- 新增窗口级回归测试,覆盖 Shift 正向/反向范围选择、⌘ 取消选择、修饰点击不触发打开,以及 Control+Shift 不被捕获。

* test(macOS): 项目树修饰点击回归改为经窗口命中测试分发

审查指出原测试直接调用 overlay.mouseDown,绕过 hitTest 和窗口分发,即使
生产 hitTest 恒返回 nil 也会通过。

- 测试改为把合成的鼠标按下/抬起事件交给 NSWindow.sendEvent,由窗口命中测试
  决定交给覆盖层还是底层 Button;覆盖新增普通点击建立锚点、Shift 正反向范围、
  ⌘ 增减选择、修饰点击不触发 Button(不打开文件、不折叠目录)以及 Control
  点击穿透到底层行。
- ProjectTreeModifiedClickView 的当前事件来源改为可替换的 currentEvent,默认仍是
  NSApp.currentEvent。测试进程里经 NSApp 事件队列取出事件会让 swift-testing 的
  主队列提前退出,后续测试不再执行,所以测试只替换这一处查询。
- 反向验证:hitTest 恒返回 nil、或捕获 Control 点击时,新测试均失败。

* fix(macOS): 批量文件操作在整批结束前持有操作锁

处理 #991 审查的 P2/P3:

- 批量创建副本和批量移到废纸篓原来逐项调用单项入口,每项结束后都会先释放
  isPerformingProjectItemOperation 再 await 刷新。刷新期间用户可以启动别的文件操作,
  原批次的后续项随后被入口守卫静默跳过。现在由外层批次持有操作锁直到整批结束,
  内层拆成不自行加锁、不刷新的单项实现,整批完成后只刷新一次。
- 单项粘贴和单项删除仍通过同一实现,行为不变。
- 中文“Copied files”改为“已拷贝文件”,与菜单“拷贝”一致。
- 新增回归:第一组复制暂停时操作锁保持占用、插入的粘贴被拒绝,批量复制和
  批量删除各只在最后一项完成后刷新一次。恢复旧实现时该测试失败。

---------

Co-authored-by: Lichenkang <2188718831@qq.com>

* fix(agent): 修复 Claude 鉴权、会话切换和品牌图标 (#1007)

* fix(agent): 修复 Claude 鉴权、会话切换和品牌图标

通过 Claude 适配器公开会话参数传递 API Key 路由,同时覆盖新建与历史恢复,清除冲突鉴权并保留 Codex gateway 行为。
直接观察所选 Agent 连接,等待会话设置确认后展示模型,防止旧配置闪现及准备期间提交。
统一底栏、模型入口与 Agent 菜单品牌图标,保留原生单选勾选,并补充回归、共享契约、Agent Note 与功能矩阵。

* test(git): bound graph frame sampling to visible viewports

修复 PR #1007 CI:原用例重复绘制完整 1000 行历史,CI 耗时 11.791 秒超过未调整的 10 秒上限。改为开头、中段、末段 40 行视口采样,校验实际像素,保留完整结构、单帧预算与 Release 基线;同步 CI 文档和中文工程笔记。

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全 (#1016)

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全

共享 Host 原本就透传 ACP SessionUpdate,但 macOS 只处理消息、工具、
标题、配置和用量,其余更新被丢弃。本次补齐四类标准更新:

- agent_thought_chunk:独立的可折叠思考块,流式输出时展开、回复或
  工具到达后收起;缓冲按角色切分,思考与回复不再混在一起;导出
  Markdown 以引用块保留,历史消息数不计思考
- plan:计划栏固定在活动统计栏上方,显示进度与当前步骤;每次整体
  替换,空计划清除
- available_commands_update:输入 / 弹出 Agent 上报的命令补全,前缀
  优先;Codex 的 $Skill 补全为 $name(codex-acp 不解析 /$name),
  输入 $ 只列 Skill;macOS 14+ 支持方向键与 Tab
- current_mode_update:Agent 自行切换模式时同步权限模式选择器

另外把模型层的兜底文案、stopReason 提示和工具证据标题改为本地化,
补齐 zh-Hans 翻译。

fixture 新增四类事件样例并加入 Rust 往返测试;更新功能矩阵与
shared-acp Agent Note。真实 Agent 已在协议层确认 Codex/Claude 会上报
命令列表、Claude 会上报思考,界面层验证仍待完成。

* fix(agent): 修复命令补全布局和思考搜索展开

为输入区保留可编辑行,空间不足时在对话布局中显示可点击的命令浮层。搜索临时展开匹配思考块,清空后恢复手动选择。补充三项回归测试并同步功能矩阵与架构笔记。

* fix(ci): release Windows Bun install process trees before retry

---------

Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>

* feat(windows): 活动栏/标题栏/Run 面板图标替换为 IDEA 图标,并对齐 Commit 面板与共用控件 (#1025)

* feat(windows): 共用 UI 组件补齐 IDEA 风格交互基础能力

- 滚动条:修复 ScrollArea 滑块带 flex-1 被拉满整条轨道的问题,改由
  Base UI 按可视比例计算滑块长度(全局所有滚动区域受益)
- 触控板:ScrollArea 的滚轮转发支持横向滑动,仅横向可滚动的容器才
  处理,纵向列表行为不变
- 树行 SidebarTreeRow:
  - 新增 leadingAction 左侧操作位(位于展开箭头之后、图标之前),
    渲染在行按钮外并按缩进定位,避免按钮嵌套交互元素
  - 新增 variant="idea":16px 细线 chevron(IDEA expui 路径、
    tree-chevron 颜色、悬停不变色),箭头/复选框/图标/文字 4px 间距,
    图标与文字垂直居中
  - 文字区增加 data-sidebar-tree-label 供横向滚动测量
- 复选框:支持 indeterminate 半选状态,显示短横
- 拖动会话 document-resize-session:新增 axis: "y",可驱动纵向高度
- 新增对应单测(横向滑动、纵向拖动)

* feat(windows): 默认主题 Git 状态配色与表单控件 token 对齐 IDEA

配色取自 intellij-community expUI 明暗配色方案(FILESTATUS_* 与 *_LINES_COLOR):
- modified / renamed:#0033B3 / #70AEFF;暂存修改为浅蓝派生 #2652BE / #85BAFF
- added:#067D17 / #73BD79;untracked:#B23247 / #E88F89
- 新增可选 token git-file-deleted(删除文件灰 #6C707E / #6F737A);
  git-deleted 仍为红色,继续用于 diff 删除行与 -N 计数
- 新增可选 token git-gutter-added/modified/deleted,编辑器 gutter 使用
  IDEA 浅色行标记(#7FC784/#88ADF7/#767A8A,暗色 #549159/#375FAD/#868A91)
- 变更列表、提交文件树、文件树的状态颜色统一走 git-* token,
  不再使用 text-info / 灰色 / 红色临时映射
- 新增 IDEA 表单控件 token:control-border、checkbox-border、
  checkbox-background、tree-chevron
- 以上新 token 在其他主题中未定义时,均回退到原有颜色
- rebase / patch / 历史改写对话框的警告文案与操作横幅由误用的
  text-git-modified 改回 text-warning,避免随 modified 变蓝

* feat(windows): Commit 面板对齐 IntelliJ(提交区、变更列表、Amend 与视图选项)

面板与入口
- 侧栏 git 入口与面板标题由 Changes / Source Control 更名为 Commit(提交),
  图标换为 IntelliJ commit 图标;中英文案、tooltip、aria 同步
- 移除面板内 Changes / History 标签栏与 git-commit-history 组件,提交历史
  统一通过底部 Git Log 工具窗浏览;命令面板去掉 "Git: Show History"
- 清理仅服务于标签的设置 rememberLastGitPanelMode / gitLastPanelMode /
  gitSidebarTabOrder,并加入 RETIRED_SETTINGS_KEYS 清理升级用户的残留键
- Git 数据控制器不再读取 `git log --all`;"与提交比较"选择器打开时才按需
  加载最近 50 条提交

提交区(对齐 NonModalCommitPanel / CommitInputBorder / CommitLegendComponent)
- 布局:顶部左侧 Amend、右侧已选文件图例(N 添加 / N 修改 / N 删除,未跟踪
  计入添加并显示为“新增+未跟踪”,重命名计入修改,按状态着色);中间提交
  说明框;底部 Commit 与 Commit and Push... 线框按钮,右侧推送/拉取计数、
  AI 与设置
- 与变更列表之间只有一条分割线、无外框;拖动分割线或聚焦后按上/下方向键
  调整说明框高度(变更列表至少 96px,说明框最小 48px),松手后持久化
- 说明框:占位文字 "Commit Message / 提交说明";4px 圆角、1px 控件边框,
  聚焦 2px 强调色,出错时错误色
- 按钮不再因未选文件或说明为空而置灰;点击后按 IntelliJ CommitProgressPanel
  文案提示(请选择要提交的文件 / 请填写提交说明 / 二者合并),修正后消失;
  焦点在提交区内时 Commit 变为蓝色默认按钮
- Amend:勾选时读取当前 HEAD 的完整说明(标题 + 正文,新增
  getHeadCommitMessage,不再取 `git log --all` 列表首条);空草稿自动载入、
  不覆盖已输入内容、取消勾选且未编辑时恢复原草稿;HEAD 无提交时提示;
  Amend 模式下主按钮显示 Amend Commit,Commit and Push... 禁用(修正后
  需要强制推送),多仓库确认对话框按钮同步

变更列表
- 分组改为 IntelliJ 的 "Changes / 更改" 与 "Unversioned Files / 未版本控制
  的文件" 两个可展开树节点,节点名后显示灰色 "N 个文件"
- 文件、文件夹、分组节点的包含复选框移到左侧(箭头之后、图标之前),
  IDEA 新 UI 样式,分组与文件夹支持三态;文件夹名后紧跟灰色文件数
- 去掉文件行末尾的暂存 +/- 按钮及其工具代码
- 长文件名不截断,改为横向滚动:按文字真实小数宽度判断截断并留 1px 余量,
  面板从隐藏切回显示、侧栏改宽或字体加载完成后重新测量;状态刷新不再重置宽度
- 参考 IntelliJ ExpandableItemsHandler:名称超出可视右边缘时,悬停该行在
  行上方弹出完整名称(含文件数或目录),移开、滚动或点击即消失
- 工具栏新增 View Options(眼睛图标),菜单直接列出 "Directory / 目录" 与
  "Flat List / 平铺显示" 并勾选当前项,两次点击切换

其他
- 新增/更新单测:提交面板 Amend 与提示、拖动高度、分组节点与三态、复选框
  位置、行宽测量、悬停提示判断、视图选项切换、数据控制器不读取历史
- 更新 platform-feature-matrix 的 git-status-commit、git-history 行,新增
  git-status-colors-idea-alignment 行,并重新生成视图

* feat(windows): 活动栏、标题栏菜单与 Run 面板图标替换为 IDEA 图标

- 活动栏 Project / Git Log / Terminal / Run / Diagnostics 改用 IntelliJ expui toolwindows 图标
  (project、vcs、terminal、run、problems),亮色与暗色各一套
- 标题栏紧凑菜单开关新增 MenuIcon(expui/general/menu),不影响其他使用 ListIcon 的位置
- 新增 RunToolWindowIcon / ProblemsToolWindowIcon,避免改动全局 25 处使用的 WarningIcon
- Run 面板标题、空状态与命令面板统一使用 RunToolWindowIcon,移除自绘 RunIcon
- generate-idea-icons.ts 支持映射项 destination 字段,用于终端图标这类
  位于 platform/icons/src 之外(Jewel showcase 资源)的素材
- 更新 icons.test.tsx 的导出数量与双色渲染断言

* test(windows): svg-editor 测试结束后还原 locale-provider mock

bun 的 mock.module 在同一进程内会泄漏到后续测试文件。svg-editor.test.tsx
把 @/i18n/locale-provider 替换成只含 useTranslation 的桩且不还原,导致全量运行时
Commit 面板等依赖真实 LocaleProvider 的测试拿到桩而失败。

在安装 happy-dom 之前保存真实模块,并在 afterAll 中还原。buffer.store 的 mock
无法同样处理(导入真实模块会触发 Tauri 窗口 API),保持不变。

* fix(windows): Amend 按实际暂存仓库读取 HEAD,提交说明分隔条从显示高度起算

- Amend 目标由有暂存文件的仓库决定,而不是活动仓库:单仓库参与时读取该仓库的 HEAD,
  多仓库同时有暂存文件时禁用 Amend 并给出提示;目标仓库变化时撤销已加载的说明,
  并在说明未被修改时恢复原草稿
- 提交说明编辑框最多显示视口的 60%,拖动与方向键调整改为从实际显示高度开始,
  渲染与交互共用同一上限常量
- 补充 A 活动 / B 暂存、活动仓库无 HEAD、多仓库禁用、目标变化,以及窗口缩小后
  拖动与键盘调整的回归测试

* fix(git): Amend 绑定到明确的仓库与 HEAD,由 Core 拒绝多仓库改写

Core 建立提交计划时会重新读取所有仓库的暂存状态,而界面只基于缓存的状态读取
并展示了某一个仓库的提交说明。若读取之后又有别的仓库被暂存(例如外部终端,
且关闭了自动刷新),一个全局 amend 会让两个仓库共用同一条说明并同时被改写。

- Core: amend 时有暂存更改的仓库最多一个,否则 invalid_request 且不写入
- Core: 新增可选 amendTarget{repositoryId, expectedHead},拒绝未知目标、
  不一致的暂存仓库以及 HEAD 已移动(新提交或切分支)的请求;重试时目标
  已提交则跳过 HEAD 检查
- Core: 约束只在 prepare 校验,不写入 Plan,避免 macOS 的计划模型丢弃未知
  字段后 amend 悄悄变成普通提交;validate_session 兜底拒绝涉及多个暂存仓库的
  amend 续接。缺省 amendTarget 时保持单仓库下限,macOS 无需改动
- Windows: getHeadCommitMessage 同时返回 HEAD hash;面板记录读取说明的仓库与
  hash,提交与重试时转换为仓库标识发送,无法确认时提示重新加载
- 补充 Rust 单元与真实 Git 集成回归、前端面板与 API 测试
- 更新 rust-core-api 契约与工作区提交 Agent Note

* fix(git): 重试沿用计划记录的 Amend 仓库,父仓库不再被误改写

子仓库 Amend 成功而父仓库提交被钩子拒绝后,父仓库已暂存了新的子模块引用。
重试时 Core 根据当前暂存区重新推断 Amend 目标,会把它当作唯一的暂存仓库并
改写其原 HEAD,用户确认的“新增父引用提交”变成了历史改写。

- Core: Plan 新增 amendRepositoryId,首次建立计划时确定;step 只 Amend 该
  仓库,其余仓库(含只记录子模块引用的父仓库)做普通提交
- Core: 重试沿用 previous.plan 记录的仓库,指定不同 amendTarget 时拒绝;
  validate_session 拒绝指向未知仓库或非 Amend 计划的续接
- Core: 字段缺失(丢弃未知字段的客户端)时退回按暂存路径判断并限制为一个仓库,
  行为与此前一致
- Windows: 重试不再根据组件 ref 推断目标,直接交还上一次计划
- 补充真实 Git 回归(子 Amend 成功、父钩子失败、恢复后重试)及单元、前端测试
- 更新 rust-core-api 契约与工作区提交 Agent Note

* revert(windows): 移除 Commit 面板的 Amend 功能

Amend 在多仓库工作区里需要把“每个仓库的提交意图”做成 Swift 与 Rust 共享的
模型,当前 PR 内无法在 macOS 缺少构建验证的情况下安全完成,且反复引入回归。
本次先移除,Windows 提交面板恢复为只做普通提交。

- Windows: 删除 Amend 复选框、HEAD 说明读取、目标仓库推断、重试目标处理,
  以及确认框的 Amend Commit 文案和相关 i18n 键
- Core: workspace_commit 及其测试、共享契约与 Agent Note 还原为与 preview 一致,
  macOS 的 amend 布尔字段保持不变,Swift 无需改动
- 测试: 删除全部 Amend 用例,新增“提交始终为普通提交且不显示 Amend”断言
- 矩阵: 去掉功能说明中的 Amend 描述并重新生成
- 保留与 Amend 无关的修复:提交说明分隔条按实际显示高度调整、图标替换、
  svg-editor 测试的 locale mock 还原

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全 (#1016)

* feat(agent): 显示 Agent 思考、计划与斜杠命令补全

共享 Host 原本就透传 ACP SessionUpdate,但 macOS 只处理消息、工具、
标题、配置和用量,其余更新被丢弃。本次补齐四类标准更新:

- agent_thought_chunk:独立的可折叠思考块,流式输出时展开、回复或
  工具到达后收起;缓冲按角色切分,思考与回复不再混在一起;导出
  Markdown 以引用块保留,历史消息数不计思考
- plan:计划栏固定在活动统计栏上方,显示进度与当前步骤;每次整体
  替换,空计划清除
- available_commands_update:输入 / 弹出 Agent 上报的命令补全,前缀
  优先;Codex 的 $Skill 补全为 $name(codex-acp 不解析 /$name),
  输入 $ 只列 Skill;macOS 14+ 支持方向键与 Tab
- current_mode_update:Agent 自行切换模式时同步权限模式选择器

另外把模型层的兜底文案、stopReason 提示和工具证据标题改为本地化,
补齐 zh-Hans 翻译。

fixture 新增四类事件样例并加入 Rust 往返测试;更新功能矩阵与
shared-acp Agent Note。真实 Agent 已在协议层确认 Codex/Claude 会上报
命令列表、Claude 会上报思考,界面层验证仍待完成。

* fix(agent): 修复命令补全布局和思考搜索展开

为输入区保留可编辑行,空间不足时在对话布局中显示可点击的命令浮层。搜索临时展开匹配思考块,清空后恢复手动选择。补充三项回归测试并同步功能矩阵与架构笔记。

* fix(ci): release Windows Bun install process trees before retry

---------

Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>

---------

Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
Co-authored-by: lick <2188718831@qq.com>

* refactor(matrix): split capability records and generate views in CI (#1026)

* Merge pull request #1029 from 1lck/fix/macos-release-reliability

fix(release): 修复 macOS 发布超时与 Sparkle 基线下载重试

* Merge pull request #1004 from 1lck/codex/plugin-package-signing

feat(macos): 修复 PHP 插件下载逻辑问题——Part1

---------

Co-authored-by: genhaosan <3042136826@qq.com>
Co-authored-by: lick <2188718831@qq.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: sinth <2235390062@qq.com>
Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
Co-authored-by: 若水 <frankw.wang@qq.com>
Co-authored-by: Xiaoyumuxi <3075514079@qq.com>

Copy link
Copy Markdown
Collaborator Author

补充按 review 继续收紧了 stable / preview 插件信任边界:

  • c406d821: 插件签名文档升级为 schema v2,签名 payload 绑定 stable|preview channel 和 channel-specific key ID。
  • Stable 保留现有内置 publisher 公钥;Preview App 由仓库变量 LITHE_PLUGIN_PACKAGE_PREVIEW_PUBLIC_KEY 注入独立公钥。
  • Stable / Preview workflow 分别读取 LITHE_PLUGIN_PACKAGE_STABLE_PRIVATE_KEY / LITHE_PLUGIN_PACKAGE_PREVIEW_PRIVATE_KEY,不再共享 publisher 私钥。
  • 私钥从 app/package/DMG 大步骤移出,只注入独立的 PHP 插件签名 step。
  • MacOfficialPluginSignatureVerifier 按 App 自身更新渠道选择对应公钥,并要求签名文档 channel/keyID 一致。
  • 新增跨渠道拒绝测试:preview 签名文档不能作为 stable 包通过,反向同理。
  • 88ef8012: 更新官方插件验证脚本和 Sparkle 配置测试,适配 channel 参数与 Preview 公钥注入。

发布前需要在仓库配置:

  • Secret LITHE_PLUGIN_PACKAGE_STABLE_PRIVATE_KEY(可迁移当前 stable 私钥)
  • Secret LITHE_PLUGIN_PACKAGE_PREVIEW_PRIVATE_KEY(必须是独立新私钥)
  • Variable LITHE_PLUGIN_PACKAGE_PREVIEW_PUBLIC_KEY(对应 preview 私钥的 Ed25519 公钥 base64)

GitHub PR API 当前仍短暂显示旧 head 0a3da37d,但分支 ref 已前进到 88ef8012;等待 GitHub 刷新后新 CI 会针对最新 head 触发。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants