verbalcoding 0.2.6 → 0.2.8

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 (44) hide show
  1. package/README.md +12 -22
  2. package/app-node/cli_install.test.mjs +15 -0
  3. package/docs/FRESH_INSTALL.md +8 -2
  4. package/docs/assets/figures/verbalcoding-flow.svg +45 -30
  5. package/docs/i18n/CONFIGURATION.es.md +239 -0
  6. package/docs/i18n/CONFIGURATION.fr.md +239 -0
  7. package/docs/i18n/CONFIGURATION.ja.md +239 -0
  8. package/docs/i18n/CONFIGURATION.ko.md +66 -74
  9. package/docs/i18n/CONFIGURATION.ru.md +239 -0
  10. package/docs/i18n/CONFIGURATION.zh.md +239 -0
  11. package/docs/i18n/FRESH_INSTALL.es.md +207 -0
  12. package/docs/i18n/FRESH_INSTALL.fr.md +207 -0
  13. package/docs/i18n/FRESH_INSTALL.ja.md +207 -0
  14. package/docs/i18n/FRESH_INSTALL.ko.md +60 -54
  15. package/docs/i18n/FRESH_INSTALL.ru.md +207 -0
  16. package/docs/i18n/FRESH_INSTALL.zh.md +207 -0
  17. package/docs/i18n/MULTI_INSTANCE.es.md +180 -0
  18. package/docs/i18n/MULTI_INSTANCE.fr.md +180 -0
  19. package/docs/i18n/MULTI_INSTANCE.ja.md +179 -0
  20. package/docs/i18n/MULTI_INSTANCE.ko.md +46 -46
  21. package/docs/i18n/MULTI_INSTANCE.ru.md +179 -0
  22. package/docs/i18n/MULTI_INSTANCE.zh.md +179 -0
  23. package/docs/i18n/README.es.md +83 -55
  24. package/docs/i18n/README.fr.md +85 -57
  25. package/docs/i18n/README.ja.md +83 -55
  26. package/docs/i18n/README.ko.md +47 -56
  27. package/docs/i18n/README.ru.md +86 -58
  28. package/docs/i18n/README.zh.md +83 -56
  29. package/docs/i18n/RELEASE.es.md +74 -0
  30. package/docs/i18n/RELEASE.fr.md +74 -0
  31. package/docs/i18n/RELEASE.ja.md +74 -0
  32. package/docs/i18n/RELEASE.ko.md +38 -36
  33. package/docs/i18n/RELEASE.ru.md +74 -0
  34. package/docs/i18n/RELEASE.zh.md +74 -0
  35. package/docs/i18n/USAGE.es.md +161 -0
  36. package/docs/i18n/USAGE.fr.md +161 -0
  37. package/docs/i18n/USAGE.ja.md +161 -0
  38. package/docs/i18n/USAGE.ko.md +61 -72
  39. package/docs/i18n/USAGE.ru.md +161 -0
  40. package/docs/i18n/USAGE.zh.md +161 -0
  41. package/package.json +1 -1
  42. package/scripts/bootstrap_prereqs.sh +15 -3
  43. package/scripts/cli.mjs +1 -1
  44. package/scripts/doctor.mjs +114 -8
