Skip to content

devstefancho/claude-pulse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

67 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Claude Pulse

Claude Code의 λͺ¨λ“  hook 이벀트λ₯Ό μžλ™μœΌλ‘œ κΈ°λ‘ν•˜κ³ , μ›Ή λŒ€μ‹œλ³΄λ“œμ—μ„œ μ‹œκ°μ μœΌλ‘œ 뢄석할 수 μžˆλŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

Dashboard

Features

  • μžλ™ 이벀트 λ‘œκΉ… β€” 10κ°€μ§€ Claude Code hook 이벀트λ₯Ό JSONL ν˜•μ‹μœΌλ‘œ 기둝
  • μ›Ή λŒ€μ‹œλ³΄λ“œ β€” μ„Έμ…˜ νƒ€μž„λΌμΈ, 도ꡬ μ‚¬μš© 차트, μΈν„°λŸ½νŠΈ/κ³ μ•„ 감지 μ‹œκ°ν™”
  • AI μ±„νŒ… 뢄석 β€” Claude SDK 기반 SSE 슀트리밍 μ±„νŒ…μœΌλ‘œ 둜그 데이터 뢄석
  • MCP 도ꡬ β€” 6개의 κ΅¬μ‘°ν™”λœ 쿼리 λ„κ΅¬λ‘œ AIκ°€ 직접 데이터λ₯Ό 쑰회
  • CLI 뢄석 도ꡬ β€” ν„°λ―Έλ„μ—μ„œ λΉ λ₯Έ 뢄석
  • μ•ˆμ „ν•œ μ„€μ • 병합 β€” κΈ°μ‘΄ hooks와 settingsλ₯Ό νŒŒκ΄΄ν•˜μ§€ μ•ŠλŠ” λΉ„νŒŒκ΄΄μ  병합
  • 둜그 λ‘œν…Œμ΄μ…˜ β€” μžλ™ 둜그 파일 관리
  • μ›μ»€λ§¨λ“œ μ„€μΉ˜/제거

Prerequisites

  • jq β€” μ…Έ 슀크립트 JSON 처리
  • Node.js 18+ β€” μ„œλ²„ 및 λΉŒλ“œ
  • pnpm β€” νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €
  • Claude Code β€” hook 이벀트 μ†ŒμŠ€

Quick Start

git clone https://github.com/devstefancho/claude-pulse.git
cd claude-pulse
pnpm install
./install.sh

install.shκ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…:

  1. μ˜μ‘΄μ„± 확인 (jq, Node.js 18+)
  2. TypeScript λΉŒλ“œ (pnpm run build)
  3. hook 슀크립트λ₯Ό ~/.claude/hooks/에 볡사
  4. hooks-config.json을 ~/.claude/settings.json에 병합
  5. 둜그 디렉토리 ~/.claude/claude-pulse/ 생성

Usage

Web Dashboard

# λŒ€μ‹œλ³΄λ“œ μ‹œμž‘ (κΈ°λ³Έ 포트: 7777)
~/.claude/hooks/log-viewer.sh --open

# 포트 λ³€κ²½
~/.claude/hooks/log-viewer.sh --open --port 8080

# μ„œλ²„ μƒνƒœ 확인
~/.claude/hooks/log-viewer.sh --status

# μ„œλ²„ 쀑지
~/.claude/hooks/log-viewer.sh --stop

http://localhost:7777μ—μ„œ λŒ€μ‹œλ³΄λ“œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€μ‹œλ³΄λ“œ κΈ°λŠ₯

ꡬ성 μš”μ†Œ μ„€λͺ…
StatBar 총 이벀트 수, μ„Έμ…˜(ν™œμ„±/λΉ„ν™œμ„±/μ’…λ£Œ), 도ꡬ μ‚¬μš©, μΈν„°λŸ½νŠΈ, κ³ μ•„ 호좜 톡계
SessionList μ™Όμͺ½ μ‚¬μ΄λ“œλ°”μ—μ„œ μ„Έμ…˜ λͺ©λ‘ 쑰회 및 필터링
EventTimeline μ‹œκ°„μˆœ 이벀트 νƒ€μž„λΌμΈ (메인 μ˜μ—­)
LeftTabs 이슈(μΈν„°λŸ½νŠΈ/κ³ μ•„), 도ꡬ μ‚¬μš©λŸ‰, μŠ€ν‚¬ μ‚¬μš©λŸ‰ νƒ­
ChatPanel AI 기반 둜그 뢄석 μ±„νŒ… (SSE 슀트리밍)

μ„Έμ…˜ μƒνƒœ 감지

  • Live β€” SessionStart 이후 5λΆ„ 이내 ν™œλ™μ΄ μžˆλŠ” μ„Έμ…˜
  • Stale β€” SessionStart 이후 5λΆ„ 이상 ν™œλ™μ΄ μ—†λŠ” μ„Έμ…˜
  • Ended β€” SessionEnd μ΄λ²€νŠΈκ°€ μžˆλŠ” μ„Έμ…˜

CLI Analysis

# 였늘 둜그 μš”μ•½
~/.claude/hooks/analyze-interrupts.sh

# νŠΉμ • μ„Έμ…˜ νƒ€μž„λΌμΈ
~/.claude/hooks/analyze-interrupts.sh <logfile> <session_id_prefix>

# μΈν„°λŸ½νŠΈλ§Œ ν‘œμ‹œ
~/.claude/hooks/analyze-interrupts.sh --interrupts

# κ³ μ•„ 도ꡬ 호좜 (PreToolUse에 λ§€μΉ­λ˜λŠ” PostToolUseκ°€ μ—†λŠ” 경우)
~/.claude/hooks/analyze-interrupts.sh --orphans

# μ„Έμ…˜ μš”μ•½ ν…Œμ΄λΈ”
~/.claude/hooks/analyze-interrupts.sh --sessions

Hook Events

event-logger.shλŠ” Claude Code의 hook 이벀트λ₯Ό stdin으둜 JSON을 μˆ˜μ‹ ν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

Event Timing Async Data Fields
SessionStart μ„Έμ…˜ μ‹œμž‘ Sync source, model
SessionEnd μ„Έμ…˜ μ’…λ£Œ Async reason
UserPromptSubmit μ‚¬μš©μž ν”„λ‘¬ν”„νŠΈ 전솑 Sync prompt (500자 truncate), prompt_length
PreToolUse 도ꡬ μ‹€ν–‰ μ „ Async tool_name, tool_use_id, tool_input_summary
PostToolUse 도ꡬ 성곡 ν›„ Async tool_name, tool_use_id, success
PostToolUseFailure 도ꡬ μ‹€νŒ¨ ν›„ Async tool_name, tool_use_id, error, is_interrupt
Notification μ‹œμŠ€ν…œ μ•Œλ¦Ό Async notification_type, message
Stop μ—μ΄μ „νŠΈ μ •μ§€ Async stop_hook_active
SubagentStart μ„œλΈŒμ—μ΄μ „νŠΈ 생성 Async agent_id, agent_type
SubagentStop μ„œλΈŒμ—μ΄μ „νŠΈ μ’…λ£Œ Async agent_id, agent_type

Tool Input Summary

λ„κ΅¬λ³„λ‘œ 의미 μžˆλŠ” μš”μ•½ 정보λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€:

Tool μΆ”μΆœ λ‚΄μš©
Bash λͺ…λ Ήμ–΄ (처음 200자)
Read / Write / Edit 파일 경둜
Glob / Grep νŒ¨ν„΄
WebFetch URL
WebSearch 검색 쿼리
Skill μŠ€ν‚¬ 이름
Task νƒœμŠ€ν¬ μ„€λͺ…

Log Format

λ‘œκ·ΈλŠ” JSONL (ν•œ 쀄에 ν•˜λ‚˜μ˜ JSON 객체) ν˜•μ‹μœΌλ‘œ ~/.claude/claude-pulse/hook-events.jsonl에 μ €μž₯λ©λ‹ˆλ‹€.

{
  "ts": "2025-01-15T09:30:00.000Z",
  "event": "PreToolUse",
  "session_id": "abc123-def456",
  "cwd": "/Users/you/project",
  "permission_mode": "default",
  "data": {
    "tool_name": "Read",
    "tool_use_id": "tool_01ABC",
    "tool_input_summary": "/src/index.ts"
  }
}

곡톡 ν•„λ“œ: ts (ISO 8601), event, session_id, cwd, permission_mode μ΄λ²€νŠΈλ³„ ν•„λ“œ: data 객체 μ•ˆμ— 이벀트 νƒ€μž…μ— 따라 λ‹€λ₯Έ ν•„λ“œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.

MCP Tools

AI μ±„νŒ…μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ 6개의 MCP 도ꡬ:

Tool μ„€λͺ…
get_dashboard_summary 전체 λŒ€μ‹œλ³΄λ“œ 톡계 μš”μ•½
list_sessions μ„Έμ…˜ λͺ©λ‘ 쑰회 (μƒνƒœλ³„ ν•„ν„°: live/stale/ended)
get_session_detail νŠΉμ • μ„Έμ…˜μ˜ 이벀트 및 도ꡬ μ‚¬μš© 상세
get_recent_activity μ‹œκ°„ λ²”μœ„ 기반 졜근 ν™œλ™ μš”μ•½
get_tool_skill_usage 도ꡬ/μŠ€ν‚¬ μ‚¬μš© 톡계
search_events 이벀트 검색 (νƒ€μž…, 도ꡬ, ν…μŠ€νŠΈ ν•„ν„°)

Architecture

Claude Code Session
  β”‚ (hook 이벀트 트리거)
  β–Ό
event-logger.sh (stdin으둜 JSON μˆ˜μ‹ )
  β”‚ (μ΄λ²€νŠΈλ³„ 데이터 μΆ”μΆœ)
  β–Ό
~/.claude/claude-pulse/hook-events.jsonl (JSONL append)
  β”‚
  β”œβ”€β”€β–Ά Web Dashboard (localhost:7777)
  β”‚     β”œβ”€β”€ REST API (/api/files, /api/events, /api/summary)
  β”‚     β”œβ”€β”€ SSE Chat (/api/chat) + MCP Tools
  β”‚     └── React SPA (μ„Έμ…˜ λͺ©λ‘, νƒ€μž„λΌμΈ, 차트, μ±„νŒ…)
  β”‚
  └──▢ CLI Tools
        β”œβ”€β”€ log-viewer.sh β†’ μ„œλ²„ μ‹œμž‘/쀑지/μƒνƒœ
        └── analyze-interrupts.sh β†’ 터미널 뢄석

Project Structure

claude-pulse/
β”œβ”€β”€ hooks/                  # Hook 이벀트 λ‘œκΉ… μ…Έ 슀크립트
β”‚   β”œβ”€β”€ event-logger.sh     #   이벀트 μˆ˜μ‹  및 JSONL 기둝
β”‚   └── rotate-logs.sh      #   둜그 λ‘œν…Œμ΄μ…˜
β”œβ”€β”€ lib/                    # Node.js 라이브러리
β”‚   β”œβ”€β”€ settings-merge.ts   #   settings.json λΉ„νŒŒκ΄΄μ  병합
β”‚   └── settings-merge-cli.ts
β”œβ”€β”€ viewer/                 # μ›Ή μ„œλ²„ λ°±μ—”λ“œ
β”‚   β”œβ”€β”€ server.ts           #   HTTP μ„œλ²„ + REST API + SSE
β”‚   β”œβ”€β”€ data.ts             #   JSONL νŒŒμ‹±, 톡계, 필터링
β”‚   β”œβ”€β”€ mcp-tools.ts        #   MCP 도ꡬ ν•Έλ“€λŸ¬
β”‚   └── start.ts            #   μ„œλ²„ μ‹œμž‘ μ§„μž…μ 
β”œβ”€β”€ web/                    # React ν”„λ‘ νŠΈμ—”λ“œ (Vite + React 19)
β”‚   └── src/
β”‚       β”œβ”€β”€ App.tsx          #   메인 μ•± (λ ˆμ΄μ•„μ›ƒ, μƒνƒœ 관리)
β”‚       β”œβ”€β”€ components/      #   UI μ»΄ν¬λ„ŒνŠΈ (11개)
β”‚       β”œβ”€β”€ hooks/           #   μ»€μŠ€ν…€ ν›… (useLogData, useAutoRefresh, useChat)
β”‚       β”œβ”€β”€ utils/           #   μœ ν‹Έλ¦¬ν‹° (μƒμˆ˜, ν¬λ§·νŒ…)
β”‚       └── types.ts         #   TypeScript νƒ€μž… μ •μ˜
β”œβ”€β”€ test/                   # ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ (9개 파일)
β”œβ”€β”€ tools/                  # CLI μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ log-viewer.sh       #   λŒ€μ‹œλ³΄λ“œ μ„œλ²„ 관리
β”‚   └── analyze-interrupts.sh
β”œβ”€β”€ install.sh              # μ„€μΉ˜ 슀크립트
β”œβ”€β”€ uninstall.sh            # 제거 슀크립트
β”œβ”€β”€ hooks-config.json       # Hook 이벀트 등둝 μ„€μ •
β”œβ”€β”€ justfile                # 개발 λͺ…λ Ήμ–΄ 단좕킀
└── package.json

Tech Stack

Category Technology
Language TypeScript (strict), Bash
Frontend React 19, Vite 6
Backend Node.js HTTP (Express μ—†μŒ)
AI @anthropic-ai/claude-agent-sdk
Validation Zod 4
Markdown react-markdown
Package Manager pnpm
Test Node.js built-in test runner + tsx
Build tsc (μ„œλ²„) + Vite (ν”„λ‘ νŠΈμ—”λ“œ)
Shell JSON jq

Development

개발 μ„œλ²„

# ν”„λ‘ νŠΈμ—”λ“œ dev μ„œλ²„ (포트 5173, /apiλ₯Ό 7777둜 ν”„λ‘μ‹œ)
pnpm run dev

# λ°±μ—”λ“œ μ„œλ²„ (포트 7777)
pnpm run dev:server

λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ

pnpm run build           # tsc 컴파일 + Vite λΉŒλ“œ β†’ dist/
pnpm run build:check     # νƒ€μž… 체크만 (tsc --noEmit)
pnpm test                # 전체 ν…ŒμŠ€νŠΈ μ‹€ν–‰
pnpm run test:coverage   # 컀버리지 리포트

justfile λͺ…λ Ήμ–΄

justκ°€ μ„€μΉ˜λ˜μ–΄ μžˆλ‹€λ©΄ 단좕 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

just build          # λΉŒλ“œ
just build-check    # νƒ€μž… 체크
just test           # ν…ŒμŠ€νŠΈ
just test-coverage  # 컀버리지 ν…ŒμŠ€νŠΈ
just dev            # λΉŒλ“œ ν›„ μ„œλ²„ μ‹œμž‘
just viewer         # λŒ€μ‹œλ³΄λ“œ μ—΄κΈ°
just viewer-stop    # λŒ€μ‹œλ³΄λ“œ μ„œλ²„ 쀑지
just viewer-status  # μ„œλ²„ μƒνƒœ 확인
just analyze        # CLI 뢄석
just clean          # dist/ μ‚­μ œ
just install        # hook μ„€μΉ˜
just uninstall      # hook 제거

Migration from Hook Logger

이전 버전(Claude Hook Logger)μ—μ„œ μ—…λ°μ΄νŠΈν•˜λŠ” 경우:

# 1. κΈ°μ‘΄ 둜그 데이터 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
mv ~/.claude/hook-logger ~/.claude/claude-pulse

# 2. κΈ°μ‘΄ hook μ„€μ • 제거 ν›„ μž¬μ„€μΉ˜
./uninstall.sh
./install.sh

λ³€κ²½ 사항:

ν•­λͺ© 이전 ν˜„μž¬
둜그 디렉토리 ~/.claude/hook-logger/ ~/.claude/claude-pulse/
MCP μ„œλ²„λͺ… hook-logger claude-pulse
MCP 도ꡬ 접두사 mcp__hook-logger__* mcp__claude-pulse__*

Note: 둜그 디렉토리λ₯Ό λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜μ§€ μ•ŠμœΌλ©΄ κΈ°μ‘΄ 둜그 데이터λ₯Ό λŒ€μ‹œλ³΄λ“œμ—μ„œ λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€.

Uninstall

cd claude-pulse
./uninstall.sh

Note: 둜그 νŒŒμΌμ€ ~/.claude/claude-pulse/에 λ³΄μ‘΄λ©λ‹ˆλ‹€. ν•„μš” μ—†λ‹€λ©΄ μˆ˜λ™μœΌλ‘œ μ‚­μ œν•˜μ„Έμš”.

License

MIT

About

Event logging system + web dashboard for Claude Code hooks

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors