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,146 @@
1
+ game: cyberpunk2077
2
+ topic: audio.voicesets
3
+ title: NPC barks - context names, the voiceset scenes behind them, and which enemy voices carry
4
+ which contexts
5
+ facts:
6
+ - id: cp2077.audio.voicesets.barks-are-context-names
7
+ claim: "An NPC bark is requested by a context name, not by a line: GameObject.PlayVoiceOver(self,
8
+ voName, debugInitialContext, optional delay, answeringEntityID, canPlayInVehicle) plays a line
9
+ of context voName in that NPC's own voice. The AI does the same through 242
10
+ AISubActionPlayVoiceOver records naming 62 contexts (flats name, delay, condition, cooldown,
11
+ repeat, sendEventToSquadmates, setSelfAsAnsweringEntity); for example the Reboot Optics blind
12
+ asks for stlh_blinded out of combat and combat_blinded in it, the Cyberpsychosis quickhack's
13
+ squadmate reaction asks for madness_quick_hack_reaction, and surrender and panic ask for
14
+ fear_beg. ReactionManagerComponent.SendVOEventToSquad(owner, voEvent) plays the context on
15
+ every active squadmate of the owner within AIGeneralSettings.maxDistanceBattleCry, not on the
16
+ owner."
17
+ status: verified
18
+ verified_on: "2.31"
19
+ source: tools\redmod\scripts\core\entity\gameObject.script:1003 (PlayVoiceOver);
20
+ core\ai\actions\tweakAISubActions.script:126-140 (SendVoiceOverEvent);
21
+ core\components\scriptComponents\reactionComponent.script:6055-6102 (SendVOEventToSquad); the
22
+ vanilla index, records of type AISubActionPlayVoiceOver and their name flats
23
+ (StatusEffectActions.SE_BlindDefault_inline1, SE_BlindQuickhackCombat_inline1,
24
+ MadnessSquadmateVoiceReaction_inline2, ReactionsActions.SurrenderFearInPlace01_inline2)
25
+ tags:
26
+ - audio
27
+ - voiceover
28
+ - bark
29
+ - context
30
+ - ai
31
+ - squad
32
+ detail: "No script API tells whether a voice has a line for a context; a voice without one plays
33
+ nothing (inferred from the voicesets below: nothing falls back). The scripts also call about
34
+ 40 contexts directly (fear_beg, stlh_curious_grunt, enemy_warning, stealth_ended and others)."
35
+ - id: cp2077.audio.voicesets.voiceset-scene-structure
36
+ claim: Each generic NPC voice is a .scene under base\open_world\voicesets\<category>\
37
+ (gangers\<gang>, security\security_<tier>, ncpd, mercs, civilian_*), with a twin under
38
+ versions\gold. The scene's entryPoints are named by context, usually with _var_1.._var_3
39
+ variants (stlh_curious, stlh_curious_var_1, ...); each leads through a scnRandomizerNode to
40
+ scnSectionNodes whose scnDialogLineEvents name screenplay lines, whose locstringIds are the
41
+ stringIds of base\localization\en-us\subtitles\open_world\voicesets\<voice>.json. So a voice's
42
+ lines per context can be listed from the install without the game.
43
+ status: verified
44
+ verified_on: "2.31"
45
+ source: basegame_4_gamedata.archive
46
+ base\open_world\voicesets\gangers\tiger_claws\gang_tcl_m_01_jap_20.scene and 451 further
47
+ voiceset scenes; lang_en_text.archive
48
+ base\localization\en-us\subtitles\open_world\voicesets\*.json
49
+ tags:
50
+ - audio
51
+ - voiceset
52
+ - scene
53
+ - subtitle
54
+ - entry-point
55
+ - extraction
56
+ detail: "1,062 resources sit under base\\open_world\\voicesets (1,058 scenes, most voices twice,
57
+ base and versions\\gold): gangers 284, the civilian sets about 550, NCPD 80, security 68,
58
+ mercs 20, plus 16 shared blocks under voiceset_scene_blocks. The shared blocks
59
+ apuc_enemies_voiceset_scene_block and apuc_enemies_missing_scene_block list context names with
60
+ no lines of their own."
61
+ - id: cp2077.audio.voicesets.enemy-context-coverage
62
+ claim: Across the 226 base-game enemy voicesets (gangers, security, mercs, NCPD), stlh_curious
63
+ (confused "huh?" and "what was that?" lines) has lines in 215 voices and danger in 225, while
64
+ the 2.0-era contexts apuc_stlh_blinded, apuc_combat_blinded, apuc_madness_quick_hack_reaction,
65
+ apuc_call_in_confusion and apuc_combat_quick_hack have lines in the same 73 voices, spread
66
+ over most gangs, NCPD and security. apuc_madness_quick_hack_wearoff is listed in the shared
67
+ template block but no enemy voice recorded a line for it, and no enemy voiceset has fear_beg.
68
+ The base scenes and their versions\gold twins agree.
69
+ status: verified
70
+ verified_on: "2.31"
71
+ source: the extraction in cp2077.audio.voicesets.voiceset-scene-structure, over
72
+ base\open_world\voicesets\{gangers,security,mercs,ncpd}\ (226 voices each in the base and
73
+ versions\gold sets)
74
+ tags:
75
+ - audio
76
+ - voiceset
77
+ - coverage
78
+ - enemy
79
+ - quickhack
80
+ - possession
81
+ detail: "The out-of-combat blind lines often have the NPC blame their own optics or implants, which
82
+ suits a target coming back from a takeover; the combat ones mostly name V as the attacker.
83
+ Voices without the 2.0 contexts include the Aldecaldos and some whole voices in every gang.
84
+ Phantom Liberty's voicesets (ep1 archives) were not read. A quickhack mod (v0.12.12) plays
85
+ stlh_curious then stlh_blinded on a target that survives a takeover, and
86
+ madness_quick_hack_reaction to its squad. Observed in game (2026-09-25): both of the target's
87
+ contexts played on a spawned Tyger Claw; the release itself waits for a human take. Also
88
+ observed in game: the squad send (SendVOEventToSquad) to an alerted Valentino group was
89
+ inconclusive, while the same context played directly on one of them was heard."
90
+ related:
91
+ - cp2077.audio.voicesets.barks-are-context-names
92
+ - cp2077.audio.voicesets.apuc-contexts-requested-without-the-prefix
93
+ - id: cp2077.audio.voicesets.apuc-contexts-requested-without-the-prefix
94
+ claim: The voices name their 2.0-era contexts with an apuc_ prefix (apuc_stlh_blinded,
95
+ apuc_madness_quick_hack_reaction), but the AI actions that play them ask for the bare names
96
+ (stlh_blinded, madness_quick_hack_reaction). The engine maps the bare request to the prefixed
97
+ entry, and a script asking for the bare name reaches the same lines.
98
+ status: verified
99
+ verified_on: "2.31"
100
+ source: ModWright field verification
101
+ tags:
102
+ - audio
103
+ - voiceset
104
+ - context
105
+ - apuc
106
+ detail: "The first boot with a quickhack mod's blinded-voice arm on a voice from the 73 settles it:
107
+ a line means the mapping holds for a script caller."
108
+ - id: cp2077.audio.voicesets.voice-tag-readable-through-codeware
109
+ claim: An NPC entity carries its voiceset in a component named VoicesetComponent
110
+ (scnVoicesetComponent), whose persistent state scnVoicesetComponentPS holds voiceTag,
111
+ gruntSetIndex and the areVoicesetLinesEnabled / areVoicesetGruntsEnabled switches; Codeware
112
+ declares that state class for scripts, and GameComponent.GetPS() is public, so a script can
113
+ read the tag. It reads None at runtime too, on a spawned Tyger Claw that speaks, so it does
114
+ not name the voice.
115
+ status: verified
116
+ verified_on: "2.31"
117
+ source: base\characters\entities\citizen\citizen__default_ma.ent and
118
+ base\characters\base_entities\man_base\man_base.ent (extracted with the template tool, the
119
+ mod's cache); Codeware 1.20.3 Codeware.Global.reds:35180;
120
+ tools\redmod\scripts\core\components\scriptableComponent.script:3
121
+ tags:
122
+ - audio
123
+ - voiceset
124
+ - codeware
125
+ - component
126
+ detail: So a release can't pick contexts per voice from the tag. It plays the near-universal context
127
+ first and the better-fitting one after it, and voices without the second stay quiet (a
128
+ quickhack mod, v0.12.12).
129
+ - id: cp2077.audio.voicesets.replacer-body-grunts-are-the-voicesets
130
+ claim: On a replacer body that is the player (a PlayerPuppet record inheriting V's voice tag v and
131
+ her PlayerVoice combat settings v_voice), the combat grunts (hit, firing, melee, falls) are
132
+ the entity's voiceset's and keep V's voice whatever the record's voiceTag, an injected tag
133
+ (entInjectVoiceTagEvent, forceInjection) or the PlayerVoice component's combatVoSettingsName
134
+ says. entChangeVoicesetStateEvent with enableVoicesetGrunts false silences them.
135
+ status: verified
136
+ verified_on: "2.31"
137
+ source: ModWright field verification
138
+ tags:
139
+ - audio
140
+ - voiceset
141
+ - replacer
142
+ - grunts
143
+ - player
144
+ detail: "What does choose the grunts is not read (candidates: the replacer node's
145
+ audioOverrideAppearanceName, the voiceset component's own state). A quickhack mod mutes them
146
+ until then."
@@ -0,0 +1,219 @@
1
+ game: cyberpunk2077
2
+ topic: cet.sandbox
3
+ title: Cyber Engine Tweaks Lua sandbox, console versus mod environments
4
+ facts:
5
+ - id: cp2077.cet.console-sandbox-has-no-io
6
+ claim: "The CET console runs in a separate, stripped sandbox: since CET 1.10 it has no `io`, `json`,
7
+ `dofile` or ImGui bindings. A console test of `io.open` therefore says nothing about what a
8
+ mod's own environment can do."
9
+ status: verified
10
+ verified_on: CET 1.10
11
+ source: ModWright field verification
12
+ tags:
13
+ - cet
14
+ - sandbox
15
+ - console
16
+ - io
17
+ detail: "An early in-game run read its console result as \"io does not exist at all in this CET
18
+ build's Lua sandbox\". That overreaches: the changelog shows the console was stripped by
19
+ design in 2021 while mods kept io. The decisive check for a mod is its own capability report
20
+ or its own log file, never a console one-liner."
21
+ - id: cp2077.cet.mod-sandbox-io-relative-to-mod
22
+ claim: Inside a mod's sandbox, `io` and `dofile` exist and every path is resolved relative to the
23
+ mod's own folder under `bin/x64/plugins/cyber_engine_tweaks/mods/<Mod>/`.
24
+ status: verified
25
+ verified_on: CET 1.10
26
+ source: 'CET changelog 1.10: "All pathing is now relative to mod (breaking change, includes all io
27
+ functions, dofile() and such included)"; "Introduced proper sandbox with LuaSandbox helper
28
+ class".'
29
+ tags:
30
+ - cet
31
+ - sandbox
32
+ - io
33
+ - paths
34
+ detail: "Not yet confirmed in-engine by ModWright on CET 1.37.1: the bridge's own capability line
35
+ was not captured in an early in-game run. A relative name such as \"modwright_hb.json\" is the
36
+ form the changelog implies; whether writes outside the mod folder are refused or silently
37
+ redirected is not stated."
38
+ - id: cp2077.cet.mod-log-files
39
+ claim: Each CET mod logs to its own log file, and errors raised by mod code go to the mod's log
40
+ rather than the console; `spdlog` is exposed so a mod can write to that log.
41
+ status: verified
42
+ verified_on: CET 1.9.1
43
+ source: 'CET changelog 1.9.1: "Mods will now log to their own log files, you can also use spdlog to
44
+ print in your log"; 1.10: "Errors that happen in Game, game class methods,... should now log
45
+ into proper environment (to console when executed from console, to mod log when executed from
46
+ mod)".'
47
+ tags:
48
+ - cet
49
+ - logging
50
+ - sandbox
51
+ detail: The exact file name convention is not stated in the changelog; treat "the newest .log inside
52
+ the mod folder" as the place to look until a real one is recorded.
53
+ - id: cp2077.cet-lua-is-5-1-luajit
54
+ claim: CET's Lua is 5.1 semantics on LuaJIT since CET 1.12.0; post-5.1 language features such as
55
+ bitwise operators are unavailable, and the `bit32` library is provided.
56
+ status: verified
57
+ verified_on: CET 1.12.0
58
+ source: "CET changelog 1.12.0: \"Lua version changed to 5.1 ... switching to LuaJIT\"; \"Added Lua's
59
+ bit32 library\"."
60
+ tags:
61
+ - cet
62
+ - lua
63
+ - luajit
64
+ detail: This is why `luac5.1 -p` is the relevant syntax check for the CET bridge (`npm run
65
+ bridge:lint` runs 5.1 first).
66
+ - id: cp2077.cet.os-rename-remove-available
67
+ claim: '`os.remove` and `os.rename` exist in the CET mod sandbox; CET 1.12.0 fixed them after they
68
+ "were not working properly".'
69
+ status: verified
70
+ verified_on: CET 1.12.0
71
+ source: 'CET changelog 1.12.0, "Fixes: os.remove and os.rename were not working properly."'
72
+ tags:
73
+ - cet
74
+ - sandbox
75
+ - io
76
+ - atomic-write
77
+ detail: Makes a write-temp-then-rename commit possible for the bridge's result files; unconfirmed
78
+ in-engine on 1.37.1.
79
+ - id: cp2077.cet.json-in-mod-sandbox
80
+ claim: A `json` library is available to CET mods (added in CET 1.9.2) but is stripped from the
81
+ console sandbox (CET 1.10).
82
+ status: verified
83
+ verified_on: CET 1.10
84
+ source: CET changelog 1.9.2 "Added json support to Lua"; 1.10 console-strip line.
85
+ tags:
86
+ - cet
87
+ - json
88
+ - sandbox
89
+ - id: cp2077.cet.require-uses-slashes-mod-relative
90
+ claim: In CET mods `require` resolves paths relative to the mod folder and uses "/" as the
91
+ separator, not "."; the require cache is reset on "Reload all mods"; Lua bytecode cannot be
92
+ loaded; `dofile` is deprecated since CET 1.9.1 but was kept working.
93
+ status: verified
94
+ verified_on: CET 1.10
95
+ source: "CET changelog 1.10: \"require does not support '.' instead of '/' now\"; \"require cache is
96
+ reset on Reload all mods now\"; \"Bytecode cannot be loaded now\"; 1.9.1: \"dofile is now
97
+ deprecated, use only mods please\"; 1.12.0: \"Fixed dofile, loadfile and loadstring\"."
98
+ tags:
99
+ - cet
100
+ - lua
101
+ - require
102
+ - modules
103
+ - id: cp2077.cet.getmod-only-after-oninit
104
+ claim: "`GetMod()` and every type or function that relies on RTTI are only available after the
105
+ `onInit` event; calling them earlier is unsupported."
106
+ status: verified
107
+ verified_on: CET 1.14.0
108
+ source: 'CET changelog 1.14.0: "The GetMod() is only available after onInit as there is no guarantee
109
+ that the required mod will be loaded before this event. Types and functions that rely on RTTI
110
+ are only available after onInit event".'
111
+ tags:
112
+ - cet
113
+ - lifecycle
114
+ - oninit
115
+ - getmod
116
+ - id: cp2077.cet.per-mod-sqlite-db
117
+ claim: Each CET mod is implicitly assigned a SQLite database, reachable from Lua as the `db` object.
118
+ status: verified
119
+ verified_on: CET 1.10
120
+ source: 'CET changelog 1.10: "Each mod is (right now) assigned sqlite3 database implicitly,
121
+ accessible through db lua object"; 1.9.1: SQLite3 support added.'
122
+ tags:
123
+ - cet
124
+ - sqlite
125
+ - storage
126
+ detail: A possible alternative transport for the verification bridge (ModWright reads SQLite through
127
+ sql.js), noted but not designed; concurrent writers from two processes would need care.
128
+ - id: cp2077.cet.current-version-and-game-support
129
+ claim: "CET's Nexus page shows version 1.37.1, last updated 2025-09-29, with \"Supported version:
130
+ 2.31\" as the game build named on the page; it was run in game on build 3.0.80.51928
131
+ (2026-09-08)."
132
+ status: verified
133
+ verified_on: CET 1.37.1
134
+ source: ModWright field verification
135
+ tags:
136
+ - cet
137
+ - version
138
+ - compat
139
+ detail: The page's stated supported game version lags the build it was run on; check_compat's CET
140
+ floor should be read against the actual release notes, not this page line.
141
+ - id: cp2077.cet.mod-sandbox-has-no-global-table
142
+ claim: "Inside a CET mod's Lua environment `_G` is nil: the environment is a fresh table that falls
143
+ back to a whitelisted copy of the globals, and `_G` is not on the whitelist. Code that
144
+ discovers capabilities through `_G[name]` sees nothing; a free global name resolved through
145
+ the environment is the only lookup that works."
146
+ status: verified
147
+ verified_on: CET 1.37.1
148
+ source: ModWright field verification
149
+ tags:
150
+ - cet
151
+ - sandbox
152
+ - lua
153
+ - capabilities
154
+ - bridge
155
+ detail: The ModWright CET bridge's capability probe used `_G[name]` and therefore reported io absent
156
+ and ran log-only in an early in-game run. Fixed to reference globals by name.
157
+ - id: cp2077.cet.mod-sandbox-io-path-rules
158
+ claim: The sandboxed `io.open` resolves a path against the mod's root and refuses absolute paths and
159
+ any path containing `..`; a missing file is allowed when opening for write. The sandbox also
160
+ provides `io.lines`, `os.rename`, `os.remove`, a per-mod `db` at `db.sqlite3`, `dir()`, and a
161
+ curated `os` with clock, date, difftime and time.
162
+ status: verified
163
+ verified_on: CET 1.37.1
164
+ source: "CyberEngineTweaks/src/scripting/LuaSandbox.cpp InitializeIOForSandbox (io table:
165
+ open/lines/read/write/close/type/input/output), GetLuaPath (rejects absolute and `..`),
166
+ src/Utils.cpp GetAbsolutePath (acAllowNonExisting), LuaSandbox.cpp:53-61 (os copy)."
167
+ tags:
168
+ - cet
169
+ - sandbox
170
+ - io
171
+ - paths
172
+ detail: Every candidate prefix the bridge tries resolves under the same mod root; only the empty
173
+ prefix (the mod folder itself) is meaningful, and a prefix naming a missing subfolder fails
174
+ because io.open does not create directories.
175
+ - id: cp2077.cet.mod-log-file-name
176
+ claim: Each CET mod's own log file is `<ModFolderName>.log` inside the mod's folder, created by the
177
+ sandbox logger; `spdlog.info(...)` and errors from mod code land there.
178
+ status: verified
179
+ verified_on: CET 1.37.1
180
+ source: CyberEngineTweaks/src/scripting/LuaSandbox.cpp:638 `CreateLogger(GetAbsolutePath(acName +
181
+ ".log", cSBRootPath, true), acName)`.
182
+ tags:
183
+ - cet
184
+ - logging
185
+ - sandbox
186
+ detail: For the ModWright bridge that is bin/x64/plugins/cyber_engine_tweaks/mods/ModWrightBridge/
187
+ ModWrightBridge.log, the first file the log-polling transport reads.
188
+ - id: cp2077.cet.log-truncated-at-initializetweakdbmetadata-is-cosmetic
189
+ claim: "`cyber_engine_tweaks.log` ending mid-string at an `InitializeTweakDBMetadata(...)` call
190
+ signature is not by itself evidence of a TweakDB initialisation hang; the same truncated last
191
+ line appears on a normal launch that reaches the main menu with TweakXL fully loaded."
192
+ status: verified
193
+ verified_on: "2.31"
194
+ source: ModWright field verification
195
+ tags:
196
+ - cet
197
+ - log
198
+ - tweakdb
199
+ - hang
200
+ - stall
201
+ - diagnostics
202
+ detail: "A stall detector needs a positive completion signal instead: TweakXL.log's own
203
+ import-completed line, or a bounded wait on the main menu. An earlier intermittent stall may
204
+ still be real; this fact only retires the log truncation as its marker."
205
+ - id: cp2077.cet.sandbox.observeafter-attaches-mid-session
206
+ claim: "CET's ObserveAfter(class, method, fn) can be registered mid-session from a bridge eval chunk
207
+ (not only in onInit) and fires on the next calls: an observer on
208
+ NPCPuppet.DamagePipelineFinalized caught every NPC hit with its instigator, computed damage
209
+ and hit flags, which a redscript log could not (a null in its attack-record chain aborted
210
+ it)."
211
+ status: verified
212
+ verified_on: 2.31 (CET 1.x, 2026-09)
213
+ source: ModWright field verification
214
+ tags:
215
+ - cet
216
+ - observe
217
+ - hook
218
+ - debugging
219
+ - bridge
@@ -0,0 +1,283 @@
1
+ game: cyberpunk2077
2
+ topic: clothing.garments
3
+ title: ArchiveXL dynamic appearances, visual tags and substitution syntax
4
+ facts:
5
+ - id: cp2077.clothing.garments.dynamic-variant-name-syntax
6
+ claim: In a dynamic appearance name, everything after the `!` arrives in the mesh entity under the
7
+ key `variant`; adding `+` splits it into parts reachable as `variant.1` and `variant.2`. A raw
8
+ variant of `$(base_color)+$(secondary)` resolving to `black+samurai` gives `variant` =
9
+ `black+samurai`, `variant.1` = `black`, `variant.2` = `samurai`; without the `+`,
10
+ `$(base_color)$(secondary)` yields `blacksamurai` as `variant.1` and nothing for `variant.2`.
11
+ status: community
12
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", section "Step 2: Connecting the
13
+ decal (and understanding variants)" (the "Examples" table)'
14
+ tags:
15
+ - archivexl
16
+ - dynamic-appearance
17
+ - variant
18
+ - substitution
19
+ - syntax
20
+ detail: "Used in a path as `{variant.2}` — the guide's worked step is \"In the mesh depot path,
21
+ replace `samurai.mesh` with `{variant.2}.mesh`\". Section names corrected 2026-09-07: the page
22
+ has no \"Key YAML/Manifest Syntax\" or \"Substitution Placeholders\" headings."
23
+ - id: cp2077.clothing.garments.substitution-path-requires-star-prefix
24
+ claim: ArchiveXL only substitutes `{placeholder}` inside a mesh entity component's depot path when
25
+ the path starts with `*`, e.g.
26
+ `*manavortex/equipment/torso_inner/my_custom_shirt/meshes/t1_079_p{gender}a_tshirt_casual.mesh`.
27
+ A path written without the leading `*` is not substituted.
28
+ status: community
29
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", sections "Summary" (TL;DR box,
30
+ "To enable substitution in mesh depot paths, make sure they start with `*`") and "Safely
31
+ changing mesh paths"; corroborated by "ArchiveXL: Suffixes and Substitutions", section "Which
32
+ substitutions exist?" ("Substitution will only become active if the property name starts with
33
+ an asterisk (`*`)")'
34
+ tags:
35
+ - archivexl
36
+ - dynamic-appearance
37
+ - depotpath
38
+ - substitution
39
+ - syntax
40
+ detail: The generator's default paths also carry the `Soft` flag alongside the `*`. WolvenKit's
41
+ DepotPath box has a right-click "Convert to dynamic" action that adds the `*` to a pasted
42
+ plain path.
43
+ - id: cp2077.clothing.garments.dynamic-appearance-placeholders
44
+ claim: ArchiveXL's substitution placeholders and what they resolve to are `{camera}` -> `fpp` or
45
+ `tpp`; `{gender}` -> `m` or `w`; `{body}` -> `base_body` or the body mod name in snake case;
46
+ `{arms}` -> `base_arms`, `mantis_blades`, `monowire`, `projectile_launcher`; `{feet}` ->
47
+ `flat`, `lifted`, `high_heels`, `flat_shoes` (empty for mascV); `{sleeves}` -> `full`, `part`;
48
+ `{skin_color}`; `{hair_color}`. They are usable inside mesh-entity component `name`,
49
+ `depotPath` and `appearance` fields and in an `.app` appearance's `name` field.
50
+ status: community
51
+ source: 'wiki.redmodding.org "ArchiveXL: Suffixes and Substitutions", section "Which substitutions
52
+ exist?" (placeholder table)'
53
+ tags:
54
+ - archivexl
55
+ - dynamic-appearance
56
+ - placeholder
57
+ - gender
58
+ - body-tag
59
+ detail: "Corrected 2026-09-07: `{gender}` resolves to `m`/`w`, NOT to `pwa`/`pma` — the vanilla path
60
+ shape is `p{gender}a`, which is what produces `pwa`/`pma`. Substitutions have existed since
61
+ ArchiveXL 1.8.0. The wiki warns its table can lag the implementation and links the
62
+ authoritative source, cp2077-archive-xl src/App/Extensions/GarmentOverride/Dynamic.cpp."
63
+ - id: cp2077.clothing.garments.root-entity-single-blank-appearance
64
+ claim: For a dynamic appearance, the ROOT ENTITY keeps exactly one entry in its `appearances` array,
65
+ named like the `entityName` in the yaml, with `appearanceName` left blank; the `.app` likewise
66
+ keeps one entry with that same name, has all its components deleted, and points at the mesh
67
+ entity. All variant logic then lives in the mesh entity file.
68
+ status: community
69
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", section "Summary" (TL;DR box) and
70
+ "How is this better than the old approach?" ("Dynamic variants put the logic into the `mesh
71
+ entity` file")'
72
+ tags:
73
+ - archivexl
74
+ - dynamic-appearance
75
+ - root-entity
76
+ - appearancename
77
+ detail: "Corrected 2026-09-07: the blank `appearanceName` belongs to the ROOT ENTITY, not to the
78
+ `.app` as previously recorded. \"Exactly one\" is the default shape, not a hard rule — the
79
+ page's \"_app: Three decals, one appearance, partsOverrides\" variant deliberately registers
80
+ three appearances in the root .ent and three in the .app."
81
+ - id: cp2077.clothing.garments.dynamicappearance-tag-required
82
+ claim: An appearance is declared dynamic by adding the `DynamicAppearance` tag to the visual tags in
83
+ its root entity — "You define an appearance as dynamic by adding the `DynamicAppearance` tag
84
+ to the visual tags in its root entity."
85
+ status: community
86
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", section "Prerequisites" (closing
87
+ paragraph) and section "Summary" (TL;DR box, root_entity step 1)'
88
+ tags:
89
+ - archivexl
90
+ - dynamic-appearance
91
+ - visual-tag
92
+ - required-field
93
+ detail: The page states the tag is how an appearance is declared dynamic; it does not separately
94
+ state what happens when the tag is omitted, so the previously recorded consequence
95
+ ("substitution logic is not applied") was removed on 2026-09-07 as unsourced.
96
+ - id: cp2077.clothing.garments.unvalidated-variant-crashes
97
+ claim: '"The game will crash if you tell it to load a mesh that does not exist" — a dynamic mesh
98
+ path substituted from a yaml value the user can edit is therefore a crash risk. The two
99
+ documented mitigations are to put all appearances in one `.mesh` and switch only
100
+ `meshAppearance`, or to keep separate meshes and hide the unwanted ones from the `.app` with
101
+ `partsOverrides` containing `componentOverrides` that set `chunkMask` to `0` and
102
+ `meshAppearance` to an empty string.'
103
+ status: community
104
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", section "Exercise 1: Other options"'
105
+ tags:
106
+ - archivexl
107
+ - dynamic-appearance
108
+ - crash
109
+ - silent-failure
110
+ - gotcha
111
+ detail: "Symptom: entering `semurai` instead of `samurai` in the yaml makes the game look for
112
+ `manavortex\\equipment\\torso_inner\\my_custom_shirt\\meshes\\t1_079_pwa_tshirt__casual_dec_s\
113
+ emurai.mesh` and crash. Corrected 2026-09-07: the crash comes from any single unresolvable
114
+ value, not from an invalid COMBINATION of values as previously recorded, and the page does not
115
+ frame it as a validation gap. `partsOverrides` can only hide components, never show them."
116
+ - id: cp2077.clothing.garments.dynamic-appearance-version-floors
117
+ claim: The dynamic-appearances guide's stated minimum tool versions are WolvenKit >= 8.11.0, TweakXL
118
+ >= 1.4.4, ArchiveXL >= 1.5.0 and Red4ext >= 1.17.0, plus Cyber Engine Tweaks for spawning
119
+ items. Dynamic variants themselves were added in ArchiveXL 1.13.
120
+ status: contradicted
121
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", section "Prerequisites" (bullet
122
+ list) and section "Summary" (opening paragraph, "via ArchiveXL (added in 1.13)") =
123
+ CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
124
+ modding-guides/items-equipment/adding-new-items/archivexl-dynamic-variants/README.md:12,61'
125
+ tags:
126
+ - archivexl
127
+ - dynamic-appearance
128
+ - version-floor
129
+ - wolvenkit
130
+ - tweakxl
131
+ - red4ext
132
+ detail: "Checked against the source (2026-09-08): the last sentence is wrong and the fact is retired
133
+ for it. The page contradicts itself — line 12 says dynamic variants were \"added in 1.13\"
134
+ while line 61 of the same page's Prerequisites lists \"ArchiveXL >= 1.5.0\". ArchiveXL's own
135
+ repository settles it: the dynamic appearance implementation
136
+ (src/App/Extensions/GarmentOverride/Dynamic.cpp, carrying DynamicAppearanceTag, the `!`
137
+ variant marker, the `&` condition marker and the gender/camera/body/feet attributes) is absent
138
+ at tag v1.4.1 and present at tag v1.5.0. Superseded by
139
+ cp2077.clothing.garments.dynamic-appearance-prerequisites, which keeps the prerequisite list
140
+ without the 1.13 figure; the version itself is
141
+ cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0. These are framework versions on
142
+ their own numbering, not a game version, so no `verified_on` is set on either."
143
+ - id: cp2077.clothing.garments.dynamic-appearance-prerequisites
144
+ claim: The dynamic-appearances guide's stated minimum tool versions are WolvenKit >= 8.11.0, TweakXL
145
+ >= 1.4.4, ArchiveXL >= 1.5.0 and Red4ext >= 1.17.0, plus Cyber Engine Tweaks for spawning
146
+ items.
147
+ status: community
148
+ supersedes: cp2077.clothing.garments.dynamic-appearance-version-floors
149
+ source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
150
+ modding-guides/items-equipment/adding-new-items/archivexl-dynamic-variants/README.md:61,
151
+ section "Prerequisites" (bullet list) — rendered as wiki.redmodding.org "ItemAdditions:
152
+ Dynamic Appearances"'
153
+ tags:
154
+ - archivexl
155
+ - dynamic-appearance
156
+ - version-floor
157
+ - wolvenkit
158
+ - tweakxl
159
+ - red4ext
160
+ detail: Framework versions on their own numbering, not a game version, so no `verified_on` is set.
161
+ The page spells it "Red4ext" and says to "get the most recent" rather than pinning these exact
162
+ builds. Replaces cp2077.clothing.garments.dynamic-appearance-version-floors, which added the
163
+ page's own contradictory "added in 1.13" sentence.
164
+ related:
165
+ - id: cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0
166
+ detail: "Agrees: the prerequisite floor of 1.5.0 on this page is the version at which ArchiveXL's
167
+ repository actually gains the dynamic-appearance implementation."
168
+ - id: cp2077.clothing.garments.gendered-appearance-name-suffix
169
+ claim: To support only one body gender without crashing for the other, each entry in the `.app`'s
170
+ `appearances` array gets `&gender=w` or `&gender=m` appended to its `name` field, making it a
171
+ conditional appearance.
172
+ status: community
173
+ source: 'wiki.redmodding.org "ItemAdditions: Dynamic Appearances", section "1.2 Removing a body
174
+ gender" (steps 3-4)'
175
+ tags:
176
+ - archivexl
177
+ - dynamic-appearance
178
+ - gender
179
+ - appearance-name
180
+ - syntax
181
+ detail: "The reason given is that once the unsupported gender's meshes are deleted and its component
182
+ paths de-dynamised, \"the game will crash if the item is equipped by the unsupported body
183
+ gender\". Conditional appearance names outrank plainer ones: \"ArchiveXL: Suffixes and
184
+ Substitutions\" ranks `my_item!variant&camera=tpp` (1) above `my_item!variant` (2) above
185
+ `my_item&gender=w&camera=tpp` (3) above `my_item` (5)."
186
+ - id: cp2077.clothing.garments.visual-tags-are-case-sensitive
187
+ claim: Visual tags are applied by adding them to the `visualTags` property of an appearance
188
+ definition or to the `visualTagsSchema` of a root entity template, and "Tags are
189
+ case-sensitive!".
190
+ status: community
191
+ source: 'wiki.redmodding.org "ArchiveXL: Tags", section "What do tags do?" (warning and danger hints)'
192
+ tags:
193
+ - archivexl
194
+ - visual-tags
195
+ - case-sensitive
196
+ - silent-failure
197
+ detail: The page states case sensitivity as a rule; it does not describe the failure mode, so the
198
+ previously recorded "silently does not apply" was removed on 2026-09-07.
199
+ - id: cp2077.clothing.garments.vanilla-hide-tags-by-slot
200
+ claim: "The base-game hide tags hide the ITEM in a named equipment slot, not the body part:
201
+ `hide_H1` (Head), `hide_F1` (Eyes), `hide_T1` (Chest), `hide_T2` (Torso), `hide_L1` (Legs),
202
+ `hide_S1` (Feet). Alongside them, `hide_Hair` hides hair, `hide_Genitals` hides genitals in
203
+ uncensored mode and underwear in censored mode, and `hide_T1part` toggles the partial suffix
204
+ (`&Full` -> `&Part`) when applied to a `Torso` item."
205
+ status: community
206
+ source: 'wiki.redmodding.org "ArchiveXL: Tags", section "Base game tags" (tag table)'
207
+ tags:
208
+ - visual-tags
209
+ - hide-tag
210
+ - slot
211
+ - base-game
212
+ detail: 'Corrected 2026-09-07: the previous claim wrote the set as a contiguous "hide_H1 through
213
+ hide_S1" range over head/eyes/chest/torso/legs/feet and omitted the actual tag names
214
+ `hide_F1`, `hide_T1`, `hide_T2` and `hide_L1`; it also described them as hiding body parts.
215
+ `hide_T1part` pairs with `itemsFactoryAppearanceSuffix.Partial`, which searches the root
216
+ entity for `&Full` or `&Part`.'
217
+ - id: cp2077.clothing.garments.archivexl-fine-grained-hide-tags
218
+ claim: "ArchiveXL adds body-region hide tags beyond the vanilla slot set: `hide_Head`, `hide_Torso`
219
+ (0, 1, 2), `hide_LowerAbdomen` (3), `hide_UpperAbdomen` (2), `hide_CollarBone` (1),
220
+ `hide_Arms` (whole arms including hands), `hide_Thighs` (4), `hide_Calves` (5), `hide_Ankles`
221
+ (6), `hide_Feet` (7), `hide_Legs` (entire legs including feet, 4, 5, 6, 7). The same table
222
+ carries `AppearanceParts`, which goes into the .app file and enables `partsValues` for
223
+ non-player-equipment."
224
+ status: community
225
+ source: 'wiki.redmodding.org "ArchiveXL: Tags", section "ArchiveXL tags" (tag table)'
226
+ tags:
227
+ - archivexl
228
+ - visual-tags
229
+ - hide-tag
230
+ - appearanceparts
231
+ detail: There is no tag for partially hiding default arms or cyberarms; the page points at
232
+ chunkmasks or custom tags for that. Section name corrected 2026-09-07 (the heading is
233
+ "ArchiveXL tags", not "ArchiveXL Visual Tags").
234
+ - id: cp2077.clothing.garments.custom-tag-declared-in-xl-not-yaml
235
+ claim: "A custom tag's effect on component chunk masks is declared \"in your `.xl` file (not in your
236
+ `.yaml`!)\" as `overrides: tags: <tag_name>: <component_name>: {show: [0, 1, 2, 3]}` (or
237
+ `{hide: [...]}`), and the tag is then added to the appearance's tags array. Unique component
238
+ names are mandatory for this, since the override matches on component name alone."
239
+ status: community
240
+ source: 'wiki.redmodding.org "ArchiveXL: Tags", sections "Adding Custom tags" (danger hint) and
241
+ "Adding Custom tags > Registering the tag" / "Connecting the tag with the item"'
242
+ tags:
243
+ - archivexl
244
+ - visual-tags
245
+ - manifest
246
+ - xl
247
+ - custom-tag
248
+ detail: "The page's stated reason for custom tags over `partsOverrides` is that partsOverrides can
249
+ only hide components, never un-hide them. Its own example pairs `my_custom_unhiding_tag` with
250
+ `{show: ...}` and `my_HideSeamfix` on `t0_000_pma_base__full_seamfix` with `{hide: ...}`.
251
+ Advice for uniqueness: include your modder name in component names."
252
+ - id: cp2077.clothing.garments.heel-state-tags-need-foot-base
253
+ claim: "`HighHeels` turns the current (shoe) item into high heels and `FlatShoes` turns it into flat
254
+ shoes; `force_FlatFeet` forces female V's feet to be flat. All three require a foot item as
255
+ the `$base` in the item's `.yaml`."
256
+ status: community
257
+ source: 'wiki.redmodding.org "ArchiveXL: Tags", section "ArchiveXL tags" (`HighHeels`, `FlatShoes`)
258
+ and section "Root entity tags" (`force_FlatFeet`)'
259
+ tags:
260
+ - archivexl
261
+ - visual-tags
262
+ - footwear
263
+ - high-heels
264
+ - root-entity
265
+ detail: 'Split out of a combined footwear+hair fact on 2026-09-07, and the previous wording
266
+ "suppresses the heel-posture animation regardless of equipped footwear" corrected — the tag is
267
+ gated on a foot `$base`. Gotcha the page flags: `force_FlatFeet` turns feet INVISIBLE for
268
+ mascV unless the user has switch feet installed, so apply it to a conditional appearance in
269
+ the .app (`&gender=m`). `HighHeels`/`FlatShoes` sit in the ArchiveXL tag table, not under
270
+ "Root entity tags".'
271
+ - id: cp2077.clothing.garments.force-hair-tag
272
+ claim: Head items turn hair invisible by default; adding `force_Hair` to the root entity overrides
273
+ that and forces hair to show up while a head item is worn.
274
+ status: community
275
+ source: 'wiki.redmodding.org "ArchiveXL: Tags", section "Root entity tags"'
276
+ tags:
277
+ - archivexl
278
+ - visual-tags
279
+ - hair
280
+ - root-entity
281
+ detail: 'Split out of a combined footwear+hair fact on 2026-09-07. The same section lists
282
+ footstep-sound tags for the root entity — `Boots`, `Heels`, `Sneakers`, `Stilettos`,
283
+ `Metal_feet` — under "Footsteps: Setting footwear sounds".'