Skip to content

feat(agent): 完善技能、全局指令与 MCP 服务器设置 - #1381

Merged
xiaoyumuxi merged 26 commits into
1lck:previewfrom
Mucheen:codex/agent-skills-management
Oct 23, 2026
Merged

xiaoyumuxi merged 26 commits into
1lck:previewfrom
Mucheen:codex/agent-skills-management

Conversation

@Mucheen

@Mucheen Mucheen commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

功能

在设置 → AI 中提供技能管理、全局指令和 MCP 服务器设置,沿用现有设置分类与共享控件。

技能管理

  • 技能支持全局/项目分类、已打开项目选择、Codex/Claude 来源筛选、搜索和刷新。选择项目不切换工作台;发现失败按来源显示,项目切换和离页拒绝迟到结果。
  • 支持查看、打开、Finder 定位、复制路径、新建及导入 SKILL.md 或完整技能目录。导入保留脚本、模板和权限,校验名称、YAML、符号链接及数量/大小;不覆盖同名目录,失败和取消清理暂存内容。
  • Codex 使用原生 skills/list、skills/config/write 写入并回读;Claude 按名称合并用户或项目原生配置。保留无关配置与权限,处理锁冲突、外部修改和原子保存。
  • 创建、导入和启停复用 RustCoreCancellation,服务入口及后台工作启动前检查取消;Core 注册回调在分派前补传注册前取消。安装进度保留同一事件通道。
  • 技能开关立即反馈且不增加加载转圈;只锁定当前保存行,其他开关保持颜色与交互。连续操作按顺序写入并回读,同一行去重,失败只回滚该行并继续队列;切项目或离页取消请求。保存提示固定占位,操作菜单保留窗口焦点,避免列表跳动和其他开启项变灰。

共享指令与原生文件

  • 参考 Magpie 的卡片与 Agent 行布局,独立实现「默认共享指令」卡片及 Codex、Claude Code 两行。共享卡片默认收起,展开后编辑 Markdown、保存或从磁盘重新加载,支持编辑器内 ⌘S;Agent 行显示生效路径、自有内容行数和共享同步开关,展开后仍可编辑完整原生文件。说明收进信息提示,适配中英文、深浅色及窄窗口。
  • 共享正文只写一次,保存在平台 Application Support 的 Lithe/AgentInstructions/Shared.md;打开和刷新页面只读,不创建文件或锁。只有明确保存或切换同步时才写入,未开启的 Agent 保持原样。现阶段为一份共享正文和两个 Agent,未增加多套命名方案。
  • 开启、更新与关闭只插入、替换或删除 LITHE:SHARED-INSTRUCTIONS 标记区块及其所属分隔符,保留区块外的字节;关闭可恢复原有换行与文件结尾。开关状态从实际原生文件读取,损坏或重复标记显示异常并拒绝自动覆盖。切换只控制共享区块,不停用 Agent、自有指令或项目指令。
  • 沿用 Codex/Claude 原生用户文件及环境变量规则;Codex 使用首个非空的 AGENTS.override.md / AGENTS.md,清空 override 后显示实际生效的基础文件。共享和各 Agent 草稿独立保留,读取失败不丢草稿,重新加载先确认放弃修改。
  • 保存核对路径与 SHA-256,拒绝过期修改、符号链接、只读目标、非 UTF-8、超过 1 MiB 或包含保留标记的共享正文;同目录暂存后原子替换并保留权限。共享源先保存,再同步已开启的 Agent;部分失败保留对应行错误和待同步状态,支持显式重试。
  • 连续切换按顺序读取最新状态后写入,只禁用当前待处理行;单项失败仍继续其他项,成功项不会清除其他行错误。离页取消任务并丢弃尚未执行的队列;适配器在工作任务启动前检查取消,并在 Core 的 requestStarted 同步回调补传注册前取消,阻止短保存越过取消窗口。已完成的原子替换不因稍后取消而撤销。
  • 新增 agent.instructions.shared(read/save/setEnabled)严格请求、Host 文件实现、Core 分派、Swift port/桥接、共享 fixture、Agent Note 和功能矩阵。共享正文、锁及临时文件纳入工作树资源复用排除清单;不写 app bundle,不添加运行时下载或新依赖。

