agentvibes 5.7.6 → 5.9.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 (137) hide show
  1. package/.agentvibes/config.json +12 -5
  2. package/.agentvibes/install-manifest.json +188 -300
  3. package/.claude/audio/tracks/celestial_velvet.mp3 +0 -0
  4. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  5. package/.claude/commands/agent-vibes-rdp.md +24 -24
  6. package/.claude/config/audio-effects.cfg +3 -2
  7. package/.claude/config/audio-effects.cfg.sample +52 -52
  8. package/.claude/config/background-music-enabled.txt +1 -0
  9. package/.claude/config/background-music-position.txt +1 -1
  10. package/.claude/config/language.txt +1 -0
  11. package/.claude/docs/TERMUX_SETUP.md +408 -408
  12. package/.claude/hooks/audio-cache-utils.sh +0 -0
  13. package/.claude/hooks/audio-processor.sh +0 -0
  14. package/.claude/hooks/background-music-manager.sh +0 -0
  15. package/.claude/hooks/bmad-party-speak.sh +27 -6
  16. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  17. package/.claude/hooks/bmad-speak.sh +0 -0
  18. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  19. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  20. package/.claude/hooks/clawdbot-receiver-SECURE.sh +0 -0
  21. package/.claude/hooks/clawdbot-receiver.sh +0 -0
  22. package/.claude/hooks/clean-audio-cache.sh +0 -0
  23. package/.claude/hooks/cleanup-cache.sh +0 -0
  24. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  25. package/.claude/hooks/download-extra-voices.sh +0 -0
  26. package/.claude/hooks/effects-manager.sh +0 -0
  27. package/.claude/hooks/github-star-reminder.sh +0 -0
  28. package/.claude/hooks/language-manager.sh +0 -0
  29. package/.claude/hooks/learn-manager.sh +0 -0
  30. package/.claude/hooks/macos-voice-manager.sh +0 -0
  31. package/.claude/hooks/migrate-background-music.sh +0 -0
  32. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  33. package/.claude/hooks/optimize-background-music.sh +0 -0
  34. package/.claude/hooks/path-resolver.sh +0 -0
  35. package/.claude/hooks/personality-manager.sh +0 -0
  36. package/.claude/hooks/piper-download-voices.sh +0 -0
  37. package/.claude/hooks/piper-installer.sh +0 -0
  38. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  39. package/.claude/hooks/piper-voice-manager.sh +0 -0
  40. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +0 -0
  41. package/.claude/hooks/play-tts-agentvibes-receiver.sh +1 -0
  42. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  43. package/.claude/hooks/play-tts-macos.sh +0 -0
  44. package/.claude/hooks/play-tts-piper.sh +0 -0
  45. package/.claude/hooks/play-tts-soprano.sh +0 -0
  46. package/.claude/hooks/play-tts-ssh-remote.sh +11 -8
  47. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  48. package/.claude/hooks/play-tts-windows-receiver.sh +0 -0
  49. package/.claude/hooks/play-tts.sh +0 -0
  50. package/.claude/hooks/prepare-release.sh +0 -0
  51. package/.claude/hooks/provider-commands.sh +0 -0
  52. package/.claude/hooks/provider-manager.sh +0 -0
  53. package/.claude/hooks/replay-target-audio.sh +0 -0
  54. package/.claude/hooks/requirements.txt +6 -6
  55. package/.claude/hooks/sentiment-manager.sh +0 -0
  56. package/.claude/hooks/session-start-tts.sh +0 -0
  57. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  58. package/.claude/hooks/speed-manager.sh +0 -0
  59. package/.claude/hooks/stop-tts.sh +0 -0
  60. package/.claude/hooks/termux-installer.sh +0 -0
  61. package/.claude/hooks/translate-manager.sh +0 -0
  62. package/.claude/hooks/translator.py +237 -237
  63. package/.claude/hooks/tts-queue-worker.sh +0 -0
  64. package/.claude/hooks/tts-queue.sh +0 -0
  65. package/.claude/hooks/verbosity-manager.sh +0 -0
  66. package/.claude/hooks/voice-manager.sh +0 -0
  67. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  68. package/.claude/hooks-windows/audio-cache-utils.ps1.user.bak +119 -0
  69. package/.claude/hooks-windows/bmad-speak.ps1 +9 -38
  70. package/.claude/hooks-windows/play-tts-soprano.ps1 +13 -2
  71. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  72. package/.claude/hooks-windows/soprano-gradio-synth.py.user.bak +153 -0
  73. package/.claude/piper-voices-dir.txt +1 -1
  74. package/.claude/verbosity.txt +1 -1
  75. package/.clawdbot/README.md +105 -105
  76. package/.mcp.json +5 -14
  77. package/README.md +43 -2
  78. package/RELEASE_NOTES.md +110 -0
  79. package/WINDOWS-SETUP.md +208 -208
  80. package/bin/agent-vibes +39 -39
  81. package/bin/agentvibes-voice-browser.js +0 -0
  82. package/bin/agentvibes.js +0 -0
  83. package/bin/mcp-server.js +121 -121
  84. package/bin/mcp-server.sh +0 -0
  85. package/bin/test-bmad-pr +78 -78
  86. package/mcp-server/QUICK_START.md +203 -203
  87. package/mcp-server/README.md +345 -345
  88. package/mcp-server/WINDOWS_SETUP.md +0 -0
  89. package/mcp-server/examples/claude_desktop_config.json +11 -11
  90. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  91. package/mcp-server/examples/custom_instructions.md +169 -169
  92. package/mcp-server/install-deps.js +0 -0
  93. package/mcp-server/server.py +1797 -1797
  94. package/mcp-server/test_server.py +0 -0
  95. package/package.json +1 -1
  96. package/src/cli/list-personalities.js +110 -110
  97. package/src/cli/list-voices.js +114 -114
  98. package/src/commands/bmad-voices.js +394 -394
  99. package/src/commands/install-mcp.js +476 -476
  100. package/src/console/audio-env.js +4 -1
  101. package/src/console/brand-colors.js +13 -13
  102. package/src/console/constants/personalities.js +44 -44
  103. package/src/console/tabs/agents-tab.js +85 -62
  104. package/src/console/tabs/help-tab.js +314 -314
  105. package/src/console/tabs/music-tab.js +3 -0
  106. package/src/console/tabs/readme-tab.js +272 -272
  107. package/src/console/tabs/setup-tab.js +285 -41
  108. package/src/console/tabs/voices-tab.js +14 -2
  109. package/src/console/widgets/destroy-list.js +25 -25
  110. package/src/console/widgets/notice.js +55 -55
  111. package/src/i18n/de.js +202 -202
  112. package/src/i18n/es.js +202 -202
  113. package/src/i18n/fr.js +202 -202
  114. package/src/i18n/hi.js +202 -202
  115. package/src/i18n/ja.js +202 -202
  116. package/src/i18n/ko.js +202 -202
  117. package/src/i18n/pt.js +202 -202
  118. package/src/i18n/strings.js +54 -54
  119. package/src/i18n/zh-CN.js +202 -202
  120. package/src/installer/language-screen.js +31 -31
  121. package/src/installer/music-file-input.js +304 -304
  122. package/src/installer.js +0 -0
  123. package/src/services/config-service.js +264 -264
  124. package/src/services/language-service.js +47 -47
  125. package/src/services/provider-service.js +143 -143
  126. package/src/utils/audio-duration-validator.js +298 -298
  127. package/src/utils/audio-format-validator.js +277 -277
  128. package/src/utils/dependency-checker.js +469 -469
  129. package/src/utils/file-ownership-verifier.js +358 -358
  130. package/src/utils/list-formatter.js +194 -194
  131. package/src/utils/music-file-validator.js +285 -285
  132. package/src/utils/preview-list-prompt.js +136 -136
  133. package/src/utils/secure-music-storage.js +412 -412
  134. package/templates/agentvibes-receiver.sh +231 -231
  135. package/templates/audio/welcome-music.mp3 +0 -0
  136. package/.claude/hooks/bmad-party-manager.sh +0 -225
  137. package/.claude/hooks/stop.sh +0 -38
