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,167 @@
1
+ game: cyberpunk2077
2
+ topic: wolvenkit.cli
3
+ title: WolvenKit.CLI commands ModWright runs — pack, import, convert serialize/deserialize
4
+ facts:
5
+ - id: cp2077.wolvenkit.cli.pack-ignores-non-archive-files
6
+ claim: "`pack` only generates the `.archive` file(s) from a folder of REDengine files — it does not
7
+ behave exactly like WolvenKit's own \"Build Project\" button, and specifically ignores extra
8
+ files such as `.xl` manifests; those still need to land at their final path by some other step
9
+ (e.g. a plain file copy) alongside the packed archive."
10
+ status: community
11
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, hint under
12
+ "Pack" ("It will only generate **.archive** file(s) and ignore any extra files (such as
13
+ **.xl**)"; the same hint also says the command does not behave exactly like the WolvenKit
14
+ application's `Build Project` button)
15
+ tags:
16
+ - wolvenkit
17
+ - cli
18
+ - pack
19
+ - .xl
20
+ - build-project
21
+ - gotcha
22
+ - id: cp2077.wolvenkit.cli.pack-multiple-paths-one-output-dir
23
+ claim: "`pack` accepts two invocation forms: `pack -p <path> [-o output]` (backward-compatible
24
+ single-path form) and `pack [-o output] <path1> <pathN>` (multiple project paths, each
25
+ producing its own `.archive`); when packing multiple projects at once only a single output
26
+ directory can be given for all of them — the wiki attributes this limitation to .NET."
27
+ status: community
28
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
29
+ "Pack" ("Usage" and the warning under "Example")
30
+ tags:
31
+ - wolvenkit
32
+ - cli
33
+ - pack
34
+ - multiple-paths
35
+ - output-directory
36
+ - id: cp2077.wolvenkit.cli.pack-must-not-replace-vanilla-archives
37
+ claim: The `pack` command's documentation carries an explicit warning not to replace existing
38
+ vanilla archives with its output.
39
+ status: community
40
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, danger hint
41
+ under "Pack" ("Do not replace existing vanilla archives")
42
+ tags:
43
+ - wolvenkit
44
+ - cli
45
+ - pack
46
+ - vanilla-archive
47
+ - safety
48
+ - id: cp2077.wolvenkit.cli.import-keep-flag-needs-matching-pair
49
+ claim: "`import`'s `-k`/`--keep` flag (used to preserve existing REDengine files' data when
50
+ importing raw files over them) requires that both halves of a matching pair already exist in
51
+ the output — e.g. both `judy_body_wet.xbm` and `judy_body_wet.dds` — and when `-o` is used,
52
+ the existing REDengine files must be located in that output folder while the raw source files
53
+ are read from the path given by `-p`."
54
+ status: community
55
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
56
+ "Import" (hint under the command)
57
+ tags:
58
+ - wolvenkit
59
+ - cli
60
+ - import
61
+ - keep-flag
62
+ - gotcha
63
+ detail: "RELATED: this documents the same `-k`/`--keep` flag as cp2077.toolchain.cli-import-flag,
64
+ but the wiki does not state what `-k` actually preserves beyond requiring the matching-pair
65
+ precondition — that fact's \"preserves the donor's material bindings\" reading remains an
66
+ inference from a mod's build pipeline, not confirmed by this page either."
67
+ - id: cp2077.wolvenkit.cli.convert-serialize-deserialize-flags
68
+ claim: '`convert -s "<path>"` converts a REDengine (CR2W) file into its human-readable (json) form;
69
+ `convert -d "<path>"` converts a json file back into a REDengine file. The older `cr2w
70
+ -s`/`cr2w -d` command spelling does the same thing but is documented as deprecated in favor of
71
+ `convert`.'
72
+ status: community
73
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, sections
74
+ "~~CR2W/W2RC~~ (Deprecated)" and "Convert"
75
+ tags:
76
+ - wolvenkit
77
+ - cli
78
+ - convert
79
+ - serialize
80
+ - deserialize
81
+ - cr2w
82
+ - deprecated
83
+ detail: "RELATED: grounds the direction of cp2077.toolchain.cli-convert-serialize (binary->json) and
84
+ cp2077.toolchain.cli-convert-deserialize (json->binary) in the actual CLI flags (`-s` and
85
+ `-d`) — those two facts describe a mod's pipeline usage without naming the flags."
86
+ - id: cp2077.wolvenkit.cli.tweak-command-flats-and-groups
87
+ claim: The `tweak` command compiles a `.tweak` yaml file (with top-level `flats` and/or `groups`
88
+ keys) into a TweakDB `.bin` loadable by TweakDBext; for a `groups` entry, member flats are
89
+ auto-generated by appending each member's name to the record's own name (e.g. a
90
+ `MyRecord.mine` group with an `affiliation` member yields flat `MyRecord.mine.affiliation`),
91
+ and the compiler does not validate that a group's `type` is a real TweakDB type — an unknown
92
+ type only surfaces later, as a message in `red4ext\logs\tweakdb.log` when TweakDBext loads the
93
+ resulting `.bin`.
94
+ status: community
95
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
96
+ "Tweak"
97
+ tags:
98
+ - wolvenkit
99
+ - cli
100
+ - tweak
101
+ - flats
102
+ - groups
103
+ - tweakdbext
104
+ - silent-failure
105
+ detail: This `tweak`/TweakDBext path is a different pipeline from TweakXL's yaml tweaks
106
+ (cp2077.tweakxl.yaml-syntax.*) — TweakDBext compiles to a binary TweakDB patch loaded
107
+ independently of TweakXL, so a fact about one does not transfer to the other without checking
108
+ which pipeline a given project actually uses.
109
+ - id: cp2077.wolvenkit.cli.tweak-type-name-drops-gamedata-and-record-suffix
110
+ claim: A TweakDB group's `type` value is the RTTI record type name with the `gamedata` prefix and
111
+ `_Record` suffix both dropped — e.g. RTTI type `gamedataVehicle_Record` is written as
112
+ `Vehicle` in `.tweak` yaml.
113
+ status: community
114
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
115
+ "Tweak > Groups" (naming rule and Vehicle example)
116
+ tags:
117
+ - wolvenkit
118
+ - cli
119
+ - tweak
120
+ - naming-convention
121
+ - rtti
122
+ - id: cp2077.wolvenkit.cli.tweak-supported-flat-types
123
+ claim: "`.tweak` yaml flats and group members must declare a base `type` from a fixed list: `CName`,
124
+ `String`, `TweakDBID`, `raRef:CResource`, `Float`, `Bool`, `Uint8/16/32/64`, `Int8/16/32/64`,
125
+ `Color`, `EulerAngles`, `Quaternion`, `Vector2`, `Vector3`, `LocKey`; any of these can be
126
+ wrapped as `array:<Type>` to declare an array field."
127
+ status: community
128
+ source: CDPR-Modding-Documentation/WolvenKit-8-Wiki/wolvenkit-cli/usage/command-list.md, section
129
+ "Tweak > Types"
130
+ tags:
131
+ - wolvenkit
132
+ - cli
133
+ - tweak
134
+ - type
135
+ - schema
136
+ detail: "`TweakDBID` values can be written as the full flat/group path (e.g. `myOtherFlat.cow`) or
137
+ as the shorthand hash/length form `TDBID:12345678:12`; `raRef:CResource` also accepts a raw
138
+ integer hash (e.g. pulled from a TweakDB dump) in place of a string path."
139
+ - id: cp2077.wolvenkit.cli.pack-is-not-byte-deterministic
140
+ claim: "WolvenKit CLI 8.20.0 `pack` of an unchanged tree does not reproduce the same bytes: two
141
+ packs are the same size and differ in a few dozen bytes near the end of the file, so a sha256
142
+ compare cannot tell an unchanged repack from a real change."
143
+ status: verified
144
+ verified_on: "2.31"
145
+ source: ModWright field verification
146
+ tags:
147
+ - wolvenkit
148
+ - cli
149
+ - pack
150
+ - determinism
151
+ - deploy
152
+ detail: "Where the differing bytes sit (after the file data) suggests per-entry timestamps in the
153
+ archive's file table; that is inferred, not read. Consequence: deploy's skip-identical check
154
+ redeploys a repacked archive whose content did not change."
155
+ - id: cp2077.wolvenkit.cli.archive-list-prints-backslash-paths
156
+ claim: "`archive <file> -l` prints one depot path per line with backslash separators
157
+ (`mod\\<modname>\\en-us.json`), so a glob written with `/` must match either separator."
158
+ status: verified
159
+ verified_on: "2.31"
160
+ source: ModWright field verification
161
+ tags:
162
+ - wolvenkit
163
+ - cli
164
+ - archive
165
+ - listing
166
+ - verify-listing
167
+ - glob
@@ -0,0 +1,55 @@
1
+ game: cyberpunk2077
2
+ topic: workspot.system
3
+ title: WorkspotGameSystem - the play-in-device signatures
4
+ facts:
5
+ - id: cp2077.workspot.system.playindevicesimple-signature
6
+ claim: "WorkspotGameSystem.PlayInDeviceSimple is declared as PlayInDeviceSimple(device:
7
+ ref<GameObject>, actor: ref<GameObject>, allowCameraMov: Bool, opt actorDataCompName: CName,
8
+ opt deviceDataCompName: CName, opt syncSlotName: CName, opt slideTime: Float, opt
9
+ slideBehaviour: WorkspotSlidingBehaviour, opt callbackEventRecipient: ref<Entity>). The third
10
+ argument is allowCameraMov: it is not a freeze-on-end flag."
11
+ status: verified
12
+ verified_on: "2.31"
13
+ source: codeberg adamsmasher/cyberpunk@a2e6bb3 orphans.swift:18383
14
+ tags:
15
+ - workspot
16
+ - playindevicesimple
17
+ - allowcameramov
18
+ - signature
19
+ detail: A quickhack mod plays V's jack-in kneel with true; a freezeOnEnd reading of the argument,
20
+ adopted and reverted on 2026-09-21, was wrong. The fourth argument is what a script passes as
21
+ the component name (that mod's own workspot component).
22
+ - id: cp2077.workspot.system.playindevice-signature
23
+ claim: "WorkspotGameSystem.PlayInDevice is declared as PlayInDevice(device: ref<GameObject>, actor:
24
+ ref<GameObject>, opt workspotStateFlavourName: CName, opt actorDataCompName: CName, opt
25
+ deviceDataCompName: CName, opt syncSlotName: CName, opt slideTime: Float, opt slideBehaviour:
26
+ WorkspotSlidingBehaviour, opt callbackEventRecipient: ref<Entity>); unlike PlayInDeviceSimple
27
+ it has no camera-movement flag and takes a workspot state flavour name instead."
28
+ status: verified
29
+ verified_on: "2.31"
30
+ source: codeberg adamsmasher/cyberpunk@a2e6bb3 orphans.swift:18385
31
+ tags:
32
+ - workspot
33
+ - playindevice
34
+ - signature
35
+ - id: cp2077.workspot.system.resource-without-anim-graph-crashes-on-play
36
+ claim: "A workWorkspotResource that carries only its workspotTree (no rootNode, empty nodesToInit
37
+ and animFeatures, no variables container, no staticCommandsRig) deserializes with WolvenKit
38
+ 8.20, and its entity spawns. Playing V into it with PlayInDeviceSimple crashes the game in the
39
+ same frame: an access violation reading 0x44 at exe+0x4B2A1D, the entry of a routine called
40
+ with a null object. The same workspot with a vanilla workspot's layout (rootNode →
41
+ animAnimNode_Root → animAnimNode_Output → animAnimNode_WorkspotHub, nodesToInit holding the
42
+ three, the animAnimFeatureUpdateWorkspot feature named UpdateWorkspot, an empty
43
+ animAnimVariableContainer, staticCommandsRig) plays."
44
+ status: verified
45
+ verified_on: "2.31"
46
+ source: ModWright field verification
47
+ tags:
48
+ - workspot
49
+ - resource
50
+ - animgraph
51
+ - crash
52
+ - authoring
53
+ detail: A quickhack mod's build script writes the layout by hand; its key set matches the vanilla
54
+ q104 workspot's key for key. The animSetup hash stays 0 in the mod's resources and they play,
55
+ so the hash is not required.
@@ -0,0 +1,41 @@
1
+ game: cyberpunk2077
2
+ topic: world.interactions
3
+ title: Native Interactions Framework
4
+ facts:
5
+ - id: cp2077.world.interactions.dependency-and-install-path
6
+ claim: Native Interactions Framework requires Red4Ext, CET, Codeware, Redscript and ArchiveXL
7
+ installed first, plus World Builder "if you want to place interactions which use props".
8
+ Installed correctly it produces the folder `Cyberpunk
9
+ 2077\bin\x64\plugins\cyber_engine_tweaks\mods\nativeInteractions`.
10
+ status: community
11
+ source: wiki.redmodding.org "Installation" (Native Interactions Framework), sections "Requirements",
12
+ "Download" and "Installing" (info hint)
13
+ tags:
14
+ - nif
15
+ - native-interactions-framework
16
+ - dependency
17
+ - install-path
18
+ detail: The page names no version floors for any of the five dependencies. It is installed like any
19
+ other mod, by extracting into the base game directory (the one "called `Cyberpunk 2077` and
20
+ contains the folders `bin` and `archive`"). Page title corrected 2026-09-07 — the page is
21
+ simply "Installation" under the Native Interactions Framework section.
22
+ - id: cp2077.world.interactions.basic-interaction-fields
23
+ claim: A Simple Interaction (one that needs no props) is edited from the "Cog" icon beside its name,
24
+ in the "Edit Interaction" tab. `Icon Position` controls where the icon is; `Icon Visibility
25
+ Range` how close the player must be for the icon to show; `Interaction Range` how close for
26
+ the interaction prompt to show; `Interaction Angle` how close the screen centre / crosshair
27
+ must be to the icon for the prompt to show ("Smaller means closer"). `Workspot Position` and
28
+ `Workspot Orientation` control where and in what rotation an animation plays, and are
29
+ available only for interactions that play an animation at a specific position.
30
+ status: community
31
+ source: wiki.redmodding.org "Interaction Settings" (Native Interactions Framework), sections
32
+ "Editing Interactions", "Icon" and "Workspot Position"
33
+ tags:
34
+ - nif
35
+ - native-interactions-framework
36
+ - interaction-settings
37
+ - workspot
38
+ detail: "\"When using any positional controls, you can hold down 'Shift' to switch to precision
39
+ mode.\" For Workspot Orientation, \"Usually the green arrow points inwards\". Page title and
40
+ section names corrected 2026-09-07 (there is no \"Basic Interaction Configuration Fields\"
41
+ page and no \"Key Gotchas\" heading)."
@@ -0,0 +1,167 @@
1
+ game: cyberpunk2077
2
+ topic: world.loot-container
3
+ title: A lootable Arasaka weapon case — placement, drop table, and deploy safety
4
+ facts:
5
+ - id: cp2077.world.loot-container.cache-drops-weapon-directly
6
+ claim: A weapon mod's Arasaka cache loot table drops the weapon itself (Items.<ModWeapon>, quality
7
+ Quality.Random) directly, because the mod ships no crafting spec for a recipe to resolve
8
+ against.
9
+ status: contradicted
10
+ source: ModWright research
11
+ tags:
12
+ - world
13
+ - cache
14
+ - loot
15
+ - recipe
16
+ - retracted
17
+ detail: "This was true when written (2026-09-02) and is now stale: a full tiered crafting-spec layer
18
+ was added the next day. Superseded by cp2077.world.loot-container.cache-drops-tiered-recipe.
19
+ The mod's own cache notes were not edited to reflect this — a later entry in its plan says so
20
+ explicitly."
21
+ - id: cp2077.world.loot-container.cache-drops-tiered-recipe
22
+ claim: A weapon mod's Arasaka cache loot table (LootTables.<ModCacheLoot>) drops one of five tiered
23
+ crafting recipes (Items.Recipe_<Tier>_<ModWeapon>, Common through Legendary), each gated by a
24
+ LootPrereqs.CraftedIconicWeaponRecipePrereq_<Tier> level-band prerequisite so exactly one
25
+ resolves per player level — mirroring vanilla's own iconic-spec drop pattern — not a direct
26
+ weapon drop.
27
+ status: inferred
28
+ source: ModWright research
29
+ tags:
30
+ - world
31
+ - cache
32
+ - loot
33
+ - recipe
34
+ - tiered
35
+ supersedes: cp2077.world.loot-container.cache-drops-weapon-directly
36
+ detail: "The mod's own notes on the change: the comment in the loot table had said the mod ships no
37
+ crafting spec, which was now false. The rewrite added Items.$(tier)_<ModWeapon> crafting
38
+ results, an Items.Recipe_Preset_<ModWeapon> base and Items.Recipe_$(tier)_<ModWeapon>
39
+ instances (with hideOnItemsAdded so a crafted recipe disappears once used) — the same
40
+ crafting-spec pattern used by a ranged weapon mod and Silent Ashura, added one day after the
41
+ cache's initial build and drop-table design."
42
+ - id: cp2077.world.loot-container.vanilla-case-mesh-already-has-arasaka-livery
43
+ claim: The vanilla lootable_weapon_case_medium_neomilitary_a[_lid].mesh assets already carry four
44
+ material appearances — default, arasaka, militech, toolbox — including a complete Arasaka
45
+ livery (its own multilayered mlsetup plus xx_decals_arasaka_d01[_arasaka] decal materials),
46
+ but no vanilla .app exposes the arasaka appearance; a two-component .app selecting
47
+ meshAppearance = arasaka is the only custom asset needed to ship an Arasaka-branded lootable
48
+ case.
49
+ status: inferred
50
+ source: ModWright research
51
+ tags:
52
+ - world
53
+ - cache
54
+ - mesh
55
+ - appearance
56
+ - arasaka
57
+ - livery
58
+ detail: No mesh work and no textures were needed for this asset — a significant cost reduction
59
+ versus a from-scratch container.
60
+ - id: cp2077.world.loot-container.chip-container-too-small-for-blade
61
+ claim: arasaka_chip_container_a, the other genuinely Arasaka-branded container in the game, measures
62
+ 0.14 x 0.04 x 0.11 m — a shard case, effectively invisible in the world and far too small to
63
+ plausibly hold a 1.28 m blade — and was rejected as the cache container in favor of the medium
64
+ weapon case.
65
+ status: inferred
66
+ source: ModWright research
67
+ tags:
68
+ - world
69
+ - cache
70
+ - mesh
71
+ - measurement
72
+ - rejected
73
+ detail: The chosen lootable_weapon_case_medium_neomilitary_a is 1.28 m long, matching the weapon.
74
+ - id: cp2077.world.loot-container.case-mesh-long-axis-is-local-x-not-forward
75
+ claim: For the medium lootable weapon case mesh, the body origin sits on the BASE (local Z spans
76
+ 0.000..0.171) and the case's long axis is its local X (1.259 m) rather than local Y — even
77
+ though an entity's forward direction is local +Y. A case built straight from a captured player
78
+ transform therefore lies with its long side running ACROSS the captured facing, like a case
79
+ set down in front of the player, not end-on; a yawOffsetDeg of 90 rotates it to lie end-on
80
+ instead.
81
+ status: inferred
82
+ source: ModWright research
83
+ tags:
84
+ - world
85
+ - cache
86
+ - mesh
87
+ - orientation
88
+ - placement
89
+ detail: Measured directly off the mesh bounds, not guessed. The lid mesh's own bounds (Y out to
90
+ 0.506, Z down to -0.046) are explicitly called out as NOT meaningful for placement — they are
91
+ in the lid's own hinge frame, positioned and animated by the .app component transform and the
92
+ TransformAnimator, and should be ignored when reasoning about the case's world footprint.
93
+ - id: cp2077.world.loot-container.transformanimator-kept-because-vanilla-meshes-unmodified
94
+ claim: "Also observed on a second mod, as the contrasting case to
95
+ cp2077.entities.transform-animator-open-anim (documented on a ranged weapon mod, which had to
96
+ strip its gameTransformAnimatorComponent because a custom, longer lid floated incorrectly in
97
+ the donor's open pose): a lootable Arasaka case KEEPS the TransformAnimator intact and its lid
98
+ opens correctly, because both of its case meshes are used completely unmodified from vanilla.
99
+ The animator only has to be removed when the geometry it swings has been altered."
100
+ status: inferred
101
+ source: ModWright research
102
+ tags:
103
+ - world
104
+ - cache
105
+ - transform-animator
106
+ - lid
107
+ - mesh
108
+ detail: Contrast case for the existing fact cp2077.entities.transform-animator-open-anim / the
109
+ process lesson about removing vs. keeping the animator — here the animator survives because
110
+ the geometry it swings was never altered.
111
+ - id: cp2077.world.loot-container.placement-captured-via-cet-console-oneliner
112
+ claim: A world-placement position + orientation can be captured directly in the exact JSON shape a
113
+ placement file expects, by standing at the target spot in game and pasting a short CET console
114
+ Lua one-liner that reads Game.GetPlayer():GetWorldPosition()/GetWorldOrientation() and
115
+ string.formats them as x/y/z/rotation{i,j,k,r} fields.
116
+ status: verified
117
+ source: ModWright field verification
118
+ tags:
119
+ - world
120
+ - cache
121
+ - placement
122
+ - cet
123
+ - console
124
+ - workflow
125
+ detail: The player's own transform is used AS the object's transform ("think of it as standing in
126
+ for the case"), which is why
127
+ cp2077.world.loot-container.case-mesh-long-axis-is-local-x-not-forward's yawOffsetDeg
128
+ correction is necessary — the player's forward is not the case's long axis. Re-siting is then
129
+ one edit to placement.json plus a script rerun, no second in-game trip needed unless the spot
130
+ itself was wrong.
131
+ - id: cp2077.world.loot-container.three-artifacts-must-deploy-together
132
+ claim: Deploying a world-placed lootable container requires three artifacts to move together — the
133
+ archive (holding the .app/.ent/sector/block), the archive's .xl manifest (holding the
134
+ `streaming:` block REGISTRATION), and the tweaks yaml (loot table + crafting specs); if the
135
+ archive is redeployed but the .xl is left at an older version, the container silently fails to
136
+ appear even though the archive itself contains everything needed.
137
+ status: verified
138
+ source: ModWright field verification
139
+ tags:
140
+ - world
141
+ - cache
142
+ - deploy
143
+ - archivexl
144
+ - manifest
145
+ - silent-failure
146
+ detail: "Named as an actual incident: \"This is exactly what went wrong on 2026-09-03: archive
147
+ packed, .xl left at its 08-19 version.\" The mod's deploy script now gates on this by grepping
148
+ the deployed .xl for a `streaming:` line and throwing if it is missing."
149
+ - id: cp2077.world.loot-container.deploy-verifies-with-md5-not-mtime
150
+ claim: A mod's archive deploy scripts verify a successful copy by comparing MD5 hashes of source and
151
+ destination (not file size or modification time), and only create a rollback backup of the
152
+ previously-live archive when its hash actually differs from the incoming one.
153
+ status: inferred
154
+ source: ModWright research
155
+ tags:
156
+ - world
157
+ - cache
158
+ - deploy
159
+ - md5
160
+ - rollback
161
+ - verification
162
+ detail: Rollback copies are hash-verified immediately after being written (throws "rollback copy
163
+ mismatch" if the backup itself doesn't match), and the final live-archive copy is
164
+ hash-compared against the staged source before the script reports success. Consistent with the
165
+ same hash-over-mtime discipline used in mesh deploy (see
166
+ cp2077.anims.method.identify-builds-by-anims-md5-never-mtime and
167
+ cp2077.anims.method.copy-live-archive-to-rollback-before-every-deploy).
@@ -0,0 +1,233 @@
1
+ game: cyberpunk2077
2
+ topic: world.sectors
3
+ title: Sector structure, streaming blocks, and world placement
4
+ facts:
5
+ - id: cp2077.sectors.entspawner-export-format
6
+ claim: entspawner export json is a recipe format, not a final sector; it reveals sector and
7
+ descriptor configuration (category, level, streaming fields, appearance names) that can be
8
+ used to build a correct hand-authored sector.
9
+ status: verified
10
+ verified_on: "2.31"
11
+ source: ModWright field verification
12
+ tags:
13
+ - entspawner
14
+ - export
15
+ - recipe
16
+ - sector
17
+ - reference
18
+ detail: "A vanilla suitcase was placed in game with entSpawner (worldBuilder v1.0.81, installed from
19
+ GitHub after the old install turned out to be a hollow Vortex skeleton) and project
20
+ \"malorian\" was exported to bin\\...\\mods\\entSpawner\\export\\malorian_exported.json. The
21
+ export gave category \"Exterior\" level 1, the full appearance name
22
+ suitcase_small_neomilitary_a, the placement (-835.758, 328.628, 7.884) and the streaming
23
+ values. It did not by itself fix the placement: what finally shipped was the sector GENERATED
24
+ by WolvenKit GUI's official entSpawner import script, with the loot instanceData injected into
25
+ it by a script; the hand-authored sector was abandoned."
26
+ - id: cp2077.sectors.sector-category-alwaysloaded
27
+ claim: A modded streaming sector and its streamingblock descriptor for a world placement use
28
+ category AlwaysLoaded at level 0.
29
+ status: contradicted
30
+ source: ModWright research
31
+ tags:
32
+ - sector
33
+ - descriptor
34
+ - category
35
+ - level
36
+ - always-loaded
37
+ - retracted
38
+ detail: "This was the hand-authored guess: the mod's sector build script started from a donor
39
+ descriptor selected by `category == \"AlwaysLoaded\"` and the early cache architecture is
40
+ described in its notes as \"one AlwaysLoaded descriptor\". The entSpawner export showed the
41
+ vanilla-tool value is Exterior/1. Superseded by cp2077.sectors.sector-category-level."
42
+ - id: cp2077.sectors.sector-category-level
43
+ claim: Sector descriptors have category and level fields; "Exterior" category with level 1 is
44
+ correct for outdoor world placements; always-loaded category with level 0 causes invisible
45
+ entities.
46
+ status: inferred
47
+ source: ModWright research
48
+ tags:
49
+ - sector
50
+ - descriptor
51
+ - category
52
+ - level
53
+ - exterior
54
+ - always-loaded
55
+ supersedes: cp2077.sectors.sector-category-alwaysloaded
56
+ detail: Early builds used AlwaysLoaded/0 and entities were invisible; the switch to Exterior/1 came
57
+ from the entSpawner export and ships in the working mod. Two candidate causes of the
58
+ invisibility (category/level and a wrong appearanceName) were changed at the same time, so
59
+ neither is proven to be the cause. The mod's notes call them "the likely invisibility causes".
60
+ - id: cp2077.sectors.streaming-block-json-structure
61
+ claim: A .streamingblock json file contains descriptor entries; each descriptor references a
62
+ .streamingsector file path and specifies load behavior (category, level, streaming fields).
63
+ status: inferred
64
+ source: ModWright research
65
+ tags:
66
+ - streaming-block
67
+ - json
68
+ - descriptor
69
+ - sector
70
+ detail: "The shipped block is malorian\\all.streamingblock, referencing
71
+ malorian\\sectors\\malorian.streamingsector, and it is registered in the mod's .archive.xl
72
+ under `streaming: blocks:`. The mod's older notes still name the abandoned hand-authored paths
73
+ mod\\<modname>\\<mod>.streamingblock and mod\\<modname>\\<mod>.streamingsector; the .xl
74
+ manifest is the ground truth."
75
+ - id: cp2077.sectors.streaming-sector-node-data
76
+ claim: A .streamingsector json file contains worldEntityNode entries with nodedata objects; each
77
+ nodedata specifies position, rotation, appearance, streaming distance, and interaction chunks.
78
+ status: inferred
79
+ source: ModWright research
80
+ tags:
81
+ - streaming-sector
82
+ - world-entity-node
83
+ - nodedata
84
+ detail: "The two halves are separate: `nodes[]` holds the worldEntityNode (entityTemplate,
85
+ appearanceName, instanceData with the loot chunk), while `nodeData[]` holds one transform
86
+ entry per node, matched by NodeIndex. A shipped cache sits at the old Malorian factory site on
87
+ the City Center NE waterfront, given as approximately (-836, 329)."
88
+ - id: cp2077.sectors.node-appearance-name-full
89
+ claim: Sector node appearanceName must be the full internal appearance name; using "default",
90
+ partial names, or typos produces invisible entities with no log error.
91
+ status: inferred
92
+ source: ModWright research
93
+ tags:
94
+ - node
95
+ - appearance-name
96
+ - appearance
97
+ - invisible
98
+ - silent-failure
99
+ detail: "The name must RESOLVE to an appearance that exists in the referenced entity: the vanilla
100
+ control node needs suitcase_small_neomilitary_a, while the custom node ships with
101
+ appearanceName \"default\" and works, because the custom case's .app defines an appearance
102
+ literally named \"default\". So the rule is \"the appearance's real name\", not \"never
103
+ default\"."
104
+ - id: cp2077.sectors.control-node-testing
105
+ claim: When diagnosing sector issues, place a vanilla entity node alongside the custom one as a
106
+ control; comparing render and loot outcomes isolates whether the bug is in the custom entity
107
+ or the sector structure.
108
+ status: verified
109
+ verified_on: "2.31"
110
+ source: ModWright field verification
111
+ tags:
112
+ - testing
113
+ - control
114
+ - diagnosis
115
+ - node
116
+ - sector
117
+ detail: "The technique was actually run in game: node 0 = the custom Malorian case, node 1 = an
118
+ untouched vanilla suitcase +1.5m in x, both carrying the same loot instanceData. What it
119
+ settled was that hand-authored sectors were a dead end — the experiment's \"Still
120
+ invisible/unlootable\" branch fired (conclusion: stop hand-authoring), and the placement was
121
+ redone through the official entSpawner import. It did not, as an earlier version of this fact
122
+ claimed, narrow the bug to the appearance chain."
123
+ - id: cp2077.sectors.custom-ent-vs-vanilla-control
124
+ claim: If custom entity is invisible while vanilla control renders, the bug is in the custom .ent
125
+ appearance chain or resource paths; if vanilla loots but custom doesn't, the bug is in
126
+ interaction chunks or physics.
127
+ status: unverified
128
+ source: ModWright research
129
+ tags:
130
+ - diagnosis
131
+ - entity
132
+ - loot
133
+ - appearance
134
+ - physics
135
+ detail: This is the decision tree written before the run, not a result. The branch that actually
136
+ fired was the third one — still invisible/unlootable — so neither inference in the claim was
137
+ exercised.
138
+ - id: cp2077.sectors.no-node-transforms-in-import
139
+ claim: When importing a sector or entity json, wolvenkit does not apply or read node transform
140
+ (position/rotation) data; transforms must be embedded in vertex positions during mesh export
141
+ (blender transform_apply).
142
+ status: unverified
143
+ source: ModWright research
144
+ tags:
145
+ - transform
146
+ - sector
147
+ - import
148
+ - node
149
+ - vertex
150
+ detail: "Treat with suspicion: the sector's own Position/Orientation/Pivot fields ARE the world
151
+ placement and are honoured (per the mod's sector build script, and moving the case is
152
+ described as editing X/Y/Z and rebuilding). The lesson is about GLB mesh import only."
153
+ - id: cp2077.sectors.streaming-field-values-from-export
154
+ claim: Streaming field values (MaxStreamingDistance, UkFloat1, Uk10, Uk11) should be taken directly
155
+ from entspawner export rather than guessed; exact values ensure proper load/unload behavior at
156
+ distance.
157
+ status: inferred
158
+ source: ModWright research
159
+ tags:
160
+ - streaming
161
+ - fields
162
+ - distance
163
+ - values
164
+ - export
165
+ - nodedata
166
+ detail: MaxStreamingDistance 120, UkFloat1 100, Uk10 1056, Uk11 512. These are nodeData fields, one
167
+ entry per node. The mod's notes are explicit that they "already matched" the hand-authored
168
+ values, so they were never a cause of the invisibility; the meaning of the Uk fields is
169
+ undocumented. The advice to copy rather than estimate is the author's, not a measured result.
170
+ - id: cp2077.sectors.sector-json-file-uniqueness
171
+ claim: All handleid and bufferid values in a sector json file must be unique across the entire file
172
+ (not just per node); a duplicate anywhere causes silent deserialization failure.
173
+ status: verified
174
+ source: ModWright field verification
175
+ tags:
176
+ - sector
177
+ - json
178
+ - uniqueness
179
+ - handleid
180
+ - bufferid
181
+ detail: The fields are spelled HandleId and BufferId in the CR2W json. The observed failure was a
182
+ duplicate BufferId "1" on the second node, which broke deserialization with "a useless generic
183
+ JsonException at the buffer's closing brace". The scripts step around it by assigning explicit
184
+ unique values (HandleId "980"/"500", BufferId "2"/"9"). The duplicate-HandleId half of the
185
+ rule is stated in the mod's notes but no failure from it is recorded. This is a WolvenKit
186
+ deserializer behaviour, not an engine observation.
187
+ - id: cp2077.sectors.instance-data-loot-field
188
+ claim: Sector node instanceData field carries loot configuration (loot-tables, loot-quality,
189
+ display-name); presence of instanceData is necessary but not sufficient for looting (also
190
+ requires LootContainerObjectAnimatedByTransform chunk in the entity itself).
191
+ status: verified
192
+ verified_on: "2.31"
193
+ source: ModWright field verification
194
+ tags:
195
+ - sector
196
+ - instance-data
197
+ - loot
198
+ - configuration
199
+ detail: Exact field names are lootTables, lootQuality, containerType and displayName inside the
200
+ instanceData buffer's LootContainerObjectAnimatedByTransform chunk. The shipped injection sets
201
+ lootTables [LootTables.<ModCacheLoot>], lootQuality Legendary and containerType
202
+ ClothingContainer on the sector node, while cache_case.ent carries its own lootTables,
203
+ contentAssignment, lootQuality and displayName LocKey#<Mod>-Cache-Name. Both layers ship in
204
+ the working case.
205
+ - id: cp2077.sectors.raycasting-vs-vertex-sampling
206
+ claim: When placing objects relative to mesh geometry (e.g., a plaque on a case lid), use
207
+ raycast-based placement rather than vertex sampling; vertex sampling fails on large flat
208
+ faces.
209
+ status: verified
210
+ source: ModWright field verification
211
+ tags:
212
+ - placement
213
+ - raycast
214
+ - vertex-sampling
215
+ - mesh
216
+ detail: A build script places an embossed plaque by raycast. The mod's notes call the
217
+ vertex-sampling failure a "recurring trap". This is a Blender-side authoring lesson, not an
218
+ in-game observation.
219
+ - id: cp2077.sectors.pivot-point-precision
220
+ claim: When rotating mesh geometry (e.g., closing a case lid via 180° Z-axis spin), the pivot point
221
+ must be at the exact rotation axis; a misplaced pivot produces visible gaps or misalignment.
222
+ status: verified
223
+ verified_on: "2.31"
224
+ source: ModWright field verification
225
+ tags:
226
+ - pivot
227
+ - rotation
228
+ - geometry
229
+ - alignment
230
+ - lid
231
+ detail: The vanilla gun-case meshes are authored OPEN and exterior-up, so closing the lid is a 180°
232
+ spin about Z plus a translate onto the bottom (an earlier X-axis fold put it exterior-down).
233
+ The lid animation shipped in v1.0.0, so the pivot is confirmed in game.