feat: agor-launcher MCP server + .mcp.json + updated Rule 56
This commit is contained in:
parent
58ac5e8c84
commit
e9d7356064
4 changed files with 282 additions and 49 deletions
99
.claude/mcp-servers/agor-launcher/index.mjs
Normal file
99
.claude/mcp-servers/agor-launcher/index.mjs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
#!/usr/bin/env node
|
||||
/**
|
||||
* agor-launcher MCP — manages Electrobun app lifecycle.
|
||||
* Tools: start, stop, restart, clean, rebuild, status, kill-stale, build-native, logs
|
||||
*/
|
||||
import { execSync, spawn } from "child_process";
|
||||
import { createInterface } from "readline";
|
||||
|
||||
const SCRIPT = "/home/hibryda/code/ai/agent-orchestrator/scripts/launch.sh";
|
||||
|
||||
function run(cmd, timeout = 30000) {
|
||||
try {
|
||||
return execSync(`bash ${SCRIPT} ${cmd}`, {
|
||||
timeout,
|
||||
encoding: "utf-8",
|
||||
stdio: ["pipe", "pipe", "pipe"],
|
||||
}).trim();
|
||||
} catch (e) {
|
||||
return `Error: ${e.stderr || e.message}`;
|
||||
}
|
||||
}
|
||||
|
||||
const TOOLS = {
|
||||
"agor-start": {
|
||||
description: "Start Electrobun app (kills old instances first). Pass clean=true to remove build cache.",
|
||||
schema: { type: "object", properties: { clean: { type: "boolean", default: false } } },
|
||||
handler: ({ clean }) => run(clean ? "start --clean" : "start", 60000),
|
||||
},
|
||||
"agor-stop": {
|
||||
description: "Stop all running Electrobun/PTY/Vite instances.",
|
||||
schema: { type: "object", properties: {} },
|
||||
handler: () => run("stop"),
|
||||
},
|
||||
"agor-restart": {
|
||||
description: "Restart Electrobun app. Pass clean=true for clean restart.",
|
||||
schema: { type: "object", properties: { clean: { type: "boolean", default: false } } },
|
||||
handler: ({ clean }) => run(clean ? "restart --clean" : "restart", 60000),
|
||||
},
|
||||
"agor-clean": {
|
||||
description: "Remove build artifacts, caches, and temp files.",
|
||||
schema: { type: "object", properties: {} },
|
||||
handler: () => run("clean"),
|
||||
},
|
||||
"agor-rebuild": {
|
||||
description: "Full rebuild: clean + npm install + vite build + native C library + PTY daemon.",
|
||||
schema: { type: "object", properties: {} },
|
||||
handler: () => run("rebuild", 120000),
|
||||
},
|
||||
"agor-status": {
|
||||
description: "Show running processes, ports, and window status.",
|
||||
schema: { type: "object", properties: {} },
|
||||
handler: () => run("status"),
|
||||
},
|
||||
"agor-kill-stale": {
|
||||
description: "Kill ALL stale agor-ptyd instances that accumulated over sessions.",
|
||||
schema: { type: "object", properties: {} },
|
||||
handler: () => run("kill-stale"),
|
||||
},
|
||||
"agor-build-native": {
|
||||
description: "Rebuild libagor-resize.so (GTK resize) and agor-ptyd (PTY daemon).",
|
||||
schema: { type: "object", properties: {} },
|
||||
handler: () => run("build-native", 120000),
|
||||
},
|
||||
};
|
||||
|
||||
// Minimal MCP stdio server
|
||||
const rl = createInterface({ input: process.stdin });
|
||||
function send(msg) { process.stdout.write(JSON.stringify(msg) + "\n"); }
|
||||
|
||||
rl.on("line", (line) => {
|
||||
let msg;
|
||||
try { msg = JSON.parse(line); } catch { return; }
|
||||
|
||||
if (msg.method === "initialize") {
|
||||
send({ jsonrpc: "2.0", id: msg.id, result: {
|
||||
protocolVersion: "2024-11-05",
|
||||
capabilities: { tools: {} },
|
||||
serverInfo: { name: "agor-launcher", version: "1.0.0" },
|
||||
}});
|
||||
} else if (msg.method === "notifications/initialized") {
|
||||
// no-op
|
||||
} else if (msg.method === "tools/list") {
|
||||
send({ jsonrpc: "2.0", id: msg.id, result: {
|
||||
tools: Object.entries(TOOLS).map(([name, t]) => ({
|
||||
name, description: t.description, inputSchema: t.schema,
|
||||
})),
|
||||
}});
|
||||
} else if (msg.method === "tools/call") {
|
||||
const tool = TOOLS[msg.params.name];
|
||||
if (!tool) {
|
||||
send({ jsonrpc: "2.0", id: msg.id, error: { code: -32601, message: `Unknown tool: ${msg.params.name}` }});
|
||||
return;
|
||||
}
|
||||
const result = tool.handler(msg.params.arguments || {});
|
||||
send({ jsonrpc: "2.0", id: msg.id, result: {
|
||||
content: [{ type: "text", text: result }],
|
||||
}});
|
||||
}
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue