技术教程 · 阅读约 9 分钟

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 决策记录」。