openlark-design-review
SKILL.md
OpenLark 代码设计规范审查(Skill)
🧭 技能路由指南
本技能适用场景:
- 审查 crate 或模块的整体设计规范
- 需要统计 API 完成度(已实现/未实现/完成率)
- 需要检查架构一致性(端点体系、范式选择、feature gating)
- 需要输出按优先级排序的整改清单(P0-P3)
其他技能:
- 仅做代码规范体检(不做深度设计审查)→
Skill(openlark-code-standards) - 添加/重构单个 API →
Skill(openlark-api) - 统一
validate()写法 →Skill(openlark-validation-style)
关键词触发映射
- 架构设计、public API、收敛方案、feature gating、兼容策略、breaking change →
openlark-design-review - 代码规范、规范检查、风格一致性、体检 →
openlark-code-standards - validate、必填校验、空白字符串、validate_required →
openlark-validation-style - 新增 API、重构 API、Builder、Request/Response、mod.rs 导出 →
openlark-api - 覆盖率、缺失 API、实现数量、CSV 对比 →
openlark-api-validation
双向跳转规则
- 若先做设计审查,但缺少全仓规范证据,先补跑
openlark-code-standards。 - 若主要问题退化为校验写法统一,转
openlark-validation-style。
目标
把“设计审查”变成可重复执行的流程,而不是随手点评。
你要输出:
- 一份 可执行的整改清单(P0~P3,含证据与影响)
- 一份 收敛方向(选定 1 套对外范式,并说明迁移策略)
- 一段 接口完成度量化(完成/缺失/完成率,排除
meta.Version=old) - 如用户同意:直接落地修复(优先处理 P0/P1)
适用范围
- 任意 crate(如
crates/openlark-docs/)或任意模块树(如src/ccm/wiki/v2/) - 重点面向 public API 与 跨模块一致性
0. 完成度统计(必须先做)
目的:把“我觉得实现了很多”变成可验证数据。统计口径默认排除
meta.Version=old。
0.1 以 crate 为单位统计(推荐)
使用仓库已有脚本直接对比 CSV 与落盘实现(strict 命名规范):
python3 tools/validate_apis.py --crate <crate-name>
输出包含:API 总数/已实现/未实现/完成率,以及按 bizTag 的统计表;同时会生成默认报告到 reports/api_validation/<crate>.md。
0.2 以 bizTag 为单位统计(当用户只关心某些业务域)
python3 tools/validate_apis.py --src <crate-src-path> --filter <bizTag...>
0.3 预期总量参考(快速对齐)
若需要快速确认“某 bizTag 的有效 API 总数(排除 old)”,可参考仓库文档 crates.md 的统计表(数据源为 api_list_export.csv)。
如需从 api_list_export.csv 重新生成 bizTag 统计(排除 old),可运行:
python3 - <<'PY'
import csv
from collections import Counter
counts = Counter()
counts_all = Counter()
with open("api_list_export.csv", newline="", encoding="utf-8") as f:
r = csv.DictReader(f)
for row in r:
biz = row.get("bizTag")
ver = row.get("meta.Version")
if not biz:
continue
counts_all[biz] += 1
if ver != "old":
counts[biz] += 1
print("bizTag,total,exclude_old,old")
for biz in sorted(counts_all.keys()):
total = counts_all[biz]
ex = counts[biz]
print(f"{biz},{total},{ex},{total-ex}")
print(f"TOTAL,{sum(counts_all.values())},{sum(counts.values())},{sum(counts_all.values())-sum(counts.values())}")
PY
审查输入(先问清楚)
如果用户没说清楚范围,必须先追问 2 个问题:
- 审查目标:仅该 crate,还是需要和全仓库一致(对齐
openlark-client/openlark-core)? - 改造约束:允许 breaking change 吗?(例如移除旧入口、调整 re-export 路径)
输出模板(强制)
按以下结构输出,不得随意变形:
- 结论概览:用 3~6 条 bullet 总结现状与最大风险
- 接口完成度(排除 old):必须给出完成/缺失/完成率(来源见“0. 完成度统计”)
- 问题清单(P0~P3):
- 每条问题必须包含:
现象→证据(文件:行)→影响→建议
- 每条问题必须包含:
- 收敛方案:
- 选定 1 套“对外调用范式”(见 §1)
- 给出迁移步骤与兼容策略(保留旧 API、deprecated 周期等)
- 可执行 TODO:
- 最多 10 条,按优先级排序,能拆 PR 的粒度
注:证据必须精确到
path:line,避免“我觉得/好像”。
1. 对外范式(必须选 1 套,避免混用)
范式 A:Request 自持 Config(流式 Builder)
适用:大量端点、调用侧更偏“链式设置参数”。
特征:
Request::new(Config)保存ConfigRequest::execute()/execute_with_options(RequestOption)- Service(若存在)只负责“分组/版本入口”,不承载网络逻辑
范式 B:Builder → build(Request) → execute(Service)
适用:希望把“执行上下文(Config/Transport)”都集中在 Service 上,便于 mock/注入。
特征:
- Builder 只拼 Request
ExecutableBuilder/trait_system 统一 execute- Service 持有 Config,并负责实际请求发送
规则:同一个 project/version 内不得同时出现 A+B;若历史原因混用,必须定义清晰的迁移路线。
2. 设计检查清单(按重要性)
2.1 Public API 入口与导出
- 是否存在多个“同义入口”(例如
Client/Service/MainService)导致用户困惑? - 是否存在“占位/空实现”的 public API(例如 builder setter 不生效)?
- re-export 是否稳定、是否引入
ambiguous_glob_reexports需要大量 allow? prelude是否只导出“高频且稳定”的类型,避免把内部实现细节暴露出去?
2.2 Feature gating 一致性(Cargo.toml ↔ cfg)
Cargo.toml的 feature 是否与lib.rs/mod.rs的#[cfg(feature = "...")]对齐?- 子模块是否按 feature 做最小编译单元,避免“开了一个 feature 实际编进来一大坨”?
defaultfeatures 是否合理(默认开启过多会放大编译成本与 API 面积)?
2.3 端点体系收敛
检查点:
- 是否复用 crate 的 endpoints 常量或 enum(而非手写
"/open-apis/...")? - 是否只通过唯一端点来源(enum 或常量系统二选一)进行生产调用?
- 是否避免多套端点系统并存(enum/const/path-template)?
- 端点定义是否可被静态检查(避免遗漏、避免 typo)?
详细规范见
Skill(openlark-api) §3.2(模板)和§4.3(检查清单)
2.4 Config/生命周期与性能
openlark-core::Config本身已使用Arc共享;crate 内再包一层Arc<Config>通常是冗余设计。- Service/Request 是否在不必要的地方 clone 大对象(如 http client)?
RequestOption是否在所有对外执行入口都可用并被透传?
⚠️ Service 层模式检查(P0 级)
禁止模式:
- ❌ Service 持有独立的 HTTP client 字段
- ❌ 使用
LarkClient作为具体类型(它是openlark_client::traits中的 trait) - ❌ 在测试中使用
.unwrap()调用Config::build()(build()直接返回Config)
正确模式(参考 openlark-docs/src/common/chain.rs):
- ✅ Service 只持有
Arc<Config> - ✅ 子 Service 通过
new(Arc<Config>)透传配置 - ✅ HTTP 传输统一由
openlark_core::Transport处理 - ✅
Config::build()直接返回Config,不需要.unwrap()
检查点:
# 搜索错误的 LarkClient 用法
rg "LarkClient::new" crates/
# 搜索错误的 Config::build().unwrap() 用法
rg "Config::builder\(\).*\.build\(\)\.unwrap\(\)" crates/
2.5 错误处理与类型边界
- crate 自定义 Error 是否真正被使用?还是存在“孤儿文件/未被 mod 引入”的失效实现?
- 错误是否统一携带上下文(operation/resource_id/request_id)?
- validate 规则是否与全仓一致(必要时使用
Skill(openlark-validation-style))
2.6 测试与告警控制
cargo check --all-features是否无 warning?(deprecated/unused 要么修,要么显式 allow)- 单元测试是否只验证“构建正确”,避免依赖真实网络?
- 文档示例是否可
compile(必要时no_run/ignore但要有理由)
3. 常见整改套路(建议)
- 入口收敛:保留一个 canonical(例如
DocsClient),其余入口标deprecated并给迁移路径。 - 删除占位 API:对外暴露的 builder 若无法工作,要么补齐实现,要么移除/隐藏。
- 范式统一:先在一个子域(如
wiki/v2)试点,再逐步复制到同域其他模块。 - 端点统一:明确“生产用 enum,测试用 const”(或反之),并把另外两套标记为 internal/test-only。
- feature 对齐:把
mod粒度切到能明显减少编译体积的位置(以“用户开哪个 feature 就编进来什么”为目标)。
4. 使用方式(给用户的最短指令)
当用户说“审查 XXX 设计”时:
- 先确认范围与 breaking 约束(见“审查输入”)
- 按“输出模板”给出报告
- 只要用户同意,就按 P0→P1 顺序落地改造并跑
cargo check/test
5. References
- PR 审查报告模板:
references/design-review-report-template.md
Weekly Installs
16
Repository
foxzool/open-larkGitHub Stars
75
First Seen
Feb 21, 2026
Security Audits
Installed on
gemini-cli16
claude-code16
github-copilot16
codex16
kimi-cli16
cursor16