agentvibes 5.7.6 → 5.7.7

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.
@@ -1 +1 @@
1
- 20260516
1
+ 20260517
@@ -19,10 +19,17 @@ set -euo pipefail
19
19
 
20
20
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
21
  LOCK_FILE="/tmp/agentvibes-party-queue.lock"
22
+ DEBUG_LOG="/tmp/agentvibes-party-debug.log"
23
+
24
+ _dbg() { printf '[%s] %s\n' "$(date -Iseconds)" "$*" >> "$DEBUG_LOG" 2>/dev/null || true; }
22
25
 
23
26
  # --- Read stdin ---
24
27
  raw="$(cat)"
25
- [[ -z "$raw" ]] && exit 0
28
+ if [[ -z "$raw" ]]; then
29
+ _dbg "exit: empty stdin"
30
+ exit 0
31
+ fi
32
+ _dbg "fired (stdin ${#raw} bytes)"
26
33
 
27
34
  # --- Parse all needed fields in one python3 call (fixes M5: 3x subprocess, echo safety) ---
28
35
  # Outputs: TOOL_NAME|DISPLAY_NAME|RESPONSE_TEXT (newlines in response encoded as \n literals)
@@ -73,13 +80,26 @@ response_text="${rest#*|}"
73
80
  response_text="${response_text//\\n/ }"
74
81
 
75
82
  # --- Only handle Agent tool ---
76
- [[ "$tool_name" != "Agent" ]] && exit 0
83
+ if [[ "$tool_name" != "Agent" ]]; then
84
+ _dbg "skip: tool_name='$tool_name' (not Agent)"
85
+ exit 0
86
+ fi
77
87
 
78
88
  # --- Fingerprint: only fire for BMAD party mode agents (safe string match, no pipe) ---
79
- [[ "$raw" == *"BMAD agent in a collaborative roundtable"* ]] || exit 0
89
+ if [[ "$raw" != *"BMAD agent in a collaborative roundtable"* ]]; then
90
+ _dbg "skip: fingerprint MISS (Agent call but prompt lacks 'BMAD agent in a collaborative roundtable')"
91
+ exit 0
92
+ fi
93
+ _dbg "fingerprint HIT: display='$display_name' text_len=${#response_text}"
80
94
 
81
- [[ -z "$display_name" ]] && exit 0
82
- [[ -z "$response_text" ]] && exit 0
95
+ if [[ -z "$display_name" ]]; then
96
+ _dbg "skip: empty display_name"
97
+ exit 0
98
+ fi
99
+ if [[ -z "$response_text" ]]; then
100
+ _dbg "skip: empty response_text"
101
+ exit 0
102
+ fi
83
103
 
84
104
  # --- Resolve project root ---
85
105
  project_root="${CLAUDE_PROJECT_DIR:-}"
@@ -154,7 +174,8 @@ esac
154
174
  exec 9>"$LOCK_FILE"
155
175
  if command -v flock &>/dev/null; then
156
176
  flock -w 60 9
157
- "$bmad_speak" "$agent_id" "$response_text" || true
177
+ _dbg "invoking: $bmad_speak '$agent_id' (text_len=${#response_text})"
178
+ "$bmad_speak" "$agent_id" "$response_text" || _dbg "bmad-speak returned non-zero"
158
179
  flock -u 9
159
180
  else
160
181
  # macOS fallback: atomic mkdir polling lock
@@ -336,15 +336,18 @@ SSH_ARGS=()
336
336
  [[ -n "$SSH_KEY" && -f "$SSH_KEY" ]] && SSH_ARGS+=(-i "$SSH_KEY")
337
337
  [[ -n "$SSH_PORT" ]] && SSH_ARGS+=(-p "$SSH_PORT")
338
338
 
