mcpField
C
chat-history

chat-history

github.com/tyrchenエージェントワークフロー4574 回インストール29 週間前に更新
リポジトリ

chat-history について

chat-historyは、Claude Codeのプロジェクトセッションから外部ユーザーのメッセージを抽出し、日付別のMarkdownログに保存するスキルです。プロンプトや指示を記録したい開発者向けで、ユーザー以外の内容を除外します。

主な機能

  1. 01JSONLセッションから外部ユーザーメッセージを抽出
  2. 02メタデータ、ツール結果、継続メッセージを除外
  3. 03日付別にログを整理
  4. 04.chats配下にMarkdownファイルを作成

活用シーン

  1. 01Claude Codeの会話を後から参照できるよう記録
  2. 02プロジェクトセッションからユーザー入力を出力
  3. 03日付別の指示ややり取りのログを維持

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tyrchen/claude-skills --skill chat-history

インストール後、Claude Code で/chat-historyを入力して読み込まれたか確認します。

同梱ファイルextract-chats.sh

詳細

チャット履歴の抽出

Claude Code のセッション履歴(~/.claude/projects/)からユーザー入力を抽出し、日付ごとの Markdown ファイルとしてプロジェクトの .chats ディレクトリに整理します。

このスキルを使う場面

次のことを行いたい場合に、このスキルを使います。

  • Claude Code のセッションからセッション履歴を抽出する
  • 後で参照できるように会話を記録する
  • 日付順に整理した指示ログを作成する
  • .jsonl セッションファイルからユーザー入力をエクスポートする
  • Claude とのやり取りの変更履歴を維持する

仕組み

Claude Code はセッションデータを ~/.claude/projects/{project-path-encoded}/ に .jsonl ファイルとして保存します。各ファイルには次のメッセージが含まれます。

  • type: "user" - ユーザーメッセージ
  • userType: "external" - 外部ユーザー(システム/エージェントではない)
  • message.content - 実際のメッセージ内容

このスキルは、意味のあるユーザーの指示を抽出し(システムコマンド、ツールの結果、セッションの継続メッセージを除外)、日付ごとに .chats/{YYYYMMDD}.md ファイルへ整理します。

手順

ステップ 1:プロジェクトのセッションディレクトリを特定する

セッションディレクトリは、現在の作業ディレクトリのパスから決まります。

  • パス内の / を - に置き換える
  • 先頭に - を付ける
  • 場所:~/.claude/projects/{encoded-path}/
# Example: /Users/tchen/projects/tubi/titc
# Becomes: -Users-tchen-projects-tubi-titc
# Full path: ~/.claude/projects/-Users-tchen-projects-tubi-titc/
ステップ 2:日付ごとにセッションファイルを探す

セッションファイルを一覧表示し、更新日時で絞り込みます。

# List all main session files (excluding agent-* files) for a specific date
ls -la ~/.claude/projects/{project-dir}/*.jsonl | grep "Dec 25" | grep -v agent-
ステップ 3:ユーザー入力を抽出する

jq を使って jsonl ファイルからユーザーメッセージを抽出します。

cat {session-file}.jsonl | jq -r '
  select(.type == "user" and .userType == "external" and (.isMeta | not)) |
  .message.content |
  if type == "string" then . else empty end
' | grep -v "^Caveat:" \
  | grep -v "^<command" \
  | grep -v "^<local-command" \
  | grep -v "^This session is being continued" \
  | grep -v "^<user-prompt-submit-hook>" \
  | grep -v "^Analysis:" \
  | grep -v "^$"
ステップ 4:.chats ファイルを作成/更新する

次の形式で .chats/ ディレクトリに Markdown ファイルを作成します。

# Instructions

## {task title}

{user instruction}

## {another task title}

{another user instruction}
ステップ 5:変更をコミットする

チャットファイルの作成/更新後、次のコマンドでコミットします。

git add .chats/*.md
git commit -m "docs(chats): add session history for {date range}"

ファイル形式

各 .chats/{YYYYMMDD}.md ファイルは、次の条件を満たす必要があります。

  • # Instructions ヘッダーで始める
  • 主なタスク/指示ごとに ## を使う
  • 実際のユーザー入力テキストを含める
  • 関連する指示は同じ見出しの下にまとめる
  • コードブロックと書式を保持する

出力例

.chats/20251225.md:

# Instructions

## implement feature X

based on @specs/feature-x.md implement all phases entirely

commit the code and test

## fix bug Y

investigate why component Z is not working

use sub agents to analyze the issue in parallel

フィルタリングルール

含めるもの:

  • ユーザーからの直接的な指示やリクエスト
  • コードベースに関する質問
  • タスクの仕様と要件

除外するもの:

  • システムコマンド(<command-name>、<local-command-stdout>)
  • セッション継続メッセージ
  • ツールの結果とエージェントの応答
  • フック通知(<user-prompt-submit-hook>)
  • 空行と注意書きのメッセージ

ワークフローの概要

  1. 現在の作業ディレクトリを取得する
  2. エンコード済みのプロジェクトパスを計算する
  3. セッションディレクトリを探す:~/.claude/projects/{encoded-path}/
  4. セッションを日付ごとに一覧表示する
  5. セッションがある日付ごとに、次の処理を行う。
    • すべてのセッションからユーザー入力を抽出する
    • .chats/{YYYYMMDD}.md を作成する
    • 内容が分かる見出しを付けて入力を整理する
  6. .chats/ ディレクトリが存在しない場合は作成する
  7. 必要に応じて変更をコミットする

ヘルパースクリプト

次の bash スニペットを使うと、プロジェクトのセッションディレクトリをすばやく探せます。

# Get encoded project path
PROJECT_PATH=$(pwd | sed 's|/|-|g' | sed 's|^|/|' | sed 's|^/|-|')
SESSION_DIR="$HOME/.claude/projects/$PROJECT_PATH"

# Check if exists
if [ -d "$SESSION_DIR" ]; then
    echo "Session directory: $SESSION_DIR"
    echo "Sessions by date:"
    ls -la "$SESSION_DIR"/*.jsonl 2>/dev/null | grep -v agent- | awk '{print $6, $7}' | sort -u
else
    echo "No session directory found for this project"
fi

メモ

  • agent-*.jsonl という名前のセッションファイルはサブエージェントのセッションであり、通常は直接的なユーザー入力を含みません
  • メインセッションファイルの名前には UUID 形式が使われます(例:01e78099-de0e-4424-845c-518638c8241e.jsonl)
  • .message.content フィールドには、文字列(ユーザーテキスト)または配列(ツールの結果)が入る場合があります
  • コミットする前に、抽出された内容が妥当であることを必ず確認してください

コメント