MCP 资源库与发现

  • 服务器资源库、发现区和当前项目的 Lithe IDE 访问放在同一页。发现区采用简洁卡片,常规宽度两列,窄窗口一列;保留搜索、分页、发布者、版本与配置入口。
  • 首页直接展示随版本提供的十个精选:Context7、Playwright、Chrome DevTools、Microsoft Learn、GitHub、DeepWiki、Exa、Filesystem、Fetch、Memory,无需等待网络。目录编译进 Rust Core,npm/PyPI 包使用固定版本;浏览目录和配置模板不创建运行时缓存,也不下载或运行第三方服务器;工具检测须显式触发,见下文。
  • 精选卡片加入发布者品牌图标和远程 / npx / uvx 标签。八份品牌资源随 SwiftPM bundle 打包,三个参考服务器共用 MCP 标记;来源、审核日期、SHA-256 和 Playwright 许可随资源保留。只按可信精选 ID 选择有限文件名,公开 Registry 条目及未知项保留传输图标,不请求远程头像;深浅色和宽窄布局均有原生截图验证,长版本号不会挤换行操作按钮。
  • GitHub 与 Filesystem 提供带必填提示的配置模板:GitHub 预置空 Authorization 请求头,需填写 Bearer 令牌;Filesystem 需在命令参数后添加至少一个绝对允许目录;路径含空格时加引号,保存时保持一个参数。缺少输入时禁止保存,默认不选择 Agent,取消不写配置。可信 setup 只由随版本提供的精选声明,公开元数据不能伪装。
  • Filesystem、Memory 固定为 2.0.0,标明需要 Node.js 24+;Fetch 固定为 2026.10.19,标明需要 uv 和 Python 3.10+。DeepWiki、Exa 与 GitHub 远程地址按发布者文档核对。同步补齐中英文文案、共享 setup 夹具、合同、Agent Note、功能矩阵和资源复用排除说明。
  • 搜索时查询官方 MCP Registry,与匹配精选按标识和连接定义去重。网络失败仍保留可用匹配,取消和请求身份校验避免旧响应覆盖新查询;分页游标不跨查询或路由复用。
  • 标题右侧改为灰色普通文字“精选,以及官方 MCP Registry”,移除 Registry 首页直达链接;卡片的发布者文档入口保留。
  • 公开目录请求默认遵循系统代理,TLS 校验保持开启;网络错误时可显式选择“直连重试”。直连仅影响此页目录查询,不持久化,不修改系统代理或 Agent 的 MCP 连接。请求设有超时及 1 MiB 响应上限,不携带 Cookie 或凭据。
  • 新增 JSON 导入预览。导入或卡片配置先打开平铺编辑弹窗,检查命令、参数、环境变量、URL、请求头并选择 Agent 后才保存;取消不改配置。认证和复杂输入不猜测,仍由用户按发布者文档配置;保留已有条目的所有权、备份及格式保留写入边界。
  • 补齐 mcp.parseRegistry / mcp.featuredRegistry 共享命令、目录契约、网络 port、平台 adapter、功能模型、中英文文案及回归测试;更新资源复用排除清单、Agent Note 和功能矩阵。
  • 设置窗口继续只观察设置相关变化,保留现有性能边界;技能页使用已打开项目。合并本地化时保留 preview 与本 PR 的全部文案。

MCP 配置弹窗与工具检测

  • 配置弹窗缩为 640×500pt,JSON 导入保留 640×580pt;字段区滚动,保存/取消固定在底部,删除放入底部操作区。服务标题、已识别连接和 Agent 选择复用现有图标;外部配置的说明放进信息提示,避免换行挤占空间。
  • 程序与参数合并到命令框。Core 使用固定版本 shell-words 解析和引用,仅投影 argv,不执行 Shell;保留空参数、空白、引号、路径空格及嵌入换行,错误引号阻止保存。
  • 已添加服务器可展开工具区。打开页面或展开只读,只有点击检测才连接;本地命令先显示执行确认。显示真实工具数量、名称和说明,支持重新检测、取消和按 Agent 查看工具设置;结果表示最近一次检查,不替代既有 Agent 会话状态。
  • Agent Host 复用仓库已有的官方 rmcp 3.5.0 SDK,支持 stdio 与 Streamable HTTP 的初始化、会话及分页 tools/list,不发送 tools/call。请求期限 30 秒并有有界清理;限制工具数、页数及响应字节,拒绝重复游标、带凭据 URL、重定向和非法协议头,保持 TLS 校验;结束、失败或取消后回收检测子进程。
  • macOS 在独立的 8 MiB 栈线程上执行检测,修复调试版 HTTP SDK 在 Swift 小栈并发线程上导致的退出;取消与指令保存共用 Core 注册完成的同步回调,注册前的取消在分派命令前补传,不依赖重试计时器。离页取消并拒绝迟到结果。
  • 单工具开关按 Agent 独立保存:Codex 使用原生 disabled_tools,Claude Code 使用用户 settings.json 的 permissions.deny。保留外部精确/通配禁用、enabled_tools、未知设置与文件格式;只移除 Lithe 自己登记的精确禁用规则。过期快照不覆盖新内容,沿用原有条件写入和备份;Codex 来源哈希仅推进此前匹配的服务器所有权。
  • Claude 用户配置存在 MCP 限制时拒绝重命名服务器,避免旧规则失效而让工具重新可用。Codex 关闭/删除时只提取原生允许/禁用工具名,整批写入成功后按原生路径和服务器名保留到无 sourceHash 的账本记录,重新添加时恢复;空允许名单保持拒绝全部工具,非法类型拒绝移除,现存条目及重命名以当前原生规则为准。保留记录不能接管外部文件,也不保存命令、环境变量、请求头或令牌。Claude 规则保持在独立原生文件中;项目及受管策略继续由上游 Agent 决定,修改后需新建会话。
  • Codex 重命名在全部原生配置写入成功后迁移相同路径下的精确工具名所有权,清除旧名记录,不接管外部 deny/allow-list 或合并目标过期记录;批量失败回滚后旧名称的工具仍可编辑。
  • 已检测服务器增删 Agent 时释放旧策略快照、重读本地规则;检测尚未结束时采用最新来源。保留工具清单,不再次连接第三方服务器;单个来源读取失败可见,其他来源继续可用。
  • 新增 mcp.probe / mcp.toolPolicy / mcp.commandLine、Swift port/平台适配器/工具模型、合成共享夹具、中英文文案及生命周期测试;同步更新契约、Agent Note、能力矩阵和不可复用资源清单。未改动用户已有的 Playwright 配置,保留服务器列表与发现目录两个区域。

CI 与测试稳定性修复

  • Windows 技能包最终发布使用不启用替换和跨卷复制的 MoveFileExW,原子拒绝包含空目录在内的已有目标;覆盖 Unicode/空格路径、普通文件/非空目录字节保留及 NUL 拒绝。两个 Cargo.lock 同步目标专用依赖。
  • Windows 两仓库真实 Git 确认测试在 SharedRust/真实 JDT 入口采用单用例 30 秒预算;保留默认用例、请求及总套件期限与全部断言。
  • 搜索夹具在注入 Safe Mode 能力前,有界等待初始模块关闭完成,避免迟到清理移除测试能力。
  • Windows Run 夹具使用原生进程退出信号和有界首字节就绪等待;根进程、后代、另一窗口隔离与重复停止断言保留,失败路径也回收进程树、管道和句柄。产品停止逻辑不变。

Windows 路径集成测试 CI 修复

39933419913 的真实 JDT lane 在 git_paths_roundtrip_or_explicitly_reject_a_repository_beyond_max_path 调用 Node 时触发夹具十秒期限,返回 Cancelled,没有出现路径结果不匹配。提交 7717c9afe / 54540c12d 只为 Windows 的 Node 前端加载设置二十秒期限;Git 命令仍为十秒、Core 请求仍为五秒。SharedRust 与真实 JDT 两个入口按原始测试名 git_paths_roundtrip_ 配置单例六十秒预算,其他单例和总套件期限不变,全部路径断言与原生进程树清理保留。修正了最初带 Cargo target 的前缀,并用报告的 maxMs 确认生效。

