verbalcoding 0.2.0 → 0.2.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.
package/README.md CHANGED
@@ -107,6 +107,7 @@ flowchart LR
107
107
  | [Configuration](docs/CONFIGURATION.md) | `.env`, agent backends, MCP, TTS backends, operational notes |
108
108
  | [Multi-Instance](docs/MULTI_INSTANCE.md) | One permanent Discord voice room per project |
109
109
  | [Release Notes](docs/RELEASE.md) | Current capabilities and pre-release checklist |
110
+ | [한국어 문서](docs/i18n/README.ko.md) | npm 설치, 사용법, 설정, 멀티 인스턴스 한국어 가이드 |
110
111
 
111
112
  ## Tiny Command Map
112
113
 
@@ -154,4 +155,4 @@ vc doctor
154
155
 
155
156
  ## Status
156
157
 
157
- VerbalCoding is public-release oriented but still early. Demo video/GIF, broader Linux notes, and a formal license file are still TODOs.
158
+ VerbalCoding is public-release oriented but still early. Demo video/GIF, broader Linux validation, CI, and deeper security review are still TODOs.
package/docs/RELEASE.md CHANGED
@@ -22,6 +22,7 @@ VerbalCoding is a Discord voice bridge for controlling CLI-based coding agents b
22
22
  - Diff/code/log guardrails so large technical output is not read aloud.
23
23
  - Normal and conservative sensitivity modes for indoor vs. noisy/outdoor use.
24
24
  - Setup wizard, `.env.example`, `vc doctor` prerequisite checker, and `./scripts/install.sh --yes` bootstrap for OS packages, npm dependencies, Edge TTS helper, and the default whisper.cpp model.
25
+ - npm package install path: `npm install -g verbalcoding`, `vc setup --yes`, and `vc start`.
25
26
  - Optional verbose progress mode for text-only middle-step updates during long agent work.
26
27
  - Always-on JSONL latency metrics plus `!latency` / `!metrics` summary for pipeline optimization.
27
28
  - Lower default utterance idle wait (`UTTERANCE_IDLE_MS=2000`) so STT starts about 0.6s sooner after speech ends.
@@ -38,14 +39,15 @@ node --check app-node/main.mjs app-node/agent_adapters.mjs app-node/install_conf
38
39
  npm test
39
40
  PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q || [ $? -eq 5 ] # ok when no Python tests exist
40
41
  bash -n run.sh scripts/install.sh scripts/bootstrap_prereqs.sh scripts/docker_ubuntu_smoke.sh
42
+ npm pack --dry-run
41
43
  vc doctor
42
44
  git diff --check
43
45
  ```
44
46
 
45
47
  Manual smoke test:
46
48
 
47
- 1. Start the bridge with `./run.sh`.
48
- 2. Verify log contains `Logged in as Hermes#6718`.
49
+ 1. Start the bridge with `vc start` or `./run.sh`.
50
+ 2. Verify log contains `Logged in as <bot-name>`.
49
51
  3. Verify log contains `Listening in voice channel ... / 일반` or the configured default channel.
50
52
  4. In Discord, run `!ping`.
51
53
  5. In Discord voice, say a short Korean request.
