fix:macOS Markdown 预览目录默认展开并使用完整高度 - #1021
Merged
Merged
Conversation
# Conflicts: # docs/development/platform-parity-matrix.md
xiaoyumuxi
reviewed
Oct 1, 2026
xiaoyumuxi
left a comment
Collaborator
There was a problem hiding this comment.
补充一个状态保持的边界条件,见 inline comment。
| tocToggle.setAttribute('aria-expanded', String(visible)); | ||
| document.body.classList.toggle('toc-open', visible); | ||
| } | ||
|
|
Collaborator
There was a problem hiding this comment.
closeTOC() now persists tocExpanded = false, but the Escape handler calls it even when the document currently has no headings and the TOC toggle is hidden. This means an unrelated Escape (for example, closing the image viewer) can overwrite the preserved expanded preference: open TOC → remove all headings → press Escape → restore headings now leaves the TOC collapsed. Could we only mutate the TOC preference here when !tocToggle.hidden (or otherwise distinguish “TOC unavailable” from an explicit user collapse)?
fix(macos): 收紧 Agent 配置菜单并修复双行说明裁剪
* fix(macOS): 支持项目树多选与批量文件操作 (1lck#987) * docs: 记录 1lck#987 macOS 项目树手动验证结果 * docs: 添加 1lck#987 项目树多选手动验证截图 * fix(macOS): 处理 1lck#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): 批量文件操作在整批结束前持有操作锁 处理 1lck#991 审查的 P2/P3: - 批量创建副本和批量移到废纸篓原来逐项调用单项入口,每项结束后都会先释放 isPerformingProjectItemOperation 再 await 刷新。刷新期间用户可以启动别的文件操作, 原批次的后续项随后被入口守卫静默跳过。现在由外层批次持有操作锁直到整批结束, 内层拆成不自行加锁、不刷新的单项实现,整批完成后只刷新一次。 - 单项粘贴和单项删除仍通过同一实现,行为不变。 - 中文“Copied files”改为“已拷贝文件”,与菜单“拷贝”一致。 - 新增回归:第一组复制暂停时操作锁保持占用、插入的粘贴被拒绝,批量复制和 批量删除各只在最后一项完成后刷新一次。恢复旧实现时该测试失败。 --------- Co-authored-by: Lichenkang <2188718831@qq.com>
* fix(agent): 修复 Claude 鉴权、会话切换和品牌图标 通过 Claude 适配器公开会话参数传递 API Key 路由,同时覆盖新建与历史恢复,清除冲突鉴权并保留 Codex gateway 行为。 直接观察所选 Agent 连接,等待会话设置确认后展示模型,防止旧配置闪现及准备期间提交。 统一底栏、模型入口与 Agent 菜单品牌图标,保留原生单选勾选,并补充回归、共享契约、Agent Note 与功能矩阵。 * test(git): bound graph frame sampling to visible viewports 修复 PR 1lck#1007 CI:原用例重复绘制完整 1000 行历史,CI 耗时 11.791 秒超过未调整的 10 秒上限。改为开头、中段、末段 40 行视口采样,校验实际像素,保留完整结构、单帧预算与 Release 基线;同步 CI 文档和中文工程笔记。
* 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): 共用 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 思考、计划与斜杠命令补全 (1lck#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>
fix(release): 修复 macOS 发布超时与 Sparkle 基线下载重试
feat(macos): 修复 PHP 插件下载逻辑问题——Part1
1 task done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1002
问题
macOS Markdown 预览目录默认隐藏,展开后高度受
66vh / 560px限制,长文档导航时未充分利用右侧空间;点击目录标题后还会自动收起。定位
目录由现有
MarkdownPreview/preview.js生成,初始 HTML 将目录标记为隐藏;目录链接和点击正文的事件会关闭目录。preview.css将目录作为固定浮层,并限制最大高度。修复
shared/platform-feature-matrix/features/markdown-preview-outline.json;生成视图不入库。macOS 已实现,本次修复后的原生复验保持 pending,Windows 目录入口尚未实现。验证
preview的32462a59;提交前合并最新4773688e,重新生成矩阵文档并保留双方能力记录。本 PR 相对最新基线仅修改 Markdown 预览 JS/CSS 和功能矩阵。32462a59基线上完成;最新同步仅涉及上游 Windows 功能及矩阵文档,macOS 预览实现未变化。node --check macos/Sources/Lithe/Resources/MarkdownPreview/preview.js、./scripts/verify-runtime-bundle-immutability.sh、./scripts/verify-platform-feature-matrix-change.sh origin/preview HEAD、./scripts/verify-platform-feature-matrix.sh、git diff --check均通过。./scripts/verify-service-boundaries.sh被上游已有的AppModel+RunConfiguration.swift616 行超过 600 行限制阻断,该文件与上游一致,本 PR 未修改。当前修复与验证