# todo.txt → TODOカレンダー登録スキル
todo.txtの未完了タスクを読み取り、Googleカレンダーの「TODO」カレンダーにイベントとして登録する。
各タスクの所要時間はタスク内容から30分単位で見積もる。
タスクは平日(土日祝を除く)の8:00〜17:00に配置する。
## 前提条件
- Google Calendar MCPが接続されていること
- todo.txtが存在すること(場所はユーザーに確認)
- 「TODO」という名前のGoogleカレンダーが存在すること
## ワークフロー
### ステップ1: todo.txtの読み取りと未完了タスクの抽出
todo.txtを読み込み、未完了タスクだけを抽出する。
**未完了タスクの判定ルール:**
- 行頭が `x ` で始まる行は**完了済み**なので除外する
- 空行も除外する
- それ以外が未完了タスク
各タスクから以下の情報をパースする:
- **優先度**: `(A)` 〜 `(Z)` — 行頭にある場合
- **プロジェクト**: `+ProjectName`
- **コンテキスト**: `@ContextName`
- **期限**: `due:YYYY-MM-DD` — あれば優先的にその日付近に配置
- **所要時間**: `est:` タグがあればその値を使用(例: `est:1h`, `est:30m`)
- **タスク本文**: 上記タグを除いた説明テキスト
### ステップ2: 所要時間の見積もり
各タスクの所要時間を30分単位で見積もる。`est:` タグが付いていればその値を使い、なければタスクの内容から判断する。
**見積もりの指針:**
| タスクの種類 | 目安 |
|---|---|
| 簡単な連絡・確認・質問(@ask, @cal, 予約など) | 30分 |
| 短いドキュメント作成・レビュー | 1時間 |
| 調査・リサーチ(@research) | 1.5〜2時間 |
| コーディング・実装(@code) | 1.5〜2時間 |
| テスト(@test) | 1〜1.5時間 |
| 設計・ドキュメント作成(@design, @document) | 1.5〜2時間 |
| ミーティング準備・資料作成 | 1時間 |
上記はあくまで目安であり、タスクの説明文から複雑さや規模を読み取って柔軟に調整する。最小は30分、最大は4時間(半日)とする。見積もりが難しい場合は1時間をデフォルトとする。
### ステップ3: タスクをソートする
抽出した未完了タスクを以下のルールで並べ替える。この順序がそのままカレンダーへの配置順序になる(先頭のタスクが最も早い時間帯に入る)。
**ソート順(上位ほど優先):**
1. `due:` 付きタスク → `due:` なしタスク(期限付きを先に)
2. `due:` 付き同士は日付の早い順
3. 優先度順: `(A)` > `(B)` > ... > `(Z)` > 優先度なし
4. 同じ優先度ならtodo.txt内の出現順(上の行が先)
このソートにより、重要なタスクほど朝イチの枠に配置される。集中力の高い午前中に優先度の高い仕事を片付けられるようにするためだ。
### ステップ4: TODOカレンダーのIDを取得
`mcp__google-calendar__list-calendars` でカレンダー一覧を取得し、「TODO」カレンダーのIDを特定する。
見つからない場合はユーザーに確認する。
### ステップ5: スケジューリングの開始日時を決定する
今日が営業日なら**今日の現在時刻以降**から配置を開始する。今日が土日祝なら翌営業日から開始する。
具体的なルールは以下の通り:
1. **現在時刻を取得する**(`date` コマンド等でJST現在時刻を確認する)
2. **今日が営業日(平日かつ祝日でない)の場合:**
- 現在時刻を次の30分区切りに切り上げる(例: 14:12 → 14:30、10:00 → 10:00)
- 切り上げた時刻が17:00以降であれば、今日の枠はなしとして次の営業日に進む
- 切り上げた時刻が8:00より前であれば、8:00から開始する
3. **今日が土日祝の場合は、次の営業日の8:00から配置を開始する**
4. **土日は除外する**(土曜=6、日曜=0)
5. **日本の祝日も除外する** — Googleカレンダーの「日本の祝日」カレンダー(ID: `ja.japanese#
[email protected]`)からイベントを取得して判定する
6. `due:` タグがあるタスクは、その日付が平日かつ祝日でなければその日に配置する。土日祝の場合は直前の営業日に配置する。ただし、due日が今日より前の場合は今日の空き枠から配置する
### ステップ6: 既存予定との衝突を避ける
各配置候補日について、以下のカレンダーから既存イベントを取得する:
- メインカレンダー(primary)
- TODOカレンダー
8:00〜17:00の間で、既存イベントと重ならない空き枠を探す。
ただし、今日の場合は現在時刻(30分区切りに切り上げ)〜17:00の空き枠を対象とする。
**ランチタイムの確保:**
12:00〜13:00は常にランチ休憩としてブロックする。この時間帯にはタスクを配置しない。
つまり、利用可能な時間帯は 8:00〜12:00(午前4時間)と 13:00〜17:00(午後4時間)の計8時間。
今日の場合、現在時刻以降の部分のみが利用可能。
### タスクの分割と配置 — 空き時間を最大限活用する
各タスクは見積もった所要時間分のカレンダー枠を確保する。配置方法は以下の2パターンがある:
- **連続配置**: 見積もり時間分の連続した空き枠にまとめて配置する
- **分割配置**: 空き枠が足りない場合、タスクを30分単位で複数の空き枠に分けて配置する(イベント名に「(1/2)」「(2/2)」等を付ける)
**配置の基本方針は「空き時間を前詰めで埋めていく」こと。** 連続枠にこだわって後ろの枠に回すのではなく、空いていればそこにタスクの一部を入れる。ユーザーの1日の時間を有効に使うためには、隙間を埋める分割配置が重要になる。
**ステップ3でソート済みのタスクリストを先頭から順に処理する。** これにより、優先度の高いタスクが自動的に最も早い空き枠に入る。
具体的なロジック:
1. その日の利用可能な時間帯(今日なら現在時刻以降〜17:00、それ以外は8:00〜17:00。ランチ12:00-13:00は除く)の空き時間を時系列で洗い出す
2. ソート済みタスクリストの先頭から順に、空き枠を前詰めで割り当てていく
3. 空き枠がタスクの見積もり時間以上あれば連続配置する
4. 空き枠がタスクの見積もり時間より短い場合、入る分だけそこに配置し(分割の前半)、残りは次の空き枠に入れる(分割の後半)
5. 30分未満の端数の空き枠はスキップする
6. 1日に収まらないタスクは翌営業日に繰り越す
**配置例:**
現在時刻が14:12の場合(14:30に切り上げ)、タスクA(見積もり1.5時間)、タスクB(見積もり1時間):
```
今日:
14:30-16:00 タスクA(1.5時間 → 連続配置)
16:00-17:00 タスクB(1時間 → 連続配置)
```
現在時刻が16:00の場合、タスクA(見積もり2時間):
```
今日:
16:00-17:00 タスクA (1/2)(残り1時間のみ)
翌営業日:
08:00-09:00 タスクA (2/2)(残り1時間を翌日朝に)
```
### ステップ7: ユーザーへの確認
登録前に、スケジュール案をユーザーに提示する。見積もり時間も併せて表示する。
提示フォーマット:
```
## カレンダー登録予定
### 2026-03-31 (火) ← 今日
- 14:30-16:00: (A) @research ETL tools +PDH [見積もり: 1.5h]
- 16:00-17:00: (B) @code API endpoint +Backend (1/2) [見積もり: 1.5h]
### 2026-04-01 (水)
- 08:00-08:30: (B) @code API endpoint +Backend (2/2)
- 08:30-09:30: @test app +yuseido [見積もり: 1h]
---
合計: N件のタスク (合計Xh) → N日間に配置
```
分割されたタスクがある場合は必ずその旨を明記する。
見積もり時間に違和感があればユーザーが調整できるよう促す。
ユーザーの承認を得てから登録する。変更があれば調整する。
### ステップ8: カレンダーへの登録
`mcp__google-calendar__create-event` で各タスクをイベントとして登録する。
**イベント作成時のパラメータ:**
- `calendarId`: TODOカレンダーのID
- `summary`: タスクの本文(プロジェクトやコンテキストタグも含める。分割時は (1/2)(2/2) 等を付与)
- `start` / `end`: 決定した日時(タイムゾーンは `Asia/Tokyo`)
- `description`: 元のtodo.txt行の全文を記載する(トレーサビリティのため)
### ステップ9: 結果報告
登録完了後、結果を報告する:
```
TODOカレンダーに N件のタスクを登録しました。(合計 Xh)
```
## 注意事項
- todo.txtは変更しない(完了マークを付けたり削除したりしない)
- タイムゾーンは `Asia/Tokyo` (UTC+9) を使用する
- 同じタスクが既にTODOカレンダーに存在する場合は重複登録を避ける(イベント名で判定)
- タスク数が多い場合(10件超)は、数日に分散されることをユーザーに伝える