diff --git a/server/routes/agent-chat.js b/server/routes/agent-chat.js
index 22e4a74..3cda97f 100644
--- a/server/routes/agent-chat.js
+++ b/server/routes/agent-chat.js
@@ -664,6 +664,13 @@ async function getOrCreateProtocol(agentId, convId) {
}
const protocol = new ClaudeCliProtocol({ name: identity.name }, cliOptions);
+
+ // 绑定错误监听器,防止 EventEmitter 抛出未捕获异常导致整个 Node 进程奔溃 (例如 spawn claude ENOENT)
+ protocol.on('error', (err) => {
+ console.error(`[AgentChat] 🚨 ${identity.name} 协议级异常:`, err.message);
+ sessions.delete(key); // 下次提问将重建进程
+ });
+
await protocol.connect(null, agentDir);
await protocol.initialize();
await protocol.newSession({ cwd: agentDir });
diff --git a/server/routes/company.js b/server/routes/company.js
index 0625088..1a47852 100644
--- a/server/routes/company.js
+++ b/server/routes/company.js
@@ -713,7 +713,7 @@ router.get('/:companyId/status', (req, res) => {
const heartbeatService = require('../services/heartbeat-service');
const path = require('path');
const fs = require('fs');
- const DATA_DIR = path.resolve(__dirname, '../../data');
+ const DATA_DIR = path.resolve(__dirname, '../../data/companies');
// 计算运行时长
const uptimeMs = company.status === 'running' && company.startedAt
@@ -776,7 +776,7 @@ router.put('/:companyId/agents/:agentId/heartbeat', (req, res) => {
const { intervalMinutes, enabled } = req.body;
const path = require('path');
const fs = require('fs');
- const DATA_DIR = path.resolve(__dirname, '../../data');
+ const DATA_DIR = path.resolve(__dirname, '../../data/companies');
const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json');
if (!fs.existsSync(configPath)) {
@@ -816,7 +816,7 @@ router.post('/:companyId/agents/:agentId/heartbeat/start', (req, res) => {
try {
const path = require('path');
const fs = require('fs');
- const DATA_DIR = path.resolve(__dirname, '../../data');
+ const DATA_DIR = path.resolve(__dirname, '../../data/companies');
const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json');
if (!fs.existsSync(configPath)) {
@@ -846,7 +846,7 @@ router.post('/:companyId/agents/:agentId/heartbeat/stop', (req, res) => {
try {
const path = require('path');
const fs = require('fs');
- const DATA_DIR = path.resolve(__dirname, '../../data');
+ const DATA_DIR = path.resolve(__dirname, '../../data/companies');
const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json');
if (!fs.existsSync(configPath)) {
@@ -883,7 +883,7 @@ router.get('/:companyId/agents/:agentId/skills', (req, res) => {
try {
const path = require('path');
const fs = require('fs');
- const DATA_DIR = path.resolve(__dirname, '../../data');
+ const DATA_DIR = path.resolve(__dirname, '../../data/companies');
const skillsDir = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'skills');
if (!fs.existsSync(skillsDir)) {
diff --git a/start.sh b/start.sh
index c602800..0be7ee7 100755
--- a/start.sh
+++ b/start.sh
@@ -5,6 +5,10 @@
set -e
+# Load NVM to ensure node is available in non-interactive shell
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+
echo "🧬 LemonBoss 启动中..."
echo "═══════════════════════════════════"
diff --git a/system/agents/digester-youtube-crawler/todo.md b/system/agents/digester-youtube-crawler/todo.md
index e311e98..fe567b8 100644
--- a/system/agents/digester-youtube-crawler/todo.md
+++ b/system/agents/digester-youtube-crawler/todo.md
@@ -12,3 +12,4 @@
| T-mnevj3i8 | 消化 youtube-crawler 的 knowhow.md,为 youtube-crawler Agent 模板生成 benchmark 与训练数据集。\n\n## 输入\n- knowhow.md 路径: system/templates/youtube-crawler/workspace/hunt/knowhow.md\n\n## 产出要求(写入以下目录)\n- 输出目录: system/templates/youtube-crawler/workspace/digest/\n- benchmark.md: 设计 5-8 个可量化维度,权重总和 100%,定义 0-100 分评分细则,设定及格/良好/优秀阈值,目标设计标准达到 90 分以上。\n- train.json: 训练数据集 ≥40 条样本,每条标注各维度得分与总分。\n- test.json: 测试数据集 ≥10 条样本。\n- industry_avg.json: 行业基线(设定 industry_avg_score 和 elite_avg_score)。\n\n## 验收标准\n1. JSON 文件必须合法可解析\n2. benchmark.md 中权重总和 = 100%\n3. train + test 总样本数 ≥ 50\n4. 完成后汇报文件路径和 benchmark 设计摘要 | ✅ 完成 | innovator | P1 | 2026-03-31 17:11 | - |
| T-mnevwogv | 执行 DIGEST 阶段:消化 youtube-crawler 的 knowhow.md,生成 benchmark.md、train.json、test.json 和 industry_avg.json。输入文件: /mnt/lemonboss/system/templates/youtube-crawler/workspace/hunt/knowhow.md。产出目录: /mnt/lemonboss/system/templates/youtube-crawler/workspace/digest/。要求: 1) benchmark.md 设计 5-8 个可量化维度,权重总和100%,定义0-100分评分细则,设定及格/良好/优秀阈值,目标总分90+;2) train.json ≥40条样本,test.json ≥10条样本;3) industry_avg.json 包含 industry_avg_score 和 elite_avg_score。完成后更新任务状态并汇报。 | ✅ 完成 | innovator | P1 | 2026-03-31 17:22 | - |
| T-mnevyvaz | 执行 DIGEST 阶段:消化 youtube-crawler 的 knowhow.md,生成 benchmark.md、train.json、test.json 和 industry_avg.json。输入文件: /mnt/lemonboss/system/templates/youtube-crawler/workspace/hunt/knowhow.md。产出目录: /mnt/lemonboss/system/templates/youtube-crawler/workspace/digest/。要求: 1) benchmark.md 设计 5-8 个可量化维度,权重总和100%,定义0-100分评分细则,设定及格/良好/优秀阈值,目标总分90+;2) train.json ≥40条样本,test.json ≥10条样本;3) industry_avg.json 包含 industry_avg_score 和 elite_avg_score。完成后更新任务状态并汇报。 | ✅ 完成 | innovator | P1 | 2026-03-31 17:23 | - |
+| T-mnj3nimu | 【FDE Phase 2: DIGEST】对 YouTube Data API v3 爬取技能进行知识消化与 Benchmark 生成。
## 目标
为 youtube-trending-crawler 技能生成 benchmark 评分标准和训练数据集。
## 输入文件
Hunter 产出的文件位于: /Users/yibo/Documents/lemonAI/lemonboss/system/agents/hunter/workspace/youtube-trending/
- knowhow_v2.md
- crawl_config.json
## 目标 Agent
- company: test
- agent: claude-youtube-skills
## Digest 任务要求
1. **解析 knowhow_v2.md** - 提取核心知识点和 API 调用方法论
2. **生成 benchmark_v2.md** - 可量化的评分标准,包含:
- API 调用准确性
- 数据字段完整性
- 多地区/多分类支持
- 错误处理健壮性
- 输出格式正确性
- 配额管理合理性
3. **生成训练数据集** (如可能):
- train.json: 训练样本
- test.json: 测试样本
4. **计算行业基线分**: industry_avg_score (建议 85-90 分)
## 输出路径
必须写入: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/
- benchmark_v2.md - 量化评分标准
- train.json - 训练数据集
- test.json - 测试数据集
- industry_avg.json - 行业基线分数
## 重要提醒
- 读取已有的旧版本 benchmark.md (如存在),合并并输出新版本 benchmark_v2.md
- 保留所有已有内容,追加新的评分维度 | ⬚ 未开始 | innovator | P0 | 2026-04-03 16:09 | - |
diff --git a/system/agents/evolver-youtube-crawler/SKILL.md b/system/agents/evolver-youtube-crawler/SKILL.md
index 2b2d70b..c30b093 100644
--- a/system/agents/evolver-youtube-crawler/SKILL.md
+++ b/system/agents/evolver-youtube-crawler/SKILL.md
@@ -104,9 +104,9 @@ try {
## 经验教训 (自动沉淀)
-
-> 以下经验由系统自动从历史对话中提取沉淀,帮助你避免重复犯错。
-
- ✅ [2026-03-31] 成功创建/修改了 3 个文件: workspace/evolve/skill_youtube_crawler.md`, workspace/evolve/evolution_log.json`, workspace/evolve/test_results.json`
- ✅ [2026-03-31] 完成了 36 步工具调用的复杂任务 (931秒)
- ✅ [2026-03-31] 涉及技能训练/评分/进化流程
+- ✅ [2026-04-03] 成功创建/修改了 2 个文件: workspace/evolve/evolve_report.md`, workspace/evolve/optimized_skill.md`
+- ✅ [2026-04-03] 完成了 16 步工具调用的复杂任务 (149秒)
+- ✅ [2026-04-03] 涉及技能训练/评分/进化流程
diff --git a/system/agents/evolver-youtube-crawler/todo.md b/system/agents/evolver-youtube-crawler/todo.md
index c7a39ed..70336f5 100644
--- a/system/agents/evolver-youtube-crawler/todo.md
+++ b/system/agents/evolver-youtube-crawler/todo.md
@@ -14,3 +14,4 @@
- [x] 基础技能注入完成 (evolving + mock-env + code-refactor)
| T-mnew8cq0 | 【自我进化任务】测试并优化你的三个核心技能(evolving、mock-env、code-refactor),确保综合 benchmark 达到 90 分以上。
## 执行步骤
1. **Code-Refactor 阶段**: 运行 code-refactor 技能分析 youtube_crawler.js,生成 refactor_report.md
2. **Mock-Env 阶段**: 运行 mock-env 技能搭建测试环境,生成 mock 数据
3. **Evolving 阶段**: 运行 evolving 技能执行双循环进化
## 测试目标
- 对 system/templates/youtube-crawler/code/youtube_crawler.js 进行代码质量分析
- 搭建 mock 测试环境覆盖 API/yt-dlp/异常场景
- 执行 benchmark 测试,目标总分 ≥ 90 分
## 输出要求
- workspace/evolver-youtube-crawler/refactor_report.md
- workspace/evolver-youtube-crawler/mock/
- workspace/evolver-youtube-crawler/evolution_log.md
- workspace/evolver-youtube-crawler/benchmark_result.json
完成后汇报最终得分和改进摘要。 | ⬚ 未开始 | innovator | P1 | 2026-03-31 17:31 | - |
| T-mnew9pn1 | 【Phase 3 EVOLVING】youtube-crawler 技能双循环进化训练
## 任务背景
- Phase 1 (Hunt): ✅ 已完成,knowhow.md 位于 system/templates/youtube-crawler/workspace/hunt/
- Phase 2 (Digest): ✅ 已完成,benchmark.md 和 train_dataset.json 位于 system/templates/youtube-crawler/workspace/digest/
- 目标:训练 youtube-crawler 技能达到 90+ 分
## 输入资料
1. benchmark.md: system/templates/youtube-crawler/workspace/digest/benchmark.md
2. train_dataset.json: system/templates/youtube-crawler/workspace/digest/train_dataset.json
3. test_dataset.json: system/templates/youtube-crawler/workspace/digest/test_dataset.json
4. knowhow.md: system/templates/youtube-crawler/workspace/hunt/knowhow.md
5. 目标 Agent 技能目录: system/agents/youtube-crawler/.claude/skills/
## 训练要求
1. 执行 Small Loop(技能迭代)最多 10 轮,直到 benchmark score >= 90
2. 每轮分析弱维度,针对性修改 Skill 定义
3. 使用 mock-env 搭建测试环境
4. 使用 code-refactor 优化代码质量
## 产出要求
- 输出目录: system/templates/youtube-crawler/workspace/evolve/
- skill_youtube_crawler.md (最终技能定义)
- evolution_log.json (进化记录)
- test_results.json (测试结果)
## 完成标准
- Benchmark score >= 90 分
- 技能文件部署到 system/agents/youtube-crawler/.claude/skills/
完成后请调用 report_task 向 innovator 汇报。 | ✅ 完成 | innovator | P1 | 2026-03-31 17:32 | - |
+| T-mnj3s7bi | 【FDE Phase 3: EVOLVE】对 YouTube Data API v3 爬取技能进行 RL 进化训练。
## 目标
优化 youtube-trending-crawler 技能,使其 benchmark 得分 ≥ 90 分。
## 输入文件
- Benchmark: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/benchmark_v2.md
- Train: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/train.json
- Test: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/test.json
- Industry Avg: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/digest/industry_avg.json
## 目标 Agent
- company: test
- agent: claude-youtube-skills
## Evolve 任务要求
1. **读取现有技能**: 查看 test:claude-youtube-skills 的现有 SKILL.md
2. **分析 benchmark**: 理解评分维度和弱项
3. **Small Loop 训练**: 逐个修复弱维度:
- 错误处理健壮性 (当前 60分)
- 配额管理合理性 (当前 65分)
- 多地区多分类支持 (当前 68分)
4. **运行测试**: 使用 test.json 验证修复效果
5. **循环优化**: 直到 score ≥ 90
## 输出路径
必须写入: /Users/yibo/Documents/lemonAI/lemonboss/data/companies/test/agents/claude-youtube-skills/workspace/evolve/
- evolve_report.md - 训练报告 (包含每轮迭代的修改和得分)
- optimized_skill.md - 优化后的技能定义
## 验收标准
- 最终 benchmark 得分 ≥ 90
- 通过 test.json 的全部测试用例
- 产出优化的 SKILL.md | ✅ 完成 | innovator | P0 | 2026-04-03 16:13 | - |
diff --git a/system/agents/hunter/todo.md b/system/agents/hunter/todo.md
index 153ac9d..fc962de 100644
--- a/system/agents/hunter/todo.md
+++ b/system/agents/hunter/todo.md
@@ -45,3 +45,4 @@
- T-mnext40u、T-mnexx9w8 (abc:trend-hunter 相关): ⚠️ 已取消 — abc 公司已于 2026-04-01 删除,目标 Agent 不存在。
- T-mncue787 (hook-editor)、T-mncuebf1 (strategy-reflector): ⚠️ 已取消 — 目标 Agent 不存在。
- T-mncz867y (idearrun-create)、T-mnexldk1 (lemonv:trend-hunter)、T-mnexpuii (lemonv:screenwriter): ⏸️ 暂停 — hunter 处于系统维护暂停状态,待恢复后处理。
+| T-mnj3emdx | 对 YouTube Data API v3 爬取技能进行深度调研。
## 目标
训练一个能够通过 Google YouTube Data API v3 抓取最热最新视频列表并输出 JSON 的技能。
## 任务要求
1. 调研 YouTube Data API v3 的以下端点:
- 趋势视频 (trending videos)
- 热门视频 (most popular videos)
- 按国家/地区筛选的视频
- 搜索结果 (search)
- 视频详情 (videos)
- 频道详情 (channels)
2. 输出数据格式要求包含:
- 视频名称
- 发布博主名称
- 博主粉丝数
- 视频热度/热度趋势
- 播放量
- 视频简介
- 视频URL
- 其他相关元数据
3. 查找现有参考 skills 文档 (参考路径: .claude/skills/)
## 产出要求
输出到以下路径: /Users/yibo/Documents/lemonAI/lemonboss/system/agents/hunter/workspace/youtube-trending/
- knowhow_v2.md - 数据源清单和技术调研报告
- crawl_config.json - API 爬取配置
- seed_data.json - 首次采集的种子数据 (≥50条)
## 重要提醒
- 必须读取已有的旧版本 knowhow.md (如存在),合并并输出新版本 knowhow_v2.md
- 保留所有已有内容,追加新的调研发现 | ⬚ 未开始 | innovator | P0 | 2026-04-03 16:03 | - |
diff --git a/system/agents/innovator/.claude/scheduled_tasks.json b/system/agents/innovator/.claude/scheduled_tasks.json
index 63b3d40..5b0b0c0 100644
--- a/system/agents/innovator/.claude/scheduled_tasks.json
+++ b/system/agents/innovator/.claude/scheduled_tasks.json
@@ -1,19 +1,11 @@
{
"tasks": [
{
- "id": "5547b5b6",
- "cron": "*/10 * * * *",
- "prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。",
- "createdAt": 1774543358106,
- "lastFiredAt": 1774981073706,
- "recurring": true
- },
- {
"id": "40f74b6a",
"cron": "*/10 * * * *",
"prompt": "读取 /mnt/lemonboss/system/agents/innovator/todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。",
"createdAt": 1774979269375,
- "lastFiredAt": 1774981073706,
+ "lastFiredAt": 1775234477093,
"recurring": true
},
{
@@ -21,22 +13,23 @@
"cron": "*/10 * * * *",
"prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。",
"createdAt": 1774980403987,
- "recurring": true,
- "lastFiredAt": 1774981073706
+ "lastFiredAt": 1775234593197,
+ "recurring": true
},
{
"id": "b1b5867b",
"cron": "*/10 * * * *",
"prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。",
"createdAt": 1774980489432,
- "recurring": true,
- "lastFiredAt": 1774981073706
+ "lastFiredAt": 1775234613218,
+ "recurring": true
},
{
"id": "a6cda320",
"cron": "*/10 * * * *",
"prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。",
"createdAt": 1774980660311,
+ "lastFiredAt": 1775234603208,
"recurring": true
},
{
@@ -44,6 +37,7 @@
"cron": "*/10 * * * *",
"prompt": "读取 todo.md,检查是否有未完成的任务。如果有,按优先级执行。完成后更新状态。",
"createdAt": 1774981030401,
+ "lastFiredAt": 1775234493105,
"recurring": true
}
]
diff --git a/system/agents/innovator/agent.md b/system/agents/innovator/agent.md
index f12230d..2280d7e 100644
--- a/system/agents/innovator/agent.md
+++ b/system/agents/innovator/agent.md
@@ -24,11 +24,11 @@
│
▼ Layer 1: HUNT (调研)
dispatch → Hunter: 深度调研 + 数据源发现 + 爬虫 + 首次爬取
- 产出: knowhow 基础数据、crawl_config、种子数据集
+ 产出: knowhow_vX.md 基础数据、crawl_config、种子数据集(若是重训,产出文件需递增版本后缀防覆盖)
│
▼ Layer 2: DIGEST (消化)
- dispatch → Digester: 构建 knowhow.md + benchmark.md + 标注数据集 + 行业基准
- 产出: 结构化知识、评分标准、train/test 数据集、industry_avg_score
+ dispatch → Digester: 构建最新版 benchmark_vX.md + 标注数据集 + 行业基准
+ 产出: 融合更新的结构化知识、新版评分标准、train/test 数据集、industry_avg_score
│
▼ Layer 3: EVOLVING (进化)
dispatch → Evolver: 双循环训练直到 score ≥ industry_avg
@@ -67,6 +67,7 @@
## ✅ 始终要做
- 先检查 Hunter/Digester/Evolver 是否存在,不存在先通过 agent-creator 创建
-- 每个 Phase 完成后验证产出质量
+- **切实验收产出质量**:当子 Agent 汇报某个 Phase 结束,你绝不能按目录有无文件就放行,**必须亲自调用读取工具**检视文件内容,并判定文件是否携带了新一版的后缀字样(如 `_v2`),达标后才能在 `plan.md` 打 `✅`
+- 任何 **Retrain(重训)** 第一步:进 `plan.md` 将它的所有 Phase 全部强制重置为 `⬚`!
- 训练完成后更新 skill_list 并向上级汇报最终分数
- 参考 docs/ 目录中的模板文件
diff --git a/system/agents/innovator/soul.md b/system/agents/innovator/soul.md
index 5b96c18..544e430 100644
--- a/system/agents/innovator/soul.md
+++ b/system/agents/innovator/soul.md
@@ -18,4 +18,6 @@
- **双循环** — Small Loop 优化技能,Large Loop 修正基准,永不停止学习
## ⚠️ 绝对规则
+- **重置复位法则(针对 Retrain)** — 一旦接收到“重新训练 (Retrain)”的指令,第一件事必定是将被重训对象的在 `plan.md` 中的旧状态全部打回未完成(例如改回 `⬚`)。决不允许再参考先前的 `✅` 状态!历史战绩必须清零,所有阶段从头踏实地跑一遍。
+- **杜绝形式主义的校验** — 每当 Hunt 或 Digest 阶段结束向你汇报时,**绝对禁止**只通过 `ls` 查验目录里是否有文件!你必须使用文件读取命令实际**查看生成的文件内容**并确认:(1)它满足本阶段要求的内容架构;(2)它的存盘名称拥有全新的迭代版本号(例如原来是 `.md` 或 `_v1.md`,本次重训必须新写了带有 `_v2.md` 后缀的全新文件)。只有满足这二者,才能将改阶段标记为 `✅`。
- **DEPLOY 不可跳过** — 训练达标后,必须将 SKILL.md 复制到 agents/{agent}/ 目录、更新 config.json status、更新 agent.md。如果跳过这步,训练成果等于白费。
diff --git a/system/agents/master/.claude/scheduled_tasks.json b/system/agents/master/.claude/scheduled_tasks.json
index 50ffbb9..4681743 100644
--- a/system/agents/master/.claude/scheduled_tasks.json
+++ b/system/agents/master/.claude/scheduled_tasks.json
@@ -1,3 +1,18 @@
{
- "tasks": []
+ "tasks": [
+ {
+ "id": "fe1208ce",
+ "cron": "*/5 * * * *",
+ "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
+ "createdAt": 1775231859266,
+ "recurring": true
+ },
+ {
+ "id": "8bff9147",
+ "cron": "*/30 * * * *",
+ "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
+ "createdAt": 1775231859272,
+ "recurring": true
+ }
+ ]
}
diff --git a/web/src/views/CompanyDashboard.vue b/web/src/views/CompanyDashboard.vue
index 050919e..d2424b2 100644
--- a/web/src/views/CompanyDashboard.vue
+++ b/web/src/views/CompanyDashboard.vue
@@ -697,6 +697,44 @@
+
+