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 依旧生效)。

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

门禁 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

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

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 6, 2026 7:28am

Request Review

@os-zhuang os-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

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

Copy link
Copy Markdown
Contributor Author

正文「安全 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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation domain:devx size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate tests tooling

Projects

None yet

2 participants