agentvibes 2.0.5 → 2.0.6
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/.claude/hooks/piper-voice-manager.sh +37 -4
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/installer.js +244 -21
- package/agentvibes.org/.claude/commands/agent-vibes/add.md +0 -21
- package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +0 -68
- package/agentvibes.org/.claude/commands/agent-vibes/commands.json +0 -53
- package/agentvibes.org/.claude/commands/agent-vibes/get.md +0 -9
- package/agentvibes.org/.claude/commands/agent-vibes/list.md +0 -13
- package/agentvibes.org/.claude/commands/agent-vibes/personality.md +0 -79
- package/agentvibes.org/.claude/commands/agent-vibes/preview.md +0 -16
- package/agentvibes.org/.claude/commands/agent-vibes/provider.md +0 -54
- package/agentvibes.org/.claude/commands/agent-vibes/replay.md +0 -19
- package/agentvibes.org/.claude/commands/agent-vibes/sample.md +0 -12
- package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +0 -52
- package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +0 -47
- package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +0 -65
- package/agentvibes.org/.claude/commands/agent-vibes/switch.md +0 -53
- package/agentvibes.org/.claude/commands/agent-vibes/update.md +0 -20
- package/agentvibes.org/.claude/commands/agent-vibes/version.md +0 -10
- package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +0 -7
- package/agentvibes.org/.claude/journal/2025-10-07.html +0 -373
- package/agentvibes.org/.claude/journal/index.html +0 -91
- package/agentvibes.org/.mcp-minimal.json +0 -60
- package/agentvibes.org/CHANGELOG.md +0 -56
- package/agentvibes.org/README.md +0 -93
- package/agentvibes.org/app/(auth)/layout.tsx +0 -15
- package/agentvibes.org/app/(auth)/reset-password/page.tsx +0 -45
- package/agentvibes.org/app/(auth)/signin/page.tsx +0 -82
- package/agentvibes.org/app/(auth)/signup/page.tsx +0 -104
- package/agentvibes.org/app/(default)/layout.tsx +0 -31
- package/agentvibes.org/app/(default)/page.tsx +0 -20
- package/agentvibes.org/app/api/hello/route.ts +0 -3
- package/agentvibes.org/app/css/additional-styles/theme.css +0 -82
- package/agentvibes.org/app/css/additional-styles/utility-patterns.css +0 -55
- package/agentvibes.org/app/css/style.css +0 -100
- package/agentvibes.org/app/layout.tsx +0 -63
- package/agentvibes.org/components/cta.tsx +0 -58
- package/agentvibes.org/components/features.tsx +0 -256
- package/agentvibes.org/components/hero-home.tsx +0 -133
- package/agentvibes.org/components/modal-video.tsx +0 -137
- package/agentvibes.org/components/page-illustration.tsx +0 -55
- package/agentvibes.org/components/spotlight.tsx +0 -77
- package/agentvibes.org/components/testimonials.tsx +0 -282
- package/agentvibes.org/components/ui/footer.tsx +0 -82
- package/agentvibes.org/components/ui/header.tsx +0 -53
- package/agentvibes.org/components/ui/logo.tsx +0 -10
- package/agentvibes.org/components/workflows.tsx +0 -176
- package/agentvibes.org/next.config.js +0 -4
- package/agentvibes.org/package-lock.json +0 -1974
- package/agentvibes.org/package.json +0 -30
- package/agentvibes.org/pnpm-lock.yaml +0 -1141
- package/agentvibes.org/postcss.config.js +0 -5
- package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
- package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
- package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
- package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
- package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
- package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
- package/agentvibes.org/public/favicon.ico +0 -0
- package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
- package/agentvibes.org/public/images/blurred-shape-gray.svg +0 -1
- package/agentvibes.org/public/images/blurred-shape.svg +0 -1
- package/agentvibes.org/public/images/client-logo-01.svg +0 -1
- package/agentvibes.org/public/images/client-logo-02.svg +0 -1
- package/agentvibes.org/public/images/client-logo-03.svg +0 -1
- package/agentvibes.org/public/images/client-logo-04.svg +0 -1
- package/agentvibes.org/public/images/client-logo-05.svg +0 -1
- package/agentvibes.org/public/images/client-logo-06.svg +0 -1
- package/agentvibes.org/public/images/client-logo-07.svg +0 -1
- package/agentvibes.org/public/images/client-logo-08.svg +0 -1
- package/agentvibes.org/public/images/client-logo-09.svg +0 -1
- package/agentvibes.org/public/images/features.png +0 -0
- package/agentvibes.org/public/images/footer-illustration.svg +0 -1
- package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
- package/agentvibes.org/public/images/logo.svg +0 -1
- package/agentvibes.org/public/images/page-illustration.svg +0 -1
- package/agentvibes.org/public/images/secondary-illustration.svg +0 -1
- package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
- package/agentvibes.org/public/images/workflow-01.png +0 -0
- package/agentvibes.org/public/images/workflow-02.png +0 -0
- package/agentvibes.org/public/images/workflow-03.png +0 -0
- package/agentvibes.org/public/videos/video.mp4 +0 -0
- package/agentvibes.org/tsconfig.json +0 -28
- package/agentvibes.org/utils/useMasonry.tsx +0 -67
- package/agentvibes.org/utils/useMousePosition.tsx +0 -27
|
@@ -17,11 +17,44 @@ PIPER_VOICES_BASE_URL="https://huggingface.co/rhasspy/piper-voices/resolve/main"
|
|
|
17
17
|
# @why Voice models are large (~25MB each) and should be shared globally across all projects
|
|
18
18
|
# @returns Echoes path to voice storage directory (~/.claude/piper-voices)
|
|
19
19
|
# @sideeffects Creates directory if it doesn't exist
|
|
20
|
-
# @architecture
|
|
20
|
+
# @architecture Supports custom path via PIPER_VOICES_DIR env var, defaults to global storage
|
|
21
21
|
get_voice_storage_dir() {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
local voice_dir
|
|
23
|
+
|
|
24
|
+
# Check for custom path in environment or config file
|
|
25
|
+
if [[ -n "$PIPER_VOICES_DIR" ]]; then
|
|
26
|
+
voice_dir="$PIPER_VOICES_DIR"
|
|
27
|
+
else
|
|
28
|
+
# Check for config file (project-local first, then global)
|
|
29
|
+
local config_file
|
|
30
|
+
if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -f "$CLAUDE_PROJECT_DIR/.claude/piper-voices-dir.txt" ]]; then
|
|
31
|
+
config_file="$CLAUDE_PROJECT_DIR/.claude/piper-voices-dir.txt"
|
|
32
|
+
else
|
|
33
|
+
# Search up directory tree for .claude/
|
|
34
|
+
local current_dir="$PWD"
|
|
35
|
+
while [[ "$current_dir" != "/" ]]; do
|
|
36
|
+
if [[ -f "$current_dir/.claude/piper-voices-dir.txt" ]]; then
|
|
37
|
+
config_file="$current_dir/.claude/piper-voices-dir.txt"
|
|
38
|
+
break
|
|
39
|
+
fi
|
|
40
|
+
current_dir=$(dirname "$current_dir")
|
|
41
|
+
done
|
|
42
|
+
|
|
43
|
+
# Check global config
|
|
44
|
+
if [[ -z "$config_file" ]] && [[ -f "$HOME/.claude/piper-voices-dir.txt" ]]; then
|
|
45
|
+
config_file="$HOME/.claude/piper-voices-dir.txt"
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
if [[ -n "$config_file" ]]; then
|
|
50
|
+
voice_dir=$(cat "$config_file" | tr -d '[:space:]')
|
|
51
|
+
fi
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Fallback to default global storage
|
|
55
|
+
if [[ -z "$voice_dir" ]]; then
|
|
56
|
+
voice_dir="$HOME/.claude/piper-voices"
|
|
57
|
+
fi
|
|
25
58
|
|
|
26
59
|
mkdir -p "$voice_dir"
|
|
27
60
|
echo "$voice_dir"
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.0.
|
|
14
|
+
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.0.6
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
## 📰 Latest Release
|
|
47
47
|
|
|
48
|
-
**[v2.0.0 - The Multi-Provider Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.0.
|
|
48
|
+
**[v2.0.0 - The Multi-Provider Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.0.6)** 🎉
|
|
49
49
|
|
|
50
50
|
The biggest update ever! **Multi-provider TTS support** (ElevenLabs + Piper TTS), **30+ languages**, expanded voice library (27+ voices), advanced sentiment system, enhanced BMAD integration, and comprehensive multilingual support. Choose between premium ElevenLabs voices or free offline Piper TTS!
|
|
51
51
|
|
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.0.
|
|
4
|
+
"version": "2.0.6",
|
|
5
5
|
"description": "Bring your Claude Code sessions to life with voice! Professional TTS narration with multi-provider support.",
|
|
6
6
|
"homepage": "https://agentvibes.org",
|
|
7
7
|
"keywords": [
|
package/src/installer.js
CHANGED
|
@@ -68,11 +68,9 @@ async function install(options = {}) {
|
|
|
68
68
|
// When running via npx, process.cwd() returns the npm cache directory
|
|
69
69
|
// Use INIT_CWD (set by npm/npx) to get the actual user's working directory
|
|
70
70
|
const currentDir = process.env.INIT_CWD || process.cwd();
|
|
71
|
-
const targetDir = options.directory || currentDir;
|
|
72
71
|
|
|
73
72
|
console.log(chalk.cyan('\n📍 Installation Details:'));
|
|
74
73
|
console.log(chalk.gray(` Current directory: ${currentDir}`));
|
|
75
|
-
console.log(chalk.gray(` Install location: ${targetDir}/.claude/ (project-local)`));
|
|
76
74
|
console.log(chalk.gray(` Package version: ${VERSION}`));
|
|
77
75
|
|
|
78
76
|
// Show latest release notes from git log
|
|
@@ -96,6 +94,224 @@ async function install(options = {}) {
|
|
|
96
94
|
// Git not available or not a git repo - skip release notes
|
|
97
95
|
}
|
|
98
96
|
|
|
97
|
+
// Provider selection prompt
|
|
98
|
+
let selectedProvider = 'piper';
|
|
99
|
+
let elevenLabsKey = process.env.ELEVENLABS_API_KEY;
|
|
100
|
+
|
|
101
|
+
if (!options.yes) {
|
|
102
|
+
console.log(chalk.cyan('🎭 Choose Your TTS Provider:\n'));
|
|
103
|
+
|
|
104
|
+
const { provider } = await inquirer.prompt([
|
|
105
|
+
{
|
|
106
|
+
type: 'list',
|
|
107
|
+
name: 'provider',
|
|
108
|
+
message: 'Which TTS provider would you like to use?',
|
|
109
|
+
choices: [
|
|
110
|
+
{
|
|
111
|
+
name: chalk.green('🆓 Piper TTS (Free, Offline)') + chalk.gray(' - 50+ neural voices, no API key needed'),
|
|
112
|
+
value: 'piper',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: chalk.cyan('🎤 ElevenLabs (Premium)') + chalk.gray(' - 150+ AI voices, requires API key'),
|
|
116
|
+
value: 'elevenlabs',
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
default: 'piper',
|
|
120
|
+
},
|
|
121
|
+
]);
|
|
122
|
+
|
|
123
|
+
selectedProvider = provider;
|
|
124
|
+
|
|
125
|
+
// If Piper selected, ask for voice storage location
|
|
126
|
+
let piperVoicesPath = null;
|
|
127
|
+
if (selectedProvider === 'piper') {
|
|
128
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
129
|
+
const defaultPiperPath = path.join(homeDir, '.claude', 'piper-voices');
|
|
130
|
+
|
|
131
|
+
console.log(chalk.cyan('\n📁 Piper Voice Storage Location:\n'));
|
|
132
|
+
console.log(chalk.gray(' Piper voice models are ~25MB each. They can be stored globally'));
|
|
133
|
+
console.log(chalk.gray(' to be shared across all your projects, or locally per project.\n'));
|
|
134
|
+
|
|
135
|
+
const { piperPath } = await inquirer.prompt([
|
|
136
|
+
{
|
|
137
|
+
type: 'input',
|
|
138
|
+
name: 'piperPath',
|
|
139
|
+
message: 'Where should Piper voice models be downloaded?',
|
|
140
|
+
default: defaultPiperPath,
|
|
141
|
+
validate: (input) => {
|
|
142
|
+
if (!input || input.trim() === '') {
|
|
143
|
+
return 'Please provide a valid path';
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
|
|
150
|
+
piperVoicesPath = piperPath;
|
|
151
|
+
console.log(chalk.green(`✓ Piper voices will be stored in: ${piperVoicesPath}`));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// If ElevenLabs selected, handle API key
|
|
155
|
+
if (selectedProvider === 'elevenlabs') {
|
|
156
|
+
if (elevenLabsKey) {
|
|
157
|
+
console.log(chalk.green(`\n✓ ElevenLabs API key detected from environment`));
|
|
158
|
+
console.log(chalk.gray(` Key: ${elevenLabsKey.substring(0, 10)}...`));
|
|
159
|
+
|
|
160
|
+
const { useExisting } = await inquirer.prompt([
|
|
161
|
+
{
|
|
162
|
+
type: 'confirm',
|
|
163
|
+
name: 'useExisting',
|
|
164
|
+
message: 'Use this existing API key?',
|
|
165
|
+
default: true,
|
|
166
|
+
},
|
|
167
|
+
]);
|
|
168
|
+
|
|
169
|
+
if (!useExisting) {
|
|
170
|
+
elevenLabsKey = null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (!elevenLabsKey) {
|
|
175
|
+
console.log(chalk.yellow('\n⚠️ ElevenLabs API Key Required'));
|
|
176
|
+
console.log(chalk.gray(' Get your free API key at: https://elevenlabs.io'));
|
|
177
|
+
console.log(chalk.gray(' Free tier: 10,000 characters/month\n'));
|
|
178
|
+
|
|
179
|
+
const { setupMethod } = await inquirer.prompt([
|
|
180
|
+
{
|
|
181
|
+
type: 'list',
|
|
182
|
+
name: 'setupMethod',
|
|
183
|
+
message: 'How would you like to set up your API key?',
|
|
184
|
+
choices: [
|
|
185
|
+
{
|
|
186
|
+
name: 'Add to shell config (recommended)',
|
|
187
|
+
value: 'shell',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: 'Enter manually (I\'ll set it up myself later)',
|
|
191
|
+
value: 'manual',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: 'Skip (use Piper TTS instead)',
|
|
195
|
+
value: 'skip',
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
]);
|
|
200
|
+
|
|
201
|
+
if (setupMethod === 'skip') {
|
|
202
|
+
console.log(chalk.yellow('\n→ Switching to Piper TTS (free option)\n'));
|
|
203
|
+
selectedProvider = 'piper';
|
|
204
|
+
} else if (setupMethod === 'manual') {
|
|
205
|
+
const { apiKey } = await inquirer.prompt([
|
|
206
|
+
{
|
|
207
|
+
type: 'input',
|
|
208
|
+
name: 'apiKey',
|
|
209
|
+
message: 'Enter your ElevenLabs API key:',
|
|
210
|
+
validate: (input) => input.length > 0 || 'API key cannot be empty',
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
elevenLabsKey = apiKey;
|
|
214
|
+
console.log(chalk.yellow('\n⚠️ Remember to add this to your environment variables later:'));
|
|
215
|
+
console.log(chalk.gray(` export ELEVENLABS_API_KEY="${apiKey}"\n`));
|
|
216
|
+
} else if (setupMethod === 'shell') {
|
|
217
|
+
const { apiKey } = await inquirer.prompt([
|
|
218
|
+
{
|
|
219
|
+
type: 'input',
|
|
220
|
+
name: 'apiKey',
|
|
221
|
+
message: 'Enter your ElevenLabs API key:',
|
|
222
|
+
validate: (input) => input.length > 0 || 'API key cannot be empty',
|
|
223
|
+
},
|
|
224
|
+
]);
|
|
225
|
+
elevenLabsKey = apiKey;
|
|
226
|
+
|
|
227
|
+
// Detect shell
|
|
228
|
+
const shell = process.env.SHELL || '';
|
|
229
|
+
let shellConfig = '';
|
|
230
|
+
let shellName = '';
|
|
231
|
+
|
|
232
|
+
if (shell.includes('zsh')) {
|
|
233
|
+
shellConfig = path.join(process.env.HOME, '.zshrc');
|
|
234
|
+
shellName = 'zsh';
|
|
235
|
+
} else if (shell.includes('bash')) {
|
|
236
|
+
shellConfig = path.join(process.env.HOME, '.bashrc');
|
|
237
|
+
shellName = 'bash';
|
|
238
|
+
} else {
|
|
239
|
+
console.log(chalk.yellow('\n⚠️ Could not detect shell type'));
|
|
240
|
+
console.log(chalk.gray(' Please add manually to your shell config:'));
|
|
241
|
+
console.log(chalk.gray(` export ELEVENLABS_API_KEY="${apiKey}"\n`));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (shellConfig && shellName) {
|
|
245
|
+
console.log(chalk.cyan(`\n🐚 Detected shell: ${shellName}`));
|
|
246
|
+
console.log(chalk.gray(` Config file: ${shellConfig}`));
|
|
247
|
+
|
|
248
|
+
const { confirmShell } = await inquirer.prompt([
|
|
249
|
+
{
|
|
250
|
+
type: 'confirm',
|
|
251
|
+
name: 'confirmShell',
|
|
252
|
+
message: `Add ELEVENLABS_API_KEY to ${shellConfig}?`,
|
|
253
|
+
default: true,
|
|
254
|
+
},
|
|
255
|
+
]);
|
|
256
|
+
|
|
257
|
+
if (confirmShell) {
|
|
258
|
+
try {
|
|
259
|
+
const configContent = `\n# ElevenLabs API Key for AgentVibes\nexport ELEVENLABS_API_KEY="${apiKey}"\n`;
|
|
260
|
+
await fs.appendFile(shellConfig, configContent);
|
|
261
|
+
console.log(chalk.green(`\n✓ API key added to ${shellConfig}`));
|
|
262
|
+
console.log(chalk.yellow(' Run this to use immediately: ') + chalk.cyan(`source ${shellConfig}`));
|
|
263
|
+
} catch (error) {
|
|
264
|
+
console.log(chalk.red(`\n✗ Failed to write to ${shellConfig}`));
|
|
265
|
+
console.log(chalk.gray(' Please add manually:'));
|
|
266
|
+
console.log(chalk.gray(` export ELEVENLABS_API_KEY="${apiKey}"\n`));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
console.log(''); // Spacing
|
|
275
|
+
} else {
|
|
276
|
+
console.log(chalk.green('✓ Auto-confirmed (--yes flag)'));
|
|
277
|
+
// Auto-detect provider based on API key
|
|
278
|
+
if (elevenLabsKey) {
|
|
279
|
+
selectedProvider = 'elevenlabs';
|
|
280
|
+
console.log(chalk.green('✓ Using ElevenLabs (API key detected)\n'));
|
|
281
|
+
} else {
|
|
282
|
+
selectedProvider = 'piper';
|
|
283
|
+
console.log(chalk.green('✓ Using Piper TTS (free option)\n'));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Ask for installation directory
|
|
288
|
+
let targetDir = options.directory || currentDir;
|
|
289
|
+
|
|
290
|
+
if (!options.yes) {
|
|
291
|
+
console.log(chalk.cyan('\n📂 AgentVibes Installation Location:\n'));
|
|
292
|
+
console.log(chalk.gray(' AgentVibes will be installed in the .claude/ subdirectory'));
|
|
293
|
+
console.log(chalk.gray(' of your chosen location.\n'));
|
|
294
|
+
|
|
295
|
+
const { installDir } = await inquirer.prompt([
|
|
296
|
+
{
|
|
297
|
+
type: 'input',
|
|
298
|
+
name: 'installDir',
|
|
299
|
+
message: 'Where should AgentVibes be installed?',
|
|
300
|
+
default: currentDir,
|
|
301
|
+
validate: (input) => {
|
|
302
|
+
if (!input || input.trim() === '') {
|
|
303
|
+
return 'Please provide a valid directory path';
|
|
304
|
+
}
|
|
305
|
+
return true;
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
]);
|
|
309
|
+
|
|
310
|
+
targetDir = installDir;
|
|
311
|
+
console.log(chalk.green(`✓ AgentVibes will be installed in: ${targetDir}/.claude/`));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Show installation summary
|
|
99
315
|
console.log(chalk.cyan('\n📦 What will be installed:'));
|
|
100
316
|
console.log(chalk.gray(` • 16 slash commands → ${targetDir}/.claude/commands/agent-vibes/`));
|
|
101
317
|
console.log(chalk.gray(` • Multi-provider TTS system (ElevenLabs + Piper TTS) → ${targetDir}/.claude/hooks/`));
|
|
@@ -112,7 +328,7 @@ async function install(options = {}) {
|
|
|
112
328
|
{
|
|
113
329
|
type: 'confirm',
|
|
114
330
|
name: 'confirm',
|
|
115
|
-
message: chalk.yellow(`Install AgentVibes in ${targetDir}/.claude/ ?`),
|
|
331
|
+
message: chalk.yellow(`Install AgentVibes with ${selectedProvider === 'elevenlabs' ? 'ElevenLabs' : 'Piper TTS'} in ${targetDir}/.claude/ ?`),
|
|
116
332
|
default: true,
|
|
117
333
|
},
|
|
118
334
|
]);
|
|
@@ -121,8 +337,6 @@ async function install(options = {}) {
|
|
|
121
337
|
console.log(chalk.red('\n❌ Installation cancelled.\n'));
|
|
122
338
|
process.exit(0);
|
|
123
339
|
}
|
|
124
|
-
} else {
|
|
125
|
-
console.log(chalk.green('✓ Auto-confirmed (--yes flag)\n'));
|
|
126
340
|
}
|
|
127
341
|
|
|
128
342
|
console.log(''); // Add spacing
|
|
@@ -258,24 +472,19 @@ async function install(options = {}) {
|
|
|
258
472
|
}
|
|
259
473
|
spinner.succeed(chalk.green('Installed output styles!\n'));
|
|
260
474
|
|
|
261
|
-
//
|
|
262
|
-
spinner.start('
|
|
263
|
-
const
|
|
475
|
+
// Save provider selection
|
|
476
|
+
spinner.start('Saving provider configuration...');
|
|
477
|
+
const providerConfigPath = path.join(claudeDir, 'tts-provider.txt');
|
|
478
|
+
await fs.writeFile(providerConfigPath, selectedProvider);
|
|
264
479
|
|
|
265
|
-
if
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
console.log(chalk.white(' 2. Sign up or log in (free tier available)'));
|
|
270
|
-
console.log(chalk.white(' 3. Copy your API key from the profile section'));
|
|
271
|
-
console.log(chalk.white(' 4. Set it in your shell profile:\n'));
|
|
272
|
-
console.log(chalk.cyan(' export ELEVENLABS_API_KEY="your-key-here"'));
|
|
273
|
-
console.log(chalk.gray('\n Add this to ~/.bashrc or ~/.zshrc to make it permanent\n'));
|
|
274
|
-
} else {
|
|
275
|
-
spinner.succeed(chalk.green('ElevenLabs API key found!'));
|
|
276
|
-
console.log(chalk.gray(` Key: ${apiKey.substring(0, 10)}...\n`));
|
|
480
|
+
// Save Piper voices directory if Piper is selected
|
|
481
|
+
if (selectedProvider === 'piper' && piperVoicesPath) {
|
|
482
|
+
const piperConfigPath = path.join(claudeDir, 'piper-voices-dir.txt');
|
|
483
|
+
await fs.writeFile(piperConfigPath, piperVoicesPath);
|
|
277
484
|
}
|
|
278
485
|
|
|
486
|
+
spinner.succeed(chalk.green(`Provider set to: ${selectedProvider === 'elevenlabs' ? 'ElevenLabs' : 'Piper TTS'}\n`));
|
|
487
|
+
|
|
279
488
|
// List what was installed
|
|
280
489
|
console.log(chalk.cyan('📦 Installation Summary:'));
|
|
281
490
|
console.log(chalk.white(` • ${commandFiles.length} slash commands installed`));
|
|
@@ -283,7 +492,21 @@ async function install(options = {}) {
|
|
|
283
492
|
console.log(chalk.white(` • ${personalityFiles.length} personality templates installed`));
|
|
284
493
|
console.log(chalk.white(` • ${outputStyleFiles.length} output styles installed`));
|
|
285
494
|
console.log(chalk.white(` • Voice manager ready`));
|
|
286
|
-
|
|
495
|
+
|
|
496
|
+
if (selectedProvider === 'elevenlabs') {
|
|
497
|
+
console.log(chalk.white(` • 27+ ElevenLabs AI voices available`));
|
|
498
|
+
console.log(chalk.white(` • 30+ languages supported`));
|
|
499
|
+
if (elevenLabsKey) {
|
|
500
|
+
console.log(chalk.green(` • ElevenLabs API key configured ✓`));
|
|
501
|
+
} else {
|
|
502
|
+
console.log(chalk.yellow(` • ElevenLabs API key: Set manually later`));
|
|
503
|
+
}
|
|
504
|
+
} else {
|
|
505
|
+
console.log(chalk.white(` • 50+ Piper neural voices available (free!)`));
|
|
506
|
+
console.log(chalk.white(` • 18 languages supported`));
|
|
507
|
+
console.log(chalk.green(` • No API key needed ✓`));
|
|
508
|
+
}
|
|
509
|
+
console.log('');
|
|
287
510
|
|
|
288
511
|
// Show recent changes from git log or RELEASE_NOTES.md
|
|
289
512
|
try {
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Add a new custom ElevenLabs TTS voice
|
|
3
|
-
argument-hint: <voice_name> <voice_id>
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Add a new custom ElevenLabs TTS voice to your voice library.
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
- `/agent-vibes:add "My Custom Voice" abc123xyz456789`
|
|
10
|
-
- `/agent-vibes:add Narrator KTPVrSVAEUSJRClDzBw7`
|
|
11
|
-
|
|
12
|
-
The voice ID should be a 15-30 character alphanumeric string from your ElevenLabs account.
|
|
13
|
-
|
|
14
|
-
To find your voice IDs:
|
|
15
|
-
1. Go to https://elevenlabs.io/app/voice-library
|
|
16
|
-
2. Click on a voice
|
|
17
|
-
3. Copy the voice ID from the URL or settings
|
|
18
|
-
|
|
19
|
-
After adding, you can switch to it with `/agent-vibes:switch "Voice Name"`
|
|
20
|
-
|
|
21
|
-
!bash .claude/hooks/voice-manager.sh add $ARGUMENTS
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: ElevenLabs TTS voice management commands
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# 🎤 ElevenLabs Voice Management
|
|
6
|
-
|
|
7
|
-
Manage your ElevenLabs text-to-speech voices with these commands:
|
|
8
|
-
|
|
9
|
-
## Available Commands
|
|
10
|
-
|
|
11
|
-
### `/agent-vibes:list [first|last] [N]`
|
|
12
|
-
List all available voices, with optional filtering
|
|
13
|
-
- `/agent-vibes:list` - Show all voices
|
|
14
|
-
- `/agent-vibes:list first 5` - Show first 5 voices
|
|
15
|
-
- `/agent-vibes:list last 3` - Show last 3 voices
|
|
16
|
-
|
|
17
|
-
### `/agent-vibes:preview [first|last] [N]`
|
|
18
|
-
Preview voices by playing audio samples
|
|
19
|
-
- `/agent-vibes:preview` - Preview first 3 voices
|
|
20
|
-
- `/agent-vibes:preview 5` - Preview first 5 voices
|
|
21
|
-
- `/agent-vibes:preview last 5` - Preview last 5 voices
|
|
22
|
-
|
|
23
|
-
### `/agent-vibes:switch <voice_name>`
|
|
24
|
-
Switch to a different default voice
|
|
25
|
-
- `/agent-vibes:switch Northern Terry`
|
|
26
|
-
- `/agent-vibes:switch "Cowboy Bob"`
|
|
27
|
-
|
|
28
|
-
### `/agent-vibes:get`
|
|
29
|
-
Display the currently selected voice
|
|
30
|
-
|
|
31
|
-
### `/agent-vibes:add <name> <voice_id>`
|
|
32
|
-
Add a new custom voice from your ElevenLabs account
|
|
33
|
-
- `/agent-vibes:add "My Voice" abc123xyz456`
|
|
34
|
-
|
|
35
|
-
### `/agent-vibes:replay [N]`
|
|
36
|
-
Replay recently played TTS audio
|
|
37
|
-
- `/agent-vibes:replay` - Replay last audio
|
|
38
|
-
- `/agent-vibes:replay 1` - Replay most recent
|
|
39
|
-
- `/agent-vibes:replay 2` - Replay second-to-last
|
|
40
|
-
- `/agent-vibes:replay 3` - Replay third-to-last
|
|
41
|
-
|
|
42
|
-
Keeps last 10 audio files in history.
|
|
43
|
-
|
|
44
|
-
### `/agent-vibes:set-pretext <word>`
|
|
45
|
-
Set a prefix word/phrase for all TTS messages
|
|
46
|
-
- `/agent-vibes:set-pretext AgentVibes` - All TTS starts with "AgentVibes:"
|
|
47
|
-
- `/agent-vibes:set-pretext "Project Alpha"` - Custom phrase
|
|
48
|
-
- `/agent-vibes:set-pretext ""` - Clear pretext
|
|
49
|
-
|
|
50
|
-
Saved locally in `.claude/config/agentvibes.json`
|
|
51
|
-
|
|
52
|
-
## Getting Voice IDs
|
|
53
|
-
|
|
54
|
-
To add your own custom voices:
|
|
55
|
-
1. Go to https://elevenlabs.io/app/voice-library
|
|
56
|
-
2. Select or create a voice
|
|
57
|
-
3. Copy the voice ID (15-30 character alphanumeric string)
|
|
58
|
-
4. Use `/agent-vibes:add` to add it
|
|
59
|
-
|
|
60
|
-
## Default Voices
|
|
61
|
-
|
|
62
|
-
The system comes with these Character Voices from ElevenLabs:
|
|
63
|
-
- Northern Terry, Grandpa Spuds Oxley, Ms. Walker
|
|
64
|
-
- Ralf Eisend, Amy, Michael, Jessica Anne Bogart
|
|
65
|
-
- Aria, Lutz Laugh, Dr. Von Fusion, Matthew Schmitz
|
|
66
|
-
- Demon Monster, Cowboy Bob, Drill Sergeant
|
|
67
|
-
|
|
68
|
-
Enjoy your TTS experience! 🎵
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"namespace": "agent-vibes",
|
|
3
|
-
"commands": [
|
|
4
|
-
{
|
|
5
|
-
"name": "list",
|
|
6
|
-
"description": "List all available ElevenLabs voices"
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"name": "preview",
|
|
10
|
-
"description": "Preview ElevenLabs voices by playing audio samples"
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
"name": "switch",
|
|
14
|
-
"description": "Switch to a different ElevenLabs voice"
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"name": "whoami",
|
|
18
|
-
"description": "Display currently selected voice"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"name": "sample",
|
|
22
|
-
"description": "Play a sample with the current or specified voice"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"name": "replay",
|
|
26
|
-
"description": "Replay the last TTS message"
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"name": "personality",
|
|
30
|
-
"description": "Manage AI personality settings"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"name": "sentiment",
|
|
34
|
-
"description": "Set temporary personality sentiment"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"name": "set-pretext",
|
|
38
|
-
"description": "Configure pre-TTS message text"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"name": "set-language",
|
|
42
|
-
"description": "Set TTS language for multilingual voices"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"name": "add",
|
|
46
|
-
"description": "Add a new personality"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"name": "get",
|
|
50
|
-
"description": "Get personality details"
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: List available ElevenLabs TTS voices with optional filtering
|
|
3
|
-
argument-hint: [first|last] [N]
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
List available ElevenLabs TTS voices.
|
|
7
|
-
|
|
8
|
-
Usage examples:
|
|
9
|
-
- `/agent-vibes:list` - Show all voices
|
|
10
|
-
- `/agent-vibes:list first 5` - Show first 5 voices
|
|
11
|
-
- `/agent-vibes:list last 3` - Show last 3 voices
|
|
12
|
-
|
|
13
|
-
!bash .claude/hooks/voice-manager.sh list $ARGUMENTS
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Set or customize the personality style for TTS messages
|
|
3
|
-
argument-hint: [personality_name|list|add|edit|get|reset]
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# /agent-vibes:personality
|
|
7
|
-
|
|
8
|
-
Set or customize the personality style for TTS messages.
|
|
9
|
-
|
|
10
|
-
This command allows you to add character and emotion to your TTS announcements by applying personality modifiers to messages.
|
|
11
|
-
|
|
12
|
-
## Usage
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
# Set a personality
|
|
16
|
-
/agent-vibes:personality flirty
|
|
17
|
-
/agent-vibes:personality sarcastic
|
|
18
|
-
|
|
19
|
-
# List all personalities
|
|
20
|
-
/agent-vibes:personality list
|
|
21
|
-
|
|
22
|
-
# Add custom personality
|
|
23
|
-
/agent-vibes:personality add cowboy "Howdy partner!" "Yeehaw!"
|
|
24
|
-
|
|
25
|
-
# Show current personality
|
|
26
|
-
/agent-vibes:personality get
|
|
27
|
-
|
|
28
|
-
# Reset to normal
|
|
29
|
-
/agent-vibes:personality reset
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Available Personalities
|
|
33
|
-
|
|
34
|
-
- **normal** - Standard professional tone
|
|
35
|
-
- **flirty** - Playful and charming
|
|
36
|
-
- **angry** - Frustrated and irritated
|
|
37
|
-
- **sassy** - Bold with attitude
|
|
38
|
-
- **moody** - Melancholic and brooding
|
|
39
|
-
- **funny** - Lighthearted and comedic
|
|
40
|
-
- **sarcastic** - Dry wit and irony
|
|
41
|
-
- **poetic** - Elegant and lyrical
|
|
42
|
-
- **annoying** - Over-enthusiastic
|
|
43
|
-
- **professional** - Formal and precise
|
|
44
|
-
- **pirate** - Seafaring swagger
|
|
45
|
-
- **robot** - Mechanical and precise
|
|
46
|
-
- **surfer-dude** - Chill beach vibes
|
|
47
|
-
- **millennial** - Internet generation speak
|
|
48
|
-
- **zen** - Peaceful and mindful
|
|
49
|
-
- **dramatic** - Theatrical flair
|
|
50
|
-
- **crass** - Edgy and blunt
|
|
51
|
-
- **random** - Picks a different personality each time!
|
|
52
|
-
|
|
53
|
-
## Editing Personalities
|
|
54
|
-
|
|
55
|
-
Each personality is stored as a markdown file in `.claude/personalities/`. You can:
|
|
56
|
-
|
|
57
|
-
### Edit existing personalities:
|
|
58
|
-
```bash
|
|
59
|
-
/agent-vibes:personality edit flirty
|
|
60
|
-
```
|
|
61
|
-
This shows the file path - edit it directly to customize behavior.
|
|
62
|
-
|
|
63
|
-
### Create new personalities:
|
|
64
|
-
```bash
|
|
65
|
-
/agent-vibes:personality add cowboy
|
|
66
|
-
```
|
|
67
|
-
Creates a new personality file, then edit it to customize.
|
|
68
|
-
|
|
69
|
-
### Personality files contain:
|
|
70
|
-
- **Prefix**: Text added before messages
|
|
71
|
-
- **Suffix**: Text added after messages
|
|
72
|
-
- **AI Instructions**: How the AI should speak
|
|
73
|
-
- **Example Responses**: Sample messages
|
|
74
|
-
|
|
75
|
-
Files are located in `.claude/personalities/[name].md`
|
|
76
|
-
|
|
77
|
-
## Implementation
|
|
78
|
-
|
|
79
|
-
!bash .claude/hooks/personality-manager.sh $ARGUMENTS
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Preview ElevenLabs TTS voices by playing audio samples
|
|
3
|
-
argument-hint: [voice_name|first|last] [N]
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Preview ElevenLabs TTS voices by playing audio samples.
|
|
7
|
-
|
|
8
|
-
Usage examples:
|
|
9
|
-
- `/agent-vibes:preview` - Preview first 3 voices (default)
|
|
10
|
-
- `/agent-vibes:preview 5` - Preview first 5 voices
|
|
11
|
-
- `/agent-vibes:preview Jessica` - Preview Jessica Anne Bogart voice
|
|
12
|
-
- `/agent-vibes:preview "Northern Terry"` - Preview Northern Terry voice
|
|
13
|
-
- `/agent-vibes:preview first 10` - Preview first 10 voices
|
|
14
|
-
- `/agent-vibes:preview last 5` - Preview last 5 voices
|
|
15
|
-
|
|
16
|
-
!bash .claude/hooks/voice-manager.sh preview $ARGUMENTS
|