面向 Claude Code / Codex / OpenClaw 等 coding-agent CLI 的 system prompt 历史档案库,自动抓取、版本化保存并提供网页 diff 查看。

497 stars | Python + 静态站点 | MIT | phistory.cc | 2026

一句话定位

如果 claude-tap 解决的是“如何拿到一份真实 trace 证据”,那 Phistory 解决的是“如何把这些证据持续归档成一个可公开浏览、可版本对比、可引用的 prompt 历史库”。

它不是 prompt 泄露仓库,也不是单次抓包脚本,而是一个围绕“版本化 system prompt 快照”构建的完整采集与发布流水线。

为什么值得关注

  • 把黑盒 agent 的 prompt 变化做成时间序列:能看到新工具、权限规则、默认模型、用户确认策略何时被引入
  • 证据更干净:不是手抄或截图,而是基于真实 trace 的 prompt.md + trace.jsonl + meta.json
  • 覆盖多家 coding-agent CLI:Claude Code、Codex、Antigravity、Kimi Code、MiMo、openclaw、hermes-agent、Pi、Oh My Pi、opencode
  • 适合研究 harness 演化:对比 prompt 本身,也能间接看出工具 schema、策略约束和运行时指令如何变化

核心思路

README 里把流程写得很清楚,代码也验证了这一点:

  1. 安装某个 agent CLI 的精确版本
  2. 用 claude-tap 以 capture-only 方式跑一次
  3. 抓取包含 prompt 的请求,不调用真实模型提供商
  4. 规范化和脱敏易变字段
  5. 写入 captures/<agent>/<version>/
  6. 重新生成 README、索引 JSON、文档页和静态站点

输出工件主要有三类:

  • prompt.md:提炼后的 prompt 快照
  • trace.jsonl:原始 trace 证据
  • meta.json:版本、发布时间、capture 时间、命令行、tap client 等元信息

对最近的 Claude Code 版本,还额外做了静态 prompt 提取:

  • static-prompts.md
  • static-prompts.json
  • static-candidates.json

这说明它不只抓“运行时可见 prompt”,还尝试把“安装包里的静态 prompt 片段”一起纳入可比对资产。

对比内容获取链路详解(源码级验证 2026-08-07)

phistory.cc 上 diff 的内容不是从 changelog/文档抓取,而是逐版本实测拦截的完整流水线:

1. 版本发现(registry.py / packages.py)

  • GitHub Actions capture.yml 每小时(cron 37 * * *)对 13 个 agent 跑 phistory capture --latest
  • 版本来源按 AgentSpec 的 source:npm(npm view,如 @openai/codex)、PyPI、GitHub Releases / release assets、MiniMax 官方下载 manifest
  • URL 里 from=0.146.1&to=0.147.0 即对应 captures/codex/ 下两个已归档版本

2. 安装精确版本(packages.py)

  • install_agent() 下载该版本 npm tarball / pip 包 / GitHub release asset,装入隔离缓存目录
  • meta.json 记录 tarball_url,如 0.147.0 对应 registry.npmjs.org/@openai/codex/-/codex-0.147.0.tgz

3. 运行采集(capture.py + claude-tap)——对比内容的真正来源

  • 构造全新干净环境:临时 HOME/XDG 目录、按 agent 写配置、假凭据(Codex 用 fake ChatGPT auth)、CI=true、TZ=Etc/UTC
  • 用固定最小 prompt 跑一次 CLI,Codex 命令为 codex exec "Reply with one short sentence." --skip-git-repo-check --json
  • 外层包 claude-tap run codex --export-prompt prompt.md --no-live ...
  • claude-tap forward 模式拦截:本地起 HTTPS forward proxy(CONNECT + 本地 CA 签发叶子证书做 per-host TLS 终止,即 MITM),向子进程环境注入 HTTPS_PROXY + NODE_EXTRA_CA_CERTS,Codex/Claude Code 等 Node CLI 的请求即走代理
  • capture-only 模式:代理记录 prompt-bearing 请求后返回合成响应,不转发真实模型提供商——无真实 API 调用、无 token 消耗
  • prompt_snapshot.py 从记录中挑 prompt 含量最大(tool surface 最大)的请求(Codex 是 /v1/responses),归一化导出 prompt.md(system/developer prompt + tools)

