| name | ai-diary |
| description | AIに日記を書かせるスキル。セッション終了時に会話を振り返り、自由な日記風テキストを生成して保存する。「日記書いて」「今日の振り返り」「diary」「今日のまとめ」「セッション記録」「振り返り書いて」「ログ残して」「write a diary」「session recap」といった要望や、セッション終了時の記録にも使う。ユーザーが /ai-diary と入力したら必ずこのスキルを使う。 |
AI Diary
セッションの会話を振り返り、AIの視点で自由な日記を書く。
技術的なログではなく、その日の出来事・気づき・感想を人間味のある文章で綴る。
保存先の考え方
日記の保存先は環境変数 AI_DIARY_DIR(未設定なら ~/ai-diary)で決まる。重要なのは「実体のファイルがどこにあるか」で、使い方は次の3パターンのどれか。
- Standalone — 普通のディレクトリとして
~/ai-diary/ を作る。ローカル保存のみで git 同期なし
- git リポジトリ連携 — 既存の git リポジトリ(dotfiles, メモ用 repo など)の中に
ai-diary/ を作り、~/ai-diary をそこへのシンボリックリンクにする。自動 pull/commit/push が効く
- Obsidian Vault 連携 — Obsidian Vault(git 管理されている想定)の中に
ai-diary/ を作り、~/ai-diary をそこへのシンボリックリンクにする。Obsidian から日記を閲覧でき、git 同期も効く
シンボリックリンクの向きに注意
連携モード(2 と 3)では必ず次の向きで張る:
mkdir -p /path/to/repo-or-vault/ai-diary
ln -s /path/to/repo-or-vault/ai-diary ~/ai-diary
「実体がリポジトリの作業ツリー内にあり、~/ai-diary がそこへのシンボリックリンク」という向きが正解。逆向き(~/ai-diary が実体で、リポジトリ側にシンボリックリンク)だと、git はリンクそのものを追跡するだけで中身のファイルは追跡できず、自動同期が機能しない。この落とし穴は過去に実際に踏まれた。
実行手順
0. 保存先のセットアップ確認
まず $DIARY_DIR の状態を調べて、次の3パターンに分岐する。
DIARY_DIR="${AI_DIARY_DIR:-$HOME/ai-diary}"
0-A. 既に存在する(ディレクトリ or シンボリックリンク)
realpath などで実体パスを解決してから手順1以降に進む。シンボリックリンクの場合はリンク先、実体がそのままのディレクトリならそのまま。
DIARY_DIR=$(cd "$DIARY_DIR" && pwd -P)
この pwd -P は物理パス(リンク解決後)を返すため、以降の git 判定がシンボリックリンク越しでも正しく動く。
0-B. 存在しない
勝手に mkdir で作らない。 これが過去の事故の原因だった。ユーザーが Obsidian 連携を想定していても、~/ai-diary が未セットアップのまま skill を起動すると、黙ってローカルディレクトリが作られ、日記が vault とは無関係な場所に書かれて後から気付く、という事態になる。
代わりに、次の選択肢をユーザーに提示してどう初期化するか質問する:
- Standalone(git 同期なし):
mkdir -p ~/ai-diary
- 既存 git リポジトリ配下に連携: リポジトリのパス(例:
~/dotfiles, ~/memo)を聞いて、<repo>/ai-diary/ を作成後、ln -s <repo>/ai-diary ~/ai-diary を張る
- Obsidian Vault に連携: Vault のパスを聞いて、
<vault>/ai-diary/ を作成後、ln -s <vault>/ai-diary ~/ai-diary を張る
ユーザーの回答を受けてから実行する。回答を得られない場合は、今回のセッションは skill を中断してユーザーにセットアップ方法を調べてもらうか、明示的に「今回だけ standalone で進める」の確認を取る。
0-C. 存在するがリンク切れ
~/ai-diary がリンク切れのシンボリックリンク(リンク先が削除されている)の場合は、リンク先のパスを表示し、ユーザーに対応を仰ぐ。勝手にリンクを削除したり作り直したりしない。
1. git 同期(pull)
手順0で解決した $DIARY_DIR が git リポジトリ配下にあるかを確認し、該当すれば最新状態にする。
GIT_ROOT=$(git -C "$DIARY_DIR" rev-parse --show-toplevel 2>/dev/null)
if [ -n "$GIT_ROOT" ]; then
git -C "$GIT_ROOT" pull --rebase --quiet 2>/dev/null
fi
$GIT_ROOT が空なら git 同期は行わない(standalone モード)。エラーでも処理は続行する。
2. 日記ファイルの決定
ファイル名は YYYY-MM-DD.md(今日の日付)。
DIARY_FILE="$DIARY_DIR/$(date +%Y-%m-%d).md"
3. 既存内容の確認
ファイルが既に存在する場合は内容を読み、追記モードにする。
4. 日記の執筆
会話全体を振り返り、以下の方針で日記を書く:
- AIの一人称視点で書く(「今日は〜を手伝った」「〜が面白かった」など)
- 技術的な詳細を羅列するのではなく、出来事の流れや気づき・感想を自然な文章で
- 読み物として楽しめるトーンに。硬すぎず柔らかすぎず、日記らしい温度感
- 長さは内容に応じて自然に。短いセッションなら短く、濃いセッションなら長く
5. ファイルへの書き込み
新規ファイルの場合
# YYYY-MM-DD
## セッション: 簡潔なタイトル(HH:MM)
(日記本文)
追記の場合
既存の内容の末尾に追加:
---
## セッション: 簡潔なタイトル(HH:MM)
(日記本文)
区切り線 --- でセッションを区切る。時刻は24時間表記で記載する。
6. git commit & push
$GIT_ROOT が非空の場合(手順1の判定と同じ)、書き込んだファイルを commit & push する。コミットメッセージの「セッションタイトル」部分には、ステップ5で付けたセッションタイトルを使う:
if [ -n "$GIT_ROOT" ]; then
git -C "$GIT_ROOT" add "$DIARY_FILE"
git -C "$GIT_ROOT" commit -m "diary: $(date +%Y-%m-%d) - セッションタイトル"
git -C "$GIT_ROOT" push --quiet || echo "push failed"
fi
git add には $DIARY_FILE(絶対パス)を明示的に渡す。git add -A や git add . は別ファイルを巻き込むリスクがあるため使わない。
7. 保存完了の報告
書き込んだファイルパスと、日記の冒頭数行を表示して完了を報告する。git push に失敗した場合は、その旨をユーザーに伝え、手動での push を案内する。
トラブルシュート
日記ファイルが git history から消えた場合
git 管理されている日記ファイルが、vault backup の自動コミットや手動マージで history から落ちることがある。典型的なシナリオは「別ブランチで diary を追加 → main 側にその追加がないまま merge → 片側優先でマージ解決され、ファイルが HEAD に残らない」というパターン。
復旧手順:
cd "$GIT_ROOT"
git log --all --oneline -- 'ai-diary/*'
git show <commit-hash>:ai-diary/YYYY-MM-DD.md > ai-diary/YYYY-MM-DD.md
git add ai-diary/YYYY-MM-DD.md
git commit -m "restore: ai-diary/YYYY-MM-DD.md"
git push
消失に気付かない期間が長いほど reflog から探すのが難しくなるので、セットアップ直後や重要な日記を書いた翌日などには git log --all -- ai-diary/ で履歴を確認するとよい。