@modwrench/workbench 0.0.1
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/data/conflicts/README.md +39 -0
- package/data/conflicts/fallout4.json +1 -0
- package/data/conflicts/lethalcompany.json +1 -0
- package/data/conflicts/skyrimspecialedition.json +1 -0
- package/dist/conflicts/community.d.ts +3 -0
- package/dist/conflicts/community.d.ts.map +1 -0
- package/dist/conflicts/community.js +96 -0
- package/dist/conflicts/community.js.map +1 -0
- package/dist/conflicts/index.d.ts +6 -0
- package/dist/conflicts/index.d.ts.map +1 -0
- package/dist/conflicts/index.js +114 -0
- package/dist/conflicts/index.js.map +1 -0
- package/dist/conflicts/loot.d.ts +19 -0
- package/dist/conflicts/loot.d.ts.map +1 -0
- package/dist/conflicts/loot.js +148 -0
- package/dist/conflicts/loot.js.map +1 -0
- package/dist/conflicts/types.d.ts +31 -0
- package/dist/conflicts/types.d.ts.map +1 -0
- package/dist/conflicts/types.js +6 -0
- package/dist/conflicts/types.js.map +1 -0
- package/dist/crashlog/bepinex.d.ts +3 -0
- package/dist/crashlog/bepinex.d.ts.map +1 -0
- package/dist/crashlog/bepinex.js +105 -0
- package/dist/crashlog/bepinex.js.map +1 -0
- package/dist/crashlog/crashlogger-sse.d.ts +3 -0
- package/dist/crashlog/crashlogger-sse.d.ts.map +1 -0
- package/dist/crashlog/crashlogger-sse.js +226 -0
- package/dist/crashlog/crashlogger-sse.js.map +1 -0
- package/dist/crashlog/detect.d.ts +3 -0
- package/dist/crashlog/detect.d.ts.map +1 -0
- package/dist/crashlog/detect.js +44 -0
- package/dist/crashlog/detect.js.map +1 -0
- package/dist/crashlog/index.d.ts +15 -0
- package/dist/crashlog/index.d.ts.map +1 -0
- package/dist/crashlog/index.js +65 -0
- package/dist/crashlog/index.js.map +1 -0
- package/dist/crashlog/minecraft.d.ts +3 -0
- package/dist/crashlog/minecraft.d.ts.map +1 -0
- package/dist/crashlog/minecraft.js +145 -0
- package/dist/crashlog/minecraft.js.map +1 -0
- package/dist/crashlog/netscriptframework.d.ts +3 -0
- package/dist/crashlog/netscriptframework.d.ts.map +1 -0
- package/dist/crashlog/netscriptframework.js +109 -0
- package/dist/crashlog/netscriptframework.js.map +1 -0
- package/dist/crashlog/types.d.ts +35 -0
- package/dist/crashlog/types.d.ts.map +1 -0
- package/dist/crashlog/types.js +9 -0
- package/dist/crashlog/types.js.map +1 -0
- package/dist/detect/environment.d.ts +35 -0
- package/dist/detect/environment.d.ts.map +1 -0
- package/dist/detect/environment.js +65 -0
- package/dist/detect/environment.js.map +1 -0
- package/dist/detect/games.d.ts +21 -0
- package/dist/detect/games.d.ts.map +1 -0
- package/dist/detect/games.js +159 -0
- package/dist/detect/games.js.map +1 -0
- package/dist/detect/loader.d.ts +12 -0
- package/dist/detect/loader.d.ts.map +1 -0
- package/dist/detect/loader.js +20 -0
- package/dist/detect/loader.js.map +1 -0
- package/dist/detect/manager.d.ts +26 -0
- package/dist/detect/manager.d.ts.map +1 -0
- package/dist/detect/manager.js +157 -0
- package/dist/detect/manager.js.map +1 -0
- package/dist/detect/os.d.ts +21 -0
- package/dist/detect/os.d.ts.map +1 -0
- package/dist/detect/os.js +58 -0
- package/dist/detect/os.js.map +1 -0
- package/dist/detect/steam.d.ts +32 -0
- package/dist/detect/steam.d.ts.map +1 -0
- package/dist/detect/steam.js +155 -0
- package/dist/detect/steam.js.map +1 -0
- package/dist/detect/vdf.d.ts +12 -0
- package/dist/detect/vdf.d.ts.map +1 -0
- package/dist/detect/vdf.js +112 -0
- package/dist/detect/vdf.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/loadorder/index.d.ts +20 -0
- package/dist/loadorder/index.d.ts.map +1 -0
- package/dist/loadorder/index.js +76 -0
- package/dist/loadorder/index.js.map +1 -0
- package/dist/loadorder/mo2.d.ts +21 -0
- package/dist/loadorder/mo2.d.ts.map +1 -0
- package/dist/loadorder/mo2.js +201 -0
- package/dist/loadorder/mo2.js.map +1 -0
- package/dist/loadorder/r2modman.d.ts +12 -0
- package/dist/loadorder/r2modman.d.ts.map +1 -0
- package/dist/loadorder/r2modman.js +115 -0
- package/dist/loadorder/r2modman.js.map +1 -0
- package/dist/loadorder/types.d.ts +30 -0
- package/dist/loadorder/types.d.ts.map +1 -0
- package/dist/loadorder/types.js +5 -0
- package/dist/loadorder/types.js.map +1 -0
- package/dist/loadorder/vortex.d.ts +8 -0
- package/dist/loadorder/vortex.d.ts.map +1 -0
- package/dist/loadorder/vortex.js +77 -0
- package/dist/loadorder/vortex.js.map +1 -0
- package/dist/metadata/clients.d.ts +11 -0
- package/dist/metadata/clients.d.ts.map +1 -0
- package/dist/metadata/clients.js +90 -0
- package/dist/metadata/clients.js.map +1 -0
- package/dist/metadata/index.d.ts +3 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +149 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/normalize.d.ts +43 -0
- package/dist/metadata/normalize.d.ts.map +1 -0
- package/dist/metadata/normalize.js +88 -0
- package/dist/metadata/normalize.js.map +1 -0
- package/dist/metadata/types.d.ts +57 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +9 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/register.d.ts +13 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +209 -0
- package/dist/register.js.map +1 -0
- package/package.json +58 -0
package/dist/register.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { log } from "@modwrench/core";
|
|
3
|
+
import { detectEnvironment } from "./detect/environment.js";
|
|
4
|
+
import { readLoadOrder } from "./loadorder/index.js";
|
|
5
|
+
import { parseCrashlog } from "./crashlog/index.js";
|
|
6
|
+
import { queryModMetadata } from "./metadata/index.js";
|
|
7
|
+
import { checkKnownConflicts } from "./conflicts/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Register all Workbench tools on the given MCP server. Workbench tools are
|
|
10
|
+
* uncredentialed — they read local filesystem state, not platform APIs. That
|
|
11
|
+
* makes the registration shape slightly different from @modwrench/nexus and
|
|
12
|
+
* @modwrench/modio: no Credential parameter required.
|
|
13
|
+
*
|
|
14
|
+
* Returns metadata useful for boot logging.
|
|
15
|
+
*/
|
|
16
|
+
export function registerWorkbenchTools(server) {
|
|
17
|
+
// ─── Tool 1: mw_detect_environment ──────────────────────────────────────────
|
|
18
|
+
// Discovers the user's OS, Steam Deck status, installed mod-friendly games,
|
|
19
|
+
// mod managers, mod loaders, and Proton versions (Linux). This is the
|
|
20
|
+
// foundation tool — every other workbench tool that needs to reason about
|
|
21
|
+
// the user's setup starts by calling this.
|
|
22
|
+
server.tool("mw_detect_environment", "Auto-detect the user's modding environment: OS, Steam Deck, installed mod-friendly games (Bethesda / Unity co-op / Sims / Minecraft), per-game mod loaders (SKSE / F4SE / BepInEx / etc.), installed mod managers (Vortex / MO2 / r2modman / CurseForge App), and Proton versions on Linux. Read-only — touches no files outside known config/save locations.", {}, async () => {
|
|
23
|
+
const result = detectEnvironment();
|
|
24
|
+
log("debug", "workbench.detect_environment", {
|
|
25
|
+
os: result.os,
|
|
26
|
+
isSteamDeck: result.isSteamDeck,
|
|
27
|
+
games: result.detectedGames.length,
|
|
28
|
+
managers: result.installedModManagers.length,
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
type: "text",
|
|
34
|
+
text: JSON.stringify(result, null, 2),
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
// ─── Tool 2: mw_read_load_order ─────────────────────────────────────────────
|
|
40
|
+
// Read the user's current load order for a specific game, normalized across
|
|
41
|
+
// mod managers. Read-only — never modifies state files. Honest about gaps:
|
|
42
|
+
// Vortex returns mod folders only (no enable state) until LevelDB support
|
|
43
|
+
// lands.
|
|
44
|
+
server.tool("mw_read_load_order", "Read the user's mod load order for a specific game from whichever mod manager they use (MO2, r2modman, or best-effort Vortex). Normalized output: each entry has name, enabled state, load-order index, and attribution metadata when available. Read-only.", {
|
|
45
|
+
gameId: z
|
|
46
|
+
.string()
|
|
47
|
+
.describe("Canonical game ID (e.g. 'skyrimspecialedition', 'lethalcompany'). Use mw_detect_environment to discover the games on this machine."),
|
|
48
|
+
modManager: z
|
|
49
|
+
.enum(["vortex", "mo2", "r2modman", "auto"])
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Which mod manager to read from. Default 'auto' — picks the most likely manager for this game's family."),
|
|
52
|
+
profileName: z
|
|
53
|
+
.string()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Profile name. MO2 reads the active profile from ModOrganizer.ini if omitted; r2modman defaults to the first profile alphabetically (typically 'Default')."),
|
|
56
|
+
instancePath: z
|
|
57
|
+
.string()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Optional override for MO2's instance path — useful for portable MO2 installs that don't live under %LOCALAPPDATA%/ModOrganizer."),
|
|
60
|
+
}, async ({ gameId, modManager, profileName, instancePath }) => {
|
|
61
|
+
const result = readLoadOrder({
|
|
62
|
+
gameId,
|
|
63
|
+
modManager,
|
|
64
|
+
...(profileName !== undefined ? { profileName } : {}),
|
|
65
|
+
...(instancePath !== undefined ? { instancePath } : {}),
|
|
66
|
+
});
|
|
67
|
+
log("debug", "workbench.read_load_order", {
|
|
68
|
+
gameId,
|
|
69
|
+
ok: result.ok,
|
|
70
|
+
manager: result.ok ? result.modManager : null,
|
|
71
|
+
mods: result.ok ? result.totalCount : 0,
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: "text",
|
|
77
|
+
text: JSON.stringify(result, null, 2),
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
// ─── Tool 3: mw_parse_crashlog ──────────────────────────────────────────────
|
|
83
|
+
// Parse a crashlog into structured fields. PARSING ONLY — no diagnosis, no
|
|
84
|
+
// suggested causes. That separation is the differentiator: static analyzers
|
|
85
|
+
// (Phostwood, Skyrim Crash Decoder, CLAS) pattern-match against known
|
|
86
|
+
// crashes; here we hand the LLM clean structured data so it can reason
|
|
87
|
+
// across the user's specific load order.
|
|
88
|
+
server.tool("mw_parse_crashlog", "Parse a crashlog file or pasted content into structured fields (exception type, call stack, loaded plugins, registers, suspected FormID refs). Supports Crash Logger SSE (Skyrim), Buffout 4 (Fallout 4), NetScriptFramework (older Skyrim), BepInEx (Unity games), and Minecraft crash-reports. Returns parsed structure only — diagnosis is the LLM's job.", {
|
|
89
|
+
logContent: z
|
|
90
|
+
.string()
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("Crashlog file content as a string. Provide this OR logPath."),
|
|
93
|
+
logPath: z
|
|
94
|
+
.string()
|
|
95
|
+
.optional()
|
|
96
|
+
.describe("Absolute path to a crashlog file on disk. Common locations: ~/Documents/My Games/Skyrim Special Edition/SKSE/crash-*.log for Crash Logger SSE, ~/Documents/My Games/Fallout4/F4SE/crash-*.log for Buffout 4, the game's BepInEx/LogOutput.log for Unity, or ~/.minecraft/crash-reports/crash-*.txt for Minecraft."),
|
|
97
|
+
logType: z
|
|
98
|
+
.enum([
|
|
99
|
+
"auto",
|
|
100
|
+
"crashlogger-sse",
|
|
101
|
+
"buffout4",
|
|
102
|
+
"netscriptframework",
|
|
103
|
+
"bepinex",
|
|
104
|
+
"minecraft",
|
|
105
|
+
])
|
|
106
|
+
.optional()
|
|
107
|
+
.describe("Format hint. Default 'auto' — detect from content. Pass an explicit type when the auto-detect heuristic fails on a truncated log."),
|
|
108
|
+
}, async ({ logContent, logPath, logType }) => {
|
|
109
|
+
const result = parseCrashlog({
|
|
110
|
+
...(logContent !== undefined ? { logContent } : {}),
|
|
111
|
+
...(logPath !== undefined ? { logPath } : {}),
|
|
112
|
+
...(logType !== undefined ? { logType } : {}),
|
|
113
|
+
});
|
|
114
|
+
log("debug", "workbench.parse_crashlog", {
|
|
115
|
+
ok: result.ok,
|
|
116
|
+
type: result.ok ? result.detectedType : null,
|
|
117
|
+
frames: result.ok ? result.callStack.length : 0,
|
|
118
|
+
plugins: result.ok ? result.loadedPlugins.length : 0,
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
content: [
|
|
122
|
+
{
|
|
123
|
+
type: "text",
|
|
124
|
+
text: JSON.stringify(result, null, 2),
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
// ─── Tool 4: mw_query_mod_metadata ──────────────────────────────────────────
|
|
130
|
+
// Cross-platform mod lookup with a normalized response shape. Attribution
|
|
131
|
+
// (author, source platform, page URL) is non-optional on every result —
|
|
132
|
+
// the LLM is structurally prevented from stripping credit, per the trust
|
|
133
|
+
// architecture in the wiring prompt.
|
|
134
|
+
server.tool("mw_query_mod_metadata", "Look up a mod's metadata across supported platforms (Nexus, mod.io) with a normalized shape: id, name, author, version, downloads, endorsements, pageUrl, and a permissions block that always includes attribution. Use this to enrich crashlog suspects or load-order entries with who-made-this and where-it-lives info. Thunderstore and CurseForge support is planned for v3+.", {
|
|
135
|
+
modId: z
|
|
136
|
+
.string()
|
|
137
|
+
.optional()
|
|
138
|
+
.describe("Platform-specific mod ID. Nexus IDs are numeric (from the URL); mod.io IDs are numeric too. Required for direct lookup."),
|
|
139
|
+
modName: z
|
|
140
|
+
.string()
|
|
141
|
+
.optional()
|
|
142
|
+
.describe("Mod name for fuzzy lookup (mod.io only — Nexus has no public search endpoint). Pass with gameId."),
|
|
143
|
+
platform: z
|
|
144
|
+
.enum(["nexus", "modio", "thunderstore", "curseforge", "any"])
|
|
145
|
+
.optional()
|
|
146
|
+
.describe("Which platform to query. Default 'any' — tries Nexus first when a numeric modId + gameId are given, then mod.io. Use explicit platform to skip the cascade."),
|
|
147
|
+
gameId: z
|
|
148
|
+
.string()
|
|
149
|
+
.optional()
|
|
150
|
+
.describe("Platform-specific game identifier. For Nexus: the domain name (e.g. 'skyrimspecialedition'). For mod.io: the numeric game id as a string. Use modio_list_games / nexus_list_games to discover these."),
|
|
151
|
+
}, async ({ modId, modName, platform, gameId }) => {
|
|
152
|
+
const result = await queryModMetadata({
|
|
153
|
+
...(modId !== undefined ? { modId } : {}),
|
|
154
|
+
...(modName !== undefined ? { modName } : {}),
|
|
155
|
+
...(platform !== undefined ? { platform } : {}),
|
|
156
|
+
...(gameId !== undefined ? { gameId } : {}),
|
|
157
|
+
});
|
|
158
|
+
log("debug", "workbench.query_mod_metadata", {
|
|
159
|
+
found: result.found,
|
|
160
|
+
attempted: result.attemptedPlatforms,
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
content: [
|
|
164
|
+
{
|
|
165
|
+
type: "text",
|
|
166
|
+
text: JSON.stringify(result, null, 2),
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
// ─── Tool 5: mw_check_known_conflicts ──────────────────────────────────────
|
|
172
|
+
// Pairwise conflict lookup across two sources:
|
|
173
|
+
// 1. LOOT masterlist (live fetch from GitHub) — Bethesda games only
|
|
174
|
+
// 2. data/conflicts/<gameId>.json — community-curated, bundled with the
|
|
175
|
+
// workbench package, any game
|
|
176
|
+
//
|
|
177
|
+
// Each entry in the input modIds list is identified as either a plugin
|
|
178
|
+
// filename (.esp/.esm/.esl) or a platform-prefixed ID (nexus:N, modio:N,
|
|
179
|
+
// thunderstore:X). Plugin matches drive the LOOT pass; both kinds drive the
|
|
180
|
+
// community pass.
|
|
181
|
+
server.tool("mw_check_known_conflicts", "Check a list of mods/plugins for known pairwise incompatibilities. Two sources: LOOT's masterlist (live, Bethesda games) and ModWrench's community conflict database (bundled, any game). Returns conflicts with severity, description, attribution to source, and an optional patch suggestion. Input identifiers can be plugin filenames (Skyrim.esp) or platform-prefixed mod IDs (nexus:12345).", {
|
|
182
|
+
gameId: z
|
|
183
|
+
.string()
|
|
184
|
+
.describe("Canonical game ID (e.g. 'skyrimspecialedition', 'lethalcompany'). LOOT support is Bethesda-only; non-Bethesda games rely on the community database only."),
|
|
185
|
+
modIds: z
|
|
186
|
+
.array(z.string())
|
|
187
|
+
.min(2)
|
|
188
|
+
.describe("List of mods/plugins to check pairwise. Entries can be plugin filenames ('Skyrim.esp') or platform-prefixed mod IDs ('nexus:12345', 'modio:67890', 'thunderstore:Author-ModName'). At least 2 required for a conflict to be possible."),
|
|
189
|
+
}, async ({ gameId, modIds }) => {
|
|
190
|
+
const result = await checkKnownConflicts({ gameId, modIds });
|
|
191
|
+
log("debug", "workbench.check_known_conflicts", {
|
|
192
|
+
gameId,
|
|
193
|
+
inputs: modIds.length,
|
|
194
|
+
conflicts: result.conflicts.length,
|
|
195
|
+
lootAvailable: result.sources.loot.available,
|
|
196
|
+
communityEntries: result.sources.community.entries,
|
|
197
|
+
});
|
|
198
|
+
return {
|
|
199
|
+
content: [
|
|
200
|
+
{
|
|
201
|
+
type: "text",
|
|
202
|
+
text: JSON.stringify(result, null, 2),
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
return { toolCount: 5 };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@modwrench/workbench",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "ModWrench — the modder workbench. Atomic MCP tools for environment detection, load-order parsing, crashlog analysis, and known-conflict lookups.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/171county/modwrench.git",
|
|
9
|
+
"directory": "packages/workbench"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/171county/modwrench#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/171county/modwrench/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./register": {
|
|
23
|
+
"types": "./dist/register.d.ts",
|
|
24
|
+
"import": "./dist/register.js"
|
|
25
|
+
},
|
|
26
|
+
"./detect": {
|
|
27
|
+
"types": "./dist/detect/environment.d.ts",
|
|
28
|
+
"import": "./dist/detect/environment.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"bin": {
|
|
32
|
+
"modwrench-workbench": "dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"data"
|
|
37
|
+
],
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"dev": "tsx watch src/index.ts",
|
|
44
|
+
"start": "node dist/index.js",
|
|
45
|
+
"clean": "rimraf dist",
|
|
46
|
+
"typecheck": "tsc --noEmit",
|
|
47
|
+
"test": "node --import tsx --test test/*.test.ts"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@modwrench/core": "0.0.1",
|
|
51
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
52
|
+
"js-yaml": "^4.1.0",
|
|
53
|
+
"zod": "^3.23.8"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/js-yaml": "^4.0.9"
|
|
57
|
+
}
|
|
58
|
+
}
|