附录 C:CLI 设计 Checklist
发布前自检清单。逐项核对,打勾的项目表示已完成。
命令设计
- 命名一致性:所有子命令使用同一种风格(kebab-case 或 camelCase,不混用)
- 动词开头:子命令名是动词或动词短语(
scan、review、init),不是名词 - help 信息完整:每个命令和选项都有 description,
--help输出可以作为用户文档 - usage 示例:help 信息中包含至少一个使用示例(
Examples:段落) - 版本号:
--version或-v正确输出当前版本 - 无参数行为:直接运行不带参数时显示帮助信息,而不是报错或无输出
- 拼写错误提示:用户输入错误的子命令名时,提示最接近的正确命令
- 选项缩写不冲突:单字母缩写(
-f、-v)没有歧义 - 默认值合理:常用选项有合理的默认值,大部分场景不需要手动指定
交互体验
- 非 TTY 降级:当 stdout 不是 TTY 时(管道、重定向),自动禁用颜色、spinner 和交互式提示
- Ctrl+C 处理:响应 SIGINT,清理临时文件和进程,给出友好提示
- SIGTERM 处理:响应 SIGTERM,优雅退出
- 进度反馈:耗时超过 1 秒的操作有进度指示(spinner 或进度条)
- 长时间操作可中断:大型操作(扫描、分析)支持中途取消,不是只能等完成或强杀
- 错误信息可操作:错误提示不只说”出错了”,而是告诉用户下一步该怎么做
- 确认破坏性操作:删除、覆盖等不可逆操作前要求确认(
--force跳过确认) - 静默模式:
--quiet或-q选项,只输出最终结果,不输出过程信息
输出
- stdout / stderr 分离:正常输出走 stdout,错误和日志走 stderr
- NO_COLOR 支持:设置环境变量
NO_COLOR=1时禁用所有颜色输出 - FORCE_COLOR 支持:设置
FORCE_COLOR=1时强制启用颜色(即使在管道中) - JSON 输出:
--format json或--json选项,输出机器可读的 JSON - JSON 输出到 stdout:JSON 模式下,进度信息和日志仍然走 stderr,只有数据走 stdout
- 退出码规范:0 = 成功,1 = 一般错误,2 = 参数错误,130 = 被 SIGINT 中断
- UTF-8 输出:正确处理中文和 emoji,不出现乱码
- 宽字符对齐:表格中的中文和英文正确对齐(中文字符占 2 列)
配置
- XDG 规范:配置文件存放在
$XDG_CONFIG_HOME/appname/(默认~/.config/appname/) - 数据目录:持久数据存放在
$XDG_DATA_HOME/appname/(默认~/.local/share/appname/) - 缓存目录:缓存文件存放在
$XDG_CACHE_HOME/appname/(默认~/.cache/appname/) - 环境变量覆盖:每个配置项都可以通过环境变量覆盖(如
REPOX_MODEL、REPOX_VERBOSE) - 环境变量前缀:所有环境变量使用统一前缀(如
REPOX_),避免和其他工具冲突 - .env 支持:自动加载项目目录下的
.env文件(可选,对开发者友好) - 配置优先级清晰:文档中说明配置的优先级顺序(默认值 < 配置文件 < 环境变量 < 命令行参数)
- 配置文件格式一致:使用一种格式(JSON / YAML / TOML),不要混用
- 配置文件可选:没有配置文件时使用默认值正常运行,不报错
安全
- 不硬编码密钥:API key、token 等通过环境变量或配置文件传入,不出现在代码中
- credentials 文件权限:存储凭证的文件权限设为 0600(仅所有者可读写)
- 创建文件时设权限:
fs.writeFile时明确指定 mode,不依赖 umask - 不输出密钥:
--verbose和--debug模式下不打印完整的 API key(只显示前 4 位 +***) - 输入校验:所有用户输入在使用前校验,特别是文件路径(防止路径穿越)和 shell 命令参数(防止注入)
- 子进程参数转义:调用
child_process时使用execFile(参数数组)而不是exec(字符串拼接) - 依赖审计:
npm audit无 high/critical 级别漏洞 - 不发布敏感文件:
.npmignore或package.json#files排除.env、测试 fixture、本地配置
发布
- 语义化版本号:遵循 semver——patch 修 bug、minor 加功能、major 有 breaking change
- CHANGELOG:每个版本的变更有记录,分类清晰(Added / Changed / Fixed / Removed)
- README 完整:安装方法、基本用法、配置说明、示例
- LICENSE 文件:明确开源协议
- bin 字段正确:
package.json的bin指向正确的构建产物 - shebang 正确:产物第一行是
#!/usr/bin/env node - 可执行权限:产物文件有可执行权限(
chmod +x) - engines 字段:声明最低 Node.js 版本要求
- 不发布 devDependencies:构建产物不包含开发依赖
- 包体积合理:
npm pack后检查发布包大小,排除不必要的文件 - 发布前本地验证:
npm pack && npm install -g ./appname-x.x.x.tgz在本地测试安装
测试
- 单元测试:核心逻辑(参数解析、数据处理、格式化)有单元测试覆盖
- 集成测试:关键命令的端到端测试(spawn 子进程运行 CLI,检查输出和退出码)
- 快照测试:help 信息和格式化输出用快照测试防止意外变更
- CI 配置:push 和 PR 自动运行测试
- 跨平台验证:CI 中至少覆盖 Linux 和 macOS,条件允许加上 Windows
- Node.js 版本矩阵:CI 中测试 engines 字段声明的最低版本和当前 LTS 版本
- 管道模式测试:测试通过管道传入数据和输出数据的场景
- 错误场景测试:测试无效参数、文件不存在、网络错误等异常路径
可访问性
- 不依赖颜色传达信息:除了颜色,还用符号(✓ ✗ ⚠)或文字标记状态
- 屏幕阅读器友好:重要信息不依赖动态效果(spinner 有文本 fallback)
- 宽度适配:在 80 列的窄终端中也能正常显示(不截断关键信息)
本书资源
- 源码仓库 · github.com/diguike/repox
- 在线阅读 · inferloop.dev/repox
- 所有书目 · inferloop.dev
继续阅读 · 同作者其他书
- 《Transformer 工程实战》从注意力机制到生产部署
- 《自己动手写 AI Agent》从 Claude Code 开源架构到你的第一个编程助手
- 《LLM Infra 工程实战》从入门到实践
- 《Hermes Agent 实战》构建会成长的个人 AI Agent
- 《OpenClaw 源码解析》现代 Agent 系统的架构设计与工程实践
- 《一切皆插件》DeepSeek Harness 源码精读、Mini 实现与插件开发实战
- 《Agent Memory 工程实战》从 claude-mem 源码到企业级记忆平台
- 《AI Token 中转站实战》从 0 搭建企业级 LLM 网关
- 《LangChain.js Agent 开发权威指南》从 1.x 抽象到生产级 Agent
- 《百万级 AI Agent 平台架构》智能客服 SaaS 实战
- 《AI Agent 评测工程实战》从 0 用 TypeScript 构建你的评测平台
- 《Agent Harness 评测工程》用评测建设并守护一个 agent harness
- 《源码精读》每章一个开源仓库 · 从架构到品味
- 《Claude Code Skill 指南》
- 《Claude 插件官方指南》
Last updated on