@@ -0,0 +1,191 @@
1
+ # VerbalCoding 설정 가이드
2
+
3
+ ## 설정 마법사
4
+
5
+ npm으로 설치한 경우:
6
+
7
+ ```bash
8
+ vc setup --yes
9
+ ```
10
+
11
+ GitHub 클론에서 직접 실행하는 경우:
12
+
13
+ ```bash
14
+ ./scripts/install.sh --yes
15
+ ```
16
+
17
+ 설치기는 Discord 토큰, 허용 사용자, 자동 입장 음성 채널 이름, transcript 채널/스레드, CLI 하네스 백엔드, 기본 음성 언어, TTS 설정, wake word 동작을 묻습니다. 결과는 권한 `0600`의 `.env`에 저장되며, `.env`는 git에서 무시됩니다. 클론 설치에서는 짧은 셸 명령 `vc`도 연결합니다.
18
+
19
+ 수동 설치 후 셸 명령만 연결하려면:
20
+
21
+ ```bash
22
+ npm link
23
+ ```
24
+
25
+ ## 지원 에이전트 백엔드
26
+
27
+ `.env`에서 `AGENT_BACKEND`를 설정합니다.
28
+
29
+ | 백엔드 | 기본 명령 | 메모 |
30
+ |---|---|---|
31
+ | `hermes` | `hermes chat -Q -q` | 기본값. `.verbalcoding-session` resume 동작을 유지합니다. |
32
+ | `claude-code` / `claude` | `claude -p` | `CLAUDE_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
33
+ | `codex` | `codex exec` | `CODEX_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
34
+ | `gemini` | `gemini -p` | `GEMINI_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
35
+ | `opencode` | `opencode run` | `OPENCODE_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
36
+ | `openclaw` | `openclaw run` | `OPENCLAW_COMMAND` 또는 `AGENT_COMMAND`로 재정의 가능 |
37
+ | `custom` | `AGENT_COMMAND` 필수 | 사용자 prompt가 마지막 argv 인자로 붙습니다. |
38
+
39
+ 공통 override 예시:
40
+
41
+ ```bash
42
+ AGENT_BACKEND=custom
43
+ AGENT_LABEL="My Harness"
44
+ AGENT_COMMAND="my-harness run --non-interactive"
45
+ AGENT_TASK_TIMEOUT_MS=0
46
+ AGENT_CHAT_TIMEOUT_MS=45000
47
+ AGENT_VERBOSE_PROGRESS=0
48
+ UTTERANCE_IDLE_MS=2000
49
+ LATENCY_LOG_PATH=./.logs/latency.jsonl
50
+ ```
51
+
52
+ ## 에이전트 어댑터 계약
53
+
54
+ 음성 브릿지는 모든 백엔드와 하나의 어댑터 계약으로 통신합니다.
55
+
56
+ - `run({ text }, signal, plan)`은 상태, 최종 답변 텍스트, 백엔드 라벨, elapsed time, 선택적 세션 metadata를 반환합니다.
57
+ - `ask(text, signal, plan)`은 호환용 단축 함수이며 최종 답변 텍스트만 반환합니다.
58
+ - `capabilities`는 해당 백엔드가 session resume, streaming progress, cancellation을 지원하는지 선언합니다.
59
+ - Hermes는 기준 어댑터입니다. resume, verbose progress streaming, cancellation, Hermes 세션 파일에서 최종 답변 복구를 지원합니다.
60
+
61
+ 새 백엔드는 같은 계약을 구현하고, voice/STT/TTS 동작은 어댑터 밖에 유지하는 것이 좋습니다.
62
+
63
+ ## 예시 `.env`
64
+
65
+ ```bash
66
+ DISCORD_BOT_TOKEN="***"
67
+ DISCORD_ALLOWED_USERS="123456789012345678"
68
+ AUTO_JOIN_VOICE_CHANNELS="일반,General,general"
69
+ TRANSCRIPT_CHANNEL_ID="123456789012345678"
70
+
71
+ AGENT_BACKEND="hermes"
72
+ STT_ENGINE="whisper_cpp"
73
+ WHISPER_CPP_BIN="whisper-cli"
74
+ WHISPER_CPP_MODEL="./models/ggml-small-q5_1.bin"
75
+
76
+ TTS_BACKEND="edge"
77
+ TTS_VOICE="ko-KR-SunHiNeural"
78
+ TTS_RATE="+10%"
79
+ TTS_MAX_CHARS="495"
80
+ TTS_VOLUME="1.0"
81
+
82
+ REQUIRE_WAKE_WORD="0"
83
+ MIN_UTTERANCE_SECONDS="1.0"
84
+ UTTERANCE_IDLE_MS="2000"
85
+ HERMES_TASK_TIMEOUT_MS="0"
86
+ HERMES_CHAT_TIMEOUT_MS="45000"
87
+ AGENT_VERBOSE_PROGRESS="0"
88
+ LATENCY_LOG_PATH="./.logs/latency.jsonl"
89
+ ```
90
+
91
+ ## MCP 서버
92
+
93
+ VerbalCoding은 stdio MCP 서버를 포함합니다. Hermes Agent 또는 MCP client는 자유 형식 shell 명령 대신 도구로 브릿지를 제어할 수 있습니다.
94
+
95
+ Hermes 설정 예시:
96
+
97
+ ```yaml
98
+ mcp_servers:
99
+ verbalcoding:
100
+ command: "node"
101
+ args: ["/path/to/VerbalCoding/scripts/mcp-server.mjs"]
102
+ timeout: 120
103
+ connect_timeout: 30
104
+ ```
105
+
106
+ 노출되는 MCP 도구:
107
+
108
+ | 도구 | 용도 |
109
+ |---|---|
110
+ | `status` | 비밀값 없이 브릿지/설정 상태 보고 |
111
+ | `doctor` | 비밀값을 숨긴 doctor 점검 실행 |
112
+ | `set_auto_restart` | 커밋 시 음성 봇 자동 재시작 켜기/끄기 |
113
+ | `set_language` | STT/진행/TTS 언어를 함께 변경 |
114
+ | `start`, `stop`, `restart` | Discord 음성 브릿지 제어 |
115
+
116
+ ## 선택: OpenVoice TTS
117
+
118
+ Edge TTS가 기본값이자 fallback입니다. OpenVoice V2로 로컬 음성 복제를 시험하려면:
119
+
120
+ ```bash
121
+ ./scripts/setup_openvoice.sh
122
+ # OpenVoice 문서에서 checkpoints_v2_0417.zip을 받아 vendor/OpenVoice/checkpoints_v2/ 아래에 풉니다.
123
+ mkdir -p voice-samples
124
+ # 허가된 기준 샘플을 voice-samples/user-reference.wav에 넣거나,
125
+ # Discord에서 !voice-clone capture로 샘플을 캡처합니다.
126
+ python3 scripts/openvoice_smoke.py
127
+ ```
128
+
129
+ 그 뒤 설정:
130
+
131
+ ```bash
132
+ TTS_BACKEND="openvoice"
133
+ OPENVOICE_REF_AUDIO="./voice-samples/user-reference.wav"
134
+ OPENVOICE_PROGRESS="0"
135
+ ```
136
+
137
+ 본인 소유이거나 사용 허가를 받은 목소리만 복제하세요. OpenVoice가 실패하거나 timeout되면 VerbalCoding은 Edge TTS로 fallback합니다.
138
+
139
+ ## 선택: Supertonic TTS
140
+
141
+ ```bash
142
+ ./scripts/setup_supertonic.sh
143
+ supertonic tts '안녕하세요. 수퍼토닉 테스트입니다.' --lang ko --voice M1 --steps 2 --speed 1.0 -o /tmp/verbalcoding-supertonic.wav
144
+ ```
145
+
146
+ 그 뒤 설정:
147
+
148
+ ```bash
149
+ TTS_BACKEND="supertonic"
150
+ SUPERTONIC_COMMAND="./.venv-supertonic/bin/supertonic"
151
+ SUPERTONIC_VOICE="M1"
152
+ SUPERTONIC_LANGUAGE="ko"
153
+ SUPERTONIC_STEPS="2"
154
+ SUPERTONIC_SPEED="1.0"
155
+ SUPERTONIC_PROGRESS="0"
156
+ ```
157
+
158
+ Supertonic이 없거나 실패하거나 timeout되면 VerbalCoding은 Edge TTS로 fallback합니다.
159
+
160
+ ## 선택: SpeechSwift / CosyVoice TTS
161
+
162
+ Apple Silicon에서는 `speech-swift`가 MLX-native CosyVoice/Qwen3-TTS 기반 한국어 음성 복제용 로컬 백엔드로 동작할 수 있습니다.
163
+
164
+ ```bash
165
+ brew tap soniqo/speech https://github.com/soniqo/speech-swift
166
+ brew install speech
167
+ ```
168
+
169
+ 권장 env:
170
+
171
+ ```bash
172
+ TTS_BACKEND="speechswift"
173
+ SPEECHSWIFT_MODE="server"
174
+ SPEECHSWIFT_ENGINE="cosyvoice"
175
+ SPEECHSWIFT_LANGUAGE="korean"
176
+ SPEECHSWIFT_REF_AUDIO="./voice-samples/user-reference.wav"
177
+ SPEECHSWIFT_SERVER_HOST="127.0.0.1"
178
+ SPEECHSWIFT_SERVER_PORT="18080"
179
+ SPEECHSWIFT_SERVER_URL="http://127.0.0.1:18080"
180
+ SPEECHSWIFT_PROGRESS="0"
181
+ ```
182
+
183
+ 빠른 진행/짧은 backchannel prompt는 Edge를 유지하는 편이 안전합니다.
184
+
185
+ ## 운영 메모
186
+
187
+ - 텍스트 명령을 쓰려면 Discord bot의 privileged Message Content intent가 켜져 있어야 합니다.
188
+ - 봇에는 음성 채널 connect/speak 권한이 필요합니다.
189
+ - Hermes Agent를 쓴다면 기본 프로필에서 Hermes를 정상 설정/인증하세요. 예: `hermes setup`, `hermes login` 등.
190
+ - Claude Code, Codex, Gemini, OpenCode, OpenClaw를 쓰려면 해당 CLI를 별도로 설치하고 인증하세요.
191
+ - CLI가 timeout 또는 signal 실패 중 diff/code를 출력하면 브릿지는 그 내용을 음성으로 읽지 않고 자세한 텍스트로만 보냅니다.
@@ -0,0 +1,193 @@
1
+ # VerbalCoding 새 설치 가이드
2
+
3
+ 이 문서는 공개 npm 패키지 또는 깨끗한 GitHub 클론에서 처음 설치하는 흐름을 설명합니다. 로컬 전용 가정을 피하고, 설치 스크립트가 가능한 한 많은 준비 작업을 자동화하도록 구성돼 있습니다.
4
+
5
+ ## 1. CLI 설치
6
+
7
+ 권장 npm 설치:
8
+
9
+ ```bash
10
+ npm install -g verbalcoding
11
+ ```
12
+
13
+ 전역 설치 없이 바로 실행하려면:
14
+
15
+ ```bash
16
+ npx verbalcoding setup --yes
17
+ ```
18
+
19
+ 전역 설치를 했다면 이어서:
20
+
21
+ ```bash
22
+ vc setup --yes
23
+ ```
24
+
25
+ 기여자용 GitHub 클론 경로:
26
+
27
+ ```bash
28
+ git clone https://github.com/ca1773130n/VerbalCoding.git
29
+ cd VerbalCoding
30
+ ./scripts/install.sh --yes
31
+ ```
32
+
33
+ ## 2. 의존성 부트스트랩과 설정 마법사
34
+
35
+ npm 명령은 클론 설치와 같은 부트스트래퍼를 실행합니다. 클론에서는 다음을 실행합니다.
36
+
37
+ ```bash
38
+ ./scripts/install.sh --yes
39
+ ```
40
+
41
+ 이 명령이 하는 일:
42
+
43
+ - `node_modules/`가 없으면 npm 의존성을 설치합니다.
44
+ - 클론 설치에서는 짧은 `vc` 셸 명령을 `npm link`로 연결합니다.
45
+ - OS 패키지 매니저가 지원되면 `ffmpeg`, Node/npm, `whisper-cli`를 설치합니다.
46
+ - 기본 모델 `models/ggml-small-q5_1.bin`을 다운로드합니다.
47
+ - `edge-tts`가 PATH에 없으면 `.venv-tts`를 만들고 Edge TTS helper를 설치합니다.
48
+ - 대화형 `.env` 설정 마법사를 실행합니다.
49
+
50
+ 지원되는 시스템 부트스트랩 경로:
51
+
52
+ | OS | 시스템 의존성 경로 |
53
+ |---|---|
54
+ | macOS | Homebrew: 필요 시 `brew install node ffmpeg whisper-cpp` |
55
+ | Debian/Ubuntu | `apt-get`으로 Node/npm, ffmpeg, Python, build tools 설치; 필요 시 로컬 whisper.cpp 빌드 |
56
+ | Fedora/RHEL | `dnf`로 Node/npm, ffmpeg, Python, build tools 설치; 필요 시 로컬 whisper.cpp 빌드 |
57
+ | Arch | `pacman`으로 Node/npm, ffmpeg, Python, build tools 설치; 필요 시 로컬 whisper.cpp 빌드 |
58
+
59
+ 유용한 설치 변형:
60
+
61
+ ```bash
62
+ vc setup --yes --no-wizard # npm 설치에서 의존성만 준비
63
+ ./scripts/install.sh --yes --no-wizard # 클론에서 의존성만 준비
64
+ ./scripts/install.sh --skip-system # OS 패키지는 직접 설치
65
+ ./scripts/install.sh --skip-model # 기본 STT 모델 다운로드 생략
66
+ ./scripts/install.sh --skip-edge-tts # .venv-tts 생성 생략
67
+ VERBALCODING_SKIP_CLI_LINK=1 ./scripts/install.sh --yes
68
+ ```
69
+
70
+ OS가 지원되지 않으면 아래를 직접 설치한 뒤 다시 실행하세요.
71
+
72
+ - Node.js 20+ 및 npm
73
+ - ffmpeg
74
+ - venv/pip가 포함된 Python 3
75
+ - whisper.cpp `whisper-cli`
76
+ - 인증된 CLI 에이전트 백엔드 하나 이상; 기본은 Hermes Agent
77
+
78
+ ## 3. Discord 애플리케이션 설정
79
+
80
+ 1. Discord Developer Portal에서 애플리케이션과 봇을 만듭니다.
81
+ 2. Message Content privileged intent를 켭니다.
82
+ 3. 봇 토큰을 설치 프롬프트 또는 `.env`의 `DISCORD_BOT_TOKEN`에 넣습니다.
83
+ 4. 초대 URL을 생성합니다.
84
+
85
+ ```bash
86
+ vc bot invite <discord-client-id>
87
+ # 특정 서버로 고정하려면:
88
+ vc bot invite <discord-client-id> --guild <guild-id>
89
+ ```
90
+
91
+ 초대 URL에는 VerbalCoding이 쓰는 bot/application command scope와 텍스트/음성 권한이 포함됩니다.
92
+
93
+ ## 4. 검증
94
+
95
+ ```bash
96
+ vc doctor
97
+ ```
98
+
99
+ `vc doctor`는 토큰을 숨깁니다. 필요한 토큰, 명령, 모델이 있는지만 보여주고 비밀값은 출력하지 않습니다. 모든 `✗` 항목을 고친 뒤 다시 실행하세요.
100
+
101
+ 성공 예시는 다음과 같습니다.
102
+
103
+ ```text
104
+ ✓ Node.js
105
+ ✓ npm
106
+ ✓ ffmpeg
107
+ ✓ whisper-cli
108
+ ✓ whisper.cpp model
109
+ ✓ Discord bot token configured — [REDACTED]
110
+ ✓ edge-tts
111
+ ✓ hermes CLI
112
+ Doctor passed. Run vc start to start VerbalCoding.
113
+ ```
114
+
115
+ 설치기가 로컬 Edge TTS helper를 만들었다면 `.env`에는 `.venv-tts/bin/edge-tts`를 가리키는 `EDGE_TTS_COMMAND` 경로가 들어갑니다.
116
+
117
+ ## 5. 기본 단일 봇 실행
118
+
119
+ ```bash
120
+ vc start
121
+ # 또는 GitHub 클론에서:
122
+ ./run.sh
123
+ ```
124
+
125
+ 성공한 시작 로그에는 다음 줄이 보입니다.
126
+
127
+ ```text
128
+ Logged in as <bot-name>
129
+ Listening in voice channel <server> / <channel>
130
+ ```
131
+
132
+ Discord에서:
133
+
134
+ ```text
135
+ !ping
136
+ !join
137
+ !ask say hello briefly
138
+ !verbose on
139
+ ```
140
+
141
+ 그 다음 설정된 음성 채널에서 말해 보세요. STT 텍스트, verbose 모드의 진행 텍스트, 최종 텍스트 답변, TTS 재생을 확인할 수 있어야 합니다.
142
+
143
+ ## 6. 프로젝트별 음성방 설정
144
+
145
+ 프로젝트 음성방마다 영구 봇 하나를 두려면 프로젝트마다 Discord 애플리케이션을 만든 뒤:
146
+
147
+ ```bash
148
+ vc instance setup my-project
149
+ vc bot invite <that-project-client-id>
150
+ vc instance start my-project
151
+ vc instance status my-project
152
+ ```
153
+
154
+ 각 인스턴스는 무시되는 `instances/<name>.env`를 작성합니다. 이 파일에는 해당 봇의 토큰, 음성 채널, transcript 대상, 로그 경로, Hermes 세션 파일, 선택적 Hermes 프로필 정보가 들어갑니다.
155
+
156
+ ## 7. 선택: OpenVoice 설정
157
+
158
+ OpenVoice 음성 복제는 선택 기능입니다. 공개 설치 직후에는 `TTS_BACKEND=edge`를 유지하세요. 나중에 OpenVoice를 켜려면:
159
+
160
+ ```bash
161
+ ./scripts/setup_openvoice.sh
162
+ # OpenVoice V2 체크포인트를 vendor/OpenVoice/checkpoints_v2/ 아래에 넣습니다.
163
+ # 허가된 로컬 샘플을 voice-samples/user-reference.wav에 두거나,
164
+ # 봇 실행 후 “목소리 샘플 녹음 시작해”라고 말하고 10~30초 발화합니다.
165
+ python3 scripts/openvoice_smoke.py
166
+ ```
167
+
168
+ 그 뒤 `TTS_BACKEND=openvoice`로 설정하고 `vc doctor`, Discord의 `!voice-test <text>`로 테스트합니다.
169
+
170
+ ## 8. 유지보수자용 클린 설치 스모크 테스트
171
+
172
+ 빠른 호스트 스모크 테스트:
173
+
174
+ ```bash
175
+ TMPDIR=$(mktemp -d)
176
+ git clone https://github.com/ca1773130n/VerbalCoding.git "$TMPDIR/VerbalCoding"
177
+ cd "$TMPDIR/VerbalCoding"
178
+ ./scripts/install.sh --yes --no-wizard
179
+ npm pack --dry-run
180
+ cp .env.example .env
181
+ chmod 600 .env
182
+ vc doctor || true
183
+ ```
184
+
185
+ 이 시점에서 예상되는 실패는 로컬 비밀값 누락 또는 인증되지 않은 에이전트 CLI입니다. 토큰 노출이나 설치 스크립트 누락이 나오면 안 됩니다.
186
+
187
+ Docker 기반 Ubuntu 클린 설치 스모크 테스트:
188
+
189
+ ```bash
190
+ ./scripts/docker_ubuntu_smoke.sh
191
+ ```
192
+
193
+ 이 스크립트는 `ubuntu:24.04`에서 추적된 저장소 트리를 깨끗한 컨테이너로 복사하고, `./scripts/install.sh --yes --no-wizard`를 실행하고, 비밀값 없는 smoke `.env`를 만든 뒤 `vc`, Node 테스트, `vc doctor`를 확인합니다. Discord 음성 연결까지는 하지 않습니다. 실제 end-to-end 음성 테스트는 Ubuntu VM 또는 WSL2에서 별도로 진행하세요.
@@ -0,0 +1,179 @@
1
+ # VerbalCoding 멀티 인스턴스
2
+
3
+ VerbalCoding은 여러 개의 독립적인 Discord 음성 브릿지 프로세스를 실행할 수 있습니다. 각 프로세스는 같은 단일 인스턴스 Node 브릿지를 사용하지만, 서로 다른 `instances/<name>.env` 파일과 서로 다른 Discord bot token을 로드합니다.
4
+
5
+ 프로젝트마다 자기 Discord 음성 채널에 항상 붙어 있고, 자기 transcript 채널/스레드에 기록해야 할 때 사용하세요.
6
+
7
+ ## 왜 여러 봇 토큰이 필요한가
8
+
9
+ Discord 음성 상주 방식은 사실상 길드마다 봇 계정 하나가 동시에 하나의 음성 연결만 유지하는 구조입니다. 같은 봇 토큰이 같은 길드의 다른 음성 채널에 들어가면 이전 채널에도 계속 남아 있을 수 없습니다. 동시에 여러 프로젝트 방을 유지하려면 프로젝트마다 Discord 애플리케이션/봇을 하나씩 만들어야 합니다.
10
+
11
+ ## 파일 구조
12
+
13
+ ```text
14
+ instances/
15
+ README.md
16
+ example.env
17
+ llm-wiki.env # 로컬 전용, git에서 무시
18
+ verbalcoding.env # 로컬 전용, git에서 무시
19
+ .run/instances/
20
+ llm-wiki.pid # 런타임 전용, git에서 무시
21
+ ```
22
+
23
+ 실제 `instances/*.env` 파일에는 Discord 토큰이 들어갈 수 있으므로 git에서 무시됩니다. `instances/example.env`만 템플릿으로 커밋됩니다.
24
+
25
+ ## 인스턴스 설정 마법사
26
+
27
+ 일반 사용자는 env 파일을 복사해서 직접 편집하지 않는 편이 좋습니다. 마법사를 실행하세요.
28
+
29
+ ```bash
30
+ vc instance setup llm-wiki
31
+ # 또는 프로젝트 설정 스크립트에서:
32
+ ./scripts/install.sh --instance llm-wiki
33
+ ```
34
+
35
+ 마법사는 봇 토큰, Discord Application/Client ID, 음성 채널, transcript 대상, 작업 디렉터리, 프로젝트 컨텍스트, 격리된 런타임 경로를 묻습니다. `instances/<name>.env`를 권한 `0600`으로 작성하고, 기존 파일이 있으면 덮어쓰기 전에 백업하며, 다음 start/status 명령을 출력합니다.
36
+
37
+ 설정 중 Discord Application/Client ID를 입력하면 요약에 해당 봇 초대 URL도 출력됩니다. 같은 URL은 언제든지 다시 만들 수 있습니다.
38
+
39
+ ```bash
40
+ vc bot invite <client-id>
41
+ vc bot invite <client-id> --guild <guild-id>
42
+ ```
43
+
44
+ Discord는 동시에 여러 음성방에 상주하려면 여전히 방마다 Developer Portal 애플리케이션/봇 하나가 필요합니다. 대신 VerbalCoding이 OAuth URL이나 permission integer를 직접 조립할 필요를 없애 줍니다.
45
+
46
+ ### Hermes 프로필 격리
47
+
48
+ 각 인스턴스는 `~/.hermes/profiles/<name>` 아래에 자기 Hermes home을 갖습니다. 이렇게 하면 memory, MEMORY.md, SOUL.md, 학습된 skills가 프로젝트 사이에 섞이지 않습니다.
49
+
50
+ `vc instance setup <name>`은 자동으로 다음을 수행합니다.
51
+
52
+ - `hermes profile create <name> --clone-from default` 실행: 현재 `~/.hermes`의 API key와 모델 설정은 가져오지만, 세션과 메모리는 새로 시작합니다.
53
+ - 새 프로필의 `terminal.cwd`를 인스턴스 작업 디렉터리로 설정합니다.
54
+ - 마법사에서 입력한 project context로 `<profile>/SOUL.md`를 초기화합니다.
55
+ - `instances/<name>.env`에 `HERMES_HOME=...`을 씁니다.
56
+
57
+ `vc instance start <name>`은 self-heal을 수행합니다. env가 가리키는 Hermes profile directory가 사라졌다면 시작 전에 다시 만듭니다.
58
+
59
+ 인스턴스 이름은 Hermes가 디렉터리와 config key로 쓰기 때문에 `^[a-z0-9][a-z0-9_-]{0,63}$` 형식이어야 합니다.
60
+
61
+ ## 생성되는 최소 인스턴스 env 예시
62
+
63
+ ```env
64
+ INSTANCE_NAME=my-project
65
+ DISCORD_TOKEN=replac...oken
66
+ DISCORD_CLIENT_ID=123456789012345678
67
+ AUTO_JOIN_VOICE_CHANNELS=Project Room
68
+ TRANSCRIPT_CHANNEL_ID=123456789012345678
69
+ PROJECT_SESSIONS_FILE=config/project-sessions.my-project.json
70
+ BRIDGE_LOG_PATH=/tmp/verbalcoding-my-project.log
71
+ NODE_AUDIO_DEBUG_DIR=/tmp/verbalcoding-my-project-debug
72
+ HERMES_SESSION_FILE=.agent-sessions/hermes/my-project.session
73
+ HERMES_HOME=/home/you/.hermes/profiles/my-project
74
+ AGENT_LABEL=VerbalCoding · My Project
75
+ AGENT_CWD=/path/to/my-project
76
+ AGENT_PROJECT_CONTEXT=Project session: My Project
77
+ ```
78
+
79
+ 모든 인스턴스는 log/debug/session 파일 경로가 고유해야 합니다. `HERMES_HOME`과 대응하는 `~/.hermes/profiles/<name>` 디렉터리는 `vc instance setup`이 자동 생성합니다. `vc doctor`는 비밀값을 출력하지 않고 중복 토큰, 충돌하는 런타임 경로, 누락된 profile directory, profile과 instance의 `terminal.cwd` 불일치를 검사합니다.
80
+
81
+ ## 명령
82
+
83
+ ```bash
84
+ vc instance list
85
+ vc instance status
86
+ vc instance status my-project
87
+ vc instance start my-project
88
+ vc instance stop my-project
89
+ vc instance restart my-project
90
+ ```
91
+
92
+ `start`는 `./run.sh instances/<name>.env`를 detached로 실행하고 `.run/instances/<name>.pid`를 씁니다.
93
+
94
+ `stop`은 `SIGTERM`을 보내고 최대 10초 기다린 뒤, 필요하면 `SIGKILL`로 fallback하고 pid 파일을 제거합니다.
95
+
96
+ ## 예시: 영구 음성방 두 개
97
+
98
+ 1. Discord 애플리케이션/봇 두 개를 만듭니다.
99
+ - VerbalCoding bot
100
+ - LLM-Wiki bot
101
+
102
+ 2. 둘 다 서버에 초대하고 텍스트/음성 권한을 줍니다.
103
+ - View Channel
104
+ - Send Messages
105
+ - Send Messages in Threads
106
+ - Read Message History
107
+ - Use Application Commands
108
+ - Connect
109
+ - Speak
110
+
111
+ 각 Discord 애플리케이션을 만든 뒤 `vc bot invite <client-id>`를 실행하면 필요한 권한이 포함된 정확한 초대 URL을 출력합니다.
112
+
113
+ 3. 각 로컬 인스턴스 설정 마법사를 실행합니다.
114
+
115
+ ```bash
116
+ vc instance setup verbalcoding
117
+ vc instance setup llm-wiki
118
+ ```
119
+
120
+ 마법사는 git에서 무시되는 `instances/verbalcoding.env`, `instances/llm-wiki.env`를 권한 `0600`으로 작성하고, 기존 env가 있으면 백업합니다. 각 실행은 기본 Hermes home에서 clone한 `~/.hermes/profiles/<name>`도 생성하므로 두 인스턴스는 같은 인증/모델 설정으로 시작하지만, 프로젝트를 학습하면서 서로 독립적인 memory와 skills를 쌓습니다.
121
+
122
+ 4. 설정을 확인합니다.
123
+
124
+ ```bash
125
+ vc doctor
126
+ ```
127
+
128
+ 5. 둘 다 시작합니다.
129
+
130
+ ```bash
131
+ vc instance start verbalcoding
132
+ vc instance start llm-wiki
133
+ vc instance status
134
+ ```
135
+
136
+ 6. 로그를 확인합니다.
137
+
138
+ ```bash
139
+ tail -n 50 /tmp/verbalcoding-verbalcoding.log
140
+ tail -n 50 /tmp/verbalcoding-llm-wiki.log
141
+ ```
142
+
143
+ 예상 로그:
144
+
145
+ ```text
146
+ Listening in voice channel ... / VerbalCoding
147
+ Listening in voice channel ... / LLM-Wiki
148
+ ```
149
+
150
+ 7. 둘 다 중지합니다.
151
+
152
+ ```bash
153
+ vc instance stop verbalcoding
154
+ vc instance stop llm-wiki
155
+ ```
156
+
157
+ ## 단기: 단일 봇 텍스트/음성 바인딩
158
+
159
+ 봇 토큰이 하나뿐이라면 동시 다중 채널 상주 대신 project-session voice binding을 쓰세요.
160
+
161
+ 대상 텍스트 채널/스레드에서:
162
+
163
+ ```text
164
+ !session attach-voice --voice "LLM-Wiki"
165
+ ```
166
+
167
+ 동작:
168
+
169
+ - 선택된 음성 채널을 현재 텍스트 채널/스레드에 연결합니다.
170
+ - 현재 텍스트 채널에 project session이 없으면 ad-hoc 격리 세션을 만듭니다.
171
+ - 음성 STT/result/progress/final-answer 텍스트가 해당 project transcript 대상으로 라우팅됩니다.
172
+
173
+ 기존 named project session을 연결하려면:
174
+
175
+ ```text
176
+ !session voice llm-wiki --voice "LLM-Wiki"
177
+ ```
178
+
179
+ 이 방식은 라우팅에는 편하지만, 봇 하나를 동시에 두 음성 채널에 머물게 하지는 않습니다. 동시에 여러 프로젝트 방에 영구 상주하려면 여러 봇 토큰/프로세스를 사용하세요.
@@ -19,15 +19,16 @@
19
19
  <img alt="Discord" src="https://img.shields.io/badge/Discord-voice%20bridge-5865F2?logo=discord&logoColor=white">
