installer-acceptance.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env node
  2. 'use strict';
  3. const assert = require('assert');
  4. const fs = require('fs');
  5. const os = require('os');
  6. const path = require('path');
  7. const {
  8. parseArgs,
  9. normalizeInstallChannel,
  10. normalizeInstallScope,
  11. upsertCodexProjectMcp,
  12. verifyVocToolDiscovery,
  13. persistNeutralCredential
  14. } = require('../bin/claude-voc');
  15. async function main() {
  16. const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'voc-installer-acceptance-'));
  17. const targetDir = path.join(tempRoot, '.codex', 'plugins', 'voc-intelligence');
  18. const configDir = path.join(tempRoot, '.codex');
  19. const configPath = path.join(configDir, 'config.toml');
  20. const credentialsPath = path.join(tempRoot, '.vocmarket', 'credentials.json');
  21. const previousToken = process.env.FMODE_API_KEY;
  22. try {
  23. assert.strictEqual(normalizeInstallChannel('CODEX'), 'codex');
  24. assert.strictEqual(normalizeInstallScope('codex', 'global'), 'global');
  25. assert.strictEqual(normalizeInstallScope('workbuddy', 'global'), 'project');
  26. const options = parseArgs(['workspace', '--activate', '--channel=codex', '--scope=global']);
  27. assert.strictEqual(options.activate, true);
  28. assert.strictEqual(options.smoke, false);
  29. assert.strictEqual(options.channel, 'codex');
  30. assert.strictEqual(options.scope, 'global');
  31. fs.mkdirSync(configDir, { recursive: true });
  32. fs.writeFileSync(configPath, [
  33. 'model = "gpt-test"',
  34. '',
  35. '[mcp_servers.existing]',
  36. 'command = "existing-command"',
  37. '',
  38. '[mcp_servers.voc]',
  39. 'command = "old-command"',
  40. ''
  41. ].join('\n'));
  42. upsertCodexProjectMcp(targetDir, tempRoot);
  43. const config = fs.readFileSync(configPath, 'utf8');
  44. assert.match(config, /model = "gpt-test"/);
  45. assert.match(config, /\[mcp_servers\.existing]/);
  46. assert.strictEqual((config.match(/\[mcp_servers\.voc]/g) || []).length, 1);
  47. assert.ok(config.includes('mcp\\\\src\\\\server.js') || config.includes('mcp/src/server.js'));
  48. process.env.FMODE_API_KEY = 'sk-installer_acceptance-123456789';
  49. assert.strictEqual(persistNeutralCredential(credentialsPath), true);
  50. const credentials = JSON.parse(fs.readFileSync(credentialsPath, 'utf8'));
  51. assert.strictEqual(credentials.fmodeApiKey, process.env.FMODE_API_KEY);
  52. const tools = await verifyVocToolDiscovery(path.resolve(__dirname, '..'));
  53. assert.ok(tools.includes('voc_api_search'));
  54. assert.ok(tools.includes('voc_api_doc'));
  55. assert.ok(tools.includes('voc_api_call'));
  56. console.log(JSON.stringify({
  57. status: 'ok',
  58. checks: ['channels', 'no-smoke activation', 'Codex TOML merge', 'neutral credentials', 'MCP ListTools'],
  59. discoveredTools: tools
  60. }, null, 2));
  61. } finally {
  62. if (previousToken === undefined) delete process.env.FMODE_API_KEY;
  63. else process.env.FMODE_API_KEY = previousToken;
  64. fs.rmSync(tempRoot, { recursive: true, force: true });
  65. }
  66. }
  67. main().catch(error => {
  68. console.error(error.message);
  69. process.exit(1);
  70. });