프로젝트별 Claude Code 세션 시간을 집계하여 리포트 생성. 일별/주별/월별 시간 분포를 Obsidian 테이블로 시각화. "시간 추적", "프로젝트 시간", "time tracking" 등의 요청 시 자동 적용.
Claude Code 세션 로그의 타임스탬프를 분석하여 프로젝트별 작업 시간을 집계하고, 일별/주별/월별 리포트를 생성하는 skill.
/project-time-tracker # 이번 주 시간 리포트
/project-time-tracker daily # 오늘 시간 리포트
/project-time-tracker weekly # 이번 주 시간 리포트 (기본값)
/project-time-tracker monthly # 이번 달 시간 리포트
/project-time-tracker 2026-01-15 # 특정 날짜 시간 리포트
| 항목 | 경로 |
|---|---|
| 세션 로그 | ~/.claude/projects/[encoded-path]/*.jsonl |
| 출력 | ~/OneDrive/my-obsidian-vault/analytics/time-tracking/ |
~/.claude/projects/
├── -Users-msbaek-project-a/
│ ├── abc123.jsonl
│ └── def456.jsonl
├── -Users-msbaek-project-b/
│ └── ghi789.jsonl
└── ...
세션 시간 계산:
timestamp 필드timestamp 필드# 세션 시작/종료 시간 추출
jq -s '[.[0].timestamp, .[-1].timestamp] |
{start: .[0], end: .[1],
duration_min: ((.[1] | fromdateiso8601) - (.[0] | fromdateiso8601)) / 60}' \
session.jsonl
# 모드에 따른 기간 설정
MODE="${1:-weekly}"
case "$MODE" in
daily|today)
START_DATE=$(date +%Y-%m-%d)
END_DATE=$(date -v+1d +%Y-%m-%d)
PERIOD_NAME="일일"
;;
weekly)
START_DATE=$(date -v-$(($(date +%u) - 1))d +%Y-%m-%d) # 이번 주 월요일
END_DATE=$(date -v+1d +%Y-%m-%d)
PERIOD_NAME="주간"
;;
monthly)
START_DATE=$(date +%Y-%m-01) # 이번 달 1일
END_DATE=$(date -v+1d +%Y-%m-%d)
PERIOD_NAME="월간"
;;
*)
# 특정 날짜
START_DATE="$MODE"
END_DATE=$(date -j -f "%Y-%m-%d" -v+1d "$MODE" +%Y-%m-%d)
PERIOD_NAME="일일"
;;
esac
echo "분석 기간: $START_DATE ~ $END_DATE ($PERIOD_NAME)"
# 기간 내 수정된 세션 로그 찾기
find ~/.claude/projects -name "*.jsonl" \
-newermt "$START_DATE 00:00:00" \
! -newermt "$END_DATE 00:00:00" 2>/dev/null
# 프로젝트 경로 디코딩 함수
decode_project_path() {
echo "$1" | sed 's/-/\//g' | sed 's/^\/Users\/msbaek\///'
}
# 각 세션 시간 계산 및 프로젝트별 집계
for session in $(find ~/.claude/projects -name "*.jsonl" -newermt "$START_DATE"); do
PROJECT_DIR=$(dirname "$session" | xargs basename)
PROJECT_NAME=$(decode_project_path "$PROJECT_DIR")
# 세션 시간 계산 (분 단위)
DURATION=$(jq -s '
if length > 1 then
(((.[-1].timestamp | fromdateiso8601) - (.[0].timestamp | fromdateiso8601)) / 60) | floor
else
0
end
' "$session" 2>/dev/null || echo "0")
echo "$PROJECT_NAME: ${DURATION}분"
done | sort | uniq -c | sort -rn
# 각 세션의 날짜별 시간 분포
for session in $(find ~/.claude/projects -name "*.jsonl" -newermt "$START_DATE"); do
# 세션 시작 날짜 추출
SESSION_DATE=$(jq -r '.[0].timestamp[:10]' "$session" 2>/dev/null)
# ... 집계
done
---