本地合并基线 b64dee4d3 上 Core 全量 1152 项通过,Node 计时工具自测通过;选取真实 git_path_roundtrip Cargo 集成目标重跑,两项通过(427/1268 ms),JSON 均记录 maxMs=60000。Windows 专属点/空格目录用例仍需原生 CI,本机无可用 VM,不把 macOS 结果记为 Windows 运行。报告为 .artifacts/test-stability/pr1381-ci-path-{fixed,budget}.{json,html,junit.xml}。Rust 注释/格式、测试稳定性、契约、Windows 边界、138 篇 Note、发行包只读和实际 base/head 功能矩阵检查通过。最新 CI 状态见 PR 检查。

Windows 原生报告已确认三项路径测试通过(564/2668/4790 ms),两项往返用例的 maxMs 均为 60000。该轮另在 git_write_executes_checkout_preflight_clone_and_validation 报告全部断言通过(15.22 秒),但完整进程耗时 18.529 秒超过默认十五秒,触发清缓存后又耗尽原套件期限;提交 20a28aa7e 仅为该用例在两个 Windows 入口设置三十秒预算,不延长请求或总期限。本地真实 checkout/clone 回归 684 ms 通过,报告确认 maxMs=30000。后续 Windows run 39939156554 的原生 Rust、前端、真实 JDT 和 gate 均通过;真实 JDT 报告共 1145 项通过,JDT 启动用例耗时 28.5 秒,未改其产品逻辑或期限。最新合并提交按 lane 复用此前通过结果,不能将跳过记为重新执行。

macOS Agent Host 冷编译 CI 修复

macOS run 39939156503 的 Agent Host 在仍编译 ACP/MCP 依赖时耗尽两分钟总预算,测试尚未启动。提交 13c8d2379 移除该 crate 的两分钟覆盖,使用现有 Rust runner 默认二十分钟总预算(包含编译、枚举和执行);每项仍限制十五秒,Git Host 的两分钟预算及整个 CI job 的三十分钟限制不变。同步维护测试指引和 CI 决策 Note。

  • 空 Cargo target、关闭 incremental 的真实冷编译:40.5 秒;Agent Host 217 项通过、39 项环境集成按配置跳过,完整 lane 65.9 秒,报告确认每项 maxMs=15000,没有修改断言或重试失败用例。
  • 当前合并基线运行完整 ./scripts/verify-rust-core-crates.sh 通过:Git Host 7 项、Agent Host 217 项(另 39 项跳过)、IDE Host 5 项、Core 1152 项通过;npm 进度观察、注释校验自测、IDE MCP 回归均通过。
  • 测试稳定性、138 篇 Notes、发行包运行时只读、实际 PR base/head 功能矩阵及 shell 语法检查通过。本次无新增下载、缓存资源或产品行为变化。
  • 冷编译逐项计时报告:.artifacts/test-stability/pr1381-ci-agent-cold.{json,html,junit.xml};完整入口日志:.artifacts/test-stability/pr1381-ci-agent-core-entry.log。提交 13c8d2379 的 macOS CI 和 Windows CI 已通过;数据库、Notes、功能矩阵及插件门禁也通过,插件与真实 JDT 的未受影响 lane 按分类复用/跳过,未计作重跑。macOS 原生报告确认 Agent Host 217 项通过、39 项跳过,编译耗时 75.6 秒,suiteTimeoutMs=1200000 且每项 maxMs=15000;Core 1152 项通过。Swift 报告记录 2935 项单元测试通过,另外 Git execution/console 21 项、磁盘镜像回滚 1 项、数据库 51 项和 Git 性能 21 项通过;arm64 测试包构建与门禁通过。

