Skip to content

malinkang/Nexora

 
 

Repository files navigation

Nexora Logo

基于 Claude Code 的多 Agent 协作工作站

Version License

Nexora 是一个现代化的 AI 协作平台,通过频道(Channel)驱动多个 Agent 协同工作,帮助团队高效完成复杂任务。


📸 界面预览

统计仪表板

统计仪表板

实时查看 Token 使用量、费用统计、Agent 活跃度和任务状态。

Agent 预设库

Agent 预设

191 个预设 Agent 角色,涵盖设计、工程、产品、运营等多个领域。

频道协作

频道对话

多 Agent 在频道中实时协作,通过 @mention 调用,支持任务编排和委托。


✨ 核心特性

🤝 多 Agent 协作

  • 频道驱动:每个频道独立上下文,支持多人多 Agent 实时协作
  • 角色分工:PM、程序员、测试等专业角色,各司其职
  • 智能路由:通过 @mention 或自动推理分配任务给合适的 Agent

🔌 飞书集成

  • 双向同步:飞书群消息自动进入 Nexora,Agent 回复自动推送飞书
  • 无缝协作:在飞书中 @机器人 即可触发 Agent,无需切换工具
  • 群聊同步:支持多个飞书群绑定不同频道

📁 项目沙箱

  • 目录隔离:每个频道可绑定项目目录,Agent 操作受限于该目录
  • 上下文注入:自动加载项目的 CLAUDE.mdPROJECT.md
  • 安全边界:防止 Agent 访问项目外的敏感文件

💾 零依赖存储

  • 纯文件系统:JSONL + Markdown + YAML,无需数据库
  • 易于备份:所有数据可直接用 Git 管理
  • 透明可读:文件格式清晰,便于调试和审计

⚡ 可选增强功能

  • 任务规划:复杂任务自动拆解为子任务
  • 推理路由:LLM 智能判断最佳 Agent 人选
  • 反思系统:Agent 自动沉淀技能和经验

🚀 快速开始

前置要求

安装

# 克隆仓库
git clone https://github.com/xuliuzhe/Nexora.git
cd Nexora

# 安装依赖
bun install

注意:首次克隆后,agents/data/ 目录是空的(已在 .gitignore 中)。系统会在启动时自动创建默认频道 #all

启动

# 启动后端(端口 3000)
bun run dev

# 启动前端(端口 5173,新开终端)
bun run dev:web

访问 http://localhost:5173 即可开始使用 🎉


📖 使用指南