20
20
  <img alt="STT" src="https://img.shields.io/badge/STT-whisper.cpp-7C3AED">
21
21
  <img alt="TTS" src="https://img.shields.io/badge/TTS-Edge%20%7C%20OpenVoice%20%7C%20Supertonic%20%7C%20SpeechSwift-0EA5E9">
22
+ <img alt="Agents" src="https://img.shields.io/badge/Agents-Hermes%20%7C%20Claude%20%7C%20Codex%20%7C%20Gemini%20%7C%20OpenCode-111827">
22
23
  </p>
23
24
 
24
25
  <p align="center">
25
26
  <img src="../assets/figures/verbalcoding-flow.svg" alt="VerbalCoding voice-to-agent flow" width="860">
26
27
  </p>
27
28
 
28
- ## Why
29
+ ## 왜 필요한가
29
30
 
30
- VerbalCoding은 Discord 음성 채널을 코딩 에이전트용 핸즈프리 조작면으로 바꿉니다. 말로 요청하고, CLI 에이전트가 작업하게 두고, 핵심 답변을 음성으로 다시 들을 수 있습니다 텍스트 기록, 진행 이벤트, 코드/로그 낭독 방지 장치까지 함께 제공합니다.
31
+ VerbalCoding은 Discord 음성 채널을 코딩 에이전트용 핸즈프리 조작면으로 바꿉니다. 말로 요청하고, CLI 에이전트가 작업하게 두고, 핵심 답변을 음성으로 다시 들을 수 있습니다. 텍스트 기록, 진행 이벤트, 코드/로그 낭독 방지 장치도 함께 제공합니다.
31
32
 
