毎朝の作業ログをGitHub Actions + Discordで自動化する
AI並列作業が当たり前になってきて、「昨日何を作ったんだっけ」と感じる頻度が増えていませんか。
GitHubには作業記録が全部残っているはずなのに、朝になると思い出せない。
そこで、毎朝の作業ログを自動でまとめてDiscordに届ける仕組みを作りました。
朝6時に「ログイン機能の改善と新しいAPIを3本追加」といった全体概要と、プロジェクトごとのハイライトがDiscordに整理されて届く——そういう状態を作ると、git logを手で確認しなくていいし、振り返りが習慣になります。

今回は、その実装例を紹介していきます。
そうやって日々の作業を少しずつ自動化して、頭のメモリを空けていく——そういうことを意識的にやっていると、「これも自動化できるな」という目線が育ってきます。
そのあたりの概要は、まずこちらの記事もご覧ください。
「Discordに自動通知する」と聞くとBotを思い浮かべがちですが、この仕組みではBotをサーバーに常駐させる必要はありません。
GitHub Actionsが処理を実行して、その結果をDiscordのWebhook URLにHTTP POSTするだけ。
Discord側からすれば外部サービスからメッセージが届いただけで、Bot常駐は不要です。
Botが必要になるのは、Discordからのメッセージや操作をトリガーにしたい場合です。
コミットログをAIに整理してもらう

このワークフローのポイントは、コミットログをそのまま送るのではなく、AIに内容の要約をさせる点です。
fix: typo や wip みたいなメッセージが混ざったコミット一覧を毎朝受け取っても、読む気がしない。情報の羅列は振り返りにならないという感じがありました。
AIに渡すのはJSON形式のコミット情報(リポジトリ名・コミットメッセージ・差分行数)。そこからリポジトリごとのハイライトと全体概要をJSON形式で生成してもらいます。
SYSTEM_PROMPT の全文
const SYSTEM_PROMPT = `あなたは開発者の作業振り返りアシスタントです。
GitHubコミット履歴から、開発者が朝に読んで前日の作業を思い出せるような
簡潔で実用的なサマリーを生成してください。
ルール:
- 作業の良し悪しを評価しない
- コミットメッセージからテーマを抽出し、自然な日本語でまとめる
- リポジトリごとに1-3個のハイライトを箇条書きで出力
- 出力は以下のJSON形式で返す(JSONのみ出力)
{
"title": "string",
"overview": "string",
"repos": [{"name": "string", "highlights": ["string"]}],
"stats": {"total_commits": 0, "total_additions": 0, "total_deletions": 0, "repo_count": 0}
}`;ルールを設けることで、改善提案などが出ないようにしレポートとして整理された内容を出すようにしています。あくまで事実をまとめるスタイルですね。
GitHubから昨日の作業を集める

GitHubにはコミット履歴を取得するAPIがいくつかあります。その中でも「最近pushされたリポジトリの一覧を取得して、そこから対象期間のコミットを集める」という2段階の構成を選んでいます。
なぜかというと、GitHubのユーザー活動をまとめて取れるEvents APIは取得上限が300件・過去30日以内という制限があって、複数リポジトリを活発に使っていると昨日分がこぼれ落ちる可能性があります。
また、リアルタイム性がなく最大6時間遅延することもあるため、前日分を確実に集めるにはリポジトリ単位のCommits APIの方が適しています。
リポジトリ単位で集める方が取りこぼしがなく、プロジェクトごとのハイライトに整理しやすいというメリットもあります。
GET /user/repos?sort=pushed&per_page=100
GET /repos/ryryo/my-project/commits?since=2026-05-06T00:00:00Z&until=2026-05-07T00:00:00Z&author=ryryo&per_page=100
複数リポジトリを同時並行で確認するので、リポジトリが増えてもさほど時間がかかりません。
読みやすいカード形式でDiscordに届ける
Discordには、メッセージをカード状に整形して表示する「Embed」という機能があります。タイトル・本文・項目ごとのフィールド・フッターが色付きの枠でまとまって表示されるので、普通のテキスト投稿よりずっと読みやすい。
このワークフローではそのEmbedを使って、全体概要・リポジトリごとのハイライト・対象期間がまとまった形で届くようにしています。
export function buildEmbed(summary: Summary, period: { from: string; to: string }): DiscordEmbed {
return {
title: `📊 Daily Summary — ${period.to.slice(0, 10)}`,
description: summary.overview,
color: 3447003,
fields: summary.repos.map((repo) => ({
name: `📁 ${repo.name}`,
value: repo.highlights.map((h) => `- ${h}`).join("\n"),
inline: false,
})),
footer: {
text: `対象期間: ${formatJstDateTime(period.from)} ~ ${formatJstDateTime(period.to)} JST`,
},
};
}
GitHub側で設定すること
このワークフローはGitHubのサーバー上で動くので、設定も手元のPCではなくGitHub側で行います。
自分のPCに .env ファイルを置いても、GitHub Actionsが実行されるときには参照されない——「動く場所が違う」というイメージです。
設定は2種類あります。
Secrets(シークレット) — APIキーなどの秘密情報。GitHubのリポジトリ設定画面から登録します。
登録後は画面上でも中身が見えなくなる仕組みで、スクリプト内から環境変数として読み込めます。今回必要なのは3つです。
DISCORD_WEBHOOK_URL: DiscordチャンネルのWebhook URL(チャンネル設定から発行)GH_PAT: GitHubのPersonal Access Token(コミット履歴を読む権限が必要)ANTHROPIC_API_KEY: Claude APIのキー(コミットログをサマリーに変換するために使う)
workflowファイル — 「いつ、何を実行するか」を定義するYAMLファイル。リポジトリの .github/workflows/ フォルダに置くだけで、GitHubが自動的に認識して動かしてくれます。
スケジュール実行(cron)と手動実行(任意の日付を指定)の両方を設定しておくと、翌朝まで待たずに動作確認できて便利です。
on:
schedule:
- cron: '0 21 * * *' # UTC 21:00 = JST 06:00
workflow_dispatch:
inputs:
date:
description: '対象日 (YYYY-MM-DD)'
required: false
まとめ
作業ログを手で確認する習慣って、地味に続かないんですよね。
「今日こそ振り返ろう」と思っても、git logを開いてコミット一覧を眺めると「…で、何が言いたいんだっけ」ってなる。
このワークフローを動かしてから、朝の感覚が変わりました。コーヒーを淹れてDiscordを開くと、昨日の作業が「ログイン機能を改善して、APIを3本追加した日」みたいな文章で届いている。
それだけで「あ、そうか。昨日はそういう日だったな」と自然に思い出せる。
振り返りが「やること」ではなく「届くもの」になると、習慣にする必要すらなくなります。
毎朝の最初の5分が、昨日の積み上げを確認してから今日を始める時間に変わる——その小さな変化が、長く作業を続けるうえで意外と効いてきます。
ぜひあなたもそんな自動化されたフローを整えてみてください。
