👌

Obsidianに調査・実装内容などをまとめてくれるClaude Agent Skills

に公開

はじめに

先日、ClaudeからAgent Skillsが発表されましたね。
sub-agentやカスタムスラッシュコマンドがある中で、使い道がないか模索していたのですが、ClaudeCodeでやりとりした内容をObsidianにまとめてくれるskillsを作ったので、共有しようと思います。

使っている様子は以下になります。
Goについて回答してもらった内容を「obsidianにまとめて」と命令したら、skillsが起動して、Obsidianにまとめてもらって出力しているところです。

Claude CodeでObsidianに学習内容を保存する様子

気になる方は、下に実装方法と使い方を記載していますので、そのまま読み進めてください。

必要な環境

  • Claude Code(Agent Skills対応版)
  • Obsidian
  • macOS / Linux(シェルスクリプト実行環境)

実装手順

1. ディレクトリ構成

まず、Claude Codeのスキルディレクトリに以下の構成でファイルを作成します:

skills
└── save-to-obsidian
    ├── scripts
    │   └── save-to-obsidian.sh
    ├── categories.txt
    └── SKILL.md
  • SKILL.md: スキルの定義ファイル(Claude Codeがスキルを認識するため)
  • scripts/save-to-obsidian.sh: 実際の保存処理を行うシェルスクリプト
  • categories.txt: カテゴリー定義ファイル(カスタマイズ可能)

2. スキル定義ファイル(SKILL.md)の作成

~/.claude/skills/save-to-obsidian/SKILL.md を作成し、以下の内容を記述します:

環境変数という項目がSKILL.mdの中にありますが、ここは、自身のObsidianのパスに書き換えてください。

`OBSIDIAN_DIR`: Obsidianディレクトリパス(デフォルト: ~/Workspace/Document/obsidian)
SKILL.md
---
name: save-to-obsidian
description: 調査・実装した内容をObsidianに学習用ノートとして保存するスキル。「後で学習したい」「後で振り返り用にまとめたい」「Obsidianに保存」「学習メモとして残したい」などと言ったときに起動する。
---

# Save to Obsidian

調査・実装した内容をObsidianに学習用ノートとして保存するスキル

## 使用方法

調査・実装した内容を以下の手順で保存:

1. **コンテンツを分析**してカテゴリーとタグを決定
2. **スクリプトに引数として渡して実行**

### カテゴリー選択ロジック

コンテンツの文脈から、`categories.txt`で定義されたカテゴリーから**最適な1つ**を選択。

#### カテゴリーファイル (`categories.txt`)

カテゴリーは外部ファイルで管理され、容易に追加・削除が可能:

```txt
# Obsidian学習ノートのカテゴリー設定
# 1行1カテゴリー、#で始まる行はコメント

カテゴリー名
```

**カテゴリーの追加方法**:
1. `~/.claude/skills/save-to-obsidian/categories.txt`を編集
2. 新しい行にカテゴリー名を追加
3. スクリプトが自動的に新カテゴリーを認識

### タグ生成ロジック

コンテンツから**動的に細かいタグ**を3-5個生成:
- 具体的なAPI名、ライブラリ名
- 技術概念、パターン名
- 関連する重要なキーワード

### スクリプト呼び出し形式

```bash
bash ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh \
  "<タイトル>" \
  "<カテゴリー>" \
  "<タグ1> <タグ2> <タグ3>" \
  <<'EOF'
<マークダウン形式のコンテンツ>
EOF
```

### 実行例

```bash
# React Hooksの学習内容を保存
bash ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh \
  "useStateとuseEffectによる状態管理" \
  "React" \
  "#Hooks #useState #useEffect #状態管理" \
  <<'EOF'
## 概要
React Hooksを使った状態管理の実装パターン

## 学んだこと
- useStateの基本的な使い方
- useEffectでの副作用管理
...
EOF
```


## 機能
1. **LLMによる自動分類**: コンテンツから最適なカテゴリーを選択
2. **動的タグ生成**: コンテンツから具体的で細かいタグを自動生成
3. **適切なディレクトリ配置**: `Learning/カテゴリー名/`配下に保存
4. **意味のあるファイル名**: タイトルから生成
5. **検索最適化**: タグ付きMarkdown形式で保存

## 出力先
ファイルは以下のディレクトリ構造で保存:
```
$OBSIDIAN_DIR/Learning/
└── カテゴリー名/
```

