面向 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 里把流程写得很清楚,代码也验证了这一点:
- 安装某个 agent CLI 的精确版本
- 用 claude-tap 以 capture-only 方式跑一次
- 抓取包含 prompt 的请求,不调用真实模型提供商
- 规范化和脱敏易变字段
- 写入
captures/<agent>/<version>/ - 重新生成 README、索引 JSON、文档页和静态站点
输出工件主要有三类:
prompt.md:提炼后的 prompt 快照trace.jsonl:原始 trace 证据meta.json:版本、发布时间、capture 时间、命令行、tap client 等元信息
对最近的 Claude Code 版本,还额外做了静态 prompt 提取:
static-prompts.mdstatic-prompts.jsonstatic-candidates.json
这说明它不只抓“运行时可见 prompt”,还尝试把“安装包里的静态 prompt 片段”一起纳入可比对资产。
对比内容获取链路详解(源码级验证 2026-08-07)
phistory.cc 上 diff 的内容不是从 changelog/文档抓取,而是逐版本实测拦截的完整流水线:
1. 版本发现(registry.py / packages.py)
- GitHub Actions
capture.yml每小时(cron37 * * *)对 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 参数fetchfrom/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):
- 选请求:对 trace 中所有请求打分 =
tools 数 × 10 + system 100 + developer 60 + user 20,/models探测类请求 -200;取最高分(Codex 场景即那条POST /v1/responses) - 按 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 拆
- Anthropic
- 渲染(
render_prompt_markdown):拼成# System Prompt/# Developer Prompt/# User Message/# Tools四段;Tools 段每个工具一个##小节(description + JSON schema);prompt 文本自带的 markdown 标题会加#前缀防层级冲突 - 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-tapcapture-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 能提供一个比社交媒体截图更硬的证据源。
相关页面
- claude-tap — Phistory 的采集底座,负责抓取 prompt-bearing trace
- openclaw — Phistory 已持续归档其多个版本的 prompt 快照
- hermes-agent — 受支持的另一个 agent runtime
- system-prompts-and-models-of-ai-tools — 偏收集型的系统提示词仓库
- cl4r1t4s — 偏透明度/泄露整理导向的系统提示词项目
- agent-harness-anatomy — 理解 prompt、tools、policy 如何共同塑造 agent 行为
- openai-responses-vs-chat-completions — 解释 phistory 归一化脚本面对的
/v1/responses报文为何长成 items 结构