ChipCode CLI 设计:NDJSON 输出与 0/1/2/4/130 退出码

简介: ChipCode CLI 采用 NDJSON 流式输出与语义化退出码(0/1/2/4/130),专为自动化设计:stdout 仅输出可解析事件,退出码精准区分成功、执行失败、用法错误、验收不通过及用户中断,赋能 CI/Agent 稳定编排。(239字)

ChipCode CLI 设计:NDJSON 输出与 0/1/2/4/130 退出码

命令行工具只有两个输出通道:stdout 和退出码。前者给人看,后者给脚本看。

大部分 CLI 把这两件事混在一起——错误信息打到 stderr,退出码统一返回 1。这在人手动敲的时候没问题,一旦要接进自动化流程,就立刻不够用了。

ChipCode 的命令行部分(triecode)做了一些不太常见的取舍,这篇讲讲为什么。

为什么不用人类可读的表格

默认输出是 NDJSON:一行一个 JSON 对象,每行独立可解析。

{"event":"start","task":"compile","ts":1793905970}
{"event":"log","level":"info","msg":"Using board: esp32dev"}
{"event":"artifact","path":"build/firmware.bin","size":912384}
{"event":"end","task":"compile","status":"pass","took_ms":8412}

为什么不是一张对齐得漂漂亮亮的表?

因为这张表在下游就是一坨需要正则的文本。而 NDJSON 的每一行都能被 jq、被 Python 的 json.loads、被任何语言的流式解析器直接吃掉,不需要约定列宽、不需要处理中文对齐、不会因为某个字段里出现空格就错位。

流式的另一个好处是能边跑边看。编译一个 ESP-IDF 项目可能要两分钟,如果等它结束才输出,用户只能盯着空白。NDJSON 是一行一行出来的,管道给谁都能实时消费。

代价是人工直接看会有点吵。所以我们留了 --pretty,它的作用只是在末尾把同一批事件汇总成人能读的格式——事件流本身不变。

退出码:把“为什么失败”编码进去

这是这套设计里我们讨论最久的部分。最终的五档:

码 含义
0 成功,且所有断言都通过
1 执行失败(编译错误、烧录失败、进程异常)
2 用法错误(参数不合法、环境缺失、配置读不到)
4 执行成功,但验证不通过
130 被用户中断(SIGINT)

前两档没什么争议。争议全在 4。

一开始我们是 0 和 1 两档:成功返回 0,失败返回 1。用了一段时间之后发现一个问题:“编译过了但验收没过”和“编译都没过”被混成同一件事了。

这在脚本里是要命的。举个真实场景:

triecode run --stage software -q
if [ $? -eq 0 ]; then
  triecode run --stage integration
fi

如果编译成功但三条验收条件只过了两条,它返回 1——脚本就停在软件阶段,永远不会往下走。可实际上这时候最该做的是进入联调,让人看着跑一遍,而不是卡在原地重试编译。

拆出 4 之后:

triecode run --stage software -q
code=$?
case $code in
  0) triecode run --stage integration ;;
  1) echo "编译/执行失败,看日志" >&2; exit 1 ;;
  4) echo "执行完成,但有未通过项,转人工" ; triecode report --stage software ;;
esac

4 是个很老的习惯——很多 Unix 工具用它表示“有差异”。我们借了这个语义:动作完成了,但结果不符合预期。

2 和 1 为什么要分开

因为它们的修复动作完全不同。

1 意味着“你写的东西有问题”,去看编译日志。
2 意味着“你的调用方式有问题”,去看命令本身。

把这两者混在一起,用户第一反应永远是“我的代码错了”,然后花二十分钟翻日志,最后发现是自己少写了一个 --project。

把用法错误单独拎出来,错误信息可以写得更直接:不打印堆栈,只打印“缺少参数 --project,可用值见 triecode init --help”。这类错误不需要上下文,只需要指路。

130 是个约定

128 + 2,SIGINT。这是 shell 的通行做法,不是我们发明的。

单独处理它的意义在于:中断不是失败。

用户按 Ctrl+C 停下来,脚本不应该把这当成“构建失败”去触发告警、去回滚、去发通知。它应该做的是清理临时文件、保留已有产物、然后安静退出。

我们在 cli driver 里对取消做了三件事:给子进程发终止信号、等它真的退出(带超时强杀)、把已经收到的输出写进日志。这三件事的顺序不能反——先杀再收输出会丢日志。

一个具体的坑:stdout 被谁占了

NDJSON 走 stdout,那子进程的输出怎么办?

如果直接把 make 的输出接到 stdout,事件流就被污染了,下游解析会崩。

我们的做法是:子进程的 stdout/stderr 一律捕获,转成 {"event":"log"} 事件再写出去。 stdout 上永远只有宿主自己产生的 JSON 行。

这带来一个副作用:长时间运行的命令如果输出量很大,内存会涨。所以加了行数上限和滚动丢弃——只保留最近 N 行,更早的落盘。这个 N 我们定在 2000,实测够用。

它不是给所有人用的

说清楚边界:这套东西的目标用户是“要把构建流程接进 CI 或者别的脚本”的人。

如果你只是自己在本地点点按钮,图形界面比命令行舒服得多。

CLI 存在的意义是可组合。而可组合的前提是输出可解析、退出码有语义、错误可区分。这三件事做好了,它就能被任何东西调用;做不好,它就只是一个长得像命令行的按钮。

我们在这上面花的功夫,比写业务逻辑多。

相关文章
|
12天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
4779 29
|
12天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4518 51
|
7天前
|
存储 弹性计算 人工智能
2026 年阿里云双十一活动入口攻略,新客服务器优惠通道、三大会场入口梳理
综合来看,2026年阿里云双十一活动入口清晰: 阿里云轻量应用服务器、阿里云ECS云服务器、阿里云GPU云服务器、阿里云百炼大模型服务平台 活动会场、综合权益中心、99计划专场三大入口覆盖服务器、AI权益与续费特价;新用户通过控制台首页banner、权益中心、产品页三处路径进入专属专场,老用户通过控制台弹窗和费用中心权益中心进入老客专区,企业用户做企业实名后解锁专属满减与阶梯折扣。
830 0
|
13天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
2176 7
|
7天前
|
云安全 人工智能 安全
|
6天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1526 3
|
4天前
|
人工智能 安全 API
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(dsh)是DeepSeek AI于2026年开源的轻量级Agent运行框架,基于Cordis内核,践行“一切皆插件”理念。支持Web/桌面双端,开箱即用;内置多模型接入、丰富插件生态(超3.5万),适配编程、办公、创作等场景。(239字)
1043 0
|
13天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2204 6
|
6天前
|
人工智能 并行计算 调度
本地 AI 一键部署工具 LocModel:Windows 端集成画图、视频生成、Agent 的开源模型运行方案
LocModel 是专为 Windows 设计的一站式本地 AI 工具,支持零配置启动、自动硬件检测、GGUF 模型一键加载、文生图/视频生成及 Agent 自动化任务。适配 8G 显存,内置显存分片调度,轻松实现 AI 漫剧批量创作与离线大模型调用。(239 字)