Skip to content

docs(packages): 退役 36 个包 README 里已死的 release-metadata §Compatibility 生成块 - #3688

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3645-retire-compat-block
Aug 7, 2026
Merged

docs(packages): 退役 36 个包 README 里已死的 release-metadata §Compatibility 生成块#3688
yinlianghui merged 1 commit into
mainfrom
claude/issue-3645-retire-compat-block

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#3645

背景:生成器已死,块被冻结在 v3.3.0

标记行 release-metadata:v3.3.0(HTML 注释形式)曾由发布期生成器写入,该生成器已不存在。PM 两仓实测我已独立复现:

$ git grep -l "release-metadata" # objectui
→ 仅命中 35 个 packages/*/README.md 自身;scripts/、.github/、其余全仓零引用
$ (objectstack 仓) → 全仓零命中

没有任何工具会再生成或覆盖这个块 —— 所以 issue 正文「手改会被下次发版覆盖」的顾虑不成立,而块里的每一行都从 v3.3.0 起被冻结,仓库却一路走到了 17.x。

一条正交证据:packages/app-shell/README.md 的标记行孤悬在第 616 行,与它本该界定的 §Compatibility(第 774 行)相隔 158 行,中间被插进了 ## Command palette 等新章节。活的生成器会重新锚定或整块覆盖,不会容忍这种漂移。

形态实测:PM 预设的「标记行 + 标题 + 5 行 bullet」有四处不成立

#差异实测处置
1packages/cli/README.md 有完整 §Compatibility 块但无标记行,且冒号在粗体外(- **Node.js** ≥ 18)、Tailwind 行无 (for packages with UI) 后缀同一缺陷的另一种拼写纳入,文件面 35 → 36(见下「裁决二」)
229/36 个块是 6 行 bullet,多一行 - **React:** 18.x or 19.x;仅 cli / core / create-plugin / data-objectstack / runner / types / vscode-extension 这 7 个是 5 行六行,不是五行一并删(见下「裁决一」)
3packages/types/README.md 的 spec 行是 ^15.1.1,不是^3.3.0「35 个逐字相同」不成立:该行被手改过一次,且仍然陈旧同样删(处置是删版本宣称,与它宣称哪个版本无关)
4packages/app-shell/README.md 标记行与块相隔 158 行标记与块已解耦两处独立删除

另有 2 个包(plugin-treereact-runtime)本就没有这个块,未触碰

engines 实测(enforce-or-remove 的输入)

39 个 packages/*/package.json 中声明 engines 的:1 个
vscode-extension → {"vscode":"^1.85.0"} ← VS Code 引擎,与 Node 无关
即:39 个包全部没有 engines.node
根 package.json → engines: {"node":">=22","pnpm":">=9"} ← 全仓唯一可执行的 Node 下限
apps/* 、examples/* → 全部无 engines

这正是 issue 派发时预留的「测量给出别的形态(如根 package.json 有 engines)」分支:真相存在,但在而非包,且由 pnpm 在安装期强制。

六行逐行处置依据 —— 全部失真,不止 issue 指出的两行

README 宣称仓库真相强制点判定
@objectstack/spec ^3.3.027 个包锁 ^17.0.0-rc.5,包锁 ^3.3.0package.json dependencies差一个大版本区间 → 删
@objectstack/client ^3.3.0全仓只有 1 个包(data-objectstack)依赖它package.json dependencies36 个印这行的 README 里 35 个是幽灵行 → 删
Node.js ≥ 18engines.node">=22"根 package.json,pnpm 安装期强制直接矛盾,已漂移过一次 → 删
TypeScript ≥ 5.0 (strict mode)全仓 39 处 typescript 声明均为 ^6.0.3差一个大版本,且无处可核实 → 删
Tailwind CSS ≥ 3.4实为 ^4.3.3(6 处)/ ^4.2.1(1 处)差一个大版本;(for packages with UI) 的括号本身就承认它不逐包为真 → 删
React 18.x or 19.x28 个 UI 包 peer 为 ^18.0.0 || ^19.0.0,但 plugin-report 只有 ^18.0.0package.json peerDependencies,包管理器安装期强制手抄 peerDependencies 且已漂移 → 删(见「裁决一」)

一律不改写为 rc.5 / >=22 / ^6 / ^4。 按仓规「版本号入散文即漂移保证 —— 删」:重写等于把同一台漂移机器重新上膛,下个 major 又错一遍。真相已在 package.json(engines / peerDependencies / dependencies)里,由包管理器在安装期强制,读者违反会拿到硬错误而不是一份陈旧文档。

六行全删 → §Compatibility 整节空掉 → 连标题一起删,不留空节。

两处越出字面裁决的取舍,已由 PM 裁 A

  • 裁决一(React 行):该行落在被裁决的生成块区域内、属同一缺陷类(手抄 peerDependencies 的版本号入散文),且 plugin-report 已证明它不是例外。保留它会让 29 个文件留下只剩一条 bullet 的 §Compatibility 节 —— 此时标题反而更误导(读作「这就是全部兼容性约束」却已不含 Node/TS)。PM 裁 A:一并删
  • 裁决二(文件面 35 → 36):issue 的「35」是按标记行计数,按缺陷计数是 36。PM 给出的验收判据「grep -rn 'release-metadata|\^3\.3\.0' packages/*/README.md 零命中」只有覆盖 cli 才可能满足。PM 裁 A:判据优先于估数

