mcpField
R
research-lit

research-lit

github.com/wanshuiyin生産性18.2k623 回インストール4 日前に更新
リポジトリ

research-lit について

研究テーマに関連する文献を、設定済みの論文ライブラリや外部ソースから検索する研究者向けスキルです。ローカル PDF やノートとオンライン検索を組み合わせ、ソース選択や連携機能が使えない場合の継続にも対応します。

主な機能

  1. 01ローカルの論文 PDF を検索
  2. 02利用可能な場合に Zotero と Obsidian を検索
  3. 03外部文献ソースの選択
  4. 04論文のメタデータと注釈の抽出
  5. 05arXiv ダウンロードの任意設定

活用シーン

  1. 01研究テーマに関する論文の調査
  2. 02ローカルライブラリ内の論文レビュー
  3. 03Zotero の注釈を含めた文献整理
  4. 04指定したソースに検索範囲を限定

MCP 対応

設定されている場合、MCP ツールを通じて Zotero と Obsidian を検索できます。文献項目、ノート、注釈、関連する研究情報を取得します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill research-lit

インストール後、Claude Code で/research-litを入力して読み込まれたか確認します。

詳細

研究文献レビュー

研究テーマ:$ARGUMENTS

定数

  • PAPER_LIBRARY — ユーザーの論文コレクション(PDF)を含むローカルディレクトリ。以下のパスを順に確認します。
    1. 現在のプロジェクトディレクトリ内の papers/
    2. 現在のプロジェクトディレクトリ内の literature/
    3. CLAUDE.md の ## Paper Library でユーザーが指定したカスタムパス
  • MAX_LOCAL_PAPERS = 20 — スキャンするローカル PDF の最大数(それぞれ最初の 3 ページを読み取ります)。見つかった PDF がこれを超える場合は、ファイル名とトピックの関連性に基づいて優先順位を付けます。
  • SOURCES = all — 検索する文献ソース。選択肢:zotero、obsidian、local、web、semantic-scholar、deepxiv、exa、gemini、openalex、all。ソースの一覧と選択ルールについては、以下の ## Data Sources を参照してください。
  • ARXIV_DOWNLOAD = false — true の場合、検索後に関連性の高い arXiv PDF の上位 3〜5 件を PAPER_LIBRARY にダウンロードします。false(デフォルト)の場合は、arXiv API を介してメタデータ(タイトル、要約、著者)のみを取得し、ファイルはダウンロードしません。
  • ARXIV_MAX_DOWNLOAD = 5 — ARXIV_DOWNLOAD = true の場合にダウンロードする PDF の最大数。

💡 上書き設定:

  • /research-lit "topic" — paper library: ~/my_papers/ — ローカル PDF のカスタムパス
  • /research-lit "topic" — sources: zotero, local — Zotero とローカル PDF のみを検索
  • /research-lit "topic" — sources: web — ウェブのみを検索(すべてのローカルソースをスキップ)
  • /research-lit "topic" — sources: web, semantic-scholar — Semantic Scholar でも出版済みの会議論文を検索(IEEE、ACM など)
  • /research-lit "topic" — sources: all, deepxiv — デフォルトのソースに加えて DeepXiv を使用
  • /research-lit "topic" — arxiv download: true — 関連性の高い arXiv PDF をダウンロード
  • /research-lit "topic" — arxiv download: true, max download: 10 — PDF を最大 10 件ダウンロード

データソース

このスキルは、優先順位順に複数のソースを確認します。すべて任意です。ソースが設定されていない場合、または要求されていない場合は、通知せずにスキップします。

ソースの選択

— sources: ディレクティブについて $ARGUMENTS を解析します。

  • — sources: が指定されている場合:指定されたソースのみを検索します(カンマ区切り)。有効な値:zotero、obsidian、local、web、semantic-scholar、deepxiv、exa、gemini、openalex、all。
  • 指定されていない場合:デフォルトで all を使用し、利用可能なすべてのソースを優先順位順に検索します(semantic-scholar、deepxiv、exa、gemini、openalex は all から除外されており、明示的に指定する必要があります)。

例:

/research-lit "diffusion models"                                    → all (default, no S2)
/research-lit "diffusion models" — sources: all                     → all (default, no S2)
/research-lit "diffusion models" — sources: zotero                  → Zotero only
/research-lit "diffusion models" — sources: zotero, web             → Zotero + web
/research-lit "diffusion models" — sources: local                   → local PDFs only
/research-lit "topic" — sources: obsidian, local, web               → skip Zotero
/research-lit "topic" — sources: web, semantic-scholar              → web + S2 API (IEEE/ACM venue papers)
/research-lit "topic" — sources: deepxiv                            → DeepXiv only
/research-lit "topic" — sources: all, deepxiv                       → default sources + DeepXiv
/research-lit "topic" — sources: all, semantic-scholar              → all + S2 API
/research-lit "topic" — sources: exa                               → Exa only (broad web + content extraction)
/research-lit "topic" — sources: all, exa                          → default sources + Exa web search
/research-lit "topic" — sources: gemini                            → Gemini only (AI-powered broad discovery)
/research-lit "topic" — sources: all, gemini                       → default sources + Gemini discovery
/research-lit "topic" — sources: gemini, semantic-scholar           → Gemini + S2 (broad discovery + venue metadata)
/research-lit "topic" — sources: openalex                          → OpenAlex only (open citation graph + institutions)
/research-lit "topic" — sources: semantic-scholar, openalex         → S2 + OpenAlex (complementary metadata)
ソース一覧
優先度ソースID検出方法提供内容
1Zotero(MCP 経由)zotero任意の mcp__zotero__* ツールの呼び出しを試します。利用できない場合はスキップしますコレクション、タグ、注釈、PDF のハイライト、BibTeX、セマンティック検索
2Obsidian(MCP 経由)obsidian任意の mcp__obsidian-vault__* ツールの呼び出しを試します。利用できない場合はスキップします研究ノート、論文の要約、タグ付きの参考文献、ウィキリンク
3ローカル PDFlocalGlob: papers/**/*.pdf, literature/**/*.pdfPDF の生の内容(最初の 3 ページ)
4ウェブ検索web常に利用可能(WebSearch)arXiv、Semantic Scholar、Google Scholar
5Semantic Scholar APIsemantic-scholar$S2_FETCHER が解決される(正規名は semantic_scholar_fetch.py。integration-contract §2 に準拠)構造化メタデータ(引用数、掲載誌情報、TLDR)を含む、出版済みの掲載誌論文(IEEE、ACM、Springer)。— sources: semantic-scholar または — sources: web, semantic-scholar で明示的に指定された場合にのみ実行されます
6DeepXiv CLIdeepxiv$DEEPXIV_FETCHER が解決される(正規名は deepxiv_fetch.py。integration-contract §2 に準拠)かつ deepxiv CLI が存在する(command -v deepxiv)論文の段階的な取得:検索、概要、冒頭部分、セクション、トレンド、ウェブ検索。— sources: deepxiv または — sources: all, deepxiv で明示的に指定された場合にのみ実行されます
7Exa Searchexa$EXA_FETCHER が解決される(正規名は exa_search.py。integration-contract §2 に準拠)。フェッチャーが exa-py SDK と API キーを内部で処理しますコンテンツ抽出(ハイライト、テキスト、要約)に対応した、AI を活用する幅広いウェブ検索。arXiv/S2 に加えて、ブログ、ドキュメント、ニュース、企業、研究論文を網羅します。— sources: exa または — sources: all, exa で明示的に指定された場合にのみ実行されます
8Gemini(MCP / CLI)geminimcp__gemini-cli__ask-gemini ツールが利用可能、または gemini CLI がインストール済みAI を活用した幅広い文献の検索。トピックをサブ問題、別名、バリエーションに分解して、より広範囲に検索します。MCP を優先し、利用できない場合は CLI にフォールバックします。— sources: gemini または — sources: all, gemini で明示的に指定された場合にのみ実行されます
9OpenAlexopenalex$OPENALEX_FETCHER が解決される(正規名は openalex_fetch.py。integration-contract §2 に準拠)かつ Python の requests モジュールをインポート可能機関の所属情報、資金提供データ、2 億 5,000 万件以上の研究成果に関する包括的なメタデータを含む、オープンな引用グラフ。完全にオープンな API。— sources: openalex または — sources: all, openalex で明示的に指定された場合にのみ実行されます

適切な縮退動作:MCP サーバーが設定されていない場合、このスキルは以前とまったく同じように動作します(ローカル PDF とウェブ検索)。Zotero と Obsidian は追加機能としてのみ提供されます。

ワークフロー

ステップ 0a:Zotero ライブラリを検索する(利用可能な場合)

Zotero MCP が設定されていない場合は、このステップ全体をスキップしてください。

Zotero MCP ツール(検索など)の呼び出しを試します。成功した場合:

  1. トピックを検索する:Zotero の検索ツールを使って、研究トピックに一致する論文を探します
  2. コレクションを確認する:このトピックに関連するコレクションやフォルダーがユーザーにあるか確認します
  3. 注釈を抽出する:関連性の高い論文について、PDF のハイライトとメモを取得します。これらは、ユーザーが重要だと考えた内容を示します
  4. BibTeX をエクスポートする:関連論文の引用データを取得します(後で /paper-write を使う際に役立ちます)
  5. 結果をまとめる:関連する各 Zotero エントリから、次の情報を抽出します:
    • タイトル、著者、年、掲載誌
    • ユーザーの注釈/ハイライト(ある場合)
    • ユーザーが設定したタグ
    • 所属するコレクション

📚 Zotero の注釈は貴重です。ユーザー自身が重要だと考えてハイライトした内容がわかるため、一般的な要約よりはるかに価値があります。

Step 0b: Obsidian Vault を検索する(利用可能な場合)

Obsidian MCP が設定されていない場合は、このステップを完全にスキップしてください。

