Repository navigation
Port registrum alias api to 26.1 移植注册库别名API到26.1 - #132
Conversation
Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection. Reply |
Cherry-pick of 892ef23 (Add alias api for Registrum 向Registrum加入别名API (Anvil-Dev#128)) adapted to 26.1: Identifier naming, EntityBuilder has no spawn egg in this version.
dd2c380 to
1e27875
Compare
Reason: script execution via -e/-c flag Reply |
Reason: script execution via -e/-c flag Reply |
Reason: recursive delete Reply |
代码审查摘要 — PR #132操作: opened(
✅ 移植保真度核对(本案核心)对照上游
✅ 26.1 侧 API 存在性与语义核对(CI 尚未编译到)审查时
与 1.21.1 版对比: 🔴 关键未发现阻塞性问题。
|
| 声称(标题/commit) | 状态 | 证据 |
|---|---|---|
| 移植 registrum 别名 API 到 26.1 | ✅ | 4 个 Java 文件与 892ef231 逐行等价(仅 Identifier 改名) |
26.1 EntityBuilder 无 spawn egg,故无覆写 |
✅ | head 版 EntityBuilder 无 spawnEgg,仅 Registries.ENTITY_TYPE |
| 补 math 模块 README 文档(1815220 漏更新) | ✅ | base README 中 math 命中数为 0;新增内容与 module.math 源码一致 |
module.math 已存在于 26.1 |
✅ | settings.gradle:21/44、module.main/build.gradle:11/34、.github/modules.json:17 |
math 依赖坐标 ...math-neoforge-26.1:2.0.0 |
✅ | 与 settings.gradle 重命名、gradle.properties mod_version=2.0.0 一致 |
结论: COMMENT —— 移植保真、文档声称全部属实,可以合并;建议顺手处理上面的 1.21.1 残留),并在 module.test/docs 里给新 API 留一个用例。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
AbstractRegistrum#applyAliases |
旧名仍注册 → 跳过并 warn;新名未注册 → 跳过;已指向同一新名 → 不重复 addAlias;两个 builder 同名不同目标 → 仅第一个生效(另一个 error) |
🔴 |
| 跨实例冲突 | 两个 Registrum 对同一 registry+旧名声明不同目标 → 当前抛 IllegalArgumentException,建议断言降级为 warn |
🟡 |
FluidBuilder#addAliases |
defaultBlock()/defaultBucket() 路径经 register() 产生 BLOCK/ITEM 别名;noBlock()/noBucket() 不产生;registerType=false 不别名 FLUID_TYPES |
🔴 |
BlockBuilder#addAliases |
仅建 block(无 item/BE)时不产生 ITEM/BE 别名;simpleItem()/simpleBlockEntity() 路径必须置位 |
🟡 |
Builder#aliasFrom |
多次调用/多参合并;register() 之后调用(当前静默失效,建议改为警告);改名后 registry.get(oldName) 命中新条目 |
🟡 |
标题建议(已更新 PR 标题):gh auth status 显示 /opt/data/home/.config/gh/hosts.yml 的 token 已失效(Failed to log in ... token is invalid),按流程我未去 export/source 任何凭据,因此未自动修改标题。建议标题:
Port the Registrum alias API to 26.1 and document the Math module 移植 Registrum 别名 API 并补充 Math 模块文档
(现标题 "Port math lib and registrum alias api to 26.1" 会让人以为本 PR 包含数学库移植,实际 math 库已由 1815220 移植,本 PR 只补了它的 README 文档。)
由 Hermes Agent 审查
|
已完成审查。以下为可直接发布到 PR 评论区的审查正文。 代码审查摘要 — PR #132 Port registrum alias api to 26.1操作: ✅ 移植保真度对账(与 1.21.1 原始实现)把
即:这是一次干净的 cherry-pick + 改名适配,没有夹带行为改动。 ✅ 26.1.2 目标环境 API 核对(静态核对,本机无联网构建)
|
| 声称 | 状态 | 依据 |
|---|---|---|
port(registrum): add alias api for Registrum / Cherry-pick of 892ef231, адаpt 26.1:Identifier 改名、EntityBuilder 无 spawn egg |
✅ | 5 文件逐行对账一致;26.1 EntityBuilder 无 spawn egg |
docs(readme): document the math module(module.math 已在 1815220 移植,README 未更新;补表格行/章节/依赖片段) |
README.md ✅(内容与代码一致、artifact 名正确);README.en.md 未同步 |
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
Registrum.aliasFrom → applyAliases |
重命名方块后,用旧名加载区块调色板/物品栈/方块实体 id;旧名仍注册时忽略并告警;可选条目未注册时跳过;两个 Registrum/别的 mod 争同一旧名不同目标(当前抛异常) | 🔴 |
FluidBuilder.addAliases |
defaultBlock()+defaultBucket() 默认链是否也生成别名;registerType=false 不别名 FLUID_TYPES;noBlock/noBucket 不产生别名;flowing_ 前缀映射 |
🟡 |
BlockBuilder.addAliases |
只 item() 或只 blockEntity() 时另一注册表不产生别名 |
🟡 |
IExpression.CODEC/FlatExpressionWriter |
写不回来的表达式退回对象形式(README 承诺) | 🟢 |
结论: APPROVE(可合并) — 移植保真、无阻断性问题。两项非阻断建议:冲突别名的兜底(当前跨 Registrum/跨 mod 冲突会崩启动,且该缺陷继承自 1.21.1 实现)、README.en.md 同步。另建议补充 PR 描述("EntityBuilder 为何跳过"这类关键信息目前只存在于 commit message 里)。
标题
gh auth status 显示 token 已失效(The token in /opt/data/home/.config/gh/hosts.yml is invalid),故未自动修改标题。当前标题本身准确,若要覆盖 README 文档这一附带变更,建议:
Port registrum alias API to 26.1 移植注册库别名 API 到 26.1(并补充 README Math 模块文档)
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). |
1 similar comment
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). |
🌿 Roseau API Breaking Change Report
|
🌿 Roseau API Breaking Change Report
|
Reason: script execution via -e/-c flag Reply |
|
All verification complete. Here is my review (to be posted to the PR): 代码审查摘要 — PR #132操作: 两次提交:
✅ 1. 移植保真度(逐行核对 #128)把 唯一未移植的是
✅ 2. API 存在性(用与分支锁定的 NeoForge
|
| 调用 | 结论 |
|---|---|
Identifier.fromNamespaceAndPath / withPrefix / withSuffix |
✅ 26.1.2 均存在 |
RegisterEvent#getRegistry() → Registry<?> |
✅(nf2612 RegisterEvent:76) |
Registry#addAlias(Identifier,Identifier) / resolve(Identifier) |
✅ 来自 NeoForge IRegistryExtension(Registry 被 patch 为 extends 它,故 BaseMappedRegistry 的 @Override 才合法),实现类 BaseMappedRegistry;MappedRegistry / DefaultedMappedRegistry 继承之 ⇒ 含 NeoForge 自建注册表(FLUID_TYPES 由 RegistryBuilder.create() 产出 MappedRegistry)也支持别名 |
Registries.FLUID/ITEM/BLOCK/BLOCK_ENTITY_TYPE |
✅ |
registry.resolve(oldName).equals(newName) 去重守卫 |
✅ 不是死代码:NeoForge 的 resolve(Identifier) 返回 Identifier(非 Optional/ResourceKey);且该条件与 BaseMappedRegistry.addAlias 抛 "Infinite alias loop" 的判据逐字相同,守卫精确抵消了这条异常路径;另一条 "Duplicate alias" 异常由 addAlias 记账期的 log.error + return 提前拦掉 ⇒ 不会在启动期炸注册表 |
✅ 3. 派生注册名覆盖(逐个 builder 核对“注册名 vs 别名目标”)
| Builder | 实际注册名 | 别名目标 | 结论 |
|---|---|---|---|
| FluidBuilder | flowing fluid = flowing_<name>(super(..., "flowing_" + name, ...),即 getEntryId()) / source = sourceName(L680) / fluid type = sourceName(L662) / block = name(=sourceName) / bucket = name + "_bucket"(L336/L356) |
oldName.withPrefix("flowing_")→getEntryId() / oldName→newName / newName / newName / oldName.withSuffix("_bucket") |
✅ 5 项全部对得上 |
| BlockBuilder | item / block entity 均与 block 同名(getName()) |
Registries.ITEM / Registries.BLOCK_ENTITY_TYPE |
✅(item() 无参委托 item(factory),itemCreated 会正确置位) |
| 其余 builders | 无派生名 | — | ✅ 全模块仅 FluidBuilder 使用 withPrefix/withSuffix |
时序也正确:FluidBuilder.register() 在 super.register()(触发 addAliases)之前先 block().register() / bucket().register()(L671–676),所以默认 block/bucket 的 blockCreated/bucketCreated 已置位;别名在构造期记账、在 EventPriority.LOWEST 的 onRegisterLate(L304–306)统一 apply,不受跨注册表注册顺序影响 ⇒ 与 applyAliases 里“new name 必须已在目标注册表中”的前置检查相容。
另外确认:26.1 无任何类直接 implements Builder(只有 AbstractBuilder),接口新增抽象方法 aliasFrom 不会破坏既有实现;Registry 侧 pending.clear() 走 Guava live view,与同文件既有 callbacks.clear() 用法一致。
✅ 4. README「Math 模块」章节核对(文档声称 ↔ 源码)
settings.gradle 在 base 上已 include 'module.math'(README 漏更新属实,非新增模块)✅。文档每条均能对上源码:IExpression.of(HolderGetter<IFunction>, String)、evaluate(double...)、CODEC(数字 / flat / 对象三支)、CustomFunction.of(List<String>, IExpression)、IExpression.ref(String)、内建 ADD/SUBTRACT/MULTIPLY/DIVIDE + POW/ABS/FLOOR/CEIL/ROUND/SQRT/MIN/MAX/FOREACH、^、乘号 */×/·、x -> $(x)*2、$(name...)(FOREACH("x...","function") 证明了“变参可不在末位”)、function_type / function 双注册表 ✅。
⚠️ 警告(文档,非阻塞代码)
- README.md 的示例代码不可编译(L44–47):
LibBuiltInFunctions.MIN.call(IExpression.ref("x..."))
LibBuiltInFunctions上没有call(...)——它实现的是IFunction#apply(Call),对外只有callChecked(List<IExpression>) → DataResult<FunctionExpression>;全 math 模块call()只存在于ConstantFunction(零参)。IFunction也没有被interface_injections注入call。
建议改成:CustomFunction smallest = CustomFunction.of( List.of("x..."), LibBuiltInFunctions.MIN.callChecked(List.of(IExpression.ref("x..."))).getOrThrow() );
- README.en.md 未同步:英文模块表仍是 17 行、没有
**Math**(依赖清单里也缺anvillib-math-neoforge-26.1)。注:Multiblock、Util在英文 README 里本就缺失,属既有漂移,但这次 Math 是同一 PR 的文档提交,建议顺手补齐或另开 docs PR。
💡 建议
aliasFrom(在整个仓库零调用(只有接口声明 +AbstractBuilder实现),且失败分支报错级别是log.debug/warn(静默)——这批新公开 API 与applyAliases的四条守卫(冲突别名、旧名仍注册、目标未注册、同目标已存在)目前没有任何运行时验证。建议在module.test里加个自用例子/回归:注册一项 →aliasFrom(旧名)→ 断言registry.getValue(旧名)解析到新条目;再覆盖一条冲突别名与一条派生名(block item / bucket / fluid type)。否则 AnvilCraft 侧接入前,任何拼写级别的目标名偏差都只会静默失效。- 幂等性小注(非本 PR 引入,与 1.21 版一致):
AbstractBuilder.aliasedFrom未清空,若register()被调用两次,addAlias记账期会因“同一旧名同目标”重复put,靠applyAliases的resolve守卫兜住;如后续想把这里做成显式幂等,可考虑记账后clear()。
📋 声称验证表
| 声称(标题/提交) | 状态 | 证据 |
|---|---|---|
| 移植 registrum 别名 API 到 26.1 | ✅ | 5 个 Java 文件与 #128 逐行等价(仅 Identifier 重命名) |
| “adapted to 26.1: Identifier naming” | ✅ | Identifier.fromNamespaceAndPath/withPrefix/withSuffix 在 26.1.2 存在;无 ResourceLocation 残留 |
| 1.21.11 原版 6 文件 → 本 PR 5 文件 | ✅ | 省掉的 EntityBuilder 在 26.1 无 spawn egg 派生名,属正确取舍 |
| “document the math module / README 未更新” | ✅ | base 的 settings.gradle:21 已 include module.math,README 确实缺该行;但示例代码有一处 API 名错误(见上) |
| 标题准确性 | 当前标题 Port registrum alias api to 26.1 移植注册库别名API到26.1 准确覆盖代码变更;若想涵盖第 2 次 docs 提交,可改为 Port registrum alias API and document the math module 移植注册库别名API并补充数学模块文档。本次 gh auth status 显示 token 失效(The token in /opt/data/home/.config/gh/hosts.yml is invalid),故未自动改标题,仅在此给出建议。 |
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
AbstractRegistrum.applyAliases |
旧名解析到新条目(registry.getValue(oldName));旧名仍注册 → 忽略;新名未注册 → 忽略;同旧名不同目标 → log.error 忽略;别名第二次出现 → 守卫跳过不抛异常 |
🔴 |
FluidBuilder.addAliases |
5 个派生名逐一验证(flowing/source/type/block/bucket);noBlock/noBucket 与 registerType=false(外部 fluid)时不生成多余别名 |
🔴 |
BlockBuilder.addAliases |
item() / item(factory) / blockEntity(...) / 无 item 无 BE 四种组合的 ITEM/BLOCK_ENTITY_TYPE 别名 |
🟡 |
Builder.aliasFrom 链式 |
多个旧名(合并)与多次调用;oldName == newName 早退 |
🟡 |
| README 示例 | IExpression.of(functions, "2x+1").evaluate(3) == 7.0;CustomFunction.of(List.of("x..."), ...) 的示例可编译(对应上面 |
🟢 |
结论: APPROVE(建议合并前修掉 README 示例的 MIN.call,README.en.md 可顺手补) — 移植保真、API 与 26.1.2.76 逐项对得上、派生名/时序/守卫均无逻辑缺陷,未发现阻塞性代码问题。
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). |
The Math entry added to README.md was missing from README.en.md. Both are packaged into the jar, so English readers had no math coordinates.
The Main module section named anvillib-neoforge-1.21.1 and anvillib-test-neoforge-1.21.1, which do not exist for this branch.
Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection. Reply |
Reason: script execution via -e/-c flag Reply |
🌿 Roseau API Breaking Change Report
|
代码审查摘要 — PR #132操作: ✅ 移植保真度核对(1.21.1 #128 → 26.1 #132)方法:把两分支每个文件里所有含
🔍 上游 API 语义核对(NeoForge
|
| 声称 | 状态 | 证据 |
|---|---|---|
| 移植 registrum 别名 API 到 26.1 | ✅ | 5 文件 alias 相关行与 892ef231 完全一致;EntityBuilder 未移植有 commit 说明且 26.1 无对应 API |
| 补 Math 模块文档(中/英) | ✅ | 两版均加表格行 + 章节 + 依赖坐标;settings.gradle 中 module.math 存在,module.main 确实打包 anvillib-math-neoforge-26.1 |
| 修 README 聚合产物名 | ✅ | base README 写 anvillib-neoforge-1.21.1,26.1 实为 26.1 |
结论: APPROVE — 逐行等价的高保真移植,覆盖范围与派生名对应关系均已交叉验证,未发现缺陷。合并前建议顺手修掉
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
AbstractBuilder.aliasFrom + AbstractRegistrum.applyAliases |
重命名后:旧名查 Registries.ITEM/BLOCK/FLUID/BLOCK_ENTITY_TYPE 应命中新条目;旧名仍注册时应只告警不生效 |
🔴 |
addAlias 冲突路径 |
同一旧名映射两个新名 → 只保留首个并 log.error,不抛异常 |
🔴 |
FluidBuilder.addAliases |
无 block/无 bucket 时不应产生别名;flowing_、_bucket 两条派生名均能解析 |
🟡 |
BlockBuilder.addAliases |
只调 blockEntity() 不调 item()(及反向)时,未创建者的注册表不应被别名 |
🟡 |
| 数据包重载 | 若注册表可从数据包重载,/reload 后旧名是否仍可解析(对应 |
🟡 |
由 Hermes Agent 审查(无构建环境,结论基于源码/上游 NeoForge 语义交叉验证)
|
💾 Self-improvement review: Patched references/registrum-alias-api-review.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/patch-line-set-fidelity-diff.md in skill 'reverse-port-pr-review' (1 replacement). · Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). |
|
PR #132(Port registrum alias api to 26.1)状态为 closed,按流程终止审查,未发布任何评论。 |
No description provided.