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,171 @@
1
+ game: cyberpunk2077
2
+ topic: fx.lights
3
+ title: Weapon-mounted dynamic lights and thermal emissive glow
4
+ facts:
5
+ - id: cp2077.fx.lights.app-baked-light-component-does-not-render
6
+ claim: "A gameLightComponent injected directly into a weapon's .app (both the appearance's
7
+ components array and its compiledData RedPackage chunks) assembles correctly at runtime — it
8
+ is findable via FindComponentByName — but its render side never initializes: setter calls
9
+ (SetStrength/SetRadius/SetColor) no-op and no light is cast."
10
+ status: verified
11
+ source: ModWright field verification
12
+ tags:
13
+ - fx
14
+ - light
15
+ - weapon
16
+ - app
17
+ - silent-failure
18
+ detail: This was tried as the fix for runtime AddComponent crashing (see
19
+ cp2077.fx.lights.runtime-addcomponent-crashes-on-draw). It failed for a different reason and
20
+ cost a full test cycle before the project moved to spawning a separate light entity instead
21
+ (which does work — see cp2077.fx.lights.vanilla-spotlight-donor-strip-pattern).
22
+ - id: cp2077.fx.lights.runtime-addcomponent-crashes-on-draw
23
+ claim: Adding a gameLightComponent to a weapon entity at runtime via Codeware's AddComponent crashes
24
+ the game on weapon draw; this is why the reference flashlight mod spawns a separate light
25
+ entity and teleport-follows it instead of attaching a component to the weapon itself.
26
+ status: inferred
27
+ source: ModWright research
28
+ tags:
29
+ - fx
30
+ - light
31
+ - weapon
32
+ - addcomponent
33
+ - crash
34
+ detail: "Recorded as the reason a weapon mod's own CET light helper was built around
35
+ entity-spawn-and-follow rather than component injection at either runtime or build time. The
36
+ app-baked alternative was tried next and also failed, for an unrelated reason (see
37
+ cp2077.fx.lights.app-baked-light-component-does-not-render). Note (2026-09-07): several
38
+ crash-on-load cases occurred during this work, but this specific one is not recalled, so the
39
+ fact stays inferred rather than verified."
40
+ - id: cp2077.fx.lights.bare-ent-template-missing-device-structure
41
+ claim: 'Spawning a gameLightComponent on a bare entEntity template (no other structure) via
42
+ WorldFunctionalTests.SpawnEntity fails silently: the entity spawns but the light component
43
+ never resolves (FindComponentByName returns nothing) because a working spawnable light needs
44
+ the full vanilla "device" chunk structure (an ElectricLight + ElectricLightController pairing,
45
+ 7 Sections), not just an entity wrapping the light component.'
46
+ status: verified
47
+ source: ModWright field verification
48
+ tags:
49
+ - fx
50
+ - light
51
+ - entity
52
+ - device-structure
53
+ - silent-failure
54
+ detail: "Diagnosed by a structural diff against the working donor: the flashlight mod's light.ent
55
+ turned out to BE vanilla
56
+ base\\gameplay\\devices\\lighting\\industrial\\spotlight\\spotlight_a.ent with
57
+ entMeshComponent + entColliderComponent stripped — its CRUIDs still match vanilla's, which a
58
+ from-scratch entity cannot replicate. See
59
+ cp2077.fx.lights.vanilla-spotlight-donor-strip-pattern."
60
+ - id: cp2077.fx.lights.wolvenkit-blank-ent-template-writes-no-entity-chunk
61
+ claim: A brand-new .ent file created from WolvenKit GUI's blank template writes NO entity object
62
+ chunk into compiledData (chunk 0 must be the entity class instance, followed by components);
63
+ spawning such a file crashes the game instantly, and the fix is to instantiate the root
64
+ `entity` handle explicitly via the GUI's add-array-item control.
65
+ status: verified
66
+ source: ModWright field verification
67
+ tags:
68
+ - fx
69
+ - light
70
+ - ent
71
+ - wolvenkit
72
+ - gui
73
+ - crash
74
+ detail: The GUI file had only the component (CruidIndex -1 vs. a working donor's 0; 6 Sections vs.
75
+ 7). Instantiating the entity handle via the GUI's yellow (+) control removed WolvenKit's
76
+ "entity is null" warning and the instant crash, but the resulting plain-entEntity template
77
+ STILL failed to spawn a working light — see
78
+ cp2077.fx.lights.bare-ent-template-missing-device-structure — because the entity-chunk fix
79
+ alone does not supply the device structure a spawnable light needs.
80
+ - id: cp2077.fx.lights.vanilla-spotlight-donor-strip-pattern
81
+ claim: A working weapon-glow light entity can be built by taking vanilla
82
+ base\gameplay\devices\lighting\industrial\spotlight\spotlight_a.ent (a full,
83
+ correctly-structured light device) and stripping its entMeshComponent + entColliderComponent
84
+ from BOTH the compiledData chunks and the components array, remapping the CruidDict indices,
85
+ then retuning the retained gameLightComponent's fields.
86
+ status: verified
87
+ source: ModWright field verification
88
+ tags:
89
+ - fx
90
+ - light
91
+ - entity
92
+ - donor
93
+ - vanilla
94
+ - strip
95
+ detail: "This replaced an earlier version derived from a third-party flashlight mod's light.ent,
96
+ which had the same working structure but an open licensing question; deriving from vanilla
97
+ instead is covered by CDPR's fan-content policy like every other donor asset in the mod. Final
98
+ shipped values: LT_Point, color (255,130,30), intensity 800, radius 8, autoHideDistance 25, no
99
+ local shadows, turnOnByDefault flipped 0->1, isDestructible flipped 1->0 from the template
100
+ defaults. Confirmed working by the user after the rebuild."
101
+ - id: cp2077.fx.lights.spawn-entity-is-async-guard-required
102
+ claim: "WorldFunctionalTests.SpawnEntity is asynchronous: FindEntityByID for the new entity's ID
103
+ stays nil for several frames after the spawn call returns. Code that re-attempts a spawn
104
+ whenever the entity is not yet found (with no in-flight guard) will spawn a new entity every
105
+ update tick until the first one resolves, orphaning every earlier attempt."
106
+ status: verified
107
+ source: ModWright field verification
108
+ tags:
109
+ - fx
110
+ - light
111
+ - entity
112
+ - spawn
113
+ - async
114
+ - race-condition
115
+ detail: "Symptom before the guard: the light grew much brighter after several weapon draws, because
116
+ N stacked orphaned lights survived each weapon switch. The fix tracks every spawned ID in a
117
+ list and despawns all of them (not just the last tracked one) whenever the weapon is put away,
118
+ plus an awaitingSpawn flag with a 3.0 s timeout before allowing a retry."
119
+ - id: cp2077.fx.lights.emissive-material-alone-does-not-illuminate-surfaces
120
+ claim: An emissive material (e.g. the thermal blade glow) does not cast light onto nearby surfaces
121
+ under this engine's rasterized rendering; a separate dynamic light component/entity is
122
+ required to make the blade appear to light up its surroundings.
123
+ status: inferred
124
+ source: ModWright research
125
+ tags:
126
+ - fx
127
+ - light
128
+ - emissive
129
+ - material
130
+ - rendering
131
+ detail: This is the stated reason a weapon mod built a whole separate dynamic light (a CET helper
132
+ with its own glow_light.ent) on top of the already-working emissive blade material — the two
133
+ are additive, not the same effect.
134
+ - id: cp2077.fx.lights.light-component-runtime-tuning-api
135
+ claim: A spawned entity's gameLightComponent can be retuned live from redscript/Lua via
136
+ SetStrength(float), SetRadius(float), and SetColor(Color), looked up by FindComponentByName on
137
+ the entity; this is a real, working runtime API distinct from the app-baked injection route,
138
+ which does not respond to the same setters.
139
+ status: verified
140
+ source: ModWright field verification
141
+ tags:
142
+ - fx
143
+ - light
144
+ - component
145
+ - runtime
146
+ - api
147
+ detail: "Final user-tuned values for the shipped (pre-removal) light: strength 0.01 (deliberately
148
+ subtle), radius 0.0, color (255,130,30), weapon-local offset (0, 0.30, 0.20) rotated with the
149
+ weapon via a pure-Lua quaternion rotation. Contrast with
150
+ cp2077.fx.lights.app-baked-light-component-does-not-render, where the identical setters
151
+ silently do nothing on a component assembled into the .app instead of spawned as its own
152
+ entity."
153
+ - id: cp2077.fx.lights.cet-glow-light-dropped-no-functional-loss
154
+ claim: Removing the CET-driven weapon glow light entirely from the shipped mod has no effect on the
155
+ blade's emissive glow, heat haze, or tip smoke — those are independent systems living in the
156
+ mesh materials and the archive's effect descriptors — and doing so drops Cyber Engine Tweaks
157
+ from the mod's requirements entirely.
158
+ status: verified
159
+ source: ModWright field verification
160
+ tags:
161
+ - fx
162
+ - light
163
+ - cet
164
+ - ship-decision
165
+ - dependency
166
+ detail: The verdict after comparing both builds in game was to make the no-light version the
167
+ standard. The point light only added a dynamic cast onto nearby surfaces (see
168
+ cp2077.fx.lights.emissive-material-alone-does-not-illuminate-surfaces) and did not justify a
169
+ whole extra dependency. A build switch restores it; the CET light helper stays in the repo as
170
+ a dev harness. Shipped requirements are therefore RED4ext + redscript + TweakXL + ArchiveXL
171
+ only.
@@ -0,0 +1,145 @@
1
+ game: cyberpunk2077
2
+ topic: hair.modding
3
+ title: Hair mesh/rig/animgraph triplet and vertex-color conventions
4
+ facts:
5
+ - id: cp2077.hair.modding.filename-triplet-must-match
6
+ claim: "Hair replacement replaces a set of three files that must share one base filename: \"you need
7
+ to rename your imported mesh to `fhair33_pt1.mesh`. If that's the case, you need to rename the
8
+ `.animgraph` and `.rig` to `fhair33_pt1.animgraph` and `fhair33_pt1.rig`.\""
9
+ status: community
10
+ source: wiki.redmodding.org "Basic Hairstyle Replacement Tutorial", section "Wolvenkit"
11
+ tags:
12
+ - hair
13
+ - mesh
14
+ - rig
15
+ - animgraph
16
+ - naming
17
+ - file-triplet
18
+ - gotcha
19
+ detail: 'Symptom, merged in from the former cp2077.hair.modding.mismatched-triplet-morphs-weirdly on
20
+ 2026-09-07 (it is the next sentence of the same paragraph): "Having the wrong names will cause
21
+ your mesh to morph weirdly." The renamed triplet is moved into the `uuh4v_framework` folder,
22
+ replacing the original files. Section name corrected (there is no "File Triplet Structure"
23
+ heading).'
24
+ - id: cp2077.hair.modding.uuh4v-slot-filename-convention
25
+ claim: '`fhair33_pt1` is a UUH4V Framework slot filename, not a vanilla one: the framework ships
26
+ numbered file sets and you pick the one matching the character-creator hairstyle you are
27
+ replacing ("I want to replace FemV hairstyle 33, so I chose file 33 for FemV"). Vanilla hair
28
+ meshes are instead named `hh_<index>_wa__<name>` / `hh_<index>_ma__<name>` under
29
+ `base\characters\common\hair\`, e.g. `hh_121_wa__t_bug_common` is FemV character-creator
30
+ hairstyle 33.'
31
+ status: community
32
+ source: 'wiki.redmodding.org "Basic Hairstyle Replacement Tutorial", section "Wolvenkit"; vanilla
33
+ naming from "Cheat Sheet: Hair", section "Name of meshes by index"'
34
+ tags:
35
+ - hair
36
+ - naming
37
+ - filename
38
+ - convention
39
+ - uuh4v
40
+ detail: Renamed from cp2077.hair.modding.vanilla-filename-convention and corrected on 2026-09-07.
41
+ The previous claim, that vanilla hairstyle files follow `[gender]hair[number]_pt[partition]`,
42
+ is contradicted by the wiki's own hair cheat sheet; no wiki page states what `pt` stands for,
43
+ so "partition" was dropped as invented. To find physics-enabled vanilla hair the cheat sheet
44
+ suggests the WolvenKit search `base\characters\common\hair > .animgraph > _wa_`.
45
+ - id: cp2077.hair.modding.first-material-entry-governs-all-appearances
46
+ claim: "\"Unless you have multiple submeshes, only the first entry in the material matters\" — so
47
+ once hair submeshes are joined into one mesh, \"only the first material entry matters for
48
+ every appearance\", across all 35 appearances for the game's 35 hair colours. The cheap fix is
49
+ to copy the materials from a hairstyle that already works rather than retargeting all 35 by
50
+ hand."
51
+ status: community
52
+ source: wiki.redmodding.org "Basic Hairstyle Replacement Tutorial", section "Wolvenkit"
53
+ tags:
54
+ - hair
55
+ - material
56
+ - join
57
+ - silent-failure
58
+ - gotcha
59
+ detail: "The guide's concrete case is wanting `cards` where the first entry is `cards_top`. 35 is
60
+ exact, not \"roughly 35\": \"Cheat Sheet: Hair\" lists 35 colour names by index, from
61
+ `05_brown_liquorice` (CC slot 1) to `35_silver_rose`. Corrected 2026-09-07."
62
+ - id: cp2077.hair.modding.version-floors
63
+ claim: The hair-replacement tutorial's requirements are WolvenKit >= 8.13.0, Blender >= 4.0, the
64
+ WolvenKit Blender IO Suite (most recent version), and the UUH4V Framework "(To avoid conflicts
65
+ with spawned NPCs)".
66
+ status: community
67
+ source: wiki.redmodding.org "Basic Hairstyle Replacement Tutorial", section "Requirements"
68
+ tags:
69
+ - hair
70
+ - version-floor
71
+ - wolvenkit
72
+ - blender
73
+ - uuh4v
74
+ detail: "Corrected 2026-09-07: the stated reason for UUH4V is conflicts with SPAWNED NPCs, not
75
+ load-order conflicts with other hair mods. Tool versions are on their own numbering, so they
76
+ stay in the claim with no `verified_on`."
77
+ - id: cp2077.hair.modding.single-head-bone-weighting
78
+ claim: "\"Unlike clothes, most head meshes only have one bone: `Head`\" — the hair mesh is weighted
79
+ by selecting all vertices in Edit Mode, creating the `Head` entry in the Data tab of the
80
+ Properties panel and clicking `Assign`. A mesh rigged this way \"would stay on your
81
+ character's head like a helmet\", i.e. with no physics."
82
+ status: community
83
+ source: wiki.redmodding.org "Basic Hairstyle Replacement Tutorial", section "The Mesh > Rigging the
84
+ hair"
85
+ tags:
86
+ - hair
87
+ - rig
88
+ - bone
89
+ - weighting
90
+ - head-bone
91
+ detail: "Corrected 2026-09-07: physics do NOT come from simply pairing an `.animgraph`/`.rig`. Per
92
+ \"The Physics\" and \"Finding vanilla hair to replace\", you separate the parts that should
93
+ move into submeshes, export a vanilla hairstyle whose shape overlaps yours together with its
94
+ `.rig` and `.animgraph` (\"They are the physic components for the hair\"), transfer weights
95
+ from the vanilla mesh to yours, and parent your meshes under the vanilla armature with an
96
+ armature modifier. The guide's own caveat: this is \"the easiest and fastest method, but also
97
+ the most unreliable\", and leaving the hair static is an acceptable outcome. It names donor
98
+ meshes by part: `hh_081_wa__buns_02` for front/right bangs, `hh_040_wa__pixie_bob` for left
99
+ bangs, `hh_118_wa__gillean` or `hh_115_wa__alanah` for hair on the shoulder,
100
+ `hh_083_wa__ponytail_01` for ponytails."
101
+ - id: cp2077.hair.modding.adapt-uv-to-shared-hair-texture
102
+ claim: "\"If you are porting a hairstyle from another game, it is highly recommended that you just
103
+ adapt the UV of your hairstyle to fit CP2077's shared hair texture instead of using the
104
+ original texture. This will allow your hair to use the game's hair color system, as well as
105
+ saving you a lot of hassle when handling the materials.\""
106
+ status: community
107
+ source: wiki.redmodding.org "Basic Hairstyle Replacement Tutorial", section "The Texture"
108
+ tags:
109
+ - hair
110
+ - texture
111
+ - uv
112
+ - shared-texture
113
+ - hair-color
114
+ detail: Section name corrected 2026-09-07 (this is under "The Texture", not "Mesh Preparation").
115
+ - id: cp2077.hair.modding.vertex-color-ao-convention
116
+ claim: "\"Cyberpunk hair material uses the vertex colour attribute to fake ambient occlusion. They
117
+ are usually red at the scalp and the innermost layer of hair cards, whereas the outer layers
118
+ are black.\" Doing it the other way round looks bad; the page's caption states the rule as
119
+ \"Red is dark and dull, black is bright and shiny\"."
120
+ status: community
121
+ source: wiki.redmodding.org "Vertex Color and Hair", section "Summary"
122
+ tags:
123
+ - hair
124
+ - vertex-color
125
+ - ambient-occlusion
126
+ - shader
127
+ - gotcha
128
+ detail: The page does not specify which RGB channel(s) or numeric range carry this — only the
129
+ relative convention — so treat exact channel/value authoring as unverified beyond "red at
130
+ scalp and inner layers, black on outer layers". Section name corrected 2026-09-07 (there is no
131
+ "Ambient Occlusion (AO) Channel" heading).
132
+ - id: cp2077.hair.modding.flow-map-encodes-strand-direction
133
+ claim: Separately from vertex-colour AO, Cyberpunk mimics anisotropy "with the flow texture, which
134
+ acts as a tangent map in telling the shader that the hair strands run from root to tip",
135
+ encoding directions as colour. "The dread flow map is inverted, as the dreadlocks have strands
136
+ running in the opposite direction."
137
+ status: community
138
+ source: wiki.redmodding.org "Vertex Color and Hair", section "Anisotropy"
139
+ tags:
140
+ - hair
141
+ - flow-map
142
+ - shader
143
+ - strand-direction
144
+ - dreadlocks
145
+ detail: 'Section name corrected 2026-09-07 (there is no "Related Concept: Flow Texture" heading).'
@@ -0,0 +1,246 @@
1
+ game: cyberpunk2077
2
+ topic: items.wiring
3
+ title: The yaml -> csv -> root_entity.ent -> .app -> mesh_entity.ent -> .mesh chain for item additions
4
+ facts:
5
+ - id: cp2077.items.wiring.four-structural-files-to-add-an-item
6
+ claim: "Registering a new item with TweakXL/ArchiveXL requires four structural files: the TweakXL
7
+ `.yaml` (the item's properties), the `.xl` manifest (tells ArchiveXL which factory csv and
8
+ localization json to register), the factory `.csv` (maps the yaml's `entityName` to a root
9
+ entity file) and the localization `.json` (translated display/description strings)."
10
+ status: community
11
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
12
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
13
+ section "Structural files: telling the game about your mod"'
14
+ tags:
15
+ - items
16
+ - archivexl
17
+ - tweakxl
18
+ - file-structure
19
+ - id: cp2077.items.wiring.yaml-four-mappings
20
+ claim: "A TweakXL item yaml entry performs four mappings: `entityName` points to a row in the
21
+ factory csv; `appearanceName` is looked up (by name, up to the first suffix) in the root
22
+ entity the factory resolved to; `displayName`/`localizedDescription` are keys looked up in the
23
+ localization json, gender-branched into `maleVariant`/`femaleVariant`; `icon` hooks up the
24
+ inventory preview."
25
+ status: community
26
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
27
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
28
+ section "The control file: yourModName.yaml"'
29
+ tags:
30
+ - items
31
+ - yaml
32
+ - entityname
33
+ - appearancename
34
+ - displayname
35
+ - icon
36
+ detail: "If a language's localization entry is missing, the English one is used as fallback
37
+ (documented under \"The .json file (custom texts, i18n)\"). Checked against the source
38
+ (2026-09-08): an earlier detail had the gender fallback backwards. The page says the opposite
39
+ — \"If you don't need a male-specific translation, you can leave it blank — by default,
40
+ `femaleVariant` will be used\", i.e. it is `maleVariant` that may be left blank, and
41
+ `femaleVariant` is the value used when it is."
42
+ - id: cp2077.items.wiring.factory-csv-links-entityname-to-root-entity
43
+ claim: The factory `.csv` file is where ArchiveXL looks up a yaml entry's `entityName` (matched
44
+ against the csv's first field/header) to find the corresponding root entity `.ent` path, and
45
+ the `appearanceName` from the yaml is then searched for inside that root entity.
46
+ status: community
47
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
48
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
49
+ section "The .csv file (the factory)"
50
+ tags:
51
+ - items
52
+ - factory-csv
53
+ - entityname
54
+ - root-entity
55
+ detail: "RELATED: this generic mechanism is the same one cp2077.archivexl.factories-csv-paths and
56
+ cp2077.archivexl.factory-csv-appearance-mapping document concretely for one weapon mod's own
57
+ factory_parts.csv (columns name, path, shared) — this fact states the general csv-lookup
58
+ mechanism, that one the specific shipped file's schema."
59
+ - id: cp2077.items.wiring.root-entity-is-appearance-lookup-dictionary
60
+ claim: 'The root entity (`root_entity.ent`) is described as "a glorified lookup dictionary": for a
61
+ given `appearanceName` it specifies which `.app` file to load and which appearance name inside
62
+ that `.app` to use; when using dynamic appearances only one appearance entry is needed here
63
+ (matched up to the `!` variant separator), and it must carry the `DynamicAppearance` tag.'
64
+ status: community
65
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
66
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
67
+ section "root_entity.ent"
68
+ tags:
69
+ - items
70
+ - root-entity
71
+ - dynamic-appearances
72
+ - dynamicappearance-tag
73
+ - id: cp2077.items.wiring.mesh-entity-replaces-app-component-array
74
+ claim: "`mesh_entity.ent` holds the components (chiefly an `entGarmentSkinnedMeshComponent`) that
75
+ determine how the equipment renders and moves; using a separate mesh entity file replaces
76
+ having to duplicate that component array inline inside every appearance of the `.app` file.
77
+ The component's `name` is what the `.app`'s `materialOverride`/`partsOverrides` array
78
+ references back."
79
+ status: community
80
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
81
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
82
+ section "mesh_entity.ent"
83
+ tags:
84
+ - items
85
+ - mesh_entity
86
+ - entgarmentskinnedmeshcomponent
87
+ - .app
88
+ - id: cp2077.items.wiring.mesh-component-name-prefix-must-be-kept
89
+ claim: When renaming a garment mesh component inside `mesh_entity.ent`, the component-type name
90
+ prefix (e.g. `t1_`) must be left in place — the game uses that prefix to calculate collisions
91
+ — even though the rest of the component's name is otherwise a free label.
92
+ status: community
93
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
94
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
95
+ warning under "mesh_entity.ent" ("you want to leave the component prefixes (t1_) in place —
96
+ the game needs them to calculate collisions!")
97
+ tags:
98
+ - items
99
+ - mesh_entity
100
+ - component-prefix
101
+ - collision
102
+ - gotcha
103
+ - id: cp2077.items.wiring.app-component-array-must-stay-empty
104
+ claim: An item's `appearance.app` file's own top-level `components` array must be left empty — items
105
+ load their components from `mesh_entity.ent` via `partsValues` instead; a non-empty
106
+ `components` array on an item `.app` is explicitly called out as wrong ("this is not an NPC
107
+ appearance!").
108
+ status: community
109
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
110
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md, danger
111
+ hint under "appearance.app" ("The .app file's component array should be **empty:** this is not
112
+ an NPC appearance!")
113
+ tags:
114
+ - items
115
+ - .app
116
+ - components
117
+ - gotcha
118
+ - validator
119
+ - id: cp2077.items.wiring.app-partsvalues-vs-partsoverrides
120
+ claim: Inside an item `appearance.app` entry, `partsValues` points at the `mesh_entity.ent` file(s)
121
+ to load as components, while `partsOverrides` tells the referenced mesh which
122
+ appearance/chunkmask to use; when using dynamic appearances (a single appearance entry with
123
+ components ignored) only `partsValues` needs to be set — `partsOverrides`-based chunkmask
124
+ hiding is the non-dynamic-appearance path.
125
+ status: community
126
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
127
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
128
+ section "appearance.app"
129
+ tags:
130
+ - items
131
+ - .app
132
+ - partsvalues
133
+ - partsoverrides
134
+ - dynamic-appearances
135
+ - id: cp2077.items.wiring.mesh-appearance-name-links-app-to-mesh
136
+ claim: Inside an item's `.app` appearance's `partsOverrides`, the `componentsOverride` entry's
137
+ `meshAppearance` field must match the `name` of a `meshMeshAppearance` entry inside the actual
138
+ `.mesh` resource file; the `.app` file itself does not define materials — it only selects
139
+ which named appearance inside the `.mesh` to use.
140
+ status: community
141
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
142
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
143
+ section "appearance.app: Making changes" (steps 8-9)'
144
+ tags:
145
+ - items
146
+ - .app
147
+ - .mesh
148
+ - meshappearance
149
+ - wiring
150
+ - id: cp2077.items.wiring.mesh-material-index-must-match-array-position
151
+ claim: Inside a `.mesh` resource, a new `materials` entry's `index` field must match that entry's
152
+ actual position in the `materials` array, and the corresponding new entry appended to
153
+ `localMaterialBuffer` must also be placed at the matching position, because the mesh's
154
+ materials and localMaterialBuffer entries are matched to each other by numeric array index
155
+ rather than by name.
156
+ status: community
157
+ source: "CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
158
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
159
+ section \"Mesh: Making changes\", step 3 (\"Drag it to the last position of the array (that's
160
+ important, because the materials entries match by numeric index)\")"
161
+ tags:
162
+ - items
163
+ - .mesh
164
+ - materials
165
+ - localmaterialbuffer
166
+ - index
167
+ - gotcha
168
+ - id: cp2077.items.wiring.base-parameter-selects-equipment-slot
169
+ claim: An item yaml record's `$base` value determines which equipment slot the item occupies;
170
+ different equipment slots require picking a different "right" mesh entity file for the item,
171
+ per a separate per-slot reference the page defers to.
172
+ status: community
173
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
174
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
175
+ section "What is it, precious? The $base parameter" ("`$base` defines which slot the item will
176
+ use") and section "mesh_entity.ent" ("you need to pick the right mesh entity file for each
177
+ equipment slot", which defers to different-equipment-slots.md)
178
+ tags:
179
+ - items
180
+ - $base
181
+ - equipment-slot
182
+ - mesh_entity
183
+ - id: cp2077.items.wiring.moving-root-entity-requires-updating-factory-csv
184
+ claim: Moving (renaming/relocating) the root entity `.ent` file requires manually updating the path
185
+ recorded for it in the factory `.csv`; moving the `.app`/appearance file requires updating the
186
+ path inside `root_entity.ent`; moving the mesh entity requires updating the path inside every
187
+ appearance in the `.app` file. Each file only knows the next file's path by an explicit string
188
+ reference, not a resolved relationship WolvenKit maintains automatically.
189
+ status: community
190
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
191
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
192
+ sections "The .csv file (the factory) > Making changes", "Root Entity: Making Changes", "Mesh
193
+ Entity: Making Changes" and "Appearance: Making changes"'
194
+ tags:
195
+ - items
196
+ - file-structure
197
+ - path-reference
198
+ - maintenance
199
+ - id: cp2077.items.wiring.weapon-look-is-an-app-row-not-a-root-entity
200
+ claim: "A vanilla weapon record has no root entity of its own to clone: it inherits `entityName:
201
+ weapon_root` from Items.Base_Weapon, weapons.csv
202
+ (base\\gameplay\\factories\\items\\weapons\\weapons.csv) maps that name to the shared
203
+ base\\weapons\\weapon_root.ent, and that entity's `appearances` list is empty (components
204
+ only: slots, audio, stats, attachment slots, projectile spawn, status effect, vision mode,
205
+ gameplay role, UI slots, an effect spawner). The weapon's look is the `.app` that
206
+ weapons_appearances.csv maps its `appearanceResourceName` to (Preset_Kenshin_Default ->
207
+ base\\weapons\\firearms\\handgun\\arasaka_kenshin\\w_handgun__arasaka_kenshin.app, ten named
208
+ appearances of 28 to 30 components each). A weapon mod therefore ships an `.app` and a factory
209
+ row naming it, never a root entity: one weapon mod's shipped factory_parts.csv holds exactly
210
+ two rows, `<mod>_body -> mod\\<mod>\\<mod>_body.app` and `<Mod>_Weapon ->
211
+ mod\\<mod>\\<mod>_weapon.app`, and its archive carries no `.ent` for the weapon (only the
212
+ cache case's)."
213
+ status: verified
214
+ verified_on: "2.31"
215
+ source: ModWright field verification
216
+ related:
217
+ - cp2077.items.wiring.factory-csv-links-entityname-to-root-entity
218
+ - cp2077.items.wiring.root-entity-is-appearance-lookup-dictionary
219
+ tags:
220
+ - items
221
+ - weapons
222
+ - app
223
+ - factory
224
+ - root-entity
225
+ - appearance-resource-name
226
+ - scaffold
227
+ - id: cp2077.items.wiring.spawnitemdrop-drops-from-the-droppers-inventory
228
+ claim: "LootManager.SpawnItemDrop(obj, itemID, position, rotation) drops an item the object holds:
229
+ vanilla's vendor gives the item to the vendor object first and then drops it. Dropped from the
230
+ player with a seedless ItemID.FromTDBID she did not hold, it returned false; given first, it
231
+ returned true and a pickup appeared. A cyberdeck program has no world entity (its record chain
232
+ sets no entityName), so its pickup is invisible. HasItem and GetItemQuantity with a seedless
233
+ ItemID.FromTDBID do not see a program given or picked up (0 right after a GiveItem); match by
234
+ ItemID.GetTDBID over GetItemList."
235
+ status: verified
236
+ verified_on: "2.31"
237
+ source: ModWright field verification
238
+ tags:
239
+ - items
240
+ - loot
241
+ - drop
242
+ - pickup
243
+ - program
244
+ - itemid
245
+ detail: A drop placed at a surface point inside a dynamic prop's collision threw the prop (a
246
+ notebook on Nix's desk).
@@ -0,0 +1,71 @@
1
+ game: cyberpunk2077
2
+ topic: loadorder.archives
3
+ title: Archive load order and conflict resolution
4
+ facts:
5
+ - id: cp2077.loadorder.archive-conflicts-first-wins
6
+ claim: When two .archive files in archive\pc\mod supply the same depot path, the one that loads
7
+ FIRST wins. Load order is ASCII-alphabetical by filename, so the earlier-sorting archive's
8
+ version of the file is the one the game uses. The widely repeated "last wins" / "z-prefix
9
+ wins" advice is wrong.
10
+ status: verified
11
+ source: ModWright field verification
12
+ tags:
13
+ - load-order
14
+ - archive
15
+ - conflict
16
+ - first-wins
17
+ - override
18
+ detail: Cost a launch. A base <Mod>.archive beat a later-sorting <Mod>Black.archive and the recolour
19
+ never appeared, surviving a clean restart. The fix is to make the override sort BEFORE the
20
+ base archive; a space right after the shared stem does it cleanly ("<Mod> - Black
21
+ Body.archive"), because space 0x20 sorts before the "." 0x2E of "<Mod>.archive" - no ugly
22
+ numeric prefix needed.
23
+ - id: cp2077.loadorder.archive-xl-does-not-reprioritise
24
+ claim: A <name>.archive.xl does NOT re-mount or re-prioritise <name>.archive. ArchiveXL only loads
25
+ the .xl extension; the base game still loads the .archive in its normal alphabetical position.
26
+ Filename is therefore the only lever over archive precedence.
27
+ status: verified
28
+ source: ModWright field verification
29
+ tags:
30
+ - archivexl
31
+ - load-order
32
+ - archive
33
+ - precedence
34
+ - id: cp2077.loadorder.modlist-absent-means-alphabetical
35
+ claim: With no modlist.txt present, archives load in plain alphabetical order. An absent modlist is
36
+ not a fallback to install order or timestamp order.
37
+ status: inferred
38
+ source: ModWright research
39
+ tags:
40
+ - load-order
41
+ - modlist
42
+ - archive
43
+ detail: Recorded because it was eliminated as an explanation, not because it was independently
44
+ tested. Treat as the working assumption, not a measurement.
45
+ - id: cp2077.loadorder.rht-watches-hot-directory-only
46
+ claim: RedHotTools' live depot mount watches archive\pc\hot ONLY. Dropping a rebuilt archive
47
+ anywhere else - including archive\pc\mod - does not trigger a live remount.
48
+ status: verified
49
+ source: ModWright field verification
50
+ tags:
51
+ - redhottools
52
+ - hot-reload
53
+ - archive
54
+ - depot
55
+ - id: cp2077.loadorder.reskin-ships-as-override-archive
56
+ claim: An optional reskin or recolour ships as its own .archive containing only the overridden depot
57
+ paths (the mesh plus any changed textures); everything else resolves from the base archive. It
58
+ must be NAMED to sort before the base archive or it loses the conflict.
59
+ status: verified
60
+ source: ModWright field verification
61
+ tags:
62
+ - archive
63
+ - override
64
+ - reskin
65
+ - optional
66
+ - packaging
67
+ detail: Build the override mesh by editing the mesh JSON materials directly and running convert
68
+ deserialize, NOT by re-importing with import -k. The direct-JSON route preserves
69
+ boneVertexEpsilons; the import -k defect and its symptom are recorded in full at
70
+ cp2077.process.assetbuild.wolvenkit-import-keep-flag-wipes-bone-vertex-epsilons (which also
71
+ names the restore step, a restore script, and the shipped value of 3.0).