Obsidian MCP ツール(例:検索)を呼び出してみてください。成功した場合:

  1. Vault を検索する:調査トピックに関連するノートを検索します
  2. タグを確認する:関連トピックのタグ(例:#diffusion-models、#paper-review)が付いたノートを探します
  3. 調査ノートを読む:関連するノートから、ユーザー自身の要約や考察を抽出します
  4. リンクをたどる:ノートから他の関連ノート(ウィキリンク)へのリンクがあれば、追加のコンテキストを得るためにたどります
  5. 結果をまとめる:関連する各ノートについて、以下をまとめます:
    • ノートのタイトルとパス
    • ユーザーの要約/考察
    • 他のノートへのリンク(調査グラフ)
    • フロントマターのメタデータ(論文の URL、ステータス、評価など)

📝 Obsidian のノートは、ユーザー自身の整理された理解を表しています。ユーザーの視点を理解するうえで、生の論文コンテンツより価値があります。

Step 0c: ローカルの論文ライブラリを確認する

オンライン検索の前に、ユーザーが関連する論文をローカルに保存していないか確認します。

  1. ライブラリの場所を特定する:PAPER_LIBRARY のパスを確認し、PDF ファイルを探します

    Glob: papers/**/*.pdf, literature/**/*.pdf
    
  2. Zotero との重複を除外する:Step 0a で論文が見つかった場合、Zotero の検索結果にすでに含まれているローカル PDF はスキップします(ファイル名またはタイトルで照合します)。

  3. 関連性で絞り込む:ファイル名と最初のページの内容を調査トピックと照合します。明らかに無関係な論文はスキップします。

  4. 関連する論文を要約する:関連するローカル PDF ごとに(MAX_LOCAL_PAPERS 件まで):

    • 最初の 3 ページ(タイトル、要旨、序論)を読みます
    • タイトル、著者、発行年、主要な貢献、トピックとの関連性を抽出します
    • 論文が直接関連するか、間接的に関連するかを明記します
  5. ローカルのナレッジベースを作成する:「すでに保有している論文」セクションに要約をまとめます。これを出発点として、不足分を外部検索で補います。

📚 ユーザーが充実したローカルコレクションを持っている場合は、不足している情報に焦点を当てて外部検索を絞り込めます。

⚠️ 3 つすべての PAPER_LIBRARY パスで見つからなかった場合は、次に進む前にその旨を伝えてください。黙ってスキップしないでください。PDF がリファレンスマネージャー(Zotero、Mendeley など)にあるユーザーは、そうしないと — sources: all ですべての情報源が対象になったと思い込んでしまいます。次の内容を出力してください:

WARN: local contributed nothing — no PDFs found in papers/, literature/, or a configured paper library. To include yours, add a "## Paper Library" heading to CLAUDE.md followed by the directory path.

その後、Step 1 に進みます。

Step 1: 検索(外部)
  • WebSearch を使って、トピックに関する最近の論文を探します
  • arXiv、Semantic Scholar、Google Scholar を確認します
  • 基礎的な研究を扱う場合を除き、過去 2 年間の論文を中心に探します
  • 重複を除外する:Zotero、Obsidian、またはローカルライブラリですでに見つかった論文はスキップします

arXiv API 検索(— sources: が未設定の場合、または web か all を含む場合に実行。デフォルトではダウンロードしません。arXiv API は Priority-4 Web 層の一部です。上記の Source Table を参照してください):

Policy D2 のトラッキング規則(オーケストレーターが管理):実行者(あなた、LLM)は、このコンテキスト内で寄与した情報源のリストを管理します。ヘルパーを介して実行する bash 情報源(arxiv、semantic-scholar、deepxiv、exa、openalex)については、その bash ブロックでヘルパーが正常に実行された場合(ヘルパーが解決され、呼び出しが終了コード 0 で終了した場合)に、その情報源が寄与したものとします(注:ヘルパーが空の結果リストを返して終了コード 0 で終了した場合も「実行された」とみなされます。ユーザーに実際に内容を表示するかどうかは、その後の関連性ランキングで決まります)。ヘルパーを介さない情報源(zotero/obsidian/ローカル PDF/WebSearch/Gemini)については、Step 1 の以下の最終処理ブロックで寄与のルールを定めます。これらは bash から D2 contribution: ログ行が出力されないため、別に追跡します。— sources: で指定されていない情報源は対象に含めません。Step 1 の最後(「Optional PDF download」の前)に、寄与した情報源が 0 件の場合は、D2 の集約結果なしエラーを提示して停止します。(integration-contract.md §2 Policy D2 を参照してください。SKILL の bash ブロックはそれぞれ別のシェルとして実行され、状態が保持されないため、共有 bash アキュムレーターの代わりに、このコンテキスト内で追跡します。) $ARXIV_FETCHER を正規のチェーンで解決します(ポリシー D2 — このソースは複数ソースの集約に寄与します。失敗した場合は警告して続行し、集約全体を中断しません)。

# Canonical strict-safe resolver (see shared-references/integration-contract.md §2).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
ARXIV_FETCHER=".aris/tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER="tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && ARXIV_FETCHER="$ARIS_REPO/tools/arxiv_fetch.py"; }
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER=""

if [ -n "$ARXIV_FETCHER" ]; then
  # Search arXiv API for structured results (title, abstract, authors, categories).
  # Wrap with if/then/else so set -e doesn't abort the SKILL.
  if python3 "$ARXIV_FETCHER" search "QUERY" --max 10; then
    echo "D2 contribution: arxiv (helper invocation exit 0)" >&2
  else
    echo "WARN: arxiv_fetch.py invocation failed; D2 aggregate continues with WebSearch results." >&2
  fi
else
  echo "WARN: arxiv_fetch.py not resolved; falling back to WebSearch for arXiv hits." >&2
fi

記録管理:各ソースの bash ブロックが出力する D2 contribution: … の行を追跡してください。これらの行で、オーケストレーターが後述のステップ 1 の最終化ゲートで使用する、寄与元ソースのリストを構成します。 WebSearch(優先度 4)は、WebSearch が要求され(— sources: フィルターがない、またはリストに web か all が含まれる)、かつ実際に呼び出された場合に、寄与したものとして扱います。オーケストレーターはこれを別途記録します。(後述の最終化ブロックでこのルールを正式に再掲します。両方の行で内容を一致させてください。)

$ARXIV_FETCHER が空の場合(D2 によるグレースフルデグラデーション)、従来どおり arXiv の検索には WebSearch を使用します。

arXiv API は構造化されたメタデータ(タイトル、概要、著者全員のリスト、カテゴリ、日付)を返します。これは WebSearch のスニペットよりも豊富です。これらの結果を WebSearch の検索結果と統合し、重複を除去してください。

Semantic Scholar API 検索(semantic-scholar がソースに含まれる場合のみ):

ユーザーが — sources: semantic-scholar(または — sources: web, semantic-scholar)を明示的に指定した場合、arXiv 以外の出版済み会議・ジャーナル論文を検索します。