32
33
  ## 핵심 기능
33
34
 
@@ -36,20 +37,41 @@ VerbalCoding은 Discord 음성 채널을 코딩 에이전트용 핸즈프리 조
36
37
  | 음성 우선 에이전트 제어 | Hermes Agent, Claude Code, Codex, Gemini CLI, OpenCode, OpenClaw 또는 커스텀 CLI를 말로 제어합니다. |
37
38
  | 로컬 우선 음성 루프 | Discord 음성 캡처 → `whisper.cpp` STT → 에이전트 → 분할 TTS 재생. |
38
39
  | 음성 + 텍스트 컨텍스트 공유 | 지원되는 에이전트에서는 음성 턴과 `!ask` 텍스트 명령이 같은 세션을 재사용합니다. |
39
- | 바지인과 감도 모드 | 재생 중 자연스럽게 끼어들고, 일반/보수 감도 모드를 전환합니다. |
40
+ | 끼어들기와 감도 모드 | 재생 중 자연스럽게 끼어들고, 일반/보수 감도 모드를 전환합니다. |
40
41
  | 다국어 음성 프리셋 | `vc language ko/en/auto`로 STT, 진행 언어, TTS 음성을 함께 바꿉니다. |
41
42
  | 프로젝트별 멀티룸 격리 | 프로젝트 방마다 별도 봇과 Hermes 프로필, 세션, 메모리, 로그를 둡니다. |
