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,217 @@
1
+ game: valheim
2
+ topic: thunderstore.packaging
3
+ title: Thunderstore packaging, tcli, and the r2modman profile as a second deploy target
4
+ facts:
5
+ - id: valheim.thunderstore.packaging.required-zip-contents
6
+ claim: A Thunderstore package is a zip whose root contains exactly three required files —
7
+ `manifest.json`, `icon.png` and `README.md` — and the docs state "File naming is
8
+ case-sensitive and must match the above exactly!". `icon.png` "must be exactly 256x256 in
9
+ resolution and in PNG format". `CHANGELOG.md` is optional but supported.
10
+ status: community
11
+ source: https://wiki.thunderstore.io/mods/creating-a-package ; CHANGELOG.md from
12
+ https://wiki.thunderstore.io/mods/updating-a-package
13
+ tags:
14
+ - thunderstore
15
+ - packaging
16
+ - manifest
17
+ - icon
18
+ - readme
19
+ - validator
20
+ - build
21
+ detail: "All four of these are checkable from a mod folder with no game installed: the three files
22
+ exist at the zip root, the names are exactly cased, and the PNG's IHDR says 256x256. That
23
+ makes packaging the single cheapest validator family to build for this game."
24
+ - id: valheim.thunderstore.packaging.manifest-fields
25
+ claim: '`manifest.json` carries five fields. `name` — "no spaces. Allowed characters: a-z A-Z 0-9
26
+ _", max 128 characters. `description` — max 250 characters. `version_number` — the
27
+ three-number `Major.Minor.Patch` semantic version, no suffixes. `dependencies` — a list of
28
+ strings. `website_url` — optional, but an empty string must still be present.'
29
+ status: community
30
+ source: https://wiki.thunderstore.io/mods/creating-a-package
31
+ tags:
32
+ - thunderstore
33
+ - manifest
34
+ - schema
35
+ - validator
36
+ - version
37
+ detail: Each number is a full integer compared ordinally, so `1.0.10` is nine patches above `1.0.1`,
38
+ not below it — a real source of mis-ordered releases. Thunderstore always displays the highest
39
+ version regardless of upload date. Underscores in `name` render as spaces in most views.
40
+ - id: valheim.thunderstore.packaging.dependency-string-format
41
+ claim: Every entry in `dependencies` is a single string of the form `{team name}-{package
42
+ name}-{package version}`, e.g. `MythicManiac-TestMod-1.1.0`; the mod managers install these
43
+ automatically.
44
+ status: community
45
+ source: https://wiki.thunderstore.io/mods/creating-a-package
46
+ tags:
47
+ - thunderstore
48
+ - dependencies
49
+ - format
50
+ - validator
51
+ detail: "The three-part hyphenated form is parseable but ambiguous in principle — team and package
52
+ names may themselves contain no hyphen, since the allowed character set is `a-z A-Z 0-9 _`, so
53
+ splitting on the last two hyphens is safe. A real Valheim example: Jötunn's own manifest
54
+ depends on exactly one package, `denikson-BepInExPack_Valheim-5.4.2333`."
55
+ - id: valheim.thunderstore.packaging.versions-are-immutable
56
+ claim: A published version can never be re-uploaded or edited — "Package versions are immutable!
57
+ Once a version is successfully uploaded, it can no longer be edited", for conflict-freeness
58
+ and caching reasons. Updating means keeping `name` identical and incrementing
59
+ `version_number`.
60
+ status: community
61
+ source: https://wiki.thunderstore.io/mods/updating-a-package
62
+ tags:
63
+ - thunderstore
64
+ - publishing
65
+ - immutable
66
+ - version
67
+ detail: "This makes a pre-publish validator worth strictly more here than on a platform that allows
68
+ replacing a file: a bad `manifest.json` that reaches Thunderstore is permanent and can only be
69
+ superseded, never fixed."
70
+ - id: valheim.thunderstore.packaging.bepinex-folder-routing
71
+ claim: Thunderstore's mod managers only preserve folder structure inside specifically named folders
72
+ — `BepInEx/plugins`, `/core`, `/patchers`, `/monomod` and `/config` — and the `BepInEx` prefix
73
+ may be omitted; contents of any other folder are flattened on install.
74
+ status: community
75
+ source: https://wiki.thunderstore.io/mods/packaging-your-mods
76
+ tags:
77
+ - thunderstore
78
+ - packaging
79
+ - bepinex
80
+ - routing
81
+ - layout
82
+ - build
83
+ detail: "This is a build-step rule, not just advice: a package that puts its DLL under a folder name
84
+ outside that set installs as a loose file in an unpredictable place. A ModWright `build` for
85
+ this game should stage into exactly these routes."
86
+ - id: valheim.thunderstore.packaging.ecosystem-install-rules
87
+ claim: "Thunderstore's ecosystem schema declares Valheim's install routes explicitly:
88
+ `BepInEx/plugins` (default location, default extension `.dll`, tracking method `subdir`),
89
+ `BepInEx/core`, `BepInEx/patchers`, `BepInEx/monomod` (default extension `.mm.dll`),
90
+ `BepInEx/SlimVML` — all `subdir` — and `BepInEx/config` with tracking method `none`."
91
+ status: community
92
+ source: https://github.com/thunderstore-io/ecosystem-schema/blob/main/games/data/generated/valheim.yml,
93
+ the `installRules` list (identical for the game and the dedicated server)
94
+ tags:
95
+ - thunderstore
96
+ - install-rules
97
+ - modroots
98
+ - conflictscope
99
+ - config
100
+ detail: "That `subdir` versus `none` distinction is exactly ModWright's `conflictScope`: a `subdir`
101
+ route gives every package its own directory (`isolated`), while `config` is tracked as `none`
102
+ because config files are loose, shared and merged across mods (`merged`). Having the ecosystem
103
+ schema state it removes the guesswork from the roots table."
104
+ - id: valheim.thunderstore.packaging.tcli-does-not-compile
105
+ claim: '`tcli` (thunderstore-cli, latest release 0.2.5, 2025-12-16; installable with `dotnet tool
106
+ install -g tcli`) builds and publishes packages from a `thunderstore.toml` config: `tcli init`
107
+ writes the config plus a default icon and README, `tcli build` zips the project per the
108
+ `[[build.copy]]` mappings, and `tcli publish` uploads. It explicitly does not compile code —
109
+ "any actual build actions ... must be performed separately".'
110
+ status: community
111
+ source: https://github.com/thunderstore-io/thunderstore-cli (README and wiki); version from the
112
+ repository's releases
113
+ tags:
114
+ - tcli
115
+ - thunderstore
116
+ - toolchain
117
+ - build
118
+ - packaging
119
+ - dotnet
120
+ detail: "That division is a clean fit for ModWright's `core/toolchain` and `core/build`: `dotnet
121
+ build` is one tool spec producing the DLL, `tcli build` is a second producing the zip, and the
122
+ staging between them is ModWright's own. The NuGet-distributed `tcli` excludes mod
123
+ installation; the standalone GitHub release includes it."
124
+ - id: valheim.thunderstore.packaging.thunderstore-toml-dependency-shape-differs
125
+ claim: "`thunderstore.toml`'s `[package.dependencies]` is a TOML table mapping `\"Namespace-Name\" =
126
+ \"version\"`, which is a *different* shape from `manifest.json`'s flat
127
+ `\"Namespace-Name-version\"` strings; tcli assembles the manifest from the toml."
128
+ status: inferred
129
+ source: "`ThunderstoreCLI/Models/ThunderstoreProject.cs` in
130
+ https://github.com/thunderstore-io/thunderstore-cli, compared against
131
+ https://wiki.thunderstore.io/mods/creating-a-package"
132
+ tags:
133
+ - tcli
134
+ - thunderstore
135
+ - toml
136
+ - manifest
137
+ - dependencies
138
+ - validator
139
+ detail: A validator must therefore know which file it is looking at. Checking a `thunderstore.toml`
140
+ dependency against the `manifest.json` three-part regex would reject every correct entry, and
141
+ vice versa.
142
+ - id: valheim.thunderstore.packaging.r2modman-profile-path
143
+ claim: An r2modman profile lives at `<ROOT>/<internalFolderName>/profiles/<ProfileName>`, where
144
+ `ROOT` is the user's configured data directory or, by default, `<Electron
145
+ appData>/r2modmanPlus-local` — on Windows `%APPDATA%\r2modmanPlus-local`. Valheim's
146
+ `internalFolderName` is `Valheim`, so the default Windows profile path is
147
+ `%APPDATA%\r2modmanPlus-local\Valheim\profiles\Default`.
148
+ status: inferred
149
+ source: r2modmanPlus `src/App.vue` (`PathResolver.APPDATA_DIR = path.join(appData,
150
+ 'r2modmanPlus-local')`), `src/model/game/GameManager.ts` (`MOD_ROOT = path.join(ROOT,
151
+ game.internalFolderName)`), `src/model/Profile.ts` (`path.join(MOD_ROOT, 'profiles')`), and
152
+ `src/assets/data/ecosystem.json` for `internalFolderName`
153
+ tags:
154
+ - r2modman
155
+ - profile
156
+ - path
157
+ - deploy
158
+ - modroots
159
+ - windows
160
+ detail: The r2modman wiki documents profile export and import but not the on-disk layout, so this is
161
+ read from source, not prose. The user-configurable data directory means the path must be
162
+ treated as a candidate rather than a constant — a Valheim surface should probe it and say "not
163
+ found" rather than assert it.
164
+ - id: valheim.thunderstore.packaging.r2modman-profile-is-a-whole-bepinex-install
165
+ claim: r2modman's BepInEx installer copies everything from the BepInEx package root into the profile
166
+ root except `manifest.json`, `readme.md` and `icon.png`, so a Valheim profile directory
167
+ contains a complete BepInEx install — `BepInEx/` with `core`, `plugins`, `config` and
168
+ `patchers`, plus `winhttp.dll` and `doorstop_config.ini` — living entirely outside the game
169
+ directory.
170
+ status: inferred
171
+ source: r2modmanPlus `src/installers/BepInExInstaller.ts` (the `basePackageFiles` exclusion list),
172
+ combined with BepInExPack_Valheim's own shipped contents
173
+ tags:
174
+ - r2modman
175
+ - profile
176
+ - bepinex
177
+ - deploy
178
+ - alternate-root
179
+ detail: This is the reason a Valheim surface cannot assume mod roots are relative to the game
180
+ install. The same logical root — "BepInEx plugins" — resolves to two entirely different
181
+ absolute paths depending on how the user launches, and both can exist at once on one machine.
182
+ - id: valheim.thunderstore.packaging.r2modman-launches-via-doorstop-args
183
+ claim: r2modman does not copy anything into the game folder to activate a profile; it appends
184
+ Doorstop command-line arguments to the Steam launch. For Doorstop 3 that is `--doorstop-enable
185
+ true --doorstop-target <profile>/BepInEx/core/<preloader dll>` and for Doorstop 4
186
+ `--doorstop-enabled true --doorstop-target-assembly <profile>/BepInEx/core/<preloader dll>`; a
187
+ vanilla launch passes `--doorstop-enable false`.
188
+ status: inferred
189
+ source: r2modmanPlus
190
+ `src/r2mm/launching/instructions/instructions/loader/BepInExGameInstructions.ts`
191
+ (`genDoorstopV3` / `genDoorstopV4`)
192
+ tags:
193
+ - r2modman
194
+ - doorstop
195
+ - launch
196
+ - profile
197
+ - deploy
198
+ detail: Two consequences. A machine can have BepInEx installed in the game folder *and* several
199
+ r2modman profiles, and which one is live is decided at launch time by an argument ModWright
200
+ cannot see from the filesystem — so "which install is active" is genuinely undeterminable and
201
+ must be reported as such rather than guessed. And on Windows the profile is identified purely
202
+ by the absolute `--doorstop-target` path, with no profile-name argument to read back.
203
+ - id: valheim.thunderstore.packaging.nexus-is-the-second-channel
204
+ claim: "Thunderstore is not the only distribution channel for Valheim mods: Nexus Mods is the other
205
+ long-standing one, and the community's own 1.0 FAQ also names Hexium, reached through the Gale
206
+ mod manager, as a newer host."
207
+ status: community
208
+ source: https://github.com/Valheim-Modding/Wiki/wiki/Valheim-1.0-FAQ
209
+ tags:
210
+ - nexus
211
+ - thunderstore
212
+ - hexium
213
+ - gale
214
+ - distribution
215
+ detail: Only Thunderstore has a machine-readable package format with a documented schema, which is
216
+ why it is the only one a ModWright build step can target without scraping. Nexus is a manual
217
+ upload of an archive whose internal layout is by convention only.
@@ -0,0 +1,111 @@
1
+ game: valheim
2
+ topic: toolchain.build
3
+ title: what builds and packs a Valheim plugin unattended, and what does not
4
+ facts:
5
+ - id: valheim.toolchain.build.dotnet-is-the-compiler-and-prints-a-bare-version
6
+ claim: A plugin is compiled with the .NET SDK's `dotnet build` (the wiki's environment guide targets
7
+ .NET Framework 4.8 through the SDK's msbuild), and `dotnet --version` prints the SDK version
8
+ alone on one line (e.g. `8.0.404`), which is the one tool in ModWright's catalogue with a real
9
+ installer and a fixed Program Files path.
10
+ status: community
11
+ source: https://learn.microsoft.com/dotnet/core/tools/dotnet
12
+ tags:
13
+ - dotnet
14
+ - sdk
15
+ - build
16
+ - version
17
+ - toolchain
18
+ - installer
19
+ detail: The toolchain spec `dotnet` probes `--version` and matches the leading dotted number; its
20
+ candidates are `C:/Program Files/dotnet/dotnet.exe` and PATH. Which SDK feature band a given
21
+ plugin needs is the project's business (`global.json`), not the spec's.
22
+ - id: valheim.toolchain.build.tcli-packs-but-does-not-compile
23
+ claim: tcli (thunderstore-cli) is installed as a global .NET tool (`dotnet tool install -g tcli`,
24
+ landing in `%USERPROFILE%\.dotnet\tools`) and drives `init`, `build` and `publish` from a
25
+ `thunderstore.toml`; it assembles manifest.json and the zip but performs no compilation — "the
26
+ build command only supports creation of zip files from files already existing on the
27
+ filesystem … any actual build actions (e.g. building the c# project for your mod) must be
28
+ performed separately". Its help output does list a `version` command and a `--version` flag on
29
+ every verb, but the shape of what they print has not been read from a run, so ModWright's spec
30
+ leaves version detection unset rather than guess at a pattern.
31
+ status: community
32
+ source: https://github.com/thunderstore-io/thunderstore-cli;
33
+ https://github.com/thunderstore-io/thunderstore-cli/wiki
34
+ tags:
35
+ - tcli
36
+ - thunderstore
37
+ - pack
38
+ - publish
39
+ - toolchain
40
+ - version
41
+ detail: The build pipeline is therefore `dotnet build -c Release`, ModWright's own staging of
42
+ `BepInEx/plugins/<Mod>/` plus the three root files, then `tcli build`; the packaging
43
+ validators gate the last step, since a published version is immutable.
44
+ related:
45
+ - valheim.thunderstore.packaging.tcli-does-not-compile
46
+ - valheim.thunderstore.packaging.thunderstore-toml-dependency-shape-differs
47
+ - id: valheim.toolchain.build.icon-must-be-a-256-png
48
+ claim: "The package icon is checked by its PNG header alone: the eight-byte PNG signature followed
49
+ by the IHDR chunk, whose width and height (big-endian at offsets 16 and 20) must both be 256.
50
+ Thunderstore's own wording is \"exactly 256x256 in resolution and in PNG format\", and the
51
+ file name is `icon.png` exactly."
52
+ status: community
53
+ source: https://wiki.thunderstore.io/mods/creating-a-package (icon rule); the PNG specification's
54
+ file structure (signature, then IHDR as the first chunk)
55
+ tags:
56
+ - thunderstore
57
+ - icon
58
+ - png
59
+ - ihdr
60
+ - validator
61
+ detail: "`readPngDimensions` in `src/surfaces/valheim/packaging.ts` reads 24 bytes and nothing else;
62
+ a JPEG renamed to icon.png, or a 512-pixel icon, is a block before upload rather than a
63
+ rejected upload."
64
+ - id: valheim.toolchain.build.guid-to-package-name-has-no-registry
65
+ claim: "Nothing maps a BepInEx plugin GUID (`com.jotunn.jotunn`) to its Thunderstore package name
66
+ (`ValheimModding-Jotunn`): the manifest lists packages, the attribute lists GUIDs, and the two
67
+ are only related by convention. A cross-check between them can only match names heuristically
68
+ (the package name against the GUID's dot-separated segments, ignoring case, `_` and `-`), and
69
+ must say so in its finding."
70
+ status: inferred
71
+ source: Thunderstore's manifest and dependency-string format
72
+ (https://wiki.thunderstore.io/mods/creating-a-package) against BepInEx's
73
+ `[BepInDependency(guid)]` contract (v5-lts Contract/Attributes.cs); no registry or schema
74
+ field joins them in either project's documentation
75
+ tags:
76
+ - bepinex
77
+ - thunderstore
78
+ - dependency
79
+ - guid
80
+ - package
81
+ - crosscheck
82
+ - heuristic
83
+ detail: "`valheim.plugins.dependency-crosscheck` is built on this: a hard [BepInDependency] with no
84
+ name-matching manifest package warns, a manifest package (other than the loader pack, which
85
+ has no plugin GUID) that no attribute names is an info, and both findings say the match is by
86
+ name. A package whose name differs from its GUID is a known false positive."
87
+ related:
88
+ - valheim.bepinex.plugins.dependency-attributes
89
+ - valheim.thunderstore.packaging.dependency-string-format
90
+ - id: valheim.toolchain.build.bepinexpack-leaves-only-its-scripts-behind
91
+ claim: "Once installed, denikson's BepInExPack_Valheim leaves nothing on disk that names its own
92
+ version: r2modman copies everything from the package except manifest.json, README and icon,
93
+ and a manual install copies the archive's contents. What it leaves that stock BepInEx does not
94
+ are its run scripts (`start_game_bepinex.sh`, `start_server_bepinex.sh`) and the
95
+ `doorstop_libs/` folder, so the pack can be detected by presence only, and its version is
96
+ known only from the console line it prints at startup."
97
+ status: inferred
98
+ source: https://thunderstore.io/c/valheim/p/denikson/BepInExPack_Valheim/
99
+ tags:
100
+ - bepinexpack
101
+ - detect
102
+ - compat
103
+ - presence
104
+ - version
105
+ - marker
106
+ detail: "`src/surfaces/valheim/compat.ts` reports `bepinexpack` installed when any marker is present
107
+ and never invents a version. The exact wording of the startup line has not been read from a
108
+ real log, so no signature captures it yet."
109
+ related:
110
+ - valheim.bepinex.loader.bepinexpack-valheim-is-the-distribution
111
+ - valheim.bepinexpack-valheim-install-shape
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "modwright",
3
+ "version": "0.1.0",
4
+ "description": "A game-agnostic MCP server for game modding, with per-game surfaces.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "modwright": "dist/index.js"
9
+ },
10
+ "engines": {
11
+ "node": ">=20"
12
+ },
13
+ "license": "MIT",
14
+ "author": "Jonathan Trachtenberg",
15
+ "keywords": [
16
+ "mcp",
17
+ "modding",
18
+ "cyberpunk2077",
19
+ "baldursgate3",
20
+ "skyrim"
21
+ ],
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.22.0",
24
+ "smol-toml": "^1.8.0",
25
+ "sql.js": "^1.14.2",
26
+ "yaml": "^2.9.0",
27
+ "zod": "^3.25.76"
28
+ }
29
+ }
@@ -0,0 +1,148 @@
1
+ # new-class-injection (BG3).
2
+ # Injects spells/passives into a *foreign* class's list at runtime via the
3
+ # Compatibility Framework, rather than authoring a Progression/
4
+ # ClassDescription/SpellList node of its own — the G6 rules this satisfies
5
+ # (subclass-registered-in-parent, type-matches-owner, tableuuid-matches-
6
+ # owner, no-removespells) are all project-target rules over Progression/
7
+ # ClassDescription nodes; a project with none of its own trivially passes
8
+ # them, which is the point: this scaffold's whole risk surface is the Lua
9
+ # module, not a new stats table.
10
+ id: baldursgate3.new-class-injection
11
+ game: baldursgate3
12
+ title: New BG3 class injection (Compatibility Framework)
13
+ summary: Write a Compatibility Framework Lua module that injects spells/passives into an existing (possibly foreign) class's list, plus an MCM Blueprint stub and the two framework dependencies.
14
+ modTypes: [class, subclass, feat]
15
+ needs: {}
16
+ inputs:
17
+ - type: string
18
+ name: targetList
19
+ prompt: "Target SpellList/PassiveList or class name this injects into."
20
+ pattern: "^[A-Za-z][A-Za-z0-9_]*$"
21
+ - type: string
22
+ name: injectedSpells
23
+ prompt: "Comma-separated spell entry names to inject (blank for none)."
24
+ default: ""
25
+ - type: string
26
+ name: injectedPassives
27
+ prompt: "Comma-separated passive entry names to inject (blank for none)."
28
+ default: ""
29
+ - type: string
30
+ name: mcmKey
31
+ prompt: "MCM settings key prefix for the toggle(s) this injection exposes."
32
+ ids: []
33
+ emits:
34
+ - op: ensure-dir
35
+ path: "Mods/${project.identity.folder}/ScriptExtender/Lua/Injections"
36
+ - op: write-text
37
+ path: "Mods/${project.identity.folder}/ScriptExtender/Lua/Injections/${input.targetList}_Injection.lua"
38
+ body: |
39
+ -- ${project.today} — ModWright scaffold: injects into "${input.targetList}" via the
40
+ -- Compatibility Framework. Never modifies the target mod's own files.
41
+ local Injection = {}
42
+
43
+ Injection.targetList = "${input.targetList}"
44
+ Injection.spells = { "${input.injectedSpells}" }
45
+ Injection.passives = { "${input.injectedPassives}" }
46
+
47
+ Ext.Require("CompatibilityFramework/API.lua")
48
+
49
+ CompatibilityFramework.RegisterListInjection({
50
+ target = Injection.targetList,
51
+ spells = Injection.spells,
52
+ passives = Injection.passives,
53
+ enabledSetting = "${input.mcmKey}_enabled",
54
+ })
55
+
56
+ return Injection
57
+ - op: write-text
58
+ path: "Mods/${project.identity.folder}/ScriptExtender/Lua/Injections/${input.targetList}_MCM.lua"
59
+ body: |
60
+ -- ${project.today} — ModWright scaffold: MCM Blueprint stub for the
61
+ -- ${input.targetList} injection's on/off toggle.
62
+ return {
63
+ SchemaVersion = 1,
64
+ ModName = "${project.identity.folder}",
65
+ Tabs = {
66
+ {
67
+ TabId = "${input.mcmKey}",
68
+ TabName = "${input.targetList} injection",
69
+ Sections = {
70
+ {
71
+ SectionId = "${input.mcmKey}_section",
72
+ SectionName = "Options",
73
+ Settings = {
74
+ {
75
+ Id = "${input.mcmKey}_enabled",
76
+ Name = "Enable injection",
77
+ Type = "checkbox",
78
+ Default = true,
79
+ },
80
+ },
81
+ },
82
+ },
83
+ },
84
+ },
85
+ }
86
+ - op: patch-project
87
+ add:
88
+ dependencies:
89
+ - id: compatibility-framework
90
+ kind: framework
91
+ minVersion: "1.0"
92
+ url: "https://www.nexusmods.com/baldursgate3/mods/2050"
93
+ notes: "RegisterListInjection: injects spells/passives into a foreign mod's list without editing its files."
94
+ - id: mcm
95
+ kind: framework
96
+ minVersion: "1.0"
97
+ url: "https://www.nexusmods.com/baldursgate3/mods/2278"
98
+ notes: "MCM Blueprint stub exposes the injection's on/off toggle."
99
+ templates: []
100
+ satisfies:
101
+ - bg3.progression.spelllist-selector-resolves
102
+ - bg3.progression.passives-exist
103
+ - bg3.progression.no-removespells
104
+ - bg3.progression.subclass-registered-in-parent
105
+ - bg3.progression.type-matches-owner
106
+ - bg3.progression.tableuuid-matches-owner
107
+ manual:
108
+ - title: Confirm the injection at runtime
109
+ steps:
110
+ - "Load a save with both this mod and the target list's owning mod active."
111
+ - "Toggle ${input.mcmKey}_enabled off/on in the MCM menu and confirm the injected entries appear/disappear."
112
+ expected: "The target list shows the injected spells/passives only while the MCM toggle is on."
113
+ claim:
114
+ idSuffix: injects
115
+ claim: "With the Compatibility Framework and the target mod present, ${input.targetList} gains the injected spells/passives."
116
+ testRows:
117
+ - gate: C-1
118
+ title: "Injection Lua loads without error"
119
+ expected: "RED4ext/SE-equivalent log shows the injection module loaded with no Lua error."
120
+ manual: true
121
+ probeKinds: []
122
+ - gate: C-2
123
+ title: "Target list carries the injected entries"
124
+ # No automated probe here, for two independent reasons.
125
+ #
126
+ # 1. ${input.targetList} is a SpellList/PassiveList (or a class name) —
127
+ # an LSX resource, not a stats entry — so bg3.stat.exists, which is
128
+ # Ext.Stats.Get plus Ext.Stats.GetStats over the 13 stat types the
129
+ # bridge lists (bridges/bg3-se/.../Probes.lua STAT_TYPES: StatusData,
130
+ # SpellData, PassiveData, Armor, Weapon, Character, Object, SpellSet,
131
+ # EquipmentSet, TreasureTable, TreasureCategory, ItemGroup,
132
+ # NameGroup), would report `fail` for a target that is perfectly fine.
133
+ # 2. Even for a stats entry, bg3.stat.fields is not a verbatim
134
+ # "field -> value map" the way it might read: the
135
+ # bridge's own handler returns `status = fail` when ANY requested
136
+ # field comes back nil (Probes.lua, `#missing == 0 and
137
+ # #unreadable == 0`). Asking for both Spells and Passives would
138
+ # therefore fail on a list that legitimately carries only the one
139
+ # ${input.injectedSpells}/${input.injectedPassives} names — and which
140
+ # of the two applies is a per-run choice this scaffold's fixed
141
+ # `probes[]` cannot branch on (it has no expression language).
142
+ #
143
+ # The enabled-vs-disabled comparison needs a human regardless: one
144
+ # arm/poll only ever samples one MCM toggle state.
145
+ expected: "A human confirms the injected entries are in ${input.targetList} with the MCM toggle on and gone with it off (the list is an LSX resource, not a stats entry, so bg3.stat.exists/bg3.stat.fields cannot check it)."
146
+ manual: true
147
+ probeKinds: []
148
+ evidence: ["ModWright research"]