Skip to Content

AXE CLI (axe)

셸을 가진 에이전트·사람·cron·CI 어디서나 AXE 플랫폼 서비스를 쓰는 단일 명령줄 도구. MCP 커넥터를 서비스마다 따로 등록할 필요 없이, 로그인 1회로 받은 토큰 하나로 frame·hive·index·cortex·matrix·blueprint·gate 를 모두 호출한다.

  • 에이전트 무관: Claude Code · Codex · Cursor · Gemini CLI · 사람 터미널 · cron · CI — 셸만 있으면 동작.
  • 토큰 인증: 브라우저 SSO 1회 또는 헤드리스 토큰. 권한은 토큰 스코프가 결정(중앙 관장).
  • 플랫폼 SSO: axe login → Microsoft SSO 1회 → Blueprint 가 발행한 플랫폼 토큰 → 전 서비스. 신원·스코프·취소는 Blueprint 한 곳에서 관장한다 (Blueprint = 플랫폼 OIDC Provider).

ℹ️ 이 페이지의 axe 는 전부 에이전트 CLI(~/axe-cli/axe) 다. 대부분의 머신에는 이것 하나뿐이라 PATH 의 axe 로 그냥 쓰면 된다. 같은 이름의 다른 도구가 이미 PATH 에 있는 머신에서는 ~/axe-cli/axe … 절대경로로 부른다 — axe frame toolsusage: axe […] 로 죽으면 그 경우다.

⚠️ 구 공개 /cli 바이너리 URL 은 폐기됐다(지금은 404). 바이너리는 GET /api/cli/download 로만 나온다. 에이전트판(?edition=agent)은 무인증이라 아래 세 줄로 끝나고, 운영자판은 Bearer 토큰이 필요해 /axe 대시보드의 CLI 설치 카드에서 본인용 명령을 받아 설치한다. 아래에서 <tenant>.axelabs.ai/cli로 표시한 공개 흐름은 별도 주권 테넌트용이다.

mkdir -p ~/axe-cli curl -fsSL "https://axelabs.ai/api/cli/download?edition=agent" -o ~/axe-cli/axe chmod +x ~/axe-cli/axe

설치기 스크립트(/cli.sh · /cli.ps1)를 파이프하는 방식은 테넌트에 따라 AXE_TOKEN 을 요구할 수 있다(토큰 게이트에 걸리면 axe install: AXE_TOKEN not set — the operator-edition download is auth-gated. 로 exit 1). 위의 직접 다운로드는 어느 쪽이든 동작한다.

에이전트에 붙여넣기 (copy-paste)

당신의 AI 에이전트(Claude Code CLAUDE.md · Codex AGENTS.md · Cursor rules · 또는 그냥 채팅창)에 아래 블록을 그대로 복붙하면, 그 에이전트는 즉시 AXE 전 서비스를 쓸 수 있다. (사람은 바로 아래 빠른 시작 블록 참고.)

너는 AXE 플랫폼 CLI `axe` 를 쓸 수 있다 — 셸 명령 하나로 모든 AXE 서비스를 호출한다 (MCP 커넥터 불요). 위치: `axe` (PATH) 또는 `~/axe-cli/axe`. 없으면 설치 (토큰 불요 — 설치기 스크립트가 아니라 다운로드 URL 을 직접 친다): macOS/Linux: mkdir -p ~/axe-cli && curl -fsSL "https://axelabs.ai/api/cli/download?edition=agent" -o ~/axe-cli/axe && chmod +x ~/axe-cli/axe Windows: https://docs.axelabs.ai/services/cli 의 "부록: Windows 수동 설치" 스니펫 (다운로드 + axe.cmd shim + PATH) 인증은 1회만: `axe login` (브라우저 SSO). 브라우저 없는 환경이면 `AXE_TOKEN` env 로 토큰 주입. 확인: `axe whoami` → iss=axe.axelabs.ai, email, scope, exp 가 보이면 OK. 서비스 사용법 — 처음 들어가는 서비스면 (0) guide, 그다음 항상 (1) 도구 조회 후 (2) 호출: axe <service> guide # 그 서비스 데이터 조회 오리엔테이션 (읽기 전용, 전 서비스 동일 이름) axe <service> tools # 그 서비스의 도구 목록 (이름 + 설명) axe <service> call <tool> --args '<json>' # 도구 1개 실행 (JSON 인자) axe <service> call <tool> --args-file - # 큰/민감 JSON은 stdin으로 전달 axe teams chats [검색어] [--limit N] # (편의 v0.1.4) Teams 채팅 목록 — chat_id 탐색 axe teams read <chat|링크> [--limit N] [--since ISO] # (편의 v0.1.7) chat history 읽기 — id 또는 deep link, admin axe teams send <chat_id> --text "..." # (편의 v0.1.4) Teams 채팅에 AXE 봇으로 발송 (admin) # --dry-run 미리보기 · --text - (stdin) · --html # ↑ blueprint MCP send_teams_message/list_teams_chats/read_teams_chat 의 1급 래퍼 (verbose call 대체). # agent edition은 무인증 /api/cli/download?edition=agent 에서 배포되며 매 실행 auto-update 확인. 서비스: frame = 회계/ERP (분개·재무제표·마감) hive = HR/급여 (직원·휴가·명세서) index = 투자 (딜·펀드·IRR·재무모델) cortex = CRM/인맥 그래프 matrix = 인프라 모니터링 blueprint = 플랫폼 (신원·캘린더·Teams·메일) gate = 결재·계약·전자서명 규칙: - 도구 이름과 인자 스키마는 *기억하지 말고* 매번 `axe <service> tools` 결과에서 가져와라. - `--args-file FILE|-`는 모든 서비스에 동일하며 `-`는 stdin이다. 셸 인자·히스토리에 JSON을 남기지 않을 때 사용한다. - 순수 셸이라 조합이 그대로 된다: `axe frame tools | grep balance`, for-loop, `| jq` 파이프. - 기본 엔드포인트는 https://axe.axelabs.ai. 서비스와 같은 호스트에서 돌면 `--local` 로 저지연. - 호출이 **401**이면 `axe refresh`, 그래도 안 되면 `axe login`을 다시 안내한다. **403은 권한/entity scope 거부**이므로 refresh로 우회하지 말고 요청 범위나 권한을 확인한다. - 너는 만능 권한이 아니다 — 가능한 동작은 토큰 scope 가 정한다 (`axe whoami` 의 scope).

빠른 시작 (사람)

복붙 한 덩어리로 설치 확인 → 로그인 → 첫 호출:

axe --help # 또는 ~/axe-cli/axe --help axe login # 브라우저 SSO 1회 (→ Keychain) axe whoami # 토큰 확인 axe frame tools | head # 첫 호출 (frame 도구 목록)

Blueprint Todo

agent CLI 0.1.31+와 통합 운영자 CLI는 같은 사용자 SSO 토큰으로 Blueprint Todo를 관리한다. axe login 외의 별도 내부키는 필요 없다. 쓰기 절차의 AI용 지침은 axe blueprint todo guide 다 (0.1.61+ — 그 전에는 axe blueprint guide 였고, 지금 그 이름은 읽기 전용 조회 오리엔테이션이 쓴다).

axe blueprint todo guide # 쓰기 절차 지침 (구 `axe blueprint guide`) axe blueprint todo list --entity <entity_id> axe blueprint todo add --title "후속 연락" --entity <entity_id> --assignee "<담당자>" axe blueprint todo assign <id> --to "<담당자>" axe blueprint todo done <id>

서버는 사용자 토큰 호출의 reporter와 감사 행위자를 로그인 사용자로 고정하고, 그 사용자의 entity scope를 적용한다. 목록에는 후속 assign/done에 그대로 쓸 전체 id가 표시된다. 기존 headless 자동화의 AXE_OPS_TOKEN은 platform token이 아예 없을 때만 쓰는 레거시 호환 경로다. platform token의 401은 정상 SSO refresh로만 넘기며, entity-scope 403에서도 절대 fallback하지 않는다.

설치 / 위치

CLI 는 각 테넌트가 자기 도메인에서 서빙한다. 설치 카드가 같은 origin을 AXE_BASE로 설치기에 전달하므로 sovereign tenant 토큰이 AXE 본체 도메인으로 되돌아가지 않는다. 공개 /cli(구 직접 바이너리 URL)는 별도 주권 테넌트에만 남아 있다.

자원URL (AXE)용도
에이전트 CLIGET https://axelabs.ai/api/cli/download?edition=agent무인증 다운로드 + axe self-update 소스
운영자 CLIGET https://axelabs.ai/api/cli/download인증(Bearer) 다운로드

에이전트판이 무인증인 이유는 그것이 CLI 의 자가치유 채널이기 때문이다 — 로그인이 깨진 설치본은 유효한 토큰을 만들 수 없으므로, 게이트가 있으면 수정본이 정작 그 사람들에게 도달하지 못한다. 운영자판(vault·deploy·ship)은 게이트 유지.

운영자판 설치 명령은 /axeCLI 설치 카드가 짧은 수명의 사용자 토큰을 포함해 생성한다. 다른 주권 테넌트는 정책에 따라 https://<tenant>.axelabs.ai/cli · /cli.ps1을 공개할 수 있다.

⚠️ 무인증이 보장되는 것은 다운로드 URL(?edition=agent) 이지 설치기 스크립트가 아니다. 설치기(/cli.sh · /cli.ps1)는 에디션별 토큰 면제를 나중에 얻었고, 테넌트가 어느 사본을 서빙하느냐로 결과가 갈린다. 2026-08-11 apex 정적 실측: /cli.sh/cli/axe.sh(5,997 B)로 307 리다이렉트되고, 그 스크립트는 axe install: AXE_TOKEN not set — the operator-edition download is auth-gated. 를 출력한 뒤 exit 1 하는 토큰 게이트를 갖고 있다(메시지가 지목하는 대상은 operator 에디션. 스크립트를 실행하지 않고 내용만 확인한 측정이라, AXE_CLI_EDITION=agent 로 파이프했을 때 이 게이트에 걸리는지는 이 측정으로 판정하지 않는다). 아래의 직접 다운로드는 어느 사본이 서빙되든 동작한다.

macOS / Linux

CLI 는 stdlib Python 단일 파일(의존성 0)이라 ~/axe-cli/axe 하나만 있으면 된다. 새 머신은 세 줄:

mkdir -p ~/axe-cli curl -fsSL "https://axelabs.ai/api/cli/download?edition=agent" -o ~/axe-cli/axe chmod +x ~/axe-cli/axe alias axe="~/axe-cli/axe" # 셸 rc 에 추가 axe --version

Python 3 필요 (파일 첫 줄이 #!/usr/bin/env python3). 설치기(/cli.sh)를 쓰는 경우엔 AXE_CLI_EDITION=agent 를 생략하지 말 것 — POSIX 설치기의 기본 edition 은 operator 이고 그쪽은 항상 AXE_TOKEN 을 요구한다.

Windows (PowerShell)

Windows 도 다운로드 URL 은 무인증이지만, axe 를 명령으로 쓰려면 axe.cmd shim 과 PATH 등록이 필요하다 — 맨 아래 부록: Windows 수동 설치 의 스니펫이 그 세 가지를 한 번에 하고 토큰도 필요 없다. (irm https://axelabs.ai/cli.ps1 | iex 는 agent edition 이 기본이라 토큰 없이 통과한다 — 2026-08-15 Windows 11 실측. 이 부록은 실행 정책이 iex 를 막는 환경용이다. 셸에 AXE_CLI_EDITION=operator 가 남아 있으면 운영자판을 받으러 가 throw 하므로, 그 경우엔 $env:AXE_CLI_EDITION='agent'; 를 앞에 붙인다.)

설치 후 새 PowerShell 창에서 axe --version. Python 3 필요 (py -3 또는 python — 없으면 python.org  또는 MS Store 설치 후 재실행).

  • 로그인: axe login 브라우저 SSO 는 Windows 에서도 동작(기본 브라우저 + 127.0.0.1 loopback). 브라우저가 안 열리면 출력된 URL 을 수동으로 열거나, 헤드리스는 axe login --token "<TOKEN>" / $env:AXE_TOKEN="<TOKEN>".
  • 토큰 저장처: Keychain 이 없으므로 %USERPROFILE%\.axe-cli\token (현재 사용자 ACL 로 제한 — CLI 가 icacls 로 상속 차단). 우선순위는 동일: AXE_TOKEN env > 파일.
  • 설치는 맨 아래 부록: Windows 수동 설치 의 단계별 스니펫으로 한다 (토큰 불요). 실행 정책에 막히는 환경에서도 같은 스니펫을 쓴다.

AI 에이전트에게 시키기 — 직접 안 치고 싶으면 Claude Code · Codex · Cursor · 채팅창에 아래를 복붙:

내 Windows PowerShell 에 AXE 플랫폼 CLI 를 설치하고 동작까지 확인해줘. 참고: https://docs.axelabs.ai/services/cli (Windows 섹션). 1. 설치 (토큰 불요): 그 페이지의 "부록: Windows 수동 설치" PowerShell 스니펫을 그대로 실행 - 다운로드(`/api/cli/download?edition=agent`) + axe.cmd shim + 사용자 PATH 등록까지 한 번에 한다 - `irm .../cli.ps1 | iex` 설치기는 토큰을 요구할 수 있으므로 쓰지 말 것 ("AXE_TOKEN not set" throw) - "실행이 사용되지 않도록 설정" 오류면 먼저: Set-ExecutionPolicy -Scope Process Bypass -Force - "Python 3 not found" 면 python.org 또는 MS Store 에서 Python 3 설치 후 재실행 2. 새 PowerShell 창을 열고 axe --version 으로 PATH 등록 확인 3. 로그인: axe login (브라우저 SSO. 안 열리면 출력된 URL 수동 오픈, 또는 $env:AXE_TOKEN = "<토큰>" ) 4. 검증: axe whoami 그다음 axe frame tools 각 단계 결과를 확인하고, 막히면 멈춰서 무엇이 어떻게 틀렸는지 알려줘. 토큰 값은 절대 출력하지 마.

로그인

1) 브라우저 SSO (기본 — 사람/대화형)

axe login

브라우저가 열리고 Microsoft 로그인 1회 → 자동으로 토큰을 받아 macOS Keychain 에 저장한다. (내부: loopback PKCE → Blueprint /oauth/authorize → Entra → 토큰 교환.) 끝나면:

axe whoami # { # "iss": "https://axe.axelabs.ai", ← Blueprint 발행 # "email": "[email protected]", # "scope": "openid profile email frame hive index cortex matrix blueprint", # "aud": "https://axe.axelabs.ai", "exp": ... # }

2) 헤드리스 토큰 (Codex / CI / cron / 브라우저 없는 환경)

브라우저를 못 여는 환경은 토큰을 직접 준다 (gh auth login --with-token 모델):

axe login --token "<TOKEN>" # 키체인 저장 axe login --token - # stdin 으로 (echo 회피) export AXE_TOKEN="<TOKEN>" # env 가 키체인보다 우선 (CI/샌드박스)

토큰 해석 우선순위: AXE_TOKEN env > macOS Keychain > ~/.axe-cli/token (0600). AXE_TOKEN env override 가 헤드리스(CI·Codex·샌드박스)의 표준 경로 — 키체인 없이 동작하고 셸 세션에만 살아 디스크에 남지 않는다.

device-code grant (RFC 8628) 은 계획 단계 (플랫폼 신원 로드맵 Phase 3). 브라우저는 못 열지만 다른 기기로 코드 입력은 가능한 환경(예: 원격 SSH 셸)을 위한 흐름 — 아직 미구현. 그때까지 헤드리스는 위의 AXE_TOKEN env / axe login --token - (stdin) 을 쓴다.

토큰 갱신 / 로그아웃

axe refresh # 저장된 refresh 토큰으로 access 토큰 무중단 갱신 axe logout # 저장된 access/refresh + 레거시 Todo 키 제거 (명시 AXE_OPS_TOKEN env는 셸에서 직접 unset)

서비스 호출

axe <service> guide # 데이터 조회 오리엔테이션 (읽기 전용) axe <service> tools # 도구 목록 axe <service> call <tool> --args '<json>' # 도구 실행

서비스: frame (회계) · hive (HR) · index (투자) · cortex (CRM) · matrix (인프라) · blueprint (플랫폼) · gate (결재·계약).

예시:

axe frame tools # frame 도구 목록 axe frame call query_balance --args '{"entity_id":"<entity_id>","account_code":"1101"}' axe hive call employee_search --args '{"entity_id":"<entity_id>","query":"김"}'

