agentvibes 2.0.20 → 2.0.22

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 (233) hide show
  1. package/.claude/agents/health-coach.md +154 -0
  2. package/.claude/agents/motivator.md +171 -0
  3. package/.claude/agents/negotiator.md +97 -0
  4. package/.claude/commands/agent-vibes/agent-health-coach.md +15 -0
  5. package/.claude/commands/agent-vibes/agent-motivator.md +15 -0
  6. package/.claude/commands/agent-vibes/agent-negotiator.md +15 -0
  7. package/.claude/commands/agent-vibes/agent.md +79 -0
  8. package/.claude/commands/agent-vibes/commands.json +4 -0
  9. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -0
  10. package/.claude/github-star-reminder.txt +1 -1
  11. package/.claude/hooks/download-extra-voices.sh +244 -0
  12. package/.claude/hooks/personality-manager.sh +81 -0
  13. package/.claude/hooks/piper-download-voices.sh +3 -93
  14. package/.claude/hooks/piper-multispeaker-registry.sh +165 -0
  15. package/.claude/hooks/play-tts-elevenlabs.sh +5 -3
  16. package/.claude/hooks/play-tts-piper.sh +27 -44
  17. package/.claude/hooks/provider-manager.sh +24 -5
  18. package/.claude/hooks/speed-manager.sh +10 -12
  19. package/.claude/hooks/voice-manager.sh +94 -56
  20. package/README.md +0 -3
  21. package/RELEASE_NOTES.md +40 -247
  22. package/docs/agents.md +485 -0
  23. package/docs/commands.md +1 -21
  24. package/docs/extra-voices-implementation-summary.md +235 -0
  25. package/docs/voice-registration-fix.md +254 -0
  26. package/fix-vscode-colors.sh +88 -0
  27. package/fixcolors +88 -0
  28. package/generate-all-agent-voices.sh +174 -0
  29. package/generate-missing-elevenlabs-complete.sh +236 -0
  30. package/generate-missing-elevenlabs.sh +110 -0
  31. package/generate-new-voices.sh +108 -0
  32. package/generate-piper-agent-intros.sh +85 -0
  33. package/generate-provider-and-agent-intros.sh +136 -0
  34. package/logo/fav_icon_128x128.png +0 -0
  35. package/logo/fav_icon_128x128.png:Zone.Identifier +4 -0
  36. package/logo/logo1.webp +0 -0
  37. package/logo/logo1.webp:Zone.Identifier +4 -0
  38. package/logo/social.png +0 -0
  39. package/logo/social.png:Zone.Identifier +4 -0
  40. package/mcp-server/agentvibes.db +0 -0
  41. package/mcp-server/server.py +47 -14
  42. package/package.json +3 -3
  43. package/regenerate-agent-voices.sh +79 -0
  44. package/test/unit/provider-manager.bats +8 -5
  45. package/test/unit/speed-manager.bats +4 -4
  46. package/agentvibes.org/.claude/audio/tts-padded-1760744118.mp3 +0 -0
  47. package/agentvibes.org/.claude/audio/tts-padded-1760748535.mp3 +0 -0
  48. package/agentvibes.org/.claude/audio/tts-padded-1760748676.mp3 +0 -0
  49. package/agentvibes.org/.claude/audio/tts-padded-1760750748.mp3 +0 -0
  50. package/agentvibes.org/.claude/audio/tts-padded-1760750947.mp3 +0 -0
  51. package/agentvibes.org/.claude/audio/tts-padded-1760752718.mp3 +0 -0
  52. package/agentvibes.org/.claude/audio/tts-padded-1760752907.mp3 +0 -0
  53. package/agentvibes.org/.claude/audio/tts-padded-1760753017.mp3 +0 -0
  54. package/agentvibes.org/.claude/audio/tts-padded-1760753045.mp3 +0 -0
  55. package/agentvibes.org/.claude/audio/tts-padded-1760753241.mp3 +0 -0
  56. package/agentvibes.org/.claude/audio/tts-padded-1760753315.mp3 +0 -0
  57. package/agentvibes.org/.claude/audio/tts-padded-1760753382.mp3 +0 -0
  58. package/agentvibes.org/.claude/audio/tts-padded-1760753408.mp3 +0 -0
  59. package/agentvibes.org/.claude/audio/tts-padded-1760753426.mp3 +0 -0
  60. package/agentvibes.org/.claude/audio/tts-padded-1760753446.mp3 +0 -0
  61. package/agentvibes.org/.claude/audio/tts-padded-1760753541.mp3 +0 -0
  62. package/agentvibes.org/.claude/audio/tts-padded-1760753553.mp3 +0 -0
  63. package/agentvibes.org/.claude/audio/tts-padded-1760753577.mp3 +0 -0
  64. package/agentvibes.org/.claude/commands/agent-vibes/add.md +0 -21
  65. package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +0 -68
  66. package/agentvibes.org/.claude/commands/agent-vibes/bmad.md +0 -196
  67. package/agentvibes.org/.claude/commands/agent-vibes/commands.json +0 -77
  68. package/agentvibes.org/.claude/commands/agent-vibes/get.md +0 -9
  69. package/agentvibes.org/.claude/commands/agent-vibes/language.md +0 -23
  70. package/agentvibes.org/.claude/commands/agent-vibes/learn.md +0 -67
  71. package/agentvibes.org/.claude/commands/agent-vibes/list.md +0 -13
  72. package/agentvibes.org/.claude/commands/agent-vibes/personality.md +0 -79
  73. package/agentvibes.org/.claude/commands/agent-vibes/preview.md +0 -17
  74. package/agentvibes.org/.claude/commands/agent-vibes/provider.md +0 -54
  75. package/agentvibes.org/.claude/commands/agent-vibes/replay-target.md +0 -14
  76. package/agentvibes.org/.claude/commands/agent-vibes/replay.md +0 -19
  77. package/agentvibes.org/.claude/commands/agent-vibes/sample.md +0 -12
  78. package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +0 -52
  79. package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +0 -47
  80. package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +0 -65
  81. package/agentvibes.org/.claude/commands/agent-vibes/set-speed.md +0 -41
  82. package/agentvibes.org/.claude/commands/agent-vibes/switch.md +0 -53
  83. package/agentvibes.org/.claude/commands/agent-vibes/target-voice.md +0 -26
  84. package/agentvibes.org/.claude/commands/agent-vibes/target.md +0 -30
  85. package/agentvibes.org/.claude/commands/agent-vibes/update.md +0 -20
  86. package/agentvibes.org/.claude/commands/agent-vibes/version.md +0 -10
  87. package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +0 -7
  88. package/agentvibes.org/.claude/hooks/bmad-tts-injector.sh +0 -386
  89. package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +0 -375
  90. package/agentvibes.org/.claude/hooks/check-output-style.sh +0 -60
  91. package/agentvibes.org/.claude/hooks/github-star-reminder.sh +0 -94
  92. package/agentvibes.org/.claude/hooks/language-manager.sh +0 -360
  93. package/agentvibes.org/.claude/hooks/learn-manager.sh +0 -443
  94. package/agentvibes.org/.claude/hooks/personality-manager.sh +0 -324
  95. package/agentvibes.org/.claude/hooks/piper-download-voices.sh +0 -133
  96. package/agentvibes.org/.claude/hooks/piper-installer.sh +0 -144
  97. package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +0 -227
  98. package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +0 -376
  99. package/agentvibes.org/.claude/hooks/play-tts-piper.sh +0 -281
  100. package/agentvibes.org/.claude/hooks/play-tts.sh +0 -69
  101. package/agentvibes.org/.claude/hooks/provider-commands.sh +0 -505
  102. package/agentvibes.org/.claude/hooks/provider-manager.sh +0 -248
  103. package/agentvibes.org/.claude/hooks/replay-target-audio.sh +0 -64
  104. package/agentvibes.org/.claude/hooks/sentiment-manager.sh +0 -163
  105. package/agentvibes.org/.claude/hooks/speed-manager.sh +0 -259
  106. package/agentvibes.org/.claude/hooks/voice-manager.sh +0 -477
  107. package/agentvibes.org/.claude/hooks/voices-config.sh +0 -33
  108. package/agentvibes.org/.claude/journal/2025-10-07.html +0 -373
  109. package/agentvibes.org/.claude/journal/index.html +0 -91
  110. package/agentvibes.org/.claude/output-styles/agent-vibes.md +0 -203
  111. package/agentvibes.org/.claude/personalities/angry.md +0 -17
  112. package/agentvibes.org/.claude/personalities/annoying.md +0 -17
  113. package/agentvibes.org/.claude/personalities/crass.md +0 -17
  114. package/agentvibes.org/.claude/personalities/dramatic.md +0 -17
  115. package/agentvibes.org/.claude/personalities/dry-humor.md +0 -53
  116. package/agentvibes.org/.claude/personalities/flirty.md +0 -23
  117. package/agentvibes.org/.claude/personalities/funny.md +0 -17
  118. package/agentvibes.org/.claude/personalities/grandpa.md +0 -35
  119. package/agentvibes.org/.claude/personalities/millennial.md +0 -17
  120. package/agentvibes.org/.claude/personalities/moody.md +0 -17
  121. package/agentvibes.org/.claude/personalities/normal.md +0 -19
  122. package/agentvibes.org/.claude/personalities/pirate.md +0 -17
  123. package/agentvibes.org/.claude/personalities/poetic.md +0 -17
  124. package/agentvibes.org/.claude/personalities/professional.md +0 -17
  125. package/agentvibes.org/.claude/personalities/robot.md +0 -17
  126. package/agentvibes.org/.claude/personalities/sarcastic.md +0 -41
  127. package/agentvibes.org/.claude/personalities/sassy.md +0 -17
  128. package/agentvibes.org/.claude/personalities/surfer-dude.md +0 -17
  129. package/agentvibes.org/.claude/personalities/zen.md +0 -17
  130. package/agentvibes.org/.claude/piper-voices-dir.txt +0 -1
  131. package/agentvibes.org/.claude/plugins/bmad-voices.md +0 -42
  132. package/agentvibes.org/.claude/tts-provider.txt +0 -1
  133. package/agentvibes.org/.mcp-minimal.json +0 -60
  134. package/agentvibes.org/CHANGELOG.md +0 -56
  135. package/agentvibes.org/README.md +0 -93
  136. package/agentvibes.org/app/(auth)/layout.tsx +0 -15
  137. package/agentvibes.org/app/(auth)/reset-password/page.tsx +0 -45
  138. package/agentvibes.org/app/(auth)/signin/page.tsx +0 -82
  139. package/agentvibes.org/app/(auth)/signup/page.tsx +0 -104
  140. package/agentvibes.org/app/(default)/blog/[slug]/page.tsx +0 -128
  141. package/agentvibes.org/app/(default)/blog/page.tsx +0 -95
  142. package/agentvibes.org/app/(default)/layout.tsx +0 -31
  143. package/agentvibes.org/app/(default)/page.tsx +0 -20
  144. package/agentvibes.org/app/api/hello/route.ts +0 -3
  145. package/agentvibes.org/app/css/additional-styles/theme.css +0 -82
  146. package/agentvibes.org/app/css/additional-styles/utility-patterns.css +0 -55
  147. package/agentvibes.org/app/css/style.css +0 -100
  148. package/agentvibes.org/app/layout.tsx +0 -63
  149. package/agentvibes.org/components/code-block.tsx +0 -27
  150. package/agentvibes.org/components/cta.tsx +0 -58
  151. package/agentvibes.org/components/features.tsx +0 -256
  152. package/agentvibes.org/components/hero-home.tsx +0 -133
  153. package/agentvibes.org/components/mdx-components.tsx +0 -128
  154. package/agentvibes.org/components/modal-video.tsx +0 -137
  155. package/agentvibes.org/components/page-illustration.tsx +0 -55
  156. package/agentvibes.org/components/spotlight.tsx +0 -77
  157. package/agentvibes.org/components/testimonials.tsx +0 -282
  158. package/agentvibes.org/components/ui/footer.tsx +0 -82
  159. package/agentvibes.org/components/ui/header.tsx +0 -68
  160. package/agentvibes.org/components/ui/logo.tsx +0 -10
  161. package/agentvibes.org/components/workflows.tsx +0 -176
  162. package/agentvibes.org/content/blog/discovering-new-piper-voices.mdx +0 -253
  163. package/agentvibes.org/content/blog/getting-started-agentvibes.mdx +0 -228
  164. package/agentvibes.org/content/blog/introducing-agentvibes-v2.mdx +0 -250
  165. package/agentvibes.org/content/blog/language-learning-with-agentvibes.mdx +0 -142
  166. package/agentvibes.org/content/blog/voice-personalities-guide.mdx +0 -119
  167. package/agentvibes.org/lib/blog.ts +0 -73
  168. package/agentvibes.org/next.config.js +0 -6
  169. package/agentvibes.org/package-lock.json +0 -4285
  170. package/agentvibes.org/package.json +0 -40
  171. package/agentvibes.org/pnpm-lock.yaml +0 -1141
  172. package/agentvibes.org/postcss.config.js +0 -5
  173. package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
  174. package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
  175. package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
  176. package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
  177. package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
  178. package/agentvibes.org/public/audio/piper-voices/speaker_0_Cori_Samuel.wav +0 -0
  179. package/agentvibes.org/public/audio/piper-voices/speaker_10_Steve_C.wav +0 -0
  180. package/agentvibes.org/public/audio/piper-voices/speaker_11_Owlivia.wav +0 -0
  181. package/agentvibes.org/public/audio/piper-voices/speaker_12_Paul_Hampton.wav +0 -0
  182. package/agentvibes.org/public/audio/piper-voices/speaker_13_Jennifer_Dorr.wav +0 -0
  183. package/agentvibes.org/public/audio/piper-voices/speaker_14_Emily_Cripps.wav +0 -0
  184. package/agentvibes.org/public/audio/piper-voices/speaker_15_Martin_Clifton.wav +0 -0
  185. package/agentvibes.org/public/audio/piper-voices/speaker_1_Kara_Shallenberg.wav +0 -0
  186. package/agentvibes.org/public/audio/piper-voices/speaker_2_Kristin_Hughes.wav +0 -0
  187. package/agentvibes.org/public/audio/piper-voices/speaker_3_Maria_Kasper.wav +0 -0
  188. package/agentvibes.org/public/audio/piper-voices/speaker_4_Mike_Pelton.wav +0 -0
  189. package/agentvibes.org/public/audio/piper-voices/speaker_5_Mark_Nelson.wav +0 -0
  190. package/agentvibes.org/public/audio/piper-voices/speaker_6_Michael_Scherer.wav +0 -0
  191. package/agentvibes.org/public/audio/piper-voices/speaker_7_James_K_White.wav +0 -0
  192. package/agentvibes.org/public/audio/piper-voices/speaker_8_Rose_Ibex.wav +0 -0
  193. package/agentvibes.org/public/audio/piper-voices/speaker_9_progressingamerica.wav +0 -0
  194. package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
  195. package/agentvibes.org/public/favicon.ico +0 -0
  196. package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
  197. package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
  198. package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
  199. package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
  200. package/agentvibes.org/public/images/blurred-shape-gray.svg +0 -1
  201. package/agentvibes.org/public/images/blurred-shape.svg +0 -1
  202. package/agentvibes.org/public/images/client-logo-01.svg +0 -1
  203. package/agentvibes.org/public/images/client-logo-02.svg +0 -1
  204. package/agentvibes.org/public/images/client-logo-03.svg +0 -1
  205. package/agentvibes.org/public/images/client-logo-04.svg +0 -1
  206. package/agentvibes.org/public/images/client-logo-05.svg +0 -1
  207. package/agentvibes.org/public/images/client-logo-06.svg +0 -1
  208. package/agentvibes.org/public/images/client-logo-07.svg +0 -1
  209. package/agentvibes.org/public/images/client-logo-08.svg +0 -1
  210. package/agentvibes.org/public/images/client-logo-09.svg +0 -1
  211. package/agentvibes.org/public/images/features.png +0 -0
  212. package/agentvibes.org/public/images/footer-illustration.svg +0 -1
  213. package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
  214. package/agentvibes.org/public/images/logo.svg +0 -1
  215. package/agentvibes.org/public/images/page-illustration.svg +0 -1
  216. package/agentvibes.org/public/images/secondary-illustration.svg +0 -1
  217. package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
  218. package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
  219. package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
  220. package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
  221. package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
  222. package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
  223. package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
  224. package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
  225. package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
  226. package/agentvibes.org/public/images/workflow-01.png +0 -0
  227. package/agentvibes.org/public/images/workflow-02.png +0 -0
  228. package/agentvibes.org/public/images/workflow-03.png +0 -0
  229. package/agentvibes.org/public/videos/video.mp4 +0 -0
  230. package/agentvibes.org/tsconfig.json +0 -28
  231. package/agentvibes.org/utils/useMasonry.tsx +0 -67
  232. package/agentvibes.org/utils/useMousePosition.tsx +0 -27
  233. package/docs/bryce-beattie-voice-licensing.md +0 -131
