#!/usr/bin/env node 'use strict'; const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); const { parseArgs, normalizeInstallChannel, normalizeInstallScope, upsertCodexProjectMcp, verifyVocToolDiscovery, persistNeutralCredential } = require('../bin/claude-voc'); async function main() { const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'voc-installer-acceptance-')); const targetDir = path.join(tempRoot, '.codex', 'plugins', 'voc-intelligence'); const configDir = path.join(tempRoot, '.codex'); const configPath = path.join(configDir, 'config.toml'); const credentialsPath = path.join(tempRoot, '.vocmarket', 'credentials.json'); const previousToken = process.env.FMODE_API_KEY; try { assert.strictEqual(normalizeInstallChannel('CODEX'), 'codex'); assert.strictEqual(normalizeInstallScope('codex', 'global'), 'global'); assert.strictEqual(normalizeInstallScope('workbuddy', 'global'), 'project'); const options = parseArgs(['workspace', '--activate', '--channel=codex', '--scope=global']); assert.strictEqual(options.activate, true); assert.strictEqual(options.smoke, false); assert.strictEqual(options.channel, 'codex'); assert.strictEqual(options.scope, 'global'); fs.mkdirSync(configDir, { recursive: true }); fs.writeFileSync(configPath, [ 'model = "gpt-test"', '', '[mcp_servers.existing]', 'command = "existing-command"', '', '[mcp_servers.voc]', 'command = "old-command"', '' ].join('\n')); upsertCodexProjectMcp(targetDir, tempRoot); const config = fs.readFileSync(configPath, 'utf8'); assert.match(config, /model = "gpt-test"/); assert.match(config, /\[mcp_servers\.existing]/); assert.strictEqual((config.match(/\[mcp_servers\.voc]/g) || []).length, 1); assert.ok(config.includes('mcp\\\\src\\\\server.js') || config.includes('mcp/src/server.js')); process.env.FMODE_API_KEY = 'sk-installer_acceptance-123456789'; assert.strictEqual(persistNeutralCredential(credentialsPath), true); const credentials = JSON.parse(fs.readFileSync(credentialsPath, 'utf8')); assert.strictEqual(credentials.fmodeApiKey, process.env.FMODE_API_KEY); const tools = await verifyVocToolDiscovery(path.resolve(__dirname, '..')); assert.ok(tools.includes('voc_api_search')); assert.ok(tools.includes('voc_api_doc')); assert.ok(tools.includes('voc_api_call')); console.log(JSON.stringify({ status: 'ok', checks: ['channels', 'no-smoke activation', 'Codex TOML merge', 'neutral credentials', 'MCP ListTools'], discoveredTools: tools }, null, 2)); } finally { if (previousToken === undefined) delete process.env.FMODE_API_KEY; else process.env.FMODE_API_KEY = previousToken; fs.rmSync(tempRoot, { recursive: true, force: true }); } } main().catch(error => { console.error(error.message); process.exit(1); });