Communitygithub.com

aryashreep/ctx-audit

审计AI上下文文件(AGENTS.md、memory.md)的新鲜度和代币成本。零依赖,支持CLI、GitHub Action和Claude Code技能。

ctx-audit 是什么?

Context Audit 是一款轻量级工具,用于审计 AI 代理使用的上下文文件的时效性和代币成本。它专门检查项目中的 AGENTS.md、memory.md 等约定文件是否最新,防止代理依赖过时信息或重复扫描代码库。该技能支持 CLI 命令、GitHub Action 集成以及 Claude Code 技能安装,零外部依赖。通过分析 Git 提交历史和文件变动,它能为每个文件提供“新鲜”、“可能过时”、“过时”、“缺失”等状态判定,并估算代币消耗,帮助开发者决定是否信任这些文件。同时,它提供初始化、安装钩子、基准测试等子命令,方便团队快速采用和持续维护上下文文件的最佳实践。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add aryashreep/ctx-audit

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

上下文审计 (Context Audit)

采用此约定的仓库会保留一小部分持久文件,这样代理就不必在每个会话中重新推导相同的内容:项目的约定(AGENTS.md)、已经决定的事项及其原因(memory.md)、以及代码库的大致组织方式(.agent/graph.md)。本技能会检查这些文件是否存在且是最新的,在你依赖它们之前,或者在你回退到手动扫描仓库之前。

触发短语

会话开始 / 信任检查

  • "让我快速了解这个仓库"
  • "关于这个项目你知道什么"
  • "我应该信任 AGENTS.md / memory.md 吗"
  • "上下文文件是最新的吗"
  • "检查上下文" / "上下文审计"

过时

  • "AGENTS.md 过时了吗" / "memory.md 过时了吗"
  • "上次同步之后有多少次提交"
  • "我的代理文件是最新的吗"
  • "检查上下文是否过时"

代币成本

  • "上下文文件能节省多少代币"
  • "代币节省" / "上下文成本"
  • "基准测试代币节省"
  • "基准代币对比精选代币"

设置 / 上手

  • "搭建 AGENTS.md" / "初始化上下文"
  • "安装 ctx-audit" / "配置上下文钩子"
  • "设置 AI 上下文" / "这个项目支持 AI 吗"

CI / 自动化

  • "将 ctx-audit 加入 CI"
  • "添加预推送钩子"
  • "在 CI 中强制上下文文件保持最新"

架构

  • "我有架构图吗"
  • "生成 graph.md" / "运行 graphify"

如何运行

运行 ctx-audit 的推荐方式:

npx ctx-audit

或者,如果已作为技能安装:

node <path-to-this-skill-folder>/../scripts/audit.mjs

标志:

  • --json — 机器可读的输出(如果你要以编程方式处理结果,请使用此选项)。
  • --strict — 如果任何文件缺失或过时,退出码为 1。
  • --ci — --strict --json 的别名。
  • --help — 显示用法并退出。

子命令

# 搭建 AGENTS.md + memory.md(交互式——直接写入仓库根目录的文件)
npx ctx-audit init

# 一键安装:将技能复制到 ~/.claude/skills/,并在 CLAUDE.md 中注册
npx ctx-audit install

# Git 钩子:每次推送时以 --strict 模式运行审计
npx ctx-audit hook install
npx ctx-audit hook status
npx ctx-audit hook uninstall

# 项目的 CLAUDE.md:为代理添加指令块
npx ctx-audit claude install
npx ctx-audit claude uninstall

# 代币节省报告(集中、可共享的格式)
npx ctx-audit benchmark

代理决策表

状态含义操作
FRESH自上次同步以来的提交次数少于过时阈值的一半信任该文件——读取它而不是扫描原始源码
STALE?接近阈值(可能过时)适度谨慎——在依赖关键声明之前进行抽查
STALE!超过阈值,视为失败将声明视为未经验证;对照实际代码进行抽查;会话后更新
STALE严重落后,视为失败与 STALE! 相同,但更紧急;会话后立即更新
MISSING(必需)文件不存在运行 npx ctx-audit init;不要假定约定已到位而继续
absent(可选)可选文件不存在可以接受;考虑运行 /graphify 生成 graph.md
over budget代币数量超过 maxTokens文件过于臃肿——需要精简;读取它可能得不偿失
dead reference文件中反引号路径或 dir/file.ext 在磁盘上不存在更新引用;文件引用了过时的结构
SHA bumpedlast_synced_commit 已更新但内容未变验证文件是否真正反映了最近的更改;可能只是机械性地更新了哈希值

