Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

wiki-export

ObsidianウィキのナレッジグラフをJSON、GraphML、Neo4j用Cypher、インタラクティブHTMLなどの形式にエクスポートします。「export wiki」「export to JSON」「visualize wiki」などの指示があったとき、または外部ツールでウィキデータを活用したいときに使用し、vault直下の`wiki-export/`ディレクトリに各ファイルを出力します。

description の原文を見る

> Export the Obsidian wiki's knowledge graph to structured formats for use in external tools. Use this skill when the user says "export wiki", "export graph", "export to JSON", "export to Gephi", "export to Neo4j", "graphml", "visualize wiki", "knowledge graph export", or wants to use their wiki data in another tool. Outputs graph.json, graph.graphml, cypher.txt (Neo4j), and graph.html (interactive browser visualization) into a wiki-export/ directory at the vault root.

SKILL.md 本文

Wiki Export — ナレッジグラフエクスポート

wiki の wikilink グラフを構造化フォーマットにエクスポートして、外部ツール (Gephi、Neo4j、カスタムスクリプト、ブラウザビジュアライゼーション) で使用できるようにしています。

開始する前に

  1. Config を解決するllm-wiki/SKILL.md の Config Resolution Protocol に従う (CWD から .env~/.obsidian-wiki/config → プロンプトセットアップを上に歩む)。これにより OBSIDIAN_VAULT_PATH が得られます
  2. vault にエクスポートするページがあることを確認する — ページ数が 5 未満の場合、ユーザーに警告して停止します

可視性フィルタ (オプション)

デフォルトでは、すべてのページがエクスポート され、可視性タグに関わらず既存の動作が保持されます。

ユーザーがフィルタ付きエクスポートをリクエストした場合 — 「public export」「user-facing export」「exclude internal」「no internal pages」 などのフレーズ — フィルタモード を有効にします:

  • ブロックタグセット を構築: {visibility/internal, visibility/pii}
  • ノードリストを構築する際に、frontmatter タグにブロックタグを含むページをスキップ
  • 除外されたエンドポイントを持つエッジはスキップ
  • サマリーにフィルタを記録: (filtered: visibility/internal, visibility/pii excluded)

visibility/ タグがないページ、または visibility/public タグ付きのページは常に含まれます。

ステップ 1: ノードとエッジのリストを構築

vault 内のすべての .md ファイルを glob (_archives/_raw/.obsidian/index.mdlog.md_insights.md を除く)。フィルタモードでは、タグに visibility/internal または visibility/pii を含むページもスキップします。

各ページに対して、frontmatter から以下を抽出します:

  • id — vault ルートからの相対パス、.md 拡張子なし (例: concepts/transformers)
  • label — frontmatter の title フィールド、またはない場合はファイル名
  • category — ディレクトリプレフィックス (conceptsentitiesskillsreferencessynthesisprojects、または journal)
  • tags — frontmatter tags フィールドから配列
  • summary — frontmatter summary フィールド (ある場合)

これが ノードリスト です。

各ページについて、本文を \[\[.*?\]\] でグレップしてすべての wikilink を抽出:

  • [[target]] または [[target|display]] をパース — target 部分のみを使用
  • target をノード id に解決 (正規化: 小文字、スペース→ハイフン、.md を削除)
  • ノードリストの外を指すリンクをスキップ (破損リンク)
  • 各解決されたリンクはエッジになります: {source: page_id, target: linked_id, relation: "wikilink", confidence: "EXTRACTED"}
  • リンク元の文が ^[inferred] または ^[ambiguous] で終わる場合、confidence をそれに応じてオーバーライド

タイプ付きエッジのエンリッチメント: wikilink エッジリストを構築した後、各ページの relationships: frontmatter ブロックを読みます。各 {target, type} エントリについて:

  • target YAML 値は "[[concepts/lstm]]" のようなクォーテーションされた wikilink 文字列です。周囲の [[]] 文字を削除し、同じ正規化 (小文字、スペース→ハイフン、.md を削除) を適用してノード id を取得します。
  • ノードリストに含まれていない解決された target を持つエントリをスキップ (破損リンク)
  • この (source, target) ペアのエッジがすでに存在する場合、その relation フィールドをタイプ付き値 (例: "contradicts") でオーバーライドし、typed: true を設定
  • このペアのエッジがまだ存在しない場合、追加: {source: page_id, target: target_id, relation: <type>, confidence: "EXTRACTED", typed: true}

