Cursor-Learner:基于编辑器历史数据,自动生成个性化AI编程助手Prompt
1. 项目概述一个帮你“诊断”编程习惯的智能助手如果你和我一样每天都在和 Cursor 或 WindSurf 这类 AI 驱动的代码编辑器打交道那你肯定也遇到过这样的困惑为什么有时候 AI 助手能精准地理解你的意图写出漂亮的代码而有时候却像个“人工智障”给出的建议完全跑偏问题的关键往往不在于 AI 模型本身而在于我们给它的“指令”——也就是 Prompt提示词。一个模糊的指令就像给一个顶级厨师一张写着“做点好吃的”的纸条结果可想而知。今天要聊的这个开源项目dcrebbin/cursor-learner就精准地戳中了这个痛点。它不是一个简单的 Prompt 生成器而更像一个“编程习惯诊断工具”。它的核心思路非常巧妙通过分析你在 Cursor 编辑器里真实的历史操作数据比如你打开过哪些文件、修改过哪些代码、安装了哪些扩展自动生成一份高度个性化、针对你当前项目和你个人编程习惯的“诊断报告”式 Prompt。这份 Prompt 能清晰地告诉 AI 助手“看这个开发者过去在这个项目里是这么干的他的技术栈是这些他常犯的错误可能是这些所以你现在应该这样帮他。”简单来说它把 Prompt Engineering 从一个“玄学”变成了一个“数据驱动”的科学过程。你不用再苦思冥想“我该怎么描述我的项目”工具会帮你从你的工作痕迹中提炼出最相关、最精确的上下文信息。这对于提升 AI 编程助手的效率、让代码生成和重构建议更贴合你的实际需求有着巨大的价值。无论你是想快速上手一个新项目还是希望 AI 能更懂你的代码风格这个工具都值得你花十分钟了解一下。2. 核心原理与设计思路拆解2.1 为什么传统的项目描述 Prompt 会失效在深入cursor-learner之前我们先想想平时是怎么向 Cursor 描述一个项目的。你可能会在聊天框里输入“这是一个用 Next.js 14 和 TypeScript 写的博客项目用了 Tailwind CSS 和 Prisma ORM。” 这听起来不错对吧但问题在于这个描述是静态的、高度概括的并且遗漏了大量关键信息。首先它遗漏了项目的具体结构。你的components/目录下有哪些可复用的 UI 组件你的lib/目录里封装了哪些工具函数你的数据获取逻辑是集中在app/api/里还是分散在各个页面中AI 助手并不知道。其次它忽略了你个人的编码习惯和项目约定。你用的是interface还是type来定义 TypeScript 类型你的函数是习惯用箭头函数还是函数声明你的错误处理是 try-catch 模式还是错误边界项目里有没有一些特殊的 ESLint 规则或 Prettier 配置最后它无法反映项目的动态上下文和近期变更。你最近正在重构哪个模块哪个文件被频繁修改可能存在问题你刚刚安装了一个新的 UI 库但还没开始用。cursor-learner的设计哲学就是最了解你项目的不是你的记忆而是你的编辑器历史。它通过直接读取 Cursor 本地存储的数据库文件获取了上述所有被传统描述遗漏的信息。2.2 技术实现路径从 SQLite 数据库到结构化 Prompt项目的技术路径清晰且务实主要分为三步第一步数据采集bun run retrieve-projects这是整个流程的基石。Cursor 和 VS Code 系列编辑器会将工作区状态、扩展信息、UI 布局、最近打开的文件等数据以 SQLite 数据库的形式存储在用户本地。这些文件的扩展名通常是.vscdb或.sqlite3位于一个隐藏目录中如~/.cursor/User/workspaceStorage/下的随机 ID 文件夹内。retrieve-projects脚本的核心任务就是扫描这些目录找到所有你打开过的项目对应的数据库文件并将它们复制到cursor-learner的工作目录下。这一步相当于为你的“数字工作记忆”做了一个离线备份。注意这里涉及访问本地编辑器数据属于敏感操作。cursor-learner作为开源工具其代码是公开透明的它只是读取和复制这些文件并不会上传到任何远程服务器。对于注重隐私的开发者你可以审查其源代码主要是scripts/retrieve-projects.ts确认其行为符合预期。第二步信息结构化手动输入项目信息仅有原始数据库还不够我们需要给这些数据贴上“标签”。这就是为什么需要你手动输入项目名称、主要编程语言、技术栈、框架和关键依赖。这个过程看似简单实则至关重要。它起到了两个作用信息过滤告诉工具在接下来的分析中应该重点关注与“JavaScript”、“React”、“Next.js”等标签相关的内容。比如它会更关注package.json、tsconfig.json和 React 组件文件而不是一个 Python 虚拟环境目录。Prompt 定调这些标签会成为生成 Prompt 的开头部分为 AI 助手设定一个清晰的技术背景和上下文边界。例如生成的 Prompt 会以“你是一个辅助 Next.js TypeScript 项目的专家 AI”这样的语句开头。第三步分析与生成bun run generate-prompt这是最核心的环节。脚本会打开你指定的项目数据库文件执行一系列预定义的 SQL 查询。这些查询的目标非常明确识别项目结构查询file或recently_opened相关的表找出最常被访问的目录和文件勾勒出项目的核心骨架。分析开发活动查询edit或change相关的历史记录找出近期修改最频繁的文件。这些往往是功能核心或问题高发区需要 AI 特别关注。提取扩展配置查询已安装的扩展列表及其状态。这能告诉 AI 你使用了哪些工具如特定的 Linter、主题、代码片段工具这些工具可能定义了额外的代码规范。整合与格式化将以上所有信息结合你手动输入的项目标签按照一个优化过的 Prompt 模板进行组装。这个模板的设计是关键它可能遵循“角色定义 - 上下文提供 - 任务指令 - 输出格式”的结构确保生成的 Prompt 既信息丰富又指令清晰。最终一个包含了你项目 DNA 的、长达数百甚至上千字的详细 Prompt 就被生成在./output-prompts目录下了。你可以直接把它复制到 Cursor 的聊天框中作为对话的起点。2.3 与 WindSurf 的兼容性思考项目关键词和描述中都提到了 WindSurf。WindSurf 作为另一个基于 VS Code 的 AI 原生编辑器其底层架构与 Cursor 高度相似同样使用.vscdb文件来存储工作区状态。因此cursor-learner的理论同样适用于 WindSurf。在实际操作中你只需要确保retrieve-projects脚本能够正确找到 WindSurf 的 workspaceStorage 路径通常类似~/.windsurf/或~/Library/Application Support/Code/User/globalStorage/下的特定目录。由于这是一个开源项目如果需要适配 WindSurf通常只需要修改脚本中的路径配置即可。这体现了该项目设计的前瞻性——它瞄准的是“基于 VS Code 的 AI 编辑器”这一大类工具的数据范式。3. 从零开始详细安装与配置指南3.1 环境准备Bun 的安装与优势项目明确要求使用 Bun 作为运行时。如果你还在用 Node.js 或 npm我强烈建议你借此机会尝试一下 Bun。它是一个全新的、速度极快的 JavaScript 运行时和包管理器在启动速度和安装依赖方面优势明显特别适合这种工具类项目。安装 BunmacOS/Linux打开终端执行以下命令。这条命令会下载安装脚本并运行。curl -fsSL https://bun.sh/install | bash安装完成后重启你的终端或者运行source ~/.zshrc如果你使用 Zsh或source ~/.bashrc来刷新环境变量。通过bun --version验证安装是否成功。安装 BunWindowsWindows 用户可以通过 PowerShell 安装。首先你需要确保已安装 Windows Subsystem for Linux (WSL2) 这是目前最推荐的方式。在 WSL2 的 Linux 发行版如 Ubuntu中使用上述 macOS/Linux 的命令安装即可。实操心得如果你在 macOS 上遇到权限问题可以尝试使用brew安装brew install oven-sh/bun/bun。对于国内用户如果下载速度慢可以设置镜像源但 Bun 的安装包本身不大通常直接安装即可。3.2 获取与初始化项目首先将cursor-learner项目克隆到本地。找一个你常用的开发目录。git clone https://github.com/dcrebbin/cursor-learner.git cd cursor-learner进入项目目录后你会看到一个典型的现代 JS/TS 工具项目结构。核心是package.json、tsconfig.json以及scripts和src目录。接下来安装项目依赖。这是 Bun 大显身手的时候bun install你会看到 Bun 以惊人的速度解析依赖并完成安装。相比npm install这个过程通常能快上一个数量级。3.3 关键配置解析理解项目结构在运行脚本之前花两分钟看看项目结构能帮你更好地理解发生了什么scripts/retrieve-projects.ts: 这是数据采集脚本。你可以打开它看看它是如何定位 Cursor 数据目录的。核心逻辑是使用os.homedir()拼接出类似~/.cursor/User/workspaceStorage/的路径然后遍历子目录复制所有.vscdb文件。scripts/generate-prompt.ts: 这是 Prompt 生成脚本。它会读取你复制过来的数据库文件执行 SQL 查询并按照模板生成最终输出。src/templates/: 这里可能存放着生成 Prompt 所使用的模板文件。模板定义了最终输出的结构和措辞是影响 Prompt 质量的关键。你可以根据自己喜好修改模板比如增加对代码风格的特别强调。vscode/extensions.json: 这个文件配置了一个 VS Code/Cursor 扩展用于高亮显示.vscdb文件。当你用 Cursor 打开这个项目时它会提示你安装这个扩展让你能更方便地查看数据库内容。output-prompts/: 这是一个空目录用于存放生成的 Prompt 文件。4. 核心操作流程与实战演示4.1 第一步采集你的编辑器“记忆”确保你已经在cursor-learner项目目录下然后运行bun run retrieve-projects这个过程发生了什么脚本开始运行后它会根据你的操作系统确定 Cursor 数据存储的默认位置。扫描该位置下的所有子文件夹每个打开过的项目对应一个文件夹。在每个文件夹中寻找.vscdb或.sqlite3文件。将这些数据库文件复制到cursor-learner项目根目录下的一个临时位置例如./data/或直接在项目根目录。终端会输出类似这样的日志正在扫描 Cursor 工作区存储目录... 找到项目: /Users/yourname/.cursor/User/workspaceStorage/a1b2c3... - 对应项目: my-nextjs-app 找到项目: /Users/yourname/.cursor/User/workspaceStorage/d4e5f6... - 对应项目: vue3-experiment 复制了 2 个 .vscdb 文件。现在你的项目数据已经就位了。注意事项如果你最近没有用 Cursor 打开过任何项目或者 Cursor 从未创建过工作区存储这个目录可能是空的。确保你先用 Cursor 打开你想要分析的项目写几行代码保存一下这样才会生成有效的数据。4.2 第二步为你的项目“建档”数据有了但工具还不知道哪个文件对应哪个项目以及这个项目是干嘛的。接下来你需要手动创建一个配置文件。根据项目文档的截图提示你可能需要编辑一个如project-info.json或通过命令行交互来输入信息。假设项目要求你在运行generate-prompt前先创建一个project-info.json文件其内容格式如下{ projectName: 我的个人博客, primaryLanguage: TypeScript, techStack: [Next.js 14, React, Tailwind CSS], framework: Next.js, keyDependencies: [next-auth, prisma, tanstack/react-query] }填写要点projectName: 起一个容易识别的名字。primaryLanguage: 写主语言如JavaScript,TypeScript,Python。techStack: 这是一个数组列出主要的技术从框架到 UI 库到构建工具。framework: 指明核心框架如Next.js,Vue 3,Express。keyDependencies: 列出最关键的几个 npm 包或库这些是 AI 需要特别关注的运行时依赖。这个步骤的本质是为你从编辑器里抓取的那一堆“原始记忆”打上标签建立索引。4.3 第三步生成专属诊断报告Prompt现在执行最核心的命令bun run generate-prompt脚本会执行以下操作读取你刚刚创建的project-info.json。列出它找到的所有.vscdb文件并可能让你选择要为哪个项目生成 Prompt或者自动匹配最相关的。连接选中的 SQLite 数据库文件。执行一系列预设的 SQL 查询例如-- 查找最近打开的文件推测为核心文件 SELECT * FROM file_history ORDER BY timestamp DESC LIMIT 20; -- 查找工作区中所有的文件夹路径了解项目结构 SELECT path FROM workspace_folders; -- 查找已安装的扩展了解开发环境 SELECT identifier FROM extensions WHERE isActive 1;将查询结果文件列表、路径、扩展名等与你提供的项目信息技术栈、依赖进行融合。根据内置的模板生成一份完整的、结构化的 Prompt 文本。将这份 Prompt 保存到./output-prompts/目录下文件名可能包含时间戳和项目名例如prompt-my-personal-blog-20240515.md。4.4 第四步使用生成的 Prompt 与 AI 对话打开./output-prompts/目录下的文件你会看到一份内容详实的文档。它可能长这样# 项目上下文与助手指令 **角色**你是一位精通 Next.js、TypeScript 和 Tailwind CSS 的资深前端开发助手专门协助“我的个人博客”项目的开发。 **项目核心信息** - **项目名称**我的个人博客 - **主要技术栈**Next.js 14, React, TypeScript, Tailwind CSS - **关键依赖**next-auth (认证), prisma (ORM), tanstack/react-query (数据获取) - **代码风格**基于项目历史倾向于使用 ES6 语法函数组件为主。 **近期开发焦点基于编辑器活动** 1. 文件 app/blog/[slug]/page.tsx 在过去一周内被频繁编辑可能是博客文章详情页的核心逻辑正在调整。 2. 目录 components/ui/ 下的文件被多次访问该项目可能正在使用或构建一套自定义 UI 组件库。 3. 文件 lib/prisma.ts 被打开过表明数据库连接和 Prisma Client 的初始化是当前关注点。 **已知项目结构** - app/ - Next.js 13 App Router 核心目录 - components/ - 可复用 React 组件 - lib/ - 工具函数和第三方客户端初始化 - prisma/ - 数据库 schema 和迁移文件 **请基于以上上下文协助完成以下任务** ...后续是具体的任务指令区域你可以在这里输入你的问题现在将这份 Prompt全文复制打开你的 Cursor或 WindSurf新建一个聊天会话将 Prompt 粘贴进去并发送。这样AI 助手在回答你后续的任何问题如“如何给博客添加评论功能”或“优化这个页面的加载速度”时都已经具备了深厚的项目背景知识它的回答将会前所未有的精准和贴合你的代码库。5. 深度定制让工具更懂你5.1 修改 Prompt 生成模板默认的模板可能不适合所有人。也许你觉得它太啰嗦或者遗漏了你关心的某些信息比如代码中特定的注释规范、测试文件的约定。cursor-learner的魅力在于它的可扩展性。找到src/templates/目录下的模板文件例如default.prompt.tmpl。这是一个文本文件里面包含了大量的占位符比如{{projectName}}、{{recentFiles}}等。你可以修改这个模板。例如如果你非常关注代码质量可以在模板里加入**代码质量要求** - 所有新代码必须包含 JSDoc 注释。 - 错误处理必须使用自定义的 AppError 类。 - 组件 Props 必须使用 interface 定义。保存模板后重新运行bun run generate-prompt新生成的 Prompt 就会包含你自定义的规则。5.2 扩展数据查询逻辑如果你对 SQL 和 VS Code 数据库 schema 有一定了解你可以修改scripts/generate-prompt.ts文件添加更多的查询来获取更深度的信息。例如默认查询可能只获取了“最近打开的文件”。你可以尝试添加查询来获取Git 状态虽然不直接存储但有些扩展会记录版本控制信息。调试配置项目使用的启动配置 (launch.json)。任务配置项目定义的任务 (tasks.json)。这需要对.vscdb文件的结构进行探索。你可以使用 SQLite 浏览器如 DB Browser for SQLite 直接打开复制过来的.vscdb文件查看里面有哪些表和数据从而编写更有针对性的查询。5.3 集成到日常开发工作流手动运行脚本毕竟麻烦。你可以考虑将这个过程自动化创建别名或脚本在你的 shell 配置文件 (.zshrc或.bashrc) 中创建一个别名比如alias gen-prompt“cd ~/path/to/cursor-learner bun run retrieve-projects bun run generate-prompt”。结合 Git Hook如果你希望在每次提交代码前都更新一下项目上下文可以将generate-prompt作为一个pre-commitGit Hook。但要注意生成的 Prompt 可能包含文件路径等本地信息是否要提交到仓库需谨慎考虑。定时任务对于长期项目可以设置一个每周运行的定时任务cron job自动生成最新的项目上下文报告帮助你回顾一周的开发重点。6. 常见问题、排查与进阶技巧6.1 问题排查速查表问题现象可能原因解决方案运行bun run retrieve-projects后提示“未找到项目”或复制0个文件。1. Cursor 从未创建过工作区存储。2. Cursor 的数据存储路径非默认。3. 脚本中的路径配置错误。1. 用 Cursor 打开一个项目创建文件并保存。2. 手动查找 Cursor 数据目录。在 macOS 上通常在~/Library/Application Support/Cursor/User/workspaceStorage/。在脚本中更新路径。3. 检查retrieve-projects.ts脚本中的路径拼接逻辑。bun install失败网络错误或权限错误。1. 网络连接问题。2. Bun 安装不完整或环境变量未配置。3. 项目目录权限不足。1. 检查网络或尝试使用镜像源。2. 重新安装 Bun并确认终端能识别bun命令。3. 确保你对项目目录有读写权限。运行bun run generate-prompt时报错提示找不到数据库文件或 SQL 错误。1.retrieve-projects步骤未成功执行。2. 复制的数据库文件损坏或版本不兼容。3. SQL 查询语句与当前 Cursor 版本的数据库 schema 不匹配。1. 先成功运行retrieve-projects。2. 尝试用 Cursor 重新打开项目并保存生成新的数据库文件。3. 这是一个关键问题。开源项目可能滞后于 Cursor 更新。你需要查看错误信息手动用 SQLite 浏览器打开数据库查看表结构并可能需要修改generate-prompt.ts中的 SQL 语句。生成的 Prompt 内容空洞只有项目基本信息没有文件历史等细节。脚本中的 SQL 查询未能从数据库中找到有效数据或者查询的表名/列名不对。同上一点。需要调试 SQL 查询。检查数据库文件中是否存在file_history、workspace_folders等表。Cursor 可能更改了内部存储结构。将生成的 Prompt 发给 Cursor AI 后AI 的回答似乎没有利用到上下文。1. Prompt 太长超出了 AI 的上下文窗口限制。2. Prompt 的结构不够清晰AI 没有正确理解指令。3. Cursor 使用的模型版本不同对长上下文的处理能力有差异。1. 尝试精简你的模板只保留最关键的信息如核心文件列表、技术栈。2. 优化模板结构确保“角色”、“上下文”、“指令”部分层次分明。可以使用 Markdown 的加粗和标题来强调。3. 如果使用 Claude 3.5 Sonnet 等支持长上下文模型可以保留更多细节。对于短上下文模型必须做摘要。6.2 进阶技巧与心得“少即是多”原则刚开始使用时不要试图在 Prompt 里塞进所有信息。AI 的注意力是有限的。优先提供项目技术栈、核心目录结构、最近正在修改的3-5个文件。这三点已经能极大提升 AI 的理解力。动态更新项目是不断演进的。最好的使用习惯是当你开始一个新的功能模块或遇到一个复杂问题时先运行一次cursor-learner生成最新的上下文然后再向 AI 提问。这能确保 AI 基于最新的代码状态给你建议。结合 Chat 历史cursor-learner生成的 Prompt 可以作为对话的“基石”。在后续对话中你可以引用之前 AI 生成的代码片段或讨论过的设计决策形成连贯的、有记忆的协作。安全与隐私再次强调.vscdb文件包含你的本地工作区信息。虽然cursor-learner在本地运行但如果你打算分享生成的 Prompt例如在论坛提问请务必仔细检查 Prompt 内容确保没有包含敏感的绝对路径、内部 IP 地址或密钥的片段。不只是为了 Cursor这个工具生成的是一份结构化的项目描述文档。这份文档本身就有很大价值。你可以把它放在项目根目录的PROJECT_CONTEXT.md里作为新团队成员或外部贡献者的快速上手指南。它比手写的 README 更客观、更实时。cursor-learner这个项目其价值不在于它用了多复杂的技术而在于它用一个极其简单、直接的思路解决了 AI 编程时代一个普遍存在的“上下文缺失”问题。它让我从反复向 AI 描述项目的繁琐中解脱出来把精力真正集中在思考和解决问题上。经过一段时间的实践我发现当 AI 助手真正“了解”你的项目时它从一个好用的工具升级成了一个真正意义上的初级编程伙伴。