loki-activity — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited loki-activity (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Grafana Lokiに蓄積されたClaude CodeのOTELテレメトリから、 プロジェクト別の作業時間を集計してレポートする。
logcli、jq、git がインストール済み(activity.sh 起動時に必須チェック)LOKI_ADDR, LOKI_USERNAME, LOKI_PASSWORD が設定済みuv および Python 3.10+ がインストール済み(PEP 723 で rich / Pillow を自動インストール)service_name="claude-code"、service_namespace、event_name、event_timestamp。これらが Claude Code の OTEL テレメトリとして揃っている前提で動く。date コマンドで現在の UTC / JST を確認する。AI のシステムプロンプト上の時刻と実行ホストの時刻にズレがあると、フィルタ範囲を取り違える。--all を指定した場合、--project および自動フィルタ(カレントリポジトリ名)は無効になる。all / week / month はそれぞれ「全プロジェクト」「過去 7 日」「過去 30 日」として解釈される。同名のプロジェクトを指したい場合は --project all 等を明示する。$ARGUMENTS を以下のルールで解析する:
| ユーザー入力 | 解釈 | スクリプト引数 |
|---|---|---|
| (なし) | 過去24時間、現在のプロジェクト | (デフォルト: カレントリポジトリ名で自動フィルタ) |
3 | 過去3日分、現在のプロジェクト | --since 72h |
all | 過去24時間、全プロジェクト | --all |
all 3 | 過去3日分、全プロジェクト | --all --since 72h |
aleister | 過去24h、特定プロジェクト | --project aleister |
aleister 7 | 過去7日、特定プロジェクト | --project aleister --since 168h |
week | 過去7日、現在のプロジェクト | --since 168h |
month | 過去30日、現在のプロジェクト | --since 720h |
all week | 過去7日、全プロジェクト | --all --since 168h |
all --overall | 過去24時間、全プロジェクト合算のみ | --all + heatmap.py --overall |
数値はN日分を意味し、N * 24 で時間に換算する。 week と month はそれぞれ 168h、720h のエイリアス。 文字列は service_namespace の部分一致フィルタとして扱う。 all を指定すると全プロジェクトを対象にする。 デフォルトではカレントリポジトリ名(git rev-parse --show-toplevel のbasename)で自動フィルタする。Git 管理外のディレクトリで実行された場合はフィルタが空になり、結果として全プロジェクトを対象にする(--all を指定した場合と同等)。
解析した引数をもとに、以下のようにスクリプトを呼び出す:
bash ~/.claude/skills/loki-activity/scripts/activity.sh [OPTIONS]オプション:
--since DURATION — 期間(logcli形式: 24h, 168h, 720h)--project NAME — プロジェクトフィルタ(service_namespace部分一致)--all — 全プロジェクトを対象にする(デフォルトのカレントリポジトリ自動フィルタを無効化)--detail — 全イベント一覧を出力する(デフォルトはサマリー)--interval N — サマリーの区切り分数(デフォルト: 10、60の約数を推奨: 5, 10, 15, 20, 30)--project も --all も指定しない場合、カレントリポジトリ名で自動的にフィルタされる。
時間帯ごとにイベント数を集計した要約を返す。
{
"query_params": { "since": "24h", "project_filter": "sandbox", "mode": "summary", "interval_minutes": 10 },
"projects": [
{
"namespace": "sandbox",
"interval_minutes": 10,
"slots": [
{ "time_utc": "2026-04-05T04:30:00Z", "total": 35, "user_prompt": 3, "api_request": 11, "tool_use": 21 },
{ "time_utc": "2026-04-05T04:40:00Z", "total": 23, "user_prompt": 2, "api_request": 6, "tool_use": 15 }
]
}
]
}各スロットのフィールド:
time_utc — 時間帯の開始時刻(UTC)total — その時間帯のイベント総数user_prompt — 人間がプロンプトを送信した回数(人間のアクティビティの確実な証拠)api_request — Claude APIリクエスト数(Claudeが処理中。数分から10分かかることもある)tool_use — ツール実行関連のイベント数(tool_result + tool_decision)全イベントの一覧を時系列で返す。データ量が多くなるため、特定の時間帯を詳しく調べたい場合に使う。
サマリーのスロット一覧を見て、「人間が作業していたと思われるひとかたまりの時間帯」を判断する。 機械的な固定閾値で切るのではなく、文脈を読んで判断すること。
判断の目安:
user_prompt が含まれるスロットは人間が能動的に操作していた証拠user_prompt がなくても api_request や tool_use が多いスロットは、Claudeが処理中(数分から10分かかることもある)タイムスタンプはUTCからJST(+9時間)に変換して表示する。
プロジェクトごとに作業ブロックの開始・終了時刻と推定時間を出す。 複数プロジェクトがある場合はプロジェクト別にまとめる。
データが0件の場合は「該当期間にイベントが見つかりませんでした」と報告する。
ユーザーが「ヒートマップ」「heatmap」「可視化」等と言った場合、activity.shの出力をヒートマップスクリプトにパイプして表示する。
bash ~/.claude/skills/loki-activity/scripts/activity.sh [OPTIONS] | uv run ~/.claude/skills/loki-activity/scripts/heatmap.py [--color]--color をつけるとTrueColorモード(GitHubの草風の緑グラデーション)--metric で表示メトリクスを変更可能(total, user_prompt, api_request, tool_use)--image で iTerm2 インライン画像、--output FILE で PNG ファイル保存、--overall で全プロジェクト合算のみ表示(複数プロジェクトが対象のときに有効)--all, --since, --project)はそのまま使える--detail は heatmap.py にパイプできない(detail 出力は events 構造、heatmap.py は slots 構造を要求するため)エラー: logcli の実行に失敗しました (exit code: N) を出力する。認証情報(環境変数)の不足、Loki 接続不可、クエリ構文エラー等が主な原因。logcli, jq, git のいずれかが PATH になければ exit 1 で エラー: ... が見つかりません を出して終了する。projects: [](空配列)の JSON を返す。「該当期間にイベントが見つかりませんでした」と報告する。--all と同等)。エラーにはならない。~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.