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,352 @@
1
+ game: cyberpunk2077
2
+ topic: anims.pipeline
3
+ title: Blender to GLB to WolvenKit .anims round trip for custom FPP melee animations
4
+ facts:
5
+ - id: cp2077.anims.pipeline.cli-export-anims-old-belief
6
+ claim: An early project note stated that WolvenKit.CLI cannot export .anims to GLB, making the GLB
7
+ half of the round trip a GUI-only job.
8
+ status: contradicted
9
+ source: ModWright research
10
+ tags:
11
+ - wolvenkit
12
+ - cli
13
+ - export
14
+ - anims
15
+ - glb
16
+ detail: "Superseded the same day: the missing ingredient was the -gp flag, not a real CLI
17
+ limitation. Replaced by cp2077.anims.roundtrip.cli-export-strips-root-motion, which carries
18
+ both the working command form and the root-motion caveat. The GUI-only IMPORT half of the
19
+ round trip is recorded separately at cp2077.anims.roundtrip.import-is-gui-only."
20
+ - id: cp2077.anims.pipeline.glb-export-requires-animations-checkbox
21
+ claim: Exporting an authored action from Blender back to a Cyberpunk GLB requires selecting the
22
+ ARMATURE object in Object Mode and ticking "Animations" (export_poses) in File -> Export ->
23
+ Cyberpunk GLB; without it the exporter takes the mesh path and fails with "No meshes
24
+ selected".
25
+ status: inferred
26
+ source: ModWright research
27
+ tags:
28
+ - blender
29
+ - export
30
+ - glb
31
+ - cyberpunk-io-suite
32
+ - animations
33
+ detail: Leave "Export Float Tracks" ON and any action filter OFF, or only the active action gets
34
+ written to the GLB.
35
+ - id: cp2077.anims.pipeline.cp77-addon-importer-required-for-anims
36
+ claim: A donor .anims GLB must be imported with the Cyberpunk IO Suite's
37
+ `bpy.ops.io_scene_gltf.cp77(scripting=True, import_tracks=True)`, never with Blender's stock
38
+ `bpy.ops.import_scene.gltf`.
39
+ status: verified
40
+ source: ModWright field verification
41
+ tags:
42
+ - blender
43
+ - cp77-addon
44
+ - import
45
+ - anims
46
+ - float-tracks
47
+ - stock-gltf
48
+ detail: A CP2077 animation entry carries 23 float tracks (allowFeetIk, enableLeftFootIk,
49
+ chestSpineStretchFactor, ...) as non-bone fcurves plus 12-14 action custom properties
50
+ (rootMotionType, constTrackKeys, animEvents, optimizationHints, ...). The stock importer drops
51
+ all of this. A block build exported through the stock path teleported the player and made V
52
+ fall through the floor.
53
+ - id: cp2077.anims.pipeline.float-track-carries-model-space-position
54
+ claim: Among a clip's 23 float tracks are modelSpacePositionX/Y/Z, the player's model-space
55
+ position; a clip that loses this track data on import teleports the player.
56
+ status: inferred
57
+ source: ModWright research
58
+ tags:
59
+ - float-track
60
+ - model-space-position
61
+ - teleport
62
+ - stock-gltf
63
+ detail: Discovered while diagnosing the stock-glTF-importer teleport defect above; this is the
64
+ specific mechanism by which a clip missing its non-bone track data moves the player character.
65
+ - id: cp2077.anims.pipeline.cubicspline-import-failure
66
+ claim: Keyframes inserted from a Python script default to BEZIER interpolation, which Blender's glTF
67
+ exporter writes as CUBICSPLINE samplers; WolvenKit's importer rejects those with "The given
68
+ key 'CUBICSPLINE' was not present in the dictionary."
69
+ status: inferred
70
+ source: ModWright research
71
+ tags:
72
+ - blender
73
+ - cubicspline
74
+ - interpolation
75
+ - import-failure
76
+ - keyframe
77
+ detail: "Fix, belt and braces: set `bpy.context.preferences.edit.keyframe_new_interpolation_type =
78
+ 'LINEAR'` before keying, then force every existing key's interpolation to LINEAR after keying.
79
+ A healthy GLB reports only STEP and LINEAR samplers (one verified example: 22696 STEP / 7400
80
+ LINEAR, zero CUBICSPLINE). Vanilla-imported curves are already LINEAR/STEP, which is why an
81
+ untouched round trip imports fine and a freshly-keyed one does not."
82
+ - id: cp2077.anims.pipeline.compare-curves-by-bone-name-not-index
83
+ claim: "Offline verification of a round-tripped .anims file must compare motion curves by BONE NAME,
84
+ never by node index, because the GLB export reorders skeleton node indices (one measured
85
+ example: RightHand moved from index 25 to 47)."
86
+ status: inferred
87
+ source: ModWright research
88
+ tags:
89
+ - glb
90
+ - node-index
91
+ - bone-name
92
+ - verification
93
+ - reorder
94
+ detail: Index-based comparison of the same bone before and after a round trip shows bogus
95
+ ~180-degree deltas that are purely an artifact of the reordering, not a real pose change.
96
+ - id: cp2077.anims.pipeline.roundtrip-baseline-gate
97
+ claim: A clean, unedited .anims round trip through Blender (import via the cp77 addon, export back
98
+ to GLB, WolvenKit reimport) reproduces all 97 entries with identical names, durations and
99
+ animationType, and curve values identical to float rounding (max component delta measured
100
+ 1.4e-4).
101
+ status: inferred
102
+ source: ModWright research
103
+ tags:
104
+ - round-trip
105
+ - baseline
106
+ - gate
107
+ - verification
108
+ - float-rounding
109
+ detail: "Blender bakes denser keys than the source cooked file (source file 515KB -> 726KB after the
110
+ round trip; GLB size drops from 18.8MB to 9.4MB — this is fine). The only structural delta on
111
+ a clean round trip is that the importer adds a `motionExtraction: {HandleRefId: -1}` null
112
+ handle where the original omitted the field; this is harmless."
113
+ - id: cp2077.anims.pipeline.animevents-survive-roundtrip-byte-identical
114
+ claim: animAnimEvent_Phase events (a clip's startup/active/recover segment markers, stored as
115
+ startFrame + durationInFrames in a sibling "events" container next to the clip's ".animation"
116
+ data) survive the Blender GLB round trip byte-identical, even on clips whose keyframes were
117
+ actively rewritten.
118
+ status: inferred
119
+ source: ModWright research
120
+ tags:
121
+ - animevents
122
+ - phase-markers
123
+ - round-trip
124
+ - cp77-addon
125
+ - custom-properties
126
+ detail: "Measured across the whole vanilla katana set: 184 events across 97 entries before, 184
127
+ after, zero changed — including 26 events on 11 clips whose keyframes the block builder
128
+ actually rewrote. The cp77 addon carries these events in Blender action custom properties,
129
+ which is why they survive edits to the bone curves untouched."
130
+ - id: cp2077.anims.pipeline.numframes-off-by-one-defect
131
+ claim: Vanilla .anims entries hold the invariant `numFrames - 1 == duration * 30` (measured on
132
+ 401/401 entries across six vanilla sets); one mod's pipeline instead wrote `duration * 30` for
133
+ numFrames while preserving duration unchanged, producing an off-by-one on 44 of 96 shipped
134
+ entries, including combo_attack_01/02/03.
135
+ status: inferred
136
+ source: ModWright research
137
+ tags:
138
+ - numframes
139
+ - duration
140
+ - off-by-one
141
+ - invariant
142
+ - defect
143
+ detail: Whether the game engine actually reads numFrames directly, or derives the sample count
144
+ purely from duration, is a separate open question — see
145
+ cp2077.anims.graph.numframes-engine-read-question (unverified). The fix applied was to assert
146
+ the invariant in the builder and correct the field regardless of whether the engine cared.
147
+ - id: cp2077.anims.pipeline.serialize-diff-offline-verification-workflow
148
+ claim: The standard offline verification workflow for a rebuilt .anims file is to `convert
149
+ serialize` both the original and the rebuilt file to JSON, diff entry names, durations and
150
+ animationType, then compare motion curves by bone name (never node index).
151
+ status: inferred
152
+ source: ModWright research
153
+ tags:
154
+ - wolvenkit
155
+ - serialize
156
+ - json
157
+ - diff
158
+ - workflow
159
+ detail: This workflow, plus the end-to-end pose re-measurement, replaces a game launch for almost
160
+ every structural or pose question about a rebuilt .anims file.
161
+ - id: cp2077.anims.pipeline.gui-import-reads-project-raw-folder-not-arbitrary-glb
162
+ claim: The WolvenKit GUI's Import action always consumes the project's own raw folder path for the
163
+ resource being imported (e.g. `<Project>\source\raw\mod\<mod>\anims\<set>.anims.glb`), not
164
+ whatever GLB the build tooling last wrote elsewhere; staging a new build requires copying the
165
+ staging GLB over that raw-folder path (MD5-verified) before telling the user to import.
166
+ status: inferred
167
+ source: ModWright research
168
+ tags:
169
+ - wolvenkit
170
+ - gui
171
+ - import
172
+ - raw-folder
173
+ - staging
174
+ - stale-import
175
+ detail: "Caught after a \"no difference\" deploy: the staging GLB was current but the raw-folder
176
+ copy was from that morning, the import \"succeeded\" against the stale copy, and two deploys
177
+ shipped stale content while every downstream check passed (a deploy script's baseline check
178
+ only catches a never-imported GLB, not a stale one). Diagnose this class of failure by
179
+ serializing the imported .anims and checking a field only the new build could have set."
180
+ - id: cp2077.anims.pipeline.numconstankeys-dense-encoding-not-a-defect
181
+ claim: A rebuilt .anims entry that reports `numConstAnimKeys = 0` (every joint stored on every
182
+ frame, dense encoding) after a round trip is not itself a fault as long as the end-to-end pose
183
+ check passes — vanilla `melee_first_equip` ships encoded the same dense way.
184
+ status: inferred
185
+ source: ModWright research
186
+ tags:
187
+ - numconstankeys
188
+ - dense-encoding
189
+ - gate
190
+ - false-positive
191
+ detail: This was initially graded a hard build failure by an overly strict heuristic; it was found
192
+ to be a cosmetic difference in how identical data is packed, not missing data.
193
+ - id: cp2077.anims.pipeline.content-diff-preferred-over-byte-md5
194
+ claim: "Repeated GLB rebuilds from the same content are NOT byte-reproducible: the Blender/cp77
195
+ exporter scrambles channel ORDER run-to-run on some clips (a documented case: exactly the four
196
+ sway additive clips), values remaining bit-identical. Regression gates should diff channels
197
+ matched by bone+path (content diff), never compare whole-file byte MD5."
198
+ status: inferred
199
+ source: ModWright research
200
+ tags:
201
+ - content-diff
202
+ - byte-md5
203
+ - regression-gate
204
+ - channel-order
205
+ - glb-export
206
+ detail: Setting PYTHONHASHSEED=0 does not fix the channel-order nondeterminism. The project's
207
+ `_glb_content_diff.py` tool matches channels by bone name and property path specifically to
208
+ make this gate reliable.
209
+ - id: cp2077.anims.pipeline.wolvenkit-importer-numextrajoints-drops-last-joints
210
+ claim: WolvenKit's animation importer (AnimationTools.cs::PutAnimations) computes `jointsCountActual
211
+ = numJoints - numExtraJoints`, where numExtraJoints is read from the GLB action's
212
+ custom-property "extras" on each animation, and drops that many joints from the end of the rig
213
+ regardless of what the WolvenKit project file itself specifies; a GLB whose extras still carry
214
+ a donor clip's inherited numExtraJoints value (e.g. 1) silently imports one fewer joint than
215
+ it should.
216
+ status: inferred
217
+ source: ModWright research
218
+ tags:
219
+ - wolvenkit
220
+ - importer
221
+ - numextrajoints
222
+ - glb-extras
223
+ - missing-joints
224
+ - victim-anims
225
+ supersedes: cp2077.anims.pipeline.dense-per-frame-baking-imports-more-reliably
226
+ detail: "Found on victim-lift animation clips inheriting a donor's `numExtraJoints: 1` GLB extras
227
+ value: they imported 69/71 rig bones (missing RightHandPinky3 and Root) while a from-scratch
228
+ player-authored GLB with `numExtraJoints: 0` imported all 152/152 clean. Three earlier
229
+ attempted fixes (project-file numExtraJoints, a small Root offset, dense baking alone) never
230
+ touched this GLB-extras field and were therefore byte-for-byte no-ops on the symptom."
231
+ - id: cp2077.anims.pipeline.wolvenkit-importer-rootmotiontype-consumes-root-joint
232
+ claim: WolvenKit's importer (Tools/Animation/AnimRootMotion.cs::ExtractRootMotion), for any
233
+ rootMotionType other than None/Unknown, takes the Root joint's translation/rotation as the
234
+ root-motion source and never writes Root as a regular joint channel; setting an action's
235
+ rootMotionType to "Unknown" makes the importer instead keep the project file's existing
236
+ motionExtraction data verbatim and treat Root as an ordinary joint.
237
+ status: inferred
238
+ source: ModWright research
239
+ tags:
240
+ - wolvenkit
241
+ - importer
242
+ - rootmotiontype
243
+ - root-motion
244
+ - extras
245
+ detail: 'Fix applied in the clip-editing script: set numExtraJoints=0, numExtraTracks=0, and
246
+ rootMotionType="Unknown" on every action before export, and gate the written GLB on both the
247
+ extras values and which bones actually carry channels. All three prepared victim GLBs then
248
+ reported "GLB EXTRAS OK" and imported their full 71/71 joint count.'
249
+ - id: cp2077.anims.pipeline.dense-per-frame-baking-imports-more-reliably
250
+ claim: "A clip where every bone is re-keyed with evaluated values on every single frame (a dense
251
+ bake) imports its full joint count via WolvenKit's raw per-frame path (one measured case:
252
+ 152/152 bones, numConstAnimKeys 0), while sparse or padded curves from a less exhaustive
253
+ keying approach can take an import path that silently drops the rig's first and last joints."
254
+ status: contradicted
255
+ source: ModWright research
256
+ tags:
257
+ - dense-bake
258
+ - per-frame
259
+ - joint-coverage
260
+ - import-reliability
261
+ - dead-belief
262
+ detail: "Kept as the belief held on 2026-09-02 morning. DISPROVEN the same afternoon: \"The
263
+ dense-bake fix did not take either\" — the rebuilt victim clips still imported 69/71 bones
264
+ after a full dense bake, and the source's own summary is that \"the three earlier fixes
265
+ (project-file numExtraJoints, Root 0.1 mm, dense bake) never touched the extras, which is why
266
+ they were byte-for-byte no-ops on the symptom.\" The real cause is the GLB action extras — see
267
+ cp2077.anims.pipeline.wolvenkit-importer-numextrajoints-drops-last-joints. The 152/152
268
+ dense-baked player set is still a true observation; it simply does not explain the victim
269
+ sets, which were also dense-baked and still dropped two joints."
270
+ - id: cp2077.anims.pipeline.attach-frame-90-degree-rotation-correction
271
+ claim: The in-game FPP weapon attachment frame is `game_weapon_world = bone_world @ Rotation(-90
272
+ deg, local X)`; a Blender preview workbench that Child-Of's the weapon mesh to WeaponRight
273
+ with an IDENTITY inverse gets the weapon's POSITION right but its ROTATION 90 degrees wrong.
274
+ status: verified
275
+ source: ModWright field verification
276
+ tags:
277
+ - attachment-frame
278
+ - weaponright
279
+ - child-of
280
+ - rotation
281
+ - workbench
282
+ - probe
283
+ detail: "Confirmed because the identical 90-degree discrepancy appeared on an UNTOUCHED vanilla clip
284
+ (melee_idlepose) too, proving the preview frame was wrong rather than the authored data. Fix:
285
+ set the Child Of inverse to Rotation(-90 deg, X); any weapon-pose write to bones must apply `X
286
+ @ ATTACH^-1` so a desired world matrix X lands as X in game."
287
+ - id: cp2077.anims.pipeline.file-layout-weapon-anim-sets
288
+ claim: Player FPP melee anim sets live under `base\animations\weapon\<weapon>\` as per-gender files
289
+ `pwa_<weapon>.anims` (female) / `pma_<weapon>.anims` (male); all player melee weapon sets
290
+ share the same 152-joint rig, which is what makes cross-weapon donor grafting mechanically
291
+ straightforward.
292
+ status: inferred
293
+ source: ModWright research
294
+ tags:
295
+ - file-layout
296
+ - anim-set
297
+ - pwa
298
+ - pma
299
+ - rig
300
+ - weapon-family
301
+ detail: Motion data is stored as compressed slices in animationDataChunks[i] (base64 in the
302
+ serialized JSON), addressed per entry by animBuffer.dataAddress {unkIndex, fsetInBytes,
303
+ zeInBytes}; WolvenKit also keeps a per-entry tempBuffer copy. `default_melee_weapon.anims`
304
+ (non-prefixed) is a separate, ungated, always-mounted fallback set distinct from any
305
+ per-weapon-family pwa_/pma_ set.
306
+ - id: cp2077.anims.pipeline.entry-naming-convention
307
+ claim: "Entries inside a player melee .anims set follow a fixed naming convention. The CSV motion
308
+ database defines the addressable names: combo_attack_01..09, heavy_attack_01..06 (plus
309
+ melee_hack_attack, mantisblade_special_heavy, one_punch_heavy_attack) and final_attack_01..09.
310
+ Alongside them a set carries block/block_start/block_end/block_attack, add_block_*
311
+ (directional block reactions), block_deflect_left/right, hold_start_01 +
312
+ hold_start_offscreen_01/02, hold_loop_01/02, melee_idlepose/melee_safepose/melee_crouchpose
313
+ and their transitions, melee_equip/melee_first_equip/melee_unequip, the melee_slide_* and
314
+ melee_sprint_* locomotion entries, and the
315
+ slide/crouch/jump/sprint/fall/throw/dodge/equip/safe attack variants — every base attack entry
316
+ paired with `_hit` and `_deflect` suffixed variants."
317
+ status: inferred
318
+ source: ModWright research
319
+ tags:
320
+ - naming-convention
321
+ - entry-names
322
+ - combo-attack
323
+ - heavy-attack
324
+ - final-attack
325
+ detail: "Not every numbered slot has a clip in every set: heavy_attack_03, final_attack_01/02,
326
+ final_attack_06..09 and combo_attack_05..09 are addressable CSV names with no clip in any
327
+ mounted set (see cp2077.anims.graph.real-swing-ceiling-is-nine-slot-csv). combo_attack_04 DOES
328
+ exist in the vanilla katana set (a 4th diagonal slash) and therefore in this mod's
329
+ katana-clone set, as well as in default_melee_weapon.anims (where it is the left-punch
330
+ content) — an earlier phrasing of this fact wrongly said it existed only in
331
+ default_melee_weapon.anims. In vanilla katana, final_attack_04 is byte-identical to
332
+ combo_attack_04 but sits in a distinct buffer (BufferId 75 vs 76), so re-authoring one does
333
+ not alias into the other."
334
+ - id: cp2077.anims.pipeline.byte-splice-transplant-approach-dead
335
+ claim: "An early transplant approach — decoding a source .anims motion chunk, slicing its bytes,
336
+ appending them to a target entry's chunk, and repointing the target's dataAddress (a
337
+ byte-growing cross-file splice) — was silently rejected by the game engine: the modded file
338
+ loaded, but the spliced entry played unchanged vanilla content, with no error anywhere."
339
+ status: contradicted
340
+ source: ModWright research
341
+ tags:
342
+ - transplant
343
+ - byte-splice
344
+ - chunk-growing
345
+ - dead-end
346
+ - silent-rejection
347
+ detail: "A decisive bisect ruled out several other explanations: an IN-FILE repoint with no new
348
+ bytes (redirecting one existing entry's dataAddress to another existing entry's data) DID work
349
+ and rendered correctly in game, while any approach that grew the file's chunk data did not.
350
+ This dead end was abandoned in favor of the full Blender GLB round-trip pipeline (author in
351
+ Blender, export a whole GLB, WolvenKit reimport) documented in the rest of this file — no
352
+ single fact \"replaces\" it, so no supersedes id is given."
@@ -0,0 +1,222 @@
1
+ game: cyberpunk2077
2
+ topic: anims.roundtrip
3
+ title: Round-tripping .anims through wolvenkit and Blender - known corruptions
4
+ facts:
5
+ - id: cp2077.anims.roundtrip.cli-export-strips-root-motion
6
+ claim: "wolvenkit CLI can export .anims to GLB headlessly (positional path plus -gp), but it
7
+ SILENTLY STRIPS ROOT MOTION by default, logging only \"Root motion export: disabled\". A
8
+ clip's world travel simply vanishes from the GLB and every measurement taken from it is wrong.
9
+ Enable it with \"AnimationExportArgs\" incRootMotion true in the CLI's appsettings.json."
10
+ status: verified
11
+ source: ModWright field verification
12
+ tags:
13
+ - cli
14
+ - anims
15
+ - export
16
+ - root-motion
17
+ - silent-failure
18
+ - appsettings
19
+ supersedes: cp2077.anims.pipeline.cli-export-anims-old-belief
20
+ detail: "The -o output directory must already EXIST or the export dies with \"fill in an output
21
+ path\". Corrects an earlier note claiming the CLI could not export .anims at all (kept as
22
+ cp2077.anims.pipeline.cli-export-anims-old-belief). MERGED from a mod project's record of the
23
+ same command, which adds: the path argument must be POSITIONAL (with -p instead it fails
24
+ misleadingly with \"Exporting mesh files with materials requires --gamepath to be set\"); -gp
25
+ is what lets the archive manager resolve the skeleton rig (a copy of the rig also sits in the
26
+ WolvenKit depot at MaterialRepositoryPath); a successful run logs \"Found 88 animations to
27
+ export, using rig base\\characters\\entities\\player\\player_woman_skeleton.rig\"; and donor
28
+ acquisition therefore no longer needs a GUI trip."
29
+ - id: cp2077.anims.roundtrip.rm-export-timeline-is-normalised
30
+ claim: In a root-motion GLB export the ROOT timeline is normalised to 0..1 seconds, NOT clip time.
31
+ Reading extraction timing off the GLB therefore time-squashes the motion by the clip's
32
+ duration. Read timing from the serialized .anims instead.
33
+ status: verified
34
+ source: ModWright field verification
35
+ tags:
36
+ - anims
37
+ - export
38
+ - root-motion
39
+ - timing
40
+ - measurement
41
+ detail: Cost a full authoring round. motionExtraction (animSplineCompressedMotionExtraction)
42
+ posKeysData and rotKeysData are 16-byte knots, u16 t_norm then u16 flags then three f32, where
43
+ t is t_norm/65535 times duration and the values are Root translation in the rig's LOCAL frame.
44
+ - id: cp2077.anims.roundtrip.simd-extra-joints-export-garbage
45
+ claim: A clip whose animation buffer is animAnimationBufferSimd AND which has one or more extra
46
+ joints exports to GLB as silent garbage - every bone carries a bogus constant scale fcurve and
47
+ the evaluated pose collapses. Compressed buffers with extra joints are fine, and Simd with
48
+ zero extra joints is fine. It is the COMBINATION, not the extra-joint count alone.
49
+ status: verified
50
+ source: ModWright field verification
51
+ tags:
52
+ - anims
53
+ - export
54
+ - glb
55
+ - corruption
56
+ - simd
57
+ - wolvenkit-bug
58
+ - blender
59
+ detail: Under full inherit-scale the bogus scale compounds down 152 bones until every bone's
60
+ evaluated head reads as a unit vector, no exception is raised, and a render is an empty frame.
61
+ Every PLAYER finisher clip in the game is Simd with one extra joint, so none can currently be
62
+ round-tripped; NPC-side finisher clips are Compressed and export clean. The extra joints are
63
+ syncTrajectory sync-scene tracks, not bones, so no rig override helps. CHEAP UNIVERSAL GATE -
64
+ after importing any donor, assert every pose bone's matrix_basis scale is (1,1,1) and that the
65
+ pose actually moves. The anim pipeline keys loc and rot only, so any nonzero scale channel on
66
+ a donor is by definition corruption.
67
+ - id: cp2077.anims.roundtrip.import-writes-bad-fallback-indices
68
+ claim: The .anims GUI import rewrites fallbackFrameIndices on REBUILT clips to out-of-range values,
69
+ which HARD CRASHES the game the instant such a clip plays. Each clip's
70
+ animBuffer.fallbackFrameIndices is two ints indexing the set-level fallbackAnimDescIndexes
71
+ array.
72
+ status: verified
73
+ source: ModWright field verification
74
+ tags:
75
+ - anims
76
+ - import
77
+ - crash
78
+ - corruption
79
+ - wolvenkit-bug
80
+ - gate
81
+ detail: "Vanilla mantis clips use small in-range values such as [4,5] or [6,7]; the importer rewrote
82
+ rebuilt clips to [78,79] while leaving untouched clips alone, and the engine then read index
83
+ 78 of a 10-element array. The compile was clean and the bone data sound. The fallback ARRAYS
84
+ survive import identical to vanilla, so the fix is byte-safe: restore each rebuilt clip's
85
+ indices in the serialized JSON, and gate that every clip's indices are within the bounds of
86
+ fallbackAnimDescIndexes before packing."
87
+ - id: cp2077.anims.roundtrip.import-stale-extra-joint-count
88
+ claim: The .anims import copies the EXISTING clip's extra-joint count onto a rebuilt clip while
89
+ encoding every GLB bone as a real channel. The engine then reads the last real bone as a sync
90
+ track, the mesh bounds straddle the frustum, and the body flashes on and off in game. A
91
+ rebuilt clip from a GLB with no sync nodes MUST carry numExtraJoints 0 and empty
92
+ extraDataNames.
93
+ status: verified
94
+ source: ModWright field verification
95
+ tags:
96
+ - anims
97
+ - import
98
+ - corruption
99
+ - culling
100
+ - wolvenkit-bug
101
+ - gate
102
+ detail: Symptom is numJoints 71 with extra 1 on a 71-bone rig. Nothing crashes and wolvenkit exports
103
+ it fine. Synced finishers still align with no syncTrajectory on either side, because the
104
+ workspot syncOffsets carry it.
105
+ - id: cp2077.anims.roundtrip.import-drops-joint-channels
106
+ claim: The .anims importer is driven by the GLB's per-animation EXTRAS (the Blender action's custom
107
+ properties), NOT by the project file. A donor-inherited numExtraJoints of 1 makes it write
108
+ only 70 of 71 rig joints, dropping the last; and any rootMotionType other than None or Unknown
109
+ makes it consume the Root joint's keys as a re-invented motionExtraction and write no Root
110
+ joint at all. The engine reads garbage for a joint with no entry and the mesh culls in and
111
+ out.
112
+ status: verified
113
+ source: ModWright field verification
114
+ tags:
115
+ - anims
116
+ - import
117
+ - corruption
118
+ - glb-extras
119
+ - wolvenkit-bug
120
+ - gate
121
+ detail: "Cost three launches and three wrong fixes - aimed at the project file, the Root value, and
122
+ key density - because none of them touched the extras. Before exporting a clip re-authored
123
+ from a donor, set the action's numExtraJoints to 0 and its rootMotionType to \"Unknown\"
124
+ (Unknown means keep the project file's existing extraction verbatim AND treat Root as a
125
+ regular joint). Then gate the written GLB's extras and channel targets, and gate the imported
126
+ set by re-exporting it and counting channel targets. GENERALISES: when an importer misbehaves
127
+ on a round-tripped file, diff the round-trip's METADATA against a file that imports cleanly
128
+ before touching the data."
129
+ - id: cp2077.anims.roundtrip.import-preserves-extraction-if-root-static
130
+ claim: With "Use existing file", the .anims importer PRESERVES the existing clip's motionExtraction
131
+ as long as the GLB's Root does not move. Author bones root-relative with Root keyed STATIC and
132
+ a vanilla extraction survives verbatim. A GLB whose Root animates gets its extraction
133
+ re-encoded, and both dense and sparse Root keys produce broken results.
134
+ status: verified
135
+ source: ModWright field verification
136
+ tags:
137
+ - anims
138
+ - import
139
+ - root-motion
140
+ - motion-extraction
141
+ - gui
142
+ detail: Dense Root keys produced a wrong-curve spline; sparse Root keys a corrupt 66 KB one, which
143
+ then failed re-export with "Motion extraction in joint 2, out of range". Gate on byte-equality
144
+ of the extraction.
145
+ - id: cp2077.anims.roundtrip.import-drops-animevents
146
+ claim: The .anims importer does not carry the Blender addon's animEvents action property. A rebuilt
147
+ clip inherits the events of whatever DONOR action was copied, so the events must be patched
148
+ back into the serialized JSON after import.
149
+ status: verified
150
+ source: ModWright field verification
151
+ tags:
152
+ - anims
153
+ - import
154
+ - animevents
155
+ - corruption
156
+ - id: cp2077.anims.roundtrip.import-is-gui-only
157
+ claim: There is no headless route for importing .anims. The CLI import verb refuses them ("as Mesh")
158
+ and the CLI build verb crashes. The wolvenkit GUI import is the only working path, so an anims
159
+ pipeline cannot be fully automated.
160
+ status: verified
161
+ source: ModWright field verification
162
+ tags:
163
+ - anims
164
+ - import
165
+ - cli
166
+ - gui
167
+ - limitation
168
+ detail: "MERGED from a mod project's record of the same limitation, which adds the exact failure
169
+ text and the argument shape: `import -k` routes a .glb to the MESH importer and dies with
170
+ \"Failed to rebuild with buffers: x.anims (as Mesh)\"; there is no -gp and no anims-specific
171
+ argument on `import`, and -o must be the folder that directly CONTAINS the target .anims (it
172
+ does not mirror the raw tree from a single-file argument). The practical loop for one
173
+ animation iteration is therefore: bake headless -> ONE GUI import click -> pack headless."
174
+ - id: cp2077.anims.roundtrip.use-the-addon-importer
175
+ claim: To import a donor .anims GLB into Blender, use the Cyberpunk IO Suite importer -
176
+ bpy.ops.io_scene_gltf.cp77 with scripting and import_tracks enabled - never
177
+ bpy.ops.import_scene.gltf. The stock importer silently drops the 23 float tracks and roughly
178
+ 13 action custom properties that every clip carries.
179
+ status: verified
180
+ source: ModWright field verification
181
+ tags:
182
+ - anims
183
+ - blender
184
+ - import
185
+ - addon
186
+ - float-tracks
187
+ - silent-failure
188
+ detail: "Dropped data includes allowFeetIk, enableLeftFootIk/RightFootIk, cameraUpOffset,
189
+ rootMotionType, constTrackKeys, animEvents and optimizationHints. The rebuilt entry comes back
190
+ hasRawRotations 1 with numConstTrackKeys 0, and in game the missing foot-IK flags TELEPORT THE
191
+ PLAYER - black screen, streaming reload, V under the world or underwater. Cost a full launch.
192
+ Gate on the encoding fields, not just names and durations. GENERALISES: when an addon ships
193
+ its own importer for a format, the stock one is not a substitute - the addon's exists to carry
194
+ the engine-specific extras."
195
+ - id: cp2077.anims.roundtrip.encoder-rotation-noise
196
+ claim: The wolvenkit anims encoder keeps POSITIONS exact (0.00 mm) but degrades ROTATIONS on the
197
+ gun-space chain and IK JNTs by 1.3 to 3.3 degrees. The ordinary arm chain encodes clean, under
198
+ 0.3 degrees. Constant channels encode exactly, which is why positions survive.
199
+ status: inferred
200
+ source: ModWright research
201
+ tags:
202
+ - anims
203
+ - encoder
204
+ - rotation
205
+ - precision
206
+ - noise
207
+ - sway
208
+ detail: "A shipped weapon's orientation was up to half phantom noise: an authored turn of 2.2
209
+ degrees against 2.1 to 2.5 degrees of encoder error. No gate measuring the authored or
210
+ re-exported data at the same points can see it as motion. Practical rule - author varying
211
+ rotation only into arm-chain bones, keep weapon-placement and IK-bone rotation channels
212
+ CONSTANT, and carry motion in translations. MERGED from a mod project's measurement of the
213
+ same effect, which gives the per-bone numbers on the four ambient-sway additive clips:
214
+ worst-frame arms_gun_space 2.13 deg (add_melee_idle) / 2.50 deg (add_melee_idle_combat), the
215
+ four Torso_*Arm_Hand_IK_JNT bones 1.3-3.3 deg, LeftArm/RightArm only 0.11-0.28 deg, and EVERY
216
+ position channel 0.00 mm; the authored turn inside add_melee_idle was itself only 2.18 deg.
217
+ Status is INFERRED, not verified: both sides are offline per-bone script measurements
218
+ (_encoder_audit.py), not an in-game observation. SCOPE: the damage applies to RE-AUTHORED
219
+ clips only — see cp2077.anims.encoder.damage-scoped-to-reauthored-clips-not-untouched-ones and
220
+ cp2077.anims.encoder.reauthoring-collapses-constant-channels for the mechanism, and
221
+ cp2077.anims.encoder.sway-gunrot-const-fix-verified-in-game for the fix that removes it at
222
+ source."