48 KiB
Lime 工程质量工作流
这份文档回答什么
本文件定义 Lime 仓库的工程质量入口,主要回答四个问题:
- 不同改动,提交前默认该跑什么
- 为什么 Lime 作为 GUI 桌面产品,不能只看
lint/typecheck/ 单测 verify:local、verify:gui-smoke、test:contracts、Playwright E2E 分别覆盖什么风险.github/workflows/quality.yml与本地校验如何保持一条主线
它是 工程入口文档,不是某个模块的实现设计文档。
什么时候先读
遇到以下任一情况时,先读本文件:
- 不确定本次改动最少该跑哪些校验
- 修改了 GUI 壳、DevBridge、Workspace、Tauri 命令、前端主路径
- 需要判断跑最小 smoke 还是交互型 E2E
- 需要理解
quality.yml为什么触发某些 CI 任务
如果改动属于 @ / 产品型 / / 轻卡 / viewer / ServiceSkill 场景主链,先补读:
docs/aiprompts/command-runtime.md
交付定义
对 Lime 来说,“代码通过检查” 不等于 “产品可以交付”。
一次可交付的改动,至少要满足:
- 静态与定向校验通过 - 对应范围的 lint、类型检查、单测、Rust 定向测试通过
- 边界变更已同步 - 命令、桥接、配置、版本等结构性改动完成成组更新
- GUI 主路径可运行 - 涉及 GUI 壳、Bridge、Workspace、主页面路径时,最小冒烟通过
- 用户可见回归已补齐 - 用户可见 UI 改动有稳定断言或既有 snapshot 回归
- 文档与锁文件不掉队 - 相关文档、schema、锁文件与实际实现保持一致
路线图任务防跑偏
如果任务明确绑定路线图主线,质量校验除了回答“是否通过”,还必须回答“这次改动是否真的推进了路线图目标”。
执行时额外遵守:
- 校验前先确认本轮改动对应路线图哪一项
- 如果本轮改动只是清理 dead surface、补 README 或局部整理,但没有直接推进主链,不能把“校验通过”当作完成目标
- 汇报时必须同时给出:
- 本轮改动对应的路线图节点
- 本轮校验覆盖了哪条主线风险
- 当前距离该路线图阶段完成还差什么
执行硬规则
1. 不要继续扩展 compat / deprecated 路径
- 新 API、新 Tauri 命令、新前端入口默认落在当前
current主路径 - 不要继续给 legacy / compat 网关长新表面
- 如果发现能力已经存在多条路径,先读
docs/aiprompts/governance.md
2. 协议改动必须同步四侧
涉及命令或桥接协议时,至少检查:
- 前端
safeInvoke(...)/invoke(...)的实际调用 - Rust
tauri::generate_handler!的实际注册 src/lib/governance/agentCommandCatalog.json的治理口径mockPriorityCommands与defaultMocks的同步状态
只改其中一侧,不算完成。
如果本轮是在下线共享网关控制面,start_server、stop_server、get_server_status、get_available_routes、get_route_curl_examples、test_api、get_network_info,以及托盘残留 sync_tray_state、update_tray_server_status、update_tray_credential_status、get_tray_state、refresh_tray_menu、refresh_tray_with_stats 必须同步从前端网关、Rust 注册、DevBridge 和 mock 中撤掉;server 兼容面 /v1/routes、/{selector}/v1/messages、/{selector}/v1/chat/completions 也必须同步从 server 路由表与 services/core 模型中撤掉;开发者诊断只保留 get_server_diagnostics,托盘只保留 sync_tray_model_shortcuts,server 只保留标准 /v1/messages 与 /v1/chat/completions。
如果本轮是在下线项目默认风格旧链路,style_guide_get / style_guide_update 与 ProjectMemory.style_guide 也必须同步从前端 API、Rust 注册、数据库 schema、默认 mock 和 GUI 入口中撤掉。
如果本轮是在下线项目模板或品牌人设扩展旧链路,create_template / list_templates / get_template / update_template / delete_template / set_default_template / get_default_template,以及 get_brand_persona / get_brand_extension / save_brand_extension / update_brand_extension / delete_brand_extension / list_brand_persona_templates 也必须同步从前端 API、Rust 注册、services/core 模型、默认 mock 和 GUI 入口中撤掉。
如果本轮是在清退旧图库素材命名,create_poster_metadata / get_poster_metadata / get_poster_material / update_poster_metadata / delete_poster_metadata / list_by_*,以及 PosterMaterial* / poster_material_* 表名与模块名也必须同步从前端网关、Rust 注册、DAO 与治理目录册中撤掉;如需保留历史数据,只允许在 schema 迁移中短暂停留旧表名。最低校验至少包含 npm run test:contracts 与 npm run governance:legacy-report。
如果本轮是在清退旧设置页的“安全与性能 / 容错配置”命令面,get_retry_config、update_retry_config、get_failover_config、update_failover_config、get_switch_log、clear_switch_log、get_rate_limit_config、update_rate_limit_config、get_conversation_config、update_conversation_config、update_hint_routes、get_pairing_config、update_pairing_config 也必须同步从前端网关、Rust 注册和默认 mock 中撤掉;若当前输入框提示仍依赖 get_hint_routes,则只保留该只读读取面。最低校验至少包含 npm run test:contracts 与 npm run governance:legacy-report。
如果本轮是在清退旧 onboarding 插件安装流或 Provider Switch 命令面,get_switch_providers、get_current_switch_provider、add_switch_provider、update_switch_provider、delete_switch_provider、switch_provider、import_default_config、read_live_provider_settings、check_config_sync_status、sync_from_external_config 也必须同步从前端常量、Rust 注册、services、默认 mock 与 GUI 入口中撤掉;当前 onboarding 只允许保留语音体验链,不再保留 config-switch 推荐安装面。最低校验至少包含 npm run test:contracts 与 npm run governance:legacy-report。
如果本轮涉及 companion_* 桌宠命令族,还要同步检查本地 companion WebSocket 入口、前端 src/lib/api/companion.ts 网关、Rust 注册、治理目录册以及浏览器模式 mock 返回形态;浏览器模式下这组命令默认也要保持可 mock,不要让桌宠接入把默认页面渲染链路卡死。
如果本轮涉及 team runtime 工具面或主线程用户消息工具,还要同步检查 Rust catalog / inventory、runtime 注册、浏览器 fallback mock 与前端 tool display;Agent / TeamCreate / TeamDelete / SendMessage / ListPeers 必须保持同一组 current surface,SendUserMessage 也必须继续停留在 current 主线程工具面,SubAgentTask 只能继续停留在 compat 读取边界。
如果本轮涉及 MCP bridge runtime tool surface、inventory 或 ToolSearch,还要同步检查 Rust extension 注入、inventory 快照、浏览器 fallback mock 与 GUI 面板命名;当前唯一命名事实源是 mcp__<server>__<tool>,对应 extension surface key 为 mcp__<server>,不要让 mock 或 UI 退回裸 server__tool。
3. 用户可见 UI 改动必须补稳定回归
- 优先补现有
*.test.tsx的关键文案、状态与交互断言 - 如果目标区域已有 snapshot / 结构化快照机制,沿用现有机制
- 不要因为“只是 UI”就跳过回归
4. 配置与依赖改动必须成组提交
- 改配置结构时,要同步更新 schema、校验器、消费者与文档
- 改版本结构时,要执行
npm run verify:app-version - 改依赖时,要同步提交对应锁文件,如
package-lock.json、src-tauri/Cargo.lock - 本仓库没有 Bazel,不适用 Bazel lockfile 规则
5. Rust 校验先小后大
- 默认先跑受影响 crate、模块或定向测试
- 再根据边界扩散决定是否执行全量
cargo test - 目标是尽快暴露问题,而不是一上来把所有测试都跑满
质量分层
Layer 0:快速提醒
入口:
.husky/pre-commitnpm run ai-verify
作用:
- 做提交前的快速卫生检查
- 暴露明显问题与风险
边界:
- 不替代 编译、测试、契约检查、GUI smoke
Layer 1:本地统一入口
入口:
npm run verify:local
npm run verify:local:full
作用:
- 根据改动范围自动选择前端、Rust、Bridge、GUI smoke 等检查
- 让开发者在发起 PR 前有一个统一入口
适用建议:
- 普通功能改动:默认执行
npm run verify:local - 跨前后端、大范围重构、发布前自检:执行
npm run verify:local:full
Layer 2:GUI 最小冒烟
入口:
npm run verify:gui-smoke
作用:
- 启动或复用
headless Tauri - 等待
DevBridge健康检查通过 - 验证默认 workspace 的准备态可用
- 验证
browser runtime的启动、状态读取与审计主链可用 - 其中
browser runtime smoke默认以无界面浏览器会话执行,避免额外弹出仅用于校验的空白 Chrome - 验证
site adapter catalog的状态、列表与推荐主链可读
它解决的是 GUI 产品特有风险:
- 前端壳能不能真正起来
DevBridge是否就绪- 默认 workspace / 本地工作目录能力是否可用
这类问题 单靠 lint、typecheck、vitest 无法覆盖。
Layer 3:契约与桥接边界
入口:
npm run test:contracts
npm run test:bridge
npm run bridge:health -- --timeout-ms 120000
作用:
- 检查前端命令调用与 Rust 注册表是否一致
- 检查 harness metadata / execution runtime / 后端 request metadata 的关键字段是否漂移
- 检查浏览器桥接 / mock 优先路径是否同步
- 检查
DevBridge是否可用 - 检查纯文本
Claw @配图是否已经走原始用户消息 -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> Bash/lime media image generate --json 或 lime_create_image_generation_task -> task/timeline主链,以及显式图片动作是否也已经走synthetic user message / displayContent -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task/timeline,而不是回流前端直连图片服务、卡在ToolSearch / WebSearch / Read / Glob / Grep,或让lime media image generate --json/lime task create image --json只停在pending_submit - 检查纯文本
Claw @封面是否已经走原始用户消息 -> harness.cover_skill_launch -> Agent 首刀 Skill(cover_generate) -> task file主链,而不是回流成普通图片命令、卡在ToolSearch / WebSearch / Read / Glob / Grep,或前端本地伪造结果 - 检查纯文本
Claw @视频是否已经走原始用户消息 -> harness.video_skill_launch -> Agent 首刀 Skill(video_generate) -> Bash/lime media video generate --json 或 create_video_generation_task -> task/timeline主链,而不是卡在ToolSearch / WebSearch / Read / Glob / Grep,或前端本地伪造结果 - 检查纯文本
Claw @播报是否已经走原始用户消息 -> harness.broadcast_skill_launch -> Agent 首刀 Skill(broadcast_generate) -> task file主链,而不是退回普通聊天改写、卡在ToolSearch / WebSearch / Read / Glob / Grep,或前端本地伪造结果 - 检查纯文本
Claw @素材是否已经走原始用户消息 -> harness.resource_search_skill_launch -> Agent 首刀 Skill(modal_resource_search) -> 图片直搜时优先 lime_search_web_images / 其余情况走 task file主链,而不是回流到前端本地素材页逻辑、卡在ToolSearch / WebSearch / Read / Glob / Grep,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @搜索是否已经走原始用户消息 -> harness.research_skill_launch -> Agent 首刀 Skill(research) -> search_query / tool timeline主链,而不是直接凭模型记忆回答、卡在ToolSearch / Read / Glob / Grep这类工具目录/本地文件偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @深搜是否已经走原始用户消息 -> harness.deep_search_skill_launch -> Agent 首刀 Skill(research) -> 多轮 search_query / tool timeline主链,而不是退化成一次普通搜索、卡在ToolSearch / Read / Glob / Grep这类工具目录/本地文件偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @研报是否已经走原始用户消息 -> harness.report_skill_launch -> Agent 首刀 Skill(report_generate) -> search_query / tool timeline主链,而不是直接退回普通聊天长文、卡在ToolSearch / Read / Glob / Grep这类工具目录/本地文件偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @站点搜索是否已经走原始用户消息 -> harness.site_search_skill_launch -> Agent 首刀 Skill(site_search) -> lime_site_* / tool timeline主链,而不是先退回research / WebSearch、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用搜索/本地文件偏航,或把浏览器兼容工具权限拒绝直接暴露给用户 - 检查纯文本
Claw @读PDF是否已经走原始用户消息 -> harness.pdf_read_skill_launch -> Agent 首刀 Skill(pdf_read) -> list_directory / read_file / tool timeline主链,而不是退回普通聊天总结或前端本地解析、卡在ToolSearch / WebSearch / Grep这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @总结是否已经走原始用户消息 -> harness.summary_skill_launch -> Agent 首刀 Skill(summary) -> 可选 list_directory / read_file / tool timeline主链,而不是退回普通聊天总结、卡在ToolSearch / WebSearch / Grep这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户;同时确认Read / Glob仍保留给显式路径场景 - 检查纯文本
Claw @翻译是否已经走原始用户消息 -> harness.translation_skill_launch -> Agent 首刀 Skill(translation) -> 可选 list_directory / read_file / tool timeline主链,而不是退回普通聊天翻译、卡在ToolSearch / WebSearch / Grep这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户;同时确认Read / Glob仍保留给显式路径场景 - 检查纯文本
Claw @分析是否已经走原始用户消息 -> harness.analysis_skill_launch -> Agent 首刀 Skill(analysis) -> 可选 list_directory / read_file / tool timeline主链,而不是退回普通聊天分析、卡在ToolSearch / WebSearch / Grep这类工具目录/联网检索偏航,或把 session permission 拒绝直接暴露给用户;同时确认Read / Glob仍保留给显式路径场景 - 检查纯文本
Claw @转写是否已经走原始用户消息 -> harness.transcription_skill_launch -> Agent 首刀 Skill(transcription_generate) -> task file主链,而不是回流到前端直连旧 ASR 接口、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用工具偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @链接解析是否已经走原始用户消息 -> harness.url_parse_skill_launch -> Agent 首刀 Skill(url_parse) -> task file主链,而不是退回普通聊天总结、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用工具偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @排版是否已经走原始用户消息 -> harness.typesetting_skill_launch -> Agent 首刀 Skill(typesetting) -> task file主链,而不是退回普通聊天润色、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用工具偏航,或把 session permission 拒绝直接暴露给用户 - 检查纯文本
Claw @网页是否已经走原始用户消息 -> harness.webpage_skill_launch -> Agent 首刀 Skill(webpage_generate) -> write_file HTML artifact主链,而不是退回普通聊天口头方案、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用工具偏航,或没有真实.html文件就宣布完成 - 检查纯文本
Claw @PPT是否已经走原始用户消息 -> harness.presentation_skill_launch -> Agent 首刀 Skill(presentation_generate) -> write_file Markdown artifact主链,而不是退回普通聊天口头提纲、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用工具偏航,或没有真实演示稿文件就宣布完成 - 检查纯文本
Claw @表单是否已经走原始用户消息 -> harness.form_skill_launch -> Agent 首刀 Skill(form_generate) -> ```a2ui simple form JSON主链,而不是退回普通聊天字段建议、卡在ToolSearch / WebSearch / Read / Glob / Grep这类通用工具偏航,或回流成单文件 HTML 表单原型;同时确认 render contract 已收敛为form + json - 检查纯文本
Claw @代码是否已经走原始用户消息 -> harness.code_command + preferred_team_preset_id -> code_orchestrated -> code_execution / tools / team runtime主链,而不是继续停留在普通聊天、没有打开task/subagent偏好,或把代码任务改写成另一套 prompt / workflow 旁路 - 检查纯文本
Claw @发布是否已经走原始用户消息 -> displayContent 保留 -> dispatch /content_post_with_cover -> content_post workflow主链,而不是直接把@发布文本原样当普通聊天发送,或重新造一套publish_task协议;同时确认平台后台类输入会继续触发browser_requirement - 检查纯文本
Claw @配音是否已经走原始用户消息 -> harness.service_scene_launch(scene_key=voice_runtime) -> Agent 首刀 lime_run_service_skill -> OEM scene run/timeline主链,而不是退回普通聊天解释、误走站点型service_skill_launch,或重新回流旧的本地 TTS 测试命令;同时确认skill_id、OEM runtime 上下文与最近使用记录都能写回 - 检查产品型
/scene-key是否已经走原始用户消息 -> harness.service_scene_launch -> Agent 首刀 lime_run_service_skill -> OEM run/timeline主链,而不是前端直接调用云端 run API - 如果某个
/scene-key绑定的是site_adapter型技能,还要额外检查scene -> linkedSkillId -> 完整 ServiceSkill 目录 -> harness.service_skill_launch这条绑定链是否仍然成立,避免首页隐藏 site skill 后 slash scene 变成“目录可见但执行找不到 skill” - 如果某个
site_adapter结果开始返回markdown_bundle,还要确认保存链会把 Markdown、图片和meta.json一起落到项目导出目录,并把重写后的相对图片路径写回内容 metadata;同时确认聊天轻卡或 tool timeline 能显示项目目录、Markdown 路径和图片数量,不能只把远程图片 URL 或临时 DOM 文本留在聊天结果里
高频场景:
- 修改
safeInvoke/invoke - 修改
execute_skill、list_executable_skills、get_skill_detail或它们在 DevBridge / mock 中的分流 - 修改
src/lib/api/document-export.ts、save_exported_document,或把新的 GUI 导出入口接到本地文件保存主链 - 修改
agent_runtime_submit_turn.turn_config.approval_policy / sandbox_policy - 修改
agent_runtime_submit_turn.request_metadata.harness.team_memory_shadow - 修改
agent_runtime_spawn_subagent的name / teamName / cwd、spawn 后 Team 成员写回,或 childworking_dir/ 父子上下文投影语义 - 修改 team runtime tool surface、tool inventory、主线程用户消息工具或协作工具展示,例如
SendUserMessage、Agent / TeamCreate / TeamDelete / SendMessage / ListPeers - 修改
agent_runtime_update_session或会话 provider/model / recent_access_mode / recent_preferences / recent_team_selection 恢复语义 - 修改
execution_runtime.recent_access_mode / recent_theme / recent_session_mode / recent_gate_key / recent_run_title / recent_content_id恢复语义,或前端harness.access_mode / harness.theme / harness.session_mode / harness.gate_key / harness.run_title / harness.content_idsteady-state 去重逻辑 - 修改首页 / 工作区进入
Claw时的首条自动发送上下文,例如initialUserPrompt、initialAutoSendRequestMetadata、harness.service_skill_launch - 修改
site_*站点适配器命令族,例如site_recommend_adapters、site_get_adapter_launch_readiness、site_import_adapter_yaml_bundle、site_run_adapter - 修改
companion_get_pet_status、companion_launch_pet、companion_send_pet_command,或调整 Lime 与独立桌宠之间的本地 companion 协议(例如pet.provider_overview、pet.open_provider_settings、pet.request_provider_overview_sync、pet.request_pet_cheer、pet.request_pet_next_step、pet.request_chat_reply) - 修改自动化设置命令族,例如
get_automation_jobs、create_automation_job、update_automation_job、get_automation_health或get_automation_run_history,尤其是它们在浏览器模式 DevBridge 与 mock 间的分流 - 修改浏览器资料 / 环境预设命令族,或调整它们在
mockPriorityCommands里的优先级 - 修改浏览器连接器命令族,例如安装目录、启用状态、系统连接器、浏览器动作配置、扩展安装状态、打开 Chrome 扩展 / 远程调试页,或主动断开扩展连接
- 修改
get_model_registry_provider_ids、Provider 模型映射或src-tauri/resources/models/index.json真相源读取语义 - 修改
create_image_generation_task_artifact、get_media_task_artifact、list_media_task_artifacts、cancel_media_task_artifact、src/lib/api/mediaTasks.ts、src/lib/api/skill-execution.ts、useWorkspaceSendActions、useWorkspaceImageWorkbenchActionRuntime、runtime_turn,或调整Claw @配图 -> harness.image_skill_launch -> Agent 首刀 Skill(image_generate) -> task/timeline的异步图片任务主链 - 修改
@封面parser、useWorkspaceSendActions、runtime_turn、cover_skill_launch、lime task create cover、cover_generateskill 或lime_create_cover_generation_task,尤其是调整Claw @封面 -> harness.cover_skill_launch -> Agent 首刀 Skill(cover_generate) -> task file主链 - 修改
@播报parser、useWorkspaceSendActions、runtime_turn、broadcast_skill_launch、lime task create broadcast、broadcast_generateskill 或lime_create_broadcast_generation_task,尤其是调整Claw @播报 -> harness.broadcast_skill_launch -> Agent 首刀 Skill(broadcast_generate) -> task file主链 - 修改
@素材parser、useWorkspaceSendActions、runtime_turn、resource_search_skill_launch、lime task create resource-search、modal_resource_searchskill 或lime_create_modal_resource_search_task,尤其是调整Claw @素材 -> harness.resource_search_skill_launch -> Agent 首刀 Skill(modal_resource_search) -> task file主链 - 修改
@搜索parser、useWorkspaceSendActions、runtime_turn、research_skill_launch、research默认 skill 或相关 tool timeline 展示,尤其是调整Claw @搜索 -> harness.research_skill_launch -> Agent 首刀 Skill(research) -> search_query / timeline主链 - 修改
@深搜parser、useWorkspaceSendActions、runtime_turn、deep_search_skill_launch、research默认 skill 或相关 tool timeline 展示,尤其是调整Claw @深搜 -> harness.deep_search_skill_launch -> Agent 首刀 Skill(research) -> 多轮 search_query / timeline主链 - 修改
@研报parser、useWorkspaceSendActions、runtime_turn、report_skill_launch、report_generate默认 skill 或相关 tool timeline 展示,尤其是调整Claw @研报 -> harness.report_skill_launch -> Agent 首刀 Skill(report_generate) -> search_query / timeline主链 - 修改
@站点搜索parser、useWorkspaceSendActions、runtime_turn、site_search_skill_launch、site_search默认 skill 或相关lime_site_*timeline 展示,尤其是调整Claw @站点搜索 -> harness.site_search_skill_launch -> Agent 首刀 Skill(site_search) -> lime_site_* / timeline主链 - 修改
@读PDFparser、useWorkspaceSendActions、runtime_turn、pdf_read_skill_launch、pdf_read默认 skill 或相关list_directory / read_filetimeline 展示,尤其是调整Claw @读PDF -> harness.pdf_read_skill_launch -> Agent 首刀 Skill(pdf_read) -> list_directory / read_file / timeline主链 - 修改
@总结parser、useWorkspaceSendActions、runtime_turn、summary_skill_launch、summary默认 skill 或相关 skill / tool timeline 展示,尤其是调整Claw @总结 -> harness.summary_skill_launch -> Agent 首刀 Skill(summary) -> 可选 list_directory/read_file / timeline主链 - 修改
@翻译parser、useWorkspaceSendActions、runtime_turn、translation_skill_launch、translation默认 skill 或相关 skill / tool timeline 展示,尤其是调整Claw @翻译 -> harness.translation_skill_launch -> Agent 首刀 Skill(translation) -> 可选 list_directory/read_file / timeline主链 - 修改
@分析parser、useWorkspaceSendActions、runtime_turn、analysis_skill_launch、analysis默认 skill 或相关 skill / tool timeline 展示,尤其是调整Claw @分析 -> harness.analysis_skill_launch -> Agent 首刀 Skill(analysis) -> 可选 list_directory/read_file / timeline主链 - 修改
@转写parser、useWorkspaceSendActions、runtime_turn、transcription_skill_launch、lime task create transcription、transcription_generateskill 或lime_create_transcription_task,尤其是调整Claw @转写 -> harness.transcription_skill_launch -> Agent 首刀 Skill(transcription_generate) -> task file主链 - 修改
@链接解析parser、useWorkspaceSendActions、runtime_turn、url_parse_skill_launch、lime task create url-parse、url_parseskill 或lime_create_url_parse_task,尤其是调整Claw @链接解析 -> harness.url_parse_skill_launch -> Agent 首刀 Skill(url_parse) -> task file主链 - 修改
@排版parser、useWorkspaceSendActions、runtime_turn、typesetting_skill_launch、lime task create typesetting、typesettingskill 或lime_create_typesetting_task,尤其是调整Claw @排版 -> harness.typesetting_skill_launch -> Agent 首刀 Skill(typesetting) -> task file主链 - 修改
@网页parser、useWorkspaceSendActions、runtime_turn、webpage_skill_launch、webpage_generateskill 或 HTML artifact 预览链路,尤其是调整Claw @网页 -> harness.webpage_skill_launch -> Agent 首刀 Skill(webpage_generate) -> write_file HTML artifact主链 - 修改
@PPTparser、useWorkspaceSendActions、runtime_turn、presentation_skill_launch、presentation_generateskill 或演示稿 artifact 预览链路,尤其是调整Claw @PPT -> harness.presentation_skill_launch -> Agent 首刀 Skill(presentation_generate) -> write_file Markdown artifact主链 - 修改
@代码parser、useWorkspaceSendActions、mention builtin command 或code_orchestrated发送边界,尤其是调整Claw @代码 -> harness.code_command -> code_orchestrated -> tools / team runtime主链 - 修改
@发布parser、useWorkspaceSendActions、content post workflow 入口或浏览器门禁推导,尤其是调整Claw @发布 -> displayContent/raw -> /content_post_with_cover -> publish workflow主链 - 修改
@配音parser、useWorkspaceSendActions、service_scene_launch组装、OEM runtime 上下文注入或lime_run_service_skill配音场景接线,尤其是调整Claw @配音 -> harness.service_scene_launch(scene_key=voice_runtime) -> lime_run_service_skill -> OEM run/timeline主链 - 修改
/scene-key解析、serviceSkillSceneLaunch、useWorkspaceSendActions、runtime_turn、prompt_context、lime_run_service_skill或client/skillsscene 目录协议,尤其是调整Claw /scene-key -> harness.service_scene_launch -> Agent 首刀 lime_run_service_skill -> OEM run/timeline主链 - 修改
src/lib/dev-bridge/ - 修改
src/lib/tauri-mock/ - 修改
src-tauri/src/app/runner.rs - 修改
src-tauri/src/dev_bridge/
如果本轮修改了 Claw @配图 或图片任务 artifact 回填语义,最低校验至少包含:
npm run test:contractscd src-tauri && cargo test test_merge_system_prompt_with_image_skill_launch_appends_promptcd src-tauri && cargo test test_append_image_skill_launch_session_permissions_blocks_detour_toolsimageWorkbenchCommand、useWorkspaceSendActions、受影响 skill / image task Hook 单测,以及aster_agent_cmd图片主链定向测试- 如果本轮还改了显式图片动作入口,例如文稿 inline 配图、封面位或图片工作台编辑/重绘,额外覆盖
useWorkspaceImageWorkbenchActionRuntime或对应发送桥接回归 - 若本轮还改了显式
execute_skill的images / requestContext透传或 compat 续接,额外覆盖skillCommand回归 - 受影响的
image task/image workbenchHook 单测 npm run verify:gui-smoke
如果本轮还修改了文稿 inline 配图占位逻辑,例如 usage=document-inline、relationships.slot_id、payload compat slot_id、anchor_section_title、anchor_text、正文占位块原位替换或文稿画布图片占位渲染,受影响回归至少要额外覆盖:
- 文稿占位块插入
relationships.slot_id绑定的原位替换anchor_section_title驱动的小节级插入anchor_text驱动的段落级插入- 失败 / 取消状态不误替换成成功图片
如果本轮修改了 Claw @封面 或封面任务协议,最低校验至少包含:
coverWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd封面主链 / detour tool 限制定向测试lime-cli封面任务创建回归、受影响的默认 skill / tool catalog 测试npm run test:contractsnpm run verify:gui-smoke
如果本轮修改了 Claw @视频 或视频任务协议,最低校验至少包含:
videoWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd视频主链 / detour tool 限制定向测试lime media video generate回归、受影响的默认 skill / tool catalog 测试npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @播报 或播报任务协议,最低校验至少包含:
broadcastWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd播报主链 / detour tool 限制定向测试lime-cli播报任务创建测试、受影响的默认 skill / tool catalog 测试npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @素材 或素材检索任务协议,最低校验至少包含:
resourceSearchWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd素材检索主链 / detour tool 限制定向测试lime-cli资源检索任务创建测试、受影响的默认 skill / tool catalog 测试npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @搜索 或搜索 prompt skill 协议,最低校验至少包含:
searchWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd搜索主链 / detour tool 限制定向测试research默认 skill / tool catalog 相关回归npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @深搜 或深搜 prompt skill 协议,最低校验至少包含:
deepSearchWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd深搜主链 / detour tool 限制定向测试research默认 skill / tool catalog 相关回归,且要确认没有退化成只执行一轮浅搜npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @研报 或研报 prompt skill 协议,最低校验至少包含:
reportWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd研报主链 / detour tool 限制定向测试report_generate默认 skill /skillCatalog相关回归,且要确认没有退回普通聊天长文或跳过真实search_querynpm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @站点搜索 或站点搜索 prompt skill 协议,最低校验至少包含:
siteSearchWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd站点搜索主链 / detour tool 限制定向测试site_search默认 skill /lime_site_*tool catalog 相关回归npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @读PDF 或读 PDF prompt skill 协议,最低校验至少包含:
pdfWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd读 PDF 主链 / detour tool 限制定向测试pdf_read默认 skill /skillCatalog相关回归;若支持相对路径,还要确认没有跳过真实list_directory / read_filetimelinenpm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @总结 或总结 prompt skill 协议,最低校验至少包含:
summaryWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd总结主链 / detour tool 限制定向测试summary默认 skill /skillCatalog相关回归;若支持文件路径总结,还要确认没有跳过真实list_directory / read_filetimelinenpm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @翻译 或翻译 prompt skill 协议,最低校验至少包含:
translationWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd翻译主链 / detour tool 限制定向测试translation默认 skill /skillCatalog相关回归;若支持文件路径翻译,还要确认没有跳过真实list_directory / read_filetimelinenpm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @分析 或分析 prompt skill 协议,最低校验至少包含:
analysisWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd分析主链 / detour tool 限制定向测试analysis默认 skill /skillCatalog相关回归;若支持文件路径分析,还要确认没有跳过真实list_directory / read_filetimelinenpm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @转写 或转写任务协议,最低校验至少包含:
transcriptionWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd转写主链 / detour tool 限制定向测试lime-cli转写任务创建测试、media-runtime任务类型回归、受影响的默认 skill / tool catalog 测试npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @链接解析 或链接解析任务协议,最低校验至少包含:
urlParseWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd链接解析主链 / detour tool 限制定向测试lime-cli链接解析任务创建测试、受影响的默认 skill / tool catalog 测试npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @排版 或排版任务协议,最低校验至少包含:
typesettingWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd排版主链 / detour tool 限制定向测试lime-cli排版任务创建测试、受影响的默认 skill / tool catalog 测试npm run test:contracts- 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @网页 或网页生成协议,最低校验至少包含:
webpageWorkbenchCommand、useWorkspaceSendActions、提及面板 builtin command 回归,以及aster_agent_cmd网页主链 / detour tool 限制定向测试webpage_generate默认 skill、默认 skill 安装或lime-cli skill show webpage_generate相关回归
如果本轮修改了 Claw @PPT 或演示稿生成协议,最低校验至少包含:
npx vitest run "src/components/agent/chat/utils/presentationWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx"cargo test presentation_skill_launchcargo test -p lime-cli skill_show_presentation_generate_returns_builtin_skillpresentation_generate默认 skill、默认 skill 安装或lime-cli skill show presentation_generate相关回归npm run test:contracts- 若 HTML artifact 预览主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @代码 或代码编排发送协议,最低校验至少包含:
npx vitest run "src/components/agent/chat/utils/codeWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx" "src/lib/api/skillCatalog.test.ts"- 如有改动扩散到 runtime/team/tool 协议,再补对应
agentStream*/ runtime team / tool display 定向回归 - 若命令边界或 harness 协议继续扩散,再补
npm run test:contracts - 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @发布 或发布工作流接线,最低校验至少包含:
npx vitest run "src/components/agent/chat/utils/publishWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx" "src/lib/api/skillCatalog.test.ts"- 如有改动扩散到
content_post_with_coverslash skill 或写文件回流,再补skillCommand/MessageList/ general workbench 相关定向回归 - 若浏览器门禁或 harness 协议继续扩散,再补
npm run test:contracts - 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Claw @配音 或配音服务型技能接线,最低校验至少包含:
npx vitest run "src/components/agent/chat/utils/voiceWorkbenchCommand.test.ts" "src/components/agent/chat/workspace/useWorkspaceSendActions.test.tsx" "src/components/agent/chat/skill-selection/CharacterMention.test.tsx" "src/lib/api/skillCatalog.test.ts" "src/lib/api/serviceSkills.test.ts"- 如有改动扩散到
service_scene_launchruntime、lime_run_service_skill、OEM scene run/poll 或云端结果回流,再补对应runtime_turn/prompt_context/tool_runtime/service_skill_tools定向测试 - 若
service_scene_launch/ harness 协议继续扩散,再补npm run test:contracts - 若 GUI 主路径受影响,再补
npm run verify:gui-smoke
如果本轮修改了 Provider 模型真相源或设置页中的“支持的模型”展示逻辑,还应额外确认:
- 资源索引损坏时,GUI 会明确提示“模型真相源异常”
- 不会再静默回退数据库或把错误伪装成空模型列表
Layer 4:交互型 E2E
入口:
docs/aiprompts/playwright-e2e.md
作用:
- 用 Playwright MCP 做真实页面交互验证
- 检查控制台错误、主导航、关键业务工作流
注意:
- 不要把所有页面默认都推进到重型 E2E
- 先跑最小 smoke,再决定是否需要完整交互验证
改动类型与最低门槛
| 改动类型 | 至少运行 | 额外要求 |
|---|---|---|
| 普通前端改动 | npm run verify:local |
如有用户可见变化,补稳定回归 |
| Tauri 命令 / Bridge / mock 改动 | npm run verify:local、npm run test:contracts |
必要时补 npm run governance:legacy-report |
| GUI 壳 / Workspace / 页面主路径改动 | npm run verify:local、npm run verify:gui-smoke |
必须补对应 UI 回归 |
| 运行时 handoff / 证据包导出改动 | npm run test:contracts、相关 vitest、Rust 定向测试 |
如入口落在工作台 UI,再补最小 GUI 续测 |
| 配置结构改动 | npm run verify:local |
同步 schema、消费者、文档 |
| 版本相关改动 | npm run verify:app-version |
与发布配置一起核对 |
| Rust 模块改动 | 受影响 crate / 模块定向测试 | 再决定是否跑全量 cargo test |
| 真实页面交互验证 | 先跑 npm run verify:gui-smoke |
再进入 playwright-e2e.md |
补充说明:
- 如果这次改动新增或调整公开 CLI(例如
@lime/cli、lime media ...),至少补受影响 crate 的定向测试;媒体 CLI 主链当前最低建议为cargo test --manifest-path src-tauri/Cargo.toml -p lime-media-runtime -p lime-cli。如果 CLI 结果会回流 Workbench/Agent,再补对应 Rust 或前端定向回归。 - 如果这次改动把
ServiceSkill -> automation_job -> agent_turn接到 Artifact 主线,除了常规verify:local/test:contracts之外,还应至少补一条稳定回归,证明content_id + request_metadata.artifact没在表单编辑或执行链路里丢失。 - 如果这次改动影响
Claw与站点技能的直跑门禁,还应补回归证明:阻断停留在技能入口层,不再把浏览器准备态注入成对话里的继续执行确认。 - 如果这次改动把
content_idsteady-state 从“每回合显式提交”后移到session/runtime,除了契约检查之外,还应补 Hook/UI 回归,证明:- session 已有
execution_runtime.recent_content_id时,前端不会重复提交相同harness.content_id
- session 已有
- 如果这次改动涉及上下文压缩语义,至少要同时验证两条运行时链路:
- 普通
agent_runtime_submit_turn发消息链路 agent_runtime_respond_action的 ask-user / elicitation 恢复链路 二者在workspace.settings.auto_compact=false时都不应再偷偷触发自动压缩,而应把“请手动压缩或新建会话”的错误显式投影到前端。- 切换到新 content 但 runtime 尚未同步时,前端仍会保留显式
content_id
- 普通
- 如果这次改动把
theme / session_modesteady-state 从“每回合显式提交”后移到session/runtime,除了契约检查之外,还应补 Hook/UI 回归,证明:- session 已有
execution_runtime.recent_theme / recent_session_mode时,前端不会重复提交相同harness.theme / harness.session_mode - 切换到新 theme 或
general_workbench但 runtime 尚未同步时,前端仍会保留显式theme / session_mode
- session 已有
- 如果这次改动影响
harness.team_memory_shadow这类 repo-scoped Team 协作上下文,除了契约检查之外,还应补:- 前端发送边界回归,确认
team_memory_shadow能随当前请求进入agent_runtime_submit_turn - Rust
prompt_context定向测试,确认 shadow 只作为低优先级协作参考,不覆盖显式selected_team_*或recent_team_selection
- 前端发送边界回归,确认
- 如果这次改动影响
agent_runtime_spawn_subagent的 current request surface,除了契约检查之外,还应补:- Rust 定向测试,确认显式
name会覆盖 child session 展示名 / role hint 的 fallback - Rust 或前端回归,确认
teamName必须与name搭配,并且只在现有 Team 上下文内写回成员关系 - Rust 定向测试,确认当前 runtime 对非空
mode / isolation会返回明确 unsupported,而不是静默忽略 - 定向验证,确认绝对
cwd会投影到 childworking_dir,相对路径会在边界被拒绝
- Rust 定向测试,确认显式
- 如果这次改动把
accessModesteady-state 从“只写 harness metadata”收敛到正式 turn context 与session/runtime,除了契约检查之外,还应补 Hook/UI 回归,证明:- turn 提交始终携带正式
approval_policy / sandbox_policy - session 已有
execution_runtime.recent_access_mode时,切换话题会恢复对应 accessMode,而不是回退到工作区默认值 - execution_runtime 缺失但本地 shadow 已命中时,前端仍会回填
recent_access_mode到 session
- turn 提交始终携带正式
- 如果这次改动把
gate_key / run_titlesteady-state 从“每回合显式提交”后移到session/runtime,除了契约检查之外,还应补 Hook/UI 回归,证明:- session 已有
execution_runtime.recent_gate_key / recent_run_title时,前端不会重复提交相同harness.gate_key / harness.run_title - 切换到新的通用工作区 gate 或运行标题、但 runtime 尚未同步时,前端仍会保留显式
gate_key / run_title
- session 已有
- 如果这次改动影响浏览器工作台里的站点采集链路,例如推荐区、资料自动选择、
site_get_adapter_launch_readiness门禁、report_hint展示、lime_site_recommend,或“优先写回当前content_id而不是新建资源文档”的主线收敛,除了契约检查,还应补对应*.test.tsx回归并执行verify:gui-smoke。 - 如果这次改动影响浏览器资料 / 环境预设的真实来源,还应补一次浏览器模式实测,确认控制台不再出现
[Mock] invoke: list_browser_profiles_cmd或[Mock] invoke: list_browser_environment_presets_cmd。 - 如果这次改动影响设置页“连接器”主路径或 Chrome 扩展导出链路,除了
test:contracts,还应补对应设置页回归,并在 GUI smoke 或 Playwright 续测里确认连接器页能打开、目录可选、扩展状态可读。 - 如果这次改动影响
agent_runtime_export_handoff_bundle、agent_runtime_export_evidence_pack、agent_runtime_export_analysis_handoff、agent_runtime_export_review_decision_template、agent_runtime_save_review_decision或agent_runtime_export_replay_case这条 Harness 导出 / 审核主链,除了契约检查,还应至少补:src/lib/api/agent.test.ts一类的网关回归,确认仍走统一agent_runtime_*主命令HarnessStatusPanel.test.tsx一类的 UI 回归,确认导出入口、保存弹窗、状态与制品展示正常- 受影响 Rust 服务 / 命令的定向测试,确认
.lime/harness/sessions/<session_id>/...一类制品仍能生成
CI 事实源
主工作流:
.github/workflows/quality.yml
关键事实源:
scripts/quality-task-planner.mjsscripts/quality-task-selector.mjsscripts/local-ci.mjs
要求:
- 本地
verify:local与 CI 使用同一套 changed-path 分类逻辑 - 最终由
resultsjob 聚合为统一质量信号 - 对 GUI 产品来说,PR 门禁不能只覆盖静态检查,还必须覆盖
Bridge & Contracts与GUI Smoke
PR 前最小清单
发起 PR 前,至少自问这五件事:
- 这次改动属于普通逻辑、协议边界、GUI 主路径还是治理收口?
- 我是不是已经走过对应的最低校验?
- 如果改了命令、配置或版本,相关文档与锁文件是否同步?
- 如果改了用户可见 UI,是否补了稳定回归?
- 如果改了 GUI 壳、Bridge、Workspace,是否真的跑过最小 smoke?
常用命令
# 本地统一校验
npm run verify:local
npm run verify:local:full
# GUI 最小冒烟
npm run verify:gui-smoke
npm run smoke:workspace-ready
npm run smoke:browser-runtime
npm run smoke:site-adapters
# 前端 / 桥接 / 契约
npm test
npm run test:bridge
npm run test:contracts
npm run bridge:health -- --timeout-ms 120000
# GUI / headless 调试
npm run tauri:dev:headless
相关文档
docs/aiprompts/commands.mddocs/aiprompts/governance.mddocs/aiprompts/playwright-e2e.md
决策原则
只有一句话:
Lime 是 GUI 桌面产品,工程质量不能只验证“代码能编译”,还要验证“应用壳、桥接、工作区主路径能运行”。