Root Command:启动时装配了什么

lark-cli 最好的入口不是某个业务域,而是 cmd/build.gocmd/root.go。前者负责装配命令树,后者负责执行、错误分发、notice 和 shutdown hook。

Build 的装配顺序

buildInternal 创建 cmdutil.Factory,再创建 root Cobra command,然后依次挂载这些命令:

阶段源码入口说明
基础配置RegisterGlobalFlags--profile 等全局参数
手写命令config/auth/profile/doctor/whoami/api/schema/completion/update/event/skillCLI 自身能力
生成命令service.RegisterServiceCommandsWithContext从 RuntimeCatalog 生成 OAPI 命令
快捷命令shortcuts.RegisterShortcutsWithContext注册 + 命令
收尾groupRootCommands、unknown guard、strict-mode prune帮助分组、未知命令提示、身份模式裁剪
扩展plugin install、policy pruning、hook wiring插件和生命周期 hook

这条线解释了为什么 lark-cli <domain> --help 里会同时出现两类东西:一类是 metadata 生成的资源/方法命令,另一类是手写的 +shortcut

Factory 是依赖注入点

internal/cmdutil.Factory 保存共享依赖:

  • Config:加载 app 配置;
  • HttpClient / LarkClient:普通 HTTP 与 Lark SDK client;
  • IOStreams:stdin/stdout/stderr;
  • KeychainCredential:凭证读取与身份推断;
  • FileIOProvider:文件上传下载的 IO 抽象;
  • SkillContent:嵌入的 skill 文件系统。

这让命令实现可以专注于“解析参数 → 构建请求 → 输出结果”,测试里也能替换外部依赖。

root help 直接面向 Agent

cmd/root.go 的 long help 不是普通 CLI 文案,它开头就是 Agent quickstart:

Browse commands:  lark-cli <domain> --help
Inspect a call:   lark-cli schema <service>.<resource>.<method>
Prefer a +shortcut over the raw API resource when one matches the task.

这不是营销语,而是源码里的默认帮助文本。它把命令优先级写死在入口处:先用 +shortcut,再用 typed API command,最后才用 api raw escape hatch。

下一篇:Shortcuts:为什么 + 命令是第一层