'use strict'; /** gitea-mcp stdio 预检离线回归。 */ const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const process = require('node:process'); const { DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS, probeGiteaMcp, } = require('../lib/gitea-mcp-probe'); const fixture = path.join(__dirname, '..', 'fixtures', 'gitea-workflow', 'mock-gitea-mcp.js'); async function expectCode(promise, code) { await assert.rejects(promise, (error) => { assert.equal(error.code, code); return true; }); } async function main() { assert.equal(DEFAULT_TIMEOUT_MS, 8000); assert.equal(MAX_TIMEOUT_MS, 30000); const success = await probeGiteaMcp({ command: process.execPath, args: [fixture], env: { GITEA_MCP_FIXTURE_MODE: 'success', GITEA_ACCESS_TOKEN: 'fixture-token' }, timeoutMs: 1000, }); assert.equal(success.ok, true); assert.equal(success.protocolVersion, '2024-11-05'); await expectCode(probeGiteaMcp({ command: process.execPath, args: [fixture], env: { GITEA_MCP_FIXTURE_MODE: 'error' }, timeoutMs: 1000, }), 'gitea_mcp_handshake_failed'); await expectCode(probeGiteaMcp({ command: process.execPath, args: [fixture], env: { GITEA_MCP_FIXTURE_MODE: 'exit' }, timeoutMs: 1000, }), 'gitea_mcp_start_failed'); await expectCode(probeGiteaMcp({ command: process.execPath, args: [fixture], env: { GITEA_MCP_FIXTURE_MODE: 'timeout' }, timeoutMs: 250, }), 'gitea_mcp_handshake_timeout'); await expectCode(probeGiteaMcp({ command: '/definitely/missing/gitea-mcp', timeoutMs: 1000, }), 'gitea_mcp_spawn_failed'); // 协议守门:失败仍交给统一的队列终态回执,线程级注入和“禁止自动安装”不回退。 const serverSource = fs.readFileSync(path.join(__dirname, '..', 'server.js'), 'utf8'); const probeSource = fs.readFileSync(path.join(__dirname, '..', 'lib', 'gitea-mcp-probe.js'), 'utf8'); const buildSource = fs.readFileSync(path.join(__dirname, '..', 'scripts', 'build-single-exe.js'), 'utf8'); assert.match(serverSource, /await probeGiteaMcp\(\{/); assert.match(serverSource, /code: 'gitea_mcp_not_found'/); assert.match(serverSource, /path\.join\(APP_DIR, 'bin', bundledName\)/); assert.match(probeSource, /gitea_mcp_start_failed/); assert.match(probeSource, /gitea_mcp_handshake_failed/); assert.match(probeSource, /gitea_mcp_handshake_timeout/); assert.match(serverSource, /failed: \(task\) => `任务失败:/); assert.match(serverSource, /failed_reply: \(task\) => `回帖失败:/); assert.match(serverSource, /statusComments/); assert.match(serverSource, /config\['mcp_servers\.gitea'\]/); assert.match(buildSource, /copyDirIfExists\(path\.join\(projectRoot, 'bin'\), path\.join\(releaseDir, 'bin'\)\)/); assert.doesNotMatch(serverSource, /npm\s+(?:install| i)\b|curl\s+[^\n]*(?:gitea-mcp|github)/i); console.log('Gitea MCP probe unit checks passed.'); } main().catch((error) => { console.error(error.stack || error.message || error); process.exitCode = 1; });