Skip to content

@object-ui/cli 与 @object-ui/create-plugin 的 files 声明了 templates,但该目录从未在仓库里存在过——#3647 的同类残留声明 #3665

Description

@yinlianghui

发现于 #3663 的实施(为「files 条目必须在磁盘存在」补门禁时的全量扫描)。观察类记录,不在该单完成范围内。

事实

在 origin/main(dae1ac4)上全量扫描 40 个声明了 files 的 workspace 包、共 159 条条目,除去 42 条「已被 git-ignore 的构建产物」后,剩下 2 条声明与磁盘不符:

包 files 条目 磁盘 git 跟踪 git-ignore 构建产物?
@object-ui/cli templates ❌ 不存在 ❌ 未跟踪 ❌ 未忽略 ❌ 否
@object-ui/create-plugin templates ❌ 不存在 ❌ 未跟踪 ❌ 未忽略 ❌ 否

这与 #3647(plugin-tree 声明 LICENSE 而文件不存在)是同一机制:npm 对 files 里不存在的条目静默跳过,不报错、不警告、退出码 0。

三条佐证:这不是「尚未构建」,是残留声明

  1. 从未存在过。 全分支 git log --diff-filter=A 查这两个路径,返回空 —— 仓库历史里从来没有过 packages/cli/templates 或 packages/create-plugin/templates。
  2. 没有任何东西会生成它。 两个包的 build 都是 tsup,其 tsup.config.ts 只声明了 entry + dts,产物只进 dist/;.github/workflows/ 与 scripts/ 里 grep templates 无命中。
  3. 模板已改为内联,不再读磁盘。
    • packages/cli/src/commands/init.ts:17 —— const templates = { ,模板是源码里的对象字面量。
    • packages/create-plugin/src/index.ts:115 —— const templateDir = path.join(__dirname, '..', 'templates', 'plugin'); 这一行赋值后再无任何引用(全文件 grep templateDir 只此一处),生成的 package.json 是在代码里逐字段构造的。

为什么记为观察类

今天没有用户会撞上。 两个包的功能都不依赖磁盘上的 templates/(已内联),npm 又静默跳过缺失条目,所以发布出去的 tarball 在效果上是对的 —— 失真的只有 manifest 本身:它声明要打包一个不存在、也永远不会存在的目录。

create-plugin 那个死变量 templateDir 是同一次设计变更的残留,一并记在这里,不单独开单。

可能的处置(供分诊裁决,未实施)

最小修复是把这两行 "templates" 从各自的 package.json files 里删掉(并顺手删掉 create-plugin 的死变量)。

与 #3663 的关系

#3663 的门禁(scripts/__tests__/package-files-exist.test.ts)已落地,这 2 条是它的存量,以 ratchet 基线 KNOWN_MISSING 挂账并指向本单 —— 与 scripts/i18n-call-site-key-baseline.json 同一形态:新增违规会红,而本单一旦修好、基线条目变陈旧也会红,逼着把该行删掉。所以本单结清时需要同时删除 KNOWN_MISSING 里的两行。


Generated by Claude Code

Activity

  1. self-assigned this
    on Aug 7, 2026
  2. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    CollaboratorAuthor

    认领(PM 派发,即 #3667 验收裁决里的 B 卡)。


    Generated by Claude Code

  3. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    CollaboratorAuthor

    验收 ACCEPT → PR #3687(session_01GTRjn8xBqp75dk7kFupVRt)。

    已核:4 文件 +10/−24;棘轮顺序验收两步命中预测(先红点名陈旧、清空后绿);pack 受控 A/B 零差异 + 新旧源码各自构建的 dist diff 恰为死代码三行 — 「发布物影响精确为零」有机械证明。

    裁决记录:

    1. pack A/B 的方法论自纠记入方法库:初版对照被依赖构建的 dist 污染(凭空多 7 文件)→ 作废重做为同一棵已构建树上的受控 A/B — 对照实验的两臂必须只差被测变量。
    2. 基线漂移核查(建树后 main 前进 12 提交,逐一核对无 files 变动)— 长时窗交付的正确收尾动作,收录。
    3. scope_deviation(KNOWN_MISSING 注释段现在时改历史)按预先接受落地;package-files-exist 门禁的 ratchet 失败消息只描述了两条陈旧路径中的一条(「the path now resolves」) #3674(棘轮消息只覆盖两条陈旧路径之一)入池。
    4. 流程记录:本单经历 push 权限拒绝 → 主会话代推 → dev 收尾,中间报告与终版报告都合规;「探活消息不构成对被拒操作的重试授权」的自我约束正确。

    #3647/#3663/#3665 files 门禁三部曲闭环:缺陷修复 → 门禁落地 → 存量清零。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions