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,41 @@
1
+ game: skyrimse
2
+ topic: install.detection
3
+ title: Where a Skyrim Special Edition install is recorded, by storefront
4
+ facts:
5
+ - id: sse.install.detection.epic-manifests
6
+ claim: "An Epic Games Store install is found through the Epic Games Launcher's own manifests: one
7
+ `*.item` JSON file per installed app under the launcher data directory's `Manifests` folder,
8
+ where that directory is the registry value `HKLM\\Software\\Epic Games\\EpicGamesLauncher`
9
+ `AppDataPath` or, failing that, `%ProgramData%\\Epic\\EpicGamesLauncher\\Data\\`. A manifest
10
+ whose `AppName` is `ac82db5035584c7f8a2c548d98c86b2c` (Skyrim Special Edition) or
11
+ `5d600e4f59974aeba0259c7734134e27` (the Anniversary Edition update) names the install folder
12
+ in `InstallLocation`."
13
+ status: community
14
+ source: 'modorganizer-game_gamebryo src/gamebryo/gamegamebryo.cpp
15
+ `GameGamebryo::parseEpicGamesLocation` (read 2026-09-11): `findInRegistry(HKEY_LOCAL_MACHINE,
16
+ L"Software\\Epic Games\\EpicGamesLauncher", L"AppDataPath")`, the
17
+ `getKnownFolderPath(FOLDERID_ProgramData, false) + "\\Epic\\EpicGamesLauncher\\Data\\"`
18
+ fallback, `manifestDir += "Manifests"`, `QDir epicManifests(manifestDir, "*.item",
19
+ QDir::SortFlags(QDir::Name | QDir::IgnoreCase), QDir::Files)`, and `manifestJson["AppName"]` /
20
+ `manifestJson["InstallLocation"]`; the two app ids from modorganizer-game_skyrimse
21
+ src/gameskyrimse.cpp `GameSkyrimSE::identifyGamePath` ("AppName:
22
+ ac82db5035584c7f8a2c548d98c86b2c", "AE Update: 5d600e4f59974aeba0259c7734134e27")'
23
+ tags:
24
+ - install
25
+ - detect
26
+ - epic
27
+ - storefront
28
+ - manifest
29
+ detail: "MO2 reads the manifests only after the Bethesda and GOG registry keys came back empty;
30
+ ModWright reads them as one more candidate source and lets dedupeByRoot fold duplicates, as
31
+ every ModWright surface does. SKSE does not support the Epic build (fact
32
+ sse.skse.runtime.no-microsoft-store-or-epic-support), so an Epic install is detected so that
33
+ compat can say so, not because modding it is recommended. No real Epic install has been read;
34
+ the reader is tested against synthetic manifests in the launcher's shape. ModWright also reads
35
+ the `WOW6432Node` view of the launcher key, which MO2 does not: the launcher's installer is
36
+ 32-bit, and the registry value only matters when the data directory is not the default one the
37
+ fallback already covers. The Microsoft Store install is still not searched, because neither
38
+ reference says where to look: MO2 has no Microsoft Store handling at all
39
+ (`GameSkyrimSE::gameVariants` is `{\"Steam\", \"GOG\", \"Epic Games\"}`), and libloadorder's
40
+ `is_microsoft_store_install` only recognizes an install it is already given, by
41
+ `appxmanifest.xml` in the game directory."
@@ -0,0 +1,242 @@
1
+ game: skyrimse
2
+ topic: loadorder.files
3
+ title: Plugins.txt, the asterisk load order system, and what the mod managers do to it
4
+ facts:
5
+ - id: sse.loadorder.files.asterisk-system
6
+ claim: 'Skyrim SE uses the "asterisk" load order system: order is the order of lines in Plugins.txt
7
+ and an entry is active when its line begins with `*`. Skyrim LE used the older textfile system
8
+ with a separate loadorder.txt; Oblivion and the Fallout 3 era used file timestamps.'
9
+ status: community
10
+ source: Ortham/libloadorder src/game_settings.rs, fn load_order_method (SkyrimSE maps to
11
+ LoadOrderMethod::Asterisk); doc/src/load_order_mechanisms.md
12
+ tags:
13
+ - load-order
14
+ - plugins-txt
15
+ - asterisk
16
+ - sse-vs-le
17
+ detail: The doc's framing of why this matters - "load order position is no longer an intrinsic
18
+ property of a plugin" - is the reason a Skyrim SE surface must read the order file rather than
19
+ inspect the Data directory.
20
+ - id: sse.loadorder.files.plugins-txt-path-is-storefront-dependent
21
+ claim: Plugins.txt lives under %LOCALAPPDATA% in a folder whose name depends on the storefront -
22
+ "Skyrim Special Edition" for Steam, "Skyrim Special Edition GOG", "Skyrim Special Edition
23
+ EPIC" and "Skyrim Special Edition MS" for the others.
24
+ status: community
25
+ source: Ortham/libloadorder src/game_settings.rs, fn skyrim_se_appdata_folder_name and fn
26
+ plugins_file_path; the same names appear in ModOrganizer2/modorganizer-game_skyrimse
27
+ src/gameskyrimse.cpp (GameSkyrimSE::gameDirectoryName)
28
+ tags:
29
+ - load-order
30
+ - plugins-txt
31
+ - path
32
+ - gog
33
+ - epic
34
+ - storefront
35
+ detail: libloadorder and MO2 both detect the storefront by probing the game install directory -
36
+ Galaxy64.dll means GOG, EOSSDK-Win64-Shipping.dll means Epic, otherwise Steam. The same folder
37
+ name is used for Documents\My Games\<name>. A surface that hardcodes the Steam name is wrong
38
+ for three of four storefronts.
39
+ - id: sse.loadorder.files.plugins-txt-is-windows-1252
40
+ claim: Plugins.txt is encoded Windows-1252 without a BOM. A plugin filename containing a character
41
+ outside Windows-1252 cannot be written to it at all.
42
+ status: community
43
+ source: Ortham/libloadorder doc/src/active_plugins.md ("Both active plugins files are encoded in
44
+ Windows-1252 ... some plugins have filenames which cannot be represented in Windows-1252, and
45
+ so cannot be activated without first renaming them"); src/load_order/mutable.rs
46
+ read_plugin_names, src/load_order/mod.rs strict_encode
47
+ tags:
48
+ - load-order
49
+ - plugins-txt
50
+ - encoding
51
+ - windows-1252
52
+ - gotcha
53
+ detail: libloadorder decodes with decode_without_bom_handling_and_without_replacement and encodes
54
+ with a strict_encode that returns Error::EncodeError rather than writing lossily. Reading the
55
+ file as UTF-8 mangles non-ASCII mod names.
56
+ - id: sse.loadorder.files.line-grammar
57
+ claim: An empty line or a line starting with `#` is ignored. A line starting with `*` names an
58
+ active plugin, with the filename following the asterisk immediately and no space. Any other
59
+ line names a plugin that is listed but inactive, which still holds a load order position.
60
+ status: community
61
+ source: Ortham/libloadorder src/load_order/asterisk_based.rs, fn plugin_line_mapper and fn save
62
+ tags:
63
+ - load-order
64
+ - plugins-txt
65
+ - parser
66
+ - syntax
67
+ detail: On write, the marker is a bare `*` then the name then a newline; inactive entries get no
68
+ marker.
69
+ - id: sse.loadorder.files.duplicate-and-ghost-handling
70
+ claim: If the same filename appears more than once, the last entry wins. Name matching is
71
+ case-insensitive and a trailing .ghost suffix is trimmed before comparison.
72
+ status: community
73
+ source: Ortham/libloadorder src/load_order/mutable.rs, fn total_insertion_order (comment "If the
74
+ same filename is listed multiple times, keep the last entry"), which uses UniCase and
75
+ trim_dot_ghost
76
+ tags:
77
+ - load-order
78
+ - plugins-txt
79
+ - parser
80
+ - duplicates
81
+ - ghost
82
+ - id: sse.loadorder.files.five-masters-are-implicit-and-absent
83
+ claim: Skyrim.esm, Update.esm, Dawnguard.esm, HearthFires.esm and Dragonborn.esm are hardcoded to
84
+ load first and are omitted from Plugins.txt entirely, as is every plugin named in <game
85
+ dir>\Skyrim.ccc. A reader must synthesise them at the head of the order.
86
+ status: community
87
+ source: Ortham/libloadorder src/game_settings.rs SKYRIM_SE_HARDCODED_PLUGINS, fn ccc_file_paths, fn
88
+ early_loading_plugins, fn implicitly_active_plugins; src/load_order/ asterisk_based.rs fn save
89
+ ("Skip early loading plugins"); MO2 GameSkyrimSE::primaryPlugins and CCPlugins
90
+ tags:
91
+ - load-order
92
+ - plugins-txt
93
+ - implicit
94
+ - creation-club
95
+ - skyrim-ccc
96
+ - gotcha
97
+ detail: Any index computed straight from the file's lines is low by at least five. Creation Club
98
+ content adds more. libloadorder's own doc states the ordering rule - official Bethesda
99
+ plugins, DLC and Creation Club plugins "are all hardcoded to always load in a certain order
100
+ before other plugins".
101
+ - id: sse.loadorder.files.no-loadorder-txt-for-sse
102
+ claim: There is no loadorder.txt for Skyrim Special Edition. libloadorder returns a path for it only
103
+ for Skyrim LE and Oblivion Remastered; a loadorder.txt found alongside an SSE install is a mod
104
+ manager's own artifact.
105
+ status: community
106
+ source: Ortham/libloadorder src/game_settings.rs, fn load_order_path (GameId::SkyrimSE falls into
107
+ the `_ => None` arm); doc/src/textfile_standard.md ("Unlike the other games, Skyrim (but not
108
+ the Special Edition) does not define the load order of inactive plugins")
109
+ tags:
110
+ - load-order
111
+ - loadorder-txt
112
+ - sse-vs-le
113
+ - gotcha
114
+ - id: sse.loadorder.files.unlisted-plugins-order-is-synthesized
115
+ claim: Plugins present on disk but absent from Plugins.txt are appended after every listed one,
116
+ inactive, ordered by file modification time ascending and, on a tie, by uppercased filename
117
+ descending. This ordering is libloadorder's synthesis, not game behaviour - the game loads
118
+ only active plugins and has no opinion about the rest.
119
+ status: inferred
120
+ source: Ortham/libloadorder src/load_order/mutable.rs fn total_insertion_order and
121
+ src/game_settings.rs sort_plugins_dir_entries with its comment, plus the test
122
+ find_plugins_in_directories_should_sort_files_by_modification_timestamp
123
+ tags:
124
+ - load-order
125
+ - plugins-txt
126
+ - inactive
127
+ - synthesis
128
+ - caveat
129
+ detail: Marked inferred because the "not game behaviour" half is a reading of what the code is for,
130
+ not a quoted statement. A tool that reports this ordering must label it as a tool convention
131
+ or it will be taken for an engine rule.
132
+ - id: sse.loadorder.files.master-hoisting
133
+ claim: Master plugins load before non-master plugins, with one exception - a non-master that a
134
+ master depends on is hoisted to load between that master and the one preceding it.
135
+ status: community
136
+ source: Ortham/libloadorder doc/src/load_order_mechanisms.md; implemented as fn hoist_masters in
137
+ src/load_order/mutable.rs
138
+ tags:
139
+ - load-order
140
+ - masters
141
+ - hoisting
142
+ - id: sse.loadorder.files.mo2-profile-owns-the-real-file
143
+ claim: Under Mod Organizer 2 the authoritative plugins.txt is the one in the active profile
144
+ directory, which MO2 maps onto the %LOCALAPPDATA% location for the processes it launches. MO2
145
+ also keeps a loadorder.txt there even though Skyrim SE does not use one.
146
+ status: community
147
+ source: ModOrganizer2/modorganizer-game_skyrimse src/gameskyrimse.cpp, GameSkyrimSE::mappings (maps
148
+ both plugins.txt and loadorder.txt from the profile path to
149
+ localAppFolder()/gameDirectoryName())
150
+ tags:
151
+ - load-order
152
+ - mo2
153
+ - profile
154
+ - plugins-txt
155
+ - virtual-filesystem
156
+ detail: A profile directory also holds modlist.txt, lockedorder.txt, archives.txt, settings.ini and
157
+ initweaks.ini. Editing the %LOCALAPPDATA% copy while MO2 is in use is silently ineffective for
158
+ an MO2-launched game.
159
+ - id: sse.loadorder.files.mo2-hides-mods-from-the-real-data-folder
160
+ claim: Mod Organizer 2 never places mod files in the game's Data folder. It uses USVFS, a user-space
161
+ virtual file system built on API hooking, so only processes MO2 launches see the merged tree.
162
+ status: community
163
+ source: github.com/ModOrganizer2/usvfs README ("aims to allow windows applications to create file or
164
+ directory links that are visible to only a select set of processes ... by using api hooking");
165
+ ModOrganizer2/modorganizer wiki "Moving things" FAQ ("Although Mod Organizer makes it look
166
+ like the files come from the game's Data folder, they're still physically on whatever drive
167
+ the mods folder is on")
168
+ tags:
169
+ - mo2
170
+ - usvfs
171
+ - virtual-filesystem
172
+ - data-folder
173
+ - gotcha
174
+ detail: An external inspector reading the real Data folder while MO2 is in use sees the vanilla game
175
+ and nothing else. The effective tree is mods/<mod name>/ (each mirroring Data),
176
+ profiles/<profile>/ and overwrite/.
177
+ - id: sse.loadorder.files.vortex-owns-and-watches-plugins-txt
178
+ claim: Vortex writes plugins.txt itself, with encoding latin1 and a first line reading "#
179
+ Automatically generated by Vortex". If that line is missing it logs "plugins file was changed
180
+ by foreign application" and prompts the user to keep or revert the change.
181
+ status: community
182
+ source: Nexus-Mods/Vortex extensions/gamebryo-plugin-management/src/util/PluginPersistor.ts, fn
183
+ serialize, fn filterFileData and the onFileChanged handler
184
+ tags:
185
+ - vortex
186
+ - plugins-txt
187
+ - deployment
188
+ - ownership
189
+ - gotcha
190
+ detail: For Skyrim SE, Fallout 4 and Starfield Vortex uses its "fallout4" format - native plugins
191
+ omitted, enabled ones prefixed `*`. It also writes a loadorder.txt (utf8) that Skyrim SE does
192
+ not use. An external tool that edits plugins.txt will raise a foreign-application prompt for
193
+ the user.
194
+ - id: sse.loadorder.files.vortex-hardlink-deploys-into-data
195
+ claim: Vortex's default hardlink deployment puts real directory entries in the game's Data folder,
196
+ indistinguishable from ordinary files. Symlink deployment is explicitly unsupported for every
197
+ Skyrim variant.
198
+ status: community
199
+ source: Nexus-Mods/Vortex wiki "Deployment Methods", sections "Hardlink Deployment" and "Symlink
200
+ Deployment" (the latter lists Morrowind, Oblivion, Skyrim variants and the Fallout titles as
201
+ incompatible)
202
+ tags:
203
+ - vortex
204
+ - deployment
205
+ - hardlink
206
+ - data-folder
207
+ detail: This is the opposite of MO2 - under Vortex, reading the real Data folder shows the full
208
+ deployed mod set. Vortex records what it deployed in vortex.deployment.json, written into the
209
+ deploy path with a backup copy in the staging folder.
210
+ - id: sse.loadorder.files.loot-cli-can-sort-unattended
211
+ claim: LOOT can sort and apply a load order without interaction using `LOOT.exe --game="Skyrim
212
+ Special Edition" --auto-sort`. The --game value is case sensitive and is the game's LOOT
213
+ folder name, and --auto-sort requires it.
214
+ status: community
215
+ source: loot/loot docs/app/usage/initialisation.rst, section "Initialisation" ("automatically sort
216
+ the load order, apply the sorted load order, then quit")
217
+ tags:
218
+ - loot
219
+ - cli
220
+ - sorting
221
+ - unattended
222
+ - toolchain
223
+ detail: MO2 registers exactly this argument for its bundled LOOT. It is still the GUI binary, there
224
+ is no headless build, and the process exit code on failure is not documented. Sorting fails
225
+ outright on a cyclic interaction.
226
+ - id: sse.loadorder.files.loot-masterlist-paths
227
+ claim: LOOT keeps its data under %LOCALAPPDATA%\LOOT, with per-game files in games\<folder name>\.
228
+ Skyrim SE's default folder name is "Skyrim Special Edition" and its masterlist is fetched from
229
+ https://raw.githubusercontent.com/loot/skyrimse/v0.29/masterlist.yaml.
230
+ status: community
231
+ source: loot/loot src/gui/state/loot_paths.cpp getDataPath; src/gui/state/game/game.cpp
232
+ getLOOTGamePath; src/gui/state/game/game_id.cpp getDefaultLootFolderName;
233
+ src/gui/state/game/game_settings.cpp getDefaultMasterlistRepositoryName and
234
+ getDefaultMasterlistUrl with DEFAULT_MASTERLIST_BRANCH = "v0.29"
235
+ tags:
236
+ - loot
237
+ - masterlist
238
+ - path
239
+ - url
240
+ detail: The per-game folder name is user-configurable and differs between two installs of the same
241
+ game, so an external tool should read %LOCALAPPDATA%\LOOT\settings.toml rather than hardcode
242
+ it. The branch in the URL is LOOT's metadata-syntax version, bumped per release.
@@ -0,0 +1,189 @@
1
+ game: skyrimse
2
+ topic: plugins.esl
3
+ title: Light plugins (ESL) — the flag, the FormID ranges, HEDR 1.71, and the load limits
4
+ facts:
5
+ - id: sse.plugins.esl.flag-is-bit-9-of-the-tes4-header
6
+ claim: A plugin is light when bit 9 (0x00000200) of its TES4 record header flags is set. The flag is
7
+ Skyrim-SE-only — xEdit declares it as IsSSE('ESL','') and no earlier game has it.
8
+ status: community
9
+ source: TES5Edit wbDefinitionsTES5.pas, wbRecord(TES4, 'Main File Header', ...) flag list;
10
+ en.uesp.net "Skyrim Mod:Mod File Format/TES4" lead ("if set, the file is treated as a light
11
+ master")
12
+ tags:
13
+ - esl
14
+ - light-plugin
15
+ - flags
16
+ - tes4
17
+ - parser
18
+ - id: sse.plugins.esl.extension-does-not-determine-lightness
19
+ claim: Lightness cannot be decided from the file extension. An .esl is always light because the
20
+ extension forces the flag, but an .esp with the light flag set is also light, and it counts
21
+ against the 4096 light budget rather than the 255 full one.
22
+ status: community
23
+ source: libloadorder doc/src/plugin_types.md, "Skyrim Special Edition, Skyrim VR, Fallout 4, Fallout
24
+ 4 VR" ("A plugin is a light non-master plugin if its file extension is .esp and it has its
25
+ light plugin flag set"); Wrye Bash skyrimse/__init__.py extension_forces_flags = True; xEdit
26
+ whatsnew.md "the .esl extension which implicitly always sets the ESL flag"
27
+ tags:
28
+ - esl
29
+ - light-plugin
30
+ - extension
31
+ - gotcha
32
+ - load-order
33
+ - counting
34
+ detail: Any tool that classifies plugins by extension will miscount the caps. esplugin's own test is
35
+ `self.is_light_flag_set() || self.file_extension() == FileExtension::Esl`.
36
+ - id: sse.plugins.esl.fe-space-is-twelve-plus-twelve-bits
37
+ claim: "Light plugins load into the 0xFE mod-index slot, and their FormIDs are mapped into the FExxx
38
+ space: 12 bits of light index (4096 slots) and 12 bits of object id (4096 objects per light
39
+ plugin)."
40
+ status: community
41
+ source: TES5Edit whatsnew.md, "What's new in xEdit 4.0.0? > ESL support" ("up to 253 'full' modules
42
+ (00 to FD) and 4096 'light' modules (FE000 to FEFFF) loaded at the same time")
43
+ tags:
44
+ - esl
45
+ - formid
46
+ - fe-space
47
+ - load-order
48
+ - limits
49
+ detail: esplugin's mask constant for the same space is small_mask = 0xFE00_0000.
50
+ - id: sse.plugins.esl.formid-prefix-is-not-load-order
51
+ claim: The leading digits of a FormID can no longer be used to infer load order. Light modules can
52
+ load before full modules; they merely occupy the FE index at runtime.
53
+ status: community
54
+ source: TES5Edit whatsnew.md, "ESL support" ("the first digits of the FormID are NOT a reliable way
55
+ to determine load order anymore"); loot.github.io "Introduction To Load Orders" (light plugins
56
+ "are listed as position FE, but actually load in the position dictated by the load order")
57
+ tags:
58
+ - esl
59
+ - formid
60
+ - load-order
61
+ - gotcha
62
+ detail: The order file is authoritative for position; the FormID prefix is not. A load-order report
63
+ must take its ordering from Plugins.txt, never from FormIDs.
64
+ - id: sse.plugins.esl.hedr-1-71-unlocks-the-expanded-range
65
+ claim: HEDR version 1.71 is what signals the expanded light-plugin object-index range introduced in
66
+ Skyrim SE 1.6.1130. Below 1.71 a light plugin's new records must have object indices in
67
+ 0x800-0xFFF; at 1.71 and above the range opens downward.
68
+ status: community
69
+ source: libloot changelog 0.22.3 (2023-12-06) ("the extended FormID range introduced in Skyrim SE
70
+ v1.6.1130.0 for light plugins with a header version of 1.71. Via esplugin"); Ortham/esplugin
71
+ src/plugin.rs valid_light_form_id_range; Wrye Bash skyrimse/__init__.py
72
+ object_index_range_expansion_ver = 1.71
73
+ tags:
74
+ - esl
75
+ - hedr
76
+ - formid
77
+ - 1-6-1130
78
+ - version
79
+ detail: esplugin's code reads `Some(v) if v < 1.71 => 0x800..=0xFFF, Some(_) => 0..=0xFFF`. Before
80
+ the change the reserved range 0x0000-0x07FF gave light plugins a 2048-record limit; after it,
81
+ 4096.
82
+ - id: sse.plugins.esl.expanded-floor-is-disputed
83
+ claim: Sources disagree on the expanded range's lower bound. esplugin's code and Wrye Bash's
84
+ docstring put it at 0x000; xEdit's release notes write it as 001-7FF. Wrye Bash also requires
85
+ the plugin to have at least one master for the expansion to apply, a condition neither of the
86
+ others states.
87
+ status: community
88
+ source: Ortham/esplugin src/plugin.rs (0..=0xFFF); Wrye Bash Mopy/bash/game/__init__.py
89
+ ObjectIndexRange docstring ("EXPANDED_CONDITIONAL ... and at least one master can use the
90
+ range 0x000-0x7FF"); TES5Edit whatsnew.md 4.1.5b ("Extended FormID Range (001-7FF)")
91
+ tags:
92
+ - esl
93
+ - formid
94
+ - disputed
95
+ - validator
96
+ - open-question
97
+ detail: A validator should use 0x001 as the floor, which is the conservative reading and cannot
98
+ produce a false failure against either source. Settling it needs a real 1.6.1130+ install and
99
+ a look at what _ResourcePack.esl actually contains.
100
+ - id: sse.plugins.esl.validity-counts-new-records-only
101
+ claim: A plugin is ESL-flag-safe when every NEW record's FormID object index falls in the valid
102
+ range. Records that merely override a master's forms are exempt, however high their object
103
+ index.
104
+ status: community
105
+ source: libloot changelog 0.14.0 (2018-12-09) ("Validity is defined as having no new records with a
106
+ FormID object index greater than 0xFFF"); Ortham/esplugin src/plugin.rs
107
+ is_valid_as_light_plugin, which filters on !f.is_overridden_record()
108
+ tags:
109
+ - esl
110
+ - validation
111
+ - formid
112
+ - override
113
+ - validator
114
+ detail: "esplugin's tests make the asymmetry explicit: an override outside the range keeps the
115
+ plugin valid, a new FormID above 0xFFF does not. Wrye Bash's user-facing message for the
116
+ failure is \"This plugin contains records with FormIDs greater than 0xFFF.\""
117
+ - id: sse.plugins.esl.masters-at-1-71-force-the-plugin-to-1-71
118
+ claim: A plugin whose masters carry header version 1.71 should itself be 1.71, or referencing or
119
+ overriding any record whose FormID falls in the extended range produces errors.
120
+ status: community
121
+ source: TES5Edit whatsnew.md 4.1.5b, "Extended FormID Range in Skyrim Special Edition", the
122
+ "Important" note
123
+ tags:
124
+ - esl
125
+ - hedr
126
+ - masters
127
+ - version
128
+ - validator
129
+ - id: sse.plugins.esl.1-71-plugins-crash-old-game-builds
130
+ claim: The December 5 2023 Creations update incremented plugin header versions from 1.70 to 1.71 in
131
+ order to raise a light plugin's new-record maximum from 2048 to 4096. Using a 1.71 plugin on
132
+ an older game build will likely crash.
133
+ status: community
134
+ source: github.com/Nukem9/skyrimse-backported-esl-support README, section "Purpose"
135
+ tags:
136
+ - esl
137
+ - hedr
138
+ - 1-6-1130
139
+ - crash
140
+ - compatibility
141
+ - creations-update
142
+ detail: Verbatim - "Attempting to use a version 1.71 plugin on an old game build will likely crash."
143
+ This is why a HEDR-version check against the installed runtime deserves a blocking severity
144
+ rather than a warning.
145
+ - id: sse.plugins.esl.active-full-limit-drops-to-254
146
+ claim: The active full-plugin limit is 255 when no light plugin is active and 254 once one is,
147
+ because the FE index is carved out of the full space. Light plugins have their own separate
148
+ limit of 4096 active.
149
+ status: inferred
150
+ source: Ortham/libloadorder src/load_order/mutable.rs max_active_full_plugins (255 / 254 / 253
151
+ branches) and src/load_order/writable.rs MAX_ACTIVE_LIGHT_PLUGINS = 4096, with the tests
152
+ activate_should_lower_the_full_plugin_limit_if_a_light_plugin_is_present
153
+ tags:
154
+ - esl
155
+ - limits
156
+ - load-order
157
+ - counting
158
+ - disputed
159
+ detail: Marked inferred because libloadorder's own prose contradicts its code - the docs say light
160
+ plugins "do not count towards the 255 active plugin limit" while the code demonstrably lowers
161
+ the cap. The code and its tests are the stronger evidence. The 253 figure that also appears is
162
+ the master-list limit, not the active limit.
163
+ - id: sse.plugins.esl.master-list-limit-is-253
164
+ claim: A Skyrim SE plugin may list at most 253 masters, not 255, because the FE slot is reserved for
165
+ light plugins inside master lists as well as in the load order.
166
+ status: community
167
+ source: Wrye Bash Mopy/bash/game/skyrimse/__init__.py, master_limit = 253 with the comment "Because
168
+ the FE slot is reserved for ESLs - yes, including in master lists"; the base
169
+ Mopy/bash/game/__init__.py has master_limit = 255
170
+ tags:
171
+ - esl
172
+ - masters
173
+ - limits
174
+ - validator
175
+ - id: sse.plugins.esl.compact-formids-is-the-fix
176
+ claim: xEdit's "Compact FormIDs for ESL" function renumbers a plugin's new records into the valid
177
+ light range; from xEdit 4.0.3 an expert option extends the target space to 001-FFF instead of
178
+ 800-FFF.
179
+ status: community
180
+ source: TES5Edit whatsnew.md, "What's new in xEdit 4.0.0? > Compact FormIDs for ESL" and "What's new
181
+ in xEdit 4.0.3? > Minor changes"
182
+ tags:
183
+ - esl
184
+ - xedit
185
+ - compact
186
+ - tooling
187
+ - remediation
188
+ detail: xEdit refuses to save a plugin with the ESL flag set when it contains new records with an
189
+ ObjectID above $FFF, and warns when loading an incorrectly flagged module.