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,176 @@
1
+ game: cyberpunk2077
2
+ topic: anims.sets
3
+ title: Player FPP animation sets, mounting and gating
4
+ facts:
5
+ - id: cp2077.anims.sets.vars-are-animwrapper-weights
6
+ claim: The variableNames that gate an animAnimSetupEntry on the player entity are AnimWrapper
7
+ weights, not booleans or TweakDB flags. Raise one from script with
8
+ AnimationControllerComponent.SetAnimWrapperWeight(ent, n"<name>", 1.0) or by sending an
9
+ AnimWrapperWeightSetter event. Custom variable names can be invented; they do not have to
10
+ exist in vanilla.
11
+ status: verified
12
+ source: ModWright field verification
13
+ tags:
14
+ - animation
15
+ - animwrapper
16
+ - anim-set
17
+ - gating
18
+ - player
19
+ - fpp
20
+ - id: cp2077.anims.sets.lower-priority-number-wins
21
+ claim: Between two mounted animation sets, the LOWER priority number wins (pwa_katana at 128 beats
22
+ default_melee_weapon at 200). Sets override each other by shared animation NAMES, not by slot
23
+ or by file.
24
+ status: verified
25
+ source: ModWright field verification
26
+ tags:
27
+ - animation
28
+ - anim-set
29
+ - priority
30
+ - override
31
+ detail: pwa_katana shares 83 of 97 animation names with default_melee_weapon, which is why mounting
32
+ it replaces most of the melee moveset.
33
+ - id: cp2077.anims.sets.patch-the-ep1-player-ent
34
+ claim: With Phantom Liberty installed the game loads
35
+ ep1\characters\entities\player\player_ma/wa_fpp_ep1.ent. The base\ entity is only the no-EP1
36
+ fallback. A patch aimed only at base\ registers successfully and then silently does nothing,
37
+ with NO log line. List BOTH paths so the mod works with and without PL.
38
+ status: verified
39
+ source: ModWright field verification
40
+ tags:
41
+ - ep1
42
+ - phantom-liberty
43
+ - player-entity
44
+ - silent-failure
45
+ - archivexl
46
+ - patch
47
+ supersedes: cp2077.anims.archivexl.resourcepatch-header-issue-retracted
48
+ detail: "Cost a long debug session and two nearly-filed ArchiveXL bug reports - the no-op looks
49
+ exactly like a broken tool. The ep1 template is a standalone 124-component copy, not an
50
+ include. GENERALISES: before blaming a tool for a silent no-op on a vanilla asset, grep
51
+ tools\\redmod\\tweaks for an [ EP1 ] override of that asset. MERGED from two equivalent facts
52
+ (one in the ArchiveXL topic, one in the packaging topic). What they add: the wrong diagnosis
53
+ this replaced was an ArchiveXL bug report claiming ResourcePatch component patches silently
54
+ skip base-game-cooked templates because of an early return when compiledDataHeader.IsEmpty() —
55
+ that draft issue was RETRACTED once the ep1 mistargeting was found
56
+ (cp2077.anims.archivexl.resourcepatch-header-issue-retracted), and no such issue was filed
57
+ upstream. The rule for a manifest is therefore to list BOTH the base\\ and ep1\\ template
58
+ paths for BOTH genders in the same `resource: patch:` block, which is what the shipped .xl
59
+ does, so the mod works with and without Phantom Liberty."
60
+ - id: cp2077.anims.sets.do-not-hot-reload
61
+ claim: .anims content does NOT hot-reload, and swapping an archive underneath a mounted animation
62
+ set CRASHES the game. Animation sets are cached when the set mounts, so a depot swap never
63
+ reaches them. Budget a full relaunch per animation iteration.
64
+ status: verified
65
+ source: ModWright field verification
66
+ tags:
67
+ - animation
68
+ - hot-reload
69
+ - crash
70
+ - redhottools
71
+ - iteration
72
+ detail: A same-name repack with a different donor set was dropped into archive\pc\hot. RedHotTools
73
+ ingested it, the idle stayed on the OLD clips, and forcing a re-resolve by switching weapons
74
+ killed the process. Meshes and textures hot-reload fine; this is specific to anims.
75
+ - id: cp2077.anims.sets.resourcepatch-mounting-route
76
+ claim: An animation set can be mounted by appending a small entAnimationSetupExtensionComponent
77
+ (controlBinding to root) to the player fpp entities via ArchiveXL ResourcePatch.
78
+ MergeComponents matches on name plus id, and no match means append. The .ent carries its own
79
+ variableNames, so gating works with no ArchiveXL fix required.
80
+ status: verified
81
+ verified_on: 1.27.1
82
+ source: ModWright field verification
83
+ tags:
84
+ - archivexl
85
+ - resourcepatch
86
+ - animation
87
+ - anim-set
88
+ - player-entity
89
+ detail: "MERGED from an equivalent fact, which records this as the SHIPPING route on stock ArchiveXL
90
+ 1.27.1 with no upstream fix required: the set at mod\\<mod>\\anims\\p[mw]a_<mod>.anims,
91
+ priority 127, gated on w_melee_<mod>, mounted when its wrapper variable was raised, and the
92
+ machete's own anim set was confirmed unchanged in the same session — i.e. per-weapon gating
93
+ worked as intended with zero effect on other weapons. The patch targets are the ep1 player fpp
94
+ .ent files plus the base\\ paths as a no-Phantom-Liberty fallback (see
95
+ cp2077.anims.sets.patch-the-ep1-player-ent)."
96
+ - id: cp2077.anims.sets.archivexl-animations-feature-broken
97
+ claim: 'The ArchiveXL "animations:" .xl feature is broken in versions up to and including 1.27.1:
98
+ vars: are dropped, and the list form of entity: never parses. Until a fix ships, do not use
99
+ "animations:" to mount a weapon-specific set - the dropped vars mount it on every melee
100
+ weapon.'
101
+ status: verified
102
+ verified_on: 1.27.1
103
+ source: ModWright field verification
104
+ tags:
105
+ - archivexl
106
+ - animation
107
+ - anim-set
108
+ - bug
109
+ - upstream
110
+ detail: "The two typos are recorded at mechanism level, one fact each, at
111
+ cp2077.anims.archivexl.animconfig-vars-parser-bug (line 82 tests the SEQUENCE node instead of
112
+ the item, so entry.variables stays empty) and
113
+ cp2077.anims.archivexl.animconfig-entity-list-parser-bug (line 50's `else if` repeats the
114
+ `if`'s IsScalar() test instead of IsSequence(), so the list form of `entity:` never parses and
115
+ the entry is rejected as malformed). Both are present in v1.27.0, v1.27.1 and v1.28.0-beta.1,
116
+ and each fix is one line. MERGED from a third, packaging-side restatement, which adds the
117
+ standing manifest rule this produced: the shipped mod's .archive.xl carries a comment telling
118
+ future editors NOT to switch the mount to the `animations:` feature and to keep the `resource:
119
+ patch:` route, because the .ent's own variableNames field is not subject to the parser bug
120
+ (see cp2077.anims.sets.resourcepatch-mounting-route). Update 2026-09-07: fixed upstream in
121
+ ArchiveXL v1.27.3 (see cp2077.anims.archivexl.pr-merged-upstream); the claim holds for 1.27.1
122
+ and earlier and for 1.28.0-beta.1, which predates the fix."
123
+ - id: cp2077.anims.sets.melee-motion-database-csv
124
+ claim: Melee clip names are NOT composed by an index switch in the animgraph. They come from a
125
+ motion database CSV, base\animations\anim_motion_database\player_melee_attacks.csv (plus _hits
126
+ and _deflects), keyed by (MeleeSlotData.attackType, MeleeSlotData.comboNumber). Row (0,N)
127
+ resolves to combo_attack_0(N+1), (1,N) to heavy_attack_0(N+1), (2,N) to final_attack_0(N+1),
128
+ nine slots per class.
129
+ status: inferred
130
+ source: ModWright research
131
+ tags:
132
+ - animation
133
+ - melee
134
+ - motion-database
135
+ - csv
136
+ - attack
137
+ detail: "The attackType table has 13 rows: 0 __COMBO__, 1 __STRONG__, 2 __FINAL__, 3 __BLOCK__, 4
138
+ __SAFE__, 5 __SLIDE__, 6 __CROUCH__, 7 __JUMP__, 8 __SPRINT__, 9 __FALL__, 10 __THROW__, 11
139
+ __DODGE__, 12 __EQUIP__ (rows 3-12 take comboNumber \"*\"). A custom set that omits a row
140
+ plays ANOTHER WEAPON'S clip rather than failing. Note parried_*, block_deflect_* and
141
+ melee_slide_* are NOT in this table at all - they are animgraph-driven, so grepping the CSV
142
+ does not prove a clip is dead. MERGED from an equivalent fact, which adds: each of the three
143
+ CSVs (player_melee_attacks.csv and its _hits / _deflects siblings) carries 50 rows; the
144
+ __STRONG__ row also maps melee_hack_attack, mantisblade_special_heavy and
145
+ one_punch_heavy_attack; and the \"clip names come from the CSV, not from an index switch in
146
+ the animgraph\" finding was established by TWO independent reachability walks of the
147
+ serialized live Attack pose graph, which refuted an earlier reading of a dead legacy subtree
148
+ (see cp2077.anims.graph.real-swing-ceiling-is-nine-slot-csv)."
149
+ - id: cp2077.anims.sets.weapon-family-set-is-the-fallback
150
+ claim: A clip name that a custom animation set omits falls through to the WEAPON-FAMILY set first,
151
+ not straight to the ungated default. The machete plays pwa_one_handed_blunt.anims at priority
152
+ 128, gated on the AnimWrapper variable w_melee_one_hand_blunt, which is the weapon record's
153
+ friendlyName. default_melee_weapon.anims is only the ungated priority-200 fallback.
154
+ status: inferred
155
+ source: ModWright research
156
+ tags:
157
+ - animation
158
+ - anim-set
159
+ - fallback
160
+ - priority
161
+ - melee
162
+ - friendlyname
163
+ supersedes: cp2077.anims.graph.anim-set-gating-variable-is-native-old-belief
164
+ detail: "There is no pwa_machete.anims. Established by reading scripts and records offline rather
165
+ than by an in-engine experiment. MERGED from an equivalent fact, which adds the MECHANISM and
166
+ its moddability: the gating AnimWrapper variable IS the weapon record's own friendlyName
167
+ string field, raised natively via SetAnimWrapperWeight(puppet,
168
+ StringToName(itemRecord.FriendlyName()), value) at inGameMenuGameController.script:637 — so it
169
+ is fully moddable by setting friendlyName on a custom item record in yaml, with no native
170
+ change needed. Confirmed on base_katana.tweak:15, base_knife.tweak:7, base_baton.tweak:9,
171
+ base_two_hand_hammer.tweak:13 and five one-hand-blunt-family bases (all at
172
+ w_melee_one_hand_blunt). This supersedes an earlier project hypothesis that the variable was
173
+ native C++ behaviour with no data lever. See
174
+ cp2077.anims.graph.machete-plays-one-handed-blunt-set for the depot survey ruling out a
175
+ per-weapon machete file, and cp2077.anims.graph.custom-set-mount-priority-competitor for what
176
+ inheriting a base preset's friendlyName costs a custom weapon."
@@ -0,0 +1,149 @@
1
+ game: cyberpunk2077
2
+ topic: archivexl.bodytypes
3
+ title: ArchiveXL body-type tag registration for body mods and refits
4
+ facts:
5
+ - id: cp2077.archivexl.bodytypes.player-bodytypes-key
6
+ claim: "A body mod registers itself with ArchiveXL by putting a `player` top-level key in a `.xl`
7
+ manifest with a `bodyTypes` list of one or more tag names, e.g. `player: { bodyTypes: [
8
+ MyBodyName ] }`; this registration method requires ArchiveXL >= 1.14 (an older, more tedious
9
+ per-appearance method also still works and is documented separately)."
10
+ status: community
11
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
12
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
13
+ sections "Body modders: Adding support" and "1. Registering the body mod"'
14
+ tags:
15
+ - archivexl
16
+ - manifest
17
+ - player
18
+ - bodytypes
19
+ - body-mod
20
+ detail: The page's minimum-required-ArchiveXL-version banner for the page as a whole is 1.5, but the
21
+ `player.bodyTypes` shortcut specifically is called out as "the new method (for version >=
22
+ 1.14)"; a scaffold targeting the shortcut key should gate on 1.14, not the page's overall 1.5
23
+ floor.
24
+ related:
25
+ - id: cp2077.clothing.refits.body-mod-version-floor
26
+ detail: 'Agrees, and is the same page read for its version banner alone: that fact records the 1.5
27
+ floor and the ">= 1.14" new-method note; this one records what the new method actually is
28
+ (the `player.bodyTypes` manifest key). Neither number is a game version.'
29
+ - id: cp2077.archivexl.bodytypes.tag-name-becomes-snake-case-substitution
30
+ claim: A body tag registered via `player.bodyTypes` (e.g. `BoobsForBackProblems`) is converted to
31
+ snake_case (`boobs_for_back_problems`) to become the `{body}` substitution value usable in
32
+ dynamic-appearance conditions and path substitutions; if no body mod is installed, `{body}`
33
+ resolves to the literal string `base_body`.
34
+ status: community
35
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
36
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
37
+ section "1. Registering the body mod" (yaml comment) and "Clothing mods: Making use of the
38
+ tags" (`base_body` fallback warning)'
39
+ tags:
40
+ - archivexl
41
+ - body-tag
42
+ - snake_case
43
+ - substitution
44
+ - base_body
45
+ detail: "`base_body` is also the value clothing mods should target for body mods that keep the
46
+ vanilla body shape (the page names EVB and VTK Vanilla HD FemV as examples of vanilla-shaped
47
+ bodies that use `base_body` rather than registering their own tag)."
48
+ - id: cp2077.archivexl.bodytypes.registration-needs-patched-mesh-component-name
49
+ claim: "Registering a body tag also requires patching the player entity: a patch `.ent` containing
50
+ an `entMeshComponent` whose `name` is changed to `Body:<BodyModName>` (e.g. `Body:NewBody`)
51
+ must be registered against the vanilla player entity files via ArchiveXL resource patching
52
+ (`resource.patch`), separately per body gender (`player_wa.ent` / `player_ma.ent` — only the
53
+ relevant gender needs including)."
54
+ status: community
55
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
56
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
57
+ sections "2. Patch the player entity files" and "Register the patch .ent"
58
+ tags:
59
+ - archivexl
60
+ - body-tag
61
+ - resource-patch
62
+ - entmeshcomponent
63
+ detail: "RELATED: this is a concrete worked use of cp2077.archivexl.manifest.resource-patch-key
64
+ against the base game's player entity specifically, not an arbitrary mod-owned resource."
65
+ - id: cp2077.archivexl.bodytypes.check-current-body-via-cet
66
+ claim: The currently active body-tag suffix for the local player can be read from CET with
67
+ `Game.GetScriptableSystemsContainer():Get("PuppetStateSystem"):GetBodyTypeSuffix(ItemID.new(),
68
+ GetPlayer(), nil)`; the same `PuppetStateSystem` also exposes `GetArmsStateSuffix` and
69
+ `GetFeetStateSuffix` for the arm-cyberware and foot-state substitutions.
70
+ status: community
71
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
72
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
73
+ section "Checking the current body"; and archivexl-suffixes-and-substitutions.md, sections
74
+ "Arm states" and "Foot states"
75
+ tags:
76
+ - archivexl
77
+ - cet
78
+ - puppetstatesystem
79
+ - debugging
80
+ - body
81
+ - arms
82
+ - feet
83
+ - id: cp2077.archivexl.bodytypes.arm-state-table-is-source-checked
84
+ claim: The documented arm-cyberware substitution values (`base_arms`, `mantis_blades`, `monowire`,
85
+ `projectile_launcher`) and foot-state values (`flat`, `lifted`, `high_heels`, `flat_shoes`)
86
+ both carry an explicit note to re-check them against
87
+ `src/App/Extensions/PuppetState/System.cpp` in psiberx/cp2077-archive-xl if they stop working,
88
+ because the wiki table is not guaranteed to track the source.
89
+ status: community
90
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
91
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
92
+ sections "Arm states" (link to src/App/Extensions/PuppetState/System.cpp#L72) and "Foot
93
+ states" (same file #L89), both pinned at psiberx/cp2077-archive-xl commit
94
+ 027aab7139689ee8d14163682ab6d506fbccea2a'
95
+ tags:
96
+ - archivexl
97
+ - arms
98
+ - feet
99
+ - source-of-truth
100
+ - staleness
101
+ - id: cp2077.archivexl.bodytypes.male-feet-states-need-a-mod
102
+ claim: Foot-state substitution (flat/lifted/high-heels) is only implemented for the female-rigged
103
+ body by default; male-rigged V has no vanilla foot-state support and needs a body mod or the
104
+ "Toggleable Feet" mod to get one — for male V the foot-state suffix/substitution is documented
105
+ as simply empty.
106
+ status: community
107
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
108
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
109
+ section "Foot states" (warning hint and table row "Male / Any / (empty)")
110
+ tags:
111
+ - archivexl
112
+ - feet
113
+ - male
114
+ - gender
115
+ - gap
116
+ - id: cp2077.archivexl.bodytypes.body-support-tag-only-needed-for-nonstandard-shape
117
+ claim: A body mod only needs to register its own ArchiveXL body tag if its mesh shape differs from
118
+ the base game body; a body mod that keeps the vanilla proportions does not need to register a
119
+ tag and clothing should target it as `base_body`.
120
+ status: community
121
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
122
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
123
+ hint under "Body modders: Adding support" ("If your body mod has the same shape as the
124
+ basegame body, you do not need to do this.")'
125
+ tags:
126
+ - archivexl
127
+ - body-tag
128
+ - base_body
129
+ - when-not-needed
130
+ - id: cp2077.archivexl.bodytypes.resource-patch-entry-needs-at-least-one-target
131
+ claim: 'An ArchiveXL manifest resource.patch entry whose target list is empty is rejected at
132
+ extension load: ArchiveXL logs "[error] Line #N: Patch definition must have at least one
133
+ target." for each such entry and then "[warning] Archive extensions are loaded with issues.",
134
+ and the patch .ent attaches to nothing. The rest of the manifest (player bodyTypes,
135
+ localization, factories) still loads.'
136
+ status: verified
137
+ verified_on: "2.31"
138
+ source: ModWright field verification
139
+ tags:
140
+ - archivexl
141
+ - resource-patch
142
+ - manifest
143
+ - body-tag
144
+ - scaffold
145
+ - lint
146
+ detail: The new-garment-refit scaffold emitted the empty lists until this run; it now names the base
147
+ + ep1 player FPP entity per gender, and cp2077.history.xl-manifest-lint warns on an empty
148
+ target list. Which player entities a body-mesh patch must target for third-person visibility
149
+ (player_XX_tpp.ent exists in the vanilla index) is not yet observed.
@@ -0,0 +1,218 @@
1
+ game: cyberpunk2077
2
+ topic: archivexl.dynamic-appearances
3
+ title: ArchiveXL dynamic appearances — conditions, substitutions and their placeholders
4
+ facts:
5
+ - id: cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0
6
+ claim: ArchiveXL's dynamic appearances feature (rule-based selection of components and appearances,
7
+ replacing hand-multiplied suffix combinations) was introduced in ArchiveXL version 1.5.0.
8
+ status: verified
9
+ source: psiberx/cp2077-archive-xl@7988eb5, `git ls-tree v1.4.1` vs `v1.5.0`
10
+ (src/App/Extensions/GarmentOverride/Dynamic.{cpp,hpp} first appear at v1.5.0, defining
11
+ DynamicAppearanceTag, VariantMarker '!', ConditionMarker '&', DynamicValueMarker '*' and the
12
+ gender/camera/body/feet attributes); CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
13
+ for-mod-creators-theory/core-mods-explained/archivexl/README.md, section "Dynamic appearances"
14
+ ("Version 1.5.0 of ArchiveXL solves this problem by introducing dynamic variants")
15
+ tags:
16
+ - archivexl
17
+ - dynamic-appearances
18
+ - version-floor
19
+ detail: "Checked against the source (2026-09-08): this contradicted the existing
20
+ cp2077.clothing.garments.dynamic-appearance-version-floors, which said dynamic variants were
21
+ \"added in 1.13\" on the strength of one sentence in the dynamic-variants guide. The guide's
22
+ own Prerequisites section says ArchiveXL >= 1.5.0, and the repository's tags confirm 1.5.0, so
23
+ that fact is now contradicted and this one supersedes it. No `verified_on`: the source names
24
+ an ArchiveXL version, not a game build."
25
+ - id: cp2077.archivexl.dynamic-appearances.substitutions-since-1.8.0
26
+ claim: Path/name substitutions for dynamic appearances (the `{placeholder}` interpolation syntax)
27
+ were added in ArchiveXL 1.8.0, three minor versions after dynamic appearances themselves
28
+ (1.5.0); conditions and substitutions are documented as two related but separately-versioned
29
+ capabilities.
30
+ status: community
31
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
32
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
33
+ section "Which substitutions exist?" ("Since 1.8.0, ArchiveXL supports substitutions for
34
+ dynamic-appearances")
35
+ tags:
36
+ - archivexl
37
+ - dynamic-appearances
38
+ - substitution
39
+ - version-floor
40
+ detail: "RELATED: sharpens cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0 — a project
41
+ whose ArchiveXL floor is 1.5.x-1.7.x can use conditions but not substitutions."
42
+ - id: cp2077.archivexl.dynamic-appearances.substitution-requires-leading-asterisk
43
+ claim: A field value that should be interpolated as a dynamic-appearance substitution (in a mesh
44
+ entity component's `name`, `depotPath` or `appearance`, or an `.app` appearance's `name`) only
45
+ activates interpolation if the string starts with an asterisk (`*`); without the leading `*`,
46
+ `{placeholder}` text is treated as a literal string.
47
+ status: community
48
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
49
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
50
+ section "Which substitutions exist?"
51
+ tags:
52
+ - archivexl
53
+ - substitution
54
+ - syntax
55
+ - gotcha
56
+ detail: A validator that greps for `{gender}`/`{body}`/etc. in a resource field should also check
57
+ the field starts with `*`, since a substitution-looking string without the prefix silently
58
+ does not substitute.
59
+ - id: cp2077.archivexl.dynamic-appearances.placeholder-table
60
+ claim: "The page's placeholder table lists eight substitutions: `{camera}` (`fpp`/`tpp`), `{gender}`
61
+ (`m`/`w`), `{body}` (`base_body` or the registered body-mod tag in snake_case), `{arms}`
62
+ (`base_arms`, `mantis_blades`, `monowire`, `projectile_launcher`), `{feet}` (`flat`, `lifted`,
63
+ `high_heels`, `flat_shoes`, empty for male-rigged V), `{sleeves}` (`full`, `part`),
64
+ `{skin_color}` (the skin-tone appearance name from customization, e.g. `03_senna`) and
65
+ `{hair_color}` (the hair-colour name, e.g. `black_liquorice`)."
66
+ status: community
67
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
68
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
69
+ section "Which substitutions exist?" (placeholder table)
70
+ tags:
71
+ - archivexl
72
+ - substitution
73
+ - placeholder
74
+ - gender
75
+ - body
76
+ - arms
77
+ - feet
78
+ detail: "The page warns this table can go stale and points to the source of truth:
79
+ `src/App/Extensions/GarmentOverride/Dynamic.cpp#L29` in psiberx/cp2077-archive-xl (not re-read
80
+ line-by-line for this fact — only the wiki table was transcribed). Checked against the source
81
+ (2026-09-08): an earlier wording listed only the first five placeholders as though the table
82
+ were complete; `{sleeves}`, `{skin_color}` and `{hair_color}` are in the same table and have
83
+ been added."
84
+ - id: cp2077.archivexl.dynamic-appearances.unresolvable-placeholder-falls-back
85
+ claim: If a `@context`-defined substitution placeholder cannot be resolved for a given mesh (e.g. a
86
+ custom `GlobalNormal` parameter defined on one patched mesh but not on another), ArchiveXL
87
+ ignores the unresolved placeholder and falls back to the base material's own value for that
88
+ parameter, rather than failing to load.
89
+ status: community
90
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
91
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-resource-patching/README.md,
92
+ section "Partial templates: @Context"'
93
+ tags:
94
+ - archivexl
95
+ - substitution
96
+ - fallback
97
+ - failure-mode
98
+ - id: cp2077.archivexl.dynamic-appearances.appearance-conditions-two-locations
99
+ claim: "Dynamic-appearance conditions (e.g. `&camera=fpp`, `&gender=w`) can be written in exactly
100
+ two places: the `name` field of an `appearanceAppearanceDefinition` inside a `.app` file, and
101
+ the `name` field of a component inside a `mesh_entity.ent` file; using gendered per-component
102
+ conditions in the mesh entity is called out as generally worse practice than gendered whole
103
+ appearances, because components for the inactive gender are still added to the entity."
104
+ status: community
105
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
106
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
107
+ section "Conditions"
108
+ tags:
109
+ - archivexl
110
+ - condition
111
+ - .app
112
+ - mesh_entity
113
+ - performance
114
+ - id: cp2077.archivexl.dynamic-appearances.appearance-name-truncated-at-variant-separator
115
+ claim: When using dynamic appearances, the `appearanceName` a mod's `.yaml` entry gives is matched
116
+ against the root entity's appearance `name` only up to the first `!` (the "variant
117
+ separator"); everything after `!` is the dynamic-appearance condition/substitution suffix that
118
+ ArchiveXL resolves itself, not part of the name TweakXL's yaml needs to match.
119
+ status: community
120
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
121
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md, hint
122
+ under "root_entity.ent" ("must match the field `appearanceName` in the `.yaml` up to the
123
+ variant separator `!`")
124
+ tags:
125
+ - archivexl
126
+ - dynamic-appearances
127
+ - root-entity
128
+ - appearancename
129
+ detail: "RELATED: the `!` variant separator is a different delimiter from the `&` used for legacy
130
+ suffixes and for dynamic conditions; the suffixes-and-substitutions page's
131
+ substitution-load-order table shows both in one name (`my_item!variant&camera=tpp`), so `!`
132
+ and `&` are not interchangeable spellings of one mechanism. See
133
+ cp2077.archivexl.dynamic-appearances.legacy-suffix-still-first-match for the legacy suffix
134
+ system itself."
135
+ - id: cp2077.archivexl.dynamic-appearances.legacy-suffix-still-first-match
136
+ claim: "Before ArchiveXL 1.5, conditional appearance selection used only suffixes: for N independent
137
+ suffix axes (gender, camera, ...) the root entity needed 2^N appearance entries (one per
138
+ combination); the page's own worked example describes going from 96 suffix-based entries in
139
+ one root entity down to 9 after moving to dynamic appearances."
140
+ status: community
141
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
142
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
143
+ section "Why are suffixes?"
144
+ tags:
145
+ - archivexl
146
+ - suffix
147
+ - legacy
148
+ - root-entity
149
+ - id: cp2077.archivexl.dynamic-appearances.suffix-load-order-most-specific-wins
150
+ claim: "The documented suffix load order for a legacy (pre-1.5, non-dynamic) suffixed appearance
151
+ name is two steps: the base appearance name (with no suffix) first, then \"the most specific
152
+ suffix collection it can find\" — a less specific match that exists is ignored when a more
153
+ specific one also exists (the page's worked example marks the bare name and
154
+ `appearance_&Female` as \"ignored: a better match exists\")."
155
+ status: community
156
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
157
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
158
+ section "Suffix load order" (worked example table)
159
+ tags:
160
+ - archivexl
161
+ - suffix
162
+ - load-order
163
+ - appearance-resolution
164
+ detail: 'Checked against the source (2026-09-08): an earlier wording said the game "searches suffix
165
+ combinations from least to most specific". The page states only which entry wins, not the
166
+ order in which candidates are tried; that search-order detail is removed.'
167
+ - id: cp2077.archivexl.dynamic-appearances.disable-suffixes-empty-array
168
+ claim: "Setting `appearanceSuffixes: []` in a TweakXL yaml item entry is the documented way to
169
+ disable suffixes for that item."
170
+ status: community
171
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
172
+ for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
173
+ section "Disabling Suffixes"
174
+ tags:
175
+ - archivexl
176
+ - suffix
177
+ - appearancesuffixes
178
+ - yaml
179
+ - id: cp2077.archivexl.dynamic-appearances.app-condition-variables-since-1.4.0
180
+ claim: For ArchiveXL >= 1.4.0, an `.app` file's appearance overrides can use the interpolation
181
+ variables `{gender}` (m/w), `{skin_color}` (skin tone appearance name) and `{hair_color}`
182
+ (hair color appearance name) inside the `meshAppearance` field.
183
+ status: community
184
+ source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
185
+ modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
186
+ section "appearance.app" (variable table, citing ArchiveXL release tag v1.4.0-rc2)
187
+ tags:
188
+ - archivexl
189
+ - dynamic-appearances
190
+ - .app
191
+ - meshappearance
192
+ - version-floor
193
+ detail: "RELATED: this predates dynamic appearances proper
194
+ (cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0 puts that at 1.5.0), so
195
+ `meshAppearance` interpolation was available slightly earlier than full condition/substitution
196
+ support."
197
+ - id: cp2077.archivexl.dynamic-appearances.camera-perspective-helpers
198
+ claim: "ArchiveXL 1.27.1 ships two redscript helpers in module ArchiveXL.DynamicAppearance:
199
+ ConvertAppearanceNameToTPP(app) and ConvertAppearanceNameToFPP(app). A plain appearance name
200
+ gets the substring &FPP swapped for &TPP, or back. A dynamic appearance (one with '!') gets
201
+ its 'camera' condition set to tpp or fpp through OverrideDynamicAppearanceCondition. The
202
+ static natives ArchiveXL.DisableGarmentOffsets() and EnableGarmentOffsets() switch the garment
203
+ offsets. A third-person mod (Immersive Third Person 1.3.0) shows V's clothes whole in third
204
+ person this way: it converts each equipped area's current appearance and applies it with
205
+ TransactionSystem.ChangeItemAppearanceByName, with the garment offsets off while in third
206
+ person."
207
+ status: verified
208
+ source: <install>\red4ext\plugins\ArchiveXL\Scripts\ArchiveXL.DynamicAppearance.reds (lines 4-60)
209
+ and ArchiveXL.Global.reds (DisableGarmentOffsets); Immersive Third Person 1.3.0
210
+ r6\scripts\immersive_third_person\tpp_camera_bridge.reds (ApplyArea,
211
+ ApplyGarmentOffsetsForPerspective, ApplyVisibleRenderPerspective)
212
+ tags:
213
+ - archivexl
214
+ - dynamic-appearance
215
+ - camera
216
+ - tpp
217
+ - fpp
218
+ - garment