# Obsidian Agent 作成用プロンプト #archive

このプロンプトは、「Obsidian Agent」のPythonコード（`main.py`）を一発で生成するための指示書です。
LLM（ChatGPT o1, Claude 3.5 Sonnet, Gemini 1.5 Pro等）に入力することで、同等のコードを出力させることができます。

---

## プロンプト

あなたはPythonと自動化のエキスパートです。
以下の要件を満たす、Obsidian（Markdownメモアプリ）用の常駐型AIエージェントスクリプトを作成してください。

### 目的
Macのローカル環境でObsidianのVaultフォルダを常時監視し、特定のタグが付いたファイルに対してAI（Google Gemini API）を使った処理を自動実行する。

### 技術スタック
- **言語**: Python 3.x
- **監視**: `watchdog` ライブラリ（`Observer`, `FileSystemEventHandler`）
- **AI**: `google-generativeai` ライブラリ
- **通知**: `subprocess` モジュールで `osascript` を呼び出し、macOSのデスクトップ通知を表示

### 機能要件

#### 1. フォルダ監視
- 監視対象: `WATCH_DIR`（Vaultのルート定数）
- **再帰的監視**: サブフォルダ内の変更も検知すること (`recursive=True`)。
- **除外設定**: `.obsidian`, `.trash`, `.git` などのシステムフォルダや、ログファイル自身の変更は無視すること。

#### 2. リサーチ機能
- トリガー: ファイル内に `#research` タグがあり、かつまだ「## Agent Report」セクションが存在しない場合。
- 動作: Gemini APIにファイルの内容を投げ、リサーチ結果や回答を生成させる。
- 出力: 元のファイルの末尾に `## Agent Report` という見出しとともに結果を追記する。

#### 3. 自動ファイル整理機能 (Auto-Filing)
- トリガー: ファイル内に `#archive` または `#file-me` タグがある場合。
- 動作: Gemini APIにファイルの内容（先頭1000文字程度）を投げ、以下の3つの分類のどれに当てはまるか判断させる。
    - `daily` (日記、日報)
    - `notes` (一般的なノート)
    - `webclip` (記事クリップ)
- 出力: 判断されたカテゴリに対応するフォルダ（`01_Daily`, `02_Notes`, `03_WebClip` など）へファイルを移動する。
- **ループ防止策**:
    - 移動先のフォルダに既にファイルがある場合は移動しない（ログを出して終了）。
    - AIのレスポンス（フォルダ名）は正規表現 (`re`) を使って厳密にパースすること（"daily notes"のような曖昧な返答に惑わされないため）。

### 非機能要件・安全性（重要）
1.  **デバウンス処理**: ファイル保存時の連続イベントによる多重実行を防ぐため、`threading.Timer` 等を使って「最後の変更から2秒経過してから実行」するロジックを入れること。
2.  **スレッドセーフ**: デバウンスタイマーの操作には `threading.Lock` を使用して競合を防ぐこと。
3.  **非同期実行**: AI処理はWeb通信を含むため、メインの監視スレッドをブロックしないよう、`queue` とワーカースレッドを使って非同期に処理すること。
4.  **自分自身への反応防止**: AIがファイルに追記したことによる変更イベント（ループ）を防ぐため、処理を実行する前にタグの有無を再確認するロジックを入れること。
5.  **堅牢性**: APIキーがない場合や通信エラー時にクラッシュせず、エラーログを出力して稼働を続けること。

### コード構成
- クラスベースで整理されたコードにすること（`ObsidianAgent` クラスなど）。
- ログ出力設定（`logging`）を含めること。
- 環境変数 `GEMINI_API_KEY` を `.env` から読み込むこと。

この要件を満たす、本番運用に耐えうる堅牢な `main.py` を書いてください。

