agentvibes 4.2.0 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agentvibes/bmad/bmad-voices.md +69 -69
- package/.agentvibes/config.json +12 -0
- package/.claude/activation-instructions +54 -54
- package/.claude/audio/tracks/README.md +52 -52
- package/.claude/commands/agent-vibes/add.md +21 -21
- package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
- package/.claude/commands/agent-vibes/agent.md +79 -79
- package/.claude/commands/agent-vibes/background-music.md +111 -111
- package/.claude/commands/agent-vibes/bmad.md +198 -198
- package/.claude/commands/agent-vibes/clean.md +18 -18
- package/.claude/commands/agent-vibes/cleanup.md +18 -18
- package/.claude/commands/agent-vibes/commands.json +145 -145
- package/.claude/commands/agent-vibes/effects.md +97 -97
- package/.claude/commands/agent-vibes/get.md +9 -9
- package/.claude/commands/agent-vibes/hide.md +91 -91
- package/.claude/commands/agent-vibes/language.md +23 -23
- package/.claude/commands/agent-vibes/learn.md +67 -67
- package/.claude/commands/agent-vibes/list.md +13 -13
- package/.claude/commands/agent-vibes/mute.md +37 -37
- package/.claude/commands/agent-vibes/preview.md +17 -17
- package/.claude/commands/agent-vibes/provider.md +68 -68
- package/.claude/commands/agent-vibes/replay-target.md +14 -14
- package/.claude/commands/agent-vibes/sample.md +12 -12
- package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
- package/.claude/commands/agent-vibes/set-pretext.md +65 -65
- package/.claude/commands/agent-vibes/set-speed.md +41 -41
- package/.claude/commands/agent-vibes/show.md +84 -84
- package/.claude/commands/agent-vibes/switch.md +87 -87
- package/.claude/commands/agent-vibes/target-voice.md +26 -26
- package/.claude/commands/agent-vibes/target.md +30 -30
- package/.claude/commands/agent-vibes/translate.md +68 -68
- package/.claude/commands/agent-vibes/unmute.md +45 -45
- package/.claude/commands/agent-vibes/verbosity.md +89 -89
- package/.claude/commands/agent-vibes/whoami.md +7 -7
- package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
- package/.claude/commands/agent-vibes-rdp.md +24 -24
- package/.claude/config/agentvibes.json +1 -0
- package/.claude/config/audio-effects.cfg +2 -2
- package/.claude/config/audio-effects.cfg.sample +52 -52
- package/.claude/config/background-music-volume.txt +1 -0
- package/.claude/config/intro-text.txt +1 -0
- package/.claude/config/piper-speech-rate.txt +4 -0
- package/.claude/config/piper-target-speech-rate.txt +1 -0
- package/.claude/config/reverb-level.txt +1 -0
- package/.claude/config/tts-speech-rate.txt +4 -0
- package/.claude/config/tts-target-speech-rate.txt +1 -0
- package/.claude/docs/TERMUX_SETUP.md +408 -408
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/README-TTS-QUEUE.md +135 -135
- package/.claude/hooks/audio-cache-utils.sh +246 -246
- package/.claude/hooks/audio-processor.sh +433 -433
- package/.claude/hooks/background-music-manager.sh +404 -404
- package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
- package/.claude/hooks/bmad-speak.sh +269 -269
- package/.claude/hooks/bmad-tts-injector.sh +568 -568
- package/.claude/hooks/bmad-voice-manager.sh +928 -928
- package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
- package/.claude/hooks/clawdbot-receiver.sh +107 -107
- package/.claude/hooks/clean-audio-cache.sh +22 -22
- package/.claude/hooks/cleanup-cache.sh +106 -106
- package/.claude/hooks/configure-rdp-mode.sh +137 -137
- package/.claude/hooks/download-extra-voices.sh +244 -244
- package/.claude/hooks/effects-manager.sh +268 -268
- package/.claude/hooks/github-star-reminder.sh +154 -154
- package/.claude/hooks/language-manager.sh +362 -362
- package/.claude/hooks/learn-manager.sh +492 -492
- package/.claude/hooks/macos-voice-manager.sh +205 -205
- package/.claude/hooks/migrate-background-music.sh +125 -125
- package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
- package/.claude/hooks/optimize-background-music.sh +87 -87
- package/.claude/hooks/path-resolver.sh +60 -60
- package/.claude/hooks/personality-manager.sh +448 -448
- package/.claude/hooks/piper-download-voices.sh +225 -225
- package/.claude/hooks/piper-installer.sh +292 -292
- package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
- package/.claude/hooks/piper-voice-manager.sh +24 -3
- package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
- package/.claude/hooks/play-tts-enhanced.sh +105 -105
- package/.claude/hooks/play-tts-macos.sh +368 -368
- package/.claude/hooks/play-tts-piper.sh +679 -679
- package/.claude/hooks/play-tts-soprano.sh +356 -356
- package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
- package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
- package/.claude/hooks/play-tts.sh +301 -301
- package/.claude/hooks/prepare-release.sh +54 -54
- package/.claude/hooks/provider-commands.sh +617 -617
- package/.claude/hooks/provider-manager.sh +399 -399
- package/.claude/hooks/replay-target-audio.sh +95 -95
- package/.claude/hooks/requirements.txt +6 -6
- package/.claude/hooks/sentiment-manager.sh +201 -201
- package/.claude/hooks/session-start-tts.sh +81 -81
- package/.claude/hooks/soprano-gradio-synth.py +139 -139
- package/.claude/hooks/speed-manager.sh +291 -291
- package/.claude/hooks/stop-tts.sh +84 -84
- package/.claude/hooks/termux-installer.sh +261 -261
- package/.claude/hooks/translate-manager.sh +341 -341
- package/.claude/hooks/translator.py +237 -237
- package/.claude/hooks/tts-queue-worker.sh +145 -145
- package/.claude/hooks/tts-queue.sh +165 -165
- package/.claude/hooks/verbosity-manager.sh +178 -178
- package/.claude/hooks/voice-manager.sh +548 -548
- package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
- package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
- package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
- package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
- package/.claude/hooks-windows/effects-manager.ps1 +294 -0
- package/.claude/hooks-windows/language-manager.ps1 +193 -0
- package/.claude/hooks-windows/learn-manager.ps1 +241 -0
- package/.claude/hooks-windows/personality-manager.ps1 +266 -0
- package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
- package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
- package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
- package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
- package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
- package/.claude/hooks-windows/play-tts.ps1 +344 -266
- package/.claude/hooks-windows/provider-manager.ps1 +29 -10
- package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
- package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
- package/.claude/hooks-windows/speed-manager.ps1 +166 -0
- package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
- package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
- package/.claude/output-styles/agent-vibes.md +202 -202
- package/.claude/personalities/angry.md +14 -14
- package/.claude/personalities/annoying.md +14 -14
- package/.claude/personalities/crass.md +14 -14
- package/.claude/personalities/dramatic.md +14 -14
- package/.claude/personalities/dry-humor.md +50 -50
- package/.claude/personalities/flirty.md +20 -20
- package/.claude/personalities/funny.md +14 -14
- package/.claude/personalities/grandpa.md +32 -32
- package/.claude/personalities/millennial.md +14 -14
- package/.claude/personalities/moody.md +14 -14
- package/.claude/personalities/normal.md +16 -16
- package/.claude/personalities/pirate.md +14 -14
- package/.claude/personalities/poetic.md +14 -14
- package/.claude/personalities/professional.md +14 -14
- package/.claude/personalities/rapper.md +55 -55
- package/.claude/personalities/robot.md +14 -14
- package/.claude/personalities/sarcastic.md +38 -38
- package/.claude/personalities/sassy.md +14 -14
- package/.claude/personalities/surfer-dude.md +14 -14
- package/.claude/personalities/zen.md +14 -14
- package/.claude/settings.json +15 -15
- package/.claude/verbosity.txt +1 -1
- package/.clawdbot/README.md +105 -105
- package/.clawdbot/skill/SKILL.md +241 -241
- package/.mcp.json +12 -0
- package/CLAUDE.md +170 -170
- package/README.md +2029 -2007
- package/RELEASE_NOTES.md +1310 -1203
- package/WINDOWS-SETUP.md +208 -208
- package/bin/agent-vibes +39 -39
- package/bin/agentvibes-voice-browser.js +1840 -1840
- package/bin/agentvibes.js +48 -2
- package/bin/mcp-server.js +121 -121
- package/bin/mcp-server.sh +206 -206
- package/bin/test-bmad-pr +78 -78
- package/mcp-server/QUICK_START.md +203 -203
- package/mcp-server/README.md +345 -345
- package/mcp-server/WINDOWS_SETUP.md +260 -260
- package/mcp-server/docs/troubleshooting-audio.md +313 -313
- package/mcp-server/examples/claude_desktop_config.json +11 -11
- package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
- package/mcp-server/examples/custom_instructions.md +169 -169
- package/mcp-server/install-deps.js +130 -130
- package/mcp-server/pyproject.toml +52 -52
- package/mcp-server/requirements.txt +2 -2
- package/mcp-server/server.py +1465 -1453
- package/mcp-server/test_server.py +395 -395
- package/mcp-server/test_windows_script_parity.py +336 -0
- package/package.json +110 -110
- package/setup-windows.ps1 +815 -815
- package/src/bmad-detector.js +71 -71
- package/src/cli/list-personalities.js +110 -110
- package/src/cli/list-voices.js +114 -114
- package/src/commands/bmad-voices.js +394 -394
- package/src/commands/install-mcp.js +476 -476
- package/src/console/app.js +824 -824
- package/src/console/audio-env.js +20 -1
- package/src/console/brand-colors.js +13 -13
- package/src/console/constants/personalities.js +44 -44
- package/src/console/footer-config.js +50 -50
- package/src/console/modals/modal-overlay.js +247 -247
- package/src/console/navigation.js +62 -62
- package/src/console/tabs/agents-tab.js +1684 -1516
- package/src/console/tabs/help-tab.js +261 -261
- package/src/console/tabs/install-tab.js +1007 -991
- package/src/console/tabs/music-tab.js +22 -8
- package/src/console/tabs/placeholder-tab.js +53 -53
- package/src/console/tabs/readme-tab.js +267 -267
- package/src/console/tabs/receiver-tab.js +1472 -1212
- package/src/console/tabs/settings-tab.js +208 -84
- package/src/console/tabs/voices-tab.js +100 -21
- package/src/console/widgets/destroy-list.js +25 -25
- package/src/console/widgets/format-utils.js +89 -89
- package/src/console/widgets/notice.js +55 -55
- package/src/console/widgets/personality-picker.js +185 -185
- package/src/console/widgets/reverb-picker.js +94 -94
- package/src/console/widgets/track-picker.js +285 -285
- package/src/installer/music-file-input.js +304 -304
- package/src/installer.js +5895 -5829
- package/src/services/agent-voice-store.js +423 -423
- package/src/services/config-service.js +264 -264
- package/src/services/navigation-service.js +123 -123
- package/src/services/provider-service.js +143 -132
- package/src/services/verbosity-service.js +157 -157
- package/src/utils/audio-duration-validator.js +298 -298
- package/src/utils/audio-format-validator.js +277 -277
- package/src/utils/dependency-checker.js +469 -466
- package/src/utils/file-ownership-verifier.js +358 -358
- package/src/utils/list-formatter.js +194 -194
- package/src/utils/music-file-validator.js +285 -285
- package/src/utils/preview-list-prompt.js +136 -136
- package/src/utils/provider-validator.js +96 -12
- package/src/utils/secure-music-storage.js +412 -412
- package/templates/agentvibes-receiver.sh +482 -482
- package/templates/audio/welcome-music.mp3 +0 -0
- package/voice-assignments.json +8244 -8244
- package/.claude/config/background-music-position.txt +0 -1
package/bin/agentvibes.js
CHANGED
|
@@ -13,8 +13,47 @@
|
|
|
13
13
|
|
|
14
14
|
import { fileURLToPath } from 'node:url';
|
|
15
15
|
import fs from 'node:fs';
|
|
16
|
-
import
|
|
17
|
-
import {
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { execFileSync } from 'node:child_process';
|
|
18
|
+
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = path.dirname(__filename);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Ensure all npm dependencies are installed before importing modules that need them.
|
|
24
|
+
* This prevents "Cannot find package" errors when running via npx with a stale cache
|
|
25
|
+
* or from a fresh clone without npm install.
|
|
26
|
+
*/
|
|
27
|
+
function ensureDependencies() {
|
|
28
|
+
const pkgRoot = path.resolve(__dirname, '..');
|
|
29
|
+
const nodeModules = path.join(pkgRoot, 'node_modules');
|
|
30
|
+
const pkgJsonPath = path.join(pkgRoot, 'package.json');
|
|
31
|
+
|
|
32
|
+
// Quick check: if node_modules doesn't exist or blessed is missing, run npm install
|
|
33
|
+
const criticalPackages = ['blessed', 'chalk', 'inquirer', 'commander'];
|
|
34
|
+
const missing = criticalPackages.filter(
|
|
35
|
+
pkg => !fs.existsSync(path.join(nodeModules, pkg))
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
if (missing.length === 0) return;
|
|
39
|
+
|
|
40
|
+
process.stderr.write(
|
|
41
|
+
`\n Installing missing dependencies (${missing.join(', ')})...\n\n`
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
execFileSync('npm', ['install', '--no-audit', '--no-fund'], {
|
|
46
|
+
cwd: pkgRoot,
|
|
47
|
+
stdio: 'inherit',
|
|
48
|
+
shell: process.platform === 'win32',
|
|
49
|
+
});
|
|
50
|
+
} catch {
|
|
51
|
+
process.stderr.write(
|
|
52
|
+
'\n Failed to install dependencies. Please run: npm install\n\n'
|
|
53
|
+
);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
18
57
|
|
|
19
58
|
/**
|
|
20
59
|
* Resolve CLI args to a TUI start tab or an error.
|
|
@@ -80,6 +119,13 @@ const _thisFile = fileURLToPath(import.meta.url);
|
|
|
80
119
|
const _argv1 = (() => { try { return fs.realpathSync(process.argv[1]); } catch { return process.argv[1]; } })();
|
|
81
120
|
|
|
82
121
|
if (_argv1 === _thisFile) {
|
|
122
|
+
// Ensure deps are installed BEFORE dynamic imports that need them
|
|
123
|
+
ensureDependencies();
|
|
124
|
+
|
|
125
|
+
// Dynamic imports — only loaded after deps are confirmed present
|
|
126
|
+
const { ConfigService } = await import('../src/services/config-service.js');
|
|
127
|
+
const { launchConsole } = await import('../src/console/app.js');
|
|
128
|
+
|
|
83
129
|
const configService = new ConfigService();
|
|
84
130
|
const result = resolveStartTab(process.argv.slice(2), configService);
|
|
85
131
|
|
package/bin/mcp-server.js
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* AgentVibes MCP Server Launcher (Cross-Platform)
|
|
5
|
-
*
|
|
6
|
-
* This Node.js script replaces the bash wrapper to work on Windows, macOS, and Linux.
|
|
7
|
-
* It auto-installs Python dependencies and launches the Python MCP server.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { spawn } from 'child_process';
|
|
11
|
-
import { fileURLToPath } from 'url';
|
|
12
|
-
import { dirname, join } from 'path';
|
|
13
|
-
import { existsSync } from 'fs';
|
|
14
|
-
import { platform } from 'os';
|
|
15
|
-
|
|
16
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
-
const __dirname = dirname(__filename);
|
|
18
|
-
|
|
19
|
-
// Package root is one level up from bin/
|
|
20
|
-
const PACKAGE_ROOT = join(__dirname, '..');
|
|
21
|
-
const MCP_SERVER = join(PACKAGE_ROOT, 'mcp-server', 'server.py');
|
|
22
|
-
const INSTALL_DEPS = join(PACKAGE_ROOT, 'mcp-server', 'install-deps.js');
|
|
23
|
-
|
|
24
|
-
// Check if Python MCP server exists
|
|
25
|
-
if (!existsSync(MCP_SERVER)) {
|
|
26
|
-
console.error(`❌ Error: MCP server not found at ${MCP_SERVER}`);
|
|
27
|
-
process.exit(1);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Function to find available Python command
|
|
31
|
-
async function findPythonCommand() {
|
|
32
|
-
const commands = platform() === 'win32' ? ['python', 'py', 'python3'] : ['python3', 'python'];
|
|
33
|
-
|
|
34
|
-
for (const cmd of commands) {
|
|
35
|
-
try {
|
|
36
|
-
const checkCmd = platform() === 'win32' ? 'where' : 'which';
|
|
37
|
-
const proc = spawn(checkCmd, [cmd], { stdio: 'ignore' });
|
|
38
|
-
const exists = await new Promise((resolve) => {
|
|
39
|
-
proc.on('close', (code) => resolve(code === 0));
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
if (exists) {
|
|
43
|
-
return cmd;
|
|
44
|
-
}
|
|
45
|
-
} catch (err) {
|
|
46
|
-
// Try next command
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Function to check if Python module is installed
|
|
54
|
-
function checkPythonModule(pythonCmd, moduleName) {
|
|
55
|
-
return new Promise((resolve) => {
|
|
56
|
-
const proc = spawn(pythonCmd, ['-c', `import ${moduleName}`], { stdio: 'ignore' });
|
|
57
|
-
proc.on('close', (code) => resolve(code === 0));
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Main setup and launch function
|
|
62
|
-
async function main() {
|
|
63
|
-
// Silent mode - no output to avoid breaking MCP JSON protocol
|
|
64
|
-
|
|
65
|
-
// Find Python command
|
|
66
|
-
const pythonCmd = await findPythonCommand();
|
|
67
|
-
if (!pythonCmd) {
|
|
68
|
-
console.error('ERROR: Python 3 not found. Install from https://python.org and restart Claude Desktop.');
|
|
69
|
-
process.exit(1);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Check if MCP Python package is installed
|
|
73
|
-
const hasMCP = await checkPythonModule(pythonCmd, 'mcp');
|
|
74
|
-
if (!hasMCP) {
|
|
75
|
-
// Try to install MCP package directly
|
|
76
|
-
try {
|
|
77
|
-
const installCmd = `${pythonCmd} -m pip install --user mcp`;
|
|
78
|
-
const installProc = spawn(pythonCmd, ['-m', 'pip', 'install', '--user', 'mcp'], {
|
|
79
|
-
stdio: 'pipe',
|
|
80
|
-
shell: false
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
await new Promise((resolve, reject) => {
|
|
84
|
-
installProc.on('close', (code) => {
|
|
85
|
-
if (code === 0) {
|
|
86
|
-
resolve();
|
|
87
|
-
} else {
|
|
88
|
-
console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
|
|
89
|
-
reject(new Error('Dependency installation failed'));
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
} catch (err) {
|
|
94
|
-
console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Launch the Python MCP server
|
|
100
|
-
const serverProc = spawn(pythonCmd, [MCP_SERVER], {
|
|
101
|
-
stdio: 'inherit',
|
|
102
|
-
env: process.env
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
serverProc.on('error', (err) => {
|
|
106
|
-
console.error('❌ Failed to start MCP server:', err.message);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
serverProc.on('close', (code) => {
|
|
111
|
-
process.exit(code || 0);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Handle termination signals
|
|
115
|
-
process.on('SIGINT', () => serverProc.kill('SIGINT'));
|
|
116
|
-
process.on('SIGTERM', () => serverProc.kill('SIGTERM'));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
main().catch((err) => {
|
|
120
|
-
console.error('❌ Error:', err.message);
|
|
121
|
-
process.exit(1);
|
|
122
|
-
});
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AgentVibes MCP Server Launcher (Cross-Platform)
|
|
5
|
+
*
|
|
6
|
+
* This Node.js script replaces the bash wrapper to work on Windows, macOS, and Linux.
|
|
7
|
+
* It auto-installs Python dependencies and launches the Python MCP server.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { spawn } from 'child_process';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
import { dirname, join } from 'path';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { platform } from 'os';
|
|
15
|
+
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
|
|
19
|
+
// Package root is one level up from bin/
|
|
20
|
+
const PACKAGE_ROOT = join(__dirname, '..');
|
|
21
|
+
const MCP_SERVER = join(PACKAGE_ROOT, 'mcp-server', 'server.py');
|
|
22
|
+
const INSTALL_DEPS = join(PACKAGE_ROOT, 'mcp-server', 'install-deps.js');
|
|
23
|
+
|
|
24
|
+
// Check if Python MCP server exists
|
|
25
|
+
if (!existsSync(MCP_SERVER)) {
|
|
26
|
+
console.error(`❌ Error: MCP server not found at ${MCP_SERVER}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Function to find available Python command
|
|
31
|
+
async function findPythonCommand() {
|
|
32
|
+
const commands = platform() === 'win32' ? ['python', 'py', 'python3'] : ['python3', 'python'];
|
|
33
|
+
|
|
34
|
+
for (const cmd of commands) {
|
|
35
|
+
try {
|
|
36
|
+
const checkCmd = platform() === 'win32' ? 'where' : 'which';
|
|
37
|
+
const proc = spawn(checkCmd, [cmd], { stdio: 'ignore' });
|
|
38
|
+
const exists = await new Promise((resolve) => {
|
|
39
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (exists) {
|
|
43
|
+
return cmd;
|
|
44
|
+
}
|
|
45
|
+
} catch (err) {
|
|
46
|
+
// Try next command
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Function to check if Python module is installed
|
|
54
|
+
function checkPythonModule(pythonCmd, moduleName) {
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
const proc = spawn(pythonCmd, ['-c', `import ${moduleName}`], { stdio: 'ignore' });
|
|
57
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Main setup and launch function
|
|
62
|
+
async function main() {
|
|
63
|
+
// Silent mode - no output to avoid breaking MCP JSON protocol
|
|
64
|
+
|
|
65
|
+
// Find Python command
|
|
66
|
+
const pythonCmd = await findPythonCommand();
|
|
67
|
+
if (!pythonCmd) {
|
|
68
|
+
console.error('ERROR: Python 3 not found. Install from https://python.org and restart Claude Desktop.');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Check if MCP Python package is installed
|
|
73
|
+
const hasMCP = await checkPythonModule(pythonCmd, 'mcp');
|
|
74
|
+
if (!hasMCP) {
|
|
75
|
+
// Try to install MCP package directly
|
|
76
|
+
try {
|
|
77
|
+
const installCmd = `${pythonCmd} -m pip install --user mcp`;
|
|
78
|
+
const installProc = spawn(pythonCmd, ['-m', 'pip', 'install', '--user', 'mcp'], {
|
|
79
|
+
stdio: 'pipe',
|
|
80
|
+
shell: false
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
await new Promise((resolve, reject) => {
|
|
84
|
+
installProc.on('close', (code) => {
|
|
85
|
+
if (code === 0) {
|
|
86
|
+
resolve();
|
|
87
|
+
} else {
|
|
88
|
+
console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
|
|
89
|
+
reject(new Error('Dependency installation failed'));
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
} catch (err) {
|
|
94
|
+
console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Launch the Python MCP server
|
|
100
|
+
const serverProc = spawn(pythonCmd, [MCP_SERVER], {
|
|
101
|
+
stdio: 'inherit',
|
|
102
|
+
env: process.env
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
serverProc.on('error', (err) => {
|
|
106
|
+
console.error('❌ Failed to start MCP server:', err.message);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
serverProc.on('close', (code) => {
|
|
111
|
+
process.exit(code || 0);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Handle termination signals
|
|
115
|
+
process.on('SIGINT', () => serverProc.kill('SIGINT'));
|
|
116
|
+
process.on('SIGTERM', () => serverProc.kill('SIGTERM'));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
main().catch((err) => {
|
|
120
|
+
console.error('❌ Error:', err.message);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
});
|