voice-mode 4.3.2__tar.gz → 4.5.0__tar.gz

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 (138) hide show
  1. {voice_mode-4.3.2 → voice_mode-4.5.0}/CHANGELOG.md +87 -1
  2. {voice_mode-4.3.2 → voice_mode-4.5.0}/PKG-INFO +36 -41
  3. {voice_mode-4.3.2 → voice_mode-4.5.0}/README.md +35 -40
  4. {voice_mode-4.3.2 → voice_mode-4.5.0}/pyproject.toml +8 -0
  5. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/__version__.py +1 -1
  6. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/cli.py +82 -5
  7. voice_mode-4.5.0/voice_mode/cli_commands/claude.py +15 -0
  8. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/cli_commands/hook.py +13 -16
  9. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/cli_commands/transcribe.py +7 -6
  10. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/config.py +1 -1
  11. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/conversation_logger.py +6 -0
  12. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/core.py +9 -2
  13. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/provider_discovery.py +55 -79
  14. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/providers.py +61 -45
  15. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/simple_failover.py +41 -12
  16. voice_mode-4.5.0/voice_mode/statistics_tracking.py +42 -0
  17. voice_mode-4.5.0/voice_mode/tools/__init__.py +158 -0
  18. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/converse.py +149 -338
  19. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/diagnostics.py +2 -1
  20. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/statistics.py +0 -33
  21. voice_mode-4.5.0/voice_mode/tools/voice_registry.py +62 -0
  22. voice_mode-4.3.2/voice_mode/cli_commands/claude.py +0 -208
  23. voice_mode-4.3.2/voice_mode/tools/__init__.py +0 -24
  24. voice_mode-4.3.2/voice_mode/tools/claude_thinking.py +0 -285
  25. voice_mode-4.3.2/voice_mode/tools/voice_registry.py +0 -66
  26. {voice_mode-4.3.2 → voice_mode-4.5.0}/.gitignore +0 -0
  27. {voice_mode-4.3.2 → voice_mode-4.5.0}/build_hooks.py +0 -0
  28. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/__init__.py +0 -0
  29. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/__main__.py +0 -0
  30. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/cli_commands/__init__.py +0 -0
  31. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/cli_commands/exchanges.py +0 -0
  32. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/cli_commands/pronounce_commands.py +0 -0
  33. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/data/default_pronunciation.yaml +0 -0
  34. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/data/versions.json +0 -0
  35. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/__init__.py +0 -0
  36. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/conversations.py +0 -0
  37. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/filters.py +0 -0
  38. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/formatters.py +0 -0
  39. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/models.py +0 -0
  40. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/reader.py +0 -0
  41. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/exchanges/stats.py +0 -0
  42. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/README.md +0 -0
  43. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/app/api/connection-details/route.ts +0 -0
  44. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/app/favicon.ico +0 -0
  45. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/app/globals.css +0 -0
  46. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/app/layout.tsx +0 -0
  47. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/app/page.tsx +0 -0
  48. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/components/CloseIcon.tsx +0 -0
  49. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/components/NoAgentNotification.tsx +0 -0
  50. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/components/TranscriptionView.tsx +0 -0
  51. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/hooks/useCombinedTranscriptions.ts +0 -0
  52. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/hooks/useLocalMicTrack.ts +0 -0
  53. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/next-env.d.ts +0 -0
  54. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/next.config.mjs +0 -0
  55. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/package-lock.json +0 -0
  56. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/package.json +0 -0
  57. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/pnpm-lock.yaml +0 -0
  58. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/postcss.config.mjs +0 -0
  59. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/tailwind.config.ts +0 -0
  60. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/frontend/tsconfig.json +0 -0
  61. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/prompts/README.md +0 -0
  62. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/prompts/__init__.py +0 -0
  63. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/prompts/converse.py +0 -0
  64. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/prompts/release_notes.py +0 -0
  65. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/prompts/services.py +0 -0
  66. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/pronounce.py +0 -0
  67. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/__init__.py +0 -0
  68. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/audio_files.py +0 -0
  69. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/changelog.py +0 -0
  70. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/configuration.py +0 -0
  71. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/statistics.py +0 -0
  72. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/version.py +0 -0
  73. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/resources/whisper_models.py +0 -0
  74. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/server.py +0 -0
  75. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/shared.py +0 -0
  76. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/statistics.py +0 -0
  77. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/streaming.py +0 -0
  78. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/__init__.py +0 -0
  79. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/launchd/com.voicemode.frontend.plist +0 -0
  80. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/launchd/com.voicemode.kokoro.plist +0 -0
  81. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/launchd/com.voicemode.livekit.plist +0 -0
  82. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/launchd/com.voicemode.whisper.plist +0 -0
  83. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/launchd/start-kokoro-with-health-check.sh +0 -0
  84. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/launchd/start-whisper-with-health-check.sh +0 -0
  85. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/scripts/__init__.py +0 -0
  86. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/scripts/start-whisper-server.sh +0 -0
  87. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/systemd/voicemode-frontend.service +0 -0
  88. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/systemd/voicemode-kokoro.service +0 -0
  89. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/systemd/voicemode-livekit.service +0 -0
  90. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/templates/systemd/voicemode-whisper.service +0 -0
  91. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/configuration_management.py +0 -0
  92. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/dependencies.py +0 -0
  93. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/devices.py +0 -0
  94. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/pronounce.py +0 -0
  95. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/providers.py +0 -0
  96. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/service.py +0 -0
  97. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/kokoro/install.py +0 -0
  98. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/kokoro/uninstall.py +0 -0
  99. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/list_versions.py +0 -0
  100. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/livekit/__init__.py +0 -0
  101. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/livekit/frontend.py +0 -0
  102. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/livekit/install.py +0 -0
  103. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/livekit/production_server.py +0 -0
  104. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/livekit/uninstall.py +0 -0
  105. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/version_info.py +0 -0
  106. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/__init__.py +0 -0
  107. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/install.py +0 -0
  108. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/list_models.py +0 -0
  109. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/model_active.py +0 -0
  110. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/model_benchmark.py +0 -0
  111. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/model_install.py +0 -0
  112. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/model_remove.py +0 -0
  113. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/models.py +0 -0
  114. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/services/whisper/uninstall.py +0 -0
  115. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/sound_fonts/__init__.py +0 -0
  116. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/sound_fonts/audio_player.py +0 -0
  117. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/sound_fonts/hook_handler.py +0 -0
  118. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/sound_fonts/player.py +0 -0
  119. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/transcription/__init__.py +0 -0
  120. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/transcription/backends.py +0 -0
  121. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/transcription/core.py +0 -0
  122. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/transcription/formats.py +0 -0
  123. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/tools/transcription/types.py +0 -0
  124. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/__init__.py +0 -0
  125. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/audio_diagnostics.py +0 -0
  126. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/event_logger.py +0 -0
  127. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/ffmpeg_check.py +0 -0
  128. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/format_migration.py +0 -0
  129. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/gpu_detection.py +0 -0
  130. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/migration_helpers.py +0 -0
  131. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/services/common.py +0 -0
  132. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/services/coreml_setup.py +0 -0
  133. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/services/kokoro_helpers.py +0 -0
  134. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/services/livekit_helpers.py +0 -0
  135. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/services/whisper_helpers.py +0 -0
  136. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/services/whisper_version.py +0 -0
  137. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/utils/version_helpers.py +0 -0
  138. {voice_mode-4.3.2 → voice_mode-4.5.0}/voice_mode/version.py +0 -0
@@ -7,12 +7,98 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [4.5.0] - 2025-09-18
11
+
12
+ ### Added
13
+ - **Enhanced STT Logging**
14
+ - Add comprehensive logging for speech-to-text operations
15
+ - Log provider selection and fallback attempts
16
+ - Include transcription details and provider info in logs
17
+
18
+ - **Configuration Management**
19
+ - Add `voicemode config edit` command for easy configuration file editing
20
+ - Support custom editor selection via --editor flag
21
+ - Automatically open configuration file in default editor
22
+
23
+ - **Tool Environment Variables**
24
+ - Replace VOICEMODE_TOOLS with VOICEMODE_TOOLS_ENABLED and VOICEMODE_TOOLS_DISABLED
25
+ - Allow fine-grained control over tool availability
26
+ - Support comma-separated lists for enabling/disabling specific tools
27
+
28
+ ### Changed
29
+ - **Provider Selection Architecture**
30
+ - Consolidate dual provider selection systems into single simple failover approach
31
+ - Remove SIMPLE_FAILOVER configuration - simple failover is now the only mode
32
+ - Simplify get_tts_config and get_stt_config to use direct configuration
33
+ - Eliminate ~400 lines of unused provider registry selection logic
34
+ - Provider registry now only stores endpoint info without complex selection
35
+
36
+ ### Fixed
37
+ - Disable OpenAI client retries for local endpoints to avoid delays
38
+ - Fix logger name consistency (voicemode vs voice-mode) for STT logging
39
+ - Prevent test_installers from killing running voice services during tests
40
+ - Update tests to work with refactored provider system
41
+ - Resolve test failures related to new environment variables
42
+
43
+ ## [4.4.0] - 2025-09-10
44
+
45
+ ### Added
46
+ - **MCP Registry Support**
47
+ - Add server.json configuration for MCP registry publication
48
+ - Add mcp-name field to README for PyPI package validation
49
+ - Integrate MCP registry publishing into CI/CD workflow
50
+ - Support DNS-based namespace authentication (com.failmode/voicemode)
51
+ - Update Makefile to sync server.json version during releases
52
+
53
+ - **Cloudflare Worker for voicemode.sh**
54
+ - Serve install script via custom domain
55
+ - Smart user-agent detection for CLI vs browser
56
+ - Cached script delivery with fallback
57
+
58
+ - **Selective Tool Loading**
59
+ - Reduce token usage by loading tools on demand
60
+ - Implement smart tool filtering based on context
61
+ - Add tool loading configuration options
62
+
63
+ - **Documentation Improvements**
64
+ - Complete documentation reorganization
65
+ - Add tutorials, guides, and reference sections
66
+ - Improve getting-started guide with clear paths
67
+ - Add universal installer as primary quick start
68
+ - Archive outdated documentation
69
+
70
+ - **Three Bears Agent Support**
71
+ - Add baby-bear, mama-bear, and papa-bear agent configurations
72
+ - Integrate with sound fonts for agent-specific audio feedback
73
+
74
+ ### Changed
75
+ - Consolidate PyPI and MCP Registry publishing workflows
76
+ - Update branch references from 'main' to 'master'
77
+ - Improve Cloudflare Worker error handling and caching
78
+ - Rename hook to hooks, stdin-receiver to receiver
79
+
80
+ ### Fixed
81
+ - Fix broken documentation links after refactor
82
+ - Restore minimal claude command group for hook support
83
+ - Fix Claude settings.json path configuration
84
+
10
85
  ## [4.3.2] - 2025-09-03
11
86
 
87
+ ### Fixed
88
+ - Add missing pyyaml dependency to pyproject.toml
89
+ - Remove macOS-only restriction from package
90
+ - Add Claude hooks configuration to repository settings
91
+
12
92
  ## [4.3.1] - 2025-09-03
13
93
 
94
+ ### Fixed
95
+ - Minor bug fixes and improvements
96
+
14
97
  ## [4.3.0] - 2025-09-03
15
98
 
99
+ ### Added
100
+ - Sound fonts with MP3 support and Three Bears sounds integration
101
+
16
102
  ## [4.2.0] - 2025-09-03
17
103
 
18
104
  ### Added
@@ -26,7 +112,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
26
112
  - **🔊 Sound Fonts Integration - Audio Feedback for Every Action**
27
113
  - Play custom sounds for tool operations, errors, and completions
28
114
  - Filesystem-based sound font system with automatic discovery
29
- - Claude Code integration via stdin-receiver for hook-based audio
115
+ - Claude Code integration via receiver for hook-based audio
30
116
  - CLI command `play-sound` with theme, action, and sound selection
31
117
  - Enhances user experience with auditory feedback during operations
32
118
  - MP3 support added for 90% file size reduction over WAV
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-mode
3
- Version: 4.3.2
3
+ Version: 4.5.0
4
4
  Summary: VoiceMode - Voice interaction capabilities for AI assistants (formerly voice-mcp)
5
5
  Project-URL: Homepage, https://github.com/mbailey/voicemode
6
6
  Project-URL: Repository, https://github.com/mbailey/voicemode
@@ -78,6 +78,8 @@ Description-Content-Type: text/markdown
78
78
 
79
79
  # Voice Mode
80
80
 
