观察类发现(finding,不入 pm:queue)。在实现 #5217(scripts/check-i18n-bundles.mjs 加构建前置判定)时撞到同一族的第四个站点,与该单实现无关、文件面也不同,按 Prime Directive #10 只记录不顺手修。
现象
scripts/check-i18n-coverage.mjs 与 #5217 修的那个门禁是 lint.yml 里紧邻的两步(Check generated translation bundles… → Check no new untranslated declared labels),并且带着同一句声明式前置:
scripts/check-i18n-coverage.mjs:31 — // Requires the workspace build (it runs the built CLI), so it belongs after the …
scripts/check-i18n-coverage.mjs:42 — const CLI = 'packages/cli/bin/run.js';
同样只是注释,没有检查。在装完依赖但未构建的 worktree 里(packages/cli/dist 缺失)跑 node scripts/check-i18n-coverage.mjs:
file:///home/user/objectstack-issue-5217/scripts/check-i18n-coverage.mjs:101
if (!raw.trim()) throw new Error(`os lint produced no output for ${configPath}`);
^
Error: os lint produced no output for examples/app-crm/objectstack.config.ts
at countI18nIssues (…/check-i18n-coverage.mjs:101:28)
at …/check-i18n-coverage.mjs:118:25
Node.js v22.22.2
退出码 1。
与 #5217 的关系:同类不同形
#5217 那边是「一个原因报成九个结果」;这边是一个未捕获异常 + 一段 node 栈,并且那句话把读者的注意力指向 examples/app-crm/objectstack.config.ts —— 一个完全无辜的示例配置。真实成因同样只有一个:跑的是构建产物 packages/cli/bin/run.js(oclif 从 dist/commands 解析命令),CLI 没 build 时 os lint 什么也没输出。
家族里已有的三条:#5217(check-i18n-bundles,devx,本人 PR 在飞)、#5795(根 dev 入口)、#5794(datasource fail-fast 不认识该成因)。本条是第四个站点,不落在前三条任何一条的完成范围内(#5217 的文件面被派发词明确限定为 check-i18n-bundles.mjs 一个文件),故独立立单,不作子单,也不构成 Blocked-by。
建议方向(实现者自选)
与 #5217 落地的形状同构即可:进入 per-config 循环之前一次前置判定 + 失败时一句修法(pnpm exec turbo run build --filter=@objectstack/cli),而不是让第一个 config 抛异常。#5217 的 PR 里那个判定是纯函数 + --self-test 语料的形式(oclifCommandFileFor 从 CLI 自己的 oclif.commands.target 推导产物路径 + looksLikeMissingCliCommand 认 oclif 的换行签名),可以直接照抄同一形状;注意 oclif 会把那句 command … not found 硬换行成两三行,逐行正则匹配不到。
影响面
纯内部工具链 DX。CI 永远命中不到(构建步骤在这两个门禁之前,见 lint.yml 的 Build workspace packages),今天没有人因此拿到错误结果;坏的只是本地/worktree 复现 i18n CI 时的首个诊断步骤。故按观察类归档,交由 PM 定级。
观察类发现(
finding,不入pm:queue)。在实现 #5217(scripts/check-i18n-bundles.mjs加构建前置判定)时撞到同一族的第四个站点,与该单实现无关、文件面也不同,按 Prime Directive #10 只记录不顺手修。现象
scripts/check-i18n-coverage.mjs与 #5217 修的那个门禁是lint.yml里紧邻的两步(Check generated translation bundles…→Check no new untranslated declared labels),并且带着同一句声明式前置:scripts/check-i18n-coverage.mjs:31—// Requires the workspace build (it runs the built CLI), so it belongs after the …scripts/check-i18n-coverage.mjs:42—const CLI = 'packages/cli/bin/run.js';同样只是注释,没有检查。在装完依赖但未构建的 worktree 里(
packages/cli/dist缺失)跑node scripts/check-i18n-coverage.mjs:退出码 1。
与 #5217 的关系:同类不同形
#5217 那边是「一个原因报成九个结果」;这边是一个未捕获异常 + 一段 node 栈,并且那句话把读者的注意力指向
examples/app-crm/objectstack.config.ts—— 一个完全无辜的示例配置。真实成因同样只有一个:跑的是构建产物packages/cli/bin/run.js(oclif 从dist/commands解析命令),CLI 没 build 时os lint什么也没输出。家族里已有的三条:#5217(
check-i18n-bundles,devx,本人 PR 在飞)、#5795(根dev入口)、#5794(datasource fail-fast 不认识该成因)。本条是第四个站点,不落在前三条任何一条的完成范围内(#5217 的文件面被派发词明确限定为check-i18n-bundles.mjs一个文件),故独立立单,不作子单,也不构成Blocked-by。建议方向(实现者自选)
与 #5217 落地的形状同构即可:进入 per-config 循环之前一次前置判定 + 失败时一句修法(
pnpm exec turbo run build --filter=@objectstack/cli),而不是让第一个 config 抛异常。#5217 的 PR 里那个判定是纯函数 +--self-test语料的形式(oclifCommandFileFor从 CLI 自己的oclif.commands.target推导产物路径 +looksLikeMissingCliCommand认 oclif 的换行签名),可以直接照抄同一形状;注意 oclif 会把那句command … not found硬换行成两三行,逐行正则匹配不到。影响面
纯内部工具链 DX。CI 永远命中不到(构建步骤在这两个门禁之前,见
lint.yml的Build workspace packages),今天没有人因此拿到错误结果;坏的只是本地/worktree 复现 i18n CI 时的首个诊断步骤。故按观察类归档,交由 PM 定级。