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,214 @@
1
+ game: baldursgate3
2
+ topic: journal.quests
3
+ title: Journal structure, quest state DBs, and Osiris quest calls
4
+ facts:
5
+ - id: bg3.journal.quests.questupdate-requires-parent-quest-id
6
+ claim: "\"QuestUpdate always requires the parent quest ID to give out updates, even when updating a
7
+ subquest\" — so QuestUpdate((CHARACTER)_Player, (STRING)_QuestID, (STRING)_EntryID) takes the
8
+ top-level quest's ID in _QuestID and the subquest's entry in _EntryID, never the subquest's
9
+ own ID in _QuestID."
10
+ status: community
11
+ source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestUpdate
12
+ tags:
13
+ - journal
14
+ - questupdate
15
+ - subquest
16
+ - silent-failure
17
+ - id: bg3.journal.quests.questupdate-does-not-emit-a-journal-entry-by-itself
18
+ claim: '"The QuestUpdate call will also respect the quest step property to add or close the quest
19
+ for you", but "Adding or Closing a quest does not automatically give you a journal update...
20
+ You will always want to provide a quest update after adding or before closing a quest."'
21
+ status: community
22
+ source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestUpdate
23
+ tags:
24
+ - journal
25
+ - questupdate
26
+ - quest-state
27
+ - gotcha
28
+ - id: bg3.journal.quests.questupdate-two-arg-overload-implicit-player
29
+ claim: QuestUpdate has a two-argument overload, QuestUpdate((STRING)_QuestID, (STRING)_EntryID),
30
+ that omits the player parameter "since the quest is shared, everybody should get the update
31
+ anyway"; it "Overloads the engine call" (the three-argument version).
32
+ status: community
33
+ source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestUpdate
34
+ tags:
35
+ - journal
36
+ - questupdate
37
+ - overload
38
+ - id: bg3.journal.quests.questadd-questclose-should-be-avoided
39
+ claim: "QuestAdd and QuestClose exist for manually unlocking/closing a quest, but the documentation
40
+ recommends against both: \"It's better to avoid starting quests with this call and instead
41
+ rely on QuestUpdate\" and \"It's better to avoid closing quests with this call and instead
42
+ rely on QuestUpdate.\""
43
+ status: community
44
+ source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestAdd, >
45
+ QuestClose
46
+ tags:
47
+ - journal
48
+ - questadd
49
+ - questclose
50
+ - best-practice
51
+ - id: bg3.journal.quests.questupdateunlocked-reports-top-level-quest-id
52
+ claim: The QuestUpdateUnlocked event always receives the top-level parent quest as its _QuestID
53
+ parameter, even when the update that was unlocked belongs to a subquest;
54
+ SubQuestUpdateUnlocked is the separate event that fires specifically for subquest updates and
55
+ receives the subquest ID instead.
56
+ status: community
57
+ source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Events > QuestUpdateUnlocked,
58
+ > SubQuestUpdateUnlocked
59
+ tags:
60
+ - journal
61
+ - events
62
+ - subquest
63
+ - questupdateunlocked
64
+ - id: bg3.journal.quests.questisclosed-false-until-explicitly-closed
65
+ claim: The QuestIsClosed query "always returns false if the quest has not yet been explicitly
66
+ closed, even while it has not yet been accepted/added/opened/unlocked" — it does not
67
+ distinguish "not yet started" from "not yet closed."
68
+ status: community
69
+ source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Queries > QuestIsClosed
70
+ tags:
71
+ - journal
72
+ - questisclosed
73
+ - query
74
+ - gotcha
75
+ detail: "Separate caution for Script Extender work: this is the in-story Osiris query. Reading
76
+ Osiris queries through SE's Osi bridge is separately unreliable in the build recorded here —
77
+ see bg3.se.osi-queries-broken-actions-work (verified: Osi actions work, Osi queries return
78
+ junk)."
79
+ - id: bg3.journal.quests.db-questdef-state-reacts-to-flag
80
+ claim: "DB_QuestDef_State(_Flag, _Quest, _Update) is a declarative database: defining it unlocks
81
+ _Update in _Quest as soon as _Flag is set. If _Flag is global, the update unlocks for every
82
+ player; otherwise it unlocks only for the specific character the flag was set on."
83
+ status: community
84
+ source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Declarative Databases ("When
85
+ _Flag is set, unlock _Update in _Quest")
86
+ tags:
87
+ - journal
88
+ - db-questdef-state
89
+ - declarative-database
90
+ - flags
91
+ - id: bg3.journal.quests.db-questdef-chainedstate-links-entries
92
+ claim: DB_QuestDef_ChainedState(_Quest, _Step, _NewStep) declares that unlocking _Step in _Quest
93
+ automatically unlocks _NewStep in the same quest; a 4-parameter overload,
94
+ DB_QuestDef_ChainedState(_Quest, _Step, _NewQuest, _NewStep), links a step in one quest to a
95
+ step in a different quest.
96
+ status: community
97
+ source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Linking Quest Entries ("When
98
+ _Step in _Quest is unlocked, so is _NewStep [in _NewQuest]")
99
+ tags:
100
+ - journal
101
+ - db-questdef-chainedstate
102
+ - declarative-database
103
+ - id: bg3.journal.quests.db-questdef-conditionalstate-defined-multiple-times
104
+ claim: DB_QuestDef_ConditionalState (in its 5/6/7-parameter forms) works like
105
+ DB_QuestDef_ChainedState but can be defined multiple times for the same unlock, letting an
106
+ entry unlock conditionally on different combinations of a separate step's boolean state.
107
+ status: community
108
+ source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Entries Conditional to Other
109
+ Entries ("Similar to DB_QuestDef_ChainedState, but they can be defined multiple times")
110
+ tags:
111
+ - journal
112
+ - db-questdef-conditionalstate
113
+ - declarative-database
114
+ - id: bg3.journal.quests.qry-questdef-blockquestupdate-is-the-exception-hook
115
+ claim: QRY_QuestDef_BlockQuestUpdate((CHARACTER)_Player, (STRING)_Quest, (STRING)_Update) is checked
116
+ by every declarative database rule before it calls QuestUpdate; defining this query to return
117
+ false for a specific player/quest/update combination is the documented way to carve out a
118
+ last-minute exception to an otherwise-automatic quest-state rule.
119
+ status: community
120
+ source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Adding Exceptions to Declarative
121
+ Database Rules ("Every declarative database rule will also check if this QRY returns false
122
+ before calling the QuestUpdate")
123
+ tags:
124
+ - journal
125
+ - qry-questdef-blockquestupdate
126
+ - exception
127
+ - id: bg3.journal.quests.db-questdef-companionleft-reason-steps
128
+ claim: "DB_QuestDef_State_CompanionLeft((TAG)_CompanionTag, (STRING)_Quest, (STRING)_Reason) links a
129
+ companion's REALLY_ORIGIN tag to that companion's journal quest and to a _Reason, which is \"a
130
+ quest step defined in the journal; it explains the reason for the companion leaving\". Three
131
+ _Reason steps \"are generic and should be defined in any companion's journal\":
132
+ CompanionLowRelation, CompanionMurdered, CompanionHostile."
133
+ status: community
134
+ source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Companions ("_CompanionTag
135
+ refers to the REALLY_ORIGIN tag a companion has")
136
+ tags:
137
+ - journal
138
+ - companion
139
+ - db-questdef-companionleft
140
+ - tags
141
+ detail: PROC_Origins_CompanionLeavePermanently() is what writes the reason step, picking
142
+ CompanionLowRelation by default, CompanionMurder if GLO_Companion_Murder is set, or
143
+ CompanionHostile if GLO_Companion_Combat is set — so a custom companion missing those three
144
+ steps loses the default leave-reason updates.
145
+ - id: bg3.journal.quests.level-transition-dbs-close-on-point-of-no-return
146
+ claim: DB_QuestDef_LevelLoaded and DB_QuestDef_LevelUnloading fire (via PROC_LevelLoadedOnce /
147
+ PROC_LevelUnloading respectively) to give a quest update to all players on entering or leaving
148
+ a named level; their documented typical use is closing quest entries a player can no longer
149
+ complete once they progress past a region they can't return to.
150
+ status: community
151
+ source: 'docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Leaving/Entering a Region
152
+ ("Typical use: For closing entries, when a quest must close when the player progresses to the
153
+ next region")'
154
+ tags:
155
+ - journal
156
+ - level-transition
157
+ - db-questdef-levelloaded
158
+ - id: bg3.journal.quests.party-shared-state-dbs-checked-not-defined
159
+ claim: DB_QuestIsAccepted(_QuestID), DB_QuestIsOpened(_QuestID), and DB_QuestIsClosed(_QuestID) are
160
+ set automatically by the engine and are meant to be checked, not defined by mod authors; all
161
+ three also apply to subquests, not only top-level quests.
162
+ status: community
163
+ source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Party Shared Quest State ("These
164
+ DBs are set automatically and can be checked"; "Subquests are also added to the above DBs")
165
+ tags:
166
+ - journal
167
+ - party-shared-state
168
+ - database
169
+ - id: bg3.journal.quests.questupdate-helper-queries-signatures
170
+ claim: "Three generated helper queries exist alongside QuestUpdate: QuestUpdateExists(questID,
171
+ stateID), QuestUpdateGetTopLevel(questID, stateID), and QuestUpdateIsUnlocked(character,
172
+ quest, update) — the latter taking a character parameter the first two don't, confirming it is
173
+ the per-player unlock check rather than a global existence check."
174
+ status: verified
175
+ source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:1988 (QuestUpdateExists), :1993
176
+ (QuestUpdateGetTopLevel), :1999 (QuestUpdateIsUnlocked)
177
+ detail: "Checked against the source (2026-09-08): `verified_on` removed — read from a generated stub
178
+ file that names no game version. Verified as declared signatures only; what the queries return
179
+ at runtime was not observed."
180
+ tags:
181
+ - journal
182
+ - questupdate
183
+ - signature
184
+ - osiris
185
+ - id: bg3.journal.quests.questupdaterevert-and-questcloseverted-exist
186
+ claim: Beyond QuestUpdate/QuestAdd/QuestClose, the generated stubs also declare
187
+ QuestUpdateRevert(character, questID, stateID) as a call and QuestCloseReverted(questID) as an
188
+ event. The existence of a revert call and a revert event is all the stub file shows; no source
189
+ read here documents what reverting does or when the event fires.
190
+ status: verified
191
+ source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3583 (QuestUpdateRevert);
192
+ generated/Osi.Events.lua:864 (QuestCloseReverted). Osi.Events.lua:875 also declares
193
+ QuestUpdateUnlockReverted(character, topLevelQuestID, stateID)
194
+ tags:
195
+ - journal
196
+ - questupdaterevert
197
+ - questclosereverted
198
+ - signature
199
+ - id: bg3.journal.quests.questupdatemessagecounter-adjusts-message-count
200
+ claim: Osi.QuestUpdateMessageCounter(messageId, deltaUpdateAmount) is a separate call from
201
+ QuestUpdate that adjusts a message/notification counter by a delta amount rather than
202
+ unlocking a journal entry — its existence in the generated stub file means a mod could
203
+ increment or decrement a quest-related counter without triggering a full QuestUpdate.
204
+ status: inferred
205
+ source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3576-3578
206
+ tags:
207
+ - journal
208
+ - questupdatemessagecounter
209
+ - signature
210
+ detail: Inferred from the function name and parameter names alone (messageId, deltaUpdateAmount) —
211
+ neither the community Journal:Osiris_Calls page nor any other source on disk documents this
212
+ call's semantics or when the engine invokes the corresponding
213
+ QuestUpdateUnlockReverted/QuestUpdateUnlocked events that appear alongside it in
214
+ Osi.Events.lua.
@@ -0,0 +1,128 @@
1
+ game: baldursgate3
2
+ topic: loadorder.modsettings
3
+ title: Load order, modsettings.lsx, and dependency resolution
4
+ facts:
5
+ - id: bg3.loadorder.external-guid-dependencies
6
+ claim: "Borrowing another mod's assets (a RootTemplate referencing a VisualTemplate /
7
+ EquipmentTypeID — or any resource GUID — defined in a different mod) creates a load-order
8
+ dependency: that mod must be enabled AND ordered before yours in modsettings.lsx. If it is
9
+ missing from the enabled list the game CTDs at LoadModule — no dangling-name error, and your
10
+ own reference-checker stays green because the name resolves fine inside your files."
11
+ status: verified
12
+ source: ModWright field verification
13
+ tags:
14
+ - load-order
15
+ - dependencies
16
+ - guids
17
+ - roottemplate
18
+ detail: "A class mod hit this while borrowing Whips Expanded / BetterWhips assets (VisualTemplate
19
+ 1c66562c, EquipmentTypeID e9b4ae39): the mod must load AFTER BetterWhips or these refs won't
20
+ resolve. The crash looks like your own bug. Referencing a GUID is not the same as defining it
21
+ — both mods can reference a third."
22
+ - id: bg3.loadorder.modsettings-crash-guard
23
+ claim: BG3's crash-guard auto-disables a mod after repeated crashes (the in-game manager shows it
24
+ off even though modsettings still lists it; the save screen shows a "Mod Verification /
25
+ Missing or Disabled" checkbox). Every launch test after a crash streak must confirm the module
26
+ was actually ACTIVE, or the "it loads now" result is meaningless.
27
+ status: verified
28
+ source: ModWright field verification
29
+ tags:
30
+ - load-order
31
+ - crash-guard
32
+ - auto-disable
33
+ detail: '"Half our bisect arms were confounded by this" during the 2026-08-31 launch-CTD marathon.'
34
+ - id: bg3.loadorder.modsettings-not-durable
35
+ claim: A hand-added modsettings.lsx entry is not durable — a mod-manager deploy (Vortex) rewrites
36
+ the file and silently drops it, so a previously-working setup starts crashing with no content
37
+ change on your side. The in-game mod manager also rewrites modsettings.lsx when the mod list
38
+ is edited and strips hand-inserted loose-mod entries.
39
+ status: verified
40
+ source: ModWright field verification
41
+ tags:
42
+ - load-order
43
+ - modsettings
44
+ - vortex
45
+ - volatility
46
+ detail: 'Suspect this whenever a build that loaded fine starts CTDing after an unrelated repack.
47
+ Back the file up before editing; validate with [xml]$x = Get-Content ... -Raw afterwards. Grep
48
+ gotchas that cause false "not found" conclusions here: PowerShell Select-String -SimpleMatch
49
+ treats a|b as a literal string, and -Path treats [PAK]-style brackets as wildcards (use
50
+ -LiteralPath or [System.IO.File]::ReadAllText).'
51
+ - id: bg3.loadorder.dependency-diagnostic
52
+ claim: "To diagnose a load-order CTD: (1) tail bin\\network.*.log — LoadModule means module/asset
53
+ load, not a level transition (bin\\CrashDump*.dmp timestamps confirm the attempt). (2) Extract
54
+ the deployed pak and convert RootTemplates/_merged.lsf to lsx; grep VisualTemplate /
55
+ EquipmentTypeID values. (3) For each external GUID, extract the candidate provider pak and
56
+ confirm it DEFINES it (a VisualBank region _merged.lsf <attribute id=\"ID\" ...>, or
57
+ EquipmentTypes.lsx UUID). (4) Check the enabled list in %LOCALAPPDATA%\\Larian
58
+ Studios\\Baldur's Gate 3\\PlayerProfiles\\Public\\modsettings.lsx (order = top-to-bottom; the
59
+ dependency must come first)."
60
+ status: verified
61
+ source: ModWright field verification
62
+ tags:
63
+ - load-order
64
+ - dependencies
65
+ - diagnostic
66
+ detail: This is the standard dependency debugging workflow; the crash looks like a content bug until
67
+ you trace the GUID origins.
68
+ - id: bg3.loadorder.modmanager-skips-order-entries-with-no-local-mod-match
69
+ claim: "When BG3 Mod Manager builds its final dependency-resolved output list (BuildOutputList) from
70
+ a load order, an order entry whose UUID does not match any mod the manager has actually
71
+ indexed on disk is logged as \"[*ERROR*] Missing mod for mod in order: '<Name>'.\" and
72
+ excluded from the built list, rather than the build failing outright. BuildOutputList also
73
+ skips order entries already flagged Missing before it starts (`order.Where(x =>
74
+ !x.Missing)`)."
75
+ status: verified
76
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:1431-1465
77
+ (BuildOutputList; the log line at :1462)
78
+ tags:
79
+ - load-order
80
+ - missing-mod
81
+ - bg3modmanager
82
+ - silent-omission
83
+ related:
84
+ - id: bg3.loadorder.modsettings-crash-guard
85
+ detail: "A different mechanism producing a similar symptom: here the mod manager itself quietly
86
+ drops an order entry it cannot resolve locally, distinct from the game's own crash-guard
87
+ auto-disabling a mod after a crash streak — both can make an \"enabled\" mod not actually
88
+ end up active."
89
+ - id: bg3.loadorder.modsettings-not-rewritten-by-a-plain-launch
90
+ claim: "Launching the game and loading a save does not by itself rewrite modsettings.lsx: the file
91
+ keeps its previous content and modification time across launches, and its ModuleShortDesc
92
+ Folder attribute therefore records the module folder the mod manager last bound the UUID to,
93
+ not the copy the running game loaded. It is rewritten when the mod list is edited (the in-game
94
+ manager, Vortex, BG3 Mod Manager)."
95
+ status: verified
96
+ verified_on: 4.73.98.727 (Patch 8)
97
+ source: ModWright field verification
98
+ tags:
99
+ - load-order
100
+ - modsettings
101
+ - launch
102
+ - folder
103
+ - uuid
104
+ detail: "Consequence for diagnosis: with several installed copies of one UUID, the Folder attribute
105
+ cannot tell you which copy the game bound to at the last launch; read the content back through
106
+ the Script Extender (Ext.Stats.Get on an entry unique to one copy, or ModWright's
107
+ bg3.stat.exists probe) instead. ModWright's own load_order guidance used to say the game
108
+ \"rewrites modsettings.lsx on launch\"; that is the mod-manager case in
109
+ bg3.loadorder.modsettings-not-durable, not a plain launch."
110
+ - id: bg3.loadorder.profile-activemods-drives-current-order-not-modsettings-order-alone
111
+ claim: BG3 Mod Manager reconstructs "the current load order" from a profile by reading the
112
+ ActiveMods list recorded under modsettings.lsx's Mods node and matching each entry's UUID
113
+ against its own indexed mod list in that same sequence, skipping any UUID it cannot match —
114
+ the DivinityProfileData model documents ActiveMods explicitly as "The mod data under the Mods
115
+ node, from modsettings.lsx".
116
+ status: verified
117
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Models/DivinityProfileData.cs:21-24 (the
118
+ ActiveMods field and its doc comment), :26-39 (GetLoadOrder walking ActiveMods in order)
119
+ detail: "Inference, not in the source: because the manager rebuilds \"Current\" purely from that
120
+ list, the Mods node's child order in modsettings.lsx is the order it reflects back — there is
121
+ no separate order file involved in this path. Checked against the source (2026-09-08):
122
+ `verified_on` removed; this is read from the mod manager's source, which names no game
123
+ version."
124
+ tags:
125
+ - load-order
126
+ - modsettings
127
+ - activemods
128
+ - bg3modmanager
@@ -0,0 +1,92 @@
1
+ game: baldursgate3
2
+ topic: localization.handles
3
+ title: Localization handles, UUID mapping, and field-specific formatting
4
+ facts:
5
+ - id: bg3.loca.handle-is-uuid-with-g-separators
6
+ claim: 'A loca handle IS a UUID with an h prefix and dashes→g: uuid abcd1234-... ↔ handle
7
+ habcd1234g.... The game shows "Not Found" for a human-readable handle such as
8
+ h_Em_Example_DisplayName.'
9
+ status: verified
10
+ source: ModWright field verification
11
+ tags:
12
+ - localization
13
+ - handles
14
+ - uuid
15
+ - format
16
+ detail: 'Generate deterministically: "h" + str(uuid.uuid5(MOD_UUID, key)).replace("-","g"). All four
17
+ dashes of the UUID become g characters; the underlying UUID is unchanged.'
18
+ - id: bg3.loca.display-name-format
19
+ claim: Stat fields DisplayName and Description use the h..g..;<version> handle form. But some fields
20
+ (TooltipUpcastDescription, ExtraDescription) take the raw dash-UUID form (abcd1234-...). Match
21
+ the form the field expects; the underlying UUID is the same.
22
+ status: verified
23
+ source: ModWright field verification
24
+ tags:
25
+ - localization
26
+ - handles
27
+ - field-specific
28
+ - format
29
+ detail: The engine maps the raw dash-UUID form to the same loca entry. This inconsistency is a
30
+ common mistake source.
31
+ - id: bg3.loca.xml-location-and-format
32
+ claim: Loca lives in Mods/<Mod>/Localization/English/<Mod>.xml as <content contentuid="h..."
33
+ version="1">text</content>. The .xml must be compiled to the binary .loca, which is what ships
34
+ in the pak and is required at runtime.
35
+ status: verified
36
+ source: ModWright field verification
37
+ tags:
38
+ - localization
39
+ - xml
40
+ - loca
41
+ - format
42
+ detail: Compile with Divine.exe -g bg3 -a convert-loca -s <src>.xml -d <out>.loca. See
43
+ bg3.toolchain.loca-compilation.
44
+ - id: bg3.loca.description-params-inheritance
45
+ claim: DescriptionParams only substitutes into [1]-style placeholders; harmless if the text has
46
+ none, but inherited params (via `using`) can be stale — clear them when reskinning.
47
+ status: verified
48
+ source: ModWright field verification
49
+ tags:
50
+ - localization
51
+ - params
52
+ - reskin
53
+ - inheritance
54
+ detail: Set DescriptionParams "" to clear inherited params that no longer apply to the reskinned
55
+ spell/item.
56
+ - id: bg3.loca.entry-version-is-uint16
57
+ claim: A compiled .loca entry's Version field (the number after the ";" in a handle reference such
58
+ as "h...;<version>", and the same number as the .xml content tag's version attribute) is
59
+ stored as a 16-bit unsigned integer in the binary format — a version number above 65535 cannot
60
+ be represented and would wrap or fail to compile correctly.
61
+ status: inferred
62
+ source: Norbyte/lslib@6f5f698 LSLib/LS/Localization.cs:22 (`public UInt16 Version;` in LocaEntry)
63
+ tags:
64
+ - localization
65
+ - loca
66
+ - version
67
+ - binary-format
68
+ detail: Inferred from the struct field type (UInt16 Version) rather than observed failing — no
69
+ vanilla or known mod content has been checked against this ceiling, but no hand-authored mod
70
+ is likely to approach it either, since version numbers only increment when a line's text
71
+ changes.
72
+ - id: bg3.loca.magic-signature-and-numentries-header
73
+ claim: A compiled .loca file opens with a 4-byte magic signature spelling 'LOCA' (0x41434f4c)
74
+ followed by a uint32 entry count and a uint32 byte offset where the actual text payload
75
+ begins; LSLib's reader throws "Incorrect signature in localization file" on any file that
76
+ doesn't start with that exact magic.
77
+ status: verified
78
+ source: "Norbyte/lslib@6f5f698 LSLib/LS/Localization.cs:5-13 (LocaHeader:
79
+ Signature/NumEntries/TextsOffset, DefaultSignature 0x41434f4c), :75-80 (the signature check
80
+ and its InvalidDataException)"
81
+ detail: "Checked against the source (2026-09-08): `verified_on` removed — read from LSLib's source,
82
+ which names no game version."
83
+ tags:
84
+ - localization
85
+ - loca
86
+ - binary-format
87
+ - magic-signature
88
+ related:
89
+ - id: bg3.loca.xml-location-and-format
90
+ detail: Adds the compiled .loca file's exact binary header shape underneath the already-verified
91
+ statement that .loca is what ships in the pak and is required at runtime — this is the
92
+ format LSLib's reader validates before trusting the rest of the file.
@@ -0,0 +1,111 @@
1
+ game: baldursgate3
2
+ topic: misc.encoding-and-practice
3
+ title: Version encoding, UTF-8 handling, reference checking, and development practices
4
+ facts:
5
+ - id: bg3.encoding.version64-format
6
+ claim: "Mod version in meta.lsx: Version64 = (major<<55) | (minor<<47) | (revision<<31) | build.
7
+ Decode/encode in Python: def enc(ma,mi,rev,bld): return (ma<<55)|(mi<<47)|(rev<<31)|bld; def
8
+ dec(v): return (v>>55, (v>>47)&0xFF, (v>>31)&0xFFFF, v&0x7FFFFFFF). Bump revision for
9
+ iterative builds. Bumping the version does NOT break loading an existing save."
10
+ status: verified
11
+ verified_on: 4.73.98.727 (Patch 8)
12
+ source: ModWright field verification
13
+ tags:
14
+ - version
15
+ - encoding
16
+ - meta.lsx
17
+ detail: The revision field (bits 31–46) is the primary field for dev iteration; major/minor rarely
18
+ change.
19
+ - id: bg3.encoding.utf8-bom-corruption
20
+ claim: PowerShell 5.1 Set-Content -Encoding utf8 writes a UTF-8 BOM — stats .txt and .lsx files must
21
+ stay BOM-less. Use Python or careful byte writes for surgical edits to game-parsed files.
22
+ status: verified
23
+ verified_on: 4.73.98.727 (Patch 8)
24
+ source: ModWright field verification
25
+ tags:
26
+ - encoding
27
+ - utf-8
28
+ - bom
29
+ - powershell
30
+ detail: The BOM is invisible but breaks parsing. Found in the 2026-08-31 launch-CTD bisect.
31
+ - id: bg3.practice.reference-checker-invaluable
32
+ claim: A static reference checker — a script that verifies every
33
+ SpellList/DefaultValues/SelectSpells/ApplyStatus/RootSpellID/`using` reference resolves
34
+ against your stats plus a vanilla stats extract — catches the dangling-ref CTDs before
35
+ packing. Invaluable; run it before every pack.
36
+ status: verified
37
+ verified_on: 4.73.98.727 (Patch 8)
38
+ source: ModWright field verification
39
+ tags:
40
+ - tools
41
+ - reference-checking
42
+ - automation
43
+ detail: A class mod's reference-checking script is the reference implementation; it later grew drift
44
+ checks for hardcoded enumerations (the per-slot SpellId enumeration behind an on-cast charge
45
+ passive).
46
+ - id: bg3.practice.diagnostic-with-every-fix
47
+ claim: Pair a diagnostic with every bug-fix from the first attempt. Don't ship a blind fix and wait
48
+ a relaunch cycle. A visible marker (a temporary distinctive boost, a visible status, an SE
49
+ print/dump) gives ground truth in one cycle instead of guessing over many.
50
+ status: verified
51
+ verified_on: 4.73.98.727 (Patch 8)
52
+ source: ModWright field verification
53
+ tags:
54
+ - testing
55
+ - diagnostics
56
+ - debugging
57
+ detail: A spell-slot-display bug cost 3 blind cycles before an SE Ext.StaticData dump gave the
58
+ answer in one, and a character-level weapon gate was proven dead in one cycle by pairing it
59
+ with a visible "+1 Thunder" marker.
60
+ - id: bg3.practice.unproven-token-verification
61
+ claim: When a token/mechanism is unproven (no vanilla precedent), assume it may not work and verify
62
+ with a diagnostic before building a whole system on it.
63
+ status: verified
64
+ verified_on: 4.73.98.727 (Patch 8)
65
+ source: ModWright field verification
66
+ tags:
67
+ - testing
68
+ - verification
69
+ - risky-patterns
70
+ detail: "Example: IsWeaponOfProficiencyGroup in an equip passive's Boosts had zero vanilla precedent
71
+ and was proven in-game on a gloves item before being relied on (see
72
+ bg3.weapons.weapon-category-gated-equipment-bonus)."
73
+ - id: bg3.practice.incremental-testing
74
+ claim: Test after every addition — don't stack multiple untested features. A static
75
+ reference-checker catches dangling-ref CTDs, but functor/status-field errors only surface
76
+ in-engine (usually logged, sometimes CTD). If a batch breaks, bisect.
77
+ status: verified
78
+ verified_on: 4.73.98.727 (Patch 8)
79
+ source: ModWright field verification
80
+ tags:
81
+ - testing
82
+ - incremental
83
+ - bisect
84
+ detail: One untested phase stacked on another was the core failure mode of an earlier mod; the class
85
+ mod's workflow that followed has a per-phase testing checklist for this reason.
86
+ - id: bg3.practice.se-console-dumps
87
+ claim: 'An SE console dump (Ext.StaticData) settles "is my data wrong or is the UI wrong" questions:
88
+ it shows what the engine actually loaded. The Class Features investigation used it to prove
89
+ the ProgressionDescriptions and progression table were loaded and correct, which moved the bug
90
+ to the UI side.'
91
+ status: verified
92
+ verified_on: 4.73.98.727 (Patch 8)
93
+ source: ModWright field verification
94
+ tags:
95
+ - testing
96
+ - script-extender
97
+ - diagnostics
98
+ detail: The dump confirmed 9 ProgressionDescriptions loaded and matched to the exact boosts, the
99
+ progression table loaded with 13 nodes, and 419 ProgressionDescriptions / 1019 Progressions in
100
+ static data overall.
101
+ - id: bg3.practice.manual-path-first
102
+ claim: If a manual/GUI path is >99% likely to work and the headless path is unproven, OFFER THE
103
+ MANUAL PATH FIRST.
104
+ status: community
105
+ source: ModWright research
106
+ tags:
107
+ - practice
108
+ - automation
109
+ - manual
110
+ detail: 'A behavioural rule for assistants rather than a BG3 engine fact: automate what is certain,
111
+ offer manual routes when they are safer. The CP2077 "sector saga" violated it and cost time.'