mcpField
O
opencode-memory

opencode-memory

github.com/carson2222Agent 工作流112413 次安装17 周前更新
代码仓库

关于 opencode-memory

OpenCode Memory Browser 是只读技能,可在需要时查询本地 OpenCode 历史中的会话、计划和决策。它使用有针对性的 SQLite 查询并总结相关发现,不会默认注入历史内容。

主要功能

  1. 01只读访问 OpenCode 历史
  2. 02搜索会话与消息文本
  3. 03查询计划和提示历史
  4. 04使用有限结果的定向 SQLite 查询
  5. 05总结相关发现

适用场景

  1. 01回忆先前会话中的决策
  2. 02结合项目既有上下文继续工作
  3. 03检查问题是否曾经出现

安装

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

$npx skills add https://github.com/carson2222/skills --skill opencode-memory

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

附带文件references/storage-format.md

详细介绍

OpenCode 记忆浏览器

只读查询本地 OpenCode 历史记录。仅在先前的会话、计划或决策会有所帮助时使用。不要默认注入历史记录。

使用场景

  • 用户询问历史记录、之前的会话、上次、计划、回忆或记忆。
  • 恢复某个项目,且先前的 OpenCode 上下文可能有所帮助。
  • 调试可能曾出现过的重复问题。

如果仓库文件或 git 已能回答问题,或任务是全新的,请勿使用。

规则

  • 只读。绝不修改 OpenCode 数据库或文件。
  • 使用 sqlite3 和只读 URI。不要使用文件读取工具读取数据库。
  • 使用 LIMIT 和有针对性的 LIKE,控制结果数量。
  • 总结相关发现;不要倾倒原始历史记录。
  • 避开身份验证/提供方表:account、credential、control_account、account_state。

设置

先在 bash 中运行:

DATA_ROOT="${XDG_DATA_HOME:-$HOME/.local/share}/opencode"
STATE_ROOT="${XDG_STATE_HOME:-$HOME/.local/state}/opencode"
DB="$(opencode db path 2>/dev/null || true)"
[ -n "$DB" ] || DB="${OPENCODE_DB:-$DATA_ROOT/opencode.db}"
case "$DB" in :memory:|/*) ;; *) DB="$DATA_ROOT/$DB" ;; esac
if [ ! -f "$DB" ]; then
  for candidate in "$DATA_ROOT"/opencode*.db; do
    [ -f "$candidate" ] && DB="$candidate" && break
  done
fi
DB_URI="file:${DB}?mode=ro"

有用的文件:

  • 计划:$DATA_ROOT/plans/*.md
  • 提示词历史记录:$STATE_ROOT/prompt-history.jsonl
  • 会话差异:$DATA_ROOT/storage/session_diff/<session-id>.json

查询

摘要
sqlite3 "$DB_URI" "
  SELECT 'projects', COUNT(*) FROM project
  UNION ALL SELECT 'main sessions', COUNT(*) FROM session WHERE parent_id IS NULL
  UNION ALL SELECT 'messages', COUNT(*) FROM message
  UNION ALL SELECT 'parts', COUNT(*) FROM part
  UNION ALL SELECT 'todos', COUNT(*) FROM todo;
"
最近的会话
sqlite3 "$DB_URI" "
  SELECT s.id, COALESCE(s.title, 'untitled') AS title,
    COALESCE(p.name, p.worktree, '') AS project,
    datetime(s.time_updated/1000, 'unixepoch', 'localtime') AS updated,
    (SELECT COUNT(*) FROM message m WHERE m.session_id = s.id) AS messages
  FROM session s
  LEFT JOIN project p ON p.id = s.project_id
  WHERE s.parent_id IS NULL
  ORDER BY s.time_updated DESC
  LIMIT 10;
"
搜索文本

先替换 SEARCH_TERM。

sqlite3 "$DB_URI" "
  SELECT s.id, COALESCE(s.title, 'untitled') AS title,
    json_extract(m.data, '$.role') AS role,
    datetime(m.time_created/1000, 'unixepoch', 'localtime') AS time,
    substr(json_extract(p.data, '$.text'), 1, 200) AS snippet
  FROM part p
  JOIN message m ON m.id = p.message_id
  JOIN session s ON s.id = m.session_id
  WHERE s.parent_id IS NULL
    AND json_extract(p.data, '$.type') = 'text'
    AND json_extract(p.data, '$.text') LIKE '%SEARCH_TERM%'
  ORDER BY m.time_created DESC
  LIMIT 10;
"
读取会话文本

先替换 SESSION_ID_HERE。仅包含文本部分;工具、补丁、文件、推理或 V2 内部信息请参阅参考文档。

sqlite3 "$DB_URI" "
  SELECT json_extract(m.data, '$.role') AS role,
    datetime(m.time_created/1000, 'unixepoch', 'localtime') AS time,
    GROUP_CONCAT(json_extract(p.data, '$.text'), char(10)) AS text
  FROM message m
  LEFT JOIN part p ON p.message_id = m.id
    AND json_extract(p.data, '$.type') = 'text'
  WHERE m.session_id = 'SESSION_ID_HERE'
  GROUP BY m.id
  ORDER BY m.time_created ASC
  LIMIT 50;
"

计划与提示词历史记录

ls -lt "$DATA_ROOT"/plans/*.md 2>/dev/null | head -20
tail -20 "$STATE_ROOT"/prompt-history.jsonl 2>/dev/null

提示词历史记录条目目前使用 input、mode 和 parts[];不要假定根级字段是 text。

深入参考

仅在需要了解表详情、部分/工具结构、旧版 JSON 路径或调试查询时,使用 references/storage-format.md。

评论

支持 Markdown