339
- # ForceCommand receiver: SSH_ORIGINAL_COMMAND passes the payload directly
340
- ssh "${SSH_ARGS[@]}" "$SSH_HOST" "$ENCODED_PAYLOAD" &
341
- SSH_PID=$!
342
-
343
- # Log SSH failures asynchronously so the hook doesn't block
344
- ( wait "$SSH_PID"; _exit=$?; if [[ $_exit -ne 0 ]]; then
339
+ # ForceCommand receiver: SSH_ORIGINAL_COMMAND passes the payload directly.
340
+ # Run ssh inside the backgrounded subshell so its exit code is reachable via $?
341
+ # (a `wait` from outside the spawning shell would error: "pid X is not a child").
342
+ (
343
+ ssh "${SSH_ARGS[@]}" "$SSH_HOST" "$ENCODED_PAYLOAD"
344
+ _exit=$?
345
+ if [[ $_exit -ne 0 ]]; then
345
346
  echo "$(date -Iseconds) [ERROR] SSH to $SSH_HOST failed (exit $_exit)" \
346
347
  >> "$HOME/.agentvibes/ssh-remote.log" 2>/dev/null || true
347
- fi ) &
348
+ fi
349
+ ) &
350
+ SSH_PID=$!
348
351
 
349
352
  echo "Sent to $SSH_HOST (PID: $SSH_PID)" >&2
