AXE CLI (axe)
셸을 가진 에이전트·사람·cron·CI 어디서나 AXE 플랫폼 서비스를 쓰는 단일 명령줄 도구. MCP 커넥터를 서비스마다 따로 등록할 필요 없이, 로그인 1회로 받은 토큰 하나로 frame·hive·index·cortex·matrix·blueprint·gate·layer 를 모두 호출한다.
- 에이전트 무관: 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로만 나오고, 그 라우트가 내주는 것은 이 에이전트 CLI 하나다 — 무인증이라 아래 세 줄로 끝난다. 운영자 CLI(vault·deploy·ship)는 호스트 전용이라 HTTP 로 배포하지 않는다(?edition=operator는 410). 아래에서<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 에서 토큰 없이 에이전트 CLI 를 기본 설치한다. 다만 주권 테넌트가 구 사본을 서빙하면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 login --device` (다른 기기 브라우저에서 코드로 승인) 또는 `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 = 결재·계약·전자서명
layer = 문서 공유·열람 계측 (조회 · 광고 픽셀 지정)
규칙:
- 도구 이름과 인자 스키마는 *기억하지 말고* 매번 `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 도구 목록)Outlook 조회 · 승인된 일괄 이동
구현·모의 검증·원메일 운영 배포 완료, dot 실호출 미검증 (2026-10-07). 공식 공개
agent CLI 0.1.79·checksum과 Blueprint 원격 MCP 53개·새 메일 도구 7개를 확인했다.
아래 일곱 래퍼와 대응 서버 도구를 배포했으며 실제 dot 연결·Microsoft 실계정 검증은
별도로 남아 있다. 메일 이동·삭제·발송은 실행하지 않았다.
릴리스 게이트의 에이전트 정본은 호스트의 ~/axe-cli/axe다. 이 저장소에는 remote가
없고 axe ship axe-cli는 별도 운영자 CLI를 릴리스한다. 정본보다 앞선 served 후보는
Blueprint freshness 게이트에서 거부한다. 운영자 CLI의 공식 source 승격
경로는 axe ship agent-cli --source-worktree <absolute> --expect-sha <candidate> --expect-base <canonical-main>이다. 검증한 agent
worktree의 commit과 현재 정본 main을 pin해 axe ship agent-cli로 승격한 뒤,
Blueprint ship의 전체 suite·digest·freshness 게이트를 통과해야 한다. source 승격은
클라우드 배포나 dot 연결 검증을 의미하지 않는다.
클라우드 dot이 OpenAI 호스트의 공식 MCP 연결을 쓰는 경우 준비 중인 별도 원격 대상은
https://axe.axelabs.ai/blueprint/mcp/openai다. 아직 운영 활성화 전이며 실제 dot 제품·연결 화면은 확인 중이다.
현재 서버의 Claude callback 정책과 플랫폼 audience에는 OpenAI 연결 호환성 갭이 있다.
D-bp-dot-mcp-oauth-resource-1에서 기존 DCR·PKCE·issuer를 재사용하고 code·refresh·token의
exact MCP resource와 SDK 사용자·조직·resource 세션 결속을 준비한다. 기존 /blueprint/mcp의 PRM·Entra·CLI 광고는 유지한다. 새 resource는 기본 OFF·빈 tenant allowlist이며, 이메일 검증 근거가 없어 email_verified=false와 enterprise verified-domain 미충족 제약이 있다. OpenAI 공식 인증 문서 의
exact callback·두 nullable resource 컬럼·AXE 전용 세 활성화 값은 2026-10-08 별도로 승인받았다. 기존 메일 SQL 승인과 구분하며 공식 rollout과 runtime 검증은 남아 있다. 승인된 환경 변수·배포 순서를 따른다.
로컬 CLI나 서버 OAuth 테스트 성공은 dot의 공식 연결·실제 호출 검증을 대신하지 않는다.
| CLI | Blueprint MCP 도구 | 용도 |
|---|---|---|
axe mail identity | get_mail_identity | 연결된 계정·Entra 테넌트·본인 사서함 확인 |
axe mail folders | list_mail_folders | 정확한 폴더 ID와 페이지 커서 조회 |
axe mail list | list_mail_messages | 지정 폴더의 목록·검색·페이지 조회 |
axe mail get <message-id> | get_mail_message | 메시지 1건의 보낸 사람·받는 사람·참조·수신 시각·제목·텍스트 본문·첨부 이름/크기 조회 |
axe mail prepare-move | prepare_mail_move | 정확한 메시지 ID 배열의 이동 미리보기·고정 manifest 저장 |
axe mail status <operation-id> | get_mail_operation | 승인·진행·메시지별 결과·재개 가능 상태 조회 |
axe mail execute <operation-id> | execute_mail_move | 저장된 승인과 digest 검증 후 실행·재개 |
axe mail cancel <operation-id> | cancel_mail_operation | 아직 실행되지 않은 작업 중단 |
axe mail identity
axe mail folders --page-size 50
axe mail folders --parent-folder-id '<parent-id>' --page-size 50
axe mail folders --parent-folder-id '<parent-id>' --page-size 50 --cursor '<child-folder-cursor>'
axe mail list --folder-id '<source-id>' --search '<query>' --page-size 50
axe mail list --folder-id '<source-id>' --search '<query>' --page-size 50 --cursor '<returned-cursor>'
axe mail get '<message-id>' # 목록의 ID 그대로 — 본문은 텍스트, 첨부는 이름·크기만
axe mail prepare-move --mailbox-id '<discovered-mailbox-id>' --source-folder-id '<source-id>' --destination-folder-id '<destination-id>' --message-ids-file exact-message-ids.json --dry-run
axe mail status '<operation-id>'
axe mail status '<operation-id>' --reconcile # 응답 유실·취소·만료 후 읽기 검증
# 응답의 approvalUrl에서 사람이 동일 manifest를 승인한 뒤:
axe mail execute '<operation-id>' --manifest-digest '<approved-digest>'
axe mail cancel '<operation-id>'exact-message-ids.json은 ["message-id-1", "message-id-2"] 형태의 배열이다.
--message-id를 반복하거나 --message-ids-file -로 stdin을 사용할 수도 있다.
조회 결과의 ID를 그대로 고정하고, 이동 실행에는 검색 조건을 보내지 않는다.
prepare-move는 항상 dry run이며 메시지 상한은 1,000개, manifest 기본 유효기간은 1시간이다.
execute는 호출당 최대 20개를 처리한다. 실행 세션/연결이 끊겼거나 batch가 남았을 때는
승인이 유효하고 취소·halt되지 않은 동일 operation/digest로 이어 간다. 명시적 cancel이나
대상 변경으로 halted된 원작업은 재개할 수 없다. 현재 결과를 확인하고 새 manifest와 승인을
준비해야 한다. 429의 dueAt까지 기다리는 것도 호출자 책임이며 백그라운드 폴링/데몬은 없다.
execute에는 승인된 작업의 digest가 필수이며
approved=true 플래그나 에이전트용 승인 명령은 없다. CLI는 서버 JSON의 manifest,
승인 URL, 메시지별 결과와 요청·실행 ID를 그대로 출력한다.
목록은 --page-size 1..100과 서버가 돌려준 opaque --cursor로 이어 간다. 커서는
호출자·tenant/mailbox·폴더·검색/filter·page size에 결속되며 30분 유효하다. 다음 페이지에도
같은 인자를 반복한다. 검색과 filter는 동시에 지정하지 않는다. 사람 승인은 승인 후 30분
상한이며 manifest 만료가 더 빠르면 그때 끝난다.
폴더명만 보고 목적지를 정하지 말고 ID를 확인한다. 본인 사서함만 지원하며 mailbox-id는
identity가 확인한 값이어야 한다. 주소가 둘 모두 본인 소유여도 같은 사서함·테넌트라고
추정하지 않는다. 다른 계정은 공식 로그인/연결에서 선택한 뒤 신원부터 다시 확인한다.
OpenAI용 dot 연결 준비 경로는 별도 원격 MCP https://axe.axelabs.ai/blueprint/mcp/openai다.
별도 승인된 범위의 공식 배포·활성화 뒤 dot이 지원하는 원격 MCP 커넥터에서 이 URL의 OAuth를 완료하고, dot 자체의
tools/list에서 일곱 도구를 확인한 뒤 get_mail_identity를 호출해야 한다.
Windows의 C:/Users/<user>/axe-cli/axe에서 명령이 성공해도 클라우드 dot의
연결 검증은 별도다. 플랫폼이 원격 MCP 연결을 지원하지 않거나 호출을 차단하면
애플리케이션 코드에서 그 제한을 우회하지 않는다. OAuth resource metadata는
https://axe.axelabs.ai/blueprint/.well-known/oauth-protected-resource/mcp/openai이며,
인증 서버와 scope는 이 metadata 및 실제 OAuth challenge에서 발견한다. 기존 CLI·Claude 연결은
https://axe.axelabs.ai/blueprint/mcp와 기존 metadata 경로를 유지한다.
D-bp-mcp-session-owner-1의 SDK 세션 hardening은 기존 CLI·Claude와 새 OpenAI 경로 모두에 적용하는 계약이다. 다른 계정의 session ID를 사용하면 거부하며, 적용 후 owner 없는 기존 세션이나 조직·DB 이메일이 바뀐 세션은 새로 initialize해야 한다. 같은 소유자의 정상 credential rotation은 허용하고 기존 권한·키·ACL·audience는 확대하지 않는다. 메일 manifest의 소유자·승인 검증도 유지한다.
Blueprint의 사람 manifest 승인은 서버 작업에 저장되므로 같은 호출자·작업·digest로
CLI/MCP에서 이어서 실행한다. dot 실행 플랫폼의 필수 도구 승인은 그 플랫폼의 별도 경계다.
앱 승인 재사용이 플랫폼 승인 전달을 보장하거나 생략하게 만들지는 않는다.
기존 공식 클라이언트와 서버 인증 계층을 사용하며 토큰을 프롬프트에 넣거나 다른 환경으로
복사하지 않는다. 운영 키·OAuth 권한·보안 ACL은 자동으로 발급하거나 변경하지 않는다. 새 작업 저장 테이블과
RLS 정책은 migration으로 준비했다. 2026-10-06 운영자가 제시된 신규 테이블·RLS·최소
실행 권한 SQL의 적용을 승인했고 2026-10-07 공식 배포의 migration·운영 catalog로 적용을 확인했다. 운영 역할 blueprint_app·blueprint_pinned에는
기존 default privileges가 부여할 수 있는 DELETE·TRUNCATE를 새 원장에서 명시적으로
회수하고 SELECT·INSERT·UPDATE만 허용한다. 새 OpenAI OAuth 승인에 추가 runtime ACL 변경은 포함하지 않는다.
실행 응답을 잃으면 result_unknown으로 보고 status부터 조회한다. status --reconcile은
Graph 조회/ID 변환으로 불명 결과를 대조하고 관측 기록만 저장한다. 취소·만료 뒤에도
가능하며 메일 이동을 재승인하거나 실행하지 않는다. 작업 원장을 갱신하므로 MCP는 쓰기
권한으로 분류하고 플랫폼은 별도 확인을 요구할 수 있다. 원인을 확인하지 못한
user cancelled MCP tool call 문구만으로 사용자 취소라고 확정하지 않는다.
서버 응답 없이 생성한 cli-… 요청 ID는 requestIdSource=client로 구분한다.
자세한 결과·재시도 경계는 Blueprint 메일 workflow를 따른다.
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 | 배포하지 않음 — ?edition=operator 는 410 | 호스트 전용 (vault·deploy·ship) |
에이전트판이 무인증인 이유는 그것이 CLI 의 자가치유 채널이기 때문이다 — 로그인이 깨진 설치본은 유효한 토큰을 만들 수 없으므로, 게이트가 있으면 수정본이 정작 그 사람들에게 도달하지 못한다. 운영자 CLI 는 MCP 로 노출하지 않는 것과 같은 이유(호스트 전용 특권 경로)로 HTTP 로도 내주지 않는다.
/axe의 CLI 설치 카드는 같은 에이전트 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로 파이프했을 때 이 게이트에 걸리는지는 이 측정으로 판정하지 않는다). 아래의 직접 다운로드는 어느 사본이 서빙되든 동작한다.
두 edition 의 설치 위치 — 한 머신에 공존
설치기(/cli.sh · /cli.ps1)는 edition 마다 다른 위치에 설치한다. 예전에는 둘 다 ~/axe-cli/axe 에 깔려, 에이전트판 설치가 그 자리의 운영자판을 말없이 대체했다.
| edition | 설치기 기본 위치 | 토큰 저장소 |
|---|---|---|
| 에이전트 | ~/axe-cli/axe (Windows %USERPROFILE%\axe-cli\axe) | ~/.axe-cli/ — 에이전트판은 이것만 읽는다 |
| 운영자 | ~/.axe/bin/axe (Windows %USERPROFILE%\.axe\bin\axe) | 운영자판 자체 저장소 (~/.axe/) |
- 위치는
AXE_CLI_DIR로 바꿀 수 있다. 같은 디렉터리에 다른 edition 이 있으면 설치기가 무엇이 무엇으로 바뀌는지 출력하고 이전 바이너리를axe.<edition>.bak으로 하나 남긴다(설치를 막지는 않는다). - 토큰 저장소는 합치지 않는다. 운영자 권한과 에이전트 권한의 경계라 일부러 나눠 둔 것이다.
- 둘 다 깔린 머신:
axe라는 이름은 하나라서, PATH 에서 앞에 오는 디렉터리의 것이 실행된다. 어느 쪽인지는axe --version이axe agent <버전> (<경로>)/axe operator <버전> (<경로>)로 알려 준다. 다른 쪽은 절대경로로 부른다. 설치기도 마지막에 두 위치를 함께 출력한다. axe whoami는edition:줄(위와 같은 문자열)과token source:줄을 찍는다. 토큰이 만료됐으면 그 토큰이 어디서 왔는지(이 edition 저장소에 남은 이전 로그인인지, 셸 환경변수인지)도 함께 알려 준다. 방금 설치했는데 “만료” 가 뜨면 대부분 예전 로그인이 남아 있는 경우라axe login한 번이면 된다.
기존 머신 (운영자판이 ~/axe-cli/axe 에 있는 경우) 마이그레이션
- 아무것도 하지 않아도 지금처럼 동작한다. 설치기는 이미 설치된 바이너리를 지우거나 옮기지 않는다.
- 운영자판을 다시 설치하면(대시보드 CLI 설치 카드의 명령) 새 사본은
~/.axe/bin/axe로 간다.~/axe-cli/axe에 있던 옛 사본은 그대로 남고, 설치기가 그 사실과 정리 명령을 출력한다. 옛 사본을 치우기 전까지는 PATH 순서가axe를 정한다.Windows 는 옛 위치의mv ~/axe-cli/axe ~/axe-cli/axe.operator.oldaxe.cmd(실제로axe로 실행되는 shim)도 함께 치운다 — 남겨 두면axe가 대상이 사라진 shim 으로 계속 풀린다.Rename-Item ~\axe-cli\axe axe.operator.old Rename-Item ~\axe-cli\axe.cmd axe.cmd.operator.old - 에이전트판을
~/axe-cli에 설치하면 그 자리의 옛 운영자 사본은~/axe-cli/axe.operator.bak으로 백업된 뒤 교체되고, 설치기가 운영자판을~/.axe/bin에 다시 까는 방법을 안내한다. 두 edition 을 같이 쓰려면 그 안내대로 운영자판을 다시 설치한다. - 두 위치가 모두 소스 저장소(git 체크아웃)인 AXE 운영 호스트에서는 설치기가 쓰기를 거부한다. 그래서 그 호스트의 두 바이너리는 바뀌지 않는다.
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)의 기본 edition 은 agent 다. 주권 테넌트의 구 설치기 사본은 기본이 operator 였으므로, 어느 사본이든 통하게 하려면 AXE_CLI_EDITION=agent 를 붙인다.
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 가 남아 있으면 설치기가 “운영자 CLI 는 호스트 전용” 이라며 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 --device(다른 기기에서 코드로 승인) /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·샌드박스)의 표준 경로 — 키체인 없이 동작하고 셸 세션에만 살아 디스크에 남지 않는다. 사람이 다른 기기의 브라우저로 승인할 수 있는 호스트라면 토큰을 옮기지 않는 axe login --device(아래 4)를 쓴다.
3) 대화별 연동 — 공용 호스트에 SSH 로 연 대화 (0.1.83+, D-bp-collab-13)
공용 작업소의 호스트 CLI 는 한 계정으로 로그인돼 있다. 다른 사람이 SSH 로 그 호스트에 Claude Code 대화를 열고 협업 세션 프롬프트를 붙이면, 프롬프트의 --account <계정 키> 와 CLI 계정이 달라 첫 session attach 가 수신 자리에 닿기 전에 멈추고 종료 코드 5와 함께 연동 링크·확인 코드를 출력한다:
[계정 연동 필요] 이 대화의 AXE 계정(…)이 프롬프트를 복사한 웹 계정과 다릅니다. 수신 자리는 건드리지 않았습니다.
→ 사용자에게 이 링크를 그대로 보여 주세요 — 노트북 브라우저에서 열고 [연동]을 누르면 됩니다(10분 안):
https://<Blueprint 정문>/oauth/device?user_code=XXXX-XXXX
확인 코드: XXXX-XXXX
→ 그다음 같은 명령을 다시 백그라운드로 실행하세요. …에이전트가 같은 attach 를 다시 띄우면 그 명령이 승인을 기다린다(최대 10분, 사람이 시작한 명령 안에서만 — 데몬 없음). 같은 링크를 두 명령이 함께 기다려도 서로 취소하지 않는다(0.1.84+) — 한 번에 하나만 교환하고, 승인이 저장되면 다른 쪽도 붙은 채로 끝난다. 사람이 [연동]을 누르면 그 대화 전용 자격이 ~/.axe-cli/conv/<대화 키>/ 에 저장되고 attach 가 그 계정으로 붙는다. 대화 키는 Claude 대화 id(CLAUDE_CODE_SESSION_ID)의 해시다(Codex 스레드는 아래). 이후 그 대화 안의 모든 ~/axe-cli/axe 호출이 그 자격을 쓴다. 호스트 계정(~/.axe-cli/credentials.json)과 같은 호스트의 다른 대화는 그대로다.
협업 세션 없이 대화만 연동하거나 되돌리는 명령:
~/axe-cli/axe login --conversation [--account <계정 키>] # 이 대화만 기기 승인으로 연동 (첫 실행 = 링크 + 종료 코드 5, 다시 실행 = 승인 대기)
~/axe-cli/axe logout --conversation # 이 대화 연동 해제 → 호스트 계정으로 돌아감
~/axe-cli/axe logout --host # 대화 안에서 호스트 기본 로그인을 해제
~/axe-cli/axe whoami # 첫 줄 profile: 이 대화 #<태그> — <email> … / 호스트 기본SSH 로 연 대화에서 그냥 axe login 으로 호스트 계정을 다른 사람으로 바꾸려 하면 거절된다(다른 대화들이 함께 쓰는 호스트 계정이 바뀌므로) — 그 사람 계정은 login --conversation 으로, 정말 호스트를 바꿀 때는 --host 를 명시한다. 대화가 연동된 상태에서는 plain axe login 도 거절된다.
Codex 스레드 (0.1.84+) — Codex 스레드도 스레드마다 자기 자격을 갖는다. 키는 스레드 id(CODEX_THREAD_ID)의 해시다. 연동하는 길은 둘이다:
# Codex 스레드 안에서 (첫 실행 = 링크 + 종료 코드 5, 다시 실행 = 승인 대기)
~/axe-cli/axe login --conversation --account <계정 키>
# 사람이 연 터미널에서 붙기와 함께 (종료 코드 5 → 링크에서 [연동] → 같은 명령 다시 실행)
~/axe-cli/axe blueprint session attach <세션 id> --codex-thread <스레드 id> --account <계정 키>- 붙기와 그 스레드 안의
~/axe-cli/axe호출은 같은 자격(같은 계정)을 쓴다. 붙기가 스레드에 넣는 지시에는--account <계정 키>가 실리고, 스레드의session post --account <계정 키>는 프로세스 계정이 다르면 게재하지 않고 종료 코드 6으로 멈춘다. - 스레드 id(UUID)는 Codex 스레드 안에서
~/axe-cli/axe blueprint session show <세션 id>를 실행하면 Codex 붙기 줄에 채워져 나온다. 스레드 이름으로는 연동할 수 없고, 이 호스트에 연동된 Codex 스레드가 있는 동안은 이름으로 붙는 것도 거절된다(종료 코드 6) — id 로 다시 붙는다. - 네트워크가 꺼진 Codex 샌드박스에서는 연동을 거절한다(종료 코드 6, 아무것도 저장하지 않음). 샌드박스 밖(권한 상승 승인)에서 다시 실행하거나, 사람이 연 터미널에서 위 attach 로 연동한다.
- 최대 7일. 스레드 안에서
~/axe-cli/axe logout --conversation으로 끝낸다. Codex 의 SessionEnd 에 정리 훅을 걸려면~/axe-cli/axe blueprint board hook install --codex(선택 — Codex 의 훅 검토에서 새 항목을 승인해야 실행된다). - Claude Code 대화 안에서 띄운 Codex 는 그 대화의 자격을 쓴다.
대화·스레드 공통:
- 자격 해석 순서:
AXE_TOKENenv > 대화 자격(있으면 권위적 — 만료·종료돼도 호스트 계정으로 내려가지 않는다) > 호스트 자격. - 대화 자격의 refresh 는 발급 시점부터 7일(회전해도 연장 안 됨). 대화가 끝나면(SessionEnd,
/clear제외) 보드 훅이 폐기하고 자리를 막아 둔다(조용히 호스트 계정이 되지 않게). 다시 열면 첫 attach 에서 1클릭으로 재연동한다. 승인 대기 중에 대화가 끝나도 그 요청은 취소된다. 8일이 지난 슬롯은 비밀만 지워지고 자리는 남는다 — 대화가 호스트 계정으로 돌아가는 길은logout --conversation하나뿐이다. - 웹 설정의 ‘연동된 대화’ 에서 해제하면 그 대화는 늦어도 1시간 안에 ‘이 대화의 계정 연동이 끝났습니다’ 로 멈춘다 — 다시 쓰려면 안내된 attach 명령으로 재연동한다.
- 종료 코드 6 = 연동 거절·만료,
AXE_TOKEN이 계정을 고정 중, 대화 id 가 없음, 서버가 기기 승인을 지원하지 않음, Codex 스레드를 이름으로 지정(이름으로는 연동 불가 · 연동된 Codex 스레드가 있는 동안 이름 붙기 거절), 네트워크가 꺼진 Codex 샌드박스·CLI 홈에 쓸 수 없는 샌드박스, 붙기 중 스레드의 계정이 바뀜, 또는session post --account가 프로세스 계정과 다름(“게재하지 않았습니다”). - 종료 코드 2 로
--account를 모른다고 하면 CLI 가 0.1.83 이전이다 —~/axe-cli/axe self-update후 다시. - 같은 OS 사용자를 함께 쓰는 호스트에서 대화·Codex 스레드 자격 파일은 동료에게 읽힌다(호스트 자격도 마찬가지). 대화 키는 자격을 고르는 선택자이지 인증이 아니다 — 근본 격리는 사람별 OS 계정.
4) 브라우저 없는 호스트 로그인 — login --device (0.1.84+)
브라우저를 열 수 없는 호스트(SSH 서버·컨테이너 등)의 호스트 계정 자체를 로그인한다. 토큰을 복사해 옮기지 않고, 브라우저가 있는 다른 기기에서 확인 코드로 승인한다:
~/axe-cli/axe login --device [--host] [--account <계정 키>]호스트 로그인 — 브라우저가 있는 기기에서 이 주소를 열고 확인 코드를 입력해 승인하세요(10분 안):
https://<Blueprint 정문>/oauth/device
확인 코드: XXXX-XXXX
승인하면 이 호스트(cli@<호스트>)의 기본 계정이 됩니다 — 승인 시점부터 최대 30일, 사용해도 연장되지 않습니다. 기다리는 중… (Ctrl-C 로 취소)- 같은 프로세스가 승인을 최대 10분 기다린다(다시 실행할 필요 없음). 승인 주소에는 코드가 박혀 있지 않다 — 승인 화면에서 터미널의 코드를 직접 입력한다.
- 로그인은 승인 시점부터 30일 절대다. 사용해도 연장되지 않는다 — 30일 뒤 갱신이 실패하면
login --device를 다시 실행한다. - 공유 SSH 호스트(SSH 로 들어온 세션)에 이미 호스트 계정이 있으면, 그 요청은 현재 호스트 계정만 승인할 수 있다. 호스트 기본 계정을 다른 사람으로 바꾸려면
--host를 붙인다(같은 호스트의 다른 대화·명령도 새 계정으로 동작한다). 이 대화만 본인 계정으로 쓰려면 위 3)의login --conversation. --token·--email·--switch·--conversation과 함께 쓸 수 없고,AXE_TOKEN이 설정돼 있으면 거절한다.- 승인한 로그인은 웹 설정의 ‘연동된 대화’ 에 호스트 로그인 으로 표시되고, 거기서 해제할 수 있다(이미 받은 access 는 최대 1시간 안에 끝난다).
- 종료 코드: 0 저장 · 1 사용법 충돌·잘못된
--account·네트워크/discovery 실패·교환 HTTP 오류 · 2--device를 모름(0.1.84 이전 —~/axe-cli/axe self-update) · 6 사람이 필요(거절·만료,AXE_TOKEN고정, 공유 SSH 가드, 서버가 호스트 기기 로그인을 지원하지 않음, 승인한 계정·자격이 맞지 않음 — 받은 자격은 저장하지 않고 폐기) · 130 Ctrl-C.
토큰 갱신 / 로그아웃
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 (결재·계약) · layer (문서 열람 계측, 읽기 전용).
예시:
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 — gate·hive·index·matrix·cortex·layer 는 전용 호스트 https://<svc>.axelabs.ai/<svc>/mcp, frame·blueprint 는 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 로 바꿔도 된다.