@@ -0,0 +1,179 @@
1
+ # マルチインスタンス VerbalCoding
2
+
3
+ VerbalCoding は、複数の独立した Discord 音声ブリッジプロセスを実行できます。各プロセスは既存の単一インスタンス Node ブリッジのままですが、異なる `instances/<name>.env` ファイルを読み込み、異なる Discord ボットトークンを使います。
4
+
5
+ 各プロジェクトが専用の Discord 音声チャンネルに常駐し、専用の文字起こしチャンネル/スレッドへ書き込む必要がある場合に使います。
6
+
7
+ ## 複数のボットトークンが必要な理由
8
+
9
+ Discord 音声の常駐は、実質的に 1 つのギルドにつき 1 ボットアカウントあたり 1 つのアクティブな音声接続です。同じギルド内で 1 つのボットトークンが別の音声チャンネルに参加すると、以前のチャンネルに同時に常駐し続けることはできません。同時に使うプロジェクトルームには、プロジェクトごとに 1 つの 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 トークンを含む可能性があるため無視されます。`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、音声チャンネル、文字起こし先、作業ディレクトリ、プロジェクトコンテキスト、分離されたランタイムパスを尋ねます。`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 のアプリケーション/ボットは依然として 1 つ必要ですが、OAuth URL や権限整数を手動で組み立てずに済みます。
45
+
46
+ ### Hermes プロファイル分離
47
+
48
+ 各インスタンスには `~/.hermes/profiles/<name>` に独自の Hermes ホームが与えられるため、メモリ、MEMORY.md、SOUL.md、学習済みスキルがプロジェクト間で漏れません。
49
+
50
+ `vc instance setup <name>` は自動的に次を行います:
51
+
52
+ - `hermes profile create <name> --clone-from default` を実行します(現在の `~/.hermes` から API キーとモデルを引き継ぎ、セッションとメモリは新規に開始します)。
53
+ - 新しいプロファイルの `terminal.cwd` をインスタンスの作業ディレクトリに設定します。
54
+ - ウィザードのプロジェクトコンテキスト回答から `<profile>/SOUL.md` を初期化します。
55
+ - `instances/<name>.env` に `HERMES_HOME=...` を書き込みます。
56
+
57
+ `vc instance start <name>` は自己修復します。env が指す Hermes プロファイルディレクトリが存在しない場合、起動前に再作成します。
58
+
59
+ Hermes は名前をディレクトリおよび設定キーとして使うため、インスタンス名は `^[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
+ 各インスタンスには、ログ/デバッグ/セッションファイル用に一意の値を与えてください。`HERMES_HOME` と対応する `~/.hermes/profiles/<name>` ディレクトリは `vc instance setup` によって自動作成されます。`vc doctor` は、重複トークン、衝突するランタイムパス、存在しないプロファイルディレクトリ、プロファイルとインスタンス間の `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` をデタッチして実行し、`.run/instances/<name>.pid` を書き込みます。
93
+
94
+ `stop` は `SIGTERM` を送り、最大 10 秒待ってから `SIGKILL` にフォールバックし、pid ファイルを削除します。
95
+
96
+ ## 例: 2 つの永続音声ルーム
97
+
98
+ 1. 2 つの Discord アプリケーション/ボットを作成します:
99
+ - VerbalCoding bot
100
+ - LLM-Wiki bot
101
+
102
+ 2. テキストおよび音声権限付きで両方をサーバーに招待します:
103
+ - チャンネルを見る
104
+ - メッセージを送信
105
+ - スレッドでメッセージを送信
106
+ - メッセージ履歴を読む
107
+ - アプリケーションコマンドを使う
108
+ - 接続
109
+ - 発話
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 ホームから複製された `~/.hermes/profiles/<name>` も作成されるため、2 つのインスタンスは同じ認証/モデルで開始しながら、各プロジェクトの学習に伴って独立したメモリとスキルを蓄積します。
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
+ ボットトークンが 1 つしかない場合は、同時マルチチャンネル常駐ではなく、プロジェクトセッションの音声紐付けを使ってください。
160
+
161
+ 対象のテキストチャンネル/スレッドで次を実行します:
162
+
163
+ ```text
164
+ !session attach-voice --voice "LLM-Wiki"
165
+ ```
166
+
167
+ 動作:
168
+
169
+ - 選択した音声チャンネルを現在のテキストチャンネル/スレッドに紐付けます。
170
+ - 現在のテキストチャンネルにプロジェクトセッションがない場合、アドホックな分離セッションを作成します。
171
+ - 音声 STT/結果/進捗/最終回答テキストは、そのアクティブなプロジェクト文字起こし先へルーティングされます。
172
+
173
+ 既存の名前付きプロジェクトセッションを紐付けるには:
174
+
175
+ ```text
176
+ !session voice llm-wiki --voice "LLM-Wiki"
177
+ ```
178
+
179
+ これはルーティングには便利ですが、1 つのボットを同時に 2 つの音声チャンネルへ常駐させるものではありません。同時に永続常駐させるには、複数のボットトークン/プロセスを使ってください。
@@ -1,64 +1,64 @@
1
- # VerbalCoding 멀티 인스턴스
1
+ # Multi-instance VerbalCoding
2
2
 
3
- VerbalCoding은 여러 개의 독립적인 Discord 음성 브릿지 프로세스를 실행할 수 있습니다. 각 프로세스는 같은 단일 인스턴스 Node 브릿지를 사용하지만, 서로 다른 `instances/<name>.env` 파일과 서로 다른 Discord bot token을 로드합니다.
3
+ VerbalCoding은 여러 개의 독립적인 Discord 음성 브리지 프로세스를 실행할 수 있습니다. 각 프로세스는 여전히 기존 단일 인스턴스 Node 브리지이지만, 서로 다른 `instances/<name>.env` 파일을 로드하고 서로 다른 Discord 토큰을 사용합니다.
4
4
 
5
- 프로젝트마다 자기 Discord 음성 채널에 항상 붙어 있고, 자기 transcript 채널/스레드에 기록해야 할 때 사용하세요.
5
+ 프로젝트가 자체 Discord 음성 채널을 영구적으로 차지하고 자체 전사 채널/스레드에 기록해야 할 때 사용하세요.
6
6
 
7
- ## 여러 봇 토큰이 필요한가
7
+ ## 여러 봇 토큰이 필요한 이유
8
8
 
9
- Discord 음성 상주 방식은 사실상 길드마다 봇 계정 하나가 동시에 하나의 음성 연결만 유지하는 구조입니다. 같은 봇 토큰이 같은 길드의 다른 음성 채널에 들어가면 이전 채널에도 계속 남아 있을 수 없습니다. 동시에 여러 프로젝트 방을 유지하려면 프로젝트마다 Discord 애플리케이션/봇을 하나씩 만들어야 합니다.
9
+ Discord 음성 상주는 사실상 길드당 봇 계정 하나에 활성 음성 연결 하나입니다. 같은 길드에서 하나의 봇 토큰이 다른 음성 채널에 참가하면 이전 채널에 영구 연결된 상태를 동시에 유지할 수 없습니다. 동시에 여러 프로젝트 방을 쓰려면 프로젝트마다 Discord 애플리케이션/봇을 하나씩 만드세요.
10
10
 
11
- ## 파일 구조
11
+ ## 파일 배치
12
12
 
13
13
  ```text
