Skip to content

68 个已发布包的 npm tarball 里没有 CHANGELOG.md,但 AGENTS.md 说升级者会去 grep 它 #4261

Description

@os-zhuang

发现于 #4248 的实现过程。给那 20 个包补 "files": ["dist", "README.md"] 时,需要先确认这个白名单到底会漏掉什么,于是实测了 npm 的「无条件打包」清单 —— 结果和仓库自己写下的约定对不上。

现状

AGENTS.md 的 Post-Task Checklist 第 3 条把 CHANGELOG 当成 breaking change 的交付面:

Breaking changesets must carry their migration. … this text ships to consumers as CHANGELOG.md inside the npm package and is what an upgrading agent greps after the tombstone error.

但 files: ["dist", "README.md"] 并不包含 CHANGELOG.md,而 npm 也不会无条件打包它。实测(npm 10.9.7)@objectstack/types —— 它有一个 70KB 的 CHANGELOG.md:

$ cd packages/types && npm pack --dry-run
npm notice Tarball Contents
npm notice 11.4kB LICENSE
npm notice 8.8kB  README.md
npm notice 1.1kB  package.json
npm notice total files: 3

CHANGELOG.md 不在里面。npm 无条件打包的只有 package.json / README* / LICENSE* / main 指向的文件 / bin 目标 —— 老版本 npm 曾把 CHANGELOG 算进去,现在不算了。

69 个可发布包里,只有 @objectstack/spec 一个在 files 里显式列了 "CHANGELOG.md"。其余 68 个都发不出去。

为什么值得决定

这不是「白名单收紧造成的回归」——那 49 个早就声明了 files 的包一直如此,#4248 补的 20 个只是从「全都发」变成「和其他包一致」。真正的问题是约定和实现对不上:仓库要求 breaking changeset 正文写清 FROM → TO 迁移,理由是升级者(尤其是 agent)撞到 tombstone 报错后会去包里 grep 这段文字;而除了 spec,这段文字根本没进 tarball。

换句话说,写迁移说明的那条纪律,它宣称的送达路径有 68/69 是断的。

两个方向,需要选一个

  1. 让约定成真 —— 把 CHANGELOG.md 加进所有可发布包的 files,并把它纳入 check:published-files(20 个已发布包没有 files 白名单,把 src/、测试文件和构建脚本一起发到 npm #4248 新增)的 canonical set,这样新包不会再漏。成本是每个 tarball 多一个文件(spec 的 CHANGELOG 已经在发,量级可接受)。
  2. 让约定说实话 —— 承认 CHANGELOG 只经 GitHub Release / 文档站送达,把 AGENTS.md 那句「ships to consumers as CHANGELOG.md inside the npm package」改掉,别让人以为 grep 得到。

倾向 1:tombstone 报错的场景恰恰是「本地只有 node_modules,没有仓库」的场景,那时能 grep 到的只有 tarball 里的东西。但这是发布产物的范围决定,不该顺手塞进 #4248 的 PR 里,所以单独开一个。

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions