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,144 @@
1
+ game: baldursgate3
2
+ topic: origins.companions
3
+ title: Custom origin creation (manual/non-Toolkit method)
4
+ facts:
5
+ - id: bg3.origins.companions.moderate-difficulty-manual-method
6
+ claim: "\"This tutorial is considered moderate difficulty–you are expected to already be familiar
7
+ with code editing and searching BG3's files for the info you need.\" It documents the manual
8
+ (non-Toolkit) method; a separate page, \"Creating Custom Origins In Toolkit\", covers the
9
+ Toolkit route."
10
+ status: community
11
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
12
+ tags:
13
+ - origin
14
+ - difficulty
15
+ - toolkit
16
+ - manual-method
17
+ - id: bg3.origins.companions.regenerate-uuid-find-replace-warning
18
+ claim: The custom-origin template repeatedly marks placeholder UUIDs with "Regenerate this!"
19
+ comments; the recommended fix is VS Code's "Replace in Files" to replace every occurrence of a
20
+ given UUID across the whole template at once, specifically to avoid UUIDs that don't link up
21
+ between files, which the guide calls out as a cause of crashes.
22
+ status: community
23
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
24
+ tags:
25
+ - origin
26
+ - uuid
27
+ - crash
28
+ - find-replace
29
+ - id: bg3.origins.companions.origins-lsx-tag-must-be-a-real-origin-tag
30
+ claim: The default origin tags in the template are fine for a Tav-like origin; "If you want a Durge
31
+ origin, you'll have to swap in the REALLY_DARK_URGE tag". Origins.lsx's ReallyTags must name a
32
+ tag that exists — an existing origin's tag works ("Heck, you could even put in another
33
+ origin's tag if you wanted, but it probably wouldn't make a lot of narrative sense").
34
+ status: community
35
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
36
+ tags:
37
+ - origin
38
+ - origins-lsx
39
+ - tags
40
+ - id: bg3.origins.companions.cc-body-race-swap-causes-floating-heads
41
+ claim: Making a custom origin's body type or race editable in character creation doesn't work
42
+ reliably with the template's setup and produces symptoms like floating heads; the tutorial
43
+ author states they hadn't found a fix for this as of writing.
44
+ status: community
45
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
46
+ tags:
47
+ - origin
48
+ - character-creation
49
+ - floating-heads
50
+ - known-bug
51
+ - id: bg3.origins.companions.cc-editable-scar-resets-to-default
52
+ claim: If a custom origin is made editable in character creation, any scar preset baked into its
53
+ Character Visuals resets to "no scar" and the player has to reselect it manually; scars are
54
+ fine only when the origin's appearance is kept locked (not editable).
55
+ status: community
56
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
57
+ tags:
58
+ - origin
59
+ - character-creation
60
+ - scars
61
+ - character-visuals
62
+ - known-bug
63
+ - id: bg3.origins.companions.custom-colors-need-mergedinto-on-race
64
+ claim: Custom eye/hair/skin colors on an origin reset in character creation when the game can't find
65
+ them as part of the race's defaults — "If the game can't find their custom colors as part of
66
+ the race defaults, it'll reset to the first color in the race's list" — and the fix is to add
67
+ those colors to the origin's race using MergedInto.
68
+ status: community
69
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
70
+ tags:
71
+ - origin
72
+ - character-creation
73
+ - mergedinto
74
+ - colors
75
+ - silent-failure
76
+ - id: bg3.origins.companions.crash-without-worldcharacter-equivalent-file
77
+ claim: The custom-origin template includes a file that defines the character in the world itself
78
+ (separate from the origin-list entry and the CC-preset template); the tutorial author reports
79
+ the game crashed when that file was omitted, even though its exact necessity for an origin
80
+ wasn't fully understood.
81
+ status: community
82
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
83
+ tags:
84
+ - origin
85
+ - crash
86
+ - world-character
87
+ - id: bg3.origins.companions.vanilla-tav-voice-uuids
88
+ claim: A custom origin can be pinned to a single fixed voice by building a custom voice table
89
+ containing only one of the vanilla Tav voice UUIDs — voice 1
90
+ 24247531-c432-4f0f-8f35-6c90c4844aa8, voice 2 869248f0-468a-4747-82d7-e8efc3bbcacf, voice 3
91
+ 4df6dba0-8574-4704-a9fb-a500da38e1e1, voice 4 3347e417-d7ad-4088-bdd6-d5565efcd815, voice 5
92
+ f5b335b2-9cd9-4b38-a4c1-458b846ab499, voice 6 b9b26a44-943b-4427-9890-d81c7e81a75b, voice 7
93
+ 2d206fda-0d4f-457f-b4ea-0fc18866f5dd, voice 8 fb6b5353-8d14-4507-9222-ceaec990fce9 — set into
94
+ a table's SpeakerUUID field and assigned back in Origins.lsx.
95
+ status: community
96
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
97
+ tags:
98
+ - origin
99
+ - voice
100
+ - uuid
101
+ - id: bg3.origins.companions.pickable-voice-table-uuid
102
+ claim: To let the player pick a voice for a custom origin in character creation (instead of a fixed
103
+ one), Origins.lsx's voice table field should be set back to the vanilla pickable-voice table
104
+ UUID 5ee56242-d07c-482e-9260-24529d1473a3.
105
+ status: community
106
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
107
+ tags:
108
+ - origin
109
+ - voice
110
+ - uuid
111
+ - id: bg3.origins.companions.custom-portrait-requires-generator-trigger
112
+ claim: A custom generated portrait for a custom origin requires setting up a trigger/camera-trigger
113
+ pair that fires on game start and level up, positioned using in-game coordinates (obtained
114
+ e.g. via the Script Extender console command "_P(Osi.GetPosition(GetHostCharacter()))"); it
115
+ only affects the origin-selection icon, and the pose used is whatever the origin's
116
+ race/bodytype default pose is.
117
+ status: community
118
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
119
+ tags:
120
+ - origin
121
+ - portrait
122
+ - trigger
123
+ - camera
124
+ - id: bg3.origins.companions.starting-equipment-file-defines-gear
125
+ claim: A custom origin's starting equipment (armor, camp clothes, other items) is defined in its own
126
+ equipment file; the recommended way to find an item's real stats name from its in-game display
127
+ is to look it up on a wiki, then paste the UUID into the Multitool or NorbSearch to resolve
128
+ the actual stats entry name.
129
+ status: community
130
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
131
+ tags:
132
+ - origin
133
+ - starting-equipment
134
+ - multitool
135
+ - id: bg3.origins.companions.dependencies-recommended-for-releases
136
+ claim: A custom origin that relies on other mods should declare them as dependencies — described as
137
+ "especially important if you'd be releasing your custom origin" — via the general
138
+ mod-dependencies process, not a custom-origin-specific one.
139
+ status: community
140
+ source: wiki.bg3.community/en/Tutorials/General/Custom-Origin-Creation
141
+ tags:
142
+ - origin
143
+ - dependencies
144
+ - meta-lsx
@@ -0,0 +1,211 @@
1
+ game: baldursgate3
2
+ topic: osiris.signatures
3
+ title: Osiris call/query/event signatures, confirmed against the generated LaughingLeader stubs
4
+ facts:
5
+ - id: bg3.osiris.signatures.setflag-has-three-overloads
6
+ claim: "Osi.SetFlag has three overloads shorter than its full four-parameter form: fun(flag),
7
+ fun(flag, object), and fun(flag, object, dialogInstance); the full form is SetFlag(flag:FLAG,
8
+ object:GUIDSTRING, dialogInstance:integer, sendFlagSetEventIfChanged:integer)."
9
+ status: verified
10
+ source: LaughingLeader/BG3ModdingTools/generated/Osi.lua:4074-4080
11
+ tags:
12
+ - osiris
13
+ - setflag
14
+ - overload
15
+ - signature
16
+ related:
17
+ - id: bg3.dialogue.flags-guid-definitions
18
+ detail: Confirms the existing fact's two-argument Osi.SetFlag("Name_GUID", char) usage is the
19
+ documented fun(flag, object) overload, not an ad hoc shorthand.
20
+ - id: bg3.osiris.signatures.getflag-is-two-param-query
21
+ claim: Osi.GetFlag is a two-parameter query, GetFlag(flag:FLAG, object:GUIDSTRING) returning an
22
+ integer flagState — the object parameter is required, there is no zero- or one-argument
23
+ overload the way SetFlag has.
24
+ status: verified
25
+ source: LaughingLeader/BG3ModdingTools/generated/Osi.lua:914-918
26
+ tags:
27
+ - osiris
28
+ - getflag
29
+ - query
30
+ - signature
31
+ related:
32
+ - id: bg3.se.osi-queries-broken-actions-work
33
+ detail: Records GetFlag's real signature only — does not contradict the existing verified finding
34
+ that Osi.GetFlag itself is unreliable on this SE build; this fact is purely about arity,
35
+ not correctness.
36
+ - id: bg3.osiris.signatures.requestdelete-single-item-param
37
+ claim: Osi.RequestDelete takes exactly one parameter, an ITEM, with no overloads in the generated
38
+ stub file — RequestDeleteTemporary(character:CHARACTER) is a distinct, separate call for
39
+ temporary summons, not an overload of RequestDelete.
40
+ status: verified
41
+ source: LaughingLeader/BG3ModdingTools/generated/Osi.lua:3747-3752
42
+ tags:
43
+ - osiris
44
+ - requestdelete
45
+ - signature
46
+ related:
47
+ - id: bg3.se.corpse-removal
48
+ detail: Confirms the existing fact's Osi.RequestDelete(obj) call shape exactly, arity 1.
49
+ - id: bg3.osiris.signatures.usespell-guidstring-caster-and-target-types
50
+ claim: "Osi.UseSpell's canonical five-parameter form types caster and target/target2 as GUIDSTRING
51
+ (not CHARACTER), spellID as a plain string, and withoutMove as an integer:
52
+ UseSpell(caster:GUIDSTRING, spellID:string, target:GUIDSTRING, target2:GUIDSTRING,
53
+ withoutMove:integer); the two shorter forms are declared as @overload annotations (fun(caster,
54
+ spellID, target) and fun(caster, spellID, target, target2)), confirming there is no overload
55
+ that takes a spell level."
56
+ status: verified
57
+ source: LaughingLeader/BG3ModdingTools/generated/Osi.lua:4770-4779
58
+ tags:
59
+ - osiris
60
+ - usespell
61
+ - overload
62
+ - signature
63
+ related:
64
+ - id: bg3.se.use-spell-forced-cast
65
+ detail: Sharpens the existing verified fact's "3/4/5 args, NO level parameter" claim with the exact
66
+ generated-stub parameter types and confirms the two shorter forms are annotated @overload
67
+ rather than independently declared functions.
68
+ - id: bg3.osiris.signatures.query-functions-flagged-broken-have-real-signatures
69
+ claim: "The specific query functions recorded as unreliable on one SE build all have ordinary,
70
+ single-form signatures in the generated stub file: GetEquippedItem(character:CHARACTER,
71
+ slotName:EQUIPMENTSLOTNAME):ITEM; HasActiveStatus(target, status):integer; HasPassive(entity,
72
+ passiveID:string):integer (return named boolHasPassive); IsDead(character):integer;
73
+ IsEnemy(character, otherCharacter):integer; IsPlayer(character):integer;
74
+ GetDistanceTo(object1, object2):number. None of the seven carries an @overload annotation."
75
+ status: verified
76
+ source: LaughingLeader/BG3ModdingTools/generated/Osi.lua:878-884 (GetDistanceTo), :893-897
77
+ (GetEquippedItem), :1340-1345 (HasActiveStatus), :1391-1392 (HasPassive), :1532 (IsDead),
78
+ :1556 (IsEnemy), :1764 (IsPlayer)
79
+ tags:
80
+ - osiris
81
+ - query
82
+ - signature
83
+ - arity
84
+ related:
85
+ - id: bg3.se.osi-queries-broken-actions-work
86
+ detail: Records the exact signature of every query function named as broken on that SE build. This
87
+ fact states arity/typing only and does not claim these queries return correct values — it
88
+ neither contradicts nor rehabilitates the "do not trust them" finding.
89
+ - id: bg3.osiris.signatures.gethostcharacter-getmaxhitpoints-arity
90
+ claim: Osi.GetHostCharacter() takes no parameters and Osi.GetMaxHitpoints(entity) takes exactly one
91
+ — confirming the two calls used by an Osiris-health probe resolve to real, single-form
92
+ generated stubs rather than overloaded or ambiguous names.
93
+ status: verified
94
+ source: LaughingLeader/BG3ModdingTools/generated/Osi.lua:974,1048
95
+ tags:
96
+ - osiris
97
+ - gethostcharacter
98
+ - getmaxhitpoints
99
+ - signature
100
+ - id: bg3.osiris.signatures.questupdate-family-signatures
101
+ claim: The generated stub declares QuestUpdate(character, questID, stateID) as a three-parameter
102
+ call with one `@overload fun(questID:string, stateID:string)` annotation (not a separately
103
+ declared function); QuestAdd(character, questID) and QuestClose(questID) are separate,
104
+ unrelated calls with different arities (2 and 1); the events QuestUpdateUnlocked(character,
105
+ topLevelQuestID, stateID) and QuestClosed(questID) are 3- and 1-parameter respectively.
106
+ status: verified
107
+ source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3547,3550,3570-3574 (QuestAdd,
108
+ QuestClose, QuestUpdate with its @overload line at :3570); generated/Osi.Events.lua:867,877
109
+ (QuestClosed, QuestUpdateUnlocked)
110
+ tags:
111
+ - osiris
112
+ - questupdate
113
+ - questadd
114
+ - questclose
115
+ - signature
116
+ detail: "Checked against the source (2026-09-08): an earlier wording said the two-argument form \"is
117
+ not itself a separately generated function — it is documented as 'overloading the engine
118
+ call'\". The first half is right, but the quoted phrase is unattributed and the generated file
119
+ does carry the annotation, so the claim now states what the file shows. Note the annotation
120
+ drops the LEADING parameter (character), a second counterexample to the trailing-drop rule —
121
+ see bg3.osiris.signatures.use-overload-is-a-counterexample-to-the-trailing-drop-rule."
122
+ related:
123
+ - id: bg3.journal.quests.questupdate-requires-parent-quest-id
124
+ detail: Adds the exact generated-stub parameter list underneath the community wiki's semantic claim
125
+ about which quest ID QuestUpdate expects.
126
+ - id: bg3.journal.quests.questadd-questclose-should-be-avoided
127
+ detail: Confirms QuestAdd and QuestClose are real, separately declared calls (2- and 1-parameter)
128
+ rather than aliases of QuestUpdate, consistent with the community advice to prefer
129
+ QuestUpdate over either.
130
+ - id: bg3.osiris.signatures.equip-overloads-confirm-trailing-drop-rule
131
+ claim: Osi.Equip's three shorter @overload forms — fun(character, item), fun(character, item,
132
+ addToMainInventoryOnFail), and fun(character, item, addToMainInventoryOnFail,
133
+ showNotification) — each drop parameters only from the end of the full 5-parameter form,
134
+ confirming the community guide's general Osiris rule that "overloaded calls cannot change the
135
+ order of the parameters" and that supplying a non-default value for a late parameter requires
136
+ supplying every parameter before it too.
137
+ status: community
138
+ source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:111, §Overloaded Calls
139
+ ("overloaded calls cannot change the order of the parameters."); cross-checked against
140
+ LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:2960-2966 (Equip)
141
+ tags:
142
+ - osiris
143
+ - overload
144
+ - calling-convention
145
+ - equip
146
+ detail: "Checked against the source (2026-09-08): quotation trimmed to one sentence (the page states
147
+ no licence). The page's next sentence makes the same point for the caller's side: supplying a
148
+ non-default value for a late parameter means supplying every parameter before it."
149
+ related:
150
+ - id: bg3.osiris.signatures.use-overload-is-a-counterexample-to-the-trailing-drop-rule
151
+ detail: Disagrees in the general case. Equip's own three overloads do only drop trailing parameters,
152
+ but Osi.Use's generated overload does not, so the community guide's rule must not be
153
+ applied to an arbitrary call without checking that call's own @overload lines.
154
+ - id: bg3.osiris.signatures.use-overload-is-a-counterexample-to-the-trailing-drop-rule
155
+ claim: "Osi.Use's generated 3-parameter @overload, fun(character, item, event), is NOT a
156
+ trailing-drop overload of its full form Use(character, item, useItem, isInteraction, event):
157
+ it omits the two MIDDLE parameters (useItem, isInteraction) while keeping the LAST one (event)
158
+ — the opposite shape from Equip's overloads. This contradicts the community guide's stated
159
+ general rule that overloaded calls only ever drop trailing parameters; at least one real
160
+ generated overload breaks that rule, and the three-argument form dispatches and acts at
161
+ runtime."
162
+ status: verified
163
+ verified_on: 4.73.98.727 (Patch 8)
164
+ source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:4764-4770 (the `@overload
165
+ fun(character:CHARACTER, item:ITEM, event:string)` line at :4764 above `function
166
+ Osi.Use(character, item, useItem, isInteraction, event)` at :4770); contrasted with the
167
+ general rule stated in bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:111,
168
+ §Overloaded Calls
169
+ tags:
170
+ - osiris
171
+ - overload
172
+ - calling-convention
173
+ - use
174
+ - disagreement
175
+ detail: "Observed in game 2026-09-09 (SE console, save loaded): the two-argument
176
+ Osi.QuestUpdate(\"NoSuchQuest\", \"NoSuchState\") returned to the prompt with no arity error
177
+ and no output, so a shorter overload of QuestUpdate dispatches (with fake ids nothing
178
+ observable happens, which is the expected no-op). The Use three-argument form was then tried
179
+ with a real item guid the same night: it dispatches and has the item's Use effect, and the
180
+ five-argument form dispatches too. Side observation: Use on an equipped armor piece toggles it
181
+ (first call unequips, the next equips), and a malformed item id produces no error at all, so a
182
+ silent return is not proof the call did anything."
183
+ related:
184
+ - id: bg3.osiris.signatures.equip-overloads-confirm-trailing-drop-rule
185
+ detail: "Direct counterexample to the trailing-drop generalization that fact draws from the
186
+ community guide — do not assume every Osiris overload only omits trailing parameters;
187
+ check the specific @overload line in the generated file before calling a shorter form. A
188
+ second counterexample in the same file drops a LEADING parameter: QuestUpdate's `@overload
189
+ fun(questID, stateID)` (Osi.lua:3570), recorded in
190
+ bg3.osiris.signatures.questupdate-family-signatures. Neither this fact nor the Equip one
191
+ is verified beyond what the annotations literally say; what the engine does with a short
192
+ form at runtime was not observed."
193
+ - id: bg3.osiris.signatures.applystatus-lands-after-the-calling-chunk
194
+ claim: "Osi.ApplyStatus(target, status, duration, force) does not apply the status synchronously:
195
+ Osi.HasActiveStatus(target, status) in the same Lua chunk, right after the call, returns 0,
196
+ and a read one request later (fourteen seconds) returns 1. A read-back belongs in a separate
197
+ probe or a later tick, not in the chunk that applies."
198
+ status: verified
199
+ verified_on: 4.73.98.727 (Patch 8)
200
+ source: ModWright field verification
201
+ tags:
202
+ - osiris
203
+ - applystatus
204
+ - hasactivestatus
205
+ - timing
206
+ - eval
207
+ detail: GetStatusTurns read -1 in the same chunk as the indefinite (-1.0) application; it was not
208
+ read again in the later request, so only HasActiveStatus is attested across the gap. The
209
+ earlier 12.0-second application had expired on its own out of combat before its first read 27
210
+ seconds later (HasActiveStatus 0, GetStatusTurns 0), so a short duration masks this timing
211
+ rather than exposing it.
@@ -0,0 +1,155 @@
1
+ game: baldursgate3
2
+ topic: packaging.meta
3
+ title: meta.lsx ModuleInfo schema, dependency/conflict declaration, and header versioning
4
+ facts:
5
+ - id: bg3.packaging.meta.moduleinfo-fields-read-by-mod-manager
6
+ claim: "LaughingLeader's BG3 Mod Manager parses a mod's meta.lsx ModuleInfo node for these
7
+ attributes: UUID, Name, Author, Version (via Version64 falling back to Version — see
8
+ bg3.packaging.meta.version64-preferred-with-version-fallback), Folder, Description, MD5, Type,
9
+ PublishHandle, and FileSize, plus the root <version major minor revision build> element read
10
+ separately as the file's own header version."
11
+ status: verified
12
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:222-235
13
+ tags:
14
+ - meta-lsx
15
+ - moduleinfo
16
+ - required-fields
17
+ - bg3modmanager
18
+ - id: bg3.packaging.meta.version64-preferred-with-version-fallback
19
+ claim: BG3 Mod Manager reads a mod's version from meta.lsx by checking two attribute names in order
20
+ — "Version64" first, then the legacy "Version" — via a two-element fallback array, not by
21
+ assuming Version64 is always present.
22
+ status: verified
23
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:32
24
+ tags:
25
+ - meta-lsx
26
+ - version64
27
+ - version
28
+ - fallback
29
+ related:
30
+ - id: bg3.ui.mcm.dependency-version64-should-pin-dev-version
31
+ detail: Independently confirms "Version64" as the real meta.lsx attribute name MCM's own
32
+ dependency-version advice refers to, and adds that a mod manager reading a dependency's
33
+ version falls back to the older "Version" attribute if Version64 is absent.
34
+ - id: bg3.packaging.meta.moduletype-attribute-marked-deprecated-in-source
35
+ claim: BG3 Mod Manager's own source comments the ModuleInfo "Type" attribute as "// Deprecated?" at
36
+ the point it is read into ModType — the mod manager still reads and stores the field, but its
37
+ own maintainer considers its meaning uncertain or obsolete going forward. GustavDev and
38
+ GustavX are hardcoded to ModType "Adventure" regardless of what their meta.lsx actually
39
+ contains, overriding whatever Type value those two specific UUIDs carry.
40
+ status: inferred
41
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:229,237-241
42
+ tags:
43
+ - meta-lsx
44
+ - moduletype
45
+ - deprecated
46
+ - gustavdev
47
+ - hardcoded
48
+ detail: Inferred from the source comment and the special-cased UUID check, not from documentation
49
+ stating the field is deprecated outright — treat a meta.lsx Type value as advisory rather than
50
+ load-bearing.
51
+ - id: bg3.packaging.meta.tags-attribute-is-semicolon-delimited
52
+ claim: A meta.lsx ModuleInfo node's Tags attribute is a single string of semicolon-separated tag
53
+ names, which the mod manager reads with `tagsText.Split(';')` into a tag list.
54
+ status: verified
55
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:242-246
56
+ tags:
57
+ - meta-lsx
58
+ - tags
59
+ - moduleinfo
60
+ detail: "Checked against the source (2026-09-08): an earlier wording also asserted \"there is no
61
+ separate child Tags node the way a ClassDescription's race/class Tags reference works\". A
62
+ parser that does not read such a node is not evidence that none exists, so that half has been
63
+ dropped rather than promoted."
64
+ - id: bg3.packaging.meta.dependencies-node-holds-moduleshortdesc-children
65
+ claim: A meta.lsx's Dependencies node (a sibling of ModuleInfo, found by searching for a node whose
66
+ id equals "Dependencies") contains one child node per dependency with id "ModuleShortDesc",
67
+ each carrying its own Folder, MD5, Name, UUID, and Version(64) attributes.
68
+ status: verified
69
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:251-273
70
+ tags:
71
+ - meta-lsx
72
+ - dependencies
73
+ - moduleshortdesc
74
+ detail: "Checked against the source (2026-09-08): an earlier wording added that this is \"the same
75
+ ModuleShortDesc shape the Compatibility Framework's config schema also uses for its per-mod
76
+ entries\". No fact in knowledge/baldursgate3/compatibilityframework.api.yaml mentions
77
+ ModuleShortDesc and the cited parser says nothing about the Compatibility Framework, so that
78
+ comparison has been dropped."
79
+ related:
80
+ - id: bg3.ui.mcm.dependency-recommended-in-meta-lsx
81
+ detail: Confirms the exact node/attribute shape ("ModuleShortDesc" under a "Dependencies" node) that
82
+ declaring MCM as a meta.lsx dependency actually produces, read independently from the mod
83
+ manager's own parser rather than from the MCM tutorial.
84
+ - id: bg3.packaging.meta.conflicts-node-mirrors-dependencies-shape
85
+ claim: meta.lsx also supports a "Conflicts" node using the identical child shape as Dependencies
86
+ (child nodes with id "ModuleShortDesc" carrying Folder/MD5/Name/UUID/Version), parsed into a
87
+ separate ModData.Conflicts list by the mod manager — a distinct declaration from Dependencies,
88
+ kept in a separate list. What the game or the manager then does with a declared conflict is
89
+ not shown by the cited parser code.
90
+ status: verified
91
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:278-300
92
+ tags:
93
+ - meta-lsx
94
+ - conflicts
95
+ - moduleshortdesc
96
+ - id: bg3.packaging.meta.bg3-header-version-is-4-0-9
97
+ claim: BG3 Mod Manager's own source comment records the meta.lsx root <version> element's expected
98
+ form for a BG3 mod as major="4" minor="0" revision="9" (with a mod-specific build number, e.g.
99
+ 331 in the comment's example) — distinct from the D:OS Classic (3.1.3.5) and D:OS 2 DE
100
+ (3.6.2.0) forms the same parser also recognizes for older-game meta.lsx files.
101
+ status: verified
102
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:183-189
103
+ tags:
104
+ - meta-lsx
105
+ - header-version
106
+ - bg3modmanager
107
+ detail: The mod manager falls back to hardcoded HEADER_MAJOR/MINOR/REVISION/BUILD constants if the
108
+ file has no <version> element at all, rather than rejecting the meta.lsx outright — and those
109
+ constants (DivinityModDataLoader.cs:27-30) are 4/8/0/0, i.e. 4.8.0.0, not the 4.0.9.x form the
110
+ comment gives for a BG3 mod. Do not read the fallback as a second attestation of 4.0.9.
111
+ - id: bg3.packaging.meta.mod-manager-auto-resolves-dependency-order
112
+ claim: BG3 Mod Manager's own load-order builder (BuildOutputList) walks each enabled mod's declared
113
+ Dependencies recursively via GetDependencyMods and inserts every not-yet-added dependency into
114
+ the output order immediately before the mod that needs it (recursively, skipping any
115
+ dependency UUID that does not resolve to an indexed local mod).
116
+ status: verified
117
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:1400-1428
118
+ (GetDependencyMods), :1431-1465 (BuildOutputList)
119
+ tags:
120
+ - meta-lsx
121
+ - dependencies
122
+ - load-order
123
+ - bg3modmanager
124
+ - automatic
125
+ detail: "Inference, not in the source: a mod author who declares Dependencies correctly therefore
126
+ does not need end users to drag the dependency above it by hand — but only for orders built or
127
+ exported through BG3 Mod Manager with addDependencies left at its default true, and only when
128
+ the dependency is installed and indexed."
129
+ related:
130
+ - id: bg3.loadorder.external-guid-dependencies
131
+ detail: Sharpens the existing verified fact (a missing/misordered dependency CTDs at LoadModule) by
132
+ showing the mechanism a well-formed meta.lsx Dependencies declaration uses to avoid that
133
+ failure automatically, at least when the mod list is built or exported through BG3 Mod
134
+ Manager rather than hand-edited.
135
+ - id: bg3.packaging.meta.modsettings-export-is-plain-xml-write
136
+ claim: BG3 Mod Manager writes modsettings.lsx by generating its XML content in memory, re-indenting
137
+ it with a standard XmlDocument/XmlTextWriter pass (2-space indentation), and writing the UTF-8
138
+ bytes to Path.Combine(folder, "modsettings.lsx") with FileMode.Create and FileShare.None.
139
+ status: verified
140
+ source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:1331-1352
141
+ tags:
142
+ - meta-lsx
143
+ - modsettings
144
+ - bg3modmanager
145
+ - file-locking
146
+ detail: "Inference, not in the source: FileShare.None means no other process may hold the file open
147
+ during the write, so a write attempted while the game (or a second manager instance) has
148
+ modsettings.lsx open should fail — the code catches and logs exceptions there rather than
149
+ describing that case."
150
+ related:
151
+ - id: bg3.loadorder.modsettings-not-durable
152
+ detail: "Adds a mechanism note to the existing fact about hand-edited modsettings.lsx entries being
153
+ overwritten: the mod manager's own writer does a full regenerate-and-overwrite, not an
154
+ in-place patch, which is why any hand-added entry outside its own model does not survive a
155
+ re-export."
@@ -0,0 +1,79 @@
1
+ game: baldursgate3
2
+ topic: packaging.paks
3
+ title: PAK file packaging, load precedence, and locking behavior
4
+ facts:
5
+ - id: bg3.paks.same-uuid-precedence
6
+ claim: A packed mod of the same UUID in the profile Mods\ folder WINS over a junctioned/loose copy.
7
+ A stale same-UUID pak silently overrides your loose edits — the classic "why aren't my changes
8
+ showing" trap.
9
+ status: verified
10
+ verified_on: 4.73.98.727 (Patch 8)
11
+ source: ModWright field verification
12
+ tags:
13
+ - pak
14
+ - precedence
15
+ - loose-mods
16
+ - uuid
17
+ - load-order
18
+ detail: Loose+junctioned mods are also NOT reliably visible in the in-game mod manager list in this
19
+ environment; a present .pak is what the list shows. For real testing beyond SE Lua / stats
20
+ hot-reload, rebuild and deploy the pak. If edits "don't take", check the pak's timestamp
21
+ before debugging further.
22
+ - id: bg3.paks.every-same-uuid-pak-is-opened
23
+ claim: When several .pak files in the profile Mods folder carry the same module UUID, the running
24
+ game holds every one of them open (a rename of any of them fails with "being used by another
25
+ process" until the game exits), even though Ext.Mod.GetMod(uuid).Info.Directory names only one
26
+ module folder as bound.
27
+ status: verified
28
+ verified_on: 4.73.98.727 (Patch 8)
29
+ source: ModWright field verification
30
+ tags:
31
+ - pak
32
+ - uuid
33
+ - duplicate
34
+ - file-lock
35
+ - deploy
36
+ detail: "Consequence for deploy: retiring a duplicate pak needs the game closed, the same as
37
+ replacing the bound one. Which copy the engine binds among duplicates was the sideloaded .pak
38
+ in every launch that day regardless of launch path or the mod-management screen; the rule
39
+ behind that choice is still not characterised."
40
+ - id: bg3.paks.paks-lock-while-running
41
+ claim: PAKs lock while the game is running. You cannot overwrite the profile pak while BG3 is open
42
+ ("Device or resource busy").
43
+ status: verified
44
+ verified_on: 4.73.98.727 (Patch 8)
45
+ source: ModWright field verification
46
+ tags:
47
+ - pak
48
+ - locking
49
+ - game-process
50
+ detail: "Reliable pattern: build to a scratch path, then a background watcher polls tasklist | grep
51
+ bg3_dx11.exe and copies the pak once the process exits (the player has to restart to load a
52
+ new pak anyway)."
53
+ - id: bg3.paks.profile-pak-directory
54
+ claim: Deploy by copying the built pak to %LOCALAPPDATA%\Larian Studios\Baldur's Gate
55
+ 3\Mods\<Mod>.pak (the user profile, not the game directory).
56
+ status: verified
57
+ verified_on: 4.73.98.727 (Patch 8)
58
+ source: ModWright field verification
59
+ tags:
60
+ - pak
61
+ - deployment
62
+ - profile
63
+ detail: The profile Mods folder is where packed mods load from and what the in-game manager lists.
64
+ The game's own Data\Mods / Data\Public tree is used for the loose junctioned dev loop and for
65
+ loose dialog overrides, not for shipping a pak.
66
+ - id: bg3.paks.stats-spell-load-fresh
67
+ claim: Stat/spell/loca changes load fresh from the pak on game load — they apply to existing SAVES
68
+ (no new game needed). But anything baked at a moment in time (a summoned item's stats, a
69
+ granted progression feature) needs a re-trigger (re-summon; respec).
70
+ status: verified
71
+ verified_on: 4.73.98.727 (Patch 8)
72
+ source: ModWright field verification
73
+ tags:
74
+ - pak
75
+ - reloading
76
+ - save-compatibility
77
+ - progression
78
+ detail: A common source of "my change isn't showing on this save". Progressions partially bake into
79
+ saves once loaded, so always test progression changes on a fresh save or respec with Withers.
@@ -0,0 +1,34 @@
1
+ game: baldursgate3
2
+ topic: process.launch
3
+ title: Launching Baldur's Gate 3 from a script
4
+ facts:
5
+ - id: bg3.process.steam-intercepts-direct-exe-launch
6
+ claim: Launching `bin\\bg3_dx11.exe --skip-launcher` directly, bypassing `steam://rungameid`, makes
7
+ Steam show its own confirmation dialog that a person must click before the game starts.
8
+ status: verified
9
+ source: ModWright field verification
10
+ tags:
11
+ - process
12
+ - launch
13
+ - steam
14
+ - unattended
15
+ detail: Whether a Steam setting suppresses the dialog, or whether the `steam://rungameid` route with
16
+ `--skip-launcher` set as a Steam launch option avoids it, is not yet established. Until it is,
17
+ a scripted BG3 launch cannot run unattended.
18
+ - id: bg3.process.launched-pid-is-not-the-game-pid
19
+ claim: After Steam's confirmation, the game runs under a different process id than the one
20
+ `Start-Process` returned for `bg3_dx11.exe`; the approved launch is re-spawned through Steam's
21
+ own wrapper.
22
+ status: verified
23
+ source: ModWright field verification
24
+ tags:
25
+ - process
26
+ - launch
27
+ - steam
28
+ - pid
29
+ - lock
30
+ related:
31
+ - bg3.process.steam-intercepts-direct-exe-launch
32
+ detail: Anything that waits on, or kills, "the game process" by the launched pid will miss the real
33
+ one. Find the game by executable name or by the handle holding the pak, as ModWright's deploy
34
+ lock check already does.