agentvibes 5.6.8 → 5.6.9

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 (132) hide show
  1. package/.agentvibes/LITE-MODE.md +236 -0
  2. package/.agentvibes/README.md +136 -0
  3. package/.agentvibes/backup/session-start-tts.sh.20251210_212814 +141 -0
  4. package/.agentvibes/backups/agents/analyst_20260204_144958.md +78 -0
  5. package/.agentvibes/backups/agents/architect_20260204_144958.md +72 -0
  6. package/.agentvibes/backups/agents/dev_20260204_144958.md +74 -0
  7. package/.agentvibes/backups/agents/pm_20260204_144958.md +72 -0
  8. package/.agentvibes/backups/agents/quick-flow-solo-dev_20260204_144958.md +64 -0
  9. package/.agentvibes/backups/agents/sm_20260204_144958.md +87 -0
  10. package/.agentvibes/backups/agents/tea_20260204_144958.md +79 -0
  11. package/.agentvibes/backups/agents/tech-writer_20260204_144958.md +82 -0
  12. package/.agentvibes/backups/agents/ux-designer_20260204_144958.md +80 -0
  13. package/.agentvibes/config/README-personality-defaults.md +162 -0
  14. package/.agentvibes/config/agentvibes.json +1 -0
  15. package/.agentvibes/config/mode.txt +1 -0
  16. package/.agentvibes/config/personality-voice-defaults.default.json +21 -0
  17. package/.agentvibes/config/save-audio.txt +1 -0
  18. package/.agentvibes/config/voice-metadata.json +160 -0
  19. package/.agentvibes/config.json +38 -1
  20. package/.agentvibes/hooks/help.sh +191 -0
  21. package/.agentvibes/hooks/post-tool-use-lite.sh +111 -0
  22. package/.agentvibes/hooks/save-audio-manager.sh +162 -0
  23. package/.agentvibes/hooks/session-start-full-optimized.sh +102 -0
  24. package/.agentvibes/hooks/session-start-full.sh +142 -0
  25. package/.agentvibes/hooks/session-start-lite-v2.sh +34 -0
  26. package/.agentvibes/hooks/session-start-lite.sh +29 -0
  27. package/.agentvibes/hooks/stop-lite.sh +115 -0
  28. package/.agentvibes/hooks/switch-mode.sh +215 -0
  29. package/.agentvibes/output-styles/audio-summary.md +30 -0
  30. package/.claude/audio/voice-samples/piper/alan.wav +0 -0
  31. package/.claude/audio/voice-samples/piper/amy.wav +0 -0
  32. package/.claude/audio/voice-samples/piper/charlotte.wav +0 -0
  33. package/.claude/audio/voice-samples/piper/joe.wav +0 -0
  34. package/.claude/audio/voice-samples/piper/john.wav +0 -0
  35. package/.claude/audio/voice-samples/piper/katherine.wav +0 -0
  36. package/.claude/audio/voice-samples/piper/kristin.wav +0 -0
  37. package/.claude/audio/voice-samples/piper/linda.wav +0 -0
  38. package/.claude/audio/voice-samples/piper/marcus.wav +0 -0
  39. package/.claude/audio/voice-samples/piper/ryan.wav +0 -0
  40. package/.claude/commands/agent-vibes/provider.md +0 -0
  41. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  42. package/.claude/commands/agent-vibes-rdp.md +24 -24
  43. package/.claude/config/audio-effects.cfg +1 -1
  44. package/.claude/config/background-music-position.txt +8 -7
  45. package/.claude/config/reverb-level.txt +0 -0
  46. package/.claude/docs/TERMUX_SETUP.md +408 -408
  47. package/.claude/hooks/audio-cache-utils.sh +0 -0
  48. package/.claude/hooks/audio-processor.sh +0 -0
  49. package/.claude/hooks/background-music-manager.sh +0 -0
  50. package/.claude/hooks/bmad-party-manager.sh +225 -0
  51. package/.claude/hooks/bmad-party-speak.sh +0 -0
  52. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  53. package/.claude/hooks/bmad-speak.sh +0 -0
  54. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  55. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  56. package/.claude/hooks/clawdbot-receiver-SECURE.sh +0 -0
  57. package/.claude/hooks/clawdbot-receiver.sh +0 -0
  58. package/.claude/hooks/clean-audio-cache.sh +0 -0
  59. package/.claude/hooks/cleanup-cache.sh +0 -0
  60. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  61. package/.claude/hooks/download-extra-voices.sh +0 -0
  62. package/.claude/hooks/effects-manager.sh +0 -0
  63. package/.claude/hooks/github-star-reminder.sh +0 -0
  64. package/.claude/hooks/language-manager.sh +0 -0
  65. package/.claude/hooks/learn-manager.sh +0 -0
  66. package/.claude/hooks/macos-voice-manager.sh +0 -0
  67. package/.claude/hooks/migrate-background-music.sh +0 -0
  68. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  69. package/.claude/hooks/optimize-background-music.sh +0 -0
  70. package/.claude/hooks/path-resolver.sh +0 -0
  71. package/.claude/hooks/personality-manager.sh +0 -0
  72. package/.claude/hooks/piper-download-voices.sh +0 -0
  73. package/.claude/hooks/piper-installer.sh +0 -0
  74. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  75. package/.claude/hooks/piper-voice-manager.sh +0 -0
  76. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +0 -0
  77. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  78. package/.claude/hooks/play-tts-macos.sh +0 -0
  79. package/.claude/hooks/play-tts-piper.sh +1 -1
  80. package/.claude/hooks/play-tts-soprano.sh +0 -0
  81. package/.claude/hooks/play-tts-ssh-remote.sh +0 -0
  82. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  83. package/.claude/hooks/play-tts-windows-receiver.sh +0 -0
  84. package/.claude/hooks/play-tts.sh +4 -0
  85. package/.claude/hooks/post-response.sh +41 -0
  86. package/.claude/hooks/prepare-release.sh +0 -0
  87. package/.claude/hooks/provider-commands.sh +0 -0
  88. package/.claude/hooks/provider-manager.sh +0 -0
  89. package/.claude/hooks/replay-target-audio.sh +0 -0
  90. package/.claude/hooks/sentiment-manager.sh +0 -0
  91. package/.claude/hooks/session-start-tts.sh +0 -0
  92. package/.claude/hooks/soprano-gradio-synth.py +0 -0
  93. package/.claude/hooks/speed-manager.sh +0 -0
  94. package/.claude/hooks/stop-tts.sh +0 -0
  95. package/.claude/hooks/stop.sh +63 -0
  96. package/.claude/hooks/termux-installer.sh +0 -0
  97. package/.claude/hooks/translate-manager.sh +0 -0
  98. package/.claude/hooks/translator.py +0 -0
  99. package/.claude/hooks/tts-queue-worker.sh +0 -0
  100. package/.claude/hooks/tts-queue.sh +0 -0
  101. package/.claude/hooks/verbosity-manager.sh +0 -0
  102. package/.claude/hooks/voice-manager.sh +0 -0
  103. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  104. package/.claude/piper-voices-dir.txt +1 -0
  105. package/.clawdbot/README.md +105 -105
  106. package/.mcp.json +32 -3
  107. package/README.md +12 -2
  108. package/RELEASE_NOTES.md +29 -0
  109. package/WINDOWS-SETUP.md +208 -208
  110. package/bin/agent-vibes +0 -0
  111. package/bin/agentvibes-voice-browser.js +59 -4
  112. package/bin/agentvibes.js +0 -0
  113. package/bin/ensure-soprano-running.sh +43 -0
  114. package/bin/mcp-server.js +121 -121
  115. package/bin/mcp-server.sh +0 -0
  116. package/bin/test-bmad-pr +78 -78
  117. package/mcp-server/QUICK_START.md +203 -203
  118. package/mcp-server/README.md +345 -345
  119. package/mcp-server/WINDOWS_SETUP.md +260 -260
  120. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  121. package/mcp-server/examples/claude_desktop_config.json +11 -11
  122. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  123. package/mcp-server/examples/custom_instructions.md +169 -169
  124. package/mcp-server/install-deps.js +177 -130
  125. package/mcp-server/server.py +1797 -1787
  126. package/mcp-server/test_server.py +0 -0
  127. package/package.json +1 -1
  128. package/src/console/tabs/music-tab.js +18 -2
  129. package/src/installer.js +0 -0
  130. package/templates/agentvibes-receiver.sh +0 -0
  131. package/templates/audio/welcome-music.mp3 +0 -0
  132. package/.claude/hooks/play-tts-agentvibes-receiver.sh +0 -1
