agentvibes 5.12.0 → 5.13.0

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.
Files changed (72) hide show
  1. package/.claude/commands/agent-vibes/commands.json +0 -20
  2. package/.claude/commands/agent-vibes/unmute.md +6 -2
  3. package/.claude/config/audio-effects.cfg +6 -6
  4. package/.claude/github-star-reminder.txt +1 -1
  5. package/.claude/hooks/agentvibes-session-id.sh +69 -0
  6. package/.claude/hooks/bmad-party-speak.sh +20 -4
  7. package/.claude/hooks/bmad-speak.sh +60 -2
  8. package/.claude/hooks/bmad-tts-injector.sh +20 -1
  9. package/.claude/hooks/bmad-voice-manager.sh +25 -3
  10. package/.claude/hooks/clawdbot-receiver-SECURE.sh +21 -2
  11. package/.claude/hooks/clawdbot-receiver.sh +19 -1
  12. package/.claude/hooks/elevenlabs-voices.sh +62 -0
  13. package/.claude/hooks/kokoro-installer.sh +20 -10
  14. package/.claude/hooks/language-manager.sh +10 -3
  15. package/.claude/hooks/party-set-room.sh +71 -0
  16. package/.claude/hooks/party-stage-roster.py +328 -0
  17. package/.claude/hooks/personality-manager.sh +19 -2
  18. package/.claude/hooks/piper-voice-manager.sh +3 -2
  19. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +24 -5
  20. package/.claude/hooks/play-tts-elevenlabs.sh +38 -118
  21. package/.claude/hooks/play-tts-kokoro.sh +33 -6
  22. package/.claude/hooks/play-tts-soprano.sh +3 -2
  23. package/.claude/hooks/play-tts-ssh-remote.sh +37 -29
  24. package/.claude/hooks/play-tts-termux-ssh.sh +5 -4
  25. package/.claude/hooks/play-tts.sh +66 -61
  26. package/.claude/hooks/provider-catalog.json +352 -0
  27. package/.claude/hooks/provider-catalog.sh +161 -0
  28. package/.claude/hooks/provider-commands.sh +2 -1
  29. package/.claude/hooks/provider-manager.sh +47 -9
  30. package/.claude/hooks/python-resolver.sh +117 -0
  31. package/.claude/hooks/session-id.sh +56 -0
  32. package/.claude/hooks/session-start-tts.sh +39 -0
  33. package/.claude/hooks/speed-manager.sh +1 -1
  34. package/.claude/hooks/translate-manager.sh +3 -2
  35. package/.claude/hooks/translator.py +1 -1
  36. package/.claude/hooks/voice-manager.sh +242 -10
  37. package/.claude/hooks-windows/language-manager.ps1 +7 -1
  38. package/.claude/hooks-windows/personality-manager.ps1 +16 -1
  39. package/.claude/hooks-windows/play-tts-kokoro.ps1 +20 -4
  40. package/.claude/hooks-windows/play-tts.ps1 +32 -3
  41. package/.claude/hooks-windows/provider-catalog.ps1 +140 -0
  42. package/.claude/hooks-windows/provider-manager.ps1 +63 -8
  43. package/.claude/hooks-windows/tts-watcher.ps1 +33 -12
  44. package/.claude/hooks-windows/voice-manager-windows.ps1 +49 -0
  45. package/.mcp.json +0 -7
  46. package/README.md +12 -3
  47. package/RELEASE_NOTES.md +43 -0
  48. package/mcp-server/server.py +146 -49
  49. package/mcp-server/test_mcp_correctness.py +20 -2
  50. package/mcp-server/test_windows_script_parity.py +0 -2
  51. package/package.json +1 -1
  52. package/src/cli/list-voices.js +218 -114
  53. package/src/console/bling.js +71 -0
  54. package/src/console/music-preview.js +79 -0
  55. package/src/console/tabs/music-tab.js +16 -39
  56. package/src/console/tabs/settings-tab.js +195 -13
  57. package/src/console/tabs/setup-tab.js +9 -34
  58. package/src/console/tabs/voices-tab.js +83 -14
  59. package/src/console/widgets/track-picker.js +82 -0
  60. package/src/installer.js +124 -10
  61. package/src/services/provider-catalog.js +412 -0
  62. package/src/services/provider-voice-catalog.js +52 -73
  63. package/src/services/tts-engine-service.js +29 -0
  64. package/src/utils/provider-validator.js +62 -12
  65. package/.claude/commands/agent-vibes/language.md +0 -23
  66. package/.claude/commands/agent-vibes/learn.md +0 -67
  67. package/.claude/commands/agent-vibes/replay-target.md +0 -14
  68. package/.claude/commands/agent-vibes/target-voice.md +0 -26
  69. package/.claude/commands/agent-vibes/target.md +0 -30
  70. package/.claude/hooks/learn-manager.sh +0 -492
  71. package/.claude/hooks/replay-target-audio.sh +0 -95
  72. package/.claude/hooks-windows/learn-manager.ps1 +0 -241