改动形状:纯删除,算术对得上

36 files changed, 387 deletions(-), 0 insertions(+)

逐类核对:

29 个 6-bullet 带标记 × 11 行 = 319
6 个 5-bullet 带标记 × 10 行 = 60
1 个 cli 5-bullet 无标记 = 8
合计 = 387 ✅ 与 diffstat 一致

(每块 = 标记 2 行【标记行 + 空行】 + 标题 2 行【标题 + 空行】 + N 行 bullet + 1 行尾随空行。)

被删行去重后只有六种:标记行、## Compatibility 标题、空行、以及五类兼容 bullet —— 无任何其他内容。§Links 等其他节(#3649 刚修过)、任何 package.json 均未触碰;暂存区 36 个文件全部匹配 ^packages/[^/]*/README\.md$,越界文件数 0。

门禁

门禁修前修后
node scripts/check-doc-links.mjsLinks are valid across 7 scan roots. exit=0Links are valid across 7 scan roots. exit=0
node scripts/check-control-bytes.mjsOK (scanned 3674 tracked text file(s); skipped 85 binary) exit=0
对 36 个改动文件自扫 [\x00-\x08\x0b\x0c\x0e-\x1f]命中 0 行

doc-links 前后同绿是预期方向,不是空绿:scripts/check-doc-links.mjs:395{ path: 'packages/*/README.md', rule: 'disk' } 是第 7 个扫描根,门禁确实读到了这 36 个文件;本改动删除的行不含任何 markdown 链接语法,链接面按构造不变。据实记录为同绿,不套「前红后绿」的模板。

验收判据计数:

修前:release-metadata 命中 35 文件 / ^3.3.0 命中 36 文件 / §Compatibility 36 节 / 合并 grep 106 行
修后:0 / 0 / 0 / 0 ✅ 判据满足

changeset:不加(写明判断)