axe <svc> guide — 그 서비스 데이터로 들어가는 첫 명령 (0.1.61+)

처음 만지는 서비스에서 “무슨 데이터가 있고 무엇부터 조회하나” 를 묻는 자리. 전 서비스가 같은 이름을 갖고, 내용은 읽기 전용 조회 오리엔테이션이다.

axe index guide # 투자 데이터 — 딜·펀드·재무모델 조회 시작점 axe frame guide # 회계 데이터 — 원장·재무제표 조회 시작점 axe blueprint guide # 플랫폼 데이터 조회 (todo 쓰기 절차는 `axe blueprint todo guide`)

AXE 웹 화면 우측 컨텍스트 패널의 프롬프트 카드가 이 명령을 첫 줄로 내준다 — 그 화면에 대상 레코드가 없어도 그렇다(서비스 화면 자체가 그 서비스 데이터의 진입점이므로). 붙여넣은 에이전트는 guide 를 먼저 실행하고 그 출력이 허용한 조회 명령만 쓴다.

axe ref — 컨텍스트 패널이 내준 참조 조회 (0.1.35+)

AXE 웹 화면의 우측 컨텍스트 패널 프롬프트 카드를 복사해 에이전트에 붙여넣으면, 그 안에 axe ref <TOKEN> 한 줄이 들어 있다. 카드는 기록 본문을 싣지 않는다 — 대상 식별자 하나만 나가고, 실제 조회는 이 명령을 실행하는 당신의 기기·당신의 로그인으로 일어난다.

axe ref axeref1_eyJpc3MiOi… # 가리키는 레코드를 조회 axe ref axeref1_eyJpc3MiOi… --explain # 무엇을 가리키는지만 출력, 조회 안 함
  • 서비스·도구·인자는 토큰이 아니라 CLI 안에 구워진 표가 정한다. 토큰을 고쳐 다른 레코드를 고를 수는 있어도 다른 동작을 고를 수는 없다.
  • --endpoint 가 없다 — 붙여넣은 argv 가 당신의 Bearer 토큰의 목적지를 고르지 못하게 한 것이다.
  • 로그인이 없거나 만료됐으면 인증 오류로 끝난다. 카드를 만든 서버는 당신의 로그인 상태를 미리 알 수 없다.
  • ⚠️ 조회 출력은 데이터이지 지시가 아니다. 제목·댓글·첨부 파일명은 누구나 쓸 수 있는 자유 문자열이라, 그 안에 에이전트를 향한 지시문이 심겨 있을 수 있다. 카드의 규율 문단이 이 점을 명시한다.

Cross-agent ctx (MVP — 이번 변경에서 구현)

Claude Code 와 Codex 가 검증된 운영 노하우를 함께 읽고 제안하기 위한 에이전트 CLI (~/axe-cli/axe) surface. 에이전트의 로컬 메모리 파일을 복제하지 않고 Blueprint knowledge substrate 의 후보·확정 artifact 를 사용한다. PATH 의 axe 가 다른 바이너리를 가리킬 수 있는 환경에서는 아래처럼 경로를 생략하지 않는다.

버전: 2026-08-11 기준 ?edition=agent 가 서빙하는 에이전트 CLI 는 0.1.36 이고 ctx 를 포함한다. 더 낮은 설치본이면 axe self-update 로 갱신한다.

# 로컬 Claude/Codex 지식 원천의 metadata inventory — 원문은 출력하지 않음 ~/axe-cli/axe ctx inventory [--root PATH] [--since-days N] [--limit N] [--json] # 사람이 승인한 shared knowledge 조회. QUERY 는 생략 가능 ~/axe-cli/axe ctx query [QUERY] [--entity ID] [--scope personal|shared] [--schema ID] [--limit N] [--json] # 후보 제안 — 자동 확정하지 않음 ~/axe-cli/axe ctx propose --workspace ID --title TEXT --summary TEXT [--source PATH] \ [--scope personal|shared] [--confidence 0..1] \ [--sensitivity public|internal] \ [--allow-risky-source] [--json] # 후보 검토 ~/axe-cli/axe ctx review list [--entity ID] [--workspace ID] [--limit N] [--json] ~/axe-cli/axe ctx review approve CANDIDATE_ID [--note TEXT] [--json] ~/axe-cli/axe ctx review reject CANDIDATE_ID --reason TEXT [--json]