4. 归一化(capture.py)

  • 易变内容替换为占位符:日期时间 → $PHISTORY_DATE、会话/对话 ID → $PHISTORY_SESSION/$PHISTORY_CONVERSATION、HOME/安装路径 → $PHISTORY_HOME/$PHISTORY_INSTALL,另有 OS 版本、Bearer token 脱敏
  • 目的:diff 只反映 prompt 真实变化,不含运行时噪音

5. 归档与索引

  • 产物 captures/<agent>/<version>/{prompt.md, trace.jsonl, meta.json} 由 workflow 直接 commit 回仓库
  • render-index 生成 captures/index.json;render-site 重新生成静态 index.html
  • 构建时用 Python difflib 计算每版相对上一版的增删行数(timeline / diffstat 展示用)

6. 网站对比(客户端 diff)

  • phistory.cc 是纯静态 GitHub Pages 站点,无后端
  • JS 读 captures/index.json,按 URL 参数 fetch from/to 两个版本的 prompt.md(带 fingerprint 参数防缓存)
  • 对比视图由 Monaco diff editor 渲染,diff 在浏览器端实时计算
  • 另提供 trace.jsonl 原始请求视图,及 Claude Code 的 static-prompts 对比

一句话:对比的内容 = 每个版本真实跑一次 CLI 时发给模型 API 的请求(被 MITM 代理截获),不是人工整理文本;diff 本身在前端计算。

补充:prompt.md 内容如何逐字段生成(2026-08-07 验证)

prompt.md 不是人工编写也不是 LLM 生成,而是 claude-tap 从截获的 JSON 请求体中按 provider 协议抽取拼装(prompt_snapshot.py):

  1. 选请求:对 trace 中所有请求打分 = tools 数 × 10 + system 100 + developer 60 + user 20,/models 探测类请求 -200;取最高分(Codex 场景即那条 POST /v1/responses)
  2. 按 provider 抽字段:
    • Anthropic /v1/messages:system 字段 → System Prompt;messages 中 user 项 → User Message;顶层 tools
    • OpenAI Responses /v1/responses(Codex 用):instructions + input 中 system 项 → System Prompt;input 中 developer role 项 → Developer Prompt;user 项 → User Message;tools 取顶层 tools + input 中的 additional_tools 项
    • Gemini:system_instruction → system,contents 按 role 拆
  3. 渲染(render_prompt_markdown):拼成 # System Prompt / # Developer Prompt / # User Message / # Tools 四段;Tools 段每个工具一个 ## 小节(description + JSON schema);prompt 文本自带的 markdown 标题会加 # 前缀防层级冲突
  4. phistory 后处理:正则归一化 + 路径占位符替换(见上节第 4 步)

Codex 0.147.0 实例(实测 trace.jsonl):input 数组 7 项——首项 additional_tools 装全部工具定义(namespace 型会展开成 functions.exec、collaboration.spawn_agent 这类限定名),4 条 developer 消息(第 1 条是 “You are Codex…” 主 prompt,其余为环境上下文/skill 列表等),2 条 user 消息(固定测试指令 “Reply with one short sentence.” + 环境信息)。User Message 用固定测试 prompt 正是为了跨版本 diff 时不引入噪音。

实测验证:codex 0.146.1 → 0.147.0 的 diff 约 31 行变化,含 openai-docs skill description 重写、permissions 块位置移动、wait_agent 长等待建议新增等,均为真实 prompt 迭代。

技术架构

从仓库结构看,Phistory 是四块拼起来的:

phistory/
├── capture.py          # 安装具体版本、调用 claude-tap、抓取并归一化 prompt
├── registry.py         # 各 agent 的 package/source/tap_client/run_args 注册表
├── storage.py          # 版本目录、trace 复制、meta 写入
├── render.py           # 生成 README / README_zh / captures/index.json / docs/captures.md
├── site.py             # 生成 phistory.cc 的静态 diff 站点
└── static_prompts/     # 静态 prompt 提取逻辑(当前重点支持 Claude Code)

