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.
- package/LICENSE +35 -0
- package/README.md +212 -0
- package/assets/claude/agents/mw-explore.md +46 -0
- package/assets/claude/agents/mw-fixture.md +33 -0
- package/assets/claude/agents/mw-rule-author.md +51 -0
- package/assets/claude/agents/mw-scaffold-author.md +48 -0
- package/assets/claude/skills/mw-author.md +59 -0
- package/assets/claude/skills/mw-new-item.md +51 -0
- package/assets/claude/skills/mw-new-spell.md +50 -0
- package/assets/claude/skills/mw-scaffold.md +59 -0
- package/assets/claude/skills/mw-ship.md +57 -0
- package/assets/claude/skills/mw-validate.md +51 -0
- package/assets/claude/skills/mw-verify.md +59 -0
- package/assets/nivalisnights/extract_resources.py +177 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
- package/bridges/bg3-se/README.md +99 -0
- package/bridges/bg3-se/bridge.json +68 -0
- package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
- package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
- package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
- package/bridges/cp2077-cet/README.md +165 -0
- package/bridges/cp2077-cet/bridge.json +53 -0
- package/dist/core/bridge/arm.js +175 -0
- package/dist/core/bridge/cet-console.js +26 -0
- package/dist/core/bridge/cet-log.js +362 -0
- package/dist/core/bridge/index.js +11 -0
- package/dist/core/bridge/locate.js +35 -0
- package/dist/core/bridge/paths.js +34 -0
- package/dist/core/bridge/pending.js +89 -0
- package/dist/core/bridge/poll.js +155 -0
- package/dist/core/bridge/stage.js +100 -0
- package/dist/core/bridge/status.js +97 -0
- package/dist/core/bridge/types.js +145 -0
- package/dist/core/bridge/validate.js +107 -0
- package/dist/core/build/index.js +6 -0
- package/dist/core/build/manifest.js +47 -0
- package/dist/core/build/paths.js +32 -0
- package/dist/core/build/run.js +342 -0
- package/dist/core/build/stage.js +265 -0
- package/dist/core/build/steps/bg3.js +129 -0
- package/dist/core/build/steps/core.js +195 -0
- package/dist/core/build/steps/cyberpunk.js +95 -0
- package/dist/core/build/steps/listing.js +35 -0
- package/dist/core/build/types.js +13 -0
- package/dist/core/build/zip.js +148 -0
- package/dist/core/compat/check.js +113 -0
- package/dist/core/compat/pe.js +220 -0
- package/dist/core/compat/types.js +1 -0
- package/dist/core/compat/version.js +70 -0
- package/dist/core/deploy/guards.js +292 -0
- package/dist/core/deploy/index.js +5 -0
- package/dist/core/deploy/plan.js +696 -0
- package/dist/core/deploy/reload-apply.js +361 -0
- package/dist/core/deploy/reload.js +358 -0
- package/dist/core/deploy/sources.js +169 -0
- package/dist/core/deploy/types.js +1 -0
- package/dist/core/epic.js +54 -0
- package/dist/core/fsutil.js +191 -0
- package/dist/core/home.js +70 -0
- package/dist/core/knowledge/facts.js +229 -0
- package/dist/core/knowledge/index.js +4 -0
- package/dist/core/knowledge/search.js +112 -0
- package/dist/core/knowledge/store.js +123 -0
- package/dist/core/knowledge/types.js +1 -0
- package/dist/core/ledger/check.js +42 -0
- package/dist/core/ledger/hooks.js +80 -0
- package/dist/core/ledger/index.js +7 -0
- package/dist/core/ledger/query.js +17 -0
- package/dist/core/ledger/record.js +84 -0
- package/dist/core/ledger/status.js +53 -0
- package/dist/core/ledger/store.js +98 -0
- package/dist/core/ledger/types.js +108 -0
- package/dist/core/logs/index.js +4 -0
- package/dist/core/logs/registry.js +50 -0
- package/dist/core/logs/scan.js +195 -0
- package/dist/core/logs/triage.js +160 -0
- package/dist/core/logs/types.js +1 -0
- package/dist/core/lsx.js +10 -0
- package/dist/core/lz4.js +66 -0
- package/dist/core/mods.js +229 -0
- package/dist/core/process.js +49 -0
- package/dist/core/project/build-steps.js +83 -0
- package/dist/core/project/describe.js +74 -0
- package/dist/core/project/index.js +5 -0
- package/dist/core/project/load.js +146 -0
- package/dist/core/project/schema.js +264 -0
- package/dist/core/project/types.js +3 -0
- package/dist/core/prompts.js +72 -0
- package/dist/core/registry.js +35 -0
- package/dist/core/safety/backup.js +206 -0
- package/dist/core/safety/execute.js +188 -0
- package/dist/core/safety/index.js +5 -0
- package/dist/core/safety/plan.js +122 -0
- package/dist/core/safety/restore.js +172 -0
- package/dist/core/safety/types.js +1 -0
- package/dist/core/scaffold/bootstrap.js +7 -0
- package/dist/core/scaffold/catalog.js +28 -0
- package/dist/core/scaffold/claude-assets.js +271 -0
- package/dist/core/scaffold/collisions.js +64 -0
- package/dist/core/scaffold/emit.js +356 -0
- package/dist/core/scaffold/engine.js +680 -0
- package/dist/core/scaffold/ids.js +78 -0
- package/dist/core/scaffold/index.js +10 -0
- package/dist/core/scaffold/jsonpath.js +121 -0
- package/dist/core/scaffold/load.js +81 -0
- package/dist/core/scaffold/render.js +85 -0
- package/dist/core/scaffold/sequence.js +396 -0
- package/dist/core/scaffold/types.js +309 -0
- package/dist/core/steam.js +63 -0
- package/dist/core/surfaceutil.js +36 -0
- package/dist/core/testplan/check.js +67 -0
- package/dist/core/testplan/index.js +5 -0
- package/dist/core/testplan/load.js +100 -0
- package/dist/core/testplan/registry.js +317 -0
- package/dist/core/testplan/run.js +389 -0
- package/dist/core/testplan/types.js +82 -0
- package/dist/core/text/converters/bg3.js +50 -0
- package/dist/core/text/converters/cyberpunk.js +36 -0
- package/dist/core/text/converters/index.js +261 -0
- package/dist/core/text/diff/cr2w.js +180 -0
- package/dist/core/text/diff/index.js +16 -0
- package/dist/core/text/diff/loca.js +43 -0
- package/dist/core/text/diff/lsx.js +126 -0
- package/dist/core/text/handles.js +86 -0
- package/dist/core/text/index.js +6 -0
- package/dist/core/text/json.js +46 -0
- package/dist/core/text/templates/cache.js +71 -0
- package/dist/core/text/templates/index.js +3 -0
- package/dist/core/text/templates/library.js +245 -0
- package/dist/core/text/templates/types.js +51 -0
- package/dist/core/text/toolchain.js +16 -0
- package/dist/core/text/types.js +1 -0
- package/dist/core/text/validate.js +149 -0
- package/dist/core/text/xml.js +58 -0
- package/dist/core/toolchain/datafetch.js +151 -0
- package/dist/core/toolchain/env.js +63 -0
- package/dist/core/toolchain/features.js +170 -0
- package/dist/core/toolchain/index.js +8 -0
- package/dist/core/toolchain/install.js +191 -0
- package/dist/core/toolchain/locate.js +275 -0
- package/dist/core/toolchain/remember.js +84 -0
- package/dist/core/toolchain/run.js +318 -0
- package/dist/core/toolchain/specs.js +351 -0
- package/dist/core/toolchain/types.js +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/userconfig.js +66 -0
- package/dist/core/validate/context.js +139 -0
- package/dist/core/validate/index.js +5 -0
- package/dist/core/validate/registry.js +58 -0
- package/dist/core/validate/run.js +131 -0
- package/dist/core/validate/suppressions.js +91 -0
- package/dist/core/validate/types.js +2 -0
- package/dist/core/yamledit.js +51 -0
- package/dist/index.js +389 -0
- package/dist/server.js +1914 -0
- package/dist/surfaces/baldursgate3/compat.js +164 -0
- package/dist/surfaces/baldursgate3/identity.js +110 -0
- package/dist/surfaces/baldursgate3/index/build.js +331 -0
- package/dist/surfaces/baldursgate3/index/index.js +17 -0
- package/dist/surfaces/baldursgate3/index/info.js +40 -0
- package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
- package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
- package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
- package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
- package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
- package/dist/surfaces/baldursgate3/index/queries.js +327 -0
- package/dist/surfaces/baldursgate3/index/schema.js +62 -0
- package/dist/surfaces/baldursgate3/index.js +3 -0
- package/dist/surfaces/baldursgate3/logs.js +278 -0
- package/dist/surfaces/baldursgate3/modsettings.js +115 -0
- package/dist/surfaces/baldursgate3/pak.js +153 -0
- package/dist/surfaces/baldursgate3/settings.js +49 -0
- package/dist/surfaces/baldursgate3/surface.js +232 -0
- package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
- package/dist/surfaces/baldursgate3/validators/files.js +476 -0
- package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
- package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
- package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
- package/dist/surfaces/baldursgate3/validators/story.js +790 -0
- package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/compat.js +223 -0
- package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
- package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
- package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
- package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
- package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
- package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
- package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
- package/dist/surfaces/cyberpunk2077/index.js +3 -0
- package/dist/surfaces/cyberpunk2077/logs.js +742 -0
- package/dist/surfaces/cyberpunk2077/paths.js +12 -0
- package/dist/surfaces/cyberpunk2077/surface.js +218 -0
- package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
- package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
- package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
- package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
- package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
- package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
- package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
- package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
- package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
- package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
- package/dist/surfaces/eldenring/binders.js +111 -0
- package/dist/surfaces/eldenring/compat.js +166 -0
- package/dist/surfaces/eldenring/dcx.js +49 -0
- package/dist/surfaces/eldenring/index.js +13 -0
- package/dist/surfaces/eldenring/loaders.js +132 -0
- package/dist/surfaces/eldenring/logs.js +67 -0
- package/dist/surfaces/eldenring/paramdef.js +256 -0
- package/dist/surfaces/eldenring/params.js +129 -0
- package/dist/surfaces/eldenring/surface.js +121 -0
- package/dist/surfaces/eldenring/tools.js +52 -0
- package/dist/surfaces/eldenring/validators/binders.js +193 -0
- package/dist/surfaces/eldenring/validators/packages.js +159 -0
- package/dist/surfaces/eldenring/validators/params.js +334 -0
- package/dist/surfaces/eldenring/validators/profiles.js +287 -0
- package/dist/surfaces/index.js +34 -0
- package/dist/surfaces/nivalisnights/compat.js +229 -0
- package/dist/surfaces/nivalisnights/index/build.js +310 -0
- package/dist/surfaces/nivalisnights/index/index.js +5 -0
- package/dist/surfaces/nivalisnights/index/queries.js +231 -0
- package/dist/surfaces/nivalisnights/index.js +4 -0
- package/dist/surfaces/nivalisnights/logs.js +473 -0
- package/dist/surfaces/nivalisnights/surface.js +195 -0
- package/dist/surfaces/skyrimse/archives.js +229 -0
- package/dist/surfaces/skyrimse/compat.js +163 -0
- package/dist/surfaces/skyrimse/index.js +12 -0
- package/dist/surfaces/skyrimse/loadorder.js +174 -0
- package/dist/surfaces/skyrimse/logs.js +241 -0
- package/dist/surfaces/skyrimse/plugins.js +149 -0
- package/dist/surfaces/skyrimse/records.js +94 -0
- package/dist/surfaces/skyrimse/surface.js +240 -0
- package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
- package/dist/surfaces/skyrimse/validators/archives.js +110 -0
- package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
- package/dist/surfaces/skyrimse/validators/records.js +117 -0
- package/dist/surfaces/stardewvalley/compat.js +190 -0
- package/dist/surfaces/stardewvalley/config.js +42 -0
- package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
- package/dist/surfaces/stardewvalley/index/index.js +229 -0
- package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
- package/dist/surfaces/stardewvalley/index.js +12 -0
- package/dist/surfaces/stardewvalley/logs.js +307 -0
- package/dist/surfaces/stardewvalley/mods.js +182 -0
- package/dist/surfaces/stardewvalley/surface.js +244 -0
- package/dist/surfaces/stardewvalley/validators/content.js +321 -0
- package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
- package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
- package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
- package/dist/surfaces/subnautica2/compat.js +138 -0
- package/dist/surfaces/subnautica2/index.js +5 -0
- package/dist/surfaces/subnautica2/logs.js +129 -0
- package/dist/surfaces/subnautica2/paks.js +173 -0
- package/dist/surfaces/subnautica2/surface.js +151 -0
- package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
- package/dist/surfaces/valheim/compat.js +171 -0
- package/dist/surfaces/valheim/index/index.js +301 -0
- package/dist/surfaces/valheim/index/tables.js +103 -0
- package/dist/surfaces/valheim/index.js +11 -0
- package/dist/surfaces/valheim/logs.js +197 -0
- package/dist/surfaces/valheim/packaging.js +131 -0
- package/dist/surfaces/valheim/plugins.js +270 -0
- package/dist/surfaces/valheim/references.js +121 -0
- package/dist/surfaces/valheim/surface.js +223 -0
- package/dist/surfaces/valheim/validators/packaging.js +218 -0
- package/dist/surfaces/valheim/validators/plugins.js +287 -0
- package/dist/surfaces/valheim/validators/references.js +169 -0
- package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
- package/knowledge/baldursgate3/audio.voice.yaml +182 -0
- package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
- package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
- package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
- package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
- package/knowledge/baldursgate3/crash.causes.yaml +90 -0
- package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
- package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
- package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
- package/knowledge/baldursgate3/dialogue.yaml +122 -0
- package/knowledge/baldursgate3/feats.classes.yaml +164 -0
- package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
- package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
- package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
- package/knowledge/baldursgate3/journal.quests.yaml +214 -0
- package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
- package/knowledge/baldursgate3/localization.handles.yaml +92 -0
- package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
- package/knowledge/baldursgate3/origins.companions.yaml +144 -0
- package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
- package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
- package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
- package/knowledge/baldursgate3/process.launch.yaml +34 -0
- package/knowledge/baldursgate3/progressions.yaml +92 -0
- package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
- package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
- package/knowledge/baldursgate3/races.progression.yaml +228 -0
- package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
- package/knowledge/baldursgate3/scriptextender.yaml +252 -0
- package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
- package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
- package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
- package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
- package/knowledge/baldursgate3/stats.spells.yaml +293 -0
- package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
- package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
- package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
- package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
- package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
- package/knowledge/baldursgate3/ui.icons.yaml +412 -0
- package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
- package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
- package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
- package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
- package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
- package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
- package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
- package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
- package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
- package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
- package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
- package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
- package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
- package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
- package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
- package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
- package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
- package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
- package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
- package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
- package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
- package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
- package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
- package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
- package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
- package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
- package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
- package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
- package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
- package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
- package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
- package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
- package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
- package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
- package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
- package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
- package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
- package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
- package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
- package/knowledge/cyberpunk2077/player.control.yaml +918 -0
- package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
- package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
- package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
- package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
- package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
- package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
- package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
- package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
- package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
- package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
- package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
- package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
- package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
- package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
- package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
- package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
- package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
- package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
- package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
- package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
- package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
- package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
- package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
- package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
- package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
- package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
- package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
- package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
- package/knowledge/eldenring/formats.binders.yaml +237 -0
- package/knowledge/eldenring/launcher.me3.yaml +230 -0
- package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
- package/knowledge/eldenring/params.paramdef.yaml +149 -0
- package/knowledge/eldenring/params.regulation.yaml +142 -0
- package/knowledge/eldenring/saves.online.yaml +118 -0
- package/knowledge/eldenring/toolchain.cli.yaml +256 -0
- package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
- package/knowledge/skyrimse/archives.bsa.yaml +212 -0
- package/knowledge/skyrimse/install.detection.yaml +41 -0
- package/knowledge/skyrimse/loadorder.files.yaml +242 -0
- package/knowledge/skyrimse/plugins.esl.yaml +189 -0
- package/knowledge/skyrimse/plugins.format.yaml +224 -0
- package/knowledge/skyrimse/skse.runtime.yaml +283 -0
- package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
- package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
- package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
- package/knowledge/stardewvalley/game.versions.yaml +202 -0
- package/knowledge/stardewvalley/install.layout.yaml +277 -0
- package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
- package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
- package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
- package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
- package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
- package/knowledge/subnautica2/game.build.yaml +331 -0
- package/knowledge/subnautica2/modding.state.yaml +210 -0
- package/knowledge/subnautica2/ue5.containers.yaml +72 -0
- package/knowledge/subnautica2/ue5.paks.yaml +203 -0
- package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
- package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
- package/knowledge/valheim/bepinex.loader.yaml +247 -0
- package/knowledge/valheim/bepinex.plugins.yaml +251 -0
- package/knowledge/valheim/game.versions.yaml +321 -0
- package/knowledge/valheim/install.layout.yaml +216 -0
- package/knowledge/valheim/jotunn.library.yaml +334 -0
- package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
- package/knowledge/valheim/toolchain.build.yaml +111 -0
- package/package.json +29 -0
- package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
- package/scaffolds/baldursgate3/new-item.yaml +264 -0
- package/scaffolds/baldursgate3/new-mod.yaml +174 -0
- package/scaffolds/baldursgate3/new-passive.yaml +100 -0
- package/scaffolds/baldursgate3/new-project.yaml +118 -0
- package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
- package/scaffolds/baldursgate3/new-spell.yaml +102 -0
- package/scaffolds/baldursgate3/new-status.yaml +119 -0
- package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
- package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
- package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
- package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
- package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
- package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
- package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
- package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
- package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
- package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
- package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
- package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
- package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
- package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
- package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
- package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
- package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
- package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
- package/scaffolds/stardewvalley/new-project.yaml +184 -0
- package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
- package/scripts/mw-tool.mjs +184 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
game: valheim
|
|
2
|
+
topic: thunderstore.packaging
|
|
3
|
+
title: Thunderstore packaging, tcli, and the r2modman profile as a second deploy target
|
|
4
|
+
facts:
|
|
5
|
+
- id: valheim.thunderstore.packaging.required-zip-contents
|
|
6
|
+
claim: A Thunderstore package is a zip whose root contains exactly three required files —
|
|
7
|
+
`manifest.json`, `icon.png` and `README.md` — and the docs state "File naming is
|
|
8
|
+
case-sensitive and must match the above exactly!". `icon.png` "must be exactly 256x256 in
|
|
9
|
+
resolution and in PNG format". `CHANGELOG.md` is optional but supported.
|
|
10
|
+
status: community
|
|
11
|
+
source: https://wiki.thunderstore.io/mods/creating-a-package ; CHANGELOG.md from
|
|
12
|
+
https://wiki.thunderstore.io/mods/updating-a-package
|
|
13
|
+
tags:
|
|
14
|
+
- thunderstore
|
|
15
|
+
- packaging
|
|
16
|
+
- manifest
|
|
17
|
+
- icon
|
|
18
|
+
- readme
|
|
19
|
+
- validator
|
|
20
|
+
- build
|
|
21
|
+
detail: "All four of these are checkable from a mod folder with no game installed: the three files
|
|
22
|
+
exist at the zip root, the names are exactly cased, and the PNG's IHDR says 256x256. That
|
|
23
|
+
makes packaging the single cheapest validator family to build for this game."
|
|
24
|
+
- id: valheim.thunderstore.packaging.manifest-fields
|
|
25
|
+
claim: '`manifest.json` carries five fields. `name` — "no spaces. Allowed characters: a-z A-Z 0-9
|
|
26
|
+
_", max 128 characters. `description` — max 250 characters. `version_number` — the
|
|
27
|
+
three-number `Major.Minor.Patch` semantic version, no suffixes. `dependencies` — a list of
|
|
28
|
+
strings. `website_url` — optional, but an empty string must still be present.'
|
|
29
|
+
status: community
|
|
30
|
+
source: https://wiki.thunderstore.io/mods/creating-a-package
|
|
31
|
+
tags:
|
|
32
|
+
- thunderstore
|
|
33
|
+
- manifest
|
|
34
|
+
- schema
|
|
35
|
+
- validator
|
|
36
|
+
- version
|
|
37
|
+
detail: Each number is a full integer compared ordinally, so `1.0.10` is nine patches above `1.0.1`,
|
|
38
|
+
not below it — a real source of mis-ordered releases. Thunderstore always displays the highest
|
|
39
|
+
version regardless of upload date. Underscores in `name` render as spaces in most views.
|
|
40
|
+
- id: valheim.thunderstore.packaging.dependency-string-format
|
|
41
|
+
claim: Every entry in `dependencies` is a single string of the form `{team name}-{package
|
|
42
|
+
name}-{package version}`, e.g. `MythicManiac-TestMod-1.1.0`; the mod managers install these
|
|
43
|
+
automatically.
|
|
44
|
+
status: community
|
|
45
|
+
source: https://wiki.thunderstore.io/mods/creating-a-package
|
|
46
|
+
tags:
|
|
47
|
+
- thunderstore
|
|
48
|
+
- dependencies
|
|
49
|
+
- format
|
|
50
|
+
- validator
|
|
51
|
+
detail: "The three-part hyphenated form is parseable but ambiguous in principle — team and package
|
|
52
|
+
names may themselves contain no hyphen, since the allowed character set is `a-z A-Z 0-9 _`, so
|
|
53
|
+
splitting on the last two hyphens is safe. A real Valheim example: Jötunn's own manifest
|
|
54
|
+
depends on exactly one package, `denikson-BepInExPack_Valheim-5.4.2333`."
|
|
55
|
+
- id: valheim.thunderstore.packaging.versions-are-immutable
|
|
56
|
+
claim: A published version can never be re-uploaded or edited — "Package versions are immutable!
|
|
57
|
+
Once a version is successfully uploaded, it can no longer be edited", for conflict-freeness
|
|
58
|
+
and caching reasons. Updating means keeping `name` identical and incrementing
|
|
59
|
+
`version_number`.
|
|
60
|
+
status: community
|
|
61
|
+
source: https://wiki.thunderstore.io/mods/updating-a-package
|
|
62
|
+
tags:
|
|
63
|
+
- thunderstore
|
|
64
|
+
- publishing
|
|
65
|
+
- immutable
|
|
66
|
+
- version
|
|
67
|
+
detail: "This makes a pre-publish validator worth strictly more here than on a platform that allows
|
|
68
|
+
replacing a file: a bad `manifest.json` that reaches Thunderstore is permanent and can only be
|
|
69
|
+
superseded, never fixed."
|
|
70
|
+
- id: valheim.thunderstore.packaging.bepinex-folder-routing
|
|
71
|
+
claim: Thunderstore's mod managers only preserve folder structure inside specifically named folders
|
|
72
|
+
— `BepInEx/plugins`, `/core`, `/patchers`, `/monomod` and `/config` — and the `BepInEx` prefix
|
|
73
|
+
may be omitted; contents of any other folder are flattened on install.
|
|
74
|
+
status: community
|
|
75
|
+
source: https://wiki.thunderstore.io/mods/packaging-your-mods
|
|
76
|
+
tags:
|
|
77
|
+
- thunderstore
|
|
78
|
+
- packaging
|
|
79
|
+
- bepinex
|
|
80
|
+
- routing
|
|
81
|
+
- layout
|
|
82
|
+
- build
|
|
83
|
+
detail: "This is a build-step rule, not just advice: a package that puts its DLL under a folder name
|
|
84
|
+
outside that set installs as a loose file in an unpredictable place. A ModWright `build` for
|
|
85
|
+
this game should stage into exactly these routes."
|
|
86
|
+
- id: valheim.thunderstore.packaging.ecosystem-install-rules
|
|
87
|
+
claim: "Thunderstore's ecosystem schema declares Valheim's install routes explicitly:
|
|
88
|
+
`BepInEx/plugins` (default location, default extension `.dll`, tracking method `subdir`),
|
|
89
|
+
`BepInEx/core`, `BepInEx/patchers`, `BepInEx/monomod` (default extension `.mm.dll`),
|
|
90
|
+
`BepInEx/SlimVML` — all `subdir` — and `BepInEx/config` with tracking method `none`."
|
|
91
|
+
status: community
|
|
92
|
+
source: https://github.com/thunderstore-io/ecosystem-schema/blob/main/games/data/generated/valheim.yml,
|
|
93
|
+
the `installRules` list (identical for the game and the dedicated server)
|
|
94
|
+
tags:
|
|
95
|
+
- thunderstore
|
|
96
|
+
- install-rules
|
|
97
|
+
- modroots
|
|
98
|
+
- conflictscope
|
|
99
|
+
- config
|
|
100
|
+
detail: "That `subdir` versus `none` distinction is exactly ModWright's `conflictScope`: a `subdir`
|
|
101
|
+
route gives every package its own directory (`isolated`), while `config` is tracked as `none`
|
|
102
|
+
because config files are loose, shared and merged across mods (`merged`). Having the ecosystem
|
|
103
|
+
schema state it removes the guesswork from the roots table."
|
|
104
|
+
- id: valheim.thunderstore.packaging.tcli-does-not-compile
|
|
105
|
+
claim: '`tcli` (thunderstore-cli, latest release 0.2.5, 2025-12-16; installable with `dotnet tool
|
|
106
|
+
install -g tcli`) builds and publishes packages from a `thunderstore.toml` config: `tcli init`
|
|
107
|
+
writes the config plus a default icon and README, `tcli build` zips the project per the
|
|
108
|
+
`[[build.copy]]` mappings, and `tcli publish` uploads. It explicitly does not compile code —
|
|
109
|
+
"any actual build actions ... must be performed separately".'
|
|
110
|
+
status: community
|
|
111
|
+
source: https://github.com/thunderstore-io/thunderstore-cli (README and wiki); version from the
|
|
112
|
+
repository's releases
|
|
113
|
+
tags:
|
|
114
|
+
- tcli
|
|
115
|
+
- thunderstore
|
|
116
|
+
- toolchain
|
|
117
|
+
- build
|
|
118
|
+
- packaging
|
|
119
|
+
- dotnet
|
|
120
|
+
detail: "That division is a clean fit for ModWright's `core/toolchain` and `core/build`: `dotnet
|
|
121
|
+
build` is one tool spec producing the DLL, `tcli build` is a second producing the zip, and the
|
|
122
|
+
staging between them is ModWright's own. The NuGet-distributed `tcli` excludes mod
|
|
123
|
+
installation; the standalone GitHub release includes it."
|
|
124
|
+
- id: valheim.thunderstore.packaging.thunderstore-toml-dependency-shape-differs
|
|
125
|
+
claim: "`thunderstore.toml`'s `[package.dependencies]` is a TOML table mapping `\"Namespace-Name\" =
|
|
126
|
+
\"version\"`, which is a *different* shape from `manifest.json`'s flat
|
|
127
|
+
`\"Namespace-Name-version\"` strings; tcli assembles the manifest from the toml."
|
|
128
|
+
status: inferred
|
|
129
|
+
source: "`ThunderstoreCLI/Models/ThunderstoreProject.cs` in
|
|
130
|
+
https://github.com/thunderstore-io/thunderstore-cli, compared against
|
|
131
|
+
https://wiki.thunderstore.io/mods/creating-a-package"
|
|
132
|
+
tags:
|
|
133
|
+
- tcli
|
|
134
|
+
- thunderstore
|
|
135
|
+
- toml
|
|
136
|
+
- manifest
|
|
137
|
+
- dependencies
|
|
138
|
+
- validator
|
|
139
|
+
detail: A validator must therefore know which file it is looking at. Checking a `thunderstore.toml`
|
|
140
|
+
dependency against the `manifest.json` three-part regex would reject every correct entry, and
|
|
141
|
+
vice versa.
|
|
142
|
+
- id: valheim.thunderstore.packaging.r2modman-profile-path
|
|
143
|
+
claim: An r2modman profile lives at `<ROOT>/<internalFolderName>/profiles/<ProfileName>`, where
|
|
144
|
+
`ROOT` is the user's configured data directory or, by default, `<Electron
|
|
145
|
+
appData>/r2modmanPlus-local` — on Windows `%APPDATA%\r2modmanPlus-local`. Valheim's
|
|
146
|
+
`internalFolderName` is `Valheim`, so the default Windows profile path is
|
|
147
|
+
`%APPDATA%\r2modmanPlus-local\Valheim\profiles\Default`.
|
|
148
|
+
status: inferred
|
|
149
|
+
source: r2modmanPlus `src/App.vue` (`PathResolver.APPDATA_DIR = path.join(appData,
|
|
150
|
+
'r2modmanPlus-local')`), `src/model/game/GameManager.ts` (`MOD_ROOT = path.join(ROOT,
|
|
151
|
+
game.internalFolderName)`), `src/model/Profile.ts` (`path.join(MOD_ROOT, 'profiles')`), and
|
|
152
|
+
`src/assets/data/ecosystem.json` for `internalFolderName`
|
|
153
|
+
tags:
|
|
154
|
+
- r2modman
|
|
155
|
+
- profile
|
|
156
|
+
- path
|
|
157
|
+
- deploy
|
|
158
|
+
- modroots
|
|
159
|
+
- windows
|
|
160
|
+
detail: The r2modman wiki documents profile export and import but not the on-disk layout, so this is
|
|
161
|
+
read from source, not prose. The user-configurable data directory means the path must be
|
|
162
|
+
treated as a candidate rather than a constant — a Valheim surface should probe it and say "not
|
|
163
|
+
found" rather than assert it.
|
|
164
|
+
- id: valheim.thunderstore.packaging.r2modman-profile-is-a-whole-bepinex-install
|
|
165
|
+
claim: r2modman's BepInEx installer copies everything from the BepInEx package root into the profile
|
|
166
|
+
root except `manifest.json`, `readme.md` and `icon.png`, so a Valheim profile directory
|
|
167
|
+
contains a complete BepInEx install — `BepInEx/` with `core`, `plugins`, `config` and
|
|
168
|
+
`patchers`, plus `winhttp.dll` and `doorstop_config.ini` — living entirely outside the game
|
|
169
|
+
directory.
|
|
170
|
+
status: inferred
|
|
171
|
+
source: r2modmanPlus `src/installers/BepInExInstaller.ts` (the `basePackageFiles` exclusion list),
|
|
172
|
+
combined with BepInExPack_Valheim's own shipped contents
|
|
173
|
+
tags:
|
|
174
|
+
- r2modman
|
|
175
|
+
- profile
|
|
176
|
+
- bepinex
|
|
177
|
+
- deploy
|
|
178
|
+
- alternate-root
|
|
179
|
+
detail: This is the reason a Valheim surface cannot assume mod roots are relative to the game
|
|
180
|
+
install. The same logical root — "BepInEx plugins" — resolves to two entirely different
|
|
181
|
+
absolute paths depending on how the user launches, and both can exist at once on one machine.
|
|
182
|
+
- id: valheim.thunderstore.packaging.r2modman-launches-via-doorstop-args
|
|
183
|
+
claim: r2modman does not copy anything into the game folder to activate a profile; it appends
|
|
184
|
+
Doorstop command-line arguments to the Steam launch. For Doorstop 3 that is `--doorstop-enable
|
|
185
|
+
true --doorstop-target <profile>/BepInEx/core/<preloader dll>` and for Doorstop 4
|
|
186
|
+
`--doorstop-enabled true --doorstop-target-assembly <profile>/BepInEx/core/<preloader dll>`; a
|
|
187
|
+
vanilla launch passes `--doorstop-enable false`.
|
|
188
|
+
status: inferred
|
|
189
|
+
source: r2modmanPlus
|
|
190
|
+
`src/r2mm/launching/instructions/instructions/loader/BepInExGameInstructions.ts`
|
|
191
|
+
(`genDoorstopV3` / `genDoorstopV4`)
|
|
192
|
+
tags:
|
|
193
|
+
- r2modman
|
|
194
|
+
- doorstop
|
|
195
|
+
- launch
|
|
196
|
+
- profile
|
|
197
|
+
- deploy
|
|
198
|
+
detail: Two consequences. A machine can have BepInEx installed in the game folder *and* several
|
|
199
|
+
r2modman profiles, and which one is live is decided at launch time by an argument ModWright
|
|
200
|
+
cannot see from the filesystem — so "which install is active" is genuinely undeterminable and
|
|
201
|
+
must be reported as such rather than guessed. And on Windows the profile is identified purely
|
|
202
|
+
by the absolute `--doorstop-target` path, with no profile-name argument to read back.
|
|
203
|
+
- id: valheim.thunderstore.packaging.nexus-is-the-second-channel
|
|
204
|
+
claim: "Thunderstore is not the only distribution channel for Valheim mods: Nexus Mods is the other
|
|
205
|
+
long-standing one, and the community's own 1.0 FAQ also names Hexium, reached through the Gale
|
|
206
|
+
mod manager, as a newer host."
|
|
207
|
+
status: community
|
|
208
|
+
source: https://github.com/Valheim-Modding/Wiki/wiki/Valheim-1.0-FAQ
|
|
209
|
+
tags:
|
|
210
|
+
- nexus
|
|
211
|
+
- thunderstore
|
|
212
|
+
- hexium
|
|
213
|
+
- gale
|
|
214
|
+
- distribution
|
|
215
|
+
detail: Only Thunderstore has a machine-readable package format with a documented schema, which is
|
|
216
|
+
why it is the only one a ModWright build step can target without scraping. Nexus is a manual
|
|
217
|
+
upload of an archive whose internal layout is by convention only.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
game: valheim
|
|
2
|
+
topic: toolchain.build
|
|
3
|
+
title: what builds and packs a Valheim plugin unattended, and what does not
|
|
4
|
+
facts:
|
|
5
|
+
- id: valheim.toolchain.build.dotnet-is-the-compiler-and-prints-a-bare-version
|
|
6
|
+
claim: A plugin is compiled with the .NET SDK's `dotnet build` (the wiki's environment guide targets
|
|
7
|
+
.NET Framework 4.8 through the SDK's msbuild), and `dotnet --version` prints the SDK version
|
|
8
|
+
alone on one line (e.g. `8.0.404`), which is the one tool in ModWright's catalogue with a real
|
|
9
|
+
installer and a fixed Program Files path.
|
|
10
|
+
status: community
|
|
11
|
+
source: https://learn.microsoft.com/dotnet/core/tools/dotnet
|
|
12
|
+
tags:
|
|
13
|
+
- dotnet
|
|
14
|
+
- sdk
|
|
15
|
+
- build
|
|
16
|
+
- version
|
|
17
|
+
- toolchain
|
|
18
|
+
- installer
|
|
19
|
+
detail: The toolchain spec `dotnet` probes `--version` and matches the leading dotted number; its
|
|
20
|
+
candidates are `C:/Program Files/dotnet/dotnet.exe` and PATH. Which SDK feature band a given
|
|
21
|
+
plugin needs is the project's business (`global.json`), not the spec's.
|
|
22
|
+
- id: valheim.toolchain.build.tcli-packs-but-does-not-compile
|
|
23
|
+
claim: tcli (thunderstore-cli) is installed as a global .NET tool (`dotnet tool install -g tcli`,
|
|
24
|
+
landing in `%USERPROFILE%\.dotnet\tools`) and drives `init`, `build` and `publish` from a
|
|
25
|
+
`thunderstore.toml`; it assembles manifest.json and the zip but performs no compilation — "the
|
|
26
|
+
build command only supports creation of zip files from files already existing on the
|
|
27
|
+
filesystem … any actual build actions (e.g. building the c# project for your mod) must be
|
|
28
|
+
performed separately". Its help output does list a `version` command and a `--version` flag on
|
|
29
|
+
every verb, but the shape of what they print has not been read from a run, so ModWright's spec
|
|
30
|
+
leaves version detection unset rather than guess at a pattern.
|
|
31
|
+
status: community
|
|
32
|
+
source: https://github.com/thunderstore-io/thunderstore-cli;
|
|
33
|
+
https://github.com/thunderstore-io/thunderstore-cli/wiki
|
|
34
|
+
tags:
|
|
35
|
+
- tcli
|
|
36
|
+
- thunderstore
|
|
37
|
+
- pack
|
|
38
|
+
- publish
|
|
39
|
+
- toolchain
|
|
40
|
+
- version
|
|
41
|
+
detail: The build pipeline is therefore `dotnet build -c Release`, ModWright's own staging of
|
|
42
|
+
`BepInEx/plugins/<Mod>/` plus the three root files, then `tcli build`; the packaging
|
|
43
|
+
validators gate the last step, since a published version is immutable.
|
|
44
|
+
related:
|
|
45
|
+
- valheim.thunderstore.packaging.tcli-does-not-compile
|
|
46
|
+
- valheim.thunderstore.packaging.thunderstore-toml-dependency-shape-differs
|
|
47
|
+
- id: valheim.toolchain.build.icon-must-be-a-256-png
|
|
48
|
+
claim: "The package icon is checked by its PNG header alone: the eight-byte PNG signature followed
|
|
49
|
+
by the IHDR chunk, whose width and height (big-endian at offsets 16 and 20) must both be 256.
|
|
50
|
+
Thunderstore's own wording is \"exactly 256x256 in resolution and in PNG format\", and the
|
|
51
|
+
file name is `icon.png` exactly."
|
|
52
|
+
status: community
|
|
53
|
+
source: https://wiki.thunderstore.io/mods/creating-a-package (icon rule); the PNG specification's
|
|
54
|
+
file structure (signature, then IHDR as the first chunk)
|
|
55
|
+
tags:
|
|
56
|
+
- thunderstore
|
|
57
|
+
- icon
|
|
58
|
+
- png
|
|
59
|
+
- ihdr
|
|
60
|
+
- validator
|
|
61
|
+
detail: "`readPngDimensions` in `src/surfaces/valheim/packaging.ts` reads 24 bytes and nothing else;
|
|
62
|
+
a JPEG renamed to icon.png, or a 512-pixel icon, is a block before upload rather than a
|
|
63
|
+
rejected upload."
|
|
64
|
+
- id: valheim.toolchain.build.guid-to-package-name-has-no-registry
|
|
65
|
+
claim: "Nothing maps a BepInEx plugin GUID (`com.jotunn.jotunn`) to its Thunderstore package name
|
|
66
|
+
(`ValheimModding-Jotunn`): the manifest lists packages, the attribute lists GUIDs, and the two
|
|
67
|
+
are only related by convention. A cross-check between them can only match names heuristically
|
|
68
|
+
(the package name against the GUID's dot-separated segments, ignoring case, `_` and `-`), and
|
|
69
|
+
must say so in its finding."
|
|
70
|
+
status: inferred
|
|
71
|
+
source: Thunderstore's manifest and dependency-string format
|
|
72
|
+
(https://wiki.thunderstore.io/mods/creating-a-package) against BepInEx's
|
|
73
|
+
`[BepInDependency(guid)]` contract (v5-lts Contract/Attributes.cs); no registry or schema
|
|
74
|
+
field joins them in either project's documentation
|
|
75
|
+
tags:
|
|
76
|
+
- bepinex
|
|
77
|
+
- thunderstore
|
|
78
|
+
- dependency
|
|
79
|
+
- guid
|
|
80
|
+
- package
|
|
81
|
+
- crosscheck
|
|
82
|
+
- heuristic
|
|
83
|
+
detail: "`valheim.plugins.dependency-crosscheck` is built on this: a hard [BepInDependency] with no
|
|
84
|
+
name-matching manifest package warns, a manifest package (other than the loader pack, which
|
|
85
|
+
has no plugin GUID) that no attribute names is an info, and both findings say the match is by
|
|
86
|
+
name. A package whose name differs from its GUID is a known false positive."
|
|
87
|
+
related:
|
|
88
|
+
- valheim.bepinex.plugins.dependency-attributes
|
|
89
|
+
- valheim.thunderstore.packaging.dependency-string-format
|
|
90
|
+
- id: valheim.toolchain.build.bepinexpack-leaves-only-its-scripts-behind
|
|
91
|
+
claim: "Once installed, denikson's BepInExPack_Valheim leaves nothing on disk that names its own
|
|
92
|
+
version: r2modman copies everything from the package except manifest.json, README and icon,
|
|
93
|
+
and a manual install copies the archive's contents. What it leaves that stock BepInEx does not
|
|
94
|
+
are its run scripts (`start_game_bepinex.sh`, `start_server_bepinex.sh`) and the
|
|
95
|
+
`doorstop_libs/` folder, so the pack can be detected by presence only, and its version is
|
|
96
|
+
known only from the console line it prints at startup."
|
|
97
|
+
status: inferred
|
|
98
|
+
source: https://thunderstore.io/c/valheim/p/denikson/BepInExPack_Valheim/
|
|
99
|
+
tags:
|
|
100
|
+
- bepinexpack
|
|
101
|
+
- detect
|
|
102
|
+
- compat
|
|
103
|
+
- presence
|
|
104
|
+
- version
|
|
105
|
+
- marker
|
|
106
|
+
detail: "`src/surfaces/valheim/compat.ts` reports `bepinexpack` installed when any marker is present
|
|
107
|
+
and never invents a version. The exact wording of the startup line has not been read from a
|
|
108
|
+
real log, so no signature captures it yet."
|
|
109
|
+
related:
|
|
110
|
+
- valheim.bepinex.loader.bepinexpack-valheim-is-the-distribution
|
|
111
|
+
- valheim.bepinexpack-valheim-install-shape
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "modwright",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A game-agnostic MCP server for game modding, with per-game surfaces.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"modwright": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=20"
|
|
12
|
+
},
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Jonathan Trachtenberg",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mcp",
|
|
17
|
+
"modding",
|
|
18
|
+
"cyberpunk2077",
|
|
19
|
+
"baldursgate3",
|
|
20
|
+
"skyrim"
|
|
21
|
+
],
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@modelcontextprotocol/sdk": "^1.22.0",
|
|
24
|
+
"smol-toml": "^1.8.0",
|
|
25
|
+
"sql.js": "^1.14.2",
|
|
26
|
+
"yaml": "^2.9.0",
|
|
27
|
+
"zod": "^3.25.76"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# new-class-injection (BG3).
|
|
2
|
+
# Injects spells/passives into a *foreign* class's list at runtime via the
|
|
3
|
+
# Compatibility Framework, rather than authoring a Progression/
|
|
4
|
+
# ClassDescription/SpellList node of its own — the G6 rules this satisfies
|
|
5
|
+
# (subclass-registered-in-parent, type-matches-owner, tableuuid-matches-
|
|
6
|
+
# owner, no-removespells) are all project-target rules over Progression/
|
|
7
|
+
# ClassDescription nodes; a project with none of its own trivially passes
|
|
8
|
+
# them, which is the point: this scaffold's whole risk surface is the Lua
|
|
9
|
+
# module, not a new stats table.
|
|
10
|
+
id: baldursgate3.new-class-injection
|
|
11
|
+
game: baldursgate3
|
|
12
|
+
title: New BG3 class injection (Compatibility Framework)
|
|
13
|
+
summary: Write a Compatibility Framework Lua module that injects spells/passives into an existing (possibly foreign) class's list, plus an MCM Blueprint stub and the two framework dependencies.
|
|
14
|
+
modTypes: [class, subclass, feat]
|
|
15
|
+
needs: {}
|
|
16
|
+
inputs:
|
|
17
|
+
- type: string
|
|
18
|
+
name: targetList
|
|
19
|
+
prompt: "Target SpellList/PassiveList or class name this injects into."
|
|
20
|
+
pattern: "^[A-Za-z][A-Za-z0-9_]*$"
|
|
21
|
+
- type: string
|
|
22
|
+
name: injectedSpells
|
|
23
|
+
prompt: "Comma-separated spell entry names to inject (blank for none)."
|
|
24
|
+
default: ""
|
|
25
|
+
- type: string
|
|
26
|
+
name: injectedPassives
|
|
27
|
+
prompt: "Comma-separated passive entry names to inject (blank for none)."
|
|
28
|
+
default: ""
|
|
29
|
+
- type: string
|
|
30
|
+
name: mcmKey
|
|
31
|
+
prompt: "MCM settings key prefix for the toggle(s) this injection exposes."
|
|
32
|
+
ids: []
|
|
33
|
+
emits:
|
|
34
|
+
- op: ensure-dir
|
|
35
|
+
path: "Mods/${project.identity.folder}/ScriptExtender/Lua/Injections"
|
|
36
|
+
- op: write-text
|
|
37
|
+
path: "Mods/${project.identity.folder}/ScriptExtender/Lua/Injections/${input.targetList}_Injection.lua"
|
|
38
|
+
body: |
|
|
39
|
+
-- ${project.today} — ModWright scaffold: injects into "${input.targetList}" via the
|
|
40
|
+
-- Compatibility Framework. Never modifies the target mod's own files.
|
|
41
|
+
local Injection = {}
|
|
42
|
+
|
|
43
|
+
Injection.targetList = "${input.targetList}"
|
|
44
|
+
Injection.spells = { "${input.injectedSpells}" }
|
|
45
|
+
Injection.passives = { "${input.injectedPassives}" }
|
|
46
|
+
|
|
47
|
+
Ext.Require("CompatibilityFramework/API.lua")
|
|
48
|
+
|
|
49
|
+
CompatibilityFramework.RegisterListInjection({
|
|
50
|
+
target = Injection.targetList,
|
|
51
|
+
spells = Injection.spells,
|
|
52
|
+
passives = Injection.passives,
|
|
53
|
+
enabledSetting = "${input.mcmKey}_enabled",
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
return Injection
|
|
57
|
+
- op: write-text
|
|
58
|
+
path: "Mods/${project.identity.folder}/ScriptExtender/Lua/Injections/${input.targetList}_MCM.lua"
|
|
59
|
+
body: |
|
|
60
|
+
-- ${project.today} — ModWright scaffold: MCM Blueprint stub for the
|
|
61
|
+
-- ${input.targetList} injection's on/off toggle.
|
|
62
|
+
return {
|
|
63
|
+
SchemaVersion = 1,
|
|
64
|
+
ModName = "${project.identity.folder}",
|
|
65
|
+
Tabs = {
|
|
66
|
+
{
|
|
67
|
+
TabId = "${input.mcmKey}",
|
|
68
|
+
TabName = "${input.targetList} injection",
|
|
69
|
+
Sections = {
|
|
70
|
+
{
|
|
71
|
+
SectionId = "${input.mcmKey}_section",
|
|
72
|
+
SectionName = "Options",
|
|
73
|
+
Settings = {
|
|
74
|
+
{
|
|
75
|
+
Id = "${input.mcmKey}_enabled",
|
|
76
|
+
Name = "Enable injection",
|
|
77
|
+
Type = "checkbox",
|
|
78
|
+
Default = true,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
- op: patch-project
|
|
87
|
+
add:
|
|
88
|
+
dependencies:
|
|
89
|
+
- id: compatibility-framework
|
|
90
|
+
kind: framework
|
|
91
|
+
minVersion: "1.0"
|
|
92
|
+
url: "https://www.nexusmods.com/baldursgate3/mods/2050"
|
|
93
|
+
notes: "RegisterListInjection: injects spells/passives into a foreign mod's list without editing its files."
|
|
94
|
+
- id: mcm
|
|
95
|
+
kind: framework
|
|
96
|
+
minVersion: "1.0"
|
|
97
|
+
url: "https://www.nexusmods.com/baldursgate3/mods/2278"
|
|
98
|
+
notes: "MCM Blueprint stub exposes the injection's on/off toggle."
|
|
99
|
+
templates: []
|
|
100
|
+
satisfies:
|
|
101
|
+
- bg3.progression.spelllist-selector-resolves
|
|
102
|
+
- bg3.progression.passives-exist
|
|
103
|
+
- bg3.progression.no-removespells
|
|
104
|
+
- bg3.progression.subclass-registered-in-parent
|
|
105
|
+
- bg3.progression.type-matches-owner
|
|
106
|
+
- bg3.progression.tableuuid-matches-owner
|
|
107
|
+
manual:
|
|
108
|
+
- title: Confirm the injection at runtime
|
|
109
|
+
steps:
|
|
110
|
+
- "Load a save with both this mod and the target list's owning mod active."
|
|
111
|
+
- "Toggle ${input.mcmKey}_enabled off/on in the MCM menu and confirm the injected entries appear/disappear."
|
|
112
|
+
expected: "The target list shows the injected spells/passives only while the MCM toggle is on."
|
|
113
|
+
claim:
|
|
114
|
+
idSuffix: injects
|
|
115
|
+
claim: "With the Compatibility Framework and the target mod present, ${input.targetList} gains the injected spells/passives."
|
|
116
|
+
testRows:
|
|
117
|
+
- gate: C-1
|
|
118
|
+
title: "Injection Lua loads without error"
|
|
119
|
+
expected: "RED4ext/SE-equivalent log shows the injection module loaded with no Lua error."
|
|
120
|
+
manual: true
|
|
121
|
+
probeKinds: []
|
|
122
|
+
- gate: C-2
|
|
123
|
+
title: "Target list carries the injected entries"
|
|
124
|
+
# No automated probe here, for two independent reasons.
|
|
125
|
+
#
|
|
126
|
+
# 1. ${input.targetList} is a SpellList/PassiveList (or a class name) —
|
|
127
|
+
# an LSX resource, not a stats entry — so bg3.stat.exists, which is
|
|
128
|
+
# Ext.Stats.Get plus Ext.Stats.GetStats over the 13 stat types the
|
|
129
|
+
# bridge lists (bridges/bg3-se/.../Probes.lua STAT_TYPES: StatusData,
|
|
130
|
+
# SpellData, PassiveData, Armor, Weapon, Character, Object, SpellSet,
|
|
131
|
+
# EquipmentSet, TreasureTable, TreasureCategory, ItemGroup,
|
|
132
|
+
# NameGroup), would report `fail` for a target that is perfectly fine.
|
|
133
|
+
# 2. Even for a stats entry, bg3.stat.fields is not a verbatim
|
|
134
|
+
# "field -> value map" the way it might read: the
|
|
135
|
+
# bridge's own handler returns `status = fail` when ANY requested
|
|
136
|
+
# field comes back nil (Probes.lua, `#missing == 0 and
|
|
137
|
+
# #unreadable == 0`). Asking for both Spells and Passives would
|
|
138
|
+
# therefore fail on a list that legitimately carries only the one
|
|
139
|
+
# ${input.injectedSpells}/${input.injectedPassives} names — and which
|
|
140
|
+
# of the two applies is a per-run choice this scaffold's fixed
|
|
141
|
+
# `probes[]` cannot branch on (it has no expression language).
|
|
142
|
+
#
|
|
143
|
+
# The enabled-vs-disabled comparison needs a human regardless: one
|
|
144
|
+
# arm/poll only ever samples one MCM toggle state.
|
|
145
|
+
expected: "A human confirms the injected entries are in ${input.targetList} with the MCM toggle on and gone with it off (the list is an LSX resource, not a stats entry, so bg3.stat.exists/bg3.stat.fields cannot check it)."
|
|
146
|
+
manual: true
|
|
147
|
+
probeKinds: []
|
|
148
|
+
evidence: ["ModWright research"]
|