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,257 @@
1
+ game: baldursgate3
2
+ topic: scriptextender.console
3
+ title: Script Extender in-game console usage
4
+ facts:
5
+ - id: bg3.scriptextender.console.input-line-needs-enter-press
6
+ claim: The SE console window does not accept typed input immediately — pressing Enter once activates
7
+ the input line, shown by the prompt changing to "S >>"; if console output has scrolled past
8
+ the input line, the guide's fix is to "repeat this a few times until you can see the S >>"
9
+ rather than assuming the console is broken.
10
+ status: community
11
+ source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:54-60, §2.2 Activate the input ("To
12
+ be able to input commands into the console press enter once."; the next line covers repeating
13
+ it until the `S >>` prompt is visible)
14
+ tags:
15
+ - scriptextender
16
+ - console
17
+ - input
18
+ - gotcha
19
+ - id: bg3.scriptextender.console.p-and-d-print-functions
20
+ claim: "Two bare (non-Osi-prefixed) global functions are available at the SE console for printing
21
+ values: _P (plain print — the guide's worked example is _P(\"Hello World\")) and _D (a richer
22
+ dump/inspect print, used as _D(Osi.GetHostCharacter()) and
23
+ _D(Ext.Entity.Get(...).CharacterCreationAppearance))."
24
+ status: community
25
+ source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:67-72, §2.3.1 ("_P("Hello World")")
26
+ and :525-542, §6.1.1 ("_D(Osi.GetHostCharacter())")
27
+ tags:
28
+ - scriptextender
29
+ - console
30
+ - print
31
+ - debug
32
+ - globals
33
+ detail: "Checked against the source (2026-09-08): the third citation, §7's
34
+ `_D(Ext.Entity.Get(GetHostCharacter()).CharacterCreationAppearance)`, has been dropped from
35
+ `source` — §7 is an unwritten \"Work in Progress\" stub and that string appears only inside
36
+ its \"// TODO\" list. _P and _D themselves are properly worked examples in §2.3.1 and §6.1.1;
37
+ the Ext.Entity example is not documented, only listed as something to document."
38
+ - id: bg3.scriptextender.console.osi-functions-callable-bare-or-prefixed
39
+ claim: At the SE console, Osiris calls are callable both through the Osi table
40
+ (Osi.GetHostCharacter(), Osi.AddGold(...)) and as bare global functions with the same name and
41
+ no Osi. prefix (the guide's TemplateAddTo("d32a68ff-...", GetHostCharacter(), 10) example
42
+ calls GetHostCharacter() bare inside an argument list to the same effect as
43
+ Osi.GetHostCharacter()).
44
+ status: community
45
+ source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:76-79, §2.3.2 (bare
46
+ TemplateAddTo/GetHostCharacter call);
47
+ bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:32-33
48
+ ("_P(Osi.GetRegion(GetHostCharacter()))" — GetHostCharacter used bare inside an Osi.-prefixed
49
+ call)
50
+ tags:
51
+ - scriptextender
52
+ - console
53
+ - osi
54
+ - globals
55
+ - calling-convention
56
+ - id: bg3.scriptextender.console.reset-command-hotreloads-scripts
57
+ claim: "Typing \"reset\" at the SE console and pressing Enter \"will reset the console and all
58
+ loaded scripts, allowing you to see instant changes of your code\" — the guide's workflow
59
+ after every code edit is: save the file, re-open/re-activate the console, type reset."
60
+ status: community
61
+ source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:420-450, §4.5 Testing the symlink
62
+ ("This will reset the console and all loaded scripts, allowing you to see instant changes of
63
+ your code.")
64
+ tags:
65
+ - scriptextender
66
+ - console
67
+ - reset
68
+ - hot-reload
69
+ detail: "The same section carries a precondition the drafted fact omitted: reset only picks up
70
+ edited scripts if the mod folder is symlinked into (or physically inside) the game's Data
71
+ folder — otherwise the mod has to be repacked to see changes. It also notes some changes only
72
+ apply on a session reload (F8)."
73
+ related:
74
+ - id: bg3.se.console-reset-degrades-osiris
75
+ detail: Confirms reset's intended use (hot-reloading Lua) from the community side, matching the
76
+ existing verified caution that the same command degrades Osiris mid-session and should not
77
+ be used for anything Osi-driven.
78
+ - id: bg3.scriptextender.console.bare-expression-prints-nothing
79
+ claim: 'The Script Extender debug console does not echo the value of a bare expression: typing
80
+ Ext.Stats.Get("X") returns to the prompt with no output whether or not X exists. Wrap the call
81
+ in _D(...) (or print) to see the result; _D(Ext.Stats.Get("X")) dumps the whole stats object
82
+ as JSON-like text (ModId, ModifierList, Using, SpellType, every field), and prints nil for a
83
+ missing entry.'
84
+ status: verified
85
+ verified_on: 4.73.98.727 (Patch 8)
86
+ source: ModWright field verification
87
+ tags:
88
+ - scriptextender
89
+ - console
90
+ - lua
91
+ - dump
92
+ - stats
93
+ detail: "The missing-entry case was exercised later the same day
94
+ (bg3.scriptextender.console.ext-stats-get- missing-entry-prints-null): _D prints null, not
95
+ nil. The S >> prompt is the server context."
96
+ - id: bg3.scriptextender.console.ext-mod-getmod-info-directory-names-loaded-copy
97
+ claim: "Ext.Mod.GetMod(uuid).Info, dumped with _D at the SE console, reports the module the running
98
+ game bound to that UUID: Directory is the module folder actually loaded
99
+ (Mods/<Directory>/meta.lsx), alongside Name, Author, Description, ModVersion, PublishVersion,
100
+ PublishHandle and Hash. When several installed paks or loose modules share one UUID, this is
101
+ the only observable that says which copy won; modsettings.lsx's Folder attribute is the mod
102
+ manager's last binding and can disagree."
103
+ status: verified
104
+ verified_on: 4.73.98.727 (Patch 8)
105
+ source: ModWright field verification
106
+ tags:
107
+ - scriptextender
108
+ - console
109
+ - ext-mod
110
+ - uuid
111
+ - duplicate
112
+ - directory
113
+ detail: Which copy the game picks among same-UUID installs is not yet characterised (an earlier
114
+ launch bound a different copy with one more mod.io pak present); this fact is about how to
115
+ observe the choice, not how it is made. Omitting the closing parenthesis
116
+ (_D(Ext.Mod.GetMod("...").Info) is a Lua syntax error the console reports as "')' expected
117
+ near <eof>".
118
+ - id: bg3.scriptextender.console.getstats-unknown-types-on-runtime-32
119
+ claim: 'Ext.Stats.GetStats(type) on Script Extender runtime 32 (Patch 8) rejects four of the
120
+ thirteen type names the API document lists — SpellSet, EquipmentSet, ItemGroup and NameGroup —
121
+ with a console line "bg3se::lua::stats::FetchStatEntries(): Unknown stats entry type: <type>"
122
+ and returns nothing for them; the other nine (StatusData, SpellData, PassiveData, Armor,
123
+ Weapon, Character, Object, TreasureTable, TreasureCategory) answer normally.'
124
+ status: verified
125
+ verified_on: 4.73.98.727 (Patch 8)
126
+ source: ModWright field verification
127
+ tags:
128
+ - scriptextender
129
+ - stats
130
+ - getstats
131
+ - console
132
+ - runtime-32
133
+ detail: The bridge (bridges/bg3-se, Probes.lua STAT_TYPES) now iterates only the nine known types. A
134
+ stat of one of the four rejected types is therefore not reachable through bg3.stat.exists on
135
+ this runtime; whether a later extender build accepts them is unknown.
136
+ - id: bg3.scriptextender.console.ext-stats-get-missing-entry-prints-null
137
+ claim: _D(Ext.Stats.Get("<name>")) for an entry that is not loaded prints null, so the same one-line
138
+ check distinguishes present (a full stats object) from absent (null) without any other setup.
139
+ status: verified
140
+ verified_on: 4.73.98.727 (Patch 8)
141
+ source: ModWright field verification
142
+ tags:
143
+ - scriptextender
144
+ - console
145
+ - stats
146
+ - missing
147
+ - id: bg3.scriptextender.console.db-tables-read-via-get-method
148
+ claim: Osiris databases are readable from SE Lua/console as members of the Osi table with a
149
+ colon-called Get method, e.g. Osi.DB_Players:Get(nil) to dump every fact in DB_Players — the
150
+ guide gives this as the pattern for reading any DB_ database by name (Osi.DB_<Name>:Get(...)).
151
+ status: verified
152
+ verified_on: 4.73.98.727 (Patch 8)
153
+ source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:635-650, §7 Script Extender Functions
154
+ tags:
155
+ - scriptextender
156
+ - console
157
+ - database
158
+ - osi
159
+ - lua
160
+ detail: 'Checked against the source (2026-09-08): citation does not support the claim: §7 is an
161
+ unwritten stub ("Work in Progress", then a "// TODO" list); the `_D(Osi.DB_Players:Get(nil))`
162
+ string appears only as a bullet in that to-do list of things someone still means to document.
163
+ The page states no pattern, nothing about the `nil` argument, and nothing about other DB_
164
+ databases. The syntax may well be right — it just is not documented anywhere read here, so it
165
+ stayed unverified until run at the console. Run 2026-09-09: the DB_Players form works as
166
+ written and DB_Origins behaves the same, which closes the "another DB_ name" question. The
167
+ dump is a list of rows, each row a list of column values; a one-row database prints as its
168
+ single string.'
169
+ - id: bg3.scriptextender.console.session-loaded-message-confirms-console-ready
170
+ claim: After loading or starting a save, the SE console prints a session-loaded confirmation line
171
+ (plus any installed mods' own debug output) before it is meaningful to issue further commands
172
+ — the guide treats seeing this output as the signal to proceed, not just the console window
173
+ existing.
174
+ status: community
175
+ source: bg3-community/Tutorials/ScriptExtender/GettingStarted.md:44-50, §2.1 Load a save ("When the
176
+ save is loaded you should see some output in your console, telling you that the session has
177
+ loaded and other debug statements depending on what kind of mods you have installed")
178
+ tags:
179
+ - scriptextender
180
+ - console
181
+ - session-loaded
182
+ - workflow
183
+ - id: bg3.scriptextender.console.getposition-getregion-for-capturing-placement-data
184
+ claim: "Osi.GetPosition(target) and Osi.GetRegion(object) at the console are the documented way to
185
+ capture a level-placement data point without a mod dependency: \"Using Script Extender to get
186
+ positional information does not create a dependency on it for your mod, you're simply using it
187
+ to capture data points.\" GetPosition returns X, Y, Z space-separated (no commas) when
188
+ printed, but the values must be re-entered comma-separated into other Osi calls."
189
+ status: community
190
+ source: bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:21 ("Using Script Extender
191
+ to get positional information does not create a dependency on it for your mod, you're simply
192
+ using it to capture data points.") and :29-39, §Position (the GetRegion/GetPosition commands
193
+ and the no-commas-when-printed, commas-when-re-entered note)
194
+ tags:
195
+ - scriptextender
196
+ - console
197
+ - getposition
198
+ - getregion
199
+ - workflow
200
+ - id: bg3.scriptextender.console.createat-spawns-a-copy-not-the-original
201
+ claim: Osi.CreateAt(templateId, x, y, z, temporary, playSpawn, spawnFinishEvent) called at the
202
+ console "doesn't add the original to the map, we're creating a copy based on the original" —
203
+ templateId is the target RootTemplate's MapKey, temporary=0 makes the spawned copy permanent,
204
+ and the call returns a GUIDSTRING for the new object that should be captured into a console
205
+ variable for later reference (e.g. newbox = Osi.CreateAt(...)).
206
+ status: community
207
+ source: bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:43-57, §Spawn Item ("It
208
+ doesn't add the original to the map, we're creating a copy based on the original."; worked
209
+ example assigning the return to `newbox`)
210
+ tags:
211
+ - scriptextender
212
+ - console
213
+ - createat
214
+ - roottemplate
215
+ - workflow
216
+ - id: bg3.scriptextender.console.itemrotateytoangle-is-absolute-not-relative
217
+ claim: Osi.ItemRotateYToAngle(item, angleDeg, speedDegPerSec) rotates an item TO an absolute Y-axis
218
+ angle, not BY that angle — issuing the same command with 90 degrees twice in a row leaves the
219
+ item at 90 degrees both times, it does not accumulate to 180. Osi.ItemRotateY (without
220
+ "ToAngle") is a separate, distinctly named generated call with the same three parameters.
221
+ status: community
222
+ source: bg3-community/Tutorials/Items/Add-and-position-items-in-world.md:70-84, §Rotation ("We are
223
+ not rotating **BY** that angle."; the paragraph then works through the repeated-90-degrees
224
+ case); LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3107 (ItemRotateY), :3112
225
+ (ItemRotateYToAngle)
226
+ tags:
227
+ - scriptextender
228
+ - console
229
+ - itemrotateytoangle
230
+ - rotation
231
+ - gotcha
232
+ detail: 'Checked against the source (2026-09-08): an earlier wording called ItemRotateY "the call
233
+ for a relative rotation". The tutorial never mentions ItemRotateY and the generated stub gives
234
+ only its name and parameters, so its semantics are an assumption from the name; only its
235
+ separate existence is cited here.'
236
+ - id: bg3.scriptextender.console.lua-loader-takes-code-then-an-env-table
237
+ claim: "A mod's server Lua state under Script Extender runtime 32 exposes a Lua loader (reached as
238
+ `loadstring or load`) that compiles a source string, and its optional second argument is an
239
+ environment table, not a chunk name: calling it as loader(code, \"=name\", \"t\") raises \"bad
240
+ argument #2 to 'loader' (table expected, got string)\", while loader(code) compiles and the
241
+ chunk runs against the mod's globals (Ext, Osi and the rest resolve)."
242
+ status: verified
243
+ verified_on: 4.73.98.727 (Patch 8)
244
+ source: ModWright field verification
245
+ tags:
246
+ - scriptextender
247
+ - lua
248
+ - load
249
+ - loadstring
250
+ - sandbox
251
+ - bridge
252
+ - eval
253
+ detail: Which of `load` and `loadstring` the state actually binds was not separated (the handler
254
+ takes the first defined); the second-argument shape matches the classic sandboxed-loadstring
255
+ convention rather than Lua 5.4's load(chunk, name, mode, env). Osi.TemplateAddTo returns
256
+ nothing (returnCount 0), so the inventory is the only read-back;
257
+ Osi.GetItemByTemplateInInventory returns one guid and cannot count.
@@ -0,0 +1,252 @@
1
+ game: baldursgate3
2
+ topic: scriptextender
3
+ title: Script Extender configuration, APIs, and Osiris integration
4
+ facts:
5
+ - id: bg3.se.mutually-exclusive-with-toolkit
6
+ claim: SE and the official Toolkit are mutually exclusive for AUTHORING — pick the hand-authored
7
+ pipeline for SE mods. (Publishing an SE mod through the Toolkit is a separate question; see
8
+ bg3.publishing.se-mods-can-ship-on-modio.)
9
+ status: verified
10
+ verified_on: 4.73.98.727 (Patch 8)
11
+ source: ModWright field verification
12
+ tags:
13
+ - scriptextender
14
+ - toolkit
15
+ - authoring
16
+ detail: This is why the whole BG3 pipeline here is hand-authored + LSLib/Divine + Nexus, with the
17
+ Toolkit used only to publish to mod.io. It is also why the Toolkit's "Convert UI Assets" step
18
+ (which would auto-write GUI/metadata.lsf) is unavailable.
19
+ - id: bg3.se.config-required
20
+ claim: 'SE config MUST be Mods/<Mod>/ScriptExtender/Config.json — capital C (pak-internal paths are
21
+ case-sensitive; lowercase config.json silently fails in a packed mod) — with the
22
+ RequiredVersion key, NOT the DOS2-era RequiredExtensionVersion. Shape: { "RequiredVersion":
23
+ 21, "ModTable": "<Mod>", "FeatureFlags": ["Lua"] }.'
24
+ status: verified
25
+ verified_on: 4.73.98.727 (Patch 8)
26
+ source: ModWright field verification
27
+ tags:
28
+ - scriptextender
29
+ - config
30
+ - bootstrap
31
+ detail: "Both failure modes were found on an earlier mod: a lowercase config.json (tolerated for
32
+ loose files, fatal in a pak) and the DOS2-era RequiredExtensionVersion key — both silent. SE
33
+ enumeration works loose and packed, but only for mods in the active load order.
34
+ RequiredVersion is a floor: set it to the lowest SE major that has the APIs you use."
35
+ - id: bg3.se.bootstrap-files
36
+ claim: "Server bootstrap: Mods/<Mod>/ScriptExtender/Lua/BootstrapServer.lua (runs when a session
37
+ loads). Client bootstrap: Mods/<Mod>/ScriptExtender/Lua/BootstrapClient.lua (runs at the main
38
+ menu)."
39
+ status: verified
40
+ verified_on: 4.73.98.727 (Patch 8)
41
+ source: ModWright field verification
42
+ tags:
43
+ - scriptextender
44
+ - bootstrap
45
+ - lua
46
+ detail: The file names and paths are exact. Register listeners on SessionLoaded.
47
+ - id: bg3.se.osiris-listener-arity
48
+ claim: 'Listen to Osiris events with Ext.Osiris.RegisterListener("StatusApplied", 4, "after", fn).
49
+ Get the correct ARITY — wrong arity = dead listener. Signatures: StatusApplied(object, status,
50
+ causee, storyActionID) [4]; StatusRemoved(object, status, causee, applyStoryActionID) [4];
51
+ CastedSpell(caster, spell, spellType, spellElement, storyActionID) [5]; KilledBy(defender,
52
+ attackOwner, attacker, storyActionID) [4]; Died(character) [1];
53
+ TemplateKilledBy(characterTemplate, defender, attackOwner, attacker, storyActionID) [5].'
54
+ status: verified
55
+ verified_on: 4.73.98.727 (Patch 8)
56
+ source: ModWright field verification
57
+ tags:
58
+ - scriptextender
59
+ - osiris
60
+ - listeners
61
+ - arity
62
+ detail: Canonical signatures come from LaughingLeader BG3ModdingTools/generated/Osi{,.Events}.lua;
63
+ the 2026-09-08 intake drafted a second fact restating these same six signatures from that file
64
+ (bg3.osiris.signatures.listener-event-arity-confirmed-against-generated-file), which was
65
+ deleted as a duplicate with its line citations merged into this fact's source instead.
66
+ Correlate related events on the shared storyActionID — but its lifetime is UNDOCUMENTED and
67
+ IDs are reused within a session, so any correlation table needs a TTL/cleanup sweep; never
68
+ treat a storyActionID as globally unique. A weapon kill carries its own storyActionID distinct
69
+ from the spell that applied the victim's status.
70
+ - id: bg3.se.v32-api-date
71
+ claim: The SE v32 API reference in these notes was verified 2026-08-29 against
72
+ Ext.Utils.Version()==32; v32 released 2026-06-21. Canonical Osiris signatures from
73
+ LaughingLeader BG3ModdingTools/generated/Osi{,.Events}.lua; Lua events from Norbyte/bg3se
74
+ BG3Extender/IdeHelpers/ExtIdeHelpers.lua.
75
+ status: verified
76
+ verified_on: 4.73.98.727 (Patch 8)
77
+ source: ModWright field verification
78
+ tags:
79
+ - scriptextender
80
+ - se-v32
81
+ - api
82
+ - reference
83
+ detail: "The damage pipeline names churn between versions: current ones are
84
+ Ext.Events.EsvLuaBeforeDealDamage (fires BEFORE mitigation — modify here) and
85
+ Ext.Events.EsvLuaDealDamage. StatsDealDamageFunctor has IgnoreImmunities but no
86
+ IgnoreResistances, so resistance bypass must be done in these hooks. Old DOS2-era Game.Math /
87
+ bare DealDamage names are gone."
88
+ - id: bg3.se.use-spell-forced-cast
89
+ claim: Osi.UseSpell(caster, spellID, target[, target2[, withoutMove:int]]) — overloads 3/4/5 args,
90
+ NO level parameter; Osi.UseSpellAtPosition(caster, spellID, x, y, z[, withoutMove]) for point
91
+ casts. Forced casts resolve at spell power level 0, so encode any level in the spell ID (cast
92
+ the pre-leveled child), not the call.
93
+ status: verified
94
+ verified_on: 4.73.98.727 (Patch 8)
95
+ source: ModWright field verification
96
+ tags:
97
+ - scriptextender
98
+ - osiris
99
+ - usespell
100
+ - forced-cast
101
+ detail: SpellPowerLevel-scaled effects therefore see 0 on forced casts. Whether forced casts consume
102
+ resources was still untested at the time of that finding.
103
+ - id: bg3.se.console-reset-degrades-osiris
104
+ claim: 'SE console `reset` hot-reloads BootstrapServer.lua/BootstrapClient.lua without restarting
105
+ the game, BUT reset mid-session degrades Osiris ("Not syncing adapters - DB not available"):
106
+ Osi queries return junk and Osi calls silently no-op afterwards. Use reset only to reload Lua
107
+ code; anything Osi-driven needs a save reload (F8) instead.'
108
+ status: verified
109
+ verified_on: 4.73.98.727 (Patch 8)
110
+ source: ModWright field verification
111
+ tags:
112
+ - scriptextender
113
+ - console
114
+ - reset
115
+ - osiris
116
+ detail: "Degradation detector: Osi.GetMaxHitpoints(host) vs Ext.Entity.Get(host).Health.MaxHp
117
+ disagreeing. Quickload (F8) starts a fresh session — SessionLoaded re-fires, Osi state is
118
+ clean, and session-granted passives/statuses are wiped back to the save's state."
119
+ - id: bg3.se.lua-best-practices
120
+ claim: Wrap everything in pcall. Remove dev diagnostics (UI-viewmodel probes, StaticData dumps)
121
+ before release. Stats entries are live-editable from the SE console —
122
+ Ext.Stats.Get("<entry>"), then SetRawAttribute + Sync; functor/complex fields REQUIRE
123
+ SetRawAttribute (plain assignment throws "Inappropriate type" in SE v32).
124
+ status: verified
125
+ verified_on: 4.73.98.727 (Patch 8)
126
+ source: ModWright field verification
127
+ tags:
128
+ - scriptextender
129
+ - lua
130
+ - error-handling
131
+ - diagnostics
132
+ detail: Simple string fields accept plain assignment. Stats .txt FILE edits still need a game
133
+ restart (a whole-file runtime reload API is unconfirmed), and Progressions/ClassDescriptions
134
+ .lsx are read at session load only.
135
+ - id: bg3.se.corpse-removal
136
+ claim: 'Corpse/entity removal: Osi.RequestDelete(obj), guarded with Osi.IsDead(obj)==1 and
137
+ Osi.IsPlayer(obj)~=1. DeathType "Disintegrate" only drives the dissolve VFX; the corpse entity
138
+ persists — removing it needs SE.'
139
+ status: verified
140
+ verified_on: 4.73.98.727 (Patch 8)
141
+ source: ModWright field verification
142
+ tags:
143
+ - scriptextender
144
+ - osiris
145
+ - corpse
146
+ - deletion
147
+ detail: Stats-side disintegration is cosmetic only, which is why the visual alone never removes the
148
+ body.
149
+ - id: bg3.se.osi-queries-broken-actions-work
150
+ claim: "In this SE build, Osiris ACTIONS work but Osi QUERIES are unreliable: Osi.SetFlag works
151
+ while Osi.GetFlag returned 0 for a provably-set flag, and every Osi query is treated as
152
+ suspect."
153
+ status: verified
154
+ verified_on: 4.73.98.727 (Patch 8)
155
+ source: ModWright field verification
156
+ tags:
157
+ - scriptextender
158
+ - osiris
159
+ - queries
160
+ - flags
161
+ detail: "Design around it: drive state with actions and read state from Ext.Entity / stats rather
162
+ than Osi queries. Note that a degraded session (console `reset`) produces the same symptom for
163
+ a different reason — see bg3.se.console-reset-degrades-osiris."
164
+ - id: bg3.se.osiris-restricted-at-sessionloaded
165
+ claim: 'Osiris functions are NOT callable during SessionLoaded (and other early load phases):
166
+ calling any Osi.* there throws "Attempted to call Osiris function in restricted context".
167
+ Registering listeners (Ext.Osiris.RegisterListener) at SessionLoaded is fine; calling an
168
+ Osiris function synchronously at that point is not.'
169
+ status: verified
170
+ verified_on: 4.73.98.727 (Patch 8)
171
+ source: ModWright field verification
172
+ tags:
173
+ - scriptextender
174
+ - osiris
175
+ - sessionloaded
176
+ - restricted-context
177
+ - lua
178
+ detail: Move any actual Osi.* call (GetHostCharacter, GetFlag, TemplateAddTo, ...) out of
179
+ SessionLoaded and into a gameplay/Osiris event handler where the story is live (e.g. a
180
+ level-load or region listener). An Ext.Osiris.IsCallable() guard, if present in the installed
181
+ SE build, can gate calls from ambiguous contexts; deferring to an Osiris event is the reliable
182
+ fix.
183
+ - id: bg3.scriptextender.osi-inventory-calls-complete-asynchronously
184
+ claim: 'Osi.ToInventory, Osi.TemplateAddTo, Osi.TemplateRemoveFrom and Osi.RequestDelete return
185
+ before the change is applied: a GetItemByTemplateInInventory / GetInventoryOwner / Exists read
186
+ in the same chunk, or 2-4 s later in a following probe, still shows the old state; 8-20 s
187
+ later it shows the new one. A read-back must settle for at least ~8 s, and issuing a
188
+ "fallback" TemplateAddTo because the first read looked unchanged creates a duplicate.'
189
+ status: verified
190
+ verified_on: 4.73.98.727 (Patch 8)
191
+ source: ModWright field verification
192
+ tags:
193
+ - scriptextender
194
+ - osiris
195
+ - inventory
196
+ - async
197
+ - bridge
198
+ - id: bg3.scriptextender.story-items-are-matched-by-instance-not-template
199
+ claim: "Osiris goals bind to a specific global item INSTANCE (UseFinished(_Player,
200
+ S_GLO_PixieBell_8c99b6c7-..., 1) in GLO_Pixie.txt), so a second item spawned from the same
201
+ template (TemplateAddTo of UNI_SCL_PixieBell's MapKey) is inert: its use action runs but no
202
+ goal reacts. To hand a player such an item, move the real instance with
203
+ Osi.ToInventory(\"<Name>_<MapKey>\", host, 1, 1, 1); the story parks such items at a hidden
204
+ \"asylum\" trigger per level (the pixie and her bell stood at 20/0/-1417 in SCL_Main_A) so the
205
+ instance exists to be moved."
206
+ status: verified
207
+ verified_on: 4.73.98.727 (Patch 8)
208
+ source: Gustav.pak GLO_Pixie.txt lines 37-42; bridge requests req-mu8oxy6g, req-mu8p0lk3,
209
+ req-mu8p11jx, req-mu8p3i4c
210
+ tags:
211
+ - osiris
212
+ - story
213
+ - global-items
214
+ - templateaddto
215
+ - toinventory
216
+ - id: bg3.scriptextender.level-placement-via-levelgameplaystarted-and-container-instance-id
217
+ claim: "A mod can place its item in a specific vanilla container natively-shaped for SE: register
218
+ Ext.Osiris.RegisterListener(\"LevelGameplayStarted\", 2, \"after\", fn) at SessionLoaded and,
219
+ when the level name matches, Osi.TemplateAddTo(<item template>, \"<ContainerName>_<MapKey>\",
220
+ 1, 0) after a GetItemByTemplateInInventory dedup. The container id is the level
221
+ Items/_merged.lsf node's Name and MapKey joined by \"_\"
222
+ (CONT_GEN_Rock_Pile_Grave_Open_A_000_472199db-9e39-4f40-9a0d-9c439b1953bf). It fires on a save
223
+ loaded into that level, not only on first entry."
224
+ status: verified
225
+ verified_on: 4.73.98.727 (Patch 8)
226
+ source: ModWright field verification
227
+ tags:
228
+ - scriptextender
229
+ - osiris
230
+ - placement
231
+ - levelgameplaystarted
232
+ - containers
233
+ - id: bg3.scriptextender.in-game-container-survey-through-the-bridge
234
+ claim: 'The reliable way to find "the container the player is standing at" is a bridge bg3.lua.eval
235
+ on the server: Osi.GetPosition(Osi.GetHostCharacter()), then iterate
236
+ Ext.Entity.GetAllEntitiesWithComponent("ServerItem"), keep entities whose
237
+ Transform.Transform.Translate is within a few metres, and print Uuid.EntityUuid,
238
+ ServerItem.Template.Name, Osi.IsContainer(uuid),
239
+ Ext.Loca.GetTranslatedString(DisplayName.NameKey.Handle.Handle) and
240
+ Osi.GetInventoryOwner(uuid) (which shows what already sits inside which container). Offline
241
+ level surveys anchored on a name-regex centroid picked the wrong object twice (a cellar chest
242
+ 950 m from the graveyard; a chest 45 m from the display case).'
243
+ status: verified
244
+ verified_on: 4.73.98.727 (Patch 8)
245
+ source: ModWright field verification
246
+ tags:
247
+ - scriptextender
248
+ - bridge
249
+ - survey
250
+ - entities
251
+ - containers
252
+ - levels