본문으로 건너뛰기
claudemods

/tally를 지원하는 Claude Code 도구 호출 카운터

Claude의 도구 호출을 턴별·세션별로 세어 스피너 옆에 표시하고, 상세 내역을 보는 /tally 명령을 추가합니다.

권한

  • 도구 호출 가로채기Claude가 하는 모든 도구 호출을 볼 수 있고(tool.call / tool.check), 이를 차단하거나 변경할 수 있습니다.
  • UI 변경Claude Code 화면에 밴드, 패널, 상태 텍스트, 토스트를 그립니다(ui.render / $.ui.*).
  • 명령어/도구 추가사용자나 Claude가 호출할 수 있는 새 슬래시 명령어나 도구를 등록합니다($.command.register / $.tool.register).
테스트 버전
v2.1.291
마지막 테스트
필요 버전
Claude Code ≥ 2.1.287
표시 위치
스피너, 대화 기록, 상태 표시줄

Claude Code 안에서 설치:

/plugin install cm-tool-call-counter --marketplace rotbit/claudemods-marketplace
모든 설치 방법 ↓

이 모드는 무엇을 하나요?

도구 호출 카운터는 Claude Code 도구 호출 카운터 모드입니다. Claude가 작업하는 동안 스피너 줄 끝에 · 7 tools처럼 이번 턴의 호출 수가 붙으므로, 대화 기록을 스크롤하지 않고도 턴이 얼마나 바쁜지 알 수 있습니다. 언제든 /tally를 입력하면 지금까지의 세션을 정리한 표가 표시됩니다.

**Tool calls** · this turn: 7 · this session: 41 (2 errors)

| Tool | Calls | Errors |
| --- | ---: | ---: |
| Bash | 18 | 2 |
| Read | 15 | 0 |
| Edit | 8 | 0 |

턴이 왜 오래 걸렸는지, Claude가 같은 파일을 반복해서 읽고 있는지, 셸 명령이 얼마나 자주 실패하는지 알고 싶을 때 유용합니다. 선택적으로 상태 표시줄에 누적 총계를 계속 표시할 수도 있습니다: 🔧 41 tool calls (2 errors). Claude Code 2.1.287 이상이 필요합니다.

데모

녹화 영상에서는 여러 도구가 필요한 작업을 Claude에게 요청합니다. 호출이 이루어질 때마다 스피너 옆 숫자가 올라가고, 작업이 끝난 뒤 /tally를 실행하면 도구별 표가 출력됩니다.

설치

설치 블록의 방법 중 하나로 설치하십시오. /tally는 세션이 시작될 때 등록됩니다.

$ install cm-tool-call-counter

Claude Code 2.1.287 이상 필요

  1. 1.Claude Code 안에서 한 줄로

    /plugin install cm-tool-call-counter --marketplace rotbit/claudemods-marketplace

    실행 중인 세션(v2.1.275 이상)에 붙여 넣으세요. Claude Code가 먼저 마켓플레이스 추가 여부를 묻습니다.

  2. 2.셸에서 설치

    claude plugin marketplace add rotbit/claudemods-marketplace
    claude plugin install cm-tool-call-counter@claudemods

    그런 다음 이미 열려 있는 세션에서 /reload-plugins를 실행하세요.

  3. 3.설치하지 않고 사용해 보기

    git clone https://github.com/rotbit/claudemods-marketplace
    claude --plugin-dir ./claudemods-marketplace/cm-tool-call-counter

    한 세션에서만 모드를 불러옵니다. 설정에는 아무것도 추가되지 않습니다.

작동 방식

집계는 모든 도구를 관찰하는 하나의 tool.call 훅에서 이루어집니다. hooks/register.ts의 코드는 다음과 같습니다.

on('tool.call', async ($, e, next) => {
  const tool = String(e.tool)
  await update($, turn, t => addCall(t, tool))
  const now = await update($, session, t => addCall(t, tool))
  if (showInStatus) $.ui.status(statusText(now))

  const ran = await next(e)

  if (ran.deny !== undefined || ran.isError === true) {
    await update($, turn, t => addError(t, tool))
    const failed = await update($, session, t => addError(t, tool))
    if (showInStatus) $.ui.status(statusText(failed))
  }
  return ran
}).catch(($, e, next) => next(e))

on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
  if (!showInSpinner) return next(e)
  const { count } = await read($, turn)
  if (count === 0) return next(e)
  return next({ ...e, props: { ...e.props, suffix: spinnerSuffix(e.props.suffix, count) } })
})

호출은 시작되는 시점에 두 개의 $.state 아톰에 집계됩니다. 하나는 turn.start 훅이 초기화하는 turn이고, 다른 하나는 session입니다. 그런 다음 훅은 next(e)로 호출을 변경 없이 넘기고, 결과가 거부되었거나 isError로 표시되면 오류를 기록합니다. 집계 중에 예외가 나더라도 .catch가 호출을 그대로 실행하므로, 이 모드가 도구를 막는 일은 결코 없습니다.

Spinner 사이트에 대한 ui.render 훅은 suffix 속성만 바꾸고 나머지는 모두 next에 넘기므로, 스피너 자체는 여전히 Claude Code가 그립니다. 집계 값이 $.state에 있기 때문에 숫자가 바뀌는 즉시 스피너가 다시 그려집니다. /tally는 session.start에서 $.command.register로 등록되며, tally에 대한 command.run 훅이 hooks/tally.ts의 formatTable로 만든 { text }를 반환합니다.

사용자 지정

다음 옵션은 /config에서 변경할 수 있습니다. 스피너 문구는 spinnerSuffix에서, 상태 텍스트는 statusText에서 만들어지며 둘 다 hooks/tally.ts에 있습니다. /tally 표의 정렬 방식을 바꾸려면 formatTable의 sort 호출을 수정하십시오.

설정유형기본값설명
showInSpinnerbooleantrueShow in spinner. Append " · N tools" (this turn's count) to the working spinner.
showInStatusbooleanfalseShow in status line. Also show the session's total tool calls and errors in the status line.

Claude Code에서 /config로 변경하세요. 모드가 즉시 다시 로드됩니다.

권한 및 안전

도구 호출 가로채기는 모드가 모든 도구의 tool.call을 훅하기 때문에 표시됩니다. 모드는 관찰만 합니다. 호출을 거부하거나 수정하지 않으며, 도구 이름 외의 인수는 보지 않습니다. UI 변경은 스피너 옆 문구와 선택적인 상태 텍스트에 해당합니다. 명령어/도구 추가는 /tally에 해당합니다.

이 모드는 명령을 실행하지 않고, 파일을 읽지 않으며, 네트워크를 사용하지 않고, 세션 사이에 아무것도 저장하지 않습니다. 끄려면 /plugin disable cm-tool-call-counter를 실행하고, 모든 모드를 끈 채 세션을 시작하려면 claude --safe-mode를 사용하십시오.

도구 호출 가로채기
Claude가 하는 모든 도구 호출을 볼 수 있고(tool.call / tool.check), 이를 차단하거나 변경할 수 있습니다.
UI 변경
Claude Code 화면에 밴드, 패널, 상태 텍스트, 토스트를 그립니다(ui.render / $.ui.*).
명령어/도구 추가
사용자나 Claude가 호출할 수 있는 새 슬래시 명령어나 도구를 등록합니다($.command.register / $.tool.register).

호환성 및 문제 해결

macOS 터미널에서 Claude Code 2.1.291로 테스트했습니다. 집계가 보이지 않는다면 다음을 확인하십시오.

  • claude --version이 2.1.287 이상인지, 그리고 /plugin에서 모드가 활성화되어 있는지 확인하십시오.
  • 셸에서 설치했다면 /reload-plugins를 실행하십시오. 세션이 모드를 다시 시작하면 /tally가 나타납니다.
  • 스피너 옆 문구는 해당 턴에서 도구 호출이 한 번 이상 있었을 때만 표시됩니다.
  • /config에서 showInSpinner가 꺼져 있을 수 있습니다.

집계는 이 프로세스에서 모드가 로드된 이후의 시간만 다루므로, 다시 로드하면 초기화됩니다.

자주 묻는 질문

도구 호출 카운터가 도구 호출을 바꾸거나 느리게 하나요?
아닙니다. 호출을 센 다음 next(e)로 변경 없이 실행하고, 호출이 실패하면 그 뒤에 오류를 셉니다. 세는 과정 자체가 실패하더라도 .catch 핸들러가 호출을 그대로 실행합니다.
/tally에서 무엇이 오류로 집계되나요?
결과가 isError로 돌아온 호출, 또는 다른 훅이 거부한 호출입니다. 예를 들어 안전 모드가 Bash 명령을 거부한 경우가 여기에 해당합니다.
세션 집계는 재시작 후에도 유지되나요?
아닙니다. 집계는 현재 Claude Code 프로세스 동안만 유지되는 $.state에 저장됩니다. 새 세션을 시작하거나 모드를 다시 로드하면 0부터 다시 셉니다.
/tally가 모델을 호출하나요?
아닙니다. command.run 훅이 모드가 모은 집계로 직접 응답하므로 즉시 표시되고 토큰을 사용하지 않습니다.
/tally를 열지 않고도 총계를 볼 수 있나요?
/config에서 showInStatus를 켜면 세션 총계와 오류 수가 상태 표시줄에 계속 표시됩니다.
Claude Code에서 실행 중인 컨텍스트 미터

컨텍스트 미터

컨텍스트 창 사용률, 5시간·7일 요금제 사용량, 세션 비용을 상태 표시줄에 보여 주고 한도에 가까워지면 경고합니다.

  • 상태 표시줄
  • 토스트
  • UI 변경

v2.1.291에서 테스트됨

Claude Code에서 실행 중인 위험한 명령 차단

위험한 명령 차단

rm -rf /, main 브랜치 강제 푸시, DROP TABLE, curl | sh 같은 파괴적인 Bash 명령을 실행 전에 거부합니다.

  • 토스트
  • 도구 호출 가로채기
  • UI 변경

v2.1.291에서 테스트됨

Claude Code에서 실행 중인 프롬프트 위 Git 브랜치

프롬프트 위 Git 브랜치

Claude Code 프롬프트 위 한 줄 띠에 git 브랜치, 변경된 파일 수, ahead/behind 상태를 표시합니다.

  • 프롬프트 위
  • 명령어 실행
  • 도구 호출 가로채기
  • UI 변경

v2.1.291에서 테스트됨

더 보기: 슬래시 명령, 컨텍스트, 사용량, 비용, 상태 표시줄 및 프롬프트 바.