## 実行スクリプト
`save-to-obsidian.sh`

## 環境変数
- `OBSIDIAN_DIR`: Obsidianディレクトリパス(デフォルト: ~/Workspace/Document/obsidian)

3. 保存スクリプト(save-to-obsidian.sh)の作成

~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh を作成し、以下の内容を記述します:

save-to-obsidian.sh
#!/bin/bash

# Obsidianへの学習内容保存スクリプト

# 基本設定
OBSIDIAN_DIR="/path/to/your/obsidian"
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")

# スクリプトのディレクトリを取得
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CATEGORIES_FILE="$SCRIPT_DIR/../categories.txt"

# グローバル変数: カテゴリーリスト
declare -a VALID_CATEGORIES

# 関数: カテゴリーファイルを読み込む
load_categories() {
    if [ ! -f "$CATEGORIES_FILE" ]; then
        echo "エラー: カテゴリーファイルが見つかりません: $CATEGORIES_FILE" >&2
        exit 1
    fi

    # コメント行と空行を除いてカテゴリーを読み込む
    while IFS= read -r line || [ -n "$line" ]; do
        # コメント行と空行をスキップ
        [[ "$line" =~ ^#.*$ || -z "$line" ]] && continue
        VALID_CATEGORIES+=("$line")
    done < "$CATEGORIES_FILE"

    if [ ${#VALID_CATEGORIES[@]} -eq 0 ]; then
        echo "エラー: カテゴリーファイルにカテゴリーが定義されていません" >&2
        exit 1
    fi
}

# 関数: カテゴリーバリデーション
validate_category() {
    local category="$1"
    local found=0

    for valid_cat in "${VALID_CATEGORIES[@]}"; do
        if [ "$category" = "$valid_cat" ]; then
            found=1
            break
        fi
    done

    if [ $found -eq 1 ]; then
        echo "$category"
    else
        echo "エラー: 無効なカテゴリーです: $category" >&2
        echo "有効なカテゴリー: $(IFS=', '; echo "${VALID_CATEGORIES[*]}")" >&2
        echo ""
    fi
}

# 関数: ファイル名の生成
create_filename() {
    local title="$1"
    # タイトルからファイル名に使えない文字を除去
    local safe_title
    safe_title=$(echo "$title" | sed 's/[^a-zA-Z0-9ぁ-んァ-ヶー一-龠々〆〤 _-]//g' | sed 's/ /_/g')
    echo "${safe_title}.md"
}

# 関数: Markdownファイルの生成
create_markdown() {
    local title="$1"
    local tags="$2"
    local content="$3"

    cat << EOF
$tags

# $title

## 概要
本日の学習内容のまとめ

## 詳細
$content

## 重要ポイント
-

## 今後の課題
-

## 参考リンク
-

## メモ
-

---
*作成日時: $TIMESTAMP*
EOF
}

# メイン処理
main() {
    local title="$1"
    local category="$2"
    local tags="$3"
    local content=""

    # カテゴリーファイルを読み込む
    load_categories

    # 引数チェック
    if [ -z "$title" ] || [ -z "$category" ] || [ -z "$tags" ]; then
        echo "エラー: 引数が不足しています"
        echo "使用方法: $0 <タイトル> <カテゴリー> <タグ>"
        echo ""
        echo "カテゴリー: $(IFS=', '; echo "${VALID_CATEGORIES[*]}")"
        echo "タグ例: \"#Hooks #useState #useEffect\""
        exit 1
    fi

    # カテゴリーのバリデーション
    local validated_category
    validated_category=$(validate_category "$category")
    if [ -z "$validated_category" ]; then
        exit 1
    fi

    # 標準入力から内容を読み取る
    if [ ! -t 0 ]; then
        content=$(cat)
    else
        content="ここに学習内容を記載"
    fi

    # ディレクトリパスの生成(Learningディレクトリ配下)
    local target_dir="$OBSIDIAN_DIR/Learning/$validated_category"

    # ディレクトリが存在しない場合は作成
    if [ ! -d "$target_dir" ]; then
        mkdir -p "$target_dir"
        echo "ディレクトリを作成しました: $target_dir"
    fi

    # ファイル名の生成
    local filename
    filename=$(create_filename "$title")
    local filepath="$target_dir/$filename"

    # ファイルが既に存在する場合の処理
    if [ -f "$filepath" ]; then
        echo "警告: ファイルが既に存在します: $filepath"
        read -p "上書きしますか? (y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            echo "処理を中断しました"
            exit 0
        fi
    fi

    # Markdownファイルの生成と保存
    create_markdown "$title" "$tags" "$content" > "$filepath"

    # 結果の表示
    echo "✅ ファイルを保存しました:"
    echo "   場所: $filepath"
    echo "   カテゴリー: $validated_category"
    echo "   タグ: $tags"

    # Obsidianで開くか確認(macOSの場合)
    if [[ "$OSTYPE" == "darwin"* ]]; then
        read -p "Obsidianで開きますか? (y/n): " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            open "obsidian://open?path=$filepath"
        fi
    fi
}

# スクリプトの実行
main "$@"

4. カテゴリー定義ファイル(categories.txt)の作成

~/.claude/skills/save-to-obsidian/categories.txt を作成し、以下の内容を記述します:

categories.txt
# Obsidian学習ノートのカテゴリー設定
# 1行1カテゴリー、#で始まる行はコメント

AI
React
Nextjs
TypeScript
Rust
Go
デザインパターン
フロントエンド
技術
開発手法

カスタマイズのポイント

  • 1行1カテゴリーで記述
  • #で始まる行はコメント扱い
  • 自分の学習分野に合わせて自由にカテゴリーを追加・削除可能
  • カテゴリー名は日本語・英語どちらでも使用可能

5. スクリプトに実行権限を付与

作成したスクリプトに実行権限を付与します:

chmod +x ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh

このスキルの仕組み

LLMによる自動分類とタグ生成

このスキルの最大の特徴は、Claude Code(LLM)が調査・実装内容を分析して、最適なカテゴリーとタグを自動生成する点です。

カテゴリー選択の流れ

  1. Claude Codeが会話の内容を分析
  2. categories.txtで定義されたカテゴリーの中から、最も適切なものを1つ選択
  3. 選択したカテゴリーに基づいてディレクトリを決定

タグ生成の流れ

  1. 会話の内容から技術的なキーワードを抽出
  2. 具体的なAPI名、ライブラリ名、概念、パターン名などから3-5個のタグを生成
  3. Obsidian内での検索性を高めるための最適なタグセットを構築

例えば、React Hooksに関する調査内容であれば:

  • カテゴリー: React(categories.txtから選択)
  • タグ: #Hooks #useState #useEffect #状態管理 #副作用(動的生成)

スクリプトの呼び出し形式

Claude Codeは以下の形式でスクリプトを呼び出します:

bash ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh \
  "<タイトル>" \
  "<カテゴリー>" \
  "<タグ1> <タグ2> <タグ3>" \
  <<'EOF'
<マークダウン形式のコンテンツ>
EOF

使い方

基本的な使い方

Claude Codeで調査や実装を行った後、以下のフレーズで自動的にスキルが起動します:

  • 「後で学習したい」
  • 「後で振り返り用にまとめたい」
  • 「Obsidianに保存」
  • 「学習メモとして残したい」

実際の使用例

例1:React Hooksについて調査した後

ユーザー: 「この内容を後で学習できるようにObsidianに保存して」

Claude: 調査内容を分析しています...
- カテゴリー: React(categories.txtから選択)
- タグ: #Hooks #useState #useEffect #状態管理
- タイトル: React Hooksによる状態管理

Obsidianに保存します...
✅ ファイルを保存しました:
   場所: ~/Workspace/Document/obsidian/Learning/React/React_Hooksによる状態管理.md
   カテゴリー: React
   タグ: #Hooks #useState #useEffect #状態管理

例2:TypeScriptのジェネリクスについて実装した後

ユーザー: 「今の実装内容を学習メモとして残したい」

Claude: 実装内容を分析しています...
- カテゴリー: TypeScript(categories.txtから選択)
- タグ: #Generics #型パラメータ #型推論 #型安全性
- タイトル: TypeScriptジェネリクスの実装パターン

Obsidianに保存します...
✅ ファイルを保存しました:
   場所: ~/Workspace/Document/obsidian/Learning/TypeScript/TypeScriptジェネリクスの実装パターン.md
   カテゴリー: TypeScript
   タグ: #Generics #型パラメータ #型推論 #型安全性

生成されるMarkdownファイルの構成

保存されるファイルには、以下の構成で情報が整理されます:

#動的に生成されたタグ

# タイトル

## 概要
本日の学習内容のまとめ

## 詳細
(Claude Codeとのやりとりで得られた内容)

## 重要ポイント
-

## 今後の課題
-

## 参考リンク
-

## メモ
-

---
*作成日時: YYYY-MM-DD HH:MM:SS*

カテゴリーのカスタマイズ

categories.txtを編集することで、自分の学習分野に合わせたカテゴリーを追加できます:

例:新しいカテゴリー「機械学習」を追加する場合

categories.txt
# Obsidian学習ノートのカテゴリー設定

AI
React
Nextjs
TypeScript
機械学習  # 新規追加
Rust
Go
デザインパターン
フロントエンド
技術
開発手法

カテゴリーを追加すると、Claude Codeが自動的に新しいカテゴリーを認識し、適切な内容を分類してくれます。

注意点・ハマりどころ

1. categories.txtファイルの存在確認

スクリプトはcategories.txtファイルが存在しないとエラーになります。以下のエラーが出る場合は、ファイルの存在と配置を確認してください:

# エラー例
エラー: カテゴリーファイルが見つかりません: ~/.claude/skills/save-to-obsidian/categories.txt

# 解決方法
# 1. ファイルが存在するか確認
ls ~/.claude/skills/save-to-obsidian/categories.txt

# 2. 存在しない場合は作成
cat > ~/.claude/skills/save-to-obsidian/categories.txt << 'EOF'
# Obsidian学習ノートのカテゴリー設定
AI
React
TypeScript
技術
EOF

2. カテゴリーのバリデーション

スクリプトはcategories.txtに定義されていないカテゴリーを受け取ると、エラーを表示します。

Claude Codeが適切なカテゴリーを選択しますが、万が一エラーが発生した場合は:

# エラー例
エラー: 無効なカテゴリーです: Python
有効なカテゴリー: AI, React, Nextjs, TypeScript, Rust, Go, デザインパターン, フロントエンド, 技術, 開発手法

# 解決方法
# categories.txtに新しいカテゴリーを追加
echo "Python" >> ~/.claude/skills/save-to-obsidian/categories.txt

3. Obsidianディレクトリパスの確認

スクリプトのデフォルトパスは ~/Workspace/Document/obsidian にしているので、異なる場所にObsidianのVaultがあると思いますので、スクリプト内の OBSIDIAN_DIR の値を直接変更してください。

save-to-obsidian.sh
#!/bin/bash

# Obsidianへの学習内容保存スクリプト

# 基本設定
OBSIDIAN_DIR="/path/to/your/obsidian"

4. スクリプトの実行権限

スクリプトに実行権限がないと動作しません。以下のエラーが出る場合は権限を確認してください:

# 権限エラーの例
Permission denied: ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh

# 解決方法
chmod +x ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh

まとめ

Claude CodeのAgent Skillsを使ってObsidianに学習内容を自動保存する仕組みを作成しました。

このスキルのメリット

  • 自動分類: LLMが会話内容を理解して最適なカテゴリーを選択
  • 動的タグ生成: 内容に応じて具体的で細かいタグを3-5個自動生成
  • 振り返りが容易: 調査や実装の内容が構造化されたMarkdownとして残るので、後から見返しやすい
  • 検索性の向上: 適切なタグが自動付与されるので、Obsidian内での検索や関連ノートの発見が簡単
  • 学習の習慣化: 「Obsidianに保存して」と言うだけで記録が残るので、学習内容の記録が習慣化しやすい
  • 柔軟なカスタマイズ: categories.txtを編集するだけで、自分の学習分野に合わせたカテゴリーを追加可能

活用シーン

このスキルは以下のようなシーンで特に役立ちます:

  • 技術調査: 新しいライブラリやフレームワークの調査内容を自動分類して記録
  • 実装パターン: 実装時に学んだテクニックやパターンを具体的なタグ付きで保存
  • トラブルシューティング: エラー解決方法やデバッグ手順を検索しやすい形で記録
  • 学習記録: コードレビューや技術記事から学んだポイントを整理
  • 知識の蓄積: 技術記事や公式ドキュメントの要点を構造化して保存

Claude CodeとObsidianを組み合わせることで、日々の開発で得た知識を効率的に蓄積できる環境が整いました。自動分類で柔軟で知識管理が可能になります。ぜひ試してみてください!

参考リンク

Discussion