14
14
  instances/
15
15
  README.md
16
16
  example.env
17
- llm-wiki.env # 로컬 전용, git에서 무시
18
- verbalcoding.env # 로컬 전용, git에서 무시
17
+ llm-wiki.env # 로컬 전용, git에서 무시됨
18
+ verbalcoding.env # 로컬 전용, git에서 무시됨
19
19
  .run/instances/
20
- llm-wiki.pid # 런타임 전용, git에서 무시
20
+ llm-wiki.pid # 런타임 전용, git에서 무시됨
21
21
  ```
22
22
 
23
- 실제 `instances/*.env` 파일에는 Discord 토큰이 들어갈 수 있으므로 git에서 무시됩니다. `instances/example.env`만 템플릿으로 커밋됩니다.
23
+ 실제 `instances/*.env` 파일은 Discord 토큰을 포함할 수 있으므로 무시됩니다. `instances/example.env`가 커밋된 템플릿입니다.
24
24
 
25
25
  ## 인스턴스 설정 마법사
26
26
 
27
- 일반 사용자는 env 파일을 복사해서 직접 편집하지 않는 편이 좋습니다. 마법사를 실행하세요.
27
+ 일반 사용자는 env 파일을 복사해 수동으로 편집하지 않아도 됩니다. 대신 마법사를 실행하세요:
28
28
 
29
29
  ```bash
30
30
  vc instance setup llm-wiki
31
- # 또는 프로젝트 설정 스크립트에서:
31
+ # 또는 프로젝트 설정 스크립트를 통해:
32
32
  ./scripts/install.sh --instance llm-wiki
33
33
  ```
34
34
 
35
- 마법사는 봇 토큰, Discord Application/Client ID, 음성 채널, transcript 대상, 작업 디렉터리, 프로젝트 컨텍스트, 격리된 런타임 경로를 묻습니다. `instances/<name>.env`를 권한 `0600`으로 작성하고, 기존 파일이 있으면 덮어쓰기 전에 백업하며, 다음 start/status 명령을 출력합니다.
35
+ 마법사는 봇 토큰, Discord Application/Client ID, 음성 채널, 전사 대상, workdir, 프로젝트 컨텍스트, 격리된 런타임 경로를 묻습니다. mode `0600`으로 `instances/<name>.env`를 작성하고, 덮어쓰기 전에 기존 파일을 백업하며, 다음 start/status 명령을 출력합니다.
36
36
 
37
- 설정 중 Discord Application/Client ID를 입력하면 요약에 해당 초대 URL도 출력됩니다. 같은 URL은 언제든지 다시 만들있습니다.
37
+ 설정 중 Discord Application/Client ID를 입력하면 요약에 해당 봇의 초대 URL도 출력됩니다. 같은 URL은 언제든 다음으로 생성할있습니다:
38
38
 
39
39
  ```bash
40
40
  vc bot invite <client-id>
41
41
  vc bot invite <client-id> --guild <guild-id>
42
42
  ```
43
43
 
44
- Discord는 동시에 여러 음성방에 상주하려면 여전히 방마다 Developer Portal 애플리케이션/봇 하나가 필요합니다. 대신 VerbalCoding이 OAuth URL이나 permission integer를 직접 조립할 필요를 없애 줍니다.
44
+ 동시 음성 방마다 Developer Portal 애플리케이션/봇이 하나씩 필요한 점은 변하지 않지만, OAuth URL이나 권한 정수를 수동으로 만들 필요가 없습니다.
45
45
 
46
46
  ### Hermes 프로필 격리
47
47
 
48
- 각 인스턴스는 `~/.hermes/profiles/<name>` 아래에 자기 Hermes home을 갖습니다. 이렇게 하면 memory, MEMORY.md, SOUL.md, 학습된 skills가 프로젝트 사이에 섞이지 않습니다.
48
+ 각 인스턴스는 `~/.hermes/profiles/<name>`에 자체 Hermes home을 갖습니다. 따라서 memory, MEMORY.md, SOUL.md, 학습된 skill이 프로젝트 간에 새지 않습니다.
49
49
 
50
- `vc instance setup <name>`은 자동으로 다음을 수행합니다.
50
+ `vc instance setup <name>`은 자동으로 다음을 수행합니다:
51
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=...`을 씁니다.
52
+ - `hermes profile create <name> --clone-from default` 실행(현재 `~/.hermes`의 API 키와 모델은 가져오며, 세션과 메모리는 새로 시작),
53
+ - 새 프로필의 `terminal.cwd`를 인스턴스 workdir로 설정,
54
+ - 마법사의 프로젝트 컨텍스트 답변으로 `<profile>/SOUL.md` 초기화,
55
+ - `instances/<name>.env`에 `HERMES_HOME=...` 작성.
56
56
 
57
- `vc instance start <name>`은 self-heal을 수행합니다. env가 가리키는 Hermes profile directory가 사라졌다면 시작 전에 다시 만듭니다.
57
+ `vc instance start <name>`은 자가 복구를 수행합니다. env가 이상 존재하지 않는 Hermes 프로필 디렉터리를 가리키면, 시작 명령은 실행 전에 해당 프로필을 다시 만듭니다.
58
58
 
59
- 인스턴스 이름은 Hermes가 디렉터리와 config key로 쓰기 때문에 `^[a-z0-9][a-z0-9_-]{0,63}$` 형식이어야 합니다.
59
+ Hermes가 이름을 디렉터리 설정 키로 사용하므로 인스턴스 이름은 `^[a-z0-9][a-z0-9_-]{0,63}$`와 일치해야 합니다.
60
60
 
61
- ## 생성되는 최소 인스턴스 env 예시
61
+ ## 최소 생성 인스턴스 env
62
62
 
63
63
  ```env
64
64
  INSTANCE_NAME=my-project
@@ -76,7 +76,7 @@ AGENT_CWD=/path/to/my-project
76
76
  AGENT_PROJECT_CONTEXT=Project session: My Project
77
77
  ```
78
78
 
79
- 모든 인스턴스는 log/debug/session 파일 경로가 고유해야 합니다. `HERMES_HOME`과 대응하는 `~/.hermes/profiles/<name>` 디렉터리는 `vc instance setup`이 자동 생성합니다. `vc doctor`는 비밀값을 출력하지 않고 중복 토큰, 충돌하는 런타임 경로, 누락된 profile directory, profile과 instance의 `terminal.cwd` 불일치를 검사합니다.
79
+ 모든 인스턴스에 로그/디버그/세션 파일의 고유 값을 부여하세요. `HERMES_HOME`과 일치하는 `~/.hermes/profiles/<name>` 디렉터리는 `vc instance setup`이 자동으로 만듭니다. `vc doctor`는 비밀 정보를 출력하지 않고 중복 토큰, 충돌하는 런타임 경로, 누락된 프로필 디렉터리, 프로필과 인스턴스 사이의 `terminal.cwd` 불일치를 확인합니다.
80
80
 
81
81
  ## 명령
82
82
 
@@ -89,17 +89,17 @@ vc instance stop my-project
89
89
  vc instance restart my-project
90
90
  ```
91
91
 
92
- `start`는 `./run.sh instances/<name>.env`를 detached로 실행하고 `.run/instances/<name>.pid`를 씁니다.
92
+ `start`는 `./run.sh instances/<name>.env`를 분리 실행하고 `.run/instances/<name>.pid`를 작성합니다.
93
93
 
94
- `stop`은 `SIGTERM`을 보내고 최대 10 기다린 뒤, 필요하면 `SIGKILL`로 fallback하고 pid 파일을 제거합니다.
94
+ `stop`은 `SIGTERM`을 보내고 최대 10초간 기다린 뒤, 필요하면 `SIGKILL`로 폴백하고 pid 파일을 제거합니다.
95
95
 
96
- ## 예시: 영구 음성방 두 개
96
+ ## 예시: 두 개의 영구 음성
97
97
 
98
- 1. Discord 애플리케이션/봇 개를 만듭니다.
98
+ 1. 개의 Discord 애플리케이션/봇을 만듭니다:
99
99
  - VerbalCoding bot
100
100
  - LLM-Wiki bot
101
101
 
102
- 2. 둘 다 서버에 초대하고 텍스트/음성 권한을 줍니다.
102
+ 2. 텍스트 및 음성 권한으로 둘 다 서버에 초대합니다:
103
103
  - View Channel
104
104
  - Send Messages
105
105
  - Send Messages in Threads
@@ -108,24 +108,24 @@ vc instance restart my-project
108
108
  - Connect
109
109
  - Speak
110
110
 
111
- 각 Discord 애플리케이션을 만든 뒤 `vc bot invite <client-id>`를 실행하면 필요한 권한이 포함된 정확한 초대 URL을 출력합니다.
111
+ 각 Discord 애플리케이션을 만든 뒤 `vc bot invite <client-id>`를 사용하면 해당 권한이 포함된 정확한 초대 URL을 출력할 수 있습니다.
112
112
 
113
- 3. 각 로컬 인스턴스 설정 마법사를 실행합니다.
113
+ 3. 각 로컬 인스턴스에 대해 설정 마법사를 실행합니다:
114
114
 
115
115
  ```bash
116
116
  vc instance setup verbalcoding
117
117
  vc instance setup llm-wiki
118
118
  ```
119
119
 
120
- 마법사는 git에서 무시되는 `instances/verbalcoding.env`, `instances/llm-wiki.env`를 권한 `0600`으로 작성하고, 기존 env 있으면 백업합니다. 각 실행은 기본 Hermes home에서 clone한 `~/.hermes/profiles/<name>`도 생성하므로 두 인스턴스는 같은 인증/모델 설정으로 시작하지만, 프로젝트를 학습하면서 서로 독립적인 memory와 skills를 쌓습니다.
120
+ 마법사는 mode `0600`으로 git에서 무시되는 `instances/verbalcoding.env` `instances/llm-wiki.env` 파일을 작성합니다. 또한 기존 인스턴스 env 교체하기 전에 백업합니다. 각 실행은 기본 Hermes home에서 복제한 `~/.hermes/profiles/<name>`도 생성하므로, 두 인스턴스는 같은 인증/모델로 시작하지만 프로젝트를 학습하면서 독립적인 메모리와 skill을 축적합니다.
121
121
 
122
- 4. 설정을 확인합니다.
122
+ 4. 설정을 확인합니다:
123
123
 
124
124
  ```bash
125
125
  vc doctor
126
126
  ```
127
127
 
128
- 5. 둘 다 시작합니다.
128
+ 5. 둘 다 시작합니다:
129
129
 
130
130
  ```bash
131
131
  vc instance start verbalcoding
@@ -133,32 +133,32 @@ vc instance start llm-wiki
133
133
  vc instance status
134
134
  ```
135
135
 
136
- 6. 로그를 확인합니다.
136
+ 6. 로그를 확인합니다:
137
137
 
138
138
  ```bash
139
139
  tail -n 50 /tmp/verbalcoding-verbalcoding.log
140
140
  tail -n 50 /tmp/verbalcoding-llm-wiki.log
141
141
  ```
142
142
 
143
- 예상 로그:
143
+ 예상 로그 줄:
144
144
 
145
145
  ```text
146
146
  Listening in voice channel ... / VerbalCoding
147
147
  Listening in voice channel ... / LLM-Wiki
148
148
  ```
149
149
 
150
- 7. 둘 다 중지합니다.
150
+ 7. 둘 다 중지합니다:
151
151
 
152
152
  ```bash
153
153
  vc instance stop verbalcoding
154
154
  vc instance stop llm-wiki
155
155
  ```
156
156
 
157
- ## 단기: 단일 봇 텍스트/음성 바인딩
157
+ ## 단기 단일 봇 텍스트/음성 바인딩
158
158
 
159
- 봇 토큰이 하나뿐이라면 동시 다중 채널 상주 대신 project-session voice binding을 쓰세요.
159
+ 봇 토큰이 하나뿐이라면 동시 다중 채널 상주 대신 프로젝트 세션 음성 바인딩을 사용하세요.
160
160
 
161
- 대상 텍스트 채널/스레드에서:
161
+ 대상 텍스트 채널/스레드에서 다음을 실행합니다:
162
162
 
163
163
  ```text
164
164
  !session attach-voice --voice "LLM-Wiki"
@@ -166,14 +166,14 @@ vc instance stop llm-wiki
166
166
 
167
167
  동작:
168
168
 
169
- - 선택된 음성 채널을 현재 텍스트 채널/스레드에 연결합니다.
170
- - 현재 텍스트 채널에 project session이 없으면 ad-hoc 격리 세션을 만듭니다.
171
- - 음성 STT/result/progress/final-answer 텍스트가 해당 project transcript 대상으로 라우팅됩니다.
169
+ - 선택한 음성 채널을 현재 텍스트 채널/스레드에 바인딩합니다.
170
+ - 현재 텍스트 채널에 프로젝트 세션이 없으면 임시 격리 세션을 만듭니다.
171
+ - 음성 STT/결과/진행/최종 답변 텍스트가 해당 활성 프로젝트 전사 대상으로 라우팅됩니다.
172
172
 
173
- 기존 named project session을 연결하려면:
173
+ 기존 이름 있는 프로젝트 세션을 연결하려면:
174
174
 
175
175
  ```text
176
176
  !session voice llm-wiki --voice "LLM-Wiki"
177
177
  ```
178
178
 
179
- 방식은 라우팅에는 편하지만, 하나를 동시에 두 음성 채널에 머물게 하지는 않습니다. 동시에 여러 프로젝트 방에 영구 상주하려면 여러 봇 토큰/프로세스를 사용하세요.
179
+ 이는 라우팅에는 편리하지만, 하나의 봇을 두 음성 채널에 동시에 머물게 하지는 않습니다. 동시 영구 상주에는 여러 봇 토큰/프로세스를 사용하세요.
@@ -0,0 +1,179 @@
1
+ # Многоэкземплярный VerbalCoding
2
+
3
+ VerbalCoding может запускать несколько независимых процессов голосового bridge Discord. Каждый процесс всё ещё является существующим одноэкземплярным Node bridge, но загружает другой файл `instances/<name>.env` и использует другой токен Discord-бота.
4
+
5
+ Используйте это, когда каждый проект должен постоянно занимать собственный голосовой канал Discord и писать в собственный канал/тред расшифровок.
6
+
7
+ ## Почему требуется несколько токенов ботов
8
+
9
+ Присутствие в голосе Discord фактически ограничено одним активным голосовым подключением на аккаунт бота в пределах guild. Если один токен бота подключается к другому голосовому каналу в той же guild, он не может одновременно оставаться постоянно подключённым к предыдущему каналу. Для одновременных проектных комнат создавайте по одному приложению/боту Discord на проект.
10
+
11
+ ## Структура файлов
12
+
13
+ ```text
14
+ instances/
15
+ README.md
16
+ example.env
17
+ llm-wiki.env # local only, ignored by git
18
+ verbalcoding.env # local only, ignored by git
19
+ .run/instances/
20
+ llm-wiki.pid # runtime only, ignored by git
21
+ ```
22
+
23
+ Настоящие файлы `instances/*.env` игнорируются, потому что могут содержать токены Discord. `instances/example.env` — закоммиченный шаблон.
24
+
25
+ ## Мастер настройки экземпляра
26
+
27
+ Пользователям не следует копировать и вручную редактировать env-файлы для обычного использования. Вместо этого запустите мастер:
28
+
29
+ ```bash
30
+ vc instance setup llm-wiki
31
+ # or through the project setup script:
32
+ ./scripts/install.sh --instance llm-wiki
33
+ ```
34
+
35
+ Мастер запрашивает токен бота, Discord Application/Client ID, голосовой канал, цель расшифровок, workdir, контекст проекта и изолированные runtime-пути. Он записывает `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 на каждую одновременную голосовую комнату, но это избавляет от ручной сборки OAuth URL или целых чисел разрешений.
45
+
46
+ ### Изоляция профилей Hermes
47
+
48
+ Каждый экземпляр получает собственный home Hermes в `~/.hermes/profiles/<name>`, чтобы память, MEMORY.md, SOUL.md и изученные skills не перетекали между проектами.
49
+
50
+ `vc instance setup <name>` автоматически:
51
+
52
+ - запускает `hermes profile create <name> --clone-from default` (переносит API-ключи и модель из текущего `~/.hermes`; сессии и память начинаются заново),
53
+ - задаёт `terminal.cwd` нового профиля в workdir экземпляра,
54
+ - заполняет `<profile>/SOUL.md` из ответа мастеру о контексте проекта,
55
+ - записывает `HERMES_HOME=...` в `instances/<name>.env`.
56
+
57
+ `vc instance start <name>` самовосстанавливается: если env указывает на директорию профиля Hermes, которой больше нет, команда start пересоздаёт её перед запуском.
58
+
59
+ Имена экземпляров должны соответствовать `^[a-z0-9][a-z0-9_-]{0,63}$`, потому что Hermes использует имя как директорию и ключ конфигурации.
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
+ Дайте каждому экземпляру уникальные значения для файлов логов/debug/session. `HERMES_HOME` и соответствующая директория `~/.hermes/profiles/<name>` создаются автоматически командой `vc instance setup`. `vc doctor` проверяет повторяющиеся токены, конфликтующие runtime-пути, отсутствующие директории профилей и несоответствия `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` и удаляет pid-файл.
95
+
96
+ ## Пример: две постоянные голосовые комнаты
97
+
98
+ 1. Создайте два приложения/бота Discord:
99
+ - бот VerbalCoding
100
+ - бот LLM-Wiki
101
+
102
+ 2. Пригласите обоих на сервер с текстовыми и голосовыми разрешениями:
103
+ - Просмотр канала
104
+ - Отправка сообщений
105
+ - Отправка сообщений в тредах
106
+ - Чтение истории сообщений
107
+ - Использование команд приложения
108
+ - Подключение
109
+ - Речь
110
+
111
+ Используйте `vc bot invite <client-id>` после создания каждого приложения Discord, чтобы напечатать точный URL приглашения с этими разрешениями.
112
+
113
+ 3. Запустите мастер настройки для каждого локального экземпляра:
114
+
115
+ ```bash
116
+ vc instance setup verbalcoding
117
+ vc instance setup llm-wiki
118
+ ```
119
+
120
+ Мастер записывает игнорируемые файлы `instances/verbalcoding.env` и `instances/llm-wiki.env` с режимом `0600`; он также создаёт резервную копию существующего env экземпляра перед заменой. Каждый запуск также создаёт `~/.hermes/profiles/<name>`, клонированный из вашего стандартного Hermes home, поэтому два экземпляра стартуют с одинаковой аутентификацией/моделью, но накапливают независимую память и 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
+ Если у вас есть только один токен бота, используйте привязку голоса проектной сессии вместо одновременного присутствия в нескольких каналах.
160
+
161
+ Выполните это в целевом текстовом канале/треде:
162
+
163
+ ```text
164
+ !session attach-voice --voice "LLM-Wiki"
165
+ ```
166
+
167
+ Поведение:
168
+
169
+ - Привязывает выбранный голосовой канал к текущему текстовому каналу/треду.
170
+ - Если в текущем текстовом канале нет проектной сессии, создаёт ad-hoc изолированную сессию.
171
+ - Текст voice STT/result/progress/final-answer направляется в активную цель расшифровок проекта.
172
+
173
+ Чтобы привязать существующую именованную проектную сессию:
174
+
175
+ ```text
176
+ !session voice llm-wiki --voice "LLM-Wiki"
177
+ ```
178
+
179
+ Это удобно для маршрутизации, но не заставляет одного бота одновременно оставаться в двух голосовых каналах. Для одновременного постоянного присутствия используйте несколько токенов/процессов ботов.