@@ -1,194 +1,194 @@
1
- #!/usr/bin/env node
2
- /**
3
- * AgentVibes List Formatter
4
- *
5
- * Beautiful multi-column boxen displays for voices and personalities
6
- * Inspired by BMAD-METHOD's installer UX
7
- */
8
-
9
- import chalk from 'chalk';
10
- import boxen from 'boxen';
11
-
12
- /**
13
- * Format items into multi-column layout
14
- * @param {Array} items - Array of strings or objects with {name, description, current}
15
- * @param {Object} options - Formatting options
16
- * @returns {string} Formatted multi-column text
17
- */
18
- export function formatColumns(items, options = {}) {
19
- const {
20
- columns = 2,
21
- columnWidth = 35,
22
- highlightChar = '▶',
23
- indent = ' '
24
- } = options;
25
-
26
- const rows = [];
27
- const itemsPerRow = columns;
28
-
29
- for (let i = 0; i < items.length; i += itemsPerRow) {
30
- const rowItems = items.slice(i, i + itemsPerRow);
31
- const row = rowItems.map((item, idx) => {
32
- const isObject = typeof item === 'object';
33
- const name = isObject ? item.name : item;
34
- const desc = isObject ? item.description : '';
35
- const isCurrent = isObject ? item.current : false;
36
-
37
- // Format item
38
- let formatted = isCurrent ? `${highlightChar} ${name}` : ` ${name}`;
39
-
40
- if (desc) {
41
- formatted = chalk.cyan(formatted) + chalk.gray(` ${desc}`);
42
- } else if (isCurrent) {
43
- formatted = chalk.cyan(formatted);
44
- }
45
-
46
- // Pad to column width (accounting for ANSI codes)
47
- const plainLength = (isCurrent ? `${highlightChar} ${name}` : ` ${name}`).length + (desc ? ` ${desc}`.length : 0);
48
- const padding = Math.max(0, columnWidth - plainLength);
49
-
50
- return formatted + ' '.repeat(padding);
51
- });
52
-
53
- rows.push(indent + row.join(' '));
54
- }
55
-
56
- return rows.join('\n');
57
- }
58
-
59
- /**
60
- * Format voices list with boxen
61
- * @param {Array} voices - Array of voice objects {name, lang, current}
62
- * @param {Object} options - Display options
63
- * @returns {string} Formatted boxen output
64
- */
65
- export function formatVoicesList(voices, options = {}) {
66
- const {
67
- provider = 'Piper TTS',
68
- title = '🎤 Available Voices',
69
- columns = 2,
70
- showUsage = true
71
- } = options;
72
-
73
- if (voices.length === 0) {
74
- const content = chalk.yellow('No voices found') + '\n\n' +
75
- chalk.gray('Download voices with:\n') +
76
- chalk.cyan(' /agent-vibes:provider download <voice-name>');
77
-
78
- return boxen(content, {
79
- padding: 1,
80
- margin: 1,
81
- borderStyle: 'round',
82
- borderColor: 'yellow',
83
- title: chalk.bold(title),
84
- titleAlignment: 'center'
85
- });
86
- }
87
-
88
- // Format voices
89
- const formattedItems = voices.map(v => ({
90
- name: v.name,
91
- description: v.lang || '',
92
- current: v.current || false
93
- }));
94
-
95
- let content = chalk.bold(`${provider}\n\n`);
96
- content += formatColumns(formattedItems, { columns });
97
-
98
- if (showUsage) {
99
- content += '\n\n' + chalk.gray('─'.repeat(60)) + '\n';
100
- content += chalk.dim('Switch voice: ') + chalk.cyan('/agent-vibes:switch <voice-name>') + '\n';
101
- content += chalk.dim('Preview voice: ') + chalk.cyan('/agent-vibes:preview <voice-name>');
102
- }
103
-
104
- return boxen(content, {
105
- padding: 1,
106
- margin: 1,
107
- borderStyle: 'round',
108
- borderColor: 'cyan',
109
- title: chalk.bold(title),
110
- titleAlignment: 'center'
111
- });
112
- }
113
-
114
- /**
115
- * Format personalities list with boxen
116
- * @param {Array} personalities - Array of personality objects {name, description, current}
117
- * @param {Object} options - Display options
118
- * @returns {string} Formatted boxen output
119
- */
120
- export function formatPersonalitiesList(personalities, options = {}) {
121
- const {
122
- title = '🎭 Available Personalities',
123
- columns = 2,
124
- showUsage = true
125
- } = options;
126
-
127
- if (personalities.length === 0) {
128
- const content = chalk.yellow('No personalities found') + '\n\n' +
129
- chalk.gray('Add a personality with:\n') +
130
- chalk.cyan(' /agent-vibes:personality add <name>');
131
-
132
- return boxen(content, {
133
- padding: 1,
134
- margin: 1,
135
- borderStyle: 'round',
136
- borderColor: 'yellow',
137
- title: chalk.bold(title),
138
- titleAlignment: 'center'
139
- });
140
- }
141
-
142
- let content = formatColumns(personalities, { columns, columnWidth: 40 });
143
-
144
- if (showUsage) {
145
- content += '\n\n' + chalk.gray('─'.repeat(60)) + '\n';
146
- content += chalk.dim('Set personality: ') + chalk.cyan('/agent-vibes:personality <name>') + '\n';
147
- content += chalk.dim('Add personality: ') + chalk.cyan('/agent-vibes:personality add <name>') + '\n';
148
- content += chalk.dim('Edit personality: ') + chalk.cyan('/agent-vibes:personality edit <name>');
149
- }
150
-
151
- return boxen(content, {
152
- padding: 1,
153
- margin: 1,
154
- borderStyle: 'round',
155
- borderColor: 'magenta',
156
- title: chalk.bold(title),
157
- titleAlignment: 'center'
158
- });
159
- }
160
-
161
- /**
162
- * Format generic list with boxen
163
- * @param {Array} items - Array of items (strings or objects)
164
- * @param {Object} options - Display options
165
- * @returns {string} Formatted boxen output
166
- */
167
- export function formatList(items, options = {}) {
168
- const {
169
- title = 'Items',
170
- icon = '📋',
171
- columns = 2,
172
- borderColor = 'blue',
173
- showCount = true
174
- } = options;
175
-
176
- const titleText = icon ? `${icon} ${title}` : title;
177
- const countText = showCount ? chalk.gray(` (${items.length})`) : '';
178
-
179
- let content = '';
180
- if (showCount) {
181
- content = chalk.bold(`Total: ${items.length} items\n\n`);
182
- }
183
-
184
- content += formatColumns(items, { columns });
185
-
186
- return boxen(content, {
187
- padding: 1,
188
- margin: 1,
189
- borderStyle: 'round',
190
- borderColor,
191
- title: chalk.bold(titleText) + countText,
192
- titleAlignment: 'center'
193
- });
194
- }
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AgentVibes List Formatter
4
+ *
5
+ * Beautiful multi-column boxen displays for voices and personalities
6
+ * Inspired by BMAD-METHOD's installer UX
7
+ */
8
+
9
+ import chalk from 'chalk';
10
+ import boxen from 'boxen';
11
+
12
+ /**
13
+ * Format items into multi-column layout
14
+ * @param {Array} items - Array of strings or objects with {name, description, current}
15
+ * @param {Object} options - Formatting options
16
+ * @returns {string} Formatted multi-column text
17
+ */
18
+ export function formatColumns(items, options = {}) {
19
+ const {
20
+ columns = 2,
21
+ columnWidth = 35,
22
+ highlightChar = '▶',
23
+ indent = ' '
24
+ } = options;
25
+
26
+ const rows = [];
27
+ const itemsPerRow = columns;
28
+
29
+ for (let i = 0; i < items.length; i += itemsPerRow) {
30
+ const rowItems = items.slice(i, i + itemsPerRow);
31
+ const row = rowItems.map((item, idx) => {
32
+ const isObject = typeof item === 'object';
33
+ const name = isObject ? item.name : item;
34
+ const desc = isObject ? item.description : '';
35
+ const isCurrent = isObject ? item.current : false;
36
+
37
+ // Format item
38
+ let formatted = isCurrent ? `${highlightChar} ${name}` : ` ${name}`;
39
+
40
+ if (desc) {
41
+ formatted = chalk.cyan(formatted) + chalk.gray(` ${desc}`);
42
+ } else if (isCurrent) {
43
+ formatted = chalk.cyan(formatted);
44
+ }
45
+
46
+ // Pad to column width (accounting for ANSI codes)
47
+ const plainLength = (isCurrent ? `${highlightChar} ${name}` : ` ${name}`).length + (desc ? ` ${desc}`.length : 0);
48
+ const padding = Math.max(0, columnWidth - plainLength);
49
+
50
+ return formatted + ' '.repeat(padding);
51
+ });
52
+
53
+ rows.push(indent + row.join(' '));
54
+ }
55
+
56
+ return rows.join('\n');
57
+ }
58
+
59
+ /**
60
+ * Format voices list with boxen
61
+ * @param {Array} voices - Array of voice objects {name, lang, current}
62
+ * @param {Object} options - Display options
63
+ * @returns {string} Formatted boxen output
64
+ */
65
+ export function formatVoicesList(voices, options = {}) {
66
+ const {
67
+ provider = 'Piper TTS',
68
+ title = '🎤 Available Voices',
69
+ columns = 2,
70
+ showUsage = true
71
+ } = options;
72
+
73
+ if (voices.length === 0) {
74
+ const content = chalk.yellow('No voices found') + '\n\n' +
75
+ chalk.gray('Download voices with:\n') +
76
+ chalk.cyan(' /agent-vibes:provider download <voice-name>');
77
+
78
+ return boxen(content, {
79
+ padding: 1,
80
+ margin: 1,
81
+ borderStyle: 'round',
82
+ borderColor: 'yellow',
83
+ title: chalk.bold(title),
84
+ titleAlignment: 'center'
85
+ });
86
+ }
87
+
88
+ // Format voices
89
+ const formattedItems = voices.map(v => ({
90
+ name: v.name,
91
+ description: v.lang || '',
92
+ current: v.current || false
93
+ }));
94
+
95
+ let content = chalk.bold(`${provider}\n\n`);
96
+ content += formatColumns(formattedItems, { columns });
97
+
98
+ if (showUsage) {
99
+ content += '\n\n' + chalk.gray('─'.repeat(60)) + '\n';
100
+ content += chalk.dim('Switch voice: ') + chalk.cyan('/agent-vibes:switch <voice-name>') + '\n';
101
+ content += chalk.dim('Preview voice: ') + chalk.cyan('/agent-vibes:preview <voice-name>');
102
+ }
103
+
104
+ return boxen(content, {
105
+ padding: 1,
106
+ margin: 1,
107
+ borderStyle: 'round',
108
+ borderColor: 'cyan',
109
+ title: chalk.bold(title),
110
+ titleAlignment: 'center'
111
+ });
112
+ }
113
+
114
+ /**
115
+ * Format personalities list with boxen
116
+ * @param {Array} personalities - Array of personality objects {name, description, current}
117
+ * @param {Object} options - Display options
118
+ * @returns {string} Formatted boxen output
119
+ */
120
+ export function formatPersonalitiesList(personalities, options = {}) {
121
+ const {
122
+ title = '🎭 Available Personalities',
123
+ columns = 2,
124
+ showUsage = true
125
+ } = options;
126
+
127
+ if (personalities.length === 0) {
128
+ const content = chalk.yellow('No personalities found') + '\n\n' +
129
+ chalk.gray('Add a personality with:\n') +
130
+ chalk.cyan(' /agent-vibes:personality add <name>');
131
+
132
+ return boxen(content, {
133
+ padding: 1,
134
+ margin: 1,
135
+ borderStyle: 'round',
136
+ borderColor: 'yellow',
137
+ title: chalk.bold(title),
138
+ titleAlignment: 'center'
139
+ });
140
+ }
141
+
142
+ let content = formatColumns(personalities, { columns, columnWidth: 40 });
143
+
144
+ if (showUsage) {
145
+ content += '\n\n' + chalk.gray('─'.repeat(60)) + '\n';
146
+ content += chalk.dim('Set personality: ') + chalk.cyan('/agent-vibes:personality <name>') + '\n';
147
+ content += chalk.dim('Add personality: ') + chalk.cyan('/agent-vibes:personality add <name>') + '\n';
148
+ content += chalk.dim('Edit personality: ') + chalk.cyan('/agent-vibes:personality edit <name>');
149
+ }
150
+
151
+ return boxen(content, {
152
+ padding: 1,
153
+ margin: 1,
154
+ borderStyle: 'round',
155
+ borderColor: 'magenta',
156
+ title: chalk.bold(title),
157
+ titleAlignment: 'center'
158
+ });
159
+ }
160
+
161
+ /**
162
+ * Format generic list with boxen
163
+ * @param {Array} items - Array of items (strings or objects)
164
+ * @param {Object} options - Display options
165
+ * @returns {string} Formatted boxen output
166
+ */
167
+ export function formatList(items, options = {}) {
168
+ const {
169
+ title = 'Items',
170
+ icon = '📋',
171
+ columns = 2,
172
+ borderColor = 'blue',
173
+ showCount = true
174
+ } = options;
175
+
176
+ const titleText = icon ? `${icon} ${title}` : title;
177
+ const countText = showCount ? chalk.gray(` (${items.length})`) : '';
178
+
179
+ let content = '';
180
+ if (showCount) {
181
+ content = chalk.bold(`Total: ${items.length} items\n\n`);
182
+ }
183
+
184
+ content += formatColumns(items, { columns });
185
+
186
+ return boxen(content, {
187
+ padding: 1,
188
+ margin: 1,
189
+ borderStyle: 'round',
190
+ borderColor,
191
+ title: chalk.bold(titleText) + countText,
192
+ titleAlignment: 'center'
193
+ });
194
+ }