关于 Selvedge
Selvedge 是面向开发者和团队的本地决策记忆服务,可供兼容的编码 Agent 使用。它将决策理由和被否决方案存入项目 SQLite,并支持跨会话、跨工具按代码实体检索。
主要功能
- 01记录决策及被否决方案
- 02按代码实体检索历史
- 03将记录存于项目 SQLite
- 04搜索历史与变更集
- 05导入和导出 Agent Trace
适用场景
- 01回想选择某种代码方案的原因
- 02在不同编码会话间共享决策
- 03审查变更实体的决策历史
MCP 相关
Selvedge 作为本地 stdio MCP 服务运行,兼容客户端可用它保存和检索决策记录。同一 SQLite 存储也可通过其命令行访问。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
selvedge.sh · DevHunt · PyPI · GitHub
为 AI Agent 提供持久化决策记忆。
记录你为何选择某种方案、否决了什么,以及什么情况会让你改变主意。下一次编码会话时,可以通过函数、数据库列、API 路由或依赖项检索这些上下文。
Selvedge 面向所有使用兼容 Agent 的人。通过 stdio 上的本地 MCP 连接,或在具备 shell 访问权限的 Agent 中使用命令行。切换工具时,决策仍保存在 .selvedge/ 中的同一个 SQLite 存储内。
无需托管账户;核心存储和检索不会调用大模型。
uv tool install --upgrade selvedge
selvedge demo
需要安装 uv 和 Python。 推荐使用 Python 3.11–3.14;Python 3.10 仍兼容,但已停止维护。 演示会使用临时数据库。按照快速入门 将 Agent 连接到实际项目。
使用 selvedge demo --mcp 通过本地 stdio MCP 服务保存记录,重启服务后再检索同一条记录。添加 --json 可查看已检查的 ID 和版本。
此操作会使用临时数据,测试运行 Selvedge 的 Python 安装;
Agent 的配置、激活和钩子仍需单独检查。
Selvedge 面向哪些人
- 独立开发者:在原始对话结束后重新回到项目时使用。
- 团队:需要在会话和编码工具之间传递已记录的决策。
问题
代码展示了所选方案,却可能没有说明促成该选择的限制条件,或被排除的替代方案。Selvedge 在项目中为这些说明提供了存放位置,并提供工具,让你在下一次修改之前检索这些内容。
只有明确保存的决策才能被找回。保存的说明由人或 Agent 提供;Selvedge 不会验证其真实性,也不保证 Agent 会查阅这些说明。通过在两个会话中验证一项决策来测试设置。
v0.3.17 新增内容
审查前检查已记录的决策。 生成 Markdown 摘要,然后运行
selvedge export --format markdown -o DECISIONS.md --check 来检查是否存在偏差。
摘要完全一致时会静默退出,返回码为 0;摘要已过时或缺失时会返回码为 1,并显示统一差异和重新生成指南。检查模式会保留摘要
和已存储的记录。发布前请先审查导出的推理内容。
selvedge demo --mcp 会通过真实的本地 MCP 服务保存一条合成的否决记录,重启服务后再检索同一条记录。它使用一次性状态;
不会验证你的 Agent 配置或钩子是否已激活。
CLI 输出现在会保留用户数据中的字面方括号,而 blame 和 Markdown
导出会区分被否决的方案与尝试后又撤销的更改。
此补丁仍兼容 Python 3.10,但该运行时现已
上游停止支持;新安装请使用经过测试且受支持的
Python 3.11–3.14。没有新增运行时依赖、迁移或 MCP 工具。
v0.3.16 新增内容
将已记录的决策带入代码审查。 selvedge ledger 会显示每项决策由谁记录,以及后续哪条记录明确修订了它。可选的
PR 审查 Action 会从获准发布的基础历史中,为涉及的文件添加原因和被否决的替代方案。归属信息由用户自行报告;Action 为可选功能,绝不会执行 PR 分支头部的代码。
selvedge doctor --agent CLIENT 会检查全部六种设置目标的项目钩子配置,并提供具体的后续步骤。配置检查并不能证明客户端已激活其钩子。
匹配注入试点完成了 24 次合成试验:在没有记忆的情况下,仍然有效的已否决选项在符合条件的运行中有 4/6 次再次出现;注入记录后为 0/6 次。两种条件都通过了过时和无关项对照测试。两个合成任务无法证明一般编码表现或优于受维护文件;此前四组测试结果持平的情况仍有披露。没有新增运行时依赖、迁移或 MCP 工具。
Selvedge 的定位
- 保存决策。 你或编码 Agent 通过 MCP 或 CLI 记录一项选择、其原因, 以及任何被否决的方案。
- 将其保存在项目中。 Selvedge 将记录存储在本地 SQLite 中, 并根据相关函数、列、路由或其他实体为其建立索引。
- 在下一次编辑前回想起来。 后续会话会查询同一存储区, 并检查先前的约束是否仍然适用。
Git 保留代码历史;审查工具检查更改;可观测性展示 运行时行为。Selvedge 补充记录在案的决策原因。 工作原理 · Agent Trace 互操作
Selvedge 对比
选择最契合你工作流的最简记忆机制:
| 需求 | 有用的起点 | Selvedge 补充的内容 |
|---|---|---|
| 长期项目规则 | 维护的 Agent 指令文件 | 可查询的、关联到特定实体的决策 |
| 经过评审的架构选择 | 架构决策记录(ADR) | 结构化结果、被否决的方案与重新审视信号 |
| 谁在何时改动了一行 | Git 历史与归属工具 | 实体的明确理由与早先方案 |
| 将已记录的决策带入另一会话或客户端 | 共享的项目文档 | 从同一本地数据库通过 MCP 与 CLI 检索 |
这些方法可以结合使用。阅读源码链接对比与指令、ADR 与决策记忆的对比,了解具体的选择标准与局限。
为何实体历史很重要。 当 users.email、env/STRIPE_SECRET_KEY、api/v1/checkout 和 deps/stripe 的代码发生迁移时,它们仍是有用的查询目标。明确的否决与取代记录能让后续会话查看曾尝试过什么,以及原始约束是否仍然适用。
为何记录时间很重要。 在上下文尚可用时记录理由,可以保留 diff 中不包含的信息。这并不意味着理由绝对可靠。检索使用的是已存储的记录;编码 Agent 仍需负责核验适用性并测试其改动。
为何变更集很重要。 用共享的变更集(如 add-stripe-billing)标记事件,即可跨表、环境变量、路由与函数检索某个任务的全部决策。
Agent Trace 交换。 selvedge export --format agent-trace 与 selvedge import --format agent-trace 用于交换 Agent Trace v0.1.0 记录。推理与实体历史随 dev.selvedge 元数据一同传递。映射与限制文档说明了该格式;Selvedge 内置了该 schema,对上游项目没有运行时依赖。
快速开始
连接你的 Agent
在已安装 uv 的情况下:
uv tool install --upgrade selvedge
selvedge demo
cd your-project
selvedge setup
安装程序会检测支持的客户端。若要显式选择预设,可使用 --agent 搭配 claude-code、codex、copilot、cursor、gemini 或 windsurf;为多个客户端重复该标志即可。这些预设只是便利手段,并非兼容性限制。对于其他支持本地 stdio MCP 的 Agent,请遵循手动设置。有 shell 访问权限的 Agent 可以使用 CLI。偏好 pip?请在虚拟环境中使用 python -m pip install --upgrade selvedge。selvedge-server 可执行文件必须位于编辑器的 PATH 中;请从该环境启动编辑器,或在其 MCP 配置中使用该可执行文件的绝对路径。
安装程序在更改文件前会先询问,备份现有内容,安装 MCP 与 Agent 指令,初始化项目,并可选提供 Git post-commit 钩子。配置文件和生命周期钩子因客户端而异。关于预设路径、激活要求与局限,请参阅兼容性指南。
在项目中重启你的 Agent,并在提示时批准 Selvedge 的工具。遵循你所使用客户端的项目信任要求。向 Agent 提问:
使用 Selvedge 记录我们在此项目中考虑并否决的一个真实方案。 包含实体、原因,以及什么会让我们改变主意。不要编造决策。 显示保存的实体路径和记录 ID。 启动一个新会话并查找同一实体,以验证该决策是否得以延续。按照首次决策验证指南和跨 Agent 交接指南进行可观测的检查。MCP 访问不会自动捕获每一项决策:已安装的指令会引导 Agent 使用它。原生生命周期适配器覆盖受支持的客户端事件;启动交付、监视编辑检查和压缩通知因 harness 而异。启用之前,请参阅 Agent 钩子指南。
用于 CI 引导或 devcontainer.json 的 postCreateCommand:
selvedge setup --non-interactive --yes
验证接线 — 在同一项目中打开第二个终端:
selvedge watch
在你的 AI 工具中做任意更改 — 添加一列、重命名一个函数、添加一个
环境变量。selvedge watch 应在 Agent 调用 log_change 后一秒内
打印新事件。如果没有收到任何内容,请运行 selvedge doctor
进行单命令健康检查,它会告诉你哪一步在悄无声息地失效。
查询你的历史记录:
selvedge status # recent activity + missing-commit count
selvedge diff users # all changes to the users table
selvedge diff users.email # changes to a specific column
selvedge blame payments.amount # what changed last and why
selvedge history --since 30d # last 30 days of changes
selvedge history --since 15m # last 15 minutes ('m' = minutes)
selvedge changeset add-stripe-billing # all events for a feature/task
selvedge search "stripe" # full-text search
selvedge stats # observed tool calls and explanation quality
selvedge import migrations/ # backfill from migration files
selvedge export --format csv # dump history to CSV
手动安装 — 如果你更愿意自己接线
如果你不想运行向导,以下是它自动完成的四个手动步骤:
1. 在你的项目中初始化
cd your-project
selvedge init
2. 注册 MCP 服务
配置你的客户端,将 selvedge-server 作为本地 stdio MCP 服务启动。
如果它不在客户端的 PATH 中,请使用其绝对路径,并在客户端于项目外启动时
将 SELVEDGE_DB 设置为项目数据库。配置语法各不相同;请参阅连接示例。
3. 告诉你的 Agent 使用它
selvedge prompt --install path/to/agent-instructions.md
将 path/to/agent-instructions.md 替换为你的客户端实际读取的文件 — 该代码块
本身在各客户端之间是相同的:
| 客户端 | 提示词文件 |
|---|---|
| Claude Code | CLAUDE.md |
Codex CLI(以及其他识别 AGENTS.md 的工具) | AGENTS.md |
| Cursor | .cursor/rules/selvedge.md(或旧版 .cursorrules) |
| Gemini CLI | GEMINI.md |
这会安装规范的 Agent 指令块,以哨兵括号标注
(/),以便未来的
--install 调用只更新括号区域,而不影响文件中的
其他任何内容。要打印该代码块以便复制:
selvedge prompt
更想直接复制粘贴?同一个代码块在网站上一键可得: selvedge.sh/prompt-block — 带有 复制按钮,并说明你的 Agent 会如何使用它。
4. 安装提交后钩子
selvedge install-hook
这与向导运行的四个步骤相同。
适用于兼容的 Agent
Selvedge 不要求特定的 Agent 品牌或模型提供商。其 MCP 接口使用
本地 stdio:兼容的客户端必须能够启动 selvedge-server 并
调用其工具。仅支持远程 HTTP 的客户端需要单独的 stdio 桥接;Selvedge
不提供托管端点。具有 shell 访问权限的 Agent 可以改为使用
selvedge log 和读取命令。
以下集成仅为示例。选择与你的客户端匹配的那个,或 使用其自身设置格式配置另一个 stdio MCP 客户端:
Claude Code
### 可选的 Claude Code 插件在 Claude Code 内运行两条命令。无需事先 pip install —— 该插件会通过 uvx(或 pipx)自行引导启动服务:
/plugin marketplace add masondelan/selvedge
/plugin install selvedge@selvedge
一步即可获得面向 Agent 的完整功能面:
- MCP 服务 —— 8 个工具(
log_change、prior_attempts、blame、diff、history、changeset、search、stale_decisions); - 一个技能,告诉 Agent 何时调用它们 —— 在编辑被跟踪实体之前、在任何实质性变更之后;
- PreToolUse 强制钩子 —— 在本次会话中检查过
prior_attempts之前,schema/迁移编辑会被阻止,阻止消息中会附带先前的推理; - 斜杠命令 ——
/selvedge:status、/selvedge:blame <entity>、/selvedge:history、/selvedge:prior-attempts <entity>。
存储(.selvedge/selvedge.db)会在首次记录变更时自行创建。
两个可选项保留在命令行侧:为每个事件标记其提交哈希的 post-commit 钩子(selvedge install-hook),以及 —— 如果你想让 selvedge 命令出现在自己的 shell PATH 上 —— pip install selvedge,之后启动器会优先使用它而非 uvx,以获得精确固定的版本。
Claude Code 用插件还是
selvedge setup?二选一。 两者都会接入 MCP 服务;同时运行会将其注册两次。插件是更轻量的路径,也是能自我更新的那个。如果你使用插件,且只想要 post-commit 提交哈希标记,单独运行selvedge install-hook即可。
手动 MCP 连接
claude mcp add selvedge -- selvedge-server
或者提交一个项目级的 .mcp.json,让整个团队都能获得:
{
"mcpServers": {
"selvedge": { "command": "selvedge-server" }
}
}
Cursor
.cursor/mcp.json(项目)或 ~/.cursor/mcp.json(全局):
{
"mcpServers": {
"selvedge": { "command": "selvedge-server" }
}
}
Cursor 较新的 schema 也接受显式的 "type": "stdio";仅含
command 的形式同样可用(Cursor 会从 command 推断出 stdio)。
文档:https://cursor.com/docs/mcp
Windsurf
~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"selvedge": { "command": "selvedge-server" }
}
}
Windsurf 会热重载该文件 —— 无需重启。应用内的 Plugins → View raw config 按钮会打开 Cascade 实际读取的那个文件。 文档:https://docs.devin.ai/desktop/cascade/mcp
Codex CLI
~/.codex/config.toml:
[mcp_servers.selvedge]
command = "selvedge-server"
或运行 codex mcp add selvedge -- selvedge-server。
文档:https://learn.chatgpt.com/docs/config-file/config-reference
Gemini CLI
~/.gemini/settings.json(或按项目使用 .gemini/settings.json):
{
"mcpServers": {
"selvedge": { "command": "selvedge-server" }
}
}
或运行 gemini mcp add -s user selvedge selvedge-server。
文档:https://github.com/google-gemini/gemini-cli/blob/main/docs/tools/mcp-server.md
任何其他 MCP 客户端
大多数客户端共享相同的 JSON 结构 —— 将你的客户端指向:
{
"mcpServers": {
"selvedge": { "command": "selvedge-server" }
}
}
如果找不到 selvedge-server,请使用其绝对路径(which selvedge-server)。
工作原理
Selvedge 以本地 MCP 服务或命令行的形式运行。兼容的 Agent 在工作过程中调用其工具, 将结构化变更事件记录到本地 SQLite 数据库。
每个事件记录:
- 什么发生了变化(实体路径、变更类型、diff)
- 何时(时间戳)
- 谁(Agent、会话 ID)
- 为什么(推理 —— 在当下从 Agent 的上下文中捕获)
- 何处(git 提交、项目)
diff 是 git 的职责。为什么是 Selvedge 的职责。
Selvedge 跟踪自己的历史
本仓库自用 Selvedge:其 .selvedge/selvedge.db 已被提交,因此全新克隆就自带 Selvedge 自己的 why 历史。克隆它,然后询问 Selvedge 的任何部分为何变更:
git clone https://github.com/masondelan/selvedge
cd selvedge
selvedge status # recent changes to Selvedge itself
selvedge search "telemetry" # why the opt-in heartbeat shipped
selvedge blame selvedge/semantic.py # why semantic search was added
每个事件都由构建 Selvedge 的 Agent 记录 —— 正是本 README 要求你在自己项目中进行的那同样的
log_change 调用。
实体路径约定
users.email DB column (table.column)
users DB table
src/auth.py::login Function in a file (path::symbol)
src/auth.py File
api/v1/users API route
deps/stripe Dependency
env/STRIPE_SECRET_KEY Environment variable
前缀查询在任何地方都有效:users 会返回 users、users.email、
users.created_at,以及 users. 命名空间下的任何其他实体。
MCP 工具
作为 MCP 服务连接时,Selvedge 会提供:
| 工具 | 描述 |
|---|---|
log_change | 记录包含实体、差异和原因的变更事件。rename_from + change_type="rename" 会记录双事件重命名模式;change_type="supersede" 会重新打开已撤销的决策(仅追加);可选的 constraint / stale_when 可使决策原则及其失效条件可供查询 |
diff | 实体或实体前缀的历史记录,每一行都会标注 superseded_by |
blame | 精确实体的最近一次变更及上下文,以及推导出的决策 status(active / reverted / reopened) |
history | 跨所有实体的筛选历史记录 |
changeset | 按命名的功能 / 任务标识符分组的所有事件 |
search | 跨所有事件的全文搜索 |
prior_attempts | 实体的先前变更尝试及推断出的结果(尝试 → 撤销 → 重新打开)——编辑前请先调用。可选的 fuzzy 查询会添加语义相似记录(需要 semantic 扩展;不可用时回退到子串搜索) |
stale_decisions | 需要重新审视的决策:超过其 revisit_after 时间且仍在使用中(flag="revisit_due"),或其 stale_when 条件与后续变更匹配(flag="review_suggested") |
CLI 参考
selvedge init [--path PATH] Initialize in project
selvedge status Recent activity summary
selvedge diff ENTITY [--limit N] Change history for entity
selvedge blame ENTITY Most recent change + context
selvedge history [--since SINCE] Browse all history
[--entity ENTITY]
[--project PROJECT]
[--changeset CS]
[--summarize]
[--limit N]
selvedge changeset [CHANGESET_ID] Show events in a changeset
[--list] or list all changesets
[--project NAME]
[--since SINCE]
selvedge search QUERY [--limit N] Full-text search
selvedge prior-attempts ENTITY Prior attempts + inferred outcome,
[--description T] with the tried → reverted →
[--all] re-opened trail + status line
[--window 7d] (--all widens recall)
[--fuzzy TEXT] add semantic matches (needs the
semantic extra; substring fallback)
selvedge supersede ENTITY Re-open a reverted decision —
--reasoning TEXT append-only, links the prior
[--constraint TEXT] reverted event (or --supersedes ID)
[--stale-when TEXT]
[--supersedes ID]
selvedge index [--model NAME] Build/update the optional semantic
[--json] embeddings index (selvedge[semantic])
selvedge stale [--entity ENTITY] Decisions due for a revisit: past
[--project NAME] revisit_after + still in use, or
[--agent NAME] stale_when matched by a later change
[--json] ("review suggested")
selvedge stats [--since SINCE] Tool call coverage report (per-tool, per-agent)
selvedge doctor [--agent CLIENT] [--json] Health check; optional project agent-hook diagnostics
selvedge install-hook [--path PATH] Install git post-commit hook
[--window MIN] (default 60 minutes)
selvedge backfill-commit --hash HASH Backfill git_commit on recent events
[--window MIN] (default 60 minutes)
selvedge import PATH Import migrations (SQL / Alembic) or
[--format auto|sql| an Agent Trace file (agent-trace)
alembic|agent-trace]
[--from-git] or walk git history for reverts:
[--since REF|DATE] revert-message commits + deletions
[--project NAME] become change_type="revert" events
[--dry-run] (idempotent on commit + entity)
selvedge export [--format json|csv| Export history (agent-trace =
markdown|agent-trace] Agent Trace v0.1.0 records;
markdown = reviewable digest)
[--since SINCE]
[--entity ENTITY]
[--ndjson] agent-trace: one record per line
[--collapse-by-session] agent-trace: merge a session into one
[--output FILE]
selvedge log ENTITY CHANGE_TYPE Manually log a change
[--diff TEXT] CHANGE_TYPE: add, remove, modify,
[--reasoning TEXT] rename, retype, create, delete,
[--agent NAME] index_add, index_remove, migrate,
[--commit HASH] revert, supersede
[--project NAME]
[--changeset CS]
[--revisit-after WHEN] ISO date or offset (e.g. 90d)
[--rename-from OLD] OLD path when CHANGE_TYPE is 'rename'
[--constraint TEXT] the principle behind the decision
[--stale-when TEXT] what would invalidate it
[--supersedes ID] with CHANGE_TYPE 'supersede'
selvedge migrate-paths Re-canonicalize stored entity paths
[--apply] (dry-run by default; --apply writes)
[--json]
所有读取命令都支持 --json,以输出机器可读的结果。
--since 中的相对时间:
15m→ 最近 15 分钟(m= 分钟)24h→ 最近 24 小时7d→ 最近 7 天5mo→ 最近 5 个月(mo或mon= 月)1y→ 最近 1 年
无法解析的输入(例如 --since yesterday)会以清晰的错误退出,
而不会静默返回空结果。也接受 ISO 8601 时间戳,并会将其标准化为 UTC。
配置
| 方法 | 格式 | 示例 |
|---|---|---|
| 环境变量 | SELVEDGE_DB=/path/to/db | 按会话覆盖 |
| 项目初始化 | selvedge init | 在 CWD 中创建 .selvedge/selvedge.db |
| 全局回退 | ~/.selvedge/selvedge.db | 找不到项目数据库时使用 |
| Hook 监视 glob | .selvedge/config.toml | [hook]watch_globs = ["**/migrations/**", "db/**/*.sql"] — 替换强制执行 Hook 的默认 schema / migration glob |
| 项目设置 | .selvedge/config.toml | 请参阅下方的键列表——保留策略、大小限制、脱敏模式 |
| 全局设置 | ~/.selvedge/config.toml | 使用相同的键;两者都设置时以项目文件为准 |
| Hook 绕过 | SELVEDGE_HOOK_DISABLE=1 | 对 shell 禁用 PreToolUse 强制执行 Hook |
| 语义扩展 | pip install "selvedge[semantic]" | 启用 selvedge index + prior-attempts --fuzzy(本地 model2vec 嵌入,约 30 MB;核心功能不依赖此扩展) |
.selvedge/config.toml
所有键均为可选;缺少文件时使用下方默认值。优先级为
CLI 标志 → 环境变量 → 项目 .selvedge/config.toml → 全局
~/.selvedge/config.toml → 默认值。SELVEDGE_DB 是唯一例外:它
始终优先用于数据库解析,因为配置文件是通过解析该路径来找到的。
selvedge doctor 会显示每项设置的有效值及其来源步骤。
retention_days_events = 0 # 0 = never delete events (the default)
retention_days_tool_calls = 90 # local telemetry retention
backup_keep_last = 7
diff_bytes = 65536 # truncate oversized diffs at log time
reasoning_bytes = 32768 # truncate oversized reasoning
db_size_warn_mb = 500 # doctor warns above this
stale_days = 0 # 0 = off
digest_max_bytes = 4096 # cap on the session-start digest
redaction_patterns = [] # extra secret shapes to warn about
[hook]
watch_globs = ["**/migrations/**", "db/**/*.sql"]
每个键也都有对应的环境变量覆盖项(SELVEDGE_DIFF_BYTES、
SELVEDGE_RETENTION_DAYS_EVENTS,……)。
在拉取请求中审查已记录的意图
.selvedge/selvedge.db 是一个 SQLite 文件,因此其中的推理不会显示在差异中。如果你需要一份可供审查的副本,可以导出为 Markdown 摘要:
selvedge export --format markdown -o .selvedge/DECISIONS.md
git add .selvedge/DECISIONS.md
摘要按实体分组,已撤销和已拒绝的决策优先显示。明确的 reject 事件会显示在已考虑并拒绝下,与已尝试并撤销分开。最新事件决定所属分区;后续的 supersede 会将这两类事件移至重新打开,同时保留完整历史记录。人类可读的 blame 也会将明确拒绝标记为“已拒绝”。为兼容 API,JSON status 和轨迹 phase 保留现有的 reverted 负面判定类别;change_type: "reject" 用于标识拒绝。
该摘要是确定性的——没有新事件时重新生成不会产生任何差异行,因此它始终便于审查,不会变成大家习惯性跳过的噪声。标题锚点源自实体路径,因此随着内容增长,指向其中的链接仍然有效。请在提交代码的同一提交中重新生成,或通过 pre-commit hook 重新生成。
要在 hook 或 CI 中检查摘要是否过时或缺失,请使用相同的筛选条件和输出路径,并添加 --check:
selvedge export --format markdown -o .selvedge/DECISIONS.md --check
如果 UTF-8、以 LF 结尾的字节内容匹配,检查会静默退出并返回 0;如果内容过时或缺失,则会返回 1 并显示统一差异(无法读取时则显示错误);参数无效时会返回 2。检查要求使用 Markdown 和显式文件;不接受 stdout 和其他格式。它不会重写摘要、创建或迁移数据库、更改已存储的记录,也不会启动后台更新和遥测检查。在 CI 中使用现有的已初始化存储,通过常规数据库解析方式或 SELVEDGE_DB 选择。读取时,SQLite 可能会维护其正常的 WAL 锁定文件。若要更新摘要,请在不带 --check 的情况下重新生成。
是否发布摘要或数据库均由你自行决定。提交或分享之前,请检查记录的推理和元数据中是否包含机密和私人信息;生成的差异也可能会在 CI 日志中暴露这些信息。
覆盖率检查
想知道你的 Agent 实际调用 log_change 的频率吗?可以通过两种方式检查:
# Quick summary in the terminal
selvedge stats
# Cross-reference against git commits
python scripts/coverage_check.py --since 30d
覆盖率脚本会将你的 git 日志与 Selvedge 事件进行比较,并显示哪些提交关联了变更事件。覆盖率较低通常意味着系统提示词需要加强——请参阅 docs/fallbacks.md 获取指导。
在 CI 中(GitHub Action)
同一项检查也以 Selvedge Coverage Check 复合 Action 的形式提供,因此你可以在每次推送时跟踪 Agent 的覆盖率——并可选择在覆盖率下降时让构建失败:
# .github/workflows/selvedge-coverage.yml
name: Selvedge coverage
on: [push, pull_request]
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # full history so commits can be matched
- uses: masondelan/[email protected] # pin to a release tag (or @main for latest)
with:
since: 30d
fail-under: "0.5" # optional: fail below 50% coverage; omit to report only
该 Action 会将覆盖率摘要写入作业摘要,并将 coverage-ratio、covered 和 total 作为步骤输出提供。该 Action 会交叉比对你的 git 历史记录与 Selvedge 事件日志,因此运行器需要项目的 .selvedge/selvedge.db(提交该文件,或在此步骤之前还原它)和完整的 git 历史记录(fetch-depth: 0)。输入:since、window、limit、fail-under、selvedge-version、python-version、working-directory、db-path。
贡献
请阅读反馈与审查流程,了解如何报告问题、评估功能请求以及跟进讨论。
git clone https://github.com/masondelan/selvedge
cd selvedge
pip install -e ".[dev]"
pytest
架构详情和阶段路线图请参阅 CLAUDE.md。
许可证
MIT — 请参阅 LICENSE。
面向审查者的决策背景
共享账本和 PR 审查 Action会展示已记录的原因、被拒绝的路径、执行者/会话归属信息,以及受影响实体的完整性。匹配注入试点报告了每一次试验,并将结论限定在经过测试的合成任务范围内。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。