agentvibes 2.0.16 → 2.0.17-beta.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 (154) hide show
  1. package/.claude/github-star-reminder.txt +1 -1
  2. package/.claude/hooks/language-manager.sh +22 -8
  3. package/.claude/hooks/personality-manager.sh +22 -9
  4. package/.claude/hooks/voice-manager.sh +102 -23
  5. package/.claude/output-styles/agent-vibes.md +36 -52
  6. package/.mcp-minimal.json +26 -1
  7. package/AUDIO_TUNNEL_FIX_SUMMARY.md +223 -0
  8. package/INSTALL_MCP_WINDOWS.md +75 -0
  9. package/README.md +439 -307
  10. package/agentvibes.org/.claude/commands/agent-vibes/add.md +21 -0
  11. package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +68 -0
  12. package/agentvibes.org/.claude/commands/agent-vibes/commands.json +53 -0
  13. package/agentvibes.org/.claude/commands/agent-vibes/get.md +9 -0
  14. package/agentvibes.org/.claude/commands/agent-vibes/list.md +13 -0
  15. package/agentvibes.org/.claude/commands/agent-vibes/personality.md +79 -0
  16. package/agentvibes.org/.claude/commands/agent-vibes/preview.md +16 -0
  17. package/agentvibes.org/.claude/commands/agent-vibes/provider.md +54 -0
  18. package/agentvibes.org/.claude/commands/agent-vibes/replay.md +19 -0
  19. package/agentvibes.org/.claude/commands/agent-vibes/sample.md +12 -0
  20. package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +52 -0
  21. package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +47 -0
  22. package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +65 -0
  23. package/agentvibes.org/.claude/commands/agent-vibes/switch.md +53 -0
  24. package/agentvibes.org/.claude/commands/agent-vibes/update.md +20 -0
  25. package/agentvibes.org/.claude/commands/agent-vibes/version.md +10 -0
  26. package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +7 -0
  27. package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +278 -0
  28. package/agentvibes.org/.claude/hooks/language-manager.sh +190 -0
  29. package/agentvibes.org/.claude/hooks/personality-manager.sh +279 -0
  30. package/agentvibes.org/.claude/hooks/piper-download-voices.sh +133 -0
  31. package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +227 -0
  32. package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +201 -0
  33. package/agentvibes.org/.claude/hooks/play-tts-piper.sh +175 -0
  34. package/agentvibes.org/.claude/hooks/play-tts.sh +138 -0
  35. package/agentvibes.org/.claude/hooks/provider-commands.sh +374 -0
  36. package/agentvibes.org/.claude/hooks/provider-manager.sh +196 -0
  37. package/agentvibes.org/.claude/hooks/sentiment-manager.sh +163 -0
  38. package/agentvibes.org/.claude/hooks/voice-manager.sh +349 -0
  39. package/agentvibes.org/.claude/hooks/voices-config.sh +33 -0
  40. package/agentvibes.org/.claude/journal/2025-10-07.html +373 -0
  41. package/agentvibes.org/.claude/journal/index.html +91 -0
  42. package/agentvibes.org/.claude/output-styles/agent-vibes.md +203 -0
  43. package/agentvibes.org/.claude/personalities/angry.md +16 -0
  44. package/agentvibes.org/.claude/personalities/annoying.md +16 -0
  45. package/agentvibes.org/.claude/personalities/crass.md +16 -0
  46. package/agentvibes.org/.claude/personalities/dramatic.md +16 -0
  47. package/agentvibes.org/.claude/personalities/dry-humor.md +52 -0
  48. package/agentvibes.org/.claude/personalities/flirty.md +22 -0
  49. package/agentvibes.org/.claude/personalities/funny.md +16 -0
  50. package/agentvibes.org/.claude/personalities/grandpa.md +34 -0
  51. package/agentvibes.org/.claude/personalities/millennial.md +16 -0
  52. package/agentvibes.org/.claude/personalities/moody.md +16 -0
  53. package/agentvibes.org/.claude/personalities/normal.md +18 -0
  54. package/agentvibes.org/.claude/personalities/pirate.md +16 -0
  55. package/agentvibes.org/.claude/personalities/poetic.md +16 -0
  56. package/agentvibes.org/.claude/personalities/professional.md +16 -0
  57. package/agentvibes.org/.claude/personalities/robot.md +16 -0
  58. package/agentvibes.org/.claude/personalities/sarcastic.md +40 -0
  59. package/agentvibes.org/.claude/personalities/sassy.md +16 -0
  60. package/agentvibes.org/.claude/personalities/surfer-dude.md +16 -0
  61. package/agentvibes.org/.claude/personalities/zen.md +16 -0
  62. package/agentvibes.org/.mcp-minimal.json +60 -0
  63. package/agentvibes.org/CHANGELOG.md +56 -0
  64. package/agentvibes.org/README.md +93 -0
  65. package/agentvibes.org/app/(auth)/layout.tsx +15 -0
  66. package/agentvibes.org/app/(auth)/reset-password/page.tsx +45 -0
  67. package/agentvibes.org/app/(auth)/signin/page.tsx +82 -0
  68. package/agentvibes.org/app/(auth)/signup/page.tsx +104 -0
  69. package/agentvibes.org/app/(default)/layout.tsx +31 -0
  70. package/agentvibes.org/app/(default)/page.tsx +20 -0
  71. package/agentvibes.org/app/api/hello/route.ts +3 -0
  72. package/agentvibes.org/app/css/additional-styles/theme.css +82 -0
  73. package/agentvibes.org/app/css/additional-styles/utility-patterns.css +55 -0
  74. package/agentvibes.org/app/css/style.css +100 -0
  75. package/agentvibes.org/app/layout.tsx +63 -0
  76. package/agentvibes.org/components/cta.tsx +58 -0
  77. package/agentvibes.org/components/features.tsx +256 -0
  78. package/agentvibes.org/components/hero-home.tsx +133 -0
  79. package/agentvibes.org/components/modal-video.tsx +137 -0
  80. package/agentvibes.org/components/page-illustration.tsx +55 -0
  81. package/agentvibes.org/components/spotlight.tsx +77 -0
  82. package/agentvibes.org/components/testimonials.tsx +282 -0
  83. package/agentvibes.org/components/ui/footer.tsx +82 -0
  84. package/agentvibes.org/components/ui/header.tsx +53 -0
  85. package/agentvibes.org/components/ui/logo.tsx +10 -0
  86. package/agentvibes.org/components/workflows.tsx +176 -0
  87. package/agentvibes.org/next.config.js +4 -0
  88. package/agentvibes.org/package-lock.json +1974 -0
  89. package/agentvibes.org/package.json +30 -0
  90. package/agentvibes.org/pnpm-lock.yaml +1141 -0
  91. package/agentvibes.org/postcss.config.js +5 -0
  92. package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
  93. package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
  94. package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
  95. package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
  96. package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
  97. package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
  98. package/agentvibes.org/public/favicon.ico +0 -0
  99. package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
  100. package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
  101. package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
  102. package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
  103. package/agentvibes.org/public/images/blurred-shape-gray.svg +1 -0
  104. package/agentvibes.org/public/images/blurred-shape.svg +1 -0
  105. package/agentvibes.org/public/images/client-logo-01.svg +1 -0
  106. package/agentvibes.org/public/images/client-logo-02.svg +1 -0
  107. package/agentvibes.org/public/images/client-logo-03.svg +1 -0
  108. package/agentvibes.org/public/images/client-logo-04.svg +1 -0
  109. package/agentvibes.org/public/images/client-logo-05.svg +1 -0
  110. package/agentvibes.org/public/images/client-logo-06.svg +1 -0
  111. package/agentvibes.org/public/images/client-logo-07.svg +1 -0
  112. package/agentvibes.org/public/images/client-logo-08.svg +1 -0
  113. package/agentvibes.org/public/images/client-logo-09.svg +1 -0
  114. package/agentvibes.org/public/images/features.png +0 -0
  115. package/agentvibes.org/public/images/footer-illustration.svg +1 -0
  116. package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
  117. package/agentvibes.org/public/images/logo.svg +1 -0
  118. package/agentvibes.org/public/images/page-illustration.svg +1 -0
  119. package/agentvibes.org/public/images/secondary-illustration.svg +1 -0
  120. package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
  121. package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
  122. package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
  123. package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
  124. package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
  125. package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
  126. package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
  127. package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
  128. package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
  129. package/agentvibes.org/public/images/workflow-01.png +0 -0
  130. package/agentvibes.org/public/images/workflow-02.png +0 -0
  131. package/agentvibes.org/public/images/workflow-03.png +0 -0
  132. package/agentvibes.org/public/videos/video.mp4 +0 -0
  133. package/agentvibes.org/tsconfig.json +28 -0
  134. package/agentvibes.org/utils/useMasonry.tsx +67 -0
  135. package/agentvibes.org/utils/useMousePosition.tsx +27 -0
  136. package/bin/mcp-server +206 -0
  137. package/docs/remote-audio-setup.md +83 -2
  138. package/linkedin/vibe-coding-and-pulseaudio.md +121 -0
  139. package/mcp-server/QUICK_START.md +205 -0
  140. package/mcp-server/README.md +347 -0
  141. package/mcp-server/WINDOWS_SETUP.md +277 -0
  142. package/mcp-server/examples/claude_desktop_config.json +11 -0
  143. package/mcp-server/examples/claude_desktop_config_piper.json +9 -0
  144. package/mcp-server/examples/custom_instructions.md +169 -0
  145. package/mcp-server/install-deps.js +95 -0
  146. package/mcp-server/pyproject.toml +52 -0
  147. package/mcp-server/requirements.txt +2 -0
  148. package/mcp-server/server.py +551 -0
  149. package/mcp-server/test_server.py +116 -0
  150. package/package.json +9 -3
  151. package/scripts/check_audio_tunnel.sh +21 -0
  152. package/setup-ubuntu-rdp-audio.sh +139 -0
  153. package/src/commands/install-mcp.js +384 -0
  154. package/src/installer.js +52 -0
