Skip to content

chore(vscode): 退役 packages/vscode-objectstack,移出工作区 (#5825) - #5834

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-5825-retire-vscode-extension
Aug 6, 2026
Merged

chore(vscode): 退役 packages/vscode-objectstack,移出工作区 (#5825)#5834
os-zhuang merged 1 commit into
mainfrom
claude/issue-5825-retire-vscode-extension

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes#5825
Closes#5028

维护者 2026-08-06 拍板退役 packages/vscode-objectstack,移出工作区。#5028 的幽灵
jsonValidation 声明随宿主一并消失,故本 PR 同时关闭它。

退役前复核(逐条对着 origin/main 验)

issue 正文的依据复核结果
无 vsce/vsix 发布链路✅ 成立 —— grep -rn vscode .github/ 零命中,package: vsce package 脚本 CI 从不调用,故 Marketplace / Open VSX 上不存在可安装副本
#5028 幽灵 jsonValidation✅ 成立 —— 指向 ./schemas/objectstack.schema.json,包内无 schemas/ 目录,files 白名单亦不含它
持续注意力税✅ 成立 —— 该包被每个全仓门禁扫描(见下方计数表)
「从未发布 / 无 npm 面」⚠️不成立,详见下节

⚠️ 两个 issue 正文未预见的硬约束

一、changesets 会重读已消费的 changeset —— 只删目录会打断整条发布链

RC 模式下 changeset version 保留每个已消费的 .md,而 assemble-release-plan
.changeset/全部 changeset 做包名解析,命中不在工作区的包即抛错。只删包之后
changeset status 直接红:

Error: Found changeset changelog-ships-in-tarball for package
objectstack-vscode which is not in the workspace

也就是说,若不处理这两个 changeset,合并后 每一次 Release 都会失败。两个文件按
性质分别处置(而非批量改写):

处置后 changeset status 退出码 0,发布计划中零 vscode 命中。

二、该包在 npm 上是真实发布面(issue 的「无 npm 面」不成立)

changeset publish 发布每个非 private 包,该包既非 private 又带
publishConfig.access: public,因此它在 npm 上有 40+ 个版本:

  • latest = 16.1.0(2026-07-22)
  • rc = 17.0.0-rc.3(2026-08-03,即拍板前三天)

issue 正文的「从未发布」只对 VS Code Marketplace / Open VSX 成立 —— 那里确实双 404,
「没人装着这个扩展」的结论不受影响。但它在 npm 上是活跃发布面,退役后将静默停更:
已发布版本不会消失(npm 不 unpublish),latest 就永久停在 16.1.0,没有任何渠道告知
consumer 它已退役。

是否补 npm deprecate objectstack-vscode 需要 npm 发布凭据,属维护者动作,已在
#5825 提出待裁决,不阻塞本 PR 合并
(本 PR 不改变任何已发布版本)。

删除面与提及清扫

删除 packages/vscode-objectstack/**(12 个文件)。pnpm-workspace.yaml
packages/* glob,无需改成员列表;lockfile 随 pnpm install 收缩 1102 行 /
125 个包(@vscode/vsce 整棵子树)。无任何 manifest 依赖该包。

清扫:README.md 包表 · AGENTS.md 目录树 · content/docs/plugins/packages.mdx
(删小节 + 计数 73→72、Client/DX 5→4) · .claude/skills/pm-dispatch/SKILL.md
domain:devx 归属 · scripts/publish-smoke-pack.mjs 的 EXCLUDE 条目及注释 ·
.changeset/config.json 的 fixed 锁步组(check-changeset-fixed.mjs 对组内不存在的
包名会红,必须同步)。

保留白名单(历史记录类,改动即污染记录):

  • RELEASE_NOTES.md —— 文件自述「This file is historical.」,那张表是 v4.0.4 时
    42 包清单的快照
  • docs/DX_ROADMAP.md —— 2026-02-13 审计快照,自述基线「14 packages」,早已与今天无关
  • .changeset/pm-dispatch-domain-table-full-coverage.md —— 已发布的 changeset 历史
  • .changeset/pre.jsoninitialVersions —— changesets 自管状态文件;
    assemble-release-plan 只对工作区内的包写入/读取该表,残留键永不被查。手改工具状态
    文件是 RC 窗口出事的典型原因,故不碰
  • content/docs/releases/ 全程未动

安全 overrides:保留选择器,只更正注释

form-dataundici 两条 OSV pin 的唯一传递来源是 @vscode/vsce。删除后
form-data 从依赖树彻底消失;undici 仅剩 @ai-sdk/provider-utils 的 7.29.0 与
jsdom 的 8.9.0,两者都在 undici@>=7.23.0 <7.29.0 选择器之外。两条 pin 现在都不再
匹配任何东西。

选择器保留不动:在退役 PR 里顺手摘掉安全 pin 是降低安全姿态,应当是独立决定;留着则
未来若有传递依赖重新引入,仍会落在已修补版本上。但注释不能继续指向一个已不存在的包,
故就地记录 CONSUMER GONE (#5825) 与保留理由。brace-expansion 注释的 minimatch
消费者清单同理去掉 @vscode/vsce(ts-morph / eslint / @typescript-eslint / glob /
archiver 仍在,该 pin 依旧生效)。

门禁计数对账(删除前 / 后各跑一轮全套)

门禁beforeafter差值
check:published-files70 publishable / 78 members69 / 77−1 / −1
check:type-check-coverage63/78 covered62/77−1 / −1
check-changeset-fixed70 public packages69−1
check:nul-bytes5687 tracked text files5674−13
check:engine-double-contract37 pinned / 165 DEBT / 2 exempt0(该包无台账条目)
check-override-consistency2 covered declarations20

check:nul-bytes 的 −13 与本 PR 删除的文件数精确相等(12 个包内文件 + 1 个待发布
changeset)。所有计数都由 glob 实时计算并打印,仓内没有把成员数写死为断言的门禁,
因此无断言需要改。

验证

  • 全套 check:* + lint + check-changeset-fixed + check-override-consistency
    删除前后各跑一轮,pass/fail 状态零变化。删除前基线即有 3 个红:
    check:i18n / check:i18n-coverage(新 worktree 未 build,os lint 无输出 —— 与
    本 PR 无关)、check:objectui-pin-fresh(objectui pin 过期,发布节奏门禁)。三者与
    本改动无关,删除后表现完全一致。
  • turbo run build --filter=!@objectstack/docs71/71 successful(确认无包引用它)
  • turbo run typecheck124/124 successful
  • changeset status → 退出码 0,零 vscode 命中
  • node scripts/check-nul-bytes.mjs → OK;另对全部改动文件做了越过门禁盲区的自扫
    (grep -naP 覆盖 0x00-0x1f),干净

changeset 路线:skip-changeset 标签

存活包零行为改动,而已删除的包无法在 changeset 里点名(changesets 对未知包名直接
抛错),故本 PR 不 release 任何东西。依据 pr-automation.yml 的门禁文案 —— #5292
明确修正过处置顺序:标签是首选,空 frontmatter changeset 是 last resort,因为它是
changesets/action 的真实输入,全空集会让 Release 静默绿着空跑(#4898,曾卡住
17.0.0-rc.2)。故不采用 #4607 式空 frontmatter。

恢复路径

git 历史完整保留(packages/vscode-objectstack 至本 PR 父提交为止)。若未来出现非 AI
用户的真实需求,按当时的 spec schema 重建。


Generated by Claude Code

维护者 2026-08-06 拍板退役:该扩展没有 vsce/vsix 发布链路(`.github/workflows/`
零命中),因此 VS Code Marketplace / Open VSX 上不存在可安装副本;#5028 的幽灵
`jsonValidation` 指向从未存在的 `./schemas/objectstack.schema.json`(本次删除前
复核:包内无 `schemas/` 目录,`files` 白名单也不含它),整个生命周期静默失效且零
用户报告;产品主航道是 AI agent + `os` CLI。git 历史保底,未来若有真实需求按当时
schema 重建。
删除面:`packages/vscode-objectstack/**`(12 个文件)。`pnpm-workspace.yaml` 用
`packages/*` glob,无需改成员列表;lockfile 随 `pnpm install` 收缩 1102 行、
125 个包(`@vscode/vsce` 整棵子树)。
## 两个 issue 正文未预见的硬约束
**一、changesets 会重读已消费的 changeset,只删目录会打断整条发布链。** RC 模式下
`changeset version` 保留每个已消费的 .md,而 `assemble-release-plan` 对目录里
**全部** changeset 做包名解析,命中不在工作区的包即抛错。只删包之后
`changeset status` 直接红:
Error: Found changeset changelog-ships-in-tarball for package
objectstack-vscode which is not in the workspace
两个 changeset 的 frontmatter 点名该包,逐个按性质处置:
- `.changeset/vscode-snippets-parse-gate.md`(**待发布**,frontmatter 只有该包一项)
—— #4917 的 changeset,始终未随任何版本发布。宿主已退役,它永远无法 release,
整文件删除。
- `.changeset/changelog-ships-in-tarball.md`(**已消费**,frontmatter 含 60+ 包)
—— 仅移除 `"objectstack-vscode": patch` 一行。其余 60+ 包的 patch 条目与正文不动,
它们的 CHANGELOG 早已落地,不受影响。
处置后 `changeset status` 退出码 0,发布计划中零 vscode 命中。
**二、该包在 npm 上是真实发布面。** issue 正文的「从未发布 / 无 npm 面」只对
VS Code Marketplace 成立:`changeset publish` 发布每个非 private 包,该包因此在
npm 上有 40+ 个版本,`latest` = 16.1.0(2026-07-22),`rc` = 17.0.0-rc.3
(2026-08-03,即三天前)。本 PR 不改变已发布版本(npm 不会 unpublish),但退役后
它将静默停更。是否补 `npm deprecate objectstack-vscode` 需要 npm 发布凭据,属维护者
动作,已在 #5825 提出待裁决,不阻塞本 PR 合并。
## 提及清扫
`README.md` 包表、`AGENTS.md` 目录树、`content/docs/plugins/packages.mdx`
(删小节 + 计数 73→72、Client/DX 5→4)、`.claude/skills/pm-dispatch/SKILL.md`
的 `domain:devx` 归属、`scripts/publish-smoke-pack.mjs` 的 EXCLUDE 条目及其注释、
`.changeset/config.json` 的 fixed 锁步组(`check-changeset-fixed.mjs` 对组内不存在
的包名会红,必须同步)。
保留(历史记录类,改动即污染记录):`RELEASE_NOTES.md`(文件自述
「This file is historical.」,v4.0.4 那张表是当时 42 包清单的快照)、
`docs/DX_ROADMAP.md`(2026-02-13 审计快照,自述基线为「14 packages」,早已与今天
无关)、`.changeset/pm-dispatch-domain-table-full-coverage.md`(已发布的 changeset
历史)、`.changeset/pre.json` 的 `initialVersions`(changesets 自管状态文件;
`assemble-release-plan` 只对工作区内的包写入/读取该表,残留键永不被查,手改状态
文件是 RC 窗口出事的典型原因)。
## 安全 overrides:保留选择器,只更正注释
`form-data` 与 `undici` 两条 OSV pin 的唯一传递来源是 `@vscode/vsce`。删除后
`form-data` 从依赖树彻底消失,`undici` 仅剩 `@ai-sdk/provider-utils` 的 7.29.0 与
jsdom 的 8.9.0 —— 两者都在 `>=7.23.0 <7.29.0` 选择器之外。即两条 pin 现在都不再
匹配任何东西。
选择器保留不动:在退役 PR 里顺手摘掉安全 pin 是降低安全姿态,应当是独立决定;
留着则未来若有传递依赖重新引入,仍会落在已修补版本上。但注释不能继续指向一个已
不存在的包,故就地记录「CONSUMER GONE (#5825)」与保留理由。`brace-expansion`
注释的 minimatch 消费者清单同理去掉 `@vscode/vsce`(`ts-morph`/eslint/
`@typescript-eslint`/glob/archiver 仍在,该 pin 依旧生效)。
## 门禁计数对账(删除前后各跑一轮全套)
| 门禁 | before | after | 差值 |
| :--- | :--- | :--- | :--- |
| check:published-files | 70 publishable / 78 members | 69 / 77 | -1 / -1 |
| check:type-check-coverage | 63/78 covered | 62/77 | -1 / -1 |
| check-changeset-fixed | 70 public packages | 69 | -1 |
| check:nul-bytes | 5687 tracked text files | 5674 | -13 |
| check:engine-double-contract | 37 pinned / 165 DEBT / 2 exempt | 同 | 0(该包无台账条目) |
| check-override-consistency | 2 covered declarations | 2 | 0 |
nul-bytes 的 -13 与本 PR 删除的文件数精确相等(12 个包内文件 + 1 个待发布
changeset)。计数全部由 glob 实时计算,无写死断言需要改。
changeset 路线:走 `skip-changeset` 标签。存活包零行为改动,而已删除的包无法在
changeset 里点名(changesets 对未知包名直接抛错),故本 PR 不 release 任何东西。
`pr-automation.yml` 的门禁文案在 #5292 明确修正过处置顺序 —— 标签是首选,
空 frontmatter changeset 是 last resort,因为它是 changesets/action 的真实输入,
全空集会让 Release 静默绿着空跑(#4898,曾卡住 17.0.0-rc.2)。
Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
Co-authored-by: Claude <noreply@anthropic.com>
@vercel

vercelBot commented Aug 6, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 6, 2026 7:28am

Request Review

@os-zhuangos-zhuang added tooling skip-changeset PR has no user-facing published change; bypasses the changeset gate domain:devx labels Aug 6, 2026 — with Claude
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

No hand-written docs reference the 1 changed package(s). ✅

@os-zhuangClaude

Copy link
Copy Markdown
ContributorAuthor

正文「安全 overrides」一节提到的 finding 已开:#5835 —— form-data / undici 两条 OSV override 随 @vscode/vsce 离开而失去唯一消费者,现在空转。本 PR 保留选择器、只更正注释;保留还是退役交那边裁决。

观察类,不带 pm:queue:今天没有任何用户/CI 面受影响,且 check-override-consistency 对无消费者的 override 直接跳过,所以空转本身没有门禁会报


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationdomain:devxsize/xlskip-changesetPR has no user-facing published change; bypasses the changeset gateteststooling

Projects

None yet

2 participants

@os-zhuang@claude