refactor: 拆分 claude-dev-stack 为 windows-dev-stack 和 wsl-dev-stack

将原 claude-dev-stack 目录拆分为独立的 Windows 和 WSL 部署栈,便于分别维护和使用。

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-05-29 01:11:20 +08:00
parent e8693dad2a
commit dd3eb24d0f
488 changed files with 33927 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import { createServer } from "node:http";
import { randomUUID } from "node:crypto";
import { GodotConnection } from "./godot-connection.js";
import { registerProjectTools } from "./tools/project-tools.js";
import { registerSceneTools } from "./tools/scene-tools.js";
import { registerNodeTools } from "./tools/node-tools.js";
import { registerScriptTools } from "./tools/script-tools.js";
import { registerEditorTools } from "./tools/editor-tools.js";
import { registerInputTools } from "./tools/input-tools.js";
import { registerRuntimeTools } from "./tools/runtime-tools.js";
import { registerAnimationTools } from "./tools/animation-tools.js";
import { registerTilemapTools } from "./tools/tilemap-tools.js";
import { registerThemeTools } from "./tools/theme-tools.js";
import { registerProfilingTools } from "./tools/profiling-tools.js";
import { registerBatchTools } from "./tools/batch-tools.js";
import { registerShaderTools } from "./tools/shader-tools.js";
import { registerExportTools } from "./tools/export-tools.js";
import { registerResourceTools } from "./tools/resource-tools.js";
import { registerAnimationTreeTools } from "./tools/animation-tree-tools.js";
import { registerPhysicsTools } from "./tools/physics-tools.js";
import { registerScene3DTools } from "./tools/scene-3d-tools.js";
import { registerParticleTools } from "./tools/particle-tools.js";
import { registerNavigationTools } from "./tools/navigation-tools.js";
import { registerAudioTools } from "./tools/audio-tools.js";
import { registerTestTools } from "./tools/test-tools.js";
import { registerAnalysisTools } from "./tools/analysis-tools.js";
import { registerInputMapTools } from "./tools/input-map-tools.js";
import { registerAndroidTools } from "./tools/android-tools.js";
import { MINIMAL_TOOLS, createFilteredServer } from "./utils/tool-filter.js";
import { loadInstructions } from "./utils/load-instructions.js";
const MINIMAL_MODE = process.argv.includes("--minimal");
const THREED_MODE = process.argv.includes("--3d");
const LITE_MODE = process.argv.includes("--lite") || MINIMAL_MODE || THREED_MODE;
const HTTP_MODE = process.argv.includes("--http");
const HTTP_PORT = parseInt(process.argv.find((_, i, a) => a[i - 1] === "--http-port") ||
process.env.GODOT_MCP_HTTP_PORT ||
"8001");
const explicitPort = process.env.GODOT_MCP_PORT;
const godot = new GodotConnection(parseInt(explicitPort || "6505"), !!explicitPort);
const serverName = MINIMAL_MODE
? "godot-mcp-pro-minimal"
: THREED_MODE
? "godot-mcp-pro-3d"
: LITE_MODE
? "godot-mcp-pro-lite"
: "godot-mcp-pro";
const server = new McpServer({
name: serverName,
version: "1.14.1",
}, {
instructions: loadInstructions(),
});
// In minimal mode, wrap the server to filter tool registrations
const toolServer = MINIMAL_MODE ? createFilteredServer(server, MINIMAL_TOOLS) : server;
// Core tools (always registered)
registerProjectTools(toolServer, godot);
registerSceneTools(toolServer, godot);
registerNodeTools(toolServer, godot);
registerScriptTools(toolServer, godot);
registerEditorTools(toolServer, godot);
registerInputTools(toolServer, godot);
registerRuntimeTools(toolServer, godot);
registerInputMapTools(toolServer, godot);
// 3D-critical tools (registered in FULL and --3d modes)
// Core (81) + Physics (6) + AnimationTree (8) + Navigation (5) = exactly 100 tools
if (!LITE_MODE || THREED_MODE) {
registerPhysicsTools(server, godot);
registerAnimationTreeTools(server, godot);
registerNavigationTools(server, godot);
}
// Extended tools (Full mode only)
if (!LITE_MODE) {
registerAnimationTools(server, godot);
registerAudioTools(server, godot);
registerBatchTools(server, godot);
registerExportTools(server, godot);
registerParticleTools(server, godot);
registerProfilingTools(server, godot);
registerResourceTools(server, godot);
registerScene3DTools(server, godot);
registerShaderTools(server, godot);
registerTestTools(server, godot);
registerThemeTools(server, godot);
registerTilemapTools(server, godot);
registerAnalysisTools(server, godot);
registerAndroidTools(server, godot);
}
// Start server
async function main() {
// Attempt initial connection to Godot (non-blocking).
// If this fails (all ports occupied, etc.), tool calls will fail with a
// clear error message from sendCommand until the user restarts the server.
godot.connect().catch((err) => {
console.error(`[MCP] Failed to start WebSocket server: ${err.message}`);
});
if (HTTP_MODE) {
// Streamable HTTP transport — clients connect via http://host:port/mcp
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: () => randomUUID(),
});
await server.connect(transport);
const httpServer = createServer(async (req, res) => {
const url = new URL(req.url || "/", `http://${req.headers.host}`);
if (url.pathname === "/mcp") {
await transport.handleRequest(req, res);
}
else {
res.writeHead(404).end("Not Found");
}
});
httpServer.listen(HTTP_PORT, () => {
const mode = MINIMAL_MODE ? "MINIMAL " : THREED_MODE ? "3D " : LITE_MODE ? "LITE " : "";
console.error(`[MCP] Godot MCP Pro ${mode}started (HTTP transport on http://127.0.0.1:${HTTP_PORT}/mcp)`);
});
}
else {
// Default stdio transport
const transport = new StdioServerTransport();
await server.connect(transport);
const modeLabel = MINIMAL_MODE
? "[MCP] Godot MCP Pro MINIMAL started (35 tools, stdio transport)"
: THREED_MODE
? "[MCP] Godot MCP Pro 3D started (100 tools, stdio transport)"
: LITE_MODE
? "[MCP] Godot MCP Pro LITE started (81 tools, stdio transport)"
: "[MCP] Godot MCP Pro started (stdio transport)";
console.error(modeLabel);
}
}
main().catch((err) => {
console.error("[MCP] Fatal error:", err);
process.exit(1);
});
//# sourceMappingURL=index.js.map