42
43
 
43
44
  ## 빠른 시작
44
45
 
46
+ 가장 쉬운 npm 설치:
47
+
45
48
  ```bash
46
- git clone git@github.com:ca1773130n/VerbalCoding.git
49
+ npm install -g verbalcoding
50
+ vc setup --yes
51
+ vc doctor
52
+ vc start
53
+ ```
54
+
55
+ 전역 설치 없이 바로 실행:
56
+
57
+ ```bash
58
+ npx verbalcoding setup --yes
59
+ vc doctor
60
+ vc start
61
+ ```
62
+
63
+ 기여자용 GitHub 클론:
64
+
65
+ ```bash
66
+ git clone https://github.com/ca1773130n/VerbalCoding.git
47
67
  cd VerbalCoding
48
- ./scripts/install.sh
68
+ ./scripts/install.sh --yes
49
69
  vc doctor
50
70
  ./run.sh
51
71
  ```
52
72
 
73
+ `vc setup --yes`와 `./scripts/install.sh --yes`는 가능한 경우 Node/npm 의존성, `ffmpeg`, `whisper-cli`, 기본 whisper.cpp 모델, 로컬 `.venv-tts` Edge TTS helper를 준비합니다. macOS/Homebrew와 일반적인 Linux 패키지 매니저(`apt`, `dnf`, `pacman`)를 지원합니다.
74
+
53
75
  ## 동작 방식
