English | 日本語
会話内容・URL・メモを Obsidian 互換 markdown wiki として継続的に蓄積するためのスキル。Claude Code / Gemini CLI / Codex CLI から利用可能。
SamurAIGPT/llm-wiki-agent の設計思想を参考に、Obsidian vault 内のサブフォルダへ書き込みます。会話から抽出した情報を sources / entities / concepts の 3 層構造で整理し、[[wikilink]] による相互参照、7 種の整合性 lint、フォルダ自動分割まで含めてサポートします。
- 会話 → wiki: 会話の内容を要約・構造化して markdown として保存
- URL → wiki: WebFetch で取得した記事を要約・構造化して保存
- 既存ページ更新: タイトル/alias 一致で既存ページに追記または再生成
- 自動
[[wikilink]]付与: 既存ページ名との一致を検出して自動リンク - 7 種 lint: フォルダ規模 / ファイル長 / index.md 完全性 / index.md 鮮度・リンク妥当性 / subfolder-exclusivity / citation-required / misc-flat
- フォルダ自動分割: 閾値超過時にトピック別サブフォルダへ再編成(承認付き)
- ユーザー承認必須: トリガー発火後もユーザー承認なしには書き込まない(非対話モード時を除く、後述)
- 非対話モード:
claude -p等で承認待ち無しに完走できるモード。lint error は自動修正リトライ - マルチ CLI 対応: 同じスクリプトと同じ手順書(references)を 3 つの CLI で共有
| CLI | スキル形式 | 自動トリガー | 明示呼び出し | セットアップ |
|---|---|---|---|---|
| Claude Code | ~/.claude/skills/grow-wiki/SKILL.md |
✅ frontmatter のキーワード検知 | 発話で誘導 | symlink |
| Codex CLI | ~/.agents/skills/grow-wiki/SKILL.md |
✅ description マッチで暗黙起動 | /skills grow-wiki / $grow-wiki |
symlink |
| Gemini CLI | ~/.gemini/commands/wiki-*.toml |
❌(明示コマンドのみ) | /wiki-save / /wiki-url / /wiki-ask / /wiki-lint / /wiki-init |
TOML 生成 |
スクリプト(lint.js / list-pages.js / rebuild-index.js / health-check.js / init-vault.js)と
手順書(.skill/references/*.md)は すべての CLI で共通です。
- Node.js 20 以上(Gemini CLI / Codex CLI を入れた時点で標準で入っている。
node --versionで確認) - いずれかの対応 CLI(Claude Code / Codex CLI / Gemini CLI)
- Obsidian(閲覧用、任意)
Python・Bash は 不要になりました(v0.1 以降、TypeScript / Node.js ベース)。
git clone https://github.com/<your-github-user>/grow-wiki.git
cd grow-wikivault の書き込み先(Obsidian vault 内のサブフォルダの絶対パス)を指定。未設定時は全スクリプトが停止し設定方法を表示します(デフォルト値なし)。
[Environment]::SetEnvironmentVariable("GROW_WIKI_ROOT", "C:\Users\<your>\Documents\Obsidian Vault\grow-wiki", "User")設定後は PowerShell を開き直すこと。
setx GROW_WIKI_ROOT "C:\Users\<your>\Documents\Obsidian Vault\grow-wiki"export GROW_WIKI_ROOT="/absolute/path/to/YourObsidianVault/grow-wiki"~/.bashrc / ~/.zshrc 等に追加して永続化。
| CLI | 設定ファイル |
|---|---|
| Claude Code | ~/.claude/settings.json の env セクション |
| Gemini CLI | ~/.gemini/settings.json の env セクション |
| Codex CLI | OS 環境変数を使う |
例(Claude Code / Gemini CLI 共通の JSON 形式):
{
"env": {
"GROW_WIKI_ROOT": "/absolute/path/to/Obsidian Vault/grow-wiki"
}
}それぞれの CLI 用に下記のセクションを参照。
クロスプラットフォーム(Windows / macOS / Linux)対応のインストーラ:
node integrations/claude/install.mjsこれで ~/.claude/skills/grow-wiki -> <repo>/.skill の symlink(Windows では directory junction)が作られます。
プロジェクトスコープに置きたい場合は出力先を引数で指定:
node integrations/claude/install.mjs /path/to/your-project/.claude/skillsshell から手動で symlink したい場合(macOS / Linux):
ln -s "$(pwd)/.skill" ~/.claude/skills/grow-wikinode integrations/codex/install.mjs詳細は integrations/codex/install.md。
node integrations/gemini/install.mjs詳細は integrations/gemini/install.md。
node ~/.claude/skills/grow-wiki/scripts/init-vault.js(Codex CLI の場合は ~/.agents/skills/grow-wiki/scripts/init-vault.js、または直接 node <repo>/.skill/scripts/init-vault.js。)
$GROW_WIKI_ROOT に以下の構造が作られます(既存ファイルは上書きしない、冪等):
<GROW_WIKI_ROOT>/
├── index.md # ルート索引(自動生成)
├── overview.md # 横断サマリ
├── log.md # 更新履歴(append-only)
├── sources/
│ ├── conversations/
│ └── urls/
├── entities/
└── concepts/
Obsidian で $GROW_WIKI_ROOT の親ディレクトリ(vault ルート)を開きます。既存 vault 内のサブフォルダとして grow-wiki/ が表示され、[[wikilink]] もそのまま認識されます。
会話で次のように発話すれば、SKILL.md の指示に従って AI が動きます。
- 「grow-wiki に保存」「wiki に追加」 — いまの会話内容を wiki 化
- 「この URL を取り込んで」 — URL から wiki ページを生成
- 「〇〇ページを更新」 — 既存ページに追記または再生成
- 「grow-wiki に聞いて」「wiki を見て答えて」 — 蓄積した知識を参照して回答
- 「以前の〇〇の話」「前に書いた〇〇」 — キーワードから関連ページを探して回答に引用
以下のキーワードが会話に現れると「grow-wiki に保存しましょうか?」と提案します。
- 「メモっておいて」「メモしとく」
- 「覚えておいて」「記憶しておいて」
- 「あとで読む」
- 「ブックマーク」「保存しとく」
- 「grow-wiki で lint」 — 整合性チェックを実行
- 「grow-wiki の index を再生成」 — 各フォルダ index.md を再生成
- 「grow-wiki の health check」 — broken link / orphan を確認
Gemini CLI は自動トリガーをサポートしないため、必ず /wiki- プレフィックスで明示的に呼びます。
| コマンド | 動作 |
|---|---|
/wiki-init |
vault 初期化 |
/wiki-save |
現在の会話を保存 |
/wiki-save 〇〇について |
引数でフォーカスする話題を指定 |
/wiki-url <url> |
URL を取り込み |
/wiki-ask <質問> |
蓄積した情報を参照して回答 |
/wiki-lint |
整合性チェック |
書き込みは必ずユーザー承認を経由します。 ingest の前にプレビューが表示され、承認して初めてファイルが作成・更新されます(非対話モード時を除く、次節参照)。
承認待ちができない実行環境向けに非対話モードを用意しています。
環境変数 GROW_WIKI_NONINTERACTIVE=1(または true)をセットします。claude -p 起動時はコンテキストから自動判定されることもあります。
GROW_WIKI_NONINTERACTIVE=1 claude -p "今日の React Hooks の話を wiki 化して"| 局面 | 通常 | 非対話モード |
|---|---|---|
| 対象範囲の確認 | 聞く | 直前の指示内容全体を採用 |
| プレビュー承認 | 聞く | 即書き込み |
| キーワード自動提案(「メモっておいて」等の曖昧トリガー) | 提案 | スキップ(明示指示のみ書き込み) |
| 既存ページ統合(Jaccard > 0.7) | 聞く | 統合(追記更新) |
| フォルダ自動分割 | 聞く | 自動実行 |
| lint error | 修正提案 | 自動修正してリトライ(最大 3 回) |
非対話モードでは ingest 完了後の lint error をルール別に自動修正します。
| ルール | 自動アクション |
|---|---|
| L1 folder-size error | folder-rebalance を自動実行 |
| L2 file-length error | 大セクションを別ページ化(log.md は L2 対象外) |
| L3 / L4 index 系 | rebuild-index.js を自動実行 |
| L5 subfolder-exclusivity | 直下ページを既存サブフォルダか misc/ へ移動 |
| L6 citation-required | 当該 ingest の source-conversation への [[wikilink]] を出典に自動挿入 |
| L7 misc-flat | misc 内サブフォルダを親フォルダへ昇格 |
修正不能な error はサマリ末尾に「未解決」として明示するので、後追いでリファクタリング指示を出せます。
- 既存ページの再生成(追記のみ。再生成は明示指示時)
- ページ削除
overview.mdの全置換log.md過去エントリの書き換え(アーカイブ切り出しのみ)
# vault 初期化(冪等)
node <repo>/.skill/scripts/init-vault.js
# 全 index.md 再生成
node <repo>/.skill/scripts/rebuild-index.js
# リンク整合性チェック(broken / orphan)
node <repo>/.skill/scripts/health-check.js
# lint(L1〜L7 の 7 ルール)
node <repo>/.skill/scripts/lint.js
# 全ページの frontmatter を JSON 列挙
node <repo>/.skill/scripts/list-pages.js<repo> は clone 先のパス、または symlink 経由で ~/.claude/skills/grow-wiki / ~/.agents/skills/grow-wiki。
| # | チェック | warn 閾値 | error 閾値 |
|---|---|---|---|
| L1 | フォルダ内項目数(ファイル + サブフォルダ) | 20 | 40 |
| L2 | ファイル長 | 300 行 / 8000 字 | 500 行 / 15000 字 |
| L3 | index.md 完全性 | — | 欠落 or 余剰あり |
| L4 | index.md 鮮度・リンク妥当性 | 古い | リンクテキスト不一致 |
| L5 | subfolder-exclusivity(サブフォルダがあれば直下にページを置かない) | — | 直下にページあり |
| L6 | citation-required(entity/concept に出典、source-url に source_url) | 出典なし | — |
| L7 | misc-flat(misc/etc/others 下にサブフォルダを作らない) | — | サブフォルダあり |
- L1 folder-size — 1 フォルダに並ぶ項目数が多すぎると目的のページを探しにくくなる。サブフォルダに分けても「見える項目数」は減らないので、ファイル + サブフォルダの合計で制限する。閾値を超えたら folder-rebalance でトピック別に分割する
- L2 file-length — wiki 記事は短く保つほうが再利用性が高い。長くなるのは複数トピックが混ざっているか、本来別ページとして切り出すべき節が膨らんだサイン。error レベルに達したら節を entity / concept として分離する
- L3 index-completeness — 各フォルダの
index.mdは「そのフォルダ直下の全ページを網羅する」という約束で自動生成されている。欠落(載ってないページがある)や余剰(削除済みのページへのリンクが残る)は整合性違反で、探索時の迷子・broken link の温床になる - L4 index-freshness — index.md の
last_updatedより新しいページがある、あるいは index 内のリンクテキストが現在のtitle/aliasesと食い違うと、新しい情報が vault にあっても発見できない。タイトル変更後の再生成漏れを検出する - L5 subfolder-exclusivity — サブフォルダがあるフォルダの直下にもページを残すと、同じ階層で「サブフォルダ側も直下も見なければならない」状態になり発見性が半減する。rebalance したら全部サブフォルダへ移動(該当なしは misc へ)を強制する
- L6 citation-required — 出典のない情報は wiki として信頼できず、後から裏付けも取れない。会話は
[[source ページ]]、書籍は販売サイト URL(Amazon / 出版社公式等)、記事は公開ページ URL を張る。リンクがあれば後日 health-check で有効性を機械チェックできる余地も残る - L7 misc-flat —
misc/etc/othersは「分類できなかったもの」の雑多置き場。中で階層化すると「雑多の中の雑多」になり、存在価値を失う。肥大化したら misc 内で再分類するのではなく、親フォルダ側に新カテゴリを作って該当ページを引き上げる
閾値の変更は .skill/references/lint-rules.md と .skill/scripts/src/lint.ts を同じ値に揃え、pnpm build で再ビルドします。
- 自動書き込み禁止: トリガー発火後もユーザー承認を経由(非対話モード時は明示指示でのみ書き込み)
[[wikilink]]形式のみ: 相対パスや絶対パスは書かない(Obsidian の自動リンク追従を活かすため)- index.md は自動生成: 手動編集禁止。更新は
node .skill/scripts/rebuild-index.jsで - log.md は append-only: 過去エントリを書き換えない(L2 lint の対象外なので長さ制限なし)
詳細は .skill/SKILL.md と .skill/references/ を参照。
スクリプトは TypeScript で書かれ、esbuild で .js にバンドル(js-yaml 同梱)。
配布物(.skill/scripts/*.js)は repo にコミット済みなので、エンドユーザーは npm install 不要です。
編集する場合のみ:
pnpm install # devDeps(typescript, esbuild, js-yaml, @types/node)
pnpm build # .skill/scripts/src/*.ts → .skill/scripts/*.js
pnpm typecheck # tsc --noEmitビルド後は .js ファイルもコミットしてプッシュ。
grow-wiki/ ← このリポジトリ(clone 先)
├── .skill/ ← スキル本体(Claude Code / Codex CLI で symlink 利用)
│ ├── SKILL.md ← エントリポイント(frontmatter で自動トリガー)
│ ├── references/ ← 設計ドキュメント(全 CLI 共通の手順書)
│ │ ├── frontmatter-spec.md
│ │ ├── triggers.md
│ │ ├── conversation-ingest-flow.md
│ │ ├── url-ingest-flow.md
│ │ ├── update-logic.md
│ │ ├── wikilink-rules.md
│ │ ├── naming-conventions.md
│ │ ├── page-templates.md
│ │ ├── folder-rebalance.md
│ │ ├── lint-rules.md
│ │ └── query-flow.md
│ ├── scripts/ ← Node.js 配布物(TypeScript からビルド)
│ │ ├── src/ ← TypeScript ソース(編集対象)
│ │ ├── package.json ← {"type": "commonjs"}(実行時の隔離用)
│ │ ├── lint.js ← node .skill/scripts/lint.js で実行
│ │ ├── list-pages.js
│ │ ├── health-check.js
│ │ ├── rebuild-index.js
│ │ └── init-vault.js
│ └── assets/
│ └── templates/ ← 8 本のページテンプレート
├── integrations/
│ ├── claude/ ← Claude Code 統合
│ │ └── install.mjs ← ~/.claude/skills/grow-wiki への symlink 作成
│ ├── codex/ ← Codex CLI 統合
│ │ ├── install.mjs ← ~/.agents/skills/grow-wiki への symlink 作成
│ │ └── install.md
│ └── gemini/ ← Gemini CLI 統合
│ ├── install.mjs ← ~/.gemini/commands/wiki-*.toml を生成
│ ├── install.md
│ └── templates/ ← TOML テンプレート(プレースホルダ展開)
├── package.json ← devDeps: typescript, esbuild, js-yaml, @types/node
├── tsconfig.json
├── scripts/
│ └── build.mjs ← esbuild ビルドスクリプト(pnpm build)
├── README.md ← 日本語(主)
├── README.en.md ← English
└── LICENSE
<GROW_WIKI_ROOT>/ ← wiki コンテンツの書き込み先(別 Obsidian vault 内)
├── index.md / overview.md / log.md
├── sources/{conversations,urls}/
├── entities/
└── concepts/
リポジトリ本体には wiki コンテンツは含みません。wiki は $GROW_WIKI_ROOT に個別に蓄積されます。
MIT. See LICENSE.