用途:这是 doist/twist-cli 仓库中新增 CLI 命令或子命令的开发指南,供实现新 SDK 端点、为现有命令组添加子命令时参考。
主要能力与步骤:
- 在 src/lib/api.ts 的 API_SPINNER_MESSAGES 中为每个新 SDK 方法添加条目,颜色约定为蓝色读取、绿色创建、黄色更新/删除/归档。
- 只读方法(getXxx、listXxx)需加入 src/lib/permissions.ts 的 KNOWN_SAFE_API_METHODS,该集合默认拒绝,未列出的方法在只读 OAuth 令牌下会被阻止;变更类方法不要加入。
- 命令实现放在 src/commands/<entity>/,多子命令用文件夹结构(index.ts 注册、每个子命令一个文件、可选 helpers.ts),单子命令保持扁平文件。子命令文件只导出异步处理函数和选项接口,不导入 Commander。
- 标志约定:只读用 --json(列表可加 --ndjson);有返回的变更用 --json 与 --dry-run;无返回的变更用 --dry-run;不可逆破坏性操作加 --yes 与 --dry-run;可逆操作只用 --dry-run。
- ID 解析使用 resolveThreadId、resolveChannelId、resolveWorkspaceRef、resolveConversationId、parseRef 等,必要时在 refs.ts 添加包装。
- 子命令注册用 parent.command(...).action(...),变量赋值以便参数缺失时调用 help();view 子命令可设 isDefault: true 实现隐式调用;位置参数与同名标志同时提供时报错。
- 错误处理禁止在命令处理器中使用 process.exit(1),应设 process.exitCode = 1 后 return,避免 finally 未执行导致 spinner 卡住。
- 新顶层命令需在 src/index.ts 用懒加载模式注册。
- 无障碍:通过 isAccessible()(检查 TW_ACCESSIBLE=1 或 --accessible)判断,颜色承载含义时加文本前缀,ASCII 图形在无障碍模式省略,装饰符号提供文本等价物。
- 测试放在 src/tests/<entity>.test.ts,用 vi.mock 与 vi.hoisted 模拟 API 层,覆盖正常路径、--dry-run、--json 与错误情况。
- 更新 src/lib/skills/content.ts 的 SKILL_CONTENT,然后运行 npm run build && npm run sync:skill,重新生成的 skills/twist-cli/SKILL.md 必须提交,否则 CI 的 npm run check:skill-sync 会失败。
- 最后运行 npm run type-check、npm test、npm run lint:check 验证。
限制:资料未提供该指南的收费、平台或效果信息;具体实现细节以仓库现有代码模式为准。