@@ -1 +1 @@
1
- 20251011
1
+ 20251015
@@ -2,19 +2,33 @@
2
2
  # Language Manager for AgentVibes
3
3
  # Manages language settings and multilingual voice selection
4
4
 
5
- # Determine project or global config
6
- # Use logical path (not physical) to handle symlinked .claude directories
5
+ # Determine target .claude directory based on context
6
+ # Priority:
7
+ # 1. CLAUDE_PROJECT_DIR env var (set by MCP for project-specific settings)
8
+ # 2. Script location (for direct slash command usage)
9
+ # 3. Global ~/.claude (fallback)
10
+
7
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- CLAUDE_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)"
9
12
 
10
- # Check if we have a project-local .claude directory
11
- if [[ -d "$CLAUDE_DIR" ]] && [[ "$CLAUDE_DIR" != "$HOME/.claude" ]]; then
12
- LANGUAGE_FILE="$CLAUDE_DIR/tts-language.txt"
13
+ if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
14
+ # MCP context: Use the project directory where MCP was invoked
15
+ CLAUDE_DIR="$CLAUDE_PROJECT_DIR/.claude"
13
16
  else
14
- LANGUAGE_FILE="$HOME/.claude/tts-language.txt"
15
- mkdir -p "$HOME/.claude"
17
+ # Direct usage context: Use script location
18
+ CLAUDE_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)"
19
+
20
+ # If script is in global ~/.claude, use that
21
+ if [[ "$CLAUDE_DIR" == "$HOME/.claude" ]]; then
22
+ CLAUDE_DIR="$HOME/.claude"
23
+ elif [[ ! -d "$CLAUDE_DIR" ]]; then
24
+ # Fallback to global if directory doesn't exist
25
+ CLAUDE_DIR="$HOME/.claude"
26
+ fi
16
27
  fi
