@vox-ai/cli-darwin-x64 0.1.0-beta.2 → 0.1.0-beta.20
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 +95 -779
- package/bin/vox +0 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,855 +1,171 @@
|
|
|
1
1
|
# @vox-ai/cli
|
|
2
2
|
|
|
3
|
-
vox.ai
|
|
3
|
+
vox.ai CLI for agent-as-code workflows.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`vox` lets you build, validate, diff, and ship [vox.ai](https://www.tryvox.co) voice agents as code. It is designed to be driven both by people in a terminal and by coding agents (Claude Code, Codex, and similar): edit JSON sources in your repo, read structured `--json` output, review diffs, and push when you are ready.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
The CLI is the durable authoring surface — what belongs in your repo, gets reviewed, and can be reproduced or rolled back. The dashboard stays the viewer and admin surface.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
| --- | --- |
|
|
11
|
-
| `docs` | 현재 플랫폼 의미와 API 레퍼런스 조회 |
|
|
12
|
-
| `skills` | 설계 playbook과 워크플로우 라우팅 |
|
|
13
|
-
| `MCP` | stateless 조회와 일회성 작업 |
|
|
14
|
-
| `vox CLI` | 레포에 남아야 하는 durable 저작, 검증, diff, push, status, delete |
|
|
15
|
-
|
|
16
|
-
경계 규칙은 단순합니다. 레포에 남아야 하거나, 리뷰돼야 하거나, 재현/롤백돼야 하면 CLI를 사용합니다. 조회거나 일회성이면 MCP를 사용합니다.
|
|
17
|
-
|
|
18
|
-
```text
|
|
19
|
-
auth -> pull/init -> edit JSON -> doctor -> validate -> diff/status -> push -> version save -> promote -> mcp
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## 목차
|
|
23
|
-
|
|
24
|
-
- [설치와 업그레이드](#설치와-업그레이드)
|
|
25
|
-
- [명령 지도](#명령-지도)
|
|
26
|
-
- [Agent-as-Code](#agent-as-code)
|
|
27
|
-
- [Tools-as-Code](#tools-as-code)
|
|
28
|
-
- [Knowledge-as-Code](#knowledge-as-code)
|
|
29
|
-
- [Flow 편집](#flow-편집)
|
|
30
|
-
- [검증, diff, push](#검증-diff-push)
|
|
31
|
-
- [개발](#개발)
|
|
32
|
-
- [인증](#인증)
|
|
33
|
-
- [MCP](#mcp)
|
|
34
|
-
- [Listen / Trigger](#listen--trigger)
|
|
35
|
-
|
|
36
|
-
## 설치와 업그레이드
|
|
37
|
-
|
|
38
|
-
Public beta의 설치 채널은 npm과 Homebrew 두 가지입니다. npm은 Node 기반 cross-platform 채널이고, Homebrew는 macOS-first 단일 바이너리 채널입니다.
|
|
9
|
+
## Install
|
|
39
10
|
|
|
40
11
|
```bash
|
|
41
|
-
# npm
|
|
12
|
+
# npm (macOS, Linux, and Windows x64; requires Node >= 20.17)
|
|
42
13
|
npm install -g @vox-ai/cli
|
|
43
14
|
|
|
44
|
-
# npm
|
|
15
|
+
# npm pre-release channel
|
|
45
16
|
npm install -g @vox-ai/cli@beta
|
|
46
17
|
|
|
47
|
-
# macOS
|
|
18
|
+
# Homebrew (macOS)
|
|
48
19
|
brew install vox-public/tap/vox
|
|
49
20
|
```
|
|
50
21
|
|
|
51
|
-
|
|
22
|
+
On **Windows**, npm is the official install path: `npm install -g @vox-ai/cli@beta`, then run `vox` (or `vox.cmd`) from any terminal. There is no separate `.exe` or zip download to install.
|
|
52
23
|
|
|
53
|
-
|
|
54
|
-
# npm stable
|
|
55
|
-
npm install -g @vox-ai/cli@latest
|
|
56
|
-
|
|
57
|
-
# npm beta
|
|
58
|
-
npm install -g @vox-ai/cli@beta
|
|
59
|
-
|
|
60
|
-
# Homebrew
|
|
61
|
-
brew update
|
|
62
|
-
brew upgrade vox-public/tap/vox
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
`vox upgrade`는 첫 버전에서 self-update를 실행하지 않습니다. 대신 현재 설치 경로를 best-effort로 감지하고, npm registry의 `latest`/`beta` dist-tag를 확인한 뒤 실행해야 할 명령을 출력합니다.
|
|
24
|
+
Verify the install:
|
|
66
25
|
|
|
67
26
|
```bash
|
|
68
|
-
vox
|
|
69
|
-
vox
|
|
70
|
-
vox upgrade --json
|
|
27
|
+
vox --version
|
|
28
|
+
vox --help
|
|
71
29
|
```
|
|
72
30
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
## 명령 지도
|
|
76
|
-
|
|
77
|
-
### 구현된 명령 그룹
|
|
78
|
-
|
|
79
|
-
| 영역 | 명령 |
|
|
80
|
-
| --- | --- |
|
|
81
|
-
| Auth | `auth login`, `auth whoami`, `auth switch`, `auth logout` |
|
|
82
|
-
| Config | `config get`, `config set` |
|
|
83
|
-
| Health | `doctor` |
|
|
84
|
-
| Init | `init` |
|
|
85
|
-
| Guide / skills / docs | `guide coding-agent`, `guide flow`, `skills list`, `skills show`, `docs search`, `docs show` |
|
|
86
|
-
| Sync reconciliation | `sync status`, `sync import --all` |
|
|
87
|
-
| Agent authoring | `agent init`, `agent add`, `agent import`, `agent templates list`, `agent templates show`, `agent attach tool`, `agent attach knowledge`, `agent set`, `agent explain`, `agent pull`, `agent doctor`, `agent validate`, `agent diff`, `agent status`, `agent push`, `agent versions`, `agent version save`, `agent promote`, `agent delete` |
|
|
88
|
-
| Agent tests | `agent test init`, `agent test list`, `agent test show`, `agent test validate` |
|
|
89
|
-
| Flow authoring | `agent flow add-node`, `agent flow connect`, `agent flow set`, `agent flow set-global`, `agent flow remove-node`, `agent flow normalize`, `agent flow graph`, `agent node-types`, `agent node-schema` |
|
|
90
|
-
| Tool source | `tool init`, `tool validate`, `tool explain`, `tool pull`, `tool diff`, `tool status`, `tool push`, `tool delete` |
|
|
91
|
-
| Knowledge source | `knowledge init`, `knowledge add-document`, `knowledge validate`, `knowledge explain`, `knowledge pull`, `knowledge push`, `knowledge status`, `knowledge delete` |
|
|
92
|
-
| Schema | `schema list`, `schema get` |
|
|
93
|
-
| Chat beta | `chat` |
|
|
94
|
-
| MCP | `mcp --list-tools`, `mcp --config`, `mcp --stdio` |
|
|
95
|
-
| Version / upgrade | `version`, `--version`, `upgrade` |
|
|
96
|
-
|
|
97
|
-
### 보류 중인 명령 그룹
|
|
98
|
-
|
|
99
|
-
| 영역 | 상태 |
|
|
100
|
-
| --- | --- |
|
|
101
|
-
| `listen` / `trigger` | api-server SSE relay와 로컬 forwarding 구조는 확정했지만, api-server owner sync 전까지 구현은 보류합니다. |
|
|
102
|
-
| runtime `test` | 현재 `agent test init/list/show/validate`는 레포에 남기는 로컬 테스트 스펙만 다룹니다. |
|
|
103
|
-
|
|
104
|
-
### 명령별 도움말
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
vox agent --help
|
|
108
|
-
vox init --help
|
|
109
|
-
vox agent templates --help
|
|
110
|
-
vox agent flow --help
|
|
111
|
-
vox guide --help
|
|
112
|
-
vox guide coding-agent --help
|
|
113
|
-
vox guide flow --help
|
|
114
|
-
vox docs --help
|
|
115
|
-
vox docs search --help
|
|
116
|
-
vox docs show --help
|
|
117
|
-
vox schema --help
|
|
118
|
-
vox chat --help
|
|
119
|
-
vox agent doctor --help
|
|
120
|
-
vox doctor --help
|
|
121
|
-
vox upgrade --help
|
|
122
|
-
vox agent validate --help
|
|
123
|
-
vox tool --help
|
|
124
|
-
vox knowledge --help
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Agent-as-Code
|
|
128
|
-
|
|
129
|
-
### 새 agent 만들기
|
|
130
|
-
|
|
131
|
-
새 프로젝트는 `vox init` 또는 `agent init`으로 만들고, 기존 프로젝트에 에이전트를 더 추가할 때는 `agent add`를 사용합니다. `vox init` / `agent init`은 root `CLAUDE.md`나 `AGENTS.md`를 만들지 않습니다. 대신 충돌이 적은 local skill bootstrap 파일을 `.claude/skills/vox-ai/SKILL.md`와 `.codex/skills/vox-ai/SKILL.md`에 생성합니다. 이미 같은 파일이 있으면 덮어쓰지 않으며, 원하지 않으면 `--no-agent-skills`를 사용합니다.
|
|
31
|
+
## Quick Start
|
|
132
32
|
|
|
133
33
|
```bash
|
|
134
|
-
|
|
135
|
-
vox
|
|
136
|
-
vox
|
|
137
|
-
vox agent add support_api --template flow-api
|
|
138
|
-
vox agent add support_api_sms --template flow-api-sms
|
|
139
|
-
vox agent add support_tool --template flow-tool --tool crm_lookup
|
|
140
|
-
vox agent add support_knowledge --template flow-knowledge --knowledge product_faq
|
|
141
|
-
vox knowledge add-document product_faq overview --type text --text "Use dev endpoints for smoke tests."
|
|
142
|
-
vox knowledge add-document product_faq docs --type webpage --url https://docs.tryvox.co
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
사용 가능한 로컬 템플릿은 다음처럼 확인합니다.
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
vox agent templates list
|
|
149
|
-
vox agent templates show flow-api
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
현재 템플릿은 committed `agents/<name>/agent.json`을 바로 생성하는 authoring helper입니다. 원격에는 쓰지 않습니다. 원격 저장은 항상 `validate -> diff -> push` 루프를 거칩니다.
|
|
153
|
-
|
|
154
|
-
`flow-api-sms`는 API 조회 성공 후 SMS 안내를 보내고, API/SMS 실패를 각각 fallback branch로 닫는 시작점입니다. `flow-tool`과 `flow-knowledge`는 `--tool` / `--knowledge`로 생성 시점에 로컬 리소스를 연결하거나, 나중에 각각 `agent attach tool --node lookup_customer`, `agent attach knowledge --node answer_with_knowledge`로 연결해 사용합니다. `--tool` / `--knowledge`를 쓰려면 해당 `tools/**/tool.json` 또는 `knowledges/**/knowledge.json` source가 먼저 있어야 합니다.
|
|
155
|
-
|
|
156
|
-
### 기존 source 가져오기
|
|
157
|
-
|
|
158
|
-
대시보드에서 export한 agent JSON이나 다른 레포의 CLI agent source를 현재 프로젝트로 가져올 때는 `agent import`를 사용합니다. 이 명령은 원격에 쓰지 않고 committed source 파일만 만듭니다.
|
|
159
|
-
|
|
160
|
-
```bash
|
|
161
|
-
vox agent import dashboard-export.json --agent support_router
|
|
162
|
-
vox agent validate --agent support_router
|
|
163
|
-
vox agent diff --agent support_router
|
|
164
|
-
vox agent status --all --offline
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
대시보드 export envelope는 내부 `agent` payload만 `agents/<name>/agent.json`으로 정규화합니다. `vox_export_version`, `exported_at`, `source.agent_id` 같은 이전 환경의 export metadata와 remote binding은 커밋하지 않습니다. 이미 `.vox/project.json`에 remote binding이 있는 local name을 덮어쓰려면 `--force`가 필요하며, 이 경우 binding은 지워집니다.
|
|
168
|
-
|
|
169
|
-
### Agent 설정 편집
|
|
170
|
-
|
|
171
|
-
대시보드의 prompt, 변수, speech, call settings, webhook, post-call 같은 agent-level 설정은 committed `agent.json`의 `agent.data` 아래에 있습니다. 직접 JSON을 편집해도 되지만, 반복 작업이나 코딩 에이전트 workflow에서는 `agent set`으로 dot-path를 수정할 수 있습니다. 값은 JSON으로 파싱되고, `@file`은 프로젝트 상대 파일을 문자열로 읽습니다.
|
|
172
|
-
|
|
173
|
-
```bash
|
|
174
|
-
vox agent set --agent main \
|
|
175
|
-
--data prompt.prompt=@prompts/support.md \
|
|
176
|
-
--data prompt.firstLine="안녕하세요. 무엇을 도와드릴까요?" \
|
|
177
|
-
--data presetDynamicVariables.customer_tier=premium \
|
|
178
|
-
--data callSettings.callTimeoutInSeconds=600
|
|
179
|
-
vox agent doctor --agent main
|
|
180
|
-
vox agent validate --agent main
|
|
181
|
-
vox agent diff --agent main
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
JSON 안의 특정 필드가 어떤 authoring 표면에 속하는지 확인하려면 `agent explain`, `tool explain`, `knowledge explain`을 사용합니다. 이 명령들은 원격을 호출하지 않고 committed source와 JSON Pointer만 읽습니다. 현재 값, 타입, agent flow node 또는 knowledge document context, 권장 CLI helper, 관련 검증 명령을 출력하므로 코딩 에이전트가 다음 편집을 결정하기 좋습니다.
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
vox agent explain /agent/data/prompt/prompt --agent main --json
|
|
188
|
-
vox agent explain agents/main/agent.json /agent/flow_data/nodes/2/data --json
|
|
189
|
-
vox tool explain crm_lookup /tool/response_mode --json
|
|
190
|
-
vox knowledge explain product_faq /knowledge/documents/0/path --json
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Agent-facing guide
|
|
34
|
+
# 1. Sign in (OAuth in your browser)
|
|
35
|
+
vox auth login
|
|
36
|
+
vox auth whoami --json
|
|
194
37
|
|
|
195
|
-
|
|
38
|
+
# 2. Read the operating contract (especially useful for coding agents)
|
|
39
|
+
vox guide coding-agent
|
|
196
40
|
|
|
197
|
-
|
|
198
|
-
vox
|
|
199
|
-
|
|
200
|
-
vox guide flow --list --json
|
|
201
|
-
vox guide flow --topic global-node --json
|
|
202
|
-
vox guide flow --task "user can quit anytime or ask for a human" --json
|
|
203
|
-
vox skills list --json
|
|
204
|
-
vox skills show using-vox-skills --brief --json
|
|
205
|
-
vox skills show vox-flow --reference flow-guide --brief --json
|
|
206
|
-
vox docs search "global node" --json
|
|
207
|
-
vox docs show docs/build/flow/advanced/global-node --json
|
|
41
|
+
# 3. Start a project — scaffold a new one, or import what already exists
|
|
42
|
+
vox init
|
|
43
|
+
# or, in an existing workspace:
|
|
208
44
|
vox sync import --all --dry-run --json
|
|
209
|
-
vox mcp --config --target codex --json
|
|
210
|
-
vox mcp --config --target claude --json
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
`guide coding-agent` 출력은 surface split(docs/skills/MCP/CLI), 기본 Agent-as-Code 루프, repo instruction snippet, bundled guide topic 목록을 담습니다. 이것이 외부 세션의 bootstrap 명령입니다. 새 repo에 기존 workspace 전체를 처음 가져와야 한다면 `vox sync import --all --dry-run --json`으로 계획을 확인한 뒤 `vox sync import --all --json`을 실행합니다.
|
|
214
|
-
|
|
215
|
-
`vox init` / `agent init`이 만든 `.claude/skills/vox-ai/SKILL.md`와 `.codex/skills/vox-ai/SKILL.md`도 같은 bootstrap 명령을 가리킵니다. Claude Code와 Codex가 각각 local skill 메커니즘으로 이 프로젝트의 vox.ai 작업 규칙을 발견하도록 하기 위한 파일이며, 고객 repo의 기존 root instruction 파일을 덮어쓰지 않습니다.
|
|
216
|
-
|
|
217
|
-
`skills list/show`는 public `vox-skills` repo의 SKILL.md와 references를 release-time에 압축한 offline pack을 반환합니다. 긴 markdown을 바로 dump하지 않고 skill별 ownership, trigger, CLI-first 조건, 추천 명령, reference path, source hash를 주므로 코딩 에이전트가 먼저 어떤 playbook을 봐야 하는지 결정하기 좋습니다. 실제 긴 reference 전문이 필요하면 public skill 파일이나 docs/MCP layer로 이동합니다.
|
|
218
|
-
|
|
219
|
-
`docs search/show`는 공식 docs repo를 release-time에 압축한 offline index를 반환합니다. `search`는 path/title/heading/관련 검색어/본문 excerpt를 대상으로 빠르게 후보를 찾고, `show`는 페이지 또는 섹션별 compressed excerpt와 public URL/source hash를 반환합니다. 전체 MDX 전문이나 최신 hosted 문서 확인이 필요할 때만 docs MCP 또는 웹 문서로 넘어갑니다.
|
|
220
|
-
|
|
221
|
-
`guide flow` 출력은 적용 규칙, 관련 schema field, 권장 CLI 명령, 금지 패턴, 검증 명령, doctor code, source hash를 포함합니다. 예를 들어 `global-node` topic은 public skill의 global node 설계를 현재 v3 `data.globalNodeSettings` 필드와 `agent flow set-global` / `add-node --global-condition` helper로 연결합니다. 최신 hosted docs 조회가 필요하면 MCP/docs layer를 별도로 쓰고, durable source 편집은 `guide -> file edit/helper -> doctor -> validate -> diff -> push` 루프로 진행합니다.
|
|
222
|
-
|
|
223
|
-
`mcp --config`는 Claude Code / Codex / generic MCP client가 `vox mcp --stdio` bridge를 등록할 수 있는 snippet을 출력합니다. 설정 파일에는 bearer token을 넣지 않습니다. 먼저 `vox auth login`으로 CLI profile/keychain에 로그인하고, agent MCP client는 로컬 stdio bridge만 실행합니다.
|
|
224
|
-
|
|
225
|
-
### Chat beta
|
|
226
|
-
|
|
227
|
-
`vox chat`은 dashboard/web의 LiveKit runtime 경로를 그대로 사용합니다. 기본 제품 surface는 production profile 기준이며, 일반 사용자가 dev/prod를 고르는 flag는 제공하지 않습니다. `--agent`는 원격 agent id 또는 현재 Agent-as-Code 프로젝트의 bound local agent name을 받습니다.
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
vox chat --agent <agent-id> --input "안녕하세요"
|
|
231
|
-
vox chat --agent main --input "안녕하세요" --json
|
|
232
|
-
vox chat --agent <agent-id>
|
|
233
|
-
vox chat --agent <agent-id> --voice
|
|
234
|
-
vox chat --agent <agent-id> --input "주문 상태 알려줘" --var customer_name=Acme --var-json order='{"id":"A-100","vip":true}'
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
`--debug`는 auth issuer, API base URL, livekit-token URL, LiveKit env, mode, agent id만 stderr에 출력합니다. OAuth access token, refresh token, LiveKit participant token은 출력하지 않습니다.
|
|
238
|
-
|
|
239
|
-
`--var`와 `--var-json`은 dashboard chat의 `dynamic_variables`로 전달됩니다. `--var` 값은 문자열 그대로 보내고, `--var-json` 값은 JSON으로 파싱해 보냅니다.
|
|
240
|
-
|
|
241
|
-
Voice mode uses the native LiveKit Node runtime plus SoX command-line audio I/O. On macOS, install SoX and grant Terminal microphone permission before the first smoke:
|
|
242
|
-
|
|
243
|
-
```bash
|
|
244
|
-
brew install sox
|
|
245
|
-
vox chat --agent <agent-id> --voice --no-audio-output --debug
|
|
246
45
|
```
|
|
247
46
|
|
|
248
|
-
|
|
47
|
+
## Agent-as-Code Workflow
|
|
249
48
|
|
|
250
|
-
|
|
49
|
+
The core loop is a code workflow, not a sequence of dashboard clicks:
|
|
251
50
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
`agent test`는 실제 chat/voice runtime을 실행하지 않습니다. future `vox test` runner가 읽을 수 있는 durable test artifact를 먼저 남기는 용도입니다.
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
vox agent test init greeting_smoke --agent main \
|
|
258
|
-
--input "안녕하세요. 배송 상태를 확인하고 싶어요." \
|
|
259
|
-
--response-contains "배송" \
|
|
260
|
-
--response-not-contains "모르겠습니다" \
|
|
261
|
-
--max-turns 6
|
|
262
|
-
vox agent test validate greeting_smoke --agent main
|
|
263
|
-
vox agent test list --agent main
|
|
264
|
-
vox agent test show greeting_smoke --agent main
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
생성되는 테스트 파일은 text scenario, preset variables, turns, assertions를 담습니다. 이 파일도 committed source이므로 PR에서 리뷰하고 CI에서 `agent test validate` 또는 `vox doctor`로 확인할 수 있습니다.
|
|
268
|
-
|
|
269
|
-
`agent test list/show --json`은 테스트 이름, 파일 경로, turn/assertion 수, validation 상태를 안정적인 JSON으로 반환하므로 코딩 에이전트가 다음 작업을 결정하기 쉽습니다. `vox doctor`와 `vox agent doctor --agent <name>`도 `agents/<agent>/tests/*.json`을 함께 검사합니다. 따라서 public-skill/CI 기본 루프가 `doctor -> validate -> diff -> push`만 실행해도 깨진 테스트 스펙을 push 전에 잡을 수 있습니다.
|
|
270
|
-
|
|
271
|
-
## Tools-as-Code
|
|
272
|
-
|
|
273
|
-
### 로컬 tool source
|
|
274
|
-
|
|
275
|
-
커스텀 도구는 `tool init`으로 로컬 source 파일을 만들고, `tool validate`로 committed JSON이 안전한지 확인합니다. `tool validate`는 서버 validate API가 아니라 CLI-local authoring validator입니다.
|
|
276
|
-
|
|
277
|
-
`tool validate`는 이름/timeout처럼 서버가 확정적으로 거부하는 값과 민감 credential, placeholder URL, placeholder tool/parameter description, 그리고 `input_schema`의 root object type, `properties`, `required`, nested schema type 같은 흔한 JSON Schema authoring 오류를 먼저 잡습니다. 추가로 Draft 2020-12 meta-schema 검증을 실행해 `exclusiveMinimum`, `minItems`, `dependentSchemas` 같은 JSON Schema 키워드의 잘못된 타입/값도 원격 push 전에 잡습니다.
|
|
278
|
-
|
|
279
|
-
실제 `tool push`는 placeholder URL과 placeholder tool/parameter description이 남아 있으면 원격 저장 전에 거부합니다. 또한 `response_mode: "fire_and_forget"`인 로컬 tool을 flow tool node가 결과 기반 transition 조건으로 사용 중이면 `tool push`가 원격 저장 전에 막습니다. 서버의 최종 요청 스키마와 비즈니스 방어 로직은 `tool push`의 create/update 단계에서 다시 적용됩니다.
|
|
280
|
-
|
|
281
|
-
원격 tool도 agent와 같은 방식으로 `pull -> edit JSON -> validate -> diff/status -> push` 루프를 탑니다.
|
|
282
|
-
|
|
283
|
-
### 지원 범위
|
|
284
|
-
|
|
285
|
-
현재 CLI의 tools-as-code는 public v3 `POST /v3/tools` 계약에 맞춘 **HTTP/API 커스텀 도구**만 다룹니다.
|
|
286
|
-
|
|
287
|
-
대시보드에 MCP 도구 생성 UI가 보이더라도, MCP 타입 도구는 아직 CLI 파일 리소스로 만들지 않습니다. public v3 생성/조회/수정 계약이 열리기 전에는 dashboard 또는 MCP one-off 작업으로 남기고, CLI가 v2/internal 모델을 우회 호출하지 않습니다.
|
|
288
|
-
|
|
289
|
-
### Tool 워크플로우
|
|
290
|
-
|
|
291
|
-
```bash
|
|
292
|
-
vox tool init crm_lookup \
|
|
293
|
-
--url https://api.example.com/customers/lookup \
|
|
294
|
-
--header "content-type=application/json" \
|
|
295
|
-
--auth-type Bearer \
|
|
296
|
-
--auth-credentials '${secret:crm_api_token}' \
|
|
297
|
-
--timeout 20 \
|
|
298
|
-
--param "phone_number:string:고객 전화번호" \
|
|
299
|
-
--optional-param "customer_tier:string:고객 등급"
|
|
300
|
-
vox tool validate crm_lookup
|
|
301
|
-
vox tool push crm_lookup --dry-run
|
|
302
|
-
vox tool push crm_lookup
|
|
303
|
-
vox tool status crm_lookup
|
|
304
|
-
vox agent attach tool main crm_lookup --node lookup_customer
|
|
305
|
-
vox tool diff crm_lookup --offline --check
|
|
306
|
-
vox tool pull <tool-id> --tool crm_lookup --update
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
Tool source에는 literal bearer token, API key, auth credential을 넣지 마세요. 인증 값은 `${secret:crm_api_token}` 또는 `${env:CRM_API_TOKEN}` 형태의 reference로만 적어야 하며, `tool validate`가 민감 header/auth credential literal을 error로 막습니다.
|
|
310
|
-
|
|
311
|
-
`tool push`는 secret reference를 런타임에만 해석합니다. `--json` 출력, source file, `.vox` snapshot에는 raw secret을 쓰지 않습니다. 원격 tool ID, 마지막 원격 hash, snapshot 경로는 `.vox/project.json`의 `tool_bindings`에 저장되며 `.vox/`는 git에 커밋하지 않는 로컬 상태입니다.
|
|
312
|
-
|
|
313
|
-
`tool status`는 읽기 전용 상태 점검입니다. 기본값은 원격 current tool을 조회해 local/remote drift를 나눠 보고하고, `--offline`은 인증과 네트워크를 건너뛰고 `.vox` snapshot만 기준으로 로컬 변경 여부를 봅니다. 실제 차이의 전체 JSON Pointer 목록이 필요하면 `tool diff`를 사용합니다.
|
|
314
|
-
|
|
315
|
-
원격 tool을 정리할 때는 bound local name을 기준으로 삭제합니다. 실수 방지를 위해 `--yes`가 없으면 요청을 보내지 않습니다. 성공하면 원격 tool을 삭제하고 `.vox/project.json`의 binding과 snapshot만 제거하며, committed `tools/<name>/tool.json` source는 남깁니다.
|
|
316
|
-
|
|
317
|
-
```bash
|
|
318
|
-
vox tool delete crm_lookup --yes
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
### Agent에서 tool 참조하기
|
|
322
|
-
|
|
323
|
-
Agent source에서 커스텀 tool을 참조할 때는 원격 UUID 대신 로컬 이름을 사용합니다.
|
|
324
|
-
|
|
325
|
-
```json
|
|
326
|
-
{
|
|
327
|
-
"type": "tool",
|
|
328
|
-
"data": {
|
|
329
|
-
"name": "Lookup Customer",
|
|
330
|
-
"toolRef": "crm_lookup"
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
`agent attach tool`은 이 `toolRef`를 로컬 agent JSON에 기록합니다. `agent validate`, `agent diff`, `agent status`, `agent push`는 실행 시 `.vox/project.json`의 `tool_bindings`를 보고 `toolRef`를 실제 `toolId`로 컴파일합니다.
|
|
336
|
-
|
|
337
|
-
따라서 agent source에는 org-local tool UUID를 커밋하지 않습니다. 단, `toolRef`가 가리키는 tool은 `agent validate` 또는 `agent push` 전에 `tool push`나 `tool pull`로 remote binding이 있어야 합니다.
|
|
338
|
-
|
|
339
|
-
## Knowledge-as-Code
|
|
340
|
-
|
|
341
|
-
### 로컬 knowledge source
|
|
342
|
-
|
|
343
|
-
지식 베이스도 committed source와 로컬 바인딩을 분리합니다. `knowledge init`은 `knowledges/<name>/knowledge.json`을 만들고, `knowledge validate`는 문서 정의를 로컬에서 검증합니다. knowledge도 별도 서버 validate API를 호출하지 않습니다.
|
|
344
|
-
|
|
345
|
-
`knowledge push`가 local knowledge 파일을 서버의 knowledge 생성 요청과 문서별 생성 요청으로 분해하고, 서버가 그 단계에서 최종 검증합니다.
|
|
346
|
-
|
|
347
|
-
```bash
|
|
348
|
-
vox knowledge init product_faq --name "Product FAQ"
|
|
349
|
-
vox knowledge add-document product_faq overview --type text --name "Overview" --text "제품 FAQ 본문입니다."
|
|
350
|
-
vox knowledge add-document product_faq docs --type webpage --url https://docs.tryvox.co
|
|
351
|
-
vox knowledge add-document product_faq setup_guide --type file --path knowledges/product_faq/files/setup-guide.md
|
|
352
|
-
vox knowledge validate product_faq
|
|
353
|
-
vox knowledge push product_faq --dry-run
|
|
354
|
-
vox knowledge push product_faq
|
|
355
|
-
vox knowledge push product_faq --prune
|
|
356
|
-
vox knowledge status product_faq
|
|
357
|
-
vox agent attach knowledge main product_faq --node conversation
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
이미 원격에 있는 knowledge base를 레포로 가져올 때는 별도 local name에 pull합니다.
|
|
361
|
-
|
|
362
|
-
```bash
|
|
363
|
-
vox knowledge pull 123 --knowledge product_faq
|
|
364
|
-
vox knowledge status product_faq
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
현재 `knowledge-file.v1`은 JSON 안에 직접 담긴 `text` 문서, `webpage_urls` 문서, 그리고 레포 안의 파일을 가리키는 `file` 문서를 지원합니다. `knowledge add-document`는 세 타입의 source shape를 만들어주는 로컬 helper입니다. `file.path`는 프로젝트 루트 기준 상대 경로여야 하며, `knowledge validate`는 해당 파일이 실제로 존재하는지 확인합니다.
|
|
368
|
-
|
|
369
|
-
```json
|
|
370
|
-
{
|
|
371
|
-
"schema": "vox.ai.knowledge-file.v1",
|
|
372
|
-
"version": 1,
|
|
373
|
-
"knowledge": {
|
|
374
|
-
"name": "Product FAQ",
|
|
375
|
-
"documents": [
|
|
376
|
-
{
|
|
377
|
-
"local_id": "overview",
|
|
378
|
-
"name": "Overview",
|
|
379
|
-
"document_type": "text",
|
|
380
|
-
"text": "제품 FAQ 본문입니다."
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
"local_id": "docs",
|
|
384
|
-
"name": "Docs",
|
|
385
|
-
"document_type": "webpage",
|
|
386
|
-
"webpage_urls": ["https://docs.tryvox.co"]
|
|
387
|
-
},
|
|
388
|
-
{
|
|
389
|
-
"local_id": "setup_guide",
|
|
390
|
-
"name": "Setup Guide",
|
|
391
|
-
"document_type": "file",
|
|
392
|
-
"path": "knowledges/product_faq/files/setup-guide.md"
|
|
393
|
-
}
|
|
394
|
-
]
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
`knowledge push`는 remote knowledge base가 없으면 생성하고, `local_id`별 문서 hash를 `.vox/project.json`의 `knowledge_bindings`에 기록합니다. `file` 문서 hash에는 파일 내용 SHA도 포함되므로 파일 내용만 바뀌어도 `status`와 `push --dry-run`에서 변경으로 잡힙니다.
|
|
400
|
-
|
|
401
|
-
바뀐 문서는 기존 remote document를 삭제한 뒤 다시 생성하고, unchanged 문서는 건너뜁니다. 기본값은 원격에만 있는 기존 문서를 보존합니다. 로컬 source에서 제거한 bound document를 원격에서도 삭제하려면 명시적으로 `--prune`을 붙입니다. 원격 knowledge ID와 document ID는 committed source에 쓰지 않습니다.
|
|
402
|
-
|
|
403
|
-
`knowledge pull <knowledge-id> --knowledge <local-name>`은 대시보드나 MCP로 이미 만든 원격 knowledge base를 로컬 프로젝트에 바인딩합니다. 현재 v3 API의 document list 응답은 webpage URL summary만 원문 수준으로 복원할 수 있고, text 본문과 file binary는 반환하지 않습니다.
|
|
404
|
-
|
|
405
|
-
따라서 text/file 문서가 있으면 기본값은 `KNOWLEDGE_PULL_INCOMPLETE`로 실패합니다. 원격 binding만 가져오고 복원 가능한 webpage 문서만 source에 쓰려면 명시적으로 `--allow-incomplete`를 붙입니다. 이 경우 `knowledge status`는 원격에 unmanaged document가 남아 있음을 `remote_changed`로 보여줍니다.
|
|
406
|
-
|
|
407
|
-
`knowledge status`는 읽기 전용 상태 점검입니다. 기본값은 원격 document summary 목록을 조회해 바인딩된 문서가 사라졌는지, 대시보드 등에서 추가된 원격 문서가 있는지 확인합니다. `--offline`은 인증과 네트워크를 건너뛰고 `.vox/project.json`의 마지막 push hash만 기준으로 로컬 변경 여부를 봅니다. 서버 API가 document 본문을 반환하지 않기 때문에 원격 문서 내용 diff는 제공하지 않습니다.
|
|
408
|
-
|
|
409
|
-
원격 knowledge base를 정리할 때도 bound local name을 기준으로 삭제합니다. 실수 방지를 위해 `--yes`가 없으면 요청을 보내지 않습니다. 성공하면 원격 knowledge base를 삭제하고 `.vox/project.json`의 knowledge/document binding만 제거하며, committed `knowledges/<name>/knowledge.json` source는 남깁니다.
|
|
410
|
-
|
|
411
|
-
```bash
|
|
412
|
-
vox knowledge delete product_faq --yes
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
### Agent에서 knowledge 참조하기
|
|
416
|
-
|
|
417
|
-
Agent source에서 knowledge를 참조할 때는 숫자 `knowledgeIds` 대신 로컬 이름을 사용합니다.
|
|
418
|
-
|
|
419
|
-
```json
|
|
420
|
-
{
|
|
421
|
-
"data": {
|
|
422
|
-
"knowledge": {
|
|
423
|
-
"ragEnabled": true,
|
|
424
|
-
"knowledgeRefs": ["product_faq"]
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
51
|
+
```text
|
|
52
|
+
pull / init -> edit JSON files -> doctor / validate -> diff / status -> push -> version save / promote
|
|
428
53
|
```
|
|
429
54
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
55
|
+
- `vox agent pull` / `vox init` — bring remote agents into local JSON source.
|
|
56
|
+
- Edit the JSON files in your editor or with a coding agent.
|
|
57
|
+
- `vox agent doctor` / `vox agent validate` — catch authoring risks before you push.
|
|
58
|
+
- `vox agent diff` / `vox agent status` — review exactly what will change.
|
|
59
|
+
- `vox agent push` — apply your local source to the remote draft.
|
|
60
|
+
- `vox agent version save` / `vox agent promote` — snapshot an immutable version and promote it to production.
|
|
435
61
|
|
|
436
|
-
##
|
|
62
|
+
## Commands
|
|
437
63
|
|
|
438
|
-
|
|
64
|
+
A high-level map of the public surface. Run any command with `--help` for details, or add `--json` for structured output.
|
|
439
65
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
```bash
|
|
443
|
-
vox agent flow add-node check_account --type api \
|
|
444
|
-
--url https://api.example.com/check \
|
|
445
|
-
--method POST \
|
|
446
|
-
--header "content-type=application/json" \
|
|
447
|
-
--response-mode wait \
|
|
448
|
-
--body-file prompts/check-account-body.json \
|
|
449
|
-
--response-variable "account_status=$.status"
|
|
450
|
-
vox agent flow connect --from conversation --to check_account --condition "API 조회가 필요할 때"
|
|
451
|
-
vox agent flow set --node check_account --data apiConfiguration.timeoutSeconds=20
|
|
452
|
-
vox agent flow add-node stop_end --type endCall \
|
|
453
|
-
--static-sentence "네, 설문을 종료하겠습니다." \
|
|
454
|
-
--global-condition "사용자가 중단, 종료, 그만, 끊기를 요청할 때"
|
|
455
|
-
vox agent flow set-global --node stop_end --condition "사용자가 중단, 종료, 그만, 끊기를 요청할 때"
|
|
456
|
-
vox agent flow normalize
|
|
457
|
-
vox agent flow graph
|
|
458
|
-
vox agent flow graph --format outline
|
|
459
|
-
vox agent flow graph --format summary
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
`agent flow add-node`, `agent flow connect`, `agent flow set`, `agent flow set-global`, `agent flow remove-node`, `agent flow normalize`는 committed `agent.json`만 수정하는 로컬 mutation helper입니다.
|
|
463
|
-
|
|
464
|
-
현재 `add-node`는 `conversation`, `api`, `tool`, `extraction`, `condition`, `sendSms`, `transferCall`, `transferAgent`, `endCall`, `note`를 지원합니다.
|
|
465
|
-
`--global-condition`은 실행 노드의 `data.globalNodeSettings = { isGlobalNode: true, transitionCondition }`를 설정합니다. 이미 만든 노드는 `agent flow set-global --node <id> --condition <text>`로 같은 설정을 적용하고, `--clear`로 비활성화합니다. `agent doctor`는 종료/중단/상담원 연결 같은 조건이 여러 노드에서 같은 end/transfer 노드로 반복 연결되면 `GLOBAL_NODE_CANDIDATE` 경고를 냅니다.
|
|
466
|
-
|
|
467
|
-
| Node | 지원 내용 |
|
|
66
|
+
| Area | Commands |
|
|
468
67
|
| --- | --- |
|
|
469
|
-
|
|
|
470
|
-
|
|
|
471
|
-
|
|
|
472
|
-
| `
|
|
473
|
-
|
|
|
474
|
-
| `
|
|
475
|
-
| `
|
|
476
|
-
| `sendSms` / `transferCall` / `transferAgent` | canonical fallback transition을 포함합니다. |
|
|
477
|
-
|
|
478
|
-
`api` node의 `--auth-credentials`와 `authorization`/`x-api-key` 같은 민감 `--header` 값은 literal secret을 받지 않고 `${env:NAME}` / `${secret:name}` reference만 허용합니다. `apiConfiguration.url`, `authCredentials`, `headers`, `body` 안의 `${env:NAME}` / `${secret:name}` reference는 `agent validate` / `agent push` 시 서버 payload에서만 실제 값으로 해석되고, committed `agent.json`, dry-run JSON, `.vox` snapshot에는 reference 형태로 복원됩니다.
|
|
479
|
-
|
|
480
|
-
`transferCall`/`transferAgent`는 실제 전화/SIP 대상 또는 agent_id가 필요하므로 placeholder로 만든 경우 `agent doctor`/`agent validate`에서 반드시 교정해야 합니다.
|
|
68
|
+
| Auth & config | `auth login`, `auth whoami`, `auth switch`, `auth logout`, `config get/set` |
|
|
69
|
+
| Get started | `init`, `doctor`, `guide coding-agent`, `guide flow` |
|
|
70
|
+
| Discover offline | `docs search/show`, `skills list/show`, `schema list/get` |
|
|
71
|
+
| Authoring | `agent …`, `tool …`, `knowledge …` (plan, create, edit, validate, diff, push, version, promote) |
|
|
72
|
+
| Sync | `sync status`, `sync import`, `sync bootstrap` |
|
|
73
|
+
| Multi-org | `org list`, `org switch`, `org api-key create/list/revoke`, `workspace init` |
|
|
74
|
+
| Runtime & telephony | `chat`, `call …`, `number …`, `version`, `upgrade` |
|
|
481
75
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
변경 후에는 `agent flow graph`, `agent doctor`, `agent validate` 순서로 확인하세요.
|
|
485
|
-
|
|
486
|
-
### Schema introspection
|
|
487
|
-
|
|
488
|
-
flow node나 agent schema 필드를 확인할 때는 스키마 introspection 명령을 사용합니다. 이 명령들은 read-only이며 원격 리소스를 생성하거나 수정하지 않습니다.
|
|
76
|
+
For sub-organization API keys, `--org` selects the authenticated caller while
|
|
77
|
+
`--sub-org` selects the organization in the API path:
|
|
489
78
|
|
|
490
79
|
```bash
|
|
491
|
-
vox
|
|
492
|
-
vox
|
|
493
|
-
vox
|
|
494
|
-
vox schema get flow-schema flow-data --detail minimal
|
|
80
|
+
vox org api-key list --sub-org <sub-organization-id> --json
|
|
81
|
+
vox org api-key create --sub-org <sub-organization-id> --key-name production --json
|
|
82
|
+
vox org api-key revoke --sub-org <sub-organization-id> --key-name production --secret-key-suffix <last4> --yes --json
|
|
495
83
|
```
|
|
496
84
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
`--json` 출력에는 nodes, edges, transitions, resource_refs, unreachable_nodes, mermaid, outline 문자열이 함께 들어가므로 코딩 에이전트가 현재 flow topology를 파싱한 뒤 다음 편집을 결정할 수 있습니다. 이 명령은 로컬 파일만 읽고 `.vox`나 원격을 수정하지 않습니다.
|
|
85
|
+
The plaintext `data.api_key` from `create` is shown exactly once and cannot be
|
|
86
|
+
retrieved later; store it immediately in a secure secret store. It is never
|
|
87
|
+
written to CLI config, project state, telemetry, or error details. Each `list`
|
|
88
|
+
item contains only the key name, last-four suffix, and creation time.
|
|
502
89
|
|
|
503
|
-
##
|
|
90
|
+
## Using vox from Coding Agents
|
|
504
91
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
`agent validate`는 기본적으로 로컬 JSON shape 검증 후 flow agent에 대해 api-server의 canonical flow validator를 호출합니다. 따라서 기본 검증은 OAuth 인증이 필요하고, 서버가 반환하는 warning/error 및 `fixed_flow_data`를 반영합니다.
|
|
508
|
-
|
|
509
|
-
인증 없이 편집 중인 JSON 구조만 빠르게 확인하려면 다음처럼 실행합니다.
|
|
92
|
+
`vox` is built to be a first-class tool for coding agents. Point your agent at these bootstrap commands:
|
|
510
93
|
|
|
511
94
|
```bash
|
|
512
|
-
vox agent
|
|
95
|
+
vox guide coding-agent --json # the operating contract to follow
|
|
96
|
+
vox docs search "<query>" --json # offline official docs
|
|
97
|
+
vox skills list --json # design playbooks and workflow routing
|
|
98
|
+
vox schema get <namespace> <schema-type> --json
|
|
513
99
|
```
|
|
514
100
|
|
|
515
|
-
`--
|
|
516
|
-
|
|
517
|
-
### Doctor
|
|
518
|
-
|
|
519
|
-
편집 중인 JSON이 "빌드 가능한 프로젝트"에 가까운지 로컬에서 먼저 점검하려면 `doctor`를 사용합니다.
|
|
101
|
+
Every command accepts `--json` and emits a stable envelope (`{ ok, data }` on success, `{ ok: false, error: { code, message, … } }` on failure), so agents and automation can branch on results, read `error.details.hint`, and follow `related_commands`.
|
|
520
102
|
|
|
521
|
-
|
|
103
|
+
## Authentication
|
|
522
104
|
|
|
523
|
-
|
|
105
|
+
- vox uses **OAuth only**. `vox auth login` opens your browser and completes a loopback flow.
|
|
106
|
+
- Refresh tokens are stored in your OS keychain / secret store — never in project files.
|
|
107
|
+
- Project and workspace JSON never contain tokens or secrets.
|
|
524
108
|
|
|
525
|
-
|
|
109
|
+
## Telemetry and Privacy
|
|
526
110
|
|
|
527
|
-
|
|
111
|
+
Official builds send anonymous usage telemetry to help improve the CLI. It records coarse signals such as the command name, exit status, CLI version, and OS — never your arguments, file contents, tokens, agent data, or organization identifiers.
|
|
528
112
|
|
|
529
|
-
|
|
113
|
+
Opt out at any time:
|
|
530
114
|
|
|
531
115
|
```bash
|
|
532
|
-
vox
|
|
533
|
-
|
|
534
|
-
vox
|
|
535
|
-
vox
|
|
116
|
+
vox config set settings.telemetry disabled
|
|
117
|
+
# or, per-process:
|
|
118
|
+
DO_NOT_TRACK=1 vox …
|
|
119
|
+
VOX_TELEMETRY_DISABLED=1 vox …
|
|
536
120
|
```
|
|
537
121
|
|
|
538
|
-
|
|
122
|
+
Development and local builds never emit telemetry.
|
|
539
123
|
|
|
540
|
-
|
|
124
|
+
## Upgrade
|
|
541
125
|
|
|
542
|
-
`
|
|
126
|
+
`vox upgrade` is a package-manager aware upgrade assistant: it detects how vox was installed (npm, Homebrew, standalone, or unknown) and prints the exact upgrade command for that install. It never modifies your installation itself — run the printed command to update.
|
|
543
127
|
|
|
544
128
|
```bash
|
|
545
|
-
vox
|
|
546
|
-
vox
|
|
547
|
-
vox
|
|
129
|
+
vox upgrade # detect the install and print the exact upgrade command
|
|
130
|
+
vox upgrade --channel beta # check the beta channel
|
|
131
|
+
vox upgrade --json # structured output for scripts / coding agents
|
|
132
|
+
npm install -g @vox-ai/cli@latest # update an npm install
|
|
133
|
+
brew upgrade vox-public/tap/vox # update a Homebrew install
|
|
548
134
|
```
|
|
549
135
|
|
|
550
|
-
|
|
136
|
+
For Homebrew, `vox upgrade` distinguishes the newest upstream release from what the formula currently offers, so it won't tell you to `brew upgrade` before the formula has caught up. `vox upgrade --json` (schema `vox.ai.cli.upgrade.v2`) returns `status`, `confidence`, `actions`, and `verify_commands` so a coding agent can pick the next command without parsing human text.
|
|
551
137
|
|
|
552
|
-
|
|
138
|
+
### Update notices
|
|
553
139
|
|
|
554
|
-
|
|
140
|
+
vox occasionally checks — at most once a day, when you run a command — whether a newer version is published, and caches the result locally (no daemon, no background process). When an update exists, it prints a single line to stderr on your next interactive run:
|
|
555
141
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
vox sync import --all --dry-run --json
|
|
560
|
-
vox sync import --all --json
|
|
561
|
-
vox sync import --all --profile dev --org <organization-id> --json
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
현재 import는 agents를 `agents/<local-name>/agent.json`, `.vox/snapshots/<local-name>.remote.json`, `vox.json`, `.vox/project.json`으로 씁니다. 이미 같은 local source path가 있으면 덮어쓰지 않고 `LOCAL_SOURCE_CONFLICT`로 멈춥니다. tool/knowledge는 아직 materialize하지 않고 `unsupported_inventory`에 남기며, 이후 `vox tool pull <tool-id> --tool <local-name>` 또는 `vox knowledge pull <knowledge-id> --knowledge <local-name>`로 가져옵니다.
|
|
565
|
-
|
|
566
|
-
### Diff와 status
|
|
567
|
-
|
|
568
|
-
`agent diff`는 기본적으로 현재 원격 에이전트를 다시 조회한 뒤 로컬 JSON과 비교합니다. 인증 없이 마지막 `pull`/`push` snapshot 대비 변경만 보고 싶으면 다음처럼 실행합니다.
|
|
569
|
-
|
|
570
|
-
```bash
|
|
571
|
-
vox agent diff --offline
|
|
572
|
-
```
|
|
573
|
-
|
|
574
|
-
`--offline`은 `.vox/snapshots/<agent>.remote.json`을 기준으로 사용합니다. snapshot이 없거나 손상되어 있으면 `agent pull --agent <local-agent> --update` 또는 온라인 `agent diff`가 필요합니다. 새 원격 에이전트를 처음 가져올 때는 `agent pull <agent-id> --agent <local-agent>`를 쓰고, 이미 바인딩된 local agent를 다시 동기화할 때는 agent id 없이 `agent pull --agent <local-agent>`를 사용할 수 있습니다.
|
|
575
|
-
|
|
576
|
-
CI나 스크립트에서 변경 여부를 exit code로 판단하려면 다음처럼 실행합니다.
|
|
577
|
-
|
|
578
|
-
```bash
|
|
579
|
-
vox agent diff --check
|
|
580
|
-
vox agent diff --offline --check
|
|
581
|
-
vox agent diff --all --offline --check
|
|
582
|
-
```
|
|
583
|
-
|
|
584
|
-
기본 `agent diff`는 diff 계산이 성공하면 변경이 있어도 exit `0`입니다. `--check`는 변경이 있으면 결과 JSON을 출력한 뒤 exit `1`을 반환합니다. `--all`을 붙이면 `vox.json`에 선언된 모든 local agent를 순회하며, 바인딩이 없거나 snapshot이 없는 agent는 전체 명령을 중단하지 않고 per-agent error로 남깁니다. `--all --check`는 변경 또는 per-agent error가 하나라도 있으면 exit `1`입니다.
|
|
585
|
-
|
|
586
|
-
현재 작업 디렉터리 상태를 인증 없이 확인하려면 다음처럼 실행합니다.
|
|
587
|
-
|
|
588
|
-
```bash
|
|
589
|
-
vox agent status --offline
|
|
590
|
-
vox agent status --all --offline
|
|
591
|
-
```
|
|
592
|
-
|
|
593
|
-
`agent status --offline`은 마지막 snapshot 기준으로 로컬 변경 여부를 계산하고, 원격 최신 변경 여부는 조회하지 않습니다. `--all`을 붙이면 `vox.json`에 선언된 모든 local agent의 상태와 summary를 한 번에 출력합니다. 원격 drift까지 확인하려면 기본 `agent status`를 사용합니다.
|
|
594
|
-
|
|
595
|
-
### Push
|
|
596
|
-
|
|
597
|
-
인증 없이 push payload 모양만 확인하려면 다음처럼 실행합니다.
|
|
598
|
-
|
|
599
|
-
```bash
|
|
600
|
-
vox agent push --dry-run --offline
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
`agent push --dry-run --offline`은 로컬 agent JSON과 저장된 snapshot만 사용합니다. bound agent는 snapshot 기준 update payload를, unbound agent는 create payload를 미리 보여줍니다. 이 모드는 서버 flow validation과 원격 drift 확인을 수행하지 않으므로 실제 저장 전에는 온라인 `agent push --dry-run` 또는 `agent push`를 사용해야 합니다. 실제 push는 `--offline`과 함께 실행할 수 없습니다.
|
|
604
|
-
|
|
605
|
-
온라인 `agent push --dry-run`과 `agent push`는 flow agent에 대해 서버 validator의 `fixed_flow_data`가 반환되면 그 값을 create/update payload에 사용합니다. `--dry-run`은 파일을 수정하지 않습니다.
|
|
606
|
-
|
|
607
|
-
실제 `agent push`가 성공하면 저장된 서버 응답으로 `agents/<name>/agent.json`과 `.vox` snapshot을 함께 갱신합니다. 서버 기본값이나 validator fix가 적용되어도 push 직후 `agent diff`가 clean이 되도록 하기 위한 동작입니다. push 전에 validator fix만 파일에 반영하고 싶으면 `vox agent validate --fix`를 사용하세요.
|
|
608
|
-
|
|
609
|
-
### Version과 promote
|
|
610
|
-
|
|
611
|
-
버전 저장과 프로덕션 승격은 push와 분리합니다. `agent version save`는 현재 원격 draft를 immutable version으로 저장하고, `agent promote`는 이미 저장된 `vN`만 프로덕션 포인터로 올립니다. 프로덕션 라우팅을 바꾸는 명령이므로 `--yes` 없이는 요청을 보내지 않습니다.
|
|
612
|
-
|
|
613
|
-
```bash
|
|
614
|
-
vox agent versions --agent main
|
|
615
|
-
vox agent version save --agent main --description "2026-06-24 support flow update"
|
|
616
|
-
vox agent promote v3 --agent main --yes
|
|
617
|
-
```
|
|
618
|
-
|
|
619
|
-
권장 릴리스 루프는 `agent status -> agent diff -> agent push -> agent version save -> agent promote`입니다. 버전 메타데이터와 프로덕션 포인터는 원격 운영 상태라 committed `agent.json`에는 쓰지 않습니다. 로컬 source는 current draft의 desired state만 담고, 원격 agent ID와 snapshot hash는 `.vox/project.json`과 `.vox/snapshots/`에만 남깁니다.
|
|
620
|
-
|
|
621
|
-
### Delete
|
|
622
|
-
|
|
623
|
-
원격 에이전트를 정리할 때는 soft-delete만 지원합니다. 실수 방지를 위해 `--yes`가 없으면 요청을 보내지 않습니다.
|
|
624
|
-
|
|
625
|
-
```bash
|
|
626
|
-
vox agent delete <agent-id> --yes
|
|
627
|
-
```
|
|
628
|
-
|
|
629
|
-
## 개발
|
|
630
|
-
|
|
631
|
-
### 기본 검증 루프
|
|
632
|
-
|
|
633
|
-
```bash
|
|
634
|
-
npm install
|
|
635
|
-
npm run package:info:check
|
|
636
|
-
npm run guide:pack:check
|
|
637
|
-
npm run skills:pack:check
|
|
638
|
-
npm run docs:pack:check
|
|
639
|
-
npm run codegen:check
|
|
640
|
-
npm run tool:constraints:check
|
|
641
|
-
npm run homebrew:formula:smoke
|
|
642
|
-
npm run mcp:surface:check
|
|
643
|
-
npm run typecheck
|
|
644
|
-
npm test
|
|
645
|
-
npm run build
|
|
646
|
-
npm run smoke:help
|
|
647
|
-
npm run smoke:version
|
|
648
|
-
npm run smoke:whoami-json
|
|
649
|
-
npm run smoke:agent-diff-check
|
|
650
|
-
npm run smoke:authoring-local
|
|
651
|
-
npm run smoke:npm-pack
|
|
652
|
-
npm run bun:compile
|
|
653
|
-
npm run smoke:help-binary
|
|
654
|
-
npm run smoke:agent-diff-check-binary
|
|
655
|
-
npm run smoke:authoring-local-binary
|
|
656
|
-
npm run smoke:mcp-binary
|
|
657
|
-
```
|
|
658
|
-
|
|
659
|
-
### 내부 chat dev smoke
|
|
660
|
-
|
|
661
|
-
공개 CLI surface는 production 기본값을 유지합니다. dev 연결은 내부 profile/env override로만 검증합니다.
|
|
662
|
-
|
|
663
|
-
확인된 dev 연결 값:
|
|
664
|
-
|
|
665
|
-
- auth issuer: `https://xnpknkzxxuyfokbrzbil.supabase.co/auth/v1`
|
|
666
|
-
- livekit-token URL: `https://xnpknkzxxuyfokbrzbil.supabase.co/functions/v1/livekit-token`
|
|
667
|
-
- API base: `https://dev-client-api.tryvox.co`
|
|
668
|
-
- MCP base: `https://vox-mcp-develop.fly.dev`
|
|
669
|
-
- MCP endpoint for CLI `mcp_url`: `https://vox-mcp-develop.fly.dev/mcp`
|
|
670
|
-
- dev smoke workspace: `aacc5a24-4fdf-40cc-8d75-6abd253146ea`
|
|
671
|
-
|
|
672
|
-
dev profile 생성:
|
|
673
|
-
|
|
674
|
-
```bash
|
|
675
|
-
VOX_AUTH_ISSUER=https://xnpknkzxxuyfokbrzbil.supabase.co/auth/v1 \
|
|
676
|
-
VOX_API_BASE_URL=https://dev-client-api.tryvox.co \
|
|
677
|
-
VOX_MCP_URL=https://vox-mcp-develop.fly.dev/mcp \
|
|
678
|
-
vox auth login --profile dev
|
|
679
|
-
```
|
|
680
|
-
|
|
681
|
-
dev profile 검증:
|
|
682
|
-
|
|
683
|
-
```bash
|
|
684
|
-
vox auth whoami --profile dev --json
|
|
685
|
-
```
|
|
686
|
-
|
|
687
|
-
chat dev smoke는 env token을 거부하고 `--profile dev`를 요구합니다. 내부 LiveKit env는 script가 `VOX_INTERNAL_LIVEKIT_ENV=development`로 고정합니다.
|
|
688
|
-
|
|
689
|
-
```bash
|
|
690
|
-
npm run smoke:chat-dev -- --profile dev --agent <dev-agent-id> --input "hello from vox-cli dev smoke"
|
|
691
|
-
```
|
|
692
|
-
|
|
693
|
-
Deterministic dev agents can assert response content so truncated or ungrounded answers fail the smoke:
|
|
694
|
-
|
|
695
|
-
```bash
|
|
696
|
-
npm run smoke:chat-dev -- --profile dev --agent <dev-agent-id> \
|
|
697
|
-
--input "Return the dev API base. Do not use markdown code fences." \
|
|
698
|
-
--expect-output "https://dev-client-api.tryvox.co"
|
|
699
|
-
```
|
|
700
|
-
|
|
701
|
-
For multi-turn dev checks, repeat `--turn`; the smoke sends the next turn after an assistant response:
|
|
702
|
-
|
|
703
|
-
```bash
|
|
704
|
-
npm run smoke:chat-dev -- --profile dev --agent <dev-agent-id> \
|
|
705
|
-
--turn "What is the dev API base?" \
|
|
706
|
-
--turn "What command saves an agent version?" \
|
|
707
|
-
--expect-output "https://dev-client-api.tryvox.co" \
|
|
708
|
-
--expect-output "vox agent version save"
|
|
709
|
-
```
|
|
710
|
-
|
|
711
|
-
`VOX_LIVEKIT_TOKEN_URL`은 dev issuer 파생이 불확실한 경우의 escape hatch로 유지하지만, 일반 사용자 문서 경로로 사용하지 않습니다.
|
|
712
|
-
|
|
713
|
-
### 생성물 체크
|
|
714
|
-
|
|
715
|
-
v3 OpenAPI 타입 생성:
|
|
716
|
-
|
|
717
|
-
```bash
|
|
718
|
-
npm run codegen
|
|
719
|
-
npm run codegen:check
|
|
720
|
-
```
|
|
721
|
-
|
|
722
|
-
package version metadata 생성:
|
|
723
|
-
|
|
724
|
-
```bash
|
|
725
|
-
npm run package:info
|
|
726
|
-
npm run package:info:check
|
|
727
|
-
```
|
|
728
|
-
|
|
729
|
-
Bun 단일 바이너리 smoke 대상 컴파일:
|
|
730
|
-
|
|
731
|
-
```bash
|
|
732
|
-
npm run bun:compile
|
|
733
|
-
./dist/vox --help
|
|
734
|
-
./dist/vox --version
|
|
735
|
-
./dist/vox auth whoami --json
|
|
736
|
-
./dist/vox mcp --list-tools --json
|
|
737
|
-
```
|
|
738
|
-
|
|
739
|
-
### Auth login smoke
|
|
740
|
-
|
|
741
|
-
로컬 keychain이 있는 개발 머신에서 OAuth login 저장 경로까지 확인하려면 다음 smoke를 실행합니다. 이 smoke는 로컬 fake OAuth/API 서버를 띄우고 실제 `auth login --no-open` loopback flow를 완료한 뒤, OS keychain에 저장된 임시 profile로 `auth whoami`를 실행하고 cleanup합니다.
|
|
742
|
-
|
|
743
|
-
```bash
|
|
744
|
-
npm run smoke:auth-login-local
|
|
745
|
-
npm run bun:compile
|
|
746
|
-
npm run smoke:auth-login-local-binary
|
|
747
|
-
```
|
|
748
|
-
|
|
749
|
-
### CI와 release
|
|
750
|
-
|
|
751
|
-
GitHub Actions의 단독 `vox-cli` repo CI는 `guide:pack:check`, `skills:pack:check`, `docs:pack:check`, `typecheck`, `test`, `audit`, `build`, Node smoke, agent diff check smoke, local authoring workflow smoke, npm package smoke, Bun binary help smoke, Bun binary agent diff check smoke, Bun binary local authoring workflow smoke, MCP binary smoke를 실행합니다.
|
|
752
|
-
|
|
753
|
-
local authoring workflow smoke는 임시 프로젝트에서 dashboard export `agent import`, `tool init/validate/explain`, `knowledge init/validate/explain`, single-prompt dashboard-style 설정 편집과 `callScreening` 보존, `agent explain`, `agent test init/list/show/validate`, extraction/condition router, API/tool/sendSms/transferCall/transferAgent flow node 작성과 연결, `agent attach tool/knowledge`, `agent doctor`, `agent status --all --offline`, `agent validate --offline`, `agent push --dry-run --offline`를 실제 CLI 명령으로 실행합니다.
|
|
754
|
-
|
|
755
|
-
npm package smoke는 `npm pack` tarball을 임시 프로젝트에 설치한 뒤 설치된 `vox` binary로 help, version, unauthenticated whoami, agent diff check fixture를 실행합니다. `codegen:check`, `tool:constraints:check`, `mcp:surface:check`는 monorepo의 api-server/mcp/skills 파일을 필요로 하므로 monorepo context에서 실행해야 합니다.
|
|
756
|
-
|
|
757
|
-
`tool:constraints:check`는 api-server의 v3 tool request schema와 `tool_service.py`에서 tool name 예약어, name 길이/패턴, HTTP/auth/response enum, timeout 범위를 다시 생성해 CLI-local `tool validate` 상수와 비교합니다. 이 체크도 monorepo context가 필요합니다.
|
|
758
|
-
|
|
759
|
-
릴리스 후보를 만들기 전에는 standalone repo에서 다음 명령을 실행합니다.
|
|
760
|
-
|
|
761
|
-
```bash
|
|
762
|
-
npm run release:check
|
|
142
|
+
```text
|
|
143
|
+
A newer vox.ai CLI is available: 0.1.0-beta.9
|
|
144
|
+
Run `vox upgrade` for the exact upgrade command.
|
|
763
145
|
```
|
|
764
146
|
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
npm publish 직전에는 `prepublishOnly`가 최소 package gate를 다시 실행합니다. `@vox-ai/cli`는 새 scoped package이므로 `publishConfig.access`는 `public`으로 고정되어 있습니다.
|
|
768
|
-
|
|
769
|
-
실제 배포 전에 GitHub Actions의 수동 `CLI Release Preflight` workflow를 같은 version/dist-tag로 먼저 실행합니다. 이 workflow는 configured skills source(`VOX_CLI_PUBLIC_SKILLS_BASE_URL`)와 `docs.tryvox.co` source drift check, `release:check`, macOS arm64/x64 Bun binary build/smoke, tarball/checksum/formula 검증, GitHub App 기반 public tap 접근/중복 검사, npm publish auth 기반 `npm publish --dry-run`을 실행하지만 git tag, GitHub Release, npm package, Homebrew Formula PR은 만들지 않습니다.
|
|
770
|
-
|
|
771
|
-
배포는 GitHub Actions의 수동 `CLI Release` workflow로 진행합니다. workflow 입력으로 package version, npm dist-tag(`beta` 또는 `latest`), GitHub prerelease 여부를 받으며, `0.0.0` placeholder version, prerelease `latest` 배포, 다른 commit의 기존 git tag, stale tap release/tag는 거부합니다.
|
|
772
|
-
|
|
773
|
-
`CLI Release` workflow는 세 가지를 같은 commit에서 처리합니다.
|
|
774
|
-
|
|
775
|
-
1. `release:check`를 통과시킵니다.
|
|
776
|
-
2. configured skills raw file hash와 `docs.tryvox.co/llms.txt` / 주요 `.md` page가 generated guide/docs pack과 맞는지 확인합니다. 현재 beta release 기준 skills source는 `garden-tryvox/vox-skills@codex/cli-first-authoring`입니다.
|
|
777
|
-
3. macOS `darwin-arm64`, `darwin-x64` Bun 단일 바이너리를 만들고 matching runner에서 binary smoke를 실행한 뒤 Actions artifact로 보관합니다.
|
|
778
|
-
4. GitHub App token으로 public tap 접근과 stale release/tag 부재를 확인하고, npm registry auth를 확인합니다.
|
|
779
|
-
5. `checksums.txt`에서 Homebrew formula `vox.rb`를 렌더링하고, 실제 tarball sha256 / `checksums.txt` / `vox.rb` URL과 sha가 일치하는지 확인합니다.
|
|
780
|
-
6. `vox-cli` repo에 `v{version}` source tag를 생성합니다.
|
|
781
|
-
7. `vox-public/homebrew-tap` GitHub Release draft에 tarball, `checksums.txt`, `vox.rb`를 올립니다.
|
|
782
|
-
8. `npm publish --tag <dist-tag>`가 성공하면 GitHub Release draft를 공개합니다.
|
|
783
|
-
9. macOS arm64/x64 runner에서 public release의 `vox.rb`로 `brew audit --strict`, `brew install`, `vox --version`, `vox mcp --list-tools --json`, `brew test`를 실행합니다.
|
|
784
|
-
10. Homebrew smoke가 통과하면 `vox-public/homebrew-tap`에 Formula PR을 엽니다.
|
|
785
|
-
|
|
786
|
-
실행 전 repo secret `VOX_APP_ID`, `VOX_APP_KEY`, `NPM_TOKEN`과 environment `npm-publish`를 설정해야 합니다. public release 전에는 가능하면 npm Trusted Publishing/OIDC로 전환해서 장기 publish token 의존을 제거합니다. npm provenance는 source repository visibility와 trusted publishing 조건을 만족한 뒤 다시 켭니다.
|
|
787
|
-
|
|
788
|
-
Homebrew 배포는 `vox-public/homebrew-tap`의 `Formula/vox.rb`가 같은 public tap repo의 GitHub Release tarball을 참조하는 구조로 둡니다. Release workflow는 GitHub App token으로 비어 있는 tap repo의 `main`을 1회 초기화하고, public release asset의 `vox.rb`가 macOS Homebrew smoke를 통과한 뒤 tap repo의 `Formula/vox.rb`로 복사하는 PR을 자동 생성합니다. Formula PR은 필요하면 tap 쪽 CI/audit 결과를 추가 확인한 뒤 merge합니다.
|
|
789
|
-
|
|
790
|
-
`npm publish`가 성공하기 전 workflow가 실패하면 release cleanup step이 `vox-cli` source tag와 public tap draft release를 best-effort로 삭제해 같은 version으로 재시도할 수 있게 합니다. `npm publish`가 이미 성공한 뒤의 Homebrew 실패는 package version이 공개된 상태이므로 자동 삭제하지 않고 수동 복구합니다.
|
|
791
|
-
|
|
792
|
-
## 인증
|
|
793
|
-
|
|
794
|
-
이 CLI는 OAuth-only입니다. 저장된 refresh token은 내부 `SecretStore` 추상화를 통해 OS keychain에 저장해야 합니다. JSON config와 project file에는 secret이 아닌 metadata만 저장합니다.
|
|
795
|
-
|
|
796
|
-
OS keychain 접근이 멈추는 환경에서는 auth resolver가 무한 대기하지 않고 `KEYCHAIN_UNAVAILABLE` JSON error로 종료합니다. 기본 keychain operation timeout은 10초이며, 진단이나 CI 환경에서는 `VOX_KEYCHAIN_TIMEOUT_MS=<milliseconds>`로 1초에서 60초 사이 값을 지정할 수 있습니다.
|
|
797
|
-
|
|
798
|
-
Headless 실행은 저장 token 대신 `VOX_OAUTH_ACCESS_TOKEN`과 `VOX_ORGANIZATION_ID`를 명시적으로 주입하는 경로를 사용합니다.
|
|
799
|
-
|
|
800
|
-
## MCP
|
|
801
|
-
|
|
802
|
-
### Tool surface
|
|
803
|
-
|
|
804
|
-
`vox mcp --list-tools --json`는 인증 없이 생성된 cached public MCP surface를 출력합니다. `vox mcp --list-tools --live --json`는 CLI OAuth token으로 hosted MCP에 직접 연결해 현재 live `tools/list` 결과를 출력합니다.
|
|
805
|
-
|
|
806
|
-
### Client config snippets
|
|
807
|
-
|
|
808
|
-
`vox mcp --config`는 설치된 CLI를 MCP stdio bridge로 등록하기 위한 설정 snippet을 출력합니다. 기존 Claude/Codex 설정 파일을 직접 수정하지 않으므로 고객 repo의 설정을 덮어쓰지 않습니다.
|
|
147
|
+
The check only queries the public npm registry — it is not telemetry and sends no account, organization, or auth information. It stays silent for `--json`, non-interactive shells, and CI, and never changes a command's exit code. **Homebrew installs are not nudged by this periodic notice** (npm alone cannot tell whether the formula has published the new version yet) — run `vox upgrade` or `brew outdated` for accurate Homebrew guidance. Turn it off with:
|
|
809
148
|
|
|
810
149
|
```bash
|
|
811
|
-
vox
|
|
812
|
-
vox mcp --config --target codex --json
|
|
813
|
-
vox mcp --config --target claude --json
|
|
814
|
-
vox mcp --config --target generic
|
|
150
|
+
VOX_NO_UPDATE_NOTIFIER=1 vox …
|
|
815
151
|
```
|
|
816
152
|
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
### Live smoke
|
|
820
|
-
|
|
821
|
-
복잡한 flow agent-as-code 루프를 실제 워크스페이스에서 확인해야 할 때는 opt-in live smoke를 사용합니다. 이 스모크는 disposable 원격 에이전트를 생성, 수정, pull/diff 확인 후 soft-delete하므로 release gate에는 자동 포함하지 않습니다.
|
|
822
|
-
|
|
823
|
-
```bash
|
|
824
|
-
VOX_PROFILE=<profile> \
|
|
825
|
-
VOX_LIVE_SMOKE_ORG_ID=<organization-id> \
|
|
826
|
-
VOX_LIVE_SMOKE_CONFIRM=<organization-id> \
|
|
827
|
-
npm run smoke:agent-flow-live
|
|
828
|
-
```
|
|
153
|
+
### macOS code signing
|
|
829
154
|
|
|
830
|
-
|
|
155
|
+
Official macOS binaries are signed with the company Developer ID Application identity, with a stable signing identity across builds:
|
|
831
156
|
|
|
832
|
-
```
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
npm run smoke:resource-live
|
|
157
|
+
```text
|
|
158
|
+
Identifier=ai.vox.cli
|
|
159
|
+
TeamIdentifier=Z47Q5G9FA2
|
|
160
|
+
Authority=Developer ID Application: Fleek Corp. (Z47Q5G9FA2)
|
|
837
161
|
```
|
|
838
162
|
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
### Local stdio bridge
|
|
842
|
-
|
|
843
|
-
`vox mcp --stdio`는 공식 TypeScript MCP SDK를 사용해 stdio 기반 로컬 MCP 서버를 실행하고, tool list/call을 profile의 hosted MCP(`mcp_url`)로 전달합니다. tool call에는 CLI OAuth resolver와 OS keychain token을 재사용합니다. `--stdio`와 `--json`은 함께 사용할 수 없습니다. stdout은 MCP protocol message 전용입니다.
|
|
844
|
-
|
|
845
|
-
hosted MCP 브릿지 전환 가능성을 확인하려면 로그인된 profile 또는 `VOX_OAUTH_ACCESS_TOKEN`이 있는 개발 머신에서 다음 spike를 실행합니다. 이 spike는 `AuthContext.mcpUrl`의 hosted MCP에 bearer token으로 연결해 `tools/list`와 `list_organizations`만 호출합니다. 토큰 값은 출력하지 않습니다.
|
|
846
|
-
|
|
847
|
-
```bash
|
|
848
|
-
npm run spike:mcp-bridge
|
|
849
|
-
```
|
|
163
|
+
Because the identity is stable, the macOS Keychain "Always Allow" choice keeps applying across `brew upgrade`s instead of re-prompting on every update. The first release that moves to the company Developer ID may prompt once (the identity changed from the previous one); after that it stays quiet while the identity is unchanged. This phase ships a Developer ID signature, not Apple notarization. Inspect it with `codesign -dvvv "$(which vox)"`.
|
|
850
164
|
|
|
851
|
-
|
|
165
|
+
## Support
|
|
852
166
|
|
|
853
|
-
|
|
167
|
+
- Homepage: https://www.tryvox.co
|
|
168
|
+
- Documentation: https://docs.tryvox.co
|
|
169
|
+
- npm package: https://www.npmjs.com/package/@vox-ai/cli
|
|
854
170
|
|
|
855
|
-
|
|
171
|
+
Licensed under the MIT License.
|
package/bin/vox
CHANGED
|
Binary file
|