GUI를 클릭하지 말고 CLI로 부르게 하라: HKUDS/CLI-Anything v0.4.0의 7단계 하네스 생성·HARNESS.md 원칙·CLI-Hub 신뢰 경계 심층 해부

AI 에이전트에게 GIMP나 LibreOffice, Blender 같은 데스크톱 소프트웨어를 맡기는 방법은 크게 두 갈래였다. 화면을 캡처해 좌표를 클릭하는 GUI 에이전트(컴퓨터 유즈), 아니면 앱마다 API나 MCP 서버를 따로 만드는 방식이다. 오늘(2026-10-18) GitHub Trending 전체 일간 4위·Python 일간 3위에 오른 HKUDS/CLI-Anything은 세 번째 길을 고집한다. 소프트웨어의 소스 코드를 에이전트가 읽게 해서, 그 앱 전용의 상태 있는 CLI(“하네스”)를 자동으로 만들게 한다. 결과물은 cli-anything-<앱> --json … 형태의 평범한 파이썬 명령이고, 실제 렌더링은 끝까지 원래 소프트웨어(예: soffice --headless)가 맡는다.

CLI-Anything 한눈에: 스크린샷·좌표 클릭 대신 앱별 CLI 하네스(--json·REPL·undo)를 에이전트가 부르고, 렌더링은 진짜 소프트웨어가 맡는다
CLI-Anything 한눈에: 스크린샷·좌표 클릭 대신 앱별 CLI 하네스(–json·REPL·undo)를 에이전트가 부르고, 렌더링은 진짜 소프트웨어가 맡는다

이 글은 “아무 앱이나 에이전트가 쓰게 해 준다”는 홍보 문구를 그대로 옮기지 않는다. 대신 ① 7단계 생성 파이프라인과 747줄짜리 지침서 HARNESS.md가 실제로 무엇을 강제하는지, ② 이미 만들어진 하네스 하나(LibreOffice)가 내부에서 어떻게 생겼는지, ③ 패키지 매니저 cli-hub의 레지스트리·설치·분석(telemetry) 경로에 어떤 신뢰 가정이 숨어 있는지를 코드와 박스 스모크 테스트로 확인한다. 수치는 모두 2026-10-18 16:50~17:00 KST에 main HEAD 34f5195를 직접 체크아웃해 집계·실행한 값이다.

한눈에 보기: 오늘 체크아웃 기준

항목 값
저장소 github.com/HKUDS/CLI-Anything (생성 2026-03-08 22:52 KST) · 홈페이지 clianything.cc
만든 곳 HKUDS(홍콩대 데이터 인텔리전스 랩). 기술 보고서 CLI-Anything: Towards Agent-Native Computer Use (arXiv:2606.03854, Yuhao Yang·Tianyu Fan·Chao Huang)
라이선스 루트 LICENSE는 Apache-2.0. 단, 일부 하위 패키지 setup.py는 MIT로 표기(아래 라이선스 절에서 설명)
최신 릴리스 GitHub v0.4.0 (2026-06-26 00:17 KST) · PyPI cli-anything-hub 0.4.1 (2026-07-09 21:04 KST)
main HEAD 34f5195 · 2026-09-22 11:01 KST (README 갱신 머지). 이후 머지는 멈춘 상태, 열린 PR 111건(10/17~18에도 수정 PR 다수 접수)
규모 추적 파일 1,872개, Python 약 31만 줄, 테스트 파일 230개, */agent-harness 69개, 루트 skills/ 71개
레지스트리 하네스 79개 + 공개 서드파티 CLI 24개 = 103개, 멀티 CLI ‘매트릭스’ 5종
GitHub 지표 54,231 stars · 4,915 forks · 기여자 약 145명(익명 포함) · 머지된 PR 202건 (API, 16:57 KST)
Trending 전체 일간 #4, Python 일간 #3, 오늘 +574 stars
런타임 Python 3.10+ / Click / prompt-toolkit. 생성에는 Claude Code·Cursor·Codex·OpenCode 등 코딩 에이전트 + 프런티어급 모델 필요

왜 지금 다시 트렌딩인가

CLI-Anything은 3월에 공개돼 이미 5만 스타를 넘긴 저장소라 “신작”은 아니다. 그럼에도 오늘 다시 일간 상위권에 오른 데는 몇 가지 신호가 겹친다. 같은 날 Trending 1위가 Anthropic의 공식 Claude Code 플러그인 디렉터리이고, 상위권 대부분이 에이전트 스킬·하네스류다. 즉 “에이전트에게 무엇을 쥐여 줄 것인가”가 이번 주 개발자들의 공통 관심사이고, CLI-Anything은 그 질문에 “앱 전체를 CLI로”라는 가장 큰 단위의 답을 내놓는 프로젝트다.

신호 내용
에이전트 스킬 생태계 확산 npx skills add HKUDS/CLI-Anything --skill …로 SKILL.md 71개를 바로 설치할 수 있어 스킬 붐에 그대로 올라탐
플랫폼 폭 Claude Code 마켓플레이스·Cursor·Codex·OpenCode·Pi·Goose·Qodercli·OpenClaw·Hermes·Reasonix·Copilot CLI용 진입점을 저장소 하나에 둠
CLI-Hub pip install cli-anything-hub 하나로 103개 CLI 검색·설치·실행, 매트릭스로 ‘영상 제작’ 같은 작업 단위 묶음 제공
활발한 커뮤니티 PR 10/17~18에도 FreeCAD·Mermaid·Godot·3MF 수정, VLC 하네스 신규 PR 등이 계속 들어옴(아직 미머지)
GUI 에이전트 피로감 스크린샷·좌표 클릭의 느림·불안정·토큰 비용에 대한 대안 수요

문제 정의: 에이전트가 소프트웨어를 다루는 세 가지 방법

방식 작동 장점 한계
GUI 에이전트(컴퓨터 유즈) 스크린샷 → 좌표 클릭/타이핑 어떤 앱이든 즉시 시도 가능, 소스 불필요 느리고 해상도·테마·팝업에 취약, 단계마다 이미지 토큰, 결과 검증이 어려움
앱별 API·MCP 서버 공식 API나 사람이 만든 MCP 도구 정확하고 문서화됨 앱마다 손으로 만들어야 함, 기능 커버리지가 API 범위로 제한
CLI-Anything 하네스 소스를 분석해 생성한 Click CLI가 네이티브 프로젝트 파일을 조작하고 실제 앱을 백엔드로 호출 결정적·조합 가능, --json·--help로 자기 기술, 테스트로 검증 생성 품질이 모델에 좌우, 소스가 있어야 유리, 앱 버전 변화에 유지보수 필요

핵심 주장은 간단하다. LLM은 텍스트 명령을 읽고 쓰는 데 가장 능숙하고, CLI는 --help로 스스로를 설명하며 파이프로 조합된다. 그렇다면 “GUI를 흉내 내는 에이전트”보다 “에이전트가 쓰기 좋은 CLI를 만드는 에이전트”가 장기적으로 싸고 안정적이라는 것이다. 이 글의 이전 심층 분석에서 다룬 GUI 에이전트 인프라(trycua/cua)와는 정반대 방향의 베팅이다.

저장소 구조: 생성기 · 하네스 모노레포 · 패키지 매니저

경로 역할 층
cli-anything-plugin/ 생성기 본체. HARNESS.md(747줄 SOP), 명령 5개(cli-anything·refine·test·validate·list), 가이드 8개, repl_skin.py(567줄), skill_generator.py 생성기
.claude-plugin/, .cursor-plugin/, .pi-extension/, codex-skill/, hermes-skill/ 등 에이전트 런타임별 진입점. Claude Code는 marketplace.json이 ./cli-anything-plugin을 가리킴 배포
<app>/agent-harness/ (69개) 앱별 설치 가능 패키지 cli_anything.<app>: CLI, core/, utils/<app>_backend.py, tests/, <APP>.md SOP 하네스
skills/cli-anything-*/SKILL.md (71개) 각 하네스의 에이전트용 스킬 문서. Phase 6.5에서 Click 데코레이터·setup.py·README로부터 생성 스킬
cli-hub/ PyPI cli-anything-hub: registry·installer·matrix·preview·analytics (약 4,950줄) 패키지 매니저
registry.json, public_registry.json, matrix_registry.json 하네스 79 / 공개 CLI 24 / 매트릭스 5. GitHub Pages(hkuds.github.io)로 서빙 레지스트리
docs/ PREVIEW_PROTOCOL(preview-bundle/v1), cli-matrix 스키마, hub 프런트엔드 문서

7단계 생성 파이프라인: /cli-anything 한 번에 일어나는 일

/cli-anything 7단계: 분석→설계→구현→테스트 계획→테스트 작성→문서화→패키징, 6.5단계 SKILL.md 생성 — 747줄 HARNESS.md가 에이전트의 작업 지침서
/cli-anything 7단계: 분석→설계→구현→테스트 계획→테스트 작성→문서화→패키징, 6.5단계 SKILL.md 생성 — 747줄 HARNESS.md가 에이전트의 작업 지침서

생성기의 실체는 코드라기보다 에이전트에게 주는 절차서다. commands/cli-anything.md는 첫 줄부터 “무엇보다 먼저 HARNESS.md를 읽어라, 즉흥적으로 하지 마라”고 못 박는다. 인자로는 반드시 소스 경로나 저장소 URL을 받아야 하며, “gimp” 같은 이름만으로는 거부한다. 소스 분석이 파이프라인의 출발점이기 때문이다.

단계 하는 일 산출물
0. 소스 확보 URL이면 클론, 로컬 경로 검증, 디렉터리 이름에서 앱 이름 도출 작업 사본
1. 코드베이스 분석 백엔드 엔진·데이터 모델 파악, GUI 동작 → API 호출 매핑, 기존 CLI 도구 조사 아키텍처 메모
2. CLI 설계 명령 그룹, 상태 모델, 출력 형식 설계 <APP>.md SOP
3. 구현 데이터 계층 → probe/info → 변경 명령 → 백엔드 래퍼 → export → 세션(undo/redo, 파일 잠금) → REPL cli_anything/<app>/
4. 테스트 계획 단위·E2E·워크플로 시나리오 TEST.md 1부
5. 테스트 구현 test_core.py(합성 데이터) + test_full_e2e.py(실제 앱 호출, 설치된 명령 subprocess 호출) 테스트 스위트
6. 테스트 문서화 실행 결과를 TEST.md에 기록 TEST.md 2부
6.5 SKILL.md skill_generator.py가 Click 메타데이터로 스킬 문서 생성 skills/cli-anything-<app>/SKILL.md
7. 패키징 setup.py, pip install -e .로 PATH 등록 cli-anything-<app>

초기 생성 뒤에는 /cli-anything:refine <경로> "초점"으로 앱 전체 기능과 현재 CLI의 차이를 분석해 명령·테스트·문서를 덧붙이고, :test와 :validate로 HARNESS 기준 충족 여부를 점검한다. README 스스로 “한 번 실행으로 전체 기능을 덮지 못하며 refine을 여러 번 돌려야 한다”, “프런티어급 모델이 필요하고 작은 모델은 불완전한 CLI를 만든다”고 한계를 적어 두었다.

HARNESS.md가 강제하는 원칙: ‘대체품을 만들지 마라’

원칙 내용 의미
진짜 소프트웨어는 필수 의존성 렌더링·내보내기는 반드시 실제 앱(LibreOffice, Blender, GIMP…)을 호출. 파이썬 재구현이나 대체 라이브러리로의 ‘우아한 후퇴’ 금지. 없으면 설치 안내와 함께 명확히 실패 GIMP 대신 Pillow로 흉내 내면 결과가 달라지는 문제를 원천 차단
네이티브 포맷을 데이터 계층으로 ODF, MLT XML, SVG 같은 앱 고유 프로젝트 파일을 직접 파싱·수정 GUI 상태가 아니라 파일이 진실 원천
렌더링 갭 GUI 앱은 효과를 렌더 시점에 적용하므로, 프로젝트 파일만 고치고 단순 export를 쓰면 효과가 조용히 사라짐 → 네이티브 렌더러 또는 필터 번역 + 렌더 스크립트 Shotcut·Kdenlive류에서 특히 중요
출력 검증 exit 0을 믿지 말 것. 매직 바이트, ZIP/OOXML 구조, 픽셀 분석, 오디오 RMS, 길이 확인 ‘돌았다’가 아니라 ‘맞게 나왔다’
에이전트 친화 CLI 모든 명령 --json, 실패는 크고 명확하게, 가능하면 멱등, info/list/status로 내부 상태 조회 에이전트가 스스로 오류를 고칠 수 있게
REPL이 기본 인자 없이 실행하면 통일된 ReplSkin REPL 진입(invoke_without_command=True) 대화형 세션에서 undo/redo 유지
세션 파일 잠금 open('r+') → flock → 잠금 안에서 truncate 후 dump 동시 쓰기로 JSON이 깨지는 문제 방지(Windows는 무잠금으로 진행)
타임코드 정밀도 29.97fps 등에서 int() 대신 round(), 테스트는 ±1프레임 허용 누적 반올림 오차
프리뷰 프로토콜 preview-bundle/v1: manifest·summary·아티팩트 디렉터리, live 모드는 session.json(헤드) + 불변 번들 + 추가 전용 trajectory.json. GUI 창 화면 긁기 금지 중간 결과를 에이전트가 ‘보면서’ 작업

하네스 한 개 해부: LibreOffice 예시

LibreOffice 하네스 해부: Click CLI·REPL → core 모듈 → 프로젝트 JSON → lo_backend가 soffice --headless 호출, 결과는 매직 바이트·구조·텍스트 추출로 검증
LibreOffice 하네스 해부: Click CLI·REPL → core 모듈 → 프로젝트 JSON → lo_backend가 soffice –headless 호출, 결과는 매직 바이트·구조·텍스트 추출로 검증

실제로 만들어진 하네스는 어떤 모양일까. 레지스트리 버전 1.0.1인 LibreOffice 하네스를 열어 보면 HARNESS.md의 구조가 그대로 보인다. 에이전트가 만지는 것은 .lo-cli.json이라는 프로젝트 JSON이고, 내보낼 때 하네스 자체 XML 빌더가 ODF 중간 파일을 만든 뒤 libreoffice --headless --convert-to에 넘긴다. 백엔드 래퍼는 shutil.which()로 실행 파일을 찾고, 셸 문자열이 아닌 인자 리스트로 subprocess.run()을 호출한다.

구성 요소 역할
libreoffice_cli.py Click 그룹: document·writer·calc·impress·style·export·session·repl. 전역 옵션 --json·--project·--dry-run
core/document.py, writer.py, calc.py, impress.py 프로젝트 JSON에 heading·paragraph·list·table·page-break, 시트·셀, 슬라이드를 추가·수정·삭제
core/session.py 현재 프로젝트·수정 여부·undo/redo 스택 관리
core/export.py 프리셋(odt·ods·odp·html·text·pdf·docx·xlsx·pptx…) → ODF 생성 → headless 변환, 결과를 JSON으로 보고
core/importer.py 기존 Office/ODF 파일을 프로젝트 JSON으로 가져오기
utils/lo_backend.py, odf_utils.py 실행 파일 탐색·변환 호출, ODF XML 처리(신뢰할 수 없는 XML은 defusedxml 경유로 강화됨)
skills/SKILL.md, tests/ 패키지 내 스킬 사본, test_core.py + test_full_e2e.py(실제 soffice 호출)
# 에이전트가 실제로 치는 명령 (박스에서 실행한 그대로)
cli-anything-libreoffice --json document new --type writer -n "MoricWorld smoke" -o report.lo-cli.json
cli-anything-libreoffice --json --project report.lo-cli.json writer add-heading -t "CLI-Anything 스모크"
cli-anything-libreoffice --json --project report.lo-cli.json writer add-paragraph -t "에이전트가 GUI 없이 만든 문서입니다."
cli-anything-libreoffice --json --project report.lo-cli.json writer add-table -r 3 -c 2
cli-anything-libreoffice --json --project report.lo-cli.json export render out.pdf -p pdf --overwrite
# → {"action":"convert","format":"pdf","method":"libreoffice-headless",
#    "libreoffice_version":"LibreOffice 25.2.3.2 ...","file_size":36064,...}

