@n24q02m/better-godot-mcp 1.2.1 → 1.2.2
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/README.md +1 -1
- package/bin/cli.mjs +68 -76
- package/build/src/tools/composite/config.d.ts.map +1 -1
- package/build/src/tools/composite/config.js +4 -0
- package/build/src/tools/composite/config.js.map +1 -1
- package/build/src/tools/composite/editor.js +4 -4
- package/build/src/tools/composite/editor.js.map +1 -1
- package/build/src/tools/composite/resources.d.ts.map +1 -1
- package/build/src/tools/composite/resources.js +12 -14
- package/build/src/tools/composite/resources.js.map +1 -1
- package/build/src/tools/composite/scenes.d.ts.map +1 -1
- package/build/src/tools/composite/scenes.js +13 -13
- package/build/src/tools/composite/scenes.js.map +1 -1
- package/build/src/tools/composite/scripts.d.ts.map +1 -1
- package/build/src/tools/composite/scripts.js +10 -9
- package/build/src/tools/composite/scripts.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
**Composite MCP Server for Godot Engine - Optimized for AI Agents**
|
|
4
4
|
|
|
5
5
|
[](https://github.com/n24q02m/better-godot-mcp/actions/workflows/ci.yml)
|
|
6
|
-
[](https://codecov.io/gh/n24q02m/better-godot-mcp)
|
|
7
7
|
[](https://www.npmjs.com/package/@n24q02m/better-godot-mcp)
|
|
8
8
|
[](https://hub.docker.com/r/n24q02m/better-godot-mcp)
|
|
9
9
|
[](LICENSE)
|
package/bin/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// @n24q02m/better-godot-mcp v1.2.
|
|
2
|
+
// @n24q02m/better-godot-mcp v1.2.2
|
|
3
3
|
// Auto-generated CLI bundle - do not edit directly
|
|
4
4
|
|
|
5
5
|
|
|
@@ -500,6 +500,13 @@ async function handleConfig(action, args, config) {
|
|
|
500
500
|
if (!validKeys.includes(key)) {
|
|
501
501
|
throw new GodotMCPError(`Invalid config key: ${key}`, "INVALID_ARGS", `Valid keys: ${validKeys.join(", ")}`);
|
|
502
502
|
}
|
|
503
|
+
if ((key === "project_path" || key === "godot_path") && /[;&|`$(){}]/.test(value)) {
|
|
504
|
+
throw new GodotMCPError(
|
|
505
|
+
`Invalid characters in ${key}`,
|
|
506
|
+
"INVALID_ARGS",
|
|
507
|
+
"Path must not contain shell metacharacters: ; & | ` $ ( ) { }"
|
|
508
|
+
);
|
|
509
|
+
}
|
|
503
510
|
runtimeConfig[key] = value;
|
|
504
511
|
if (key === "project_path") {
|
|
505
512
|
config.projectPath = value;
|
|
@@ -518,7 +525,7 @@ async function handleConfig(action, args, config) {
|
|
|
518
525
|
}
|
|
519
526
|
|
|
520
527
|
// src/tools/composite/editor.ts
|
|
521
|
-
import {
|
|
528
|
+
import { execFile } from "node:child_process";
|
|
522
529
|
import { resolve as resolve3 } from "node:path";
|
|
523
530
|
import { promisify } from "node:util";
|
|
524
531
|
|
|
@@ -568,11 +575,11 @@ function launchGodotEditor(godotPath, projectPath) {
|
|
|
568
575
|
}
|
|
569
576
|
|
|
570
577
|
// src/tools/composite/editor.ts
|
|
571
|
-
var
|
|
578
|
+
var execFileAsync = promisify(execFile);
|
|
572
579
|
async function getGodotProcessesAsync() {
|
|
573
580
|
try {
|
|
574
581
|
if (process.platform === "win32") {
|
|
575
|
-
const { stdout: stdout2 } = await
|
|
582
|
+
const { stdout: stdout2 } = await execFileAsync("tasklist", ["/FI", "IMAGENAME eq godot*", "/FO", "CSV", "/NH"], {
|
|
576
583
|
encoding: "utf-8"
|
|
577
584
|
});
|
|
578
585
|
return stdout2.split("\n").filter((line) => line.includes("godot")).map((line) => {
|
|
@@ -580,7 +587,7 @@ async function getGodotProcessesAsync() {
|
|
|
580
587
|
return { pid: parts[1] || "unknown", name: parts[0] || "godot" };
|
|
581
588
|
});
|
|
582
589
|
}
|
|
583
|
-
const { stdout } = await
|
|
590
|
+
const { stdout } = await execFileAsync("pgrep", ["-la", "godot"], {
|
|
584
591
|
encoding: "utf-8"
|
|
585
592
|
});
|
|
586
593
|
return stdout.split("\n").filter(Boolean).map((line) => {
|
|
@@ -1778,12 +1785,29 @@ ${result.stdout}`);
|
|
|
1778
1785
|
|
|
1779
1786
|
// src/tools/composite/resources.ts
|
|
1780
1787
|
import { existsSync as existsSync10, readdirSync as readdirSync2, readFileSync as readFileSync10, statSync, unlinkSync } from "node:fs";
|
|
1781
|
-
import { extname, join as join6, relative, resolve as
|
|
1788
|
+
import { extname, join as join6, relative as relative2, resolve as resolve10 } from "node:path";
|
|
1789
|
+
|
|
1790
|
+
// src/tools/helpers/paths.ts
|
|
1791
|
+
import { isAbsolute, relative, resolve as resolve9 } from "node:path";
|
|
1792
|
+
function safeResolve(baseDir, targetPath) {
|
|
1793
|
+
const resolvedBase = resolve9(baseDir);
|
|
1794
|
+
const resolvedTarget = resolve9(resolvedBase, targetPath);
|
|
1795
|
+
const relativePath = relative(resolvedBase, resolvedTarget);
|
|
1796
|
+
if (relativePath.startsWith("..") || isAbsolute(relativePath)) {
|
|
1797
|
+
throw new GodotMCPError(
|
|
1798
|
+
`Access denied: Path '${targetPath}' resolves to '${resolvedTarget}' which is outside the project root '${resolvedBase}'.`,
|
|
1799
|
+
"INVALID_ARGS",
|
|
1800
|
+
"Ensure all file paths are within the project directory."
|
|
1801
|
+
);
|
|
1802
|
+
}
|
|
1803
|
+
return resolvedTarget;
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
// src/tools/composite/resources.ts
|
|
1782
1807
|
var RESOURCE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
1783
1808
|
".tres",
|
|
1784
1809
|
".res",
|
|
1785
1810
|
".tscn",
|
|
1786
|
-
".tscn",
|
|
1787
1811
|
".png",
|
|
1788
1812
|
".jpg",
|
|
1789
1813
|
".jpeg",
|
|
@@ -1798,19 +1822,17 @@ var RESOURCE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
|
1798
1822
|
".gdshaderinc",
|
|
1799
1823
|
".import"
|
|
1800
1824
|
]);
|
|
1801
|
-
function findResourceFiles(dir, extensions) {
|
|
1825
|
+
function findResourceFiles(dir, extensions, results = []) {
|
|
1802
1826
|
const exts = extensions || RESOURCE_EXTENSIONS;
|
|
1803
|
-
const results = [];
|
|
1804
1827
|
try {
|
|
1805
|
-
const entries = readdirSync2(dir);
|
|
1828
|
+
const entries = readdirSync2(dir, { withFileTypes: true });
|
|
1806
1829
|
for (const entry of entries) {
|
|
1807
|
-
if (entry.startsWith(".") || entry === "node_modules" || entry === "build") continue;
|
|
1808
|
-
const fullPath = join6(dir, entry);
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
results.push({ path: fullPath, size: stat.size });
|
|
1830
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules" || entry.name === "build") continue;
|
|
1831
|
+
const fullPath = join6(dir, entry.name);
|
|
1832
|
+
if (entry.isDirectory()) {
|
|
1833
|
+
findResourceFiles(fullPath, exts, results);
|
|
1834
|
+
} else if (exts.has(extname(entry.name).toLowerCase())) {
|
|
1835
|
+
results.push({ path: fullPath, size: statSync(fullPath).size });
|
|
1814
1836
|
}
|
|
1815
1837
|
}
|
|
1816
1838
|
} catch {
|
|
@@ -1822,7 +1844,7 @@ async function handleResources(action, args, config) {
|
|
|
1822
1844
|
switch (action) {
|
|
1823
1845
|
case "list": {
|
|
1824
1846
|
if (!projectPath) throw new GodotMCPError("No project path specified", "INVALID_ARGS", "Provide project_path.");
|
|
1825
|
-
const resolvedPath =
|
|
1847
|
+
const resolvedPath = resolve10(projectPath);
|
|
1826
1848
|
const filterType = args.type;
|
|
1827
1849
|
let exts;
|
|
1828
1850
|
if (filterType) {
|
|
@@ -1838,7 +1860,7 @@ async function handleResources(action, args, config) {
|
|
|
1838
1860
|
}
|
|
1839
1861
|
const resources = findResourceFiles(resolvedPath, exts);
|
|
1840
1862
|
const relativePaths = resources.map((r) => ({
|
|
1841
|
-
path:
|
|
1863
|
+
path: relative2(resolvedPath, r.path).replace(/\\/g, "/"),
|
|
1842
1864
|
ext: extname(r.path),
|
|
1843
1865
|
size: r.size
|
|
1844
1866
|
}));
|
|
@@ -1847,7 +1869,7 @@ async function handleResources(action, args, config) {
|
|
|
1847
1869
|
case "info": {
|
|
1848
1870
|
const resPath = args.resource_path;
|
|
1849
1871
|
if (!resPath) throw new GodotMCPError("No resource_path specified", "INVALID_ARGS", "Provide resource_path.");
|
|
1850
|
-
const fullPath = projectPath ?
|
|
1872
|
+
const fullPath = projectPath ? safeResolve(projectPath, resPath) : resolve10(resPath);
|
|
1851
1873
|
if (!existsSync10(fullPath))
|
|
1852
1874
|
throw new GodotMCPError(`Resource not found: ${resPath}`, "RESOURCE_ERROR", "Check the file path.");
|
|
1853
1875
|
const stat = statSync(fullPath);
|
|
@@ -1870,7 +1892,7 @@ async function handleResources(action, args, config) {
|
|
|
1870
1892
|
case "delete": {
|
|
1871
1893
|
const resPath = args.resource_path;
|
|
1872
1894
|
if (!resPath) throw new GodotMCPError("No resource_path specified", "INVALID_ARGS", "Provide resource_path.");
|
|
1873
|
-
const fullPath = projectPath ?
|
|
1895
|
+
const fullPath = projectPath ? safeResolve(projectPath, resPath) : resolve10(resPath);
|
|
1874
1896
|
if (!existsSync10(fullPath))
|
|
1875
1897
|
throw new GodotMCPError(`Resource not found: ${resPath}`, "RESOURCE_ERROR", "Check the file path.");
|
|
1876
1898
|
unlinkSync(fullPath);
|
|
@@ -1881,7 +1903,7 @@ async function handleResources(action, args, config) {
|
|
|
1881
1903
|
case "import_config": {
|
|
1882
1904
|
const resPath = args.resource_path;
|
|
1883
1905
|
if (!resPath) throw new GodotMCPError("No resource_path specified", "INVALID_ARGS", "Provide resource_path.");
|
|
1884
|
-
const importPath = projectPath ?
|
|
1906
|
+
const importPath = projectPath ? safeResolve(projectPath, `${resPath}.import`) : resolve10(`${resPath}.import`);
|
|
1885
1907
|
if (!existsSync10(importPath)) {
|
|
1886
1908
|
return formatJSON({ path: resPath, imported: false, message: "No .import file found." });
|
|
1887
1909
|
}
|
|
@@ -1900,18 +1922,9 @@ ${content}`);
|
|
|
1900
1922
|
}
|
|
1901
1923
|
|
|
1902
1924
|
// src/tools/composite/scenes.ts
|
|
1903
|
-
import {
|
|
1904
|
-
copyFileSync,
|
|
1905
|
-
existsSync as existsSync11,
|
|
1906
|
-
mkdirSync,
|
|
1907
|
-
readdirSync as readdirSync3,
|
|
1908
|
-
readFileSync as readFileSync11,
|
|
1909
|
-
statSync as statSync2,
|
|
1910
|
-
unlinkSync as unlinkSync2,
|
|
1911
|
-
writeFileSync as writeFileSync9
|
|
1912
|
-
} from "node:fs";
|
|
1925
|
+
import { copyFileSync, existsSync as existsSync11, mkdirSync, readdirSync as readdirSync3, readFileSync as readFileSync11, unlinkSync as unlinkSync2, writeFileSync as writeFileSync9 } from "node:fs";
|
|
1913
1926
|
import { readFile as readFile3 } from "node:fs/promises";
|
|
1914
|
-
import { basename, dirname, extname as extname2, join as join7, relative as
|
|
1927
|
+
import { basename, dirname, extname as extname2, join as join7, relative as relative3, resolve as resolve11 } from "node:path";
|
|
1915
1928
|
async function parseTscnFile(filePath) {
|
|
1916
1929
|
const content = await readFile3(filePath, "utf-8");
|
|
1917
1930
|
const lines = content.split("\n");
|
|
@@ -1951,18 +1964,15 @@ async function parseTscnFile(filePath) {
|
|
|
1951
1964
|
}
|
|
1952
1965
|
return { path: filePath, rootNode, rootType, nodeCount: nodes.length, nodes, resources };
|
|
1953
1966
|
}
|
|
1954
|
-
function findSceneFiles(dir) {
|
|
1955
|
-
const results = [];
|
|
1967
|
+
function findSceneFiles(dir, results = []) {
|
|
1956
1968
|
try {
|
|
1957
|
-
const entries = readdirSync3(dir);
|
|
1969
|
+
const entries = readdirSync3(dir, { withFileTypes: true });
|
|
1958
1970
|
for (const entry of entries) {
|
|
1959
|
-
if (entry.startsWith(".") || entry === "node_modules" || entry === "build") continue;
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
if (
|
|
1963
|
-
results.push(
|
|
1964
|
-
} else if (extname2(entry) === ".tscn") {
|
|
1965
|
-
results.push(fullPath);
|
|
1971
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules" || entry.name === "build") continue;
|
|
1972
|
+
if (entry.isDirectory()) {
|
|
1973
|
+
findSceneFiles(join7(dir, entry.name), results);
|
|
1974
|
+
} else if (extname2(entry.name) === ".tscn") {
|
|
1975
|
+
results.push(join7(dir, entry.name));
|
|
1966
1976
|
}
|
|
1967
1977
|
}
|
|
1968
1978
|
} catch {
|
|
@@ -1992,8 +2002,9 @@ function validateSceneArgs(action, args, config) {
|
|
|
1992
2002
|
}
|
|
1993
2003
|
return { projectPath, scenePath, newPath };
|
|
1994
2004
|
}
|
|
1995
|
-
function resolvePath(base,
|
|
1996
|
-
|
|
2005
|
+
function resolvePath(base, relativePath) {
|
|
2006
|
+
if (base) return safeResolve(base, relativePath);
|
|
2007
|
+
return resolve11(relativePath);
|
|
1997
2008
|
}
|
|
1998
2009
|
async function handleScenes(action, args, config) {
|
|
1999
2010
|
const { projectPath, scenePath, newPath } = validateSceneArgs(action, args, config);
|
|
@@ -2001,7 +2012,7 @@ async function handleScenes(action, args, config) {
|
|
|
2001
2012
|
case "create": {
|
|
2002
2013
|
const rootType = args.root_type || "Node2D";
|
|
2003
2014
|
const rootName = args.root_name || basename(scenePath, ".tscn");
|
|
2004
|
-
const fullPath =
|
|
2015
|
+
const fullPath = resolve11(projectPath, scenePath);
|
|
2005
2016
|
if (existsSync11(fullPath)) {
|
|
2006
2017
|
throw new GodotMCPError(
|
|
2007
2018
|
`Scene already exists: ${scenePath}`,
|
|
@@ -2016,9 +2027,9 @@ async function handleScenes(action, args, config) {
|
|
|
2016
2027
|
Root: ${rootName} (${rootType})`);
|
|
2017
2028
|
}
|
|
2018
2029
|
case "list": {
|
|
2019
|
-
const resolvedPath =
|
|
2030
|
+
const resolvedPath = resolve11(projectPath);
|
|
2020
2031
|
const scenes = findSceneFiles(resolvedPath);
|
|
2021
|
-
const relativePaths = scenes.map((s) =>
|
|
2032
|
+
const relativePaths = scenes.map((s) => relative3(resolvedPath, s).replace(/\\/g, "/"));
|
|
2022
2033
|
return formatJSON({
|
|
2023
2034
|
project: resolvedPath,
|
|
2024
2035
|
count: relativePaths.length,
|
|
@@ -2059,7 +2070,7 @@ Root: ${rootName} (${rootType})`);
|
|
|
2059
2070
|
return formatSuccess(`Duplicated: ${scenePath} -> ${newPath}`);
|
|
2060
2071
|
}
|
|
2061
2072
|
case "set_main": {
|
|
2062
|
-
const configPath = join7(
|
|
2073
|
+
const configPath = join7(resolve11(projectPath), "project.godot");
|
|
2063
2074
|
if (!existsSync11(configPath)) {
|
|
2064
2075
|
throw new GodotMCPError("No project.godot found", "PROJECT_NOT_FOUND", "Verify the project path.");
|
|
2065
2076
|
}
|
|
@@ -2079,26 +2090,8 @@ Root: ${rootName} (${rootType})`);
|
|
|
2079
2090
|
}
|
|
2080
2091
|
|
|
2081
2092
|
// src/tools/composite/scripts.ts
|
|
2082
|
-
import { existsSync as existsSync12, mkdirSync as mkdirSync2, readdirSync as readdirSync4, readFileSync as readFileSync12,
|
|
2093
|
+
import { existsSync as existsSync12, mkdirSync as mkdirSync2, readdirSync as readdirSync4, readFileSync as readFileSync12, unlinkSync as unlinkSync3, writeFileSync as writeFileSync10 } from "node:fs";
|
|
2083
2094
|
import { dirname as dirname2, extname as extname3, join as join8, relative as relative4, resolve as resolve12 } from "node:path";
|
|
2084
|
-
|
|
2085
|
-
// src/tools/helpers/paths.ts
|
|
2086
|
-
import { isAbsolute, relative as relative3, resolve as resolve11 } from "node:path";
|
|
2087
|
-
function safeResolve(baseDir, targetPath) {
|
|
2088
|
-
const resolvedBase = resolve11(baseDir);
|
|
2089
|
-
const resolvedTarget = resolve11(resolvedBase, targetPath);
|
|
2090
|
-
const relativePath = relative3(resolvedBase, resolvedTarget);
|
|
2091
|
-
if (relativePath.startsWith("..") || isAbsolute(relativePath)) {
|
|
2092
|
-
throw new GodotMCPError(
|
|
2093
|
-
`Access denied: Path '${targetPath}' resolves to '${resolvedTarget}' which is outside the project root '${resolvedBase}'.`,
|
|
2094
|
-
"INVALID_ARGS",
|
|
2095
|
-
"Ensure all file paths are within the project directory."
|
|
2096
|
-
);
|
|
2097
|
-
}
|
|
2098
|
-
return resolvedTarget;
|
|
2099
|
-
}
|
|
2100
|
-
|
|
2101
|
-
// src/tools/composite/scripts.ts
|
|
2102
2095
|
var SCRIPT_TEMPLATES = {
|
|
2103
2096
|
Node: `extends Node
|
|
2104
2097
|
|
|
@@ -2192,15 +2185,14 @@ func _ready() -> void:
|
|
|
2192
2185
|
}
|
|
2193
2186
|
function findScriptFiles(dir, results = []) {
|
|
2194
2187
|
try {
|
|
2195
|
-
const entries = readdirSync4(dir);
|
|
2188
|
+
const entries = readdirSync4(dir, { withFileTypes: true });
|
|
2196
2189
|
for (const entry of entries) {
|
|
2197
|
-
if (entry.startsWith(".") || entry === "node_modules" || entry === "build" || entry === "addons")
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
results.push(fullPath);
|
|
2190
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules" || entry.name === "build" || entry.name === "addons")
|
|
2191
|
+
continue;
|
|
2192
|
+
if (entry.isDirectory()) {
|
|
2193
|
+
findScriptFiles(join8(dir, entry.name), results);
|
|
2194
|
+
} else if (extname3(entry.name) === ".gd") {
|
|
2195
|
+
results.push(join8(dir, entry.name));
|
|
2204
2196
|
}
|
|
2205
2197
|
}
|
|
2206
2198
|
} catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMvD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW;;;;;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMvD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW;;;;;GAuDpG"}
|
|
@@ -28,6 +28,10 @@ export async function handleConfig(action, args, config) {
|
|
|
28
28
|
if (!validKeys.includes(key)) {
|
|
29
29
|
throw new GodotMCPError(`Invalid config key: ${key}`, 'INVALID_ARGS', `Valid keys: ${validKeys.join(', ')}`);
|
|
30
30
|
}
|
|
31
|
+
// Validate paths don't contain shell metacharacters
|
|
32
|
+
if ((key === 'project_path' || key === 'godot_path') && /[;&|`$(){}]/.test(value)) {
|
|
33
|
+
throw new GodotMCPError(`Invalid characters in ${key}`, 'INVALID_ARGS', 'Path must not contain shell metacharacters: ; & | ` $ ( ) { }');
|
|
34
|
+
}
|
|
31
35
|
runtimeConfig[key] = value;
|
|
32
36
|
// Apply to active config
|
|
33
37
|
if (key === 'project_path') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/tools/composite/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAE/E,yBAAyB;AACzB,MAAM,aAAa,GAA2B,EAAE,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,IAA6B,EAAE,MAAmB;IACnG,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,UAAU,CAAC;gBAChB,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,cAAc;gBAC9C,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,SAAS;gBACpD,YAAY,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;gBAC7C,iBAAiB,EAAE,aAAa;aACjC,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAA;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAA;YAElC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,cAAc,EAAE,0CAA0C,CAAC,CAAA;YACzG,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,cAAc,EAAE,4BAA4B,CAAC,CAAA;YAC7F,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;YAC3D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,aAAa,CAAC,uBAAuB,GAAG,EAAE,EAAE,cAAc,EAAE,eAAe,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC9G,CAAC;YAED,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAE1B,yBAAyB;YACzB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;gBAC3B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAA;YAC5B,CAAC;iBAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAA;YAC1B,CAAC;YAED,OAAO,aAAa,CAAC,mBAAmB,GAAG,MAAM,KAAK,EAAE,CAAC,CAAA;QAC3D,CAAC;QAED;YACE,MAAM,IAAI,aAAa,CACrB,mBAAmB,MAAM,EAAE,EAC3B,gBAAgB,EAChB,0DAA0D,CAC3D,CAAA;IACL,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/tools/composite/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAE/E,yBAAyB;AACzB,MAAM,aAAa,GAA2B,EAAE,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,IAA6B,EAAE,MAAmB;IACnG,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,UAAU,CAAC;gBAChB,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,cAAc;gBAC9C,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,SAAS;gBACpD,YAAY,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;gBAC7C,iBAAiB,EAAE,aAAa;aACjC,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAA;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAA;YAElC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,cAAc,EAAE,0CAA0C,CAAC,CAAA;YACzG,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,cAAc,EAAE,4BAA4B,CAAC,CAAA;YAC7F,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;YAC3D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,aAAa,CAAC,uBAAuB,GAAG,EAAE,EAAE,cAAc,EAAE,eAAe,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC9G,CAAC;YAED,oDAAoD;YACpD,IAAI,CAAC,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,YAAY,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClF,MAAM,IAAI,aAAa,CACrB,yBAAyB,GAAG,EAAE,EAC9B,cAAc,EACd,+DAA+D,CAChE,CAAA;YACH,CAAC;YAED,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAE1B,yBAAyB;YACzB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;gBAC3B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAA;YAC5B,CAAC;iBAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAA;YAC1B,CAAC;YAED,OAAO,aAAa,CAAC,mBAAmB,GAAG,MAAM,KAAK,EAAE,CAAC,CAAA;QAC3D,CAAC;QAED;YACE,MAAM,IAAI,aAAa,CACrB,mBAAmB,MAAM,EAAE,EAC3B,gBAAgB,EAChB,0DAA0D,CAC3D,CAAA;IACL,CAAC;AACH,CAAC"}
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
* Editor tool - Godot editor management
|
|
3
3
|
* Actions: launch | status
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { execFile } from 'node:child_process';
|
|
6
6
|
import { resolve } from 'node:path';
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
8
|
import { launchGodotEditor } from '../../godot/headless.js';
|
|
9
9
|
import { formatJSON, formatSuccess, GodotMCPError } from '../helpers/errors.js';
|
|
10
|
-
const
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
11
|
/**
|
|
12
12
|
* Check if any Godot processes are running
|
|
13
13
|
*/
|
|
14
14
|
async function getGodotProcessesAsync() {
|
|
15
15
|
try {
|
|
16
16
|
if (process.platform === 'win32') {
|
|
17
|
-
const { stdout } = await
|
|
17
|
+
const { stdout } = await execFileAsync('tasklist', ['/FI', 'IMAGENAME eq godot*', '/FO', 'CSV', '/NH'], {
|
|
18
18
|
encoding: 'utf-8',
|
|
19
19
|
});
|
|
20
20
|
return stdout
|
|
@@ -25,7 +25,7 @@ async function getGodotProcessesAsync() {
|
|
|
25
25
|
return { pid: parts[1] || 'unknown', name: parts[0] || 'godot' };
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
-
const { stdout } = await
|
|
28
|
+
const { stdout } = await execFileAsync('pgrep', ['-la', 'godot'], {
|
|
29
29
|
encoding: 'utf-8',
|
|
30
30
|
});
|
|
31
31
|
return stdout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../../src/tools/composite/editor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../../src/tools/composite/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AA+CvD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW;;;;;GA+FvG"}
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
import { existsSync, readdirSync, readFileSync, statSync, unlinkSync } from 'node:fs';
|
|
6
6
|
import { extname, join, relative, resolve } from 'node:path';
|
|
7
7
|
import { formatJSON, formatSuccess, GodotMCPError } from '../helpers/errors.js';
|
|
8
|
+
import { safeResolve } from '../helpers/paths.js';
|
|
8
9
|
const RESOURCE_EXTENSIONS = new Set([
|
|
9
10
|
'.tres',
|
|
10
11
|
'.res',
|
|
11
12
|
'.tscn',
|
|
12
|
-
'.tscn',
|
|
13
13
|
'.png',
|
|
14
14
|
'.jpg',
|
|
15
15
|
'.jpeg',
|
|
@@ -24,21 +24,19 @@ const RESOURCE_EXTENSIONS = new Set([
|
|
|
24
24
|
'.gdshaderinc',
|
|
25
25
|
'.import',
|
|
26
26
|
]);
|
|
27
|
-
function findResourceFiles(dir, extensions) {
|
|
27
|
+
function findResourceFiles(dir, extensions, results = []) {
|
|
28
28
|
const exts = extensions || RESOURCE_EXTENSIONS;
|
|
29
|
-
const results = [];
|
|
30
29
|
try {
|
|
31
|
-
const entries = readdirSync(dir);
|
|
30
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
32
31
|
for (const entry of entries) {
|
|
33
|
-
if (entry.startsWith('.') || entry === 'node_modules' || entry === 'build')
|
|
32
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'build')
|
|
34
33
|
continue;
|
|
35
|
-
const fullPath = join(dir, entry);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
results.push(...findResourceFiles(fullPath, exts));
|
|
34
|
+
const fullPath = join(dir, entry.name);
|
|
35
|
+
if (entry.isDirectory()) {
|
|
36
|
+
findResourceFiles(fullPath, exts, results);
|
|
39
37
|
}
|
|
40
|
-
else if (exts.has(extname(entry).toLowerCase())) {
|
|
41
|
-
results.push({ path: fullPath, size:
|
|
38
|
+
else if (exts.has(extname(entry.name).toLowerCase())) {
|
|
39
|
+
results.push({ path: fullPath, size: statSync(fullPath).size });
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
}
|
|
@@ -80,7 +78,7 @@ export async function handleResources(action, args, config) {
|
|
|
80
78
|
const resPath = args.resource_path;
|
|
81
79
|
if (!resPath)
|
|
82
80
|
throw new GodotMCPError('No resource_path specified', 'INVALID_ARGS', 'Provide resource_path.');
|
|
83
|
-
const fullPath = projectPath ?
|
|
81
|
+
const fullPath = projectPath ? safeResolve(projectPath, resPath) : resolve(resPath);
|
|
84
82
|
if (!existsSync(fullPath))
|
|
85
83
|
throw new GodotMCPError(`Resource not found: ${resPath}`, 'RESOURCE_ERROR', 'Check the file path.');
|
|
86
84
|
const stat = statSync(fullPath);
|
|
@@ -107,7 +105,7 @@ export async function handleResources(action, args, config) {
|
|
|
107
105
|
const resPath = args.resource_path;
|
|
108
106
|
if (!resPath)
|
|
109
107
|
throw new GodotMCPError('No resource_path specified', 'INVALID_ARGS', 'Provide resource_path.');
|
|
110
|
-
const fullPath = projectPath ?
|
|
108
|
+
const fullPath = projectPath ? safeResolve(projectPath, resPath) : resolve(resPath);
|
|
111
109
|
if (!existsSync(fullPath))
|
|
112
110
|
throw new GodotMCPError(`Resource not found: ${resPath}`, 'RESOURCE_ERROR', 'Check the file path.');
|
|
113
111
|
unlinkSync(fullPath);
|
|
@@ -121,7 +119,7 @@ export async function handleResources(action, args, config) {
|
|
|
121
119
|
const resPath = args.resource_path;
|
|
122
120
|
if (!resPath)
|
|
123
121
|
throw new GodotMCPError('No resource_path specified', 'INVALID_ARGS', 'Provide resource_path.');
|
|
124
|
-
const importPath = projectPath ?
|
|
122
|
+
const importPath = projectPath ? safeResolve(projectPath, `${resPath}.import`) : resolve(`${resPath}.import`);
|
|
125
123
|
if (!existsSync(importPath)) {
|
|
126
124
|
return formatJSON({ path: resPath, imported: false, message: 'No .import file found.' });
|
|
127
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../../src/tools/composite/resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../../src/tools/composite/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenes.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/scenes.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"scenes.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/scenes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,sBAAsB,CAAA;AA0H7E,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW;;;;;GAuGpG"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Scenes tool - Scene file management
|
|
3
3
|
* Actions: create | list | info | delete | duplicate | set_main
|
|
4
4
|
*/
|
|
5
|
-
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync,
|
|
5
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import { readFile } from 'node:fs/promises';
|
|
7
7
|
import { basename, dirname, extname, join, relative, resolve } from 'node:path';
|
|
8
8
|
import { formatJSON, formatSuccess, GodotMCPError } from '../helpers/errors.js';
|
|
9
|
+
import { safeResolve } from '../helpers/paths.js';
|
|
9
10
|
import { setSettingInContent } from '../helpers/project-settings.js';
|
|
10
11
|
/**
|
|
11
12
|
* Parse a .tscn file to extract scene information
|
|
@@ -52,20 +53,17 @@ async function parseTscnFile(filePath) {
|
|
|
52
53
|
/**
|
|
53
54
|
* Recursively find all .tscn files in a directory
|
|
54
55
|
*/
|
|
55
|
-
function findSceneFiles(dir) {
|
|
56
|
-
const results = [];
|
|
56
|
+
function findSceneFiles(dir, results = []) {
|
|
57
57
|
try {
|
|
58
|
-
const entries = readdirSync(dir);
|
|
58
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
59
59
|
for (const entry of entries) {
|
|
60
|
-
if (entry.startsWith('.') || entry === 'node_modules' || entry === 'build')
|
|
60
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'build')
|
|
61
61
|
continue;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (stat.isDirectory()) {
|
|
65
|
-
results.push(...findSceneFiles(fullPath));
|
|
62
|
+
if (entry.isDirectory()) {
|
|
63
|
+
findSceneFiles(join(dir, entry.name), results);
|
|
66
64
|
}
|
|
67
|
-
else if (extname(entry) === '.tscn') {
|
|
68
|
-
results.push(
|
|
65
|
+
else if (extname(entry.name) === '.tscn') {
|
|
66
|
+
results.push(join(dir, entry.name));
|
|
69
67
|
}
|
|
70
68
|
}
|
|
71
69
|
}
|
|
@@ -102,8 +100,10 @@ function validateSceneArgs(action, args, config) {
|
|
|
102
100
|
}
|
|
103
101
|
return { projectPath, scenePath, newPath };
|
|
104
102
|
}
|
|
105
|
-
function resolvePath(base,
|
|
106
|
-
|
|
103
|
+
function resolvePath(base, relativePath) {
|
|
104
|
+
if (base)
|
|
105
|
+
return safeResolve(base, relativePath);
|
|
106
|
+
return resolve(relativePath);
|
|
107
107
|
}
|
|
108
108
|
export async function handleScenes(action, args, config) {
|
|
109
109
|
const { projectPath, scenePath, newPath } = validateSceneArgs(action, args, config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../../../src/tools/composite/scenes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../../../src/tools/composite/scenes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/scripts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/scripts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAmHvD,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW;;;;;GAqIrG"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Scripts tool - GDScript file management
|
|
3
3
|
* Actions: create | read | write | attach | list | delete
|
|
4
4
|
*/
|
|
5
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync,
|
|
5
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import { dirname, extname, join, relative, resolve } from 'node:path';
|
|
7
7
|
import { formatJSON, formatSuccess, GodotMCPError } from '../helpers/errors.js';
|
|
8
8
|
import { safeResolve } from '../helpers/paths.js';
|
|
@@ -94,17 +94,18 @@ function getTemplate(extendsType) {
|
|
|
94
94
|
}
|
|
95
95
|
function findScriptFiles(dir, results = []) {
|
|
96
96
|
try {
|
|
97
|
-
const entries = readdirSync(dir);
|
|
97
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
98
98
|
for (const entry of entries) {
|
|
99
|
-
if (entry.startsWith('.') ||
|
|
99
|
+
if (entry.name.startsWith('.') ||
|
|
100
|
+
entry.name === 'node_modules' ||
|
|
101
|
+
entry.name === 'build' ||
|
|
102
|
+
entry.name === 'addons')
|
|
100
103
|
continue;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (stat.isDirectory()) {
|
|
104
|
-
findScriptFiles(fullPath, results);
|
|
104
|
+
if (entry.isDirectory()) {
|
|
105
|
+
findScriptFiles(join(dir, entry.name), results);
|
|
105
106
|
}
|
|
106
|
-
else if (extname(entry) === '.gd') {
|
|
107
|
-
results.push(
|
|
107
|
+
else if (extname(entry.name) === '.gd') {
|
|
108
|
+
results.push(join(dir, entry.name));
|
|
108
109
|
}
|
|
109
110
|
}
|
|
110
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../../src/tools/composite/scripts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../../src/tools/composite/scripts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@n24q02m/better-godot-mcp",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Enhanced MCP server for Godot Engine with composite mega-tools and comprehensive game development tooling.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "build/src/init-server.js",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"zod": "^4.3.6"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@biomejs/biome": "^2.4.
|
|
37
|
-
"@types/node": "^
|
|
38
|
-
"@vitest/coverage-v8": "^
|
|
36
|
+
"@biomejs/biome": "^2.4.6",
|
|
37
|
+
"@types/node": "^25.3.3",
|
|
38
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
39
39
|
"esbuild": "^0.27.3",
|
|
40
40
|
"tsx": "^4.21.0",
|
|
41
41
|
"typescript": "^5.9.3",
|
|
42
|
-
"vitest": "^
|
|
42
|
+
"vitest": "^4.0.18"
|
|
43
43
|
},
|
|
44
44
|
"trustedDependencies": [
|
|
45
45
|
"esbuild"
|