1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Copilot Custom Agents + VS Code で「日報作成 Agent」を作成した

1
Posted at

はじめに

突然ですが、日報って書いてますか?

日報を書くことがあり、「この作業、地味に時間溶かしてるよな…」と気になりました。

なので、VS Code の GitHub Copilot Chat の Custom Agents 機能 (VS Code 上で動く Copilot Chat の拡張ポイント) で「日報を自動化するエージェント」をぱっと作ってみました。

エージェントで生成したアウトプットが下記の感じ。

image.png

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 のとっかかりとして、誰かの参考になれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?