agentvibes 4.0.0 → 4.0.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.
@@ -1 +1 @@
1
- agent_vibes_celtic_harp_v1_loop.mp3:12.341678
1
+ agent_vibes_celtic_harp_v1_loop.mp3:6.576961
@@ -40,9 +40,15 @@ set -eo pipefail
40
40
  # language-manager.sh, audio-cache-utils.sh) use unset variables freely.
41
41
  # Variables in THIS script use ${VAR:-} defaults for safety.
42
42
 
43
- # Cleanup handler for temp files
43
+ # Cleanup handler for temp files (preserves final output in $TEMP_FILE)
44
44
  _CLEANUP_FILES=()
45
- cleanup() { rm -f "${_CLEANUP_FILES[@]+"${_CLEANUP_FILES[@]}"}"; }
45
+ cleanup() {
46
+ local f
47
+ for f in "${_CLEANUP_FILES[@]+"${_CLEANUP_FILES[@]}"}"; do
48
+ [[ "$f" == "${TEMP_FILE:-}" ]] && continue
49
+ rm -f "$f"
50
+ done
51
+ }
46
52
  trap cleanup EXIT
47
53
 
48
54
  # Fix locale warnings
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": "4.0.0",
4
+ "version": "4.0.1",
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": [
@@ -112,7 +112,7 @@ export class AgentVibesConsole {
112
112
  // Screen options stored as property so tests can verify correct configuration
113
113
  // without needing to intercept the blessed.screen() call (ESM mock limitation).
114
114
  this._screenOptions = {
115
- smartCSR: false,
115
+ smartCSR: true,
116
116
  mouse: true,
117
117
  fullUnicode: true,
118
118
  title: `AgentVibes v${APP_VERSION} TUI Console`,
@@ -35,6 +35,10 @@ export const FOOTER_CONFIG = {
35
35
  color: '#607d8b',
36
36
  text: ` ${key('↑↓')} Scroll ${key('Q')} Quit`,
37
37
  },
38
+ agents: {
39
+ color: '#9c27b0',
40
+ text: ` ${key('↑↓')} Navigate ${key('Enter')} Assign ${key('R')} Reset`,
41
+ },
38
42
  install: {
39
43
  color: '#1a237e',
40
44
  text: ` ${key('↑↓')} Navigate ${key('Enter')} Select ${key('Esc')} Back`,
@@ -11,6 +11,7 @@ const KEY_TO_TAB = {
11
11
  's': 'settings', 'S': 'settings',
12
12
  'v': 'voices', 'V': 'voices',
13
13
  'm': 'music', 'M': 'music',
14
+ 'a': 'agents', 'A': 'agents',
14
15
  'r': 'readme', 'R': 'readme',
15
16
  'h': 'help', 'H': 'help',
16
17
  'i': 'install', 'I': 'install',
@@ -22,7 +22,7 @@ import {
22
22
  copyCommandFiles, copyHookFiles, copyPersonalityFiles,
23
23
  copyPluginFiles, copyBmadConfigFiles, copyBackgroundMusicFiles,
24
24
  copyConfigFiles, configureSessionStartHook,
25
- installPluginManifest, checkAndInstallPiper,
25
+ installPluginManifest, checkAndInstallPiper, ensureGitRepo,
26
26
  } from '../../installer.js';
27
27
 
28
28
  const _execFileAsync = promisify(execFile);
@@ -368,6 +368,7 @@ export function createInstallTab(screen, services) {
368
368
  await copyConfigFiles(targetDir, spinner);
369
369
  await configureSessionStartHook(targetDir, spinner);
370
370
  await installPluginManifest(targetDir, spinner);
371
+ await ensureGitRepo(targetDir, spinner);
371
372
 
372
373
  spinner.start('Writing configuration...');
373
374
  await _writeInstallConfig(targetDir, provider);
@@ -39,6 +39,7 @@ export const TAB_DISPLAY_LABELS = {
39
39
  settings: 'Settings',
40
40
  voices: 'Voices',
41
41
  music: 'Music',
42
+ agents: 'Agents',
42
43
  readme: 'Readme',
43
44
  help: 'Help',
44
45
  install: 'Install',
@@ -122,6 +122,7 @@ export class ConfigService {
122
122
  */
123
123
  saveAllToGlobal(data) {
124
124
  this._writeConfigAtomic(this.getGlobalConfigPath(), data);
125
+ this._syncToTextFiles(path.resolve(this._homeDir, '.claude'), data);
125
126
  }
126
127
 
127
128
  /**
@@ -131,6 +132,7 @@ export class ConfigService {
131
132
  */
132
133
  saveAllToLocal(data) {
133
134
  this._writeConfigAtomic(this.getLocalConfigPath(), data);
135
+ this._syncToTextFiles(path.resolve(this._projectRoot, '.claude'), data);
134
136
  }
135
137
 
136
138
  // ---------------------------------------------------------------------------
@@ -170,6 +172,28 @@ export class ConfigService {
170
172
  // ---------------------------------------------------------------------------
171
173
  // Private helpers
172
174
 
175
+ /**
176
+ * Sync config.json values to .claude/ text files that TTS scripts read.
177
+ * Only writes files that the config has values for. Silently ignores errors.
178
+ * @param {string} claudeDir - Path to .claude/ directory
179
+ * @param {object} data - Config data object
180
+ */
181
+ _syncToTextFiles(claudeDir, data) {
182
+ if (!claudeDir || !data) return;
183
+ try {
184
+ if (!fs.existsSync(claudeDir)) return;
185
+ if (data.voice) {
186
+ fs.writeFileSync(path.join(claudeDir, 'tts-voice.txt'), String(data.voice));
187
+ }
188
+ if (data.provider) {
189
+ fs.writeFileSync(path.join(claudeDir, 'tts-provider.txt'), String(data.provider));
190
+ }
191
+ if (data.verbosity) {
192
+ fs.writeFileSync(path.join(claudeDir, 'tts-verbosity.txt'), String(data.verbosity));
193
+ }
194
+ } catch { /* best-effort sync */ }
195
+ }
196
+
173
197
  /**
174
198
  * Read and parse a JSON config file.
175
199
  * Returns null if the file does not exist or is not a regular file.
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  /** Ordered list of all tab IDs — used for cycling and validation */
10
- export const TAB_ORDER = ['install', 'settings', 'voices', 'music', 'readme', 'help'];
10
+ export const TAB_ORDER = ['install', 'settings', 'voices', 'music', 'agents', 'readme', 'help'];
11
11
 
12
12
  export class NavigationService {
13
13
  /**