openlark-design-review
npx skills add https://github.com/foxzool/open-lark --skill openlark-design-review
Agent 安装分布
Skill 文档
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