Cursor 新项目实战
从空仓库到第一个能演示的功能。阶段含义见 AI Coding 工作流。文件正文只在 项目落地包,本页不另贴一套。
适用:Java / Spring Boot 外包或自研后台,从 0 开始。
案例:ticket-admin。不做:一次生成整套系统。
需求 → 拆解 → 架构 → Context → Rules → Spec
→ 实现 → 测试 → Review → Debug / 回归 → 交付0. 这次做出什么
客服、值班同事能新建工单、看列表、改状态。
后端三个接口,表 biz_ticket。前端不在这一刀里。
未放入 AGENTS.md、.cursor/rules/00-core.mdc、docs/ai-context/00-overview.md 之前,不要让 AI 写业务代码。Spec 未经人确认,也不要写。
1. 需求
内部要把工单从口头变成能查的记录:新建、列表、改状态。
这里只回答为什么做。title 是否必填、curl 怎么验,不写在这一节。
人决定做不做。AI不决定。
2. 拆解
不要发「帮我把工单功能做出来」。那一句会带上登录、消息、页面。
这一刀只做能一起验收的后端闭环:
- 创建
- 列表
- 状态变更
三个接口同一次做完,不拆成三个项目。前端是下一刀:另写一篇 Spec,不在本篇展开。
拆解是工程决策,不是 Prompt 技巧。
人砍到这一刀。AI可以列草案,采用哪一刀人定。
3. 架构
写代码之前定系统边界。AI 可以列选项,人拍板。多出来的用户中心、支付、消息,删掉再往下。
ticket-admin 只定这些:
- 一个模块
ticket,包com.demo.ticket - Controller 收参,业务在 Service,数据在 Mapper
- 一张表
biz_ticket:id、title、status、created_at - 三个接口:
POST /api/tickets、GET /api/tickets、PATCH /api/tickets/{id}/status - 状态只允许 OPEN → DOING → DONE,禁止跳步
- 不引入登录、Redis、MQ
字段校验和测试命令不写在这里。
4. Context
Context 是项目现在是什么,不是这一次的验收。
从 项目落地包 复制章节,只改成上面已经定下的事实。概念见 Context & Rules。
docs/ai-context/
├── 00-overview.md
├── 01-modules.md
└── 99-gotchas.md00-overview.md:内部工单、技术栈、本地怎么启动、本阶段不做登录 / 附件 / 通知 / Redis。不写 title 必填。01-modules.md:模块边界定了再写。先写职责、表、三个 URL;调用链等代码落地后补。没有内容不要建空文件。99-gotchas.md:新项目可写一行「暂无」。
人确认事实。AI可以按架构整理草稿,不能编一套还没有的系统。
5. Rules / AGENTS
仍从落地包复制,只改项目名和路径。不在这里贴全文。
AGENTS.md:项目卡。是什么项目、技术栈、目录、Spec 放在哪。不是这一次的任务书。.cursor/rules/00-core.mdc:所有任务都遵守。只改相关文件,不改已发布路径,不加仓库里没有的依赖,不确定就停。
「title 必填」「这一刀不做前端」是 Spec,不要写进 Rules。
6. Spec
Spec 是这一次的冻结约定。人确认之前,不许改代码。
写入 docs/ai-context/specs/ticket-apis.md。有任务再新建这个文件,不预建空目录。骨架只有这四个标题,见落地包,不要再加章节。
# 工单三个接口
## 目标
客服能新建工单、看列表、把状态从 OPEN 改到 DOING 再改到 DONE。
## 范围
- 做:POST /api/tickets、GET /api/tickets、PATCH /api/tickets/{id}/status
- 模块:TicketController、TicketService、TicketMapper;表 biz_ticket
- 不做:前端、登录、缓存、MQ、附件、消息通知
## 做到什么
- 创建:title 必填,初始 status=OPEN
- 列表:返回 id、title、status、created_at
- 改状态:只允许 OPEN→DOING→DONE,禁止跳步
## 验收
- mvn -q -DskipTests package 通过
- curl 能创建,列表能看到
- 非法跳转不会成功包名、路径按你改过的 AGENTS.md 替换。你要改的是名称和字段,不是这四个标题。
人冻结。AI可以起草。
7. 实现
Spec 已确认
→ AI 按 Spec 实现
→ 人看 Diff
→ 再跑验收阅读 docs/ai-context/specs/ticket-apis.md。
只实现该文件「范围」里的后端。
不要做「不做」里的事。
改完列出:改了哪些文件、怎么验收。不要用一句话「帮我实现工单」代替这份 Spec。提问方式见 Prompt Pattern · 实现。
人看 Diff 是否越出 Spec。AI写代码。
8. 测试
对照 Spec 的「验收」,不是看代码像不像能跑。
有单测就跑单测。这一刀没有测试类时,固定走 Spec 里那几条:mvn -q -DskipTests package、curl 创建、列表、一次非法跳转。
主路径和 Spec 写明的失败路径都要过。「package 通过」不等于「状态机对了」。
人判定过不过。AI可以起草命令。见 Prompt Pattern · 测试。
9. Review
测试之后看 Diff。AI 初检,人判断。要改就改完再测,不在这里重做架构。
看这几件就够:
- 有没有超出 Spec(前端、登录、Redis)
- 有没有违反 Rules(改路径、加依赖)
- 有没有无关文件
- 创建和列表是否还在
- 有没有明显的质量问题
完整做法在 AI Code Review。本页不复制 Prompt。
10. Debug / 回归
测试或 Review 没失败,就跳过。不要为了走流程制造故障。
若 curl 把 OPEN 直接改成 DONE 也成功,按这个收,不要让 AI 重写三个类:
复现:同一条 curl
→ 缩小到状态判断(TicketService)
→ 看 Diff,不看整仓
→ 假设:漏了禁止跳步
→ 只补这一处
→ 再测非法跳转
→ 回归:创建和列表仍可用人决定修到哪。AI帮着定位。见 Prompt Pattern · Debug。
老项目还要证明没点名的旧行为没变,不在本篇展开。见 老项目实战。
11. 交付
对照 Spec 勾验收,并确认「不做」没有出现在 Diff 里。
[ ] specs/ticket-apis.md 与实际接口一致
[ ] AGENTS.md、00-overview 与真实技术栈一致
[ ] 01-modules 与真实包名、接口一致
[ ] 第 8 节的命令自己跑过
[ ] git diff 里没有前端、登录、Redis、无关模块
[ ] 说得清改了什么、怎么验没有新的 Spec,就不重构。不在这里写发布流程。
Skills 不要在这一阶段安装。重复第三次的检查动作,再看 Skills。
接手已有代码用 老项目实战。老项目不重做第 3 节的架构。