350
353
  exit 0
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![Publish](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
12
12
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
13
 
14
- **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.7.6
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.7.7
15
15
 
16
16
  ---
17
17
 
@@ -40,7 +40,17 @@ Whether you're coding in Claude Code, chatting in Claude Desktop, using Warp Ter
40
40
 
41
41
  ---
42
42
 
43
- ## 🌟 NEW IN v5.7.6SSH Remote Payload Integrity + Receiver Rewrite
43
+ ## 🌟 NEW IN v5.7.7Party Mode Voice Restore + Polish
44
+
45
+ **Party mode agents now speak again:** BMAD `/party-mode` now reliably invokes the correct AgentVibes skill, and each agent's response is spoken aloud in their unique voice with per-agent music, pretext, and reverb — loaded automatically from `~/.agentvibes/bmad-voice-map.json`.
46
+
47
+ **New bundled track:** 🌌 CelestialVelvet added to the built-in music catalog.
48
+
49
+ **TUI contrast fix:** Selected rows in Voices and Agents tabs no longer render unreadable gray text.
50
+
51
+ **SSH remote:** Fixed "wait: pid is not a child of this shell" error in `play-tts-ssh-remote.sh`.
52
+
53
+ ## v5.7.6 — SSH Remote Payload Integrity + Receiver Rewrite
44
54
 
45
55
  **SSH remote music/voice fix:** The correct project music track and voice now reach the remote receiver — previously the global config was used instead of the active project's settings.
46
56
 
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # AgentVibes Release Notes
2
2
 
3
+ ## 🎭 v5.7.7 — Party Mode Voice Restore + Polish
4
+
5
+ **Released:** 2026-05-17
6
+
7
+ ### 🐛 BMAD Party Mode Agents Silent (No Per-Agent TTS)
8
+
9
+ Party mode agents were displaying responses in text but not speaking with their unique voices. Two root causes:
10
+
11
+ **Skill disambiguation:** `/party-mode` was matching the upstream BMAD `_bmad/core/workflows/party-mode` command (which tries to load a path that doesn't exist in this project) instead of the AgentVibes skill. A project-local `/party-mode` command override now routes to the correct skill.
12
+
13
+ **Mandatory TTS step:** The orchestrator's `bmad-speak.js` call step was underspecified, so it was sometimes skipped. Step 4 in the BMAD party mode skill is now clearly marked MANDATORY, with explicit documentation of what `bmad-speak.js` applies per agent: voice, pretext, reverb, personality, and background music — all loaded automatically from `~/.agentvibes/bmad-voice-map.json`.
14
+
15
+ ### 🔍 Party Mode Debug Logging
16
+
17
+ `bmad-party-speak.sh` (PostToolUse hook) now writes structured diagnostic entries to `/tmp/agentvibes-party-debug.log` — `fired`, `fingerprint HIT/MISS`, `invoking`, and errors — so voice issues are diagnosable without guessing.
18
+
19
+ ### 🎵 New Bundled Track: CelestialVelvet
20
+
21
+ A new ambient music track **CelestialVelvet** (🌌) has been added to the built-in catalog. Available immediately in the TUI music picker and BMAD voice map — no download required.
22
+
23
+ ### 🐛 TUI: Gray Text on Selected Rows Fixed
24
+
25
+ White text now renders correctly on selected rows in the Voices and Agents tabs. Previously `bright-black` foreground combined with green background produced unreadable gray text in many terminals.
26
+
27
+ ### 🐛 SSH Remote: "wait: pid is not a child of this shell" Error
28
+
29
+ `play-tts-ssh-remote.sh` would emit `wait: pid X is not a child of this shell` on certain shells. Fixed by spawning `ssh` directly inside the background subshell so `$?` captures the exit code without a cross-shell `wait` call.
30
+
31
+ ---
32
+
3
33
  ## 🔧 v5.7.6 — SSH Remote Payload Integrity + Receiver Rewrite
4
34
 
5
35
  **Released:** 2026-05-16
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": "5.7.6",
4
+ "version": "5.7.7",
5
5
  "description": "Now your AI Agents can finally talk back! Professional TTS voice for Claude Code, Claude Desktop (via MCP), and Clawdbot with multi-provider support.",
6
6
  "homepage": "https://agentvibes.org",
7
7
  "keywords": [
@@ -153,7 +153,7 @@ const COL_MUSIC = 11;
153
153
  const COL_VOL = 5; // e.g. "70%" or "100%"
154
154
 
155
155
  // Inline hint appended to the selected row when list is focused
156
- const _ROW_HINT_BMAD = ` {bright-black-fg}[Space] Preview [Enter] Configure{/bright-black-fg}`;
156
+ const _ROW_HINT_BMAD = ` {white-fg}[Space] Preview [Enter] Configure{/white-fg}`;
157
157
 
158
158
  // ---------------------------------------------------------------------------
159
159
 
@@ -64,6 +64,7 @@ const TRACK_DISPLAY = Object.freeze({
64
64
  'agent_vibes_arabic_v2_loop.mp3': '🎵 Arabic Oud',
65
65
  'agent_vibes_bachata_v1_loop.mp3': '🎺 Bachata',
66
66
  'agent_vibes_bossa_nova_v2_loop.mp3': '🌸 Bossa Nova',
67
+ 'CelestialVelvet.mp3': '🌌 Celestial Velvet',
67
68
  'agent_vibes_celtic_harp_v1_loop.mp3': '🎶 Celtic Harp',
68
69
  'agent_vibes_chillwave_v2_loop.mp3': '🌊 Chillwave',
69
70
  'agent_vibes_cumbia_v1_loop.mp3': '🎸 Cumbia',
@@ -85,6 +86,7 @@ const BUILT_IN_TRACK_CATALOG = Object.freeze([
85
86
  { id: 'agent_vibes_arabic_v2_loop.mp3', label: '🎵 Arabic Oud' },
86
87
  { id: 'agent_vibes_bachata_v1_loop.mp3', label: '🎺 Bachata' },
87
88
  { id: 'agent_vibes_bossa_nova_v2_loop.mp3', label: '🌸 Bossa Nova' },
89
+ { id: 'CelestialVelvet.mp3', label: '🌌 Celestial Velvet' },
88
90
  { id: 'agent_vibes_celtic_harp_v1_loop.mp3', label: '🎶 Celtic Harp' },
89
91
  { id: 'agent_vibes_chillwave_v2_loop.mp3', label: '🌊 Chillwave' },
90
92
  { id: 'agent_vibes_cumbia_v1_loop.mp3', label: '🎸 Cumbia' },
@@ -770,7 +770,7 @@ export function createVoicesTab(screen, services) {
770
770
  // Inline selection hint appended to the currently highlighted voice row.
771
771
  // _hintBase stores the item's clean content (no hint, no █) — no sentinel needed.
772
772
  // Use getter functions so hints re-translate when language changes.
773
- const _rowHintInstalled = () => ` {bright-black-fg}${_tl('voicesRowHintInstalled')}{/bright-black-fg}`;
773
+ const _rowHintInstalled = () => ` {white-fg}${_tl('voicesRowHintInstalled')}{/white-fg}`;
774
774
  const _rowHintUninstalled = () => ` {bright-yellow-fg}${_tl('voicesRowHintUninstalled')}{/bright-yellow-fg}`;
775
775
  let _hintIdx = -1;
776
776
  let _hintBase = ''; // content of items[_hintIdx] before hint was appended