read について
Markdown ファイルを開く前にページを確認するための Origin 用プレビュー技能です。タイトルや語句で検索するほか、ID を指定して取得できます。
主な機能
- 01IDでページを取得
- 02タイトルや語句で検索
- 03簡潔なページプレビューを表示
- 04リンクと古さを報告
- 05ユーザー編集済みページを表示
活用シーン
- 01ページを開く前に内容を確認
- 02タイトルや語句からページを検索
- 03ページのリンクと鮮度を確認
MCP 対応
Origin MCP ツールでページを検索・取得し、プレビュー用にページリンク情報も取得します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill readインストール後、Claude Code で/readを入力して読み込まれたか確認します。
詳細
/read
ユーザーがページを開くかどうかを判断できるよう、ページの概要を表示します。
/read は全文ではなくプレビューです。本文はディスク上にあります。プレビューにすることで、チャットを見やすく保ち、Bash 出力の切り捨てを避け、「md が正本で、ビューアーはユーザーのエディター」というモデルを尊重できます。
呼び出し方
次の 2 つの形式を受け付けます。
- ページ ID(
page_で始まるもの。従来のconcept_ID も引き続き使用できます)→ 直接取得します。 - タイトルまたは自由形式の語句 → 検索し、最適な候補を選んで取得します。
どちらも最後に同じプレビューブロックを表示します。
1. 直接 ID を指定
ページを取得するには MCP ツールを呼び出します。
get_page(page_id="<id>")
応答は { "page": {...} } を含む JSON オブジェクトです。ページから
title、summary、space、source_memory_ids を読み取り、
~/.origin/pages/.origin/state.json で md ファイル名を調べます。
Bash: python3 -c '
import json, os, sys
state_path = os.path.expanduser("~/.origin/pages/.origin/state.json")
pid = "<id>"
filename = None
try:
with open(state_path) as f:
filename = json.load(f).get("pages", {}).get(pid, {}).get("file")
except FileNotFoundError:
pass
print(f"~/.origin/pages/{filename}" if filename else "(no md projection on disk)")
'
ページのフィールドと解決した md パスを組み合わせ、プレビューブロックを出力します。
2. タイトルまたは自由形式の語句を指定
まず検索し、最上位の候補を ID で取得して、同じプレビューブロックを表示します。必ず search_pages MCP ツールを使って解決してください。クライアント側でスラッグを推測してはいけません(アポストロフィや句読点に対するスキルの推測方法は、正規の slugify() とずれるためです)。
search_pages(query="<arg>", limit=1)
返された JSON を解析します。応答の形式は { "pages": [...] } です。
最初の候補の id を読み取ります。pages が空の場合は、「<arg> に一致するページが見つかりません。作成するには /distill <arg> を試してください」とユーザーに伝えて終了します。それ以外の場合は get_page(page_id=<id>) を呼び出し、セクション 1 と同じプレビューブロックを出力します。
出力形式
次の行だけを、本文なしで必ず表示します。
Title: <title>
Version: v<N> — <last_edited_by> <relative_time> (<last_delta_summary>)
Summary: <one sentence>
Sources: <N> memories
Space: <space or (none)>
Links: <N inbound, M outbound (<K> broken)>
Open: ~/.origin/pages/<slug>.md
⚠ Stale: <stale_reason> — run /distill to refresh
ロックバナーのルール:
get_page が返したページのペイロードで user_edited == true の場合は、タイトルより前の出力の最初の行に、次の行を追加します。
🔒 You've edited this page. Auto-refresh paused. `/distill rebuild <page-id>` to unlock.
<page-id> は実際の page.id の値に置き換えます。user_edited が false または未指定の場合、この行は完全に省略します。
ロックされると、デーモンの distill サイクルでソースからこのページの文章が自動的に書き換えられなくなります。ユーザーが /distill rebuild を明示的に実行して消去・再生成するまで、編集内容はそのまま維持されます。
バージョン行のルール:
- 必ず
v<N>を表示します。versionが null または欠落している場合は、この行を省略します。 last_edited_byに値がある場合は、— <last_edited_by>を追加します(例:re_distill、user、agent)。last_edited_atが設定されている場合は、相対時間を追加します(例:2h ago、3d ago)。last_delta_summaryが空でない場合は、(<last_delta_summary>)を追加します。- 例:
v1 — synthesized 4h agov4 — re_distill 2h ago (+mem_xyz, +250 chars)v3 — user 1d ago
古いページの警告ルール:
stale_reasonが null でも空でもない場合に限り、⚠ Stale:行を出力します。stale_reasonはそのまま表示します(デーモンが設定する値であり、source_updated、new_memoriesなどは人間にも十分わかりやすいものです)。
リンク行のルール(変更なし):get_page の直後に
get_page_links(page_id="<id>") を呼び出し、次のように数えます。
- inbound =
len(inbound) - outbound =
len(outbound) - broken =
target_page_idが null の outbound エントリー
broken が 0 の場合は括弧内を省略します。inbound + outbound が 0 の場合は行全体を省略します。
タイトルを言い換えたり、概要を短くしたり、プレビューを装飾したりしないでください。ブロックは 1 画面に収まり、予測しやすく、ざっと読みやすいものにします。
本文全体を読みたい場合は、ユーザー自身のエディター(Obsidian、VS Code、glow、bat など)で md ファイルを開きます。プラグインは、ユーザーのツールより優れた Markdown 表示を提供するものではありません。
使用する場面
- ユーザーが「X のページを見せて」「 には何が書かれている?」「プレビューして」と頼んだとき。
/distillの完了後に/read "<title>"を続けて実行するとき(タイトルはどの表示画面でも変わらず、ID は見た目上切り詰められる場合があります)。
使用しない場面
- 生のメモリーを検索する場合 →
/recallを使用します。 - すべてのページを一覧表示する場合 →
list_pages_recentMCP ツール、またはls ~/.origin/pages/を使用します。 - 本文全体を読む場合 → ユーザーのエディターで md ファイルを開きます。