chore: release v0.96.0

This commit is contained in:
coso
2026-03-25 22:04:38 +08:00
parent 307b2d3670
commit 0ee56c1098
328 changed files with 40949 additions and 6948 deletions
+1 -1
View File
@@ -385,7 +385,7 @@ pub struct TokenUsage {
// 当前仓库的事实源是 Hook + runtime adapter,而不是根 store barrel。
// 推荐边界:
// - 会话 / turn / action:`src/lib/api/agentRuntime.ts`
// - 流式协议:`src/lib/api/agentStream.ts`
// - 流式协议:`src/lib/api/agentProtocol.ts`
// - 前端主链:`useAgentChatUnified -> useAsterAgentChat`
// - 已删除旧入口:`useAgentChat`、`useAgentStore`
@@ -0,0 +1,541 @@
# Lime 如何借鉴 Codex 的工程方法:从“已有基础”到“快而稳的迭代系统”
> 目的不是照抄 Codex 的技术栈,而是借鉴它背后的工程方法,并结合 Lime 当前仓库的真实现状,收敛出一条适合我们的落地路径。
## 1. 背景
这份文档基于两部分事实:
1. 对 `openai/codex` 仓库的结构、规则、CI、测试、发布流程做了实际阅读;
2. 对 Lime 当前仓库的工程入口、脚本、工作流、测试和发布链路做了核对。
结论先写在前面:
**Lime 并不缺“零起点能力”,而是已经有不少关键积木。**
我们现在更需要的,不是继续堆更多脚本,而是把已有能力收敛成一条清晰、分层、可执行的开发与交付路径。
Codex 值得借鉴的,不是 Bazel、不是纯 Rust、也不是它的体量;
真正值得借鉴的是:
**他们把“如何开发、如何验证、如何发布”写进了仓库本身。**
对 Lime 来说,这一点尤其重要。
因为 Lime 当前已经不是一个简单的单体项目,而是一个同时包含:
- React + TypeScript 前端
- Tauri 桌面壳
- Rust workspace
- 多 Provider / 网关 / MCP / 插件 / 浏览器桥接
- 文档站点
- 多平台发布
的复合型仓库。
从 `src-tauri/Cargo.toml` 看,当前 Rust workspace 已经有 `20` 个 crate;
从 `package.json` 看,前端、桥接、契约、发布、本地验证、AI 验证、治理脚本都已经存在。
这意味着:
**Lime 已经进入“需要系统化工程节奏”的阶段。**
## 2. Lime 当前已经具备的基础
在讨论“借鉴 Codex”之前,先明确 Lime 不是从零开始。
### 2.1 仓库级规则已经存在
根 `AGENTS.md` 已经提供了不少高价值工程约束,例如:
- 全部输出与文档统一使用中文
- 涉及 UI 先看 `docs/aiprompts/design-language.md`
- 默认同时考虑 macOS / Windows
- 优先使用 `npm`、`cargo`、Tauri 命令与项目内封装
- 明确给出了构建、测试、代码检查入口
这意味着 Lime 已经有“仓库级规则入口”,这是非常好的基础。
### 2.2 本地验证脚本已经不弱
当前 `package.json` 里已经有一整组工程命令:
- `npm run lint`
- `npm run typecheck`
- `npm test`
- `npm run test:bridge`
- `npm run test:contracts`
- `npm run test:rust`
- `npm run verify:local`
- `npm run verify:local:full`
- `npm run ai-verify`
其中 `scripts/local-ci.mjs` 已经实现了**按改动范围智能选择任务**:
- 前端改动 -> `lint` + `typecheck` + `test`
- bridge 改动 -> `test:bridge` + `test:contracts`
- Rust 改动 -> `cargo test`
- `--full` 时再补 `cargo clippy`
这其实已经很接近 Codex 仓库里“按 changed paths 决定 CI 跑什么”的思路了。
### 2.3 Git hook 也已经上线
`.husky/pre-commit` 当前会执行:
`npx tsx scripts/ai-code-verify.ts`
也就是说,Lime 已经不是“完全依赖人工自觉”的状态,而是开始把工程约束前移到提交流程。
### 2.4 契约与一致性检查已经有雏形
当前仓库里至少已经有两个很重要的“机器校验型”脚本:
- `scripts/check-app-version-consistency.mjs`
- `scripts/check-command-contracts.mjs`
前者会检查:
- `package.json`
- `src-tauri/Cargo.toml`
- `src-tauri/tauri.conf.json`
- `src-tauri/tauri.conf.headless.json`
的版本是否一致。
后者会检查:
- 前端 `safeInvoke` / `invoke` 实际调用了哪些 Tauri 命令
- `src-tauri/src/app/runner.rs` 里真正注册了哪些命令
- mock priority 命令集合是否同步
这已经非常接近 Codex 那种“把接口契约变成可自动验证对象”的方向了。
### 2.5 发布链路也已具备完整骨架
当前 `.github/workflows/release.yml` 已经具备:
- tag 驱动发布
- 多平台构建(macOS arm64 / x64,Windows x64)
- 版本同步到 Tauri 配置
- release notes 生成
- GitHub Release 上传
再加上:
- `deploy-docs.yml`
- `update-homebrew.yml`
说明 Lime 已经不是没有交付能力,而是已经有了一个基础发布流水线。
## 3. Lime 当前最明显的缺口
和 Codex 对比后,我认为 Lime 当前最核心的缺口不是“工具不够多”,而是下面三件事还没有完全收敛。
### 3.1 缺少一个统一的 PR 质量主入口
当前 GitHub Actions 里:
- `ci.yml` 主要覆盖 `src-tauri/**` 改动下的 **Windows OpenClaw regression**
- `deploy-docs.yml` 只负责文档站点
- `release.yml` 只负责发布
这意味着,Lime 当前很多重要校验虽然**本地可跑**,但还没有成为 PR 上稳定、清晰、统一的 required status,例如:
- 前端 `lint`
- 前端 `typecheck`
- Vitest
- `test:contracts`
- GUI headless smoke
- Rust 全量测试 / `clippy`
- bridge / smoke 校验
也就是说,我们已经有很多验证动作,但还没有把它们真正收束成“团队共同依赖的一条质量主链路”。
### 3.2 现有脚本之间还偏“并列”,没有形成明确分层
现在仓库里已经有:
- pre-commit 的 `ai-verify`
- 本地智能校验 `verify:local`
- 前端和 Rust 单独测试命令
- bridge / smoke / contracts 脚本
但还缺一件事:
**每一层到底该挡什么问题,团队的预期还不够明确。**
比如现在容易出现的疑问:
- `ai-verify` 是补充提醒,还是硬门禁?
- `verify:local` 是建议执行,还是提交前标准动作?
- `test:contracts` 什么时候必须跑?
- `smoke:social-workbench` 该放本地还是 CI?
Codex 很强的一点,就是每一层的角色很清楚。
Lime 现在更像是“积木已经有了,但还没拼成系统”。
### 3.3 契约检查已有基础,但还没有完全上升为“关键接口演进规范”
`check-command-contracts.mjs` 已经很有价值,但它目前更像一个检查脚本,而不是一整套“接口演进流程”的中心。
对 Lime 这种项目来说,真正高风险的契约不止是 Tauri command 名称,还包括:
- Tauri command 参数结构
- 前后端共享数据结构
- bridge 交互协议
- OpenClaw / Gateway / Workspace 相关状态快照
- 插件 / MCP 相关 manifest 或接口字段
Codex 的经验告诉我们:
**接口文档、生成物、测试、实现,最好一起演进。**
这正是 Lime 接下来最该补齐的一层。
## 4. Codex 最值得 Lime 借鉴的五个方法
下面只写“适合 Lime 的”,不写那些和我们技术栈不匹配的。
### 4.1 借鉴一:建立单一的“质量主入口”
Codex 很重要的一个做法,是把很多检查统一收口到一个最终状态上。
对 Lime 来说,最值得借鉴的是:
**新增一个主质量工作流,让 PR 的主要质量信号只看这一条。**
建议名称可以是:
- `.github/workflows/quality.yml`
这个工作流不需要一开始就做得很重,但应该具备三个特征:
1. **按改动范围决定执行内容**
2. **聚合前端 / Rust / bridge / docs 的核心信号**
3. **最后产出一个统一 results job 作为 required status**
这件事最好优先复用已有逻辑,而不是重写。
最合适的方式是:
- 继续保留 `scripts/local-ci.mjs` 作为本地入口
- 抽一层共享的 changed-path 规则到独立脚本
- 本地与 CI 共同复用这套判断逻辑
这样才能保证:
- 本地怎么判断改动范围
- CI 怎么判断改动范围
尽量一致。
### 4.2 借鉴二:把现有验证动作分层,而不是继续堆并列命令
建议把 Lime 的工程验证分成四层:
#### Layer 0:提交前快速提醒
保留 `.husky/pre-commit` 的 `ai-verify`,但明确定位为:
- 快速提醒
- 风险提示
- 代码卫生检查
**不要把它视为“提交前完整验证”的替代品。**
#### Layer 1:开发者本地标准入口
继续以 `npm run verify:local` 为核心。
建议将它明确成:
**所有功能型改动在发起 PR 前默认至少跑一次。**
这样 Lime 就不需要额外引入 `justfile` 一类新工具,仍然符合我们仓库“优先使用 `npm` / `cargo` / Tauri 命令”的跨平台约束。
#### Layer 2:PR 级智能 CI
这里建议接入:
- 前端:`npm run lint`、`npm run typecheck`、`npm test`
- bridge:`npm run test:bridge`、`npm run test:contracts`
- Rust:`cargo test --manifest-path "src-tauri/Cargo.toml"`
- Rust 扩展:按路径触发的 `cargo clippy`
#### Layer 3:高风险路径专项验证
这层不必每个 PR 都跑,但应该对特定路径生效,例如:
- `src/lib/dev-bridge/**`
- `src/lib/tauri-mock/**`
- `src/components/openclaw/**`
- `src-tauri/src/services/openclaw_service/**`
- `src-tauri/src/app/**`
- Workspace / browser-runtime / MCP / plugin 高风险路径
可以复用现有命令:
- `npm run bridge:health`
- `npm run verify:gui-smoke`
- `npm run bridge:e2e`
- `npm run smoke:workspace-ready`
- `npm run smoke:social-workbench`
其中如果明确把 Lime 看作 **GUI 桌面产品**,我更建议把高风险路径的最小专项护栏优先收口成一个统一入口:
- `npm run verify:gui-smoke`
它适合作为:
- headless Tauri 启动验证
- DevBridge 健康检查
- 默认 workspace 准备态 smoke
这样既不会一开始就把所有页面都推进重型 E2E,也能确保桌面壳、前端入口、bridge 和 workspace 基本链路至少有一条稳定的自动回归。
#### Layer 4:发布前全量验证
发布时建议至少统一收口:
- `npm run verify:app-version`
- `npm run test:frontend`
- `npm run test:contracts`
- `npm run test:rust`
- `npm run lint:rust`
这样 release workflow 才不会只在“能构建”层面把关,而能同时覆盖“接口一致性”和“核心回归风险”。
### 4.3 借鉴三:把“命令契约”升级成 Lime 的正式工程边界
Codex 很强调契约一致性。
Lime 现在已经有 `check-command-contracts.mjs`,这是非常好的起点。
建议下一步不要只把它当脚本,而是把它升级成:
**Lime 的正式工程边界规范之一。**
具体建议:
1. **PR CI 默认跑 `npm run test:contracts`**
2. **凡是修改 `src-tauri/src/app/runner.rs`、前端 `safeInvoke` 调用、bridge mock 命令集合的改动,都要求契约检查通过**
3. **后续逐步扩展到“命令名之外的参数契约”**
这里不建议一上来做成很重的 schema 系统,而是先做最小闭环:
- 命令名一致
- 参数结构不出现静默漂移
- mock / runtime / frontend 三方同步
这是 Lime 当前最值得优先工程化的一条“接口护栏”。
### 4.4 借鉴四:让治理脚本进入主流程,而不是停留在工具箱
Codex 的一个显著特点,是“治理不是旁路”。
Lime 当前已经有:
- `npm run governance:legacy-report`
- `scripts/report-legacy-surfaces.mjs`
同时我们也已经在 `docs/develop/` 下沉淀了不少退场与治理文档,例如:
- `execution-tracker-deprecation-plan.md`
- `execution-tracker-p0-acceptance-report.md`
这意味着 Lime 已经具备治理意识,但还可以更进一步:
### 建议做法
1. 把 `governance:legacy-report` 纳入定期检查或专项 CI
2. 对明确已经进入退场窗口的旧路径,增加“新增引用即报警”的守卫
3. 每个重要治理主题都要求同时有:
- 技术计划
- 退场计划
- 验收报告
- 守卫脚本
也就是说,治理不要只写文档,最好同时配一个可执行的检测机制。
这正是 Codex 的典型思路。
### 4.5 借鉴五:把发布从“打 tag 构建”升级成“分层交付”
Lime 当前的 `release.yml` 已经有不错的发布骨架。
但如果借鉴 Codex,我们可以把“发布”进一步拆成两个层级:
#### A. 稳定版交付
继续保留当前正式 tag 驱动的 GitHub Release、Homebrew 更新、Tauri 构建发布。
#### B. 预发布交付
针对风险较高、改动较大的版本,建议引入:
- `beta` / `rc` / `prerelease`
- 或内部 nightly / weekly 构建
原因很简单:
Lime 现在涉及:
- 桌面壳
- bridge
- 浏览器 runtime
- Provider / Gateway
- OpenClaw 安装与运行态
- 文档站点
这些链路任何一处变化,都可能需要在正式 tag 前先经过一次“真实用户环境暴露”。
Codex 的 alpha 节奏说明了一点:
**快速发布不等于鲁莽发布,预发布本身就是风险管理工具。**
## 5. 结合 Lime 实际,哪些不要照抄
借鉴 Codex,不代表要复制它的全部做法。
以下几件事我认为对 Lime 当前阶段不适合直接照搬。
### 5.1 不要为了“看起来更专业”引入额外构建系统
Codex 同时处理 Cargo / Bazel,是它自己的历史和规模决定的。
Lime 当前已经有:
- `npm`
- `cargo`
- Tauri
这套组合已经足够复杂。
现阶段不应该再额外引入一层类似 Bazel、Buck 或新的任务系统。
### 5.2 不要一下子把所有页面都做成重型 E2E
Lime 当前已经有 bridge / smoke / headless 相关脚本,这很好。
但如果一下子把所有页面都推进到全量 E2E,只会显著拉高维护成本。
更适合的做法是:
- 优先选高风险路径
- 选用户感知强、状态复杂、跨端联动重的页面
- 先做 smoke,再决定是否需要完整 E2E
### 5.3 不要让 AI 验证替代编译与测试
`.husky/pre-commit` 里的 `ai-verify` 很有价值,但它更适合做:
- 提醒
- 自检
- 风险暴露
不适合替代:
- `typecheck`
- `cargo test`
- `test:contracts`
- `clippy`
Codex 借鉴给我们的,不是“让 AI 代替工程”,而是:
**把工程流程做好之后,再让 AI 增强它。**
## 6. 建议的 Lime 落地顺序
下面给出一条尽量现实、成本可控的落地路径。
## Phase 0:收口现有入口(1 周内)
目标:先让团队对“标准本地验证路径”达成一致。
建议动作:
1. 在根 `AGENTS.md` 和开发文档中明确:
- 功能改动默认执行 `npm run verify:local`
- 大范围改动执行 `npm run verify:local:full`
2. 明确 `ai-verify` 是快速提醒层,不替代完整验证
3. 为 `test:contracts` 和 `verify:app-version` 增加更明确的使用说明
产出结果:
- 开发者知道“提交前至少跑什么”
- review 时可以默认假设这些动作已执行
## Phase 1:建立统一质量工作流(1~2 周)
目标:把本地已有能力上升为 PR 门禁。
建议动作:
1. 新增 `quality.yml`
2. 引入 changed-path detection
3. 按改动范围执行:
- frontend
- bridge/contracts
- rust
- docs build
4. 增加单一 `results` 汇总 job
产出结果:
- PR 有统一 required status
- 本地与 CI 质量路径更一致
## Phase 2:加强高风险边界(2~4 周)
目标:让最容易出事故的路径拥有专项护栏。
优先建议覆盖:
1. `safeInvoke` / Tauri command 契约
2. OpenClaw 安装与运行态相关路径
3. bridge / headless / smoke 相关路径
4. Workspace 准备态相关 smoke
可复用现有脚本:
- `npm run test:contracts`
- `npm run bridge:health`
- `npm run bridge:e2e`
- `npm run smoke:workspace-ready`
- `npm run smoke:social-workbench`
## Phase 3:把治理与预发布纳入节奏(1~2 个月)
目标:让“旧路径收口”和“风险前移”进入长期机制。
建议动作:
1. 给 `governance:legacy-report` 找到稳定的执行时机
2. 对重要治理主题建立“技术计划 + 退场计划 + 验收报告 + 守卫脚本”闭环
3. 为大改版本增加 prerelease / beta 节奏
## 7. 最终判断
如果只从表面看,Codex 和 Lime 的仓库差异很大。
但从工程方法看,Lime 其实已经有不少和 Codex 同方向的基础:
- 有仓库级规则
- 有本地智能校验
- 有 AI 验证 hook
- 有命令契约检查
- 有版本一致性检查
- 有多平台 release
- 有治理脚本和退场文档
所以 Lime 现在最需要做的,不是“再发明一套全新的方法论”,而是:
**把已有能力收口成一条清晰、稳定、分层的工程路径。**
如果用一句话概括这份文档的核心建议,那就是:
**对 Lime 来说,借鉴 Codex 的重点不是“学他们用了什么工具”,而是“把我们的规则、脚本、测试、治理和发布真正串成系统”。**
一旦这件事完成,Lime 的迭代速度和稳定性都会一起上一个台阶。