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,151 @@
1
+ game: cyberpunk2077
2
+ topic: tweakxl.hotreload
3
+ title: TweakXL's Reload() hot-reload entry point and what it does under the hood
4
+ facts:
5
+ - id: cp2077.tweakxl.hotreload.reload-scripted-entry-point
6
+ claim: TweakXL exposes a scripted static class whose RTTI name is `App::Project::Name` = "TweakXL"
7
+ and whose native implementation is `App::Facade`; `App::Facade::Reload()` is the
8
+ RTTI-registered method backing a scripted `TweakXL.Reload()` call, and that call resolves from
9
+ the CET console and runs a full load, usage-report and issue-check cycle.
10
+ status: verified
11
+ verified_on: "2.31"
12
+ source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.hpp:7-23 (class declaration, `Reload()` at
13
+ :18) and :26-39 (`RTTI_DEFINE_CLASS(App::Facade, App::Project::Name, ...)` with
14
+ `RTTI_METHOD(Reload)` at :36); config/Project.hpp.in:12 (`constexpr auto Name = "${NAME}"`);
15
+ xmake.lua:50 (`set_configvar("NAME", "TweakXL")`)
16
+ tags:
17
+ - tweakxl
18
+ - hot-reload
19
+ - reload
20
+ - redscript
21
+ - rtti
22
+ detail: "Checked against the source (2026-09-08): an earlier wording also said \"there is no
23
+ separate console command — it is invoked as a scripted static function call, e.g. from the CET
24
+ console\". Neither the header, the xmake file nor the Facade implementation says anything
25
+ about a console, CET or otherwise; that was the drafter's own illustration and is removed
26
+ here. What the source does show is only that `Reload` is registered as an RTTI method on a
27
+ scripted class, i.e. callable from any scripting surface that can reach RTTI statics. The CET
28
+ console is one such surface, confirmed live 2026-09-09 with TweakXL 1.11.4: `TweakXL.Reload()`
29
+ typed in the console resolved without error."
30
+ - id: cp2077.tweakxl.hotreload.reload-does-three-things
31
+ claim: "`App::Facade::Reload()` calls, in order, `TweakService::LoadTweaks()`,
32
+ `TweakService::ReportUsage()` and `TweakService::CheckForIssues()` — hot reload re-runs the
33
+ full tweak load pipeline and a changelog-based issue check every time it is called, not just
34
+ the file(s) that changed."
35
+ status: inferred
36
+ source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:47-55 (`App::Facade::Reload` body)
37
+ tags:
38
+ - tweakxl
39
+ - hot-reload
40
+ - reload
41
+ - pipeline
42
+ detail: "`CheckForIssues()` in turn calls `m_changelog->CheckForIssues(m_manager)`
43
+ (src/App/Tweaks/TweakService.cpp:103-109), i.e. the same changelog mechanism that flags
44
+ renamed/removed vanilla records runs again on every Reload(), not only at initial game load."
45
+ - id: cp2077.tweakxl.hotreload.importdir-importtweak-removed
46
+ claim: The older `TweakXL.ImportDir()` and `TweakXL.Import()` (internally `ImportTweak`) scripted
47
+ methods are still RTTI-registered but their bodies do nothing except log a debug message
48
+ telling the caller to use `TweakXL.Reload()` instead; they no longer import anything.
49
+ status: verified
50
+ source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:22-30 (both bodies log "[TweakXL] The
51
+ method TweakXL.ImportDir() is no longer supported. Use TweakXL.Reload() instead." and return
52
+ without doing anything else); src/App/Facade.hpp:30-32 (`RTTI_METHOD(ImportDir)`,
53
+ `RTTI_METHOD(ImportTweak, "Import")` still registered)
54
+ tags:
55
+ - tweakxl
56
+ - hot-reload
57
+ - deprecated
58
+ - importdir
59
+ detail: A mod script or bridge that still calls `TweakXL.ImportDir()` or `TweakXL.Import()`
60
+ expecting a load to happen will no-op; the debug log line is the only effect the source shows.
61
+ Note both bodies log the *ImportDir* wording, so an `Import()` call logs a message naming
62
+ `ImportDir()` — do not use the message text to tell the two apart.
63
+ - id: cp2077.tweakxl.hotreload.require-version-gate
64
+ claim: "TweakXL exposes `TweakXL.Require(version: String) -> Bool`, which parses `version` as a
65
+ semver string and returns whether the installed TweakXL's own `Project::Version` is greater
66
+ than or equal to it; an unparsable version string returns false rather than throwing."
67
+ status: verified
68
+ verified_on: "2.31"
69
+ source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:57-61 (`App::Facade::Require`, using
70
+ `semver::from_string_noexcept(aVersion.c_str())` and `requirement.has_value() &&
71
+ Project::Version >= requirement.value()`)
72
+ tags:
73
+ - tweakxl
74
+ - version-check
75
+ - require
76
+ - compatibility
77
+ detail: This is the mechanism a mod's own redscript can use to gate functionality on a minimum
78
+ installed TweakXL version at runtime, distinct from the RED4ext-level version floor recorded
79
+ in cp2077.tweakxl.yaml-syntax.version-floors.
80
+ - id: cp2077.tweakxl.hotreload.getversion-method
81
+ claim: TweakXL exposes `TweakXL.Version() -> String` (native method `GetVersion`, registered under
82
+ the RTTI alias `Version`), returning the installed TweakXL build's own semver as a string.
83
+ status: verified
84
+ verified_on: "2.31"
85
+ source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:63-66 (`App::Facade::GetVersion` returns
86
+ `Project::Version.to_string().c_str()`); src/App/Facade.hpp:38 (`RTTI_METHOD(GetVersion,
87
+ "Version")`)
88
+ tags:
89
+ - tweakxl
90
+ - version-check
91
+ - redscript-api
92
+ - id: cp2077.tweakxl.hotreload.reload-does-not-unload-removed-records
93
+ claim: "`TweakXL.Reload()` adds and updates records from the tweak files present on disk but does
94
+ not remove a record whose source file has been deleted since the last load; the record stays
95
+ in TweakDB for the rest of the game session and only a process restart clears it."
96
+ status: verified
97
+ verified_on: "2.31"
98
+ source: ModWright field verification
99
+ tags:
100
+ - tweakxl
101
+ - hot-reload
102
+ - reload
103
+ - remove
104
+ - asymmetric
105
+ related:
106
+ - cp2077.tweakxl.hotreload.reload-does-three-things
107
+ detail: "Consistent with `reload-does-three-things`: LoadTweaks() re-imports what is on disk into
108
+ the live TweakDB, and nothing in the pipeline diffs against the previous load to retract
109
+ records. Hot reload is therefore asymmetric for the deploy/reload recommendation: adding or
110
+ editing a tweak file is hot, removing one needs a restart. A later probe in the same session
111
+ can misread a removed record as still shipped."
112
+ - id: cp2077.tweakxl.hotreload.reload-applies-changed-flat-on-existing-record
113
+ claim: "TweakXL.Reload() re-applies a CHANGED flat on an already-existing record, not just newly
114
+ added records: editing a flat in a deployed tweak file and calling TweakXL.Reload() updates
115
+ the live TweakDB flat. This is the positive half of the asymmetry in
116
+ reload-does-not-unload-removed-records (edits/additions are hot; only removals need a
117
+ restart)."
118
+ status: verified
119
+ verified_on: "2.31"
120
+ source: ModWright field verification
121
+ tags:
122
+ - tweakxl
123
+ - hot-reload
124
+ - reload
125
+ - flat
126
+ - verified
127
+ related:
128
+ - cp2077.tweakxl.hotreload.reload-does-not-unload-removed-records
129
+ - cp2077.redhottools.hotreload.hot-tweaks-consumed-without-reload-1.3.0
130
+ detail: Because TweakXL.Reload() works but RHT 1.3.0.33690's `.hot-tweaks` sentinel does not drive
131
+ it (hot-tweaks-consumed-without-reload-1.3.0), the reliable tweak hot-reload is
132
+ TweakXL.Reload() via cp2077.lua.eval — which is what the reload table's tweaks `via` should
133
+ lead with, and what deploy --reload apply should call for a tweaks target.
134
+ - id: cp2077.tweakxl.hotreload.parse-error-still-ends-in-import-completed
135
+ claim: 'TweakXL 1.11.4 writes each session to red4ext/plugins/TweakXL/TweakXL-<date>-<time>.log and
136
+ leaves TweakXL.log empty. A reload that cannot parse a tweak file logs `Reading "<path under
137
+ r6/tweaks>"...` followed by an `[error] yaml-cpp: ...` line and still ends with "Import
138
+ completed.", so that line alone does not show that a given file loaded.'
139
+ status: verified
140
+ verified_on: "2.31"
141
+ source: ModWright field verification
142
+ tags:
143
+ - tweakxl
144
+ - log
145
+ - hot-reload
146
+ - read-back
147
+ - silent-failure
148
+ related:
149
+ - cp2077.tweakxl.yaml-syntax.log-file-location
150
+ detail: deploy --reload apply now reads the newest TweakXL*.log and turns a read-back into `error`
151
+ when an [error] line follows the Reading line of a deployed file (commit 1f95118).
@@ -0,0 +1,208 @@
1
+ game: cyberpunk2077
2
+ topic: tweakxl.yaml-syntax
3
+ title: TweakXL YAML tweak file placement, structure and record/inline semantics
4
+ facts:
5
+ - id: cp2077.tweakxl.yaml-syntax.version-floors
6
+ claim: TweakXL's README lists its compatibility as Cyberpunk 2077 2.3 and redscript 0.5.27+, and its
7
+ installation step 1 requires RED4ext 1.28.0+ before extracting `TweakXL-x.x.x.zip` into the
8
+ Cyberpunk 2077 directory.
9
+ status: community
10
+ source: psiberx/cp2077-tweak-xl/README.md, sections "Getting Started > Compatibility" (game,
11
+ redscript) and "Getting Started > Installation" (RED4ext)
12
+ tags:
13
+ - tweakxl
14
+ - version-floor
15
+ - redscript
16
+ - red4ext
17
+ - id: cp2077.tweakxl.yaml-syntax.file-placement
18
+ claim: TweakXL loads tweak definitions from `.yaml` or `.tweak` files placed in `Cyberpunk
19
+ 2077/r6/tweaks`, or from `.xl` files placed in `Cyberpunk 2077/archive/pc/mod`; regardless of
20
+ which of the three extensions is used, the file's contents must be written in YAML or JSON
21
+ syntax.
22
+ status: community
23
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
24
+ for-mod-creators-theory/core-mods-explained/tweakxl/README.md, section "How do I use it?"
25
+ tags:
26
+ - tweakxl
27
+ - file-placement
28
+ - r6-tweaks
29
+ - archive-xl-manifest
30
+ detail: "The page's exact wording for the second half: \"No matter the file extension, the file
31
+ `contents` must be in `.yaml` or `.json` syntax.\""
32
+ - id: cp2077.tweakxl.yaml-syntax.log-file-location
33
+ claim: TweakXL writes its own log to `<game_directory>/red4ext/plugins/TweakXL/TweakXL.log`; a YAML
34
+ syntax or load error for a tweak file is reported there.
35
+ status: community
36
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
37
+ for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
38
+ section "The log file"
39
+ tags:
40
+ - tweakxl
41
+ - log-file
42
+ - troubleshooting
43
+ - id: cp2077.tweakxl.yaml-syntax.indentation-spaces-only
44
+ claim: TweakXL yaml tweak files must be indented with spaces, never tabs; a tab character in the
45
+ indentation breaks the file's structure and, in the page's words, "your mod won't work".
46
+ status: community
47
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
48
+ for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
49
+ section "Indentation"
50
+ tags:
51
+ - tweakxl
52
+ - yaml
53
+ - indentation
54
+ - validator
55
+ detail: 'A validator or linter should flag literal tab characters found in the leading whitespace of
56
+ a `.yaml`/`.tweak` file before it is packed. Checked against the source (2026-09-08): the page
57
+ does not say the failure is silent — it says the opposite elsewhere ("If there are any issues
58
+ with your yaml file, the TweakXL log will tell you about it", see
59
+ cp2077.tweakxl.yaml-syntax.log-file-location), so do not assume a tab failure is invisible.'
60
+ - id: cp2077.tweakxl.yaml-syntax.duplicate-keys-break-file
61
+ claim: A duplicate key at the same nesting level in a TweakXL yaml file breaks the whole file's
62
+ parse; the community-recommended check is to run the file through yamllint.com before packing.
63
+ status: community
64
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
65
+ for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
66
+ section "Key Uniqueness"
67
+ tags:
68
+ - tweakxl
69
+ - yaml
70
+ - duplicate-key
71
+ - validator
72
+ - id: cp2077.tweakxl.yaml-syntax.record-names-must-be-unique
73
+ claim: Every TweakXL record (a named container grouping properties, which may themselves be other
74
+ records or flats) must have a globally unique name; two records sharing a name overwrite each
75
+ other.
76
+ status: community
77
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
78
+ for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
79
+ section "Records"
80
+ tags:
81
+ - tweakxl
82
+ - record
83
+ - naming
84
+ - silent-failure
85
+ detail: 'Checked against the source (2026-09-08): the page states only that colliding records
86
+ "overwrite each other" — whether the overwrite is reported anywhere (e.g. in TweakXL.log) is
87
+ not stated by this source and should not be assumed either way.'
88
+ - id: cp2077.tweakxl.yaml-syntax.inline-record-autonaming
89
+ claim: An inline record (one written nested directly inside another record's property instead of
90
+ being given its own top-level name) is assigned an automatic name of the form
91
+ `<ParentRecordName>_inlineN`, where N depends on the inline's position inside the parent; that
92
+ position, and therefore the generated name, can change on any game update with no warning.
93
+ status: community
94
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
95
+ for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
96
+ section "Inlines"
97
+ tags:
98
+ - tweakxl
99
+ - inline
100
+ - record
101
+ - naming
102
+ - versioning
103
+ - id: cp2077.tweakxl.yaml-syntax.vanilla-inline-records-numbered-per-root
104
+ claim: The game numbers the inline records of a vanilla (.tweak) top-level record with one counter
105
+ per top-level record, in source order, a parent before its children, and names every one of
106
+ them flat `<TopLevelRecord>_inline<N>`, never `<parent inline>_inline<N>`. The Basilisk's
107
+ drive model is the sixth inline record under Vehicle.v_militech_basilisk counting the nested
108
+ ones, and the game calls it Vehicle.v_militech_basilisk_inline5. A weapon blueprint's root
109
+ inline and its three inline children are Items.Base_Tech_Handgun_NoMuzzle_Blueprint_inline0
110
+ and _inline1/2/3.
111
+ status: verified
112
+ verified_on: "2.31"
113
+ source: ModWright field verification
114
+ tags:
115
+ - tweakdb
116
+ - inline
117
+ - record
118
+ - naming
119
+ - index
120
+ related:
121
+ - cp2077.tweakxl.yaml-syntax.inline-record-autonaming
122
+ - cp2077.tweakxl.yaml-syntax.inline-record-as-base-is-bad-practice
123
+ detail: "ModWright's vanilla index numbers them the same way since 2026-09-25 (TWEAKDB_PARSE_VERSION
124
+ 2). Before that it named nested inlines `<parent>_inline<N>` with a counter per parent, so its
125
+ Vehicle.v_militech_basilisk_inline5 was the procedural camera parameters, and
126
+ cp2077.tweaks.base-exists accepted a $base against the wrong record. How TweakXL names nested
127
+ inlines in a mod's own YAML is not read. The rule is not universal: the Archer Quartz player
128
+ variant's package is _inline0 in game where source order gives _inline1 (see
129
+ cp2077.tweakdb.index-inline-names-can-differ-from-the-game)."
130
+ - id: cp2077.tweakdb.index-inline-names-can-differ-from-the-game
131
+ claim: The redmod tweak sources do not always give the game's inline record names. The Archer
132
+ Quartz's player-variant data package is Vehicle.v_standard2_archer_quartz_inline0 in game,
133
+ where the source writes the statModifiers inline first (source order gives _inline1), and in
134
+ game _inline1 is a ConstantStatModifier. The Quartz Nomad, written the same way (a
135
+ statModifiers += inline, then the vehDataPackage inline), has its package at _nomad_inline1 in
136
+ game, as source order gives. So an inline name taken from the index (built from those sources)
137
+ is unverified until read live.
138
+ status: verified
139
+ verified_on: "2.31"
140
+ source: ModWright field verification
141
+ tags:
142
+ - tweakdb
143
+ - inline
144
+ - record
145
+ - naming
146
+ - index
147
+ - gotcha
148
+ related:
149
+ - cp2077.tweakxl.yaml-syntax.vanilla-inline-records-numbered-per-root
150
+ - cp2077.tweakxl.yaml-syntax.inline-record-as-base-is-bad-practice
151
+ detail: Why the Quartz differs is not known (a compiled TweakDB newer than the sources is one
152
+ possibility). validate's cp2077.tweaks.inline-reference warns on any $base or value naming a
153
+ vanilla _inline<N> record.
154
+ - id: cp2077.tweakxl.yaml-syntax.files-read-in-name-order
155
+ claim: "TweakXL reads a tweaks folder's files in name order and clones a record's $base when its
156
+ file is read, so a $base defined in a file that sorts later does not exist yet: TweakXL logs
157
+ \"Cannot clone <base>, the record doesn't exist\" and drops the record (and anything based on
158
+ it)."
159
+ status: verified
160
+ verified_on: 2.31 (TweakXL 1.x)
161
+ source: ModWright field verification
162
+ tags:
163
+ - tweakxl
164
+ - load-order
165
+ - base
166
+ - gotcha
167
+ detail: validate's cp2077.tweaks.base-defined-before-use blocks it. One mod fixed it by renaming the
168
+ dependent file to <mod>_tiers.yaml ('.' sorts before '_').
169
+ - id: cp2077.tweakxl.yaml-syntax.inline-record-as-base-is-bad-practice
170
+ claim: Using an auto-generated `_inlineN` record name as the `$base` of a mod's own record is
171
+ documented as bad practice, because a future game update can silently change which vanilla
172
+ record that inline name now points to (see
173
+ cp2077.tweakxl.yaml-syntax.inline-record-autonaming), breaking the mod without any load error.
174
+ status: community
175
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
176
+ for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
177
+ section "Inlines"
178
+ tags:
179
+ - tweakxl
180
+ - inline
181
+ - base
182
+ - gotcha
183
+ - versioning
184
+ detail: "Direct quote of the warning: \"NEVER use `inlineX` records as base in your items\".
185
+ RELATED: sharpens cp2077.tweakxl.yaml-syntax.inline-record-autonaming with the concrete
186
+ failure mode a scaffold/validator should check for: a mod's own record whose `$base` matches
187
+ `.*_inline\\d+$`."
188
+ related:
189
+ - id: cp2077.tweakxl.yaml-syntax.inline-record-autonaming
190
+ detail: "Sharpens that fact: the auto-generated name it describes must never be used as a `$base`,
191
+ because the update-to-update instability is exactly what breaks the dependent record."
192
+ - id: cp2077.tweakxl.record-description-property-is-localizeddescription
193
+ claim: An item record's description flat is `localizedDescription`, not `description`; TweakXL logs
194
+ `Unknown property description.` for the latter and still creates the record, so the item
195
+ exists but shows no description text.
196
+ status: verified
197
+ verified_on: "2.31"
198
+ source: ModWright field verification
199
+ tags:
200
+ - tweakxl
201
+ - yaml
202
+ - record
203
+ - property
204
+ - description
205
+ - localizeddescription
206
+ detail: "`displayName` is the display-name flat; `gameplayDescription` is the separate gameplay line
207
+ (a weapon mod can override an inherited LocKey there). TweakXL drops an unknown property
208
+ rather than rejecting the record, so the mistake is invisible unless TweakXL.log is read."
@@ -0,0 +1,259 @@
1
+ game: cyberpunk2077
2
+ topic: ui.icons
3
+ title: Icon rendering, gamma correction, and atlas declaration
4
+ facts:
5
+ - id: cp2077.ui.icon-import-gamma-lift
6
+ claim: png-to-xbm import applies automatic gamma lift; icon renders appear brighter in-game than
7
+ authored. Author dark with power-curve pixels (e.g., ^3.0) and keep speculars via curve
8
+ multiplication rather than multiply blend.
9
+ status: verified
10
+ verified_on: "2.31"
11
+ source: ModWright field verification
12
+ tags:
13
+ - icon
14
+ - gamma
15
+ - import
16
+ - xbm
17
+ - brightness
18
+ detail: "The lift is observed in game, not in the png: the same render looks correct on disk and
19
+ washed out in the inventory. The workaround is to power-curve the pixels before import (^3.0
20
+ is the example given) rather than multiplying the image down, which would kill the speculars."
21
+ - id: cp2077.ui.hud-icon-stroke-width
22
+ claim: HUD icons are freestyle line art at native resolution with thin strokes (~1.15px);
23
+ supersampling+downscale causes thin strokes to merge into blobs. Author at target resolution
24
+ with native pixel dimensions.
25
+ status: verified
26
+ verified_on: "2.31"
27
+ source: ModWright field verification
28
+ tags:
29
+ - hud-icon
30
+ - line-art
31
+ - stroke
32
+ - resolution
33
+ - supersampling
34
+ detail: Vanilla style is white lines on transparency with the muzzle pointing right; the widget
35
+ applies the tint (per a comment in the mod's tweak yaml). Rendering large and downscaling
36
+ merged the lines, so the art is rendered at the final size.
37
+ - id: cp2077.ui.icon-atlas-texture-resolution
38
+ claim: Icon atlases have a declared textureResolution enum (HD_1280_720, FullHD_1920_1080,
39
+ UltraHD_3840_2160); displayed icon size is calculated as uv fraction × textureResolution in
40
+ pixels.
41
+ status: verified
42
+ verified_on: "2.31"
43
+ source: ModWright field verification
44
+ tags:
45
+ - atlas
46
+ - texture-resolution
47
+ - enum
48
+ - icon-size
49
+ - uv
50
+ detail: Enum spellings corrected — they are HD_1280_720, FullHD_1920_1080 and UltraHD_3840_2160, not
51
+ lowercase-hyphenated. One weapon mod's icons.inkatlas declares HD_1280_720 and its part spans
52
+ 0.2656..0.7344 x 0.3555..0.6445, i.e. 600x208 effective pixels.
53
+ - id: cp2077.ui.icon-atlas-part-declaration
54
+ claim: An icon atlas declaration (atlasResourcePath + atlasPartName) references an .inkatlas file
55
+ and a named part within it; the part definition includes uv bounds and controls the displayed
56
+ icon crop and size.
57
+ status: inferred
58
+ source: ModWright research
59
+ tags:
60
+ - atlas
61
+ - atlas-part-name
62
+ - atlas-resource-path
63
+ - uv
64
+ - part
65
+ detail: UIIcon.<ModWeapon>Icon sets $type UIIcon, atlasResourcePath mod\<modname>\icons.inkatlas and
66
+ atlasPartName <mod>_icon. Field and record names corrected from the lowercase forms
67
+ ("uiicon.", "atlasresourcepath") used earlier in this file. That the part's uv bounds control
68
+ the crop follows from the size formula in cp2077.ui.icon-atlas-texture-resolution rather than
69
+ from a direct statement.
70
+ - id: cp2077.ui.hud-icon-record
71
+ claim: HUD icons for weapons are registered via a separate UIIcon record with the same structure as
72
+ inventory icons; weapons can have both inventory and HUD icons declared separately.
73
+ status: verified
74
+ verified_on: "2.31"
75
+ source: ModWright field verification
76
+ tags:
77
+ - hud-icon
78
+ - weapon
79
+ - uiicon
80
+ - record
81
+ detail: "UIIcon.<ModWeapon>HudIcon (atlasResourcePath mod\\<modname>\\hud_icons.inkatlas,
82
+ atlasPartName <mod>_hud) is a second record; Items.Preset_<ModWeapon> references it as
83
+ `hudIcon: UIIcon.<ModWeapon>HudIcon` while the inventory icon goes in `iconPath:
84
+ <ModWeapon>Icon`."
85
+ - id: cp2077.ui.icon-path-record-name
86
+ claim: A weapon's iconPath field takes a tweakdb UIIcon record name (e.g., <ModWeapon>Icon), not a
87
+ path string; the tweakdb record contains the atlas reference.
88
+ status: verified
89
+ verified_on: "2.31"
90
+ source: ModWright field verification
91
+ tags:
92
+ - icon-path
93
+ - record-name
94
+ - tweakdb
95
+ - uiicon
96
+ detail: iconPath carries the bare record name with no "UIIcon." prefix, while hudIcon carries the
97
+ fully qualified UIIcon.<ModWeapon>HudIcon — the two fields are written differently in the same
98
+ working record.
99
+ - id: cp2077.ui.inkatlas-file-format
100
+ claim: Icon atlases are .inkatlas files (binary cr2w format) containing texture atlas definitions
101
+ with part uv mappings; they are generated from asset build tools or created via wolvenkit.
102
+ status: inferred
103
+ source: ModWright research
104
+ tags:
105
+ - inkatlas
106
+ - atlas
107
+ - file-format
108
+ - binary
109
+ detail: A build script authors the atlas json, which is then deserialized to the binary .inkatlas
110
+ like every other CR2W asset in the mod. The schema itself is not documented in the sources.
111
+ - id: cp2077.ui.xbm-file-format
112
+ claim: Icon images are stored as .xbm files (binary texture format); png images must be imported via
113
+ wolvenkit cli to convert to .xbm, applying gamma lift in the process.
114
+ status: verified
115
+ verified_on: "2.31"
116
+ source: ModWright field verification
117
+ tags:
118
+ - xbm
119
+ - texture
120
+ - import
121
+ - png
122
+ - gamma
123
+ detail: Shipped files are mod\<modname>\icons\<mod>_icon.xbm and <mod>_hud.xbm. The gamma lift is a
124
+ property of the png->xbm import step, which is why the render is authored dark.
125
+ - id: cp2077.ui.inventory-icon-size-recommendation
126
+ claim: Inventory icons should be sized to display clearly at ~600×208 effective pixels (the typical
127
+ in-game icon display size); larger assets are downscaled and smaller ones appear pixelated.
128
+ status: inferred
129
+ source: ModWright research
130
+ tags:
131
+ - inventory-icon
132
+ - size
133
+ - display
134
+ - pixels
135
+ detail: "600x208 is what one weapon mod's atlas part works out to under the displayed-size formula
136
+ (uv fraction x textureResolution), not a game-wide standard: change the declared
137
+ textureResolution or the part's uv bounds and the effective size changes. The
138
+ downscaling/pixelation consequences are not recorded in any source."
139
+ - id: cp2077.ui.icon-atlas-rendering-pipeline
140
+ claim: "Icon creation pipeline: render source image → apply gamma correction (power curve) → export
141
+ png → wolvenkit cli import to xbm → build the atlas with a script → register part in UIIcon
142
+ tweakdb record → reference in weapon."
143
+ status: inferred
144
+ source: ModWright research
145
+ tags:
146
+ - icon
147
+ - pipeline
148
+ - rendering
149
+ - atlas
150
+ - tweakdb
151
+ detail: A render script (moody top-lit pass + gamma curve) makes the inventory icon and a Freestyle
152
+ line-art pass makes the HUD icon. The end of the chain is UIIcon.<ModWeapon>Icon /
153
+ UIIcon.<ModWeapon>HudIcon referenced from Items.Preset_<ModWeapon>. No single source states
154
+ this pipeline end to end, hence inferred.
155
+ - id: cp2077.ui.icons.quickhack-program-icon-part-size
156
+ claim: "Every vanilla quickhack program icon is an atlas part displayed at 188 x 136 px: in
157
+ base\\gameplay\\gui\\common\\icons\\items\\item_icons21.inkatlas (textureResolution
158
+ UltraHD_3840_2160) each quickhack_* part spans UV 0.0489 x 0.0627. A custom program icon
159
+ should span the same box (its texels portrait, as vanilla's: see the detail); a part covering
160
+ a whole texture at a large declared resolution displays enormous."
161
+ status: verified
162
+ verified_on: "2.31"
163
+ source: base\gameplay\gui\common\icons\items\item_icons21.inkatlas
164
+ (archive\pc\content\basegame_4_gamedata.archive); UIIcon.quickhack_optics_malfunction and
165
+ UIIcon.quickhack_cw_malfunction name item_icons21 / item_icons19
166
+ tags:
167
+ - icon
168
+ - quickhack
169
+ - program
170
+ - inkatlas
171
+ - size
172
+ related:
173
+ - cp2077.ui.icon-atlas-texture-resolution
174
+ - cp2077.ui.icons.a-part-keeps-its-texel-proportions
175
+ detail: "The 188 x 136 is UV x the declared resolution, the box the part is fitted into. In texels
176
+ the parts are portrait: item_icons21.xbm is 2024 x 2040, so each quickhack_* part is 99 x 128
177
+ texels (w/h 0.773); see cp2077.ui.icons.a-part-keeps-its-texel-proportions. A quickhack mod's
178
+ icon since 2026-09-28: a 1024x1024 texture declared HD_1280_720 with a 150x194-texel part
179
+ (texel shape 0.773, UV x resolution 187.5 x 136.4), the art laid out unsquashed on the part's
180
+ own proportions."
181
+ - id: cp2077.ui.icons.wolvenkit-import-keep-onto-a-base-xbm
182
+ claim: "A PNG becomes an .xbm with the settings of an existing one by WolvenKit CLI `import <raw
183
+ dir> -o <out dir> -k`: the raw dir holds the png at the depot path, the out dir a copy of the
184
+ base xbm renamed to match. The result takes the png's pixels and size (a 1024x1024 base gave
185
+ 256x256 and later 1024x1024 xbms) and keeps the base's setup. The CLI exits 3 and prints \"No
186
+ buffers found to rebuild\" while also printing \"Imported 1/1 file(s)\": the import did
187
+ happen."
188
+ status: verified
189
+ verified_on: 2.31 (WolvenKit CLI 8.20.0)
190
+ source: ModWright field verification
191
+ tags:
192
+ - wolvenkit
193
+ - import
194
+ - xbm
195
+ - texture
196
+ - icon
197
+ - id: cp2077.ui.icons.xbm-format-comes-from-the-setup
198
+ claim: "An .xbm's pixel format is not stored in its blob header (rendRenderTextureBlobHeader holds
199
+ only size, mip and slice layout); it follows from the setup's rawFormat, compression and
200
+ isGamma. So isGamma can be flipped in the serialized JSON and deserialized without touching
201
+ the pixels: the same 8-bit data is read as sRGB (1) or linear (0)."
202
+ status: verified
203
+ verified_on: 2.31 (WolvenKit CLI 8.20.0)
204
+ source: ModWright field verification
205
+ tags:
206
+ - xbm
207
+ - texture
208
+ - gamma
209
+ - format
210
+ - id: cp2077.ui.icons.lift-may-be-isgamma-0
211
+ claim: "The gamma lift of cp2077.ui.icon-import-gamma-lift is likely the xbm's isGamma 0: a weapon
212
+ mod's icon xbm, whose render looked lifted in game, has isGamma 0 (the png's sRGB pixels read
213
+ as linear). A quickhack mod's program icon, imported undarkened with isGamma 1, matches the
214
+ vanilla program chips' brightness in the cyberdeck. That isGamma 0 caused the weapon icon's
215
+ lift is inferred (not re-imported to compare)."
216
+ status: verified
217
+ verified_on: "2.31"
218
+ source: ModWright field verification
219
+ tags:
220
+ - icon
221
+ - gamma
222
+ - xbm
223
+ - isgamma
224
+ related:
225
+ - cp2077.ui.icon-import-gamma-lift
226
+ - cp2077.ui.icons.xbm-format-comes-from-the-setup
227
+ - id: cp2077.ui.icons.a-part-keeps-its-texel-proportions
228
+ claim: "The cyberdeck's program tile draws an atlas part in its texel proportions, scaled to fit,
229
+ and the vanilla program parts are portrait in texels: item_icons21.xbm is 2024 x 2040 (not its
230
+ declared UltraHD_3840_2160), so a quickhack_* part (UV 0.048913 x 0.062745) is 99 x 128
231
+ texels, w/h 0.773. A custom program icon should match that texel shape. A 188x136-texel part
232
+ (texture size equal to its declared HD_1280_720) showed squat, \"square\" beside the vanilla
233
+ chips; a 150x193-texel part showed stretched tall only because its art had been squeezed from
234
+ a 188:136 canvas into it."
235
+ status: verified
236
+ verified_on: "2.31"
237
+ source: ModWright field verification
238
+ tags:
239
+ - icon
240
+ - inkatlas
241
+ - aspect
242
+ - texel
243
+ - program
244
+ related:
245
+ - cp2077.ui.icon-atlas-texture-resolution
246
+ - cp2077.ui.icons.quickhack-program-icon-part-size
247
+ - id: cp2077.ui.icons.program-tooltip-bullets
248
+ claim: "A quickhack program's tooltip bullets are its localizedDescription (the first) and one per
249
+ OnAttach GameplayLogicPackage's UIData.localizedDescription: Items.BlindLvl1Program's second
250
+ bullet (\"Extends the base effect's duration\") is EquipmentGLP.BlindLvl1Program's UIData.
251
+ Vanilla lines are short and do not list the targets that are immune."
252
+ status: inferred
253
+ verified_on: "2.31"
254
+ source: ModWright research
255
+ tags:
256
+ - quickhack
257
+ - tooltip
258
+ - localization
259
+ - uidata