README.md 确在 files 内、属发布物内容,但:

  1. 仓内先例一致不加 —— 实测三个最近的包 README 类 PR,合并提交的 .changeset/ 文件数均为 0:docs(runner): 把 README 两处开放集合的插件措辞按实测闭合 (#3632) #3644(runner README 措辞)、fix(plugin-tree): 补上 package.json files 已声明、但仓库里不存在的 LICENSE (#3647) #3662(plugin-tree LICENSE)、feat(scripts): check-doc-links 扫描面第四扩 packages/*/README.md,并付清入场价的 11 条死链 (#3622) #3649(7 个包 README + 新门禁)。
  2. AGENTS.md 的门槛是「功能改进需 changeset,纯修复不需要」;本单是删除失真文档,无 API/行为变更
  3. fixed 组 39 包联动,一次文档删除会把全组推版。

附带提示:本 PR 全部是 *.md,ci.yml / lint.ymlpaths-ignore**/*.md,预期这两个 workflow 显示 skipping —— 按 AGENTS.md 那是跳过、不是失败。

未在本 PR 修的越界发现(已另立单)

  • 站点文档侧同源失真宣称(content/docs/utilities/cli.mdx:283)
  • plugin-report 的 peerDependencies.react 与其余 28 个 UI 包不一致
  • release-metadata 生成器已死的观察记录

Generated by Claude Code

… from 36 package READMEs
The `release-metadata:v3.3.0` marker block was emitted once by a release-time
generator that no longer exists: a repo-wide search finds the marker only inside
the 35 READMEs that carry it — zero references from scripts/, .github/ or
anywhere else in objectui, and zero across the objectstack repo. Nothing
regenerates it, so every row has been frozen since v3.3.0 while the repo moved on.
Measured against origin/main, all five rows are now false, not just the two the
issue named:
- `@objectstack/spec` ^3.3.0 -> 27 packages pin ^17.0.0-rc.5 (none pin ^3.3.0)
- `@objectstack/client` ^3.3.0 -> only 1 package (data-objectstack) depends on it
at all, so the row is a phantom in 35 of the 36 READMEs that print it
- Node.js >= 18 -> the only enforceable floor is root engines.node ">=22"
- TypeScript >= 5.0 -> typescript is ^6.0.3 in all 39 declarations
- Tailwind CSS >= 3.4 -> tailwindcss is ^4.3.3 / ^4.2.1
- React 18.x or 19.x -> duplicates peerDependencies, and has already drifted:
plugin-report's peer range is ^18.0.0 only
Per the repo rule that a version number in prose is a guarantee of drift, the
rows are deleted rather than refreshed: rewriting them to rc.5 / >=22 / ^6 / ^4
re-arms the same drift the next time any of them moves. The truth already lives
in package.json (engines, peerDependencies, dependencies) where the package
manager enforces it at install time. Every row goes, so the section empties and
the heading goes with it rather than leaving an empty §Compatibility.
Pure deletion: 387 lines removed, 0 added, confined to the generated block.
Fixes#3645
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@vercel

vercelBot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 7, 2026 9:31pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-eEqlis5G.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.66KB3.13KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)480.72KB105.64KB
core (index.js)2.96KB1.13KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)137.51KB35.11KB
fields (index.js)230.87KB56.83KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)26.14KB6.07KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.09KB42.72KB
plugin-dashboard (index.js)115.50KB29.96KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)232.79KB57.42KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)112.10KB27.10KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)186.61KB49.34KB
plugin-kanban (index.js)48.30KB13.28KB
plugin-list (index.js)105.12KB25.48KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)19.28KB6.38KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…d READMEs carry (objectstack-ai#3664) (objectstack-ai#3695)
`packages/plugin-tree/README.md` was the only one of the 38 published packages
that had a README but no `## License` section. Census over origin/main:
- 38 published (non-private) packages
- 37 have a README (`sdui-parser` has none — out of scope, see objectstack-ai#3647)
- 36 of those 37 carry `## License`; plugin-tree was the sole omission
The section is copied verbatim from the dominant form, 32 of the 36:
## License
MIT — see [LICENSE](./LICENSE).
The four minority spellings are `MIT` (types, react-runtime) and
`MIT © ObjectStack Inc.` (plugin-timeline, plugin-chatbot). The issue suggested
plugin-timeline as the exemplar, but that form is 1-of-36 and carries no
`./LICENSE` link at all — the majority form is both the convention and the one
that gives the link gate something to check. Position matches too: final
section, as in 34 of the 36 (plugin-view and types continue past it).
This also closes the gap objectstack-ai#3664 identified: `check-doc-links.mjs` scan root 7
(`packages/*/README.md`, `disk` rule) resolves relative hrefs as repository
paths, so the new `./LICENSE` link is now mechanically checked against the file
PR objectstack-ai#3662 landed. Previously the README linked nothing, which is exactly why the
objectstack-ai#3622/objectstack-ai#3649 dead-link sweep could not detect the missing LICENSE — no link, no
dead link.
Verified the new link is load-bearing rather than vacuously green: temporarily
removing `packages/plugin-tree/LICENSE` turns the gate red with
`packages/plugin-tree/README.md:50 -> ./LICENSE` (exit 1); restoring it returns
`Links are valid across 7 scan roots` (exit 0).
No changeset: documentation-only, matching the precedent of PR objectstack-ai#3662 (which
added this same package's LICENSE, likewise shipped in the tarball) and PR objectstack-ai#3688
(36 package READMEs), neither of which carried one.
Fixesobjectstack-ai#3664
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…mpatibility row (objectstack-ai#3698)
The "Package information" table on the CLI docs page carried two claims that
no longer match the tree:
- `Node | >= 18` contradicted the only Node floor the repo states (root
package.json `engines.node`); no package under packages/* declares
`engines.node` at all.
- `Compatibility | @objectstack/spec ^3.3.0` was doubly wrong: no package in
the repo pins ^3.3.0 (all 29 declarations resolve to one current range in
the lockfile), and packages/cli declares no @objectstack/spec dependency in
dependencies/devDependencies/peerDependencies, with zero @objectstack/*
imports in its source.
Per the same repo rule applied in objectstack-ai#3645 / PR objectstack-ai#3688, version numbers are not
rewritten into prose -- that re-arms the same drift machine for the next
major. The Node row now points at the file that states the requirement; the
spec row is removed as a ghost row, matching how PR objectstack-ai#3688 handled the
@objectstack/client rows on packages that did not depend on it.
The Name / Bin / License rows were re-verified against packages/cli/package.json
and are correct, so the table stays.
Fixesobjectstack-ai#3689
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…tack-ai#3726)
Fixesobjectstack-ai#3708Fixesobjectstack-ai#3709Fixesobjectstack-ai#3710
按失真的三种性质分别处置,不套统一口径:
- 无锚宣称(objectstack-ai#3708 三处)—— 照 objectstack-ai#3645 / PR objectstack-ai#3688 仓规删版本号指真相:
architecture-overview 的三层架构 ASCII 图与散文不再写 spec 的版本区间
(改指各包 package.json 的 dependencies),architecture.md 不再写
TypeScript 的大版本下限。一律不改写成 rc.5 / ^6 —— 重写等于把同一台
漂移机器重新上膛。
- 脚手架记录(objectstack-ai#3709)—— create-plugin.mdx 逐字复制的那份 package.json
三处版本错、字段也错(把 workspace 链接的 dependencies 记成 ^0.3.0 的
peer),读者照做会装出一个装不上的包。改为描述真实生成形态并指向生成器
模板本身,不再逐字复制版本区间。
- 有锚重述(objectstack-ai#3710)—— 与自家清单对齐而不是删除:layout 的三条 peer 行
收窄成清单逐字一致的形态(原 >= 拼写过度承诺,读者照装会拿到 peer 冲突),
plugin-chatbot 的 @ai-sdk/react 主版本对齐清单。
ledger 相应收缩 27 → 21 条,stale 9 → 1(仅剩 plugin-report 那条,
其修法在清单侧,归 objectstack-ai#3690)。棘轮两步实测:清前红并逐条点名 8 条陈旧条目
与 2 条未记录的新宣称,清后 6/6 绿。
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@yinlianghui@claude