한국어 · English
1.0 이전 단계 (
0.1.x) — npm에 배포돼 있습니다. 인증·워크스페이스·미니앱 명령(번들 배포, 인증서 관리 포함)이 end-to-end로 동작하며,app logs는 백엔드 endpoint 확보 후 구현 예정입니다. 전체 명령 표면은 진행 상황 참조.
aitcc는 앱인토스 개발자 콘솔을 자동화하는 커뮤니티 CLI입니다 — 브라우저로 한 번만 로그인하면 이후 작업은 셸이나 AI 코딩 에이전트가 headless 브라우저로 처리합니다.
curl -fsSL https://raw.githubusercontent.com/apps-in-toss-community/console-cli/main/install.sh | shinstaller가 OS(uname -s)와 아키텍처(uname -m)를 자동 감지해 최신 GitHub Release에서 알맞은 바이너리를 받고, SHA256SUMS로 검증한 뒤 $HOME/.local/bin/aitcc에 설치합니다. Node는 필요 없습니다.
특정 버전 고정:
curl -fsSL https://raw.githubusercontent.com/apps-in-toss-community/console-cli/main/install.sh | AITCC_VERSION=v0.1.34 sh설치 경로를 바꾸려면 AITCC_INSTALL_DIR=/custom/path (기본 $HOME/.local/bin).
PATH에 Node 24+가 이미 있다면:
npm i -g @ait-co/console-cli
# 또는: pnpm add -g @ait-co/console-cliagent-plugin은 프로젝트에 Node가 이미 설치돼 있을 때 이 경로를 사용합니다.
aitcc --version # 임베드된 버전 출력
aitcc login # 인터랙티브: 이메일/비밀번호/저장 위치를 묻고 로그인
aitcc login --interactive # headless 대신 visible-browser 강제
aitcc logout # 로컬 세션 파일 삭제
aitcc logout --purge # 저장된 자격증명도 함께 삭제 (`auth clear` 대체)
aitcc whoami # 현재 로그인된 사용자 + 자격증명 출처 표시
aitcc whoami --offline # API 호출 없이 캐시된 identity 사용
aitcc whoami --json # 스크립트·에이전트용 machine-readable 출력
aitcc upgrade # 최신 GitHub Release로 self-update (바이너리 설치만)
aitcc upgrade --dry-run # 다운로드·교체 없이 업데이트 확인만
aitcc upgrade --force # 버전이 같아도 최신 release 재설치비대화 환경(CI, 스크립트)에서는 비밀번호를 직접 타이핑하지 말고 pipe로:
printf '%s' "$AITCC_PASSWORD" | aitcc login --email you@example.com --password-stdin --json
# 또는 환경 변수만 export하면 CLI가 알아서 읽습니다:
AITCC_EMAIL=you@example.com AITCC_PASSWORD=… aitcc login --json--save file을 붙이면 자격증명이 ~/.config/aitcc/credentials.json에 저장돼 다음 aitcc login이 prompt 없이 실행됩니다.
aitcc upgrade는 GitHub API anonymous rate limit을 피하려고 GITHUB_TOKEN을 존중합니다.
예정 명령은 app logs 입니다 (백엔드 endpoint 확보 후).
app·workspace 범위 명령(app status, app deploy, app certs ls, keys ls 등)은 --workspace <id> 플래그와 positional <appId>를 받지만, 프로젝트 루트에 aitcc.yaml(또는 aitcc.json)을 두면 CLI가 cwd부터 상위로 올라가며 찾아 자동 적용합니다.
# aitcc.yaml
workspaceId: 12345
miniAppId: 67890해상도 우선순위 (높은 것부터):
- workspace:
--workspace플래그 →AITCC_WORKSPACEenv → yamlworkspaceId→ 세션 선택값 (aitcc workspace use) - mini-app: positional/플래그
<appId>→AITCC_APPenv → yamlminiAppId
각 명령은 어떤 값이 resolve됐는지 stderr에 한 줄 헤더로 출력합니다 (--json 모드에선 machine-readable 출력에 영향 없도록 생략):
[workspace: 12345 (from aitcc.yaml) · app: 67890 (from aitcc.yaml)]
탐색은 가장 가까운 .git 디렉토리에서 멈추고 $HOME 위로는 절대 안 갑니다. --workspace로 workspace를 명시하면 yaml의 miniAppId는 무시되지만(다른 workspace 소속일 수 있음) AITCC_WORKSPACE env는 yaml miniApp을 유지합니다.
aitcc app register가 성공하면 응답의 miniAppId가 resolve된 aitcc.yaml/aitcc.json에 write-back됩니다 (YAML 주석·키 순서 보존). 이후 명령은 --app 없이 동작합니다. --dry-run에선 write-back을 건너뛰고, 같은 id가 이미 박혀 있으면 silently no-op. 프로젝트 파일 자체가 없으면 새로 만들지 않고 stderr에 한 줄 hint만 띄웁니다.
처음 매니페스트를 만들 땐 aitcc app init으로 시작합니다. 필수 필드를 인터랙티브 prompt로 받고(workspace는 live API에서 가져온 목록에서 선택), 각 값을 register와 동일한 제약으로 검증합니다. optional 필드(homePageUri, logoDarkMode, keywords, horizontalScreenshots)는 주석 처리된 줄로 미리 깔립니다. 이미지 경로(./assets/logo.png, ./assets/thumbnail.png, ./assets/screenshot-{1,2,3}.png)는 placeholder로 적히니 aitcc app register 전에 ./assets/에 실제 파일을 넣어둡니다. init은 인터랙티브 TTY를 요구하고, --json/non-TTY 실행은 interactive-required (exit 2)로 거부합니다.
mkdir my-app && cd my-app
aitcc app init # 인터랙티브 prompt → ./aitcc.yaml
# (logo/thumbnail/screenshots를 ./assets/에 넣음)
aitcc app register # 미니앱 생성 + miniAppId write-back
aitcc app status # 플래그 없이 동작 — aitcc.yaml에서 컨텍스트 읽음aitcc login은 자격증명을 다음 순서로 찾습니다: --email + --password / --password-stdin 플래그 → AITCC_EMAIL + AITCC_PASSWORD 환경 변수 → 파일 backend(~/.config/aitcc/credentials.json) → (TTY 환경에서만) 인터랙티브 prompt. 자격증명을 확보하면 Chrome DevTools Protocol로 Chrome 계열 브라우저를 띄워 가능하면 headless로 로그인을 진행하고, main frame이 로그인 후 workspace 페이지에 도달할 때까지 기다립니다. 도달하면 CDP로 모든 쿠키(JS로는 못 보는 HttpOnly 인증 쿠키 포함)를 덤프해 로컬 세션 파일에 저장합니다. 브라우저는 종료 시 삭제되는 임시 --user-data-dir에서 실행되므로 일상 브라우저 프로필은 절대 건드리지 않습니다.
자격증명이 설정돼 있어도 visible-browser flow를 강제하려면 --interactive를 사용합니다 (계정 전환, step-up 인증 우회). 레거시 aitcc auth set / auth clear / auth status는 여전히 동작하지만 deprecation 경고를 emit합니다 — aitcc login(인터랙티브 prompt가 저장 옵션 제공), aitcc logout --purge, aitcc whoami를 사용하세요. 1.0에서 제거됩니다.
CLI는 OS 표준 위치(Google Chrome, Chromium, Microsoft Edge)에서 Chrome을 찾습니다. 다른 곳에 설치돼 있으면 AITCC_BROWSER=/path/to/chrome으로 실행 파일을 지정하고, 스테이징 환경을 가리키려면 AITCC_OAUTH_URL로 로그인 URL을 override합니다. --timeout <초>로 로그인 대기 시간을 조절합니다 (기본 300초).
SSH 원격 세션이나 GUI가 없는 서버에서도 자격증명 저장이 동작합니다. 자격증명은 ~/.config/aitcc/credentials.json (perm 0600)에 저장되며 SSH/CI 환경에서도 동일하게 작동합니다. 평문 저장이므로 디스크 암호화(FileVault, LUKS) 사용을 권장합니다.
aitcc login --save=file --email you@example.com --password-stdin
# → ~/.config/aitcc/credentials.json (perm 0600)에 저장
# 이후 SSH 환경에서 aitcc login이 이 파일을 읽어 headless 로그인을 진행합니다.경로를 바꾸려면 AITCC_CREDENTIAL_FILE env var를 지정합니다.
세션 export/import (KR IP 필요)
Desktop에서 세션을 export해 SSH 환경에 주입하는 방법도 있습니다:
# Desktop (이미 로그인된 상태):
aitcc auth export --format env # → AITCC_SESSION=... 출력
# SSH 환경에서:
AITCC_SESSION='...' aitcc app deploy ./bundle.ait --json로컬 세션은 XDG 규약 경로에 mode 0600으로 저장됩니다:
- Linux/macOS:
$XDG_CONFIG_HOME/aitcc/session.json(fallback~/.config/aitcc/session.json) - Windows:
%APPDATA%\aitcc\session.json
상위 디렉토리는 mode 0700으로 생성됩니다. 로그인 중 캡처된 쿠키는 절대 출력·로깅되지 않으며 --verbose에도 노출되지 않습니다 — whoami로 노출되는 건 user.email, name, workspace 요약뿐입니다.
plain 0600 파일을 쓰는 설계 이유는 CLAUDE.md 참조.
워크플로의 일회성 실행(aitcc app deploy 등)을 위해 desktop에서 캡처한 세션을 runner에 주입합니다:
# Desktop (이미 로그인된 상태):
aitcc auth export --format env >> $GITHUB_ENV # 또는 secret으로 저장
# CI ($AITCC_SESSION으로 secret 노출):
aitcc app deploy ./aitc-sdk-example.ait --jsonAITCC_SESSION이 설정되면 모든 명령은 로컬 파일 대신 이 env var에서 세션을 읽습니다. env 모드에선 logout / workspace use 등의 write 경로가 비활성화돼 CI 호스트가 세션 파일을 절대 디스크에 떨어뜨리지 않습니다. blob을 disk에 영구 저장하고 싶다면 aitcc auth import --from-env를 쓰세요 (주로 desktop wipe 후 복구).
KR 전용: 콘솔 세션 쿠키는 KR residential IP에 바인딩됩니다. 같은
AITCC_SESSIONblob이 한국 머신에선 동작하지만 비KR egress(GitHub-hosted runner — Azure US/EU 포함)에선401/errorCode: 4010으로 실패합니다. KR self-hosted runner를 쓰거나 직접 실행하세요. 자세한 내용은docs/api/auth-session.md참조.
인터랙티브 실행 시 aitcc는 가끔 최신 release를 확인해 새 버전이 있으면 stderr에 한 줄 알림을 출력합니다. rate-limit 친화적:
- 명령을 아무리 자주 실행해도 24시간에 한 번만 네트워크 호출.
- 실패한 체크도 throttle 윈도우를 갱신하므로 네트워크 단절이나 GitHub 403이 분 단위로 루프되지 않음.
- Conditional GET (
If-None-Match) — 304 응답은 anonymous rate-limit bucket을 소모하지 않음. - stdout이 TTY가 아니거나,
--json이 설정돼 있거나,AITCC_NO_UPDATE_CHECK=1이면 체크 자체를 건너뜀.
캐시 상태는 $XDG_CACHE_HOME/aitcc/upgrade-check.json (fallback ~/.cache/aitcc/upgrade-check.json)에 저장됩니다.
모든 명령이 --json을 받습니다. 설정 시:
- 정상 출력은 stdout에 한 줄짜리 JSON document로.
- 모든 진단은 stderr에 plain text로.
- exit code는 명령별로 의미가 있고 문서화돼 있습니다 (
src/exit.ts참조).
agent-plugin skill은 항상 --json으로 shell out하고 stdout을 파싱합니다.
aitcc는 두 단계로 분리된 익명 사용 통계를 수집합니다. 자세한 내용은 privacy 페이지 참조.
매 실행 시 하루 한 번 익명 핑을 보냅니다. 수집 항목: {source, version, platform}. 개인 식별 정보 없음. anon_id도 없음 — 서버가 일별 salt로 IP+UA 해시를 계산해 저장하며, 그 외 정보는 저장하지 않습니다. "이 버전을 실제로 쓰는 사람이 있는가"를 파악하기 위한 최소 신호입니다.
opt-out 방법 (세 가지):
AITCC_TELEMETRY=off환경 변수 — 이 쉘 세션 전체 비활성--no-telemetry플래그 — 이 invocation만 비활성 (영구 X)aitcc telemetry tier0-off— 영구 opt-out (state file에 저장)
처음 실행 시 TTY 환경에서만 동의를 묻습니다. CI/파이프 환경에선 자동으로 비활성화됩니다. 수집 항목: 실행된 명령 이름, 버전, 플랫폼, 임의 익명 ID (anon_id). 개인 식별 정보(이메일, 세션, 사용자 ID 등)는 절대 전송하지 않습니다.
aitcc telemetry status # 두 tier 상태 + 익명 ID 확인
aitcc telemetry status --json # machine-readable 출력
aitcc telemetry enable # Tier 1 활성화
aitcc telemetry disable # Tier 1 비활성화
aitcc telemetry delete # 서버에 저장된 Tier 1 데이터 삭제 요청 + 로컬 익명 ID 교체
aitcc telemetry tier0-off # Tier 0 익명 핑 영구 비활성화
aitcc telemetry tier0-on # Tier 0 다시 활성화상태 파일: $XDG_CONFIG_HOME/aitcc/telemetry.json (fallback ~/.config/aitcc/telemetry.json, mode 0600).
다음 명령군이 end-to-end로 동작합니다:
- 인증·세션:
login/logout/whoami/auth(export/import) - 워크스페이스:
workspace/members/me/notices - 미니앱:
app—init/ls/show/status/deploy/register/ratings/reports/metrics/events/messages/share-rewards,app bundles(ls/deployed/upload/review/release/test-push/test-links),app certs(ls/show/issue/revoke) - 그 외: Deploy Key 발급(
keys),telemetry,upgrade(self-update),completion(셸 자동완성)
app logs는 백엔드 endpoint 확보 후 구현 예정입니다. 전체 로드맵은 organization landing page 참조.
배포 자동화를 위한 워크스페이스-scope 자격증명(Deploy Key)을 발급합니다.
aitcc keys create --name ci-deploy키 발급 즉시 ~/.ait/credentials에 ci-deploy 프로파일로 저장되므로, 별도 ait token add 단계 없이 바로 사용할 수 있습니다:
ait deploy --profile ci-deploy ./bundle.aitstdout에는 plaintext 키 한 줄만 나옵니다 (파이프 친화적). stderr는 저장된 프로파일 이름을 확인해줍니다. CI 파이프에서 키를 외부 secret manager에 직접 주입할 때처럼 로컬 저장이 필요 없다면 --no-save-profile로 저장을 건너뜁니다:
aitcc keys create --name ci-deploy --no-save-profile | secret-tool store --label=… key password프로파일 이름을 --name과 다르게 지정하려면 --save-profile <other-name>을 사용합니다. plaintext 키는 발급 시 한 번만 노출되며 목록 endpoint에서 다시 확인할 수 없습니다 — 분실 시 aitcc keys revoke <id>로 무효화하고 재발급합니다.
선택 사항이지만 권장합니다. clone 후 표준 pre-commit hook을 활성화하면 staged 파일에 biome check가 자동으로 돕니다 (push 전 빠른 피드백):
git config core.hooksPath .githooks활성화하지 않아도 동일한 검사가 CI에서 강제 계층으로 실행되므로 PR 단계에서 lint 실패를 볼 수 있습니다.
커뮤니티 오픈소스 프로젝트입니다.