verbalcoding 0.2.11 → 0.2.13

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 (235) hide show
  1. package/.env.example +98 -2
  2. package/README.es.md +134 -0
  3. package/README.fr.md +134 -0
  4. package/README.ja.md +134 -0
  5. package/README.ko.md +134 -0
  6. package/README.md +118 -74
  7. package/README.ru.md +134 -0
  8. package/README.zh.md +133 -0
  9. package/app-node/agent_adapters.mjs +37 -5
  10. package/app-node/agent_adapters.test.mjs +27 -1
  11. package/app-node/agent_detect.mjs +73 -0
  12. package/app-node/agent_detect.test.mjs +77 -0
  13. package/app-node/agent_routing.mjs +148 -0
  14. package/app-node/agent_routing.test.mjs +138 -0
  15. package/app-node/agent_turn.mjs +86 -0
  16. package/app-node/agent_turn.test.mjs +109 -0
  17. package/app-node/bridge_context.mjs +73 -0
  18. package/app-node/bridge_context.test.mjs +54 -0
  19. package/app-node/bridge_state.mjs +4 -0
  20. package/app-node/bridge_wireup.test.mjs +462 -0
  21. package/app-node/cli_install.test.mjs +31 -0
  22. package/app-node/cross_agent_routing.test.mjs +78 -0
  23. package/app-node/discord_command_router.mjs +204 -0
  24. package/app-node/discord_command_router.test.mjs +311 -0
  25. package/app-node/discord_voice_setup.mjs +251 -0
  26. package/app-node/discord_voice_setup.test.mjs +86 -0
  27. package/app-node/hermes_profiles.test.mjs +12 -1
  28. package/app-node/install_config.mjs +113 -3
  29. package/app-node/install_config.test.mjs +8 -0
  30. package/app-node/instance_doctor.test.mjs +9 -0
  31. package/app-node/instances.test.mjs +8 -1
  32. package/app-node/main.mjs +513 -1058
  33. package/app-node/mcp_tools.test.mjs +7 -0
  34. package/app-node/notification_handler.mjs +89 -0
  35. package/app-node/notification_handler.test.mjs +187 -0
  36. package/app-node/notify.mjs +73 -0
  37. package/app-node/notify.test.mjs +68 -0
  38. package/app-node/plan_dispatcher.mjs +215 -0
  39. package/app-node/plan_dispatcher.test.mjs +101 -0
  40. package/app-node/plan_mode.mjs +203 -0
  41. package/app-node/plan_mode.test.mjs +231 -0
  42. package/app-node/progress_handler.mjs +220 -0
  43. package/app-node/progress_handler.test.mjs +193 -0
  44. package/app-node/progress_speech.mjs +54 -32
  45. package/app-node/progress_speech.test.mjs +12 -3
  46. package/app-node/project_sessions.mjs +5 -2
  47. package/app-node/project_sessions.test.mjs +7 -0
  48. package/app-node/research_mode.mjs +282 -0
  49. package/app-node/research_mode.test.mjs +264 -0
  50. package/app-node/restart_notice.mjs +3 -0
  51. package/app-node/restart_notice.test.mjs +11 -0
  52. package/app-node/session_ontology.mjs +271 -0
  53. package/app-node/session_ontology.test.mjs +130 -0
  54. package/app-node/smart_progress.mjs +94 -0
  55. package/app-node/smart_progress.test.mjs +66 -0
  56. package/app-node/stream_sentencer.mjs +91 -0
  57. package/app-node/stream_sentencer.test.mjs +129 -0
  58. package/app-node/streaming_tts_queue.mjs +52 -0
  59. package/app-node/streaming_tts_queue.test.mjs +64 -0
  60. package/app-node/stt_whisper.mjs +24 -0
  61. package/app-node/stt_whisper.test.mjs +32 -0
  62. package/app-node/text_routing.mjs +22 -0
  63. package/app-node/text_routing.test.mjs +23 -1
  64. package/app-node/tts_backends.mjs +537 -3
  65. package/app-node/tts_backends.test.mjs +454 -0
  66. package/app-node/tts_player.mjs +164 -0
  67. package/app-node/tts_player.test.mjs +202 -0
  68. package/app-node/tts_runtime.mjs +134 -0
  69. package/app-node/tts_runtime.test.mjs +89 -0
  70. package/app-node/tts_settings.mjs +150 -3
  71. package/app-node/tts_settings.test.mjs +204 -0
  72. package/app-node/tts_voice_config.mjs +136 -2
  73. package/app-node/tts_voice_config.test.mjs +94 -0
  74. package/app-node/utterance_router.mjs +216 -0
  75. package/app-node/utterance_router.test.mjs +236 -0
  76. package/app-node/voice_autojoin.mjs +37 -0
  77. package/app-node/voice_autojoin.test.mjs +59 -0
  78. package/app-node/voice_io.mjs +272 -0
  79. package/app-node/voice_io.test.mjs +102 -0
  80. package/app-node/voice_turn_runner.mjs +449 -0
  81. package/app-node/voice_turn_runner.test.mjs +289 -0
  82. package/docs/CONFIGURATION.md +79 -96
  83. package/docs/FRESH_INSTALL.md +105 -63
  84. package/docs/HARNESSES.md +58 -0
  85. package/docs/HARNESS_AIDER.md +50 -0
  86. package/docs/HARNESS_CLAUDE.md +56 -0
  87. package/docs/HARNESS_CODEX.md +56 -0
  88. package/docs/HARNESS_CURSOR.md +45 -0
  89. package/docs/HARNESS_GEMINI.md +45 -0
  90. package/docs/HARNESS_HERMES.md +57 -0
  91. package/docs/HARNESS_OPENCLAW.md +44 -0
  92. package/docs/HARNESS_OPENCODE.md +44 -0
  93. package/docs/HERMES_VOICE.md +65 -0
  94. package/docs/MULTI_INSTANCE.md +16 -0
  95. package/docs/README.md +50 -0
  96. package/docs/RELEASE.md +42 -19
  97. package/docs/ROADMAP.md +53 -0
  98. package/docs/TROUBLESHOOTING.md +126 -0
  99. package/docs/TTS_BACKENDS.md +227 -0
  100. package/docs/USAGE.md +94 -40
  101. package/docs/assets/figures/verbalcoding-flow.svg +1 -1
  102. package/docs/i18n/AGENTS.es.md +34 -0
  103. package/docs/i18n/AGENTS.fr.md +34 -0
  104. package/docs/i18n/AGENTS.ja.md +34 -0
  105. package/docs/i18n/AGENTS.ko.md +34 -0
  106. package/docs/i18n/AGENTS.ru.md +34 -0
  107. package/docs/i18n/AGENTS.zh.md +34 -0
  108. package/docs/i18n/CONFIGURATION.es.md +25 -0
  109. package/docs/i18n/CONFIGURATION.fr.md +25 -0
  110. package/docs/i18n/CONFIGURATION.ja.md +25 -0
  111. package/docs/i18n/CONFIGURATION.ko.md +25 -0
  112. package/docs/i18n/CONFIGURATION.ru.md +25 -0
  113. package/docs/i18n/CONFIGURATION.zh.md +25 -0
  114. package/docs/i18n/FRESH_INSTALL.es.md +27 -2
  115. package/docs/i18n/FRESH_INSTALL.fr.md +27 -2
  116. package/docs/i18n/FRESH_INSTALL.ja.md +27 -2
  117. package/docs/i18n/FRESH_INSTALL.ko.md +27 -2
  118. package/docs/i18n/FRESH_INSTALL.ru.md +27 -2
  119. package/docs/i18n/FRESH_INSTALL.zh.md +27 -2
  120. package/docs/i18n/HARNESSES.es.md +58 -0
  121. package/docs/i18n/HARNESSES.fr.md +58 -0
  122. package/docs/i18n/HARNESSES.ja.md +58 -0
  123. package/docs/i18n/HARNESSES.ko.md +58 -0
  124. package/docs/i18n/HARNESSES.ru.md +58 -0
  125. package/docs/i18n/HARNESSES.zh.md +58 -0
  126. package/docs/i18n/HARNESS_AIDER.es.md +48 -0
  127. package/docs/i18n/HARNESS_AIDER.fr.md +48 -0
  128. package/docs/i18n/HARNESS_AIDER.ja.md +50 -0
  129. package/docs/i18n/HARNESS_AIDER.ko.md +50 -0
  130. package/docs/i18n/HARNESS_AIDER.ru.md +48 -0
  131. package/docs/i18n/HARNESS_AIDER.zh.md +48 -0
  132. package/docs/i18n/HARNESS_CLAUDE.es.md +55 -0
  133. package/docs/i18n/HARNESS_CLAUDE.fr.md +55 -0
  134. package/docs/i18n/HARNESS_CLAUDE.ja.md +56 -0
  135. package/docs/i18n/HARNESS_CLAUDE.ko.md +56 -0
  136. package/docs/i18n/HARNESS_CLAUDE.ru.md +55 -0
  137. package/docs/i18n/HARNESS_CLAUDE.zh.md +56 -0
  138. package/docs/i18n/HARNESS_CODEX.es.md +55 -0
  139. package/docs/i18n/HARNESS_CODEX.fr.md +55 -0
  140. package/docs/i18n/HARNESS_CODEX.ja.md +56 -0
  141. package/docs/i18n/HARNESS_CODEX.ko.md +56 -0
  142. package/docs/i18n/HARNESS_CODEX.ru.md +55 -0
  143. package/docs/i18n/HARNESS_CODEX.zh.md +56 -0
  144. package/docs/i18n/HARNESS_CURSOR.es.md +42 -0
  145. package/docs/i18n/HARNESS_CURSOR.fr.md +42 -0
  146. package/docs/i18n/HARNESS_CURSOR.ja.md +45 -0
  147. package/docs/i18n/HARNESS_CURSOR.ko.md +45 -0
  148. package/docs/i18n/HARNESS_CURSOR.ru.md +42 -0
  149. package/docs/i18n/HARNESS_CURSOR.zh.md +42 -0
  150. package/docs/i18n/HARNESS_GEMINI.es.md +44 -0
  151. package/docs/i18n/HARNESS_GEMINI.fr.md +44 -0
  152. package/docs/i18n/HARNESS_GEMINI.ja.md +45 -0
  153. package/docs/i18n/HARNESS_GEMINI.ko.md +45 -0
  154. package/docs/i18n/HARNESS_GEMINI.ru.md +44 -0
  155. package/docs/i18n/HARNESS_GEMINI.zh.md +45 -0
  156. package/docs/i18n/HARNESS_HERMES.es.md +54 -0
  157. package/docs/i18n/HARNESS_HERMES.fr.md +54 -0
  158. package/docs/i18n/HARNESS_HERMES.ja.md +57 -0
  159. package/docs/i18n/HARNESS_HERMES.ko.md +57 -0
  160. package/docs/i18n/HARNESS_HERMES.ru.md +54 -0
  161. package/docs/i18n/HARNESS_HERMES.zh.md +57 -0
  162. package/docs/i18n/HARNESS_OPENCLAW.es.md +41 -0
  163. package/docs/i18n/HARNESS_OPENCLAW.fr.md +41 -0
  164. package/docs/i18n/HARNESS_OPENCLAW.ja.md +44 -0
  165. package/docs/i18n/HARNESS_OPENCLAW.ko.md +44 -0
  166. package/docs/i18n/HARNESS_OPENCLAW.ru.md +41 -0
  167. package/docs/i18n/HARNESS_OPENCLAW.zh.md +42 -0
  168. package/docs/i18n/HARNESS_OPENCODE.es.md +41 -0
  169. package/docs/i18n/HARNESS_OPENCODE.fr.md +41 -0
  170. package/docs/i18n/HARNESS_OPENCODE.ja.md +44 -0
  171. package/docs/i18n/HARNESS_OPENCODE.ko.md +44 -0
  172. package/docs/i18n/HARNESS_OPENCODE.ru.md +41 -0
  173. package/docs/i18n/HARNESS_OPENCODE.zh.md +44 -0
  174. package/docs/i18n/HERMES_VOICE.es.md +46 -0
  175. package/docs/i18n/HERMES_VOICE.fr.md +46 -0
  176. package/docs/i18n/HERMES_VOICE.ja.md +46 -0
  177. package/docs/i18n/HERMES_VOICE.ko.md +65 -0
  178. package/docs/i18n/HERMES_VOICE.ru.md +46 -0
  179. package/docs/i18n/HERMES_VOICE.zh.md +46 -0
  180. package/docs/i18n/MULTI_INSTANCE.es.md +25 -0
  181. package/docs/i18n/MULTI_INSTANCE.fr.md +25 -0
  182. package/docs/i18n/MULTI_INSTANCE.ja.md +25 -0
  183. package/docs/i18n/MULTI_INSTANCE.ko.md +25 -0
  184. package/docs/i18n/MULTI_INSTANCE.ru.md +25 -0
  185. package/docs/i18n/MULTI_INSTANCE.zh.md +25 -0
  186. package/docs/i18n/README.es.md +20 -134
  187. package/docs/i18n/README.fr.md +20 -134
  188. package/docs/i18n/README.ja.md +20 -134
  189. package/docs/i18n/README.ko.md +20 -133
  190. package/docs/i18n/README.ru.md +20 -134
  191. package/docs/i18n/README.zh.md +20 -133
  192. package/docs/i18n/RELEASE.es.md +26 -1
  193. package/docs/i18n/RELEASE.fr.md +26 -1
  194. package/docs/i18n/RELEASE.ja.md +26 -1
  195. package/docs/i18n/RELEASE.ko.md +26 -1
  196. package/docs/i18n/RELEASE.ru.md +26 -1
  197. package/docs/i18n/RELEASE.zh.md +26 -1
  198. package/docs/i18n/TROUBLESHOOTING.es.md +39 -0
  199. package/docs/i18n/TROUBLESHOOTING.fr.md +39 -0
  200. package/docs/i18n/TROUBLESHOOTING.ja.md +39 -0
  201. package/docs/i18n/TROUBLESHOOTING.ko.md +39 -0
  202. package/docs/i18n/TROUBLESHOOTING.ru.md +39 -0
  203. package/docs/i18n/TROUBLESHOOTING.zh.md +39 -0
  204. package/docs/i18n/USAGE.es.md +25 -0
  205. package/docs/i18n/USAGE.fr.md +25 -0
  206. package/docs/i18n/USAGE.ja.md +25 -0
  207. package/docs/i18n/USAGE.ko.md +25 -0
  208. package/docs/i18n/USAGE.ru.md +25 -0
  209. package/docs/i18n/USAGE.zh.md +25 -0
  210. package/docs/superpowers/plans/2026-05-13-phase1-streaming-pipeline.md +122 -0
  211. package/docs/superpowers/plans/2026-05-13-phase10-push-notifications.md +152 -0
  212. package/docs/superpowers/plans/2026-05-13-phase2-agent-adapters.md +242 -0
  213. package/docs/superpowers/plans/2026-05-13-phase6-smart-progress.md +172 -0
  214. package/docs/superpowers/plans/2026-05-13-phase7-voice-plan-mode.md +108 -0
  215. package/docs/superpowers/plans/2026-05-14-cross-agent-voice-transfer.md +625 -0
  216. package/docs/superpowers/plans/2026-05-21-audio-overview-narrated-diffs.md +95 -0
  217. package/docs/superpowers/plans/2026-05-21-autoresearch-ontology.md +83 -0
  218. package/docs/superpowers/plans/2026-05-21-phase11-push-to-talk-wakeword-v2.md +77 -0
  219. package/docs/superpowers/plans/2026-05-21-phase12-multi-user-voice.md +147 -0
  220. package/docs/superpowers/plans/2026-05-21-phase14-verbalbench.md +136 -0
  221. package/docs/superpowers/plans/2026-05-21-phase15-phone-companion.md +72 -0
  222. package/integrations/fireredtts2/mlx_llm.py +183 -0
  223. package/integrations/fireredtts2/synth.py +156 -0
  224. package/integrations/fireredtts2/synth_mlx.py +196 -0
  225. package/integrations/mlxaudio/synth.py +74 -0
  226. package/integrations/neuttsair/synth.py +104 -0
  227. package/integrations/omnivoice/synth.py +110 -0
  228. package/package.json +7 -1
  229. package/scripts/cli.mjs +88 -3
  230. package/scripts/doctor.mjs +115 -4
  231. package/scripts/install.mjs +20 -2
  232. package/scripts/install_fireredtts2.sh +109 -0
  233. package/scripts/install_mlxaudio.sh +34 -0
  234. package/scripts/install_mossttsnano.sh +46 -0
  235. package/scripts/postinstall.mjs +34 -0
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
+ cd "$ROOT"
6
+
7
+ ASSUME_YES=0
8
+ SKIP_MODEL=0
9
+ SKIP_PIP=0
10
+ for arg in "$@"; do
11
+ case "$arg" in
12
+ -y|--yes) ASSUME_YES=1 ;;
13
+ --skip-model) SKIP_MODEL=1 ;;
14
+ --skip-pip) SKIP_PIP=1 ;;
15
+ -h|--help)
16
+ cat <<'USAGE'
17
+ Usage: scripts/install_fireredtts2.sh [--yes] [--skip-model] [--skip-pip]
18
+
19
+ Installs FireRedTTS-2 for VerbalCoding:
20
+ - clones FireRedTeam/FireRedTTS2 under vendor/FireRedTTS2
21
+ - creates .venv-fireredtts2
22
+ - installs upstream Python dependencies
23
+ - downloads https://huggingface.co/FireRedTeam/FireRedTTS2 weights under pretrained_models/FireRedTTS2
24
+ - creates .local/bin/fireredtts2 wrapper used by TTS_BACKEND=fireredtts2
25
+
26
+ The model is large. Use --skip-model only if FIREREDTTS2_PRETRAINED_DIR points elsewhere.
27
+ USAGE
28
+ exit 0
29
+ ;;
30
+ esac
31
+ done
32
+
33
+ log() { printf '==> %s\n' "$*"; }
34
+ warn() { printf 'Warning: %s\n' "$*" >&2; }
35
+ has_cmd() { command -v "$1" >/dev/null 2>&1; }
36
+ confirm() {
37
+ if [ "$ASSUME_YES" = "1" ]; then return 0; fi
38
+ printf '%s [y/N]: ' "$1" >&2
39
+ read -r answer
40
+ case "$answer" in y|Y|yes|YES) return 0 ;; *) return 1 ;; esac
41
+ }
42
+
43
+ if [ "$ASSUME_YES" != "1" ]; then
44
+ confirm 'FireRedTTS-2 can download several GB of model/dependency data. Continue?' || exit 2
45
+ fi
46
+
47
+ mkdir -p vendor .local/bin pretrained_models
48
+
49
+ if ! has_cmd git; then
50
+ warn 'git is required to install FireRedTTS-2.'
51
+ exit 1
52
+ fi
53
+ PYTHON_BIN=""
54
+ for candidate in python3.12 python3.11 python3; do
55
+ if has_cmd "$candidate"; then PYTHON_BIN="$candidate"; break; fi
56
+ done
57
+ if [ -z "$PYTHON_BIN" ]; then
58
+ warn 'Python >=3.11 is required to install FireRedTTS-2.'
59
+ exit 1
60
+ fi
61
+ PYTHON_VERSION="$($PYTHON_BIN - <<'PY'
62
+ import sys
63
+ print(f"{sys.version_info.major}.{sys.version_info.minor}")
64
+ PY
65
+ )"
66
+ case "$PYTHON_VERSION" in
67
+ 3.11|3.12|3.13*) ;;
68
+ *) warn "FireRedTTS-2 requires Python >=3.11; found $PYTHON_VERSION at $PYTHON_BIN"; exit 1 ;;
69
+ esac
70
+
71
+ if [ ! -d vendor/FireRedTTS2/.git ]; then
72
+ log 'Cloning FireRedTTS-2'
73
+ git clone --depth 1 https://github.com/FireRedTeam/FireRedTTS2.git vendor/FireRedTTS2
74
+ else
75
+ log 'FireRedTTS-2 repo already exists'
76
+ fi
77
+
78
+ if [ "$SKIP_PIP" != "1" ]; then
79
+ if [ ! -x .venv-fireredtts2/bin/python ]; then
80
+ log 'Creating .venv-fireredtts2'
81
+ "$PYTHON_BIN" -m venv .venv-fireredtts2
82
+ fi
83
+ log 'Installing FireRedTTS-2 Python dependencies'
84
+ .venv-fireredtts2/bin/python -m pip install --upgrade pip setuptools wheel
85
+ .venv-fireredtts2/bin/python -m pip install torch torchaudio huggingface_hub
86
+ .venv-fireredtts2/bin/python -m pip install -e vendor/FireRedTTS2
87
+ if [ -f vendor/FireRedTTS2/requirements.txt ]; then
88
+ .venv-fireredtts2/bin/python -m pip install -r vendor/FireRedTTS2/requirements.txt
89
+ fi
90
+ fi
91
+
92
+ if [ "$SKIP_MODEL" != "1" ]; then
93
+ if [ -d pretrained_models/FireRedTTS2 ] && [ "$(find pretrained_models/FireRedTTS2 -mindepth 1 -maxdepth 1 2>/dev/null | head -n 1)" ]; then
94
+ log 'FireRedTTS-2 pretrained model already exists'
95
+ else
96
+ log 'Downloading FireRedTTS-2 weights from https://huggingface.co/FireRedTeam/FireRedTTS2'
97
+ .venv-fireredtts2/bin/huggingface-cli download FireRedTeam/FireRedTTS2 --local-dir pretrained_models/FireRedTTS2 --local-dir-use-symlinks False
98
+ fi
99
+ fi
100
+
101
+ cat > .local/bin/fireredtts2 <<'SH'
102
+ #!/usr/bin/env bash
103
+ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
104
+ exec "$ROOT/.venv-fireredtts2/bin/python" "$ROOT/integrations/fireredtts2/synth.py" "$@"
105
+ SH
106
+ chmod +x .local/bin/fireredtts2
107
+
108
+ log 'Installed .local/bin/fireredtts2 wrapper'
109
+ log 'Set FIREREDTTS2_COMMAND=./.local/bin/fireredtts2 and TTS_BACKEND=fireredtts2, then restart VerbalCoding.'
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ cd "$ROOT"
5
+ ASSUME_YES=0
6
+ for arg in "$@"; do
7
+ case "$arg" in -y|--yes) ASSUME_YES=1 ;; esac
8
+ done
9
+ log() { printf '==> %s\n' "$*"; }
10
+ confirm() {
11
+ if [ "$ASSUME_YES" = "1" ]; then return 0; fi
12
+ printf '%s [y/N]: ' "$1" >&2
13
+ read -r answer
14
+ case "$answer" in y|Y|yes|YES) return 0 ;; *) return 1 ;; esac
15
+ }
16
+ if ! confirm 'Install mlx-audio under this project?'; then
17
+ echo 'Cancelled mlx-audio install.' >&2
18
+ exit 2
19
+ fi
20
+ PYTHON_BIN="${PYTHON_BIN:-}"
21
+ if [ -z "$PYTHON_BIN" ]; then
22
+ for candidate in python3.12 python3.11 python3.10 python3; do
23
+ if command -v "$candidate" >/dev/null 2>&1; then PYTHON_BIN="$candidate"; break; fi
24
+ done
25
+ fi
26
+ [ -n "$PYTHON_BIN" ] || { echo 'python3 is required' >&2; exit 1; }
27
+ if [ ! -x .venv-mlxaudio/bin/python ]; then
28
+ log 'Creating .venv-mlxaudio'
29
+ "$PYTHON_BIN" -m venv .venv-mlxaudio
30
+ fi
31
+ log 'Installing mlx-audio for Apple Silicon'
32
+ .venv-mlxaudio/bin/python -m pip install --upgrade pip setuptools wheel >/dev/null
33
+ .venv-mlxaudio/bin/python -m pip install --pre mlx-audio
34
+ log 'mlx-audio installed. Set TTS_BACKEND=mlxaudio or run: vc tts backend mlx'
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ cd "$ROOT"
5
+ ASSUME_YES=0
6
+ for arg in "$@"; do
7
+ case "$arg" in -y|--yes) ASSUME_YES=1 ;; esac
8
+ done
9
+ log() { printf '==> %s\n' "$*"; }
10
+ confirm() {
11
+ if [ "$ASSUME_YES" = "1" ]; then return 0; fi
12
+ printf '%s [y/N]: ' "$1" >&2
13
+ read -r answer
14
+ case "$answer" in y|Y|yes|YES) return 0 ;; *) return 1 ;; esac
15
+ }
16
+ if ! confirm 'Install MOSS-TTS-Nano code and Python environment under this project?'; then
17
+ echo 'Cancelled MOSS-TTS-Nano install.' >&2
18
+ exit 2
19
+ fi
20
+ command -v python3 >/dev/null 2>&1 || { echo 'python3 is required' >&2; exit 1; }
21
+ command -v git >/dev/null 2>&1 || { echo 'git is required' >&2; exit 1; }
22
+ mkdir -p vendor .local/bin
23
+ if [ ! -d vendor/MOSS-TTS-Nano/.git ]; then
24
+ log 'Cloning MOSS-TTS-Nano source'
25
+ git clone --depth 1 https://github.com/OpenMOSS/MOSS-TTS-Nano.git vendor/MOSS-TTS-Nano
26
+ else
27
+ log 'MOSS-TTS-Nano source already present'
28
+ fi
29
+ if [ ! -x .venv-mossttsnano/bin/python ]; then
30
+ log 'Creating .venv-mossttsnano'
31
+ python3 -m venv .venv-mossttsnano
32
+ fi
33
+ log 'Installing MOSS-TTS-Nano Python dependencies'
34
+ .venv-mossttsnano/bin/python -m pip install --upgrade pip >/dev/null
35
+ if [ -f vendor/MOSS-TTS-Nano/requirements.txt ]; then
36
+ .venv-mossttsnano/bin/python -m pip install -r vendor/MOSS-TTS-Nano/requirements.txt >/dev/null
37
+ else
38
+ .venv-mossttsnano/bin/python -m pip install torch torchaudio transformers accelerate soundfile huggingface_hub >/dev/null
39
+ fi
40
+ cat > .local/bin/mossttsnano <<'SH'
41
+ #!/usr/bin/env bash
42
+ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
43
+ exec "$ROOT/.venv-mossttsnano/bin/python" "$ROOT/vendor/MOSS-TTS-Nano/infer.py" "$@"
44
+ SH
45
+ chmod +x .local/bin/mossttsnano
46
+ log 'MOSS-TTS-Nano installed: ./.local/bin/mossttsnano'
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
8
+ if (process.env.VERBALCODING_SKIP_POSTINSTALL === '1') process.exit(0);
9
+
10
+ function log(message) {
11
+ console.log(`[verbalcoding] ${message}`);
12
+ }
13
+
14
+ function run(cmd, args, options = {}) {
15
+ return spawnSync(cmd, args, { cwd: ROOT, stdio: options.stdio || 'inherit', env: process.env });
16
+ }
17
+
18
+ try {
19
+ if (!fs.existsSync(path.join(ROOT, '.venv-tts', 'bin', 'edge-tts'))) {
20
+ const py = spawnSync('python3', ['--version'], { stdio: 'ignore' });
21
+ if (py.status === 0) {
22
+ log('installing local Edge TTS helper (.venv-tts)');
23
+ run('python3', ['-m', 'venv', path.join(ROOT, '.venv-tts')]);
24
+ run(path.join(ROOT, '.venv-tts', 'bin', 'python'), ['-m', 'pip', 'install', '--upgrade', 'pip'], { stdio: 'ignore' });
25
+ const result = run(path.join(ROOT, '.venv-tts', 'bin', 'python'), ['-m', 'pip', 'install', 'edge-tts']);
26
+ if (result.status !== 0) log('edge-tts helper install failed; run `vc setup` later');
27
+ } else {
28
+ log('python3 not found; skipping Edge TTS helper install');
29
+ }
30
+ }
31
+ log('postinstall complete. Run `vc setup` for Discord tokens and heavier optional TTS backends.');
32
+ } catch (error) {
33
+ log(`postinstall skipped after error: ${error?.message || error}`);
34
+ }