- 开发工具
- CLI
- AI 应用
【免费下载链接】zcf
Zero-Config Code Flow for Claude code & Codex
导读
本文围绕 ZCF(Zero-Config Code Flow for Claude Code & Codex)仓库中的一项完整开发任务展开:为CCU 命令(src/commands/ccu.ts,Claude Code 用量分析命令)补全单元测试文件,并同步更新README.md、README_zh-CN.md与CHANGELOG.md。文章以.zcf/plan/history/complete-ccu-tests-and-docs.md计划文档为骨架,结合仓库中的命令实现、交互式菜单工具集、i18n 翻译文件与 Vitest 测试用例,完整还原"命令实现 → 菜单集成 → 双语支持 → 分层测试 → 文档同步"的工程闭环,让读者既能直接复制 CCU 命令的使用方法,也能掌握项目内测试与文档维护的规范套路。
任务背景:为 CCU 功能补全测试与文档
在 ZCF 仓库中,CCU(Claude Code Usage)是一个"用量分析"命令,用于调用 Claude Code 用量分析工具 ccusage。开发计划文档明确指出本次任务的核心目标:
为未提交的 CCU 命令功能补全测试文件,并更新相关文档。
任务涉及三大功能模块:
- CCU 命令(src/commands/ccu.ts):Claude Code 用量分析命令,负责启动
npx ccusage@latest子进程; - 工具集(src/utils/tools.ts):交互式 CCU 功能菜单,负责引导用户选择分析模式;
- 菜单更新(src/commands/menu.ts):在主菜单中新增"其他工具"分类,将用量分析入口接入交互菜单。
从计划文档的执行步骤可以看出,这是一次"功能收尾"性质的工程任务:命令本体此前已完成开发(参见 .zcf/plan/history/add-ccu-command.md),本次重点是补齐测试文件、用户文档与变更记录,并通过类型检查与构建验证收口。
CCU 命令实现:参数透传与子进程调用
核心实现:executeCcusage
CCU 命令的实现集中在 src/commands/ccu.ts 的executeCcusage函数中。它接收一个参数数组,将其原样透传给 ccusage:
import process from 'node:process' import ansis from 'ansis' import { x } from 'tinyexec' import { i18n } from '../i18n' export async function executeCcusage(args: string[] = []): Promise<void> { try { const command = 'npx' const commandArgs = ['ccusage@latest', ...(args || [])] console.log(ansis.cyan(i18n.t('tools:runningCcusage'))) console.log(ansis.gray(`$ npx ccusage@latest ${(args || []).join(' ')}`)) console.log('') await x(command, commandArgs, { nodeOptions: { stdio: 'inherit', }, }) } catch (error) { console.error(ansis.red(i18n.t('tools:ccusageFailed'))) console.error(ansis.yellow(i18n.t('tools:checkNetworkConnection'))) if (process.env.DEBUG) { console.error(ansis.gray(i18n.t('tools:errorDetails')), error) } if (process.env.NODE_ENV !== 'test') { process.exit(1) } throw error } }这段实现有五个值得关注的工程要点:
- 参数透传:
['ccusage@latest', ...(args || [])]通过展开运算符把所有参数追加到ccusage@latest之后,这意味着 CCU 命令天然支持 ccusage 的全部参数(模式、格式、过滤条件等),无需在 ZCF 侧做白名单维护; - 命令执行方式:使用
tinyexec的x函数执行npx,避免引入 shell 字符串拼接带来的注入与转义问题,参数以数组形式安全传递; - stdio 继承:
nodeOptions: { stdio: 'inherit' }让 ccusage 的输出(表格、进度、日志)直接流向终端,保持原始格式与实时性,这是"用量分析"类命令最自然的交互方式; - 执行前提示:在真正执行前打印两行信息——青色标题("正在运行 Claude Code 用量分析工具...")和灰色回显命令(
$ npx ccusage@latest <args>),让用户明确知道即将执行什么; - 错误处理分级:失败时先输出红色错误标题与黄色"检查网络连接"提示;仅在
DEBUG环境变量存在时打印错误详情;并且通过NODE_ENV !== 'test'的守卫避免在测试环境中触发process.exit(1),而是改为throw error交由上层/测试捕获——这是源码为可测试性做的显式设计。
CLI 注册:allowUnknownOptions()的妙用
命令要能通过zcf ccu调用,需要在 CLI 注册。在 src/cli-setup.ts 中可以看到:
.command('ccu [...args]', 'Run Claude Code usage analysis tool') .allowUnknownOptions()[...args]声明 CCU 可以接收任意数量的位置参数,而allowUnknownOptions()则允许任意未知选项通过——两者共同构成了"参数全透传"能力。这样用户可以自由组合 ccusage 的各类参数,ZCF 无需预知或校验具体选项。
同时,帮助信息与使用示例也被同步进 CLI 帮助系统(src/cli-setup.ts 与#L183-L184):
zcf ccu [args] # Claude Code 用量分析 npx zcf ccu # 默认日统计(daily) npx zcf ccu monthly --json # 月统计并输出 JSON命令行使用方式
结合 .zcf/plan/history/add-ccu-command.md 中的验证记录,CCU 命令支持以下调用形态:
# 直接调用,指定分析模式 zcf ccu daily zcf ccu monthly --json zcf ccu session zcf ccu blocks # 不带参数时默认执行 ccusage(ccusage 默认模式为 daily) zcf ccu # 查看帮助 zcf ccu --help交互式工具集:runCcusageFeature分析模式选择
除了命令行直接调用,CCU 功能还通过 src/utils/tools.ts 的runCcusageFeature提供交互式入口。它使用inquirer构建一个模式选择列表,共 6 个选项:
| 选项 | value | 中文标签 | 英文标签 |
|---|---|---|---|
| 1 | daily | 日统计 | Daily usage |
| 2 | monthly | 月统计 | Monthly usage |
| 3 | session | 会话统计 | Session statistics |
| 4 | blocks | 分析代码块 | Analyze code blocks |
| 5 | custom | 自定义模式 | Custom parameters |
| 6 | back | 返回 | Back |
选项名称通过addNumbersToChoices(choices)(见 src/utils/prompt-helpers.ts)自动加上序号前缀,选择daily/monthly/session/blocks时直接将模式名作为参数调用executeCcusage(['daily']);选择back则直接返回不执行任何命令。
自定义参数的智能解析
custom模式是本功能交互体验的精华:它接收用户输入的一行字符串,然后将其解析为参数数组。解析逻辑(src/utils/tools.ts)覆盖了大量边界情况:
- 空值兜底:输入为
null、undefined、空字符串或纯空格时,返回空数组[]; - 类型归一:非字符串输入(如数字
123)先String()转成字符串再处理; - 保留引号内容:使用正则
/"([^"]*)"|'([^']*)'|(\S+)/g逐段匹配——双引号、单引号包裹的内容被整体视为一个参数(含空格也不会被拆分),未加引号的部分按空白符切分; - 多余空白容错:参数间多个空格、甚至制表符与换行都会被正确忽略。
例如输入daily --json --output report.json会解析为['daily', '--json', '--output', 'report.json'];输入--path="/Users/Claude Code/data"会保留带空格的路径为单一参数。
交互结束后,runCcusageFeature还会输出一个"按 Enter 继续"的等待提示(pressEnterToContinue),让用户查看完 ccusage 输出后再返回菜单,避免终端输出一闪而过。
主菜单集成:"其他工具"分类与 U 选项
CCU 功能的第三个接入点是主菜单。在 src/commands/menu.ts 的showClaudeCodeMenu中,printOtherToolsSection()负责打印"其他工具"分类,将 CCU 与其他辅助工具并排展示:
--------- 其他工具 ---------- R. CCR 管理 - 配置 Claude Code Router 模型代理 U. ccusage - Claude Code 用量分析 L. Cometix Line - ...- 菜单选项
U(大小写均可,源码中valid数组包含'u', 'U')对应case 'u': await runCcusageFeature(); - 调用完成后打印分隔线并返回菜单循环,等待用户选择继续操作还是退出。
这意味着用户可以通过两种路径使用用量分析:命令行直接zcf ccu <args>,或进入交互菜单按U。两者最终都汇聚到同一个executeCcusage,保证行为一致。
i18n 双语支持:中英文界面文本
ZCF 的界面文本全部走 i18n 体系,CCU 相关文案分布在中英文两份tools.json中。以中文翻译文件 src/i18n/locales/zh-CN/tools.json 与英文翻译文件 src/i18n/locales/en/tools.json 为例,核心键值对应如下:
| 键 | 中文 | 英文 |
|---|---|---|
runningCcusage | 正在运行 Claude Code 用量分析工具... | Running Claude Code usage analysis tool... |
ccusageDescription | CCUsage 是 Claude Code 使用情况分析工具 | CCUsage is a tool for Claude Code usage analytics |
selectAnalysisMode | 选择分析模式: | Select analysis mode: |
ccusageModes.daily | 日统计 | Daily usage |
ccusageModes.monthly | 月统计 | Monthly usage |
ccusageModes.session | 会话统计 | Session statistics |
ccusageModes.blocks | 分析代码块 | Analyze code blocks |
ccusageModes.custom | 自定义模式 | Custom parameters |
enterCustomArgs | 输入自定义参数 | Enter custom arguments |
pressEnterToContinue | 按 Enter 继续... | Press Enter to continue... |
ccusageFailed | CCUsage 运行失败 | CCUsage failed to run |
checkNetworkConnection | 检查网络连接 | Check network connection |
此外,主菜单文案在 src/i18n/locales/zh-CN/menu.json 与 src/i18n/locales/en/menu.json 中新增了menuOptions.ccusage与menuDescriptions.ccusage,用于"其他工具"分类中的展示。
测试体系:Vitest 分层测试与 90%+ 覆盖率目标
测试策略
计划文档明确了测试的整体策略,这也是整个任务的核心产出之一:
- 框架:使用 Vitest;
- Mock 策略:Mock 外部依赖(
tinyexec、inquirer),隔离网络与交互输入; - 分层测试:基础测试(正常路径)+ 边缘测试(异常与边界输入);
- 覆盖率目标:90% 以上。
最终落地为四个测试文件(注意:实际仓库目录为tests/unit/...,计划文档中写作test/unit/...):
| 测试文件 | 覆盖对象 | 测试重点 |
|---|---|---|
| tests/unit/commands/ccu.test.ts | executeCcusage | 正常执行、默认参数、多参数透传 |
| tests/unit/commands/ccu.edge.test.ts | executeCcusage | 空数组、特殊字符、超长参数、非零退出码 |
| tests/unit/utils/tools.test.ts | runCcusageFeature | 模式选择、back 返回、custom 解析、继续提示 |
| tests/unit/utils/tools.edge.test.ts | runCcusageFeature | 错误传播、引号路径、数字/对象输入、异常模式 |
| tests/unit/commands/menu.test.ts | 主菜单 | 菜单渲染与选项分发 |
命令层测试:验证参数透传的准确性
tests/unit/commands/ccu.test.ts 通过vi.mock('tinyexec')替换真实子进程执行,核心断言是executeCcusage是否把参数按预期组合成npx调用:
await executeCcusage(['daily']) expect(mockX).toHaveBeenCalledWith('npx', ['ccusage@latest', 'daily'], { nodeOptions: { stdio: 'inherit' }, })它覆盖了四种典型输入形态:
- 带模式参数:
executeCcusage(['daily'])→['ccusage@latest', 'daily']; - 带选项参数:
executeCcusage(['monthly', '--json'])→['ccusage@latest', 'monthly', '--json']; - 无参数调用:
executeCcusage()→['ccusage@latest'],验证默认行为; - 多参数混合:
['session', '--format', 'json', '--output', 'report.json']完整透传。
tests/unit/commands/ccu.edge.test.ts 则补充了边界输入:空数组[]、含引号与等号的特殊参数(--path="/home/user/Claude Code/"、--filter=*.json)、50 个参数的超长列表、以及 ccusage 返回非零退出码的场景。测试通过process.exit的 spy 抛出异常的方式确保退出逻辑可控。
工具集测试:验证交互流程与自定义参数解析
tests/unit/utils/tools.test.ts 使用真实 i18n 体系(仅 mockensureI18nInitialized),验证:
- 模式选择:
daily、monthly、session、blocks分别调用executeCcusage(['daily'])等对应参数; - 返回行为:选择
back时不调用executeCcusage,且prompt只触发一次; - 自定义参数:
'daily --json --output report.json'被正确拆为 4 个参数;空字符串、纯空格输入解析为空数组; - 继续提示:分析完成后弹出第二个
prompt,消息为灰色"Press Enter to continue..."。
tests/unit/utils/tools.edge.test.ts 进一步覆盖:
- 错误传播:
inquirer.prompt被拒绝(用户取消)、executeCcusage抛错、继续提示失败——异常均向上传播且不会误触发命令执行; - 引号保留:
--path="/Users/Claude Code/data"作为带空格路径被整体保留; - 制表符/换行:
'daily\t--json\n--verbose'被解析为 3 个干净参数; - 超长参数:1000 字符的单参数原样传递;
- 异常输入:
customArgs为undefined/null返回空数组,为数字123转成字符串'123',为对象则按String()转换; - 意外模式值:
mode: 'invalid-mode'也会被当作参数传给 ccusage(由 ccusage 自行报错)。
需要说明的是,测试文件中 mock 了zcf-config模块的读取函数,但从当前 src/commands/ccu.ts 源码看该依赖并非执行路径的必要条件,这是测试桩的历史遗留,不影响断言的有效性——所有关键断言都聚焦于tinyexec的调用参数与流程控制。
文档与变更记录同步
README 双语更新
计划要求 README 中英文同步添加 CCU 命令说明。在 README.md 中可以找到 ccusage 被列为项目的相关工具(依赖说明部分);README_zh-CN.md 同步维护中文版本。文档更新遵循三条原则(源自计划文档):
- 保持中英文同步:任何英文文档改动必须同步到中文版,避免信息不对称;
- 遵循项目现有格式:命令说明、代码块风格与既有章节保持一致;
- 提供清晰的使用示例:文档中的命令必须附带可复制的真实示例(如
zcf ccu daily)。
CHANGELOG 记录
CHANGELOG.md 中记录了本次任务的全链路变更(约#L2300-L2334附近):
- 新增
ccu命令用于 Claude Code 用量分析; - 为 ccu 命令添加全面的单元测试;
- 更新 README 添加 ccu 命令说明;
- 更新 CHANGELOG 中 ccu 命令的描述。
此外,后续版本还持续优化了命令描述、移除了工具描述中重复的 ccusage 链接(CHANGELOG.md 约#L2132-L2145),说明文档维护是一个随功能演进而持续迭代的过程。
验证闭环:类型检查与构建
计划文档的验证步骤是:运行类型检查和构建验证。这一步确保新代码通过 TypeScript 严格编译、测试产物可正常打包,是"测试补全 + 文档更新"任务收口前的最后一道闸门。
同时计划文档中也如实记录了一个遗留风险:
测试有部分失败,需要修复 i18n 相关问题
这表明在 i18n 重构过程中(仓库存在多处 i18n 相关历史计划,如 .zcf/plan/history/i18n-refactor.md),部分测试需要随翻译键结构调整而同步修正。测试依赖翻译键这一事实,提醒后续维护者在修改 i18n 键名或文案时,务必同步检查tests/unit与tests/i18n下的相关用例。
小结:一条可复用的功能交付流水线
回顾整个complete-ccu-tests-and-docs计划,它实际上勾勒出一条适用于 ZCF 项目的功能交付收尾流水线:
- 功能开发先行(见 .zcf/plan/history/add-ccu-command.md):实现命令、注册 CLI、接入菜单、补全 i18n;
- 测试补全:按"基础 + 边缘"分层补齐命令层与工具集测试,目标覆盖率 90%+,Mock 一切外部副作用(子进程、交互输入);
- 文档同步:README 中英双语、CHANGELOG 变更记录三步齐头并进;
- 验证收口:类型检查与构建确认无回归,遗留问题(如 i18n 测试失败)如实记录并跟踪修复。
对于希望深入本仓库的读者,可以沿着以下路径继续探索:命令实现看 src/commands/ccu.ts,交互逻辑看 src/utils/tools.ts,CLI 注册看 src/cli-setup.ts,菜单集成看 src/commands/menu.ts,测试范例看 tests/unit/commands/ccu.test.ts 与 tests/unit/utils/tools.edge.test.ts,历史决策则可回溯 .zcf/plan/history/add-ccu-command.md 与 .zcf/plan/history/complete-ccu-tests-and-docs.md 两份计划文档。
- 开发工具
- CLI
- AI 应用
【免费下载链接】zcf
Zero-Config Code Flow for Claude code & Codex
相关推荐
KubeVela 分层 Addon 交付架构探索:从按组件拓扑放置到 CueX 组件替代 CR(KEP-2.13 设计笔记导读)
KubeVela 分层 Addon 交付架构探索:从按组件拓扑放置到 CueX 组件替代 CR(KEP 2.13 设计笔记导读) 本文以 KubeVela 仓库
开发工具CLIAI 应用ECC 测试覆盖率实战指南:/test-coverage 命令从覆盖率分析到缺口测试生成的完整工作流
ECC 测试覆盖率实战指南:/test coverage 命令从覆盖率分析到缺口测试生成的完整工作流 本文聚焦 ECC(Everything Claude Co
人工智能AI 技能AI 插件AI 评测Agent 评测MCP Clients开发工具5分钟搞定 Font Awesome CDN 集成:图标加载不再拖慢首屏
5分钟搞定 Font Awesome CDN 集成:图标加载不再拖慢首屏 页面图标是最容易被忽视的细节:字体文件下载慢时,页面图标位置会变成一排白色方块,首屏观
开发工具CLIAI 应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考