17
28
 
29
+ LANGUAGE_FILE="$CLAUDE_DIR/tts-language.txt"
30
+ mkdir -p "$CLAUDE_DIR"
31
+
18
32
  # Language to multilingual voice mapping
19
33
  declare -A LANGUAGE_VOICES=(
20
34
  ["spanish"]="Antoni"
@@ -4,18 +4,31 @@
4
4
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
5
  PERSONALITIES_DIR="$SCRIPT_DIR/../personalities"
6
6
 
7
- # Project-local file first, global fallback
8
- # Use logical path (not physical) to handle symlinked .claude directories
9
- # Script is at .claude/hooks/personality-manager.sh, so .claude is ..
10
- CLAUDE_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)"
11
-
12
- # Check if we have a project-local .claude directory
13
- if [[ -d "$CLAUDE_DIR" ]] && [[ "$CLAUDE_DIR" != "$HOME/.claude" ]]; then
14
- PERSONALITY_FILE="$CLAUDE_DIR/tts-personality.txt"
7
+ # Determine target .claude directory based on context
8
+ # Priority:
9
+ # 1. CLAUDE_PROJECT_DIR env var (set by MCP for project-specific settings)
10
+ # 2. Script location (for direct slash command usage)
11
+ # 3. Global ~/.claude (fallback)
12
+
13
+ if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
14
+ # MCP context: Use the project directory where MCP was invoked
15
+ CLAUDE_DIR="$CLAUDE_PROJECT_DIR/.claude"
15
16
  else
16
- PERSONALITY_FILE="$HOME/.claude/tts-personality.txt"
17
+ # Direct usage context: Use script location
18
+ # Script is at .claude/hooks/personality-manager.sh, so .claude is ..
19
+ CLAUDE_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)"
20
+
21
+ # If script is in global ~/.claude, use that
22
+ if [[ "$CLAUDE_DIR" == "$HOME/.claude" ]]; then
23
+ CLAUDE_DIR="$HOME/.claude"
24
+ elif [[ ! -d "$CLAUDE_DIR" ]]; then
25
+ # Fallback to global if directory doesn't exist
26
+ CLAUDE_DIR="$HOME/.claude"
27
+ fi
17
28
  fi