눈여겨볼 지점은 상태의 위치다. 문서 내용은 프로젝트 JSON에 저장되므로 명령을 한 줄씩 따로 실행해도 이어진다. 반면 undo/redo 스택은 세션 메모리에 있어서, 단발성 명령으로 session undo를 부르면 {"error": "Nothing to undo."}가 돌아온다. REPL 안에서 같은 작업을 하면 undo가 정상 동작한다. 에이전트 루프를 설계할 때 “되돌리기가 필요한 탐색적 편집은 REPL 세션으로, 확정 작업은 단발 명령으로”라는 구분이 필요하다는 뜻이다.

CLI-Hub: 103개 CLI를 다루는 패키지 매니저

하네스를 직접 생성하지 않고 이미 만들어진 것을 쓰려면 cli-hub가 입구다. 레지스트리 JSON을 GitHub Pages에서 받아 ~/.cli-hub/에 1시간 캐시하고, 항목의 설치 전략에 따라 pip·uv·npm·brew·번들·스크립트 설치를 대신 실행한다. 0.4.x에서는 여러 CLI를 작업 단위로 묶은 매트릭스가 더해졌다. 예를 들어 cli-hub can "subtitle"은 영상 매트릭스의 text.transcribe·text.caption 같은 역량별로 “지금 이 환경에서 무엇이 이미 되고 무엇이 빠졌는지”를 보여 준다.

명령/구성 내용
cli-hub list / search / info 레지스트리 조회. 박스에서 103개(하네스 79·공개 24) 목록 0.85초
cli-hub install / update / uninstall 전략별 설치. 하네스 79개 중 73개가 pip install git+https://github.com/HKUDS/CLI-Anything.git#subdirectory=…
cli-hub launch <name> [args] 설치된 CLI 실행 + 실행 이벤트 기록
cli-hub matrix list / info / preflight / doctor / install / recipes 3d-cad·game-development·image-design·knowledge-research·video-creation 5종, 역량(capability) 기반 v2 스키마
cli-hub can <작업> 모든 매트릭스에서 역량을 찾아 로컬 가용성(✓/✗/○)과 다음 명령 제안
cli-hub previews … 하네스가 만든 preview 번들·라이브 세션을 읽기 전용으로 검사·HTML·watch
공개 레지스트리 24개 npm 11, pip 4, brew 2, bundled 2, go·uv·script 각 1 등 서드파티 공식 CLI(Feishu/Lark, Shopify, Sanity 등)

설치와 실행: 세 가지 진입점

# 1) 이미 만들어진 CLI 쓰기 (분석 전송 끄고 시작하는 것을 권장)
export CLI_HUB_NO_ANALYTICS=1
pip install cli-anything-hub          # 0.4.1, Python 3.10+
cli-hub search office
cli-hub install libreoffice           # 실제 LibreOffice는 별도 설치 필요
cli-anything-libreoffice --help

# 2) 에이전트에게 허브 메타 스킬 쥐여 주기
npx skills add HKUDS/CLI-Anything --skill cli-hub-meta-skill -g -y

# 3) 새 하네스 생성 (Claude Code 예시)
/plugin marketplace add HKUDS/CLI-Anything
/plugin install cli-anything
/cli-anything ./gimp                  # 소스 경로 또는 저장소 URL 필수
/cli-anything:refine ./gimp "batch processing and filters"
# 하네스 테스트 (설치된 명령 기준 검증 권장)
cd libreoffice/agent-harness && pip install -e .
CLI_ANYTHING_FORCE_INSTALLED=1 python3 -m pytest cli_anything/libreoffice/tests -q

박스 스모크 테스트: 실제로 돌려 본 결과

박스 스모크(HEAD 34f5195, 로그인·LLM 호출 없음, 분석 전송 끔): cli-hub 164/164, LibreOffice 180 통과·PDF 1.46초, GIMP 미설치 시 4건 명확히 실패, 플러그인 41 통과
박스 스모크(HEAD 34f5195, 로그인·LLM 호출 없음, 분석 전송 끔): cli-hub 164/164, LibreOffice 180 통과·PDF 1.46초, GIMP 미설치 시 4건 명확히 실패, 플러그인 41 통과

박스(리눅스, Python 3.13.5 venv)에서 격리된 HOME과 CLI_HUB_NO_ANALYTICS=1로 실행했다. 코딩 에이전트 로그인이나 LLM 호출은 하지 않았으므로 7단계 생성 자체는 검증 범위 밖이고, 대신 생성 결과물(하네스)과 허브·플러그인 구성을 검증했다. 박스에는 LibreOffice 25.2.3.2가 있고 GIMP는 없다.

항목 결과 시간
cli-hub 단위 테스트 164개 중 162 통과. 실패 2개는 분석 이벤트 전송 테스트로, 분석을 꺼 둔 환경 변수 때문. 전송 함수를 목(mock)으로 둔 원래 조건에서 재실행 → 2/2 통과 2.68초
cli-hub 명령 list 103개(79+24), search office → calibre·libreoffice·zotero·mubu, matrix list 5종, can subtitle 역량 지도 출력 list 0.85초
LibreOffice 하네스 테스트 180개 전부 통과(README 표의 158개보다 늘어난 상태), 실제 soffice로 E2E 30.8초
LibreOffice 에이전트식 흐름 새 문서 → 한글 제목·문단·3×2 표 → PDF 36,064바이트(%PDF- 확인, pdftotext로 한글 본문 추출) · DOCX 5,962바이트 PDF 1.46초 · DOCX 1.44초 · list 0.06초
–dry-run / undo --dry-run 추가는 저장 안 됨(항목 수 3 유지). undo는 REPL 안에서만 동작, 단발 호출은 ‘Nothing to undo.’ —
GIMP 하네스(GIMP 미설치) Pillow 없이 E2E 수집 단계 ImportError(Pillow는 extras). Pillow 설치 후 111 통과 / 4 실패 — 모두 RuntimeError: GIMP is not installed 0.84초
생성기 플러그인 verify-plugin.sh 전 항목 통과, skill_generator 테스트 41개 통과 0.07초

GIMP 결과는 결함이 아니라 설계 그대로다. “진짜 소프트웨어는 필수 의존성”이라는 원칙 때문에 GIMP가 없으면 렌더 경로가 깔끔하게 실패하고 설치 방법을 알려 준다. 다만 pip install 기본 의존성(click, prompt-toolkit)만으로는 E2E 테스트 모듈이 import조차 안 된다는 점은 패키징 측면의 작은 흠이다. 실서비스에 쓰려면 pip install -e '.[pillow,dev]'처럼 extras까지 명시하는 편이 안전하다.

보안·신뢰 경계: 코드로 확인한 다섯 가지

항목 확인 내용 권장 대응
레지스트리가 곧 설치 스크립트 하네스 항목은 install_cmd를 pip 인자로 분해해 실행하고, 공개 레지스트리의 명령형(script·uv 등) 항목은 문자열을 그대로 실행하되 파이프·&& 같은 셸 연산자가 있으면 shell=True로 돈다(코드 주석: curl … | bash 대응, ‘신뢰된 레지스트리에서 온 명령’). 즉 원격 JSON(hkuds.github.io)을 신뢰하는 구조 팀 환경에서는 레지스트리를 미러링·리뷰하거나 cli-hub install 대신 명령을 직접 확인 후 실행
커밋 고정 없음 git 기반 하네스 설치 73건 중 커밋/태그 고정 0건 — 항상 main 최신을 받음. 반면 clibrowser는 --tag v0.1.0 --locked로 고정 재현성이 필요하면 git+…@<commit>로 직접 설치
분석(telemetry) 기본 켜짐 PostHog(us.i.posthog.com)로 설치·삭제·실행·호출 이벤트 전송. 임의 UUID를 ~/.cli-hub/.analytics_id에 저장하고, 환경 변수와 부모 프로세스 명령줄(최대 4단계)로 에이전트 여부(claude, codex, cursor 등)를 판별해 함께 보냄 CLI_HUB_NO_ANALYTICS=1로 끔. 꺼도 .first_run_sent 표식 파일은 생기지만 이벤트·ID 파일은 생기지 않음을 확인
생성 코드의 품질 하네스는 LLM이 쓴 코드. GIMP Script-Fu 경로 주입(3/14), Sketch 토큰 파일 경로 탈출(5/21) 수정 이력이 있고, XML 파서는 5/19에야 defusedxml로 일괄 전환 새로 생성한 하네스는 subprocess 인자·파일 경로·XML 처리를 사람이 리뷰
자격 증명을 다루는 하네스 Zoom·Mailchimp·JumpServer·n8n·Firefly III 등은 API 토큰으로 실제 계정을 조작 에이전트 권한 모델(허용 명령 목록)과 최소 권한 토큰으로 범위 제한
실무 팁. 에이전트에게 cli-hub를 맡길 때는 install을 허용 목록에서 빼고 search·info·launch만 허용하면 “에이전트가 원격 레지스트리가 시키는 설치 명령을 스스로 실행하는” 경로를 닫을 수 있다. 설치는 사람이 cli-hub info로 명령을 확인한 뒤 수행하는 식이다.

라이선스: 루트는 Apache-2.0, 하위 패키지는 제각각

대상 라이선스 비고
저장소 루트 LICENSE Apache-2.0 (README도 Apache 2.0 명시) 기본 전제
cli-anything-plugin/LICENSE Apache-2.0 생성기
하위 setup.py 메타데이터 67개 하네스 setup.py + cli-hub 중 MIT 표기 9개(cli-hub, blender, browser, firefly-iii 등), Apache-2.0 표기 2개(freecad 등), 나머지는 미표기 PyPI에서 cli-anything-hub는 MIT로 보임
래핑 대상 소프트웨어 GIMP(GPL), LibreOffice(MPL-2.0), Blender(GPL) 등은 하네스와 별개 라이선스. 하네스는 이를 subprocess로 호출할 뿐 번들하지 않음 배포 시 대상 앱 라이선스는 별도 준수

Apache-2.0과 MIT는 둘 다 관대한 라이선스라 내부 사용에는 큰 문제가 없지만, 하네스를 사내 배포물에 포함하거나 재배포한다면 어떤 라이선스·NOTICE를 따를지 패키지 단위로 확인해 두는 것이 좋다. 메타데이터 불일치는 이슈로 정리를 요청할 만한 부분이다.

비교: 비슷한 접근과 어디가 다른가

접근 방식 강점 약점
HKUDS/CLI-Anything 소스 분석 → 앱별 CLI 하네스 자동 생성 + 허브 결정적 명령·JSON, 실제 백엔드 렌더, 테스트·SKILL.md 동반 생성에 강한 모델·소스 필요, 하네스별 품질 편차, 앱 업데이트 추종 부담
trycua/cua 등 GUI 컴퓨터 유즈 VM/샌드박스 화면을 보고 조작 소스·API 없는 앱도 가능, 사람과 같은 화면 느리고 비결정적, 이미지 토큰 비용, 결과 검증 어려움
앱별 MCP 서버(예: Blender·Figma MCP) 사람이 만든 도구 정의를 MCP로 노출 정교한 도구 설계, 표준 프로토콜 앱마다 수작업, 커버리지 제한. CLI-Anything도 일부 하네스는 MCP 백엔드 패턴을 씀
앱 내장 스크립팅 직접 사용(blender --background --python, LibreOffice UNO) 에이전트가 스크립트를 즉석 작성 추가 계층 없음, 기능 전부 접근 매번 코드 생성이라 오류·토큰 증가, 상태·검증 규약 없음
브라우저 자동화(Playwright MCP, browser-use) 웹 앱 DOM 조작 웹 서비스 범용 데스크톱 앱 대상 아님(CLI-Anything도 browser·safari 하네스를 별도 보유)

요약하면 CLI-Anything은 “앱 내장 스크립팅”과 “MCP 서버”의 중간을 자동화한 것이다. 앱의 스크립팅 기능과 네이티브 파일 포맷을 쓰되, 그걸 매번 즉석에서 쓰지 않고 테스트된 명령 집합으로 한 번 굳혀 두는 방식이다. GUI 에이전트를 완전히 대체한다는 README의 주장은 소스가 있는 오픈소스 앱에서는 설득력이 있지만, 바이너리만 있는 상용 앱에서는 README 스스로 품질이 크게 떨어진다고 인정한다.

트레이드오프와 주의점

이슈 내용 대응
모델 의존 생성 품질이 프런티어 모델에 좌우(README 한계 항목) 생성은 강한 모델로, 사용은 어떤 에이전트든 가능 — 생성 비용은 한 번
커버리지 첫 생성은 일부 기능만, refine 반복 필요 필요한 워크플로를 초점 인자로 명시해 refine
유지보수 앱 버전이 바뀌면 프로젝트 파일 포맷·CLI 플래그가 깨질 수 있음(예: Kdenlive Gen 5 호환 수정) E2E 테스트를 CI에서 실제 앱 버전으로 주기 실행
업스트림 정체 main 머지가 9/22 이후 멈췄고 열린 PR 111건 필요한 수정은 PR 브랜치를 직접 검토해 포크에 반영
상태 모델 undo는 REPL 세션 한정, 단발 명령은 프로젝트 파일만 공유 에이전트 루프에서 세션 방식 선택을 명시
의존성 선언 E2E에 필요한 Pillow 등이 extras로만 존재 extras 포함 설치, 컨테이너 이미지로 고정
플랫폼 Windows는 Git Bash/WSL 필요(cygpath), 파일 잠금은 Windows에서 무잠금 진행 리눅스 컨테이너에서 운영 권장

누가 도입하면 좋은가

대상 얻을 것 우선순위
에이전트로 문서·이미지·영상 산출물을 자동화하는 팀 LibreOffice·Inkscape·Shotcut·Blender 등 검증된 하네스로 GUI 없이 결정적 파이프라인 구성 높음
사내 도구·오픈소스 앱을 에이전트에 붙이려는 플랫폼 엔지니어 HARNESS.md를 사내 CLI 설계 표준으로 차용, /cli-anything으로 초안 생성 후 리뷰 높음
GUI 에이전트 벤치마크·평가를 만드는 연구자 CLI로 작업·평가기를 코드로 합성(README의 제안), preview/trajectory로 재현성 확보 중간
개인 크리에이터·파워 유저 cli-hub로 바로 설치해 써 볼 수 있으나 분석 끄기·설치 명령 확인 습관 필요 중간
상용 바이너리 앱만 쓰는 조직 소스가 없으면 생성 품질 저하, 벤더 API·MCP가 더 현실적 낮음
도입 체크리스트. ① CLI_HUB_NO_ANALYTICS=1을 셸 프로필에 ② 하네스는 git+…@<커밋>으로 고정 설치 ③ 실제 앱을 같은 컨테이너에 넣고 CLI_ANYTHING_FORCE_INSTALLED=1 pytest로 E2E 확인 ④ 에이전트 허용 목록에서 cli-hub install 제외 ⑤ 출력은 매직 바이트·텍스트 추출로 검증 ⑥ 자격 증명 하네스는 최소 권한 토큰만.

정리

CLI-Anything의 진짜 기여는 “아무 앱이나 에이전트가 쓴다”는 슬로건보다 HARNESS.md라는 설계 규약에 있다. 대체 구현 금지, 네이티브 포맷을 데이터 계층으로, 출력은 측정으로 검증, 모든 명령에 JSON, REPL과 세션 잠금, 프리뷰 번들까지 — 에이전트가 쓰기 좋은 CLI의 조건을 이만큼 구체적으로 적은 문서는 드물다. 박스에서 돌려 본 LibreOffice 하네스는 180개 테스트를 통과했고, 한글 문서를 1.5초 안에 PDF로 만들어 냈다. 반면 cli-hub는 원격 레지스트리의 설치 명령을 고정 없이 실행하고 분석을 기본으로 켜 두는 등, 편의를 위해 신뢰를 넓게 잡은 부분이 있다. 규약과 하네스는 적극적으로 가져다 쓰고, 허브의 설치·분석 경로는 내 기준으로 좁혀 쓰는 것이 지금 시점의 합리적인 사용법이다.