agentvibes 2.0.16 → 2.0.17-beta.1

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 (90) hide show
  1. package/.claude/commands/agent-vibes/add.md +0 -0
  2. package/.claude/commands/agent-vibes/agent-vibes.md +0 -0
  3. package/.claude/commands/agent-vibes/bmad.md +0 -0
  4. package/.claude/commands/agent-vibes/commands.json +0 -0
  5. package/.claude/commands/agent-vibes/get.md +0 -0
  6. package/.claude/commands/agent-vibes/list.md +0 -0
  7. package/.claude/commands/agent-vibes/personality.md +0 -0
  8. package/.claude/commands/agent-vibes/preview.md +0 -0
  9. package/.claude/commands/agent-vibes/replay.md +0 -0
  10. package/.claude/commands/agent-vibes/sample.md +0 -0
  11. package/.claude/commands/agent-vibes/sentiment.md +0 -0
  12. package/.claude/commands/agent-vibes/set-language.md +0 -0
  13. package/.claude/commands/agent-vibes/set-pretext.md +0 -0
  14. package/.claude/commands/agent-vibes/switch.md +0 -0
  15. package/.claude/commands/agent-vibes/update.md +0 -0
  16. package/.claude/commands/agent-vibes/version.md +0 -0
  17. package/.claude/commands/agent-vibes/whoami.md +0 -0
  18. package/.claude/github-star-reminder.txt +1 -1
  19. package/.claude/hooks/language-manager.sh +22 -8
  20. package/.claude/hooks/personality-manager.sh +22 -9
  21. package/.claude/hooks/play-tts-elevenlabs.sh +3 -2
  22. package/.claude/hooks/voice-manager.sh +102 -23
  23. package/.claude/language-voices.yaml +0 -0
  24. package/.claude/output-styles/agent-vibes.md +36 -52
  25. package/.claude/personalities/angry.md +0 -0
  26. package/.claude/personalities/annoying.md +0 -0
  27. package/.claude/personalities/crass.md +0 -0
  28. package/.claude/personalities/dramatic.md +0 -0
  29. package/.claude/personalities/dry-humor.md +0 -0
  30. package/.claude/personalities/flirty.md +0 -0
  31. package/.claude/personalities/funny.md +0 -0
  32. package/.claude/personalities/grandpa.md +0 -0
  33. package/.claude/personalities/millennial.md +0 -0
  34. package/.claude/personalities/moody.md +0 -0
  35. package/.claude/personalities/normal.md +0 -0
  36. package/.claude/personalities/pirate.md +0 -0
  37. package/.claude/personalities/poetic.md +0 -0
  38. package/.claude/personalities/professional.md +0 -0
  39. package/.claude/personalities/robot.md +0 -0
  40. package/.claude/personalities/sarcastic.md +0 -0
  41. package/.claude/personalities/sassy.md +0 -0
  42. package/.claude/personalities/surfer-dude.md +0 -0
  43. package/.claude/personalities/zen.md +0 -0
  44. package/.claude/piper-voices/en_US-lessac-medium.onnx +0 -0
  45. package/.claude/piper-voices/en_US-lessac-medium.onnx.json +0 -0
  46. package/.claude/piper-voices-dir.txt +0 -0
  47. package/.claude/plugins/bmad-voices-enabled.flag +0 -0
  48. package/.claude/plugins/bmad-voices.md +0 -0
  49. package/.mcp-minimal.json +26 -1
  50. package/AUDIO_TUNNEL_FIX_SUMMARY.md +223 -0
  51. package/INSTALL_MCP_WINDOWS.md +75 -0
  52. package/LICENSE +0 -0
  53. package/NPM_PUBLISH_GUIDE.md +0 -0
  54. package/README.md +439 -307
  55. package/RELEASE_NOTES.md +0 -0
  56. package/RELEASE_NOTES_V2.md +0 -0
  57. package/bin/mcp-server +206 -0
  58. package/docs/ai-optimized-documentation-standards.md +0 -0
  59. package/docs/architecture/provider-system.md +0 -0
  60. package/docs/remote-audio-setup.md +83 -2
  61. package/docs/voice-mapping-format.md +0 -0
  62. package/mcp-server/QUICK_START.md +205 -0
  63. package/mcp-server/README.md +347 -0
  64. package/mcp-server/WINDOWS_SETUP.md +277 -0
  65. package/mcp-server/examples/claude_desktop_config.json +11 -0
  66. package/mcp-server/examples/claude_desktop_config_piper.json +9 -0
  67. package/mcp-server/examples/custom_instructions.md +169 -0
  68. package/mcp-server/install-deps.js +95 -0
  69. package/mcp-server/pyproject.toml +52 -0
  70. package/mcp-server/requirements.txt +2 -0
  71. package/mcp-server/server.py +551 -0
  72. package/mcp-server/test_server.py +116 -0
  73. package/package.json +9 -3
  74. package/scripts/README.md +0 -0
  75. package/scripts/check-audio-tunnel.sh +59 -0
  76. package/scripts/check_audio_tunnel.sh +21 -0
  77. package/scripts/fix-audio-tunnel.sh +83 -0
  78. package/scripts/piper-voice/README.md +0 -0
  79. package/scripts/setup-windows-audio.ps1 +0 -0
  80. package/setup-ubuntu-rdp-audio.sh +139 -0
  81. package/src/commands/install-mcp.js +384 -0
  82. package/src/installer.js +52 -0
  83. package/templates/activation-instructions-bmad.md +0 -0
  84. package/templates/output-styles/agent-vibes.md +0 -0
  85. package/test/README.md +0 -0
  86. package/test/helpers/test-helper.bash +0 -0
  87. package/test/test-framework.md +0 -0
  88. package/test/unit/personality-manager.bats +0 -0
  89. package/test/unit/play-tts.bats +0 -0
  90. package/test/unit/voice-manager.bats +0 -0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -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"
@@ -197,9 +197,10 @@ if [ -f "${TEMP_FILE}" ]; then
197
197
  if command -v ffmpeg &> /dev/null; then
198
198
  PADDED_FILE="$AUDIO_DIR/tts-padded-$(date +%s).mp3"
199
199
  # Add 200ms of silence at the beginning to prevent static
200
- ffmpeg -f lavfi -i anullsrc=r=44100:cl=stereo:d=0.2 -i "${TEMP_FILE}" \
200
+ # Note: ElevenLabs returns mono audio, so we use mono silence
201
+ ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono:d=0.2 -i "${TEMP_FILE}" \
201
202
  -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[out]" \
202
- -map "[out]" -y "${PADDED_FILE}" 2>/dev/null
203
+ -map "[out]" -c:a libmp3lame -y "${PADDED_FILE}" 2>/dev/null
203
204
 
204
205
  if [ -f "${PADDED_FILE}" ]; then
205
206
  # Use padded file and clean up original
@@ -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)
File without changes
@@ -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)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
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
+ }