chore: release v0.98.0

This commit is contained in:
coso
2026-03-29 14:15:34 +08:00
parent dfbbb3d204
commit deceacc699
435 changed files with 35673 additions and 8535 deletions
+4
View File
@@ -17,6 +17,8 @@
- `overview.md` - 项目架构总览与模块分层
- `governance.md` - 新旧并存治理、迁移收口、禁止回流
- `quality-workflow.md` - 本地校验、GUI smoke、契约检查、CI 门禁
- `skill-standard.md` - 统一技能标准、skill / adapter / runtime binding 边界
- `site-adapter-standard.md` - 站点适配器标准、来源导入边界、运行时收敛规则
- `project-heatmap.md` - 仓库热力图与治理候选分析
- `limecore-collaboration-entry.md` - 跨仓库联动入口
- `../tech/harness/README.md` - Lime Harness Engineering 总入口与实施蓝图
@@ -53,6 +55,8 @@
- **改 UI / 页面结构**:先读 `design-language.md`,再看 `quality-workflow.md`
- **改 Tauri 命令 / Bridge / mock**:先读 `commands.md`,再看 `quality-workflow.md`
- **改 Claw 技能 / Service Skill / 统一 Skills 标准**:先读 `skill-standard.md`
- **改站点适配器 / 导入外部 adapter**:先读 `site-adapter-standard.md`,再看 `quality-workflow.md`
- **改 Workspace / GUI 壳 / 主路径**:先读 `workspace.md`、`quality-workflow.md`、`playwright-e2e.md`
- **做迁移 / 收口 / 去兼容层**:先读 `governance.md`
- **改 Provider / 凭证加载 / Token 刷新**:先读 `providers.md`、`credential-pool.md`
+10 -5
View File
@@ -33,6 +33,7 @@
- `get_browser_connector_install_status_cmd`
- `install_browser_connector_extension_cmd`
- `open_browser_extensions_page_cmd`
- `disconnect_browser_connector_session`
这些命令属于当前设置主路径,不应再在页面组件里散落裸 `invoke`。
@@ -157,9 +158,10 @@ npm run verify:local
如果命令边界改动影响会话运行时恢复语义,例如:
- `agent_runtime_update_session` 新增或调整 `provider_name / model_name / execution_strategy / recent_preferences / recent_team_selection`
- `getSession/listSessions` 的 `execution_runtime` 新增或调整 `recent_theme / recent_session_mode / recent_gate_key / recent_run_title / recent_content_id`
- 话题切换时的 provider/model、工具偏好、Team 选择,或 `theme / session_mode / gate_key / run_title / content_id` 恢复从本地 fallback 向 `execution_runtime` 收敛
- `agent_runtime_submit_turn.turn_config` 新增或调整 `approval_policy / sandbox_policy`
- `agent_runtime_update_session` 新增或调整 `provider_name / model_name / execution_strategy / recent_access_mode / recent_preferences / recent_team_selection`
- `getSession/listSessions` 的 `execution_runtime` 新增或调整 `recent_access_mode / recent_theme / recent_session_mode / recent_gate_key / recent_run_title / recent_content_id`
- 话题切换时的 provider/model、权限 accessMode、工具偏好、Team 选择,或 `theme / session_mode / gate_key / run_title / content_id` 恢复从本地 fallback 向 `execution_runtime` 收敛
除了契约检查,还应补对应 Hook / UI 稳定回归,确认切换话题后模型选择器恢复的是会话 runtime,而不是陈旧本地缓存。
@@ -201,7 +203,8 @@ npm run verify:local
以下是仓库当前已经明确收敛的几个方向:
- **Agent / Codex 主命令**:继续收敛到 `agent_runtime_*`
- **会话状态回写主链**:继续收敛到 `agent_runtime_update_session`,用于名称、执行策略、session provider/model、`recent_preferences` 以及 `recent_team_selection` 的轻量持久化回写
- **会话状态回写主链**:继续收敛到 `agent_runtime_update_session`,用于名称、执行策略、session provider/model、`recent_access_mode`、`recent_preferences` 以及 `recent_team_selection` 的轻量持久化回写
- **会话权限主链**:`agent_runtime_submit_turn.turn_config.approval_policy / sandbox_policy` 是正式 turn context 权限协议;`getSession` 返回的 `execution_runtime.recent_access_mode` 负责承接会话最近一次 accessMode。当前端已命中同一 steady-state 权限时,不应继续依赖 `harness.access_mode` 作为唯一事实源
- **运行时交接导出主链**:继续收敛到 `agent_runtime_export_handoff_bundle`;前端统一通过 `src/lib/api/agentRuntime.ts` 网关进入,当前 GUI 入口位于 `HarnessStatusPanel`
- **运行时证据导出主链**:继续收敛到 `agent_runtime_export_evidence_pack`,用于把 runtime / timeline / artifacts 打包成最小问题证据
- **运行时 replay 样本主链**:继续收敛到 `agent_runtime_export_replay_case`,复用 handoff bundle + evidence pack 生成 `input / expected / grader / evidence-links`
@@ -221,9 +224,11 @@ npm run verify:local
补充约定:
- **站点能力主链**:继续收敛到 `site_list_adapters / site_recommend_adapters / site_search_adapters / site_get_adapter_info / site_run_adapter`
- **站点能力主链**:继续收敛到 `site_list_adapters / site_recommend_adapters / site_search_adapters / site_get_adapter_info / site_get_adapter_launch_readiness / site_get_adapter_catalog_status / site_import_adapter_yaml_bundle / site_run_adapter`
- **站点适配器导入主链**:`site_import_adapter_yaml_bundle` 只负责把外部 YAML 来源编译为 Lime 标准并写入 `imported` 目录,不允许带入第二套 runtime、daemon 或自动唤醒浏览器链路
- **站点 Agent 工具主链**:继续收敛到 `lime_site_list / lime_site_recommend / lime_site_search / lime_site_info / lime_site_run`
- **站点结果沉淀主线**:`site_run_adapter` / `lime_site_run` 优先透传 `content_id` 写回当前主稿;只有缺少 `content_id` 时,才回退到 `project_id` 新建结果文档
- **Claw 站点直跑门禁主链**:`site_get_adapter_launch_readiness` 只负责检测“是否存在已附着的真实浏览器会话 + 目标站点上下文”;`site_run_adapter.require_attached_session = true` 时,后端必须拒绝 managed/default fallback,不能后台偷偷起 Chrome
- **站点运行失败语义**:`SiteAdapterRunResult` 至少统一输出 `auth_required / no_matching_context / adapter_runtime_error`,并在前端与 Agent 结果里保留 `report_hint`
- **浏览器资料 / 环境预设主链**:`list/save/archive/restore_browser_profile_cmd` 与 `list/save/archive/restore_browser_environment_preset_cmd` 已进入真实 DevBridge 主路径;浏览器模式下不应再默认放进 `mockPriorityCommands`,仅在 DevBridge 不可用时才允许回落 `defaultMocks`
+7
View File
@@ -143,6 +143,13 @@ npm run test:contracts
**不是鼓励走新路,而是先封住老路。**
这同样适用于已经删除的旧 UI 壳或旧组件路径:
- 删除旧文件后,仍应在治理目录册里补 import / 文本守卫,防止后续 AI 或人工把旧路径重新接回主链
- 如果已经把重复 UI 的扁平 props 收口为共享契约,也应补对应文本 / 正则守卫,防止父层透传和子层接口一起长回旧面
- 如果共享契约还依赖单独的构造器或归一化 helper,应继续限制只有事实源边界能调用它,不要让运行时代码到处重新拼装
- 如果多个页面或面板展示的是同一份状态,也要把状态文案收敛到共享 helper,不要让首页、下拉面板、状态徽标各自重新命名
### 6. 主链路和旁路一起治理
如果只迁:
+15 -1
View File
@@ -22,6 +22,14 @@ Lime 是一个以创作为中心的本地优先 AI Agent 交互工作台,基
在 Lime 中,Skills 处于比 MCP 更贴近产品的一层:它不是底层原语,而是将领域经验、交互方式和执行流程打包后的编排单元。
对 Lime 来说,Skills 还必须继续区分:
- `skill`:产品入口与业务语义
- `adapter / tool`:底层能力工件
- `runtime binding`:最终执行绑定
统一技能标准见 [skill-standard.md](skill-standard.md),站点工件子标准见 [site-adapter-standard.md](site-adapter-standard.md)。
## 项目结构
```
@@ -53,7 +61,7 @@ lime/
| `workspace/` | 工作区与项目边界,承载文件、会话与配置上下文 |
| `components/agent/` | Agent 对话主入口,负责会话、流式事件与交互 |
| `components/content-creator/` | 主题化创作工作台与画布联动 |
| `skills/` | 技能加载、标准校验与经验编排能力 |
| `skills/` | 技能加载、标准校验与经验编排能力;统一遵循 `skill-standard.md` |
| `lib/artifact/` | Artifact 解析、状态与轻量渲染器 |
| `memory / style / personas` | 项目记忆、风格策略与人设沉淀 |
@@ -109,6 +117,10 @@ lime/
| `lib/artifact/` | Artifact 状态与解析 |
| `pages/` | 独立窗口与页面入口 |
补充约束:
- `开发者中心 -> 处理工作台与信息收集` 由 `config.developer.workspace_harness_enabled` 控制,默认关闭;关闭时通用对话不应显示“处理工作台”入口,也不应继续触发对应运行态信息收集链路。
## 数据流
```
@@ -211,6 +223,7 @@ lime/
### 产品与工作台
- [workspace.md](workspace.md) - Workspace 边界与工作区设计
- [content-creator.md](content-creator.md) - 主题化创作工作台
- [skill-standard.md](skill-standard.md) - 统一技能标准、目录与运行边界
- [../../src-tauri/src/skills/README.md](../../src-tauri/src/skills/README.md) - Skills 标准与集成
- [terminal.md](terminal.md) - 终端能力
- [mcp.md](mcp.md) - MCP 服务器
@@ -230,6 +243,7 @@ lime/
### 配置、服务与数据
- [commands.md](commands.md) - Tauri 命令
- [site-adapter-standard.md](site-adapter-standard.md) - 站点适配器标准与外部来源接入边界
- [services.md](services.md) - 业务服务
- [database.md](database.md) - 数据库层
- [performance-profiling.md](performance-profiling.md) - 性能分析与火焰图
+30 -2
View File
@@ -142,14 +142,33 @@ npm run test:contracts
7. 如工作台模式开启自动保存,再确认执行成功后保存态文案与打开入口正常
8. 打开控制台并确认浏览器资料 / 环境预设读取没有落回 web mock,尤其不应出现 `[Mock] invoke: list_browser_profiles_cmd` 或 `[Mock] invoke: list_browser_environment_presets_cmd`
### Claw 站点技能直跑门禁验证
1. 在 `Claw` 首页打开一个站点型技能弹窗
2. 如果当前没有附着真实浏览器会话,确认主按钮保持禁用,并出现“需要浏览器工作台 / 重新检测会话”的门禁提示
3. 点击 `去浏览器工作台`,确认只发生页面跳转,不会后台偷偷拉起 Chrome
4. 在浏览器工作台附着到真实浏览器并打开目标站点后,回到 `Claw` 再次打开同一技能
5. 确认此时主按钮变为可执行,点击后进入 `Claw` 工作区
6. 确认消息流顶部出现独立的站点技能执行卡,状态依次体现 `执行中 / 已完成` 或明确阻断原因,而不是伪装成普通聊天消息
### 开发者页站点来源导入验证
1. 进入 `设置 -> 开发者`
2. 在 `站点脚本目录联调` 区块找到 `外部来源 YAML 导入`
3. 粘贴一份仅包含 Lime 支持子集的 YAML 来源,点击 `导入到 Lime 标准`
4. 验证摘要区来源切换为 `外部导入`,且适配器列表出现新导入名称
5. 再点击 `清空站点目录缓存`,确认来源恢复为 `应用内置`,列表回退到 bundled 目录
6. 导入与清理全过程都不应出现后台自动拉起浏览器、自动唤醒 Chrome 或常驻浏览器控制进程
### 连接器页验证
1. 进入 `设置 -> 连接器`
2. 确认首页能看到“我的浏览器”“macOS 连接器/系统连接器”“高级控制”三块主区域
2. macOS 下确认首页能看到“我的浏览器”“macOS 连接器”“高级控制”三块主区域;Windows 与其他非 macOS 平台默认不应出现系统连接器卡片
3. 点击“展开高级控制”,确认 `总览 / Profile / 桥接 / 后端 / 调试` 页签可切换
4. 如当前环境允许目录选择,点击“选择目录并安装”或“同步更新扩展”,确认安装目录最终落到固定子目录 `Lime Browser Connector`
5. 点击“复制配置”,确认剪贴板内容包含 `serverUrl / bridgeKey / profileKey`
6. 如当前环境接通真实后端,再确认“打开 Chrome 扩展页”可成功唤起浏览器扩展管理页
6. 如当前环境已有 observer 连接,再确认“断开已连接扩展”能把页面状态回退到等待连接
7. 如当前环境接通真实后端,再确认“打开 Chrome 扩展页”可成功唤起浏览器扩展管理页
### 话题模型恢复验证
@@ -159,6 +178,15 @@ npm run test:contracts
4. 验证模型选择器恢复的是该话题最近一次 session runtime,而不是陈旧的 localStorage 默认值
5. 如页面暴露运行时摘要条,再确认 provider/model 文案与选择器一致
### 话题权限恢复验证
1. 进入同一工作区中的两个话题
2. 在话题 A 选择 `只读`,在话题 B 选择 `当前工作区` 或 `完全访问`
3. 在两个话题之间来回切换,必要时刷新页面后再切回
4. 验证输入框权限选择器恢复的是该话题最近一次 accessMode,而不是工作区级默认值
5. 如页面暴露运行时摘要、调试面板或开发日志,继续确认恢复依据是当前话题最近一次 `execution_runtime.recent_access_mode`
6. 再立即发送一条消息,确认本轮会沿用该 accessMode 对应的正式权限策略,而不是只在 metadata 里残留旧的 `harness.access_mode`
### 话题工具偏好恢复验证
1. 进入同一工作区中的两个话题
+10 -5
View File
@@ -164,11 +164,12 @@ npm run bridge:health -- --timeout-ms 120000
高频场景:
- 修改 `safeInvoke` / `invoke`
- 修改 `agent_runtime_update_session` 或会话 provider/model / recent_preferences / recent_team_selection 恢复语义
- 修改 `execution_runtime.recent_theme / recent_session_mode / recent_gate_key / recent_run_title / recent_content_id` 恢复语义,或前端 `harness.theme / harness.session_mode / harness.gate_key / harness.run_title / harness.content_id` steady-state 去重逻辑
- 修改 `site_*` 站点适配器命令族,例如 `site_recommend_adapters`、`site_run_adapter`
- 修改 `agent_runtime_submit_turn.turn_config.approval_policy / sandbox_policy`
- 修改 `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_id` steady-state 去重逻辑
- 修改 `site_*` 站点适配器命令族,例如 `site_recommend_adapters`、`site_get_adapter_launch_readiness`、`site_import_adapter_yaml_bundle`、`site_run_adapter`
- 修改浏览器资料 / 环境预设命令族,或调整它们在 `mockPriorityCommands` 里的优先级
- 修改浏览器连接器命令族,例如安装目录、启用状态、系统连接器和扩展安装状态
- 修改浏览器连接器命令族,例如安装目录、启用状态、系统连接器、扩展安装状态或主动断开扩展连接
- 修改 `src/lib/dev-bridge/`
- 修改 `src/lib/tauri-mock/`
- 修改 `src-tauri/src/app/runner.rs`
@@ -212,10 +213,14 @@ npm run bridge:health -- --timeout-ms 120000
- 如果这次改动把 `theme / session_mode` steady-state 从“每回合显式提交”后移到 `session/runtime`,除了契约检查之外,还应补 Hook/UI 回归,证明:
- session 已有 `execution_runtime.recent_theme / recent_session_mode` 时,前端不会重复提交相同 `harness.theme / harness.session_mode`
- 切换到新 theme 或 `theme_workbench` 但 runtime 尚未同步时,前端仍会保留显式 `theme / session_mode`
- 如果这次改动把 `accessMode` steady-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
- 如果这次改动把 `gate_key / run_title` steady-state 从“每回合显式提交”后移到 `session/runtime`,除了契约检查之外,还应补 Hook/UI 回归,证明:
- session 已有 `execution_runtime.recent_gate_key / recent_run_title` 时,前端不会重复提交相同 `harness.gate_key / harness.run_title`
- 切换到新的 Theme Workbench gate 或运行标题、但 runtime 尚未同步时,前端仍会保留显式 `gate_key / run_title`
- 如果这次改动影响浏览器工作台里的站点采集链路,例如推荐区、资料自动选择、`report_hint` 展示、`lime_site_recommend`,或“优先写回当前 `content_id` 而不是新建资源文档”的主线收敛,除了契约检查,还应补对应 `*.test.tsx` 回归并执行 `verify:gui-smoke`。
- 如果这次改动影响浏览器工作台里的站点采集链路,例如推荐区、资料自动选择、`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 导出 / 审核主链,除了契约检查,还应至少补:
+381
View File
@@ -0,0 +1,381 @@
# Lime 站点适配器标准
## 这份文档回答什么
本文件定义 Lime 仓库中站点适配器能力的唯一工程标准,主要回答:
- Lime 自己认可的站点适配器标准长什么样
- 外部来源为什么不能直接成为 Lime 的事实源
- 站点适配器应该如何接入、执行、校验与治理
- 如何避免因为接入外部适配器库而把 Lime 做成“万国牌”
它是 **站点适配器能力的工程标准文档**,不是某个外部项目的引入说明书。
如果讨论的是 Skills 总模型、`skill / adapter / runtime binding` 总边界,先读 [skill-standard.md](skill-standard.md),再回到本文。
## 第一原则
**Lime 有自己的标准。来源可以有多个,但标准只能有一个。**
对 Lime 来说:
- 可以有多个 adapter 来源
- 仓库内手写
- 服务端下发
- 外部项目导入
- 但 Lime 内部只能存在一个继续演进的适配器标准
从现在开始,站点适配器能力的唯一事实源应收敛到:
> `Lime Site Adapter Spec`
外部项目只能提供“原料”,不能提供 Lime 的运行时标准、协议标准或状态标准。
换句话说:
- 可以接更多来源
- 不能接更多“标准”
- 不能让来源格式反过来定义 Lime 的产品边界
如果某个外部来源和 Lime 标准冲突,优先保留 Lime 标准,而不是为了兼容把 Lime 改成第二套产品。
## 什么时候先读
出现以下任一情况时,先读本文件,再决定是否写代码:
- 想新增一个站点适配器
- 想从外部项目导入适配器
- 想扩展站点适配器字段、参数类型或执行语义
- 想调整 `site_*` 命令族的输入输出结构
- 想新增第二套站点执行引擎、pipeline 或 bridge
- 发现站点采集能力开始出现多套定义、多套错误语义或多套运行时
如果问题已经上升为“业务 skill 如何引用 adapter、服务端如何下发统一技能目录、用户入口应该如何表达”,先回到 [skill-standard.md](skill-standard.md)。
## 非目标
本标准明确不负责以下目标:
- 定义另一套浏览器 runtime
- 为外部项目保留原生执行模型
- 支持所有外部适配器语义的 100% 兼容
- 为了“接得更多”而放松 Lime 的产品边界
尤其不要把“支持更多站点”误解成:
- 再引一套 daemon
- 再引一套浏览器扩展协议
- 再引一套站点 pipeline runtime
## 标准分层
Lime 的站点适配器能力必须分成三层:
### 1. 来源层
作用:
- 提供原始 adapter 定义
- 可以来自仓库内、服务端或外部项目
特点:
- 不直接参与 Lime 执行
- 不直接决定 Lime 错误语义
- 不直接决定 Lime 前端展示模型
### 2. 编译层
作用:
- 把来源层 adapter 转换为 Lime 标准
- 做字段收敛、语义校验、步骤白名单检查
特点:
- 是外部来源进入 Lime 的唯一入口
- 是站点适配器治理边界
- 负责拒绝不符合 Lime 标准的来源 adapter
### 3. 执行层
作用:
- 执行已经被编译为 Lime 标准的适配器
特点:
- 只能使用 Lime 当前浏览器执行主链
- 不允许外部来源自带执行内核绕过 Lime runtime
## Lime Site Adapter Spec v1
Lime 内部适配器标准至少包含以下字段语义:
- `name`
- 唯一标识,推荐 `site/name` 形式
- `domain`
- 目标站点主域名
- `description`
- 面向用户和开发者可读的说明
- `read_only`
- 是否只读
- `capabilities`
- 当前适配器暴露的能力标签
- `args`
- 已归一化后的参数定义
- `example`
- 最小可运行示例
- `auth_hint`
- 登录态或上下文要求
- `entry`
- 入口 URL 规则
- `script`
- Lime 当前唯一执行脚本
- `source_kind`
- 来源类型,例如 `bundled` / `server_synced` / `imported`
- `source_version`
- 来源版本号或快照标识
现有实现的主承载结构为:
- `src-tauri/src/services/site_adapter_registry.rs` 中的 `SiteAdapterSpec`
如果未来字段扩展,仍然必须收敛到 Lime 自己的标准模型,而不是向外部项目的原始结构靠拢。
## 标准优先级
站点适配器相关决策的优先级固定如下:
1. Lime 产品边界
2. Lime Site Adapter Spec
3. Lime 当前浏览器运行时主链
4. 外部来源可提供的原始 adapter 定义
这意味着:
- 外部来源只能被编译、裁剪、白名单化后进入 Lime
- 不能为了保留来源格式的完整性,引入第二套 runtime、协议或错误语义
- 不能因为“某来源支持某能力”就直接判定 Lime 也应该支持
## 命名标准
适配器唯一标识统一使用:
- `site/name`
示例:
- `reddit/hot`
- `zhihu/hot`
- `github/search`
禁止:
- 让来源项目自己的内部 ID 成为 Lime 对外主标识
- 同时维护多套命名规则
## 参数标准
参数定义必须先归一化,再进入 Lime 主链。
`v1` 建议先稳定在最小集合:
- `string`
- `integer`
每个参数至少应有:
- `name`
- `description`
- `required`
- `arg_type`
- `example`
不要在第一阶段为了兼容外部来源而引入复杂参数系统。
## 执行标准
### 1. 运行时只能走 Lime 主链
站点适配器的真实执行,只允许走 Lime 当前运行时路径:
- `managed_cdp`
- `existing_session`
禁止:
- 直接调用外部项目自带 daemon 作为 Lime 主执行链
- 直接让外部项目控制 Chrome / Chromium 生命周期
- 在 Lime 内部并行保留第二套 site adapter runtime
### 2. 当前执行模型以 script 为唯一主格式
对 Lime 来说,站点适配器当前主格式是:
- 归一化 manifest
- 归一化 script
- 通过现有 runtime 执行 script
如果外部来源使用:
- YAML pipeline
- 自定义表达式系统
- 特定 bridge 协议
都必须先编译为 Lime 现有 script 模型。
不要直接把外部 pipeline engine 搬进 Lime。
### 3. 步骤兼容必须采用白名单
对外部 adapter 的语义兼容,必须采用白名单,而不是黑名单。
`v1` 推荐只允许:
- `navigate`
- `evaluate`
- `map`
- `filter`
- `limit`
- `sort`
`v1` 明确不允许:
- `intercept`
- `tap`
- `Desktop` 模式
- 依赖浏览器扩展上下文的动作
- 依赖 daemon 会话协议的动作
- 隐式启动、唤醒、关闭浏览器的动作
对不支持步骤,必须在导入阶段直接失败。
## 错误语义标准
Lime 的适配器错误语义必须统一,不能跟着来源项目漂移。
至少保持以下错误类型继续收敛:
- `auth_required`
- `no_matching_context`
- `adapter_runtime_error`
- `site_unreachable`
- `internal_error`
错误信息可以引用来源 adapter 的上下文,但错误分类、前端提示和结果结构必须以 Lime 为准。
## 产品边界标准
这是站点适配器能力不可突破的边界。
### 明确禁止
- 无任务时后台自动执行适配器
- 自动启动浏览器
- 自动唤醒浏览器
- 自动连接外部 daemon
- 常驻后台的浏览器控制进程
- 用户未明确发起时预热站点运行时
### 只允许
- 用户显式发起一次站点任务
- Lime 在可见状态下执行
- 用户可感知当前使用的浏览器上下文
- 执行完成后及时收口
如果某个外部来源天然依赖“后台常驻自动化”,它就不能原样进入 Lime 主链。
## 外部来源接入规则
外部来源接入必须遵守以下顺序:
1. 先盘点来源能力
2. 再定义支持子集
3. 再做编译器
4. 再导入白名单 adapter
5. 最后才允许进入 Lime 主链
禁止:
- 未经过编译层直接执行来源 adapter
- 全量导入来源仓库的全部 adapter
- 把来源项目的 runtime 一并当成捷径接入
## 外部适配器来源 的定位
`外部适配器来源` 在 Lime 中的定位必须被明确限定为:
- **站点适配器来源**
而不能是:
- Lime 的浏览器 runtime
- Lime 的适配器事实源
- Lime 的协议事实源
也就是说:
> Lime 可以借 YAML 来源 的 adapter,但不能把 YAML 来源 变成 Lime。
## 治理标准
治理时统一沿用仓库的 `current / compat / deprecated / dead` 语言。
对站点适配器能力,建议这样判断:
- `current`
- `Lime Site Adapter Spec`
- 当前 `site_*` 命令族
- 当前 `managed_cdp / existing_session` 执行主链
- `compat`
- 仅为迁移期保留的来源转换层
- `deprecated`
- 已经不再建议新增依赖的旧 adapter 表示格式
- `dead`
- 已无入口、无引用、无导入计划的旧来源代码
任何新的来源项目接入,如果引入了第二套运行时、第二套错误语义或第二套前端结果模型,就说明已经偏离本标准。
## 校验与交付
修改站点适配器能力时,除了常规工程校验,还应至少回答以下问题:
1. 这次改动是否仍然收敛到 `Lime Site Adapter Spec`
2. 是否新增了第二套执行主链
3. 是否破坏了当前 `site_*` 命令族的统一语义
4. 是否引入了后台自动化副作用
5. 是否补了站点适配器目录、搜索、推荐、运行的最小验证
推荐最小校验:
```bash
npm run test:contracts
npm run verify:gui-smoke
npm run smoke:site-adapters
```
如果只是新增或调整适配器来源规则,也应至少补对应文档和最小 smoke 说明。
## 实施建议
如果下一步要把外部 adapter 引入 Lime,推荐按以下顺序推进:
1. 先冻结 `Lime Site Adapter Spec v1`
2. 建立来源导入服务
3. 建立步骤白名单
4. 只导入只读、安全、无后台副作用的 adapter
5. 跑通 3 到 5 个站点后再扩面
不要一开始就追求:
- 全量兼容
- 全量站点导入
- 全量步骤支持
站点适配器能力的目标是 **标准化扩展**,不是 **来源堆砌**。
## 一句话版本
> Lime 可以吸收外部 adapter 能力,但所有来源都必须先编译成 Lime 标准,再交给 Lime 自己的 runtime 执行。
+442
View File
@@ -0,0 +1,442 @@
# Lime Skills 标准
## 这份文档回答什么
本文件定义 Lime 仓库里 `skill` 能力的统一工程标准,主要回答:
- Lime 自己认可的 skill 标准长什么样
- `skill`、`adapter`、`runtime binding` 的边界分别是什么
- 为什么外部 `SKILL.md` 仓库只能作为说明层参考,不能直接成为 Lime 的正式标准
- 以后新增 Claw 业务技能、站点技能、提示词技能时,应该如何保持一致
它是 **Lime 技能能力的总标准文档**。
其中:
- [site-adapter-standard.md](site-adapter-standard.md) 是站点适配器子标准
- 本文负责技能总模型、事实源、分发和 UI 表达边界
## 第一原则
**Lime 有自己的 skills 标准。来源可以多个,但标准只能有一个。**
对 Lime 来说,可以同时存在:
- 服务端下发的技能目录
- 仓库内 seeded 技能目录
- 外部项目提供的 `SKILL.md` / YAML / adapter 来源
但 Lime 内部继续演进的标准只能有一套。
从现在开始,技能能力的唯一长期事实源应收敛到:
> `Lime Skill Spec`
外部仓库只能提供:
- 说明层模板
- 来源层原料
- 触发语义参考
不能直接提供:
- Lime 的运行时协议
- Lime 的分发协议
- Lime 的 UI 表达标准
- Lime 的自动化与浏览器行为边界
## 什么时候先读
出现以下任一情况时,先读本文件,再决定是否写代码:
- 想新增一个 Claw 业务技能
- 想把站点 adapter 封装成业务 skill
- 想新增 prompt-only 技能或说明型技能
- 想扩展服务端 `serviceSkillCatalog` / 未来 `skillCatalog`
- 想修改 `ServiceSkillItem`、`ClientServiceSkillCatalog` 或对应 UI 入口
- 想讨论 skill 与 adapter、Tool Hub、Scene、Claw 的边界
- 发现仓库里开始出现多套 skill 定义、多套入口术语或多套运行语义
如果问题已经缩小到站点适配器字段、脚本、导入和执行,先回到 [site-adapter-standard.md](site-adapter-standard.md)。
## 非目标
本标准明确不负责以下目标:
- 定义另一套浏览器 runtime
- 让外部 `SKILL.md` 直接成为 Lime 运行时协议
- 把 adapter 当成 skill 本体
- 为了兼容来源而长期维护第二套 skill 协议
- 在第一阶段把所有既有实现一次性重命名重构完
尤其不要把“支持更多技能”误解成:
- 再造一个平级的 `service skill` 协议
- 再造一个平级的 `site skill` 协议
- 再造一个平级的 `prompt package` 协议
## 标准分层
Lime 的技能标准必须分成四层:
### 1. 说明层
作用:
- 回答“这是什么技能、何时使用、依赖什么、怎么触发”
- 给用户、模型、运营和后台治理看得懂
来源可以参考外部 `SKILL.md` 的优点,例如:
- `name`
- `description`
- `when to use`
- `setup`
- `examples`
但说明层不是 Lime 的运行时事实源。
### 2. 输入层
作用:
- 定义技能参数、默认值、校验和补参表单
当前主承载结构是:
- `src/lib/api/serviceSkills.ts` 里的 `ServiceSkillItem`
- `slotSchema`
- `readinessRequirements`
新增技能时,优先补结构化输入字段,不要继续把参数要求散落在 prompt 和按钮文案里。
### 3. 运行时层
作用:
- 定义技能最终走哪种执行器
当前允许的主执行绑定为:
- `agent_turn`
- `browser_assist`
- `automation_job`
- `cloud_scene`
- `native_skill`
运行时层回答的是“怎么执行”,不是“对用户如何命名”。
### 4. 分发层
作用:
- 定义技能如何被服务端发布、客户端缓存、bootstrap 注入和独立刷新
当前已存在的事实源包括:
- Lime 本地 seeded catalog
- `client/service-skills`
- `bootstrap.serviceSkillCatalog`
长期目标应收敛到统一的 `client/skills` 与 `bootstrap.skillCatalog`,但兼容期内允许保留现有 `serviceSkillCatalog` 投影。
## 统一对象关系
Lime 技能能力必须明确区分三个对象:
### 1. Skill
作用:
- 面向用户和产品表达业务入口
- 解决“为什么用、何时触发、输出去哪”
### 2. Adapter / Tool
作用:
- 提供底层站点、工具或外部能力的执行工件
- 解决“怎么访问、参数是什么、脚本怎么跑”
### 3. Runtime Binding
作用:
- 把 skill 绑定到具体执行面
- 解决“最终交给谁执行”
必须遵守:
- adapter 不是 skill
- skill 可以引用 adapter,但 adapter 不能冒充 skill
- 一个 skill 只能有一个主执行绑定
- 多 adapter 编排不属于普通 site skill,属于后续 scene / orchestration 范畴
## Lime Skill Spec v1
### 1. 技能分类
第一阶段只允许三类技能:
- `service`
- `site`
- `prompt`
含义如下:
- `service`
- 业务交付型技能,通常产出主稿、方案、报告、草案
- `site`
- 业务语义入口,但底层依赖 adapter / 站点工件执行
- `prompt`
- 说明型或提示词型技能,强调触发语义和使用约束,不强制要求结构化 runtime
### 2. 统一信息清单
无论哪一类技能,新增时都必须回答以下信息。
#### 身份字段
- `id`
- `skillKey`
- `version`
- `source`
#### 展示字段
- `title`
- `summary`
- `entryHint`
- `aliases`
- `category`
- `outputHint`
#### 触发字段
- `surfaceScopes`
- `triggerHints`
说明:
- 当前结构化模型尚未正式包含 `triggerHints`
- 在结构化字段补齐前,新增技能也必须在服务端模板或伴随文档中写清楚,不允许缺失
#### 输入字段
- `slotSchema`
- `default values`
- `validation`
#### 执行字段
- `defaultExecutorBinding`
- `executionLocation`
- `readinessRequirements`
#### 运行时引用字段
- `siteCapabilityBinding`
- `promptTemplateKey`
- 未来可扩展的 `toolHubBinding`
#### 产物字段
- `defaultArtifactKind`
- `output destination`
说明:
- 产品投影层可以直接提供 `outputDestination`
- 标准摘要层统一收敛到 `skillBundle.metadata.Lime_output_destination`
- 新增技能时必须明确写清结果会回到:当前主稿、资源文档、工作区消息、自动化结果还是云端运行结果
#### 说明字段
- `usageGuidelines`
- `setupRequirements`
- `examples`
说明:
- 这些字段可以先由服务端模板或说明文档承接
- 长期目标是结构化,而不是永久只写在 README / prompt 里
## 执行绑定标准
### 1. `agent_turn`
适用于:
- Claw 业务技能
- 结构化 prompt + 当前工作区继续执行
要求:
- 输出是业务结果,不是“进入某个工作台”
- 不能把底层技术入口当成用户动作文案
### 2. `browser_assist`
适用于:
- 必须依赖真实浏览器登录态或页面上下文的技能
要求:
- 业务 skill 可以引用 adapter
- 不能把“浏览器工作台 / 调试面板”作为主产品语义
- 不允许隐式后台自动化
### 3. `automation_job`
适用于:
- 定时或持续跟踪技能
要求:
- 必须说明首轮结果、后续调度、失败处理和结果回流方式
### 4. `cloud_scene`
适用于:
- 必须由云端托管执行的技能
要求:
- 客户端默认只做目录消费、提交和结果回流
- 不把普通本地即时技能错误迁成云端必跑
## UI 表达标准
技能 UI 必须表达业务动作,而不是暴露底层实现。
### 1. 卡片与入口
每个 skill 卡片至少要能回答:
- 这是什么
- 何时用
- 怎么执行
- 需要什么依赖
- 结果去哪
### 2. 启动弹窗
启动弹窗统一应包含:
- 技能摘要
- 补参表单
- 执行方式说明
- 依赖条件说明
- 结果写入位置说明
### 3. 文案禁止项
禁止把以下内容直接当成主产品术语:
- 浏览器工作台
- 调试面板
- 脚本目录
- runtime debug
- adapter 执行器
这些只能作为实现说明,不能作为用户主动作文案。
## 分发与事实源标准
### 标准层与产品层的边界
当前必须明确区分两件事:
- `skillBundle`
- 对外对齐 Agent Skills 思路的**标准摘要层**
- 负责表达:`name`、`description`、`license`、`compatibility`、`metadata`、`allowedTools`
- 以及 Lime 运行时真正需要的标准状态:`resourceSummary`、`standardCompliance`
- `ServiceSkillCatalog` / `ClientServiceSkillCatalog`
- Lime 面向 Claw / 工作区 / 启动弹窗的**产品投影层**
- 负责表达:卡片文案、补参表单、执行绑定、结果去向、主题目标、自动化入口等业务语义
强约束:
- 不要把 `ServiceSkillItem` 上的产品展示字段误认为标准本体
- 也不要把外部 `SKILL.md` 原文直接当成 Lime 客户端协议
- 标准层与产品层可以共存,但标准层必须有唯一投影:`skillBundle`
### 当前事实源
客户端现状:
- 本地 seeded skill catalog
- `bootstrap.serviceSkillCatalog`
- `client/service-skills`
- `siteAdapterCatalog`
服务端现状:
- `control-plane-svc` 负责客户端技能目录聚合
- Tool Hub 方向负责 tool / adapter 工件真相源
### 长期收敛方向
长期收敛规则固定如下:
1. 统一 skill 目录收敛到 `client/skills`
2. 兼容期保留 `client/service-skills`
3. adapter / tool 工件目录继续独立,不与 skill 目录混用
4. bootstrap 与独立刷新必须消费同一份目录协议
## 外部 `SKILL.md` 参考边界
外部 `SKILL.md` 仓库对 Lime 只有三类帮助:
- 触发语义怎么写更清楚
- `when to use / setup / examples` 怎么组织更清楚
- 说明层如何让人和模型都容易理解
它不能直接成为:
- Lime 的目录协议
- Lime 的执行绑定协议
- Lime 的客户端 UI 标准
- Lime 的租户分发标准
一句话:
> 外部 `SKILL.md` 只可借“说明书结构”,不可借“产品标准定义权”。
## 新增技能的最低检查单
新增一个技能时,至少要回答以下问题:
1. 它属于 `service / site / prompt` 哪一类
2. 它的主执行绑定是什么
3. 它是否依赖 adapter、浏览器、模型、项目或云端运行
4. 它的结果会写回哪里
5. 它的用户主动作文案是否仍然是业务语义,而不是底层实现
6. 它是否继续沿用当前主目录协议,而不是再造平级协议
7. 如果它引用 adapter,是否仍然遵守 [site-adapter-standard.md](site-adapter-standard.md)
## 当前主链
在统一 `client/skills` 正式落地前,当前新增能力的主链固定如下:
- 业务技能目录:继续收敛到 `ServiceSkillCatalog`
- 标准摘要层:继续收敛到 `skillBundle`
- 站点工件目录:继续收敛到 `siteAdapterCatalog`
- 业务 skill 引用站点能力:通过 `siteCapabilityBinding.adapterName`
不要在这个阶段再引入:
- 平级 `skill.json` 目录协议
- 平级 Markdown-only 技能协议
- 平级浏览器技能协议
## 相关文档
- [overview.md](overview.md)
- [site-adapter-standard.md](site-adapter-standard.md)
- [commands.md](commands.md)
- [quality-workflow.md](quality-workflow.md)
- [limecore-collaboration-entry.md](limecore-collaboration-entry.md)
@@ -0,0 +1,512 @@
# 基于外部站点适配器来源的引入方案
> 目标:在不引入后台浏览器自动化副作用的前提下,利用外部站点适配器来源扩充 Lime 的站点覆盖面,同时坚持 Lime 自己的标准。
## 一、结论
外部站点适配器来源可以接,但只能作为来源层,不能成为 Lime 的第二套产品标准。
必须同时满足三条边界:
- 只引入站点适配器定义,不引入浏览器运行时
- 只引入可编译的安全子集,不引入完整来源语义
- Lime 继续以 `managed_cdp / existing_session` 作为唯一浏览器执行事实源
如果目标是“更多站点适配器”,这是合理方向。
如果目标变成“更多浏览器自动化模式”或“多套浏览器控制系统”,这条路不适合 Lime。
## 二、为什么不能原样接入
### 2.1 外部来源的价值在站点覆盖,而不在浏览器控制
外部来源真正有价值的是:
- 已沉淀的大量站点定义
- 声明式 YAML adapter 结构
- 可复用的 pipeline 表达方式
- 对站点字段抽取的经验
它解决的是“站点覆盖面”问题,不是 Lime 缺少的“浏览器内核抽象”问题。
### 2.2 原生浏览器链路与 Lime 产品边界冲突
很多外部来源自带这些行为:
- 后台拉起守护进程
- 自动连接浏览器扩展
- 连接失败时尝试唤醒 Chrome
- 把 Chrome/Chromium 会话当成默认主链
这和 Lime 当前已经明确收紧的产品边界直接冲突:
- 禁止无任务时后台自运行
- 禁止用户无感知地拉起浏览器
- 禁止常驻式浏览器自动化观感
- 禁止像“后门”一样持续消耗 CPU / 内存
因此,外部来源不能以“浏览器运行时方案”的身份进入 Lime。
### 2.3 原样并入会把 Lime 做成两套系统
Lime 当前已经有自己的主链:
- 浏览器来源:`system | playwright`
- 上下文接入:`managed_cdp | existing_session`
- 站点适配器注册表
- 站点适配器执行分发链
如果再把外部来源的 `daemon + extension + protocol + page bridge` 整套搬进来,结果就是:
1. Lime 自己的浏览器控制链
2. 外部来源自己的浏览器控制链
这会直接导致:
- 事实源分裂
- 排障复杂度翻倍
- 用户心智混乱
- Windows / macOS 资源问题更难治理
这不符合 Lime 的产品判断,也不符合仓库治理原则。
## 三、应该引入什么,不应该引入什么
### 3.1 应该引入
建议只引入这些“来源材料”:
- 外部来源中的 adapter 定义文件
- adapter 元数据结构
- `site`
- `name`
- `description`
- `domain`
- `args`
- `columns`
- `pipeline`
- 表达式与步骤设计思路
- 已验证过的字段映射经验
### 3.2 不应该引入
明确不引入这些运行时能力:
- 浏览器桥接实现
- 守护进程生命周期
- 浏览器扩展连接模型
- 后台自动拉起浏览器
- 自动唤醒 Chrome
- 常驻后台的浏览器控制进程
- 任何绕过 Lime 当前 browser runtime 的执行主链
### 3.3 核心边界
一句话定义边界:
> 外部来源是 Lime 的站点适配器来源,不是 Lime 的浏览器执行内核。
## 四、Lime 当前切入点
Lime 现有站点适配器主链已经存在,关键边界如下:
- 站点适配器注册:`src-tauri/src/services/site_adapter_registry.rs`
- 站点适配器执行:`src-tauri/src/services/site_capability_service.rs`
- 前端命令网关:`src/lib/webview-api.ts`
- 浏览器执行路线:
- `existing_session`
- `managed_cdp`
Lime 当前主格式本质上是:
- manifest 元数据
- entry URL 规则
- script 脚本执行
- 通过 Lime 现有 runtime 执行 script
而外部来源通常是:
- YAML 元数据
- pipeline 步骤
- 来源自己的运行时抽象
- 可选浏览器桥接
这两者不是直接兼容关系,因此正确切入点不是“并列保留两套格式”,而是增加一层导入编译边界。
## 五、推荐落地方案
### 5.1 三层结构
建议固定为三层:
1. 来源层
- 外部 adapter 定义文件
2. Lime 编译层
- 把来源 YAML 编译成 Lime 标准
3. Lime 执行层
- 继续使用 Lime 现有 `managed_cdp / existing_session`
这样可以同时保证:
- 站点覆盖面扩展
- 浏览器执行事实源不分裂
- 不引入后台自动化副作用
- Lime 标准仍然是唯一事实源
### 5.2 第一阶段只支持安全子集
第一阶段不要追求完整兼容来源 pipeline。
建议只支持以下安全子集:
- `navigate`
- `evaluate`
- `map`
- `filter`
- `limit`
- `sort`
第一阶段明确不支持:
- `tap`
- `intercept`
- `Desktop` 模式
- 依赖扩展上下文的动作
- 依赖守护进程协议的动作
- 自动关闭、拉起、唤醒浏览器的动作
这能把复杂度和产品风险都压在可控范围内。
### 5.3 编译层职责
建议通过独立导入服务承接,例如:
- `src-tauri/src/services/site_adapter_import_service.rs`
职责只保留三件事:
1. 读取来源 YAML
2. 按 Lime 白名单规则校验
3. 编译为 Lime `SiteAdapterSpec` 所需结构
原则是:
- 不污染现有站点执行链
- 不把来源原始模型散落到整个仓库
- 不让来源格式越过编译边界直达运行时
## 六、接入路线对比
### 方案 A:直接调用外部 CLI
实现方式:
- Lime 在用户触发时调用外部命令
- 读取输出结果
- 回填到 Lime 的结果链路
优点:
- 接入快
- 便于短期验证少量站点价值
缺点:
- 仍可能间接触发来源自己的浏览器自动化模型
- 输出结构和错误语义受外部 CLI 限制
- 难以对齐 Lime 当前 `managed_cdp / existing_session`
- 长期治理成本高
判断:
- 只适合作为一次性实验
- 不适合作为 Lime 主方案
### 方案 B:只导入来源定义,由 Lime 执行
实现方式:
- Lime 只消费来源 adapter 定义
- 编译后交给 Lime 现有 runtime 执行
优点:
- 浏览器控制事实源统一
- 产品边界一致
- 用户体验一致
- 可复用 Lime 当前审计、状态、结果链路
缺点:
- 首轮需要实现编译层
- 需要维护 pipeline 子集映射规则
判断:
- 这是 Lime 应采用的长期主方案
---
## 七、推荐实施阶段
### 阶段 0:只做静态评估
目标:
- 建立 YAML 来源 adapter 能力盘点
- 标注哪些站点适合迁入
- 标注哪些步骤当前不支持
输出:
- 站点白名单
- 不支持步骤清单
- 优先迁移顺序
建议优先挑选的站点特征:
- 只依赖 `navigate + evaluate + map + limit`
- 不依赖 Chrome extension
- 不依赖桌面应用上下文
- 只读采集,不带写操作
### 阶段 1:做 adapter importer PoC
目标:
- 支持读取 YAML 来源 YAML
- 转换为 Lime 内部适配器结构
- 跑通 3 到 5 个代表性站点
建议首批站点:
- Reddit
- Zhihu
- Yahoo Finance
- Hacker News
- Xueqiu 中不依赖拦截链的只读项
阶段完成标准:
- 站点可被 Lime 列出
- 可被搜索和推荐
- 可通过现有站点执行链跑出稳定结果
- 不引入任何后台自动拉起浏览器行为
### 阶段 2:扩展步骤子集
目标:
- 在验证稳定后,再考虑增加更多 pipeline 步骤
建议顺序:
1. `filter`
2. `sort`
3. 更复杂的 `map` 表达式
4. 更完整的参数类型支持
仍然不建议过早支持:
- `intercept`
- `tap`
- 浏览器扩展相关上下文
### 阶段 3:建立上游同步机制
目标:
- 让 Lime 能稳定跟随 YAML 来源 adapter 增长
建议做法:
- 明确一份允许导入的 adapter 白名单
- 通过脚本做同步与编译
- 同步时生成变更报告
不要做成:
- 自动无审核拉取上游全部 adapter
- 每次构建时动态扫描外部仓库
同步必须可审计、可回滚、可控。
---
## 八、适配器编译规则建议
### 8.1 名称映射
建议内部统一命名:
- `site/name` 形式作为 adapter 唯一标识
- 例如:
- `reddit/hot`
- `zhihu/hot`
- `xiaohongshu/feed`
### 8.2 参数映射
YAML 来源 常见参数类型先收敛到 Lime 已支持的简单类型:
- `str` -> `string`
- `int` -> `integer`
首轮不要扩展复杂参数系统。
### 8.3 pipeline 到 script 的映射
推荐生成单一脚本执行体,而不是在 Lime 再实现一整套 YAML 来源 pipeline engine。
理由:
- 当前 Lime 站点执行模型本来就是 script 型
- 可复用现有运行时
- 更容易与 `existing_session / managed_cdp` 对齐
建议做法:
- `navigate` 映射为脚本前置导航意图
- `evaluate` 直接转为脚本主体
- `map/filter/limit/sort` 优先编译到脚本尾部的数据整形
也就是说:
> 不把 YAML 来源 pipeline 原样搬进 Lime,而是把它编译成 Lime 现有 script 执行模型。
### 8.4 不支持步骤的处理
对于当前不支持的步骤,必须在导入阶段就失败,并给出清晰原因。
例如:
- `adapter uses intercept step`
- `adapter requires extension runtime`
- `adapter requires desktop mode`
不要进入运行时才失败。
---
## 九、用户体验与产品边界
这是本方案最重要的非功能约束。
### 9.1 明确禁止
- 无任务时后台自动运行站点适配器
- 自动启动 Chrome
- 自动唤醒 Chrome
- 自动挂接扩展
- 常驻 daemon
- 用户未点击执行时预热站点运行时
### 9.2 只允许的执行方式
只允许:
- 用户显式点击运行某个适配器
- 或者用户明确发起某次站点采集任务
并且执行过程必须满足:
- 可见
- 可中断
- 有状态反馈
- 有完成结果
- 结束即收口
### 9.3 UX 文案要求
任何未来如果接入 YAML 来源 来源的适配器,都不应对用户暴露“YAML 来源 daemon”“extension reconnect”这类技术词。
用户只需要知道:
- 这是一个站点适配器
- 需要哪个浏览器上下文
- 是否需要登录态
- 执行后会得到什么结果
---
## 十、风险清单
### 10.1 表达式兼容风险
YAML 来源 的表达式和 Lime 当前脚本模板体系不完全相同。
需要一个明确的受支持表达式子集。
### 10.2 站点易碎性风险
很多站点适配器本质上依赖页面结构、接口字段、前端状态树。
即使成功导入,也需要接受它们会失效。
### 10.3 维护成本风险
如果一次性导入过多站点,后续维护成本会很高。
必须建立白名单,不要全量照搬 55 个站点。
### 10.4 写操作风险
带有发送、发布、点赞、交互类动作的适配器,不应在第一阶段导入。
首轮只应覆盖只读采集类适配器。
### 10.5 协议漂移风险
如果 Lime 自己新做一套 pipeline,又试图兼容 YAML 来源 全量语义,最后会长成第三套事实源。
必须坚持“导入后编译到 Lime 当前 script 执行模型”。
---
## 十一、推荐的首轮范围
首轮建议只做以下范围:
- 只读适配器
- 无扩展依赖
- 无 daemon 依赖
- 无桌面应用依赖
- 无写操作
- 无登录强依赖,或登录态可复用现有 `existing_session`
不建议首轮纳入:
- 小红书 `intercept / tap` 型复杂适配器
- ChatGPT / Chatwise / Discord-App 这类 Desktop 模式适配器
- 依赖扩展上下文或浏览器网络拦截的适配器
---
## 十二、建议的下一步落地顺序
1. 建立 YAML 来源 adapter 能力审计脚本
2. 产出支持步骤白名单
3. 新增 `site_adapter_import_service`
4. 先导入 3 到 5 个只读 adapter
5. 接入现有 `site_list_adapters / site_search_adapters / site_run_adapter`
6. 补 smoke,证明不会触发后台自动化副作用
7. 再决定是否扩展更多步骤
---
## 十三、最终决策
最终建议如下:
- **决策一**:采纳 `外部适配器来源`,但仅作为站点适配器来源
- **决策二**:不采纳 `外部适配器来源` 的浏览器 runtime
- **决策三**:Lime 继续保持浏览器 runtime 单一事实源
- **决策四**:先做 importer + 编译层,不做 runtime 并入
- **决策五**:首轮仅支持只读、安全、无后台副作用的 adapter 子集
这条路径同时满足:
- 更多站点适配器
- 不引入第二套浏览器内核
- 不破坏当前产品边界
- 便于渐进式扩展
---
## 附:一句话版本
> 要引的是 YAML 来源 的“站点适配器库”,不是它的“后台浏览器自动化模式”。