结果解读

  • MISSING(必需文件):不要假定约定已到位而继续。建议搭建一个起始文件(运行 npx ctx-audit init),而不是在没有文件的情况下工作,或默默采用旧的“手动探索一切”的方式。
  • FRESH:文件是最新的。读取它而不是扫描原始源码。
  • STALE?(可能过时):接近阈值。抽查关键声明。
  • STALE!(很可能过时):将其声明视为未经验证。对照实际代码抽查任何关键部分,在会话结束后更新文件及其 last_synced_commit。
  • STALE:严重落后。处理方式与 STALE! 相同,但更紧急。
  • 代币计数是一个约 3.5 字符/代币的启发式方法——方向上可用,但不精确。如果某个文件被标记为“over budget”,说明它变得臃肿,读取它所花费的代价开始超过它能节省的代价;建议进行精简。
  • dead reference 警告:上下文文件中提到的路径在磁盘上已不存在。表明文件引用了过时的结构。

工作示例

会话开始时进行基本审计:

npx ctx-audit

CI 门控(如果上下文过时则构建失败):

# .github/workflows/ctx-audit.yml
- name: 审计上下文新鲜度
  run: npx ctx-audit --strict

供程序化使用的 JSON 输出:

npx ctx-audit --json | jq '.checks[] | {file, stalenessLevel, stale}'

一键上手:

npx ctx-audit install        # 复制技能,在 CLAUDE.md 中注册
npx ctx-audit hook install   # 添加预推送保护
npx ctx-audit claude install # 在项目 CLAUDE.md 中添加说明
npx ctx-audit init           # 搭建 AGENTS.md + memory.md

仅检查特定子系统的过时状态(通过 frontmatter):

---
last_synced_commit: abc1234
watches: src/auth/**, src/api/**
---

只有触及 src/auth/ 或 src/api/ 的提交才会计入该文件的过时状态。

基准测试代币节省:

npx ctx-audit benchmark

配置

在仓库根目录放置 .ctx-audit.json 以自定义行为:

{
  "files": [{ "id": "...", "file": "...", "label": "...", "maxTokens": N, "required": true }],
  "sourceDirs": ["src", "packages/core"],
  "staleThreshold": 10,
  "baselineFileCap": 300
}

Frontmatter

每个上下文文件应以 frontmatter 开头:

---
last_synced_commit: <git sha>
watches: src/auth/**, src/api/**
---

watches 字段(可选)将过时检查范围限制为仅触及这些路径的提交,而不是所有源目录。

如果必需文件缺失——进行搭建

运行 npx ctx-audit init 以生成模板。在 TTY 中,它会直接将文件写入仓库根目录;当通过管道传输时,它会将内容打印到 stdout 以供重定向。旧的 --init 标志仍然支持,作为向后兼容的别名。

AGENTS.md — 稳定的项目约定:构建/测试/检查命令、文件布局规则、代理绝对不能做的事情。应该很少更改。

memory.md — 运行时的决策日志,不是当前代码的复述。每个条目:尝试了什么、决定了什么、为什么决定、以及在情况变化时应该重新考虑什么。追加,不要重写历史。

.agent/graph.md(可选,但在仓库增长后推荐)— 每个主要模块用一段描述其职责和与之通信的其他模块。不是文件内容,也不是详尽的树状结构——只要足够让代理能够导航,而无需重新读取所有内容。 提示:运行 /graphify 可以根据代码库自动生成此文件,而不是手动编写。

在搭建或更新上述任何文件后,将其 last_synced_commit 更新为当前的 HEAD,这样下次审计就不会立即将其标记为过时。

相关技能