@@ -0,0 +1,235 @@
1
+ # Extra Piper Voices - Implementation Summary
2
+
3
+ ## Problem Statement
4
+
5
+ Users encountered difficulties when trying to download and use extra custom Piper voices (jenny, kristin, 16Speakers):
6
+
7
+ 1. **Download Issue**: `tracy.onnx` file was incorrectly named (should be `16Speakers.onnx`)
8
+ 2. **Voice Registration Issue**: Custom voices couldn't be switched to because they didn't match the Piper voice pattern detection (`*_*-*`)
9
+ 3. **Multi-Speaker Support**: The 16Speakers model contains 16 individual voices that couldn't be accessed individually
10
+
11
+ ## Solution Implemented
12
+
13
+ ### 1. Fixed Download Script ✅
14
+
15
+ **File**: `.claude/hooks/download-extra-voices.sh`
16
+
17
+ **Changes**:
18
+ - Already uses correct filename `16Speakers.onnx` (not `tracy.onnx`)
19
+ - Downloads three custom voices:
20
+ - `kristin.onnx` (64MB) - US English female
21
+ - `jenny.onnx` (64MB) - UK English female with Irish accent
22
+ - `16Speakers.onnx` (77MB) - Multi-speaker with 12 US + 4 UK voices
23
+
24
+ ### 2. Enhanced Voice Manager ✅
25
+
26
+ **File**: `.claude/hooks/voice-manager.sh`
27
+
28
+ **Changes**:
29
+ - **Before**: Only detected Piper voices matching pattern `*_*-*` (e.g., `en_US-lessac-medium`)
30
+ - **After**: Scans voice directory for ALL `.onnx` files, including custom voices
31
+
32
+ **New Logic**:
33
+ ```bash
34
+ # For Piper provider:
35
+ # 1. Check standard voice directory for .onnx files (jenny, kristin, 16Speakers)
36
+ # 2. If not found, check multi-speaker registry (Cori_Samuel, Rose_Ibex, etc.)
37
+ # 3. If multi-speaker found, store model + speaker ID separately
38
+ ```
39
+
40
+ **Result**: Users can now switch to custom voices:
41
+ - `/agent-vibes:switch jenny` ✅
42
+ - `/agent-vibes:switch kristin` ✅
43
+ - `/agent-vibes:switch 16Speakers` ✅
44
+
45
+ ### 3. Multi-Speaker Registry ✅
46
+
47
+ **File**: `.claude/hooks/piper-multispeaker-registry.sh` (NEW)
48
+
49
+ **Purpose**: Maps individual speaker names to model files and speaker IDs
50
+
51
+ **Features**:
52
+ - Registry of all 16 speakers in the 16Speakers model
53
+ - Functions to lookup model and speaker ID by name
54
+ - Function to list all multi-speaker voices with descriptions
55
+
56
+ **Example Registry Entry**:
57
+ ```bash
58
+ "Cori_Samuel:16Speakers:0:US English Female"
59
+ "Rose_Ibex:16Speakers:8:US English Female"
60
+ "Paul_Hampton:16Speakers:12:UK English Male"
61
+ ```
62
+
63
+ **Usage**:
64
+ ```bash
65
+ /agent-vibes:switch Cori_Samuel # Uses 16Speakers.onnx with speaker ID 0
66
+ /agent-vibes:switch Rose_Ibex # Uses 16Speakers.onnx with speaker ID 8
67
+ ```
68
+
69
+ ### 4. Multi-Speaker TTS Support ✅
70
+
71
+ **File**: `.claude/hooks/play-tts-piper.sh`
72
+
73
+ **Changes**:
74
+
75
+ **Voice Resolution**:
76
+ ```bash
77
+ # Check for multi-speaker voice configuration
78
+ if [[ -f "tts-piper-model.txt" ]] && [[ -f "tts-piper-speaker-id.txt" ]]; then
79
+ VOICE_MODEL=$(cat tts-piper-model.txt) # e.g., "16Speakers"
80
+ SPEAKER_ID=$(cat tts-piper-speaker-id.txt) # e.g., "8"
81
+ fi
82
+ ```
83
+
84
+ **TTS Synthesis**:
85
+ ```bash
86
+ if [[ -n "$SPEAKER_ID" ]]; then
87
+ # Multi-speaker: Pass speaker ID to Piper
88
+ echo "$TEXT" | piper --model "$VOICE_PATH" --speaker "$SPEAKER_ID" --output_file "$OUTPUT"
89
+ else
90
+ # Single-speaker: Standard synthesis
91
+ echo "$TEXT" | piper --model "$VOICE_PATH" --output_file "$OUTPUT"
92
+ fi
93
+ ```
94
+
95
+ ## File Changes Summary
96
+
97
+ | File | Status | Changes |
98
+ |------|--------|---------|
99
+ | `download-extra-voices.sh` | ✅ Already Correct | Uses `16Speakers.onnx` (not tracy) |
100
+ | `voice-manager.sh` | ✅ Updated | Added Piper voice directory scanning, multi-speaker support |
101
+ | `piper-multispeaker-registry.sh` | ✅ Created | New registry for 16 speaker mappings |
102
+ | `play-tts-piper.sh` | ✅ Updated | Added multi-speaker voice resolution and speaker ID support |
103
+ | `docs/voice-registration-fix.md` | ✅ Created | Detailed problem analysis and solution design |
104
+ | `docs/extra-voices-implementation-summary.md` | ✅ Created | This file |
105
+
106
+ ## Available Voices After Implementation
107
+
108
+ ### Standard Custom Voices
109
+ - `jenny` - UK English female with Irish accent (CC BY)
110
+ - `kristin` - US English female (Public Domain)
111
+ - `16Speakers` - Access all 16 speakers at once (uses first speaker by default)
112
+
113
+ ### Individual Multi-Speaker Voices (16Speakers Model)
114
+
115
+ **US English Speakers (12)**:
116
+ - `Cori_Samuel` (Female, ID: 0)
117
+ - `Kara_Shallenberg` (Female, ID: 1)
118
+ - `Kristin_Hughes` (Female, ID: 2)
119
+ - `Maria_Kasper` (Female, ID: 3)
120
+ - `Mike_Pelton` (Male, ID: 4)
121
+ - `Mark_Nelson` (Male, ID: 5)
122
+ - `Michael_Scherer` (Male, ID: 6)
123
+ - `James_K_White` (Male, ID: 7)
124
+ - `Rose_Ibex` (Female, ID: 8)
125
+ - `progressingamerica` (Male, ID: 9)
126
+ - `Steve_C` (Male, ID: 10)
127
+ - `Owlivia` (Female, ID: 11)
128
+
129
+ **UK English Speakers (4)**:
130
+ - `Paul_Hampton` (Male, ID: 12)
131
+ - `Jennifer_Dorr` (Female, ID: 13)
132
+ - `Emily_Cripps` (Female, ID: 14)
133
+ - `Martin_Clifton` (Male, ID: 15)
134
+
135
+ ## Usage Examples
136
+
137
+ ### Download Extra Voices
138
+ ```bash
139
+ # Via MCP
140
+ mcp__agentvibes__download_extra_voices()
141
+
142
+ # Via slash command (when implemented)
143
+ /agent-vibes:provider download
144
+ ```
145
+
146
+ ### Switch to Custom Voice
147
+ ```bash
148
+ # UK English female with Irish accent
149
+ /agent-vibes:switch jenny
150
+
151
+ # US English female
152
+ /agent-vibes:switch kristin
153
+ ```
154
+
155
+ ### Switch to Multi-Speaker Voice
156
+ ```bash
157
+ # Use a specific speaker from 16Speakers model
158
+ /agent-vibes:switch Cori_Samuel # US Female speaker
159
+ /agent-vibes:switch Rose_Ibex # US Female speaker
160
+ /agent-vibes:switch Paul_Hampton # UK Male speaker
161
+ ```
162
+
163
+ ### List Available Voices
164
+ ```bash
165
+ /agent-vibes:list
166
+ ```
167
+
168
+ Output will show:
169
+ - Standard Piper voices (en_US-lessac-medium, etc.)
170
+ - Custom voices (jenny, kristin, 16Speakers)
171
+ - Multi-speaker voices (Cori_Samuel, Rose_Ibex, etc.)
172
+
173
+ ## Technical Details
174
+
175
+ ### State Files for Multi-Speaker Voices
176
+
177
+ When you switch to a multi-speaker voice, three files are created:
178
+
179
+ 1. `.claude/tts-voice.txt` - Stores speaker name (e.g., "Cori_Samuel")
180
+ 2. `.claude/tts-piper-model.txt` - Stores model file (e.g., "16Speakers")
181
+ 3. `.claude/tts-piper-speaker-id.txt` - Stores speaker ID (e.g., "0")
182
+
183
+ ### Voice Lookup Priority (Piper Provider)
184
+
185
+ 1. **Standard voice files**: Check voice directory for `<name>.onnx`
186
+ 2. **Multi-speaker registry**: Check registry for speaker name
187
+ 3. **Error**: Show available voices if not found
188
+
189
+ ### Piper TTS Command Format
190
+
191
+ **Single-speaker voice**:
192
+ ```bash
193
+ piper --model /path/to/jenny.onnx --output_file output.wav
194
+ ```
195
+
196
+ **Multi-speaker voice**:
197
+ ```bash
198
+ piper --model /path/to/16Speakers.onnx --speaker 8 --output_file output.wav
199
+ ```
200
+
201
+ ## Testing Checklist
202
+
203
+ - [x] Download script uses correct filename (16Speakers.onnx)
204
+ - [x] Voice manager scans directory for custom voices
205
+ - [x] Multi-speaker registry created with all 16 speakers
206
+ - [x] Voice manager checks multi-speaker registry
207
+ - [x] play-tts-piper.sh reads speaker ID from config
208
+ - [x] play-tts-piper.sh passes --speaker flag to Piper
209
+ - [ ] Test: Download extra voices via MCP
210
+ - [ ] Test: Switch to jenny voice
211
+ - [ ] Test: Switch to kristin voice
212
+ - [ ] Test: Switch to Cori_Samuel (multi-speaker)
213
+ - [ ] Test: Play TTS with each voice
214
+ - [ ] Test: List voices shows all custom + multi-speaker
215
+
216
+ ## Next Steps
217
+
218
+ 1. **Test the implementation** with actual voice downloads and switching
219
+ 2. **Update voice listing** to show custom and multi-speaker voices in organized sections
220
+ 3. **Add MCP methods** for listing multi-speaker voices
221
+ 4. **Create user documentation** with voice preview samples
222
+
223
+ ## Benefits
224
+
225
+ ✅ **Users can now**:
226
+ - Download high-quality custom voices with one command
227
+ - Switch to custom voices (jenny, kristin) just like standard voices
228
+ - Access individual speakers from multi-speaker models
229
+ - Choose from 19 total custom voices (3 models + 16 individual speakers)
230
+
231
+ ✅ **System improvements**:
232
+ - Consistent voice switching experience across all voice types
233
+ - Automatic multi-speaker detection and configuration
234
+ - Clear error messages with available voice listings
235
+ - Support for future multi-speaker models
@@ -0,0 +1,254 @@
1
+ # Voice Registration Fix - Extra Piper Voices
2
+
3
+ ## Problems Identified
4
+
5
+ ### 1. **Download Issues**
6
+ - The `tracy.onnx` download only got 15 bytes (redirect/error page)
7
+ - **Root Cause**: The HuggingFace file is actually named `16Speakers.onnx`, not `tracy.onnx`
8
+ - **Fix**: Updated download script to use correct filename `16Speakers.onnx`
9
+
10
+ ### 2. **Voice Registration Issues**
11
+ When users download custom Piper voices (jenny, kristin, 16Speakers), they cannot switch to them because:
12
+
13
+ **Problem**: The voice-manager.sh uses two different lookup methods:
14
+ 1. **ElevenLabs voices**: Uses `voices-config.sh` associative array
15
+ 2. **Piper voices**: Scans `.onnx` files in the voice storage directory
16
+
17
+ **Current voice-manager.sh logic (line 265-269)**:
18
+ ```bash
19
+ # If using Piper and voice name looks like a Piper model (contains underscore and dash)
20
+ # then skip ElevenLabs voice validation
21
+ if [[ "$ACTIVE_PROVIDER" == "piper" ]] && [[ "$VOICE_NAME" == *"_"*"-"* ]]; then
22
+ # This is a Piper model name, use it directly
23
+ FOUND="$VOICE_NAME"
24
+ ```
25
+
26
+ **Issue**: Custom voice names like `jenny`, `kristin`, and `16Speakers` DON'T contain underscore and dash, so they fail the Piper detection and fall through to ElevenLabs lookup, which fails.
27
+
28
+ **Why it fails**:
29
+ - `jenny` → No underscore/dash → Falls to ElevenLabs lookup → Not found → Error
30
+ - `kristin` → No underscore/dash → Falls to ElevenLabs lookup → Not found → Error
31
+ - `16Speakers` → No underscore/dash → Falls to ElevenLabs lookup → Not found → Error
32
+
33
+ **Why standard Piper voices work**:
34
+ - `en_US-lessac-medium` → Contains `_` and `-` → Passes Piper check → Works!
35
+ - `en_GB-alan-medium` → Contains `_` and `-` → Passes Piper check → Works!
36
+
37
+ ### 3. **Multi-Speaker Voice Support (16Speakers)**
38
+
39
+ The `16Speakers.onnx` is a special multi-speaker model containing 16 different voices:
40
+
41
+ ```json
42
+ {
43
+ "speaker_id_map": {
44
+ "Cori_Samuel": 0,
45
+ "Kara_Shallenberg": 1,
46
+ "Kristin_Hughes": 2,
47
+ "Maria_Kasper": 3,
48
+ "Mike_Pelton": 4,
49
+ "Mark_Nelson": 5,
50
+ "Michael_Scherer": 6,
51
+ "James_K_White": 7,
52
+ "Rose_Ibex": 8,
53
+ "progressingamerica": 9,
54
+ "Steve_C": 10,
55
+ "Owlivia": 11,
56
+ "Paul_Hampton": 12,
57
+ "Jennifer_Dorr": 13,
58
+ "Emily_Cripps": 14,
59
+ "Martin_Clifton": 15
60
+ }
61
+ }
62
+ ```
63
+
64
+ **Usage**: Users should be able to say:
65
+ - `/agent-vibes:switch Cori_Samuel` → Uses `16Speakers.onnx` with speaker ID 0
66
+ - `/agent-vibes:switch Rose_Ibex` → Uses `16Speakers.onnx` with speaker ID 8
67
+
68
+ **Problem**: Currently no system to:
69
+ 1. Parse multi-speaker voice names
70
+ 2. Pass speaker ID to Piper TTS
71
+ 3. Register individual speaker names from multi-speaker models
72
+
73
+ ## Solution Design
74
+
75
+ ### Phase 1: Fix Basic Custom Voice Registration
76
+
77
+ **Approach**: Enhance `voice-manager.sh` to check for custom Piper voices by scanning the voice directory.
78
+
79
+ **Modified logic**:
80
+ ```bash
81
+ # 1. Check if it's a number (for ElevenLabs numbered selection)
82
+ if [[ "$VOICE_NAME" =~ ^[0-9]+$ ]]; then
83
+ # ... existing numbered selection code ...
84
+
85
+ # 2. NEW: Check if it's a Piper voice (scan voice directory)
86
+ elif [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
87
+ source "$SCRIPT_DIR/piper-voice-manager.sh"
88
+ VOICE_DIR=$(get_voice_storage_dir)
89
+
90
+ # Check if voice file exists (case-insensitive)
91
+ FOUND=""
92
+ for onnx_file in "$VOICE_DIR"/*.onnx; do
93
+ if [[ -f "$onnx_file" ]]; then
94
+ voice=$(basename "$onnx_file" .onnx)
95
+ if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
96
+ FOUND="$voice"
97
+ break
98
+ fi
99
+ fi
100
+ done
101
+
102
+ if [[ -z "$FOUND" ]]; then
103
+ echo "❌ Piper voice not found: $VOICE_NAME"
104
+ echo ""
105
+ echo "Available Piper voices:"
106
+ for onnx_file in "$VOICE_DIR"/*.onnx; do
107
+ [[ -f "$onnx_file" ]] && echo " - $(basename "$onnx_file" .onnx)"
108
+ done | sort
109
+ exit 1
110
+ fi
111
+
112
+ # 3. Fall back to ElevenLabs lookup
113
+ else
114
+ # ... existing ElevenLabs lookup code ...
115
+ fi
116
+ ```
117
+
118
+ ### Phase 2: Multi-Speaker Support
119
+
120
+ **1. Create Multi-Speaker Registry**
121
+
122
+ New file: `.claude/hooks/piper-multispeaker-registry.sh`
123
+
124
+ ```bash
125
+ # Registry of multi-speaker models and their speaker names
126
+ # Format: "SpeakerName:model_file:speaker_id"
127
+ MULTISPEAKER_VOICES=(
128
+ "Cori_Samuel:16Speakers:0"
129
+ "Kara_Shallenberg:16Speakers:1"
130
+ "Kristin_Hughes:16Speakers:2"
131
+ "Maria_Kasper:16Speakers:3"
132
+ "Mike_Pelton:16Speakers:4"
133
+ "Mark_Nelson:16Speakers:5"
134
+ "Michael_Scherer:16Speakers:6"
135
+ "James_K_White:16Speakers:7"
136
+ "Rose_Ibex:16Speakers:8"
137
+ "progressingamerica:16Speakers:9"
138
+ "Steve_C:16Speakers:10"
139
+ "Owlivia:16Speakers:11"
140
+ "Paul_Hampton:16Speakers:12"
141
+ "Jennifer_Dorr:16Speakers:13"
142
+ "Emily_Cripps:16Speakers:14"
143
+ "Martin_Clifton:16Speakers:15"
144
+ )
145
+
146
+ # Get model and speaker ID for a speaker name
147
+ get_multispeaker_info() {
148
+ local speaker_name="$1"
149
+ for entry in "${MULTISPEAKER_VOICES[@]}"; do
150
+ name="${entry%%:*}"
151
+ rest="${entry#*:}"
152
+ model="${rest%%:*}"
153
+ speaker_id="${rest#*:}"
154
+
155
+ if [[ "${name,,}" == "${speaker_name,,}" ]]; then
156
+ echo "$model:$speaker_id"
157
+ return 0
158
+ fi
159
+ done
160
+ return 1
161
+ }
162
+ ```
163
+
164
+ **2. Update voice-manager.sh**
165
+
166
+ ```bash
167
+ # After checking standard Piper voices, check multi-speaker registry
168
+ if [[ -z "$FOUND" ]] && [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
169
+ source "$SCRIPT_DIR/piper-multispeaker-registry.sh"
170
+
171
+ MULTISPEAKER_INFO=$(get_multispeaker_info "$VOICE_NAME")
172
+ if [[ -n "$MULTISPEAKER_INFO" ]]; then
173
+ MODEL="${MULTISPEAKER_INFO%%:*}"
174
+ SPEAKER_ID="${MULTISPEAKER_INFO#*:}"
175
+
176
+ # Store as "SpeakerName" in tts-voice.txt
177
+ # Store model and speaker ID separately for play-tts-piper.sh to use
178
+ echo "$VOICE_NAME" > "$VOICE_FILE"
179
+ echo "$MODEL" > "$CLAUDE_DIR/tts-piper-model.txt"
180
+ echo "$SPEAKER_ID" > "$CLAUDE_DIR/tts-piper-speaker-id.txt"
181
+
182
+ echo "✅ Multi-speaker voice switched to: $VOICE_NAME"
183
+ echo "🎤 Model: $MODEL (Speaker ID: $SPEAKER_ID)"
184
+ exit 0
185
+ fi
186
+ fi
187
+ ```
188
+
189
+ **3. Update play-tts-piper.sh**
190
+
191
+ ```bash
192
+ # Check if this is a multi-speaker voice
193
+ SPEAKER_ID_FILE="$CLAUDE_DIR/tts-piper-speaker-id.txt"
194
+ MODEL_FILE="$CLAUDE_DIR/tts-piper-model.txt"
195
+
196
+ if [[ -f "$SPEAKER_ID_FILE" ]] && [[ -f "$MODEL_FILE" ]]; then
197
+ # Use multi-speaker model
198
+ PIPER_MODEL=$(cat "$MODEL_FILE")
199
+ SPEAKER_ID=$(cat "$SPEAKER_ID_FILE")
200
+
201
+ # Get model path
202
+ VOICE_PATH=$(get_voice_path "$PIPER_MODEL")
203
+
204
+ # Pass speaker ID to Piper
205
+ echo "$TEXT" | piper \
206
+ --model "$VOICE_PATH" \
207
+ --speaker "$SPEAKER_ID" \
208
+ --output_file "$OUTPUT_FILE" 2>&1
209
+ else
210
+ # Standard single-speaker voice
211
+ # ... existing code ...
212
+ fi
213
+ ```
214
+
215
+ ## Implementation Plan
216
+
217
+ ### Step 1: Fix download script filename ✅
218
+ - [x] Change `tracy.onnx` to `16Speakers.onnx` in download-extra-voices.sh
219
+
220
+ ### Step 2: Fix basic custom voice switching
221
+ - [ ] Update `voice-manager.sh` switch logic to scan voice directory for Piper voices
222
+ - [ ] Test switching to `jenny`, `kristin`, `16Speakers`
223
+
224
+ ### Step 3: Implement multi-speaker support
225
+ - [ ] Create `piper-multispeaker-registry.sh`
226
+ - [ ] Update `voice-manager.sh` to handle multi-speaker lookups
227
+ - [ ] Update `play-tts-piper.sh` to pass speaker ID to Piper
228
+ - [ ] Test switching to individual speakers (e.g., `Cori_Samuel`, `Rose_Ibex`)
229
+
230
+ ### Step 4: Update voice listing
231
+ - [ ] Make `/agent-vibes:list` show all custom voices (jenny, kristin, 16 speaker names)
232
+ - [ ] Organize output: "Standard Voices", "Custom Voices", "Multi-Speaker Voices"
233
+
234
+ ### Step 5: MCP Integration
235
+ - [ ] Update MCP server to expose multi-speaker voice info
236
+ - [ ] Add `list_multispeaker_voices()` method to show available speakers
237
+
238
+ ## Testing Checklist
239
+
240
+ - [ ] Download extra voices: `mcp__agentvibes__download_extra_voices()`
241
+ - [ ] Switch to jenny: `/agent-vibes:switch jenny`
242
+ - [ ] Switch to kristin: `/agent-vibes:switch kristin`
243
+ - [ ] Switch to 16Speakers: `/agent-vibes:switch 16Speakers`
244
+ - [ ] Switch to Cori_Samuel: `/agent-vibes:switch Cori_Samuel`
245
+ - [ ] Switch to Rose_Ibex: `/agent-vibes:switch Rose_Ibex`
246
+ - [ ] List all voices: `/agent-vibes:list` (should show all custom + multi-speaker)
247
+ - [ ] Play TTS with each voice to verify audio works
248
+
249
+ ## Future Enhancements
250
+
251
+ 1. **Auto-registration**: When downloading 16Speakers, auto-register all 16 speaker names
252
+ 2. **Voice preview**: Add preview support for multi-speaker voices
253
+ 3. **Voice metadata**: Store speaker descriptions (gender, accent, etc.) in registry
254
+ 4. **Dynamic discovery**: Auto-scan .onnx.json files for speaker_id_map and register dynamically
@@ -0,0 +1,88 @@
1
+ #!/bin/bash
2
+ #
3
+ # Fix VS Code Workspace Colors
4
+ # Sets the status bar and activity bar to purple for this workspace
5
+ #
6
+
7
+ set -e
8
+
9
+ WORKSPACE_FILE=".vscode/settings.json"
10
+
11
+ echo "🎨 Fixing VS Code workspace colors to purple..."
12
+
13
+ # Create .vscode directory if it doesn't exist
14
+ mkdir -p .vscode
15
+
16
+ # Check if settings.json exists
17
+ if [[ ! -f "$WORKSPACE_FILE" ]]; then
18
+ echo "Creating new workspace settings file..."
19
+ cat > "$WORKSPACE_FILE" <<'EOF'
20
+ {
21
+ "workbench.colorCustomizations": {
22
+ "statusBar.background": "#7b2cbf",
23
+ "statusBar.foreground": "#ffffff",
24
+ "statusBarItem.hoverBackground": "#9d4edd",
25
+ "activityBar.background": "#7b2cbf",
26
+ "activityBar.foreground": "#ffffff",
27
+ "activityBar.inactiveForeground": "#c9c9c9",
28
+ "titleBar.activeBackground": "#7b2cbf",
29
+ "titleBar.activeForeground": "#ffffff",
30
+ "titleBar.inactiveBackground": "#6a24a8",
31
+ "titleBar.inactiveForeground": "#c9c9c9"
32
+ }
33
+ }
34
+ EOF
35
+ else
36
+ echo "Updating existing workspace settings file..."
37
+
38
+ # Use jq if available, otherwise use simple append
39
+ if command -v jq &> /dev/null; then
40
+ # Backup original
41
+ cp "$WORKSPACE_FILE" "${WORKSPACE_FILE}.backup"
42
+
43
+ # Merge with jq
44
+ jq '. + {
45
+ "workbench.colorCustomizations": {
46
+ "statusBar.background": "#7b2cbf",
47
+ "statusBar.foreground": "#ffffff",
48
+ "statusBarItem.hoverBackground": "#9d4edd",
49
+ "activityBar.background": "#7b2cbf",
50
+ "activityBar.foreground": "#ffffff",
51
+ "activityBar.inactiveForeground": "#c9c9c9",
52
+ "titleBar.activeBackground": "#7b2cbf",
53
+ "titleBar.activeForeground": "#ffffff",
54
+ "titleBar.inactiveBackground": "#6a24a8",
55
+ "titleBar.inactiveForeground": "#c9c9c9"
56
+ }
57
+ }' "${WORKSPACE_FILE}.backup" > "$WORKSPACE_FILE"
58
+
59
+ rm "${WORKSPACE_FILE}.backup"
60
+ echo "✅ Updated using jq"
61
+ else
62
+ echo "⚠️ jq not found - manual update required"
63
+ echo "Please add the following to $WORKSPACE_FILE:"
64
+ echo ""
65
+ cat <<'EOF'
66
+ {
67
+ "workbench.colorCustomizations": {
68
+ "statusBar.background": "#7b2cbf",
69
+ "statusBar.foreground": "#ffffff",
70
+ "statusBarItem.hoverBackground": "#9d4edd",
71
+ "activityBar.background": "#7b2cbf",
72
+ "activityBar.foreground": "#ffffff",
73
+ "activityBar.inactiveForeground": "#c9c9c9",
74
+ "titleBar.activeBackground": "#7b2cbf",
75
+ "titleBar.activeForeground": "#ffffff",
76
+ "titleBar.inactiveBackground": "#6a24a8",
77
+ "titleBar.inactiveForeground": "#c9c9c9"
78
+ }
79
+ }
80
+ EOF
81
+ fi
82
+ fi
83
+
84
+ echo ""
85
+ echo "✅ Workspace colors set to purple!"
86
+ echo "📁 Settings file: $WORKSPACE_FILE"
87
+ echo ""
88
+ echo "Restart VS Code or reload the window for changes to take effect."
package/fixcolors ADDED
@@ -0,0 +1,88 @@
1
+ #!/bin/bash
2
+ #
3
+ # fixcolors - Apply vibrant purple color scheme to AgentVibes VS Code workspace
4
+ # Usage: ./fixcolors
5
+
6
+ set -e
7
+
8
+ PURPLE_ACTIVE="#7b2cbf"
9
+ PURPLE_INACTIVE="#5a189a"
10
+ PURPLE_DEBUG="#9d4edd"
11
+ WHITE="#ffffff"
12
+ LIGHT_GRAY="#e0e0e0"
13
+
14
+ echo "🎨 Applying vibrant purple color scheme to AgentVibes workspace..."
15
+ echo ""
16
+
17
+ # Function to update JSON files with purple colors
18
+ update_colors() {
19
+ local file="$1"
20
+ local temp_file="${file}.tmp"
21
+
22
+ if [[ ! -f "$file" ]]; then
23
+ echo "⚠️ File not found: $file"
24
+ return 1
25
+ fi
26
+
27
+ echo "📝 Updating: $file"
28
+
29
+ # Use Python to safely update JSON
30
+ python3 << EOF
31
+ import json
32
+ import sys
33
+
34
+ try:
35
+ with open('$file', 'r') as f:
36
+ data = json.load(f)
37
+
38
+ # Ensure settings exists
39
+ if 'settings' in data:
40
+ settings = data['settings']
41
+ else:
42
+ settings = data
43
+
44
+ # Ensure workbench.colorCustomizations exists
45
+ if 'workbench.colorCustomizations' not in settings:
46
+ settings['workbench.colorCustomizations'] = {}
47
+
48
+ colors = settings['workbench.colorCustomizations']
49
+
50
+ # Apply purple theme
51
+ colors['titleBar.activeBackground'] = '$PURPLE_ACTIVE'
52
+ colors['titleBar.activeForeground'] = '$WHITE'
53
+ colors['titleBar.inactiveBackground'] = '$PURPLE_INACTIVE'
54
+ colors['titleBar.inactiveForeground'] = '$LIGHT_GRAY'
55
+ colors['statusBar.background'] = '$PURPLE_ACTIVE'
56
+ colors['statusBar.foreground'] = '$WHITE'
57
+ colors['statusBar.noFolderBackground'] = '$PURPLE_INACTIVE'
58
+ colors['statusBar.debuggingBackground'] = '$PURPLE_DEBUG'
59
+
60
+ # Write back
61
+ with open('$temp_file', 'w') as f:
62
+ json.dump(data, f, indent=2)
63
+
64
+ print(" ✓ Colors updated")
65
+
66
+ except Exception as e:
67
+ print(f" ✗ Error: {e}", file=sys.stderr)
68
+ sys.exit(1)
69
+ EOF
70
+
71
+ if [[ $? -eq 0 ]]; then
72
+ mv "$temp_file" "$file"
73
+ echo " ✓ File saved"
74
+ else
75
+ rm -f "$temp_file"
76
+ echo " ✗ Failed to update"
77
+ return 1
78
+ fi
79
+ }
80
+
81
+ # Update AgentVibes workspace
82
+ echo "🔧 AgentVibes workspace:"
83
+ update_colors "/home/fire/claude/AgentVibes/AgentVibes.code-workspace"
84
+ echo ""
85
+
86
+ echo "✅ All done! Reload VS Code window to see the purple theme."
87
+ echo ""
88
+ echo "💡 To reload: Press Ctrl+Shift+P → 'Developer: Reload Window'"