Skip to main content
Glama
masx200

Persistent Terminal MCP Server

by masx200
test-terminal-fixes.mjs8.9 kB
#!/usr/bin/env node /** * 测试终端修复 * 验证命令执行、交互式输入和输出读取的问题是否已修复 */ import { TerminalManager } from "../../dist/terminal-manager.js"; console.log("=".repeat(80)); console.log("测试终端修复"); console.log("=".repeat(80)); console.log(); const manager = new TerminalManager({ maxBufferSize: 10000, sessionTimeout: 86400000, compactAnimations: true, animationThrottleMs: 100, }); let testsPassed = 0; let testsFailed = 0; function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function test1_BasicCommandExecution() { console.log("测试 1: 基本命令执行"); console.log("-".repeat(80)); try { // 1. 创建终端 const terminalId = await manager.createTerminal({ cwd: process.cwd(), shell: "/bin/bash", }); console.log(`✓ 创建终端: ${terminalId}`); // 2. 执行简单命令 await manager.writeToTerminal({ terminalId, input: 'echo "Hello World"', }); console.log('✓ 发送命令: echo "Hello World"'); // 3. 等待输出稳定 await manager.waitForOutputStable(terminalId, 2000, 300); console.log("✓ 等待输出稳定"); // 4. 读取输出 const output = await manager.readFromTerminal({ terminalId }); console.log("✓ 读取输出"); // 5. 验证输出 if (output.output.includes("Hello World")) { console.log('✅ 测试通过:输出包含 "Hello World"'); testsPassed++; } else { console.error('❌ 测试失败:输出不包含 "Hello World"'); console.error("实际输出:", output.output); testsFailed++; } // 验证命令回显 if (output.output.includes('echo "Hello World"')) { console.log("✅ 测试通过:输出包含命令回显"); testsPassed++; } else { console.error("❌ 测试失败:输出不包含命令回显"); testsFailed++; } // 清理 await manager.killTerminal(terminalId); console.log("✓ 终端已清理"); } catch (error) { console.error("❌ 测试失败:", error.message); testsFailed += 2; } console.log(); } async function test2_MultipleCommands() { console.log("测试 2: 多个命令执行"); console.log("-".repeat(80)); try { // 1. 创建终端 const terminalId = await manager.createTerminal({ cwd: process.cwd(), shell: "/bin/bash", }); console.log(`✓ 创建终端: ${terminalId}`); // 2. 执行第一个命令 await manager.writeToTerminal({ terminalId, input: "pwd", }); console.log("✓ 发送命令: pwd"); await manager.waitForOutputStable(terminalId, 2000, 300); // 3. 执行第二个命令 await manager.writeToTerminal({ terminalId, input: 'echo "Second command"', }); console.log('✓ 发送命令: echo "Second command"'); await manager.waitForOutputStable(terminalId, 2000, 300); // 4. 读取输出 const output = await manager.readFromTerminal({ terminalId }); console.log("✓ 读取输出"); // 5. 验证输出 if ( output.output.includes("pwd") && output.output.includes("Second command") ) { console.log("✅ 测试通过:输出包含两个命令"); testsPassed++; } else { console.error("❌ 测试失败:输出不完整"); console.error("实际输出:", output.output); testsFailed++; } // 清理 await manager.killTerminal(terminalId); console.log("✓ 终端已清理"); } catch (error) { console.error("❌ 测试失败:", error.message); testsFailed++; } console.log(); } async function test3_RawInput() { console.log("测试 3: 原始输入(不自动添加换行符)"); console.log("-".repeat(80)); try { // 1. 创建终端 const terminalId = await manager.createTerminal({ cwd: process.cwd(), shell: "/bin/bash", }); console.log(`✓ 创建终端: ${terminalId}`); // 2. 发送原始输入(不自动添加换行) await manager.writeToTerminal({ terminalId, input: 'echo "test"', appendNewline: false, }); console.log('✓ 发送原始输入: echo "test" (无换行)'); await sleep(500); // 3. 手动发送换行符 await manager.writeToTerminal({ terminalId, input: "\n", appendNewline: false, }); console.log("✓ 发送换行符"); await manager.waitForOutputStable(terminalId, 2000, 300); // 4. 读取输出 const output = await manager.readFromTerminal({ terminalId }); console.log("✓ 读取输出"); // 5. 验证输出 if (output.output.includes("test")) { console.log("✅ 测试通过:原始输入正常工作"); testsPassed++; } else { console.error("❌ 测试失败:原始输入未正常工作"); console.error("实际输出:", output.output); testsFailed++; } // 清理 await manager.killTerminal(terminalId); console.log("✓ 终端已清理"); } catch (error) { console.error("❌ 测试失败:", error.message); testsFailed++; } console.log(); } async function test4_OutputRealtimeReading() { console.log("测试 4: 输出实时读取"); console.log("-".repeat(80)); try { // 1. 创建终端 const terminalId = await manager.createTerminal({ cwd: process.cwd(), shell: "/bin/bash", }); console.log(`✓ 创建终端: ${terminalId}`); // 2. 执行命令 await manager.writeToTerminal({ terminalId, input: 'echo "Line 1"; sleep 0.5; echo "Line 2"', }); console.log('✓ 发送命令: echo "Line 1"; sleep 0.5; echo "Line 2"'); // 3. 立即读取(应该只看到 Line 1) await sleep(200); const output1 = await manager.readFromTerminal({ terminalId }); console.log("✓ 第一次读取完成"); // 4. 等待后再读取(应该看到 Line 2) await sleep(800); const output2 = await manager.readFromTerminal({ terminalId }); console.log("✓ 第二次读取完成"); // 5. 验证 const hasLine1 = output1.output.includes("Line 1"); const hasLine2 = output2.output.includes("Line 2"); if (hasLine1 && hasLine2) { console.log("✅ 测试通过:输出实时更新"); testsPassed++; } else { console.error("❌ 测试失败:输出未实时更新"); console.error("第一次输出:", output1.output); console.error("第二次输出:", output2.output); testsFailed++; } // 清理 await manager.killTerminal(terminalId); console.log("✓ 终端已清理"); } catch (error) { console.error("❌ 测试失败:", error.message); testsFailed++; } console.log(); } async function test5_TerminalEnvironment() { console.log("测试 5: 终端环境配置"); console.log("-".repeat(80)); try { // 1. 创建终端 const terminalId = await manager.createTerminal({ cwd: process.cwd(), shell: "/bin/bash", }); console.log(`✓ 创建终端: ${terminalId}`); // 2. 检查 TERM 环境变量 await manager.writeToTerminal({ terminalId, input: "echo $TERM", }); console.log("✓ 发送命令: echo $TERM"); await manager.waitForOutputStable(terminalId, 2000, 300); // 3. 读取输出 const output = await manager.readFromTerminal({ terminalId }); console.log("✓ 读取输出"); // 4. 验证 TERM 设置 if (output.output.includes("xterm-256color")) { console.log("✅ 测试通过:TERM 环境变量正确设置为 xterm-256color"); testsPassed++; } else { console.error("❌ 测试失败:TERM 环境变量未正确设置"); console.error("实际输出:", output.output); testsFailed++; } // 清理 await manager.killTerminal(terminalId); console.log("✓ 终端已清理"); } catch (error) { console.error("❌ 测试失败:", error.message); testsFailed++; } console.log(); } // 运行所有测试 async function runAllTests() { try { await test1_BasicCommandExecution(); await test2_MultipleCommands(); await test3_RawInput(); await test4_OutputRealtimeReading(); await test5_TerminalEnvironment(); // 显示测试结果 console.log("=".repeat(80)); console.log("测试结果汇总"); console.log("=".repeat(80)); console.log(`通过: ${testsPassed}`); console.log(`失败: ${testsFailed}`); console.log(); if (testsFailed > 0) { console.error("❌ 部分测试失败"); process.exit(1); } else { console.log("✅ 所有测试通过!"); process.exit(0); } } catch (error) { console.error("测试过程中发生错误:", error); process.exit(1); } finally { await manager.shutdown(); } } runAllTests();

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/masx200/persistent-terminal-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server