Repository navigation
tooling(objectui-readiness 2): scripts, tests and e2e specs that read pnpm-workspace.yaml, turbo.json, pnpm-lock.yaml or root overrides at the objectui root resolve the workspace root upward (parent #25677, 2b/6) #25723
Description
Filing gate ④: sub-issue 2b/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. ⛔ Not a claim. Follow-up of #25685 (objectui#13472), measured on the first CI run of the DO NOT MERGE verification PR #25710 → #25718 (run 40144323591, head b2ba3a4).
Why a second readiness card. #25685 rooted "where is the objectui tree" on scripts/ui-root.mjs and removed the .git / pnpm-workspace.yaml marker walks. The import also deletes or moves four files at that root, and the readers of those files were not in #25685's scope: pnpm-workspace.yaml (deleted — a nested workspace root is ignored), turbo.json (parked — a nested turbo.json must extends the root), pnpm-lock.yaml (deleted — one lockfile at the git root) and the root package.json's pnpm.overrides / patchedDependencies (moved to the git-root manifest). On the merged tree those readers are the first red in Type Check UI, Build & E2E UI and Test UI, before the type-check, e2e or component tests run. Until they are fixed, the cutover PR cannot be measured and the three jobs cannot go green.
Who does it, where it lands: the epic PM dispatches it (os-dev, objectui checkout). One PR to objectstack-ai/objectui main before cutover, inert for the standalone layout (every reader keeps answering exactly what it answers today when the file is at the objectui root). The epic PM also applies the same patch as a verify-only commit on the verification branch to re-measure the three jobs.
维护者速读
#25685 已经把"objectui 树在哪"统一到 scripts/ui-root.mjs,但导入时还会删掉或挪走 objectui 根目录的四个文件:pnpm-workspace.yaml(嵌套的工作区根会被忽略)、turbo.json(嵌套 turbo.json 必须 extends 根)、pnpm-lock.yaml(全仓一个锁文件)、根 package.json 里的 pnpm.overrides / patchedDependencies(并入根清单)。读这四个文件的脚本、测试和 e2e 用例在合并树上第一个变红:验证分支首轮 CI 里 Type Check UI 在 check:side-effects-array 就停、Build & E2E UI 在第一个 e2e 文件就停、Test UI 已跑完的 6 片各挂 5–6 个文件,全是同一类原因。本卡只做一件事:这些读取器改为"objectui 根有这个文件就读它,没有就向上一层读 objectstack 根的,并按 ui/ 前缀过滤",独立仓行为不变。objectui 这边一个 PR,切换前合;不改受管面。
Measured on the merged tree (run 40144323591)
| Job | Where it stopped | Reader |
|---|---|---|
| Type Check UI | pnpm --dir ui run check:side-effects-array |
scripts/check-side-effects-array.mjs:282 reads <root>/pnpm-workspace.yaml |
| Build & E2E UI | e2e/record-header-title-width.spec.ts:65 ENOENT <git root>/packages/plugin-detail/src/DetailView.tsx |
REPO_ROOT IIFE walks up to the first pnpm-workspace.yaml = objectstack's root. Same IIFE in dashboard-metric-tile-height, sidebar-offcanvas-geometry, studio-item-header-title-width, toast-under-modal. check-ui-root-lookups is SILENT on a readFileSync of the marker, so this probe shape escaped #25685. |
| Test UI 9/16 | ENOENT ui/pnpm-workspace.yaml |
scripts/__tests__/check-side-effects-array.test.ts (5), zero-test-member-exclusion-9106.test.ts, packages/cli/src/__tests__/workspace-vite.test.ts (4), app-shell/.../CreateViewDialog.chartBinding-11576.test.tsx |
| Test UI 9/16 | ENOENT ui/turbo.json |
scripts/select-type-check-scope.mjs via its test; scripts/__tests__/turbo-lint-inputs.test.ts (shard 1) |
| Test UI 1/16 | "the stub did not serve this run — a live pnpm reached the registry" ×10 | scripts/__tests__/check-lockfile-dedupe.test.ts — check-lockfile-dedupe.mjs resolves the lockfile / runs pnpm at uiRoot(), where no lockfile exists |
| Test UI 1/16 | 3 failures | scripts/__tests__/react-peer-range-norm-3741.test.ts — overrides now live in the git-root manifest |
Other readers of the same files on main (not yet reached by CI, same fix): scripts/check-docs-route-eager-closure.mjs:204, scripts/select-affected-tests.mjs:186, scripts/release-github-releases.mjs, scripts/check-lockfile-integrity.mjs, scripts/check-installed-spec-pin-claims.mjs, scripts/dependabot-merge-gate.mjs, scripts/check-new-cross-file-line-citations.mjs / cross-file-line-citation-census.mjs, scripts/dollar-dialect-alias-census.mjs. packages/cli/src/utils/workspace-vite.ts and app-generator.ts ask about the USER's cwd (product behaviour, allowlisted in check-ui-root-lookups) and are out of scope; only their tests, which read this repo's manifest, are in.
Scope
- One helper, Node builtins only (it must be importable before
pnpm install, likeui-root.mjs):scripts/workspace-root.mjs(name is the dev's) answering (a)workspaceRoot()—uiRoot()when<uiRoot>/pnpm-workspace.yamlexists, elsepath.resolve(uiRoot(), '..')when THAT holds one, else throw; (b)workspaceGlobs()— thepackages:globs of that file, and when the root is the parent, only the globs underui/with the prefix stripped (the bareuientry is the objectui root itself and is dropped); (c)lockfilePath(),rootManifest()(the manifest whosepnpmblock holds overrides / patchedDependencies) on the same rule. Each reader above imports the helper instead of joininguiRoot()(or a walk) with the file name. The three existing ad-hocpackages:parsers (check-side-effects-array,select-affected-tests,check-docs-route-eager-closure) become one parser with their union of refusals kept. turbo.jsonreaders (select-type-check-scope.mjs,turbo-lint-inputs.test.ts): read the nearestturbo.jsonupward (uiRoot()then the parent) and tolerate the parent's$TURBO_ROOT$/ui/-re-rooted inputs (objectstack#25710 re-roots objectui's repo-root inputs that way). Where a test pins objectui's own task shapes, it reads the parked copyturbo.objectui.jsonwhenturbo.jsonis absent atuiRoot()— the dev states which.- The five e2e
REPO_ROOTIIFEs →uiRoot()(the specs read source files underpackages/, so the objectui root is the right answer). check-ui-root-lookupslearns the escaped shape: areadFileSync/existsSyncof a marker inside a loop that reassigns its directory topath.dirname(...)is a root lookup, not a data read. Self-test cases: the e2e IIFE (fires), the data read at a known root (still silent).- Tests that build fixtures of a workspace root keep working: a fixture that writes its own
pnpm-workspace.yamlis a root by rule (a) — the helper takes an optional explicit root for exactly that.
Out of scope (cutover adaptation commit, sub-issue 5, tracked on #25697): dropping the turbo-recursive scripts from ui/package.json; QUICK_REFERENCE.md's "Current Release" block stating workspace:^; the dom-test failures not attributed to a reader (ListView.fieldListRead-11984, importWriteModes-12697, ImportWizard.csvFileSource-13315) — re-measured after this card's patch is on the verification branch.
Verification (the dev's)
- Standalone:
pnpm check:ui-root-lookups(with the new case), the wholescripts/__tests__suite,pnpm --filter @object-ui/cli test,pnpm check:side-effects-array,pnpm check:docs-route-eager-closure,pnpm check:lockfile-dedupe,pnpm check:lockfile-integrity,pnpm type-check:scripts,pnpm type-check:e2e,pnpm lint:coverage. All green, no gate skipped. - Merged layout, locally: a scratch copy of the objectstack verification worktree with this branch's
ui/and the four files absent/parked as the adaptation leaves them —pnpm --dir ui run check:side-effects-arrayexits 0,pnpm --dir ui run test -- <the failing files above>green,pnpm --dir ui exec playwright test --listresolves every spec (no ENOENT before the browser starts). - The epic PM re-runs the three jobs on DO NOT MERGE — verification run for #25697: PR A + the ui/ subtree import of objectui main cd70b7818d #25718 with the patch as a verify commit and records the reds that remain on tooling(ui-wiring): objectstack-side inert wiring for the
ui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697.
Done when
- PR merged on objectui
main;git grep -n "pnpm-workspace.yaml\|pnpm-lock.yaml\|'turbo.json'" scripts packages/cli/src e2eshows only the helper, the allowlisted cwd predicates and comments. - On the verification branch: Type Check UI reaches "Run type-check over the ui packages", Build & E2E UI reaches the browser, Test UI's reader failures are gone.
Size: M — one helper, ~20 call sites, 5 e2e files, one gate case. Clause-②: no. Metadata-protocol: none.
风险
- A helper that silently picks the parent root in the standalone layout would hide a deleted file; rule (a) prefers the objectui root and throws when neither holds the file.
select-type-check-scopereading the mergedturbo.jsonsees objectstack tasks too; it must select from the ui subset only (filter onui/paths), or the scope it computes widens to the whole repo.
Dedupe
Open issues 2026-10-25 00:05Z filtered on workspace / ui-root / readiness / pnpm-workspace: #25685 (closed, scope = marker walks, not file readers) and this epic's own cards. New.
Activity
objectstack-fleet commentedon Oct 25, 2026
Claim: epic #25677 round 3 (dispatch of sub-issue 2b)
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch:
claude/project-thread-dwhq6r(objectstack-ai/objectui; recreated frommain— the previous branch of that name was deleted when objectui#13472 merged; mode:thread, no force push)Worktree:
objectui(the thread's own objectui checkout)Domain:
domain:devx(card) — the PR lands in objectui under thedomain:uilane's PR rules (changesets, draft until CI, governed-surface check)Seat:
epic:#25677File surface: objectui
scripts/*.mjsreaders ofpnpm-workspace.yaml/turbo.json/pnpm-lock.yaml/ the root manifest and theirscripts/__tests__,packages/cli/src/__tests__/{workspace-vite,app-generator}.test.ts, the fivee2e/*.spec.tsREPO_ROOTIIFEs,scripts/check-ui-root-lookups.mjs(+ one self-test case), one new helper underscripts/; no.github/**, noAGENTS.md, no product code inpackages/cli/src/utilsContainer & model: M,
mode:subagent,model: opus(default; no governed path on the surface, so no tier ceiling applies — the dev runsdispatch-gates --tier --repo objectstack-ai/objectuion its own paths before the PR),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: objectui open PRs on 2026-10-25 00:10Z: #13289 (Version Packages, maintainer's) touches only CHANGELOGs and versions; no open claim on
scripts/ore2e/. The epic PM applies the same patch as a verify-only commit on objectstack'sclaude/project-thread-dwhq6r-25697-verify(#25718) to re-measure Type Check UI / Test UI / Build & E2E UI; that branch is DO NOT MERGE and never the PR's source.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
PR opened: objectstack-ai/objectui#13484 (draft; branch
claude/project-thread-dwhq6rat dff61d5c8, 4 commits, 44 files, +981/−421). Scope items 1–5 of this card are in it; the dev's verification table is in the PR body (standalone: wholescripts/__tests__suite 195 files green,check:ui-root-lookupswith the newmarker-walkshape, cli tests, type-check:scripts/e2e, playwright list; merged layout: every reader red from run 1 is green).The same patch is on the verification branch as objectstack commit 1cade69 → #25718 run 3, which reads Type Check UI past
check:side-effects-arrayand Build & E2E UI past the first spec.Measured in the merged layout and outside this card (carried on #25697 for the adaptation commit / later sub-issues):
check-installed-spec-pin-claims,check-lockfile-integrity,ci-cd-pipeline-doctests): post-import@objectstack/*areworkspace:links, so the pin's premise is gone → retire with the pin scripts (sub-issue 4a already deletes both pin script sets).QUICK_REFERENCE.mddocumentspnpm build/type-check/lint, dropped fromui/package.jsonby the adaptation → same doc update as the "Current Release" line.vite-objectstack-spec-dist.test.ts:@objectstack/specresolves to<root>/packages/specin the merged tree; the console vite config'svendor-objectstacktest needs a^<root>/packages[\\/]arm.CreateViewDialog.chartBinding-11576.test.tsx: dom behaviour, no fs read — unattributed, re-measured on run 3.Next on this card: CI on #13484, then review request; the card closes when the PR merges.
Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT → PR objectstack-ai/objectui#13484 (head dff61d5c8).
Delivered as one draft PR (4 commits, 44 files, +981/−421): the
workspace-root.mjshelper, every root-file reader behind it, the five e2e specs onuiRoot(), themarker-walkshape incheck-ui-root-lookups. CI green (13 workflows).check-governed-merges.mjs --pr: NOT governed, 1402 lines ≤ 3000 → the dispatch seat lands it now (pr_ready+automerge_enable). Measured effect on the verification branch (objectstack#25718 run 3, patch as verify commit 1cade69): the reader class is gone from Type Check UI / Build & E2E UI (green, 7:33) / Test UI; what remains is the dependency-resolution class, filed as #25726. This card closes by the PR'sFixes; parent #25677 item 2b ticks on MERGED.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Landed. objectui#13484 (head dff61d5c8) MERGED into objectui
mainas c85408f on 2026-10-25 (merge queue, auto-merge armed by the dispatch seat after the ACCEPT above). The same patch was verified in the merged layout as verify commit 1cade69 on objectstack#25718 run 3: the pnpm-workspace.yaml / turbo.json / pnpm-lock.yaml readers and the five e2eREPO_ROOTwalks resolve the workspace root upward; Build & E2E UI green for the first time there. The second half of the class — scripts that hand git repository-root-relative paths (git show ref:packages/…,ls-tree,diff --name-only/ls-filesmatching) — is #25728 (sub-issue 2d), dispatched as its own card thread. Closing this card; the parent #25677 ticks item 2b.Generated by Claude Code
tooling(objectui-readiness 2): readers of pnpm-workspace.yaml, turbo.…