package/bin/mcp-server.js CHANGED
@@ -1,122 +1,122 @@
1
1
  #!/usr/bin/env node
2
-
3
- /**
4
- * AgentVibes MCP Server Launcher (Cross-Platform)
5
- *
6
- * This Node.js script replaces the bash wrapper to work on Windows, macOS, and Linux.
7
- * It auto-installs Python dependencies and launches the Python MCP server.
8
- */
9
-
10
- import { spawn } from 'child_process';
11
- import { fileURLToPath } from 'url';
12
- import { dirname, join } from 'path';
13
- import { existsSync } from 'fs';
14
- import { platform } from 'os';
15
-
16
- const __filename = fileURLToPath(import.meta.url);
17
- const __dirname = dirname(__filename);
18
-
19
- // Package root is one level up from bin/
20
- const PACKAGE_ROOT = join(__dirname, '..');
21
- const MCP_SERVER = join(PACKAGE_ROOT, 'mcp-server', 'server.py');
22
- const INSTALL_DEPS = join(PACKAGE_ROOT, 'mcp-server', 'install-deps.js');
23
-
24
- // Check if Python MCP server exists
25
- if (!existsSync(MCP_SERVER)) {
26
- console.error(`❌ Error: MCP server not found at ${MCP_SERVER}`);
27
- process.exit(1);
28
- }
29
-
30
- // Function to find available Python command
31
- async function findPythonCommand() {
32
- const commands = platform() === 'win32' ? ['python', 'py', 'python3'] : ['python3', 'python'];
33
-
34
- for (const cmd of commands) {
35
- try {
36
- const checkCmd = platform() === 'win32' ? 'where' : 'which';
37
- const proc = spawn(checkCmd, [cmd], { stdio: 'ignore' });
38
- const exists = await new Promise((resolve) => {
39
- proc.on('close', (code) => resolve(code === 0));
40
- });
41
-
42
- if (exists) {
43
- return cmd;
44
- }
45
- } catch (err) {
46
- // Try next command
47
- }
48
- }
49
-
50
- return null;
51
- }
52
-
53
- // Function to check if Python module is installed
54
- function checkPythonModule(pythonCmd, moduleName) {
55
- return new Promise((resolve) => {
56
- const proc = spawn(pythonCmd, ['-c', `import ${moduleName}`], { stdio: 'ignore' });
57
- proc.on('close', (code) => resolve(code === 0));
58
- });
59
- }
60
-
61
- // Main setup and launch function
62
- async function main() {
63
- // Silent mode - no output to avoid breaking MCP JSON protocol
64
-
65
- // Find Python command
66
- const pythonCmd = await findPythonCommand();
67
- if (!pythonCmd) {
68
- console.error('ERROR: Python 3 not found. Install from https://python.org and restart Claude Desktop.');
69
- process.exit(1);
70
- }
71
-
72
- // Check if MCP Python package is installed
73
- const hasMCP = await checkPythonModule(pythonCmd, 'mcp');
74
- if (!hasMCP) {
75
- // Try to install MCP package directly
76
- try {
77
- const installCmd = `${pythonCmd} -m pip install --user mcp`;
78
- const installProc = spawn(pythonCmd, ['-m', 'pip', 'install', '--user', 'mcp'], {
79
- stdio: 'pipe',
80
- shell: false
81
- });
82
-
83
- await new Promise((resolve, reject) => {
84
- installProc.on('close', (code) => {
85
- if (code === 0) {
86
- resolve();
87
- } else {
88
- console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
89
- reject(new Error('Dependency installation failed'));
90
- }
91
- });
92
- });
93
- } catch (err) {
94
- console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
95
- process.exit(1);
96
- }
97
- }
98
-
99
- // Launch the Python MCP server
100
- const serverProc = spawn(pythonCmd, [MCP_SERVER], {
101
- stdio: 'inherit',
102
- env: process.env
103
- });
104
-
105
- serverProc.on('error', (err) => {
106
- console.error('❌ Failed to start MCP server:', err.message);
107
- process.exit(1);
108
- });
109
-
110
- serverProc.on('close', (code) => {
111
- process.exit(code || 0);
112
- });
113
-
114
- // Handle termination signals
115
- process.on('SIGINT', () => serverProc.kill('SIGINT'));
116
- process.on('SIGTERM', () => serverProc.kill('SIGTERM'));
117
- }
118
-
119
- main().catch((err) => {
120
- console.error('❌ Error:', err.message);
121
- process.exit(1);
122
- });
2
+
3
+ /**
4
+ * AgentVibes MCP Server Launcher (Cross-Platform)
5
+ *
6
+ * This Node.js script replaces the bash wrapper to work on Windows, macOS, and Linux.
7
+ * It auto-installs Python dependencies and launches the Python MCP server.
8
+ */
9
+
10
+ import { spawn } from 'child_process';
11
+ import { fileURLToPath } from 'url';
12
+ import { dirname, join } from 'path';
13
+ import { existsSync } from 'fs';
14
+ import { platform } from 'os';
15
+
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+
19
+ // Package root is one level up from bin/
20
+ const PACKAGE_ROOT = join(__dirname, '..');
21
+ const MCP_SERVER = join(PACKAGE_ROOT, 'mcp-server', 'server.py');
22
+ const INSTALL_DEPS = join(PACKAGE_ROOT, 'mcp-server', 'install-deps.js');
23
+
24
+ // Check if Python MCP server exists
25
+ if (!existsSync(MCP_SERVER)) {
26
+ console.error(`❌ Error: MCP server not found at ${MCP_SERVER}`);
27
+ process.exit(1);
28
+ }
29
+
30
+ // Function to find available Python command
31
+ async function findPythonCommand() {
32
+ const commands = platform() === 'win32' ? ['python', 'py', 'python3'] : ['python3', 'python'];
33
+
34
+ for (const cmd of commands) {
35
+ try {
36
+ const checkCmd = platform() === 'win32' ? 'where' : 'which';
37
+ const proc = spawn(checkCmd, [cmd], { stdio: 'ignore' });
38
+ const exists = await new Promise((resolve) => {
39
+ proc.on('close', (code) => resolve(code === 0));
40
+ });
41
+
42
+ if (exists) {
43
+ return cmd;
44
+ }
45
+ } catch (err) {
46
+ // Try next command
47
+ }
48
+ }
49
+
50
+ return null;
51
+ }
52
+
53
+ // Function to check if Python module is installed
54
+ function checkPythonModule(pythonCmd, moduleName) {
55
+ return new Promise((resolve) => {
56
+ const proc = spawn(pythonCmd, ['-c', `import ${moduleName}`], { stdio: 'ignore' });
57
+ proc.on('close', (code) => resolve(code === 0));
58
+ });
59
+ }
60
+
61
+ // Main setup and launch function
62
+ async function main() {
63
+ // Silent mode - no output to avoid breaking MCP JSON protocol
64
+
65
+ // Find Python command
66
+ const pythonCmd = await findPythonCommand();
67
+ if (!pythonCmd) {
68
+ console.error('ERROR: Python 3 not found. Install from https://python.org and restart Claude Desktop.');
69
+ process.exit(1);
70
+ }
71
+
72
+ // Check if MCP Python package is installed
73
+ const hasMCP = await checkPythonModule(pythonCmd, 'mcp');
74
+ if (!hasMCP) {
75
+ // Try to install MCP package directly
76
+ try {
77
+ const installCmd = `${pythonCmd} -m pip install --user mcp`;
78
+ const installProc = spawn(pythonCmd, ['-m', 'pip', 'install', '--user', 'mcp'], {
79
+ stdio: 'pipe',
80
+ shell: false
81
+ });
82
+
83
+ await new Promise((resolve, reject) => {
84
+ installProc.on('close', (code) => {
85
+ if (code === 0) {
86
+ resolve();
87
+ } else {
88
+ console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
89
+ reject(new Error('Dependency installation failed'));
90
+ }
91
+ });
92
+ });
93
+ } catch (err) {
94
+ console.error('ERROR: Failed to install Python mcp package. Run: pip install mcp');
95
+ process.exit(1);
96
+ }
97
+ }
98
+
99
+ // Launch the Python MCP server
100
+ const serverProc = spawn(pythonCmd, [MCP_SERVER], {
101
+ stdio: 'inherit',
102
+ env: process.env
103
+ });
104
+
105
+ serverProc.on('error', (err) => {
106
+ console.error('❌ Failed to start MCP server:', err.message);
107
+ process.exit(1);
108
+ });
109
+
110
+ serverProc.on('close', (code) => {
111
+ process.exit(code || 0);
112
+ });
113
+
114
+ // Handle termination signals
115
+ process.on('SIGINT', () => serverProc.kill('SIGINT'));
116
+ process.on('SIGTERM', () => serverProc.kill('SIGTERM'));
117
+ }
118
+
119
+ main().catch((err) => {
120
+ console.error('❌ Error:', err.message);
121
+ process.exit(1);
122
+ });
package/bin/mcp-server.sh CHANGED
File without changes
package/bin/test-bmad-pr CHANGED
@@ -1,79 +1,79 @@
1
1
  #!/usr/bin/env bash
