agentvibes 5.9.0 → 5.10.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 (145) hide show
  1. package/.agentvibes/config.json +3 -12
  2. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  3. package/.claude/commands/agent-vibes-rdp.md +24 -24
  4. package/.claude/config/audio-effects.cfg +4 -5
  5. package/.claude/config/audio-effects.cfg.sample +52 -52
  6. package/.claude/config/background-music-enabled.txt +1 -1
  7. package/.claude/docs/TERMUX_SETUP.md +408 -408
  8. package/.claude/github-star-reminder.txt +1 -1
  9. package/.claude/hooks/audio-cache-utils.sh +0 -0
  10. package/.claude/hooks/audio-processor.sh +0 -0
  11. package/.claude/hooks/background-music-manager.sh +0 -0
  12. package/.claude/hooks/bmad-party-speak.sh +0 -0
  13. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  14. package/.claude/hooks/bmad-speak.sh +0 -0
  15. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  16. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  17. package/.claude/hooks/clawdbot-receiver-SECURE.sh +0 -0
  18. package/.claude/hooks/clawdbot-receiver.sh +0 -0
  19. package/.claude/hooks/clean-audio-cache.sh +0 -0
  20. package/.claude/hooks/cleanup-cache.sh +0 -0
  21. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  22. package/.claude/hooks/download-extra-voices.sh +0 -0
  23. package/.claude/hooks/effects-manager.sh +0 -0
  24. package/.claude/hooks/github-star-reminder.sh +0 -0
  25. package/.claude/hooks/language-manager.sh +0 -0
  26. package/.claude/hooks/learn-manager.sh +0 -0
  27. package/.claude/hooks/macos-voice-manager.sh +0 -0
  28. package/.claude/hooks/migrate-background-music.sh +0 -0
  29. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  30. package/.claude/hooks/optimize-background-music.sh +0 -0
  31. package/.claude/hooks/path-resolver.sh +0 -0
  32. package/.claude/hooks/personality-manager.sh +0 -0
  33. package/.claude/hooks/piper-download-voices.sh +0 -0
  34. package/.claude/hooks/piper-installer.sh +0 -0
  35. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  36. package/.claude/hooks/piper-voice-manager.sh +0 -0
  37. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +0 -0
  38. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  39. package/.claude/hooks/play-tts-macos.sh +0 -0
  40. package/.claude/hooks/play-tts-piper.sh +20 -13
  41. package/.claude/hooks/play-tts-soprano.sh +0 -0
  42. package/.claude/hooks/play-tts-ssh-remote.sh +0 -0
  43. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  44. package/.claude/hooks/play-tts-windows-receiver.sh +0 -0
  45. package/.claude/hooks/play-tts.sh +0 -0
  46. package/.claude/hooks/prepare-release.sh +0 -0
  47. package/.claude/hooks/provider-commands.sh +0 -0
  48. package/.claude/hooks/provider-manager.sh +0 -0
  49. package/.claude/hooks/replay-target-audio.sh +0 -0
  50. package/.claude/hooks/requirements.txt +6 -6
  51. package/.claude/hooks/sentiment-manager.sh +0 -0
  52. package/.claude/hooks/session-start-tts.sh +0 -0
  53. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  54. package/.claude/hooks/speed-manager.sh +0 -0
  55. package/.claude/hooks/stop-tts.sh +0 -0
  56. package/.claude/hooks/termux-installer.sh +0 -0
  57. package/.claude/hooks/translate-manager.sh +0 -0
  58. package/.claude/hooks/translator.py +237 -237
  59. package/.claude/hooks/tts-queue-worker.sh +0 -0
  60. package/.claude/hooks/tts-queue.sh +0 -0
  61. package/.claude/hooks/verbosity-manager.sh +0 -0
  62. package/.claude/hooks/voice-manager.sh +6 -0
  63. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +22 -16
  64. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  65. package/.claude/verbosity.txt +1 -1
  66. package/.clawdbot/README.md +105 -105
  67. package/.mcp.json +19 -6
  68. package/README.md +1 -1
  69. package/WINDOWS-SETUP.md +208 -208
  70. package/bin/agent-vibes +39 -39
  71. package/bin/agentvibes-voice-browser.js +0 -0
  72. package/bin/agentvibes.js +0 -0
  73. package/bin/mcp-server.js +121 -121
  74. package/bin/mcp-server.sh +0 -0
  75. package/bin/test-bmad-pr +78 -78
  76. package/mcp-server/QUICK_START.md +203 -203
  77. package/mcp-server/README.md +345 -345
  78. package/mcp-server/WINDOWS_SETUP.md +0 -0
  79. package/mcp-server/examples/claude_desktop_config.json +11 -11
  80. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  81. package/mcp-server/examples/custom_instructions.md +169 -169
  82. package/mcp-server/install-deps.js +0 -0
  83. package/mcp-server/server.py +1807 -1797
  84. package/mcp-server/test_server.py +0 -0
  85. package/package.json +2 -2
  86. package/src/cli/list-personalities.js +110 -110
  87. package/src/cli/list-voices.js +114 -114
  88. package/src/commands/bmad-voices.js +394 -394
  89. package/src/commands/install-mcp.js +730 -476
  90. package/src/console/app.js +3 -3
  91. package/src/console/brand-colors.js +13 -13
  92. package/src/console/constants/personalities.js +44 -44
  93. package/src/console/tabs/agents-tab.js +6 -6
  94. package/src/console/tabs/help-tab.js +314 -314
  95. package/src/console/tabs/music-tab.js +1 -1
  96. package/src/console/tabs/readme-tab.js +272 -272
  97. package/src/console/tabs/receiver-tab.js +13 -13
  98. package/src/console/tabs/settings-tab.js +2 -2
  99. package/src/console/tabs/setup-tab.js +10 -10
  100. package/src/console/tabs/voices-tab.js +4 -4
  101. package/src/console/widgets/destroy-list.js +25 -25
  102. package/src/console/widgets/notice.js +55 -55
  103. package/src/console/widgets/personality-picker.js +2 -2
  104. package/src/console/widgets/reverb-picker.js +1 -1
  105. package/src/i18n/de.js +202 -202
  106. package/src/i18n/es.js +202 -202
  107. package/src/i18n/fr.js +202 -202
  108. package/src/i18n/hi.js +202 -202
  109. package/src/i18n/ja.js +202 -202
  110. package/src/i18n/ko.js +202 -202
  111. package/src/i18n/pt.js +202 -202
  112. package/src/i18n/strings.js +54 -54
  113. package/src/i18n/zh-CN.js +202 -202
  114. package/src/installer/language-screen.js +31 -31
  115. package/src/installer/music-file-input.js +304 -304
  116. package/src/installer.js +32 -27
  117. package/src/services/config-service.js +264 -264
  118. package/src/services/language-service.js +47 -47
  119. package/src/services/provider-service.js +143 -143
  120. package/src/services/tts-engine-service.js +2 -2
  121. package/src/utils/audio-duration-validator.js +298 -298
  122. package/src/utils/audio-format-validator.js +277 -277
  123. package/src/utils/dependency-checker.js +469 -469
  124. package/src/utils/file-ownership-verifier.js +358 -358
  125. package/src/utils/list-formatter.js +200 -194
  126. package/src/utils/music-file-validator.js +285 -285
  127. package/src/utils/platform-resolver.js +369 -0
  128. package/src/utils/preview-list-prompt.js +136 -136
  129. package/src/utils/provider-validator.js +9 -9
  130. package/src/utils/secure-music-storage.js +412 -412
  131. package/templates/agentvibes-receiver.sh +231 -231
  132. package/templates/audio/welcome-music.mp3 +0 -0
  133. package/.agentvibes/install-manifest.json +0 -330
  134. package/.claude/config/background-music-position.txt +0 -27
  135. package/.claude/config/background-music-volume.txt +0 -1
  136. package/.claude/config/background-music.cfg +0 -1
  137. package/.claude/config/background-music.txt +0 -1
  138. package/.claude/config/language.txt +0 -1
  139. package/.claude/config/reverb-level.txt +0 -1
  140. package/.claude/config/tts-speech-rate.txt +0 -1
  141. package/.claude/config/tts-verbosity.txt +0 -1
  142. package/.claude/hooks/play-tts-agentvibes-receiver.sh +0 -1
  143. package/.claude/hooks-windows/audio-cache-utils.ps1.user.bak +0 -119
  144. package/.claude/hooks-windows/soprano-gradio-synth.py.user.bak +0 -153
  145. package/.claude/piper-voices-dir.txt +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