modsmith 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +6 -0
- package/README.md +131 -20
- package/bin/modsmith.mjs +573 -405
- package/docs/conformance/README.md +62 -0
- package/docs/conformance/farmers-delight-1.21.1-3.3.6.json +209 -0
- package/docs/conformance/farmers-delight-dev-live.json +321 -0
- package/docs/conformance/moredelight-26.04.30-1.21.json +47 -0
- package/docs/conformance/supplementaries-1.21.1-4.0.2.json +227 -0
- package/docs/conformance/twilightforest-1.21.1-4.8.796.json +317 -0
- package/package.json +16 -3
- package/schema/manifest.schema.json +7 -0
- package/sidesheets/farmers-delight-3.3.6.crops.json +42 -42
- package/src/block-shapes.mjs +176 -0
- package/src/calibrate.mjs +1 -0
- package/src/conformance-live.mjs +208 -0
- package/src/conformance.mjs +366 -0
- package/src/cortico-bridge.mjs +397 -325
- package/src/crops.mjs +246 -227
- package/src/import-dump.mjs +139 -0
- package/src/index.mjs +3 -1
- package/src/inspect.mjs +466 -461
- package/src/manifest-io.mjs +1 -1
- package/src/onboard.mjs +21 -3
- package/src/probe.mjs +325 -316
- package/src/rcon.mjs +14 -8
- package/src/server-fingerprint.mjs +5 -5
- package/src/stations.mjs +22 -1
- package/src/validate.mjs +231 -223
- package/src/verify.mjs +18 -10
- package/templates/reference-bot/README.md +22 -0
- package/templates/reference-bot/index.mjs +59 -0
- package/templates/registry-dump/README.md +48 -0
- package/templates/registry-dump/build.gradle +39 -0
- package/templates/registry-dump/gradle.properties +2 -0
- package/templates/registry-dump/modsmith-dump-0.1.2.jar +0 -0
- package/templates/registry-dump/settings.gradle +9 -0
- package/templates/registry-dump/src/main/java/dev/modsmith/dump/RegistryDumpMod.java +98 -0
- package/templates/registry-dump/src/main/resources/fabric.mod.json +18 -0
- package/types/index.d.ts +174 -135
package/AGENTS.md
CHANGED
|
@@ -61,12 +61,18 @@
|
|
|
61
61
|
`manifest-io` / `calibrate-core` / `server-fingerprint` / `recipes` / `recipes-join` /
|
|
62
62
|
`cortico-bridge` 的注入实现),测试覆盖它们;只有必须连服务器的(`calibrate` /
|
|
63
63
|
`probe` / `verify` / `sidecar --build` / `recipes` 的捕获)才写 CLI 集成测试。
|
|
64
|
+
- 清单/ids 改完先跑 `modsmith conformance`;`onboard` 已在 inspect 后和 ids 后自动跑,
|
|
65
|
+
fail 就停在 probe/sidecar 之前。碰撞/作物/实体规则只留在 `block-shapes.mjs` 一份。
|
|
64
66
|
- **测试不许依赖本机路径**:用 `test/fixtures/tiny-mod.jar`(2.8KB 合成夹具,覆盖了
|
|
65
67
|
单数/复数资源目录、tag 展开、作物推断、旧版 loot_tables)。
|
|
66
68
|
- 每个真实事故都在 `test/` 里留一条回归。已经钉住的有:
|
|
67
69
|
- `sidecar --no-build` 不许改清单
|
|
68
70
|
- `inspect` 给了 `--pack` 不许提示"已有同名 mod"(会指回自己刚写的)
|
|
69
71
|
- 去重与嫌疑判据的形状(`test/calibrate-core.test.mjs`:块内重复、放置 id 优先认领)
|
|
72
|
+
- 模板 state 索引**最后一个属性最快变化**(`test/block-shapes.test.mjs`:
|
|
73
|
+
按第一个属性最快算会让台阶上下形状互换;形状非空所以只查非空的检查发现不了)
|
|
74
|
+
- 串多步的 CLI 不会自己退出(`test/rcon.test.mjs`:RCON socket 必须能 `close()`;
|
|
75
|
+
onboard 走完 probe + verify 后曾挂住 20 分钟)
|
|
70
76
|
- 判据写进日志/回执里时要能对上:报告的数字必须是**实际用到的那个数**
|
|
71
77
|
(例如状态数按去重后累加,不按测量条数)。
|
|
72
78
|
- **多包共用一个服务器时**:捕获的 `declare_recipes` 是整服快照,每份清单都会含别的包
|
package/README.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# modsmith
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/modsmith)
|
|
3
4
|
[](https://github.com/xiaoxiao150/modsmith/releases)
|
|
4
5
|
[](https://github.com/xiaoxiao150/modsmith/actions/workflows/test.yml)
|
|
5
6
|
[](LICENSE)
|
|
@@ -9,9 +10,10 @@
|
|
|
9
10
|
items, recipes, tags, crops) plus **measured registry ids** that any mineflayer
|
|
10
11
|
bot can use. It solves Minecraft 1.21's static-registry problem: mod blocks and
|
|
11
12
|
items are never downloaded, their numeric ids depend on load order, and recipes
|
|
12
|
-
live in serializers the bot doesn't know. modsmith reads the jar,
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
live in serializers the bot doesn't know. modsmith reads the jar, then either
|
|
14
|
+
dumps the server registry (seconds, bundled dump mod) or falls back to measuring
|
|
15
|
+
on a live server (OP + RCON), and fingerprints the result. It is the data layer
|
|
16
|
+
for an AI companion that actually plays modded Minecraft.
|
|
15
17
|
|
|
16
18
|
**中文一句话:**把 Fabric 模组 jar 变成机器人能读、能用的语义清单和实测数字 id;
|
|
17
19
|
让她看得见模组方块、做得出模组配方、放得下模组装饰。
|
|
@@ -20,6 +22,28 @@ data layer for an AI companion that actually plays modded Minecraft.
|
|
|
20
22
|
> modsmith 负责把她面前的任意模组变成可读的配方/站点/id 数据。
|
|
21
23
|
> 方向与阶段见 [ROADMAP.md](ROADMAP.md)。
|
|
22
24
|
|
|
25
|
+
## 接包时间:3 小时 → 几秒
|
|
26
|
+
|
|
27
|
+
以前接一个大包要逐个 block state 做 `setblock` + 回读:TF 523 方块 / **17255 个状态**
|
|
28
|
+
要跑 1.5 小时,Supplementaries 14996 个状态要接近 1 小时。现在:
|
|
29
|
+
|
|
30
|
+
| | 逐状态 `calibrate` | `registry-dump` |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| 时间 | TF 约 1.5h,Supp 约 1h | dump + import,**秒级** |
|
|
33
|
+
| 需要 | 服务器 + OP + RCON + 一个裸 bot | 服务端装一个 4KB 只读 mod,重启一次 |
|
|
34
|
+
| 覆盖 | 清单声明的状态子集 | 服务端注册表的全部状态 |
|
|
35
|
+
| 风险 | 区块失新/残留读数,靠自检兜底 | 注册表真值;只读、不注册内容 |
|
|
36
|
+
|
|
37
|
+
jar 已经**内置在 modsmith 里**:`templates/registry-dump/modsmith-dump-0.1.2.jar`;
|
|
38
|
+
`modsmith dump-jar` 直接打印路径,`onboard` 会自动找 `config/modsmith-dump.json`。
|
|
39
|
+
仍然不会自动安装——装/删由人决定,因为那是改用户的服务器,不是改本地文件。
|
|
40
|
+
|
|
41
|
+
dump 不只量 id:0.1.2 起同时导出实体注册表(名字、数字 id、生成组、碰撞箱)。
|
|
42
|
+
没有这张表,暮色森林的 boss 在机器人眼里一律叫 `unknown`——她被娜迦打死了,
|
|
43
|
+
战斗日志里连对手的名字都没有。
|
|
44
|
+
|
|
45
|
+
dump 只替代 **id 测量**:`probe` / `verify` / `recipes` / `learn` 照样要跑。
|
|
46
|
+
|
|
23
47
|
## 没有它 / 有它
|
|
24
48
|
|
|
25
49
|
| | 没有 modsmith | 有 modsmith |
|
|
@@ -37,7 +61,14 @@ data layer for an AI companion that actually plays modded Minecraft.
|
|
|
37
61
|
|
|
38
62
|
## 30 秒看到结果
|
|
39
63
|
|
|
40
|
-
|
|
64
|
+
不需要服务器;`inspect` 只读 jar。已发布到 npm:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm i -g modsmith # 或者零安装:npx modsmith ...
|
|
68
|
+
modsmith inspect path/to/mod.jar --out ./mods
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
不想装 npm 包也可以直接跑仓库:
|
|
41
72
|
|
|
42
73
|
```bash
|
|
43
74
|
git clone --depth 1 https://github.com/xiaoxiao150/modsmith
|
|
@@ -47,25 +78,51 @@ node modsmith/bin/modsmith.mjs inspect path/to/mod.jar --out ./mods
|
|
|
47
78
|
输出是 `mods/<pack>.json`:方块、物品、配方类型、tag、作物都在里面。要让它变成
|
|
48
79
|
机器人真能用的数字 id,再按 [快速开始](#快速开始) 起一台自己的服务器跑 `calibrate`。
|
|
49
80
|
|
|
50
|
-
> npm 包(`npx modsmith ...`)正在准备;发布前上面的 git 一行就是最短路径。
|
|
51
|
-
|
|
52
81
|
## 支持的包(实测,不是“理论上”)
|
|
53
82
|
|
|
54
83
|
| 包 | MC / 依赖 | 覆盖 | 备注 |
|
|
55
84
|
|---|---|---|---|
|
|
56
|
-
| Farmer's Delight 3.3.6 | 1.21.1 / Fabric API | 131/
|
|
57
|
-
|
|
|
58
|
-
|
|
|
85
|
+
| Farmer's Delight 3.3.6 | 1.21.1 / Fabric API | 131/131 方块、185/185 物品、1594 条可用配方 | 生产在用;站点 `cutting_board`/`cooking_pot` 已验证 |
|
|
86
|
+
| More Delight 26.04.30 | 1.21.1 / FD | 0 方块、37/38 物品、51 条配方 | 农夫乐事扩展;纯物品/配方 |
|
|
87
|
+
| Supplementaries 4.0.2 | 1.21.1 / Moonlight 3.7.2 | 237/237 方块、248/248 物品、306 条可用配方 | 装饰验收:两间 5×5 房间、25 件装饰 |
|
|
88
|
+
| Twilight Forest 4.8.796 | 1.21.1 / Fabric API | 523/523 方块、660/718 物品、540 条配方、17255 状态 | 生产在用;9 个 boss 与实体名已进清单,维度传送待验 |
|
|
59
89
|
|
|
60
|
-
|
|
90
|
+
缺失的方块/物品不是“漏了”,是服务器没注册的兼容/技术变体;清单按实测裁剪,
|
|
61
91
|
不会把装不出来的东西列给机器人。
|
|
62
92
|
|
|
63
|
-
|
|
93
|
+
**预生成参考包(0.6.2,FD + Supplementaries)**:[modsmith-0.6.2-reference-packs.zip](https://github.com/xiaoxiao150/modsmith/releases/download/v0.6.2/modsmith-0.6.2-reference-packs.zip)
|
|
64
94
|
(两份 manifest + 对应 ids + 精确 mod 列表)。manifest 可直接复用;`-ids.json`
|
|
65
95
|
带服务器指纹,只对压缩包内 `SERVER-MODS.md` 那套完全相同的 mod 组合有效——
|
|
66
|
-
换了 jar 请重新
|
|
67
|
-
|
|
68
|
-
## 状态(0.
|
|
96
|
+
换了 jar 请重新 dump/calibrate,不要混用。
|
|
97
|
+
|
|
98
|
+
## 状态(0.7.1,AI 陪伴:生活 / 装饰 / 冒险)
|
|
99
|
+
|
|
100
|
+
> 发布说明:npm registry 上的最新包仍是 **0.6.2**;0.7.1 目前以本仓库 / GitHub
|
|
101
|
+
> release 为准(npm 发布账号还在安全暂停期)。不想等可以 `git clone` 后直接跑
|
|
102
|
+
> `node bin/modsmith.mjs`。
|
|
103
|
+
|
|
104
|
+
- **0.7.1(live 采样与形状索引修正)**:`conformance --live` 增加 RCON 写世界采样
|
|
105
|
+
(setblock 后等真实 `stateId` 再读 `shapes`,含上下两态对照),dev 服 FD 实测
|
|
106
|
+
40/9/0,报告在 [docs/conformance](docs/conformance/README.md)。采样抓出并修复
|
|
107
|
+
`templateShapeId` 的 P0:状态索引应按**最后一个属性最快**变化,原实现反了,导致
|
|
108
|
+
台阶 top/bottom 形状互换(楼梯同理);`block-shapes.test.mjs` 已钉住。
|
|
109
|
+
`onboard` 支持 `--serializers` 显式指 sidesheet;RCON socket 现在会 `close()`,
|
|
110
|
+
`onboard` 九步跑完后进程不再挂住。`verify` 对没有写回命令的侧车站点显式报
|
|
111
|
+
“已知但未验”(不再是失败);推断阶段也不再生成侧车命令,命令只由编译成功的
|
|
112
|
+
`sidecar` 写回。
|
|
113
|
+
- **0.7.0(接包验收)**:新增 `modsmith conformance`(manifest/ids/registry 三层离线
|
|
114
|
+
检查)与只读 `--live` 参考消费;`onboard` 9 步里有两道早停。四包实测 0 fail,
|
|
115
|
+
报告在 [docs/conformance](docs/conformance/README.md)。碰撞/作物/实体规则收敛到
|
|
116
|
+
`block-shapes.mjs` 一份;TF 241 个假空气方块、`diggable` 绑 `solid`、番茄长苗
|
|
117
|
+
alias 都有回归。
|
|
118
|
+
- **0.6.4(实体与 boss 可读)**:registry-dump 0.1.2 导出 `ENTITY_TYPE`(id/生成组/
|
|
119
|
+
碰撞箱),`import-dump` 写进 `<pack>-ids.json` 的 `entities`;`inspect` 从
|
|
120
|
+
`tags/entity_type/bosses.json` 读 boss 名单并带上实体中英文名。宿主因此能把
|
|
121
|
+
`unknown` 叫成「娜迦(twilightforest:naga)」并按 `monster` 组判敌对。
|
|
122
|
+
战术仍由她现场决定,清单只给事实。
|
|
123
|
+
- **registry-dump 快路径(主线,随包内置)**:接包从逐状态数小时降到秒级;
|
|
124
|
+
`onboard` 自动优先用它,`calibrate` 只在没有服务器文件权限时作为退路。
|
|
125
|
+
dump jar 不自动安装,装/删由人决定。
|
|
69
126
|
|
|
70
127
|
**数据层(本仓库)**
|
|
71
128
|
|
|
@@ -80,7 +137,7 @@ node modsmith/bin/modsmith.mjs inspect path/to/mod.jar --out ./mods
|
|
|
80
137
|
- **inspect 契约修复(0.6.2)**:自定义序列化器把 `result` 写成字符串时统一收成
|
|
81
138
|
`{id,count}`;原版 tag 可从服务器 jar 的 `data/minecraft/tags/` 展开并入
|
|
82
139
|
`candidates`(`minecraft:wooden_slabs` 等),原版 tag 配方才装得进配方表。
|
|
83
|
-
- **L2/L3 能力保持**:`onboard`
|
|
140
|
+
- **L2/L3 能力保持**:`onboard` 九步(含两道 conformance 早停)、`learn --infer`(默认合并人工站点、整段重推要
|
|
84
141
|
`--force`)、`verify --stations` 三种机制真执行、侧车熟成可跨重启、`probe --scan-blocks`
|
|
85
142
|
全量窗口扫描。
|
|
86
143
|
|
|
@@ -93,8 +150,9 @@ node modsmith/bin/modsmith.mjs inspect path/to/mod.jar --out ./mods
|
|
|
93
150
|
方块计数/可站格/门)、`place.face`(壁挂装饰)。真机验收:她在两间不同材质的
|
|
94
151
|
5×5 房间里自己扫房、选材、贴出 **25 件装饰 + 两条横梁 + 两个遮阳篷**,并把
|
|
95
152
|
暖/冷两套风格写进笔记。
|
|
96
|
-
- **P3 冒险**:TF 4.8.796
|
|
97
|
-
|
|
153
|
+
- **P3 冒险**:TF 4.8.796 已接入生产服(523 方块 / 540 条配方 / 9 个 boss)。
|
|
154
|
+
实体名与 boss 标记已进清单,`mc_entities` 能报"是谁、多远、是否敌对";剩下的是
|
|
155
|
+
维度传送与战利品表读取。
|
|
98
156
|
- 完整阶段与依赖见 [ROADMAP.md](ROADMAP.md)。
|
|
99
157
|
|
|
100
158
|
**兼容性说明**
|
|
@@ -108,8 +166,60 @@ calibrate / probe / verify 是在**你自己的服务器上动手**:`forceload
|
|
|
108
166
|
没有 OP 就是每条命令静默失败。支持范围也只有 Fabric(Forge/NeoForge 的 FML 握手
|
|
109
167
|
是另一套协议,投入产出比差)。
|
|
110
168
|
|
|
169
|
+
## 最快接包:注册表 dump(秒级,替代逐状态校准)
|
|
170
|
+
|
|
171
|
+
`templates/registry-dump` 是一个只读的服务端 Fabric mod:启动后把服务端真实注册表写成
|
|
172
|
+
`config/modsmith-dump.json`,**不注册任何方块/物品**。jar 已随包内置
|
|
173
|
+
(`templates/registry-dump/modsmith-dump-0.1.2.jar`,4.6KB),运行 `modsmith dump-jar`
|
|
174
|
+
可直接打印它的绝对路径;也可从
|
|
175
|
+
[Release](https://github.com/xiaoxiao150/modsmith/releases/tag/registry-dump-v0.1.2) 下载。
|
|
176
|
+
|
|
177
|
+
装一次 → 启动 → 拿 dump → 停服删 jar:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
modsmith import-dump config/modsmith-dump.json \
|
|
181
|
+
--manifest mods/<pack>.json --ids mods/<pack>-ids.json \
|
|
182
|
+
--server-mods mods
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`import-dump` 只保留清单声明的方块/物品,并收下这个命名空间的全部实体;剔除 vanilla
|
|
186
|
+
区间(方块 stateId 与原版实体 id 0–129)与重复 stateId。TF 这种 523 方块 / 17255 状态
|
|
187
|
+
的大包,从“逐状态 setblock 约 1.5 小时”变成秒级。
|
|
188
|
+
|
|
189
|
+
## 接包验收(conformance)
|
|
190
|
+
|
|
191
|
+
接包不再靠“陪玩一晚看崩不崩”。清单和 ids 一落地就跑一次离线验收:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
modsmith conformance mods/<pack>.json \
|
|
195
|
+
--ids mods/<pack>-ids.json --server-mods mods
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
三层检查:
|
|
199
|
+
|
|
200
|
+
- **manifest**:solid 必须有 box 或可映射形状、作物 alias 必须指向可收获阶段(不会把长苗当熟果)、配方 result/candidate 可解析;
|
|
201
|
+
- **ids**:stateId 在原版区间外、无跨方块重复/重叠、item/entity id 在各自原版上限外、服务器指纹对得上;
|
|
202
|
+
- **registry**:注入真实 prismarine 注册表后,每个 state 真的有 shape、楼梯上半/下半不同、作物 `diggable:true`、boss 真的进实体表、配方视图能消费。
|
|
203
|
+
|
|
204
|
+
`onboard` 会自动跑这一步,失败就停在 probe/sidecar 之前;报告落在
|
|
205
|
+
`mods/<pack>-conformance.json`。当前四个生产包离线检查都是 **0 fail**(警告是自定义
|
|
206
|
+
序列化器/开门状态等已解释项)。
|
|
207
|
+
|
|
208
|
+
要在一台真实服务器上只读验证一遍,加 `--live`:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
modsmith conformance mods/<pack>.json --ids mods/<pack>-ids.json \
|
|
212
|
+
--server-mods mods --live --host 127.0.0.1 --port 25565
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
它会起一个临时 mineflayer bot(默认 `ModConform`),在 `inject_allowed` 前注入,
|
|
216
|
+
检查方块形状/实体/boss 后退出;**不 setblock、不召唤、不聊天**,可以指向生产服。
|
|
217
|
+
最小独立示例见 [`templates/reference-bot`](templates/reference-bot/README.md)。
|
|
218
|
+
|
|
111
219
|
## 四步
|
|
112
220
|
|
|
221
|
+
先装:`npm i -g modsmith`(或每条命令前加 `npx`)。
|
|
222
|
+
|
|
113
223
|
```
|
|
114
224
|
modsmith inspect <mod.jar> 静态提取:方块/物品/配方/tag/中文名 + 推断作物
|
|
115
225
|
modsmith calibrate <manifest.json> 连服务器量数字 id(/setblock + /give)
|
|
@@ -130,7 +240,7 @@ modsmith learn <manifest.json> LLM 读清单 + wiki,产出站点定义
|
|
|
130
240
|
modsmith sidecar <manifest.json> 给"服务端不开菜单"的站点生成侧车模组
|
|
131
241
|
```
|
|
132
242
|
|
|
133
|
-
|
|
243
|
+
一条龙(九步按序串好,失败即停,`--resume` 断点续跑):
|
|
134
244
|
|
|
135
245
|
```
|
|
136
246
|
modsmith onboard <mod.jar> --pack <name> \
|
|
@@ -307,8 +417,9 @@ modsmith learn <manifest> --infer --evidence probe.json
|
|
|
307
417
|
`verify --stations` **不静默跳过**:缺 `recipeType` 的、机制还没执行器的,都会显式报
|
|
308
418
|
“已知但未验”,而不是从报告里消失。
|
|
309
419
|
|
|
310
|
-
`onboard` 现在是 **
|
|
311
|
-
|
|
420
|
+
`onboard` 现在是 **9 步**:inspect → conformance-manifest → calibrate/import-dump →
|
|
421
|
+
conformance(ids+registry)→ probe(含方块扫描)→ recipes → learn(规则推断)→
|
|
422
|
+
verify(含站点实测)→ sidecar。`recipes` 排在 `learn`/`verify` 之前是
|
|
312
423
|
硬约束:jar 形状的配方里 `tool` 是对象(读不出刀后缀)、`cooking_time` 为空,先跑会把
|
|
313
424
|
两步式误判成侧车、站点执行也会超时。
|
|
314
425
|
|