つまり relation: "wikilink" は単純なタイプなしリンクのデフォルトです; relationships: エントリはそれを名前付きセマンティックタイプに昇格させます。本文 wikilink と relationships: エントリの両方から発生したエッジは単一レコードを保持します — タイプ付きバージョンが優先されます。

これが エッジリスト です。

ステップ 2: コミュニティ ID を割り当て

タグクラスタリングによってページをコミュニティにグループ化:

  • 同じ支配的タグを共有するページは同じコミュニティに属する
  • 支配的タグ = ページの frontmatter tags 配列の最初のタグ
  • タグなしのページはコミュニティ id null を取得
  • コミュニティに 0 から番号を付け、サイズの降順 (最大のコミュニティ = 0) でソート

これにより、HTML ビジュアライゼーションと Gephi のようなツールでコミュニティベースの色分けが可能になります。

ステップ 3: 出力ファイルを書き込む

vault ルートに wiki-export/ を作成 (存在しない場合)。4 つすべてのファイルを書き込みます:


3a. graph.json

NetworkX node_link フォーマット — グラフツールとスクリプト向けの標準:

{
  "directed": false,
  "multigraph": false,
  "graph": {
    "exported_at": "<ISO timestamp>",
    "vault": "<OBSIDIAN_VAULT_PATH>",
    "total_nodes": N,
    "total_edges": M
  },
  "nodes": [
    {
      "id": "concepts/transformers",
      "label": "Transformer Architecture",
      "category": "concepts",
      "tags": ["ml", "architecture"],
      "summary": "The attention-based architecture introduced in Attention Is All You Need.",
      "community": 0
    }
  ],
  "links": [
    {
      "source": "concepts/transformers",
      "target": "entities/vaswani",
      "relation": "wikilink",
      "confidence": "EXTRACTED"
    },
    {
      "source": "concepts/transformers",
      "target": "concepts/lstm",
      "relation": "contradicts",
      "confidence": "EXTRACTED",
      "typed": true
    }
  ]
}

3b. graph.graphml

GraphML XML フォーマット — Gephi、yEd、Cytoscape で読み込み可能:

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/graphml">
  <key id="label" for="node" attr.name="label" attr.type="string"/>
  <key id="category" for="node" attr.name="category" attr.type="string"/>
  <key id="tags" for="node" attr.name="tags" attr.type="string"/>
  <key id="community" for="node" attr.name="community" attr.type="int"/>
  <key id="relation" for="edge" attr.name="relation" attr.type="string"/>
  <key id="type" for="edge" attr.name="type" attr.type="string"/>
  <key id="confidence" for="edge" attr.name="confidence" attr.type="string"/>
  <graph id="wiki" edgedefault="undirected">
    <node id="concepts/transformers">
      <data key="label">Transformer Architecture</data>
      <data key="category">concepts</data>
      <data key="tags">ml, architecture</data>
      <data key="community">0</data>
    </node>
    <!-- Untyped wikilink — no <data key="type"> element -->
    <edge source="concepts/transformers" target="entities/vaswani">
      <data key="relation">wikilink</data>
      <data key="confidence">EXTRACTED</data>
    </edge>
    <!-- Typed edge from relationships: block -->
    <edge source="concepts/transformers" target="concepts/lstm">
      <data key="relation">contradicts</data>
      <data key="type">contradicts</data>
      <data key="confidence">EXTRACTED</data>
    </edge>
  </graph>
</graphml>

各ページに 1 つの <node> を書き込み、各リンクに 1 つの <edge> を書き込みます。タイプ付きエッジ (エッジリストで typed: true のもの) について、<data key="relation"> をセマンティックタイプ値 <data key="type"> を同じ値で出力します — これにより、すでにそれを消費するツールが読める relation を保持しながら、タイプ対応ツールが専用の type キーでフィルタできるようにします。タイプなし wikilink は <data key="type"> 要素を完全に省略します。


3c. cypher.txt

Neo4j Cypher MERGE ステートメント — Neo4j Browser に貼り付けるか cypher-shell で実行:

// Wiki knowledge graph export — <TIMESTAMP>
// Load with: cypher-shell -u neo4j -p password < cypher.txt

// Nodes
MERGE (n:Page {id: "concepts/transformers"}) SET n.label = "Transformer Architecture", n.category = "concepts", n.tags = ["ml","architecture"], n.community = 0;
MERGE (n:Page {id: "entities/vaswani"}) SET n.label = "Ashish Vaswani", n.category = "entities", n.tags = ["person","ml"], n.community = 0;
MERGE (n:Page {id: "concepts/lstm"}) SET n.label = "LSTM", n.category = "concepts", n.tags = ["ml","rnn"], n.community = 0;

// Relationships
// Untyped wikilinks use [:WIKILINK]
MATCH (a:Page {id: "concepts/transformers"}), (b:Page {id: "entities/vaswani"}) MERGE (a)-[:WIKILINK {relation: "wikilink", confidence: "EXTRACTED"}]->(b);
// Typed edges use the relationship type as the label (UPPERCASE)
MATCH (a:Page {id: "concepts/transformers"}), (b:Page {id: "concepts/lstm"}) MERGE (a)-[:CONTRADICTS {relation: "contradicts", confidence: "EXTRACTED"}]->(b);

ページごとに 1 つの MERGE ノードステートメント、エッジごとに 1 つの MATCH/MERGE リレーションシップステートメントを書き込みます。タイプ付きエッジの場合、type 値を大文字にして Cypher リレーションシップラベルとして使用 (例: contradicts[:CONTRADICTS]derived_from[:DERIVED_FROM])。タイプなし wikilink は常に [:WIKILINK] を使用します。


3d. graph.html

vis.js CDN を使用した自己完結型インタラクティブビジュアライゼーション (ローカル依存なし)。ユーザーはこのファイルをブラウザで開くだけです — サーバーは不要です。

