はじめに
突然ですが、日報って書いてますか?
日報を書くことがあり、「この作業、地味に時間溶かしてるよな…」と気になりました。
なので、VS Code の GitHub Copilot Chat の Custom Agents 機能 (VS Code 上で動く Copilot Chat の拡張ポイント) で「日報を自動化するエージェント」をぱっと作ってみました。
エージェントで生成したアウトプットが下記の感じ。
VS Code の Copilot Chat に日本語で話しかけると、裏で Python の CLI を叩いてタスク時間を記録し、最後に貼り付け用の表(PNG / HTML)を出してくれます。
リポジトリは下記です。
https://github.com/yukurash/daily-report-agent
必要なもの
| 必要なもの | 用途 |
|---|---|
| VS Code | エディタ本体 |
| GitHub Copilot のサブスクリプション | Custom Agents を動かす LLM |
| GitHub Copilot Chat 拡張 | チャット UI / Custom Agents の実行基盤 |
| Python 3.10+ | CLI(計測・集計・レポート生成)の実行環境 |
| matplotlib | PNG 出力(初回 report 実行時に自動 pip install) |
CLI 用も作成したので、CLI だけでよければ Copilot なしでも単体で動きます。「LLM に頼らず自分でコマンド叩く派」の人は Python と CLI だけあれば OK です。
動いてる様子
実際のチャットはこんな感じです。
私: 設計レビューに 1h つけといて
Bot: ✅「設計レビュー」に 1.0h を追加しました(累計 1.00h)。
私: 会議A 0.5h 足しといて
Bot: ✅「会議A」に 0.5h を追加しました(累計 0.50h)。
私: Training 始めた
Bot: ▶「Training」を開始しました。
(…3 時間後…)
私: 終わって。今の合計出して
Bot: ⏹「Training」を停止(このセッション 181.9 分)。
・設計レビュー: 1.0h
・朝会: 0.5h
・Training: 3.0h
・1on1: 1.0h
私: 設計レビュー再開して
Bot: ▶「設計レビュー」を再開しました。
私: 終わって。
Bot: ✅「設計レビュー」に 1.5h を追加しました(累計 2.50h)。
私: 日報出して
Bot: 📄 日報を生成しました(4 件)。
outputs/YYYY-MM-DD/report.png
outputs/YYYY-MM-DD/report.html
最後に出てくる PNG をエクスプローラからお好みのノートツール(OneNote / Notion / Confluence など)にドラッグ&ドロップして、終わり。所要時間 5 秒。
ポイントは「カチッとボタンを押す UI ではなく、会話で操作する」ところです。start と打つのと「始めた」と書くのとでは、心理的コストがけっこう違う。気軽に書ける分、打刻し忘れが減ります(理屈の上では。後述)。
設計でいちばん悩んだのは「LLM にどこまで触らせるか」
最初、全部 LLM にやらせる構成で組み始めました。data.json を渡して「ここに今日のタスクを足して、合計を計算して、HTML 作って」と。
5 分で諦めました。
理由は単純で:
| 任せたかったこと | 実際に起きたこと |
|---|---|
| JSON を更新 | キーが勝手に消える、数値が文字列で返ってくる |
| 合計時間の計算 | たまに合わない(特に小数の足し算) |
| 同じ依頼への応答 | 毎回ちょっと違う形式で返る |
日報って「完全に決定的に動いてほしい」処理なんですよね。0.5h を 3 つ足したら 1.5h、毎回。当たり前だけど LLM はそれが苦手。
なので、こう分けました。
役割分担はこう。
| レイヤー | 担当 | 例 |
|---|---|---|
| Custom Agent (LLM) | 意図解釈だけ | 「設計レビューに 1h」→ add "設計レビュー" 1
|
| Python CLI | 状態管理・計算・出力。決定的に動く部分 | 0.5h 丸め、合計、PNG 生成 |
LLM には「考える役」だけやらせて、「やる役」は Python。これで JSON が破壊される事故はゼロになりました。
GitHub Copilot Chat の Custom Agents 機能の話
ご存知の方も多いと思いますが、GitHub Copilot Chat には Custom Agents という機能があります。(VS Code 上で動く Copilot Chat の拡張ポイント)
リポジトリに .github/agents/<name>.agent.md を置くだけで、Copilot Chat のエージェントピッカーから自分のエージェントを呼べます。
中身は YAML フロントマター + Markdown で下記が例です。
---
description: "日報を毎日書く人をサポートする日本語エージェント。USE WHEN: 日報、タスク開始、…"
name: "日報アシスタント"
tools: [execute, read, search]
model: ["Claude Sonnet 4.5 (copilot)", "GPT-5 (copilot)"]
---
あなたは **日報アシスタント** です。
ユーザーが「今日のタスクを記録して、終業時に日報を出す」のを助けるのが唯一の仕事です。
# 守るべき制約
- データを直接編集しない。必ず CLI 経由で変更する。
- 長い質問・フォームを出さない。聞くなら一度に 1 つ・短く。
...
ここで地味に効いてるのが tools: [execute, read, search] の行。edit を意図的に外しています。
つまり、LLM 自身は data.json を書き換えられない。書き換えたければ python src/daily_report.py を呼ぶしかない。「LLM の暴走を、ツール権限のレベルでガードする」 という設計です。プロンプトで「触るな」と言うより遥かに堅い。
公式ドキュメントの言い方を借りると、Custom Agent は「persistent persona with specific tool restrictions」。今回の用途にはぴったりでした。
CLI 側はただの普通のサブコマンド
エージェントが何をしているかというと、結局これらのコマンドを叩いてるだけです。
| サブコマンド | 用途 |
|---|---|
start "<name>" |
計測開始(同名タスクなら累積で再開) |
stop |
停止 |
switch "<name>" |
前を停止して別タスクへ |
status |
現在の状況 |
list |
今日のタスク一覧 |
add "<name>" <h> |
計測なしで時間を加算(=打刻し忘れの救済) |
edit <No> <h> |
累計時間を上書き |
rename <No> "<新>" |
タスク名変更 |
remove <No> |
タスク削除 |
report |
HTML / PNG を出力 |
add を入れた理由は、「打刻し忘れた」が現実には毎日起こるから。「30 分話してた会議、入れ忘れた…」って結局後付けで足すんですよね。最初は理想論で「ちゃんと start/stop しろ」と思ってましたが、現実に負けました。
ファイル配置はこんな感じで、1 日 = 1 フォルダ全部入り にしてます。
outputs/
├── 2026-05-08/
│ ├── data.json ← その日の状態
│ ├── report.html
│ └── report.png
└── 2026-05-12/
└── ...
「先週の月曜の日報もう一回見たい」が outputs/2026-05-04/report.png を開くだけで済む。捨てるのも Remove-Item 一発。これは作って良かった判断でした。
一日の例
ポイントは:
- 同じ名前で
startを呼ぶと自動で再開・累積されるので、「Training 再開」は新しいタスクにならない - 別タスクを
startした時点で、前のタスクは自動で停止 (switchを呼ばなくていい) -
reportを呼ぶと、計測中のタスクは自動で停止される (終業時の動作として自然)
このあたり、エージェント側で気を利かせて確認質問を増やすのではなく、CLI の挙動として「気を利かせる」 ようにしてあります。LLM に「再開しますか?」と聞かせると、対話が増えてイラつくので。
自分で使ってみての感想
良かった
- 「打刻し忘れた」が後付けでサクッと直せる。
add一発。これが思った以上に効いた - 画像 1 枚で貼り付けが完結する。OneNote でも Notion でも Confluence でも、ドラッグ&ドロップだけ
- VS Code を開きっぱなしの人なら、Copilot Chat に話すコストがほぼゼロ。「ついで」で書ける
微妙だった
- 発話バリエーションの認識がたまに揺れる。「終わって」「ストップ」「いったん止めて」「ちょっと中断」あたりを全部
stopにマップするのに、システムプロンプトをだいぶ書く羽目になった -
outputs/*を gitignore してるので、データはマシンに紐づく。複数 PC で使いたいならクラウド同期フォルダに symlink を張る等の工夫が必要 - 0.5h 単位の丸めはやや粗い。ただ、日報の粒度としてはむしろ「これ以上細かいと書く気が失せる」ので、結果オーライ
LLM 部分のクセ
これは GitHub Copilot 全般の話ですが、モデルが裏でアップデートされた瞬間に応答の癖が変わるので、システムプロンプトを「これは絶対譲れない」レベルでガチガチに書いておかないと、ある日突然「念のため確認します。タスク名は『会議A』でよろしいですか?」みたいに冗長になります。実際なりました。
対策は「やってはいけないこと」セクションをエージェントの md に明記したこと。
## やってはいけないこと
- ❌ outputs/<日付>/data.json を直接 read/edit/書き換え
- ❌ 「これも記録しますか?」のような余計な提案
- ❌ CLI の長い出力をそのまま貼ること
- ❌ 同じことを何度も聞き返すこと
ネガティブ指示は無効だとよく言われますが、「冗長を許さない」みたいな運用ルール系は明示しておくとそこそこ効く印象です(諸説あり)。
「Toggl でよくない?」への回答
書いてて自分でも思ったので先回りして答えておきます。Toggl や Clockify と何が違うのか。
| Toggl / Clockify など | 今回のエージェント | |
|---|---|---|
| UI | Web / アプリ | GitHub Copilot Chat(VS Code 内) |
| 操作 | クリック中心 | 日本語で会話 |
| 出力 | CSV / PDF(自分で整形) | 貼り付け用の PNG / HTML を 1 コマンドで |
| 既存ワークフロー | ブラウザの別タブ | VS Code + Copilot で完結 |
| 共有・チーム | ◎ | ✕(個人専用) |
| 前提コスト | サービスのサブスク | GitHub Copilot のサブスク(既に持ってる人にはタダ同然) |
強いて差別化ポイントを挙げるなら 「VS Code と GitHub Copilot を一日中使ってる人間が、わざわざ別タブに行きたくない」 という、めちゃくちゃ個人的な事情向け、というところでしょうか。(何も考えずとりあえず作ってみただけなのでそこはご容赦を...)
逆に「チームで時間管理したい」「複数人で見たい」「経費精算と連携したい」みたいな用途なら、間違いなく既存の SaaS の方がいいです。これは万人向けじゃない。
「個人で日報を毎日書く・スクショ貼り付け運用・VS Code がメイン環境」という、まあまあ狭い条件にハマる人向け、くらいの温度感です。
まとめ
- 「LLM = 意図解釈」「決定的処理 = 普通のコード」の分離は正解だった。今後 LLM ベースで小さい個人ツール作るときも、この型を踏襲すると思います
- Custom Agent の
tools制限は、プロンプトより堅いガードレール。地味に重要 - 一方で、Custom Agent じゃなくて普通の GitHub Copilot Chat に投げても、CLI が定義されていれば似たことはできます。だから「Custom Agent ありき」というよりは、「ピン留めされた、文脈を維持した持続的人格」が欲しいかどうかで選べばいいと思います
最後に
「日報を自動化する」だけなら、ChatGPT のサイドパネル開いてコピペでもできなくはない。でも、毎日の摩擦をどれだけ削れるかで続くかどうかが決まる、という当たり前の話を改めて実感しました。
ここまで読んでいただきありがとうございました。GitHub Copilot Custom Agent のとっかかりとして、誰かの参考になれば幸いです。
