modwright 0.1.0

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.
Files changed (455) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +212 -0
  3. package/assets/claude/agents/mw-explore.md +46 -0
  4. package/assets/claude/agents/mw-fixture.md +33 -0
  5. package/assets/claude/agents/mw-rule-author.md +51 -0
  6. package/assets/claude/agents/mw-scaffold-author.md +48 -0
  7. package/assets/claude/skills/mw-author.md +59 -0
  8. package/assets/claude/skills/mw-new-item.md +51 -0
  9. package/assets/claude/skills/mw-new-spell.md +50 -0
  10. package/assets/claude/skills/mw-scaffold.md +59 -0
  11. package/assets/claude/skills/mw-ship.md +57 -0
  12. package/assets/claude/skills/mw-validate.md +51 -0
  13. package/assets/claude/skills/mw-verify.md +59 -0
  14. package/assets/nivalisnights/extract_resources.py +177 -0
  15. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
  16. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
  17. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
  18. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
  19. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
  20. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
  21. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
  22. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
  23. package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
  24. package/bridges/bg3-se/README.md +99 -0
  25. package/bridges/bg3-se/bridge.json +68 -0
  26. package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
  27. package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
  28. package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
  29. package/bridges/cp2077-cet/README.md +165 -0
  30. package/bridges/cp2077-cet/bridge.json +53 -0
  31. package/dist/core/bridge/arm.js +175 -0
  32. package/dist/core/bridge/cet-console.js +26 -0
  33. package/dist/core/bridge/cet-log.js +362 -0
  34. package/dist/core/bridge/index.js +11 -0
  35. package/dist/core/bridge/locate.js +35 -0
  36. package/dist/core/bridge/paths.js +34 -0
  37. package/dist/core/bridge/pending.js +89 -0
  38. package/dist/core/bridge/poll.js +155 -0
  39. package/dist/core/bridge/stage.js +100 -0
  40. package/dist/core/bridge/status.js +97 -0
  41. package/dist/core/bridge/types.js +145 -0
  42. package/dist/core/bridge/validate.js +107 -0
  43. package/dist/core/build/index.js +6 -0
  44. package/dist/core/build/manifest.js +47 -0
  45. package/dist/core/build/paths.js +32 -0
  46. package/dist/core/build/run.js +342 -0
  47. package/dist/core/build/stage.js +265 -0
  48. package/dist/core/build/steps/bg3.js +129 -0
  49. package/dist/core/build/steps/core.js +195 -0
  50. package/dist/core/build/steps/cyberpunk.js +95 -0
  51. package/dist/core/build/steps/listing.js +35 -0
  52. package/dist/core/build/types.js +13 -0
  53. package/dist/core/build/zip.js +148 -0
  54. package/dist/core/compat/check.js +113 -0
  55. package/dist/core/compat/pe.js +220 -0
  56. package/dist/core/compat/types.js +1 -0
  57. package/dist/core/compat/version.js +70 -0
  58. package/dist/core/deploy/guards.js +292 -0
  59. package/dist/core/deploy/index.js +5 -0
  60. package/dist/core/deploy/plan.js +696 -0
  61. package/dist/core/deploy/reload-apply.js +361 -0
  62. package/dist/core/deploy/reload.js +358 -0
  63. package/dist/core/deploy/sources.js +169 -0
  64. package/dist/core/deploy/types.js +1 -0
  65. package/dist/core/epic.js +54 -0
  66. package/dist/core/fsutil.js +191 -0
  67. package/dist/core/home.js +70 -0
  68. package/dist/core/knowledge/facts.js +229 -0
  69. package/dist/core/knowledge/index.js +4 -0
  70. package/dist/core/knowledge/search.js +112 -0
  71. package/dist/core/knowledge/store.js +123 -0
  72. package/dist/core/knowledge/types.js +1 -0
  73. package/dist/core/ledger/check.js +42 -0
  74. package/dist/core/ledger/hooks.js +80 -0
  75. package/dist/core/ledger/index.js +7 -0
  76. package/dist/core/ledger/query.js +17 -0
  77. package/dist/core/ledger/record.js +84 -0
  78. package/dist/core/ledger/status.js +53 -0
  79. package/dist/core/ledger/store.js +98 -0
  80. package/dist/core/ledger/types.js +108 -0
  81. package/dist/core/logs/index.js +4 -0
  82. package/dist/core/logs/registry.js +50 -0
  83. package/dist/core/logs/scan.js +195 -0
  84. package/dist/core/logs/triage.js +160 -0
  85. package/dist/core/logs/types.js +1 -0
  86. package/dist/core/lsx.js +10 -0
  87. package/dist/core/lz4.js +66 -0
  88. package/dist/core/mods.js +229 -0
  89. package/dist/core/process.js +49 -0
  90. package/dist/core/project/build-steps.js +83 -0
  91. package/dist/core/project/describe.js +74 -0
  92. package/dist/core/project/index.js +5 -0
  93. package/dist/core/project/load.js +146 -0
  94. package/dist/core/project/schema.js +264 -0
  95. package/dist/core/project/types.js +3 -0
  96. package/dist/core/prompts.js +72 -0
  97. package/dist/core/registry.js +35 -0
  98. package/dist/core/safety/backup.js +206 -0
  99. package/dist/core/safety/execute.js +188 -0
  100. package/dist/core/safety/index.js +5 -0
  101. package/dist/core/safety/plan.js +122 -0
  102. package/dist/core/safety/restore.js +172 -0
  103. package/dist/core/safety/types.js +1 -0
  104. package/dist/core/scaffold/bootstrap.js +7 -0
  105. package/dist/core/scaffold/catalog.js +28 -0
  106. package/dist/core/scaffold/claude-assets.js +271 -0
  107. package/dist/core/scaffold/collisions.js +64 -0
  108. package/dist/core/scaffold/emit.js +356 -0
  109. package/dist/core/scaffold/engine.js +680 -0
  110. package/dist/core/scaffold/ids.js +78 -0
  111. package/dist/core/scaffold/index.js +10 -0
  112. package/dist/core/scaffold/jsonpath.js +121 -0
  113. package/dist/core/scaffold/load.js +81 -0
  114. package/dist/core/scaffold/render.js +85 -0
  115. package/dist/core/scaffold/sequence.js +396 -0
  116. package/dist/core/scaffold/types.js +309 -0
  117. package/dist/core/steam.js +63 -0
  118. package/dist/core/surfaceutil.js +36 -0
  119. package/dist/core/testplan/check.js +67 -0
  120. package/dist/core/testplan/index.js +5 -0
  121. package/dist/core/testplan/load.js +100 -0
  122. package/dist/core/testplan/registry.js +317 -0
  123. package/dist/core/testplan/run.js +389 -0
  124. package/dist/core/testplan/types.js +82 -0
  125. package/dist/core/text/converters/bg3.js +50 -0
  126. package/dist/core/text/converters/cyberpunk.js +36 -0
  127. package/dist/core/text/converters/index.js +261 -0
  128. package/dist/core/text/diff/cr2w.js +180 -0
  129. package/dist/core/text/diff/index.js +16 -0
  130. package/dist/core/text/diff/loca.js +43 -0
  131. package/dist/core/text/diff/lsx.js +126 -0
  132. package/dist/core/text/handles.js +86 -0
  133. package/dist/core/text/index.js +6 -0
  134. package/dist/core/text/json.js +46 -0
  135. package/dist/core/text/templates/cache.js +71 -0
  136. package/dist/core/text/templates/index.js +3 -0
  137. package/dist/core/text/templates/library.js +245 -0
  138. package/dist/core/text/templates/types.js +51 -0
  139. package/dist/core/text/toolchain.js +16 -0
  140. package/dist/core/text/types.js +1 -0
  141. package/dist/core/text/validate.js +149 -0
  142. package/dist/core/text/xml.js +58 -0
  143. package/dist/core/toolchain/datafetch.js +151 -0
  144. package/dist/core/toolchain/env.js +63 -0
  145. package/dist/core/toolchain/features.js +170 -0
  146. package/dist/core/toolchain/index.js +8 -0
  147. package/dist/core/toolchain/install.js +191 -0
  148. package/dist/core/toolchain/locate.js +275 -0
  149. package/dist/core/toolchain/remember.js +84 -0
  150. package/dist/core/toolchain/run.js +318 -0
  151. package/dist/core/toolchain/specs.js +351 -0
  152. package/dist/core/toolchain/types.js +1 -0
  153. package/dist/core/types.js +1 -0
  154. package/dist/core/userconfig.js +66 -0
  155. package/dist/core/validate/context.js +139 -0
  156. package/dist/core/validate/index.js +5 -0
  157. package/dist/core/validate/registry.js +58 -0
  158. package/dist/core/validate/run.js +131 -0
  159. package/dist/core/validate/suppressions.js +91 -0
  160. package/dist/core/validate/types.js +2 -0
  161. package/dist/core/yamledit.js +51 -0
  162. package/dist/index.js +389 -0
  163. package/dist/server.js +1914 -0
  164. package/dist/surfaces/baldursgate3/compat.js +164 -0
  165. package/dist/surfaces/baldursgate3/identity.js +110 -0
  166. package/dist/surfaces/baldursgate3/index/build.js +331 -0
  167. package/dist/surfaces/baldursgate3/index/index.js +17 -0
  168. package/dist/surfaces/baldursgate3/index/info.js +40 -0
  169. package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
  170. package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
  171. package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
  172. package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
  173. package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
  174. package/dist/surfaces/baldursgate3/index/queries.js +327 -0
  175. package/dist/surfaces/baldursgate3/index/schema.js +62 -0
  176. package/dist/surfaces/baldursgate3/index.js +3 -0
  177. package/dist/surfaces/baldursgate3/logs.js +278 -0
  178. package/dist/surfaces/baldursgate3/modsettings.js +115 -0
  179. package/dist/surfaces/baldursgate3/pak.js +153 -0
  180. package/dist/surfaces/baldursgate3/settings.js +49 -0
  181. package/dist/surfaces/baldursgate3/surface.js +232 -0
  182. package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
  183. package/dist/surfaces/baldursgate3/validators/files.js +476 -0
  184. package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
  185. package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
  186. package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
  187. package/dist/surfaces/baldursgate3/validators/story.js +790 -0
  188. package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
  189. package/dist/surfaces/cyberpunk2077/compat.js +223 -0
  190. package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
  191. package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
  192. package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
  193. package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
  194. package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
  195. package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
  196. package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
  197. package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
  198. package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
  199. package/dist/surfaces/cyberpunk2077/index.js +3 -0
  200. package/dist/surfaces/cyberpunk2077/logs.js +742 -0
  201. package/dist/surfaces/cyberpunk2077/paths.js +12 -0
  202. package/dist/surfaces/cyberpunk2077/surface.js +218 -0
  203. package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
  204. package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
  205. package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
  206. package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
  207. package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
  208. package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
  209. package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
  210. package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
  211. package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
  212. package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
  213. package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
  214. package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
  215. package/dist/surfaces/eldenring/binders.js +111 -0
  216. package/dist/surfaces/eldenring/compat.js +166 -0
  217. package/dist/surfaces/eldenring/dcx.js +49 -0
  218. package/dist/surfaces/eldenring/index.js +13 -0
  219. package/dist/surfaces/eldenring/loaders.js +132 -0
  220. package/dist/surfaces/eldenring/logs.js +67 -0
  221. package/dist/surfaces/eldenring/paramdef.js +256 -0
  222. package/dist/surfaces/eldenring/params.js +129 -0
  223. package/dist/surfaces/eldenring/surface.js +121 -0
  224. package/dist/surfaces/eldenring/tools.js +52 -0
  225. package/dist/surfaces/eldenring/validators/binders.js +193 -0
  226. package/dist/surfaces/eldenring/validators/packages.js +159 -0
  227. package/dist/surfaces/eldenring/validators/params.js +334 -0
  228. package/dist/surfaces/eldenring/validators/profiles.js +287 -0
  229. package/dist/surfaces/index.js +34 -0
  230. package/dist/surfaces/nivalisnights/compat.js +229 -0
  231. package/dist/surfaces/nivalisnights/index/build.js +310 -0
  232. package/dist/surfaces/nivalisnights/index/index.js +5 -0
  233. package/dist/surfaces/nivalisnights/index/queries.js +231 -0
  234. package/dist/surfaces/nivalisnights/index.js +4 -0
  235. package/dist/surfaces/nivalisnights/logs.js +473 -0
  236. package/dist/surfaces/nivalisnights/surface.js +195 -0
  237. package/dist/surfaces/skyrimse/archives.js +229 -0
  238. package/dist/surfaces/skyrimse/compat.js +163 -0
  239. package/dist/surfaces/skyrimse/index.js +12 -0
  240. package/dist/surfaces/skyrimse/loadorder.js +174 -0
  241. package/dist/surfaces/skyrimse/logs.js +241 -0
  242. package/dist/surfaces/skyrimse/plugins.js +149 -0
  243. package/dist/surfaces/skyrimse/records.js +94 -0
  244. package/dist/surfaces/skyrimse/surface.js +240 -0
  245. package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
  246. package/dist/surfaces/skyrimse/validators/archives.js +110 -0
  247. package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
  248. package/dist/surfaces/skyrimse/validators/records.js +117 -0
  249. package/dist/surfaces/stardewvalley/compat.js +190 -0
  250. package/dist/surfaces/stardewvalley/config.js +42 -0
  251. package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
  252. package/dist/surfaces/stardewvalley/index/index.js +229 -0
  253. package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
  254. package/dist/surfaces/stardewvalley/index.js +12 -0
  255. package/dist/surfaces/stardewvalley/logs.js +307 -0
  256. package/dist/surfaces/stardewvalley/mods.js +182 -0
  257. package/dist/surfaces/stardewvalley/surface.js +244 -0
  258. package/dist/surfaces/stardewvalley/validators/content.js +321 -0
  259. package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
  260. package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
  261. package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
  262. package/dist/surfaces/subnautica2/compat.js +138 -0
  263. package/dist/surfaces/subnautica2/index.js +5 -0
  264. package/dist/surfaces/subnautica2/logs.js +129 -0
  265. package/dist/surfaces/subnautica2/paks.js +173 -0
  266. package/dist/surfaces/subnautica2/surface.js +151 -0
  267. package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
  268. package/dist/surfaces/valheim/compat.js +171 -0
  269. package/dist/surfaces/valheim/index/index.js +301 -0
  270. package/dist/surfaces/valheim/index/tables.js +103 -0
  271. package/dist/surfaces/valheim/index.js +11 -0
  272. package/dist/surfaces/valheim/logs.js +197 -0
  273. package/dist/surfaces/valheim/packaging.js +131 -0
  274. package/dist/surfaces/valheim/plugins.js +270 -0
  275. package/dist/surfaces/valheim/references.js +121 -0
  276. package/dist/surfaces/valheim/surface.js +223 -0
  277. package/dist/surfaces/valheim/validators/packaging.js +218 -0
  278. package/dist/surfaces/valheim/validators/plugins.js +287 -0
  279. package/dist/surfaces/valheim/validators/references.js +169 -0
  280. package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
  281. package/knowledge/baldursgate3/audio.voice.yaml +182 -0
  282. package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
  283. package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
  284. package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
  285. package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
  286. package/knowledge/baldursgate3/crash.causes.yaml +90 -0
  287. package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
  288. package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
  289. package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
  290. package/knowledge/baldursgate3/dialogue.yaml +122 -0
  291. package/knowledge/baldursgate3/feats.classes.yaml +164 -0
  292. package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
  293. package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
  294. package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
  295. package/knowledge/baldursgate3/journal.quests.yaml +214 -0
  296. package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
  297. package/knowledge/baldursgate3/localization.handles.yaml +92 -0
  298. package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
  299. package/knowledge/baldursgate3/origins.companions.yaml +144 -0
  300. package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
  301. package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
  302. package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
  303. package/knowledge/baldursgate3/process.launch.yaml +34 -0
  304. package/knowledge/baldursgate3/progressions.yaml +92 -0
  305. package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
  306. package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
  307. package/knowledge/baldursgate3/races.progression.yaml +228 -0
  308. package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
  309. package/knowledge/baldursgate3/scriptextender.yaml +252 -0
  310. package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
  311. package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
  312. package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
  313. package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
  314. package/knowledge/baldursgate3/stats.spells.yaml +293 -0
  315. package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
  316. package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
  317. package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
  318. package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
  319. package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
  320. package/knowledge/baldursgate3/ui.icons.yaml +412 -0
  321. package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
  322. package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
  323. package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
  324. package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
  325. package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
  326. package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
  327. package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
  328. package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
  329. package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
  330. package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
  331. package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
  332. package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
  333. package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
  334. package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
  335. package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
  336. package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
  337. package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
  338. package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
  339. package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
  340. package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
  341. package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
  342. package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
  343. package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
  344. package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
  345. package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
  346. package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
  347. package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
  348. package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
  349. package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
  350. package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
  351. package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
  352. package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
  353. package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
  354. package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
  355. package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
  356. package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
  357. package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
  358. package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
  359. package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
  360. package/knowledge/cyberpunk2077/player.control.yaml +918 -0
  361. package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
  362. package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
  363. package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
  364. package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
  365. package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
  366. package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
  367. package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
  368. package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
  369. package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
  370. package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
  371. package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
  372. package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
  373. package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
  374. package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
  375. package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
  376. package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
  377. package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
  378. package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
  379. package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
  380. package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
  381. package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
  382. package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
  383. package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
  384. package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
  385. package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
  386. package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
  387. package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
  388. package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
  389. package/knowledge/eldenring/formats.binders.yaml +237 -0
  390. package/knowledge/eldenring/launcher.me3.yaml +230 -0
  391. package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
  392. package/knowledge/eldenring/params.paramdef.yaml +149 -0
  393. package/knowledge/eldenring/params.regulation.yaml +142 -0
  394. package/knowledge/eldenring/saves.online.yaml +118 -0
  395. package/knowledge/eldenring/toolchain.cli.yaml +256 -0
  396. package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
  397. package/knowledge/skyrimse/archives.bsa.yaml +212 -0
  398. package/knowledge/skyrimse/install.detection.yaml +41 -0
  399. package/knowledge/skyrimse/loadorder.files.yaml +242 -0
  400. package/knowledge/skyrimse/plugins.esl.yaml +189 -0
  401. package/knowledge/skyrimse/plugins.format.yaml +224 -0
  402. package/knowledge/skyrimse/skse.runtime.yaml +283 -0
  403. package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
  404. package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
  405. package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
  406. package/knowledge/stardewvalley/game.versions.yaml +202 -0
  407. package/knowledge/stardewvalley/install.layout.yaml +277 -0
  408. package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
  409. package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
  410. package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
  411. package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
  412. package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
  413. package/knowledge/subnautica2/game.build.yaml +331 -0
  414. package/knowledge/subnautica2/modding.state.yaml +210 -0
  415. package/knowledge/subnautica2/ue5.containers.yaml +72 -0
  416. package/knowledge/subnautica2/ue5.paks.yaml +203 -0
  417. package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
  418. package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
  419. package/knowledge/valheim/bepinex.loader.yaml +247 -0
  420. package/knowledge/valheim/bepinex.plugins.yaml +251 -0
  421. package/knowledge/valheim/game.versions.yaml +321 -0
  422. package/knowledge/valheim/install.layout.yaml +216 -0
  423. package/knowledge/valheim/jotunn.library.yaml +334 -0
  424. package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
  425. package/knowledge/valheim/toolchain.build.yaml +111 -0
  426. package/package.json +29 -0
  427. package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
  428. package/scaffolds/baldursgate3/new-item.yaml +264 -0
  429. package/scaffolds/baldursgate3/new-mod.yaml +174 -0
  430. package/scaffolds/baldursgate3/new-passive.yaml +100 -0
  431. package/scaffolds/baldursgate3/new-project.yaml +118 -0
  432. package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
  433. package/scaffolds/baldursgate3/new-spell.yaml +102 -0
  434. package/scaffolds/baldursgate3/new-status.yaml +119 -0
  435. package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
  436. package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
  437. package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
  438. package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
  439. package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
  440. package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
  441. package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
  442. package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
  443. package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
  444. package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
  445. package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
  446. package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
  447. package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
  448. package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
  449. package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
  450. package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
  451. package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
  452. package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
  453. package/scaffolds/stardewvalley/new-project.yaml +184 -0
  454. package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
  455. package/scripts/mw-tool.mjs +184 -0
@@ -0,0 +1,251 @@
1
+ game: valheim
2
+ topic: bepinex.plugins
3
+ title: The BepInEx 5 plugin contract — metadata attributes, dependency-ordered loading, and how a
4
+ plugin fails
5
+ facts:
6
+ - id: valheim.bepinex.plugins.bepinplugin-attribute-contract
7
+ claim: A plugin is a class inheriting `BepInEx.BaseUnityPlugin` (itself a Unity `MonoBehaviour`, so
8
+ `Awake`/`Update` are the entry points) carrying `[BepInPlugin(GUID, Name, Version)]`. Without
9
+ the attribute BepInEx ignores the type entirely. The GUID must be unique and match
10
+ `^[a-zA-Z0-9\._\-]+$`; reverse-domain notation is the recommended form. The version string is
11
+ parsed with `System.Version`, i.e. `major.minor[.build[.revision]]`.
12
+ status: community
13
+ source: https://docs.bepinex.dev/v5.4.11/articles/dev_guide/plugin_tutorial/2_plugin_start.html ;
14
+ GUID regex from BepInEx v5-lts `Chainloader.allowedGuidRegex`
15
+ tags:
16
+ - bepinex
17
+ - plugin
18
+ - bepinplugin
19
+ - guid
20
+ - version
21
+ - validator
22
+ detail: "Three of these are checkable by a static validator against a plugin's own source before it
23
+ is ever built: the attribute is present, the GUID matches the regex, and the version parses.
24
+ BepInEx logs \"Skipping type [...] because its GUID [...] is of an illegal format.\" and
25
+ \"Skipping type [...] because its version is invalid.\" for the other two cases, at Warning
26
+ level, with no other symptom."
27
+ - id: valheim.bepinex.plugins.valheim-pack-allows-semver-versions
28
+ claim: "Stock BepInEx 5 rejects a plugin whose version string is a full SemVer with a pre-release
29
+ suffix such as `1.2.0-beta.1`, because `System.Version` cannot parse it. BepInExPack_Valheim
30
+ patches this: its README lists \"Plugins can use semver version strings like `1.2.0-beta.1`.
31
+ Base BepInEx 5 throws those plugins out with an 'invalid version' warning.\""
32
+ status: community
33
+ source: https://thunderstore.io/c/valheim/p/denikson/BepInExPack_Valheim/ (README, the list of
34
+ deviations from upstream BepInEx)
35
+ tags:
36
+ - bepinex
37
+ - bepinexpack
38
+ - version
39
+ - semver
40
+ - validator
41
+ - valheim-specific
42
+ detail: A validator that enforces the stock `System.Version` rule on a Valheim plugin would be
43
+ wrong. This is one of the concrete places where "Valheim runs BepInEx" and "Valheim runs the
44
+ Valheim BepInEx pack" give different answers, which is why the pack has to be its own compat
45
+ component.
46
+ - id: valheim.bepinex.plugins.dependency-attributes
47
+ claim: '`[BepInDependency(guid, DependencyFlags)]` declares a dependency, with
48
+ `DependencyFlags.HardDependency` (the constructor default) or `SoftDependency`; a second
49
+ overload takes a minimum version string and is always treated as hard.
50
+ `[BepInProcess("name.exe")]` restricts the plugin to named executables,
51
+ `[BepInIncompatibility(guid)]` refuses to load alongside another plugin. All three allow
52
+ multiple applications.'
53
+ status: inferred
54
+ source: BepInEx v5-lts `BepInEx/Contract/Attributes.cs`; the Hard/Soft semantics are also stated at
55
+ https://docs.bepinex.dev/v5.4.11/articles/dev_guide/plugin_tutorial/2_plugin_start.html
56
+ tags:
57
+ - bepinex
58
+ - plugin
59
+ - bepindependency
60
+ - bepinprocess
61
+ - bepinincompatibility
62
+ - load-order
63
+ detail: "`[BepInProcess]` matters more than usual for Valheim because the client and dedicated
64
+ server are different executables — a plugin can declare itself client-only or server-only in
65
+ the metadata itself, which a validator can cross-check against where a project deploys it."
66
+ - id: valheim.bepinex.plugins.load-order-is-a-topological-sort
67
+ claim: BepInEx has no load-order file. The order is a depth-first topological sort of the dependency
68
+ graph, seeded from a case-insensitive `SortedDictionary` so that unordered plugins come out
69
+ alphabetically and deterministically; the in-source comment is "We use a sorted dictionary to
70
+ ensure consistent load order". Both hard and soft dependencies feed the sort, so a soft
71
+ dependency still orders the load and the flag only decides whether a missing one is fatal.
72
+ status: inferred
73
+ source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs` (`Utility.TopologicalSort` over
74
+ `dependencyDict`) and `BepInEx/Utility.cs`
75
+ tags:
76
+ - bepinex
77
+ - load-order
78
+ - topological-sort
79
+ - dependency
80
+ - deterministic
81
+ detail: 'This is the single most consequential difference from every game ModWright currently
82
+ supports: there is nothing for `loadOrderFile` or `diffLoadOrder` to read, and a `load_order`
83
+ answer can only be derived by reading metadata out of the plugin assemblies or by reading the
84
+ order the log actually reported. A dependency cycle throws `Exception("Cyclic Dependency:\r\n
85
+ - node...")` rather than degrading.'
86
+ - id: valheim.bepinex.plugins.duplicate-guid-highest-version-wins
87
+ claim: When two loaded assemblies declare the same plugin GUID, BepInEx groups by GUID, orders by
88
+ version descending, keeps the highest and logs "Skipping [Name Version] because a newer
89
+ version exists (Name Version)" at Warning for each loser.
90
+ status: inferred
91
+ source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs`
92
+ tags:
93
+ - bepinex
94
+ - duplicate
95
+ - guid
96
+ - version
97
+ - conflict
98
+ - signature
99
+ detail: "This is why `conflictScope` for `BepInEx/plugins` is subtle: two mods in separate
100
+ subfolders never collide on file paths, so the directory layout is genuinely isolated, but
101
+ they can still collide on GUID, which no filesystem diff can see. The honest answer is
102
+ `isolated` plus a note saying the real collision axis is the GUID."
103
+ - id: valheim.bepinex.plugins.missing-hard-dependency-lines
104
+ claim: 'A missing hard dependency produces, at Error, "Could not load [Name Version] because it has
105
+ missing dependencies: <guid>" (or "<guid> (v<version> or newer)" when a minimum was declared),
106
+ and the plugin is never instantiated. Anything that hard-depends on *that* plugin then gets,
107
+ at Warning, "Skipping [Name Version] because it has a dependency that was not loaded. See
108
+ previous errors for details." A missing soft dependency produces no message at all.'
109
+ status: inferred
110
+ source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs`, the `Start()` dependency pass
111
+ tags:
112
+ - bepinex
113
+ - dependency
114
+ - failure-mode
115
+ - signature
116
+ - log
117
+ - cascade
118
+ detail: "The cascade is the useful part for triage: one Error line names the real root cause, and
119
+ every Warning line after it is collateral. A triage verdict that ranks these equally will bury
120
+ the finding that matters. The same three strings are also appended to the public
121
+ `Chainloader.DependencyErrors` list, which is how in-game reporter mods surface them."
122
+ - id: valheim.bepinex.plugins.other-load-failure-lines
123
+ claim: 'The remaining chainloader failure literals are "Could not load [...] because it is
124
+ incompatible with: <guids>" (Error), "Plugin [...] targets a wrong version of BepInEx
125
+ (<version>) and might not work until you update" (Warning, non-blocking), "Skipping [...]
126
+ because of process filters (<exe names>)" (Warning), "Error loading [...] : <exception
127
+ message>" (Error) and "Error occurred starting the game" (Fatal).'
128
+ status: inferred
129
+ source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs`
130
+ tags:
131
+ - bepinex
132
+ - failure-mode
133
+ - signature
134
+ - log
135
+ - version
136
+ detail: "\"targets a wrong version of BepInEx\" is a warning and does not block loading — it fires
137
+ when the plugin's referenced BepInEx assembly differs in major version, or is newer in minor
138
+ or build. Treating it as a blocker would be wrong; treating it as noise hides the most common
139
+ post-update breakage warning."
140
+ - id: valheim.bepinex.plugins.stale-assembly-exceptions-are-invisible-by-default
141
+ claim: "A plugin compiled against an older game assembly typically fails with an ordinary .NET
142
+ `MissingMethodException`/`TypeLoadException`, for which BepInEx defines no message of its own.
143
+ If it surfaces during type enumeration the log shows only the one-line \"Error loading [...] :
144
+ <message>\", because the detail (`TypeLoader.TypeLoadExceptionToString`, enumerating every
145
+ `LoaderException` and any `Fusion Log:` block) is logged at Debug, which the default
146
+ `[Logging.Disk] LogLevels` excludes. If it surfaces later — inside `Awake`, or on the first
147
+ call into a stale reference — it goes to Unity's logger and reaches `LogOutput.log` only if
148
+ `[Logging.Disk] WriteUnityLog` is turned on, which by default it is not."
149
+ status: inferred
150
+ source: BepInEx v5-lts `BepInEx/Bootstrap/TypeLoader.cs` and `BepInEx/Bootstrap/Chainloader.cs` (the
151
+ `LogDebug` calls after `Error loading`, and the `ConfigDiskWriteUnityLog` default of `false`)
152
+ tags:
153
+ - bepinex
154
+ - missingmethodexception
155
+ - typeloadexception
156
+ - game-update
157
+ - log
158
+ - failure-mode
159
+ detail: "This is the most important triage fact on the whole game: after a Valheim update, the
160
+ default configuration produces a `LogOutput.log` that looks nearly clean while the game is
161
+ visibly broken, and the actual stack trace is in Valheim's own `Player.log` instead.
162
+ ModWright's correct move is to declare both files as log sources and, on seeing a bare \"Error
163
+ loading [...]\" with no detail, to say so and recommend widening `LogLevels` rather than
164
+ guessing the cause."
165
+ - id: valheim.bepinex.plugins.harmony-version-and-patch-shape
166
+ claim: BepInEx 5.4.23.5 ships HarmonyX 2.9.0 (plus Mono.Cecil and MonoMod.RuntimeDetour); patches
167
+ are declared with `[HarmonyPatch(typeof(T), nameof(T.Method))]` on a class whose `Prefix`,
168
+ `Postfix` and `Transpiler` static methods are found by name, and applied with `new
169
+ Harmony("id").PatchAll()` or `Harmony.CreateAndPatchAll(assembly, id)`.
170
+ status: community
171
+ source: https://github.com/BepInEx/BepInEx/blob/v5.4.23.5/BepInEx/BepInEx.csproj (the HarmonyX 2.9.0
172
+ PackageReference); https://harmony.pardeike.net/v2/articles/patching-prefix.html ;
173
+ https://docs.bepinex.dev/articles/dev_guide/runtime_patching.html
174
+ tags:
175
+ - harmony
176
+ - harmonyx
177
+ - patch
178
+ - prefix
179
+ - postfix
180
+ - transpiler
181
+ - version
182
+ detail: 'The Valheim-Modding wiki independently records the same assembly version as the one a
183
+ plugin project references — "0Harmony, Version=2.9.0.0" from `BepInEx\core\0Harmony.dll`
184
+ (https://github.com/Valheim-Modding/Wiki/wiki/Best-Practices). The parameterless `PatchAll()`
185
+ carries a documented hazard: it resolves the calling assembly via `StackTrace.GetFrame(1)`,
186
+ which inlining can get wrong, so `PatchAll(Assembly.GetExecutingAssembly())` is the safe
187
+ form.'
188
+ - id: valheim.bepinex.plugins.harmonyx-runs-every-prefix-even-after-a-false
189
+ claim: 'HarmonyX deliberately differs from stock Harmony on prefix cancellation: in stock Harmony
190
+ the first prefix returning false skips the remaining prefixes and the original, whereas in
191
+ HarmonyX "cancelling running a prefix will not cancel running the subsequent prefixes" — every
192
+ prefix still runs. The HarmonyX-only injected `bool __runOriginal` parameter is the documented
193
+ way for a later prefix to notice that a skip was requested.'
194
+ status: community
195
+ source: https://github.com/BepInEx/HarmonyX/wiki/Difference-between-Harmony-and-HarmonyX, section
196
+ "All prefix patchers are always run even if original method is skipped"; stock behaviour from
197
+ https://harmony.pardeike.net/v2/articles/patching-prefix.html
198
+ tags:
199
+ - harmonyx
200
+ - harmony
201
+ - prefix
202
+ - conflict
203
+ - silent-failure
204
+ - multiplayer
205
+ detail: The page opens with "Note that these are not bugs! All items listed here are intentional
206
+ changes". There is **no log line** for this — two mods patching the same method with
207
+ cancelling prefixes behave differently on Valheim than the Harmony documentation says,
208
+ silently. It cannot be detected by a log signature, only by knowing it, which makes it a
209
+ knowledge-base fact rather than a triage rule.
210
+ - id: valheim.bepinex.plugins.patch-target-gone-after-an-update
211
+ claim: 'When a patched method no longer exists after a game update, the two observable signatures
212
+ are a HarmonyX Warning from AccessTools — "AccessTools.Method: Could not find method for type
213
+ <type> and name <name> and parameters <params>" (and the DeclaredMethod / Field / Property /
214
+ TypeByName variants) — and an `ArgumentException: Undefined target method for patch method
215
+ <signature>` thrown out of `PatchClassProcessor`, which in a normal plugin surfaces from
216
+ `Awake` as a Unity exception rather than as a chainloader error.'
217
+ status: inferred
218
+ source: HarmonyX v2.9.0 `Harmony/Tools/AccessTools.cs` and `Harmony/Public/PatchClassProcessor.cs`;
219
+ the BepInEx-side channel mapping is `BepInEx/Logging/HarmonyLogSource.cs`
220
+ tags:
221
+ - harmony
222
+ - harmonyx
223
+ - game-update
224
+ - failure-mode
225
+ - signature
226
+ - accesstools
227
+ detail: "The Valheim-Modding wiki's own troubleshooting page quotes both shapes from real logs —
228
+ \"[Warning: HarmonyX] AccessTools.DeclaredMethod: Could not find method for type InventoryGui
229
+ and name Show and parameters (Container)\" and \"[Error : Unity Log] ArgumentException:
230
+ Undefined target method...\" — which is independent confirmation that these are the lines
231
+ users actually see (https://github.com/Valheim-Modding/Wiki/wiki/Client-Troubleshooting).
232
+ HarmonyX's `[Harmony.Logger] LogChannels` defaults to `Warn, Error`, so the AccessTools
233
+ warning does reach the disk log by default while Harmony's own Info-channel startup banner
234
+ does not."
235
+ - id: valheim.bepinex.plugins.never-unpatchall-with-null
236
+ claim: The community's standing rule is to never call `UnpatchAll()` with a null parameter — only
237
+ `UnpatchAll("your.harmony.id")` — and not to call UnpatchAll at all on game shutdown, because
238
+ doing so risks corrupting saves.
239
+ status: community
240
+ source: https://github.com/Valheim-Modding/Wiki/wiki/Best-Practices
241
+ tags:
242
+ - harmony
243
+ - unpatchall
244
+ - save-corruption
245
+ - validator
246
+ - failure-mode
247
+ detail: 'BepInEx itself logs "[Warning: HarmonyX] UnpatchAll has been called - This will remove ALL
248
+ HARMONY PATCHES." when it happens, which the Client-Troubleshooting page quotes as a line to
249
+ look for. That makes this both a source-level validator (flag a null-argument UnpatchAll call)
250
+ and a log signature (flag the warning), and the consequence — a corrupted save — is severe
251
+ enough to justify both.'
@@ -0,0 +1,321 @@
1
+ game: valheim
2
+ topic: game.versions
3
+ title: Valheim's version axis, update cadence, the 1.0 engine upgrade, and where saves and Player.log live
4
+ facts:
5
+ - id: valheim.game.versions.one-dotted-axis
6
+ claim: "Valheim has one public version axis and it is the only number Iron Gate uses: three-part
7
+ patch numbers, `0.217.x`, `0.218.x`, `0.219.x`, `0.220.x`, `0.221.x` through Early Access and
8
+ `1.0.x` after release. There is no separate marketing name for a build — the biome updates
9
+ (Ashlands, The Bog Witch, Deep North) are names attached to a numbered patch, not a second
10
+ version scheme."
11
+ status: community
12
+ source: Steam news announcement titles for app 892970 (e.g. "Patch 0.218.15 – Ashlands", "Patch
13
+ 0.219.13 – The Bog Witch", "Patch 0.221.10 – Five Years of Valheim!"),
14
+ https://store.steampowered.com/news/app/892970
15
+ tags:
16
+ - version
17
+ - axis
18
+ - patch
19
+ - knowledge-format
20
+ - verified-on
21
+ detail: Under ModWright's version convention, `verified_on` for this game is therefore written on
22
+ the `1.0.12` form — the same axis the patch notes use. The exe's PE FileVersion is a
23
+ *different* number (the Unity player version, see below) and must never be substituted for it.
24
+ - id: valheim.game.versions.current-is-1-0-12
25
+ claim: Valheim left Early Access on 2026-09-09 with "Valheim 1.0 Has Arrived!", and the most recent
26
+ patch as of 2026-09-11 is "Hotfix 1.0.10 & 1.0.12", published the same day — 1.0.10 to all
27
+ platforms and 1.0.12 to Steam only.
28
+ status: community
29
+ source: https://valheim.com/news/ and the Steam news feed for app 892970 (announcements dated
30
+ 2026-09-09 and 2026-09-11)
31
+ tags:
32
+ - version
33
+ - release
34
+ - "1.0"
35
+ - deep-north
36
+ - current
37
+ detail: Two things follow for a surface being brought up today. Every fact about this game is at
38
+ most two days old, so nothing is settled. And the split between an all-platform 1.0.10 and a
39
+ Steam-only 1.0.12 means "the current version" is genuinely ambiguous for a few days at a time
40
+ — a compat rule that pins an exact build will misfire during those windows.
41
+ - id: valheim.game.versions.cadence-is-slow-with-a-public-test-branch
42
+ claim: "Iron Gate's cadence is a handful of patches a year, each typically preceded by a named
43
+ \"(Public Test)\" release: 0.217.46 (2024-04-10), 0.218.15 – Ashlands (2024-05-14), 0.218.21
44
+ (2024-08-27), 0.219.13 – The Bog Witch (2024-10-29), 0.219.16 (2024-11-19), 0.220.5
45
+ (2025-04-01), 0.221.4 – Call To Arms (2025-09-09), 0.221.10 – Five Years of Valheim
46
+ (2026-02-02), 0.221.12 (2026-02-19), 0.221.13 (Public Test) (2026-05-06), 1.0 (2026-09-09)."
47
+ status: community
48
+ source: Steam news announcement titles and dates for app 892970,
49
+ https://store.steampowered.com/news/app/892970
50
+ tags:
51
+ - version
52
+ - cadence
53
+ - public-test
54
+ - beta-branch
55
+ - patch-history
56
+ detail: Compared with Cyberpunk 2077 or Baldur's Gate 3 this is a slow cadence with long stable
57
+ plateaus — 0.220.5 stood for five months, 0.221.12 for seven. The practical consequence is
58
+ that "every plugin broke" events are rare but total, and the Public Test branch gives modders
59
+ advance warning, which is the natural trigger for a compat-matrix refresh.
60
+ - id: valheim.game.versions.1-0-included-a-unity-engine-upgrade
61
+ claim: The Valheim 1.0 patch notes list "Unity engine upgrade" among the fixes and improvements,
62
+ alongside a new "Magica cloth system"; the Valheim-Modding wiki's Unity project guide
63
+ correspondingly instructs modders to install Unity `6000.0.75f1`.
64
+ status: community
65
+ source: https://valheim.com/news/valheim-1-0-has-arrived-/ (patch notes, "Fixes & Improvements") ;
66
+ https://github.com/Valheim-Modding/Wiki/wiki/Valheim-Unity-Project-Guide
67
+ tags:
68
+ - unity
69
+ - engine
70
+ - version
71
+ - assetbundle
72
+ - "1.0"
73
+ - breaking
74
+ detail: An engine major-version move is the largest possible breaking change for asset-shipping
75
+ mods. Note the wiki's own JotunnModStub README still names Unity `2022.3.17f`, so the two
76
+ Valheim-Modding sources disagree and the correct editor version for 1.0 asset work is not
77
+ settled by documentation alone.
78
+ - id: valheim.game.versions.unity-upgrade-history
79
+ claim: Iron Gate names the Unity version in patch notes only some of the time. The numbered
80
+ statements are "Updated Unity version to 2022.3.50" in 0.219.13 – The Bog Witch (2024-10-29),
81
+ "Upgraded Unity engine to 6000.0.46f" in 0.221.4 – Call To Arms (2025-09-09), and "Updated
82
+ Game Engine to Unity 6000.0.61f1" in 0.221.10 (2026-02-02). Valheim 1.0 (2026-09-09) says only
83
+ "Unity engine upgrade", with no number.
84
+ status: community
85
+ source: Steam news patch notes for app 892970, the four announcements named (retrieved via
86
+ ISteamNews GetNewsForApp, 2026-09-11)
87
+ tags:
88
+ - unity
89
+ - version
90
+ - history
91
+ - patch-notes
92
+ - assetbundle
93
+ detail: So Valheim moved from the Unity 2022.3 line to Unity 6 between 2024-10-29 and 2025-09-09,
94
+ and the last *numbered* engine statement is 6000.0.61f1. Earlier engine moves (the 2019/2020
95
+ lines) are not in the patch notes at all — 0.207.20, 0.212.7 (Mistlands) and 0.217.14
96
+ (Hildir's Request) mention no engine version — so that history cannot be reconstructed from
97
+ Iron Gate's own notes.
98
+ - id: valheim.game.versions.assetbundles-are-not-forward-compatible
99
+ claim: Unity's own manual states that AssetBundles built with an older Unity are usually loadable by
100
+ a newer one but that "Unity doesn't support forward-compatibility of AssetBundles, so you
101
+ can't load an AssetBundle built with a newer version of Unity into an older version of Unity",
102
+ and that after large changes between versions a bundle must be rebuilt.
103
+ status: community
104
+ source: https://docs.unity3d.com/6000.3/Documentation/Manual/AssetBundlesIntro.html, "Introduction
105
+ to AssetBundles"
106
+ tags:
107
+ - unity
108
+ - assetbundle
109
+ - compatibility
110
+ - version
111
+ - toolchain
112
+ detail: "Combined with the upgrade history above, this is why the editor version matters concretely
113
+ rather than academically: a mod's bundle must be built with an editor no newer than the game's
114
+ runtime, and every Iron Gate engine bump is a point at which existing bundles can stop
115
+ loading. The same page notes that bundles built without type trees are the ones that fail
116
+ hardest across versions."
117
+ - id: valheim.game.versions.unity-version-readable-from-the-exe
118
+ claim: "The Unity player version is recoverable without launching the game, because BepInEx itself
119
+ derives it that way: its \"Running under Unity v...\" line is
120
+ `FileVersionInfo.GetVersionInfo(<game exe>).FileVersion`. Reading `valheim.exe`'s PE
121
+ FileVersion therefore answers the Unity-version question from a cold install."
122
+ status: inferred
123
+ source: BepInEx v5-lts `BepInEx.Preloader/Preloader.cs`, `GetUnityVersion()`
124
+ tags:
125
+ - unity
126
+ - version
127
+ - pe
128
+ - fileversion
129
+ - detect
130
+ - compat
131
+ related:
132
+ - id: valheim.bepinex.loader.unity-version-is-the-exe-file-version
133
+ detail: the same mechanism, stated from the loader's side
134
+ - id: valheim.game.versions.most-mods-broke-at-1-0
135
+ claim: The Valheim-Modding community's own 1.0 FAQ states that most mods do not work with 1.0
136
+ because of breaking changes, that update timelines vary from days to months per author, that
137
+ the old BepInEx pack still loads but should be updated, and that players wanting the pre-1.0
138
+ game should select `0.221.12 from February 19th` through Steam's beta settings.
139
+ status: community
140
+ source: https://github.com/Valheim-Modding/Wiki/wiki/Valheim-1.0-FAQ
141
+ tags:
142
+ - "1.0"
143
+ - breaking
144
+ - compat
145
+ - beta-branch
146
+ - rollback
147
+ detail: "Iron Gate's own 1.0 FAQ says the same from the publisher's side: there is no official mod
148
+ support on PC or consoles, no Steam Workshop, and no guarantee any mod will function at 1.0
149
+ (https://valheim.com/support/valheim-1-0-faq/)."
150
+ - id: valheim.game.versions.iron-gate-mod-stance
151
+ claim: Iron Gate's standing public statement on mods, dated 2023-05-29, is that "any creating and
152
+ using of mods is done at your own risk, and that we can't guarantee that mods will be
153
+ compatible with newer versions", and that the studio "does not condone locking modded content
154
+ behind a paywall" and urges authors to keep mods freely available.
155
+ status: community
156
+ source: https://valheim.com/news/regarding-mods/
157
+ tags:
158
+ - legal
159
+ - norm
160
+ - iron-gate
161
+ - official
162
+ - paid-mods
163
+ detail: This post is a tolerance statement, not a licence grant, and it sits alongside a EULA that
164
+ says the opposite in strict terms — see
165
+ `valheim.game.versions.eula-prohibits-reverse-engineering`. Iron Gate's stated enforcement
166
+ line in this post is paywalling and passing mods off as official.
167
+ - id: valheim.game.versions.eula-prohibits-reverse-engineering
168
+ claim: "Valheim's EULA (last updated 11 June 2025) explicitly prohibits both decompilation and
169
+ modification: users must \"do not reverse engineer, decompile, disassemble, decipher or
170
+ otherwise attempt to derive the source code for any underlying software or other intellectual
171
+ property used to provide the Game\", and \"do not modify or adapt the Game or hack, merge,
172
+ translate, creative derivatives from the Game, mimic, disable the Game or tamper with them\"."
173
+ status: community
174
+ source: https://valheim.com/eula (last updated 11 June 2025)
175
+ tags:
176
+ - legal
177
+ - eula
178
+ - decompile
179
+ - reverse-engineering
180
+ - modding
181
+ - norm
182
+ detail: "The strict letter of the EULA — and of the Steam Subscriber Agreement §2.G, which likewise
183
+ forbids reverse engineering and derivative works — coexists with Iron Gate's own public
184
+ statement welcoming mods (`valheim.game.versions.iron-gate-mod-stance`). Both must be
185
+ recorded; reporting only the tolerance statement would be a materially incomplete answer to
186
+ anyone asking whether decompiling is sanctioned. Practically, the whole Valheim modding
187
+ toolchain is built around never redistributing anything game-owned: publicizers ship as
188
+ patchers that rewrite the user's own local copy, not as assemblies."
189
+ - id: valheim.game.versions.soft-referenceable-assets-since-0-217-40
190
+ claim: Since 0.217.40 Valheim loads assets through a custom system Iron Gate calls "Soft
191
+ Referenceable Assets", backed by AssetBundles, so that Locations and Rooms can be loaded and
192
+ unloaded dynamically; ObjectDB and ZNetScene were stated as unaffected at the time of that
193
+ FAQ.
194
+ status: community
195
+ source: https://valheim.com/support/modding-faq-for-the-asset-bundle-update-0-217-40/
196
+ tags:
197
+ - assets
198
+ - assetbundle
199
+ - softreferenceableassets
200
+ - objectdb
201
+ - znetscene
202
+ - index
203
+ detail: "Iron Gate's own guidance in that FAQ is the design constraint for any ModWright vanilla
204
+ index: \"if your mod relies on a certain asset having a certain path, it's likely that an
205
+ update will break your mod\", and mods should key on AssetIDs, which \"will always stay the
206
+ same for each asset even if it's moved or renamed\". An index keyed on paths would be
207
+ re-broken by every patch; one keyed on AssetIDs would not."
208
+ - id: valheim.game.versions.save-locations
209
+ claim: Valheim's user data lives under `%USERPROFILE%\AppData\LocalLow\IronGate\Valheim`, with
210
+ character saves as `characters/*.fch` and worlds as `worlds/*.fwl` plus a matching `.db`; each
211
+ has a `.old` backup sibling (`.fch.old`, `.fwl.old`, `.db.old`).
212
+ status: community
213
+ source: https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
214
+ (`GameSavesDirectory`, `ValheimSaveGame`, `ValheimWorldSaveGame.allFiles`, `listSaves`)
215
+ tags:
216
+ - saves
217
+ - worlds
218
+ - characters
219
+ - locallow
220
+ - path
221
+ detail: MO2's plugin globs only `characters/` and `worlds/`; community save tools glob
222
+ `worlds_local/` and `characters_local/`, which is where local (as opposed to Steam-cloud)
223
+ saves have lived since roughly 0.209.8. Treat all four directory names as candidates to probe,
224
+ not as asserted paths, and see the next fact — the `.db`/`.fwl` pair itself is no longer how
225
+ 1.0 stores a world.
226
+ - id: valheim.game.versions.1-0-world-saves-are-chunked-folders
227
+ claim: "Valheim's world save format changed with the new save system introduced in 0.221.13 and
228
+ shipped in 1.0: \"Worlds will no longer be saved with a .db and a .fwl file, but will instead
229
+ be saved and stored in separate fo[lders]\", the world is split into chunks and \"only the
230
+ chunks that have been modified since the last save will be affected\"."
231
+ status: community
232
+ source: 'Steam news, "Patch 0.221.13 (Public Test)", app 892970, 2026-05-06; the 1.0 notes restate
233
+ it as "New save system: Splits world data across chunks to reduce how much data is serialized
234
+ and written"'
235
+ tags:
236
+ - saves
237
+ - worlds
238
+ - format
239
+ - "1.0"
240
+ - breaking
241
+ - chunks
242
+ detail: Any tool that assumes one `<world>.db` per world — which includes every community save
243
+ manager written before 2026 and MO2's own `ValheimWorldSaveGame.allFiles`, which appends `.db`
244
+ and `.db.old` — is wrong against a 1.0 world. A Valheim surface should not model save files at
245
+ all until the new layout has been seen on disk.
246
+ - id: valheim.game.versions.windows-playerprefs-live-in-the-registry
247
+ claim: "On Windows there is no `prefs` file under LocalLow: Unity stores PlayerPrefs in the registry
248
+ under `HKCU\\Software\\<CompanyName>\\<ProductName>`, i.e.
249
+ `HKCU\\Software\\IronGate\\Valheim`. The `prefs` file exists only on Linux and macOS."
250
+ status: community
251
+ source: https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
252
+ tags:
253
+ - prefs
254
+ - playerprefs
255
+ - registry
256
+ - windows
257
+ - unity
258
+ - path
259
+ detail: Worth stating because "the prefs file" is a common instruction in Valheim troubleshooting
260
+ threads written from a Linux perspective, and a surface that declares it as a Windows path
261
+ will report a permanently missing file.
262
+ - id: valheim.game.versions.player-log-location
263
+ claim: Unity writes the player log to
264
+ `%USERPROFILE%\AppData\LocalLow\<CompanyName>\<ProductName>\Player.log`, which for Valheim is
265
+ `%USERPROFILE%\AppData\LocalLow\IronGate\Valheim\Player.log` — the same directory as the
266
+ saves.
267
+ status: community
268
+ source: https://docs.unity3d.com/Manual/log-files.html (Unity 6.6 Manual, Player log locations)
269
+ combined with the IronGate/Valheim company and product names from
270
+ https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
271
+ tags:
272
+ - player-log
273
+ - unity
274
+ - locallow
275
+ - log
276
+ - triage
277
+ detail: "This is the second half of the triage story: `BepInEx/LogOutput.log` carries the loader's
278
+ view and, by default, none of the game's own Unity exceptions (`[Logging.Disk] WriteUnityLog`
279
+ is false), so a plugin that throws inside `Awake` leaves its stack trace here instead. The
280
+ Unity Manual page consulted does not mention a `Player-prev.log` sibling, so a previous-run
281
+ log should be treated as a candidate to probe rather than an asserted path."
282
+ - id: valheim.game.versions.mo2-lists-a-third-steam-app-id
283
+ claim: ModOrganizer2's Valheim plugin registers three Steam app ids — `892970` (game), `896660`
284
+ (dedicated server) and `1223920` — and forces `winhttp.dll` to load into `valheim.exe`, with
285
+ `GameDataPath = ""` meaning the game root itself is the deployment target.
286
+ status: community
287
+ source: https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
288
+ (`ValheimGame.GameSteamId`, `_forced_libraries`, `GameDataPath`)
289
+ tags:
290
+ - steam
291
+ - appid
292
+ - detect
293
+ - winhttp
294
+ - mo2
295
+ - deploy
296
+ detail: "What app `1223920` is (most plausibly a public-test or demo app) was not established from a
297
+ primary source in this pass and should not be asserted. The `GameDataPath = \"\"` line is the
298
+ interesting one: unlike every Bethesda-style game MO2 supports, Valheim's mod tree is rooted
299
+ at the game directory itself, because the loader files sit beside the executable."
300
+ - id: valheim.game.versions.mo2-mod-layout-normalisation
301
+ claim: "MO2's Valheim plugin encodes the community's de-facto archive layout as data: it unfolds a
302
+ `BepInExPack_Valheim` wrapper directory, accepts `BepInEx`, `doorstop_libs`,
303
+ `unstripped_corlib`, `.doorstop_version`, `doorstop_config.ini`, `start_game_bepinex.sh`,
304
+ `start_server_bepinex.sh`, `winhttp.dll` and `changelog.txt` at the root, deletes
305
+ `manifest.json`, `icon.png`, `*.md`, `*.pdb` and `*.dll.mdb`, and moves loose `*.dll` to
306
+ `BepInEx/plugins/` and loose `*.cfg` to `BepInEx/config/`."
307
+ status: community
308
+ source: https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
309
+ (the `BasicModDataChecker` `GlobPatterns`)
310
+ tags:
311
+ - layout
312
+ - packaging
313
+ - normalisation
314
+ - mo2
315
+ - prior-art
316
+ - validator
317
+ detail: Two things ModWright can take directly from this. The `unfold` entry for
318
+ `BepInExPack_Valheim` is machine-readable confirmation that the extract-the-wrapper-folder
319
+ mistake is common enough to encode. And the `move` table is a ready-made statement of where a
320
+ loose file of each type belongs, which is precisely what a packaging validator needs to check
321
+ against.