创建频道

  1. 点击侧边栏 Channels 旁的 + 按钮
  2. 填写频道名称(如 #frontend
  3. 选择要加入的 Agent 成员
  4. (可选)绑定项目目录和飞书群

创建 Agent

  1. 点击侧边栏 Agents 旁的 + 按钮
  2. 填写基本信息:
    • Name:Agent 标识符(英文,如 coder
    • Display Name:显示名称(如 程序员
    • Description:简短描述
    • Model:执行层级(cheap/standard/expensive)
  3. 选择 Tools(Read、Edit、Write、Bash、Glob、Grep)
  4. 编辑 AGENT.md 定义角色指令

与 Agent 对话

方式 1:@mention

@coder 帮我修复登录页面的 bug

方式 2:多 Agent 链式调用

@coder 修复完后 @tester 跑一下测试

方式 3:DM(私聊)

  • 创建 DM 频道,直接对话无需 @

任务模式

勾选 "As Task" 或使用链式关键词(然后/之后/完成后)自动创建任务:

@coder 实现用户登录功能,完成后 @tester 写测试用例

系统会自动拆解为:

  1. Task #1:实现用户登录功能(指派给 coder)
  2. Task #2:写测试用例(指派给 tester,依赖 #1)

🔧 配置

增强功能(可选)

访问 http://localhost:5173/settings 配置以下功能:

功能 说明 需要配置
任务规划 自动拆解复杂任务为子任务 cheap 模型
推理路由 LLM 智能分配 Agent cheap 模型
反思系统 Agent 自动提取技能和记忆 cheap 模型

配置示例

在设置页面填入:

  • Provider: openai-compatanthropic
  • Model: gpt-4o-miniclaude-haiku-4-5
  • API Key: 你的密钥
  • Base URL: (可选)自定义 API 地址

飞书集成

1. 安装 lark-cli

npm install -g @larksuite/cli
npx skills add larksuite/cli -y -g

2. 配置飞书应用

# 初始化并创建应用
lark-cli config init

# 登录授权
lark-cli auth login --recommend

3. 飞书开放平台配置

  1. 进入 飞书开放平台
  2. 选择你的应用 → 事件订阅
  3. 订阅方式选择:使用长连接接收事件
  4. 添加事件:im.message.receive_v1
  5. 开通权限:im:message:receive_as_bot

4. 绑定频道

在 Nexora 频道设置中填入:

  • 飞书群 ID(群设置 → 群管理中获取,格式如 oc_xxxxxxxx

重启服务后生效。在飞书群中 @机器人 发送消息即可触发 Agent。


📂 项目结构

nexora/
├── packages/
│   ├── server/          # 后端服务(Hono)
│   │   ├── src/
│   │   │   ├── services/     # AgentRunner + ChannelService
│   │   │   ├── storage/      # JSONL 文件存储
│   │   │   ├── feishu/       # 飞书集成
│   │   │   └── routes/       # HTTP API + WebSocket
│   ├── web/             # 前端 SPA(React 19 + Vite)
│   └── shared/          # 共享类型(Zod schemas)
├── agents/              # Agent 定义(YAML + Markdown)
├── data/                # 运行时数据
│   ├── channels/        # 频道消息(JSONL)
│   ├── tasks/           # 任务列表(JSONL)
│   ├── memory/          # 全局记忆(Markdown)
│   └── system/          # 系统设置(JSON)
└── .nexora/             # 废弃(配置已迁移到前端)

🛠️ 开发

常用命令

bun run dev          # 启动后端
bun run dev:web      # 启动前端
bun run test         # 运行测试(386 个测试)
bun run typecheck    # TypeScript 类型检查
bun run lint         # Biome lint + format
bun run check        # 完整质量门禁:lint + typecheck + test

运行单个测试

cd packages/server
bun test src/services/dispatcher.test.ts

添加新 Agent

创建 agents/<name>/ 目录:

agents/my_agent/
├── agent.yaml       # 配置
├── AGENT.md         # 角色指令
└── memory/
    └── MEMORY.md    # Agent 个人记忆

agent.yaml 示例:

name: my_agent
displayName: 我的 Agent
description: Agent 简短描述
model: cheap
tools:
  - Read
  - Edit
  - Write
  - Bash
  - Glob
  - Grep
skills: []

AGENT.md 示例:

你是一个专业的代码审查员,负责检查代码质量和规范。

## 工作流程

1. 阅读代码文件
2. 检查命名规范、注释完整性、边界处理
3. 输出审查报告

## 注意事项

- 重点关注安全漏洞(SQL 注入、XSS、命令注入)
- 代码风格参考项目根目录的 `.editorconfig`

重启服务自动加载(访问 http://localhost:5173/settings 点击"重启服务")。

提示:查看 agents/EXAMPLES.md 获取更多示例。


🏗️ 架构设计

消息流

用户消息 → ChannelService → dispatchMessage()
                              ↓
                     路由规则(mention/dm/infer)
                              ↓
                     executeAgentCore()
                              ↓
                     Claude Agent SDK → Claude Code
                              ↓
                     回复写入频道 → WebSocket 广播

路由优先级

  1. @mention:显式指定目标 Agent
  2. DM 频道:固定目标(dmAgent
  3. 推理路由(可选):LLM 智能选择
  4. 兜底:频道第一个成员

Agent 执行层

每次执行调用 @anthropic-ai/claude-agent-sdkquery() 函数:

  • permissionMode: bypassPermissions(自动通过权限)
  • tools: Claude Code 内置工具(Read、Edit、Write、Bash、Glob、Grep)
  • cwd: 频道绑定的 projectDir
  • maxTurns: 普通聊天 5 轮,委托任务 20 轮,Task 模式 30 轮

存储设计

原则:文件即数据库,Git 即备份。

  • JSONL:频道消息、任务列表(第一行 _meta 存元数据)
  • Markdown:记忆系统(§ 分隔条目)
  • YAML:Agent 定义、技能定义
  • JSON:系统设置(单例文件)

所有写操作带文件锁,保证并发安全。


🧪 测试

bun test
# 386 pass, 0 fail, 744 expect() calls

测试覆盖:

  • 单元测试:services/, storage/, agent/
  • 集成测试:routes/, feishu/
  • 边界测试:空输入、并发写入、文件锁

🐛 常见问题

Q: 启动后访问前端空白?

A: 检查:

  1. 后端是否在 3000 端口运行(lsof -i :3000
  2. 前端是否正确 proxy 到 3000(vite.config.ts
  3. 浏览器控制台是否有错误

Q: 飞书消息没有同步?

A: 检查:

  1. lark-cli auth status 是否已登录
  2. 飞书应用是否开启长连接事件订阅
  3. 频道是否正确绑定 chatId
  4. 群聊是否 @了机器人(群聊需要 @触发)

Q: Agent 无法访问文件?

A: 如果频道绑定了 projectDir,Agent 只能访问该目录内文件。检查:

  1. 文件路径是否在 projectDir
  2. projectDir 路径是否正确(绝对路径)
  3. 是否有读写权限

Q: 增强功能不生效?

A: 检查:

  1. 前端 /settings 是否已开启对应开关
  2. 是否配置了对应的 LLM(cheap 模型)
  3. 是否重启了服务(配置修改后需重启)

Q: 如何清空所有数据?

A: 删除 data/ 目录后重启服务:

rm -rf data/
bun run dev

系统会自动创建默认频道 #all


🤝 贡献

欢迎提交 Issue 和 Pull Request!

开发规范

  • 文件行数 ≤ 300,函数行数 ≤ 50
  • 认知复杂度 ≤ 15,函数参数 ≤ 4
  • TDD:先写失败测试 → 实现 → 确认通过
  • YAGNI:不为假设需求建抽象

详见 CLAUDE.md


📄 许可证

MIT License


🙏 致谢


Made with ❤️ by Nexora Team

About

一个多agent合作平台

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 86.9%
  • HTML 10.6%
  • Python 1.9%
  • Other 0.6%