agentvibes 2.17.2 → 2.17.3

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/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![Publish](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
12
12
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
13
 
14
- **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.17.2
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.17.3
15
15
 
16
16
  ---
17
17
 
@@ -111,7 +111,7 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
111
111
 
112
112
  ## 📰 Latest Release
113
113
 
114
- **[v2.17.0 - Installer UX Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.17.2)** 🎉
114
+ **[v2.17.0 - Installer UX Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.17.3)** 🎉
115
115
 
116
116
  AgentVibes v2.17.0 delivers a complete installer user experience transformation with intelligent system dependency checking, paginated configuration flow, and comprehensive inline help.
117
117
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "agentvibes",
4
- "version": "2.17.2",
4
+ "version": "2.17.3",
5
5
  "description": "Now your AI Agents can finally talk back! Professional TTS voice for Claude Code and Claude Desktop (via MCP) with multi-provider support.",
6
6
  "homepage": "https://agentvibes.org",
7
7
  "keywords": [
package/src/installer.js CHANGED
@@ -208,6 +208,7 @@ async function collectConfiguration(options = {}) {
208
208
  const config = {
209
209
  provider: null,
210
210
  piperPath: null,
211
+ defaultVoice: null,
211
212
  reverb: 'light',
212
213
  backgroundMusic: {
213
214
  enabled: true,
@@ -219,13 +220,14 @@ async function collectConfiguration(options = {}) {
219
220
  if (options.yes) {
220
221
  // Non-interactive mode - use defaults
221
222
  config.provider = process.platform === 'darwin' ? 'macos' : 'piper';
223
+ config.defaultVoice = process.platform === 'darwin' ? 'Samantha' : 'en_US-ryan-high';
222
224
  const homeDir = process.env.HOME || process.env.USERPROFILE;
223
225
  config.piperPath = path.join(homeDir, '.claude', 'piper-voices');
224
226
  return config;
225
227
  }
226
228
 
227
229
  let currentPage = 0;
228
- const sectionPages = 4; // System Dependencies, Provider, Audio Settings, Verbosity
230
+ const sectionPages = 5; // System Dependencies, Provider, Voice Selection, Audio Settings, Verbosity
229
231
  const pageOffset = options.pageOffset || 0;
230
232
  const totalPages = options.totalPages || sectionPages;
231
233
 
@@ -240,7 +242,8 @@ async function collectConfiguration(options = {}) {
240
242
  // Show header
241
243
  const pageTitle = currentPage === 0 ? 'System Dependencies' :
242
244
  currentPage === 1 ? 'TTS Provider Configuration' :
243
- currentPage === 2 ? 'Audio Settings' :
245
+ currentPage === 2 ? 'Voice Selection' :
246
+ currentPage === 3 ? 'Audio Settings' :
244
247
  'Verbosity Settings';
245
248
  const { header, footer } = createPageHeaderFooter(pageTitle, currentPage, totalPages, pageOffset);
246
249
  console.log(header);
@@ -453,7 +456,86 @@ async function collectConfiguration(options = {}) {
453
456
  }
454
457
 
455
458
  } else if (currentPage === 2) {
456
- // Page 3: Audio Settings (Reverb + Background Music)
459
+ // Page 3: Voice Selection
460
+ console.log(boxen(
461
+ chalk.white('Choose a default voice for your AgentVibes.\n\n') +
462
+ chalk.gray('This will be used when no specific voice is configured.\n') +
463
+ chalk.gray('You can change this anytime with: ') + chalk.cyan('/agent-vibes:voice switch <name>'),
464
+ {
465
+ padding: 1,
466
+ margin: 1,
467
+ borderStyle: 'round',
468
+ borderColor: 'gray',
469
+ title: chalk.bold('🎤 Default Voice'),
470
+ titleAlignment: 'center'
471
+ }
472
+ ));
473
+
474
+ if (config.provider === 'piper') {
475
+ // Piper voices - popular selections
476
+ const piperVoices = [
477
+ { name: chalk.cyan('en_US-ryan-high') + chalk.gray(' (Male, American, High Quality)'), value: 'en_US-ryan-high' },
478
+ { name: chalk.magenta('en_US-amy-medium') + chalk.gray(' (Female, American, Clear)'), value: 'en_US-amy-medium' },
479
+ { name: chalk.cyan('en_US-joe-medium') + chalk.gray(' (Male, American, Warm)'), value: 'en_US-joe-medium' },
480
+ { name: chalk.magenta('en_US-lessac-medium') + chalk.gray(' (Female, American, Professional)'), value: 'en_US-lessac-medium' },
481
+ { name: chalk.cyan('en_GB-alan-medium') + chalk.gray(' (Male, British, Refined)'), value: 'en_GB-alan-medium' },
482
+ { name: chalk.magenta('en_GB-southern_english_female-medium') + chalk.gray(' (Female, British)'), value: 'en_GB-southern_english_female-medium' },
483
+ new inquirer.Separator(),
484
+ { name: chalk.yellow('Skip - I\'ll set this later'), value: '__skip__' },
485
+ { name: chalk.magentaBright('← Back to Provider Selection'), value: '__back__' }
486
+ ];
487
+
488
+ const { selectedVoice } = await inquirer.prompt([{
489
+ type: 'list',
490
+ name: 'selectedVoice',
491
+ message: chalk.yellow('Select your default Piper voice:'),
492
+ choices: piperVoices,
493
+ default: 'en_US-ryan-high',
494
+ pageSize: 12
495
+ }]);
496
+
497
+ if (selectedVoice === '__back__') {
498
+ return null;
499
+ }
500
+
501
+ if (selectedVoice !== '__skip__') {
502
+ config.defaultVoice = selectedVoice;
503
+ }
504
+
505
+ } else if (config.provider === 'macos') {
506
+ // macOS Say voices - popular selections
507
+ const macOSVoices = [
508
+ { name: chalk.cyan('Samantha') + chalk.gray(' (Female, American)'), value: 'Samantha' },
509
+ { name: chalk.cyan('Alex') + chalk.gray(' (Male, American)'), value: 'Alex' },
510
+ { name: chalk.magenta('Flo') + chalk.gray(' (Female, American, Expressive)'), value: 'Flo' },
511
+ { name: chalk.cyan('Tom') + chalk.gray(' (Male, American)'), value: 'Tom' },
512
+ { name: chalk.magenta('Karen') + chalk.gray(' (Female, Australian)'), value: 'Karen' },
513
+ { name: chalk.cyan('Daniel') + chalk.gray(' (Male, British)'), value: 'Daniel' },
514
+ new inquirer.Separator(),
515
+ { name: chalk.yellow('Skip - I\'ll set this later'), value: '__skip__' },
516
+ { name: chalk.magentaBright('← Back to Provider Selection'), value: '__back__' }
517
+ ];
518
+
519
+ const { selectedVoice } = await inquirer.prompt([{
520
+ type: 'list',
521
+ name: 'selectedVoice',
522
+ message: chalk.yellow('Select your default macOS voice:'),
523
+ choices: macOSVoices,
524
+ default: 'Samantha',
525
+ pageSize: 12
526
+ }]);
527
+
528
+ if (selectedVoice === '__back__') {
529
+ return null;
530
+ }
531
+
532
+ if (selectedVoice !== '__skip__') {
533
+ config.defaultVoice = selectedVoice;
534
+ }
535
+ }
536
+
537
+ } else if (currentPage === 3) {
538
+ // Page 4: Audio Settings (Reverb + Background Music)
457
539
  console.log(boxen(
458
540
  chalk.white('Configure audio effects and background music for your Agents.\n\n') +
459
541
  chalk.yellow('Reverb:\n') +
@@ -541,8 +623,8 @@ async function collectConfiguration(options = {}) {
541
623
  config.backgroundMusic.track = selectedTrack;
542
624
  }
543
625
 
544
- } else if (currentPage === 3) {
545
- // Page 4: Verbosity Settings
626
+ } else if (currentPage === 4) {
627
+ // Page 5: Verbosity Settings
546
628
  console.log(boxen(
547
629
  chalk.white('Choose how much Claude speaks during interactions.\n\n') +
548
630
  chalk.yellow('🔊 High:\n') +
@@ -2644,17 +2726,21 @@ async function install(options = {}) {
2644
2726
  await fs.writeFile(piperConfigPath, piperVoicesPath);
2645
2727
  }
2646
2728
 
2647
- // Set default voice based on provider to prevent fallback to mismatched global voice
2729
+ // Set default voice based on user selection or provider defaults
2648
2730
  const voiceConfigPath = path.join(claudeDir, 'tts-voice.txt');
2649
- let defaultVoice;
2650
- switch (selectedProvider) {
2651
- case 'piper':
2652
- defaultVoice = 'en_US-lessac-medium';
2653
- break;
2654
- case 'macos':
2655
- default:
2656
- defaultVoice = 'Samantha';
2657
- break;
2731
+ let defaultVoice = userConfig.defaultVoice;
2732
+
2733
+ // Fallback to defaults if voice wasn't selected
2734
+ if (!defaultVoice) {
2735
+ switch (selectedProvider) {
2736
+ case 'piper':
2737
+ defaultVoice = 'en_US-ryan-high';
2738
+ break;
2739
+ case 'macos':
2740
+ default:
2741
+ defaultVoice = 'Samantha';
2742
+ break;
2743
+ }
2658
2744
  }
2659
2745
  await fs.writeFile(voiceConfigPath, defaultVoice);
2660
2746