Product Hunt

shim-cli — See what your coding agent sends. Mask what you can.

shim-cli — 코딩 에이전트가 보내는 내용을 확인하고, 가능한 정보는 마스킹합니다

shim-cli는 Claude Code 등의 코딩 에이전트가 모델에 전달하는 도구 결과에서 비밀값과 개인정보를 찾아 마스킹하는 오픈소스 CLI입니다. 로컬에서 동작하며 세션별 입력 토큰과 비용도 확인하지만, 클라이언트별 지원 범위와 탐지에는 제한이 있습니다.

에디터 노트

shim-cli가 줄이는 위험은 에이전트가 도구 결과로 읽어 들인 값을 모델에 그대로 보내는 경우입니다. Claude Code에서는 탐지한 값을 로컬 hook에서 바꾸므로 이 경로에는 구체적인 보호가 생깁니다. 반면 실패한 명령 출력과 스크립트의 직접 네트워크 통신은 통제하지 못하며, Codex와 Copilot CLI의 도구 트래픽도 아직 검사하지 않습니다. 댓글에서 제작자는 이 경계를 확인했고, 사용자는 파일별 토큰 분해를 물었지만 답은 제시되지 않았습니다. 따라서 shim watch의 세션 관측과 hook의 마스킹은 별도 기능으로 봐야 합니다. 탐지 누락과 클라이언트별 차이가 명시된 만큼, 전송 경로 전체를 감시하는 도구라기보다 특정 도구 결과에 붙는 로컬 보호 계층으로 범위를 한정해 설명하는 편이 정확합니다.

AI 요약

코딩 에이전트는 프롬프트뿐 아니라 읽은 파일과 도구 실행 결과도 모델에 전달합니다. shim-cli는 에이전트의 도구 호출에 hook을 연결해 Claude Code의 도구 결과에서 API 키, 비밀번호, 이메일, IBAN, 전화번호, 터키 주민등록번호 등 탐지한 값을 <SECRET_1> 같은 자리표시자로 바꿉니다. 오픈소스 Apache-2.0 프로젝트이며 처리는 로컬에서 이뤄지고 계정과 텔레메트리는 필요하지 않습니다.

작동 방식과 지원 범위

shim install claude 명령으로 Claude Code에 hook을 설치합니다. shim watch -- claude를 사용하면 세션에서 입력 토큰이 어디에 쓰였는지와 비용, 요청과 응답에 포함된 민감값을 확인할 수 있습니다. 제작자 설명에 따르면 hook은 에이전트의 도구 호출에 붙어 도구 결과를 검사합니다. 선택 기능인 shim watch는 로컬 프록시를 사용해 세션 정보를 보여주며 요청 바이트를 변경하지 않고 전달합니다.

지원 범위는 클라이언트마다 다릅니다. Claude Code에서는 도구 결과를 마스킹하지만, Codex와 Copilot CLI의 도구 트래픽은 아직 검사하지 않습니다. VS Code는 내용을 보고하지만 마스킹하지 않습니다. 사용자가 Claude Code나 Codex에 직접 입력한 프롬프트도 hook이 고칠 수 없어 기본적으로 마스킹하지 않습니다. shim은 이를 보고하거나 enforce 모드에서 차단합니다. Copilot CLI에서는 프롬프트를 마스킹합니다.

마스킹이 닿지 않는 경로

Claude Code에서 실패한 명령의 출력은 hook이 교체하지 못합니다. 예를 들어 cat .env && cat missing-file처럼 명령이 실패하면 .env 내용이 마스킹되지 않은 채 모델에 전달될 수 있고, shim은 이를 보고합니다. @로 첨부한 파일과 셸 명령도 보고만 합니다. 탐지는 패턴과 체크섬에 기대므로 이름, 우편 주소, 키 이름 없이 쓰인 비밀번호 등을 놓칠 수 있습니다. 제작자는 이 도구를 DLP 경계로 보지 말라고 명시합니다. 에이전트가 작성한 스크립트가 직접 네트워크 요청을 보내는 경우에도 shim은 그 통신을 검사하지 않습니다. Windows는 지원하지 않으며 macOS와 Linux에서 동작합니다.

Product Hunt 반응

  • @vipul_kumar1280 — 일부 입력은 마스킹하지 않고 보고만 한다는 점을 투명하게 적어 둔 것이 좋습니다. 예상하지 못한 민감값이 얼마나 자주 빠져나갔나요?
    • @mertcansaglam — 대부분은 이미 '보고만 함'으로 적어 둔 경로에서 나왔습니다. 제 컴퓨터에서 가장 놀라웠던 사례는 실패한 명령의 출력이었습니다. 명령이 실패하면 Claude Code가 hook의 출력을 교체하지 못해 cat .env && cat missing-file 결과가 그대로 모델에 전달됩니다. shim은 이를 알리지만 막지는 못합니다. 탐지에서는 이름과 우편 주소, 키 이름이 없는 비밀번호를 주로 놓칩니다.
  • @thesshguy — 에이전트가 .env를 읽어 출력하는 스크립트를 작성하면 그 출력도 마스킹하나요? 스크립트가 비밀값을 외부로 보내면 잡아내나요?
    • @mertcansaglam — Bash 도구로 실행한 스크립트의 stdout은 도구 결과로 돌아오므로 shim이 탐지한 비밀값을 마스킹합니다. 다만 명령이 실패하면 Claude Code가 출력을 교체하지 못해 shim은 보고만 합니다. 스크립트가 직접 보내는 네트워크 요청은 shim 경로를 지나지 않아 탐지하지 못합니다. shim은 샌드박스나 방화벽이 아닙니다.
  • @leoheo — 먼저 shim watch를 써보고 싶습니다. 작업을 시작할 때마다 기능 명세 파일을 읽게 하는데, 입력 중 파일별로 토큰이 얼마나 쓰였는지도 나눠 보여주나요?
  • @bengeekly — 사용자와 제공자 사이의 라우터인가요? 속도가 느려지나요?
    • @mertcansaglam — 라우터가 아닙니다. 에이전트는 제공자와 계속 직접 통신하고 shim은 로컬 hook으로 도구 호출 결과를 검사합니다. 검사마다 로컬 처리를 거치며 추가 네트워크 경로는 없습니다. 선택형 로컬 ledger에서 검사에 걸린 시간을 확인할 수 있습니다.
  • @codeandsea — 요즘 에이전트 코딩을 많이 하지는 않고, 쓸 때는 주로 opencode를 사용합니다.

원문: Product Hunt / 번역·요약: Trawling