81
+ mcp-name: com.failmode/voicemode
82
+
81
83
  > **Install via:** `uvx voice-mode` | `pip install voice-mode` | [getvoicemode.com](https://getvoicemode.com)
82
84
 
83
85
  [![PyPI Downloads](https://static.pepy.tech/badge/voice-mode)](https://pepy.tech/project/voice-mode)
@@ -113,7 +115,7 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
113
115
 
114
116
  ## Quick Start
115
117
 
116
- > 📖 **Using a different tool?** See our [Integration Guides](docs/integrations/README.md) for Cursor, VS Code, Gemini CLI, and more!
118
+ > 📖 **Using a different tool?** See our [Getting Started Guide](docs/tutorials/getting-started.md) for setup instructions!
117
119
 
118
120
  ### Automatic Installation (Recommended)
119
121
 
@@ -140,7 +142,7 @@ This installer will:
140
142
 
141
143
  ### Manual Installation
142
144
 
143
- For manual setup steps, see the [Claude Code Integration Guide](docs/integrations/claude-code/README.md).
145
+ For manual setup steps, see the [Getting Started Guide](docs/tutorials/getting-started.md).
144
146
 
145
147
  ## 🎬 Demo
146
148
 
@@ -180,16 +182,16 @@ The `converse` function makes voice interactions natural - it automatically wait
180
182
 
181
183
  Voice Mode works with your favorite AI coding assistants:
182
184
 
183
- - 🤖 **[Claude Code](docs/integrations/claude-code/README.md)** - Anthropic's official CLI
184
- - 🖥️ **[Claude Desktop](docs/integrations/claude-desktop/README.md)** - Desktop application
185
- - 🌟 **[Gemini CLI](docs/integrations/gemini-cli/README.md)** - Google's CLI tool
186
- - ⚡ **[Cursor](docs/integrations/cursor/README.md)** - AI-first code editor
187
- - 💻 **[VS Code](docs/integrations/vscode/README.md)** - With MCP preview support
188
- - 🦘 **[Roo Code](docs/integrations/roo-code/README.md)** - AI dev team in VS Code
189
- - 🔧 **[Cline](docs/integrations/cline/README.md)** - Autonomous coding agent
190
- - ⚡ **[Zed](docs/integrations/zed/README.md)** - High-performance editor
191
- - 🏄 **[Windsurf](docs/integrations/windsurf/README.md)** - Agentic IDE by Codeium
192
- - 🔄 **[Continue](docs/integrations/continue/README.md)** - Open-source AI assistant
185
+ - 🤖 **Claude Code** - Anthropic's official CLI
186
+ - 🖥️ **Claude Desktop** - Desktop application
187
+ - 🌟 **Gemini CLI** - Google's CLI tool
188
+ - ⚡ **Cursor** - AI-first code editor
189
+ - 💻 **VS Code** - With MCP preview support
190
+ - 🦘 **Roo Code** - AI dev team in VS Code
191
+ - 🔧 **Cline** - Autonomous coding agent
192
+ - ⚡ **Zed** - High-performance editor
193
+ - 🏄 **Windsurf** - Agentic IDE by Codeium
194
+ - 🔄 **Continue** - Open-source AI assistant
193
195
 
194
196
  ## Installation
195
197
 
@@ -208,7 +210,7 @@ sudo apt update
208
210
  sudo apt install -y python3-dev libasound2-dev libasound2-plugins libportaudio2 portaudio19-dev ffmpeg pulseaudio pulseaudio-utils
209
211
  ```
210
212
 
211
- **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access. See our [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md) if you encounter issues.
213
+ **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
212
214
  </details>
213
215
 
214
216
  <details>
@@ -259,9 +261,12 @@ claude mcp add --scope user voice-mode uvx voice-mode
259
261
  # Using Claude Code with Nix (NixOS)
260
262
  claude mcp add voice-mode nix run github:mbailey/voicemode
261
263
 
262
- # Using UV
264
+ # Using UV (recommended)
263
265
  uvx voice-mode
264
266
 
267
+ # For cleanest experience with UV (no deprecation warnings):
268
+ UV_PYTHON=python3.13 uvx voice-mode
269
+
265
270
  # Using pip
266
271
  pip install voice-mode
267
272
 
@@ -271,7 +276,7 @@ nix run github:mbailey/voicemode
271
276
 
272
277
  ### Configuration for AI Coding Assistants
273
278
 
274
- > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Integration Guides](docs/integrations/README.md) for step-by-step instructions for each tool!
279
+ > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Getting Started Guide](docs/tutorials/getting-started.md) for step-by-step instructions!
275
280
 
276
281
  Below are quick configuration snippets. For full installation and setup instructions, see the integration guides above.
277
282
 
@@ -549,12 +554,12 @@ nix run github:mbailey/voicemode
549
554
 
550
555
  **Note:** The `converse` tool is the primary interface for voice interactions, combining speaking and listening in a natural flow.
551
556
 
552
- **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally. See [Installation Tools Documentation](docs/installation-tools.md) for detailed usage.
557
+ **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
553
558
 
554
559
  ## Configuration
555
560
 
556
- - 📖 **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for each tool
557
- - 🔧 **[Configuration Reference](docs/configuration.md)** - All environment variables
561
+ - 📖 **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup guide
562
+ - 🔧 **[Configuration Reference](docs/guides/configuration.md)** - All environment variables
558
563
  - 📁 **[Config Examples](config-examples/)** - Ready-to-use configuration files
559
564
 
560
565
  ### Quick Setup
@@ -616,8 +621,8 @@ The audio format is automatically validated against provider capabilities and wi
616
621
 
617
622
  For privacy-focused or offline usage, Voice Mode supports local speech services:
618
623
 
619
- - **[Whisper.cpp](docs/whisper.cpp.md)** - Local speech-to-text with OpenAI-compatible API
620
- - **[Kokoro](docs/kokoro.md)** - Local text-to-speech with multiple voice options
624
+ - **[Whisper.cpp](docs/guides/whisper-setup.md)** - Local speech-to-text with OpenAI-compatible API
625
+ - **[Kokoro](docs/guides/kokoro-setup.md)** - Local text-to-speech with multiple voice options
621
626
 
622
627
  These services provide the same API interface as OpenAI, allowing seamless switching between cloud and local processing.
623
628
 
@@ -663,7 +668,7 @@ The OpenAI SDK handles this automatically - no Voice Mode configuration needed!
663
668
  ### Common Issues
664
669
 
665
670
  - **No microphone access**: Check system permissions for terminal/application
666
- - **WSL2 Users**: See [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md)
671
+ - **WSL2 Users**: Additional audio packages (pulseaudio, libasound2-plugins) required for microphone access
667
672
  - **UV not found**: Install with `curl -LsSf https://astral.sh/uv/install.sh | sh`
668
673
  - **OpenAI API error**: Verify your `OPENAI_API_KEY` is set correctly
669
674
  - **No audio output**: Check system audio settings and available devices
@@ -703,24 +708,17 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
703
708
  📚 **[Read the full documentation at voice-mode.readthedocs.io](https://voice-mode.readthedocs.io)**
704
709
 
705
710
  ### Getting Started
706
- - **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for all supported tools
707
- - **[Configuration Guide](docs/configuration.md)** - Complete environment variable reference
711
+ - **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup for all supported tools
712
+ - **[Configuration Guide](docs/guides/configuration.md)** - Complete environment variable reference
708
713
 
709
714
  ### Development
710
- - **[Using uv/uvx](docs/uv.md)** - Package management with uv and uvx
711
- - **[Local Development](docs/local-development-uvx.md)** - Development setup guide
712
- - **[Audio Formats](docs/audio-format-migration.md)** - Audio format configuration and migration
713
- - **[Statistics Dashboard](docs/statistics-dashboard.md)** - Performance monitoring and metrics
715
+ - **[Development Setup](docs/tutorials/development-setup.md)** - Local development guide
714
716
 
715
717
  ### Service Guides
716
- - **[Whisper.cpp Setup](docs/whisper.cpp.md)** - Local speech-to-text configuration
717
- - **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
718
- - **[Service Health Checks](docs/service-health-checks.md)** - Service readiness and health monitoring
719
- - **[LiveKit Integration](docs/livekit/README.md)** - Real-time voice communication
718
+ - **[Whisper.cpp Setup](docs/guides/whisper-setup.md)** - Local speech-to-text configuration
719
+ - **[Kokoro Setup](docs/guides/kokoro-setup.md)** - Local text-to-speech configuration
720
+ - **[LiveKit Integration](docs/guides/livekit-setup.md)** - Real-time voice communication
720
721
 
721
- ### Troubleshooting
722
- - **[WSL2 Microphone Access](docs/troubleshooting/wsl2-microphone-access.md)** - WSL2 audio setup
723
- - **[Migration Guide](docs/migration-guide.md)** - Upgrading from older versions
724
722
 
725
723
  ## Links
726
724
 
@@ -738,15 +736,12 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
738
736
 
739
737
  ## See Also
740
738
 
741
- - 🚀 [Integration Guides](docs/integrations/README.md) - Setup instructions for all supported tools
742
- - 🔧 [Configuration Reference](docs/configuration.md) - Environment variables and options
743
- - 🎤 [Local Services Setup](docs/kokoro.md) - Run TTS/STT locally for privacy
744
- - 🐛 [Troubleshooting](docs/troubleshooting/README.md) - Common issues and solutions
739
+ - 🚀 [Getting Started](docs/tutorials/getting-started.md) - Setup instructions for all supported tools
740
+ - 🔧 [Configuration Reference](docs/guides/configuration.md) - Environment variables and options
741
+ - 🎤 [Local Services Setup](docs/guides/kokoro-setup.md) - Run TTS/STT locally for privacy
745
742
 
746
743
  ## License
747
744
 
748
745
  MIT - A [Failmode](https://failmode.com) Project
749
746
 
750
747
  ---
751
-
752
- <sub>[Project Statistics](docs/project-stats/README.md)</sub>
@@ -1,5 +1,7 @@
1
1
  # Voice Mode
2
2
 
3
+ mcp-name: com.failmode/voicemode
4
+
3
5
  > **Install via:** `uvx voice-mode` | `pip install voice-mode` | [getvoicemode.com](https://getvoicemode.com)
4
6
 
5
7
  [![PyPI Downloads](https://static.pepy.tech/badge/voice-mode)](https://pepy.tech/project/voice-mode)
@@ -35,7 +37,7 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
35
37
 
36
38
  ## Quick Start
37
39
 
38
- > 📖 **Using a different tool?** See our [Integration Guides](docs/integrations/README.md) for Cursor, VS Code, Gemini CLI, and more!
40
+ > 📖 **Using a different tool?** See our [Getting Started Guide](docs/tutorials/getting-started.md) for setup instructions!
39
41
 
40
42
  ### Automatic Installation (Recommended)
41
43
 
@@ -62,7 +64,7 @@ This installer will:
62
64
 
63
65
  ### Manual Installation
64
66
 
65
- For manual setup steps, see the [Claude Code Integration Guide](docs/integrations/claude-code/README.md).
67
+ For manual setup steps, see the [Getting Started Guide](docs/tutorials/getting-started.md).
66
68
 
67
69
  ## 🎬 Demo
68
70
 
@@ -102,16 +104,16 @@ The `converse` function makes voice interactions natural - it automatically wait
102
104
 
103
105
  Voice Mode works with your favorite AI coding assistants:
104
106
 
105
- - 🤖 **[Claude Code](docs/integrations/claude-code/README.md)** - Anthropic's official CLI
106
- - 🖥️ **[Claude Desktop](docs/integrations/claude-desktop/README.md)** - Desktop application
107
- - 🌟 **[Gemini CLI](docs/integrations/gemini-cli/README.md)** - Google's CLI tool
108
- - ⚡ **[Cursor](docs/integrations/cursor/README.md)** - AI-first code editor
109
- - 💻 **[VS Code](docs/integrations/vscode/README.md)** - With MCP preview support
110
- - 🦘 **[Roo Code](docs/integrations/roo-code/README.md)** - AI dev team in VS Code
111
- - 🔧 **[Cline](docs/integrations/cline/README.md)** - Autonomous coding agent
112
- - ⚡ **[Zed](docs/integrations/zed/README.md)** - High-performance editor
113
- - 🏄 **[Windsurf](docs/integrations/windsurf/README.md)** - Agentic IDE by Codeium
114
- - 🔄 **[Continue](docs/integrations/continue/README.md)** - Open-source AI assistant
107
+ - 🤖 **Claude Code** - Anthropic's official CLI
108
+ - 🖥️ **Claude Desktop** - Desktop application
109
+ - 🌟 **Gemini CLI** - Google's CLI tool
110
+ - ⚡ **Cursor** - AI-first code editor
111
+ - 💻 **VS Code** - With MCP preview support
112
+ - 🦘 **Roo Code** - AI dev team in VS Code
113
+ - 🔧 **Cline** - Autonomous coding agent
114
+ - ⚡ **Zed** - High-performance editor
115
+ - 🏄 **Windsurf** - Agentic IDE by Codeium
116
+ - 🔄 **Continue** - Open-source AI assistant
115
117
 
116
118
  ## Installation
117
119
 
@@ -130,7 +132,7 @@ sudo apt update
130
132
  sudo apt install -y python3-dev libasound2-dev libasound2-plugins libportaudio2 portaudio19-dev ffmpeg pulseaudio pulseaudio-utils
131
133
  ```
132
134
 
133
- **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access. See our [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md) if you encounter issues.
135
+ **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
134
136
  </details>
135
137
 
136
138
  <details>
@@ -181,9 +183,12 @@ claude mcp add --scope user voice-mode uvx voice-mode
181
183
  # Using Claude Code with Nix (NixOS)
182
184
  claude mcp add voice-mode nix run github:mbailey/voicemode
183
185
 
184
- # Using UV
186
+ # Using UV (recommended)
185
187
  uvx voice-mode
186
188
 
189
+ # For cleanest experience with UV (no deprecation warnings):
190
+ UV_PYTHON=python3.13 uvx voice-mode
191
+
187
192
  # Using pip
188
193
  pip install voice-mode
189
194
 
@@ -193,7 +198,7 @@ nix run github:mbailey/voicemode
193
198
 
194
199
  ### Configuration for AI Coding Assistants
195
200
 
196
- > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Integration Guides](docs/integrations/README.md) for step-by-step instructions for each tool!
201
+ > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Getting Started Guide](docs/tutorials/getting-started.md) for step-by-step instructions!
197
202
 
198
203
  Below are quick configuration snippets. For full installation and setup instructions, see the integration guides above.
199
204
 
@@ -471,12 +476,12 @@ nix run github:mbailey/voicemode
471
476
 
472
477
  **Note:** The `converse` tool is the primary interface for voice interactions, combining speaking and listening in a natural flow.
473
478
 
474
- **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally. See [Installation Tools Documentation](docs/installation-tools.md) for detailed usage.
479
+ **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
475
480
 
476
481
  ## Configuration
477
482
 
478
- - 📖 **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for each tool
479
- - 🔧 **[Configuration Reference](docs/configuration.md)** - All environment variables
483
+ - 📖 **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup guide
484
+ - 🔧 **[Configuration Reference](docs/guides/configuration.md)** - All environment variables
480
485
  - 📁 **[Config Examples](config-examples/)** - Ready-to-use configuration files
481
486
 
482
487
  ### Quick Setup
@@ -538,8 +543,8 @@ The audio format is automatically validated against provider capabilities and wi
538
543
 
539
544
  For privacy-focused or offline usage, Voice Mode supports local speech services:
540
545
 
541
- - **[Whisper.cpp](docs/whisper.cpp.md)** - Local speech-to-text with OpenAI-compatible API
542
- - **[Kokoro](docs/kokoro.md)** - Local text-to-speech with multiple voice options
546
+ - **[Whisper.cpp](docs/guides/whisper-setup.md)** - Local speech-to-text with OpenAI-compatible API
547
+ - **[Kokoro](docs/guides/kokoro-setup.md)** - Local text-to-speech with multiple voice options
543
548
 
544
549
  These services provide the same API interface as OpenAI, allowing seamless switching between cloud and local processing.
545
550
 
@@ -585,7 +590,7 @@ The OpenAI SDK handles this automatically - no Voice Mode configuration needed!
585
590
  ### Common Issues
586
591
 
587
592
  - **No microphone access**: Check system permissions for terminal/application
588
- - **WSL2 Users**: See [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md)
593
+ - **WSL2 Users**: Additional audio packages (pulseaudio, libasound2-plugins) required for microphone access
589
594
  - **UV not found**: Install with `curl -LsSf https://astral.sh/uv/install.sh | sh`
590
595
  - **OpenAI API error**: Verify your `OPENAI_API_KEY` is set correctly
591
596
  - **No audio output**: Check system audio settings and available devices
@@ -625,24 +630,17 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
625
630
  📚 **[Read the full documentation at voice-mode.readthedocs.io](https://voice-mode.readthedocs.io)**
626
631
 
627
632
  ### Getting Started
628
- - **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for all supported tools
629
- - **[Configuration Guide](docs/configuration.md)** - Complete environment variable reference
633
+ - **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup for all supported tools
634
+ - **[Configuration Guide](docs/guides/configuration.md)** - Complete environment variable reference
630
635
 
631
636
  ### Development
632
- - **[Using uv/uvx](docs/uv.md)** - Package management with uv and uvx
633
- - **[Local Development](docs/local-development-uvx.md)** - Development setup guide
634
- - **[Audio Formats](docs/audio-format-migration.md)** - Audio format configuration and migration
635
- - **[Statistics Dashboard](docs/statistics-dashboard.md)** - Performance monitoring and metrics
637
+ - **[Development Setup](docs/tutorials/development-setup.md)** - Local development guide
636
638
 
637
639
  ### Service Guides
638
- - **[Whisper.cpp Setup](docs/whisper.cpp.md)** - Local speech-to-text configuration
639
- - **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
640
- - **[Service Health Checks](docs/service-health-checks.md)** - Service readiness and health monitoring
641
- - **[LiveKit Integration](docs/livekit/README.md)** - Real-time voice communication
640
+ - **[Whisper.cpp Setup](docs/guides/whisper-setup.md)** - Local speech-to-text configuration
641
+ - **[Kokoro Setup](docs/guides/kokoro-setup.md)** - Local text-to-speech configuration
642
+ - **[LiveKit Integration](docs/guides/livekit-setup.md)** - Real-time voice communication
642
643
 
643
- ### Troubleshooting
644
- - **[WSL2 Microphone Access](docs/troubleshooting/wsl2-microphone-access.md)** - WSL2 audio setup
645
- - **[Migration Guide](docs/migration-guide.md)** - Upgrading from older versions
646
644
 
647
645
  ## Links
648
646
 
@@ -660,15 +658,12 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
660
658
 
661
659
  ## See Also
662
660
 
663
- - 🚀 [Integration Guides](docs/integrations/README.md) - Setup instructions for all supported tools
664
- - 🔧 [Configuration Reference](docs/configuration.md) - Environment variables and options
665
- - 🎤 [Local Services Setup](docs/kokoro.md) - Run TTS/STT locally for privacy
666
- - 🐛 [Troubleshooting](docs/troubleshooting/README.md) - Common issues and solutions
661
+ - 🚀 [Getting Started](docs/tutorials/getting-started.md) - Setup instructions for all supported tools
662
+ - 🔧 [Configuration Reference](docs/guides/configuration.md) - Environment variables and options
663
+ - 🎤 [Local Services Setup](docs/guides/kokoro-setup.md) - Run TTS/STT locally for privacy
667
664
 
668
665
  ## License
669
666
 
670
667
  MIT - A [Failmode](https://failmode.com) Project
671
668
 
672
669
  ---
673
-
674
- <sub>[Project Statistics](docs/project-stats/README.md)</sub>
@@ -210,3 +210,11 @@ directory = "htmlcov"
210
210
 
211
211
  [tool.coverage.xml]
212
212
  output = "coverage.xml"
213
+
214
+ [dependency-groups]
215
+ dev = [
216
+ "pytest>=8.4.2",
217
+ "pytest-asyncio>=1.2.0",
218
+ "pytest-cov>=7.0.0",
219
+ "pytest-mock>=3.15.0",
220
+ ]
@@ -1,3 +1,3 @@
1
1
  # This file is automatically updated by 'make release'
2
2
  # Do not edit manually
3
- __version__ = "4.3.2"
3
+ __version__ = "4.5.0"
@@ -5,6 +5,8 @@ import asyncio
5
5
  import sys
6
6
  import os
7
7
  import warnings
8
+ import subprocess
9
+ import shutil
8
10
  import click
9
11
 
10
12
 
@@ -30,10 +32,12 @@ if not os.environ.get('VOICEMODE_DEBUG', '').lower() in ('true', '1', 'yes'):
30
32
  @click.version_option()
31
33
  @click.help_option('-h', '--help', help='Show this message and exit')
32
34
  @click.option('--debug', is_flag=True, help='Enable debug mode and show all warnings')
35
+ @click.option('--tools-enabled', help='Comma-separated list of tools to enable (whitelist)')
36
+ @click.option('--tools-disabled', help='Comma-separated list of tools to disable (blacklist)')
33
37
  @click.pass_context
34
- def voice_mode_main_cli(ctx, debug):
38
+ def voice_mode_main_cli(ctx, debug, tools_enabled, tools_disabled):
35
39
  """Voice Mode - MCP server and service management.
36
-
40
+
37
41
  Without arguments, starts the MCP server.
38
42
  With subcommands, executes service management operations.
39
43
  """
@@ -44,7 +48,13 @@ def voice_mode_main_cli(ctx, debug):
44
48
  # Re-enable INFO logging
45
49
  import logging
46
50
  logging.getLogger("voice-mode").setLevel(logging.INFO)
47
-
51
+
52
+ # Set environment variables from CLI args
53
+ if tools_enabled:
54
+ os.environ['VOICEMODE_TOOLS_ENABLED'] = tools_enabled
55
+ if tools_disabled:
56
+ os.environ['VOICEMODE_TOOLS_DISABLED'] = tools_disabled
57
+
48
58
  if ctx.invoked_subcommand is None:
49
59
  # No subcommand - run MCP server
50
60
  # Note: warnings are already suppressed at module level unless debug is enabled
@@ -1277,6 +1287,72 @@ def config_set(key, value):
1277
1287
  click.echo(result)
1278
1288
 
1279
1289
 
1290
+ @config.command("edit")
1291
+ @click.help_option('-h', '--help')
1292
+ @click.option('--editor', help='Editor to use (overrides $EDITOR)')
1293
+ def config_edit(editor):
1294
+ """Open the configuration file in your default editor.
1295
+
1296
+ Opens ~/.voicemode/voicemode.env in your configured editor.
1297
+ Uses $EDITOR environment variable by default, or you can specify with --editor.
1298
+
1299
+ Examples:
1300
+ voicemode config edit # Use $EDITOR
1301
+ voicemode config edit --editor vim
1302
+ voicemode config edit --editor "code --wait"
1303
+ """
1304
+ from pathlib import Path
1305
+
1306
+ # Find the config file
1307
+ config_path = Path.home() / ".voicemode" / "voicemode.env"
1308
+
1309
+ # Create default config if it doesn't exist
1310
+ if not config_path.exists():
1311
+ config_path.parent.mkdir(parents=True, exist_ok=True)
1312
+ from voice_mode.config import load_voicemode_env
1313
+ # This will create the default config
1314
+ load_voicemode_env()
1315
+
1316
+ # Determine which editor to use
1317
+ if editor:
1318
+ editor_cmd = editor
1319
+ else:
1320
+ # Try environment variables in order of preference
1321
+ editor_cmd = (
1322
+ os.environ.get('EDITOR') or
1323
+ os.environ.get('VISUAL') or
1324
+ shutil.which('nano') or
1325
+ shutil.which('vim') or
1326
+ shutil.which('vi')
1327
+ )
1328
+
1329
+ if not editor_cmd:
1330
+ click.echo("❌ No editor found. Please set $EDITOR or use --editor")
1331
+ click.echo(" Example: export EDITOR=vim")
1332
+ click.echo(" Or use: voicemode config edit --editor vim")
1333
+ return
1334
+
1335
+ # Handle complex editor commands (e.g., "code --wait")
1336
+ if ' ' in editor_cmd:
1337
+ import shlex
1338
+ cmd_parts = shlex.split(editor_cmd)
1339
+ cmd = cmd_parts + [str(config_path)]
1340
+ else:
1341
+ cmd = [editor_cmd, str(config_path)]
1342
+
1343
+ # Open the editor
1344
+ try:
1345
+ click.echo(f"Opening {config_path} in {editor_cmd}...")
1346
+ subprocess.run(cmd, check=True)
1347
+ click.echo("✅ Configuration file edited successfully")
1348
+ click.echo("\nChanges will take effect when voicemode is restarted.")
1349
+ except subprocess.CalledProcessError:
1350
+ click.echo(f"❌ Editor exited with an error")
1351
+ except FileNotFoundError:
1352
+ click.echo(f"❌ Editor not found: {editor_cmd}")
1353
+ click.echo(" Please check that the editor is installed and in your PATH")
1354
+
1355
+
1280
1356
  # Diagnostics group
1281
1357
  @voice_mode_main_cli.group()
1282
1358
  @click.help_option('-h', '--help', help='Show this message and exit')
@@ -1394,8 +1470,9 @@ transcribe_audio_cmd = transcribe_cmd.transcribe.commands['audio']
1394
1470
  transcribe_audio_cmd.name = 'transcribe'
1395
1471
  audio.add_command(transcribe_audio_cmd)
1396
1472
 
1397
- # Add hook command under claude group
1398
- claude.claude_group.add_command(hook_cmd.hook)
1473
+ # Add hooks command under claude group
1474
+ from voice_mode.cli_commands.hook import hooks
1475
+ claude.claude_group.add_command(hooks)
1399
1476
 
1400
1477
  # Add pronounce under config group
1401
1478
  config.add_command(pronounce_commands.pronounce_group)
@@ -0,0 +1,15 @@
1
+ """CLI commands for Claude-related functionality."""
2
+
3
+ import click
4
+
5
+
6
+ @click.group(name='claude')
7
+ def claude_group():
8
+ """Claude-related commands."""
9
+ pass
10
+
11
+
12
+ @click.group(name='hooks')
13
+ def hooks_group():
14
+ """Manage Voice Mode hooks and event handlers for Claude Code."""
15
+ pass