最近接到一个团队效能工具/AI Agent开发任务,主要功能是解析DBC后自动生成协议栈配置代码+通信信号解析代码……不要在意这个具体业务,只要知道它的最终输出是代码即可。坦白地说,这个业务场景并非LLM应用的典型/最佳场景(因为这个业务本身通过简单的解析+计算+填空就能解决大半),但是领导想要体验一下AI,对我自己而言也会是一个尝试最近学习的新技能的机会,于是就有了这次实践。对于我们学习AI辅助开发/AI Agent的朋友来说,可以忽略功能本身,更重要的是关注基于Claude Code的Agent搭建过程。

在本文撰写的时间点,项目尚未开始,也没有具体的业务需求,但这不妨碍我们先开始开发框架的搭建。本项目决定直接使用Claude Code作为base agent,不打算再自己使用LangGraph开发,所以不适合想要学习LangChain/LangGraph等应用开发框架的朋友。本文同样会在项目进程中顺便介绍一些Claude Code的基础知识,所以也适合Claude Code新手上路。
本项目可能还会涉及一些SDD(Spec-Driven-Development)的思想,对此感兴趣的朋友也可以参考GitHub官方项目Spec-kit (https://github.com/github/spec-kit)。

1 为何选择Claude Code

首先考虑的是,这个项目的根本目标就是“生成代码”。说实话,如果我自己使用LangGraph开发,在代码生成环节也是一样会调用Claude Code做Coding Agent。更重要的是,Claude Code本身具备Sub-Agent功能,所以想要通过Claude Code直接做一个multi-Agents system。

2 Claude Code接入智谱GLM模型

事实上想接入什么模型都可以,只不过GLM对国内玩家来说是性价比不错的选择。按照智谱官方提供的教程(https://docs.bigmodel.cn/cn/coding-plan/tool/claude)一步步操作即可。
操作完成后可以发现计算机本地的用户文件夹/.claude/settings.json(这也是Claude Code的用户配置文件)中有如下内容:

{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "an_example_token_key",
    "ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic",
    "API_TIMEOUT_MS": "3000000",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1
  }
}

3 CC Agent应用开发框架配置

我为Claude Code开发框架配置了如下文件结构:

dbc2code/
├── .claude/				# 本项目的Claude Code配置
│   ├── agents/				# sub-Agents
│   ├── commands/			# 指令
│   ├── hooks/				# hooks
│   ├── skills/				# skills
│   └── settings.json		# 本项目的Claude Code配置文件
├── specs/					# 功能规格说明
├── .gitignore/				# gitignore文件
├── CLAUDE.md/				# 项目操作手册
└── constitution.md/		# 项目宪法

以上文件是项目配置,这些配置只适用于此项目,是会被团队成员共享、是会上传到git上的。同样,如果在本地的用户文件夹/.cloude中配置的文件,则称为个人配置,适用于在此计算机账户上使用的所有项目,相当于全局配置。

加载顺序
当Claude Code启动后,首先会加载本地用户文件夹/.claude/settings.json(你的个人配置。还记得吗,我们之前配置Claude Code接入GLM模型,就是在这个文件中添加了内容),然后加载./.claude/settings.json(项目配置),后者会覆盖前者中的同名设置。然后它会加载本地用户文件夹/.claude/CLAUDE.md(你的个人操作手册,适用于所有项目),再加载项目操作手册./CLAUDE.md
也就是说,你在使用Claude Code的时候以上内容已经被作为默认上下文加载,你无须再提及这些文件中的内容,相当于已经有了一个懂项目、团队规则的助手。

在此阶段我完成配置的是./CLAUDE.md, ./constitution.md, 和./.claude/settings.json三个文件,先大概写一个,等有了更详细的需求再更新。其它的后面遇到了再详细说。

3.1 项目操作手册:./CLAUDE.md

这个文件应该包含所有具体的指令,是./.claude/中的各种能力(我们尚未提及)的指挥者和“API文档”。
以下是这个项目的./CLAUDE.md文件(现在先随便写一个,后面会根据项目的进展持续更新):

# ==================================
# dbc2code 项目上下文总入口
# ==================================

# --- 核心原则导入 (最高优先级) ---
# 明确导入项目宪法,确保AI在思考任何问题前,都已加载核心原则。
@./constitution.md

# --- 核心使命与角色设定 ---
你是一个资深的嵌入式软件工程师,精通汽车CAN总线协议和代码生成技术。
你正在协助我开发一个名为 "dbc2code" 的AI Agent工具。
你的所有行动都必须严格遵守上面导入的项目宪法。

---
## 1. 项目概述
**dbc2code** 是一个AI Agent(或Multi-Agent系统),用于:
1. 解析DBC文件(CAN数据库文件)
2. 自动生成协议栈配置代码
3. 自动生成通信信号解析/打包代码
4. 输出符合嵌入式规范的C语言代码

---
## 2. 技术栈与环境
- **Agent开发语言**: Python (版本 >= 3.10)
- **生成目标语言**: C语言 (符合MISRA-C或AUTOSAR规范)
- **DBC解析**: 使用 `cantools` 或自研解析器
- **代码生成**: 使用 Jinja2 模板引擎
- **构建与测试**:
  - 使用 `Makefile` 或 `pyproject.toml` 进行标准化操作
  - 运行所有测试: `pytest` 或 `make test`
  - 代码格式化: `ruff format` / `black`
  - 代码检查: `ruff check` / `mypy`

---
## 3. Git与版本控制
- **Commit Message规范**: 严格遵循 Conventional Commits 规范。
  - 格式: `<type>(<scope>): <subject>`
  - 示例: `feat(parser): add support for multiplexed signals`
  - 当被要求生成commit message时,必须遵循此格式。

---
## 4. AI协作指令
- **当被要求添加新功能时**: 先阅读`specs/`下的相关规格文档和`src/`下的相关模块,对照项目宪法,再提出计划。
- **当被要求编写测试时**: 优先使用 `pytest` 编写参数化测试(Parameterized Tests)。
- **当被要求生成C代码模板时**: 必须考虑嵌入式环境的内存限制和MISRA-C规范。
- **当处理DBC相关问题时**: 需理解CAN协议基础知识(信号、消息、节点、位布局等)。

3.2 项目宪法:./constitution.md

这个文件定义了所有在开发中需要遵守的“铁律”。值得注意的是,./constitution.md并不会被Claude Code直接加载,在需要它的时候需要使用@符号提及@符号是Claude Code中约定用来提及文件作为上下文的符号,既可在如./CLAUDE.md的文档中使用,也可直接在提示词中使用,是非常常用的内置指令。例如,在./CLAUDE.md中的第7行就明确写了@./constitution.md,也可以在提示词中直接写“请按照@./constitution.md中约定的规则为我开发XX功能”。
以下是我这个项目的./constitution.md文档,可以着重注意它与./CLAUDE.md内容的区别(没看到案例前可能对二者区别感到困惑,看到案例后一目了然):

# dbc2code 项目开发宪法
# Version: 1.0

本文件定义了本项目不可动摇的核心开发原则。所有AI Agent在进行技术规划和代码实现时,必须无条件遵循。

---

## 第一条:简单性原则 (Simplicity First)
**核心:** 遵循Python的"明确优于隐晦"哲学。绝不进行不必要的抽象,绝不引入非必需的依赖。
- **1.1 (YAGNI):** 只实现`specs/`中明确要求的功能。
- **1.2 (标准库优先):** 必须优先使用Python标准库,仅在必要时引入第三方库。
- **1.3 (反过度工程):** 简单的函数和数据类优于复杂的类继承体系。

---

## 第二条:测试先行铁律 (Test-First Imperative) - 不可协商
**核心:** 所有新功能或Bug修复,都必须从编写一个(或多个)失败的测试开始。
- **2.1 (TDD循环):** 严格遵循"Red-Green-Refactor"循环。
- **2.2 (参数化测试):** 单元测试必须优先采用 `pytest.mark.parametrize` 的参数化测试风格。
- **2.3 (真实数据优先):** 优先使用真实的DBC文件片段作为测试数据,而非过度Mock。

---

## 第三条:生成代码质量原则 (Generated Code Quality)
**核心:** 生成的C代码是最终交付物,必须符合嵌入式软件的高标准。
- **3.1 (可读性):** 生成的C代码必须格式规范、注释清晰,便于人工审查。
- **3.2 (安全性):** 生成的代码必须考虑边界检查、类型安全,避免缓冲区溢出等问题。
- **3.3 (可配置性):** 代码模板应支持不同MCU平台和编译器的配置选项。

---

## 第四条:明确性原则 (Clarity and Explicitness)
**核心:** 代码的首要目的是让人类易于理解。
- **4.1 (类型标注):** Python代码必须使用类型标注(Type Hints),便于静态分析。
- **4.2 (异常处理):** 所有异常都必须被显式捕获和处理,提供有意义的错误信息。
- **4.3 (无全局状态):** 绝不允许使用全局变量传递状态,所有依赖必须通过参数显式注入。

---

## 第五条:领域知识原则 (Domain Knowledge)
**核心:** 正确理解汽车通信协议是本项目成功的基础。
- **5.1 (DBC规范):** 必须正确理解DBC文件格式、信号编码(Intel/Motorola字节序)、缩放因子等概念。
- **5.2 (CAN协议):** 生成的代码必须符合CAN 2.0/CAN FD协议规范。
- **5.3 (嵌入式约束):** 时刻考虑目标平台的资源限制(RAM、ROM、CPU周期)。

---

## 治理 (Governance)
本宪法具有最高优先级,其效力高于任何`CLAUDE.md`或单次会话中的指令。

3.3 项目配置文件:./.claude/settings.json

目前我只在配置文件中添加了权限配置(permissions)。Claude Code的权限规则是这样的:
当要执行一个动作指令(比如读写文件),先看deny的内容,如果属于deny,则无权限,拒绝执行;剩下的再看allow中的内容,如果指令存在于allow中,则经用户批准后就可以执行;如果不存在于allow中,则再看ask的内容,如果存在于ask中,则询问用户是否执行,经批准后执行,如果不存在,则按照当前权限模式的默认行为处理。
具体配置方法如下(包你一看就懂):

{
  "permissions": {
    "defaultMode": "plan",
    "allow": [
      "Read(*.py)",
      "Read(*.c)",
      "Read(*.h)",
      "Read(*.dbc)",
      "Read(*.j2)",
      "Read(*.jinja2)",
      "Read(pyproject.toml)",
      "Read(requirements.txt)",
      "Read(Makefile)",
      "Read(README.md)",
      "Read(constitution.md)",
      "Read(specs/**)",
      "Read(examples/**)",
      "Grep",
      "Glob",
      "LS",
      "Bash(python:--version)",
      "Bash(python:-m:pytest:*)",
      "Bash(pytest:*)",
      "Bash(ruff:check:*)",
      "Bash(ruff:format:*)",
      "Bash(mypy:*)",
      "Bash(black:--check:*)"
    ],
    "ask": [
      "Write",
      "Edit",
      "MultiEdit",
      "Bash(pip:install:*)",
      "Bash(uv:add:*)",
      "Bash(git:add:*)",
      "Bash(git:commit:*)"
    ],
    "deny": [
      "Read(./.env*)",
      "Read(*.pem)",
      "Read(*.key)",
      "Bash(rm:*)",
      "Bash(git:push:*)",
      "WebFetch"
    ]
  }
}

3.4 检查配置

在终端中导航到项目目录下,输入指令claude启动Claude Code,输入指令(slash command)/memory就可以看到我们上面配置过的这些上下文文件了。
在这里插入图片描述


下一章将会开始Agent具体功能和架构的规划。
(最近用多了AI生成文档,好久没有独立写内容了。还是自己打字输出的这种感觉畅爽!)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