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,130 @@
1
+ game: stardewvalley
2
+ topic: wiki.dataformat
3
+ title: The wiki's data-asset pages as a schema source — table shapes, the optional marker, the
4
+ curated page-to-asset mapping
5
+ facts:
6
+ - id: stardewvalley.wiki.dataformat.field-tables-are-the-schema
7
+ claim: "A wiki page for a string-keyed data asset (the 1.6 models: `Data/Objects`, `Data/Buildings`,
8
+ `Data/Crops`, `Data/Locations`, `Data/Shops`, ...) states the asset's fields in `wikitable`s
9
+ whose header row is `field | purpose` (or `field | effect`, `field | description`, `field |
10
+ result`), one table per model section under its own heading, with the field name in the first
11
+ column (often wrapped in `<samp>`, and sometimes two names in one cell separated by `<br />`,
12
+ e.g. `DisplayName` and `Description`) and a one-line purpose in the second. A sub-model's
13
+ fields are in a further `field | ...` table nested inside the parent cell that introduces it."
14
+ status: community
15
+ source: "Rendered HTML of Modding:Object_data (11 tables under Basic info, Appearance, Edibility,
16
+ Geodes & artifact spots, Context tags & exclusions, Advanced and For C# mods — 9 `field |
17
+ purpose`, 1 `field | result`, 1 `method | effect`), Modding:Buildings (22 tables: 20 `field |
18
+ effect`, 1 `property | description`, 1 `type | method | effect`), Modding:Crop_data (2 `field
19
+ | effect` tables under Format), Modding:Location_data (11: 10 `field | effect` plus 1 `name |
20
+ class | description`), Modding:Shops (10: 5 `field | effect`, 2 `value | effect`, 3 id lists),
21
+ read 2026-09-11"
22
+ tags:
23
+ - wiki
24
+ - schema
25
+ - index
26
+ - data
27
+ - table-shape
28
+ detail: "This is what makes a schema index buildable without the game (the first stage of the
29
+ index): the field list is the documentation itself. The tables give names and purposes, not
30
+ machine-readable types, and a page carries other tables too (`method | effect` for C# helpers,
31
+ `value | effect` for enum values, `name | class | description` for vanilla location names),
32
+ which an index must leave out by header rather than take by position. The nested sub-model
33
+ tables matter twice over: a non-greedy `</table>` match stops at the first one, truncating the
34
+ parent table and mixing the child's rows into it, so the parser has to match
35
+ `<table>`/`</table>` by depth. A row whose cells are all `<th>` after the header row is a
36
+ sub-heading spanning the table (`<th colspan=\"2\">Growth</th>` on Crop data), not data."
37
+ - id: stardewvalley.wiki.dataformat.delimited-assets-use-index-tables
38
+ claim: "The assets that are still `/`-delimited strings in 1.6 (`Data/Boots`, `Data/Hats`,
39
+ `Data/Furniture`, `Data/CraftingRecipes`, `Data/Fish`, `Data/Bundles`, `Data/Monsters`,
40
+ `Data/NPCGiftTastes`, `Data/Quests`, `Data/Achievements`) are documented with `index | field |
41
+ ...` tables instead (`index | syntax | description` on Bundles): the first column is the
42
+ 0-based position in the string, the second the field's name — written as a prose label
43
+ (\"Added Defense\", \"hat earned (index from hats.xnb)\"), not as a C# identifier the way a
44
+ model's field names are."
45
+ status: community
46
+ source: Rendered HTML of Modding:Boots (`index | field | effect`, rows `0 | Name` through `9 |
47
+ Texture`, including `3 | Added Defense` and `5 | Color Index`), Modding:Hats (8 positions),
48
+ Modding:Furniture (12), Modding:Monster_data (`Index | Field | Example Value`, 15 positions
49
+ from `0 | health (hit points)`), Modding:Achievement_data (same header, 5 positions),
50
+ Modding:Bundles (`index | syntax | description`), read 2026-09-11
51
+ tags:
52
+ - wiki
53
+ - schema
54
+ - index
55
+ - data
56
+ - delimited
57
+ - legacy-format
58
+ detail: "For these assets a Content Patcher `Fields` block is keyed by position — \"the field index
59
+ (starting at zero) for a slash-delimited string, or the field name for an object\"
60
+ (ContentPatcher/docs/author-guide/action-editdata.md) — so the index records each field's
61
+ position and an index-backed rule can say a `Fields` key is not a position the format has. An
62
+ `Entries` value for such an asset is a string, never an object. Four of the ten assets are not
63
+ indexed because their pages name no field at all: `Data/Quests` (the `Field` column holds the
64
+ description), `Data/NPCGiftTastes` (`field index | taste | reaction dialogue | reference
65
+ IDs`), `Data/CraftingRecipes` and `Data/CookingRecipes` (one table for both, with two
66
+ `colspan`-merged index columns) and `Data/Fish` (angle-bracketed placeholders under `index |
67
+ syntax | example | content`, and its one `index | field | purpose` table documents
68
+ `Data/AquariumFish`)."
69
+ - id: stardewvalley.wiki.dataformat.optional-prefix
70
+ claim: An optional field's purpose text opens with the literal `(Optional)`, italicised; on a few
71
+ pages the marker trails the field cell itself instead. A field with neither is required (or
72
+ has a game-side default the text states).
73
+ status: community
74
+ source: Modding:Object_data, e.g. `ColorOverlayFromNextIndex | (Optional) When drawn as a colored
75
+ object, ...`, `Edibility | (Optional) A numeric value that determines how much energy ...`,
76
+ `IsDrink | (Optional) Whether to drink the item instead of eating it. Default false.`; the
77
+ field-cell form on Modding:Powers, `<samp>Description</samp> <i>(Optional)</i>` and
78
+ `<samp>CustomFields</samp> <i>(Optional)</i>`; read 2026-09-11
79
+ tags:
80
+ - wiki
81
+ - schema
82
+ - index
83
+ - optional
84
+ detail: "The index keeps this as a boolean per field, set by either form. The marker is always
85
+ inside `<i>` in the rendered HTML, so a parser that tests the cell's text before stripping
86
+ tags finds nothing. It is a documentation convention, not a game-enforced one: the game's JSON
87
+ reader fills a missing field with the model's default whether or not the wiki marks it."
88
+ - id: stardewvalley.wiki.dataformat.page-asset-mapping-is-curated
89
+ claim: "Which asset a wiki page documents cannot be read reliably from the page: the most-mentioned
90
+ `Data/...` name is often another asset the page links to (Modding:Object_data mentions
91
+ `Data/Buffs` six times and `Data/Objects` five; Modding:Weather_data mentions `Data/Festivals`
92
+ once and `Data/Weather` never), so ModWright carries a curated page-to-asset list and checks
93
+ at build time that the asset name appears on the page at all. That check has to normalize
94
+ separators: the pages not yet rewritten for 1.6 still say `Content\\Data\\Achievements.xnb`
95
+ rather than `Data/Achievements`."
96
+ status: inferred
97
+ source: "A count of `Data/...` mentions over the 61 Modding: pages saved on 2026-09-11 (the scratch
98
+ analysis behind src/surfaces/stardewvalley/index/wiki.ts); the backslash spelling on
99
+ Modding:Bundles, Modding:Monster_data, Modding:Achievement_data and Modding:Special_orders"
100
+ tags:
101
+ - wiki
102
+ - schema
103
+ - index
104
+ - mapping
105
+ - gotcha
106
+ detail: The list lives in `WIKI_PAGES` (src/surfaces/stardewvalley/index/wiki.ts), and
107
+ `check_toolchain action=install data=stardewvalley.wiki` fetches exactly those pages. All 43
108
+ curated mappings were confirmed against the saved pages, and all 43 parse to a non-empty field
109
+ list (1137 fields). A page whose asset name does not appear on it is indexed but flagged in
110
+ the build's sources, so a renamed asset shows up as a warning rather than a silent mismatch.
111
+ - id: stardewvalley.wiki.dataformat.pages-carry-their-own-date-and-no-game-version
112
+ claim: Every wiki page ends with a `This page was last edited on <date>` footer and none states
113
+ which game version its tables describe; the index records the per-page date and no
114
+ `gameVersion`, so `lookup`'s staleness check reports the axis as unknown rather than a false
115
+ match.
116
+ status: community
117
+ source: The `footer-info-lastmod` element on every page fetched 2026-09-11 (e.g. Modding:Object_data
118
+ "last edited on 8 August 2026", Modding:Crop_data "13 May 2025", Modding:Location_data "14
119
+ June 2025", Modding:Buildings "25 March 2026")
120
+ tags:
121
+ - wiki
122
+ - schema
123
+ - index
124
+ - versioning
125
+ - staleness
126
+ detail: "The pages describe 1.6's models (fact
127
+ stardewvalley.game.versions.1-6-moved-data-to-string-keyed-models) and the game has not been
128
+ patched since 1.6.15, so the risk today is a page lagging 1.6, not a version mismatch. The
129
+ wiki's own text is CC BY-NC-SA and is not committed: `check_toolchain action=install
130
+ data=stardewvalley.wiki` saves it locally and remembers the folder, which the index reads."
@@ -0,0 +1,331 @@
1
+ game: subnautica2
2
+ topic: game.build
3
+ title: Subnautica 2 build, install layout and runtime facts read off a launch-day install
4
+ facts:
5
+ - id: subnautica2.game.engine-5-6-1
6
+ claim: "Subnautica 2 ships on Unreal Engine 5.6.1. The game's own log prints `LogInit: Engine
7
+ Version: 5.6.1-113109+++Project+SN2-Release-Hotfix-Live` and `Compatible Engine Version:`
8
+ identically, so the build is not a licensee fork with a divergent compatible version."
9
+ status: community
10
+ verified_on: 0.10.0 (CL 113109)
11
+ source: "local artifacts 2026-09-11: %LOCALAPPDATA%\\Subnautica2\\Saved\\Logs\\Subnautica2.log lines
12
+ ~470-500 (LogInit block). Corroborated by the same file's `LogMercuna: Display: Unreal Engine
13
+ version: 5.6.1`."
14
+ tags:
15
+ - engine
16
+ - ue5
17
+ - version
18
+ - loginit
19
+ - unreal
20
+ detail: "The full LogInit block also gives `Build: Subnautica2-CL-113109`, `Net CL: 113109`, `Build
21
+ Configuration: Shipping`, `Branch Name: ++Project+SN2-Release-Hotfix-Live` and
22
+ `ExecutableName: Subnautica2-Win64-Shipping.exe`. Status is `community`, not `verified`: the
23
+ log is a real artifact of a real run, but nobody re-observed this in the engine for ModWright,
24
+ and the game is not installed here to re-check. The engine version is the single most
25
+ load-bearing number for any UE modding tool (UE4SS builds, .usmap generation and IoStore
26
+ container versions are all keyed to it), so re-read it after every game patch rather than
27
+ trusting this line."
28
+ - id: subnautica2.game.two-version-axes
29
+ claim: "Subnautica 2 numbers one build three ways: the marketing/project version (`LogNetVersion:
30
+ Set ProjectVersion to 0.10.0`), the changelist (`LogUWE: Changelist: 113109`, also `Build:
31
+ Subnautica2-CL-113109`), and the engine version (5.6.1). They are different axes and must
32
+ never be compared against each other."
33
+ status: community
34
+ verified_on: 0.10.0 (CL 113109)
35
+ source: "local artifacts 2026-09-11: Subnautica2.log, `LogNetVersion: Set ProjectVersion to
36
+ 0.10.0.`, `LogUWE: Changelist: 113109`, `LogInit: Engine Version: 5.6.1-113109+...`"
37
+ tags:
38
+ - version
39
+ - changelist
40
+ - projectversion
41
+ - axes
42
+ - compat
43
+ detail: Under ModWright's version convention, a Subnautica 2 fact's `verified_on` belongs on the
44
+ game's own axis — the ProjectVersion (`0.10.0`), with the changelist in parentheses where it
45
+ is known, because the CL is what the EOS product version string and the log both actually
46
+ print. The engine version is a third axis and belongs in a compat component, not in
47
+ `verified_on`. Note the changelist is also embedded in the engine version string itself
48
+ (`5.6.1-113109`), which is how one line can be misread as pinning both.
49
+ - id: subnautica2.game.release-cadence-and-current-build
50
+ claim: Subnautica 2 entered Early Access on 2026-05-14 at changelist 113109 and has shipped seven
51
+ releases since; the newest as of 2026-09-11 is "Early Access Buddy System Hotfix 1", v127034,
52
+ 2026-09-01. Any fact captured on the launch build is roughly 14,000 changelists stale.
53
+ status: community
54
+ verified_on: 0.10.0 (CL 113109)
55
+ source: "https://wiki.subnautica.com/sn2/Update_History (Update History table), read 2026-09-11. The
56
+ launch row reads \"Early Access Release — May 14th, 2026 (v113109)\", which matches this
57
+ machine's own launch-day log exactly (local artifacts 2026-09-11, `LogUWE: Changelist:
58
+ 113109`) — so the wiki's \"v\" numbers are the game's changelist."
59
+ tags:
60
+ - version
61
+ - release
62
+ - cadence
63
+ - patch
64
+ - changelist
65
+ - staleness
66
+ detail: "The full list, newest first: Buddy System Hotfix 1 (2026-09-01, v127034); EA 1.2 \"Buddy
67
+ System\" (2026-08-19, v123362); Hotfix 4 (2026-07-14, v121347); EA 1.1 \"Adaptive Measures\"
68
+ (2026-07-08, v119503); Hotfix 3 (2026-06-01, v115506); Hotfix 2 (2026-05-22, v114707); Hotfix
69
+ 1 (2026-05-19, v113933); EA Release (2026-05-14, v113109). Unknown Worlds' own post for EA 1.1
70
+ is dated 07.08.26 and names it \"Early Access 1.1 / Adaptive Measures\"
71
+ (https://unknownworlds.com/en/news/subnautica-2-adaptive-measures-update, read 2026-09-11), so
72
+ the marketing \"EA 1.x\" names and the changelist numbers are two more axes on the same build.
73
+ Cadence is roughly one feature update every six weeks with hotfixes between — fast enough that
74
+ a version-locked native loader would break repeatedly."
75
+ - id: subnautica2.game.install-layout
76
+ claim: "The Steam install nests the Unreal project one level below the install root: the root is
77
+ `steamapps/common/Subnautica2/`, the project folder is `<root>/Subnautica2/`, and the shipping
78
+ exe is `<root>/Subnautica2/Binaries/Win64/Subnautica2-Win64-Shipping.exe`. A surface's
79
+ `detect` must not assume the exe sits at the root."
80
+ status: community
81
+ verified_on: 0.10.0 (CL 113109)
82
+ source: "local artifacts 2026-09-11: Subnautica2.log `LogInit: Base Directory: C:/Program Files
83
+ (x86)/Steam/steamapps/common/Subnautica2/Subnautica2/Binaries/Win64/` and `LogInit:
84
+ ExecutableName: Subnautica2-Win64-Shipping.exe`"
85
+ tags:
86
+ - install
87
+ - layout
88
+ - steam
89
+ - paths
90
+ - detect
91
+ - binaries
92
+ detail: "Other absolute paths in the same log confirm the rest of the tree:
93
+ `<root>/Engine/Binaries/Win64/EOSSDK-Win64-Shipping.dll` (so the engine folder is a sibling of
94
+ the project folder, the standard packaged-UE shape) and
95
+ `<root>/Subnautica2/Plugins/DLSS/Binaries/ThirdParty/Win64/nvngx_dlss.dll`. The Steam AppId is
96
+ 1962700 (`LogOnline: STEAM: [AppId: 1962700] Client API initialized 1`). The folder name under
97
+ `common/` is `Subnautica2` with no space, which is what `findInSteam` must be given."
98
+ - id: subnautica2.game.steam-folder-outlives-uninstall
99
+ claim: "`steamapps/common/Subnautica2/` survives uninstalling the game — Steam Cloud re-creates it
100
+ to hold `Subnautica2/Saved/SaveGames/steam_autocloud.vdf`. A `detect` that only tests for the
101
+ folder (which is all `core/steam.ts`'s `findInSteam` does) reports a phantom install."
102
+ status: community
103
+ verified_on: 0.10.0 (CL 113109)
104
+ source: "local artifacts 2026-09-11: this machine has
105
+ steamapps/common/Subnautica2/Subnautica2/Saved/SaveGames/steam_autocloud.vdf (51 bytes, the
106
+ only file in the tree) and no steamapps/appmanifest_1962700.acf; libraryfolders.vdf lists six
107
+ appids and 1962700 is not among them."
108
+ tags:
109
+ - detect
110
+ - steam
111
+ - false-positive
112
+ - install
113
+ - uninstall
114
+ - gotcha
115
+ detail: The Subnautica 2 surface's `detect` must confirm
116
+ `<root>/Subnautica2/Binaries/Win64/Subnautica2-Win64-Shipping.exe` exists, not merely the
117
+ folder, or every machine that ever uninstalled the game reports an install with zero mod roots
118
+ and no readable version. The same residue exists here for the first Subnautica
119
+ (`common/Subnautica2/..`'s sibling `common/Subnautica/SNAppData/SavedGames`, 46 files,
120
+ likewise with no appmanifest), so this is Steam's general behaviour and not specific to this
121
+ title.
122
+ - id: subnautica2.game.iostore-only-paks
123
+ claim: "Subnautica 2 ships its content as an IoStore container, not a legacy pak payload:
124
+ `Content/Paks/` holds `global.utoc` plus the `Subnautica2-Windows.pak`/`.utoc`/`.ucas`
125
+ triplet, and the game mounts the .utoc alongside the .pak at startup."
126
+ status: community
127
+ verified_on: 0.10.0 (CL 113109)
128
+ source: 'local artifacts 2026-09-11: Subnautica2.log first 15 lines — `LogIoDispatcher: Display:
129
+ Reading toc: ../../../Subnautica2/Content/Paks/global.utoc`, then `LogPakFile: Display:
130
+ Mounted IoStore container "../../../Subnautica2/Content/Paks/Subnautica2-Windows.utoc"`'
131
+ tags:
132
+ - iostore
133
+ - utoc
134
+ - ucas
135
+ - pak
136
+ - paks
137
+ - packaging
138
+ - mount
139
+ detail: "The container carries `EntryCount=39605` and `NumPackages=28882` (`LogFilePackageStore:
140
+ Mounting container: Id=994e00ccf1aeb8bf, Order=4, NumPackages=28882`). Practical consequence
141
+ for modding: a mod authored as a legacy (non-IoStore) .pak may not be loadable by this build
142
+ without conversion, which is the problem `retoc` exists to solve. `global.utoc` mounts first
143
+ at `Order=0` with `EntryCount=1`; the content container is `Order=4`."
144
+ - id: subnautica2.game.paks-unsigned
145
+ claim: Subnautica 2's shipped containers are unsigned — both mounted TOCs report
146
+ `SignatureHash=0000000000000000000000000000000000000000` — so there is no pak signature check
147
+ standing between a mod pak and the game.
148
+ status: community
149
+ verified_on: 0.10.0 (CL 113109)
150
+ source: "local artifacts 2026-09-11: Subnautica2.log, the two `LogIoDispatcher: Display: Toc loaded
151
+ :` lines for global.utoc and Subnautica2-Windows.utoc"
152
+ tags:
153
+ - signing
154
+ - signature
155
+ - encryption
156
+ - iostore
157
+ - security
158
+ - paks
159
+ detail: An all-zero SignatureHash is what UE prints when a container carries no signature, and both
160
+ of this game's containers do. Nothing in the log indicates an AES content key either (no
161
+ `LogPakFile` encryption-key lines, and the containers mounted with no key supplied). Absence
162
+ of a log line is weaker evidence than a positive statement, so treat "unencrypted" as probable
163
+ rather than settled; "unsigned" is directly stated by the hash. Signed paks would have been
164
+ the single most likely hard blocker to the whole pak-mod route, so this is the good outcome.
165
+ - id: subnautica2.game.pak-mount-point
166
+ claim: The shipped pak mounts at `../../../`, i.e. the engine-root-relative mount point. A mod pak
167
+ built for this game must use the same mount point or its files resolve to the wrong virtual
168
+ paths and are silently ignored.
169
+ status: community
170
+ verified_on: 0.10.0 (CL 113109)
171
+ source: "local artifacts 2026-09-11: Subnautica2.log — `LogPakFile: Display: Mounted Pak file
172
+ '../../../Subnautica2/Content/Paks/Subnautica2-Windows.pak', mount point: '../../../'`"
173
+ tags:
174
+ - mount-point
175
+ - pak
176
+ - packaging
177
+ - validator
178
+ - silent-failure
179
+ detail: "A wrong mount point is the classic silent failure of UE pak modding: the pak mounts, the
180
+ log says nothing is wrong, and none of the mod's assets are ever found. This is checkable
181
+ statically from a built pak's header, which makes it a good candidate for a ModWright
182
+ validator that needs no game."
183
+ - id: subnautica2.game.ue-log-location-and-rotation
184
+ claim: The game writes `%LOCALAPPDATA%\Subnautica2\Saved\Logs\Subnautica2.log` for the current run
185
+ and rotates the previous run to `Subnautica2-backup-YYYY.MM.DD-HH.MM.SS.log` — one new file
186
+ per launch, so each run's log gets a fresh creation time.
187
+ status: community
188
+ verified_on: 0.10.0 (CL 113109)
189
+ source: "local artifacts 2026-09-11: directory listing of %LOCALAPPDATA%\\Subnautica2\\Saved\\Logs —
190
+ Subnautica2.log plus four
191
+ Subnautica2-backup-2026.05.14-{17.45.04,18.20.47,21.11.02,22.48.53}.log"
192
+ tags:
193
+ - logs
194
+ - rotation
195
+ - saved
196
+ - localappdata
197
+ - triage
198
+ detail: "This is the standard UE `Saved/Logs` layout and it is friendlier to ModWright's incremental
199
+ triage than Cyberpunk's is: the rotation means the offsetKeys/creation-time mechanism in
200
+ core/logs works as designed (contrast redscript_rCURRENT.log, which is truncated in place and
201
+ defeated it — see src/surfaces/cyberpunk2077/paths.ts). Note the backup file's own name is
202
+ stamped in UTC while the header inside is local — see
203
+ subnautica2.game.log-timestamps-are-utc."
204
+ - id: subnautica2.game.log-timestamps-are-utc
205
+ claim: Inside the Unreal log, the bracketed per-line timestamps are UTC while the "Log file
206
+ open"/"Log file closed" header and footer are local time. A run scoped by comparing a local
207
+ wall-clock time against the bracket timestamps will be off by the UTC offset.
208
+ status: community
209
+ verified_on: 0.10.0 (CL 113109)
210
+ source: "local artifacts 2026-09-11: Subnautica2.log opens `Log file open, 05/14/26 18:50:12` and
211
+ its first bracketed line is `[2026.05.15-01.50.13:049][ 0]` — the same instant, seven hours
212
+ apart (America/Los_Angeles, UTC-7 in May). The close is symmetric: `Log file closed, 05/14/26
213
+ 20:06:22` against `[2026.05.15-03.06.22:272]`."
214
+ tags:
215
+ - logs
216
+ - timestamps
217
+ - utc
218
+ - timezone
219
+ - runscope
220
+ - gotcha
221
+ detail: Directly relevant to core/logs' `RunScope.since`. The bracket format is
222
+ `[YYYY.MM.DD-HH.MM.SS:mmm][frame]` where `frame` is a three-character right-aligned frame
223
+ counter that wraps, not a monotonic counter.
224
+ - id: subnautica2.game.log-head-has-no-timestamps
225
+ claim: The first ~520 lines of the Unreal log carry no timestamp or frame prefix at all — logging
226
+ starts before the timestamped logger does. That untimed head is exactly where the pak mounts
227
+ and the plugin list live.
228
+ status: community
229
+ verified_on: 0.10.0 (CL 113109)
230
+ source: "local artifacts 2026-09-11: Subnautica2.log — the first bracketed line is line 521
231
+ (`[2026.05.15-01.50.13:049][ 0]LogConfig: Applying CVar settings...`); every LogPakFile,
232
+ LogIoDispatcher and LogPluginManager line precedes it unprefixed."
233
+ tags:
234
+ - logs
235
+ - format
236
+ - parsing
237
+ - gotcha
238
+ - triage
239
+ - pakfile
240
+ - pluginmanager
241
+ detail: "A signature matcher anchored on a timestamp prefix would miss the entire pak-mount and
242
+ plugin-mount block, which is the part a modding tool most wants. ModWright's existing `PRE`
243
+ approach in src/surfaces/cyberpunk2077/logs.ts (zero-or-more optional bracketed fields,
244
+ anchored to line start) already handles this shape correctly. It also means `RunScope.since`
245
+ filtering cannot be applied to those lines — the `SourceStatus.timestamps: false` path in
246
+ core/logs/types.ts exists for precisely this."
247
+ - id: subnautica2.game.saves-are-gvas-with-uwe-wrapper
248
+ claim: Save files are Unreal `GVAS` SaveGame archives. The main `savegame_0.sav` is wrapped in a
249
+ Unknown Worlds container whose first four bytes are `GSWU`, with the standard GVAS header
250
+ starting at offset 0x10; auxiliary saves such as `FrontendSavedState.sav` are plain GVAS from
251
+ byte 0.
252
+ status: community
253
+ verified_on: 0.10.0 (CL 113109)
254
+ source: 'local artifacts 2026-09-11: hexdump of
255
+ %LOCALAPPDATA%\Subnautica2\Saved\SaveGames\savegame_0.sav (`4753 5755` = "GSWU", then `4756
256
+ 4153` = "GVAS" at 0x10) and of FrontendSavedState.sav ("GVAS" at 0x00)'
257
+ tags:
258
+ - saves
259
+ - gvas
260
+ - savegame
261
+ - format
262
+ - uwe
263
+ detail: The GVAS header embeds the engine version and branch that wrote it — `05 00 06 00 01 00`
264
+ (5.6.1) followed by a length-prefixed `++Project+SN2-Release-Hotfix-Live` — so a save file
265
+ alone pins the build it came from, which is useful for compat reporting when the game itself
266
+ is not installed. Saves live beside the logs in `Saved/SaveGames/`, with `savegame_0.sav`
267
+ current and `savegame_0_0.bak` .. `savegame_0_9.bak` as a ten-deep rolling backup (the game
268
+ autosaves on a ~10-minute cadence; `bAutoSaveEnabled=True` in
269
+ Saved/Config/Windows/UWESaveSystemUserSetting.ini).
270
+ - id: subnautica2.game.eos-anticheat-present-but-not-engaged
271
+ claim: 'The build ships Epic Online Services anti-cheat, but it is not engaged on a normal launch:
272
+ the log reads "Anti-cheat client not available. Verify that the game was started using the
273
+ anti-cheat bootstrapper if you intend to use it." A plain Steam launch therefore runs with no
274
+ anti-cheat client.'
275
+ status: community
276
+ verified_on: 0.10.0 (CL 113109)
277
+ source: "local artifacts 2026-09-11: Subnautica2.log — `LogEOSSDK: LogEOSAntiCheat:
278
+ [AntiCheatClient] Anti-cheat client not available. Verify that the game was started using the
279
+ anti-cheat bootstrapper if you intend to use it.`"
280
+ tags:
281
+ - anticheat
282
+ - eos
283
+ - epic
284
+ - multiplayer
285
+ - risk
286
+ detail: "This matters because anti-cheat is the usual hard stop for DLL-injection loaders such as
287
+ UE4SS. On this launch-day single-player session it was inert. It does NOT establish that co-op
288
+ sessions are equally permissive: the bootstrapper exists in the build, so a multiplayer path
289
+ may launch through it. That is the single most important thing to re-check before recommending
290
+ any injected loader."
291
+ - id: subnautica2.game.no-mod-loader-plugin-shipped
292
+ claim: Nothing in the shipped plugin set is a mod loader or a scripting host for user content. The
293
+ game mounts ~160 project plugins, all first-party (`UWE*`) or licensed middleware, and none of
294
+ them reads a user mod directory.
295
+ status: community
296
+ verified_on: 0.10.0 (CL 113109)
297
+ source: "local artifacts 2026-09-11: the complete `LogPluginManager: Mounting Project plugin <name>`
298
+ list in Subnautica2.log (158 project plugins) plus the Engine plugin list above it"
299
+ tags:
300
+ - plugins
301
+ - modding
302
+ - loader
303
+ - ugc
304
+ - absent
305
+ detail: "The licensed middleware visible in that list is worth knowing for anyone editing assets:
306
+ FMODStudio (audio — so audio is NOT Unreal-native and Wwise/UE audio knowledge does not
307
+ transfer), Mercuna 3.5.2 (3D navigation), Prefabricator, NiagaraUIRenderer,
308
+ DLSS/StreamlineCore, and Sentry (crash reporting, which writes
309
+ %LOCALAPPDATA%\\Subnautica2\\.sentry-native\\). One plugin is named `UWEUserGeneratedContent`,
310
+ which is suggestive but proves nothing about mod support on its own — see
311
+ subnautica2.modding.ugc-plugin-is-not-evidence-of-mod-support."
312
+ - id: subnautica2.game.imgui-debug-layer-present
313
+ claim: The build ships an ImGui debug layer (`ImGui` and `UWEImGui` plugins) and writes
314
+ `%LOCALAPPDATA%\Subnautica2\Saved\ImGui\Game.ini` with a window position and size, so the
315
+ debug UI is at least initialized in the shipping build.
316
+ status: community
317
+ verified_on: 0.10.0 (CL 113109)
318
+ source: "local artifacts 2026-09-11: `LogPluginManager: Mounting Project plugin ImGui` and `...
319
+ UWEImGui` in Subnautica2.log; the file Saved/ImGui/Game.ini containing
320
+ `[Window][Debug##Default] Pos=60,60 Size=400,400`"
321
+ tags:
322
+ - imgui
323
+ - debug
324
+ - console
325
+ - developer
326
+ - bridge
327
+ detail: A `UWEConsole` plugin is mounted too. Neither proves a console is reachable by a player in a
328
+ Shipping build — UE strips much of that — but an initialized ImGui layer in Shipping is
329
+ unusual enough to be worth probing, because a reachable console or debug layer would be the
330
+ cheapest possible in-game verification channel for a ModWright bridge, far cheaper than
331
+ injecting a loader.