Commit cabfef8f47a353d2333213cbee2adf105f914c37
1 parent
0361d10f
docs(claude-md): rewrite to reflect dual server entrypoints + LemonBoss/ArenaSK split
- Fix port to 3010 (was 3000); both server/index.js and server/agent-server.js default to 3010 per config.js - Document the two server entrypoints: index.js (full ArenaSK, run via npm run dev) vs agent-server.js (Agent Chat only, run via start.sh) - Correct counts: 15 routes (not 11), 26 services (not 16), 10 views (not 21) - Remove false 'skills/' top-level dir reference; document actual data/skills/ - Add full test/example/log npm scripts; auto-dev CLI bin; packages list - Add note on body-sanitizer middleware (the source of the JSON warning) - Add brand history note (ArenaSK → LemonBoss) - Keep existing Agentic Self-Correction Loop Prevention warning verbatim Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Showing
1 changed file
with
81 additions
and
49 deletions
CLAUDE.md
| ... | ... | @@ -4,95 +4,127 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co |
| 4 | 4 | |
| 5 | 5 | ## 项目概述 |
| 6 | 6 | |
| 7 | -ArenaSK — AI Skill 竞技平台 + 多智能体自主开发系统。使用 Node.js + Claude CLI 实现 Skill 的创建、评测、进化和管理。 | |
| 7 | +LemonBoss / ArenaSK — 多智能体自主开发系统 + AI Skill 竞技平台。Node.js + Claude CLI 驱动,提供 Agent 协作(公司 / OKR / 招聘 / Pipeline / Task Timeline)与 Skill 市场 / Arena 评测两套能力。 | |
| 8 | + | |
| 9 | +> 品牌历史:项目早期叫 ArenaSK(Skill 竞技场),现演进为 LemonBoss(多 Agent 公司体)。两个名称在代码中并存属正常现象。 | |
| 8 | 10 | |
| 9 | 11 | ## 快速启动 |
| 10 | 12 | |
| 11 | 13 | ```bash |
| 12 | -# 安装 | |
| 13 | -npm install && cd server && npm install && cd ../web && npm install | |
| 14 | +# 一次性安装 + 拷贝 .env.example | |
| 15 | +npm run setup | |
| 14 | 16 | |
| 15 | -# 开发模式 (前后端分离) | |
| 16 | -npm run dev | |
| 17 | -# 后端: localhost:3000 | 前端: localhost:5173 | |
| 17 | +# 开发模式(前后端分离,跑完整 ArenaSK + LemonBoss) | |
| 18 | +npm run dev # 后端 server/index.js:3010 + 前端 vite:5173 | |
| 18 | 19 | |
| 19 | -# 生产启动 | |
| 20 | -bash start.sh | |
| 20 | +# 仅 Agent Chat 子系统(轻量,不依赖 Skill DB) | |
| 21 | +bash start.sh # server/agent-server.js:3010 + vite:5173 | |
| 21 | 22 | ``` |
| 22 | 23 | |
| 24 | +> 端口默认 **3010**(`server/config.js`),不是 3000。`start.sh` 会先 kill 占用 3010 / 5173 的进程。 | |
| 25 | + | |
| 23 | 26 | ## 常用命令 |
| 24 | 27 | |
| 25 | 28 | ```bash |
| 26 | -npm run dev # 启动后端 + 前端 (开发) | |
| 27 | -npm run server:dev # 仅后端 (localhost:3000) | |
| 28 | -npm run web # 仅前端 (localhost:5173, proxy→3000) | |
| 29 | -npm run web:build # 编译前端 → web/dist/ | |
| 30 | -npm test # 运行 vitest | |
| 31 | -npm run skills:sync # 同步 Skill 到 CLI 配置目录 | |
| 29 | +# 启动 | |
| 30 | +npm run dev # 后端 + 前端 | |
| 31 | +npm run server / server:dev # 仅后端 (start / --watch) | |
| 32 | +npm run web / web:build # 前端开发 / 构建到 web/dist/ | |
| 33 | + | |
| 34 | +# 测试 | |
| 35 | +npm test # vitest watch | |
| 36 | +npm run test:unit # vitest run (CI 用) | |
| 37 | +npm run test:multi-cli # multi-CLI 集成测试 | |
| 38 | +npm run test:browser-logger | |
| 39 | +npm run test:design-validator | |
| 40 | + | |
| 41 | +# CLI / 工具 | |
| 42 | +npm run example # 单次 auto-dev:实现斐波那契 | |
| 43 | +npm run example-bmi # 单次 auto-dev:BMI 程序 | |
| 44 | +npm run logs / analyze / parse # 查看 / 分析 / 解析 Agent 运行日志 | |
| 45 | +npm run skills:sync # 同步 Skill 到 Claude CLI 配置目录 | |
| 46 | +auto-dev "<task>" # bin 入口 → server/src/cli/auto-dev.js | |
| 32 | 47 | ``` |
| 33 | 48 | |
| 34 | 49 | ## 架构 |
| 35 | 50 | |
| 36 | 51 | ### 技术栈 |
| 37 | -- **后端**: Node.js + Express + WebSocket + SQLite (better-sqlite3) | |
| 38 | -- **前端**: Vue 3 + Vite + vue-router + vue-i18n (6 语言) | |
| 39 | -- **数据**: SQLite FTS5 全文搜索, 无 PostgreSQL | |
| 40 | -- **AI**: Claude CLI (本地进程) | |
| 41 | -- **包管理**: pnpm workspace (monorepo) | |
| 52 | +- **后端**:Node.js (≥18) + Express + WebSocket + SQLite(better-sqlite3, FTS5) | |
| 53 | +- **前端**:Vue 3 + Vite + vue-router + vue-i18n | |
| 54 | +- **AI**:Claude CLI(本地子进程,`--dangerously-skip-permissions` 自动批准) | |
| 55 | +- **包管理**:pnpm workspace(monorepo),`package.json` 含 `module-alias: { "@server": "server" }` | |
| 56 | + | |
| 57 | +### 两个 Server 入口(重要) | |
| 58 | + | |
| 59 | +| 入口 | 端口 | 启动方式 | 挂载路由 | | |
| 60 | +|------|------|----------|----------| | |
| 61 | +| `server/index.js` | 3010 | `npm run dev`, `npm run server` | 全量:`/api/claude-chat` `/api/config` `/api/evolution` `/api/innovator` `/api/master` `/api/open` `/api/arena` `/api/auth` `/api/users` `/api/whatsapp` `/api/agent` `/api/goals` `/api/company` `/api/tasks`,WS `/ws/claude`,`NODE_ENV=production` 时托管 `web/dist/` 静态文件 | | |
| 62 | +| `server/agent-server.js` | 3010 | `bash start.sh` | 仅 LemonBoss 子集:`/api/agent` `/api/company` `/api/goals` `/api/tasks` | | |
| 42 | 63 | |
| 43 | -### 目录结构 | |
| 64 | +两者**不要同时启动**(端口冲突)。需要 Skill / Arena / Master Agent 时跑 `index.js`;只调通 Agent Chat / Company / OKR 时跑 `agent-server.js`。 | |
| 65 | + | |
| 66 | +### 目录速查 | |
| 44 | 67 | |
| 45 | 68 | | 目录 | 说明 | |
| 46 | 69 | |------|------| |
| 47 | -| `server/index.js` | Express 入口 (API + WS + Plugin) | | |
| 48 | -| `server/routes/` | 11 个 API 路由模块 | | |
| 49 | -| `server/services/` | 16 个业务服务 (skill-db, job-manager 等) | | |
| 50 | -| `server/src/core/` | 核心引擎 (orchestrator, master-session, agent-manager) | | |
| 51 | -| `server/src/plugins/` | 插件系统 (PluginManager, channel monitor) | | |
| 52 | -| `web/src/views/` | 21 个 Vue 页面组件 | | |
| 53 | -| `skills/` | 系统级 Skill 定义 (19 个) | | |
| 54 | -| `scripts/` | 运维脚本 | | |
| 55 | -| `packages/` | 子包 (acp-core, evolution 等) | | |
| 70 | +| `server/index.js` | 完整 ArenaSK 服务(API + WS + 插件 + 前端托管) | | |
| 71 | +| `server/agent-server.js` | 独立 Agent Chat 服务(LemonBoss 子集) | | |
| 72 | +| `server/routes/` | 15 个 API 路由 | | |
| 73 | +| `server/services/` | 26 个业务服务(skill-db, benchmark-runner, company-service, heartbeat, pipeline-service, retrain-pipeline, …) | | |
| 74 | +| `server/src/core/` | Agent 引擎核心(orchestrator, master-session, agent-manager, scheduler, session-pool, prompt-builder, runtime-resolver, …) | | |
| 75 | +| `server/src/engine/` | 进程层(command-queue, idle-timer, process-guard, run-registry, failover-error) | | |
| 76 | +| `server/src/plugins/` | 插件系统(plugin-manager, agent-bridge, config-bridge, bootstrap) | | |
| 77 | +| `server/src/tools/` | Master Agent 可调用的工具(call-agent, marketplace, orchestrate, train-skill, …) | | |
| 78 | +| `web/src/views/` | 10 个页面:AgentChat, AgentList, CompanyDashboard, JobsPanel, OkrDashboard, PipelineEditor, QuotaMonitor, SkillsMarket, TaskTimeline, TemplateAgents | | |
| 79 | +| `packages/` | `acp-core`, `agent-core`, `evolution`, `plugin-bootstrap` | | |
| 80 | +| `data/skills/` | Skill 仓库(代码外部目录,路径由 `config.skillsDataDir` 控制) | | |
| 81 | +| `scripts/` | 运维脚本(含 `sync-skills.js`) | | |
| 82 | +| `docs/` | 设计文档(`LEMONBOSS-SYSTEM-DESIGN.md`, `architecture-v5.md`, `open-api-manual.md`, `system-design/`, `user-guides/` …) | | |
| 56 | 83 | |
| 57 | 84 | ### 关键 API 路由 |
| 58 | 85 | |
| 59 | 86 | | 路径 | 说明 | |
| 60 | 87 | |------|------| |
| 61 | -| `/api/open/skills` | Open API: Skill 搜索/下载 | | |
| 62 | -| `/api/open/arena/leaderboard` | Arena 排行榜 | | |
| 63 | -| `/api/innovator/skills` | Skill 管理 (Admin) | | |
| 64 | -| `/api/master/chat` | Master Agent 对话 (SSE) | | |
| 65 | -| `/api/auth/*` | 认证 (JWT + GitHub OAuth) | | |
| 66 | -| `/ws/claude` | Claude 对话 (WebSocket) | | |
| 67 | - | |
| 68 | -### 数据存储 | |
| 69 | - | |
| 70 | -- `data/skills/` — 27,000+ Skill 目录 | |
| 71 | -- `data/skills.sqlite` — Skill 主数据库 (FTS5) | |
| 88 | +| `/api/open/skills` | Open API: Skill 搜索 / 下载(FTS5) | | |
| 89 | +| `/api/open/arena/leaderboard` | Arena ELO 排行榜 | | |
| 90 | +| `/api/innovator/skills` | Skill 管理(Admin) | | |
| 91 | +| `/api/master/chat` | Master Agent 对话(SSE) | | |
| 92 | +| `/api/agent/*` | LemonBoss Agent Chat | | |
| 93 | +| `/api/company/*` `/api/goals/*` `/api/tasks/*` | 公司 / OKR / Task 管理 | | |
| 94 | +| `/api/auth/*` | JWT + GitHub OAuth | | |
| 95 | +| `/ws/claude` | Claude 实时对话(仅 `index.js`) | | |
| 96 | +| `/api/health` `/api/plugins` | 健康检查 / 插件状态 | | |
| 97 | + | |
| 98 | +### 数据存储(SQLite,无需 PostgreSQL) | |
| 99 | + | |
| 100 | +- `data/skills/` — Skill 目录(数万条) | |
| 101 | +- `data/skills.sqlite` — Skill 主库 + FTS5 | |
| 72 | 102 | - `data/benchmark.sqlite` — Benchmark 运行数据 |
| 73 | 103 | - `data/users.sqlite` — 用户数据 |
| 104 | +- `data/trained_skills/` — 用户训练产物(按 userId 隔离) | |
| 105 | +- `server/conversations/` — 会话持久化 | |
| 74 | 106 | |
| 75 | 107 | ### 配置文件 |
| 76 | 108 | |
| 77 | 109 | | 文件 | 说明 | |
| 78 | 110 | |------|------| |
| 79 | -| `.env` | 环境变量 (密钥、目录、CORS) | | |
| 80 | -| `server/config.js` | 服务器配置 | | |
| 111 | +| `.env` | 端口、CORS、`OPEN_API_KEYS`、各类目录覆盖;由 `npm run setup` 从 `.env.example` 生成 | | |
| 112 | +| `server/config.js` | 端口(默认 3010)、CORS、Skill / Conversations 路径 | | |
| 81 | 113 | | `server/config/taxonomy.js` | 三维标签分类 | |
| 82 | 114 | |
| 83 | 115 | ## 注意事项 |
| 84 | 116 | |
| 85 | -- 数据库使用 SQLite (better-sqlite3),无需 PostgreSQL | |
| 86 | -- 生产环境 Express 同时提供 API 和 `web/dist/` 静态文件 | |
| 87 | -- `start.sh` 一键启动: 同步 Skill → 编译前端 → 启动 Server → 启动 Bot | |
| 88 | -- Claude CLI 使用 `--dangerously-skip-permissions` 自动批准模式 | |
| 89 | -- Skill 目录在 `data/skills/`(代码仓库外部),通过 `config.skillsDataDir` 配置 | |
| 117 | +- 生产环境只跑 `server/index.js`:它会同时托管 API + `web/dist/` 静态文件(`NODE_ENV=production`)。 | |
| 118 | +- `start.sh` **只**做:kill 端口 → 起 `agent-server.js` → 起 `vite`。**不**会自动 `skills:sync` / `web:build` / 起 bot —— 那些要单独跑。 | |
| 119 | +- `server/index.js` 与 `agent-server.js` 都内置了 **body-sanitizer 中间件**:在 `express.json()` 之前清掉 `\x00-\x1F` 控制字符,避免外部 Agent 通过 `curl` 传未转义换行/制表符导致的 `Bad control character` 报错。修改请求体解析链路前先看这两段。 | |
| 120 | +- 模块别名 `@server` → `server/`(`module-alias` 注册),跨子包 require 时可用。 | |
| 121 | +- Claude CLI 进程默认带 `--dangerously-skip-permissions`,写入受限路径前自己评估风险。 | |
| 90 | 122 | |
| 91 | 123 | > [!WARNING] (Agentic Self-Correction Loop Prevention) |
| 92 | 124 | > **Master Agent 必读**: 你目前存在一个已知的底层 Tool Calling JSON 解析缺陷。当你试图在 `Bash` tool 中使用带有多重双引号的复杂命令(例如 `curl -d '{"id":"lemonv", "name":"Lemonv"}'`)时,你的 JSON 转义会崩溃并导致你陷入"修复格式"的无限死循环,最终进程会被强制终止退出 (code=143)。 |
| 93 | -> **解决方案**: | |
| 125 | +> **解决方案**: | |
| 94 | 126 | > 任何需要提交复杂 Payload (如 JSON) 的操作,**绝对禁止**直接在 `Bash` 的 command 参数里写 inline JSON 字符串。 |
| 95 | 127 | > 如果你要创建公司或执行类似 API 请求,**必须先通过写入简单的 shell 脚本将 JSON 写入一个 /tmp/ 目录下的 `.json` 文件(确保你的 JSON 是单行紧凑格式/严格转义换行符,不要包含真回车换行 `\n`,以免引起 SyntaxError: Bad control character 崩溃),然后再通过 `curl -d @/tmp/payload.json` 发送。** |
| 96 | -> | |
| 128 | +> | |
| 97 | 129 | > 【创建公司/招聘的正确方式示例】 |
| 98 | 130 | > 创建 /tmp/lemonv.json,然后执行 `Bash`: `curl -X POST http://localhost:3000/api/company/create -H "Content-Type: application/json" -d @/tmp/lemonv.json` | ... | ... |