신뢰 환경에서 CommandCode를 OpenAI-compatible API로 쓰기 위한 게이트웨이.
CommandCode Bridge는 CommandCode 계정을 OpenAI-compatible HTTP API로 노출하는 신뢰 환경용 브리지입니다. 로컬, LAN, VPN, tailnet 클라이언트가 표준 /v1/models, /v1/chat/completions 형식으로 CommandCode-backed 모델을 호출할 수 있게 해줍니다.
CommandCode가 필요합니다. 이 프로젝트는 공개 독립형 DeepSeek 프록시가 아니며, CommandCode CLI 번들을 포함하거나 재배포하지 않습니다. 공식 CommandCode CLI/account 환경(
command-codenpm package의cmd) 또는 동등한 CommandCode API credential이 필요합니다. 공식 설치/인증은 https://commandcode.ai/install에서 진행하십시오.
상태. 내부/신뢰 환경용 브리지입니다. upstream CommandCode
/alpha/generate경로는 alpha/internal API 성격이므로 변경될 수 있습니다.
| 영역 | 요약 |
|---|---|
| API 표면 | /health, /dashboard, /v1/models, /v1/chat/completions, redacted admin diagnostics. |
| 핵심 가치 | OpenAI-compatible client가 요청마다 cmd를 실행하지 않고 CommandCode-backed model을 호출합니다. |
| 라우팅 | daily-burn, balance-priority, round-robin, drain-first 정책 기반 multi-key credential 선택. |
| 운영 | bind, routing, credential, model toggle, diagnostics, save, restart와 한국어/영어/중국어 UI를 다루는 모바일 우선 dashboard. |
| 안전 경계 | upstream secret은 번들하지 않으며 localhost 또는 신뢰하는 VPN/tailnet/private proxy에서만 노출합니다. |
설치 후 one-shot smoke test:
BRIDGE=http://127.0.0.1:9992; \
curl -fsS "$BRIDGE/health" && echo && \
curl -fsS "$BRIDGE/v1/models" | head -c 400정상 상태에서는 JSON health/version 정보와 비어 있지 않은 OpenAI-compatible model list가 반환됩니다. 실제 chat completion은 CommandCode 계정에 사용 가능한 credit이 있는지 확인한 뒤 실행하세요.
- OpenAI-compatible 엔드포인트 제공:
GET /healthGET /dashboardGET /v1/modelsPOST /v1/chat/completions- redacted read-only 대시보드 상태용
GET /admin/config,GET /admin/commandcode/credentials - 인증된 대시보드 저장/재시작용
PUT /admin/config,POST /admin/restart
- CommandCode streaming event를 OpenAI chat completion 응답 또는 SSE chunk로 변환합니다.
- non-streaming/streaming OpenAI 클라이언트를 모두 지원합니다.
stream_options.include_usage도 지원합니다. - CommandCode가 emit한 tool call을 OpenAI
tool_calls로 다시 매핑합니다. developer,system,user,assistant,tool메시지를 지원합니다.- reasoning delta는 기본적으로 숨깁니다(
INCLUDE_REASONING=false). - visible output 없이
finish_reason: length로 끝난 응답은 기본적으로 빈 성공이 아니라 fail-closed 오류로 반환합니다. - CommandCode upstream credential을 CLI auth file, 단일 API key, multi-key env, JSON credentials file에서 로드합니다.
- 여러 CommandCode key를 안전하게 돌려 쓰는 multi-key credential router를 포함합니다.
- 서버 bind, routing policy, key 관리, model toggle, diagnostics, JSON 저장, restart와 한국어/영어/중국어 localization을 관리하는 모바일 우선
/dashboard를 포함합니다. - 선택적 balance alert와, 여러 bridge host를 묶는 선택적
commandcode-router프로세스를 포함합니다.
현재 bridge version: v0.33.1.
버전은 /health 응답과 웹 대시보드 오른쪽 위에 표시됩니다.
이번 bridge release는 공식 command-code npm package 0.33.1에 맞췄습니다.
- 기본 upstream
x-command-code-versionheader는COMMANDCODE_CLI_VERSION으로 덮어쓰지 않는 한0.33.1를 보냅니다. - bridge package/runtime version도
0.33.1라/health, dashboard, npm metadata가 대상 CommandCode CLI version과 일치합니다. command-code@0.33.1bundle을 직접 확인한 결과 bridge 핵심 API path(/alpha/generate,/alpha/whoami,/alpha/billing/credits,/alpha/billing/subscriptions,/alpha/usage/summary)는 기존 bridge 경로와 호환됩니다.- model catalog를
0.33.1CLI bundle 기준으로 확인했습니다. 기존 enabled default는 보수적으로 유지하고, Qwen 3.6 Max Preview, MiniMax M3, MiniMax M2.5, Kimi K2.5, Step 3.5 Flash, Gemini 3.5 Flash, Gemini 3.1 Flash Lite, GLM-5, GPT 5.4/5.3 Codex, Claude 4.6/4.7/4.8 등 추가 발견 항목은 config에서 명시적으로 켜기 전까지 disabled-by-default입니다.
OpenAI-compatible client
-> CommandCode Bridge :9992
-> POST https://api.commandcode.ai/alpha/generate
-> CommandCode stream events
-> OpenAI chat.completion 또는 chat.completion.chunk
브리지는 요청마다 cmd를 실행하지 않습니다. CommandCode CLI가 사용하는 upstream API 경로를 직접 호출하고 응답 형식만 OpenAI-compatible 형태로 정규화합니다. 그래서 CLI stdout 파싱을 피하고 지연시간을 줄이며, CLI-side local tools/memory로 인한 토큰 낭비를 막습니다.
하나의 chat-completion 요청은 시작부터 끝까지 하나의 upstream credential에 고정됩니다. 병렬성은 독립 요청을 여러 eligible key, 필요 시 여러 bridge host로 분산해서 확보합니다.
- Node.js 20+
- npm 10+
- 수동/source 실행은 Linux, macOS, WSL 지원
- 번들
install.sh사용 시 Linux user systemd 필요 - 공식 CommandCode CLI(
cmd, npm packagecommand-code) 또는 동등한 CommandCode upstream API key - 실제 generation에는 usable balance/credit이 있는 CommandCode 계정 필요
설치/수동 설정은 다음 세 상태를 기준으로 설계되어 있습니다.
- CommandCode CLI가 이미 설치·인증되어 있음
- 브리지가 기존
~/.commandcode/auth.jsoncredential을 첫 upstream key로 가져올 수 있습니다.
- 브리지가 기존
- CommandCode CLI는 설치되어 있지만 인증되지 않음
cmd login을 실행한 뒤 브리지를 재시작하십시오.
- CommandCode CLI가 없음
- 먼저 설치·인증하십시오.
npm install -g command-code cmd login
- Linux installer는 CLI가 없을 때
npm install -g command-code를 실행할지 물어볼 수 있습니다.
- 먼저 설치·인증하십시오.
source checkout 또는 package root에서 실행합니다.
./install.shinstaller가 하는 일:
- Node.js, npm, user systemd, CommandCode CLI 확인;
- CLI가 없으면 npm으로
command-code설치를 제안; - 기존 CommandCode CLI auth key가 있으면 가져오기;
- 입력하지 않으면 client-facing
BRIDGE_API_KEY생성; - 브리지를
~/.local/share/commandcode-bridge에 설치; - private runtime env를
~/.config/commandcode-bridge/env에 작성; commandcode-bridgeuser systemd service 생성;--no-start가 없으면 service 시작.
예시:
# 대화형, 안전한 local-only 기본값: 127.0.0.1:9992
./install.sh
# 비대화형 local 설치
./install.sh --yes --host 127.0.0.1 --port 9992
# Tailnet/LAN 노출; BRIDGE_API_KEY 유지 필수
./install.sh --host 0.0.0.0 --port 9992유용한 service 명령:
systemctl --user status commandcode-bridge --no-pager
systemctl --user restart commandcode-bridge
journalctl --user -u commandcode-bridge -f
curl -fsS http://127.0.0.1:9992/health | jqLinux host에서 로그인 전에도 service가 떠야 하면:
sudo loginctl enable-linger "$USER"private config는 보존하고 제거:
./uninstall.shservice, 설치 파일, private config까지 제거:
./uninstall.sh --purge-configgit clone <your-commandcode-bridge-repository-url> commandcode-bridge
cd commandcode-bridge
npm install --include=dev
cp .env.example .env.env를 편집하거나 환경 변수를 export합니다. CommandCode CLI auth file을 쓰는 최소 local-only 설정:
HOST=127.0.0.1
PORT=9992
BRIDGE_API_KEY=replace-with-a-long-random-client-key
COMMANDCODE_ROUTING_POLICY=daily_burn_priority
COMMANDCODE_EMPTY_VISIBLE_RESPONSE_POLICY=error_on_lengthupstream key를 명시하려면:
COMMANDCODE_API_KEY=your_commandcode_api_key빌드 및 실행:
npm run build
npm startDocker는 full source checkout이 있는 배포에서 지원됩니다. Dockerfile은 runtime image를 만들기 전에 검증/빌드 파이프라인을 실행합니다.
docker build -t commandcode-bridge .
docker run --rm -p 127.0.0.1:9992:9992 \
-e HOST=0.0.0.0 \
-e COMMANDCODE_API_KEY="$COMMANDCODE_API_KEY" \
-e BRIDGE_API_KEY="$BRIDGE_API_KEY" \
commandcode-bridge또는:
cd release
docker compose up -d --build운영 세부 사항은 docs/DEPLOYMENT.ko.md와 release/docker-compose.yml을 참고하십시오.
Health check:
curl -fsS http://127.0.0.1:9992/health | jqBRIDGE_API_KEY가 설정되어 있다면 인증된 model list:
export BRIDGE_API_KEY='<bridge env와 같은 값>'
curl -fsS http://127.0.0.1:9992/v1/models \
-H "Authorization: Bearer $BRIDGE_API_KEY" | jqNon-streaming chat completion:
curl -sS http://127.0.0.1:9992/v1/chat/completions \
-H "Authorization: Bearer $BRIDGE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "default",
"messages": [{"role": "user", "content": "Reply exactly: OK"}],
"max_tokens": 64,
"temperature": 0
}' | jqStreaming:
curl -N http://127.0.0.1:9992/v1/chat/completions \
-H "Authorization: Bearer $BRIDGE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "deepseek/deepseek-v4-pro",
"stream": true,
"messages": [{"role": "user", "content": "Count to three."}],
"stream_options": {"include_usage": true}
}'프로젝트 smoke script:
npm run smokesmoke script는 .env를 읽은 뒤 installed-service env file(~/.config/commandcode-bridge/env, Yorha macOS bridge host에서는 /Users/yorha/.config/commandcode-bridge/env)을 읽고, 마지막으로 shell에서 직접 지정한 값을 우선합니다. 다른 설치본을 검증할 때는 BRIDGE_ENV_FILE=/path/to/env를 지정하십시오. BRIDGE_BASE_URL, BRIDGE_API_KEY 같은 shell 값이 항상 파일 값보다 우선합니다.
계정은 도달 가능하지만 balance/credit 때문에 일시적으로 generation이 막힌 경우 routing-only fail-closed smoke mode를 사용할 수 있습니다.
SMOKE_ACCEPT_UPSTREAM_ERRORS=1 npm run smoke이 모드는 브리지가 빈 성공을 반환하지 않고 명시적 upstream/fail-closed 오류를 보여주는지만 확인합니다. 실제 generation readiness canary는 아닙니다.
열기:
http://127.0.0.1:9992/dashboard
브리지를 Tailscale/VPN/LAN 뒤에서 0.0.0.0으로 bind했다면:
http://<host-or-tailnet-ip>:9992/dashboard
대시보드는 의도적으로 모바일 우선입니다. 같은 trusted tailnet의 휴대폰에서도 운영하기 좋게 설계되어 있습니다.
- 대시보드는 한국어, 영어, 중국어 UI 문구를 내장합니다.
- 한국어가 hard fallback 언어입니다. 첫 로드 시 브라우저 locale이
en으로 시작하면 영어,zh로 시작하면 중국어를 선택하고, 그 외에는 한국어를 사용합니다. - 좌상단의 작은
CommandCode Bridge제목 옆 국기 버튼으로 수동 전환할 수 있습니다: 🇰🇷 한국어, 🇺🇸 영어, 🇨🇳 중국어. - 선택한 언어는 브라우저
localStorage에 저장되어 다음 방문에도 유지됩니다. - 활성 언어 국기는 컬러로, 비활성 언어 국기는 desaturated/grayscale로 표시됩니다.
- Header
- bridge online/offline 상태 표시.
v0.33.1같은 bridge version 표시.
- Server Bind
- local-only면
127.0.0.1. - LAN/Tailscale/VPN/reverse proxy 뒤에서만
0.0.0.0. - port 수정.
- 인증 write용 Admin API Key를 브라우저 local storage에 저장/복사.
- local-only면
- Routing Policy
- eligible upstream key 선택 정책 변경.
- key당 동시 요청 수 수정. 운영 기본값은 key당 in-flight 4회입니다.
- Credentials
- upstream CommandCode key 추가, 이름 변경, enable/disable, 삭제, refresh.
- key 이름을 바꾸거나 secret field를 비워도 기존 secret을 보존합니다.
- billing/diagnostics는 redacted operator summary로 표시합니다.
- Models
- configured model catalog를 on/off.
- 변경 후 restart 필요.
- Footer
Save JSON은 대시보드 JSON config를 저장합니다.Restart Bridge는 지원되는 LaunchAgent/system service 경로로 브리지를 재시작합니다.
GET /dashboard,GET /admin/config, redactedGET /admin/commandcode/credentials는 trusted network에서 휴대폰 브라우저가 상태와 저장된 redacted config를 바로 볼 수 있도록BRIDGE_API_KEY없이도 읽을 수 있습니다.- 단, public read-only 대시보드 endpoint도 metadata-bearing입니다. service version, bind/port, configured model ID, credential ID/preview, 개수, redacted balance summary가 보일 수 있으므로 localhost 또는 신뢰하는 VPN/tailnet 안에서만 노출하십시오.
- write/restart는
BRIDGE_API_KEY가 필요합니다.PUT /admin/configPOST /admin/restartBRIDGE_API_KEY가 설정된 경우 모든/v1/*inference call
- 대시보드는 raw CommandCode upstream key를 반환하지 않습니다.
- 대시보드는 public internet control plane으로 설계되지 않았습니다. Cookie session이 아니라 trusted network boundary와 bearer-token-protected write를 전제로 합니다.
- bind host, port, routing policy, credentials, models를 변경합니다.
- Save JSON을 누릅니다.
- Restart Bridge를 누릅니다.
/health,/v1/models로 확인합니다.
client-facing bridge key를 회전했다면 그 key를 쓰는 모든 client를 갱신해야 합니다. Hermes의 경우 bridge의 BRIDGE_API_KEY와 Hermes 쪽 COMMANDCODE_BRIDGE_API_KEY를 함께 맞추고, bridge/Hermes gateway 또는 해당 session을 재시작하십시오.
브리지는 다음 순서로 upstream CommandCode credential을 로드합니다.
COMMANDCODE_CREDENTIALS_FILECOMMANDCODE_CREDENTIALS또는COMMANDCODE_API_KEYS- legacy single-key
COMMANDCODE_API_KEY ~/.commandcode/auth.json~/.config/commandcode/auth.json
credential이 여러 개여도 /health는 개수와 routing policy만 반환합니다. Raw key는 포함하지 않습니다.
COMMANDCODE_API_KEY=your_commandcode_api_keyCOMMANDCODE_API_KEYS=primary=cmd_key_one,secondary=cmd_key_two
COMMANDCODE_ROUTING_POLICY=daily_burn_priority대시보드로 관리하거나 key가 여러 개인 경우 권장합니다.
COMMANDCODE_CREDENTIALS_FILE=/home/you/.config/commandcode-bridge/credentials.json예시 credentials.json:
{
"server": {
"host": "127.0.0.1",
"port": 9992
},
"routing": {
"policy": "daily_burn_priority",
"fallbackPolicy": "round_robin",
"maxInFlightPerCredential": 4,
"maxTotalInFlight": null,
"maxTotalInFlightMultiplier": 3
},
"models": [
{ "id": "deepseek/deepseek-v4-pro", "enabled": true },
{ "id": "deepseek/deepseek-v4-flash", "enabled": true },
{ "id": "MiniMaxAI/MiniMax-M2.7", "enabled": true },
{ "id": "Qwen/Qwen3.6-Plus", "enabled": true },
{ "id": "zai-org/GLM-5.1", "enabled": true },
{ "id": "moonshotai/Kimi-K2.6", "enabled": true },
{ "id": "openai/gpt-5.5", "enabled": false },
{ "id": "anthropic/claude-opus-4.7", "enabled": false },
{ "id": "anthropic/claude-sonnet-4.6", "enabled": false }
],
"credentials": [
{ "id": "primary", "apiKey": "cmd_key_one", "weight": 1, "enabled": true },
{
"id": "flash-only",
"apiKey": "cmd_key_two",
"weight": 1,
"enabled": true,
"allowedModels": ["deepseek/deepseek-v4-flash"]
}
]
}파일 권한 보호:
chmod 600 ~/.config/commandcode-bridge/credentials.jsonCommandCode Bridge는 여러 upstream CommandCode key를 등록하고 요청마다 적절한 key를 선택할 수 있습니다. 이것이 이 브리지의 핵심 운영 기능입니다. 트래픽을 분산하고, 한 key만 두드리는 일을 피하며, 건강하지 않거나 만료된 credential을 자동으로 제외할 수 있습니다.
| Policy | 목적 |
|---|---|
daily_burn_priority |
기본값. 현재 billing/credit 기간이 끝나기 전에 더 많이 써야 하는 key를 우선합니다. Legacy depletion_aware는 이 정책으로 정규화됩니다. |
balance_priority |
usable balance가 큰 key를 우선합니다. |
round_robin |
eligible key를 weight와 availability에 따라 순환합니다. |
drain_first |
앞 key부터 blocked/exhausted될 때까지 쓰고 다음 key로 이동합니다. |
Credential은 다음 경우 선택에서 제외될 수 있습니다.
- dashboard/JSON에서 수동 disabled;
- 요청 model이
allowedModels범위 밖; - key당 in-flight limit 도달;
- 429/5xx/timeout 이후 cooldown 중;
- usable billing balance가 없거나 current period가 만료됨.
Visible output이 나오기 전에 upstream error가 오고 다른 eligible credential이 있으면 bridge는 retry/failover할 수 있습니다. 이미 visible output이 시작된 뒤에는 중복 partial output을 피하기 위해 retry하지 않고 error를 표면화합니다.
운영 기본값:
COMMANDCODE_MAX_IN_FLIGHT_PER_CREDENTIAL=4DeepSeek V4 Flash load test에서는 더 높은 병렬성도 안정적이었지만, 일반 운영 권장값은 key당 in-flight 4회입니다. 증설은 diagnostics와 upstream behavior를 관찰한 뒤 진행하십시오.
-
서로 다른 ID의 credential을 최소 2개 설정합니다.
-
bridge를 재시작합니다.
-
diagnostics refresh:
curl -sS 'http://127.0.0.1:9992/admin/commandcode/credentials?refresh=true' \ -H "Authorization: Bearer $BRIDGE_API_KEY" | jq
-
low-token 요청을 여러 개 동시에 보냅니다.
-
diagnostics를 다시 보고 여러 credential에서 selection/in-flight movement가 보이는지 확인합니다.
-
모든 응답이 성공 generation이거나 명시적 upstream/fail-closed 오류인지 확인합니다.
BRIDGE_API_KEY를 설정하면 client 인증이 필요합니다.
BRIDGE_API_KEY=replace-with-a-long-random-client-keyClient는 둘 중 하나를 보낼 수 있습니다.
Authorization: Bearer <BRIDGE_API_KEY>
또는:
x-api-key: <BRIDGE_API_KEY>
/health는 의도적으로 인증 없이 열려 있으며 secret-free입니다. Admin writes와 /v1/* 요청은 key가 설정된 경우 인증이 필요합니다.
| 변수 | 기본값 | 설명 |
|---|---|---|
HOST |
127.0.0.1 |
bind 주소. VPN, tailnet, reverse proxy 뒤가 아니면 localhost 권장. |
PORT |
9992 |
HTTP port. |
BRIDGE_API_KEY |
미설정 | client-facing API key. 강력 권장; admin write에는 필요. |
COMMANDCODE_API_KEY |
미설정 | legacy single upstream CommandCode key. |
COMMANDCODE_API_KEYS |
미설정 | primary=...,secondary=... 형태의 comma-separated multi-key 목록. |
COMMANDCODE_CREDENTIALS |
미설정 | JSON credentials 배열/객체 또는 comma-separated multi-key 목록. |
COMMANDCODE_CREDENTIALS_FILE |
미설정 | JSON dashboard/credential file. upstream credential 최우선순위. |
COMMANDCODE_ROUTING_POLICY |
daily_burn_priority |
daily_burn_priority, balance_priority, round_robin, drain_first. depletion_aware는 legacy alias. |
COMMANDCODE_MAX_IN_FLIGHT_PER_CREDENTIAL |
4 |
key당 동시 요청 상한. |
COMMANDCODE_MAX_TOTAL_IN_FLIGHT |
미설정 | 선택적 전체 in-flight 고정 상한. |
COMMANDCODE_MAX_TOTAL_IN_FLIGHT_MULTIPLIER |
3 |
explicit total cap이 없을 때 쓰는 legacy/default multiplier. |
COMMANDCODE_BILLING_REFRESH_MS |
300000 |
routing diagnostics용 billing/usage cache TTL. |
COMMANDCODE_BILLING_TIMEOUT_MS |
10000 |
billing probe timeout. |
COMMANDCODE_CREDENTIAL_COOLDOWN_MS |
60000 |
upstream failure 이후 cooldown. |
COMMANDCODE_API_BASE |
https://api.commandcode.ai |
upstream API base. 알려진 대체 upstream 테스트 외에는 바꾸지 마십시오. |
COMMANDCODE_DEFAULT_MODEL |
deepseek/deepseek-v4-pro |
default가 사용할 model. |
COMMANDCODE_ALLOWED_MODELS |
Pro + Flash/catalog defaults | comma-separated allowlist. |
COMMANDCODE_ALLOW_UNKNOWN_MODELS |
false |
임의 model ID를 upstream으로 통과. 운영 비권장. |
COMMANDCODE_CLI_VERSION |
0.33.1 |
upstream으로 보내는 version header. |
COMMANDCODE_TIMEOUT_MS |
300000 |
upstream request timeout. |
COMMANDCODE_EMPTY_VISIBLE_RESPONSE_POLICY |
error_on_length |
empty visible finish_reason: length를 fail-closed. allow는 legacy blank success 유지. |
REQUEST_BODY_LIMIT_BYTES |
1048576 |
Fastify body limit. |
RATE_LIMIT_MAX |
60 |
rate-limit window당 요청 수. |
RATE_LIMIT_WINDOW |
1 minute |
rate-limit window 문자열. |
LOG_LEVEL |
info |
Fastify/Pino log level. |
CORS_ORIGIN |
미설정 | 선택적 CORS origin. |
INCLUDE_REASONING |
false |
reasoning delta를 visible output에 붙임. 일반 client는 false 권장. |
COMMANDCODE_BALANCE_ALERT_ENABLED |
false |
periodic balance alert 활성화. 기본 off. |
COMMANDCODE_BALANCE_ALERT_WEBHOOK_URL |
미설정 | alert용 선택적 JSON webhook. |
지원 요청 필드:
modelmessagesstreammax_tokenstemperaturetop_pstop- function schema 기반
tools tool_choice는 미지정,"auto","none"만 지원response_format(json_object/json_schema요청에는 JSON-only prompt reinforcement 적용)stream_options.include_usageuser
특정 tool 강제 선택은 unsupported_tool_choice를 반환합니다. CommandCode /alpha/generate가 안정적인 forced-tool selector를 제공하지 않기 때문입니다.
commandcode-router는 multi-host 배포용 별도 프로세스입니다. 하나의 /v1 endpoint를 유지하면서 독립 요청을 in-flight가 가장 적은 healthy bridge backend로 라우팅합니다.
COMMANDCODE_ROUTER_BACKENDS=local=http://127.0.0.1:19992,pc2=http://<tailnet-ip>:9992
COMMANDCODE_ROUTER_BACKEND_MAX_INFLIGHT=1
COMMANDCODE_ROUTER_BACKEND_TIMEOUT_MS=300000
COMMANDCODE_ROUTER_HEALTH_TIMEOUT_MS=3000
COMMANDCODE_ROUTER_COOLDOWN_MS=60000bridge host가 여러 대일 때만 사용하십시오. 대부분의 경우 단일 bridge process 안의 built-in multi-key credential router로 충분합니다.
npm install --include=dev
npm run typecheck
npm run lint
npm run format:check
npm test
npm run build
npm run verifynpm run verify는 typecheck, lint, format check, test, build를 모두 실행합니다.
- TLS, 인증, trusted network boundary 없이 public internet에 노출하지 마십시오.
HOST=0.0.0.0은 머신의 모든 interface에 listen한다는 뜻입니다. Tailscale/WireGuard/VPN/firewall/reverse proxy 뒤에서만 사용하십시오. 그 자체가 보안 장치는 아닙니다.127.0.0.1, Tailscale, WireGuard, VPN, private reverse proxy를 권장합니다.- non-localhost 배포에서는 항상
BRIDGE_API_KEY를 설정하십시오. - Read-only dashboard endpoint도 redacted metadata를 노출할 수 있다고 취급하십시오.
.env,~/.commandcode/auth.json,credentials.json, upstream API key, bridge key, billing detail, router backend topology, dashboard-exported secret을 commit하지 마십시오.- CommandCode credential은 개인 upstream credential로 취급하십시오.
- 이 저장소는 CommandCode의 proprietary/UNLICENSED CLI bundle source를 포함하지 않습니다.
- 이 브리지는 CommandCode account limits, billing, rate limits, terms를 우회하지 않습니다.
- 이 브리지는 일반 public proxy service가 아닙니다.
자세한 내용은 docs/SECURITY.md를 참고하십시오. 비공개 보안 제보는 GitHub Security Advisory form(https://github.com/yelixir-dev/commandcode-bridge/security/advisories/new)을 사용하거나 yelixir.dev@gmail.com으로 연락하세요.
/health는 public입니다. BRIDGE_API_KEY가 설정되어 있으면 /v1/*는 인증이 필요합니다.
export BRIDGE_API_KEY='<bridge env와 같은 값>'
curl -fsS http://127.0.0.1:9992/v1/models \
-H "Authorization: Bearer $BRIDGE_API_KEY" | jqbridge의 client-facing key는 바뀌었지만 client가 예전 key를 들고 있는 상태입니다. Hermes에서는 다음 둘을 함께 맞추십시오.
- bridge runtime env:
BRIDGE_API_KEY - Hermes env/client setting:
COMMANDCODE_BRIDGE_API_KEY
둘 다 갱신한 뒤 bridge/Hermes gateway 또는 해당 session을 재시작하십시오.
실행:
cmd login그 뒤 bridge를 재시작하십시오. 또는 COMMANDCODE_API_KEY, COMMANDCODE_API_KEYS, COMMANDCODE_CREDENTIALS_FILE을 명시적으로 제공하십시오.
Diagnostics 확인:
curl -sS 'http://127.0.0.1:9992/admin/commandcode/credentials?refresh=true' \
-H "Authorization: Bearer $BRIDGE_API_KEY" | jq브리지 동작 테스트만 할 때:
SMOKE_ACCEPT_UPSTREAM_ERRORS=1 npm run smoke진짜 generation readiness는 이 flag 없이 normal smoke가 통과해야 합니다.
대부분의 대시보드 변경은 JSON을 저장하고 restart가 필요합니다. Restart Bridge를 누르거나 service를 수동 재시작하십시오.
lsof -nP -iTCP:9992 -sTCP:LISTEN
# Linux
ss -ltnp '( sport = :9992 )'충돌 process를 멈추거나 PORT를 바꾸십시오.
브리지의 신뢰 경계를 유지하는 변경은 환영합니다. Upstream secret을 번들하지 않고, public internet 기본 노출을 만들지 않으며, CommandCode CLI를 재배포하지 않는 방향이어야 합니다. 변경 전 다음을 실행하십시오.
npm run verify보안에 민감한 변경은 먼저 docs/SECURITY.md를 읽고, issue/log/screenshot/fixture에 credential, local env file, private topology, billing detail이 들어가지 않게 하십시오.
README.md— 영어 README.docs/DEPLOYMENT.md— 배포와 운영 가이드.docs/DEPLOYMENT.ko.md— 한국어 배포와 운영 가이드.docs/ARCHITECTURE.md— 구조와 data flow.docs/KNOW_HOW.md— CommandCode API notes와 운영 노하우.docs/SECURITY.md— 보안 모델과 배포 가드레일.docs/PRD.md— product requirements.docs/IMPLEMENTATION_PLAN.md— implementation plan.docs/PROCESS_LOG.md— work log.
MIT. CommandCode 자체는 별도 software이며 다른 terms를 가질 수 있습니다.
