摘要:用 AI 写代码一年,我从"让 AI 帮我写函数"进化到"让 AI 当自主工程师"。本文首次公开我的完整 AI 开发工作流:用 Rules + Spec 双轨制 让 AI 不再猜规矩,用 Trellis 把每个想法变成可追溯的代码,用 Codegraph 实现比 grep 快百倍的代码搜索,用 grill-with-docs 在写代码前厘清概念边界,用 MCP 让 AI 长出"手"去调外部工具。文章包含真实开发节奏、血泪教训和最小可行配置清单,适合所有想从"AI 辅助编程"跃迁到"AI 驱动开发"的工程师。

先说我用的工具栈

先列一下我日常打交道的东西,不然后面聊起来你都不知道我在说什么:

工具干什么的我的评价
Claude CodeAI 编程助手(主力)目前用过最靠谱的,理解力强、不瞎编
Codegraph代码知识图谱秒查符号、追踪调用链,比 grep 快一个数量级
Trellis项目管理 + 规范注入把"脑子里的约定"变成"AI 自动读的文档"
grill-with-docs领域建模审查在写代码前逼你先把概念理清楚
MCP外部工具集成协议让 AI 能调外部 API/工具,扩展能力边界

如果你只用过 ChatGPT 网页版写代码,这篇文章可能会让你觉得"卧槽还能这样"——因为我第一次配好这套流程的时候就是这个感觉。


一、别让 AI 猜你的规矩,写下来

痛点

最开始用 AI 写代码的时候,每次对话都像在带新人:

  • “这个项目用 structlog 别用 logging”
  • “测试代码放 /test 目录”
  • “不要主动 commit”
  • “改完代码记得更新 docs/agent.md”

同样的话我要在不同对话里说八百遍,烦死了。

解法:Rules + Spec 双轨制

我把这些规矩分了两层:

第一层:Rules(.claude/rules/)——管"怎么写代码"

.claude/rules/
├── logging-style.md           # 必须用 structlog
├── langgraph-standards.md     # 框架层别硬编码业务字段
├── architecture-decisions.md  # 架构决策记录
├── known-risks.md             # 已知坑
└── ...

这些都是 Markdown,AI 每次对话会自动加载。写清楚"禁止做什么"比写"应该做什么"更有用——AI 对否定句更敏感。

第二层:Spec(.trellis/spec/)——管"这个包/层怎么写"

.trellis/spec/
├── backend/
│   ├── index.md              # 开发前检查清单 + 质量检查
│   ├── error-handling.md     # 怎么处理错误
│   ├── logging-guidelines.md # 日志规范
│   └── ...
├── guides/
│   ├── code-reuse-thinking-guide.md
│   └── cross-layer-thinking-guide.md

区别是什么?

  • Rules:全局的、跨项目的——比如"我所有的 Python 项目都用 structlog"
  • Spec:这个具体项目的——比如"这个项目的 API 返回格式是 {code, data, message}"

实战场景:我用 /trellis-before-dev 这个 skill,它在写代码前自动读取相关 spec 注入上下文。相当于每次写代码前先看一遍"项目开发手册",而且不用我手动翻。

关键认知

Spec injected, not remembered(规范靠注入,不靠记忆)

不要把约定放在你的脑子里或者某个"团队 Wiki"里——AI 读不到就等于不存在。写在 .claude/rules/ 或 .trellis/spec/ 里,AI 每次对话自动加载。


二、Trellis:把"一个想法"变成"一段可追溯的代码"

为什么需要这个

你肯定遇到过这种情况:

  • AI 写了一半,你发现方向不对,但已经改了好多文件
  • 过了两周回头看,完全不记得当时为什么要那样改
  • 同一个 bug 修了三次,每次都从零开始排查

Trellis 解决的就是"AI 辅助开发的流程管理"问题。

三阶段工作流

Phase 1: Plan    → 搞清楚要做什么(brainstorm + research → prd.md)
Phase 2: Execute → 写代码,过质量检查
Phase 3: Finish  → 沉淀经验 + 收尾

Phase 1:Plan(规划阶段)

# 1. 创建任务
python ./.trellis/scripts/task.py create "添加用户认证中间件"

# 2. 进入 brainstorm 模式,和 AI 一起理需求
# AI 会先读代码、了解上下文,然后一个一个问问题:
# "这个中间件要保护哪些路由?"
# "认证方式是 JWT 还是 API Key 还是都支持?"
# "未认证时返回 401 还是重定向到登录页?"

# 3. 如果涉及技术选型,AI 会 spawn 研究子 agent
# 比如调研"Python 里哪个 JWT 库最合适"

# 4. 需求确认后,curate implement.jsonl(告诉实现 agent 该读哪些 spec)
python ./.trellis/scripts/task.py start 06-04-添加用户认证中间件

产出物:

  • prd.md:完整的需求文档(目标、需求、验收标准、技术方案、不在范围内)
  • research/:技术调研结果
  • implement.jsonl:实现 agent 需要的上下文文件列表

Phase 2:Execute(执行阶段)

Trellis 的核心设计:main session 不做实现,派 sub-agent 去做。

为什么?因为 sub-agent 会得到 implement.jsonl 注入的 spec 上下文,而 main session 没有。如果你在 main session 里直接写代码,等于绕过了规范注入——那你前面写的 spec 就白写了。

# main session 派 sub-agent:
# Agent type: trellis-implement
# 它会被注入 implement.jsonl 里列的所有 spec 文件
# 然后按 prd.md 实现

# 实现完后派 check agent:
# Agent type: trellis-check
# 它会被注入 check.jsonl 里的规范
# 然后审查代码、运行 lint/type-check/tests

Phase 3:Finish(收尾阶段)

# 1. 更新 spec(如果这次学到了新东西)
# 2. commit
# 3. /trellis:finish-work

我觉得最有用的一点

task 目录存一切。每次任务的所有东西——需求、调研、实现记录——都在 .trellis/tasks/MM-DD-任务名/ 下面。两周后你想知道"当时为什么这么设计",去翻那个目录就行,不用翻聊天记录。


三、Codegraph:比 grep 聪明一百倍的代码搜索

痛点

传统的 grep / rg 搜索:

grep -r "execute_skill" app/   # 返回几百行,大部分是 import 语句

Codegraph 的做法:

> codegraph_context "execute_skill 是怎么被调用的"
# 直接返回:入口点、相关符号、调用关系图
# 而且有代码片段,但不会把整个文件 dump 给你

我常用的几个命令

我要干什么用哪个
“这个功能是怎么实现的?”codegraph_context — 一键返回入口 + 相关符号 + 关键代码
“函数 A 怎么调用到函数 B 的?”codegraph_trace from to — 追踪完整调用链
“这个符号在哪定义的?”codegraph_search — 只返回位置,不返回代码
“改这个函数会影响哪些地方?”codegraph_impact — 反向查找所有调用者
“这个模块都有哪些函数?”codegraph_explore — 展示一个区域的多个相关符号

使用心得

先 codegraph,再读文件。大部分问题 codegraph 直接能回答,不需要打开文件。只有需要逐行审查的时候才用 Read。

Codegraph 背后是一个 SQLite 知识图谱,索引了项目里每个符号、每条边、每个文件。读操作是亚毫秒级的——比 grep 快,而且给的是结构化信息不是文本匹配。


四、grill-with-docs:在写代码之前,先把话说清楚

这个 skill 干什么的

/grill-with-docs 是一个"面试式"的领域建模工具。它会:

  1. 追问你到底在说什么 — “你说的’订单’,是指用户的预订记录,还是支付后的确认单?”
  2. 挑战你的术语 — “你的 CONTEXT.md 里把 ‘取消’ 定义为 X,但你这次说的是 Y——到底是哪个?”
  3. 压力测试你的设计 — “如果用户取消了一半的订单项,你这个流程还能走通吗?”
  4. 现场更新术语表 — 每搞清楚一个概念,立刻写到 CONTEXT.md 里
  5. 必要时写 ADR — 只有满足三个条件才写:难逆转、没上下文会困惑、有真正的权衡

我的使用场景

  • 新 feature 设计:在写 PRD 之前先 grill 一轮,把概念边界厘清
  • 重构前:确保新旧术语对齐,别重构到一半发现理解错了
  • 多人协作:CONTEXT.md 相当于团队的"通用语言词典"