# Re-resolve $ARIS_REPO (SKILL bash blocks may run in separate shells).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
# Resolve $S2_FETCHER (Policy D2 — warn-and-skip on missing).
S2_FETCHER=".aris/tools/semantic_scholar_fetch.py"
[ -f "$S2_FETCHER" ] || S2_FETCHER="tools/semantic_scholar_fetch.py"
[ -f "$S2_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && S2_FETCHER="$ARIS_REPO/tools/semantic_scholar_fetch.py"; }
[ -f "$S2_FETCHER" ] || S2_FETCHER=""

if [ -n "$S2_FETCHER" ]; then
  # Search for published CS/Engineering papers with quality filters.
  # Wrap with if/then/else so set -e doesn't abort the SKILL.
  if python3 "$S2_FETCHER" search "QUERY" --max 10 \
      --fields-of-study "Computer Science,Engineering" \
      --publication-types "JournalArticle,Conference"; then
    echo "D2 contribution: semantic_scholar (helper invocation exit 0)" >&2
  else
    echo "WARN: semantic_scholar_fetch.py invocation failed; D2 aggregate continues with remaining sources." >&2
  fi
fi

$S2_FETCHER が空の場合(正規のチェーンをすべて試した後)、何も通知せずにスキップします。D2 による複数ソースの集約は、残りの解決済みソースを使って続行します。

Semantic Scholar を使う理由:IEEE/ACM のジャーナル論文の多くは arXiv にありません。S2 は、引用数や出版先のメタデータを含む、出版済みの出版先限定論文を補完します。

arXiv と S2 の重複除去:arXiv ID で照合します(S2 は externalIds.ArXiv を返します)。

  • 論文が両方にある場合:S2 の venue/publicationVenue を確認します。ジャーナルや会議で出版済み(例:IEEE TWC、JSAC)の場合は、出版版がプレプリントより優先されるため、S2 のメタデータ(出版先、引用数、DOI)を正式な情報として使用します。ダウンロード用には arXiv の PDF リンクを残してください。
  • S2 の照合結果に出版先がない場合(S2 にプレプリントとしてのみ登録されている場合)は、arXiv 版をそのまま残してください。
  • externalIds.ArXiv のない S2 の検索結果は、arXiv にない出版先限定論文です。これらがこのソース独自の価値です。

DeepXiv 検索(deepxiv がソースに含まれる場合のみ):

ユーザーが — sources: deepxiv(または複数ソースのリストに deepxiv を含めること)を明示的に指定した場合、段階的な取得のために DeepXiv アダプターを使用します。

# Re-resolve $ARIS_REPO (SKILL bash blocks may run in separate shells).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
# Resolve $DEEPXIV_FETCHER (Policy D2 — warn-and-skip on missing).
DEEPXIV_FETCHER=".aris/tools/deepxiv_fetch.py"
[ -f "$DEEPXIV_FETCHER" ] || DEEPXIV_FETCHER="tools/deepxiv_fetch.py"
[ -f "$DEEPXIV_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && DEEPXIV_FETCHER="$ARIS_REPO/tools/deepxiv_fetch.py"; }
[ -f "$DEEPXIV_FETCHER" ] || DEEPXIV_FETCHER=""

if [ -n "$DEEPXIV_FETCHER" ] && command -v deepxiv >/dev/null 2>&1; then
  # Wrap each adapter call so set -e doesn't abort the SKILL.
  if python3 "$DEEPXIV_FETCHER" search "QUERY" --max 10; then
    echo "D2 contribution: deepxiv (helper invocation exit 0)" >&2

    # Then deepen only for the most relevant papers (sub-calls don't change D2 aggregate count):
    python3 "$DEEPXIV_FETCHER" paper-brief ARXIV_ID \
      || echo "WARN: deepxiv_fetch.py paper-brief failed; skipping deepen step." >&2
    python3 "$DEEPXIV_FETCHER" paper-head ARXIV_ID \
      || echo "WARN: deepxiv_fetch.py paper-head failed; skipping deepen step." >&2
    python3 "$DEEPXIV_FETCHER" paper-section ARXIV_ID "Experiments" \
      || echo "WARN: deepxiv_fetch.py paper-section failed; skipping deepen step." >&2
  else
    echo "WARN: deepxiv_fetch.py search invocation failed; D2 aggregate continues with remaining sources." >&2
  fi
fi

$DEEPXIV_FETCHER が空の場合、または deepxiv CLI を利用できない場合は、このソースを適切にスキップし、要求された残りのソースで続行します(ポリシー D2 によるグレースフルデグラデーション)。

DeepXiv を使う理由:幅広い検索の後、論文全文をすぐに読み込むのではなく、段階的に読む場合に便利です。これにより、構成、TLDR、最も関連性の高いセクションを把握しながら、不要なコンテキストを減らせます。

arXiv および S2 との重複除去:

  • まず arXiv ID、次に DOI、最後に正規化したタイトルで照合します
  • DeepXiv と arXiv が同じプレプリントを指す場合は、正式な論文の行を 1 つだけ残し、追加ソースとして deepxiv を記録します
  • DeepXiv と S2 が出版済み論文で重複する場合は、最終表では S2 の出版先/引用メタデータを優先します。ただし、価値のある DeepXiv 由来のセクションメモは残してください

Exa 検索(exa がソースに含まれる場合のみ):

ユーザーが — sources: exa(または複数ソースのリストに exa を含めること)を明示的に指定した場合、コンテンツ抽出機能を備えた、AI を活用した幅広いウェブ検索に Exa ツールを使用します。

# Re-resolve $ARIS_REPO (SKILL bash blocks may run in separate shells).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
# Resolve $EXA_FETCHER (Policy D2 — warn-and-skip on missing).
EXA_FETCHER=".aris/tools/exa_search.py"
[ -f "$EXA_FETCHER" ] || EXA_FETCHER="tools/exa_search.py"
[ -f "$EXA_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && EXA_FETCHER="$ARIS_REPO/tools/exa_search.py"; }
[ -f "$EXA_FETCHER" ] || EXA_FETCHER=""

if [ -n "$EXA_FETCHER" ]; then
  # Search for research papers with highlights.
  # Wrap with if/then/else so set -e doesn't abort the SKILL.
  exa_contributed=false
  if python3 "$EXA_FETCHER" search "QUERY" --max 10 --category "research paper" --content highlights; then
    exa_contributed=true
  else
    echo "WARN: exa_search.py research-paper invocation failed; D2 aggregate continues." >&2
  fi
  # Search for broader web content (blogs, docs, news)
  if python3 "$EXA_FETCHER" search "QUERY" --max 10 --content highlights; then
    exa_contributed=true
  else
    echo "WARN: exa_search.py broad-web invocation failed; D2 aggregate continues." >&2
  fi
  [ "$exa_contributed" = "true" ] && echo "D2 contribution: exa (at least one invocation exit 0)" >&2
fi

$EXA_FETCHER が空の場合、または exa-py SDK を利用できない場合は、このソースを適切にスキップし、要求された残りのソースで続行します(ポリシー D2 によるグレースフルデグラデーション)。

Exa を使う理由:Exa は、組み込みのコンテンツ抽出機能を備え、より広範なウェブ(ブログ、ドキュメント、ニュース、企業のページ)を対象に AI を活用した検索を提供します。各検索結果とともに、より豊富なコンテンツを返すことで、学術データベース(arXiv、S2)と一般的な WebSearch の間のギャップを埋めます。 arXiv、S2、DeepXiv との重複排除:

  • まず URL で照合し、次に正規化したタイトルで照合します
  • Exa が返した arXiv 論文が、arXiv/S2 ですでに見つかっている場合は、これらのソースの構造化メタデータを優先します
  • 学術分野以外のドメイン(ブログ、ドキュメント、ニュース)から得られる Exa の結果は、他のソースではカバーされない独自の価値があります

Gemini 検索(sources に gemini が含まれている場合のみ):

ユーザーが明示的に — sources: gemini を指定した場合(または複数のソースを指定するリストに gemini を含めた場合)、AI を活用した幅広い文献検索に Gemini を使用します。

優先度 1 — Gemini MCP(推奨):検索プロンプトを指定して mcp__gemini-cli__ask-gemini を呼び出します。

mcp__gemini-cli__ask-gemini({
  prompt: 'You are a research literature scout. Search comprehensively for papers on: "QUERY"

IMPORTANT CONSTRAINTS:
1. Search from MULTIPLE angles — decompose the topic into sub-problems, aliases, neighboring tasks, and common benchmark/settings variants.
2. Prefer papers that are genuinely relevant, not merely keyword-adjacent.
3. Include top venues, journals, surveys, recent preprints, and papers with code when available.
4. Focus on papers from 2022 onward unless older foundational work is necessary.

For EACH paper found, provide ALL of the following:
- Title: [exact title]
- Authors: [full author list]
- Year: [publication year]
- Venue: [exact conference/journal name + year, or "arXiv preprint"]
- arXiv ID: [format 2401.12345, or "N/A"]
- DOI: [if available, or "N/A"]
- Code URL: [GitHub/GitLab link if available, or "No code"]
- Summary: [one-sentence core contribution]

Find at least 15 papers.',
  model: 'auto-gemini-3'
})

優先度 2 — Gemini CLI へのフォールバック(MCP が利用できない場合):Bash 経由で gemini -p "...same prompt..." 2>/dev/null を使用します(タイムアウト:120s)。

MCP と CLI の両方が利用できない場合は、このソースを問題なくスキップし、残りの指定されたソースで処理を続けます。

Gemini を使う理由:Gemini はキーワードの一致にとどまらない AI 主導の検索を提供します。トピックを分解し、名称のバリエーションを調べ、従来の API ベースの検索(arXiv、S2)では見つからない可能性のある論文を提示します。構造化データベースへのクエリとは異なる検索領域を補完します。

arXiv、S2、DeepXiv、Exa との重複排除:

  • まず arXiv ID、次に DOI、最後に正規化したタイトルで照合します
  • Gemini が返した論文が S2 ですでに見つかっている場合は、S2 の被引用数と掲載先のメタデータを優先します
  • Gemini が返した論文が arXiv ですでに見つかっている場合は、arXiv の構造化メタデータを優先します
  • Gemini 独自の価値は、他のキーワードベースのインデックスでは見つからなかった論文を発見できることです
  • Gemini が報告する被引用数は使用しないでください。不正確な場合があります。信頼できる被引用データには S2 を使用してください。

OpenAlex 検索(sources に openalex が含まれている場合のみ):

ユーザーが明示的に — sources: openalex を指定した場合(または複数のソースを指定するリストに openalex を含めた場合)、包括的な学術メタデータを取得するために OpenAlex API を使用します。

# Re-resolve $ARIS_REPO (SKILL bash blocks may run in separate shells).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
# Resolve $OPENALEX_FETCHER (Policy D2 — warn-and-skip on missing).
OPENALEX_FETCHER=".aris/tools/openalex_fetch.py"
[ -f "$OPENALEX_FETCHER" ] || OPENALEX_FETCHER="tools/openalex_fetch.py"
[ -f "$OPENALEX_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && OPENALEX_FETCHER="$ARIS_REPO/tools/openalex_fetch.py"; }
[ -f "$OPENALEX_FETCHER" ] || OPENALEX_FETCHER=""

# Preflight: skip OpenAlex silently if the helper is unresolved OR the
# `requests` Python package is missing. Both checks must pass before
# the script is invoked, so users without `requests` installed never see
# a stack trace from a default `/research-lit` run.
if [ -z "$OPENALEX_FETCHER" ] || ! python3 -c "import requests" >/dev/null 2>&1; then
  echo "OpenAlex source not available (openalex_fetch.py unresolved or 'requests' module missing); skipping." >&2
else
  # Search for papers with comprehensive metadata.
  # Wrap with if/then/else so set -e doesn't abort the SKILL.
  if python3 "$OPENALEX_FETCHER" search "QUERY" --max 10 \
      --year "2022-" \
      --type article \
      --sort relevance; then
    echo "D2 contribution: openalex (helper invocation exit 0)" >&2
  else
    echo "WARN: openalex_fetch.py invocation failed; D2 aggregate continues with remaining sources." >&2
  fi
fi

openalex_fetch.py が見つからない場合、または requests モジュールがない場合は、このソースを問題なくスキップし、残りの指定されたソースで処理を続けます。

OpenAlex を使う理由:完全にオープンな引用グラフ(API キー不要)、所属機関、資金提供データ(NSF、NIH)、包括的なトピック/キーワードのメタデータ、そして CS に限らない全分野を網羅する検索範囲を利用できます。

arXiv、S2、DeepXiv、Exa、Gemini との重複排除:

  • まず DOI(OpenAlex はほとんどの著作物について DOI を保持しています)、次に arXiv ID、最後に正規化したタイトルで照合します
  • OpenAlex と S2 の両方で同じ論文が見つかった場合:
    • 被引用数には S2 を優先します(より新しい情報が反映されます)
    • 掲載先のメタデータには S2 を優先します(CS/AI 論文ではより正確です)
    • 所属機関と資金提供のデータには OpenAlex を使用します(独自の価値があります)
    • 両方を統合し、より充実したレコードにします
  • OpenAlex と arXiv の結果が重複する場合は、arXiv の PDF リンクとメタデータを優先しつつ、OpenAlex の被引用/所属機関データも保持します
  • OpenAlex 独自の価値は、所属機関、資金提供元、包括的なトピック分類、分野横断的な検索範囲です

D2 集約の最終処理(integration-contract §2 Policy D2 に準拠):

オーケストレーター(あなた、LLM)は、各ソースの上記 Bash ブロックが出力する D2 contribution: <name> ログ行を読み取り、処理に貢献したソースの リストをコンテキスト内で管理します。さらに、以下を加えます。

  • Step 0a が空でない Zotero の検索結果を返した場合は zotero。
  • Step 0b が空でない Obsidian の検索結果を返した場合は obsidian。
  • Step 0c が関連するローカル PDF を 1 件以上見つけた場合は local。
  • WebSearch(優先度 4)が指定され(— sources: フィルターがない場合、またはリストに web か all が含まれている場合)、かつ実際に呼び出された場合は web。 注:— sources: all には、デフォルトで有効な層(zotero、obsidian、 local、web)が含まれますが、オプトイン方式のフェッチャー (semantic-scholar、deepxiv、exa、gemini、openalex)は含まれません。これらを有効にするには、 明示的に追加してください(例:— sources: all, semantic-scholar, openalex)。 これは、この SKILL の L42-43/L51-63 にある既存の規則に沿ったものです。
  • Gemini MCP/CLI が論文を 1 件以上返した場合は gemini。 結果として得られた貢献元ソースのリストに項目が1つもない場合は、次のように表示します。

ERROR:D2 の集約結果が空です — リクエストされたソースはすべて、解決できなかった、呼び出されなかった、失敗した、または(MCP/ローカル PDF/Gemini ソースの場合)利用可能な結果を返しませんでした。(注:WebSearch は、リクエストされて呼び出されれば、結果セットが空でも貢献元として扱われます。)複数ソースの集約を続行できません。ユーザーには、より広い — sources: リスト(例:web, local)で再試行するか、ヘルパーの解決と SDK のインストールを確認するよう提案してください。

その後、Step 1.5 に進む前に停止します。それ以外の場合は、貢献元ソースのリストをユーザーに記録して(例:「貢献したソース:arxiv, semantic_scholar, web」)、処理を続行します。

PDF のダウンロード(任意)(ARXIV_DOWNLOAD = true の場合のみ):

すべてのソースを検索し、論文を関連性順にランク付けした後:

# Re-resolve $ARXIV_FETCHER (SKILL bash blocks may run in separate shells).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
ARXIV_FETCHER=".aris/tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER="tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && ARXIV_FETCHER="$ARIS_REPO/tools/arxiv_fetch.py"; }
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER=""

# Download top N most relevant arXiv papers; skip silently if helper unresolved.
[ -n "$ARXIV_FETCHER" ] && python3 "$ARXIV_FETCHER" download ARXIV_ID --dir papers/
  • 関連性順で上位 ARXIV_MAX_DOWNLOAD 件にランク付けされた論文のみをダウンロードします
  • ローカルライブラリにすでにある論文はスキップします
  • ダウンロード間に1秒の間隔を空けます(レート制限)
  • 各 PDF が 10 KB を超えていることを確認します
Step 1.5:候補論文の検証(ハルシネーション対策、必須)

分析前に、Steps 0a-1 で収集したすべての候補論文に対して事前検索検証を実行し、LLM が捏造した arXiv ID/DOI/タイトルを除外します。ヘルパー:verify_papers.py(正式名称。解決方法は shared-references/integration-contract.md §2、 Policy D1 に準拠 — 主要ヘルパーと、出力が劣化した場合のフォールバック)。このマシンでヘルパーを解決できない場合、SKILL はすべての候補に [UNVERIFIED] のタグを付けた verified_papers.json をフォールバックとして出力します。これにより、候補を黙って除外するのではなく、監査可能な出力劣化状態で後続の分析を続行します。

# 1. Resolve $VERIFY_PAPERS via the canonical strict-safe chain (§2).
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
VERIFY_PAPERS=".aris/tools/verify_papers.py"
[ -f "$VERIFY_PAPERS" ] || VERIFY_PAPERS="tools/verify_papers.py"
[ -f "$VERIFY_PAPERS" ] || { [ -n "${ARIS_REPO:-}" ] && VERIFY_PAPERS="$ARIS_REPO/tools/verify_papers.py"; }
[ -f "$VERIFY_PAPERS" ] || VERIFY_PAPERS=""

# 2. Emit candidates as JSON. Verification scratch lives under .aris/
#    (NOT under research-wiki/ — Step 6's wiki ingest predicate is
#    "research-wiki/ exists", and we must not trip it from Step 1.5).
mkdir -p .aris/verify-papers
cat > .aris/verify-papers/candidate_papers.json <<'JSON'
[
  {"id": "p1", "arxiv_id": "2307.03172", "doi": null, "title": "Lost in the Middle"},
  {"id": "p2", "arxiv_id": null, "doi": "10.1145/...", "title": "..."},
  {"id": "p3", "arxiv_id": null, "doi": null, "title": "Some Paper Title"}
]
JSON

# 3. Run 3-layer verification (arXiv batch → CrossRef → Semantic Scholar fuzzy).
#    Policy D1: when the helper is unresolved OR its invocation fails, emit
#    a degraded verified set tagging everything [UNVERIFIED] so the user
#    can audit search quality. If python3 itself is missing, we BLOCK
#    rather than hand-roll JSON in shell.
verify_ok=false
if [ -n "$VERIFY_PAPERS" ]; then
  if python3 "$VERIFY_PAPERS" \
        --input  .aris/verify-papers/candidate_papers.json \
        --output .aris/verify-papers/verified_papers.json; then
    verify_ok=true
  else
    echo "WARN: verify_papers.py invocation failed (resolved at $VERIFY_PAPERS); falling back to [UNVERIFIED] tagging." >&2
  fi
else
  echo "WARN: verify_papers.py not resolved at .aris/tools/, tools/, \$ARIS_REPO/tools/, or via ~/.aris/repo." >&2
  echo "      Fix: rerun bash tools/install_aris.sh or smart_update.sh (refreshes ~/.aris/repo), export ARIS_REPO, or copy the helper to tools/." >&2
fi
if [ "$verify_ok" = "false" ]; then
  if ! command -v python3 >/dev/null 2>&1; then
    echo "ERROR: python3 unavailable; cannot emit fallback verified_papers.json." >&2
    echo "       Status: BLOCKED. Install python3 or restore the helper to proceed." >&2
    exit 1
  fi
  echo "      Emitting unverified candidate set with [UNVERIFIED] tags." >&2
  python3 - <<'PY'
import json
cands = json.load(open('.aris/verify-papers/candidate_papers.json'))
out = {
  'verdict': 'WARN',
  'reason_code': 'verify_papers_unavailable',
  'summary': 'verify_papers.py helper unresolved or invocation failed; all candidates tagged [UNVERIFIED] for audit visibility.',
  'papers': [dict(p, status='unverified', method='none') for p in cands],
}
with open('.aris/verify-papers/verified_papers.json', 'w') as f:
  json.dump(out, f, indent=2)
PY
fi

# 4. Read verdict + per-paper status from .aris/verify-papers/verified_papers.json;
#    surface warnings to the user.

必須の出力ルール(契約全体については shared-references/citation-discipline.md § 事前検索検証プロトコルを参照):

  • 分析対象リストの各論文に、ステータスをタグ付けします:✅ verified (via arxiv|crossref|s2)、⚠️ UNVERIFIED (reason)、または … verify_pending。
  • 未検証の論文を黙って除外しないでください — ユーザーが検索品質を監査できるよう、[UNVERIFIED] マーカーを付けて出力に含めてください。
  • DOI や arXiv ID を記憶から捏造しないでください。フィールドが不明な場合は、candidate_papers.json で null のままにしてください — ヘルパーはタイトル検索にフォールバックします。
  • ヘルパーが high_hallucination_rate を伴う WARN を返した場合は、警告をそのまま表示し、より限定的なクエリで再実行するよう推奨してください。
  • verify_pending とタグ付けされた論文を verified に変更しないでください — 保留中の状態をユーザーに示し、次のセッションで再試行してください。

任意:シェルで [email protected] を設定すると、CrossRef のレート制限が丁寧な利用者向けの制限に緩和されます。

Step 1.6:リーフが読み取り可能な証拠を固定する(ディスパッチ前に必須)

親が引き続き検索コンテキストとすべての書き込みを管理します。Step 2 の前に、.aris/verify-papers/research-lit-evidence/ の下に、シャードごとに読み取り専用ファイルを1つ作成する必要があります。各ファイルには、そのシャードに割り当てられた論文のみを含め、paper_id、title、 verification_status、abstract、source_excerpt、local_pdf_path、 local_note_paths、evidence_status を記録します。

取得済みの API 抄録/抜粋、Zotero または Obsidian のテキスト、あるいは読み取り可能なローカル PDF/メモのパスから、これらのフィールドを設定します。識別情報やリモート URL だけでは、Read/Grep/Glob のみを使用するリーフにとって十分ではありません。リーフプロンプトには、シャードの証拠ファイルの絶対パスと割り当てられた ID を渡してください。リーフが抽出できるのは、そのファイルに裏付けられた主張のみです。

論文に抄録、ソース抜粋、読み取り可能なローカル PDF、読み取り可能なローカルメモがない場合は、evidence_status: UNPROCESSABLE_NO_LOCAL_EVIDENCE を記録します。完了済みの作業としてディスパッチしてはならず、タイトルから手法や結果を推測してはなりません。親は、許可された逐次フォールバックを1回使用してローカルの証拠を収集・処理できます。それ以外の場合は、その論文を明示的に未カバーとし、カバレッジ記録で UNPROCESSED のままにしてください。

ステップ 2:各論文を分析する

上限付きファンアウト(ティア対応)。 論文ごとの抽出は幅を制限しますが、論文ごとにワーカーを作成することは決してありません。ステップ 1.5 で確定したすべての正規論文 ID を固定します。ID を並べ替え、重複しないバッチに決定論的に分割します。バッチ数は max_shards: 8 以下とします。各リーフの max_turns: 8 で、max_concurrency: 4 以下の並列実行を複数回行います。

  • ティア 1(ワークフロー):各バッチで aris-fanout-leaf を明示的に選択します。
  • ティア 2(エージェント):Agent(aris-fanout-leaf) のみを呼び出します。制限のないワーカーで代用しては いけません。
  • ティア 3:同じ固定済みバッチを順次処理します。リーフが失敗した場合、不正な形式の出力を返した場合、またはタイムアウトした場合は、そのバッチに対して実行側で順次フォールバックを最大 1 回行います。代替の Agent は起動しません。

各リーフは shared-references/fan-out-pattern.md に記載された抽出エンベロープを返します。 {shard_id, assigned_unit_ids, covered_unit_ids, status, entries, errors}。 各エントリでは、正規の arXiv ID / DOI / タイトルハッシュを dedup_key として保持し、 problem、method、results、relevance、source、および verification_status をそのまま報告します。ワーカーはこのスキル本文を引き継がないため、リーフのプロンプトには委任禁止、読み取り専用、判定禁止、および割り当てられた ID の境界を繰り返し記載します。

カバレッジの記録: 許可された順次フォールバックを 1 回行った後、covered_unit_ids を固定済みの論文 ID セットと照合し、計画済み、完了、失敗、および未カバーの ID と coverage_complete を記録します。未解決の論文はすべて明示的に UNPROCESSED のままにします。不在を無関係と解釈したり、分析対象から黙って削除したりしてはいけません。

ここでの「審査委員会」はモデルではありません。ステップ 1.5 の決定論的な verify_papers.py 登録ゲートです。このゲートは論文の同一性を検証し、カバレッジの記録では抽出の完全性を別途検証します。リーフワーカーも統合処理も、抽出が欠けていることを登録の判断として再解釈してはいけません。

.aris/verify-papers/verified_papers.json に含まれるすべての論文(検証済み、未検証、verify_pending、error を含む — 上記の保持ルールを参照)について、以下を抽出します。

  • 課題:どのようなギャップに取り組んでいますか?

  • 手法:中核となる技術的貢献(1~2 文)

  • 結果:主要な数値/主張

  • 関連性:私たちの取り組みとどのように関連していますか?

  • 情報源:どこで見つけたか(Zotero/Obsidian/ローカル/ウェブ)— ユーザーが既に持っているものと新しいものを把握するのに役立ちます

  • 検証ステータス(次のいずれか):

    • ✅ 検証済み(arxiv|crossref|s2 経由)
    • ⚠️ 未検証(検証不可:ヘルパーを解決できない、または呼び出しに失敗)
    • ⚠️ 未検証(検索済み:どの情報源にも見つからない)
    • … 検証保留中(一時的な API 障害 — 次のセッションで再試行)
    • ❌ エラー(不正な形式の入力:arxiv、DOI、タイトルのいずれもなし)

    分析結果の表にはステータスを表示します。ステータスが verified 以外であることを理由に、論文を黙って除外してはいけません。

ステップ 3:統合する
  • 論文をアプローチ/テーマごとにグループ化します
  • 分野における見解の一致点と相違点を特定します
  • 私たちの取り組みで埋められるギャップを見つけます
  • Obsidian のノートがある場合は、ユーザー自身の洞察を統合に取り入れます
ステップ 4:出力する

構造化された文献表として提示します。

| Paper | Venue | Method | Key Result | Relevance to Us | Source |
|-------|-------|--------|------------|-----------------|--------|

さらに、分野の全体像を説明する文章による要約を 3~5 段落で提示します。

Zotero の BibTeX をエクスポートした場合は、論文執筆にそのまま使える references.bib のスニペットを含めます。

Step 5: 保存(要求された場合)
  • 論文の PDF を literature/ または papers/ に保存します
  • プロジェクトメモリ内の関連する研究ノートを更新します
  • Obsidian が利用可能な場合は、任意で保管庫に文献レビューのノートを作成します

合成モード — — composed: <canonical-report-path> を指定して呼び出された場合(/idea-discovery のようなオーケストレーターから渡されます)、単独のランドスケープ .md は書き込まないでください。構造化された表と説明的な要約を返し、オーケストレーターがそれを正規レポートの「文献ランドスケープ」セクションにまとめます。レポートから保存済みの PDF/references.bib へのリンクを張り、ランドスケープ用のファイルを重複して作成しません。 Step 6(research-wiki への取り込み)は引き続き実行します。Wiki はレポートとは別の永続ストアであり、レポートの複製ではありません。デフォルト(— composed: ディレクティブがない場合)では、上記のとおりに動作します。つまり、単独で処理し、ドキュメントに記載されたファイルを書き込みます。 ディスク上にレポートファイルが存在するだけで、合成モードだと判断してはいけません。詳細なルールについては、 shared-references/output-composition.md を参照してください。

Step 6: 研究 Wiki を更新する

research-wiki/ が存在する場合は必須です。 ディレクトリが存在しない場合は、エラーを出さずに(何もせず)完全にスキップします。 shared-references/integration-contract.md に従い、このステップでは正規の取り込み契約に従います。ビジネスロジックはこの説明文ではなく、tools/research_wiki.py にあります。

research-wiki/ が存在する場合は、 shared-references/wiki-helper-resolution.md に記載されている正規のチェーンに従って $WIKI_SCRIPT を解決します(Variant B — 警告してスキップ):

cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
ARIS_REPO="${ARIS_REPO:-$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null)}"
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
  ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
WIKI_SCRIPT=".aris/tools/research_wiki.py"
[ -f "$WIKI_SCRIPT" ] || WIKI_SCRIPT="tools/research_wiki.py"
[ -f "$WIKI_SCRIPT" ] || { [ -n "${ARIS_REPO:-}" ] && WIKI_SCRIPT="$ARIS_REPO/tools/research_wiki.py"; }
[ -f "$WIKI_SCRIPT" ] || {
  echo "WARN: research_wiki.py not found; literature synthesis will be reported but wiki ingest will be skipped. Fix: bash tools/install_aris.sh or smart_update.sh (refreshes ~/.aris/repo), export ARIS_REPO, or cp <ARIS-repo>/tools/research_wiki.py tools/." >&2
  WIKI_SCRIPT=""
}
📋 Research Wiki ingest (runs once, at end of research-lit):
   [ ] 1. Predicate: `research-wiki/` exists? If no, skip this step.
   [ ] 2. If $WIKI_SCRIPT empty (helper unreachable), skip the rest of this step
          (the warning above already explains why).
   [ ] 3. For each of the top 8–12 relevant papers (arxiv IDs collected above):
          python3 "$WIKI_SCRIPT" ingest_paper research-wiki/ \
              --arxiv-id <id> [--thesis "<one-line>"] [--tags <t1>,<t2>]
   [ ] 4. For each explicit relationship to an existing wiki entity,
          add an edge:
          python3 "$WIKI_SCRIPT" add_edge research-wiki/ \
              --from "paper:<slug>" --to "<target_node_id>" \
              --type <extends|contradicts|addresses_gap|inspired_by|...> \
              --evidence "<one-sentence quote or reasoning>"
   [ ] 5. Confirm papers/<slug>.md files were created (helper prints
          "Paper ingested: ..."); if any failed with a network error,
          retry or fall back to the --title/--authors/--year manual form.

ingest_paper は、スラッグの生成、arXiv メタデータの取得、重複排除(arXiv ID が一致する既存の論文をスキップ)、ページのレンダリング、index.md の再構築、query_pack.md の再構築、ログへの追記を、1 回の呼び出しで処理します。papers/<slug>.md を手動で書き込まないでください。 ヘルパーを利用できない場合(オフラインの非 ARIS マシンである場合や、$WIKI_SCRIPT が空の場合など)は、不足を記録し、後から /research-wiki sync --arxiv-ids … で補完してください。

arXiv 以外のソース(Semantic Scholar のみ、arXiv ミラーのない IEEE/ACM のジャーナル、ブログ記事)では、代わりに手動でメタデータを渡します。

python3 "$WIKI_SCRIPT" ingest_paper research-wiki/ \
    --title "<full title>" --authors "A, B, C" --year <yyyy> \
    --venue "<venue>" [--external-id-doi "<doi>"] [--thesis "..."]

主なルール

  • 論文の引用情報(著者、年、掲載媒体)を必ず含めます
  • 査読済み論文とプレプリントを区別します
  • 各論文の制約について正直に記載します
  • 論文が私たちのアプローチと直接競合するのか、あるいはそれを支持するのかを明記します
  • MCP サーバーが設定されていないことを理由に、決して失敗してはいけません。常に次のデータソースに適切にフォールバックしてください
  • Zotero/Obsidian のツール名は、ユーザーによる MCP サーバーの設定方法によって異なる場合があります(例:mcp__zotero__search や mcp__zotero-mcp__search_items)。一般的なパターンを試し、状況に応じて対応してください。

コメント