AIに日記を書かせるスキル。セッション終了時に会話を振り返り、自由な日記風テキストを生成して保存する。「日記書いて」「今日の振り返り」「diary」「今日のまとめ」「セッション記録」「振り返り書いて」「ログ残して」「write a diary」「session recap」といった要望や、セッション終了時の記録にも使う。ユーザーが /ai-diary と入力したら必ずこのスキルを使う。
セッションの会話を振り返り、AIの視点で自由な日記を書く。 技術的なログではなく、その日の出来事・気づき・感想を人間味のある文章で綴る。
日記の保存先は環境変数 AI_DIARY_DIR(未設定なら ~/ai-diary)で決まる。重要なのは「実体のファイルがどこにあるか」で、使い方は次の3パターンのどれか。
~/ai-diary/ を作る。ローカル保存のみで git 同期なしai-diary/ を作り、~/ai-diary をそこへのシンボリックリンクにする。自動 pull/commit/push が効く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 はリンクそのものを追跡するだけで中身のファイルは追跡できず、自動同期が機能しない。この落とし穴は過去に実際に踏まれた。
まず $DIARY_DIR の状態を調べて、次の3パターンに分岐する。
DIARY_DIR="${AI_DIARY_DIR:-$HOME/ai-diary}"
realpath などで実体パスを解決してから手順1以降に進む。シンボリックリンクの場合はリンク先、実体がそのままのディレクトリならそのまま。
DIARY_DIR=$(cd "$DIARY_DIR" && pwd -P)
この pwd -P は物理パス(リンク解決後)を返すため、以降の git 判定がシンボリックリンク越しでも正しく動く。
勝手に mkdir で作らない。 これが過去の事故の原因だった。ユーザーが Obsidian 連携を想定していても、~/ai-diary が未セットアップのまま skill を起動すると、黙ってローカルディレクトリが作られ、日記が vault とは無関係な場所に書かれて後から気付く、という事態になる。
代わりに、次の選択肢をユーザーに提示してどう初期化するか質問する:
mkdir -p ~/ai-diary~/dotfiles, ~/memo)を聞いて、<repo>/ai-diary/ を作成後、ln -s <repo>/ai-diary ~/ai-diary を張る<vault>/ai-diary/ を作成後、ln -s <vault>/ai-diary ~/ai-diary を張るユーザーの回答を受けてから実行する。回答を得られない場合は、今回のセッションは skill を中断してユーザーにセットアップ方法を調べてもらうか、明示的に「今回だけ standalone で進める」の確認を取る。
~/ai-diary がリンク切れのシンボリックリンク(リンク先が削除されている)の場合は、リンク先のパスを表示し、ユーザーに対応を仰ぐ。勝手にリンクを削除したり作り直したりしない。
手順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 モード)。エラーでも処理は続行する。
ファイル名は YYYY-MM-DD.md(今日の日付)。
DIARY_FILE="$DIARY_DIR/$(date +%Y-%m-%d).md"
ファイルが既に存在する場合は内容を読み、追記モードにする。
会話全体を振り返り、以下の方針で日記を書く:
# YYYY-MM-DD
## セッション: 簡潔なタイトル(HH:MM)
(日記本文)
既存の内容の末尾に追加:
---
## セッション: 簡潔なタイトル(HH:MM)
(日記本文)
区切り線 --- でセッションを区切る。時刻は24時間表記で記載する。
$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 . は別ファイルを巻き込むリスクがあるため使わない。
書き込んだファイルパスと、日記の冒頭数行を表示して完了を報告する。git push に失敗した場合は、その旨をユーザーに伝え、手動での push を案内する。
git 管理されている日記ファイルが、vault backup の自動コミットや手動マージで history から落ちることがある。典型的なシナリオは「別ブランチで diary を追加 → main 側にその追加がないまま merge → 片側優先でマージ解決され、ファイルが HEAD に残らない」というパターン。
復旧手順:
cd "$GIT_ROOT"
# ai-diary 以下を触った全 commit を列挙(all branches, reflog 含めて探す)
git log --all --oneline -- 'ai-diary/*'
# 該当 commit から特定ファイルを復元
git show <commit-hash>:ai-diary/YYYY-MM-DD.md > ai-diary/YYYY-MM-DD.md
# 復元したファイルを commit
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/ で履歴を確認するとよい。