产出物

docs/
├── CONTEXT.md          # 术语表(不含任何实现细节,纯粹的概念定义)
└── adr/
    ├── 0001-agent-first-architecture.md
    └── 0003-remove-distilled-memory.md

五、MCP:让 AI 长出"手"

什么是 MCP

Model Context Protocol — Anthropic 推的一个开放协议,让 AI 模型能调用外部工具。简单说就是:AI 不只是"说话",还能"做事"。

我怎么用的

# config/mcp_servers.yaml
servers:
  - name: weather_api
    url: http://localhost:9000/mcp
    transport: streamable-http
  - name: internal_tools
    url: https://internal-api.example.com/mcp
    headers:
      Authorization: "Bearer ${MCP_AUTH_TOKEN}"

MCP Server 启动后,它提供的工具会自动被发现、包装成 LangChain StructuredTool、注册到 Agent 的工具列表里。Agent 在 ReAct 循环中可以像调本地工具一样调 MCP 工具。

关键经验

  • 只支持 HTTP/StreamableHTTP,不支持 Stdio。需要本地工具的话要部署成 HTTP 服务
  • 防御性导入:mcp 包没装的时候应用正常启动,MCP 功能降级——别让一个外部依赖挂掉整个应用
  • 每个工具调用创建新 session,高频场景下注意连接开销

六、Agent Memory(docs/agent.md):不只是"写文档"

我的文档哲学

大部分人的"开发文档"长这样:

2026-01-01: 修复了登录 bug
2026-01-02: 添加了用户列表页面
2026-01-03: 优化了数据库查询

这不是文档,这是 git log 的手抄版。

我的 agent.md 结构

# Agent Memory

## 当前维护方式       ← 运维约定(怎么启动、怎么部署、注意事项)
## 最近十日时间线     ← 按模块写可复用结论,不写 commit hash
## 关键模块记忆       ← 核心链路、关键文件、当前架构版本
## 已知长期风险       ← 环境坑、安全坑、业务坑
## 历史归档摘要       ← >10 天的内容合并归纳到这里

核心原则

  1. 只写可复用结论:“logs 字段直接透传原始对象数组,禁止用 _as_list_of_str”——下次 AI 读到就不会再犯
  2. 不写流水账:“构建通过”、“已推送”——删掉
  3. 覆盖优于追加:如果这次修改了已有结论,直接改原文,别在后面加"更新:XXX"
  4. 十天滚动窗口:只保留最近 10 天的详细时间线,更早的合并到归档摘要

关键规则

每次任务对话结束前,必须先更新 agent.md,再汇报完成。

这条规则写在我的 CLAUDE.md 最高优先级位置。因为 AI 会话的记忆是临时的——下次对话是全新的上下文,只有文件里的东西能跨会话传递。

为什么不用"自动文档生成"?

试过。删了。LLM 自动蒸馏产出的"记忆"质量太低——要么太泛(“优化了系统性能”),要么太碎(把一次调试的中间状态当结论写进去)。人审核 + AI 辅助写才是对的姿势。


七、我的日常开发节奏(真实流程)

以一个典型需求为例——“给 Monitor API 加认证”:

上午 10:00
  $ python .trellis/scripts/task.py create "Monitor API 认证中间件"
  → 创建 .trellis/tasks/06-04-monitor-auth/

上午 10:05
  → AI 自动进入 brainstorm 模式
  → AI: "Monitor 路由现在有多少个?我看看代码……12 个端点。
       你是想所有都保护还是留 health 端点免认证?"
  → 我: "health 免认证,其它都要"
  → AI 更新 prd.md

上午 10:15
  → AI: "认证方式你倾向哪种?
       1. API Key(简单,适合内网)
       2. JWT(灵活,但重)
       3. IP 白名单(零代码改动)"
  → 我: "API Key,环境变量配"
  → AI 记录决策到 prd.md

上午 10:30
  → AI: "需求明确了,我总结一下……"
  → 我: "ok"
  → $ python .trellis/scripts/task.py start 06-04-monitor-auth

