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

이 글은 “아무 앱이나 에이전트가 쓰게 해 준다”는 홍보 문구를 그대로 옮기지 않는다. 대신 ① 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 한 번에 일어나는 일

생성기의 실체는 코드라기보다 에이전트에게 주는 절차서다. 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 예시

실제로 만들어진 하네스는 어떤 모양일까. 레지스트리 버전 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
박스 스모크 테스트: 실제로 돌려 본 결과

박스(리눅스, 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 토큰으로 실제 계정을 조작 | 에이전트 권한 모델(허용 명령 목록)과 최소 권한 토큰으로 범위 제한 |
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는 원격 레지스트리의 설치 명령을 고정 없이 실행하고 분석을 기본으로 켜 두는 등, 편의를 위해 신뢰를 넓게 잡은 부분이 있다. 규약과 하네스는 적극적으로 가져다 쓰고, 허브의 설치·분석 경로는 내 기준으로 좁혀 쓰는 것이 지금 시점의 합리적인 사용법이다.