はじめに
こんばんは!
株式会社うるるのゆうだいです!
せっかくのQiita Tech Festaの期間なので、今日は時間がないので簡易的ですが、記事投稿をしてみようと思います!
今日はここ最近活用しているClaude Codeでの日報の作成を紹介します!
日報作成について
作成意図としては、最近Claude Codeを並列で動かしつつ業務を進めることが多いのですが、一日にやったことが多くなったりすると次の日に昨日やったことってなんだっけ?とかになりがちだったのと、月の振り返りを行う際も何をやっていたか覚えていないなとなったりもしたので、記録をつけていこう!という気持ちでClaude Codeと相談しながら作成しました。
仕組みはClaude Codeは~/.claude/projects/に会話の履歴が残っていくのですが、それを本日分で分析させ、Claude Codeを使って行った業務をアウトプットとして、Slack(コネクタで接続)とローカル環境に残していくという形になります。
そして後に乗せるプロンプトをClaude Desktop上のルーチンのローカルに設定を行い自動で実行させるように設定をすると完了になります。
実プロンプト
注意
コードブロックで貼り付ける都合上バッククォートの前にバックスラッシュを置いています。
また、プロンプト内部でもいくつかマスクしている部分(slackのIDやproject名)があるので、そちらを埋めつつ利用してください。
またghやslackコネクタを利用しているので、そちらを事前に設定しておくとスムーズです。
今日(JST)のClaude Code作業内容を抽出し、**成果ベース**の日報を1つ生成して、**Slackへの投稿**と**ローカルジャーナルへの保存**の両方を行ってください。
日報本文は1回だけ生成し、Slackとローカルで内容がズレないようにすること(出力先が2つあるだけで、成果の中身は同一)。
## 手順
1. ~/.claude/projects/ 配下の全 *.jsonl ファイル(subagentsディレクトリは除外)から、JSTで今日 00:00〜23:59 のユーザー入力を抽出する。
- 注意: jsonl内の timestamp はUTC。JST = UTC+9 なので、JSTでの「今日」を UTC範囲に変換する(例: JST 6/24 → UTC `2026-06-23T15:00:00`〜`2026-06-24T15:00:00`)。
- `find -newermt` は候補ファイルの絞り込みにのみ使う。**最終的な日付判定は jq 内の timestamp 比較で行う**(mtimeが今日でも中身は古い入力しかない場合がある)。
- jq で `.type=="user"` かつ `.message.content` が文字列のものを対象に、timestamp と本文を取得。
- **実務注意**: jsonlのパスは `-Users-...` のように `-` で始まるため、`jq -f filter.jq <file>` に相対パスで渡すとオプション扱いされ usage エラーになる。**絶対パス(`/`始まり)か find の出力をそのまま渡す**こと。フィルタはヒアドキュメントでファイル化するとシェルのクォート崩れを避けられる。
- 以下は除外する:
- `<local-command-caveat>` / `<local-command-stdout>` / `<command-name>` / `<command-message>` で始まるメタ行
- `<scheduled-task>` で始まる自動実行のトリガ
- 「こんにちは」「OKです」「どうぞ」など実作業を含まない相槌・雑談
- Context Usage 系の貼り付け
- This session is being continued ... のサマリ
2. プロジェクトごとにグループ化し、各プロジェクトで**その日前進した「成果」**を洗い出す。
- プロジェクト名は ~/.claude/projects/ のディレクトリ名から、先頭の `hoge` を除いて読みやすい形に変換。worktree配下は本体リポジトリに寄せてよい。
- 同一プロジェクトの複数セッションは1つにまとめる。
- **成果の単位** = 完了・前進した Issue / PR / 機能追加 / 環境整備 など。「調査した」「立ち上げた」「コミットした」「UIを微調整した」のような**過程・中間ステップは成果ではない**ので書かない。
- 各 Issue/PR/タスクには**内容の一言**を添える。内容はセッションログ内の `gh issue view` 出力やユーザー入力から1行で要約する(不足時は `gh issue view <番号> --repo <repo>` で補完可)。
3. 以下のフォーマットでSlackに投稿する(チャンネルID: hoge = #times-homma)。**過程は載せず、何が前進したかと内容の一言だけ**にする。
- 1行目: `**日報 YYYY-MM-DD (claude codeの使用について)**`
- プロジェクトごとに**番号なしの見出し**: 例 `**hoge**`。
- 見出し直下に成果を箇条書き。**1行 = 1成果**、形式は `• <成果> — <内容を一言>`。
- 例: `• Issue #1000 を実装・PR作成 — TOPページの通知の表示の改善`
- やり取りの過程・中間ステップ(調査/起動/コミット/何度直したか/UI往復 等)は**書かない**。
- その日に効いた設計判断・運用方針が1〜2点あれば、末尾に `_メモ: ..._` で簡潔に添える(任意・無ければ省略)。
- 時間帯の注記(午前/夕方/夜 など)は入れない。
- 「※更新版」「(本セッション)」のようなメタ表現は入れない。
- ファイル名・コマンド名・関数名・Issue文言は `バッククォート` で囲む。重要な概念や設計判断は **太字** で強調。
出力イメージ:
\```
**日報 2026-06-24 (claude codeの使用について)**
**hoge**
• Issue #1000 を実装・PR作成 — TOPページの通知の表示の改善
• Issue #2000 を実装・PR作成 — LPの登録フォーム周辺に「すでにアカウントをお持ちの方はこちらからログイン」リンクを設置
**環境・ワークフロー整備**
• `/start-task` スキル整備 — Issue確認→ブランチ→worktree作成を一気通貫にする開発フロー
_メモ: メインチェックアウトへの適用は worktree 競合を避けるため必ず確認を取る運用に_
\```
4. **Slackに投稿する(親メッセージ + 返信スレッド方式)。** チャンネルには見出し1行だけを残し、本文はそのスレッド返信に入れる。
- まず**親メッセージ**として `**日報 YYYY-MM-DD (claude codeの使用について)**` の1行だけを channel_id=XXXXXXXXXX に投稿する(下書きではなく本送信)。返ってきた `message_ts` を控える。
- 次に**返信スレッド**として、手順3で生成した日報本文(親と重複する先頭の `**日報 ...**` 行は省く)を、`thread_ts` に親の `message_ts` を指定して投稿する。`reply_broadcast` は指定しない(チャンネルには再掲せず、スレッド内に留める)。
- 重複投稿を避けるため、投稿前に slack_read_channel で同じ日の `日報 YYYY-MM-DD` 親メッセージが既にあるか確認し、あれば親・返信とも投稿をスキップする。
- 投稿した場合は、親メッセージのリンクを出力に含める。
5. **ローカルの環境にも保存する。** 後から個人評価などで「この時期に何をやっていたか」を振り返るための蓄積。
- 保存先: `~/work-journal/daily/YYYY/MM/YYYY-MM-DD.md`(年・月のディレクトリは `mkdir -p` で作成する。日付はJSTの今日)。
- **既にファイルが存在する場合は上書きしない**(ユーザーが手で追記した `## メモ(手動追記)` を保護するため)。存在する場合はスキップして「ローカル分は保存済み」と出力する。
- ファイルの中身は **frontmatter + Slackと同一の日報本文 + 空の手動メモ欄** とする。frontmatter の `issues` / `prs` は、リポジトリをまたいで番号が衝突しうるので `worker#505` / `user#2499` のように **どちら側か prefix を付けた文字列**で列挙する。
- フォーマット:
\```markdown
---
date: YYYY-MM-DD
projects: [hoge, huga]
issues: [hoge_issue#505, huga_issue#508]
prs: [hoge#509, huga#2501]
---
# 日報 YYYY-MM-DD
(手順3で生成したSlack本文と同一。先頭の `**日報 ...**` 行は上の見出しと重複するので省いてよい)
## メモ(手動追記)
-
\```
- ファイル書き込みは Write ツールで行う。Slackの投稿可否とは独立に判断する(Slackが投稿済みでも、ローカルファイルが無ければ保存する)。
## 実作業がない日の扱い
抽出後に実質的なユーザー入力が0件、または全て除外対象だった場合:
- Slack: 親メッセージ `**日報 YYYY-MM-DD(曜日)**` を投稿し、その返信スレッド(`thread_ts` 指定)に `本日は Claude Code での作業記録なし。` とだけ送る。
- ローカル: 同じ趣旨の本文(frontmatter の `issues` / `prs` は空配列)で同様にファイルを保存する。記録の欠落を作らないため、作業のない日もファイルは残す。
## 注意
- このルーチンはユーザー不在で実行される。確認は取らず、判断が必要な箇所は自律的に決めて進める。
終わりに
され、本日は自分が使用しているClaude Codeでの日報の作成を紹介しました!
また機会があればアウトプットを続けたいので記事は書いていこうと思います!