上午 10:35
  → AI spawn trellis-implement sub-agent
  → sub-agent 被注入 implement.jsonl 里的 spec 文件
  → sub-agent: 读 prd.md → 读 spec → 写代码 → lint → type-check

上午 10:50
  → AI spawn trellis-check sub-agent
  → sub-agent: 读 check.jsonl → 审查代码 → 运行测试 → 通过

上午 11:00
  → AI: "这次新增了安全模块,需要更新 spec"
  → /trellis-update-spec → 写入 .trellis/spec/backend/security.md
  → AI: "commit 计划:1个 commit,3个文件"
  → 我: "ok"
  → commit 完成

上午 11:05
  → AI 更新 docs/agent.md(记录新模块、新风险)
  → /trellis:finish-work
  → 收工

整个过程我写了几行代码?零行。我做的事情:

  1. 描述需求
  2. 做决策(认证方式选 API Key)
  3. 确认方案
  4. 审核结果

八、几条"血泪教训"

1. "小改动"也要走流程

“就改一行代码,别建 task 了吧”——这是最大的陷阱。

一行代码改动可能:

  • 改了 API 返回格式,前端挂了
  • 引了一个新 import,循环依赖了
  • 修了一个 bug,引入两个新 bug

Trellis 的 check agent 就是防这个的。除非你说 skip trellis,否则 AI 会坚持走流程——这不是教条,是血的教训。

2. Spec 不是一次写完的

第一次写 spec 的时候你不可能想全。正确的姿势是:

  • 开发过程中发现了新约定 → 立刻 /trellis-update-spec
  • 修了一个难查的 bug → /trellis-break-loop 分析根因 + 写进 spec
  • 每两周翻一遍 spec,删掉过时的、合并重复的

3. 不要用 AI 的"记忆"功能替代文档

Claude Code 有 memory 机制,但它存的是"用户偏好"、"项目背景"这类跨会话的元信息。代码约定、架构决策、接口行为——写进 spec 和 agent.md,别靠 memory。

4. 工具护栏很重要

我的 Agent 有这些护栏:

  • 重复失败检测:同一个工具连续失败 2 次 → 硬停止,别无限重试
  • 无进展循环检测:连续 3 轮没有实质性进展 → 注入提醒
  • 429 熔断切换:API Key 被限流 → 自动切下一个 Key,全挂了就快速失败

AI 写代码快,犯错的速速也快。护栏不是限制 AI,是保护你的系统。

5. Codegraph 要配好

Codegraph 的核心价值是"不要让 AI 用 grep 翻代码"——那又慢又费 token。配置好 .codegraph/ 索引后,AI 对代码库的"感知"从"模糊文本搜索"变成了"精确符号查询"。


九、如果你也想搭这套流程

最小可行配置

1. Claude Code(IDE 插件或 CLI)
2. CLAUDE.md(项目根目录,写清楚项目概览 + 开发命令 + 核心架构)
3. .claude/rules/(至少写 logging-style.md + known-risks.md)
4. docs/agent.md(从当前维护方式 + 关键模块记忆开始)

进阶配置

5. Codegraph(codegraph init + 后台 daemon)
6. Trellis(trellis init + 配好 spec + task 流程)
7. grill-with-docs(需要 CONTEXT.md + ADR 的时候用)
8. MCP Server(有外部工具需要 AI 调的时候配)

我的建议

别一次性全配上。第一周只配 1-4,用顺手了再加。工具是服务流程的,流程没跑通之前加工具只会让你更乱。


最后说两句

AI 编程这件事,很多人停留在"让 AI 帮我写个函数"的阶段。这当然有用,但真正的生产力跃迁发生在:

当你不再把 AI 当"代码生成器",而是当"遵循规范的自主执行者"的时候。

规范写好了,流程跑通了,AI 从一个"帮你打字的助手"变成了"帮你完成任务的工程师"。这中间差的不是模型能力,而是你有没有给它足够的上下文和约束。

Trellis + Spec + Rules + Agent Memory 这套组合,本质上就是在做一件事:把隐性的开发知识显性化,让 AI 每次对话都有完整的上下文。

好了,我去写代码了(让 AI 写)。


写于 2026-06-04,基于生产项目的真实开发经验

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