bos upgrade re-clobbers child-restored root package.json scripts — default test script also silently exits 1 on repos without plugins/

未关闭
#660 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
github, typescript

调研方向

Start by tracing the bos upgrade reconciliation source that writes the root package.json scripts, then compare its test and typecheck loops and the v2.0.0-rc.27 template. Reproduce with a child repo that has no plugins/ directory and custom packages/* scripts. Done means upgrades preserve or clearly report child edits, and the default test script succeeds without plugins while retaining package coverage.

由索引模型根据 Issue 内容生成。

描述

bos upgrade resets child-restored root package.json scripts — and its reconcile source's default test script silently exits 1 on repos without plugins/

Child evidence (activity.nearbuilders.org, v2.0.0-rc.27)

Two separate defects, both observed on the managed v1→v2 upgrade branch (#82, merged as NEARBuilders/activity.nearbuilders.org#82 / #89):

1. Upgrade reconcile overwrites child customizations in root scripts

C1 restored packages/* coverage in the root scripts (the child publishes @nearbuilders/activity-client from packages/client):

test:      … pnpm --dir ui … run test && for dir in packages/*; do if [ -f "$dir/package.json" ]; then pnpm --dir "$dir" --if-present run test || exit 1; fi; done
typecheck: … pnpm --dir ui … && pnpm --dir api … && for dir in packages/*; do if [ -f "$dir/package.json" ]; then pnpm --dir "$dir" --if-present run typecheck || exit 1; fi; done

A later bos upgrade (rc.24 → rc.27, commit ac3ff53) reset both scripts to the framework reconcile versions:

test:      … && for d in plugins/*; do [ -f "$d/package.json" ] && pnpm --dir "$d" --if-present run test; done
typecheck: … if [ -d plugins ]; then for dir in plugins/*; do …; fi; fi
  • packages/* coverage was silently dropped from both the test and typecheck gates.
  • The test reset made CI go red: the repo has no plugins/ directory, the glob stays literal, [ -f "plugins/*/package.json" ] returns false → the unguarded && chain is the last command → the script exits 1 with zero output (the Test job failed 56 ms after the UI suite passed, no failing test to find).

.bos/sync-backup/2026-10-29T04-17-…/package.json did capture the pre-upgrade copy (good), but nothing surfaced that the child's customizations were being reset — the red CI was how we found out. The child re-restored the scripts in NEARBuilders/activity.nearbuilders.org#89's parent commit (909c2b2) and this has now happened twice in the same migration (restored, re-clobbered, re-restored).

2. The reconcile source's default test script fails for plugin-less children

The reset version differs from the upstream template (v2.0.0-rc.27 template root test is pnpm run test:ui && test:api && test:e2e && test:framework), so the plugins/* loop comes from the upgrade's reconcile source — and it has a robustness bug the typecheck sibling doesn't share: typecheck guards with if [ -d plugins ], the test loop is unguarded. Any child without plugins/ would get a silently red test script from the framework's own machinery.

Expected behavior

  • bos upgrade reconciliation should patch rather than reset child-modified sections of files it reconciles (or, minimally, report exactly which child customizations were dropped, not just create a .bos/sync-backup copy). Related but distinct: #650 (v1→v1 one-shot drops) and #659 (stale overrides shadowing the catalog — that one's the same upgrade run pointing the #546 skew gate at the wrong fix).
  • The framework's default root test script should be exit-0-safe for repos without plugins/ (same guard as typecheck), and ideally include a packages/* loop (or generate one from workspace globs) so published children keep their test/typecheck coverage after upgrades.

Repro

  1. Child repo: everything-dev v2 app, restore packages/* loops in root test/typecheck (or any repo with no plugins/ dir).
  2. Run bos upgrade to a newer rc.
  3. Root scripts are reset to the plugins/* variants; pnpm run test now exits 1 silently after the ui suite finishes (see NEARBuilders/activity.nearbuilders.org CI run 40817136914, CI / Test: api 155 ✓, ui 109 ✓, then ELIFECYCLE Test failed).

Child fix commits for reference: 909c2b2 (re-restore) and 96c3be5/44b40a5 (#89, overrides realignment also surfaced by the same upgrade run).

主要语言
TypeScript
星标
5
派生
3
平均合并
9 小时 16 分钟
30 天内合并 PR
160

环境准备

  • 提供 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

NEARBuilders/everything-dev 的其他 Issue

查看 NEARBuilders/everything-dev 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。