Root Command:启动时装配了什么
Root Command:启动时装配了什么
读 lark-cli 最好的入口不是某个业务域,而是 cmd/build.go 和 cmd/root.go。前者负责装配命令树,后者负责执行、错误分发、notice 和 shutdown hook。
Build 的装配顺序
buildInternal 创建 cmdutil.Factory,再创建 root Cobra command,然后依次挂载这些命令:
| 阶段 | 源码入口 | 说明 |
|---|---|---|
| 基础配置 | RegisterGlobalFlags | --profile 等全局参数 |
| 手写命令 | config/auth/profile/doctor/whoami/api/schema/completion/update/event/skill | CLI 自身能力 |
| 生成命令 | 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;Keychain与Credential:凭证读取与身份推断;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。