feat(devx): 根 dev 入口新增构建完整性前置 check:dev-prereqs —— 一个前置条件一句修法 (#5795) - #5863
Merged
Conversation
`dev` / `dev:*` 此前唯一的前置是 `check:console-sha`,工作区未构建时直接 放行进 boot。#5726 记下了那个现场:一个未满足的前置条件被呈现成十几个互不 相关的问题,而唯一可执行的建议指向错误的修法(改 datasource 配置 / 设 OS_ALLOW_DRIVER_CONNECT_FAILURE=1),一次 30 秒的构建被包装成一场追查。 判据取「声明即强制」:凡工作区包的解析入口(`exports["."]`,否则 `main`) 落在 `dist/` 下,该文件就必须在盘上 —— 按自己的声明未构建的包,修法恰好 就是 `pnpm build`。成员名单读 pnpm-workspace.yaml 而非硬编码路径: `packages/drivers/*` 的内容跨分支不同,手写驱动路径会正好漏掉 #5726 真正 出事的那个包。67 个包受判,全部有 build 脚本(即 turbo 会构建),因此那句 修法对每个能被点名的包都成立。 结构性排除而非按名排除:`packages/console`(dist 由 build-console.sh 构建、 `turbo run build` 不管,故 `pnpm build` 不是它的修法)、`@objectstack/docs` (被 `pnpm build` 过滤掉)、examples(入口是 .ts 源文件)都不声明 dist 下的 入口,天然不受判。只探 JS 入口不探 .d.ts,`OS_SKIP_DTS=1` 的快构建仍绿。 陈旧(非缺失)明确不在判据内:比对 src/ 与 dist/ 的 mtime 会在每次 `git worktree add` 后误报 —— 那半边是 AGENTS.md §9 的常备处方。 排在 `check:console-sha` 之前:未构建的 worktree 里后者会打出 「Build it with: pnpm objectui:build」,对本成因是竞争性的错误修法。先跑本 门禁,开发者读到一个前置条件、一句修法就停下。`dev` 链直接用 node 调用 (约 0.05s),不走 `pnpm check:dev-prereqs`(pnpm 每跳约 0.7s);后者保留 仓内 `--self-test &&` 惯例形态供人工与将来非 dev 调用。 `--self-test` 七例把两个方向都钉死(#4690:只见过绿的门禁与什么都不匹配的 门禁无法区分),并钉死上述三类排除、嵌套成员 glob 展开,以及无法展开的 成员 pattern 必须响亮失败而不是静默少覆盖。 CI 零变化:未接入任何 workflow;`.github/` 无一处引用 `pnpm dev` / `dev:*` / `check:dev-prereqs`,showcase 冒烟走 `working-directory: examples/app-showcase`, 且 CI 一律先构建,该条件在 CI 不可能成立。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
Author
|
范围外发现,已另立不派单(观察类, 净效果仍是正的 —— 缺失是远更常见的形态 —— 但这个副作用是本 PR 新增的,所以留了档而不是埋在文件头注释里。#5864 里记了三条可能方向(构建时打戳照抄 Generated by Claude Code |
原措辞写「It fails at 'datasource: connect failed'」,像是任何缺失都会这样。 不成立:门禁在任一 dist 入口缺失时就会红,而只缺 `packages/lint/dist` 时 boot 可能根本不碰 datasource。把一个只在部分场景成立的症状许诺成普遍规律, 正是本 PR 要治的那种误导的缩小版。 改为归因而非许诺:「Where that led once it was chased (#5726)」。判定、点名与 那一句修法都不变;`--self-test` 里「红输出中恰好只有一条命令」的断言仍然绿。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
Contributor
Author
|
补一条证据(正文验证表里只举了 另外两条顺手落实的核对:
Generated by Claude Code |
判据只管产物存在性,绿灯却写成 `✓ Workspace is built`。对**陈旧** dist 的场景 这是反向保证:开发者刚被告知工作区是好的,紧随其后的假漂移就更像真 bug —— 正是 #5726 警告过的「在正确的代码上改出真的 bug」,只是多了一句绿灯替它作证。 改为 `✓ N package build artifacts present (existence, not freshness)`,只说 verify 过的事。陈旧那半边已另立观察类单 #5864(含三条方向),文件头的非目标 一节现在指向它,而不是把这个缺口留成隐含知识。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
os-zhuang
marked this pull request as ready for review
August 6, 2026 10:00
os-zhuang
enabled auto-merge
August 6, 2026 10:00
This was referenced Aug 6, 2026
This was referenced Aug 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5795
dev/dev:*此前唯一的前置是check:console-sha,工作区未构建时直接放行进 boot。本 PR 加一道廉价前置:一个前置条件、一句修法,与 #5217 在check-i18n-bundles侧的形态同构。前置核对(Prime Directive #6)
实现前先按
origin/main核对,前提成立且未过期:pnpm check:console-sha && pnpm --filter …,无任何一步确认工作区已构建。packages/drivers/*在 main 上是对的。我一度以为驱动已迁到packages/plugins/,那是因为探测跑在了共享主检出上(它停在另一分支)。在本 worktree 里packages/drivers/*既是pnpm-workspace.yaml的成员 glob,也是 driver-sql 的真实落点 —— 这个乌龙直接决定了下面的判据实现。判据:声明即强制
凡工作区包的解析入口(
exports["."],否则main)落在dist/下,该文件就必须在盘上。按自己的声明未构建的包,修法恰好就是pnpm build。成员名单读
pnpm-workspace.yaml,不硬编码路径 —— 这是承重的,不是整洁:packages/drivers/*的内容跨分支不同,手写驱动路径会正好漏掉 #5726 真正出事的那个包。本轮 67 个包受判,并已逐个交叉核对全部有build脚本(即turbo run build会构建),所以那句修法对每个能被点名的包都成立。结构性排除,而非按名排除(三类都不声明
dist/下的入口,天然不受判):packages/consolebuild-console.sh构建,turbo run build不管 ——pnpm build不是它的修法,点名它就是又一句错误建议@objectstack/docspnpm build的--filter=!@objectstack/docs过滤掉.ts源文件,不是构建产物明确的非目标:只探存在性,不探陈旧。比对
src/与dist/的 mtime 会在每次git worktree add后对所有人误报(检出会重写源文件 mtime),那是门禁被无视的经典死法;陈旧那半边是 AGENTS.md §9 的常备处方。也只探 JS 入口、不探.d.ts,所以OS_SKIP_DTS=1的快构建仍绿(dev boot 要的是 JS)。为什么排在
check:console-sha之前未构建的 worktree 里,
check:console-sha会退出 0 并打出ℹ No console dist … Build it with: pnpm objectui:build—— 对它自己的主题正确,对本成因是竞争性的错误修法。先跑本门禁,开发者读到一个前置条件、一句修法就停下。实测pnpm dev:crm在未构建 worktree 里出现objectui:build的次数为 0。接线
dev链直接node scripts/check-dev-prereqs.mjs(实测 0.05s),不走pnpm check:dev-prereqs:pnpm 每跳约 0.7s(同链上既有的pnpm check:console-sha实测 0.722s,其中自身工作约 0.04s),而本门禁的全部价值就是廉价。pnpm check:dev-prereqs保留仓内--self-test &&惯例形态,供人工与将来非 dev 调用。既有的check:console-sha那一跳不动,不是本次的事。四个入口全部接上(
dev/dev:showcase/dev:crm/dev:todo):check:console-sha当年就是同时硬门禁这几个入口的,只补一个等于半道门。验证
67 of 67,修法给出pnpm install && pnpm build(缺依赖时pnpm build根本跑不起来)pnpm install && pnpm build后67 package build artifacts present,0.05spnpm dev未构建objectui:build未出现pnpm dev已构建check:console-sha→ 真实 boot 到✓ Server is ready(自用随机端口 41797,已按 PID 收干净)packages/drivers/driver-sql/dist(#5726 原始触发点)1 of 67,逐名点出@objectstack/driver-sql,修法pnpm build—— 门禁抓的是精确的偏构建形态,不只是空 worktree--self-test七例eslint/check:nul-bytes反向验证:方向与预设相反,如实报告
预先写下的预期是「把门禁绕开、驱动 dist 挪走,应当重现 #5726 的现场」。实跑结果只对了一半,措辞按实测改了:
✗ datasource 'default': connect failed — Cannot find module '…/@objectstack/driver-sql/dist/index.mjs',后面跟着Fix the datasource configuration, or set OS_ALLOW_DRIVER_CONNECT_FAILURE=1 to boot anyway—— 对「dist 没构建」这个成因两条都是错的。所以脚本的红色输出不再声称会刷 MODULE_NOT_FOUND(那会变成本门禁自己要防的那种误导),改为如实描述今天的残留;12 段那段历史移进文件头注释并标注已由 #5789 消除。datasource 消息本身的修正是 #5726 拆出的 services 车道单,本门禁只是让
dev在抵达它之前就停下。CI 零变化
.github/下对pnpm dev/dev:showcase/dev:crm/dev:todo/check:dev-prereqs的引用数为 0(合并 main 后复查仍为 0)。dev:它走pnpm turbo run build --filter=@objectstack/example-showcase^...加working-directory: examples/app-showcase。changeset
非发布面(
scripts/+ 根package.json脚本链,无包版本变化),走skip-changeset标签路线,不出 changeset 文件。同族同构(#5217)
失败措辞与修法提示按「1 个前置条件 + 修法」对齐:单行
✗判定 + 受影响项(截断到 3 条 +… and N more)+ 唯一一条Fix:命令。本条落地时 #5217 的 worktree 尚未动工,故未能逐字对齐它的实现;本 PR 的形状写在文件头,--self-test里有一条断言把「红输出里恰好只有一条命令」钉死,两侧谁后落地都可据此对齐。⛔ 未改对方文件。🤖 Generated with Claude Code
https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
Generated by Claude Code