feat: ship lime 1.6.1 rollout

This commit is contained in:
coso
2026-04-09 18:47:33 +08:00
parent db3bfae4ff
commit 182c0d464a
152 changed files with 19877 additions and 2413 deletions
+3 -1
View File
@@ -20,6 +20,7 @@
- `command-runtime.md` - `@` / `/` / 轻卡 / viewer / 功能方案包实施手册
- `skill-standard.md` - 统一技能标准、skill / adapter / runtime binding 边界
- `site-adapter-standard.md` - 站点适配器标准、来源导入边界、运行时收敛规则
- `web-browser-scene-skill.md` - 网页 / 浏览器场景技能设计提案,说明如何把外部 web skill 思路收敛到 Lime 主线
- `project-heatmap.md` - 仓库热力图与治理候选分析
- `limecore-collaboration-entry.md` - 跨仓库联动入口
- `../tech/harness/README.md` - Lime Harness Engineering 总入口与实施蓝图
@@ -57,7 +58,8 @@
- **改 Tauri 命令 / Bridge / mock**:先读 `commands.md`,再看 `quality-workflow.md`
- **改 `@` / `/` / 轻卡 / viewer / ServiceSkill 场景**:先读 `command-runtime.md`
- **改 Claw 技能 / Service Skill / 统一 Skills 标准**:先读 `skill-standard.md`
- **改站点适配器 / 导入外部 adapter**:先读 `site-adapter-standard.md`,再看 `quality-workflow.md`
- **改站点适配器 / 导入外部 adapter**:先读 `site-adapter-standard.md`,再看 `web-browser-scene-skill.md` 与 `quality-workflow.md`
- **做网页登录态访问 / 网页导出 / Markdown 落盘场景**:先读 `web-browser-scene-skill.md`
- **改 Workspace / GUI 壳 / 主路径**:先读 `workspace.md`、`quality-workflow.md`、`playwright-e2e.md`
- **做迁移 / 收口 / 去兼容层**:先读 `governance.md`
- **改 Provider / 凭证加载 / Token 刷新**:先读 `providers.md`、`credential-pool.md`
+1
View File
@@ -26,6 +26,7 @@
- 想为某个能力补“完整方案包”
如果当前需求已经涉及“命令触发 -> Agent 分析 -> binding -> 轻卡 -> viewer”其中两步以上,就默认属于命令运行时改动。
如果命令还涉及网页登录态访问、网页导出、Markdown 保存、图片下载,再补读 [web-browser-scene-skill.md](web-browser-scene-skill.md)。
## 固定产品判断
+3 -1
View File
@@ -332,6 +332,8 @@ MCP bridge 当前唯一继续演进的工具命名事实源是:
- 工具全名:`mcp__<server>__<tool>`
- extension surface key:`mcp__<server>`
- UI 展示名:继续优先显示 server 原名,例如 `lime-browser`
- deferred 工具需要通过 `ToolSearch` 拉起时,优先使用精确 `select:mcp__<server>__<tool>`;如 `select:mcp__playwright__browser_click`
- `ToolSearch` 空结果后不要继续改写成 `playwright_browser_click`、`read_file`、`system` 之类同义词重试;原生工具直接调用当前可见的 `Read / Write / Edit / Glob / Grep / Bash / WebFetch / WebSearch`
不要再新增或恢复以下旧命名心智:
@@ -523,7 +525,7 @@ npm run verify:local
- **站点能力主链**:继续收敛到 `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`
- **站点技能首页入口主链**:首页 / 工作区弹窗只负责补参数、组装 `initialUserPrompt + harness.service_skill_launch` 上下文并进入 `Claw`;真正执行统一收口到 `Claw` 首回合,不再由首页弹窗或工作区挂载副作用直接调用 `site_run_adapter`
- **站点技能首页入口主链**:`Claw` 首页、空态推荐和技能选择入口只负责选技能、在当前对话输入区上方挂起 A2UI 补参卡、组装 `initialUserPrompt + harness.service_skill_launch` 上下文并进入 `Claw`;真正执行统一收口到 `Claw` 首回合,不再由首页弹窗、工作区挂载副作用或前端直跑逻辑直接调用 `site_run_adapter`
- **站点结果沉淀主线**:`site_run_adapter` / `lime_site_run` 优先透传 `content_id` 写回当前主稿;只有缺少 `content_id` 时,才回退到 `project_id` 新建结果文档
- **`markdown_bundle` 落盘回传主线**:当站点结果是 `markdown_bundle` 时,`saved_content` 除了 `content_id / project_id / title`,还应继续回传 `project_root_path / markdown_relative_path / images_relative_dir / meta_relative_path / image_count`,让聊天轻卡与 tool timeline 都能直接说明 Markdown 和图片实际保存到哪里
- **`markdown_bundle` 消费主线**:当前端拿到 `saved_content.markdown_relative_path` 后,聊天轻卡、工具结果卡和站点工作台应优先导航到项目内真实 Markdown 文件,而不是继续打开一份运行摘要 artifact;后续 viewer 渲染相对图片时,也必须以该 Markdown 文件路径作为 base 解析本地资源
+1 -1
View File
@@ -28,7 +28,7 @@ Lime 是一个以创作为中心的本地优先 AI Agent 交互工作台,基
- `adapter / tool`:底层能力工件
- `runtime binding`:最终执行绑定
统一技能标准见 [skill-standard.md](skill-standard.md),站点工件子标准见 [site-adapter-standard.md](site-adapter-standard.md)。
统一技能标准见 [skill-standard.md](skill-standard.md),站点工件子标准见 [site-adapter-standard.md](site-adapter-standard.md),网页 / 浏览器场景的专题设计见 [web-browser-scene-skill.md](web-browser-scene-skill.md)。
## 项目结构
+10 -8
View File
@@ -24,6 +24,7 @@
- 优先使用 **Playwright MCP** 做交互验证,不优先编写新的本地 Playwright 测试文件
- 浏览器模式默认首页从 `http://127.0.0.1:1420/` 进入
- 如果 Playwright 工具当前还在 deferred surface,优先用 `ToolSearch` 的精确选择名,例如 `select:mcp__playwright__browser_click`;不要把 `playwright_browser_click`、`browser click` 之类同义词反复丢给 `ToolSearch`
- 能走真实后端就走真实后端;浏览器模式暂不支持或尚未桥接的能力,允许走 mock
- `verify:gui-smoke` 内部的 browser runtime 校验默认走无界面浏览器会话;它只证明主链可启动,不替代后续真实页面交互验证
- `lime-pet` 原生桌宠属于独立仓库与原生窗口壳,不纳入当前 WebView Playwright 的直接操控范围;在 Lime 主仓里只验证 `companion_*` API、状态事件与主窗口唤起链路,桌宠窗口移动、点击命中与原生层动画仍需额外手工 smoke
@@ -171,14 +172,15 @@ npm run test:contracts
### Claw 站点技能直跑门禁验证
1. 在 `Claw` 首页打开一个站点型技能弹窗
2. 如果当前没有附着真实浏览器会话,确认弹窗继续展示“需要先准备浏览器 / 重新检测会话”的门禁提示,且 `在 Claw 中执行` 主按钮处于禁用状态
3. 点击 `去浏览器工作台`,确认只发生页面跳转,不会后台偷偷拉起 Chrome
4. 在浏览器工作台附着到真实浏览器并打开目标站点后,回到 `Claw` 再次打开同一技能
5. 确认此时主按钮变为可执行,点击后进入 `Claw` 工作区
6. 确认进入 `Claw` 后会自动发送一条首回合技能任务消息,消息文本包含站点技能启动上下文,而不是由前端挂载副作用偷偷直跑
7. 如果已有附着会话,确认 `Claw` 会通过 `lime_site_run` 执行并把结果写回当前主稿或项目资源
8. 如果没有附着会话,确认不会再向 `Claw` 对话流注入“我已完成登录,继续执行”之类的确认卡;阻断必须停留在技能入口层
1. 在 `Claw` 首页或空态推荐区选择一个站点型技能
2. 确认页面切回 `Claw` 对话态,并在输入区上方出现该技能的 A2UI 补参卡,而不是打开独立启动弹窗
3. 如果当前没有附着真实浏览器会话,确认 A2UI 卡继续展示“需要先准备浏览器 / 重新检测会话”的门禁提示,且主提交按钮处于禁用状态
4. 点击 `去浏览器工作台`,确认只发生页面跳转,不会后台偷偷拉起 Chrome
5. 在浏览器工作台附着到真实浏览器并打开目标站点后,回到 `Claw` 再次选择同一技能
6. 确认此时 A2UI 卡主按钮变为可执行,提交后进入 `Claw` 工作区并继续当前对话
7. 确认进入 `Claw` 后会自动发送一条首回合技能任务消息,消息文本包含站点技能启动上下文,而不是由前端挂载副作用偷偷直跑
8. 如果已有附着会话,确认 `Claw` 会通过 `lime_site_run` 执行并把结果写回当前主稿或项目资源
9. 如果没有附着会话,确认不会再向 `Claw` 对话流注入“我已完成登录,继续执行”之类的确认卡;阻断必须停留在技能入口层
### Claw `@配图` 异步任务验证
+4 -1
View File
@@ -84,7 +84,8 @@
如果本轮涉及 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`。
如果本轮涉及 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`。同时,Lime runtime 里的 `ToolSearch` 当前事实源必须是 `ToolSearchBridgeTool`;`aster-rust` 自带 `ToolSearchTool` 只能停留在 compat 存量,不允许再抢占当前 runtime surface。
如果本轮还需要对子工作区单独跑 Rust 定向测试,例如 `src-tauri/crates/aster-rust`,必须确认产物仍落在统一的 `src-tauri/target`,不要重新写回子目录自己的 `target/`;否则 `tauri dev` 会把构建产物当成源码变化,反复触发重编译。
如果本轮涉及 `create_skill_scaffold_for_app`、`SkillsPage / SkillScaffoldDialog`,或“聊天结果 -> Skill 脚手架”沉淀闭环,还要同步检查前端网关、Rust 模板、DevBridge 分发与默认 mock 是否仍保持同一条主链;若新增了结构化骨架字段,至少要确认 `何时使用 / 输入 / 执行步骤 / 输出 / 失败回退` 能真实落进生成后的 `SKILL.md`。
@@ -106,6 +107,7 @@
- 默认先跑受影响 crate、模块或定向测试
- 再根据边界扩散决定是否执行全量 `cargo test`
- 目标是尽快暴露问题,而不是一上来把所有测试都跑满
- 如果定向测试来自 `src-tauri/crates/aster-rust` 这类被 Tauri watch 覆盖的子工作区,先确认其 Cargo `target-dir` 已统一回 `src-tauri/target`,避免 watch 风暴导致 dev 无法启动
## 质量分层
@@ -546,6 +548,7 @@ npm run verify:gui-smoke
npm run smoke:workspace-ready
npm run smoke:browser-runtime
npm run smoke:site-adapters
npm run smoke:agent-service-skill-entry
# 前端 / 桥接 / 契约
npm test
+1
View File
@@ -12,6 +12,7 @@
它是 **站点适配器能力的工程标准文档**,不是某个外部项目的引入说明书。
如果讨论的是 Skills 总模型、`skill / adapter / runtime binding` 总边界,先读 [skill-standard.md](skill-standard.md),再回到本文。
如果讨论的是网页登录态访问、长文导出、Markdown 落盘、图片下载这类浏览器场景编排,再补读 [web-browser-scene-skill.md](web-browser-scene-skill.md)。
## 第一原则
+11 -3
View File
@@ -14,6 +14,7 @@
其中:
- [site-adapter-standard.md](site-adapter-standard.md) 是站点适配器子标准
- [web-browser-scene-skill.md](web-browser-scene-skill.md) 是网页 / 浏览器场景的专题设计文档
- 本文负责技能总模型、事实源、分发和 UI 表达边界
## 第一原则
@@ -58,6 +59,7 @@
- 发现仓库里开始出现多套 skill 定义、多套入口术语或多套运行语义
如果问题已经缩小到站点适配器字段、脚本、导入和执行,先回到 [site-adapter-standard.md](site-adapter-standard.md)。
如果问题已经是“网页登录态访问、导出 Markdown、下载图片、保存网页内容”这一类浏览器场景,再看 [web-browser-scene-skill.md](web-browser-scene-skill.md)。
## 非目标
@@ -424,9 +426,15 @@ Lime 技能能力必须明确区分三个对象:
- 需要什么依赖
- 结果去哪
### 2. 启动弹窗
### 2. 补参与启动承载
启动弹窗统一应包含:
Agent / Claw 主路径里的 skill 补参与启动,统一承载在当前对话输入区上方的 A2UI 卡片里,不再允许主产品流程回退到独立启动弹窗。
当前 `Claw` 首页、空态推荐、Skills 工作台、`@` / slash 场景入口,都应走“选技能 -> 在当前对话补参 -> 继续当前对话执行”。
只有开发调试或尚未迁完的历史兼容壳,才允许短期保留弹窗;这类弹窗不能作为新增入口,也不能继续代表主产品交互。
对话内 A2UI 卡统一应包含:
- 技能摘要
- 补参表单
@@ -457,7 +465,7 @@ Lime 技能能力必须明确区分三个对象:
- 负责表达:`name`、`description`、`license`、`compatibility`、`metadata`、`allowedTools`
- 以及 Lime 运行时真正需要的标准状态:`resourceSummary`、`standardCompliance`
- `ServiceSkillCatalog` / `ClientServiceSkillCatalog`
- Lime 面向 Claw / 工作区 / 启动弹窗的**产品投影层**
- Lime 面向 Claw / 工作区 / 对话内 A2UI 卡的**产品投影层**
- 负责表达:卡片文案、补参表单、执行绑定、结果去向、主题目标、自动化入口等业务语义
强约束:
+366
View File
@@ -0,0 +1,366 @@
# Lime Web / Browser Scene Skill 设计提案
## 这份文档回答什么
本文件把外部 `web-access` 一类 skill 仓库里值得借鉴的内容,翻译成 Lime 自己可长期演进的设计语言,主要回答:
- 外部 Web skill 对 Lime 到底有什么帮助
- 哪些能力适合吸收进 Lime,哪些不应该直接引入
- `Scene Skill`、`site-adapter`、浏览器运行时、`a2ui`、产物保存之间应该如何解耦
- 面向网页读取、登录态访问、长文导出、素材保存这类场景时,Lime 应该如何做一套可复用主线
它是 `skill-standard.md`、`site-adapter-standard.md`、`command-runtime.md` 的专题补充文档。
## 什么时候先读
出现以下任一情况时,先读本文件,再决定是否写代码:
- 想新增一个“输入网址 -> 打开页面 -> 抽取内容 -> 保存产物”的 slash scene
- 想把浏览器读取、登录态访问、页面导出、图片下载做成可复用技能
- 想参考外部 `SKILL.md` 仓库改 Lime 的网页能力
- 想把某个网页导出需求做成长期产品能力,而不是一次性脚本
- 想给 `site-adapter` 增加预热、滚动、懒加载等待、媒体下载等通用能力
## 设计结论
### 1. 外部 `web-access` 对 Lime 有帮助,但只应作为参考来源
可以借鉴的部分:
- Skill 作为 bundle 的组织方式
- 前置检查、站点经验、工具选择策略
- 针对动态页面的预热、滚动、媒体提取思路
- “像人一样判断是否完成任务”的流程设计
不应直接引入的部分:
- 外部自带的 CDP proxy / daemon / HTTP API
- 外部工具仓库定义的运行时协议
- 外部环境变量约定和执行入口
- 把外部 `SKILL.md` 直接当成 Lime 产品事实源
### 2. Lime 的长期真相仍然是 `Scene Skill`
网页类 slash 场景的长期真相必须保持为:
`scene -> gate request -> a2ui -> Scene Skill -> site-adapter -> Lime runtime -> artifact/viewer`
固定边界如下:
- `Scene Skill` 负责产品语义、流程推进、步骤回放
- `gate request` 负责声明缺什么输入、补完后如何恢复
- `a2ui` 只负责收集输入,不负责定义协议
- `site-adapter` 负责页面执行与抽取,不负责产品命名
- Lime 浏览器运行时负责 CDP / session / tab 生命周期
- viewer 只消费产物,不反向定义运行时
### 3. 先做“通用网页场景框架”,再挂具体站点能力
不要为了 X、公众号、知乎分别长三套流程。
应该先沉淀一套通用 Web / Browser Scene Skill 框架,再把不同站点的差异下沉到:
- `site-adapter`
- `references/site-patterns`
- 运行时 helper
- 抽取后处理器
## 标准分层
### 1. Scene Skill 层
职责:
- 定义对用户可见的场景名称、说明、产物语义
- 组织完整流程
- 在对话中回放步骤,而不是把过程藏进工具卡
- 统一声明补参需求
推荐模式组合:
- 主模式使用 `Pipeline`
- 缺参使用 `Inversion`
- 产物输出使用 `Generator`
- 站点 / 浏览器能力封装使用 `Tool Wrapper`
### 2. Gate Request 层
职责:
- 表达缺失输入
- 表达字段校验规则
- 表达恢复点和继续执行条件
建议最小字段:
- `url`
- `project_id` 或等价项目上下文
- `target_language`
- `save_mode`
- `include_images`
- `overwrite_existing`
固定原则:
- `gate request` 是输入协议真相
- `a2ui` 是 GUI 映射层
- 不把表单结构写死进 skill catalog 或 site-adapter 参数
### 3. Site Adapter 层
职责:
- 页面进入
- DOM 预热
- 长页滚动
- 懒加载资源等待
- 内容抽取
- 标准化返回 `markdown_bundle` / `saved_content`
站点差异应优先留在这里,而不是上浮到 slash scene。
### 4. Runtime Helper 层
职责:
- 提供所有动态页面通用的执行辅助能力
- 不带业务语义
- 不带站点命名
适合沉淀的 helper:
- `waitForDomStable`
- `scrollUntilSettled`
- `waitForImagesReady`
- `resolveRoot`
- 延迟代码块与媒体的完整性检测
### 5. Artifact / Viewer 层
职责:
- 展示最终保存产物
- 优先打开项目内真实文件
- 渲染 Markdown 中的相对图片路径
- 不把过程状态冒充成最终产物
固定原则:
- 真正产物必须落项目目录
- 预览应打开保存后的 Markdown,而不是临时摘要
- 图片应作为同一产物包的一部分被渲染
## 推荐目录结构
对于一个长期可维护的 Web / Browser Scene Skill,建议目录按下面拆:
```text
skill/
├── SKILL.md
├── references/
│ ├── tool-routing.md
│ ├── site-patterns/
│ │ ├── x.com.md
│ │ └── ...
│ └── gotchas.md
├── templates/
│ └── markdown-export-template.md
├── examples/
│ └── export-result-example.md
└── scripts/
└── validate-output.mjs
```
说明:
- `SKILL.md` 只放触发、路由、流程规则
- 工具选择矩阵放 `references/tool-routing.md`
- 站点经验放 `references/site-patterns/`
- 输出结构放 `templates/`
- 产物校验可放 `scripts/`
## 推荐流程主线
以下流程适用于“导出网页内容并保存为 Markdown”这一整类场景,而不只适用于 X。
### Step 1. 命中 Scene Skill
入口可以是:
- slash 场景
- 技能中心
- 输入框里的 URL 场景联想
但命中后统一收口到同一个 `Scene Skill`,不要在多个入口各写一套流程。
### Step 2. 产出 Gate Request
如果缺少以下任一信息,就先产出结构化 `gate request`:
- 目标 URL
- 目标项目
- 保存语言
- 是否下载图片
前端再把它映射成 `a2ui` 表单。
### Step 3. 运行时预检查
运行时预检查应该是 Lime 自己的过程步骤,而不是外部脚本真相。
适合检查:
- 当前是否有可用浏览器会话
- 当前站点是否需要登录态
- 当前项目是否允许落盘
- 当前 skill 所需参数是否已经补齐
这些步骤应回放到对话里。
### Step 4. 预热页面
在 `site-adapter` 里先做通用预热:
1. 等待 DOM 稳定
2. 滚动到稳定
3. 再次等待 DOM 稳定
4. 等待图片资源就绪
5. 再进入抽取
不要把这段逻辑写死在某个 slash 场景组件里。
### Step 5. 抽取标准内容
标准抽取至少包括:
- 标题
- 作者 / 来源
- 发布时间
- 正文段落
- 代码块
- 图片列表
- 封面或头图
- 源地址与 slug
抽取结果应标准化为:
- 主 Markdown 文档
- 媒体资源列表
- 元数据文件
### Step 6. 后处理
后处理不重新抓站点,只消费已保存结果。
推荐能力:
- 翻译为目标语言
- 保留 fenced code block
- 保留相对图片路径
- 清理无意义包装文案
- 校验代码块和图片是否缺失
### Step 7. 保存与预览
推荐保存结构:
```text
exports/<scene-key>/<slug>/
├── index.md
├── meta.json
└── images/
├── 001.jpg
└── ...
```
viewer 打开时应优先定位:
- `index.md`
- 与其同目录的 `images/`
而不是打开工具过程或中间摘要。
## 外部 `web-access` 最值得吸收的四类内容
### 1. 工具选择矩阵
外部 skill 的价值之一,是把“什么时候用搜索、什么时候直接进浏览器、什么时候要读真实页面”讲清楚。
在 Lime 中,这些内容适合沉淀到:
- `references/tool-routing.md`
- 运行时提示词模板
- 站点 gotchas
而不适合直接写死在前端 if/else。
### 2. 站点经验库
不同站点的注意事项应留在 `references/site-patterns/` 一类位置,例如:
- URL 模式
- 登录前后差异
- 懒加载行为
- 代码块或图片常见丢失模式
这类内容是高信号知识,适合作为长期资产。
### 3. 动态页面预热思路
外部 skill 里“先滚动、等稳定、再提取”的思路非常值得保留,但应下沉为 Lime runtime helper,而不是保留外部 daemon。
### 4. 最小侵入原则
默认不打扰用户已有 tab、尽量使用受控 tab、完成后回收临时上下文,这类原则适合写进 Lime 的浏览器场景规范。
## 明确不要做的事情
- 不引入第二套浏览器 runtime
- 不在 Lime 内部再接一套外部 daemon
- 不把外部 `SKILL.md` 当成 Lime 协议
- 不把站点逻辑写死在 slash 组件里
- 不把缺参逻辑写成散落的弹窗或 toast
- 不让 viewer 打开“过程卡”冒充最终产物
- 不让翻译、摘要、抽取互相重抓站点
## 面向实现的推荐拆分
### A. 通用层
- Scene Skill 标准输入
- `gate request -> a2ui` 映射
- 通用预热 helper
- 通用 Markdown 产物协议
- 通用图片下载器
### B. 站点层
- X 长文导出
- 公众号文章导出
- 博客 / 文档页面导出
### C. 后处理层
- 翻译
- 结构校验
- 产物预览
这三层应保持单向依赖:
`scene -> adapter/helper -> post-process -> artifact`
不要反过来让 post-process 定义 scene 协议。
## 当前建议
对 Lime 当前阶段,最合适的路线是:
1. 继续坚持 `Scene Skill` 作为产品真相
2. 继续坚持 `site-adapter` 只是步骤执行器
3. 借鉴外部 `web-access` 的内容设计,不引入它的执行内核
4. 先把动态页面通用 helper、站点经验和 Markdown 产物协议沉淀稳
5. 再逐步扩展更多站点,而不是为每个站点单独长一套 slash 流程
一句话总结:
> 外部 `web-access` 最值得借鉴的是“怎么设计强 skill”,不是“把它的 proxy 搬进 Lime”。