mirror of
https://github.com/wu736139669/hapi.git
synced 2026-11-08 01:43:07 +00:00
* feat(codex): load user MCP servers in HAPI sessions * feat(codex): proxy Windows MCP command shims * fix(codex): address MCP review feedback * fix(codex): use HAPI-owned MCP proxy * fix(codex): preserve Windows MCP argv boundaries * fix(codex): keep remote MCP placement unchanged
44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
import { copyCodexConfigFile, resolveCodexHome } from './codexHome';
|
|
|
|
const temporaryDirectories: string[] = [];
|
|
|
|
async function createTemporaryDirectory(): Promise<string> {
|
|
const directory = await mkdtemp(join(tmpdir(), 'hapi-codex-home-test-'));
|
|
temporaryDirectories.push(directory);
|
|
return directory;
|
|
}
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true, force: true })));
|
|
});
|
|
|
|
describe('codexHome', () => {
|
|
it('uses CODEX_HOME when configured and trims surrounding whitespace', () => {
|
|
expect(resolveCodexHome({ CODEX_HOME: ' C:\\codex-home ' })).toBe('C:\\codex-home');
|
|
});
|
|
|
|
it('copies config.toml without copying authentication or other state', async () => {
|
|
const sourceHome = await createTemporaryDirectory();
|
|
const targetHome = await createTemporaryDirectory();
|
|
await writeFile(join(sourceHome, 'config.toml'), '[mcp_servers.example]\ncommand = "server"\n');
|
|
await writeFile(join(sourceHome, 'auth.json'), '{"access_token":"not-copied"}\n');
|
|
|
|
await expect(copyCodexConfigFile(sourceHome, targetHome))
|
|
.resolves.toBe(join(targetHome, 'config.toml'));
|
|
await expect(readFile(join(targetHome, 'config.toml'), 'utf8'))
|
|
.resolves.toBe('[mcp_servers.example]\ncommand = "server"\n');
|
|
await expect(readFile(join(targetHome, 'auth.json'), 'utf8')).rejects.toMatchObject({ code: 'ENOENT' });
|
|
});
|
|
|
|
it('treats a missing user config as a valid first-run state', async () => {
|
|
const sourceHome = await createTemporaryDirectory();
|
|
const targetHome = await createTemporaryDirectory();
|
|
|
|
await expect(copyCodexConfigFile(sourceHome, targetHome)).resolves.toBeNull();
|
|
});
|
|
});
|