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,179 @@
1
+ game: baldursgate3
2
+ topic: toolchain.divine
3
+ title: Divine.exe toolchain and core operations
4
+ facts:
5
+ - id: bg3.toolchain.divine-core-tool
6
+ claim: divine.exe (LSLib, in Packed/Tools/) is the core modding tool for BG3. It packs/unpacks .pak
7
+ files, converts .lsf↔.lsx, lists packages, extracts single files, and handles GR2 resources.
8
+ status: verified
9
+ verified_on: 4.73.98.727 (Patch 8)
10
+ source: ModWright field verification
11
+ tags:
12
+ - toolchain
13
+ - divine
14
+ - lsx
15
+ - lsf
16
+ detail: "Core commands: list-package, extract-package, create-package, convert-resource,
17
+ extract-single-file. The official Toolkit is incompatible with Script Extender, so the
18
+ hand-authored + divine pipeline is the SE-compatible path."
19
+ - id: bg3.toolchain.divine-requires-absolute-paths
20
+ claim: divine.exe convert-resource requires ABSOLUTE Windows paths (C:\...) for both source and
21
+ destination. Relative or MSYS-style paths cause "[FATAL] Cannot proceed without absolute
22
+ path".
23
+ status: verified
24
+ verified_on: 4.73.98.727 (Patch 8)
25
+ source: ModWright field verification
26
+ tags:
27
+ - divine
28
+ - convert-resource
29
+ - paths
30
+ - windows-only
31
+ detail: 'Command: divine.exe -g bg3 -a convert-resource -i lsx -o lsf -s <ABS_SRC> -d <ABS_DST>. A
32
+ separate failure mode: a malformed path makes divine write nothing and still exit 0 — silent
33
+ no-op, no stderr. Build Windows paths with cygpath -m and forward slashes; in bash "$D\$var"
34
+ collapses to a literal $var with the backslash eaten. See bg3.audio.divine-silent-failure.'
35
+ - id: bg3.toolchain.divine-staging-required
36
+ claim: "divine.exe create-package requires staging first: copy only Mods/ + Public/ (+ Generated/
37
+ for custom models) into a clean temp directory, never point it at a repo root."
38
+ status: verified
39
+ verified_on: 4.73.98.727 (Patch 8)
40
+ source: ModWright field verification
41
+ tags:
42
+ - divine
43
+ - create-package
44
+ - pak
45
+ - staging
46
+ detail: "create-package at a repo root will pack docs, PNGs, source files, and other junk.
47
+ Generated/ is required if the mod has custom GR2 models — omitting it ships a pak whose
48
+ VisualBank dangles and the model is missing (a regression seen in a class mod). PowerShell
49
+ pattern: Copy-Item -Recurse into $stage, then divine -g bg3 -a create-package -s $stage -d
50
+ output.pak."
51
+ - id: bg3.toolchain.pak-deployment
52
+ claim: Deploy the finished pak to %LOCALAPPDATA%\Larian Studios\Baldur's Gate 3\Mods\<Mod>.pak. The
53
+ game must be fully closed first — paks lock while BG3 runs ("Device or resource busy").
54
+ status: verified
55
+ verified_on: 4.73.98.727 (Patch 8)
56
+ source: ModWright field verification
57
+ tags:
58
+ - pak
59
+ - deployment
60
+ - game-lock
61
+ detail: "Reliable pattern: build to a scratch path, then a background watcher polls tasklist | grep
62
+ bg3_dx11.exe and copies the pak once the process exits. The player has to restart to load a
63
+ new pak anyway."
64
+ - id: bg3.toolchain.extract-single-file
65
+ claim: Extract one file from a game pak using divine.exe -g bg3 -a extract-single-file -s <game>.pak
66
+ -f "Public/.../file.lsf" -d <out.lsf>. List available paths first with list-package (grep the
67
+ output).
68
+ status: verified
69
+ verified_on: 4.73.98.727 (Patch 8)
70
+ source: ModWright field verification
71
+ tags:
72
+ - divine
73
+ - extract-single-file
74
+ - pak
75
+ detail: "The weapon STAT tells you which mod dir a RootTemplate lives in — e.g. Shadow Blade's
76
+ WPN_ShadowBlade is in GustavDev, so its template is Gustav.pak:
77
+ Public/GustavDev/RootTemplates/_merged.lsf. Convert lsf→lsx to read/edit."
78
+ - id: bg3.toolchain.loca-compilation
79
+ claim: Localization .xml must be compiled to binary .loca; the .loca is required at runtime and is
80
+ what ships in the pak. Compile with divine.exe -g bg3 -a convert-loca -s <src>.xml -d
81
+ <out>.loca. Multitool 0.10.6 does NOT do this step for you, and Vortex's stripped divine.exe
82
+ cannot — use LSLib's full divine.exe.
83
+ status: verified
84
+ source: ModWright field verification
85
+ tags:
86
+ - localization
87
+ - loca
88
+ - divine
89
+ - xml
90
+ detail: "Recorded as a hard-won lesson from an earlier mod's build loop. The same convert-loca
91
+ action reads the other way for vanilla text: Localization/English.pak → english.loca → divine
92
+ -a convert-loca → a 34 MB grep-able XML."
93
+ - id: bg3.toolchain.divine-dot-directory-empty-package
94
+ claim: divine.exe create-package silently produces an empty 48-byte package (exit 0, "[INFO] Package
95
+ created successfully.") when any directory anywhere in the -s source path has a dot-prefixed
96
+ name, whether -s itself is the dot directory or is nested inside one.
97
+ status: verified
98
+ verified_on: 4.73.98.727 (Patch 8)
99
+ source: ModWright field verification
100
+ tags:
101
+ - divine
102
+ - create-package
103
+ - paths
104
+ - silent-failure
105
+ detail: 'Repro: identical content packed from a deep path with no dot segment gives a 5.3 MB pak;
106
+ from ".x/" or from ".x/inner/" it gives 48 bytes. Stage BG3 packages under a path with no
107
+ dot-prefixed segments (ModWright: build.staging, e.g. "build/stage") and treat a pak smaller
108
+ than its largest input as failed.'
109
+ - id: bg3.toolchain.divine-game-flag-required-no-default
110
+ claim: divine.exe's -g/--game argument is required (Optional = false, DefaultValue = null in the CLI
111
+ argument definition) — there is no implicit game and omitting -g fails argument parsing rather
112
+ than falling back to a default target.
113
+ status: verified
114
+ source: "Norbyte/lslib@6f5f698 Divine/CLI/CommandLineArguments.cs:25-32 (the -g/--game
115
+ EnumeratedValueArgument: DefaultValue = null, Optional = false)"
116
+ tags:
117
+ - divine
118
+ - cli
119
+ - game-flag
120
+ - required
121
+ detail: "Checked against the source (2026-09-08): `verified_on` removed — read from LSLib's source,
122
+ which names no game version."
123
+ - id: bg3.toolchain.divine-game-flag-cli-allowed-values-excludes-unset
124
+ claim: The -g/--game argument's own AllowedValues list is exactly "dos;dosee;dos2;dos2de;bg3" — five
125
+ values. LSLib's internal GetGameByString switch statement also recognizes a sixth string,
126
+ "unset" (mapping to Game.Unset), but "unset" is absent from the CLI argument's AllowedValues,
127
+ so divine.exe itself rejects -g unset before that switch statement is ever reached; "unset" is
128
+ only reachable by code that calls into LSLib directly, not through the divine.exe CLI.
129
+ status: verified
130
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineArguments.cs:28 (AllowedValues); :226-257
131
+ (GetGameByString switch, including the "unset" case at :250-253 unreachable from the CLI's own
132
+ allow-list)
133
+ tags:
134
+ - divine
135
+ - cli
136
+ - game-flag
137
+ - unset
138
+ - unreachable-code
139
+ - id: bg3.toolchain.lslib.gr2-max-four-influences
140
+ claim: divine -a convert-model dae->gr2 fails with "GR2 only supports at most 4 vertex influences".
141
+ Blender's vertex_group_smooth can add a fifth influence AFTER vertex_group_limit_total(4) has
142
+ run, so cap the influences again as the last step before the COLLADA export.
143
+ status: verified
144
+ verified_on: 4.73.98.727 (Patch 8)
145
+ source: ModWright field verification
146
+ tags:
147
+ - divine
148
+ - gr2
149
+ - collada
150
+ - blender
151
+ - vertex-groups
152
+ - skinning
153
+ - export
154
+ detail: "Order that works: weight transfer, vertex_group_limit_total(4), vertex_group_smooth, then
155
+ vertex_group_limit_total(4) again immediately before export. The GR2 writer rejects the file
156
+ rather than truncating influences, so the failure is loud, unlike most of the worn-mesh
157
+ pipeline."
158
+ - id: bg3.toolchain.lslib.dae-mesh-order-is-gr2-mesh-index
159
+ claim: divine numbers the GR2's meshes in <library_geometries> order of the source COLLADA, and a
160
+ VisualBank ObjectID is "<GR2>.<meshname>.<index>". Blender's COLLADA exporter does not order
161
+ geometries by name (it put a second mesh first), so when the index matters, reorder the
162
+ <geometry> and matching <controller> blocks in the .dae before converting.
163
+ status: verified
164
+ verified_on: 4.73.98.727 (Patch 8)
165
+ source: ModWright field verification
166
+ tags:
167
+ - divine
168
+ - gr2
169
+ - collada
170
+ - blender
171
+ - mesh-order
172
+ - objectid
173
+ - visualbank
174
+ related:
175
+ - id: bg3.items.visualbank.gr2-mesh-name-must-match-objectid
176
+ detail: That fact fixes the middle segment of the ObjectID; this one fixes the trailing index.
177
+ - id: bg3.items.visualbank.objectid-mesh-order-vs-lod
178
+ detail: Check offline with divine -g bg3 -a convert-model gr2->dae and read the geometry order back;
179
+ no ModWright validator reads GR2 binaries, so this stays on the mesh-export checklist.
@@ -0,0 +1,242 @@
1
+ game: baldursgate3
2
+ topic: toolchain.lslib-formats
3
+ title: LSLib resource format internals (LSF/LSX/PAK versions, Divine CLI action set, .loca binary layout)
4
+ facts:
5
+ - id: bg3.toolchain.lslib-formats.divine-full-action-enumeration
6
+ claim: "divine.exe's --action argument accepts exactly these values: create-package, list-package,
7
+ extract-single-file, extract-package, extract-packages, convert-model, convert-models,
8
+ convert-resource, convert-resources, convert-loca, build-vt — any other value is rejected by
9
+ the argument parser's AllowedValues list."
10
+ status: verified
11
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineArguments.cs:85 (the Action argument's
12
+ AllowedValues)
13
+ tags:
14
+ - divine
15
+ - cli
16
+ - actions
17
+ - lslib
18
+ detail: "Checked against the source (2026-09-08): `verified_on` removed. The claim was read out of
19
+ LSLib's source, which names no game version; recording it against a BG3 build number would
20
+ have implied an in-engine observation that did not happen. The same applies to every other
21
+ source-read fact in this file."
22
+ related:
23
+ - id: bg3.toolchain.divine-core-tool
24
+ detail: Sharpens the existing "list-package, extract-package, create-package, convert-resource,
25
+ extract-single-file" summary with the complete, exact action-name enumeration read from
26
+ the argument parser's own allow-list, including convert-loca and the plural batch forms.
27
+ - id: bg3.toolchain.lslib-formats.batch-actions-need-explicit-formats
28
+ claim: The three batch actions are extract-packages, convert-models and convert-resources. For
29
+ convert-models/convert-resources a missing --input-format is a fatal argument error with the
30
+ message "Cannot perform batch action without --input-format and --output-format arguments";
31
+ --output-format is also read for those two (but not for extract-packages).
32
+ status: verified
33
+ verified_on: LSLib divine build dated 2026-01-24 (no --version flag), 2026-09-09
34
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineActions.cs:41-45 (batchActions list), :72-90
35
+ (validation)
36
+ tags:
37
+ - divine
38
+ - cli
39
+ - batch
40
+ - convert-resources
41
+ detail: 'Checked against the source (2026-09-08): an earlier wording generalised the error path. The
42
+ guard at :74-79 only logs that fatal message when the action is NOT extract-packages;
43
+ `GetResourceFormatByString(args.InputFormat)` is then called unconditionally at :81, so
44
+ `extract-packages` with no --input-format instead throws "Unknown resource format" from
45
+ CommandLineArguments.cs. Both mean --input-format is required in practice; only one of them
46
+ produces the quoted message. Machine run 2026-09-09: `divine -g bg3 -a extract-packages -s
47
+ <dir> -d <dir>` with no --input-format printed `Unhandled exception. System.ArgumentException:
48
+ Unknown resource format: ""` with a stack through
49
+ `CommandLineArguments.GetResourceFormatByString` and `CommandLineActions.SetUpAndValidate`,
50
+ exit code 127 — the extract-packages branch exactly as the review predicted. (`--input-format
51
+ pak` is rejected the same way, `Unknown resource format: "pak"`: the accepted values are
52
+ resource formats, not package formats.)'
53
+ - id: bg3.toolchain.lslib-formats.resource-format-enum-values
54
+ claim: divine.exe's --input-format/--output-format values are exactly lsb, lsf, lsj, lsx (case names
55
+ as matched by the CLI argument parser's switch statement).
56
+ status: contradicted
57
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineArguments.cs:62-75, :262-290
58
+ tags:
59
+ - divine
60
+ - cli
61
+ - resource-format
62
+ - lsx
63
+ - lsf
64
+ - lsj
65
+ - lsb
66
+ detail: "Checked against the source (2026-09-08): citation does not support the claim: the cited
67
+ switch (`GetResourceFormatByString`, :262-290) is only the resource-format helper; the
68
+ --input-format and --output-format arguments themselves declare AllowedValues =
69
+ \"dae;glb;gltf;gr2;lsv;pak;lsj;lsx;lsb;lsf\" (:65 and :75), ten values, so the CLI accepts six
70
+ more than this fact says. Superseded by
71
+ bg3.toolchain.lslib-formats.format-flags-accept-ten-values; kept per the format's rule that a
72
+ wrong belief stays recorded."
73
+ - id: bg3.toolchain.lslib-formats.format-flags-accept-ten-values
74
+ claim: divine.exe's -i/--input-format and -o/--output-format arguments each accept ten values — dae,
75
+ glb, gltf, gr2, lsv, pak, lsj, lsx, lsb, lsf — covering model formats (dae/glb/gltf/gr2),
76
+ package formats (lsv/pak) and resource formats (lsj/lsx/lsb/lsf). Only the four resource
77
+ formats are convertible by `GetResourceFormatByString`, which is what the batch/convert
78
+ actions call; any of the other six passed there throws "Unknown resource format".
79
+ status: verified
80
+ supersedes: bg3.toolchain.lslib-formats.resource-format-enum-values
81
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineArguments.cs:62-75 (both AllowedValues),
82
+ :262-290 (GetResourceFormatByString)
83
+ tags:
84
+ - divine
85
+ - cli
86
+ - resource-format
87
+ - input-format
88
+ - output-format
89
+ - id: bg3.toolchain.lslib-formats.package-compression-enum-values
90
+ claim: divine.exe create-package's compression argument — spelled `-c` / `--compression-method` on
91
+ the CLI, not `--compression` — accepts exactly zlibfast, zlib, lz4, lz4hc, or none; any other
92
+ string is rejected up front by the CLI argument parser and no package is written.
93
+ status: verified
94
+ verified_on: LSLib divine build dated 2026-01-24 (no --version flag), 2026-09-09
95
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineArguments.cs:90-97 (the --compression argument's
96
+ AllowedValues = "zlib;zlibfast;lz4;lz4hc;none")
97
+ tags:
98
+ - divine
99
+ - cli
100
+ - compression
101
+ - create-package
102
+ detail: "Checked against the source (2026-09-08): citation corrected. The originally cited lines are
103
+ `GetCompressionOptions`'s switch, which does NOT reject an unknown string — its `case
104
+ \"none\": default:` arm silently maps anything unrecognised to CompressionMethod.None. The
105
+ rejection the claim describes happens earlier, at the argument declaration's AllowedValues
106
+ list, which is now what this fact cites. Machine run 2026-09-09: the flag is `-c,
107
+ --compression-method` (`divine --help`); `--compression bogus` fails as `[FATAL] Unknown
108
+ argument found: compression.` before the value is even looked at, and `-c bogus` fails as
109
+ `[FATAL] Value bogus is not allowed for argument c(compression-method)`, exit 1, with no
110
+ output file. `-c none` (946 bytes for a two-file tree), `-c lz4`, `-c lz4hc`, `-c zlib` and
111
+ `-c zlibfast` each wrote a package. An earlier wording's `--compression` spelling was the
112
+ review's shorthand, not the CLI's; corrected in the claim."
113
+ - id: bg3.toolchain.lslib-formats.bg3-uses-lsx-v4-and-lsf-verbg3patch3
114
+ claim: For Game.BaldursGate3, LSLib's own per-game version tables select LSXVersion.V4 (the LSX
115
+ schema variant that "Replaces type IDs with type names") and LSFVersion.VerBG3Patch3 (0x07) —
116
+ both distinct from the D:OS 2 values (LSXVersion.V3 = 3; LSFVersion.VerExtendedNodes = 0x03)
117
+ that Divine would pick for -g dos2 or -g dos2de instead of -g bg3.
118
+ status: verified
119
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Enums/Game.cs:33-44 (LSFVersion switch) and :46-62
120
+ (LSXVersion switch); LSLib/LS/Enums/LSFVersion.cs:51-62 (LSXVersion V3/V4 with the "Replaces
121
+ type IDs with type names" comment), :18-38 (VerExtendedNodes 0x03 through VerBG3Patch3 0x07)
122
+ tags:
123
+ - divine
124
+ - lsx
125
+ - lsf
126
+ - version
127
+ - bg3
128
+ - lslib
129
+ detail: LSFVersion.VerBG3Patch3 is described in the enum's own doc comment as "BG3 Patch 3 version
130
+ with unknown additions" — LSLib's own author does not know what changed in that revision, only
131
+ that BG3's current release build needs it. MaxReadVersion and MaxWriteVersion are also both
132
+ 0x07 in this LSLib checkout, so this is the newest LSF revision the tool can produce.
133
+ - id: bg3.toolchain.lslib-formats.bg3-release-pak-is-packageversion-v18
134
+ claim: "Divine's -g bg3 selects PackageVersion.V18 (\"BG3 Release\") for create-package, distinct
135
+ from the BG3 Early Access versions the same enum also names: V15 (\"BG3 EA\") and V16 (\"BG3
136
+ EA Patch4\")."
137
+ status: verified
138
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Enums/PackageVersion.cs:5-12 (enum comments);
139
+ LSLib/LS/Enums/Game.cs:28 (PAKVersion switch, BaldursGate3 -> V18)
140
+ tags:
141
+ - divine
142
+ - pak
143
+ - packageversion
144
+ - bg3
145
+ detail: "Inference, not in the source: a pak built with an EA-era divine.exe or against the wrong -g
146
+ value would therefore carry a different package-version header. The enum and the switch are
147
+ all the cited source shows."
148
+ - id: bg3.toolchain.lslib-formats.pak-max-size-4gb-at-v16-plus
149
+ claim: LSLib's own MaxPackageSize table caps a package at 0x40000000 (1 GiB) for PackageVersion V15
150
+ and below, but 0x100000000 (4 GiB) for V16 and above — since BG3's release paks are V18 (see
151
+ bg3.toolchain.lslib-formats.bg3-release-pak-is-packageversion-v18), a single BG3 pak's
152
+ practical ceiling in this tool is 4 GiB, not 1 GiB.
153
+ status: verified
154
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Enums/PackageVersion.cs:9-11,20-30 (MaxPackageSize)
155
+ tags:
156
+ - divine
157
+ - pak
158
+ - packageversion
159
+ - size-limit
160
+ - packaging
161
+ detail: "Merged 2026-09-08 from the duplicate bg3.paks.practical-size-ceiling-is-4gib-not-1gib
162
+ (deleted), which restated this for the packaging topic: relevant when deciding whether a large
163
+ asset set (many high-res textures, several custom meshes) needs splitting across multiple
164
+ paks, and what ceiling ModWright's own pak-size validation should use for BG3."
165
+ - id: bg3.toolchain.lslib-formats.package-crc-only-v10-through-v16
166
+ claim: LSLib's HasCrc predicate is true only for PackageVersion V10 through V16 inclusive — BG3's
167
+ release package version (V18) is outside that range, so a BG3 release pak carries no per-file
168
+ CRC the way a D:OS 2 or BG3 EA pak would.
169
+ status: verified
170
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Enums/PackageVersion.cs:9-11 (V18 = BG3 Release), :15-18
171
+ (HasCrc)
172
+ tags:
173
+ - divine
174
+ - pak
175
+ - crc
176
+ - packageversion
177
+ - integrity
178
+ - packaging
179
+ detail: "Merged 2026-09-08 from the duplicate bg3.paks.release-pak-carries-no-per-file-crc
180
+ (deleted). Its extra consequence is this project's own conclusion, not something the enum
181
+ states: a corruption check on a BG3 release pak cannot rely on a per-file checksum stored in
182
+ the package and must compare against an external manifest (e.g. ModWright's build manifest) or
183
+ re-read the pak's listing."
184
+ - id: bg3.toolchain.lslib-formats.loca-binary-layout
185
+ claim: The compiled .loca binary format is a 12-byte header (Signature uint32 'LOCA' = 0x41434f4c,
186
+ NumEntries uint32, TextsOffset uint32) followed by one fixed-size entry record per handle (a
187
+ 64-byte Key buffer, then a uint16 Version, then a uint32 Length), with the actual text bytes
188
+ stored afterward starting at TextsOffset. LSLib's reader throws "Incorrect signature in
189
+ localization file" if the magic doesn't match.
190
+ status: verified
191
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Localization.cs:5-13 (LocaHeader), :16-42 (LocaEntry), :75-80
192
+ (signature check)
193
+ tags:
194
+ - localization
195
+ - loca
196
+ - binary-format
197
+ - lslib
198
+ related:
199
+ - id: bg3.loca.xml-location-and-format
200
+ detail: Adds the binary layout underneath the already-verified .xml-to-.loca compile step; explains
201
+ why the 64-byte Key field below matters.
202
+ - id: bg3.toolchain.lslib-formats.loca-key-64-byte-buffer
203
+ claim: A .loca entry's Key field is a fixed 64-byte buffer (KeyString reads it back up to the first
204
+ NUL and writes it by copying the UTF-8 bytes into a freshly zeroed 64-byte array); the setter
205
+ performs no length check, so a handle whose UTF-8 encoding exceeds 64 bytes makes convert-loca
206
+ throw and leaves a truncated .loca behind. A handle of exactly 64 bytes round-trips intact.
207
+ status: verified
208
+ verified_on: LSLib divine build dated 2026-01-24 (no --version flag), 2026-09-09
209
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Localization.cs:16-42 (LocaEntry.Key, KeyString getter/setter)
210
+ tags:
211
+ - localization
212
+ - loca
213
+ - handle
214
+ - buffer-limit
215
+ detail: "Inferred from the struct layout ([MarshalAs ... SizeConst = 64]) and the setter's
216
+ unconditional `Array.Copy(bytes, Key, bytes.Length)`. Checked against the source (2026-09-08):
217
+ an earlier wording said such a handle \"will be silently truncated or corrupted\". Nothing in
218
+ the source supports \"silently\" — an over-long copy into a 64-byte destination is the case
219
+ .NET's Array.Copy raises on, so a throw is at least as likely as truncation. Machine run
220
+ 2026-09-09 settled it: `divine -g bg3 -a convert-loca` on an XML whose contentuid is 65 ASCII
221
+ characters prints `[FATAL] Failed to convert localization file: Destination array was not long
222
+ enough. Check the destination index, length, and the array's lower bounds. (Parameter
223
+ 'destinationArray')`, exit code 102, and leaves a 12-byte .loca (header only) at the
224
+ destination — a throw, not silent truncation, but the partial output file is still written. 63
225
+ and 64 characters both convert (90-byte .loca) and read back with the full handle, so the
226
+ boundary is \"more than 64 bytes\", not \"reaches 64\". A standard BG3 handle (\"h\" +
227
+ UUID-with-g-separators, 33 characters) is far under the limit; the risk is only a
228
+ hand-authored non-standard handle name."
229
+ - id: bg3.toolchain.lslib-formats.build-vt-uses-source-not-destination
230
+ claim: For divine.exe's build-vt action, the --source argument is read as the virtual-texture config
231
+ path and a separate --vt-root argument supplies the VT root path; unlike every other action,
232
+ build-vt does not read a --destination argument at all (DestinationPath is only assigned when
233
+ the action is not list-package or build-vt).
234
+ status: verified
235
+ source: Norbyte/lslib@6f5f698 Divine/CLI/CommandLineActions.cs:100-104 (build-vt reads args.Source
236
+ and args.VTRoot), :131-135 (SourcePath always; DestinationPath only when the action is neither
237
+ list-package nor build-vt)
238
+ tags:
239
+ - divine
240
+ - cli
241
+ - build-vt
242
+ - virtual-texture
@@ -0,0 +1,177 @@
1
+ game: baldursgate3
2
+ topic: toolkit.levels
3
+ title: Level creation in the Toolkit — GUI-only scope boundary
4
+ facts:
5
+ - id: bg3.toolkit.levels.screen-archery-scope-not-gameplay-levels
6
+ claim: 'The most complete community-tested level-creation tutorial is explicitly scoped to virtual
7
+ photography: "It is written for virtual photography / screen archery in mind, and it will not
8
+ cover things you need to know to create actual gameplay levels."'
9
+ status: community
10
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level §Creating a New Level (opening
11
+ scope note)
12
+ tags:
13
+ - toolkit
14
+ - level
15
+ - scope-boundary
16
+ - gui-only
17
+ detail: ModWright's own reading of that gap — that new level geometry is Toolkit-GUI-only with no
18
+ text/LSX-first path documented the way there is for stats or dialogue, so levels are
19
+ validate-only rather than authorable — comes from ModWright research (its "Level (Toolkit)"
20
+ coverage row), not a claim the tutorial makes.
21
+ - id: bg3.toolkit.levels.roottemplate-required-before-placement
22
+ claim: An object cannot be dragged directly from the Resource Manager onto a level — it must first
23
+ exist as a RootTemplate (either an existing one, or a new one built for it) before it can be
24
+ placed; Resource Manager resources and RootTemplates are related but distinct, and only
25
+ RootTemplates ("Objects" in the level-building sense) are placeable.
26
+ status: community
27
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level
28
+ tags:
29
+ - toolkit
30
+ - level
31
+ - roottemplate
32
+ - gui-only
33
+ - id: bg3.toolkit.levels.local-template-vs-root-template
34
+ claim: Once a RootTemplate is placed in a level it becomes a "local template" — an override that can
35
+ carry per-instance changes (a unique face, armor, or stats) while still inheriting from the
36
+ shared root; editing the root modifies every local instance that inherits from it and hasn't
37
+ overridden that field itself.
38
+ status: community
39
+ source: docs.baldursgate3.game/index.php?title=Editor:_Navigation §Editing Templates
40
+ tags:
41
+ - toolkit
42
+ - level
43
+ - roottemplate
44
+ - local-template
45
+ - id: bg3.toolkit.levels.override-in-active-mod-required-before-edit
46
+ claim: 'A vanilla resource must be right-clicked and set to "Override in the Active Mod..." before
47
+ it becomes editable and is assigned to your mod; when asked "Do you want to keep the same
48
+ package structure?", select "Yes". Resource properties are then edited through their own
49
+ resource editors, not the Sidebar: "Properties of resources are not editable through the
50
+ Sidebar, but through special resource editors."'
51
+ status: community
52
+ source: docs.baldursgate3.game/index.php?title=Editor:_Navigation §Resources
53
+ tags:
54
+ - toolkit
55
+ - level
56
+ - override
57
+ - gui-only
58
+ - id: bg3.toolkit.levels.uuid-preferred-over-name-for-lookup
59
+ claim: Finding objects by UUID (copied via right-click "Copy Value to Clipboard" on a Sidebar
60
+ property) is preferred over searching by name in the Toolkit's Root Template Manager /
61
+ Resource Manager, since many unrelated objects can share the same display name while UUIDs are
62
+ always unique.
63
+ status: community
64
+ source: docs.baldursgate3.game/index.php?title=Editor:_Navigation §Editing Templates ("It's usually
65
+ better to find objects by UUID rather than by name, since many objects can share the same name
66
+ but their UUIDs will always be different")
67
+ tags:
68
+ - toolkit
69
+ - level
70
+ - uuid
71
+ - workflow
72
+ - id: bg3.toolkit.levels.distant-vs-local-light-probes
73
+ claim: "A LightProbe is one of two kinds: a Distant probe captures far-away sun/sky lighting and
74
+ applies to everything within the same LightingResources (a level needs at least one Distant
75
+ probe); a Local probe only captures nearby lights/objects within its own defined area, any
76
+ number of which can be placed (including nested inside another probe's area), with the
77
+ smallest probe's lighting always taking priority where areas overlap."
78
+ status: community
79
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level
80
+ tags:
81
+ - toolkit
82
+ - level
83
+ - lightprobe
84
+ - lighting
85
+ - id: bg3.toolkit.levels.lightprobe-render-requires-save-and-toggle
86
+ claim: "A LightProbe's baked HDRI lighting only updates after selecting the LightProbe and toggling
87
+ \"Infinite Capture\" or \"Enabled\" off and back on (\"I haven't figure out a better
88
+ consistent way\"), and the rendered HDRI maps are only written when the level itself is saved:
89
+ \"Whenever you make changes with a probe, you need to save your level in order for the
90
+ LightProbe to save the rendered HDRI maps\"."
91
+ status: community
92
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level
93
+ tags:
94
+ - toolkit
95
+ - level
96
+ - lightprobe
97
+ - save
98
+ - gui-only
99
+ - id: bg3.toolkit.levels.every-lightprobe-renders-per-lightingresource
100
+ claim: Every LightProbe in a level renders its HDRI capture once per LightingResource referenced by
101
+ the level's LightingTrigger, so a level with many probes and many LightingResources takes
102
+ proportionally longer to render — the guide recommends focusing on 1-4 LightingResources while
103
+ iterating, and only adding additional ones for the final render pass.
104
+ status: community
105
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level
106
+ tags:
107
+ - toolkit
108
+ - level
109
+ - lightprobe
110
+ - performance
111
+ - id: bg3.toolkit.levels.game-mode-photo-mode-combination-hangs-editor
112
+ claim: Switching between Game Mode and Editor Mode while Photo Mode is enabled makes the game window
113
+ unresponsive and forces a level reload; the in-game Main Menu button or loading a savegame
114
+ while in Game Mode inside the Toolkit similarly forces a force-quit-and-restart of the
115
+ Toolkit.
116
+ status: community
117
+ source: "docs.baldursgate3.game/index.php?title=Editor:_Navigation §Testing While Playing in the
118
+ Editor (\"Doing so causes the game window to become unresponsive and you'll have to reload the
119
+ level\"; using the in-game Main Menu button or loading a savegame: \"you'll end up having to
120
+ force-quit and restart the Toolkit\")"
121
+ tags:
122
+ - toolkit
123
+ - level
124
+ - game-mode
125
+ - photo-mode
126
+ - crash
127
+ - gui-only
128
+ - id: bg3.toolkit.levels.editor-camera-escapes-void-spawn
129
+ claim: A level offset from the world origin can spawn the player character in the void in Game Mode;
130
+ the documented recovery is switching to the Editor Camera (usable while in Game Mode), flying
131
+ to the level visually or via known coordinates, then pressing Ctrl+T over walkable terrain to
132
+ teleport the player character there.
133
+ status: community
134
+ source: docs.baldursgate3.game/index.php?title=Editor:_Navigation §Testing While Playing in the
135
+ Editor ("Remember how the level was offset a bit from the world origin? Well, now we've
136
+ spawned in the middle of the void and cannot move." — then fly with WASD and "When you've
137
+ found a bit of good, walkable terrain, hover your cursor over it and press Ctrl+T")
138
+ tags:
139
+ - toolkit
140
+ - level
141
+ - game-mode
142
+ - teleport
143
+ - workflow
144
+ - id: bg3.toolkit.levels.large-levels-slow-to-load-prefer-smaller
145
+ claim: Some levels contain many smaller sub-areas nested inside them (e.g. WLD_Main_A bundles the
146
+ Crashsite, Emerald Grove, Goblin Camp, Underdark, and more) and take proportionally longer to
147
+ load; loading a smaller, specifically-scoped level (e.g. WLD_Crashsite_D) instead saves
148
+ loading time while testing.
149
+ status: community
150
+ source: docs.baldursgate3.game/index.php?title=Editor:_Navigation §Loading a Level
151
+ tags:
152
+ - toolkit
153
+ - level
154
+ - load-time
155
+ - workflow
156
+ - id: bg3.toolkit.levels.terrain-console-teleport-command
157
+ claim: The console command TeleportPartiesToLevelWithMovie("YourLevelName","","") is the quickest
158
+ way to jump directly to a specific level for testing, where YourLevelName is the level's own
159
+ name, not the Toolkit project's name.
160
+ status: community
161
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level
162
+ tags:
163
+ - toolkit
164
+ - level
165
+ - console-command
166
+ - workflow
167
+ - id: bg3.toolkit.levels.removing-terrain-material-removes-all-painted-instances
168
+ claim: '"Removing a material from the terrain panel will remove all instances of that painted
169
+ material from the terrain" — the removal is retroactive over everything already painted, not
170
+ just a change to what you can paint next.'
171
+ status: community
172
+ source: wiki.bg3.community/en/Tutorials/Toolkit/Creating-a-new-level
173
+ tags:
174
+ - toolkit
175
+ - level
176
+ - terrain
177
+ - gotcha