# claude-code **Repository Path**: yinwangcode/claude-code ## Basic Information - **Project Name**: claude-code - **Description**: Claude Code 源码 + 补充构建配置,实现 Claude Code 源码编译 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 828 - **Created**: 2026-04-02 - **Last Updated**: 2026-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README > **📌 仓库分支说明** > > 本仓库包含三个独立分支,围绕 Claude Code 展开不同维度的工作: > > | 分支 | 说明 | > |------|------| > | [`main`](../../tree/main) | **Claude Code Java** — 使用 Java + Spring AI 重写的 Claude Code CLI AI 编码助手(当前分支) | > | [`claude`](../../tree/claude) | **Claude Code 源码** — Claude Code TypeScript 源码快照,用于安全研究和架构学习 | > | [`learn`](../../tree/learn) | **Learn Claude Code** — 拆解 Claude Code Agent Harness 架构的教学项目,含 12 节渐进式课程 | # Claude Code Java ☕ > 使用 Java + Spring AI 重写的 [Claude Code](https://github.com/anthropics/claude-code) CLI AI 编码助手。 ## ✨ 功能特性 ### 核心功能 - 🤖 **AI 对话** — 流式输出,逐 token 实时显示 - 🔧 **18 个内置工具** — Bash、文件操作、搜索、Web、任务管理、MCP桥接 等 - ⚡ **双 API 提供者** — 同时支持 OpenAI 兼容 API 和 Anthropic 原生 API - 📝 **28 个斜杠命令** — 从基础操作到代码审查、安全分析、对话管理 - 🖥️ **JLine 终端** — 行编辑、历史记录、Tab 补全、多行输入、Vim 模式 - 📋 **CLAUDE.md** — 自动加载项目级和用户级记忆文件 - 🎯 **Skills** — 可扩展的技能系统 - 🌿 **Git 上下文** — 自动收集分支、状态、最近提交 ### P0 核心增强 - 🔒 **权限确认** — 危险操作(文件写入、Bash执行)前要求用户确认 [Y/n/always] - 💭 **Thinking 显示** — 展示 AI 思考过程(Anthropic extended thinking) - 🔍 **WebSearch** — DuckDuckGo 网络搜索(无需 API Key) - ❓ **AskUser** — AI 在执行过程中向用户提问 ### P1 体验增强 - 📊 **底部状态行** — 持续显示模型、Token、费用、工作目录 - 🪝 **Hook 系统** — PreToolUse/PostToolUse/PrePrompt/PostResponse 4 种钩子 - 🎨 **代码语法高亮** — 支持 Java/JS/TS/Python/Bash/SQL 6 种语言 - ⌨️ **Vim 模式** — JLine vi 编辑模式(`CLAUDE_CODE_VIM=1` 启用) ### P2 扩展功能 - 🔌 **MCP 协议** — Model Context Protocol 客户端(StdIO 传输、工具发现、资源读取) - 🧩 **插件系统** — JAR 插件加载(ClassLoader 隔离、工具/命令扩展) - 📋 **任务管理** — 后台任务创建、查询、更新(4 个工具) - 🔀 **彩色 Diff** — unified diff 渲染(行号、stat 摘要、颜色标注) - 🌿 **对话分支** — 保存/恢复/标签对话状态 - 🛡️ **安全审查** — AI 驱动的安全漏洞检测 ## 📦 技术栈 | 组件 | 版本 | 用途 | |------|------|------| | JDK | 25 | 运行时 | | Spring Boot | 4.1.0-M2 | 应用框架 | | Spring AI | 2.0.0-M4 | AI 模型调用 | | JLine 3 | 3.28.0 | 终端交互 | | Picocli | 4.7.6 | CLI 命令解析 | ## 🚀 快速开始 ### 前置要求 - **JDK 25**(配置 `JAVA_HOME`) - **Maven 3.9+** - **API Key**(OpenAI 或 Anthropic 或兼容服务) ### 配置 设置环境变量: ```bash # 必须:API 密钥 export AI_API_KEY="your-api-key-here" # 可选:API 提供者(默认 openai) export CLAUDE_CODE_PROVIDER="openai" # 或 "anthropic" # 可选:自定义 API 地址和模型 export AI_BASE_URL="https://api.openai.com" export AI_MODEL="gpt-4o" ``` **支持的 API 提供者:** | 提供者 | 默认 Base URL | 默认模型 | |--------|--------------|---------| | `openai` | `https://api.openai.com` | `gpt-4o` | | `anthropic` | `https://api.anthropic.com` | `claude-sonnet-4-20250514` | > 💡 OpenAI 提供者兼容所有 OpenAI 格式的 API 代理(如 DeepSeek、Azure OpenAI 等)。 ### 运行 **Windows PowerShell:** ```powershell .\run.ps1 ``` **Windows CMD:** ```cmd run.bat ``` **手动运行:** ```bash cd claude-code-copy mvn spring-boot:run ``` ### 启动效果 ``` ◆ Claude Code (Java) v0.1.0-SNAPSHOT Type /help for commands • Ctrl+D to exit Provider: OPENAI Model: deepseek-chat API URL: https://api.deepseek.com Work Dir: D:\my-project Tools: 18 | Commands: 28 Terminal: windows-vtp (160×30) Tip: Tab to complete commands, ↑↓ to browse history, Ctrl+D to exit ❯ ``` ## 📖 使用说明 ### 对话 直接输入文本与 AI 对话,支持流式输出: ``` ❯ 帮我分析这个项目的架构 ``` ### 多行输入 行末加 `\` 续行: ``` ❯ 请帮我写一个函数,\ ... 实现字符串反转 ``` ### 斜杠命令 #### 基础命令 | 命令 | 别名 | 说明 | |------|------|------| | `/help` | | 显示所有可用命令 | | `/clear` | | 清屏 | | `/compact` | | AI 摘要压缩对话上下文 | | `/cost` | | 显示 Token 使用量和费用 | | `/model [name]` | | 查看/切换模型 | | `/status` | | 显示会话状态 | | `/context` | | 显示已加载的上下文 | | `/config` | | 查看配置信息 | | `/init` | | 初始化 CLAUDE.md 配置文件 | | `/history` | | 列出保存的对话历史 | | `/exit` | `/quit` | 退出 | #### P0 命令 | 命令 | 别名 | 说明 | |------|------|------| | `/diff` | | 显示 Git 变更(支持 `--staged`, `--stat`) | | `/version` | `/ver` | 显示版本和环境信息 | | `/skills` | | 列出已加载的技能 | | `/memory` | `/mem` | 查看/编辑 CLAUDE.md | | `/copy` | | 复制最近回复到剪贴板 | #### P1 命令 | 命令 | 别名 | 说明 | |------|------|------| | `/resume` | | 恢复已保存的对话 | | `/export` | | 导出对话为 Markdown 文件 | | `/commit` | | AI 生成 commit message 并提交 | #### P2 命令 | 命令 | 别名 | 说明 | |------|------|------| | `/hooks` | | 查看已注册的 Hook | | `/review` | `/rev` | AI 代码审查(支持 `--staged`、文件路径) | | `/stats` | | 使用统计(Token、费用、API调用、运行时长) | | `/branch` | | 对话分支(`save/load/list/delete`) | | `/rewind [n]` | | 回退对话历史(默认回退1轮) | | `/tag` | | 对话标签(`/list/goto `) | | `/security-review` | `/sec` | AI 安全漏洞审查 | | `/mcp` | | MCP 服务器管理(`connect/disconnect/tools/resources`) | | `/plugin` | | 插件管理(`load/unload/reload/info`) | ### 内置工具 AI 可以自动调用以下工具: #### 核心工具(Phase 1-3) | 工具 | 说明 | |------|------| | `bash` | 执行 Shell 命令 | | `file_read` | 读取文件内容 | | `file_write` | 写入文件 | | `file_edit` | 编辑文件(搜索替换) | | `glob` | 文件模式匹配搜索 | | `grep` | 文本内容搜索 | | `list_files` | 列出目录文件 | | `web_fetch` | 获取网页内容 | | `todo_write` | 管理待办事项 | | `agent` | 启动子 Agent 处理复杂任务 | | `notebook_edit` | 编辑 Jupyter Notebook | #### P0 工具 | 工具 | 说明 | |------|------| | `web_search` | DuckDuckGo 网络搜索(无需 API Key) | | `ask_user_question` | AI 向用户提问(暂停 agent loop 等待输入) | #### P2 工具 | 工具 | 说明 | |------|------| | `TaskCreate` | 创建后台任务 | | `TaskGet` | 查询任务详情 | | `TaskList` | 列出任务(支持状态过滤) | | `TaskUpdate` | 更新任务状态和结果 | | `Config` | 读写配置值 | | `mcp__*` | MCP 远程工具桥接(动态注册) | ### CLAUDE.md 记忆文件 创建 `CLAUDE.md` 文件来给 AI 提供项目上下文: ```markdown # 项目说明 这是一个 Spring Boot 项目,使用 MyBatis 做数据持久化。 # 编码规范 - 使用中文注释 - 遵循阿里巴巴 Java 开发手册 ``` 加载顺序(优先级递增): 1. `~/.claude/CLAUDE.md` — 全局配置 2. 项目根目录 `CLAUDE.md` — 项目级配置 3. 当前目录 `CLAUDE.md` — 目录级配置 ### Skills 技能系统 在以下目录放置 `.md` 文件作为技能: - `~/.claude/skills/` — 全局技能 - `.claude/skills/` — 项目技能 - `.claude/commands/` — 自定义命令技能 技能文件支持 YAML frontmatter: ```markdown --- name: code-review description: 代码审查技能 --- 请按照以下标准审查代码: 1. 命名规范 2. 错误处理 3. 性能考量 ``` ### MCP 服务器集成 配置 MCP 服务器,在项目根目录创建 `.mcp.json`: ```json { "servers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"] }, "my-server": { "command": "python", "args": ["my_mcp_server.py"], "env": { "API_KEY": "xxx" } } } } ``` 或放在全局目录 `~/.claude-code-java/mcp.json`。 使用 `/mcp` 命令管理: ``` ❯ /mcp # 列出所有 MCP 服务器 ❯ /mcp tools # 列出所有 MCP 工具 ❯ /mcp connect myserver cmd args # 连接新服务器 ❯ /mcp disconnect myserver # 断开服务器 ``` ### 插件系统 JAR 插件放在以下目录即可自动加载: - `~/.claude-code-java/plugins/` — 全局插件 - `.claude-code/plugins/` — 项目级插件 JAR 要求: - `META-INF/MANIFEST.MF` 中包含 `Plugin-Class` 属性 - 实现 `com.claudecode.plugin.Plugin` 接口 使用 `/plugin` 命令管理: ``` ❯ /plugin # 列出已加载插件 ❯ /plugin info output-style # 查看插件详情 ❯ /plugin unload my-plugin # 卸载插件 ``` ### Vim 模式 设置环境变量启用 JLine vi 编辑模式: ```bash export CLAUDE_CODE_VIM=1 ``` 启用后 Banner 会显示 `[vim]` 标识,输入行支持 vi 按键绑定。 ### Hook 系统 通过代码注册 Hook 来拦截工具调用: ```java agentLoop.getHookManager().register(HookManager.HookType.PRE_TOOL_USE, new Hook() { public String name() { return "my-hook"; } public int priority() { return 10; } public HookResult execute(HookContext ctx) { // 可检查 ctx.getToolName(), ctx.getArguments() // 返回 ABORT 可阻止工具执行 return HookResult.CONTINUE; } }); ``` 4 种钩子类型:`PRE_TOOL_USE`、`POST_TOOL_USE`、`PRE_PROMPT`、`POST_RESPONSE` ## 🏗️ 架构设计 ### 模块结构 ``` com.claudecode ├── ClaudeCodeApplication // Spring Boot 主入口 ├── cli/ │ └── ClaudeCodeRunner // 启动编排(CommandLineRunner) ├── config/ │ └── AppConfig // Bean 装配、Provider 切换、组件注册 ├── core/ │ ├── AgentLoop // Agent 循环(阻塞 + 流式 + Hook集成) │ ├── TokenTracker // Token 使用追踪 │ ├── ConversationPersistence // 对话持久化 │ ├── HookManager // Hook 系统(4种钩子类型) │ └── TaskManager // 后台任务管理 ├── tool/ │ ├── Tool // 工具协议接口 │ ├── ToolRegistry // 工具注册中心 │ ├── ToolCallbackAdapter // Spring AI 适配器 │ └── impl/ // 18 个工具实现 │ ├── BashTool, FileReadTool, FileWriteTool, FileEditTool │ ├── GlobTool, GrepTool, ListFilesTool, WebFetchTool │ ├── TodoWriteTool, AgentTool, NotebookEditTool │ ├── WebSearchTool, AskUserQuestionTool │ ├── TaskCreateTool, TaskGetTool, TaskListTool, TaskUpdateTool │ ├── ConfigTool │ └── McpToolBridge // MCP 远程工具桥接 ├── command/ │ ├── SlashCommand // 命令接口 │ ├── CommandRegistry // 命令注册中心 │ └── impl/ // 28 个命令实现 ├── console/ │ ├── BannerPrinter // 启动 Banner │ ├── ToolStatusRenderer // 工具状态渲染 │ ├── ThinkingRenderer // Thinking 渲染 │ ├── SpinnerAnimation // 加载动画 │ ├── MarkdownRenderer // Markdown 渲染(含语法高亮) │ ├── DiffRenderer // 彩色 Diff 渲染 │ ├── StatusLine // 底部状态行 │ └── AnsiStyle // ANSI 样式工具 ├── context/ │ ├── SystemPromptBuilder // 系统提示词构建 │ ├── ClaudeMdLoader // CLAUDE.md 加载 │ ├── SkillLoader // Skills 加载 │ └── GitContext // Git 上下文收集 ├── mcp/ │ ├── McpClient // MCP 客户端(JSON-RPC 2.0) │ ├── McpTransport // 传输层接口 │ ├── StdioTransport // StdIO 传输实现 │ ├── McpManager // 多服务器管理 │ └── McpException // MCP 异常 ├── plugin/ │ ├── Plugin // 插件接口 │ ├── PluginContext // 插件上下文 │ ├── PluginManager // 插件加载/管理 │ └── OutputStylePlugin // 内置输出样式插件 └── repl/ ├── ReplSession // REPL 会话管理 └── ClaudeCodeCompleter // Tab 补全 ``` ### 核心流程 ``` 用户输入 → 命令检测 → AgentLoop ↓ chatModel.stream(prompt) → Flux ↓ 逐token实时输出到终端 ↓ 检测工具调用 → PreToolUse Hook → 权限确认 → 执行工具 → PostToolUse Hook → 结果回传 ↓ 继续循环或结束 ``` ### MCP 协议架构 ``` McpManager ─── 配置加载 (.mcp.json) │ ├── McpClient("server-a") ── StdioTransport ── 子进程 (npx server-a) │ ├── tools/list → 发现工具 │ ├── tools/call → 调用工具 │ └── resources/read → 读取资源 │ └── McpClient("server-b") ── StdioTransport ── 子进程 (python server-b) └── ... (同上) McpToolBridge → 将 MCP 工具映射为本地 Tool → 注册到 ToolRegistry → AI 可调用 ``` ### 插件系统架构 ``` PluginManager ├── 全局插件: ~/.claude-code-java/plugins/*.jar ├── 项目插件: .claude-code/plugins/*.jar └── 内置插件: OutputStylePlugin │ ├── Plugin.getTools() → 注册到 ToolRegistry └── Plugin.getCommands() → 注册到 CommandRegistry ``` ### 双 API 提供者架构 ``` ┌─ openAiChatModel ──── OpenAI / DeepSeek / Azure CLAUDE_CODE_PROVIDER─┤ └─ anthropicChatModel ── Anthropic Claude ``` 通过 `claude-code.provider` 配置决定使用哪个 `ChatModel` Bean。 ## ⚙️ 配置参考 ### application.yml ```yaml spring: ai: anthropic: api-key: ${AI_API_KEY:} base-url: ${AI_BASE_URL:https://api.anthropic.com} chat.options.model: ${AI_MODEL:claude-sonnet-4-20250514} openai: api-key: ${AI_API_KEY:} base-url: ${AI_BASE_URL:https://api.openai.com} chat.options.model: ${AI_MODEL:gpt-4o} claude-code: provider: ${CLAUDE_CODE_PROVIDER:openai} ``` ### 环境变量 | 变量 | 必须 | 说明 | 默认值 | |------|------|------|--------| | `AI_API_KEY` | ✅ | API 密钥 | - | | `CLAUDE_CODE_PROVIDER` | ❌ | 提供者 (`openai`/`anthropic`) | `openai` | | `AI_BASE_URL` | ❌ | API 基础 URL | 按提供者不同 | | `AI_MODEL` | ❌ | 模型名称 | 按提供者不同 | | `AI_MAX_TOKENS` | ❌ | 最大 Token 数 | `8096` | | `CLAUDE_CODE_VIM` | ❌ | 启用 Vim 编辑模式 | `0` | ## 🔧 开发 ### 构建 ```bash mvn clean compile ``` ### 打包 ```bash mvn clean package -DskipTests java -jar target/claude-code-java-0.1.0-SNAPSHOT.jar ``` ### 已知问题 - **Windows 编码**:需要 `chcp 65001` 切换到 UTF-8 编码页(启动脚本已自动处理) - **IDE 终端**:IntelliJ IDEA 等 IDE 内置终端为 dumb 模式,Tab 补全和行编辑受限 - **JDK 25 警告**:Maven 的 jansi/guava 会触发 native access 警告(启动脚本已通过 MAVEN_OPTS 抑制) ## 📝 对应关系 | Claude Code (TypeScript) | Java 实现 | 说明 | |--------------------------|-----------|------| | `cli.tsx` → `main.tsx` | `ClaudeCodeApplication` + `ClaudeCodeRunner` | 入口 | | `REPL.tsx` | `ReplSession` + JLine 3 | 交互循环 | | `query.ts` | `AgentLoop` | Agent 循环 | | `Tool.ts` + `tools/*` | `Tool` 接口 + `impl/*` (18个) | 工具系统 | | `commands.ts` | `SlashCommand` + `impl/*` (28个) | 命令系统 | | `context.ts` + `prompts.ts` | `SystemPromptBuilder` + loaders | 上下文 | | `CLAUDE.md` + `skills/` | `ClaudeMdLoader` + `SkillLoader` | 记忆/技能 | | Ink Components | `console/*` 渲染器 (8个) | 终端 UI | | `mcp/*` (22文件) | `mcp/*` (McpClient/Manager/Transport) | MCP 协议 | | `plugins/*` (38文件) | `plugin/*` (Plugin/Manager/Context) | 插件系统 | | `hooks/*` | `HookManager` | Hook 系统 | | `tasks/*` | `TaskManager` + Task工具 | 任务管理 | ## 📄 License 本项目仅用于学习和研究目的。