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,202 @@
1
+ game: stardewvalley
2
+ topic: game.versions
3
+ title: Game versions, the version axes, and the 1.6 data-format break
4
+ facts:
5
+ - id: stardewvalley.game.versions.current-is-1-6-15
6
+ claim: The current Stardew Valley release is 1.6.15, published 20 December 2024 — twenty-one months
7
+ before this research. The preceding chain is 1.6.14 (12 November 2024), 1.6.13 (8 November
8
+ 2024), 1.6.12 (7 November 2024), 1.6.11, 1.6.10, 1.6.9, and back to 1.6 in March 2024.
9
+ status: community
10
+ source: 'https://stardewvalleywiki.com/Version_History (read 2026-09-11): "Stardew Valley 1.6.15 was
11
+ released on 20 December 2024."'
12
+ verified_on: 1.6.15
13
+ tags:
14
+ - version
15
+ - cadence
16
+ - stability
17
+ - compat
18
+ detail: This is the most consequential fact about the surface. Every other game ModWright supports
19
+ is mid-motion; this one has been stationary for nearly two years, so a compat matrix has one
20
+ live row, the compatibility list is mature rather than churning, and work built now will not
21
+ rot before the game is installed.
22
+ - id: stardewvalley.game.versions.one-axis-no-marketing-split
23
+ claim: Stardew Valley has one public version axis. `1.6.15` is what the patch notes, the wiki and
24
+ the community all use, so it is the axis `verified_on` is written on, and
25
+ `InstalledComponent.marketingVersion` should stay undefined.
26
+ status: inferred
27
+ source: https://stardewvalleywiki.com/Version_History
28
+ tags:
29
+ - version
30
+ - axis
31
+ - verified-on
32
+ - compat
33
+ - marketingversion
34
+ detail: There is a second number in the install — the executable's assembly version, which SMAPI
35
+ reads only to decide whether a folder is a pre-1.6 install — but its relationship to `1.6.15`
36
+ was not established without the game, so a surface must not present it as the game version.
37
+ - id: stardewvalley.game.versions.smapi-floor-is-1-6-14
38
+ claim: Current SMAPI requires game version 1.6.14 or later and declares no maximum, so the installed
39
+ 1.6.15 sits one patch above the floor with unbounded headroom.
40
+ status: inferred
41
+ source: 'SMAPI develop, src/SMAPI/Constants.cs: `MinimumGameVersion = new GameVersion("1.6.14")` and
42
+ `MaximumGameVersion = null`'
43
+ tags:
44
+ - version
45
+ - smapi
46
+ - compat
47
+ - rule
48
+ - floor
49
+ related:
50
+ - id: stardewvalley.smapi.loader.version-and-game-floor
51
+ detail: the same two constants, stated there from SMAPI's side
52
+ - id: stardewvalley.game.versions.1-7-is-announced-undated
53
+ claim: Stardew Valley 1.7 has been announced — new marriage candidates Clint and Sandy, an overhaul
54
+ of children, a possible farm map editor — with no release date and no window, and the modding
55
+ wiki also lists an upcoming 1.6.16.
56
+ status: community
57
+ source: https://gameinformer.com/2026/02/26/you-can-marry-clint-and-sandy-in-the-17-update-for-stardew-valley-concernedape-announces
58
+ and https://www.pcgamer.com/games/life-sim/stardew-valley-1-7-guide/ (both read 2026-09-11);
59
+ the two upcoming migration guides are listed on https://stardewvalleywiki.com/Modding:Index as
60
+ "Stardew Valley 1.6.16 — upcoming" and "Stardew Valley 1.7 — upcoming"
61
+ tags:
62
+ - version
63
+ - roadmap
64
+ - compat
65
+ - advisory
66
+ detail: The wiki reserving a 1.6.16 migration page means the community expects one more point
67
+ release before 1.7, and those pages are where the next round of breaking changes will be
68
+ written down before they ship — a cheap thing for a compat refresh to watch. ConcernedApe has
69
+ also said he is taking more of a creative-director role on Stardew so he can focus on his next
70
+ title, which argues against a near-term date.
71
+ - id: stardewvalley.game.versions.1-6-moved-data-to-string-keyed-models
72
+ claim: Stardew Valley 1.6 replaced the old delimited-string data assets with string-keyed model
73
+ lookups. `Data/Objects`, for example, "consists of a string -> model lookup, where the key is
74
+ the unqualified item ID" and the value is an object with named fields.
75
+ status: community
76
+ source: https://stardewvalleywiki.com/Modding:Object_data (read 2026-09-11), "Data format"
77
+ tags:
78
+ - data
79
+ - "1.6"
80
+ - format
81
+ - index
82
+ - contentpatcher
83
+ detail: 'This is why a Content Patcher `EditData` on `Data/Objects` in 1.6 sets named fields
84
+ (`"Fields": {"MossSoup": {"Price": 80}}`) rather than editing a slash-delimited string, and
85
+ why a field-name validator is meaningful at all. Content Patcher ships
86
+ `Migration_2_0.ForObjectInformation.cs` and a dozen siblings to rewrite pre-1.6 packs into the
87
+ new shape at load time.'
88
+ - id: stardewvalley.game.versions.unique-string-ids-convention
89
+ claim: 1.6 introduced unique string IDs throughout the game, and the documented convention is to
90
+ namespace every new content ID with the mod's own unique ID —
91
+ `Example.PufferchickMod_PufferchickPlushy`, or `{{ModId}}_PufferchickPlushy` in a Content
92
+ Patcher pack — using only alphanumerics, underscore and dot.
93
+ status: community
94
+ source: "https://stardewvalleywiki.com/Modding:Migrate_to_Stardew_Valley_1.6 (read 2026-09-11):
95
+ \"Use namespaced IDs prefixed with your mod's unique ID for all new content ... This
96
+ eliminates ID conflicts between mods, and makes it easy (for both troubleshooters and mod
97
+ code) to identify which mod added a particular content.\" and \"Only use alphanumeric (a-z,
98
+ A-Z, 0-9), underscore (_), and dot (.) characters in string IDs. This is important because
99
+ they're often used in places where some characters have special meaning (like file names or
100
+ game state queries).\""
101
+ tags:
102
+ - "1.6"
103
+ - ids
104
+ - convention
105
+ - validator
106
+ - contentpatcher
107
+ - conflict
108
+ detail: "Directly checkable from a content pack alone, because the pack's own `manifest.json` is
109
+ right there: every key a patch adds to a `Data/*` asset should start with the pack's UniqueID
110
+ or with `{{ModId}}_`. A `warn`-severity rule, since a pack may legitimately edit a vanilla
111
+ key."
112
+ - id: stardewvalley.game.versions.qualified-item-ids
113
+ claim: Items carry a type prefix in their qualified ID — objects are `(O)`, corresponding to
114
+ `ItemRegistry.type_object` in C# — so `(O)MossSoup` is the qualified form of the
115
+ `Data/Objects` key `MossSoup`.
116
+ status: community
117
+ source: 'https://stardewvalleywiki.com/Modding:Object_data (read 2026-09-11): "They have item type
118
+ (O) (or ItemRegistry.type_object in C# code), their data in Data/Objects, their icon sprites
119
+ in Maps/springobjects or TileSheets/Objects_2 by default, and their code in
120
+ StardewValley.Object."'
121
+ tags:
122
+ - "1.6"
123
+ - ids
124
+ - items
125
+ - index
126
+ - keying
127
+ detail: An index for this game should key on the qualified form with the unqualified id and display
128
+ name as secondary keys, because the qualified form is what 1.6 content and item queries use.
129
+ The console command `player_add` accepts it directly (`player_add (O)246`).
130
+ - id: stardewvalley.game.versions.smapi-4-0-changed-the-content-api
131
+ claim: SMAPI 4.0 (March 2024) replaced `IAssetLoader`/`IAssetEditor` with the `AssetRequested`
132
+ event, split `helper.Content` into `helper.ModContent` and `helper.GameContent`, made asset
133
+ names locale-sensitive, and added load and edit priorities. It shipped alongside Stardew
134
+ Valley 1.6.
135
+ status: community
136
+ source: 'https://stardewvalleywiki.com/Modding:Migrate_to_SMAPI_4.0 (read 2026-09-11): "The
137
+ IAssetLoader and IAssetEditor interfaces no longer exist. Both have been replaced by the
138
+ AssetRequested event" and "Asset names are no longer locale-agnostic. For example,
139
+ Data/Bundles and Data/Bundles.fr-FR are not equivalent."'
140
+ tags:
141
+ - smapi
142
+ - api
143
+ - "4.0"
144
+ - migration
145
+ - locale
146
+ - csharp
147
+ detail: "Relevant to a C# mod validator and to any advice about content interception: a mod still
148
+ using `helper.Content` or the old interfaces will not compile against current SMAPI. The
149
+ locale change is the one that bites content packs too, via `TargetLocale`."
150
+ - id: stardewvalley.game.versions.content-patcher-is-most-of-the-ecosystem
151
+ claim: Content Patcher is "the backbone for 41.1% of all mods" according to SMAPI's own 4.0
152
+ migration page — a period statement predating the March 2024 release of SMAPI 4.0, not a
153
+ current figure.
154
+ status: community
155
+ source: "https://stardewvalleywiki.com/Modding:Migrate_to_SMAPI_4.0 (read 2026-09-11): \"it's the
156
+ basis for Content Patcher which is now the backbone for 41.1% of all mods\""
157
+ tags:
158
+ - contentpatcher
159
+ - ecosystem
160
+ - prioritisation
161
+ - undated
162
+ detail: "The figure is undated on the page and should be treated as an order-of-magnitude statement,
163
+ not a metric. Its use here is only to justify prioritising the content-pack validator family
164
+ over the C# one: a large fraction of this ecosystem's mods are JSON, which is exactly what a
165
+ pre-build checker can check."
166
+ - id: stardewvalley.game.versions.no-eula-text-was-located
167
+ claim: No Stardew Valley EULA or terms-of-service text was located in any source read for this
168
+ research, so nothing is claimed in either direction about decompilation, asset extraction or
169
+ redistribution.
170
+ status: inferred
171
+ source: ModWright research
172
+ tags:
173
+ - legal
174
+ - licence
175
+ - unsourced
176
+ - gap
177
+ detail: This is an absence of evidence, recorded as such and not as permission. The one adjacent
178
+ operational norm that *is* sourced is that the ecosystem's own unpacking tool (StardewXnbHack)
179
+ runs against the user's own install and writes into it, never redistributing game content —
180
+ the same design the Valheim publicizer uses, and the same inference is available here.
181
+ - id: stardewvalley.game.versions.data-asset-doc-index
182
+ claim: The wiki documents roughly forty data assets individually — Items (with per-type pages for
183
+ big craftables, boots, furniture, hats, mannequins, objects, pants, shirts, tools, trinkets,
184
+ wallpaper and flooring, weapons), Crops, Fruit trees, Giant crops, Item queries, Machines,
185
+ Recipes, Wild trees, Maps, Farm data, Festivals, Fish, Location contexts, Locations, Movie
186
+ theater, Museum data, Passive festivals, Weather, Buffs, Buildings, Bundles, Farmer sprite,
187
+ Fences, Floors and paths, Fish ponds, Garbage cans, Jukebox tracks, Lost items shop, Mail,
188
+ Minecarts, Monster eradication goals, Phone calls, Shops, Special items and powers, Special
189
+ orders, Tailoring, Animals, Monsters, Pets, and the NPC pages for dialogue, events, gift
190
+ tastes, quests and schedules.
191
+ status: community
192
+ source: https://stardewvalleywiki.com/Modding:Index (read 2026-09-11), the "Specific topics" list
193
+ tags:
194
+ - index
195
+ - data
196
+ - documentation
197
+ - wiki
198
+ - schema
199
+ detail: "This list is the table of contents for a schema-level vanilla index that needs no game:
200
+ each page states its asset's field names, types and defaults. What it does not give is the
201
+ *values* — whether `MossSoup` exists, what `Universal_Love` currently contains — which need a
202
+ StardewXnbHack run against a real install."
@@ -0,0 +1,277 @@
1
+ game: stardewvalley
2
+ topic: install.layout
3
+ title: Where Stardew Valley installs, how SMAPI sits beside it, and where the data folder lives
4
+ facts:
5
+ - id: stardewvalley.install.layout.steam-app-id
6
+ claim: Stardew Valley is Steam app `413150`, and its `steamapps/common` folder name is `Stardew
7
+ Valley` — with a space.
8
+ status: inferred
9
+ source: 'SMAPI develop, src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs: `private const
10
+ string SteamAppId = "413150";` and the path literal `steamapps\common\Stardew Valley`
11
+ (https://github.com/Pathoschild/SMAPI/blob/develop/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs)'
12
+ tags:
13
+ - steam
14
+ - appid
15
+ - detect
16
+ - install
17
+ - folder-name
18
+ detail: 'The space matters: `findInSteam(["Stardew Valley"])` is correct and
19
+ `findInSteam(["StardewValley"])` finds nothing. The no-space spelling `StardewValley.exe` does
20
+ exist, but only as the pre-1.5.5 Linux/macOS executable name, not as a folder name.'
21
+ - id: stardewvalley.install.layout.default-paths
22
+ claim: "SMAPI's own scanner probes, in order on Windows: registry
23
+ `HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Steam App 413150` value
24
+ `InstallLocation`; registry `HKLM\\SOFTWARE\\WOW6432Node\\GOG.com\\Games\\1453375253` value
25
+ `PATH`; `HKCU\\Software\\Valve\\Steam` value `SteamPath` plus `steamapps\\common\\Stardew
26
+ Valley` and every library in that Steam's `steamapps\\libraryfolders.vdf`; then under each of
27
+ `C:\\Program Files` and `C:\\Program Files (x86)` the four paths `GalaxyClient\\Games\\Stardew
28
+ Valley`, `GOG Galaxy\\Games\\Stardew Valley`, `GOG Games\\Stardew Valley` and
29
+ `Steam\\steamapps\\common\\Stardew Valley`; then `<drive>:\\Program
30
+ Files\\ModifiableWindowsApps\\Stardew Valley` for drive letters C through H."
31
+ status: inferred
32
+ source: SMAPI develop, src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs,
33
+ `GetDefaultInstallPaths()` and the `registryKeys` dictionary
34
+ tags:
35
+ - detect
36
+ - install
37
+ - registry
38
+ - steam
39
+ - gog
40
+ - xbox
41
+ - gamepass
42
+ detail: On Linux it is `$HOME/GOG Games/Stardew Valley/game`, then
43
+ `$HOME/.steam/steam/steamapps/common/Stardew Valley` falling back to
44
+ `$HOME/.local/share/Steam/steamapps/common/Stardew Valley`, then the Flatpak path
45
+ `$HOME/.var/app/com.valvesoftware.Steam/data/Steam/steamapps/common/Stardew Valley`. The same
46
+ branch then yields the two macOS paths, `/Applications/Stardew Valley.app/Contents/MacOS` and
47
+ `$HOME/Library/Application Support/Steam/steamapps/common/Stardew Valley/Contents/MacOS`. A
48
+ ModWright `detect` that mirrors this list is transcription, not design.
49
+ - id: stardewvalley.install.layout.targets-file-override
50
+ claim: A `stardewvalley.targets` file in the user's home directory (`%USERPROFILE%` on Windows,
51
+ `$HOME` otherwise) whose `<GamePath>` property names a folder is a first-party install
52
+ override that both SMAPI's scanner and the NuGet build package honour.
53
+ status: inferred
54
+ source: 'SMAPI develop, src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs,
55
+ `GetCustomInstallPaths()`; documented for authors in docs/technical/mod-package.md ("Create a
56
+ `stardewvalley.targets` file with this content:
57
+ `<Project><PropertyGroup><GamePath>PATH_HERE</GamePath>...`")'
58
+ tags:
59
+ - detect
60
+ - override
61
+ - csproj
62
+ - developer
63
+ - install
64
+ detail: On a developer machine this is high-confidence and costs one file read, so it is worth
65
+ probing before Steam. No such file exists on the machine this research was done on.
66
+ - id: stardewvalley.install.layout.game-folder-heuristic
67
+ claim: '"Is this folder a game folder" has five distinct answers, not two. SMAPI decides: `Stardew
68
+ Valley.dll` present -> Valid; else no `Stardew Valley.exe` and no `StardewValley.exe` ->
69
+ NoGameFound; else exe assembly version below 1.6 -> LegacyVersion; else no
70
+ `MonoGame.Framework.dll` -> LegacyCompatibilityBranch; else InvalidUnknown.'
71
+ status: inferred
72
+ source: SMAPI develop, src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs
73
+ `GetGameFolderType(DirectoryInfo)`, with the enum documented in
74
+ src/SMAPI.Toolkit/Framework/GameScanning/GameFolderType.cs
75
+ tags:
76
+ - detect
77
+ - validity
78
+ - phantom-install
79
+ - legacy
80
+ detail: "`LegacyVersion` is documented as \"contains Stardew Valley 1.5.6 or earlier, which isn't
81
+ compatible with current versions of SMAPI\" and `LegacyCompatibilityBranch` as \"the game's
82
+ legacy compatibility branch, which backports newer changes to the LegacyVersion format\".
83
+ Reporting these separately is much more useful than \"not found\", and it avoids the
84
+ Subnautica 2 phantom-install failure where a folder exists but holds nothing."
85
+ - id: stardewvalley.install.layout.executables
86
+ claim: The game ships `Stardew Valley.exe` on Windows and a `StardewValley` shell script on
87
+ Linux/macOS; SMAPI adds `StardewModdingAPI.exe` (Windows) or a `StardewModdingAPI` binary
88
+ (Unix) beside it, plus a `StardewModdingAPI.deps.json` copied from `Stardew Valley.deps.json`.
89
+ status: community
90
+ source: "SMAPI installer README
91
+ (https://github.com/Pathoschild/SMAPI/blob/develop/src/SMAPI.Installer/assets/README.txt):
92
+ \"The `StardewModdingAPI.exe` file should be right next to the game's executable\" and step 3,
93
+ \"Copy `Stardew Valley.deps.json` in the game folder, and rename the copy to
94
+ `StardewModdingAPI.deps.json`\""
95
+ tags:
96
+ - smapi
97
+ - executable
98
+ - install
99
+ - detect
100
+ - process-names
101
+ detail: "Three process names matter for a deploy's game-exit wait: `Stardew Valley`,
102
+ `StardewModdingAPI`, and `StardewValley` (the Unix launcher after renaming)."
103
+ - id: stardewvalley.install.layout.unix-rename
104
+ claim: "On Linux and macOS the SMAPI installer renames the launcher rather than adding a second one:
105
+ `StardewValley` becomes `StardewValley-original` and `StardewModdingAPI` becomes
106
+ `StardewValley`, so launching the game normally launches SMAPI."
107
+ status: community
108
+ source: SMAPI installer README, manual-install step 4; the same three paths are named in
109
+ src/SMAPI.Installer/Framework/InstallerPaths.cs as `VanillaLaunchScriptPath`,
110
+ `BackupLaunchScriptPath` and `UnixSmapiExecutablePath`
111
+ tags:
112
+ - smapi
113
+ - install
114
+ - unix
115
+ - detect
116
+ - launch
117
+ detail: 'Consequence for `detect`: on Unix, "is SMAPI what will launch" is readable from disk (does
118
+ `StardewValley-original` exist), and on Windows it is not — see the Steam launch-options
119
+ fact.'
120
+ - id: stardewvalley.install.layout.steam-launch-options-are-not-on-disk
121
+ claim: On Windows, Steam runs SMAPI only if the player pasted a launch-options string of the form
122
+ `"<path>\StardewModdingAPI.exe" %command%` into Steam's per-game properties. That string lives
123
+ in Steam's own configuration, not in the game folder, so whether pressing Play will run SMAPI
124
+ is not determinable from the filesystem.
125
+ status: community
126
+ source: 'https://stardewvalleywiki.com/Modding:Installing_SMAPI_on_Windows (read 2026-09-11):
127
+ "Default for most users is `\"C:\\Program Files (x86)\\Steam\\steamapps\\common\\Stardew
128
+ Valley\\StardewModdingAPI.exe\" %command%` / The quotes - and %command% - are both necessary,
129
+ so include them!"'
130
+ tags:
131
+ - steam
132
+ - launch
133
+ - detect
134
+ - undeterminable
135
+ - guidance
136
+ detail: This is the single most common "my mods do nothing" cause on Windows and it leaves no trace
137
+ on disk. A surface must report it as undeterminable (architecture rule 2) rather than assert
138
+ either way. GOG Galaxy uses a hand-written `start.bat` in the game folder instead, which *is*
139
+ detectable.
140
+ - id: stardewvalley.install.layout.xbox-path-conflict
141
+ claim: "Two different Xbox/Game Pass install paths are documented and they were not reconciled:
142
+ SMAPI's scanner probes `<drive>:\\Program Files\\ModifiableWindowsApps\\Stardew Valley`, while
143
+ the wiki gives `C:\\XboxGames\\Stardew Valley` and instructs players to install SMAPI into
144
+ that folder's `Content` subfolder."
145
+ status: community
146
+ source: "SMAPI develop GameScanner.cs (in-source comment: \"The Xbox app saves the install path to
147
+ the registry, but we can't use it here since it saves the internal readonly path (like
148
+ C:\\Program Files\\WindowsApps\\Mutable\\<package ID>) instead of the mods-enabled path\");
149
+ versus https://stardewvalleywiki.com/Modding:Player_Guide/Getting_Started (\"Xbox App:
150
+ C:\\XboxGames\\Stardew Valley\") and
151
+ https://stardewvalleywiki.com/Modding:Installing_SMAPI_on_Windows (\"Open the Stardew Valley >
152
+ Content folder\")"
153
+ tags:
154
+ - xbox
155
+ - gamepass
156
+ - detect
157
+ - conflict
158
+ - unresolved
159
+ detail: Plausibly both are true of the same install reached by different paths, but that was not
160
+ established. Offer both candidates and report which exists; never hard-code one. The Xbox
161
+ install also requires renaming `Stardew Valley.exe` and copying `StardewModdingAPI.exe` over
162
+ it, which must be redone after every game update.
163
+ - id: stardewvalley.install.layout.mods-folder
164
+ claim: Mods live in `Mods/` inside the game folder, one subfolder per mod, and SMAPI searches
165
+ recursively — grouping subfolders are supported, so `Mods/Fruit
166
+ mods/PineapplesEverywhere/manifest.json` is a valid mod.
167
+ status: community
168
+ source: 'https://stardewvalleywiki.com/Modding:Player_Guide/Getting_Started (read 2026-09-11): "Make
169
+ sure each mod has its own subfolder, without trailing numbers" and "If you have a lot of mods,
170
+ you can optionally organize them into subfolders. SMAPI will automatically search inside each
171
+ folder until it finds one with files."; path from src/SMAPI/Constants.cs `DefaultModsPath =
172
+ Path.Combine(Constants.GamePath, "Mods")`'
173
+ tags:
174
+ - mods
175
+ - modroots
176
+ - layout
177
+ - nesting
178
+ detail: A `list_mods` implementation must walk to arbitrary depth looking for `manifest.json`, not
179
+ just enumerate immediate subdirectories. The wiki also warns about the
180
+ `PineapplesEverywhere-1234567890` wrapper folder that mod sites produce, which is a real and
181
+ common failure.
182
+ - id: stardewvalley.install.layout.dot-prefix-disables-a-mod
183
+ claim: Prefixing a mod folder's name with a dot disables it. SMAPI classifies it as
184
+ `ModType.Ignored` with the reason "ignored folder because its name starts with a dot." and
185
+ logs " Skipped {path} (folder name starts with a dot)."
186
+ status: inferred
187
+ source: SMAPI develop, src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs (`if
188
+ (folder.Name.StartsWith("."))`) and src/SMAPI/Framework/SCore.cs; documented for players at
189
+ https://stardewvalleywiki.com/Modding:Player_Guide/Getting_Started
190
+ tags:
191
+ - mods
192
+ - disable
193
+ - scanning
194
+ - modroots
195
+ detail: "The wiki adds the Windows workaround: \"If Windows doesn't let you do that, put a dot at
196
+ the end too and it'll let you (like `.disabled mods.`).\" A validator should report a
197
+ dot-prefixed folder as `info`, not an error — it is usually deliberate."
198
+ - id: stardewvalley.install.layout.smapi-internal-folder
199
+ claim: SMAPI's own files live in `smapi-internal/` in the game folder
200
+ (`Constants.InternalFilesPath`), holding `config.json`, `config.user.json`, `metadata.json`,
201
+ `blacklist.json`, `blacklist-updated.json`, `0Harmony.dll`, `SMAPI.Toolkit.CoreInterfaces.dll`
202
+ and the `StardewModdingAPI.crash.marker` / `.update.marker` one-shot files.
203
+ status: inferred
204
+ source: SMAPI develop, src/SMAPI/Constants.cs (`InternalFilesPath`, `ApiConfigPath`,
205
+ `ApiUserConfigPath`, `ApiMetadataPath`, `ApiBlacklistPath`, `ApiBlacklistFetchedPath`,
206
+ `FatalCrashMarker`, `UpdateMarker`) and src/SMAPI.ModBuildConfig/build/smapi.targets (the
207
+ `HintPath`s into `$(GamePath)\smapi-internal\`)
208
+ tags:
209
+ - smapi-internal
210
+ - config
211
+ - modroots
212
+ - compat
213
+ - never-deploy
214
+ detail: This is a mod root only in the sense that a mod wrongly shipped into it is visible; it must
215
+ never be a deploy target and prune must never touch it. `metadata.json` is a direct compat
216
+ input — it is SMAPI's internal known-broken list, on disk, readable with no network call.
217
+ - id: stardewvalley.install.layout.config-filename-conflict
218
+ claim: SMAPI's configuration file is `smapi-internal/config.json` according to the current source,
219
+ but two wiki pages and Content Patcher's troubleshooting guide still call it
220
+ `smapi-internal/StardewModdingAPI.config.json`. A detector must probe both names.
221
+ status: inferred
222
+ source: SMAPI develop names `config.json` in three places — src/SMAPI/Constants.cs `ApiConfigPath`,
223
+ src/SMAPI.Installer/Framework/InstallerPaths.cs `ApiConfigPath`, and three log lines in
224
+ src/SMAPI/Framework/SCore.cs that say "the 'smapi-internal/config.json' file"; versus
225
+ https://stardewvalleywiki.com/Modding:Modder_Guide/APIs/Logging and
226
+ https://github.com/Pathoschild/StardewMods/blob/develop/ContentPatcher/docs/author-guide/troubleshooting.md,
227
+ both of which say `smapi-internal/StardewModdingAPI.config.json`
228
+ tags:
229
+ - config
230
+ - conflict
231
+ - unresolved
232
+ - detect
233
+ - explain-missing
234
+ detail: Most likely a rename the wiki has not caught up with, but that was not established without
235
+ an install. Both `explainMissing`'s verbose-logging answer and the load-order override file
236
+ (`ModsToLoadEarly`) depend on finding this file, so getting it wrong silently disables both.
237
+ - id: stardewvalley.install.layout.data-folder
238
+ claim: The per-user data folder is `%APPDATA%\StardewValley`, with saves in `Saves/` and SMAPI logs
239
+ in `ErrorLogs/`. It is created the first time the game runs, which is why SMAPI's install
240
+ guide's first step is to run the game once without SMAPI.
241
+ status: inferred
242
+ source: 'SMAPI develop, src/SMAPI/Constants.cs: `DataPath =
243
+ Path.Combine(Environment.GetFolderPath(SpecialFolder.ApplicationData), "StardewValley")`,
244
+ `SavesPath = Path.Combine(DataPath, "Saves")`, `LogDir = Path.Combine(DataPath, "ErrorLogs")`;
245
+ the first-run instruction is from
246
+ https://stardewvalleywiki.com/Modding:Installing_SMAPI_on_Windows ("Run the game without SMAPI
247
+ at least once (so it can do first-time setup).")'
248
+ tags:
249
+ - appdata
250
+ - logs
251
+ - saves
252
+ - explain-missing
253
+ detail: "Two `explainMissing` answers fall out of this: no `%APPDATA%\\StardewValley` at all means
254
+ the game has never been run; the folder present with no `SMAPI-*.txt` inside `ErrorLogs` means
255
+ SMAPI is installed but was not launched. Those demand opposite next actions. SMAPI also
256
+ exposes `show_data_files` and `show_game_files` console commands that open these two folders."
257
+ - id: stardewvalley.install.layout.mods-path-argument
258
+ claim: "`StardewModdingAPI.exe --mods-path <path>` (or the `SMAPI_MODS_PATH` environment variable)
259
+ relocates the mod folder only; the loader stays in the game folder. A relative path is
260
+ combined with the game path."
261
+ status: inferred
262
+ source: 'SMAPI develop, src/SMAPI/Program.cs `Start(string[] args)`: `int pathIndex =
263
+ Array.LastIndexOf(args, "--mods-path") + 1;` and `modsPath =
264
+ !string.IsNullOrWhiteSpace(rawModsPath) ? Path.Combine(Constants.GamePath, rawModsPath) :
265
+ Constants.DefaultModsPath;`'
266
+ tags:
267
+ - launch
268
+ - mods
269
+ - deploy
270
+ - profiles
271
+ - developer
272
+ detail: "This is the Stardew analogue of an r2modman profile, and it is much weaker: it does not
273
+ relocate the loader and it is chosen at launch, so ModWright can offer a declared
274
+ `--mods-path` folder as a second deploy target but must never assert which mod folder is live.
275
+ The other documented arguments are `--developer-mode`, `--developer-mode-off` and
276
+ `--no-terminal`, with `SMAPI_DEVELOPER_MODE` and `SMAPI_NO_TERMINAL` as environment
277
+ equivalents."