54
76
 
55
77
  ```mermaid
@@ -65,57 +87,71 @@ flowchart LR
65
87
 
66
88
  ## 지원 에이전트 백엔드
67
89
 
68
- | Backend | Default command | Session support |
90
+ | 백엔드 | 기본 명령 | 세션 지원 |
69
91
  |---|---:|---|
70
- | Hermes Agent | `hermes chat -Q -q` | Resume, verbose progress, cancellation, final-answer recovery |
71
- | Claude Code | `claude -p` | CLI session file support through adapter defaults |
72
- | Codex CLI | `codex exec` | CLI session file support through adapter defaults |
73
- | Gemini CLI | `gemini -p` | CLI session file support through adapter defaults |
74
- | OpenCode | `opencode run` | CLI session file support through adapter defaults |
75
- | OpenClaw | `openclaw run` | CLI session file support through adapter defaults |
76
- | Custom | `AGENT_COMMAND` | Bring your own non-interactive command |
92
+ | Hermes Agent | `hermes chat -Q -q` | resume, 자세한 진행, cancellation, 최종 답변 복구 |
93
+ | Claude Code | `claude -p` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
94
+ | Codex CLI | `codex exec` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
95
+ | Gemini CLI | `gemini -p` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
96
+ | OpenCode | `opencode run` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
97
+ | OpenClaw | `openclaw run` | 어댑터 기본값을 통한 CLI 세션 파일 지원 |
98
+ | Custom | `AGENT_COMMAND` | 비대화형 명령을 직접 연결 |
77
99
 
78
100
  ## 더 알아보기
79
101
 
80
- | Guide | What you get |
102
+ | 문서 | 내용 |
81
103
  |---|---|
82
- | [Fresh Install](../FRESH_INSTALL.md) | 클린 클론 설치, 모델 다운로드, 첫 실행 |
83
- | [Usage Guide](../USAGE.md) | CLI 명령, Discord 명령, 진행 모드, 지연 시간 지표 |
84
- | [Configuration](../CONFIGURATION.md) | .env, 에이전트 백엔드, MCP, TTS 백엔드, 운영 노트 |
85
- | [Multi-Instance](../MULTI_INSTANCE.md) | 프로젝트마다 영구 Discord 음성방 하나씩 |
86
- | [Release Notes](../RELEASE.md) | 현재 기능과 릴리스 전 체크리스트 |
104
+ | [ 설치](FRESH_INSTALL.ko.md) | npm 설치, 클린 클론, 모델 다운로드, 첫 실행 |
105
+ | [사용 가이드](USAGE.ko.md) | CLI 명령, Discord 명령, 진행 모드, 지연 시간 지표 |
106
+ | [설정](CONFIGURATION.ko.md) | `.env`, 에이전트 백엔드, MCP, TTS 백엔드, 운영 메모 |
107
+ | [멀티 인스턴스](MULTI_INSTANCE.ko.md) | 프로젝트마다 영구 Discord 음성방 하나씩 운영 |
108
+ | [릴리스 노트](RELEASE.ko.md) | 현재 기능과 릴리스 전 체크리스트 |
109
+ | [English docs](../../README.md) | 영어 canonical README와 문서 |
87
110
 
88
111
  ## 작은 명령 지도
89
112
 
90
113
  ```bash
91
- vc status
92
- vc language ko|en|auto
93
- vc bot invite CLIENT_ID
94
- vc instance setup NAME
95
- vc instance start NAME
96
- vc doctor
114
+ vc status # 현재 언어, TTS, 브릿지 설정 보기
115
+ vc language ko|en|auto # STT/진행/TTS 언어 프리셋 전환
116
+ vc bot invite CLIENT_ID # Discord 봇 초대 URL 생성
117
+ vc instance setup NAME # 격리된 프로젝트 음성 봇 생성
118
+ vc instance start NAME # 해당 봇을 백그라운드로 실행
119
+ vc doctor # 비밀값을 숨긴 상태 점검
120
+ vc start # 기본 브릿지 시작
121
+ ```
122
+
123
+ Discord에서:
124
+
125
+ ```text
126
+ !join !ask <prompt> !verbose on/off
127
+ !latency !sensitivity normal !sensitivity conservative
128
+ !session new <name> <workdir> [context] --voice <voice-channel>
97
129
  ```
98
130
 
99
131
  ## 요구 사항
100
132
 
101
- | Layer | Default |
133
+ | 계층 | 기본값 |
102
134
  |---|---|
103
- | Runtime | Node.js 20+, npm |
104
- | Audio | `ffmpeg` |
105
- | STT | `whisper.cpp` / `whisper-cli` |
135
+ | Runtime | Node.js 20+, npm; 설치 스크립트가 Homebrew/apt/dnf/pacman으로 설치 시도 |
136
+ | Audio | `ffmpeg`; 설치 스크립트가 설치 시도 |
137
+ | STT | `whisper.cpp` / `whisper-cli`; macOS는 Homebrew, Linux는 로컬 빌드 fallback |
138
+ | TTS | Edge TTS CLI; 필요하면 `.venv-tts` 생성 |
106
139
  | Discord | Bot token, Message Content intent, voice permissions |
107
- | Agent | At least one authenticated CLI harness, Hermes Agent by default |
108
- | Platform focus | macOS / Apple Silicon currently gets the most testing |
140
+ | Agent | 인증된 CLI 하네스 하나 이상; 기본은 Hermes Agent |
141
+ | Platform focus | macOS / Apple Silicon 가장 많이 테스트; Linux bootstrap은 best-effort |
109
142
 
110
143
  ## 기여
111
144
 
145
+ 변경 전 가벼운 검증:
146
+
112
147
  ```bash