18
29
 
30
+ PERSONALITY_FILE="$CLAUDE_DIR/tts-personality.txt"
31
+
19
32
  # Function to get personality data from markdown file
20
33
  get_personality_data() {
21
34
  local personality="$1"
@@ -6,32 +6,86 @@
6
6
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
7
7
  source "$SCRIPT_DIR/voices-config.sh"
8
8
 
9
- # Project-local file first, global fallback
10
- # Use the logical path from BASH_SOURCE to find .claude directory
11
- # This handles both normal installations and symlinked hooks directories correctly
12
- SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
- CLAUDE_DIR="$(dirname "$SCRIPT_PATH")"
14
-
15
- # Check if we have a project-local .claude directory
16
- if [[ -d "$CLAUDE_DIR" ]] && [[ "$CLAUDE_DIR" != "$HOME/.claude" ]]; then
17
- VOICE_FILE="$CLAUDE_DIR/tts-voice.txt"
9
+ # Determine target .claude directory based on context
10
+ # Priority:
11
+ # 1. CLAUDE_PROJECT_DIR env var (set by MCP for project-specific settings)
12
+ # 2. Script location (for direct slash command usage)
13
+ # 3. Global ~/.claude (fallback)
14
+
15
+ if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
16
+ # MCP context: Use the project directory where MCP was invoked
17
+ CLAUDE_DIR="$CLAUDE_PROJECT_DIR/.claude"
18
18
  else
19
- # Fallback to global
20
- VOICE_FILE="$HOME/.claude/tts-voice.txt"
19
+ # Direct usage context: Use script location
20
+ SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
+ CLAUDE_DIR="$(dirname "$SCRIPT_PATH")"
22
+
23
+ # If script is in global ~/.claude, use that
24
+ if [[ "$CLAUDE_DIR" == "$HOME/.claude" ]]; then
25
+ CLAUDE_DIR="$HOME/.claude"
26
+ elif [[ ! -d "$CLAUDE_DIR" ]]; then
27
+ # Fallback to global if directory doesn't exist
28
+ CLAUDE_DIR="$HOME/.claude"
29
+ fi
21
30
  fi
22
31
 
32
+ VOICE_FILE="$CLAUDE_DIR/tts-voice.txt"
33
+
23
34
  case "$1" in
24
35
  list)
