AI 에이전트에게 화면을 보게 하지 마라 — CLI-Anything이 모든 소프트웨어에 명령줄을 붙인다

AI 에이전트가 데스크톱 소프트웨어를 쓰려고 애쓰는 모습을 보고 있으면 특유의 절망감이 밀려옵니다. 스크린샷을 찍고, 메뉴 위치를 짐작하고, 클릭합니다. 빗나갑니다. 또 스크린샷을 찍습니다. 20초가 지나고 슬라이더는 2픽셀 움직였을 뿐, 배운 것은 없습니다.
홍콩대학교 데이터 인텔리전스 랩(HKUDS)의 CLI-Anything은 그 접근 전체가 틀렸다고 주장합니다. 에이전트에게 화면을 보는 법을 가르치지 마세요. 소프트웨어에 명령줄을 쥐여주고, 에이전트가 타이핑하게 두면 됩니다.
내세우는 구호는 한 줄입니다. 모든 소프트웨어를 agent-native로. 작동 방식은 그보다 덜 화려하고 더 흥미롭습니다. 소스가 있는 애플리케이션이라면 어디든 명령 하나를 겨누면, 7단계 파이프라인이 구조화된 CLI 래퍼를 만들어 냅니다. 테스트와 문서, 그리고 pip로 설치하는 패키지까지 갖춘 채로요.
일곱 단계
파이프라인은 코딩 에이전트 안에서 돌아가고, /cli-anything <source path or repo>로 호출합니다. 분석: 소스를 훑고 GUI 조작을 API 호출에 대응시킵니다. 설계: 명령 그룹, 상태 모델, 출력 형식을 정합니다. 구현: Click 기반 CLI를 만들고 REPL, JSON 출력, undo/redo를 붙입니다. 테스트 계획: 테스트 계획을 TEST.md에 적습니다. 테스트 작성: 스위트를 구현합니다. 문서화: 결과를 같은 파일에 다시 기록합니다. 배포: setup.py를 만들고 명령을 PATH에 올립니다.
6.5단계도 있는데, SKILL.md를 생성합니다. 덕분에 결과물인 CLI는 사람이 배선해 주지 않아도 에이전트가 스킬로 발견할 수 있습니다. 여기에 /cli-anything:refine 명령도 있어서, 격차 분석을 하고 커버리지를 조금씩 넓혀 갑니다.
작명은 일부러 딱딱하게 고정했습니다. 명령은 cli_anything.<software> 네임스페이스 아래에, 패키지는 cli-anything-<software>로. 지루한 관례가 있어야 도구가 서로 조립됩니다. 그리고 이 프로젝트는 이런 래퍼가 수백 개쯤 존재하는 세계를 분명히 염두에 두고 있습니다.
장난감 재구현이 아니라 진짜 백엔드
이걸 주말 프로젝트와 갈라놓는 디테일은 이겁니다. 래퍼가 실제 소프트웨어를 돌립니다. LibreOffice는 진짜 PDF를 만들고, Blender는 진짜 3D 장면을 렌더링하고, GIMP는 GIMP가 이미지에 하는 일을 합니다. 다른 길, 그러니까 앱 동작의 일부를 Python으로 다시 구현하는 길은 재구현에서 빠뜨린 기능이 필요해지는 순간까지는 잘 되는 것처럼 보이는 무언가를 낳습니다.
대가는 앱을 설치해 둬야 한다는 것이고, 이득은 결과물이 사람 오퍼레이터가 만든 것과 구별되지 않는다는 것입니다. 같은 엔진이 만들었으니까요.
모든 명령은 요청하면 JSON을 뱉습니다. 에이전트가 파싱할 수 있는 CLI와, 에이전트가 눈을 가늘게 뜨고 읽어야 하는 CLI의 차이가 여기서 갈립니다. 상호작용 작업용 상태 기반 REPL, 스크립트용 평범한 서브커맨드, 그리고 영속적인 프로젝트 상태와 undo/redo까지 갖췄습니다.
무엇을 다루는가
범위는 의도적으로 넓습니다. 읽다 보면 사람들이 계속 자동화하려다 실패해 온 소프트웨어 목록처럼 보입니다. 창작 쪽은 GIMP, Blender, Kdenlive. 사무 문서는 LibreOffice. 3D와 게임은 Godot, s&box. 과학과 엔지니어링은 QGIS, FreeCAD. AI 쪽은 ComfyUI와 Ollama. 디버깅은 LLDB, RenderDoc, Nsight.
이미지를 다룬다면 ComfyUI 항목에서 한 번 멈춰 볼 만합니다. ComfyUI에는 이미 API가 있습니다. 다만 그건 그래프 API입니다. 노드, 연결선, 그리고 스키마가 어떤 커스텀 노드를 설치했느냐에 따라 달라지는 JSON blob이죠. 의도 수준의 명령을 노출하고 상태 모델과 JSON 출력을 정의한 CLI 래퍼는, 누군가의 워크플로 파일을 역설계하지 않고 이미지 파이프라인을 돌리려는 에이전트에게 정확히 필요한 물건입니다.
테스트에 대한 주장
저장소가 보고하는 테스트는 약 2,461개입니다. 1,732개 유닛, 579개 엔드투엔드, 19개 Node.js, 통과율 100%라고 주장합니다. E2E 계층은 실제 백엔드에 붙어 돌아갑니다. 여기서 의미 있는 유일한 종류의 E2E죠. LibreOffice가 PDF를 더 이상 만들지 않으면 테스트가 깨집니다. 에이전트가 망가진 파일 40개를 쏟아내기 전에 알게 됩니다.
“100%”는 보증서가 아니라 스냅샷으로 받아들이세요. 생성된 테스트 스위트는 생성기의 가정을 그대로 박아 넣는 버릇이 있습니다. 그래도 4계층 구조, 즉 유닛, 네이티브 E2E, 실제 백엔드 E2E, CLI 서브프로세스는 옳은 형태입니다.
솔직하게 적어 둔 한계
README에 나열돼 있습니다. 좋은 신호입니다.
프런티어 모델에 의존합니다. Claude Opus 4.6이나 Sonnet 4.6, GPT-5.4 정도의 급입니다. 모델이 약하면 CLI가 불완전하거나 아예 틀리게 나오고, 손으로 많이 고쳐야 합니다. 즉 이 도구의 쓸모는 여러분이 가지고 있지 않을 수도 있는 구독에 묶여 있습니다.
소스 코드에 의존합니다. 파이프라인은 소스를 분석합니다. 컴파일된 바이너리만 있다면 품질과 커버리지가 급격히 떨어집니다. 이는 상용 소프트웨어 대부분을 조용히 배제합니다. 그리고 사람들이 실제로 자동화하고 싶어 하는 소프트웨어의 대부분이 바로 그것입니다.
한 번 돌려서 전부 커버되는 일은 드뭅니다. 하네스를 실전 수준으로 만들려면 /refine을 여러 번 돌릴 각오를 해야 합니다. 일부 CLI는 업스트림 앱이 설치돼 있어야 합니다. 플랫폼 성숙도도 들쭉날쭉합니다. Goose, OpenCode, Codex, Hermes, Reasonix는 experimental로 표시돼 있고, Windows 사용자는 bash와 cygpath 호환 문제를 만나게 됩니다.
아무도 묻고 싶어 하지 않는 유지보수 문제
생성된 래퍼는 약속입니다. cli-anything-libreoffice를 채택하는 순간, 에이전트와 애플리케이션 사이에 층이 하나 생기고, 그 층은 LibreOffice가 문서 모델을 바꾸든 Blender가 오퍼레이터 이름을 바꾸든 계속 돌아가야 합니다.
실무적으로는 세 가지입니다. 생성된 하네스는 남의 것에 의존하지 말고 자기 저장소에 두세요. 그래야 패치를 넣을 수 있습니다. 기반 앱을 업그레이드할 때는 파이프라인을 다시 돌리고 결과를 diff 하세요. 그리고 TEST.md를 계약으로 취급하세요. 에이전트가 잘못된 파일 40개를 만들기 전에 문제를 알아차릴 수 있는 유일한 이유가 테스트입니다.
경제성이 성립하는 이유는 재생성이 싸기 때문입니다. 진짜 통찰은 이겁니다. 래퍼가 영원히 완벽할 필요는 없습니다. 그것을 만들어 낸 것이 다시 만들어 낼 수 있으니까요. 전통적인 SDK 유지비가 비싼 이유는 사람이 쓰기 때문입니다. 이건 그렇지 않습니다.
CLI-Hub라는 베팅
커뮤니티가 만든 래퍼를 둘러보고 설치하는 패키지 관리자 cli-anything-hub가 있습니다. 이 프로젝트에서 상방이 가장 크고 위험도 가장 뻔한 부분입니다. 생성된 CLI의 허브는 곧 여러분의 권한으로 돌아가고 여러분의 파일을 건드리는 코드의 허브입니다.
유용한 생태계가 될지, 공급망 사고 사례가 될지는 전적으로 프로젝트가 리뷰를 배포의 일부로 취급하느냐에 달려 있습니다. 지금 답은 “절반”입니다. 테스트는 생성되고, 문서도 생성되고, 리뷰는 커뮤니티가 하는 만큼입니다.
이 저장소 바깥에서 중요한 이유
지난 2년 동안 computer use는 업계가 가장 좋아하는 데모이자 가장 만들기 싫어하는 제품이었습니다. 데모가 돌아가는 건 누군가 과제를 정성껏 스크립트로 짰기 때문입니다. 제품이 멈춰 서는 건 픽셀 단위 제어가 결코 사라지지 않는 방식으로 취약하기 때문입니다.
CLI-Anything은 다른 분업을 제안합니다. 에이전트를 인간 잘하는 쪽으로 만드는 대신, 소프트웨어를 기계 잘하는 쪽으로 만드는 겁니다. 소스 트리가 있는 모든 애플리케이션이 생성 인터페이스의 후보가 되고, 그 인터페이스는 스크린샷 루프가 결코 할 수 없는 방식으로 테스트할 수 있습니다.
트레이드오프는 실재합니다. 생성된 CLI는 그것을 쓴 모델만큼만 좋고, 업스트림 앱이 바뀌면 누군가는 래퍼를 책임져야 합니다. 그래도 방향은 맞습니다. cli-anything-blender render --scene scene.blend --out frame.png를 타이핑해서 결정적인 출력을 받는 에이전트는, 뷰포트를 마구 클릭하며 기도하는 에이전트보다 근본적으로 더 쓸모 있는 일을 하고 있습니다.
관련 글
미국 빅5 출판사, 조용히 AI로 표지를 만들고 있다… 독자는 이미 알아챈다
미국 5대 출판사 중 최소 3곳이 공개도 저자 동의도 없이 AI로 표지와 홍보 문구를 만들어 왔다고 《와이어드》가 보도했다. 공식 설명과 현장 증언은 엇갈리고, 표지에 이름이 찍힌 저자는 마지막에 안다.
Character.AI 파산 신청, 디즈니는 2000만 달러로 특허를 가져간다
Character.AI가 파산을 신청했다. 디즈니는 2000만 달러로 스토킹 호스에 나서 일부 자산과 특허 라이선스만 사려 한다. 1억 5000만 달러 시리즈 A의 이야기는 특허와 월 800만~900만 달러 손실로 끝난다.
XERJ: 자기 숫자가 부풀려졌다고 먼저 말하는 코딩 에이전트용 검색엔진
XERJ는 로컬 인덱스와 tree-sitter 심볼 인식으로 에이전트가 읽는 파일을 줄인다. 실측은 grep 대비 2.7배 절약이며, 헤드라인의 40배가 아니다. 메인테이너가 직접 그렇게 밝혔다.
Claude Code를 구직 파이프라인으로 바꾼 사람 — 지원 69건, 1차 면접 20회
MIT 라이선스 프레임워크가 Claude Code를 구직 파이프라인으로 바꿨다. 지원 69건, 면접 20회. 흥미로운 건 글쓰기가 아니라 컴파일해서 PDF를 읽고 ATS를 통과시키는 검증 단계다.