2
- #
3
- # AgentVibes BMAD PR Testing Command
4
- # Quick command to test BMAD PRs with AgentVibes integration
5
- #
6
- # Usage:
7
- # npx agentvibes test-bmad-pr [PR_NUMBER]
8
- # npx agentvibes test-bmad-pr 934
9
- #
10
-
11
- set -e
12
-
13
- # Colors
14
- GREEN='\033[0;32m'
15
- BLUE='\033[0;34m'
16
- YELLOW='\033[1;33m'
17
- CYAN='\033[0;36m'
18
- NC='\033[0m' # No Color
19
-
20
- # Default PR number
21
- PR_NUMBER="${1:-934}"
22
-
23
- clear
24
-
25
- echo ""
26
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
27
- echo -e "${CYAN}🎙️ AgentVibes BMAD PR Testing Tool${NC}"
28
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
29
- echo ""
30
- echo -e "${BLUE}Testing PR #${PR_NUMBER}${NC}"
31
- echo ""
32
- echo -e "${YELLOW}This will download and run the automated test script for${NC}"
33
- echo -e "${YELLOW}BMAD's AgentVibes integration with multi-agent party mode.${NC}"
34
- echo ""
35
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
36
- echo ""
37
-
38
- # Create temp directory for the script
39
- TEMP_DIR=$(mktemp -d)
40
- SCRIPT_PATH="$TEMP_DIR/test-bmad-pr.sh"
41
-
42
- echo -e "${BLUE}📥 Downloading test script...${NC}"
43
-
44
- # Download the test script from the PR branch
45
- SCRIPT_URL="https://raw.githubusercontent.com/paulpreibisch/BMAD-METHOD/feature/agentvibes-tts-integration/test-bmad-pr.sh"
46
-
47
- if curl -fsSL "$SCRIPT_URL" -o "$SCRIPT_PATH"; then
48
- chmod +x "$SCRIPT_PATH"
49
- echo -e "${GREEN}✓ Test script downloaded${NC}"
50
- echo ""
51
-
52
- # Run the test script
53
- exec "$SCRIPT_PATH"
54
- else
55
- echo -e "${YELLOW}⚠ Could not download test script from PR branch${NC}"
56
- echo ""
57
- echo "Trying alternative: Official BMAD repository..."
58
- echo ""
59
-
60
- # Fallback to official repo
61
- SCRIPT_URL="https://raw.githubusercontent.com/bmad-code-org/BMAD-METHOD/refs/pull/${PR_NUMBER}/merge/test-bmad-pr.sh"
62
-
63
- if curl -fsSL "$SCRIPT_URL" -o "$SCRIPT_PATH"; then
64
- chmod +x "$SCRIPT_PATH"
65
- echo -e "${GREEN}✓ Test script downloaded${NC}"
66
- echo ""
67
- exec "$SCRIPT_PATH"
68
- else
69
- echo -e "${YELLOW}⚠ Could not download test script${NC}"
70
- echo ""
71
- echo "Please try manual testing:"
72
- echo -e "${GREEN}git clone https://github.com/bmad-code-org/BMAD-METHOD.git${NC}"
73
- echo -e "${GREEN}cd BMAD-METHOD${NC}"
74
- echo -e "${GREEN}git fetch origin pull/${PR_NUMBER}/head:test-pr-${PR_NUMBER}${NC}"
75
- echo -e "${GREEN}git checkout test-pr-${PR_NUMBER}${NC}"
76
- echo ""
77
- exit 1
78
- fi
79
- fi
2
+ #
3
+ # AgentVibes BMAD PR Testing Command
4
+ # Quick command to test BMAD PRs with AgentVibes integration
5
+ #
6
+ # Usage:
7
+ # npx agentvibes test-bmad-pr [PR_NUMBER]
8
+ # npx agentvibes test-bmad-pr 934
9
+ #
10
+
11
+ set -e
12
+
13
+ # Colors
14
+ GREEN='\033[0;32m'
15
+ BLUE='\033[0;34m'
16
+ YELLOW='\033[1;33m'
17
+ CYAN='\033[0;36m'
18
+ NC='\033[0m' # No Color
19
+
20
+ # Default PR number
21
+ PR_NUMBER="${1:-934}"
22
+
23
+ clear
24
+
25
+ echo ""
26
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
27
+ echo -e "${CYAN}🎙️ AgentVibes BMAD PR Testing Tool${NC}"
28
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
29
+ echo ""
30
+ echo -e "${BLUE}Testing PR #${PR_NUMBER}${NC}"
31
+ echo ""
32
+ echo -e "${YELLOW}This will download and run the automated test script for${NC}"
33
+ echo -e "${YELLOW}BMAD's AgentVibes integration with multi-agent party mode.${NC}"
34
+ echo ""
35
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
36
+ echo ""
37
+
38
+ # Create temp directory for the script
39
+ TEMP_DIR=$(mktemp -d)
40
+ SCRIPT_PATH="$TEMP_DIR/test-bmad-pr.sh"
41
+
42
+ echo -e "${BLUE}📥 Downloading test script...${NC}"
43
+
44
+ # Download the test script from the PR branch
45
+ SCRIPT_URL="https://raw.githubusercontent.com/paulpreibisch/BMAD-METHOD/feature/agentvibes-tts-integration/test-bmad-pr.sh"
46
+
47
+ if curl -fsSL "$SCRIPT_URL" -o "$SCRIPT_PATH"; then
48
+ chmod +x "$SCRIPT_PATH"
49
+ echo -e "${GREEN}✓ Test script downloaded${NC}"
50
+ echo ""
51
+
52
+ # Run the test script
53
+ exec "$SCRIPT_PATH"
54
+ else
55
+ echo -e "${YELLOW}⚠ Could not download test script from PR branch${NC}"
56
+ echo ""
57
+ echo "Trying alternative: Official BMAD repository..."
58
+ echo ""
59
+
60
+ # Fallback to official repo
61
+ SCRIPT_URL="https://raw.githubusercontent.com/bmad-code-org/BMAD-METHOD/refs/pull/${PR_NUMBER}/merge/test-bmad-pr.sh"
62
+
63
+ if curl -fsSL "$SCRIPT_URL" -o "$SCRIPT_PATH"; then
64
+ chmod +x "$SCRIPT_PATH"
65
+ echo -e "${GREEN}✓ Test script downloaded${NC}"
66
+ echo ""
67
+ exec "$SCRIPT_PATH"
68
+ else
69
+ echo -e "${YELLOW}⚠ Could not download test script${NC}"
70
+ echo ""
71
+ echo "Please try manual testing:"
72
+ echo -e "${GREEN}git clone https://github.com/bmad-code-org/BMAD-METHOD.git${NC}"
73
+ echo -e "${GREEN}cd BMAD-METHOD${NC}"
74
+ echo -e "${GREEN}git fetch origin pull/${PR_NUMBER}/head:test-pr-${PR_NUMBER}${NC}"
75
+ echo -e "${GREEN}git checkout test-pr-${PR_NUMBER}${NC}"
76
+ echo ""
77
+ exit 1
78
+ fi
79
+ fi