验证

  • 最新修复提交 d19444d3d:Swift 6.3.3 运行技能、原生/共享指令、MCP 的 21 个 suite,129 项通过并记录逐项计时,2 项公网集成默认跳过。新增取消用例 8/2 ms,重命名和外部规则保护 18 ms,批量回滚 10 ms,来源变化三项各 1 ms;最慢相关原生编辑布局 1510 ms,低于硬期限。
  • 回归有效性:把新增测试放回修改前的实现,复现创建/导入/启停越过取消、重命名后自有规则变只读、来源变化后策略缺失;恢复修复后全部通过。真实临时文件覆盖“禁用 → 重命名 → 重新启用”、旧名重用不继承所有权,以及后续 Agent 写入失败时回滚文件和所有权。
  • 本地服务边界、共享契约、Windows 边界、发行包只读、测试稳定性、137 篇 Agent Notes 和实际 PR base/head 功能矩阵门禁通过。未新增下载或可复用资源目录,用户配置/内存快照仍不跨 worktree 共享。
  • 已完成的 Rust 验证:Core 全量 1154 项通过,Agent Host 217 项通过、39 项环境集成跳过,计时工具和 C ABI/Swift 桥接检查通过。最新增量只涉及 Swift 服务、模型和测试,未重复执行未改变的 Rust 套件。
  • Windows run 39924508639 已通过原生 Rust、前端及 gate,覆盖技能排他发布和 Run 进程树修复;该 head 的 Swift/Core/插件测试因路径分类跳过,不能记为重跑。前一轮 macOS、插件 与真实 JDT 已通过。最新提交的 CI 以 本 PR 检查 为准。

复现:

./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh \
  --report .artifacts/test-stability/pr1381-review-fixed.json -- \
  --filter 'AgentSkills|AgentInstructions|Mcp'

计时产物:.artifacts/test-stability/pr1381-review-fixed.{json,html,junit.xml};修改前的失败证据保留在 pr1381-review-before.*。

产品视图

下载原生产品截图与报告:mcp-ui/editor-{light,dark}.png、mcp-ui/tools-{light,dark}-{420,760}.png,以及 instructions-ui/ 的中英文、深浅色、500/760pt 指令页面。它们来自隔离 fixture 渲染的真实 SwiftUI/AppKit 产品视图,无用户配置、凭据或桌面内容。最新本地回归重新生成这些视图,布局与此前一致;本轮修复行为状态,没有新增界面布局。本次没有新增产品前后对比图,未将参考图计作验收。

验证范围

  • Windows 的技能、指令和 MCP 资源库设置页面及真实原生运行验收仍未完成,矩阵保留 partial/platform-specific/pending;Windows 原生 CI 通过只证明已执行的共享 Host/Core 和平台测试。
  • Context7 工具列表已有显式实网验证;官方 Registry 搜索/分页与新 Agent 会话中逐项工具限制仍未完成实网验收,默认测试不访问公网。配置测试不等同于会话最终工具行为。
  • SSE 原有配置可编辑,检测明确不支持;OAuth 登录、其他 Agent 的 OAuth 会话及未建模的原生连接选项不在本次范围。
  • 前轮在线技能对照为 8/8,新会话开启时读取技能、关闭后普通/显式请求不读取、重开恢复;指令 CLI 请求捕获为本地受控响应,不计作在线推理。当前改动不重新声称这些外部流程已在最新 head 全部执行。

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 20, 2026
在 AI 设置中保留独立的指令与技能入口,直接编辑 Codex/Claude 用户指令文件,提供草稿、冲突校验和原子保存。为技能成功提示保留布局空间,覆盖连续启停、深浅主题和窄宽页面的原生几何回归。
@Mucheen Mucheen changed the title feat(agent): 新增全局和项目技能管理及原生启停 feat(agent): 新增原生技能管理与全局指令设置 Oct 21, 2026
将待确认选择按点击顺序串行保存,其他技能保留原生启用外观和交互能力。覆盖同一 Agent 连续写入、单行失败回滚、队列继续、重复点击去重、项目切换及离页清理;同步 Agent Note 与平台矩阵。
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator
image 可以看看 magepi 的这个设计方案,我感觉挺好看的,可以抄抄看

