1. 项目概述:从零构建AI编程助手Agent
在当今快速发展的AI领域,构建一个实用的AI编程助手已成为许多开发者的需求。本文将详细介绍如何从零开始构建一个简化版的Claude Code——一个基于命令行的AI编程助手。这个项目将具备自然语言交互、会话管理、文件操作、命令执行等核心功能,帮助开发者提高编码效率。
这个AI Agent的设计目标是成为一个轻量级但功能完备的编程助手,能够在本地开发环境中无缝集成。它不仅能理解自然语言指令,还能执行基本的开发任务,如文件操作、命令执行等,同时保持会话上下文和记忆能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 需求分析与技术选型
2.1 产品定位与核心功能
我们的AI编程助手定位为一个CLI工具,主要服务于开发者群体。它需要具备以下核心能力:
- 自然语言交互:理解开发者用自然语言描述的需求
- 会话管理:维护多轮对话上下文,支持中断恢复
- 文件操作:在沙盒环境中安全地读写文件
- 命令执行:执行基本的shell命令(有限制的)
- AI集成:与Claude API集成,实现智能响应
- 记忆系统:短期记忆和简单持久化能力
核心功能优先级如下:
| 功能模块 | 优先级 | 描述 |
|---|---|---|
| CLI交互 | P0 | REPL界面、语法高亮、历史记录 |
| 会话管理 | P0 | 多轮对话、上下文维护 |
| 文件操作 | P0 | 读取/写入/搜索文件(沙盒中) |
| 命令执行 | P0 | 执行shell命令(沙盒中) |
| AI集成 | P0 | Claude API、流式响应 |
| 记忆系统 | P1 | 短期记忆、简单持久化 |
| 权限控制 | P1 | 用户确认、路径限制 |
2.2 技术栈选择
经过评估,我们选择了以下技术栈:
运行时环境:
- Node.js 18+ (LTS版本)
- TypeScript 5.3+
- ES Modules规范
构建工具链:
- 编译:tsc + esbuild组合
- 打包:pkg或ncc
- 测试:vitest测试框架
- 代码规范:ESLint + Prettier
核心依赖库:
- CLI框架:commander + ink(React for CLI)
- AI SDK: @anthropic-ai/sdk
- 数据库:better-sqlite3
- HTTP客户端:undici
- 加密:node:crypto内置模块
- 日志:pino
- Schema验证:zod
开发体验优化:
- 热重载:tsx watch
- 调试工具:ndb
- 文档生成:typedoc
选择这些技术的主要考虑因素包括:
- Node.js生态丰富,适合CLI工具开发
- TypeScript提供更好的类型安全和开发体验
- 轻量级依赖,减少打包体积
- 良好的开发者体验工具链
3. 项目初始化与结构设计
3.1 项目初始化步骤
以下是创建项目的完整命令序列:
bash复制# 1. 创建项目目录
mkdir my-ai-agent
cd my-ai-agent
# 2. 初始化npm项目
npm init -y
# 3. 安装TypeScript和开发工具
npm install -D typescript @types/node tsx vitest eslint prettier
# 4. 安装生产依赖
npm install @anthropic-ai/sdk commander ink react better-sqlite3 \
undici pino zod chalk highlight.js
# 5. 创建TypeScript配置
cat > tsconfig.json << 'EOF'
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2022"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "tests"]
}
EOF
# 6. 创建基础目录结构
mkdir -p src/{cli,core,sandbox,utils,types}
mkdir -p tests
3.2 项目目录结构
设计良好的目录结构对项目可维护性至关重要。我们的项目结构如下:
code复制my-ai-agent/
├── src/
│ ├── index.ts # 入口文件
│ ├── cli/ # CLI层
│ │ ├── commands/ # 命令定义
│ │ ├── ui/ # UI组件
│ │ └── repl.ts # REPL实现
│ │
│ ├── core/ # 核心逻辑
│ │ ├── session/ # 会话管理
│ │ ├── memory/ # 记忆系统
│ │ ├── tools/ # 工具系统
│ │ └── ai/ # AI集成
│ │
│ ├── sandbox/ # 沙盒环境
│ │ ├── filesystem.ts # 虚拟文件系统
│ │ └── executor.ts # 命令执行器
│ │
│ ├── utils/ # 工具函数
│ │ ├── logger.ts # 日志
│ │ ├── crypto.ts # 加密
│ │ └── async.ts # 异步工具
│ │
│ └── types/ # 类型定义
│ └── index.ts
│
├── tests/ # 测试文件
├── package.json
├── tsconfig.json
└── README.md
这种结构的主要优点:
- 清晰的关注点分离
- 易于扩展新功能
- 测试代码与实现代码分离
- 类型定义集中管理
4. 核心模块实现
4.1 CLI交互模块
4.1.1 命令行参数解析
CLI是用户与AI助手交互的主要界面。我们使用commander.js框架来处理命令行参数:
typescript复制// src/cli/commands/index.ts
import { Command } from 'commander';
import { repl } from './repl';
import { showVersion, showConfig } from './helpers';
export const program = new Command();
program
.name('my-ai-agent')
.description('AI 编程助手 - 基于自然语言的代码助手')
.version('1.0.0')
// 交互式REPL模式
.command('repl')
.description('启动交互式REPL')
.option('-p, --project <path>', '项目根目录', process.cwd())
.option('-c, --config <path>', '配置文件路径')
.option('--no-memory', '禁用记忆功能')
.action(repl)
// 单次执行模式
.command('exec [mess
