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 tools가usage: 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) | 용도 |
|---|---|---|
| 에이전트 CLI | GET https://axelabs.ai/api/cli/download?edition=agent | 무인증 다운로드 + axe self-update 소스 |
| 운영자 CLI | GET https://axelabs.ai/api/cli/download | 인증(Bearer) 다운로드 |
에이전트판이 무인증인 이유는 그것이 CLI 의 자가치유 채널이기 때문이다 — 로그인이 깨진 설치본은 유효한 토큰을 만들 수 없으므로, 게이트가 있으면 수정본이 정작 그 사람들에게 도달하지 못한다. 운영자판(vault·deploy·ship)은 게이트 유지.
운영자판 설치 명령은 /axe의 CLI 설치 카드가 짧은 수명의 사용자 토큰을 포함해 생성한다. 다른 주권 테넌트는 정책에 따라 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 --versionPython 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.1loopback). 브라우저가 안 열리면 출력된 URL 을 수동으로 열거나, 헤드리스는axe login --token "<TOKEN>"/$env:AXE_TOKEN="<TOKEN>". - 토큰 저장처: Keychain 이 없으므로
%USERPROFILE%\.axe-cli\token(현재 사용자 ACL 로 제한 — CLI 가icacls로 상속 차단). 우선순위는 동일:AXE_TOKENenv > 파일. - 설치는 맨 아래 부록: 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_TOKENenv /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이다. 후보를 기본 읽기 경로에 섞지 않는다.propose는agent.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 | 외부/원격 |
--local | 127.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\"}"; doneCodex·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 는
.cmdshim → python 구조라, 자동 업데이트 후os.execv대신 새 프로세스로 재실행한다(axe-cli0.1.1+). 토큰 파일은icacls로 현재 사용자에 한정. axe login이✓출력에서 크래시처럼 보임 (UnicodeEncodeError, cp949/cp932 콘솔): 토큰은 배너 출력 전에 저장되므로 인증은 이미 성공한 상태였다 —axe whoami로 확인. 0.1.2+ 에서 해결(CLI 가 stdout/stderr 를 UTF-8 로 reconfigure +cli.ps1shim 이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 로 바꿔도 된다.