명령별 불변식:

  • inventory로컬 출력path / category / mtime / size / sha256 / riskReasons 만 포함한다. 세션 transcript·메모리 본문·비밀 값은 출력하지 않는다. 원격 candidate 에는 절대 path 대신 source content hash·risk reason·override 여부만 기록한다.
  • query 의 기본 schema 는 확정 지식인 agent.knowledge@1 이다. 후보를 기본 읽기 경로에 섞지 않는다.
  • proposeagent.knowledge.candidate@1 을 만든다. 위험 원천은 default deny 이며 운영자가 --allow-risky-source 를 명시해야 한다. ctx MVP sensitivity 는 public|internal만 허용하고 기본값은 internal이다.
  • agent CLI 0.1.24+propose는 server가 owner workspace를 fetch limit 전에 좁힌 최근 candidate·confirmed window에서 정확한 semantic hash에 더해 NFKC + casefold + 공백 축약 제목을 비교한다. pending 또는 confirmed 제목 충돌은 거부한다. 오타 candidate를 명시적으로 reject하면 candidate-id-filtered decision 조회 후 그 제목을 교정 summary에 다시 쓸 수 있다. malformed review는 제목을 해제하지 않는다. 이 제목 검사는 bounded client preflight이며 동시성 경계가 아니다.
  • candidate와 confirmed는 schema별 partial unique index가 같은 workspace의 semantic hash 중복을 각각 막고, candidate→confirmed의 같은 hash 공존은 정상이다. 별도 cross-schema decision index가 한 candidate의 approve/reject 이중 결정을 concurrency-safe하게 막는다. 제목 중복에는 append-only candidate→knowledge 공존 때문에 단순 cross-schema unique index를 쓰지 않으며, CLI의 windowed title preflight를 권위 있는 DB guard로 과장하지 않는다.
  • review approve 는 candidate 를 덮어쓰지 않고 derivedFromId 로 연결된 agent.knowledge@1 을 만든다. review reject 도 candidate 를 삭제하지 않고 agent.knowledge.review@1 거절 기록을 남긴다. server가 parent/workspace/hash를 재검증하고 authenticated reviewer와 timestamp를 기록한다.
  • review list는 schema별 최근 최대 100건으로 계산하는 bounded MVP view다. --entity·--workspace로 좁히며, 완전한 감사 목록은 substrate query/audit surface를 사용한다.
  • --json 성공 출력은 안정적으로 파싱할 수 있는 unwrapped JSON이다. 오류와 window 경고는 stderr로 나가므로 호출자는 exit code도 확인한다.

엔드포인트 선택

플래그대상용도
(기본)public https://axe.axelabs.ai/<svc>/mcp외부/원격
--local127.0.0.1 (같은 호스트)서비스와 같은 호스트에서 실행할 때 (저지연)
--endpoint <URL>임의디버그

axe login --local 로 기본 모드를 로컬로 고정 가능. local 호출은 DNS-rebinding 가드 통과를 위해 public Host 헤더를 자동 첨부한다.

토큰에 뭐가 들었나

Blueprint 발행 플랫폼 토큰(RS256)은 iss=https://axe.axelabs.ai(2026-06-13 issuer flip — 구 blueprint.axellc.com 은 은퇴, 병행 서빙 종료), email(→ 각 서비스가 entity 권한으로 매핑), aud=https://axe.axelabs.ai(전 서비스 공통), scope(서비스 grant), exp(1h, refresh 로 갱신). 각 서비스는 Blueprint JWKS(/.well-known/jwks.json)로 서명을 검증한다. axe whoami 로 언제든 확인.

에이전트에서 쓰기 (조합성)

CLI 는 syscall 층이라 셸 조합이 그대로 통한다 — 모델 왕복 없이 pipe·loop·jq:

# frame 모든 도구 이름만 axe frame tools | awk '{print $1}' # 여러 entity 잔액을 한 번에 (entity_id 는 본인 조직의 것으로) for e in <entity_a> <entity_b>; do axe frame call query_balance --args "{\"entity_id\":\"$e\",\"account_code\":\"1101\"}"; done