几个关键设计点:

  • 版本级安装:不是看“当前最新”,而是回到每个历史版本重新安装再采集
  • agent 注册表驱动:registry.py 为每个 CLI 定义 package 来源、tap client、fake env、启动参数、home profile
  • capture 环境沙箱化:capture.py 会临时造 HOME / XDG / 各 agent 专属配置目录,减少宿主环境污染
  • 归一化处理:会把日期、会话 ID、路径等易变字段替换为占位符,降低 diff 噪音
  • 发布层静态化:站点由 site.py 直接生成 index.html,不依赖运行时后端

这个项目真正有意思的地方

很多“system prompt 收集”仓库,本质是人工整理或逆向收集文本;Phistory 的不同点在于它把 prompt 档案化做成了可重复执行的工程流程:

  • 有输入:具体 agent 版本
  • 有采集机制:claude-tap capture-only
  • 有结构化证据:trace.jsonl
  • 有归一化规则:减少噪音
  • 有公开产物:静态站点 + 索引
  • 有自动化更新:GitHub Actions 每小时扫新版本

这让它更像“prompt 历史 CI/CD”,而不是一次性资料库。

适用场景

  • 对比 Claude Code / Codex / OpenClaw 不同版本的系统提示差异
  • 写 prompt 逆向分析、agent 行为审计、策略变更观察报告
  • 验证某个能力变化到底是模型变了,还是 prompt / tool policy 变了
  • 给 agent-skill-evaluation-framework 这类评估设计补“版本侧证据”

与相邻项目的关系

和 claude-tap 的关系

  • claude-tap 是证据采集底座
  • Phistory 是版本化归档与发布层

前者偏“观测运行现场”,后者偏“长期保存和对比历史”。

和 system-prompts-and-models-of-ai-tools / cl4r1t4s 的区别

  • 那两类仓库偏“收集到什么就存什么”,来源可能是泄露、逆向、手工提取
  • Phistory 偏“对支持的 CLI 按版本自动重放采集”,来源更流程化、更可追溯

因此它们是互补关系,不是简单替代关系。

网站层能力

用户给的 https://phistory.cc/ 不是另一个独立产品页,而是仓库 site.py 直接生成的公开静态站点。

从本地 index.html 看,站点层不是简单托管 Markdown,而是一个面向 prompt diff 的单页应用:

  • 内嵌 manifest:所有 agent / version / capture 元数据直接打进页面里的 JSON manifest,前端加载后即可切换版本和视图
  • 三种查看模式:prompt diff、trace detail、static prompts
  • 版本差异强度可视化:按 added / removed / changed lines 计算变化等级和 scale
  • 站内交互完整:agent 选择、版本对比、theme toggle、static prompts 的 changed-only 过滤
  • 静态部署友好:没有后端依赖,index.html + captures/ + docs/ 就能发布

这部分很关键,因为它说明 Phistory 不只是“采集到了很多 prompt”,而是把这些 prompt 组织成了一个真正可浏览、可比较、可引用的公共研究界面。

局限性

  • 当前覆盖的是“已接入 registry 的 agent CLI”,不是所有 AI 产品
  • claude-tap 是关键基础依赖;采集链一旦变化,Phistory 也需要跟着维护
  • 对某些 CLI 来说,prompt.md 只是一次采集快照,未必等于全部隐藏策略
  • star 数不高,项目仍偏研究者/逆向分析者使用,不算大众通用工具

快速使用

uv sync --all-groups
 
# 抓最新版本
uv run phistory capture --latest --agents claude-code,codex,openclaw,hermes
 
# 回填历史版本
uv run phistory backfill claude-code --from 2.1.113 --to latest
 
# 重新生成索引和站点
uv run phistory render-index
uv run phistory render-site

我的判断

Phistory 的价值不在“又一个 system prompt 仓库”,而在它把 prompt 研究从零散资料收集,推进到了“版本级、可复现、带原始 trace 证据”的工程化形态。

对做 agent harness、system prompt、skill 演化分析的人,它非常有参考价值。尤其如果你关心 OpenClaw / Claude Code 这类 CLI 的行为漂移,Phistory 能提供一个比社交媒体截图更硬的证据源。

相关页面