ContextSearch について
ContextSearchは、セッション、ISA、会話から過去のLifeOSの作業を探すスキルです。5つのソースを並列検索し、語句の一致度と新しさで順位付けして、日付でも絞り込めます。
主な機能
- 015つの履歴ソースを並列検索
- 02語句の一致度と新しさで順位付け
- 03日付表現の解析と絞り込み
- 04スニペットまたはJSONで出力
活用シーン
- 01トピックに関する最近の作業を検索
- 02日付で過去のセッションを閲覧
- 03新しい依頼に関連する文脈を取得
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ danielmiessler/ lifeos --skill contextsearchインストール後、Claude Code で/contextsearchを入力して読み込まれたか確認します。
同梱ファイルTools/ContextSearch.ts
詳細
ContextSearch
カスタマイズ
実行する前に、次の場所にユーザーによるカスタマイズがあるか確認してください:
~/.claude/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/ContextSearch/
このディレクトリが存在する場合は、そこにある PREFERENCES.md、設定、またはリソースを読み込み、適用してください。これらはデフォルトの動作より優先されます。ディレクトリが存在しない場合は、スキルのデフォルト設定で進めてください。
機能
トピック、部分的な単語、「昨日」や「先週」のような日付表現を使って、過去の LifeOS の作業(セッション、ISA、会話)を検索します。決定論的な Bun CLI が5つの情報源を並列検索し、トークンの重複度に新しさを掛け合わせてスコアを算出し、日付フィルターを適用して、スニペット付きのランキング結果を返します。
課題
作業はセッション、ISA、会話ログに分散しているため、1週間後にはプロジェクトがどこにあったのか、何という名前だったのかを思い出せなくなることがあります。覚えているのは概要で、正確なタイトルではないため、部分文字列検索では見つかりません。いくつかの単語や「昨日やったこと」のような表現ですばやく、うろ覚えの作業を呼び出し、すべてを手作業で読み返さずに続きを始める必要があります。
仕組み
次の条件で過去の作業を検索します:$ARGUMENTS
スキルの本文は、決定論的な Bun CLI に処理を委ねます。ツールは5つの情報源を並列検索し、トークンの重複度 × 新しさでスコアを算出して日付フィルターを適用し、ランキング結果を返します。
ワークフローの振り分け
単一ツールのスキルです。Workflows/ ディレクトリはありません。すべての呼び出しを、次の1つの CLI に振り分けます:
| ワークフロー | トリガー | ファイル |
|---|---|---|
| 検索(インライン) | コンテキスト検索、/cs、過去の作業、想起、セッションの検索、再開、日付表現 | Tools/ContextSearch.ts |
検索の実行
bun run ~/.claude/skills/ContextSearch/Tools/ContextSearch.ts "$ARGUMENTS" --pretty --limit 10
ツールは出力モードを自動判定するために TTY を検出します。明示的に --pretty を指定すると、スキルが Claude Code セッション内から呼び出された場合(stdout が実際の TTY ではない場合)も、人が読みやすいブロック形式で出力されます。構造化出力を jq に渡すには、--json にパイプしてください。
便利なフラグの指定例
# Limit results
bun run ~/.claude/skills/ContextSearch/Tools/ContextSearch.ts "$ARGUMENTS" --limit 5
# Constrain by date
bun run ~/.claude/skills/ContextSearch/Tools/ContextSearch.ts "$ARGUMENTS" --since 2026-05-01
# JSON for programmatic use
bun run ~/.claude/skills/ContextSearch/Tools/ContextSearch.ts "$ARGUMENTS" --json | jq '.results[0]'
ツールは日付表現もインラインで解析します。"yesterday markdown" は、「昨日」のみを対象とする範囲指定の since/until と、markdown のトークン検索に変換されます。
使用モード
- 単独 — 検索を実行し、整形済みブロックを提示して、「[トピック] のコンテキストを読み込みました。最も新しい結果:[X]。次は何をしますか?」と伝えます。
- リクエストと併用 — まず検索を実行し、見つかったコンテキストを踏まえてリクエストを実行します。結果の
pathが有望に見える場合は、詳細を確認するために Read で読み込みます。
出力形式
整形済みブロック:
═══ CONTEXT: <query> ═══════════════════════
📋 RESULTS (N, newest+best first):
• <slug>
task: ... | phase: ... | progress: ... | effort: ... | <recency>d ago | score: ... | sources: ...
↳ "<snippet from matched source>"
<path to ISA or jsonl>
Searched: work.json=N, names=N, dirs=N, isa=N, jsonl=N
════════════════════════════════════════════════
JSON:{ query, cleaned_query, tokens, since, until, stats, results: [{ source[], slug, sessionUuid, name, task, phase, progress, effort, score, recencyDays, snippet, path }] }
注意点
- 部分文字列の一致ではなく、トークンの重なりでスコアを付けます。
markdown extendedのようなクエリでは、「markdown extended」が名前に含まれていなくても、Research Type Markdown Extended Imagesという名前のセッションが見つかります。クエリはトークン化(小文字化し、[^a-z0-9]+で分割して、ストップワードを除去)され、ストップワード以外のトークンを1つ以上共有する候補にスコアが付けられます。 - 日付表現は独立した条件として扱われます。
today、yesterday、day before yesterday、last week、last month、N days ago、YYYY-MM-DDはクエリから解析され、範囲が限定された日付フィルターになります。残りのトークンは引き続きコンテンツとの照合に使われます。yesterdayとtodayには1日分の期間(開始日と終了日の両方)が適用され、last weekには直近7日間のローリング期間が適用されます。 - JSONL の日付には、ファイルの更新日時ではなく、最初のユーザーメッセージのタイムスタンプを使います。 Claude Code が会話の jsonl ファイルを再読み込みするたびに更新日時が変わるため、更新日時は実際の日時を反映しません。このツールは最初の
type:"user"行のtimestampを解析して、実際のセッション開始日を取得します。日付フィルターとの照合にはこの日付を使います。 - jsonl コンテンツの検索対象は、
~/.claude/Projects/内にある~/.claudeプロジェクト固有の会話ディレクトリに限定されます(ディレクトリ名は実行時の$HOMEから生成され、パス内の/と.は-に置き換えられます)。同じマシン上にある他の Claude プロジェクトディレクトリは、意図的に対象外です。 - 永続的なインデックスはありません。 クエリのたびにディスクを再スキャンします。約9,000個の jsonl ファイルを ripgrep で検索する場合でも約1秒で完了し、クエリ全体の遅延は通常1~2秒で、対話的な使用に十分な速さです。将来的に規模の変化で許容できなくなった場合は、オプトイン方式のキャッシュインデックス(例:jsonl ごとの最初のユーザーのタイムスタンプと単語頻度マップ)を v2 とします。
- 単独で使う場合と、別の依頼と組み合わせて使う場合があります。 ユーザーが ContextSearch を単独で呼び出した場合(
/cs <topic>)、結果を提示して、次に何をしたいかを尋ねます。無関係な依頼の前段として組み合わせて呼び出された場合は、検索を静かに実行し、上位の結果を回答の文脈として使います。ユーザーから求められない限り、検索結果のブロックを回答にそのまま含めないでください。 - Session-names.json の日付は jsonl の更新日時です(利用可能な範囲でのフォールバック)。 一部のセッション UUID は work.json にも
MEMORY/WORK/ディレクトリにも存在しません。これらは会話のみのセッションであり、構造上の痕跡は自動生成された名前だけです。その場合、このツールは新しさの判定に jsonl の更新日時を使います。最近ファイルが再読み込みされていると、実際の会話日時より新しい日付になります。
結果を受け取った後
単独の場合:「[topic] のコンテキストを読み込みました。最も新しいものは [X] です。次に何をしますか?」
**組み合わせて使う場合:**上位の結果のコンテキストを踏まえて、ユーザーの依頼に対応します。さらに詳しい情報が必要な場合は、ツールが返したパスを指定して読み込みます。
例
例1:特定のトピックについて作業を再開する
User: "what did we do with the Telegram bot?"
→ bun run Tools/ContextSearch.ts "telegram bot"
→ Tokens [telegram, bot] hit work.json + ISA bodies + jsonl
→ Returns telegram-monitor-revival, fix-telegram-channels-plugin-broken, ranked by recency
例2:うろ覚えのセッションを探す
User: "open up that test extended markdown document that you made yesterday"
→ bun run Tools/ContextSearch.ts "test extended markdown document yesterday"
→ Date phrase 'yesterday' parses out → since/until = 2026-05-07 only
→ Tokens [test, extended, markdown, document] hit jsonl content
→ Returns "Research Type Markdown Extended Images" session in top-3 with snippet
例3:日付だけで検索する
User: "what did I work on last week?"
→ bun run Tools/ContextSearch.ts "last week"
→ Date phrase parses to since=7d-ago, no token filter
→ Returns all sessions from the past 7 days, newest first
実行ログ
ワークフローの完了後、JSONL のエントリを1つ追記します。
echo '{"ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","skill":"ContextSearch","workflow":"Search","input":"8_WORD_SUMMARY","status":"ok|error","duration_s":SECONDS}' >> ~/.claude/LIFEOS/MEMORY/SKILLS/execution.jsonl