113
148
  node --check app-node/main.mjs
114
149
  npm test
115
150
  bash -n run.sh scripts/install.sh
151
+ npm pack --dry-run
116
152
  vc doctor
117
153
  ```
118
154
 
119
155
  ## 상태
120
156
 
121
- VerbalCoding is public-release oriented but still early. Demo video/GIF, broader Linux notes, and a formal license file are still TODOs.
157
+ VerbalCoding 공개 릴리스를 지향하지만 아직 초기 단계입니다. 데모 영상/GIF, 넓은 Linux 검증, CI와 보안 리뷰를 계속 보강하면 좋습니다.
@@ -0,0 +1,72 @@
1
+ # VerbalCoding 릴리스 노트
2
+
3
+ ## 현재 릴리스 후보
4
+
5
+ VerbalCoding은 음성으로 CLI 기반 코딩 에이전트를 제어하기 위한 Discord 음성 브릿지입니다. 공개 릴리스를 지향하며, macOS / Apple Silicon 경로가 가장 많이 테스트되어 있고, 일반적인 Linux 패키지 매니저에 대해서는 best-effort 부트스트랩을 제공합니다.
6
+
7
+ ### 포함된 기능
8
+
9
+ - Node `@discordjs/voice` 기반 Discord 음성 수신.
10
+ - `whisper.cpp` + Metal 기반 로컬 한국어 STT.
11
+ - 한국어 기본 음성을 사용하는 Edge TTS 재생.
12
+ - 범용 CLI 하네스 어댑터 레이어:
13
+ - Hermes Agent
14
+ - Claude Code
15
+ - Codex CLI
16
+ - Gemini CLI
17
+ - OpenCode
18
+ - OpenClaw
19
+ - custom command
20
+ - Hermes 백엔드의 음성/텍스트 공유 세션 지원.
21
+ - 긴 답변 TTS chunking과 반응형 barge-in.
22
+ - 큰 diff/code/log 출력이 음성으로 읽히지 않도록 하는 guardrail.
23
+ - 실내와 noisy/outdoor 환경을 위한 normal/conservative 감도 모드.
24
+ - 설정 마법사, `.env.example`, `vc doctor` prerequisite checker, OS 패키지/npm 의존성/Edge TTS helper/기본 whisper.cpp 모델을 준비하는 `./scripts/install.sh --yes` 부트스트랩.
25
+ - 긴 에이전트 작업 중 텍스트 전용 중간 단계 업데이트를 위한 선택적 verbose progress mode.
26
+ - 파이프라인 최적화를 위한 JSONL latency metrics와 `!latency` / `!metrics` 요약.
27
+ - 낮아진 기본 utterance idle wait (`UTTERANCE_IDLE_MS=2000`)로 사용자가 말한 뒤 STT가 약 0.6초 더 빨리 시작.
28
+ - 멀티 인스턴스 Hermes 프로필 격리: `vc instance setup <name>`이 자동으로 Hermes 프로필을 `~/.hermes/profiles/<name>`에 clone하고, instance workdir을 설정하고, SOUL.md를 초기화하고, instance env에 `HERMES_HOME`을 기록합니다. `vc instance start`는 누락된 profile을 self-heal하고, `vc doctor`는 profile-dir 존재와 `terminal.cwd` 일관성을 검사합니다.
29
+ - npm 공개 패키지: `npm install -g verbalcoding`, `vc setup --yes`, `vc start` 경로 지원.
30
+
31
+ ### 릴리스 전 체크리스트
32
+
33
+ 저장소 루트에서 실행:
34
+
35
+ ```bash
36
+ ./scripts/install.sh --yes --no-wizard
37
+ ./scripts/docker_ubuntu_smoke.sh # Docker 필요; ubuntu:24.04 clean install 검증
38
+ node --check app-node/main.mjs app-node/agent_adapters.mjs app-node/install_config.mjs scripts/install.mjs
39
+ npm test
40
+ PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q || [ $? -eq 5 ] # Python 테스트가 없으면 exit 5 허용
41
+ bash -n run.sh scripts/install.sh scripts/bootstrap_prereqs.sh scripts/docker_ubuntu_smoke.sh
42
+ npm pack --dry-run
43
+ vc doctor
44
+ git diff --check
45
+ ```
46
+
47
+ 수동 스모크 테스트:
48
+
49
+ 1. `vc start` 또는 `./run.sh`로 브릿지를 시작합니다.
50
+ 2. 로그에 `Logged in as <bot-name>`이 있는지 확인합니다.
51
+ 3. 로그에 `Listening in voice channel ... / 일반` 또는 설정된 기본 채널이 있는지 확인합니다.
52
+ 4. Discord에서 `!ping`을 실행합니다.
53
+ 5. Discord 음성에서 짧은 한국어 요청을 말합니다.
54
+ 6. STT transcript, agent response, TTS playback, barge-in 동작을 확인합니다.
55
+
56
+ ### 알려진 요구 사항
57
+
58
+ - macOS + Homebrew 또는 Linux + `apt`, `dnf`, `pacman` best-effort bootstrap.
59
+ - `ffmpeg`; 설치기가 설치를 시도합니다.
60
+ - `whisper-cli`; macOS에서는 Homebrew를 사용하고, Linux에서는 로컬 `vendor/whisper.cpp` 빌드 fallback을 사용합니다.
61
+ - 기본 모델 `models/ggml-small-q5_1.bin`; `--skip-model`을 쓰지 않으면 설치기가 다운로드합니다.
62
+ - PATH의 Edge TTS CLI 또는 로컬 `.venv-tts/bin/edge-tts`; 필요하면 설치기가 로컬 helper를 만듭니다.
63
+ - `.env`, `instances/<name>.env`, `~/.zshrc`, runtime env 중 하나에 Discord bot token.
64
+ - 선택한 CLI 하네스가 설치되고 인증되어 있어야 합니다.
65
+
66
+ ### 아직 public release 전에 보강하면 좋은 것
67
+
68
+ - GitHub Actions CI.
69
+ - Demo video / GIF.
70
+ - Discord bot setup screenshots.
71
+ - 스크립트 수준 검증을 넘어 실제 여러 Linux 배포판에서 더 넓은 검증.
72
+ - 모든 logging path 보안 리뷰.
@@ -0,0 +1,119 @@
1
+ # VerbalCoding 사용 가이드
2
+
3
+ 이 문서는 README에 다 넣기에는 긴 실제 운영 방법을 모아 둔 사용 설명서입니다.
4
+
5
+ ## CLI 명령
6
+
7
+ ```bash
8
+ vc setup --yes # npm 설치 후 의존성 부트스트랩과 설정 마법사 실행
9
+ vc start # 기본 Discord 음성 브릿지 시작
10
+ vc status # STT 언어, 진행 언어, TTS 음성 상태 보기
11
+ vc language en # 영어 STT + 영어 진행/TTS 음성
12
+ vc language ko # 한국어 STT + 한국어 진행/TTS 음성
13
+ vc language auto # Whisper 자동 언어 감지 + 진행/TTS 음성 프리셋
14
+ vc restart auto status # 커밋 시 음성 봇 자동 재시작 설정 보기
15
+ vc restart auto on # 커밋 시 음성 봇 자동 재시작 켜기
16
+ vc restart auto off # 자동 재시작 끄기; 기본값
17
+ vc bot invite CLIENT_ID # 필요한 권한이 포함된 Discord 초대 URL 출력
18
+ vc instance status # 인스턴스별 설정과 프로세스 상태 목록 보기
19
+ vc instance setup NAME # instances/NAME.env 작성 및 Hermes 프로필 생성
20
+ vc instance start NAME # ./run.sh instances/NAME.env를 백그라운드로 시작
21
+ vc instance stop NAME # 백그라운드 인스턴스 중지 및 pid 파일 제거
22
+ vc doctor # 비밀값을 숨긴 상태 점검 실행
23
+ npm run mcp # stdio MCP 서버 실행
24
+ ```
25
+
26
+ 언어 변경은 `.env`를 수정합니다. 적용하려면 `vc start`, `./run.sh`, 또는 사용 중인 프로세스 매니저로 브릿지를 재시작하세요.
27
+
28
+ ## 실행 모드
29
+
30
+ npm으로 설치한 기본 브릿지:
31
+
32
+ ```bash
33
+ vc start
34
+ ```
35
+
36
+ GitHub 클론에서 직접 실행:
37
+
38
+ ```bash
39
+ ./run.sh
40
+ ```
41
+
42
+ 프로젝트별 인스턴스 env로 실행:
43
+
44
+ ```bash
45
+ ./run.sh instances/my-project.env
46
+ # 또는
47
+ VERBALCODING_INSTANCE_ENV=instances/my-project.env ./run.sh
48
+ ```
49
+
50
+ 봇은 설정된 음성 채널 이름 중 첫 번째로 자동 입장합니다. 기본값은 `일반,General,general`입니다.
51
+
52
+ ## Discord 명령
53
+
54
+ | 명령 | 용도 |
55
+ |---|---|
56
+ | `!ping` | 봇 연결 기본 확인 |
57
+ | `!join` / `!leave` | 음성 채널 입장/퇴장 |
58
+ | `!say <text>` | 텍스트를 바로 TTS로 읽기 |
59
+ | `!voice-test <text>` | 현재 TTS 백엔드 테스트 |
60
+ | `!voice-clone capture` | 다음 유효 발화를 OpenVoice 기준 샘플로 저장 |
61
+ | `!voice-clone status` / `!voice-clone cancel` | 샘플 캡처 상태 확인/취소 |
62
+ | `!ask <prompt>` | 음성과 같은 선택된 CLI 어댑터로 텍스트 요청 보내기 |
63
+ | `!session status` | 현재 프로젝트/default 에이전트 세션 보기 |
64
+ | `!session new <name> <workdir> [context] --voice <voice-channel>` | 프로젝트 단위 Hermes 세션 생성 |
65
+ | `!session attach-voice [sessionName] --voice <voice-channel>` | 현재 텍스트 채널/스레드를 음성 채널에 연결 |
66
+ | `!session list` | 설정된 프로젝트 세션 목록 보기 |
67
+ | `!session reset` / `!reset-session` | 현재 프로젝트/default 세션 파일 초기화 |
68
+ | `!verbose on/off` | 자세한 진행 업데이트 켜기/끄기 |
69
+ | `!latency` / `!metrics` | 최근 지연 시간 요약 보기 |
70
+ | `!sensitivity normal/conservative` | 끼어들기 감도 전환 |
71
+
72
+ 음성으로도 “외부 모드”, “보수 모드”, “실내”, “기본 감도” 같은 감도 전환과 “잠깐”, “멈춰”, “그만” 같은 명확한 중단 표현을 처리합니다. “상세 진행 켜” / “상세 진행 꺼”처럼 말해서 verbose progress도 바꿀 수 있습니다.
73
+
74
+ ## 자세한 진행 모드
75
+
76
+ 자세한 진행은 기본적으로 꺼져 있습니다. `.env`에 `AGENT_VERBOSE_PROGRESS=1`을 설정하거나 Discord에서 `!verbose on`, 또는 음성으로 “상세 진행 켜”라고 말해 켤 수 있습니다.
77
+
78
+ 켜져 있으면 긴 작업 중 이런 짧은 진행 줄을 텍스트로 보냅니다.
79
+
80
+ ```text
81
+ 🤖 에이전트 호출 시작
82
+ 📖 파일 읽기 app-node/main.mjs
83
+ 🔎 웹 검색 실행
84
+ ⌨️ 터미널 명령 실행
85
+ 🤖 에이전트 응답 수신
86
+ ```
87
+
88
+ 이 모드는 선택된 CLI 하네스에 `VERBALCODING_PROGRESS: ...` 줄을 내보내도록 요청하고, 가능하면 stdout/stderr의 일반적인 도구 사용 흔적도 요약합니다. 비밀값처럼 보이는 필드는 숨기고, 진행 줄은 최종 음성 답변에서 제거합니다.
89
+
90
+ ## 지연 시간 지표
91
+
92
+ VerbalCoding은 각 턴의 지연 시간 기록을 JSONL로 저장합니다. 기본 경로:
93
+
94
+ ```text
95
+ ./.logs/latency.jsonl
96
+ ```
97
+
98
+ 각 기록에는 상태, 전체 시간, 음성 캡처 시간, 발화 idle 대기, STT 시간, 에이전트 시간, TTS 합성/재생 시간, 청크 수, 발화 길이, 답변 길이, 가능한 경우 오디오 레벨이 포함됩니다.
99
+
100
+ Discord에서:
101
+
102
+ ```text
103
+ !latency
104
+ !metrics
105
+ ```
106
+
107
+ 요약은 최근 200개 기록 기준으로 count, average, p95, max, non-OK 상태를 보여줍니다.
108
+
109
+ ## 테스트
110
+
111
+ ```bash
112
+ node --check app-node/main.mjs
113
+ npm test
114
+ bash -n run.sh scripts/install.sh
115
+ npm pack --dry-run
116
+ vc doctor
117
+ ```
118
+
119
+ `vc doctor`는 비밀값을 출력하지 않고 필수 값이 설정됐는지만 확인합니다. 또한 `instances/*.env`에서 중복 토큰 지문과 충돌하는 런타임 경로를 검사합니다.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verbalcoding",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Discord voice bridge for CLI coding agents.",
5
5
  "license": "MIT",
6
6
  "repository": {