Codex·CI 에선 AXE_TOKEN env + 아웃바운드 HTTPS 허용만 있으면 동작 (브라우저 불요).

거버넌스

권한은 토큰 스코프가 결정하고, 발행·스코프·취소·감사는 Blueprint 중앙에서 관리한다. 토큰 유출 시: 짧은 exp(1h) + refresh 취소 + 스코프로 blast radius 제한. 운영자 axe(vault/deploy)와 고객 CLI(업무 명령)는 스코프 분리 — 만능 바이너리를 고객에 주지 않는다.

문제 해결

axe login은 됐는데 서비스 호출이 401이면 → axe whoami 로 토큰의 issuer · audience · scope · 만료를 먼저 확인한다 (만료면 axe refresh). 403은 인증 갱신 대상이 아니라 권한 또는 entity scope 거부다. CLI는 403에서 refresh·다른 credential fallback을 하지 않는다. Cloudflare가 낸 public 403이 의심되면 CLI 버전을 별도로 확인한다 — 현재 배포본(2026-08-11 실측 0.1.36)은 Cloudflare 봇 보호가 403 하는 기본 Python-urllib User-Agent 대신 axe-cli/<버전> 을 보낸다. 그 이전 설치본이면 axe self-update 로 갱신한다.

Windows 특이사항

  • irm | iex 가 막힘 (스크립트 실행이 사용되지 않도록 설정): Set-ExecutionPolicy -Scope Process Bypass -Force로 현재 세션만 허용한 뒤 다시 실행한다. 또는 아래 수동 설치.
  • axe 명령 인식 안 됨: PATH 는 새 터미널부터 적용된다 — 새 PowerShell 창에서 재시도.
  • python 을 못 찾음: py -3 또는 python 이 PATH 에 있어야 한다. (MS Store Python 은 py 런처가 없을 수 있어 설치기가 python 으로 폴백한다.)
  • self-update 거동: Windows 는 .cmd shim → python 구조라, 자동 업데이트 후 os.execv 대신 새 프로세스로 재실행한다(axe-cli 0.1.1+). 토큰 파일은 icacls 로 현재 사용자에 한정.
  • axe login 출력에서 크래시처럼 보임 (UnicodeEncodeError, cp949/cp932 콘솔): 토큰은 배너 출력 전에 저장되므로 인증은 이미 성공한 상태였다 — axe whoami 로 확인. 0.1.2+ 에서 해결(CLI 가 stdout/stderr 를 UTF-8 로 reconfigure + cli.ps1 shim 이 set PYTHONUTF8=1). 구버전이면 axe self-update 한 번. 헤드리스/CI 는 애초에 브라우저 SSO 대신 $env:AXE_TOKEN 권장.

부록: Windows 수동 설치

irm | iex 대신 단계별로 (실행 정책 제약 환경):

$dir = "$env:USERPROFILE\axe-cli" New-Item -ItemType Directory -Force $dir | Out-Null # agent edition 은 무인증 — Authorization 헤더 불요. Invoke-WebRequest "https://axelabs.ai/api/cli/download?edition=agent" -OutFile "$dir\axe" -UseBasicParsing -Headers @{'User-Agent'='axe-cli/setup'} # shim 은 자기 옆의 axe 를 부른다(%~dp0). 절대경로를 구우면 한글 사용자명 # (예: C:\Users\한글이름)이 ASCII 인코딩에서 `?` 로 치환돼 죽은 shim 이 된다 — # 인스톨러도 같은 이유로 %~dp0 를 쓴다. @('@echo off', 'set PYTHONUTF8=1', 'python "%~dp0axe" %*') | Set-Content "$dir\axe.cmd" -Encoding ASCII $p = [Environment]::GetEnvironmentVariable('Path','User') if (($p -split ';') -notcontains $dir) { [Environment]::SetEnvironmentVariable('Path', "$p;$dir", 'User') } # 새 PowerShell 창에서: # axe --version # axe login # 브라우저 SSO # $env:AXE_TOKEN="<TOKEN>"; axe whoami; axe frame tools # 또는 헤드리스

shim 의 python 은 본인 환경에 맞게 py -3 로 바꿔도 된다.