25
- echo "🎤 Available TTS Voices:"
26
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
27
- CURRENT_VOICE=$(cat "$VOICE_FILE" 2>/dev/null || echo "Cowboy")
28
- for voice in "${!VOICES[@]}"; do
29
- if [ "$voice" = "$CURRENT_VOICE" ]; then
30
- echo " ▶ $voice (current)"
31
- else
32
- echo " $voice"
36
+ # Get active provider
37
+ PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
38
+ if [[ ! -f "$PROVIDER_FILE" ]]; then
39
+ PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
40
+ fi
41
+
42
+ ACTIVE_PROVIDER="elevenlabs" # default
43
+ if [ -f "$PROVIDER_FILE" ]; then
44
+ ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
45
+ fi
46
+
47
+ CURRENT_VOICE=$(cat "$VOICE_FILE" 2>/dev/null || echo "Cowboy Bob")
48
+
49
+ if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
50
+ echo "🎤 Available Piper TTS Voices:"
51
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
52
+
53
+ # List downloaded Piper voices
54
+ if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
55
+ source "$SCRIPT_DIR/piper-voice-manager.sh"
56
+ VOICE_DIR=$(get_voice_storage_dir)
57
+ VOICE_COUNT=0
58
+ for onnx_file in "$VOICE_DIR"/*.onnx; do
59
+ if [[ -f "$onnx_file" ]]; then
60
+ voice=$(basename "$onnx_file" .onnx)
61
+ if [ "$voice" = "$CURRENT_VOICE" ]; then
62
+ echo " ▶ $voice (current)"
63
+ else
64
+ echo " $voice"
65
+ fi
66
+ ((VOICE_COUNT++))
67
+ fi
68
+ done | sort
69
+
70
+ if [[ $VOICE_COUNT -eq 0 ]]; then
71
+ echo " (No Piper voices downloaded yet)"
72
+ echo ""
73
+ echo "Download voices with: /agent-vibes:provider download <voice-name>"
74
+ echo "Examples: en_US-lessac-medium, en_GB-alba-medium"
75
+ fi
33
76
  fi
34
- done | sort
77
+ else
78
+ echo "🎤 Available ElevenLabs TTS Voices:"
79
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
80
+ for voice in "${!VOICES[@]}"; do
81
+ if [ "$voice" = "$CURRENT_VOICE" ]; then
82
+ echo " ▶ $voice (current)"
83
+ else
84
+ echo " $voice"
85
+ fi
86
+ done | sort
87
+ fi
88
+
35
89
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
36
90
  echo ""
37
91
  echo "Usage: voice-manager.sh switch <name>"
@@ -314,9 +368,34 @@ case "$1" in
314
368
 
315
369
  list-simple)
316
370
  # Simple list for AI to parse and display
317
- for voice in "${!VOICES[@]}"; do
318
- echo "$voice"
319
- done | sort
371
+ # Get active provider
372
+ PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
373
+ if [[ ! -f "$PROVIDER_FILE" ]]; then
374
+ PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
375
+ fi
376
+
377
+ ACTIVE_PROVIDER="elevenlabs" # default
378
+ if [ -f "$PROVIDER_FILE" ]; then
379
+ ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
380
+ fi
381
+
382
+ if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
383
+ # List downloaded Piper voices
384
+ if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
385
+ source "$SCRIPT_DIR/piper-voice-manager.sh"
386
+ VOICE_DIR=$(get_voice_storage_dir)
387
+ for onnx_file in "$VOICE_DIR"/*.onnx; do
388
+ if [[ -f "$onnx_file" ]]; then
389
+ basename "$onnx_file" .onnx
390
+ fi
391
+ done | sort
392
+ fi
393
+ else
394
+ # List ElevenLabs voices
395
+ for voice in "${!VOICES[@]}"; do
396
+ echo "$voice"
397
+ done | sort
398
+ fi
320
399
  ;;
321
400
 
322
401
  replay)
@@ -128,71 +128,55 @@ You: "✅ That bug be walkin' the plank now, arr!"
128
128
 
129
129
  ## BMAD Plugin Integration
130
130
 
131
- **Automatic voice switching and question detection for BMAD agents:**
131
+ **Automatic voice switching for BMAD agents:**
132
132
 
133
- When a BMAD agent is active, AgentVibes will automatically detect and speak questions.
133
+ When a BMAD agent is activated (e.g., `/BMad:agents:pm`), AgentVibes will automatically:
134
134
 
135
- ### Detection Method:
136
- 1. **Check for `.bmad-agent-context` file** - Contains agent ID if BMAD agent is active
137
- 2. **Check if BMAD plugin is enabled** - `.claude/plugins/bmad-voices-enabled.flag` exists
135
+ 1. **Detect BMAD agent from command/context**
136
+ 2. **Check if BMAD plugin is enabled** (`.claude/plugins/bmad-voices-enabled.flag`)
138
137
  3. **Look up voice mapping** from `.claude/plugins/bmad-voices.md`
138
+ 4. **Apply agent's assigned voice** for all TTS acknowledgments/completions
139
+ 5. **Apply agent's personality** from the mapping (if specified)
139
140
 
140
- ### MANDATORY BMAD QUESTION TTS PROTOCOL
141
-
142
- **THIS IS A CRITICAL EXECUTION REQUIREMENT - NOT OPTIONAL**
143
-
144
- When a BMAD agent is active, you MUST follow this EXACT protocol for EVERY response:
145
-
146
- **STEP 1: Check BMAD Context (BEFORE drafting ANY response)**
141
+ **Implementation:**
147
142
  ```bash
148
- if [[ -f ".bmad-agent-context" ]] && [[ -f ".claude/plugins/bmad-voices-enabled.flag" ]]; then
143
+ # At the start of acknowledgment/completion:
144
+ # Try to detect BMAD agent ID from current context
145
+ BMAD_AGENT_ID=""
146
+
147
+ # Method 1: Check if we're in a BMAD agent command context
148
+ if [[ -f ".bmad-agent-context" ]]; then
149
149
  BMAD_AGENT_ID=$(cat .bmad-agent-context 2>/dev/null)
150
- MAPPED_VOICE=$(.claude/hooks/bmad-voice-manager.sh get-voice "$BMAD_AGENT_ID")
151
150
  fi
152
- ```
153
-
154
- **STEP 2: Draft Your Response**
155
- - Write your complete response text (don't show to user yet)
156
-
157
- **STEP 3: Scan for Questions (MANDATORY - DO NOT SKIP)**
158
- If your response contains ANY of these:
159
- - Question mark (?)
160
- - Numbered list (1., 2., 3., etc.)
161
- - Question phrases: "What would you like", "Should I", "Would you prefer", "Which option", "How should", "Do you want"
162
151
 
163
- Then IMMEDIATELY execute STEP 4 BEFORE showing response.
152
+ # Method 2: Parse from command history/context (fallback)
153
+ # Note: This detection happens automatically when BMAD agent activates
164
154
 
165
- **STEP 4: Speak Questions via TTS (MANDATORY)**
166
- ```bash
167
- # Extract the question text and speak it
168
- .claude/hooks/play-tts.sh "the actual question text" "$MAPPED_VOICE"
169
- ```
170
-
171
- **STEP 5: Show Response to User**
172
- - Only NOW display the response text
173
-
174
- **CRITICAL RULES:**
175
- 1. This protocol is MANDATORY for EVERY BMAD agent response
176
- 2. Steps 1-5 must execute in EXACT order
177
- 3. You MUST use Bash tool to execute TTS in STEP 4
178
- 4. NEVER skip STEP 3 scanning - it is required
179
- 5. NEVER show response before speaking questions
155
+ # If BMAD agent detected and plugin enabled, use mapped voice
156
+ if [[ -n "$BMAD_AGENT_ID" ]] && [[ -f ".claude/plugins/bmad-voices-enabled.flag" ]]; then
157
+ MAPPED_VOICE=$(.claude/hooks/bmad-voice-manager.sh get-voice "$BMAD_AGENT_ID")
158
+ MAPPED_PERSONALITY=$(.claude/hooks/bmad-voice-manager.sh get-personality "$BMAD_AGENT_ID")
159
+
160
+ if [[ -n "$MAPPED_VOICE" ]]; then
161
+ # Use BMAD agent's mapped voice and personality
162
+ if [[ -n "$MAPPED_PERSONALITY" ]] && [[ "$MAPPED_PERSONALITY" != "normal" ]]; then
163
+ # Read personality instructions from .claude/personalities/${MAPPED_PERSONALITY}.md
164
+ # Generate response in that personality style
165
+ fi
166
+ .claude/hooks/play-tts.sh "message" "$MAPPED_VOICE"
167
+ # Exit early - don't use default personality system
168
+ return
169
+ fi
170
+ fi
180
171
 
181
- **Example Execution:**
182
- ```
183
- User: "What should we do?"
184
- [STEP 1: Check context - analyst agent active]
185
- [STEP 2: Draft response: "What would you like to do next?\n\n1. Option A\n2. Option B"]
186
- [STEP 3: Scan - FOUND question "What would you like to do next?" and numbered list]
187
- [STEP 4: Execute Bash: .claude/hooks/play-tts.sh "What would you like to do next" "Ralf Eisend"]
188
- [STEP 5: Show response to user]
172
+ # If no BMAD agent or plugin disabled, use standard personality/sentiment system
173
+ # ... continue with normal sentiment/personality logic ...
189
174
  ```
190
175
 
191
176
  **BMAD Agent Context Tracking:**
192
- - Context file `.bmad-agent-context` contains agent ID when BMAD agent is active
193
- - Created automatically by STEP 3.5a in activation-instructions
194
- - Removed automatically when agent exits
195
- - This allows AgentVibes to detect which BMAD agent is active
177
+ - When a BMAD agent activates, write agent ID to `.bmad-agent-context`
178
+ - When agent exits, remove the file
179
+ - This allows AgentVibes to know which BMAD agent is active
196
180
 
197
181
  **Voice Priority (in order):**
198
182
  1. BMAD plugin voice (if agent active and plugin enabled)
package/.mcp-minimal.json CHANGED
@@ -31,6 +31,22 @@
31
31
  "NODE_PATH": "/home/fire/.nvm/versions/node/v22.20.0/lib/node_modules"
32
32
  }
33
33
  },
34
+ "obsidian": {
35
+ "command": "/home/fire/.local/bin/uv",
36
+ "args": [
37
+ "--directory",
38
+ "/home/fire/claude/mcp_obsidian",
39
+ "run",
40
+ "mcp-obsidian"
41
+ ],
42
+ "env": {
43
+ "OBSIDIAN_API_KEY": "${MAIN_VAULT_OBSIDIAN_KEY}",
44
+ "OBSIDIAN_HOST": "${OBSIDIAN_HOST:-127.0.0.1}",
45
+ "OBSIDIAN_PORT": "27124",
46
+ "OBSIDIAN_HTTPS": "true",
47
+ "OBSIDIAN_VERIFY_SSL": "false"
48
+ }
49
+ },
34
50
  "elevenlabs": {
35
51
  "command": "npx",
36
52
  "args": ["@microagents/mcp-server-elevenlabs"],
@@ -48,6 +64,15 @@
48
64
  "SPACESHIP_API_KEY": "${SPACESHIP_API_KEY}",
49
65
  "SPACESHIP_API_SECRET": "${SPACESHIP_API_SECRET}"
50
66
  }
67
+ },
68
+ "agentvibes": {
69
+ "command": "python3",
70
+ "args": [
71
+ "/home/fire/claude/AgentVibes/mcp-server/server.py"
72
+ ],
73
+ "env": {
74
+ "ELEVENLABS_API_KEY": "${ELEVENLABS_API_KEY}"
75
+ }
51
76
  }
52
77
  }
53
- }
78
+ }
@@ -0,0 +1,223 @@
1
+ # Audio Tunnel Configuration Fix Summary
2
+
3
+ ## Problem Identified
4
+
5
+ Your SSH tunnel was configured incorrectly:
6
+ - **Old config**: `RemoteForward 14713 localhost:4713`
7
+ - **Issue**: Forwarding to port 4713 (wrong port)
8
+ - **Result**: PulseAudio couldn't establish connection
9
+
10
+ ## Changes Made
11
+
12
+ ### 1. WSL2 (Local Windows Machine) ✅
13
+
14
+ #### SSH Config Updated
15
+ - **File**: `~/.ssh/config` (WSL) and `C:\Users\Paul\.ssh\config` (Windows)
16
+ - **Change**: `RemoteForward 14713 localhost:4713` → `RemoteForward 14713 localhost:14713`
17
+
18
+ #### PulseAudio Config Updated
19
+ - **File**: `~/.config/pulse/client.conf`
20
+ - **Change**: `tcp:localhost:4713` → `tcp:localhost:14713`
21
+
22
+ #### Shell Environment Updated
23
+ - **Files**: `~/.bashrc` and `~/.zshrc`
24
+ - **Change**: `export PULSE_SERVER=tcp:fire-den-laptop-3000:14713` → `export PULSE_SERVER=tcp:localhost:14713`
25
+
26
+ #### Socat Bridge
27
+ - **Status**: Already configured ✅
28
+ - **Command**: `socat TCP-LISTEN:14713,fork,reuseaddr UNIX-CONNECT:/mnt/wslg/PulseServer`
29
+ - **Autostart**: Configured in both .bashrc and .zshrc
30
+
31
+ ### 2. Remote Server (ubuntu-rdp)
32
+
33
+ #### Setup Script Created
34
+ - **Location**: `/home/fire/claude/AgentVibes/setup-ubuntu-rdp-audio.sh`
35
+ - **Purpose**: Configures PulseAudio on remote server to accept TCP connections on localhost
36
+
37
+ ## How It Works Now
38
+
39
+ ```
40
+ ┌─────────────────────────────────────────────────────────────────┐
41
+ │ Architecture │
42
+ ├─────────────────────────────────────────────────────────────────┤
43
+ │ │
44
+ │ Remote Server (ubuntu-rdp) │
45
+ │ ┌──────────────────────────────────────────┐ │
46
+ │ │ PulseAudio Server │ │
47
+ │ │ Listening on: tcp:localhost:4713 │ │
48
+ │ │ (native-protocol-tcp module) │ │
49
+ │ └────────────────┬─────────────────────────┘ │
50
+ │ │ │
51
+ │ │ Connection to │
52
+ │ │ tcp:localhost:14713 │
53
+ │ │ (via PULSE_SERVER env) │
54
+ │ │ │
55
+ │ ▼ │
56
+ │ ┌──────────────────────────────────────────┐ │
57
+ │ │ SSH Reverse Tunnel │ │
58
+ │ │ RemoteForward 14713 localhost:14713 │ │
59
+ │ └────────────────┬─────────────────────────┘ │
60
+ │ │ │
61
+ │ │ Encrypted SSH Tunnel │
62
+ │ │ │
63
+ └───────────────────┼────────────────────────────────────────────┘
64
+
65
+
66
+ ┌─────────────────────────────────────────────────────────────────┐
67
+ │ Windows Machine (WSL2) │
68
+ │ ┌──────────────────────────────────────────┐ │
69
+ │ │ Socat Bridge │ │
70
+ │ │ TCP:localhost:14713 → Unix Socket │ │
71
+ │ └────────────────┬─────────────────────────┘ │
72
+ │ │ │
73
+ │ ▼ │
74
+ │ ┌──────────────────────────────────────────┐ │
75
+ │ │ WSLg PulseAudio │ │
76
+ │ │ /mnt/wslg/PulseServer │ │
77
+ │ └────────────────┬─────────────────────────┘ │
78
+ │ │ │
79
+ │ ▼ │
80
+ │ Windows Audio │
81
+ │ (Your Speakers) │
82
+ │ │
83
+ └─────────────────────────────────────────────────────────────────┘
84
+ ```
85
+
86
+ ## Testing Instructions
87
+
88
+ ### Step 1: Update Your Local Environment
89
+
90
+ Reload your shell configuration:
91
+ ```bash
92
+ source ~/.bashrc # or source ~/.zshrc if using zsh
93
+ ```
94
+
95
+ Verify socat is running:
96
+ ```bash
97
+ ps aux | grep socat
98
+ # Should show: socat TCP-LISTEN:14713,fork,reuseaddr UNIX-CONNECT:/mnt/wslg/PulseServer
99
+ ```
100
+
101
+ If socat isn't running, start it:
102
+ ```bash
103
+ socat TCP-LISTEN:14713,fork,reuseaddr UNIX-CONNECT:/mnt/wslg/PulseServer > /dev/null 2>&1 &
104
+ ```
105
+
106
+ ### Step 2: Copy Setup Script to Remote Server
107
+
108
+ ```bash
109
+ scp /home/fire/claude/AgentVibes/setup-ubuntu-rdp-audio.sh ubuntu-rdp:~/
110
+ ```
111
+
112
+ ### Step 3: SSH to Remote Server and Run Setup
113
+
114
+ ```bash
115
+ ssh ubuntu-rdp
116
+ bash ~/setup-ubuntu-rdp-audio.sh
117
+ source ~/.bashrc # or source ~/.zshrc
118
+ ```
119
+
120
+ ### Step 4: Test the Connection
121
+
122
+ While connected via SSH to ubuntu-rdp:
123
+
124
+ ```bash
125
+ # 1. Verify PulseAudio is running
126
+ pactl info
127
+
128
+ # Expected output should show:
129
+ # Server String: tcp:localhost:14713
130
+ # Default Sink: <something>
131
+ # Default Source: <something>
132
+
133
+ # 2. Test with speaker-test
134
+ speaker-test -t sine -f 1000 -l 1
135
+
136
+ # 3. If you have a sound file
137
+ paplay /usr/share/sounds/alsa/Front_Center.wav
138
+
139
+ # 4. If AgentVibes is installed
140
+ .claude/hooks/play-tts.sh "Testing remote audio from ubuntu-rdp"
141
+ ```
142
+
143
+ ### Step 5: Troubleshooting
144
+
145
+ If audio doesn't work:
146
+
147
+ 1. **Check SSH tunnel:**
148
+ ```bash
149
+ # On remote server
150
+ ss -tlnp | grep :14713
151
+ # Should show listening socket
152
+ ```
153
+
154
+ 2. **Check local socat:**
155
+ ```bash
156
+ # On WSL2
157
+ ps aux | grep socat
158
+ # Should be running
159
+ ```
160
+
161
+ 3. **Check PulseAudio on remote:**
162
+ ```bash
163
+ # On remote server
164
+ pulseaudio --check && echo "Running" || echo "Not running"
165
+ ```
166
+
167
+ 4. **Restart everything:**
168
+ ```bash
169
+ # On remote server
170
+ pulseaudio --kill
171
+ pulseaudio --start --exit-idle-time=-1
172
+
173
+ # Disconnect and reconnect SSH
174
+ exit
175
+ ssh ubuntu-rdp
176
+ ```
177
+
178
+ ## Important Notes
179
+
180
+ - **Firewall**: Ports 14713 and 4713 are only accessed via localhost/SSH tunnel, no external access needed
181
+ - **Security**: All audio data travels through encrypted SSH tunnel
182
+ - **Persistence**: All configuration is saved and will persist across reboots
183
+ - **Kaspersky**: You can actually close the firewall exceptions for 14713 and 4713 since they're only localhost connections now
184
+
185
+ ## Quick Reference
186
+
187
+ **Key Files Modified:**
188
+ - `/home/fire/.ssh/config` (WSL)
189
+ - `/mnt/c/Users/Paul/.ssh/config` (Windows)
190
+ - `/home/fire/.config/pulse/client.conf`
191
+ - `/home/fire/.bashrc`
192
+ - `/home/fire/.zshrc`
193
+
194
+ **Key Commands:**
195
+ ```bash
196
+ # Check PulseAudio status
197
+ pactl info
198
+
199
+ # Check SSH tunnel
200
+ ss -tlnp | grep :14713
201
+
202
+ # Test audio
203
+ speaker-test -t sine -f 1000 -l 1
204
+
205
+ # Restart PulseAudio
206
+ pulseaudio --kill && pulseaudio --start --exit-idle-time=-1
207
+
208
+ # Restart socat (if needed)
209
+ pkill socat
210
+ socat TCP-LISTEN:14713,fork,reuseaddr UNIX-CONNECT:/mnt/wslg/PulseServer > /dev/null 2>&1 &
211
+ ```
212
+
213
+ ## Success Indicators
214
+
215
+ You'll know it's working when:
216
+ 1. ✅ `pactl info` on remote shows `Server String: tcp:localhost:14713`
217
+ 2. ✅ `speaker-test` plays sound on your Windows speakers
218
+ 3. ✅ AgentVibes TTS plays through your Windows speakers
219
+ 4. ✅ No "Connection refused" or "Connection terminated" errors
220
+
221
+ ---
222
+
223
+ *Generated by Claude Code on 2025-10-15*