# LLM Wiki

<p align="center">
  <img src="logo.jpg" width="128" height="128" style="border-radius: 22%;" alt="LLM Wiki Logo">
</p>

<p align="center">
  <strong>自分で育つパーソナル知識ベース。</strong><br>
  LLM があなたの文書を読み、構造化された Wiki を構築し、継続的に最新の状態に保ちます。
</p>

<p align="center">
  <a href="#これは何ですか">これは何ですか？</a> •
  <a href="#変更点と追加機能">主な機能</a> •
  <a href="#技術スタック">技術スタック</a> •
  <a href="#インストール">インストール</a> •
  <a href="#クレジット">クレジット</a> •
  <a href="#ライセンス">ライセンス</a>
</p>

<p align="center">
  <a href="README.md">English</a> | <a href="README_CN.md">中文</a> | 日本語 | <a href="README_KO.md">한국어</a>
</p>

---

<p align="center">
  <img src="assets/overview.jpg" width="100%" alt="概要">
</p>

## 主な機能

- **2 段階 Chain-of-Thought インジェスト** — LLM がまず分析を行い、その後ソース追跡可能な Wiki ページを生成。増分キャッシュ対応
- **マルチモーダル画像インジェスト** — PDF 内の埋め込み画像を抽出し、Vision LLM で事実ベースのキャプションを生成。画像対応の検索結果、ライトボックスプレビュー、元資料の該当位置へのジャンプに対応
- **任意の MinerU PDF 解析** — 表、数式、複雑なレイアウトを含む PDF には MinerU クラウド解析を利用可能。既定では内蔵ローカル解析を使用
- **4 シグナル知識グラフ** — 直接リンク、ソース重複、Adamic-Adar、タイプ親和性による関連度モデル
- **Louvain コミュニティ検出** — 知識クラスタを自動発見し、凝集度を評価
- **グラフインサイト** — 意外な関連や知識の空白を検出し、ワンクリックで Deep Research を起動
- **ベクトル意味検索** — LanceDB ベースの任意 OpenAI 互換エンドポイントによる埋め込み検索（オプション）
- **永続インジェストキュー** — 直列処理、クラッシュ復旧、キャンセル、リトライ、進捗の可視化に対応
- **フォルダインポート** — ディレクトリ構造を保持した再帰インポート。フォルダパスを LLM の分類ヒントとして利用
- **ソースフォルダの自動監視** — `raw/sources/` の外部変更を検出し、インジェスト・削除クリーンアップを同期
- **Deep Research** — LLM が検索トピックを最適化生成し、Tavily / SerpApi / SearXNG によるマルチクエリ Web 検索結果を自動で Wiki 化
- **非同期レビューシステム** — LLM が人間の判断を要する項目を作成し、定義済みアクションと事前生成された検索クエリを付与
- **Chrome Web Clipper** — Web ページをワンクリックで取り込み、知識ベースへ自動インジェスト
- **ローカル HTTP API + MCP Server + AI Agent Skill** — `127.0.0.1:19828` の JSON API と同梱 MCP Server でハイブリッド検索、ファイル読み取り、グラフ探索、ソース再スキャンを提供。専用の [agent skill](https://github.com/nashsu/llm_wiki_skill) はワンコマンドで Claude Code / Codex に追加可能（`npx skills add …`）

## これは何ですか？

LLM Wiki は、手元の文書を整理された相互リンク付きの知識ベースへ自動変換するクロスプラットフォームのデスクトップアプリです。従来の RAG のように毎回ゼロから検索して回答するのではなく、LLM が資料から**永続的な Wiki を増分的に構築・維持**します。知識は一度コンパイルされた後は継続的に更新され、質問のたびに再推論する必要はありません。

このプロジェクトは、LLM を使ってパーソナル知識ベースを構築する方法論である [Karpathy の LLM Wiki パターン](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) に基づいています。そのコアアイデアを実用的なデスクトップアプリとして実装し、大幅な拡張を加えました。

<p align="center">
  <img src="assets/llm_wiki_arch.jpg" width="100%" alt="LLM Wiki アーキテクチャ">
</p>

## クレジット

基礎となる方法論は **Andrej Karpathy** の [llm-wiki.md](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) に由来します。これは LLM を使って個人 Wiki を増分的に構築・維持する設計パターンを記述したものです。元の文書は抽象的な設計パターンであり、本プロジェクトはその具体的な実装に大幅な拡張を加えたものです。

## 元の設計から継承したもの

コアアーキテクチャは Karpathy の方法論を忠実に踏襲しています。

- **3 層アーキテクチャ**: 原資料（不変）→ Wiki（LLM 生成）→ Schema（ルールと設定）
- **3 つのコア操作**: Ingest（インジェスト）、Query（クエリ）、Lint（チェック）
- **index.md** をコンテンツ目録および LLM のナビゲーション入口として利用
- **log.md** をパース可能な時系列操作記録として利用
- **[[wikilink]]** 構文による相互参照
- すべての Wiki ページに **YAML frontmatter** を付与
- **Obsidian 互換** — Wiki ディレクトリをそのまま Obsidian の vault として利用可能
- **人間がキュレーションし、LLM が維持する** という基本的な役割分担

<p align="center">
  <img src="assets/5-obsidian_compatibility.jpg" width="100%" alt="Obsidian 互換">
</p>

## 変更点と追加機能

### 1. CLI からデスクトップアプリへ

元の設計は、LLM エージェントにコピーして使う想定の抽象的なパターン文書でした。本プロジェクトでは、それを**完全なクロスプラットフォームのデスクトップアプリ**として実装しています。

- **3 カラムレイアウト**: 知識ツリー / ファイルツリー（左）+ チャット（中央）+ プレビュー（右）
- **アイコンサイドバー** — Wiki、ソース、検索、グラフ、Lint、レビュー、Deep Research、設定をワンクリックで切り替え
- **可変サイズのカスタムパネル** — 左右パネルをドラッグでリサイズ可能。最小／最大サイズ制約付き
- **アクティビティパネル** — ファイル単位のインジェスト進捗をリアルタイム表示
- **全状態の永続化** — 会話、設定、レビュー項目、プロジェクト構成が再起動後も保持される
- **シナリオテンプレート** — リサーチ、読書、自己成長、ビジネス、汎用の 5 種類。各テンプレートが purpose.md と schema.md を事前構成

### 2. Purpose.md —— Wiki の存在意義

元の設計には Schema（Wiki の動作ルール）はありますが、その Wiki が**なぜ存在するのか**を正式に定義する場所はありませんでした。本プロジェクトでは `purpose.md` を追加しています。

- 目標、主要な問い、調査範囲、変化しつづける仮説を定義
- LLM が毎回のインジェストとクエリでコンテキストとして読み込む
- 利用パターンに基づいて LLM が更新を提案
- schema とは別物。schema は構造ルール、purpose は方向性と意図

### 3. 2 段階 Chain-of-Thought インジェスト

元の設計では、LLM が読み取りと書き込みを同時に行う 1 段階のインジェストが想定されていました。本プロジェクトでは品質を大きく高めるため、これを**2 回の連続した LLM 呼び出し**に分割しています。

```
ステップ 1（分析）: LLM が資料を読む → 構造化された分析を出力
  - 主要なエンティティ、概念、論点
  - 既存 Wiki コンテンツとの関連
  - 既存知識との矛盾や緊張関係
  - Wiki 構造に対する推奨事項

ステップ 2（生成）: LLM が分析結果を受け取る → Wiki ファイルを生成
  - frontmatter 付きの資料サマリー（type, title, sources[]）
  - 相互参照を持つエンティティページ／概念ページ
  - index.md、log.md、overview.md の更新
  - 人間の判断が必要なレビュー項目
  - Deep Research 用の検索クエリ
```

元の設計を超えるインジェストの強化点:

- **SHA256 増分キャッシュ** — インジェスト前にソースファイルの内容ハッシュを確認。未変更ファイルは自動でスキップし、LLM トークンと時間を節約
- **永続インジェストキュー** — 並行 LLM 呼び出しを防ぐ直列処理。キューはディスクに保存され、アプリ再起動後に自動復元。失敗タスクは最大 3 回まで自動リトライ
- **フォルダインポート** — ディレクトリ構造を保持した再帰インポート。フォルダパスを分類のコンテキストとして LLM に渡す（例: 「papers > energy」で分類を補助）
- **ソースフォルダの自動監視** — `raw/sources/` 配下でアプリ外から追加・変更・削除されたファイルを自動検出し、アプリ内操作と同じインジェスト／削除ライフサイクルで処理
- **キューの可視化** — アクティビティパネルにプログレスバー、待機中／処理中／失敗タスク、キャンセル・リトライボタンを表示
- **自動 embedding** — ベクトル検索を有効にしている場合、新規ページのインジェスト後に自動で embedding を生成
- **ソース追跡可能性** — 生成されたすべての Wiki ページの YAML frontmatter に `sources: []` フィールドが付与され、貢献元の原資料ファイルにリンク
- **overview.md の自動更新** — Wiki の最新状態を反映するグローバルサマリーページを、インジェストのたびに再生成
- **資料サマリー生成の保証** — LLM が漏らした場合でも資料サマリーページが必ず作成されるフォールバック
- **言語対応生成** — LLM はユーザーが設定した言語（英語または中国語）で応答
- **ソースの段階的レンダリング** — 大規模なソースフォルダでもスクロールに合わせて段階的に描画し、ソース画面の応答性を維持

### 4. 関連度モデルを備えた知識グラフ

<p align="center">
  <img src="assets/3-knowledge_graph.jpg" width="100%" alt="知識グラフ">
</p>

元の設計では相互参照のための `[[wikilinks]]` には触れているものの、グラフ分析はありません。本プロジェクトでは**完全な知識グラフ可視化と関連度エンジン**を構築しました。

**4 シグナル関連度モデル:**

| シグナル | 重み | 説明 |
|----------|------|------|
| 直接リンク | ×3.0 | `[[wikilinks]]` で結ばれたページ |
| ソース重複 | ×4.0 | 同一の原資料を共有するページ（frontmatter の `sources[]` 経由） |
| Adamic-Adar | ×1.5 | 共通の隣接ノードを持つページ（隣接ノードの次数で重み付け） |
| タイプ親和性 | ×1.0 | 同一ページタイプ間のボーナス（entity↔entity、concept↔concept） |

**グラフ可視化（sigma.js + graphology + ForceAtlas2）:**

- ページタイプまたはコミュニティでノードを色分け。リンク数に応じてノードサイズを変更（√ スケーリング）
- 関連度の重みに応じてエッジの太さと色を変化（緑＝強い、グレー＝弱い）
- ホバー操作: 隣接ノードは表示を維持、非隣接ノードを淡くし、エッジは関連度スコアラベル付きでハイライト
- ズーム操作（拡大、縮小、画面にフィット）
- 位置キャッシュにより、データ更新時のレイアウトの揺れを防止
- 色分けモードに応じて、凡例がタイプ集計とコミュニティ情報を切り替え

### 5. Louvain コミュニティ検出

元の設計にはありません。**Louvain アルゴリズム**（graphology-communities-louvain）により知識クラスタを自動発見します。

- **自動クラスタリング** — 事前定義のページタイプとは独立に、リンクのトポロジーから自然にまとまるページ群を発見
- **タイプ／コミュニティの切り替え** — ノードの色分けをページタイプ（エンティティ、概念、ソース…）か、発見された知識クラスタかでワンクリック切り替え
- **凝集度スコア** — コミュニティごとに内部エッジ密度（実エッジ数／可能エッジ数）を算出。低凝集（< 0.15）のクラスタには警告を表示
- **12 色のカラーパレット** — クラスタ間の視認性を確保
- **コミュニティ凡例** — 代表ノードのラベル、メンバー数、凝集度を表示

<p align="center">
  <img src="assets/kg_community.jpg" width="100%" alt="Louvain コミュニティ検出">
</p>

### 6. グラフインサイト —— 意外な関連と知識の空白

元の設計にはありません。システムが**グラフ構造を自動分析**し、行動につながるインサイトを提示します。

**意外な関連:**

- コミュニティをまたぐエッジ、タイプをまたぐリンク、周縁ノード↔ハブの結合といった想定外の関係を検出
- 複合的なサプライズスコアで、注目すべき関連をランキング
- 確認済みとしてマークすると一覧から除外可能

**知識の空白:**

- **孤立ページ**（次数 ≤ 1）— Wiki の他の部分とほとんど繋がっていないページ
- **疎なコミュニティ**（凝集度 < 0.15、3 ページ以上）— 内部の相互参照が弱い知識領域
- **ブリッジノード**（3 つ以上のクラスタを接続）— 複数の知識領域をつなぐ重要な結節点ページ

**インタラクション:**

- インサイトカードをクリックすると、対応するノードとエッジをグラフ上で**ハイライト**。再クリックで解除
- 知識の空白とブリッジノードには **Deep Research ボタン**を付属。overview.md + purpose.md を読み込んだドメイン認識型のトピックでリサーチを起動
- 開始前に**編集可能な確認ダイアログ**にリサーチトピックと検索クエリを表示。ユーザーが調整してから実行可能

<p align="center">
  <img src="assets/kg_insights.jpg" width="100%" alt="グラフインサイト">
</p>

### 7. 最適化されたクエリ検索パイプライン

元の設計では、LLM が関連ページを読み取る単純なクエリが説明されています。本プロジェクトでは、オプションのベクトル検索と予算制御を備えた**多段階の検索パイプライン**を構築しました。

```
フェーズ 1: トークン化検索
  - 英語: 単語分割 + ストップワード除去
  - 中国語: CJK バイグラム分割（每个 → [每个, 个…]）
  - タイトル一致ボーナス（+10 点）
  - wiki/ と raw/sources/ の両方を検索

フェーズ 1.5: ベクトル意味検索（オプション）
  - 任意の OpenAI 互換 /v1/embeddings エンドポイントで埋め込みを生成
  - LanceDB（Rust バックエンド）に保存し、高速な ANN 検索を実行
  - コサイン類似度により、キーワードが一致しなくても意味的に関連するページを発見
  - 結果をマージ: 既存ヒットをブースト + 新規発見を追加

フェーズ 2: グラフ拡張
  - 上位の検索結果をシードノードとして利用
  - 4 シグナル関連度モデルで関連ページを発見
  - 2 ホップ走査（減衰付き）で深層の関連も拾う

フェーズ 3: 予算制御
  - 設定可能なコンテキストウィンドウ: 4K → 1M トークン
  - 比例配分: Wiki ページ 60%、チャット履歴 20%、index 5%、システムプロンプト 15%
  - 検索 + グラフ関連度の総合スコアでページを優先順位付け

フェーズ 4: コンテキスト組み立て
  - 番号付きページと本文（サマリーだけではない）を投入
  - システムプロンプトに purpose.md、言語ルール、引用形式、index.md を含める
  - LLM に番号形式での引用を指示: [1]、[2] など
```

**ベクトル検索**は完全にオプションです。デフォルトでは無効で、設定画面からエンドポイント、API キー、モデルを個別に指定して有効化できます。無効時はトークン化検索 + グラフ拡張にフォールバックします。ベンチマークでは、ベクトル検索を有効にすると全体の再現率が 58.2% から 71.4% に向上しました。

### 8. 永続化対応のマルチ会話チャット

元の設計には単一のクエリインターフェースしかありません。本プロジェクトでは**本格的なマルチ会話サポート**を構築しました。

- **独立したチャットセッション** — 会話の作成、リネーム、削除
- **会話サイドバー** — トピック間をすばやく切り替え
- **会話単位の永続化** — 各会話を `.llm-wiki/chats/{id}.json` に保存
- **設定可能な履歴の深さ** — コンテキストとして送信するメッセージ数を制限（デフォルト: 10）
- **引用パネル** — 回答ごとに折りたたみ可能なセクションを表示し、参照した Wiki ページをタイプとアイコンでグループ化
- **引用情報の永続化** — 参照ページはメッセージデータに直接保存され、再起動後も安定
- **再生成** — 最後の回答をワンクリックで再生成（直近の assistant + user メッセージ対を削除して再送信）
- **Wiki に保存** — 価値のある回答を `wiki/queries/` に保管し、自動インジェストでエンティティ／概念を知識ネットワークに抽出

### 9. 思考過程（Thinking / Reasoning）の表示

元の設計にはありません。`<think>` ブロックを出力する LLM（DeepSeek、QwQ など）向けです。

- **ストリーミング表示** — 生成中は 5 行のローリング表示と不透明度のフェードで表示
- **デフォルトで折りたたみ** — 完了後は思考ブロックを隠し、クリックで展開
- **視覚的な分離** — 思考内容はメインの回答とは別のスタイルで表示

### 10. KaTeX による数式レンダリング

元の設計にはありません。全画面で LaTeX 数式をサポートします。

- **KaTeX レンダリング** — インライン `$...$` とブロック `$$...$$` の数式を remark-math + rehype-katex で描画
- **Milkdown 数式プラグイン** — プレビューエディタが @milkdown/plugin-math でネイティブに数式を描画
- **自動検出** — むき出しの `\begin{aligned}` などの LaTeX 環境を自動的に `$$` で囲む
- **Unicode フォールバック** — 数式ブロック外のシンプルなインライン表記用に 100 以上の記号マッピング（α, ∑, →, ≤ など）

### 11. レビューシステム（非同期 Human-in-the-Loop）

元の設計ではインジェスト中に人間が関与することが推奨されています。本プロジェクトでは**非同期レビューキュー**を追加しました。

- インジェスト中に LLM が人間の判断を要する項目をフラグ付け
- **定義済みアクションタイプ**: ページ作成、Deep Research、スキップ。任意のアクションを LLM が捏造（ハルシネーション）しないよう制約
- **インジェスト時に検索クエリを生成** — LLM がレビュー項目ごとに最適化された Web 検索クエリを事前生成
- ユーザーは好きなタイミングでレビュー可能。インジェスト処理を妨げない

### 12. Deep Research

<p align="center">
  <img src="assets/1-deepresearch.jpg" width="100%" alt="Deep Research">
</p>

元の設計にはありません。LLM が知識の空白を特定したときに利用します。

- **Web 検索** — Tavily、SerpApi、SearXNG 経由で関連資料を取得。本文全文の抽出に対応（要約による切り詰めなし）
- **プロバイダー個別設定** — Tavily と SerpApi はそれぞれ独立した API キー。SerpApi は検索エンジンを選択可能、SearXNG はインスタンス URL と検索カテゴリを設定
- **トピックごとに複数の検索クエリ** — インジェスト時に LLM が検索エンジン向けに最適化して生成
- **LLM によるリサーチトピックの最適化** — グラフインサイトから起動した場合、LLM が overview.md + purpose.md を読み込み、汎用的なキーワードではなくドメイン固有のトピックとクエリを生成
- **ユーザー確認ダイアログ** — リサーチ開始前に、編集可能なトピックと検索クエリを表示
- **LLM による統合** — 検索結果を既存 Wiki への相互参照付きのリサーチページに統合
- **思考過程の表示** — 統合中の `<think>` ブロックを折りたたみセクションとして表示し、最新内容に自動スクロール
- **自動インジェスト** — リサーチ結果を自動的に処理し、エンティティ／概念を Wiki に抽出
- **タスクキュー** — 最大 3 件の同時実行
- **リサーチパネル** — 高さが動的に変わる専用サイドバー。ストリーミング進捗をリアルタイム表示

### 13. ブラウザ拡張（Web Clipper）

<p align="center">
  <img src="assets/4-chrome_extension_webclipper.jpg" width="100%" alt="Chrome 拡張 Web Clipper">
</p>

元の設計では Obsidian Web Clipper が言及されています。本プロジェクトでは**専用の Chrome 拡張**（Manifest V3）を構築しました。

- **Mozilla Readability.js** による正確な記事抽出（広告、ナビゲーション、サイドバーを除去）
- **Turndown.js** による HTML → Markdown 変換。テーブルにも対応
- **プロジェクトセレクター** — クリップ先の Wiki を選択（複数プロジェクト対応）
- **ローカル HTTP API**（ポート 19827、tiny_http）— 拡張 ↔ アプリ間の通信
- **自動インジェスト** — クリップした内容が 2 段階インジェストパイプラインを自動的に起動
- **クリップ監視** — 3 秒ごとに新しいクリップをポーリングして自動処理
- **オフラインプレビュー** — アプリが起動していなくても抽出済みコンテンツを表示

### 14. 複数フォーマットのドキュメントサポート

元の設計はテキスト／Markdown が中心です。本プロジェクトではドキュメントの意味構造を保持した構造化抽出に対応しています。

| フォーマット | 抽出方法 |
|--------------|----------|
| PDF | 内蔵 pdf-extract（Rust）+ ファイルキャッシュ。表、数式、複雑なレイアウト向けに MinerU クラウド解析を任意で利用可能 |
| DOCX | docx-rs — 見出し、太字／斜体、リスト、テーブルを構造化 Markdown へ |
| PPTX | ZIP + XML — スライド単位で抽出し、見出し／リスト構造を保持 |
| XLSX/XLS/ODS | calamine — 正しいセル型、複数シート対応、Markdown テーブルに変換 |
| 画像 | ネイティブプレビュー（png, jpg, gif, webp, svg など） |
| 動画／音声 | 内蔵プレイヤー |
| Web クリップ | Readability.js + Turndown.js → クリーンな Markdown |

> MinerU は任意機能です。有効にすると PDF ファイルは解析のため MinerU クラウドへアップロードされます。機密文書には内蔵ローカル解析の利用を推奨します。MinerU 解析に失敗した場合、LLM Wiki は内蔵解析へフォールバックします。MinerU の利用はファイルサイズ、ページ数、クォータ制限の対象です。

### 15. ファイル削除のカスケードクリーンアップ

元の設計には削除機構がありません。本プロジェクトでは**インテリジェントなカスケード削除**を追加しました。

- 資料ファイルを削除すると、対応する Wiki サマリーページも自動削除
- **3 種類のマッチング**で関連 Wiki ページを特定: frontmatter の `sources[]` フィールド、資料サマリーページ名、frontmatter のセクション参照
- **共有エンティティの保護** — 複数の資料にリンクされたエンティティ／概念ページは、ページ自体を削除せず、削除された資料だけを `sources[]` から取り除く
- **index のクリーンアップ** — 削除されたページを index.md から除去
- **wikilink のクリーンアップ** — 削除済みページを指す失効した `[[wikilinks]]` を、残りの Wiki ページから除去

### 16. 設定可能なコンテキストウィンドウ

元の設計にはありません。LLM に渡すコンテキスト量をユーザーが設定できます。

- **4K から 1M トークンまでのスライダー** — LLM ごとの能力に合わせて調整可能
- **比例配分された予算** — ウィンドウが大きいほど Wiki コンテンツの取り分も増える
- **60/20/5/15 の配分** — Wiki ページ／チャット履歴／index／システムプロンプト

### 17. クロスプラットフォーム互換

元の設計はプラットフォーム非依存の抽象パターンです。本プロジェクトでは実際のクロスプラットフォーム問題に対処しています。

- **パス正規化** — 22 以上のファイルで統一の `normalizePath()` を利用し、バックスラッシュ → スラッシュに変換
- **Unicode セーフな文字列処理** — バイトベースではなく文字ベースでスライス（CJK ファイル名でのクラッシュを防止）
- **macOS のクローズ＝隠す** — 閉じるボタンでウィンドウを隠す（アプリはバックグラウンドで継続）。Dock アイコンクリックで復元、Cmd+Q で終了
- **Windows / Linux の終了確認** — 終了時に確認ダイアログを表示し、誤操作によるデータ消失を防止
- **Tauri v2** — macOS、Windows、Linux のネイティブデスクトップ
- **GitHub Actions による CI/CD** — macOS（ARM + Intel）、Windows（.msi）、Linux（.deb / .AppImage）の自動ビルド

### 18. その他の追加機能

- **多言語対応** — 英語と中国語の UI（react-i18next）
- **設定の永続化** — LLM プロバイダー、API キー、モデル、コンテキストサイズ、言語を Tauri Store で保存
- **Obsidian 設定** — 推奨設定入りの `.obsidian/` ディレクトリを自動生成
- **Markdown レンダリング** — 枠線付きの GFM テーブル、整形されたコードブロック、チャットとプレビュー内での wikilink 処理
- **マルチプロバイダー LLM 対応** — OpenAI、Anthropic、Google、Ollama、カスタム。プロバイダーごとにストリーミングとヘッダーを調整
- **15 分タイムアウト** — 長時間のインジェスト処理が早すぎる段階で失敗しないようにする
- **dataVersion シグナル** — Wiki コンテンツの変更に合わせてグラフと UI を自動リフレッシュ

## 技術スタック

| レイヤー | 技術 |
|----------|------|
| デスクトップ | Tauri v2（Rust バックエンド） |
| フロントエンド | React 19 + TypeScript + Vite |
| UI | shadcn/ui + Tailwind CSS v4 |
| エディタ | Milkdown（ProseMirror ベースの WYSIWYG） |
| グラフ | sigma.js + graphology + ForceAtlas2 |
| 検索 | トークン化検索 + グラフ関連度 + 任意のベクトル検索（LanceDB） |
| ベクトル DB | LanceDB（Rust、組み込み、オプション） |
| PDF | pdf-extract + 任意の MinerU クラウド解析 |
| Office | docx-rs + calamine |
| 多言語対応 | react-i18next |
| 状態管理 | Zustand |
| LLM | ストリーミング fetch（OpenAI、Anthropic、Google、Ollama、カスタム） |
| Web 検索 | Tavily、SerpApi、SearXNG JSON API |

## インストール

### ビルド済みバイナリ

[Releases](https://github.com/nashsu/llm_wiki/releases) からダウンロードできます。

- **macOS**: `.dmg`（Apple Silicon + Intel）
- **Windows**: `.msi`
- **Linux**: `.deb` / `.AppImage`

### ソースからビルド

```bash
# 前提条件: Node.js 20+, Rust 1.70+
git clone https://github.com/nashsu/llm_wiki.git
cd llm_wiki
npm install
npm run tauri dev      # 開発モード
npm run tauri build    # 本番ビルド
```

### Chrome 拡張

1. `chrome://extensions` を開く
2. 「デベロッパーモード」を有効にする
3. 「パッケージ化されていない拡張機能を読み込む」をクリック
4. `extension/` ディレクトリを選択

## クイックスタート

1. アプリを起動し、新規プロジェクトを作成（テンプレートを選択）
2. **設定** で LLM プロバイダー（API キー + モデル）を構成
3. 必要に応じて **設定** から Web 検索プロバイダーとソースフォルダの自動監視を構成
4. **ソース** からドキュメント（PDF、DOCX、MD など）をインポート
5. **アクティビティパネル** で LLM が Wiki ページを自動生成する様子を確認
6. **チャット** で知識ベースに質問
7. **知識グラフ** で関連を探索
8. **レビュー** で対応が必要な項目を確認
9. **Lint** を定期的に実行し、Wiki の健全性を維持

## ローカル HTTP API + MCP Server + AI Agent Skill

LLM Wiki は組み込みのローカル HTTP API（`http://127.0.0.1:19828` でリッスン、Token 認証、ローカルホストのみ）を提供します。**Claude Code** や **Codex** などの AI エージェント、または HTTP リクエストを発行できる任意のスクリプトから、直接知識ベースを問い合わせることができます。

- `GET /api/v1/health` — サーバー状態（認証不要）
- `GET /api/v1/projects` — プロジェクト一覧
- `GET /api/v1/projects/{id}/files` / `files/content` — ファイルツリーと本文の取得
- `POST /api/v1/projects/{id}/search` — **ハイブリッド検索**（キーワード + ベクトル）。`mode`、`tokenHits`、`vectorHits` を返し、各結果に `vectorScore` を付与
- `GET /api/v1/projects/{id}/graph` — wikilinks の知識グラフ
- `POST /api/v1/projects/{id}/sources/rescan` — バックエンドの再スキャンをトリガー

**設定 → API + MCP** から API を有効化し、Token を発行できます。必要に応じて、ローカルからの認証なしアクセスも切り替えられます。

MCP 互換クライアント向けに、LLM Wiki には `mcp-server/` も同梱されています。`npm run mcp:build` でビルドしたあと、**設定 → API + MCP** に現在のマシンに合ったパス入りの MCP クライアント設定が表示され、そのままコピーできます。MCP ツールは同じ API を利用するため、エージェントはプロジェクト一覧、ファイル読み取り、ハイブリッド検索、グラフ参照、ソース再スキャンをカスタム HTTP 実装なしで実行できます。

### ワンコマンドで AI エージェントを接続

LLM Wiki 用の **agent skill** は別リポジトリで管理されています。Claude Code / Codex / skills 互換のランタイムにインストールできます。

```bash
npx skills add https://github.com/nashsu/llm_wiki_skill.git --skill llm_wiki_skill
```

インストール後、エージェントは「自分の LLM Wiki に X について何が書かれている？」「自分の知識ベースで Y を検索して」「自分の Wiki グラフで Z の近傍を表示して」「ソースを再スキャンして」といった依頼に対し、ローカルで動いているアプリと直接通信して応答します。デフォルトは読み取り専用で、アプリ内で確認できるよう Wiki ページのパスを引用します。

- **Skill リポジトリ**: <https://github.com/nashsu/llm_wiki_skill>
- **トリガー制約**: 「ノートを検索して」「Obsidian / Notion / Logseq を見て」のような汎用的な依頼には**意図的に反応しません**。LLM Wiki / `my wiki` / `知識庫` / `知識ベース` を明示した場合のみ起動します。

## プロジェクト構成

```
my-wiki/
├── purpose.md              # 目標、主要な問い、調査範囲
├── schema.md               # Wiki 構造ルール、ページタイプ
├── raw/
│   ├── sources/            # アップロードされた文書（不変）
│   └── assets/             # ローカル画像
├── wiki/
│   ├── index.md            # コンテンツ目録
│   ├── log.md              # 操作履歴
│   ├── overview.md         # 全体概要（自動更新）
│   ├── entities/           # 人物、組織、製品
│   ├── concepts/           # 理論、手法、技術
│   ├── sources/            # 資料サマリー
│   ├── queries/            # 保存されたチャット回答 + リサーチ
│   ├── synthesis/          # 資料横断の分析
│   └── comparisons/        # 比較ページ
├── .obsidian/              # Obsidian vault 設定（自動生成）
└── .llm-wiki/              # アプリ設定、チャット履歴、レビュー項目
```

## Star History

<a href="https://www.star-history.com/?repos=nashsu%2Fllm_wiki&type=date&legend=top-left">
 <picture>
   <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=nashsu/llm_wiki&type=date&theme=dark&legend=top-left" />
   <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=nashsu/llm_wiki&type=date&legend=top-left" />
   <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=nashsu/llm_wiki&type=date&legend=top-left" />
 </picture>
</a>

## ライセンス

このプロジェクトは **GNU General Public License v3.0** でライセンスされています。詳細は [LICENSE](LICENSE) を参照してください。