Preserve skill and instruction settings while merging preview. Add offline featured MCP discovery, bounded Registry search, reviewed JSON import, adaptive cards, and a non-interactive source caption.
@Mucheen Mucheen changed the title feat(agent): 新增原生技能管理与全局指令设置 feat(agent): 完善技能、全局指令与 MCP 服务器设置 Oct 22, 2026

@xiaoyumuxi xiaoyumuxi 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.

跨 PR 审查(head 617f7a1c)

结论:Draft 阶段继续完善;当前未从已检查的改动与测试清单中找到可确定的 P0/P1 缺陷,但不能视为完整逐行安全审计。 此次最新 diff 为 94 文件,macOS/Windows/插件/Database 及 Agent Notes、平台矩阵 CI 均报告通过;GitHub 当前 mergeable=false。

建议在转 Ready 前把下列高风险真实流程作为清晰的验收记录,而不只依据各自的模型/fixture 单测:

  1. Skills 导入/删除:包含子目录与模板的包导入、符号链接/越界/超额拒绝、不覆盖同名技能,导入过程中取消和目录文件锁失败后的暂存清理;项目切换与离页后的迟到结果不能改写新项目列表。
  2. 共享原生指令文件:Codex override/base 切换、Claude 原生设置合并、异常/重复 LITHE:SHARED-INSTRUCTIONS 标记拒绝自动覆盖,关闭同步后保留标记区块外的原字节、换行和文件结尾;外部并发修改与失败恢复。
  3. MCP 设置与联动:检测/安装/启停/重启、全局与项目作用域、参数/凭据传递和 UI 关闭后的异步结果隔离;确认不会把凭据或用户本地文件路径写入公开日志。
  4. 视觉与操作:Settings 分类、Action Menu、深浅/中英文和窄布局,实际键盘 Tab/Return/Esc 与焦点恢复。

这条仅记录审查范围和剩余验证边界,不把未执行的真实场景推断成已失败。请同步最新 preview 解决不可合并状态后再跑最终 CI。

Resolve MCP action layout conflicts, use the shared action button style in new settings pages, and update the fullscreen test fixture for the run-service exit confirmation protocol.
@Mucheen
Mucheen marked this pull request as ready for review October 23, 2026 02:44
@Mucheen
Mucheen requested a review from 1lck as a code owner October 23, 2026 02:44
@lithe-code-review

lithe-code-review Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/agent-skills-management · head: a7281b5

Findings

  1. [P2] 指令保存可能丢失注册前的取消信号
    macos/Sources/Lithe/Core/Rust/RustAgentInstructionsService.swift:67

    • 实际影响:离开设置页取消任务后,尚未开始的保存仍可能写入共享源或原生指令文件。
    • 触发条件:取消发生在 Core 注册 operation ID 之前。这里仅调用一次 core.cancel;Core 对未注册 ID 返回 false,而 Task.detached 不继承调用方的取消状态,随后仍会执行写入。
    • 复现步骤:使用有效文件快照创建保存任务,在任务开始执行前取消它;当前桥接没有取消入口检查,仍会启动 detached 工作并提交保存。页面 .onDisappear 的取消也存在相同窗口。
    • 来源:本次引入。
  2. [P2] 服务器关闭再开启会丢失 Codex 工具禁用规则
    macos/Sources/Lithe/Platform/MacOS/MCP/MacMcpTools.swift:107

    • 实际影响:用户禁用的工具在服务器重新加入 Codex 后恢复可用,违反本次 Agent Note 中“暂时关闭服务器也保留限制”的约定。
    • 触发条件:通过新增工具开关写入 disabled_tools 后,关闭并重新开启该服务器的 Codex 注册。
    • 复现步骤:将同一服务器添加到 Codex 和 Claude,禁用 Codex 的一个工具,再关闭、开启该服务器的 Codex 开关。现有 setAgent(false) 经 remove_codex → remove_server 删除整个服务器表;重新开启从不包含工具过滤字段的连接定义重建,工具名所有权登记没有恢复规则,因此新表缺少 disabled_tools。
    • 来源:本次引入的新工具策略未接入现有服务器移除、重建生命周期。现有回归测试先重新启用工具再删除服务器,未覆盖此路径。

Scope Check

  • 关联 Issue:未找到可验证的关联 Issue,按明确功能描述审查。
  • 已完成范围:静态追踪技能管理、原生及共享指令、MCP 发现与工具设置的关键实现、调用链、契约和测试。
  • 未完成范围:Registry 联网搜索与分页、Windows 原生界面及运行验收仍由作者列为待完成,矩阵保留相应限制。
  • 上游复用:MCP 检测复用现有官方 rmcp SDK,配置管理沿用 Agent 原生文件格式。
  • 两项 Finding 均属于本次新增功能的生命周期边界,属于本 PR 职责范围。

Suggestions

  1. 为指令桥接增加启动前取消检查,并通过注册握手或复用探测适配器的取消保护覆盖注册窗口;增加确定性的注册前取消回归,确认取消后文件不变。
  2. 在关闭、重新开启服务器时保留并恢复 Codex 工具策略,同时保留外部限制与每个 Agent 的独立状态;增加工具保持禁用时的真实文件关闭、开启回归。
  3. 补充实际 Lithe 界面截图,已有界面提供修改前后对比。当前上下文仅附设计参考图,未展示本 PR 的产品界面。

Summary

未发现需要阻塞合并的问题。主要建议集中在取消和服务器生命周期的边界处理;现有分层与上游复用方向清晰,但上述两条路径需要补充针对性回归。

Verification

  • 静态检查覆盖 Host 技能与指令文件处理、Swift 页面及桥接、Core MCP 策略和配置编辑、探测清理、Registry 适配,以及相关测试、契约、Agent Notes、资源排除和平台矩阵。未读取二进制、生成文件或锁文件正文。
  • 作者报告合并后 Swift 199 项中 197 项通过、2 项跳过,并提供多轮 Rust、文件验收及 bundle 哈希验证记录;这些结果未由本次审查独立确认,部分对应较早验证树。
  • 提供的 head 检查中 Agent Notes、矩阵及 Windows/插件 gate 成功;部分检查仍排队或进行中,Windows 原生测试跳过,不能认定完整 CI 已通过。
  • 本次未运行测试、应用、仓库验证脚本或联网请求,包括 scripts/verify-runtime-bundle-immutability.sh。
  • 视觉效果尚未验证,需补充产品截图;Registry 联网、Windows 原生运行及新会话工具限制行为仍有作者已说明的验收缺口。

@Mucheen

Mucheen commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

@lithe review

@lithe-code-review

lithe-code-review Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/agent-skills-management · head: 3c42838

Findings

  1. [P2] 技能写入仍可能越过注册前的取消信号
    macos/Sources/Lithe/Core/Rust/RustAgentManagementService.swift:37

    • 实际影响:离开技能页取消操作后,尚未开始的创建、导入或启停仍可能修改技能目录或原生配置。
    • 触发条件:新增技能接口调用的 run 仍直接启动 Task.detached,没有入口取消检查,也没有注册后补传取消;其取消处理只调用一次 core.cancel,未注册的 operation ID 会返回 false。
    • 复现步骤:在隔离项目中,从 MainActor 创建调用 writeSkill 的任务,不让出执行权即取消,再等待任务结束。取消先于 Core 注册,但 detached 工作仍会执行并发布技能。AgentSkillsFeatureModel.write 同样没有在进入服务前检查取消。
    • 来源:本次引入;新增技能文件操作复用了旧桥接的取消路径。指令服务已经使用的新取消保护尚未覆盖这里。
  2. [P2] Codex 服务器重命名后丢失工具规则所有权
    macos/Sources/Lithe/Platform/MacOS/MCP/MacMcpTools.swift:88

    • 实际影响:通过 Lithe 禁用的工具在服务器重命名后变为不可编辑,用户无法从界面重新启用。
    • 触发条件:工具所有权按原生路径和服务器名称存储;重命名会保留 TOML 中的 disabled_tools,但保存流程没有迁移 settings.mcpToolExclusions 的旧名称记录。
    • 复现步骤:仅为 Codex 添加 alpha,检测并禁用一个工具;编辑服务器名称为 beta,保存后重新检测。这里读取 beta 的所有权得到空列表,Core 将保留下来的禁用项判为外部限制,返回 editable: false。
    • 来源:本次引入;新增工具所有权未接入已有重命名生命周期。
  3. [P2] 新增 Agent 注册后未刷新已检测行的工具策略
    macos/Sources/Lithe/Application/Features/McpToolsFeatureModel.swift:76

    • 实际影响:新注册 Agent 的工具全部显示为关闭且无法操作,即使其原生配置没有禁用规则;必须重新检测服务器才能恢复。
    • 触发条件:同一连接新增 Agent 注册时,行 ID 仍是相同的名称和定义哈希。reconcile 只清理消失的 ID,没有为保留行更新策略快照。
    • 复现步骤:为仅注册 Codex 的服务器完成检测,再通过服务器行开启 Claude。切到工具区的 Claude 标签后,policies[.claudeCode] 仍为空;McpToolsPanel 将缺失权限显示为关闭并禁用,且没有错误提示或重新加载入口。
    • 来源:本次引入;新增策略缓存未响应注册来源变化。

Scope Check

  • 关联 Issue:未找到可验证的关联 Issue,按明确功能描述审查。
  • 已检查范围:技能发现与写入、原生及共享指令、MCP 目录与探测、工具策略、设置接入,以及 Windows 进程树测试调整。
  • 上一轮建议:指令注册前取消、Codex 服务器关闭重开后的规则保留,均已有对应修复与回归代码。
  • 尚未完成的验收:Registry 实网搜索及分页、Windows 对应功能页面、真实 Agent 新会话中的工具限制行为。
  • 上游复用:Codex 使用原生技能 API;MCP 探测复用固定版本 rmcp SDK,命令编辑使用 shell-words,未发现另建协议真源的问题。
  • 三项 Finding 均由本次新增功能引入,属于本 PR 职责范围。

Suggestions

  1. 技能桥接复用 RustCoreCancellation,同时检查启动前取消并在 requestStarted 回调补传;增加真实桥接的注册前取消回归,确认技能和配置文件不变。
  2. 成功重命名后同步迁移对应工具所有权,仅迁移已拥有的精确规则;增加“禁用 → 重命名 → 重新启用”的真实文件回归,并验证不接管外部规则。
  3. 对已检测行的 Agent 来源变化重新读取本地策略并释放旧快照;增加检测后新增、移除 Agent 的模型回归,避免为刷新配置再次连接第三方服务器。
  4. PR 已注明产品截图 artifact 路径;请在描述或评论中直接附受影响界面截图,已有 MCP 界面补充前后对比。当前上下文未提供可核验的产品前后对比。

Summary

未发现需要阻塞合并的问题。建议集中在取消传播、重命名后的所有权,以及注册变化后的状态刷新;现有回归尚未覆盖这三条组合路径。

Verification

  • 固定审查范围为 1fba19412303ae120dad46831be38c04fd4189c4...3c42838a22e48e9fa28adf942aeace1251cc2d6d,结合 base 文件和直接调用链进行静态检查;未检查工作区修改。
  • 检查了相关 Swift 模型、视图和桥接,Rust Host 文件操作与探测、Core 策略及配置计划,以及相关测试、契约、Agent Notes、矩阵和资源复用变更。未读取图片、二进制或锁文件正文。
  • 作者提供了多轮 Rust、Swift、文件验收和 bundle 哈希验证记录,本次未独立复核。提供的 head Checks 中 Windows Rust、Windows 前端、数据库及各平台 gate 成功;Swift、Rust Core、插件等部分测试任务为 skipped,不能据此认定它们在此 head 全部重跑通过。
  • 本次未运行测试、应用或仓库验证脚本,包括 scripts/verify-runtime-bundle-immutability.sh;未联网、修改文件或发布评论。
  • 产品截图 artifact 未读取,视觉效果尚未验证;需补充上述产品截图及已有界面的前后对比。Registry 联网与原生会话行为仍保留作者已说明的验收缺口。

@Mucheen

Mucheen commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

@xiaoyumuxi 合并一下代码

@xiaoyumuxi
xiaoyumuxi merged commit 7661301 into 1lck:preview Oct 23, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants