Skip to content
Back to skills

Project Time Tracker

ASecurity

프로젝트별 Claude Code 세션 시간을 집계하여 리포트 생성. 일별/주별/월별 시간 분포를 Obsidian 테이블로 시각화. "시간 추적", "프로젝트 시간", "time tracking" 등의 요청 시 자동 적용.

  • 666 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 2, 2026
ai-agentsbash

Works with

  • claude code

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add majiayu000/claude-skill-registry --skill project-time-tracker --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Project Time Tracker?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Project Time Tracker
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-project-time-tracker/badge)](https://www.skillsdirectory.com/skills/majiayu000-project-time-tracker)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: project-time-tracker
description: |
  프로젝트별 Claude Code 세션 시간을 집계하여 리포트 생성.
  일별/주별/월별 시간 분포를 Obsidian 테이블로 시각화.
  "시간 추적", "프로젝트 시간", "time tracking" 등의 요청 시 자동 적용.
---

# Project Time Tracker Skill

## 개요

Claude Code 세션 로그의 타임스탬프를 분석하여 **프로젝트별 작업 시간**을 집계하고, 일별/주별/월별 리포트를 생성하는 skill.

## 사용 방식

```bash
/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` |
| 출력 | `~/DocumentsLocal/msbaek_vault/analytics/time-tracking/` |

---

## 데이터 구조

### 세션 로그 위치
```
~/.claude/projects/
├── -Users-msbaek-project-a/
│   ├── abc123.jsonl
│   └── def456.jsonl
├── -Users-msbaek-project-b/
│   └── ghi789.jsonl
└── ...
```

### JSONL 타임스탬프 추출

세션 시간 계산:
- **시작 시간**: 첫 번째 레코드의 `timestamp` 필드
- **종료 시간**: 마지막 레코드의 `timestamp` 필드
- **세션 시간**: 종료 - 시작

```bash
# 세션 시작/종료 시간 추출
jq -s '[.[0].timestamp, .[-1].timestamp] |
  {start: .[0], end: .[1],
   duration_min: ((.[1] | fromdateiso8601) - (.[0] | fromdateiso8601)) / 60}' \
  session.jsonl
```

---

## 실행 절차

### Step 1: 분석 기간 결정

```bash
# 모드에 따른 기간 설정
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)"
```

### Step 2: 해당 기간 세션 로그 수집

```bash
# 기간 내 수정된 세션 로그 찾기
find ~/.claude/projects -name "*.jsonl" \
  -newermt "$START_DATE 00:00:00" \
  ! -newermt "$END_DATE 00:00:00" 2>/dev/null
```

### Step 3: 프로젝트별 시간 집계

```bash
# 프로젝트 경로 디코딩 함수
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
```

### Step 4: 일별 분포 계산 (주간/월간 리포트용)

```bash
# 각 세션의 날짜별 시간 분포
for session in $(find ~/.claude/projects -name "*.jsonl" -newermt "$START_DATE"); do
  # 세션 시작 날짜 추출
  SESSION_DATE=$(jq -r '.[0].timestamp[:10]' "$session" 2>/dev/null)
  # ... 집계
done
```

### Step 5: 리포트 생성

#### 일일 리포트
```markdown
---
created: {DATE}
type: time-tracking
period: daily
date: {TARGET_DATE}
tags:
  - analytics/time
  - analytics/daily
---

# 시간 추적 - {TARGET_DATE}

## 오늘 작업 시간

| 프로젝트 | 세션 수 | 작업 시간 |
|---------|--------|----------|
| project-a | 3 | 2h 30m |
| project-b | 2 | 1h 15m |
| **합계** | **5** | **3h 45m** |

## 세션 상세

| 시작 | 종료 | 프로젝트 | 시간 |
|-----|-----|---------|-----|
| 09:30 | 11:00 | project-a | 1h 30m |
| 14:00 | 15:00 | project-b | 1h 00m |
| ... | ... | ... | ... |
```

#### 주간 리포트
```markdown
---
created: {DATE}
type: time-tracking
period: weekly
week: {WEEK_NUM}
tags:
  - analytics/time
  - analytics/weekly
---

# 주간 시간 추적 - {WEEK_NUM}

> 분석 기간: {START_DATE} (월) ~ {END_DATE} (금)

## 프로젝트별 총 시간

| 프로젝트 | 세션 수 | 총 시간 | 비율 |
|---------|--------|--------|-----|
| project-a | 12 | 8h 30m | 45% |
| project-b | 8 | 5h 20m | 28% |
| project-c | 5 | 3h 10m | 17% |
| 기타 | 3 | 1h 50m | 10% |
| **합계** | **28** | **18h 50m** | **100%** |

## 일별 시간 분포

| 프로젝트 | 월 | 화 | 수 | 목 | 금 | 합계 |
|---------|-----|-----|-----|-----|-----|------|
| project-a | 2h | 1h30m | 2h | 1h30m | 1h30m | 8h30m |
| project-b | 1h | 1h | 1h30m | 1h | 50m | 5h20m |
| ... | ... | ... | ... | ... | ... | ... |

## 일별 총 작업 시간

| 요일 | 세션 수 | 총 시간 |
|-----|--------|--------|
| 월 | 5 | 3h 30m |
| 화 | 6 | 4h 00m |
| 수 | 7 | 4h 15m |
| 목 | 5 | 3h 45m |
| 금 | 5 | 3h 20m |
```

#### 월간 리포트
```markdown
---
created: {DATE}
type: time-tracking
period: monthly
month: {MONTH}
tags:
  - analytics/time
  - analytics/monthly
---

# 월간 시간 추적 - {MONTH}

## 프로젝트별 총 시간

| 프로젝트 | 세션 수 | 총 시간 | 비율 |
|---------|--------|--------|-----|
| ... | ... | ... | ... |

## 주간별 분포

| 프로젝트 | W01 | W02 | W03 | W04 | 합계 |
|---------|-----|-----|-----|-----|------|
| project-a | 8h | 10h | 7h | 9h | 34h |
| ... | ... | ... | ... | ... | ... |

## 일별 추이 (그래프용 데이터)

| 날짜 | 시간(분) |
|-----|---------|
| 01 | 180 |
| 02 | 210 |
| ... | ... |
```

---

## 시간 계산 규칙

### 세션 시간 산정
- **기본 방식**: 첫 레코드 ~ 마지막 레코드 시간 차이
- **공백 처리**: 10분 이상 공백은 미활동으로 간주하여 제외 (선택적)
- **최소 단위**: 5분 이하 세션은 5분으로 올림

### 시간 형식
| 분 | 표시 형식 |
|----|----------|
| 30 | 30m |
| 60 | 1h |
| 90 | 1h 30m |
| 150 | 2h 30m |

```bash
# 분 → 시간:분 변환
format_duration() {
  local mins=$1
  local hours=$((mins / 60))
  local remaining=$((mins % 60))
  if [ $hours -gt 0 ]; then
    echo "${hours}h ${remaining}m"
  else
    echo "${remaining}m"
  fi
}
```

---

## 에러 처리

- 세션 없음: "해당 기간에 Claude Code 세션 없음" 반환
- 타임스탬프 없음: 해당 세션 건너뛰기
- 파싱 오류: 세션 건너뛰고 계속 진행

---

## 관련 Skill

- `weekly-claude-analytics`: 주간 종합 분석 (시간 외 다른 지표 포함)
- `daily-work-logger`: 일일 작업 로그
- `usage-pattern-analyzer`: 도구 사용 패턴 분석

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.