HTML ファイルを以下のように生成:

  1. vis.js 用のノードオブジェクト JSON 配列を生成:
{id: "concepts/transformers", label: "Transformer Architecture", color: {background: "#4E79A7"}, size: <degree * 3 + 8>, title: "concepts | #ml #architecture", community: 0}
  • コミュニティ別に色分け (サイクル: #4E79A7#F28E2B#E15759#76B7B2#59A14F#EDC948#B07AA1#FF9DA7#9C755F#BAB0AC)
  • 度数別にサイズ (着信 + 発信リンク数): size = degree * 3 + 8、60 でキャップ
  • title = ホバー時に表示されるツールチップテキスト: カテゴリ、タグ、サマリー (利用可能な場合)
  1. vis.js 用のエッジオブジェクト JSON 配列を生成:
// Untyped wikilink
{from: "concepts/transformers", to: "entities/vaswani", dashes: false, width: 1, color: {color: "#666", opacity: 0.6}, title: "wikilink"}
// Typed edge
{from: "concepts/transformers", to: "concepts/lstm", dashes: false, width: 2, color: {color: "#E15759", opacity: 0.8}, label: "contradicts", font: {size: 9, color: "#ccc"}, title: "contradicts"}
  • INFERRED エッジの場合 dashes: true
  • AMBIGUOUS エッジの場合 dashes: [4,8]
  • タイプ付きエッジ (typed: true): width: 2 を設定、タイプを示す label フィールドを追加、タイプ固有の色を適用:
タイプエッジ色
extends#59A14F (緑)
implements#4E79A7 (青)
contradicts#E15759 (赤)
derived_from#F28E2B (橙)
uses#76B7B2 (ティール)
replaces#B07AA1 (紫)
related_to#BAB0AC (灰色 — タイプなしと同じ)

タイプなし wikilink エッジは既存の #666 灰色を保持し、ラベルはありません。

  1. 完全な HTML ファイルを書き込み:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Wiki Knowledge Graph</title>
<script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
<style>
  * { box-sizing: border-box; margin: 0; padding: 0; }
  body { background: #0f0f1a; color: #e0e0e0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; display: flex; height: 100vh; }
  #graph { flex: 1; }
  #sidebar { width: 260px; background: #1a1a2e; border-left: 1px solid #2a2a4e; padding: 14px; overflow-y: auto; font-size: 13px; }
  #sidebar h3 { color: #aaa; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; margin: 0 0 10px; }
  #info { margin-bottom: 16px; line-height: 1.6; color: #ccc; }
  .legend-item { display: flex; align-items: center; gap: 8px; padding: 3px 0; font-size: 12px; }
  .dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
  #stats { margin-top: 16px; color: #555; font-size: 11px; }
</style>
</head>
<body>
<div id="graph"></div>
<div id="sidebar">
  <h3>Wiki Knowledge Graph</h3>
  <div id="info">Click a node to see details.</div>
  <h3 style="margin-top:12px">Communities</h3>
  <div id="legend"><!-- populated by JS --></div>
  <div id="stats"><!-- populated by JS --></div>
</div>
<script>
const NODES_DATA = /* NODES_JSON */;
const EDGES_DATA = /* EDGES_JSON */;
const COMMUNITY_COLORS = ["#4E79A7","#F28E2B","#E15759","#76B7B2","#59A14F","#EDC948","#B07AA1","#FF9DA7","#9C755F","#BAB0AC"];

const nodes = new vis.DataSet(NODES_DATA);
const edges = new vis.DataSet(EDGES_DATA);
const network = new vis.Network(document.getElementById('graph'), {nodes, edges}, {
  physics: { solver: 'forceAtlas2Based', forceAtlas2Based: { gravitationalConstant: -60, springLength: 120 }, stabilization: { iterations: 200 } },
  interaction: { hover: true, tooltipDelay: 100 },
  nodes: { shape: 'dot', borderWidth: 1.5 },
  edges: { smooth: { type: 'continuous' }, arrows: { to: { enabled: true, scaleFactor: 0.4 } } }
});
network.once('stabilizationIterationsDone', () => network.setOptions({ physics: { enabled: false } }));

network.on('click', ({nodes: sel}) => {
  if (!sel.length) return;
  const n = NODES_DATA.find(x => x.id === sel[0]);
  if (!n) return;
  document.getElementById('info').innerHTML = `<b>${n.label}</b><br>Category: ${n.category||'—'}<br>Tags: ${n.tags||'—'}<br>${n.summary ? '<br>'+n.summary : ''}`;
});

// Build legend
const communities = {};
NODES_DATA.forEach(n => { if (n.community != null) communities[n.community] = (communities[n.community]||0)+1; });
const leg = document.getElementById('legend');
Object.entries(communities).sort((a,b)=>b[1]-a[1]).forEach(([cid, count]) => {
  const color = COMMUNITY_COLORS[cid % COMMUNITY_COLORS.length];
  leg.innerHTML += `<div class="legend-item"><div class="dot" style="background:${color}"></div>Community ${cid} (${count})</div>`;
});
document.getElementById('stats').textContent = `${NODES_DATA.length} pages · ${EDGES_DATA.length} links`;
</script>
</body>
</html>

/* NODES_JSON *//* EDGES_JSON */ をステップ 1 で生成した実際の JSON 配列に置き換えます。


ステップ 4: サマリーを出力

Wiki export complete → wiki-export/
  graph.json    — N nodes, M edges (NetworkX node_link format)
  graph.graphml — N nodes, M edges (Gephi / yEd / Cytoscape)
  cypher.txt    — N MERGE nodes + M MERGE relationships (Neo4j)
  graph.html    — interactive browser visualization (open in any browser)

フィルタモードでは、除外されたものを示す行を追加:

  (filtered: X of Y pages excluded — visibility/internal, visibility/pii)

注記

  • 再実行は安全 — すべての出力ファイルは実行のたびに上書きされます
  • 破損した wikilink はスキップされます — vault に存在するページへのエッジのみがエクスポートされます
  • wiki-export/ ディレクトリは gitignore されるべき (vault がバージョン管理されている場合) — これらは派生成果物です
  • graph.json は主要フォーマット — その他はそれから派生しています。将来のツールがグラフクエリをネイティブサポートする場合は、graph.json を指してください

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
ar9av
リポジトリ
ar9av/obsidian-wiki
ライセンス
MIT
最終更新
不明

Source: https://github.com/ar9av/obsidian-wiki / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: ar9av · ar9av/obsidian-wiki · ライセンス: MIT