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,224 @@
1
+ game: skyrimse
2
+ topic: plugins.format
3
+ title: Plugin file layout — the record header, the TES4 file header and its subrecords
4
+ facts:
5
+ - id: sse.plugins.format.record-header-is-24-bytes
6
+ claim: "Every record in a Skyrim SE plugin begins with a 24-byte header: 4 bytes of signature,
7
+ uint32 data size (excluding the header), uint32 flags, uint32 FormID, 4 bytes of
8
+ timestamp/version-control info, uint16 form version, uint16 unknown. The record's data follows
9
+ immediately at offset 24."
10
+ status: community
11
+ source: en.uesp.net "Skyrim Mod:Mod File Format" section "Records"; corroborated by TES5Edit
12
+ wbImplementation.pas (TwbMainRecordStruct) and Ortham/esplugin src/record.rs
13
+ (MAX_RECORD_HEADER_LENGTH = 24, test header_length_should_be_24)
14
+ tags:
15
+ - plugin
16
+ - binary
17
+ - record-header
18
+ - parser
19
+ - byte-layout
20
+ detail: UESP splits offsets 16-19 into two uint16 fields (Timestamp, Version Control Info) where
21
+ xEdit reads one Cardinal (mrsVCS1); both readings parse the same bytes. All multi-byte fields
22
+ are little-endian.
23
+ - id: sse.plugins.format.form-version-44-for-sse
24
+ claim: "The uint16 at record-header offset 20 is the record's internal form version: 43 for Skyrim
25
+ LE and 44 for Skyrim Special Edition."
26
+ status: community
27
+ source: en.uesp.net "Skyrim Mod:Mod File Format", section "Records", the uint16 internal-version row
28
+ tags:
29
+ - plugin
30
+ - record-header
31
+ - version
32
+ - sse-vs-le
33
+ detail: A quick way to tell an LE-authored plugin from an SE one without parsing further. Fallout 4
34
+ uses 131 on the same axis.
35
+ - id: sse.plugins.format.tes4-flag-bits
36
+ claim: On the TES4 file-header record the meaningful flag bits are 0 (0x00000001) ESM master, 7
37
+ (0x00000080) Localized, 9 (0x00000200) Light/ESL, and 12 (0x00001000) Ignored. xEdit declares
38
+ only the first three on TES4 and gates the ESL bit on the game being Skyrim SE.
39
+ status: community
40
+ source: TES5Edit wbDefinitionsTES5.pas, wbRecord(TES4, 'Main File Header', wbFlags(...)) — bit 9
41
+ written as IsSSE('ESL',''); matortheeternal/esp.json data/SSE/TES4.json "flags"; en.uesp.net
42
+ "Skyrim Mod:Mod File Format/TES4" lead paragraph
43
+ tags:
44
+ - plugin
45
+ - flags
46
+ - esm
47
+ - esl
48
+ - localized
49
+ - parser
50
+ detail: "The ESM flag's effect, verbatim from the TES4 page: \"if set, the file is treated as a
51
+ master, regardless of what the file extension says\". The bit values are not portable across
52
+ games — esplugin's plugin.rs shows Starfield using 0x800 for light and 0x200 for Update."
53
+ - id: sse.plugins.format.localized-flag-changes-string-decoding
54
+ claim: The Localized flag (0x00000080) makes the game load the .STRINGS, .DLSTRINGS and .ILSTRINGS
55
+ files that accompany the plugin. With the flag clear, lstrings in the plugin are treated as
56
+ plain zstrings instead.
57
+ status: community
58
+ source: en.uesp.net "Skyrim Mod:Mod File Format", section "Records", the 0x00000080 flag row
59
+ tags:
60
+ - plugin
61
+ - flags
62
+ - localization
63
+ - strings
64
+ detail: A plugin shipped with the flag set but without its strings files loses every localized name,
65
+ which is why the flag is worth reporting from a header parse.
66
+ - id: sse.plugins.format.tes4-subrecord-order
67
+ claim: The TES4 record's subrecords, in the order xEdit declares them, are HEDR, OFST, DELE, CNAM,
68
+ SNAM, then repeating MAST+DATA pairs, then ONAM, SCRN, INTV and INCC.
69
+ status: community
70
+ source: TES5Edit wbDefinitionsTES5.pas, the wbRecord(TES4, 'Main File Header', ...) member list;
71
+ reproduced exactly by matortheeternal/esp.json data/SSE/TES4.json
72
+ tags:
73
+ - plugin
74
+ - tes4
75
+ - subrecord
76
+ - parser
77
+ - byte-layout
78
+ detail: OFST, DELE and SCRN appear in xEdit and esp.json but not on the UESP TES4 page. A parser
79
+ should skip unknown subrecords by their declared size rather than assume this exact set.
80
+ - id: sse.plugins.format.subrecord-header-is-6-bytes
81
+ claim: "A subrecord (field) header is 6 bytes — 4-byte signature plus uint16 data size — with one
82
+ exception: if the preceding field has the type XXXX, this field's size reads 0 and the real
83
+ size is the uint32 stored in that XXXX field."
84
+ status: community
85
+ source: en.uesp.net "Skyrim Mod:Mod File Format", section "Fields"
86
+ tags:
87
+ - plugin
88
+ - subrecord
89
+ - parser
90
+ - byte-layout
91
+ - gotcha
92
+ detail: The XXXX escape exists because a uint16 cannot express a field larger than 65535 bytes. It
93
+ does not occur inside TES4, so a header-only parser can ignore it, but any parser that walks
94
+ past the file header must handle it.
95
+ - id: sse.plugins.format.hedr-is-twelve-bytes
96
+ claim: "HEDR is a required 12-byte struct: float32 version, uint32 number of records and groups (not
97
+ counting the TES4 record itself), uint32 next available object ID."
98
+ status: community
99
+ source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", HEDR row; TES5Edit wbDefinitionsTES5.pas
100
+ (wbFloat('Version'), wbInteger('Number of Records', itU32), wbInteger('Next Object ID',
101
+ itU32), marked required)
102
+ tags:
103
+ - plugin
104
+ - tes4
105
+ - hedr
106
+ - parser
107
+ - byte-layout
108
+ - id: sse.plugins.format.mast-data-pairs-are-the-master-list
109
+ claim: Each master is a MAST subrecord (a zstring filename) immediately followed by an 8-byte DATA
110
+ subrecord. The masters are listed in the load order they had when the plugin was saved, and
111
+ the mod index of every FormID in the plugin refers to that order.
112
+ status: community
113
+ source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", MAST row; TES5Edit wbDefinitionsTES5.pas
114
+ wbRArray('Master Files', wbRStruct('Master File', [MAST, DATA]))
115
+ tags:
116
+ - plugin
117
+ - tes4
118
+ - mast
119
+ - masters
120
+ - formid
121
+ - load-order
122
+ detail: DATA is "Always 0. May be vestigial. In Tes3, the file size of the master was recorded
123
+ here." xEdit models it as an 8-byte array marked cpIgnore but required. Because FormID mod
124
+ indices are positional, reordering a plugin's masters without remapping its FormIDs silently
125
+ repoints every reference.
126
+ - id: sse.plugins.format.author-and-description-are-512-bytes
127
+ claim: CNAM holds the author and SNAM the description, each a Windows-1252 zero-terminated string
128
+ with a maximum size of 512 bytes including the terminator.
129
+ status: community
130
+ source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", CNAM and SNAM rows; Wrye Bash
131
+ Mopy/bash/game/__init__.py (max_author_length = 511, max_desc_length = 511)
132
+ tags:
133
+ - plugin
134
+ - tes4
135
+ - cnam
136
+ - snam
137
+ - author
138
+ - description
139
+ - limits
140
+ detail: "The two sources disagree on whether CNAM is required — xEdit marks it required, UESP marks
141
+ it optional. SNAM is worth reading beyond curiosity: Wrye Bash reads Bash Tags out of the
142
+ plugin description."
143
+ - id: sse.plugins.format.onam-only-in-esm-overriding-cell-children
144
+ claim: ONAM is an array of FormIDs (count = payload size / 4) that appears only in ESM-flagged files
145
+ which override their masters' cell children.
146
+ status: community
147
+ source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", ONAM row ("Observed in Update.esm as of Patch
148
+ 1.5.24")
149
+ tags:
150
+ - plugin
151
+ - tes4
152
+ - onam
153
+ - esm
154
+ - cell
155
+ detail: UESP lists the overridable types as ACHR, LAND, NAVM, PGRE, PHZD and REFR; xEdit's allowed
156
+ list is wider, adding PMIS, PARW, PBAR, PBEA, PCON and PFLA.
157
+ - id: sse.plugins.format.zstring-is-windows-1252
158
+ claim: A zstring in a plugin file is a zero-terminated string whose size counts the text plus one
159
+ terminator byte, encoded Windows-1252.
160
+ status: community
161
+ source: en.uesp.net "Skyrim Mod:File_Format_Conventions", section "Data Types"
162
+ tags:
163
+ - plugin
164
+ - encoding
165
+ - zstring
166
+ - windows-1252
167
+ - parser
168
+ detail: The same encoding governs Plugins.txt (see sse.loadorder.files.plugins-txt-is-windows-1252),
169
+ so a tool that gets one right and the other wrong will corrupt exactly the mods whose names
170
+ motivated the rule.
171
+ - id: sse.plugins.format.compressed-record-flag
172
+ claim: "A record whose flags include 0x00040000 stores its data compressed: a uint32 decompressed
173
+ size followed by dataSize minus 4 bytes of zlib data."
174
+ status: community
175
+ source: en.uesp.net "Skyrim Mod:Mod File Format", section "Records"; Ortham/esplugin src/record.rs
176
+ tests (self.flags & 0x0004_0000) != 0
177
+ tags:
178
+ - plugin
179
+ - compression
180
+ - zlib
181
+ - parser
182
+ detail: TES4 itself is never compressed, so a header-only parser is unaffected; any parser that
183
+ reads further must handle it or it will read garbage.
184
+ - id: sse.plugins.format.grup-size-includes-its-own-header
185
+ claim: A GRUP header is also 24 bytes, but unlike records and fields its size field counts the
186
+ header itself.
187
+ status: community
188
+ source: en.uesp.net "Skyrim Mod:Mod File Format", section "Groups" ("in contrast to records and
189
+ fields, whose sizes do not include their header sizes")
190
+ tags:
191
+ - plugin
192
+ - grup
193
+ - parser
194
+ - byte-layout
195
+ - gotcha
196
+ detail: Getting this backwards is the classic off-by-24 that makes a whole-file walk desynchronise
197
+ after the first group.
198
+ - id: sse.plugins.format.modindex-equal-to-master-count-is-the-plugins-own
199
+ claim: Inside a plugin, a FormID's top byte (its mod index) counts the plugin's masters in MAST
200
+ order, so a record whose mod index equals the number of masters is the plugin's own new
201
+ record, one with a lower index overrides that master's record, and one with a higher index
202
+ references a master the header does not list. This is how "new record" is decided for the
203
+ light-plugin range check without any load order.
204
+ status: community
205
+ source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", MAST ("The modindex of formids in the mod
206
+ file match the order of masters given here"); Ortham/esplugin src/record_id.rs
207
+ `ResolvedRecordId::from_form_id`, which matches a raw FormID against each master's
208
+ `mod_index_mask` (`i << 24`, built in src/plugin.rs `hashed_masters`) and sets
209
+ `overridden_record` only on a match, as used by src/plugin.rs `is_valid_as_light_plugin`;
210
+ dyndolod.info "Internal File FormID Is A HITME"
211
+ tags:
212
+ - formid
213
+ - modindex
214
+ - masters
215
+ - new-record
216
+ - override
217
+ - validator
218
+ detail: "esplugin splits the same FormIDs in two rather than three: a mod index that matches no
219
+ master is not an override, so the higher-than-master-count case counts as the plugin's own for
220
+ the light-range check. DynDOLOD, on that case - \"HITME stands for HIgher Than Master Entry\",
221
+ the message coming from xEdit's internal error check, and \"it can not be determined if the
222
+ record is an overwrite (and which master plugin it belongs to) or if the record is added as a
223
+ master record by the plugin itself\". ModWright's `sse.plugins.esl-range` warns on it for any
224
+ plugin it walks, light or not, and range-checks it as esplugin does."
@@ -0,0 +1,283 @@
1
+ game: skyrimse
2
+ topic: skse.runtime
3
+ title: SKSE64 — build-to-runtime coupling, log paths and lines, the Address Library, and the Papyrus
4
+ runtime log
5
+ facts:
6
+ - id: sse.skse.runtime.build-is-locked-to-one-runtime
7
+ claim: An SKSE64 build targets exactly one game runtime. As of 2026-09-11 the Anniversary Edition
8
+ build is 2.3.1 for game 1.7.104, the GOG build 2.2.6, the Special Edition build 2.0.20 for
9
+ game 1.5.97 and the VR build 2.0.12 for game 1.4.15.
10
+ status: community
11
+ source: skse.silverlock.org, the Downloads section; corroborated by github.com/ianpatt/skse64
12
+ skse64_common/skse_version.h (CURRENT_RELEASE_SKSE_STR "2.3.1", CURRENT_RELEASE_RUNTIME
13
+ RUNTIME_VERSION_1_7_104)
14
+ tags:
15
+ - skse
16
+ - version
17
+ - runtime
18
+ - compatibility
19
+ - compat-matrix
20
+ detail: The same page carries a warning dated 2026-08-14 that Bethesda has announced an incoming
21
+ Skyrim update, so this pairing is current but explicitly volatile. The GOG build's target
22
+ runtime is stated inconsistently - the front page says 1.6.1179, both readmes say 1.6.1170,
23
+ and skse_version.h enumerates both - so a compat rule should accept either.
24
+ - id: sse.skse.runtime.no-microsoft-store-or-epic-support
25
+ claim: SKSE does not support the Windows Store / Game Pass release of Skyrim, and does not support
26
+ the Epic Games Store release.
27
+ status: community
28
+ source: skse.silverlock.org, the "Compatibility" section
29
+ tags:
30
+ - skse
31
+ - compatibility
32
+ - storefront
33
+ - microsoft-store
34
+ - epic
35
+ - compat-matrix
36
+ detail: Worth a blocking advisory rule, because both storefronts are detectable - MO2 probes for
37
+ EOSSDK-Win64-Shipping.dll to identify an Epic install, and SKSE's own source has an EPIC
38
+ save-folder branch even though the build is unsupported.
39
+ - id: sse.skse.runtime.installs-into-the-game-root
40
+ claim: SKSE's .dll and .exe files go in the game root beside SkyrimSE.exe, not in Data. Its .pex
41
+ files go to Data\Scripts\ and are needed by every user; its .psc sources go to
42
+ Data\Scripts\Source\. The game must be started through skse64_loader.exe.
43
+ status: community
44
+ source: github.com/ianpatt/skse64 skse64_readme.txt, section "[ Installation ]"
45
+ tags:
46
+ - skse
47
+ - install
48
+ - paths
49
+ - loader
50
+ - deployment
51
+ detail: Verbatim - "Do not copy these files to the Data folder as with a normal mod" and "You or
52
+ your mod manager must continue to use the loader for SKSE64 to work." skse.ini is not shipped;
53
+ a user creates an empty <skyrim root>\Data\SKSE\skse.ini.
54
+ - id: sse.skse.runtime.log-directory-is-storefront-dependent
55
+ claim: SKSE writes skse64_loader.log and skse64.log to Documents\My Games\<SAVE_FOLDER_NAME>\SKSE\,
56
+ where SAVE_FOLDER_NAME is "Skyrim Special Edition" for Steam, "Skyrim Special Edition GOG" for
57
+ GOG and "Skyrim Special Edition EPIC" for Epic.
58
+ status: community
59
+ source: github.com/ianpatt/skse64 skse64_loader/main.cpp and skse64/skse64.cpp
60
+ (gLog.OpenRelative(CSIDL_MYDOCUMENTS, "\\My Games\\" SAVE_FOLDER_NAME "\\SKSE\\...")), with
61
+ SAVE_FOLDER_NAME selected by runtime type in skse64_common/skse_version.h
62
+ tags:
63
+ - skse
64
+ - logs
65
+ - path
66
+ - storefront
67
+ - gog
68
+ - epic
69
+ detail: The same three folder names libloadorder and MO2 derive independently for %LOCALAPPDATA% and
70
+ Documents\My Games. A log source that hardcodes the Steam name finds nothing on a GOG or Epic
71
+ install.
72
+ - id: sse.skse.runtime.logs-carry-no-timestamp-or-level
73
+ claim: Neither skse64.log nor skse64_loader.log carries a per-line timestamp or severity prefix. The
74
+ _ERROR / _WARNING / _MESSAGE macros only decide whether a line is written, not how it is
75
+ labelled.
76
+ status: community
77
+ source: github.com/ianpatt/common common/IDebugLog.cpp, IDebugLog::Message (writes an empty header
78
+ plus the message, indented by indentLevel * 4 spaces) and IDebugLog.h's level macros
79
+ tags:
80
+ - skse
81
+ - logs
82
+ - format
83
+ - classifier
84
+ - gotcha
85
+ detail: A log classifier must match on message text here, not on a bracketed level token - the
86
+ opposite of the spdlog-shaped logs most other modding frameworks produce.
87
+ - id: sse.skse.runtime.plugin-load-line-format
88
+ claim: Every SKSE plugin outcome is one line of the form `plugin <dll> (<dataVersion:08X> <name>
89
+ <pluginVersion:08X>) <reason> (handle N)`, where a failure inserts a numeric error code
90
+ between the reason and `(handle N)` and a success has the reason `loaded correctly` with no
91
+ code.
92
+ status: community
93
+ source: github.com/ianpatt/skse64 skse64/PluginManager.cpp, PluginManager::LogPluginLoadError and
94
+ PluginManager::LoadComplete
95
+ tags:
96
+ - skse
97
+ - logs
98
+ - format
99
+ - classifier
100
+ - plugin
101
+ detail: The extra numeric field before "(handle N)" is the discriminator between success and
102
+ failure. SKSE 2.0.20 printed the plugin's full path instead of the DLL name and had no
103
+ error-code field, so an old-format line also dates the install to the SE branch.
104
+ - id: sse.skse.runtime.plugin-rejection-reasons
105
+ claim: SKSE 2.3.1's rejection reasons are a fixed set of literal strings, including "disabled,
106
+ incompatible with current version of the game", "disabled, address library needs to be
107
+ updated", "must be recompiled for new address library", "couldn't load plugin", "no version
108
+ data", "reported as incompatible during load" and "disabled, requires newer script extender".
109
+ status: community
110
+ source: github.com/ianpatt/skse64 skse64/PluginManager.cpp (ScanPlugins, CheckAddressLibrary,
111
+ SafeCallLoadPlugin, CheckPluginCompatibility, InstallPlugins)
112
+ tags:
113
+ - skse
114
+ - logs
115
+ - classifier
116
+ - rejection
117
+ - plugin
118
+ - version
119
+ detail: Also present - "LE plugin cannot be used with SE", "does not appear to be an SKSE plugin",
120
+ "disabled, bad version data", "disabled, no name specified", "disabled, unsupported version
121
+ independence method", "disabled, only compatible with versions earlier than 1.6.629", and two
122
+ SEH variants. SKSE 2.0.20 additionally emitted "reported as incompatible during query". Two
123
+ user-facing remaps exist - skee64.dll is reported as RaceMenu, and EngineFixes.dll failing
124
+ with ERROR_MOD_NOT_FOUND is reported as "SSE Engine Fixes (Part 2) not installed".
125
+ - id: sse.skse.runtime.plugin-declares-a-data-symbol-not-a-query-function
126
+ claim: A modern SKSE plugin exports a data symbol SKSEPluginVersionData SKSEPlugin_Version plus bool
127
+ SKSEPlugin_Load(const SKSEInterface*). There is no SKSEPlugin_Query in the AE-era API; that
128
+ was the pre-AE SE model.
129
+ status: community
130
+ source: github.com/ianpatt/skse64 skse64/PluginAPI.h, the plugin API docs and the
131
+ SKSEPluginVersionData struct
132
+ tags:
133
+ - skse
134
+ - plugin
135
+ - api
136
+ - version
137
+ - declaration
138
+ detail: The struct carries dataVersion, pluginVersion, name[256], author[256], supportEmail[252],
139
+ versionIndependenceEx, versionIndependence, compatibleVersions[16] (a zero-terminated list of
140
+ RUNTIME_VERSION_ values) and seVersionRequired. A plugin that is not version-independent must
141
+ name the exact runtime in compatibleVersions or it is rejected.
142
+ - id: sse.skse.runtime.address-library-file-naming
143
+ claim: SKSE looks for the Address Library at
144
+ Data\SKSE\Plugins\versionlib-<major>-<minor>-<build>-0.bin, with a literal 0 in the fourth
145
+ position rather than the runtime type.
146
+ status: community
147
+ source: github.com/ianpatt/skse64 skse64/PluginManager.cpp, PluginManager::CheckAddressLibrary's
148
+ _snprintf_s format string
149
+ tags:
150
+ - skse
151
+ - address-library
152
+ - versionlib
153
+ - path
154
+ - compat-matrix
155
+ - id: sse.skse.runtime.address-library-stem-differs-between-se-and-ae
156
+ claim: The Address Library filename stem differs by branch, not only by version numbers - AE builds
157
+ use versionlib-<version>.bin, SE (1.5.97) uses version-<version>.bin, and VR uses
158
+ version-<version>.csv.
159
+ status: community
160
+ source: github.com/alandtse/CommonLibSSE-NG include/REL/IDDB.h, IDDB::load() (selects
161
+ "versionlib-{}.bin" when Module::IsAE(), "version-{}.bin" otherwise, "version-{}.csv" for VR)
162
+ tags:
163
+ - skse
164
+ - address-library
165
+ - versionlib
166
+ - se-vs-ae
167
+ - vr
168
+ - compat-matrix
169
+ - gotcha
170
+ detail: The same header names four database generations - SSEv1, SSEv2, SSEv5 and VR - with format 5
171
+ arriving at 1.7.99 and being dense and direct-indexed where formats 1 and 2 are sparse and
172
+ sorted by id. That transition is what SKSE's "must be recompiled for new address library"
173
+ rejection and the kVersionIndependentEx_AddressLibraryV5 flag are about.
174
+ - id: sse.skse.runtime.address-library-failure-strings
175
+ claim: An Address Library failure surfaces in the plugin's own log or a message box, not in
176
+ skse64.log, with one of three literal messages - "Unsupported address library format", "Failed
177
+ to find the id within the address library", or "Failed to locate an appropriate address
178
+ library with the path".
179
+ status: community
180
+ source: github.com/Ryan-rsm-McKenzie/CommonLibSSE include/REL/Relocation.h, IDDatabase's
181
+ report_and_fail calls
182
+ tags:
183
+ - skse
184
+ - address-library
185
+ - logs
186
+ - classifier
187
+ - error
188
+ - id: sse.skse.runtime.commonlibsse-plugin-logs
189
+ claim: A CommonLibSSE-based plugin writes <PluginName>.log into the same SKSE log folder, with the
190
+ default spdlog pattern "[%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%t] [%s:%#] %v".
191
+ status: community
192
+ source: github.com/alandtse/CrashLoggerSSE src/main.cpp, InitializeLogging() and its comment naming
193
+ "the standard SKSE logging directory at Documents/My Games/Skyrim Special Edition/SKSE (or
194
+ Skyrim VR if you are using VR)"
195
+ tags:
196
+ - skse
197
+ - logs
198
+ - plugin
199
+ - spdlog
200
+ - format
201
+ - classifier
202
+ detail: So plugin logs do carry a bracketed level, unlike SKSE's own two. Individual plugins may
203
+ override the pattern.
204
+ - id: sse.skse.runtime.crashloggersse-log-naming
205
+ claim: CrashLoggerSSE writes crash-YYYY-MM-DD-HH-MM-SS.log, by default into the SKSE log folder but
206
+ into a configurable crashDirectory when one is set, with the logger pattern set to "%v" so no
207
+ line carries a timestamp of its own.
208
+ status: community
209
+ source: github.com/alandtse/CrashLoggerSSE src/Crash/CommonHeader.cpp (get_timestamped_log, called
210
+ with the prefix "crash-") and src/main.cpp (SetupCrashLogPath)
211
+ tags:
212
+ - crash-log
213
+ - crashloggersse
214
+ - path
215
+ - format
216
+ - classifier
217
+ detail: "Its section headers are PROBABLE CALL STACK:, RAW CALL STACK:, REGISTERS:, STACK:,
218
+ MODULES:, SKSE PLUGINS: and PLUGINS:, and its light plugin lines read [FE:53C] Name.esp with a
219
+ colon. Trainwreck, the other common crash logger, uses SCRIPT EXTENDER PLUGINS: and [FE 53C]
220
+ with a space, which is the cheapest way to tell the two formats apart."
221
+ - id: sse.skse.runtime.papyrus-log-needs-enabling
222
+ claim: The Papyrus log is off by default and is enabled by [Papyrus] bEnableLogging=1 in Skyrim.ini,
223
+ usually alongside bEnableTrace=1 and bLoadDebugInformation=1 (which adds line numbers to error
224
+ traces at the cost of memory).
225
+ status: community
226
+ source: stepmodifications.org "Guide:Skyrim INI/Papyrus" (the [Papyrus] settings table) and
227
+ "Guide:Troubleshooting", the Clean Savegame Procedure
228
+ tags:
229
+ - papyrus
230
+ - logs
231
+ - ini
232
+ - skyrim-ini
233
+ - enablement
234
+ detail: "An absent Papyrus log almost always means bEnableLogging is 0, not that anything is broken
235
+ - which is exactly what a surface's explainMissing hook should say. The same section's
236
+ defaults are self-validating against a real log's header line \"Memory page: 128 (min) 512
237
+ (max) 76800 (max total)\"."
238
+ - id: sse.skse.runtime.papyrus-log-path-and-rotation
239
+ claim: "With logging on the game writes Documents\\My Games\\Skyrim Special
240
+ Edition\\Logs\\Script\\Papyrus.#.log for # from 0 to 3, where Papyrus.0.log is always the
241
+ newest and Papyrus.3.log the oldest."
242
+ status: community
243
+ source: stepmodifications.org "Guide:Troubleshooting", section "Clean Savegame Procedure"
244
+ tags:
245
+ - papyrus
246
+ - logs
247
+ - path
248
+ - rotation
249
+ detail: Because 0 is replaced rather than appended on each run, an incremental log reader will
250
+ legitimately see this file as rotated on every launch. Whether the Logs\Script folder follows
251
+ the GOG/EPIC rename that SKSE's SAVE_FOLDER_NAME applies is not sourced.
252
+ - id: sse.skse.runtime.papyrus-line-format
253
+ claim: 'A Papyrus log line is "[MM/DD/YYYY - HH:MM:SSAM] <message>", with a capitalized "Error: " or
254
+ "Warning: " immediately after the bracket when present. An error with a stack is followed by a
255
+ bare "stack:" line and tab-indented frames of the form <receiver>.<script>.<function>() -
256
+ "<source>" Line <n>.'
257
+ status: community
258
+ source: a captured Papyrus.0.log at github.com/sswalters/Skyrim/blob/master/papyrus%20log%200
259
+ tags:
260
+ - papyrus
261
+ - logs
262
+ - format
263
+ - classifier
264
+ - stack-trace
265
+ detail: <receiver> is one of <unknown self>, [EditorID (FormID)], [alias <Name> on quest <Quest>
266
+ (FormID)], or [ (FormID)] when the editor ID is blank; <source> is a .psc name, "<native>" or
267
+ "<savegame>"; "Line ?" appears when bLoadDebugInformation is off.
268
+ - id: sse.skse.runtime.papyrus-missing-store-line-has-no-severity
269
+ claim: 'The line `Cannot open store for class "X", missing file?` - meaning a script the save
270
+ references is no longer installed - carries no Error: or Warning: prefix at all.'
271
+ status: community
272
+ source: the same captured Papyrus.0.log (github.com/sswalters/Skyrim/blob/master/papyrus%20log%200)
273
+ tags:
274
+ - papyrus
275
+ - logs
276
+ - classifier
277
+ - gotcha
278
+ - missing-script
279
+ detail: 'One of the most diagnostic lines in the whole log, and a level-gated classifier will miss
280
+ every instance of it. The companion families that DO carry a prefix are "Error: Unable to bind
281
+ script X to Y (FormID) because their base types do not match" and "Warning: Property X on
282
+ script Y attached to Z (FormID) cannot be initialized because the script no longer contains
283
+ that property".'