30 行代码让 Claude、Cursor、Codex 共享同一份记忆
30 行代码让 Claude、Cursor、Codex 共享同一份记忆
你有没有遇到过这种情况:
在 Cursor 里和 AI 聊了半小时,把项目背景、技术栈、踩过的坑全交代清楚了。结果切到 Claude Code 继续干活,又得从头解释一遍。换个终端开 Codex,再来一次。
每个工具都是失忆的金鱼,你是那个反复喂食的人。
这个问题其实有个很干净的解法——给所有 AI 工具挂一个共享的上下文文件,让它们读同一份"项目记忆"。今天就来实现这个。
思路
各家工具都支持在项目根目录放一个约定文件来注入上下文:
| 工具 | 读取的文件 |
|------|-----------|
| Claude Code | CLAUDE.md |
| Cursor | .cursorrules |
| Codex CLI | codex.md |
问题在于这三个文件内容高度重叠,却要分开维护。一旦项目架构变了,你得改三个地方,而且经常忘。
解法:用一个脚本,自动从代码库提取关键信息,生成并同步这三个文件。
实现
依赖只有一个:openai 这个 Python 包(兼容所有 OpenAI 格式的 API)。
pip install openai
新建 sync_memory.py:
import os
import subprocess
from pathlib import Path
from openai import OpenAI
# 用无量Api,国内直连,比官方省 60%+
client = OpenAI(
api_key=os.environ.get("WULIANG_API_KEY"),
base_url="https://api2everything.xyz/v1",
)
def collect_project_context(root: str = ".") -> str:
"""收集项目关键信息"""
ctx_parts = []
# 1. 目录结构(排除噪音)
result = subprocess.run(
["find", root, "-maxdepth", "3", "-not", "-path", "*/.*",
"-not", "-path", "*/node_modules/*", "-not", "-path", "*/__pycache__/*"],
capture_output=True, text=True
)
ctx_parts.append("## 目录结构\n```\n" + result.stdout[:3000] + "\n```")
# 2. package.json 或 pyproject.toml
for fname in ["package.json", "pyproject.toml", "requirements.txt", "go.mod"]:
p = Path(root) / fname
if p.exists():
ctx_parts.append(f"## {fname}\n```\n{p.read_text()[:2000]}\n```")
# 3. README
for fname in ["README.md", "README.rst", "README"]:
p = Path(root) / fname
if p.exists():
ctx_parts.append(f"## README\n{p.read_text()[:3000]}")
break
# 4. 最近 git commit(了解项目动态)
git_log = subprocess.run(
["git", "log", "--oneline", "-20"],
capture_output=True, text=True, cwd=root
)
if git_log.returncode == 0:
ctx_parts.append("## 最近提交\n```\n" + git_log.stdout + "\n```")
return "\n\n".join(ctx_parts)
def generate_memory(context: str) -> str:
"""让 Claude 提炼项目记忆"""
resp = client.chat.completions.create(
model="claude-sonnet-4-5", # 无量支持 300+ 模型,直接写名字就行
messages=[
{
"role": "system",
"content": (
"你是一个技术文档专家。根据提供的项目信息,"
"生成一份简洁的项目上下文文档,供 AI 编程助手使用。"
"包含:项目目标、技术栈、目录约定、注意事项、常见命令。"
"用 Markdown,控制在 600 字以内,要让 AI 一读就懂项目全貌。"
),
},
{"role": "user", "content": context},
],
max_tokens=1500,
)
return resp.choices[0].message.content
def sync_all(memory: str, root: str = "."):
"""同步到三个工具的配置文件"""
header = "<!-- Auto-generated by sync_memory.py. Do not edit manually. -->\n\n"
targets = {
"CLAUDE.md": memory,
".cursorrules": memory,
"codex.md": memory,
}
for filename, content in targets.items():
path = Path(root) / filename
path.write_text(header + content, encoding="utf-8")
print(f"✅ 已写入 {filename}")
if __name__ == "__main__":
print("📦 收集项目上下文...")
context = collect_project_context()
print("🤖 生成项目记忆(调用 Claude)...")
memory = generate_memory(context)
print("📝 同步到各工具配置文件...")
sync_all(memory)
print("\n🎉 完成!以下工具现在共享同一份记忆:")
print(" - Claude Code → CLAUDE.md")
print(" - Cursor → .cursorrules")
print(" - Codex CLI → codex.md")
跑起来
# 设置 API Key(去 api2everything.xyz 注册,送 ¥1 余额)
export WULIANG_API_KEY="sk-xxx"
# 在项目根目录执行
python sync_memory.py
输出大概长这样:
📦 收集项目上下文...
🤖 生成项目记忆(调用 Claude)...
📝 同步到各工具配置文件...
✅ 已写入 CLAUDE.md
✅ 已写入 .cursorrules
✅ 已写入 codex.md
🎉 完成!
进阶:加进 git hook,每次提交自动同步
# .git/hooks/post-commit
#!/bin/sh
python sync_memory.py
chmod +x .git/hooks/post-commit
这样每次 git commit,三个文件自动更新,永远和代码库保持同步。
几个实用细节
模型选择:生成记忆文档用 claude-sonnet-4-5 效果最好,它对代码结构的理解比较准。如果项目很大、上下文很长,可以换 gemini-2.5-pro,上下文窗口更大。
敏感信息:.cursorrules 会被 Cursor 读取并发送给 AI,注意别把 API Key、数据库密码这类东西写进去。脚本里已经跳过了 .env 文件,但自己检查一下更稳。
团队协作:把 CLAUDE.md 和 codex.md 加进 .gitignore 还是提交进去,取决于团队。个人倾向提交,让新人 clone 下来就能直接用有上下文的 AI。
关于 API 费用
这个脚本每次运行大概消耗 2000-4000 tokens(输入项目信息 + 输出记忆文档),用 Claude Sonnet 算下来不到 ¥0.05 一次。
我用的是 无量Api(api2everything.xyz),国内直连不需要梯子,价格比官方便宜 60% 以上,OpenAI 格式兼容,就是上面代码里那个 base_url,改一行就能用。注册送 ¥1,跑几十次这个脚本完全够。
你的项目有没有类似的上下文管理痛点?或者对脚本有改进想法?评论区聊聊,看到都会回。
觉得有用的话点个赞,下次写「如何让 AI 自动维护 ADR 决策记录」。