@@ -1,87 +1,55 @@
1
1
  /**
2
- * Provider voice catalogs — single source of truth for the static voice lists
3
- * of the cloud/neural providers, plus a helper that returns the voice pool for
4
- * whichever provider is currently active.
2
+ * Provider voice catalogs — BACK-COMPAT SHIM.
5
3
  *
6
- * Piper voices are NOT listed here (they are discovered on disk via
7
- * scanInstalledVoices); this module covers the providers whose voices are a
8
- * fixed catalog: ElevenLabs and Kokoro. Single-voice providers (e.g. soprano)
9
- * resolve to a single synthetic entry.
4
+ * The canonical source of provider voice data is now
5
+ * `src/services/provider-catalog.js` (the Provider Catalog, SSOT Layer 2). This
6
+ * module re-exports the static voice lists (`ELEVENLABS_VOICES`,
7
+ * `KOKORO_VOICE_IDS`) and the gender helper from the catalog, and keeps the
8
+ * `voicesForProvider()` convenience used by BMAD gender-aware auto-assignment.
9
+ *
10
+ * Kept as a shim so existing importers (and test/unit/provider-voice-catalog.test.js)
11
+ * continue to work unmodified.
10
12
  *
11
13
  * @module services/provider-voice-catalog
12
14
  */
13
15
 
14
16
  import { isSingleVoiceProvider } from './agent-voice-store.js';
17
+ import {
18
+ ELEVENLABS_VOICES,
19
+ KOKORO_VOICE_IDS,
20
+ kokoroGender,
21
+ } from './provider-catalog.js';
22
+
23
+ export { ELEVENLABS_VOICES, KOKORO_VOICE_IDS, kokoroGender };
15
24
 
16
- /** ElevenLabs library voices (voice_id + display metadata). */
17
- export const ELEVENLABS_VOICES = [
18
- { id: 'EXAVITQu4vr4xnSDxMaL', name: 'Sarah', gender: 'Female', lang: 'en-US', desc: 'Mature, reassuring' },
19
- { id: 'CwhRBWXzGAHq8TQ4Fs17', name: 'Roger', gender: 'Male', lang: 'en-US', desc: 'Laid-back, casual' },
20
- { id: 'FGY2WhTYpPnrIDTdsKH5', name: 'Laura', gender: 'Female', lang: 'en-US', desc: 'Enthusiast, quirky' },
21
- { id: 'IKne3meq5aSn9XLyUdCD', name: 'Charlie', gender: 'Male', lang: 'en-AU', desc: 'Deep, confident' },
22
- { id: 'JBFqnCBsd6RMkjVDRZzb', name: 'George', gender: 'Male', lang: 'en-GB', desc: 'Warm storyteller' },
23
- { id: 'N2lVS1w4EtoT3dr4eOWO', name: 'Callum', gender: 'Male', lang: 'en-US', desc: 'Husky trickster' },
24
- { id: 'SAz9YHcvj6GT2YYXdXww', name: 'River', gender: '', lang: 'en-US', desc: 'Relaxed, neutral' },
25
- { id: 'SOYHLrjzK2X1ezoPC6cr', name: 'Harry', gender: 'Male', lang: 'en-US', desc: 'Fierce warrior' },
26
- { id: 'TX3LPaxmHKxFdv7VOQHJ', name: 'Liam', gender: 'Male', lang: 'en-US', desc: 'Energetic creator' },
27
- { id: 'Xb7hH8MSUJpSbSDYk0k2', name: 'Alice', gender: 'Female', lang: 'en-GB', desc: 'Clear educator' },
28
- { id: 'XrExE9yKIg1WjnnlVkGX', name: 'Matilda', gender: 'Female', lang: 'en-US', desc: 'Knowledgable, pro' },
29
- { id: 'bIHbv24MWmeRgasZH58o', name: 'Will', gender: 'Male', lang: 'en-US', desc: 'Relaxed optimist' },
30
- { id: 'cgSgspJ2msm6clMCkdW9', name: 'Jessica', gender: 'Female', lang: 'en-US', desc: 'Playful, bright' },
31
- { id: 'cjVigY5qzO86Huf0OWal', name: 'Eric', gender: 'Male', lang: 'en-US', desc: 'Smooth, trustworthy' },
32
- { id: 'hpp4J3VqNfWAUOO0d1Us', name: 'Bella', gender: 'Female', lang: 'en-US', desc: 'Professional, warm' },
33
- { id: 'iP95p4xoKVk53GoZ742B', name: 'Chris', gender: 'Male', lang: 'en-US', desc: 'Charming, down-to-earth' },
34
- { id: 'nPczCjzI2devNBz1zQrb', name: 'Brian', gender: 'Male', lang: 'en-US', desc: 'Deep, comforting' },
35
- { id: 'onwK4e9ZLuTAKqWW03F9', name: 'Daniel', gender: 'Male', lang: 'en-GB', desc: 'Steady broadcaster' },
36
- { id: 'pFZP5JQG7iQjIQuC4Bku', name: 'Lily', gender: 'Female', lang: 'en-GB', desc: 'Velvety actress' },
37
- { id: 'pNInz6obpgDQGcFmaJgB', name: 'Adam', gender: 'Male', lang: 'en-US', desc: 'Dominant, firm' },
38
- { id: 'pqHfZKP75CvOlQylNhV4', name: 'Bill', gender: 'Male', lang: 'en-US', desc: 'Wise, mature' },
39
- // ── Added from the ElevenLabs voice library (raw library voice_ids) ───────
40
- { id: 'HBDoL4wkcalemIO0nUAu', name: 'Emily', gender: 'Female', lang: 'en-GB', desc: 'RPG, immersive' },
41
- { id: 'Mtmp3KhFIjYpWYRycDe3', name: 'John', gender: 'Male', lang: 'en-US', desc: 'Raspy surfer' },
42
- { id: '8kgj5469z1URcH4MB2G4', name: 'Sakuya', gender: 'Female', lang: 'en-US', desc: 'Cheerful anime' },
43
- { id: '2ajXGJNYBR0iNHpS4VZb', name: 'Rob', gender: 'Male', lang: 'en-GB', desc: 'Tough, gritty' },
44
- { id: 'mMdTuD2nnFiCH88UdXSb', name: 'Jane', gender: 'Female', lang: 'en-US', desc: 'Cinematic villain' },
25
+ /**
26
+ * Curated built-in voices for the OS-native "discovered" providers (Windows SAPI,
27
+ * macOS `say`). Their real voices live on the target device — for a remote
28
+ * receiver we cannot enumerate them from here — so these standard voices (shipped
29
+ * by default on Windows 10/11 and macOS) give the picker an honest, selectable
30
+ * list. The `id` is the exact name the player passes to SelectVoice / `say -v`;
31
+ * if the receiver lacks one it falls back to the system default (benign).
32
+ *
33
+ * Verified against a real Windows 11 install (System.Speech GetInstalledVoices).
34
+ * The receiver remains authoritative — this is UI convenience, not inventory SSOT.
35
+ */
36
+ const WINDOWS_SAPI_VOICES = [
37
+ { id: 'Microsoft David Desktop', name: 'David (Desktop)', gender: 'Male', lang: 'en-US' },
38
+ { id: 'Microsoft Zira Desktop', name: 'Zira (Desktop)', gender: 'Female', lang: 'en-US' },
39
+ { id: 'Microsoft David', name: 'David', gender: 'Male', lang: 'en-US' },
40
+ { id: 'Microsoft Mark', name: 'Mark', gender: 'Male', lang: 'en-US' },
41
+ { id: 'Microsoft Zira', name: 'Zira', gender: 'Female', lang: 'en-US' },
45
42
  ];
46
43
 
47
- /** Kokoro voice ids. Gender is encoded in the id: the 2nd char is f|m. */
48
- export const KOKORO_VOICE_IDS = [
49
- // American English
50
- 'af_heart','af_alloy','af_aoede','af_bella','af_jessica','af_kore','af_nicole','af_nova','af_river','af_sarah','af_sky',
51
- 'am_adam','am_echo','am_eric','am_fenrir','am_liam','am_michael','am_onyx','am_puck',
52
- // British English
53
- 'bf_alice','bf_emma','bf_isabella','bf_lily',
54
- 'bm_daniel','bm_fable','bm_george','bm_lewis',
55
- // Japanese
56
- 'jf_alpha','jf_gongitsune','jf_nezumi','jf_tebukuro','jm_kumo',
57
- // Mandarin Chinese
58
- 'zf_xiaobei','zf_xiaoni','zf_xiaoxiao','zf_xiaoyi','zm_yunxi','zm_yunxia','zm_yunyang',
59
- // Spanish
60
- 'ef_dora','em_alex','em_santa',
61
- // French
62
- 'ff_siwis',
63
- // Hindi
64
- 'hf_alpha','hm_omega',
65
- // Italian
66
- 'if_sara','im_nicola',
67
- // Brazilian Portuguese
68
- 'pf_dora','pm_alex','pm_santa',
69
- // Korean
70
- 'kf_alpha','km_hyunsu',
44
+ const MACOS_VOICES = [
45
+ { id: 'Samantha', name: 'Samantha', gender: 'Female', lang: 'en-US' },
46
+ { id: 'Alex', name: 'Alex', gender: 'Male', lang: 'en-US' },
47
+ { id: 'Daniel', name: 'Daniel', gender: 'Male', lang: 'en-GB' },
48
+ { id: 'Karen', name: 'Karen', gender: 'Female', lang: 'en-AU' },
49
+ { id: 'Moira', name: 'Moira', gender: 'Female', lang: 'en-IE' },
71
50
  ];
72
51
 
73
- /**
74
- * Infer a Kokoro voice's gender from its id. Kokoro ids follow `<lang><sex>_name`
75
- * where the 2nd character is `f` (female) or `m` (male).
76
- * @param {string} id
77
- * @returns {'Female'|'Male'|''}
78
- */
79
- export function kokoroGender(id) {
80
- const c = typeof id === 'string' && id.length > 1 ? id[1].toLowerCase() : '';
81
- if (c === 'f') return 'Female';
82
- if (c === 'm') return 'Male';
83
- return '';
84
- }
52
+ export { WINDOWS_SAPI_VOICES, MACOS_VOICES };
85
53
 
86
54
  /**
87
55
  * Return the voice pool for the currently-active provider as `{ id, gender }`
@@ -108,6 +76,17 @@ export function voicesForProvider(provider, { scanInstalledVoices, getVoiceMeta
108
76
  return ELEVENLABS_VOICES.map(v => ({ id: v.id, gender: v.gender || '' }));
109
77
  }
110
78
 
79
+ // OS-native discovered providers: their voices live on the target device (the
80
+ // receiver in remote mode), so they can't be scanned here. Return the curated
81
+ // built-in list instead of falling through to the Piper disk scan (which would
82
+ // mislabel them as Piper voices).
83
+ if (p === 'sapi' || p === 'windows-sapi') {
84
+ return WINDOWS_SAPI_VOICES.map(v => ({ id: v.id, gender: v.gender || '' }));
85
+ }
86
+ if (p === 'macos' || p === 'macos-say' || p === 'say') {
87
+ return MACOS_VOICES.map(v => ({ id: v.id, gender: v.gender || '' }));
88
+ }
89
+
111
90
  // Single-voice providers (e.g. soprano): one synthetic entry named after the
112
91
  // provider — every agent ends up sharing it, which is correct for these.
113
92
  if (isSingleVoiceProvider(p)) {
@@ -123,4 +102,4 @@ export function voicesForProvider(provider, { scanInstalledVoices, getVoiceMeta
123
102
  return [];
124
103
  }
125
104
 
126
- export default { ELEVENLABS_VOICES, KOKORO_VOICE_IDS, kokoroGender, voicesForProvider };
105
+ export default { ELEVENLABS_VOICES, KOKORO_VOICE_IDS, WINDOWS_SAPI_VOICES, MACOS_VOICES, kokoroGender, voicesForProvider };
@@ -53,6 +53,22 @@ export function getAvailableEngines() {
53
53
  return TTS_ENGINES.filter(e => !e.platform || e.platform === process.platform);
54
54
  }
55
55
 
56
+ /** Is this engine runnable on the current OS? (Native engines are platform-bound.) */
57
+ export function isEngineSupported(engineId) {
58
+ const e = TTS_ENGINES.find(x => x.id === engineId);
59
+ return !!e && (!e.platform || e.platform === process.platform);
60
+ }
61
+
62
+ /**
63
+ * Every engine, each tagged with `supported` for the current platform. Unlike
64
+ * getAvailableEngines() (which hides off-platform engines), this lists them all
65
+ * so the picker can show e.g. Windows SAPI greyed "(Not supported)" on Linux
66
+ * instead of appearing to be missing.
67
+ */
68
+ export function getAllEngines() {
69
+ return TTS_ENGINES.map(e => ({ ...e, supported: !e.platform || e.platform === process.platform }));
70
+ }
71
+
56
72
  export function checkEngineInstalled(engineId) {
57
73
  const engine = TTS_ENGINES.find(e => e.id === engineId);
58
74
  if (!engine) return false;
@@ -110,6 +126,19 @@ export function checkEngineInstalled(engineId) {
110
126
  return false;
111
127
  }
112
128
 
129
+ /**
130
+ * Map a picker engine id to the provider name the SSH-remote sender + receiver
131
+ * understand. play-tts-ssh-remote.sh validates
132
+ * piper|soprano|macos|windows-sapi|kokoro|elevenlabs, but the picker/config use
133
+ * 'sapi' and 'macos-say'. This is the single translation point.
134
+ * @param {string} engineId
135
+ * @returns {string} receiver/sender provider name
136
+ */
137
+ const RECEIVER_PROVIDER_MAP = { sapi: 'windows-sapi', 'macos-say': 'macos' };
138
+ export function receiverProviderId(engineId) {
139
+ return RECEIVER_PROVIDER_MAP[engineId] || engineId;
140
+ }
141
+
113
142
  export function getEngineStatuses() {
114
143
  return getAvailableEngines().map(e => ({
115
144
  ...e,
@@ -7,6 +7,64 @@ import { spawnSync } from 'node:child_process';
7
7
  import path from 'node:path'; // For safe path operations and traversal prevention
8
8
  import fs from 'node:fs'; // For checking file/directory existence
9
9
  import os from 'node:os'; // For os.homedir() to prevent HOME injection attacks
10
+ import { listProviders, displayName as catalogDisplayName } from '../services/provider-catalog.js';
11
+
12
+ /**
13
+ * Canonical set of TTS synthesis providers AgentVibes knows how to use.
14
+ * SINGLE SOURCE OF TRUTH: every user-facing dispatcher (MCP set_provider
15
+ * allowlist, voice switch, voice list, Windows provider manager) must recognise
16
+ * these providers — platform-scoped where noted below. A provider that lives
17
+ * here but is missing from a dispatcher is the "silent drop to Piper / Unknown
18
+ * provider" class of bug (see AVI-S8.1). The dispatcher-parity conformance test
19
+ * asserts this invariant.
20
+ *
21
+ * Platform notes: `macos` is Darwin-only; `windows-sapi`/`windows-piper` are
22
+ * Windows-only. `kokoro` ships a play-tts runtime on BOTH Unix
23
+ * (play-tts-kokoro.sh) and PowerShell (play-tts-kokoro.ps1). `elevenlabs` ships
24
+ * a Unix runtime only (play-tts-elevenlabs.sh) — there is NO
25
+ * play-tts-elevenlabs.ps1 yet — so it is recognised by the portable (bash/JS)
26
+ * dispatchers but intentionally excluded from the Windows provider manager
27
+ * until a PowerShell runtime lands (AVI-S8.2).
28
+ * @type {readonly string[]}
29
+ */
30
+ export const SUPPORTED_PROVIDERS = Object.freeze(listProviders().map((p) => p.id));
31
+
32
+ /**
33
+ * Providers that use the SAME id on every OS and have at least a Unix (bash)
34
+ * runtime. Every PORTABLE dispatcher — the MCP set_provider allowlist,
35
+ * voice-manager.sh, and list-voices.js — must recognise these regardless of
36
+ * platform. DERIVED VIEW over the catalog: the providers with a Unix runtime
37
+ * whose voices are enumerable without disk (static/name-to-id) — i.e. kokoro and
38
+ * elevenlabs.
39
+ * @type {readonly string[]}
40
+ */
41
+ export const CROSS_PLATFORM_PROVIDERS = Object.freeze(
42
+ listProviders()
43
+ .filter((p) => p.runtime.unix !== null && (p.voiceModel === 'static' || p.voiceModel === 'name-to-id'))
44
+ .map((p) => p.id),
45
+ );
46
+
47
+ /**
48
+ * Subset of {@link CROSS_PLATFORM_PROVIDERS} that ALSO ships a PowerShell runtime
49
+ * (play-tts-*.ps1), so the Windows provider manager (provider-manager.ps1) must
50
+ * recognise them too. `elevenlabs` is excluded until play-tts-elevenlabs.ps1
51
+ * exists (AVI-S8.2). DERIVED VIEW over the catalog.
52
+ * @type {readonly string[]}
53
+ */
54
+ export const WINDOWS_RUNTIME_PROVIDERS = Object.freeze(
55
+ listProviders()
56
+ .filter((p) => p.runtime.unix !== null && (p.voiceModel === 'static' || p.voiceModel === 'name-to-id') && p.runtime.windows !== null)
57
+ .map((p) => p.id),
58
+ );
59
+
60
+ /**
61
+ * Is `name` a provider AgentVibes canonically supports?
62
+ * @param {string} name
63
+ * @returns {boolean}
64
+ */
65
+ export function isKnownProvider(name) {
66
+ return SUPPORTED_PROVIDERS.includes(String(name || '').toLowerCase());
67
+ }
10
68
 
11
69
  /**
12
70
  * Helper: Check if command exists in PATH
@@ -603,16 +661,8 @@ function getPackageInfo(pkgName) {
603
661
  * @returns {string} Display name
604
662
  */
605
663
  export function getProviderDisplayName(providerName) {
606
- const names = {
607
- soprano: 'Soprano TTS',
608
- piper: 'Piper TTS',
609
- kokoro: 'Kokoro TTS',
610
- elevenlabs: 'ElevenLabs',
611
- macos: 'macOS Say',
612
- sapi: 'Windows SAPI',
613
- 'windows-sapi': 'Windows SAPI',
614
- 'windows-piper': 'Piper TTS'
615
- };
616
-
617
- return names[providerName] || providerName;
664
+ // DERIVED VIEW: delegate to the Provider Catalog (single source of truth for
665
+ // display names). The catalog resolves aliases (e.g. 'sapi' → Windows SAPI) and
666
+ // passes unknown ids through unchanged, preserving this function's contract.
667
+ return catalogDisplayName(providerName);
618
668
  }
@@ -1,23 +0,0 @@
1
- ---
2
- description: Set your main/native language for learning mode
3
- ---
4
-
5
- Set your main/native language. This is the language you already know and will hear first when learning mode is enabled.
6
-
7
- Usage:
8
- ```
9
- /agent-vibes:language english
10
- /agent-vibes:language spanish
11
- /agent-vibes:language french
12
- ```
13
-
14
- The main language uses your currently selected voice. When learning mode is ON, TTS will speak in your main language FIRST, then translate to your target language.
15
-
16
- Default: english
17
-
18
- Supported languages: english, spanish, french, german, italian, portuguese, chinese, japanese, korean, hindi, arabic, polish, dutch, turkish, swedish, russian, and 15+ more.
19
-
20
- After setting your main language:
21
- 1. Set your target language with `/agent-vibes:target <language>`
22
- 2. Set target voice with `/agent-vibes:target-voice <voice>`
23
- 3. Enable learning mode with `/agent-vibes:learn`
@@ -1,67 +0,0 @@
1
- ---
2
- description: Enable or disable language learning mode
3
- ---
4
-
5
- Turn language learning mode ON or OFF. When enabled, Claude will speak acknowledgments and completions in BOTH your main language and target language.
6
-
7
- Usage:
8
- ```
9
- /agent-vibes:learn # Turn ON
10
- /agent-vibes:learn off # Turn OFF
11
- /agent-vibes:learn status # Show current setup
12
- ```
13
-
14
- ## How Learning Mode Works:
15
-
16
- When learning mode is **ON**:
17
- 1. **First**: Speak in your main language (using your current voice)
18
- 2. **Then**: Speak the SAME message translated to your target language (using target voice)
19
-
20
- Example:
21
- ```
22
- Main language (English, Aria): "I'll check that for you"
23
- Target language (Spanish, Antoni): "Lo verificaré para ti"
24
- ```
25
-
26
- ## Setup Steps:
27
-
28
- 1. Set your main language:
29
- ```
30
- /agent-vibes:language english
31
- ```
32
-
33
- 2. Set your target language:
34
- ```
35
- /agent-vibes:target spanish
36
- ```
37
-
38
- 3. Set target voice (recommended):
39
- ```
40
- /agent-vibes:target-voice Antoni
41
- ```
42
-
43
- 4. Enable learning mode:
44
- ```
45
- /agent-vibes:learn
46
- ```
47
-
48
- 5. Check your setup:
49
- ```
50
- /agent-vibes:learn status
51
- ```
52
-
53
- ## Notes:
54
-
55
- - Translations are **direct translations** of what was said in the main language
56
- - Same **personality/sentiment** applies to both languages
57
- - Works with all AgentVibes features (BMAD, personalities, etc.)
58
- - Requires multilingual voices for target language (Antoni, Rachel, Domi, Bella, etc.)
59
- - Small pause (0.5s) between main and target language announcements
60
-
61
- ## Disable Learning Mode:
62
-
63
- ```
64
- /agent-vibes:learn off
65
- ```
66
-
67
- This returns to normal single-language TTS mode.
@@ -1,14 +0,0 @@
1
- ---
2
- description: Replay the last target language audio (for language learning mode)
3
- ---
4
-
5
- Replay the last message that was spoken in your target language during language learning mode.
6
-
7
- This is useful when learning a new language - you can hear the translation again without triggering a new one.
8
-
9
- Usage:
10
- - `/agent-vibes:replay-target` - Replay the last target language audio
11
-
12
- **Note:** This only works when language learning mode is active (`/agent-vibes:learn`).
13
-
14
- !bash .claude/hooks/replay-target-audio.sh
@@ -1,26 +0,0 @@
1
- ---
2
- description: Set the voice for your target language
3
- ---
4
-
5
- Set which voice to use when speaking your target language. This should typically be a multilingual voice that supports your target language.
6
-
7
- Usage:
8
- ```
9
- /agent-vibes:target-voice Antoni
10
- /agent-vibes:target-voice Rachel
11
- /agent-vibes:target-voice Domi
12
- ```
13
-
14
- Recommended multilingual voices:
15
- - **Antoni** - Best for Spanish, Portuguese
16
- - **Rachel** - Best for French, English
17
- - **Domi** - Best for German, European languages
18
- - **Bella** - Best for Italian, Romance languages
19
- - **Charlotte** - European languages
20
- - **Matilda** - Latin languages
21
-
22
- These voices support 30+ languages using Piper TTS' Multilingual v2 model.
23
-
24
- After setting your target voice:
25
- - Enable learning mode with `/agent-vibes:learn`
26
- - Check your setup with `/agent-vibes:learn status`
@@ -1,30 +0,0 @@
1
- ---
2
- description: Set the language you want to learn
3
- ---
4
-
5
- Set the target language you want to learn. When learning mode is enabled, TTS will speak in your main language FIRST, then speak the translation in your target language.
6
-
7
- Usage:
8
- ```
9
- /agent-vibes:target spanish
10
- /agent-vibes:target french
11
- /agent-vibes:target german
12
- ```
13
-
14
- Recommended voices by target language:
15
- - Spanish → Antoni (Piper TTS) / es_ES-davefx-medium (Piper)
16
- - French → Rachel (Piper TTS) / fr_FR-siwis-medium (Piper)
17
- - German → Domi (Piper TTS) / de_DE-thorsten-medium (Piper)
18
- - Italian → Bella (Piper TTS) / it_IT-riccardo-x_low (Piper)
19
- - Portuguese → Matilda (Piper TTS) / pt_BR-faber-medium (Piper)
20
- - Chinese → Amy (Piper TTS) / zh_CN-huayan-medium (Piper)
21
- - Japanese → Antoni (Piper TTS) / ja_JP-hikari-medium (Piper)
22
- - Other languages → Antoni (Piper TTS) / check available Piper voices
23
-
24
- **Note:** The system will automatically suggest the correct voice based on your active TTS provider. After setting your target language, the suggestion will match whether you're using Piper TTS or Piper.
25
-
26
- After setting your target language:
27
- 1. Set the voice for target language with `/agent-vibes:target-voice <voice>`
28
- 2. Enable learning mode with `/agent-vibes:learn`
29
-
30
- Supported languages: spanish, french, german, italian, portuguese, chinese, japanese, korean, hindi, arabic, polish, dutch, turkish, swedish, russian, and 15+ more.