mcpField
S
session-search

session-search

github.com/ar9avAgent 工作流3.6k327 次安装2 天前更新
代码仓库

关于 session-search

session-search 是用于查找相关 Agent 历史会话并提取上下文的技能。它结合文本相似度、主题簇、书签和时间因素排序,并标明已无法读取完整记录的会话。

主要功能

  1. 01搜索历史会话
  2. 02按相似度、主题、书签和时间排序
  3. 03按项目、主题簇、日期或数量筛选
  4. 04读取仍可用的会话记录
  5. 05识别仅保留历史提示词的结果

适用场景

  1. 01查找之前讨论某主题的会话
  2. 02按日期范围定位项目讨论
  3. 03恢复已收藏会话的上下文

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ar9av/obsidian-wiki --skill session-search

安装后在 Claude Code 中输入/session-search确认已加载。

详细介绍

会话搜索

回答“我过去的哪个会话是关于 X 的?”,然后提取该会话的上下文。

步骤 1:检查图是否存在且为最新

obsidian-wiki sessions-query "<topic>" --json

如果此命令以状态码 1 退出,并显示“run sessions-build first”,请告知用户并提供 /session-brain 选项。如果 graph.json 已超过约 7 天,请提及并提供重建选项——但不要在用户不知情的情况下重建, 因为这需要数秒,而用户并未提出此要求。

步骤 2:排序

评分已经综合了四种信号,因此请直接采用现有排序,不要重新排序:

  • 相似度——与会话文本进行 TF-IDF 余弦相似度计算
  • 主题簇加权——即使会话本身没有匹配到相关词语,属于最佳匹配主题的会话也会获得更高评分。这就是为什么一个从未提到“telemetry”的会话仍可能因此出现在结果中。
  • 书签加权——有人已经将此会话标记为值得保留
  • 时间衰减——半衰期为 90 天,并设有下限,因此旧的精准匹配仍会排在新的弱匹配之前

实用筛选条件:--project NAME、--cluster N、--since DATE、--top N。

步骤 3:呈现

将排名前约 5 个结果以紧凑表格展示——标题、项目、日期、主题和 why 字符串;该字符串已经说明了匹配原因。不要向用户倾倒原始 JSON。

有两件事必须如实说明,不要含糊带过:

  • loadable: false 的条目仅有历史记录:文字记录已从磁盘清理,仅保留提示词。这些条目会列在 unloadable 中,并附有原因。请说明文字记录已不存在;不要暗示可以找回。
  • 如果所有相关条目都无法加载,请根据现存的提示词文本作答,并说明这就是仅存的内容。

步骤 4:加载——交接处理,不要自行重写

should_load 最多包含 3 个值得打开的会话 ID,并且已筛除没有文字记录的会话。

如果用户安装了现有加载技能,请优先使用:

  • claude-session-load — 按 ID 加载 Claude 会话
  • bookmark-load — 命中结果已加书签时使用

⚠️ 这些技能位于用户的个人技能目录(~/.claude/skills/),不在此仓库中。它们可能不存在。不要假定它们存在;如果不存在也不要报错——改为直接读取文字记录:

# the path is in the query result as `transcript`
obsidian-wiki sessions-show <session-id> --pretty

文字记录采用 JSONL 格式,可能有数十 MB。**切勿完整读取。**请先筛选出人类发言:

grep -c '' <transcript>   # size check before anything else
python3 -c "
import json,sys
for line in open(sys.argv[1], errors='replace'):
    try: r = json.loads(line)
    except ValueError: continue
    if r.get('type')=='user' and not r.get('isSidechain') and not r.get('isMeta'):
        c = (r.get('message') or {}).get('content')
        if isinstance(c,str) and not c.lstrip().startswith('<'): print('>', c[:400])
" <transcript>

步骤 5:回答

根据已加载的内容综合作答,并注明所用的会话 ID。如果答案来自仅有历史记录的会话中的提示词,而非真实文字记录,请说明这一点——用户需要知道你实际掌握了多少上下文。

相关内容

  • /session-brain — 构建或刷新图,调查并命名主题
  • wiki-query — 搜索整理后的知识库内容;此技能搜索的是原始会话历史
  • wiki-agent — 从另一个 Agent 的历史记录中提取主题,并将其整理到知识库中

评论

支持 Markdown