Commit e870611fdeb86de07906c7fd82d981b28e3a2626
1 parent
226489d3
chore: pre-P1 workspace cleanup — CLAUDE.md DevLoop docs, task-service TASK_META…
…_DIR move, stray files - CLAUDE.md: document DevLoop subsystem (spec-first workflow, project root/git-vault, mock mode, L1 loop, unit layout, audit trail) and add missing test commands - server/routes/agent-chat.js, server/services/task-service.js: TASK_META_DIR moved from system/agents/.tasks to system/tasklog - system/agents/master/.claude/scheduled_tasks.json: scheduled task state update - remove stray memory/daily/2026-04-02.md and a garbled-filename artifact left under system/agents/digester-youtube-crawler/ Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Showing
6 changed files
with
47 additions
and
403 deletions
CLAUDE.md
| ... | ... | @@ -34,10 +34,16 @@ npm run web / web:build # 前端开发 / 构建到 web/dist/ |
| 34 | 34 | # 测试 |
| 35 | 35 | npm test # vitest watch |
| 36 | 36 | npm run test:unit # vitest run (CI 用) |
| 37 | +npx vitest run path/to/foo.test.js # 跑单个测试文件 | |
| 38 | +npx vitest run -t "test name" # 按名称过滤单个测试用例 | |
| 37 | 39 | npm run test:multi-cli # multi-CLI 集成测试 |
| 38 | 40 | npm run test:browser-logger |
| 39 | 41 | npm run test:design-validator |
| 40 | 42 | |
| 43 | +# DevLoop 规范 | |
| 44 | +npm run spec:extract # 从 docs/prd/newfunction/*.html 重新生成 _spec/*.md(改完 HTML 后必须跑) | |
| 45 | +npm run spec:check # CI/pre-commit 用,校验 _spec/ 与 HTML 是否同步 | |
| 46 | + | |
| 41 | 47 | # CLI / 工具 |
| 42 | 48 | npm run example # 单次 auto-dev:实现斐波那契 |
| 43 | 49 | npm run example-bmi # 单次 auto-dev:BMI 程序 |
| ... | ... | @@ -74,6 +80,11 @@ auto-dev "<task>" # bin 入口 → server/src/cli/auto-dev.js |
| 74 | 80 | | `server/src/core/` | Agent 引擎核心(orchestrator, master-session, agent-manager, scheduler, session-pool, prompt-builder, runtime-resolver, …) | |
| 75 | 81 | | `server/src/engine/` | 进程层(command-queue, idle-timer, process-guard, run-registry, failover-error) | |
| 76 | 82 | | `server/src/plugins/` | 插件系统(plugin-manager, agent-bridge, config-bridge, bootstrap) | |
| 83 | +| `server/src/core/devloop/` | DevLoop 编排核心:`loop-controller.js`(createProject / callAgent / runDocsPhase / runUnit) | | |
| 84 | +| `server/services/devloop/` | DevLoop 支撑服务:path-resolver, git-vault, unit-registry(FSM), timeline-logger, bug-tracker, doc-store, changelog-writer, sse-broker | | |
| 85 | +| `server/src/tools/devloop/` | DevLoop Agent 可调用工具(coder/tester/integrator/triager/doc/persistence-tools + tool-registry + sandbox) | | |
| 86 | +| `server/routes/devloop.js` | DevLoop REST:`/api/devloop/projects` | | |
| 87 | +| `system/templates/devloop-*/` | 六个 DevLoop Agent 的 prompt 模板(pm, architect, coder, tester, integrator, triager) | | |
| 77 | 88 | | `server/src/tools/` | Master Agent 可调用的工具(call-agent, marketplace, orchestrate, train-skill, …) | |
| 78 | 89 | | `web/src/views/` | 10 个页面:AgentChat, AgentList, CompanyDashboard, JobsPanel, OkrDashboard, PipelineEditor, QuotaMonitor, SkillsMarket, TaskTimeline, TemplateAgents | |
| 79 | 90 | | `packages/` | `acp-core`, `agent-core`, `evolution`, `plugin-bootstrap` | |
| ... | ... | @@ -94,6 +105,19 @@ auto-dev "<task>" # bin 入口 → server/src/cli/auto-dev.js |
| 94 | 105 | | `/api/auth/*` | JWT + GitHub OAuth | |
| 95 | 106 | | `/ws/claude` | Claude 实时对话(仅 `index.js`) | |
| 96 | 107 | | `/api/health` `/api/plugins` | 健康检查 / 插件状态 | |
| 108 | +| `/api/devloop/projects` | DevLoop:创建项目 + 跑 PM/Architect(POST)、列项目 / 查状态(GET,见下) | | |
| 109 | + | |
| 110 | +### DevLoop 子系统 | |
| 111 | + | |
| 112 | +多 Agent 自动开发流水线(PM → Architect → Coder → Tester → Integrator → Triager),目前处于 P2(单 Unit 循环)阶段,正朝 P3(跨 Unit runProject)推进。 | |
| 113 | + | |
| 114 | +- **规格优先**:所有实现以 `docs/prd/newfunction/_spec/*.md` 为准(机器可读,由 `npm run spec:extract` 从同名 `*.html` 自动生成,**不要手改 `_spec/`**;改 HTML 后必须重跑 extract,否则 pre-commit hook 会拦)。跨切约定集中在 `_spec/CONVENTIONS.md`(ID 生成规则、错误响应形态、文件原子写入、并发锁策略、日志分流、命名风格)——写 DevLoop 代码前先读这份。 | |
| 115 | +- **项目根**:每个 DevLoop 项目是独立 git 仓库,由 `path-resolver.allocateProjectRoot` 分配(`sandbox` 或 `linked-*` 模式),`git-vault` 负责 init/commit,每个 Agent 收尾后自动 commit(`loop-controller.commitAfterAgent`,commit kind 按 agent 名映射:pm→prd, architect→sdd, coder/tester→code, integrator→integ, triager→triage)。 | |
| 116 | +- **Mock 模式**:P1-P2 阶段 Agent 调用默认走 `ClaudeCliProtocol({mock:true})`(`packages/acp-core/protocol/ClaudeCliProtocol.js`),不真正起 Claude CLI 子进程,而是从 `fixtures/devloop-mock/*.json` 回放固定的 chunks/files/result;显式传 `mock:false` 才会用真实 CLI。 | |
| 117 | +- **L1 单 Unit 循环**(`runUnit`,P2):Coder(implement) → Tester(test),失败时把上一次 failure + coder.log 摘要打回去重跑(retry-with-reflection),直到 tester 通过或耗尽 `retry_budget`(默认 5)。每次状态转换都过 `unit-registry` 的 FSM(coding → testing → passed/failed → blocked)。 | |
| 118 | +- **单元产物布局**:项目根下 `units/{unitId}/{spec.json, code/, contract.json, coder.log, runs/{runId}/result.json}`;跨 unit 只能读 `../{otherUnit}/contract.json`,禁止直接读别的 unit 的 `code/`(见 CONVENTIONS.md §12)。 | |
| 119 | +- **审计轨迹**:`timeline.ndjson`(append-only,永不改已写行)记录所有 Agent 调用 / commit / 状态转换事件,`bugs.ndjson` / `changelog.ndjson` 走同样的追加模式。 | |
| 120 | +- **测试**:`server/tests/devloop/**/*.test.js`(服务层 + 工具层单测)+ `server/tests/devloop/routes.test.js`(REST 层)。 | |
| 97 | 121 | |
| 98 | 122 | ### 数据存储(SQLite,无需 PostgreSQL) |
| 99 | 123 | |
| ... | ... | @@ -119,7 +143,7 @@ auto-dev "<task>" # bin 入口 → server/src/cli/auto-dev.js |
| 119 | 143 | - `server/index.js` 与 `agent-server.js` 都内置了 **body-sanitizer 中间件**:在 `express.json()` 之前清掉 `\x00-\x1F` 控制字符,避免外部 Agent 通过 `curl` 传未转义换行/制表符导致的 `Bad control character` 报错。修改请求体解析链路前先看这两段。 |
| 120 | 144 | - 模块别名 `@server` → `server/`(`module-alias` 注册),跨子包 require 时可用。 |
| 121 | 145 | - Claude CLI 进程默认带 `--dangerously-skip-permissions`,写入受限路径前自己评估风险。 |
| 122 | -- DevLoop 规范阅读:Coder/Architect Agent **优先读 `docs/prd/newfunction/_spec/*.md`**(机器可读规范,含 `CONVENTIONS.md` 跨切约定),需要 wireframe / SVG 图表 / 完整人类阅读版时才回查同名 `*.html`。`_spec/` 由 `npm run spec:extract` 从 HTML 自动生成,**不要手改**;改完 HTML 后必须重跑(pre-commit hook 会校验)。 | |
| 146 | +- DevLoop 详见上方「DevLoop 子系统」一节;需要 wireframe / SVG 图表 / 完整人类阅读版时才回查 `_spec/*.md` 同名的 `*.html`。 | |
| 123 | 147 | |
| 124 | 148 | > [!WARNING] (Agentic Self-Correction Loop Prevention) |
| 125 | 149 | > **Master Agent 必读**: 你目前存在一个已知的底层 Tool Calling JSON 解析缺陷。当你试图在 `Bash` tool 中使用带有多重双引号的复杂命令(例如 `curl -d '{"id":"lemonv", "name":"Lemonv"}'`)时,你的 JSON 转义会崩溃并导致你陷入"修复格式"的无限死循环,最终进程会被强制终止退出 (code=143)。 | ... | ... |
memory/daily/2026-04-02.md deleted
| 1 | -# 系统状态日报 — 2026-04-02 | |
| 2 | - | |
| 3 | -> 生成时间: 2026-04-02 当前 CST | |
| 4 | -> 生成者: Master Agent | |
| 5 | - | |
| 6 | ---- | |
| 7 | - | |
| 8 | -## 1. 全局概览 | |
| 9 | - | |
| 10 | -| 指标 | 数值 | 状态 | | |
| 11 | -|------|------|------| | |
| 12 | -| 存活公司数 | 1 | 正常 | | |
| 13 | -| 注册 Agent 总数 | 12 | 正常 | | |
| 14 | -| 活跃/就绪 Agent | 11 | 正常 | | |
| 15 | -| 活跃全局 Goals | 0 | — | | |
| 16 | -| 运行中 Pipeline | 0 | — | | |
| 17 | -| 异常/卡住任务 | 0 | 正常 | | |
| 18 | - | |
| 19 | ---- | |
| 20 | - | |
| 21 | -## 2. 公司状态 | |
| 22 | - | |
| 23 | -| 公司 ID | 名称 | 状态 | Agent 数 | CEO | 备注 | | |
| 24 | -|---------|------|------|----------|-----|------| | |
| 25 | -| idearun | idearun.ai | running | 4 | null | 心跳已禁用(维护模式) | | |
| 26 | -| ~~abc~~ | ~~ABC 内容创作公司~~ | ~~已删除~~ | — | — | 4/1 已关停并清理 | | |
| 27 | -| ~~ainews~~ | ~~AI News~~ | ~~已删除~~ | — | — | 4/1 已关停并清理 | | |
| 28 | - | |
| 29 | -### idearun 内部 Agent 详情 | |
| 30 | - | |
| 31 | -| Agent | 类型 | 状态 | 心跳状态 | 最后活跃 | 待办任务 | | |
| 32 | -|-------|------|------|----------|----------|----------| | |
| 33 | -| idearrun-create | specialist | active | 已禁用 | 2026-03-30 16:31 | 0 | | |
| 34 | -| qa-judge | specialist | active | 已禁用 | 2026-03-30 16:53 | 0 | | |
| 35 | -| weibo-scraper | specialist | active | 已禁用 | 2026-03-30 14:50 | 0 | | |
| 36 | -| youtube-crawler | specialist | active | 已禁用 | 2026-04-01 16:58 | 0 | | |
| 37 | - | |
| 38 | -> 注:idearun 所有 Agent 心跳均处于 `enabled=false` 状态,与全局维护策略(commit `9f15ed3`)保持一致,非异常。活跃 Agent 计数为 0 是因为心跳未启动。 | |
| 39 | - | |
| 40 | ---- | |
| 41 | - | |
| 42 | -## 3. 系统级 Agent 状态 | |
| 43 | - | |
| 44 | -| Agent | 类型 | 状态 | 最后活跃 | 待办/完成 | 备注 | | |
| 45 | -|-------|------|------|----------|-----------|------| | |
| 46 | -| master | master | ready | 2026-04-02 当前 | 1 完成 | 无待办 | | |
| 47 | -| agent-creator | specialist | ready | 2026-03-31 18:24 | 维护暂停 | 系统维护策略 | | |
| 48 | -| innovator | cxo | ready | 2026-03-31 18:23 | 维护暂停 | 系统维护策略 | | |
| 49 | -| digester | specialist | ready | 2026-03-31 18:24 | 维护暂停 | 系统维护策略 | | |
| 50 | -| evolver | specialist | ready | 2026-03-31 18:20 | 维护暂停 | 系统维护策略 | | |
| 51 | -| hunter | meta | ready | 2026-03-31 18:18 | 34 完成 | 历史任务全部闭环 | | |
| 52 | -| evolver-youtube-crawler | specialist | undefined | 2026-03-31 17:47 | 0 | youtube-crawler 训练已达标 (95/100) | | |
| 53 | -| digester-youtube-crawler | meta | ready | 2026-03-31 17:23 | 0 | 训练辅助任务已闭环 | | |
| 54 | - | |
| 55 | ---- | |
| 56 | - | |
| 57 | -## 4. 任务完成率统计 | |
| 58 | - | |
| 59 | -- **master**: 计划 3/3 完成 (100%),todo 0 pending | |
| 60 | -- **hunter**: 历史 34 项任务全部完成 (100%) | |
| 61 | - - 本日自主清理 4 项无效遗留任务(abc/trend-hunter x2、hook-editor x1、strategy-reflector x1)因目标 Agent/公司不存在已标记取消。 | |
| 62 | - - 3 项任务(idearrun-create、trend-hunter、screenwriter)因 hunter 维护暂停保持阻塞,待恢复后处理。 | |
| 63 | -- **agent-creator / innovator / digester / evolver**: 进入系统维护暂停状态,无活跃任务队列 | |
| 64 | -- **idearun 全员**: 上一批次(微博热点剧本生成+审核+YouTube爬虫就绪)已全部闭环,无遗留待办 | |
| 65 | - | |
| 66 | -**整体任务完成率**: 100%(无 pending/blocking 任务,维护暂停任务属策略性行为) | |
| 67 | - | |
| 68 | ---- | |
| 69 | - | |
| 70 | -## 5. 异常情况记录 | |
| 71 | - | |
| 72 | -| 时间 | 异常类型 | 描述 | 处理状态 | | |
| 73 | -|------|----------|------|----------| | |
| 74 | -| 2026-04-02 02:10~02:35 | 日志污染 | `plan.md` 被每 5 分钟触发的外部自动巡检 cron 密集追加 90+ 条完全重复的巡检日志,文件多次膨胀并出现格式损坏 | **已修复根因**:取消 cron job `cfdff31a`,并彻底清理重复日志 | | |
| 75 | - | |
| 76 | -### 说明 | |
| 77 | -- `agent-creator`、`innovator`、`digester`、`evolver` 的 todo.md 显示为 **"系统维护 2026-04-01"**,这是 intentional 的全局维护状态(由 `9f15ed3` 引入,用于禁用 autonomous cron 和 heartbeat 以防止 overnight IO crash),**不属于异常卡住**。 | |
| 78 | -- `idearun` 心跳全部禁用,同样是上述全局策略的一部分。 | |
| 79 | - | |
| 80 | ---- | |
| 81 | - | |
| 82 | -## 6. 自主修复/清理动作 | |
| 83 | - | |
| 84 | -| 时间 | 动作 | 结果 | | |
| 85 | -|------|------|------| | |
| 86 | -| 2026-04-01 16:40 | 关停并删除 `abc` 公司 | 数据目录已清理 | | |
| 87 | -| 2026-04-01 16:40 | 关停并删除 `ainews` 公司 | 数据目录已清理 | | |
| 88 | -| 2026-04-01 16:43 | 清理遗留目录 `system/agents/abc/` | 旧架构孤儿数据已删除 | | |
| 89 | -| 2026-04-02 02:10 | 修复 `plan.md` 末尾格式错误 | 已修正被合并的巡检日志行 | | |
| 90 | -| 2026-04-02 02:18 | 首次清理 `plan.md` 重复日志 | 去除 40+ 条冗余重复记录 | | |
| 91 | -| 2026-04-02 02:25 | 再次清理 `plan.md` 重复日志 | 去除新追加的 25+ 条冗余记录 | | |
| 92 | -| 2026-04-02 02:25 | 清理 hunter 历史遗留无效任务 | 4 项取消、3 项标注维护暂停 | | |
| 93 | -| 2026-04-02 02:35 | **取消自动巡检 cron** `cfdff31a` | 根因消除,`plan.md` 不再被重复追加 | | |
| 94 | -| 2026-04-02 当前 | `plan.md` 深度精简 | 去重并保留关键节点,从 100+ 行压缩至 25 行 | | |
| 95 | - | |
| 96 | ---- | |
| 97 | - | |
| 98 | -## 7. 健康度评估 | |
| 99 | - | |
| 100 | -| 维度 | 评分 | 说明 | | |
| 101 | -|------|------|------| | |
| 102 | -| 系统稳定性 | 优秀 | 无报错、无崩溃、无资源泄漏 | | |
| 103 | -| 任务推进度 | 优秀 | 无卡住、无 pending | | |
| 104 | -| Agent 活跃度 | 维护中 | 核心 Agent 处于策略性暂停 | | |
| 105 | -| 数据一致性 | 优秀 | 公司/Agent 注册表与文件系统一致 | | |
| 106 | - | |
| 107 | ---- | |
| 108 | - | |
| 109 | -## 8. 明日关注 | |
| 110 | - | |
| 111 | -1. 若老板有新指令,立即 dispatch 到 `idearun` 或 `agent-creator`/`innovator`。 | |
| 112 | -2. 关注 `agent-creator` / `innovator` 何时退出维护状态(取决于 `9f15ed3` 策略的调整)。 | |
| 113 | -3. `youtube-crawler` 已训练就绪(benchmark 95/100),可随时派发爬取任务。 | |
| 114 | -4. `plan.md` 重复日志污染根因已消除(cron `cfdff31a` 已取消),文件已完成深度精简。 | |
| 115 | -5. 最近一次日报生成时间:当前 CST。系统稳定在 post-maintenance 状态。 | |
| 116 | - | |
| 117 | ---- | |
| 118 | - | |
| 119 | -**结论**: 系统当前处于稳定、空闲的 post-maintenance 状态。所有历史任务已闭环,`plan.md` 日志污染根因已消除且完成深度精简。无异常需处理。本报告已覆盖至当前的最新状态。 |
server/routes/agent-chat.js
| ... | ... | @@ -1455,7 +1455,7 @@ router.post('/scaffold', async (req, res) => { |
| 1455 | 1455 | * } |
| 1456 | 1456 | */ |
| 1457 | 1457 | // ── Task 元数据持久化目录 ── |
| 1458 | -const TASK_META_DIR = path.resolve(__dirname, '../../system/agents/.tasks'); | |
| 1458 | +const TASK_META_DIR = path.resolve(__dirname, '../../system/tasklog'); | |
| 1459 | 1459 | if (!fs.existsSync(TASK_META_DIR)) fs.mkdirSync(TASK_META_DIR, { recursive: true }); |
| 1460 | 1460 | |
| 1461 | 1461 | function saveTaskMeta(taskId, meta) { | ... | ... |
server/services/task-service.js
| ... | ... | @@ -3,7 +3,7 @@ const path = require('path'); |
| 3 | 3 | |
| 4 | 4 | const SYSTEM_AGENTS_DIR = path.resolve(__dirname, '../../system/agents'); |
| 5 | 5 | const COMPANIES_DIR = path.resolve(__dirname, '../../data/companies'); |
| 6 | -const TASK_META_DIR = path.resolve(__dirname, '../../system/agents/.tasks'); | |
| 6 | +const TASK_META_DIR = path.resolve(__dirname, '../../system/tasklog'); | |
| 7 | 7 | |
| 8 | 8 | /** |
| 9 | 9 | * 递归扫描并读取系统中所有 Agent 的会话, | ... | ... |
system/agents/digester-youtube-crawler/>/mnt/lemonboss/system/templates/youtube-crawler/workspace/digest/benchmark.md deleted
| 1 | -> # YouTube 爬虫 Skill Benchmark | |
| 2 | -> | |
| 3 | -> **版本**: 1.0.0 | |
| 4 | -> **目标 Skill**: youtube-crawler | |
| 5 | -> **基准目标**: 总分 ≥ 90 为优秀 | |
| 6 | -> | |
| 7 | -> --- | |
| 8 | -> | |
| 9 | -> ## 1. 评分维度概览 | |
| 10 | -> | |
| 11 | -> | 维度 | 权重 | 说明 | | |
| 12 | -> |------|------|------| | |
| 13 | -> | 功能完整性 | 20% | 核心字段覆盖率、数据提取完整性 | | |
| 14 | -> | API 规范使用 | 15% | YouTube Data API v3 的正确使用 | | |
| 15 | -> | 代码质量 | 15% | 代码结构、错误处理、可读性 | | |
| 16 | -> | 数据准确性 | 15% | 字段映射正确性、数据类型转换 | | |
| 17 | -> | 反爬虫处理 | 15% | 重试机制、延迟策略、错误恢复 | | |
| 18 | -> | 降级方案支持 | 10% | yt-dlp 备用方案实现 | | |
| 19 | -> | 配置灵活性 | 5% | 参数可配置性、地区/分类支持 | | |
| 20 | -> | 性能优化 | 5% | 缓存策略、配额管理 | | |
| 21 | -> | |
| 22 | -> **权重总和**: 100% | |
| 23 | -> | |
| 24 | -> --- | |
| 25 | -> | |
| 26 | -> ## 2. 详细评分标准 | |
| 27 | -> | |
| 28 | -> ### 2.1 功能完整性 (20%) | |
| 29 | -> | |
| 30 | -> 核心字段: `videoId`, `title`, `viewCount`, `channelTitle`, `thumbnails`, `publishedAt`, `url` | |
| 31 | -> | |
| 32 | -> | 分值 | 标准 | | |
| 33 | -> |------|------| | |
| 34 | -> | 90-100 | 完整提取 7 个核心字段,额外获取 likeCount、duration 等扩展字段 | | |
| 35 | -> | 70-89 | 完整提取 7 个核心字段 | | |
| 36 | -> | 50-69 | 提取 5-6 个核心字段,缺失非关键字段 | | |
| 37 | -> | 30-49 | 提取 3-4 个字段,影响基础功能 | | |
| 38 | -> | 0-29 | 提取少于 3 个字段 | | |
| 39 | -> | |
| 40 | -> **检查项**: | |
| 41 | -> - [ ] videoId 正确提取 | |
| 42 | -> - [ ] title 正确提取 | |
| 43 | -> - [ ] viewCount 正确提取并转为数字 | |
| 44 | -> - [ ] channelTitle 正确提取 | |
| 45 | -> - [ ] thumbnails 提供多个分辨率选项 | |
| 46 | -> - [ ] publishedAt ISO 8601 格式 | |
| 47 | -> - [ ] url 完整拼接 | |
| 48 | -> | |
| 49 | -> --- | |
| 50 | -> | |
| 51 | -> ### 2.2 API 规范使用 (15%) | |
| 52 | -> | |
| 53 | -> | 分值 | 标准 | | |
| 54 | -> |------|------| | |
| 55 | -> | 90-100 | 正确使用 `part` 参数、配额管理、错误码处理、遵循 rate limit | | |
| 56 | -> | 70-89 | 正确使用 API 参数,基本错误处理 | | |
| 57 | -> | 50-69 | 使用 API 但参数配置不当,浪费配额 | | |
| 58 | -> | 30-49 | API 调用存在明显问题 | | |
| 59 | -> | 0-29 | 完全错误使用 API | | |
| 60 | -> | |
| 61 | -> **检查项**: | |
| 62 | -> - [ ] 正确设置 `part=snippet,statistics,contentDetails` | |
| 63 | -> - [ ] 使用 `chart=mostPopular` 获取热门视频 | |
| 64 | -> - [ ] 支持 `regionCode` 参数 | |
| 65 | -> - [ ] 支持 `videoCategoryId` 参数 | |
| 66 | -> - [ ] 正确处理 403/429 错误码 | |
| 67 | -> | |
| 68 | -> --- | |
| 69 | -> | |
| 70 | -> ### 2.3 代码质量 (15%) | |
| 71 | -> | |
| 72 | -> | 分值 | 标准 | | |
| 73 | -> |------|------| | |
| 74 | -> | 90-100 | 模块化设计、完善异常处理、清晰注释、类型提示 | | |
| 75 | -> | 70-89 | 结构清晰、基本错误处理、可读性好 | | |
| 76 | -> | 50-69 | 功能实现但结构松散 | | |
| 77 | -> | 30-49 | 代码混乱、难以维护 | | |
| 78 | -> | 0-29 | 存在严重错误、无法运行 | | |
| 79 | -> | |
| 80 | -> **检查项**: | |
| 81 | -> - [ ] 函数拆分合理(获取/解析/格式化分离) | |
| 82 | -> - [ ] try-catch 处理网络/API 异常 | |
| 83 | -> - [ ] 输入参数校验 | |
| 84 | -> - [ ] 返回数据统一格式 | |
| 85 | -> | |
| 86 | -> --- | |
| 87 | -> | |
| 88 | -> ### 2.4 数据准确性 (15%) | |
| 89 | -> | |
| 90 | -> | 分值 | 标准 | | |
| 91 | -> |------|------| | |
| 92 | -> | 90-100 | 字段映射 100% 正确、数据类型转换准确、空值处理完善 | | |
| 93 | -> | 70-89 | 字段映射正确、基本类型转换 | | |
| 94 | -> | 50-69 | 存在轻微映射错误或类型问题 | | |
| 95 | -> | 30-49 | 存在明显数据错误 | | |
| 96 | -> | 0-29 | 数据完全不可靠 | | |
| 97 | -> | |
| 98 | -> **检查项**: | |
| 99 | -> - [ ] viewCount 转为整数(API 返回字符串) | |
| 100 | -> - [ ] thumbnails 选择最高可用分辨率 | |
| 101 | -> - [ ] publishedAt 转为 Date 对象或标准格式 | |
| 102 | -> - [ ] 处理缺失字段的默认值 | |
| 103 | -> | |
| 104 | -> --- | |
| 105 | -> | |
| 106 | -> ### 2.5 反爬虫处理 (15%) | |
| 107 | -> | |
| 108 | -> | 分值 | 标准 | | |
| 109 | -> |------|------| | |
| 110 | -> | 90-100 | 指数退避重试、请求延迟、User-Agent 轮换、429 处理 | | |
| 111 | -> | 70-89 | 基础重试机制、固定延迟 | | |
| 112 | -> | 50-69 | 简单错误重试 | | |
| 113 | -> | 30-49 | 仅捕获异常无重试 | | |
| 114 | -> | 0-29 | 无异常处理 | | |
| 115 | -> | |
| 116 | -> **检查项**: | |
| 117 | -> - [ ] 实现重试机制(至少 3 次) | |
| 118 | -> - [ ] 请求间隔 1-3 秒 | |
| 119 | -> - [ ] 正确处理 429 Too Many Requests | |
| 120 | -> - [ ] 指数退避策略 | |
| 121 | -> | |
| 122 | -> --- | |
| 123 | -> | |
| 124 | -> ### 2.6 降级方案支持 (10%) | |
| 125 | -> | |
| 126 | -> | 分值 | 标准 | | |
| 127 | -> |------|------| | |
| 128 | -> | 90-100 | API + yt-dlp 双方案,自动故障切换 | | |
| 129 | -> | 70-89 | API 为主,yt-dlp 备选,需手动切换 | | |
| 130 | -> | 50-69 | 仅实现单一方案但文档说明其他方案 | | |
| 131 | -> | 30-49 | 方案切换逻辑存在问题 | | |
| 132 | -> | 0-29 | 无任何降级方案 | | |
| 133 | -> | |
| 134 | -> **检查项**: | |
| 135 | -> - [ ] 支持 yt-dlp 备选 | |
| 136 | -> - [ ] 分类 trending URL 支持(music/gaming/movies) | |
| 137 | -> - [ ] 自动检测 API 失败并切换 | |
| 138 | -> | |
| 139 | -> --- | |
| 140 | -> | |
| 141 | -> ### 2.7 配置灵活性 (5%) | |
| 142 | -> | |
| 143 | -> | 分值 | 标准 | | |
| 144 | -> |------|------| | |
| 145 | -> | 90-100 | region、category、maxResults 全可配置、环境变量支持 | | |
| 146 | -> | 70-89 | 主要参数可配置 | | |
| 147 | -> | 50-69 | 硬编码但关键参数可改 | | |
| 148 | -> | 30-49 | 部分参数可调 | | |
| 149 | -> | 0-29 | 完全硬编码 | | |
| 150 | -> | |
| 151 | -> **检查项**: | |
| 152 | -> - [ ] regionCode 参数支持 | |
| 153 | -> - [ ] videoCategoryId 参数支持 | |
| 154 | -> - [ ] maxResults 可配置(1-50) | |
| 155 | -> - [ ] API Key 环境变量读取 | |
| 156 | -> | |
| 157 | -> --- | |
| 158 | -> | |
| 159 | -> ### 2.8 性能优化 (5%) | |
| 160 | -> | |
| 161 | -> | 分值 | 标准 | | |
| 162 | -> |------|------| | |
| 163 | -> | 90-100 | 智能缓存、配额监控、批量请求优化 | | |
| 164 | -> | 70-89 | 基础缓存实现 | | |
| 165 | -> | 50-69 | 避免重复请求 | | |
| 166 | -> | 30-49 | 无明显性能问题 | | |
| 167 | -> | 0-29 | 重复请求、浪费资源 | | |
| 168 | -> | |
| 169 | -> **检查项**: | |
| 170 | -> - [ ] trending 数据缓存(15-30 分钟) | |
| 171 | -> - [ ] 配额使用监控 | |
| 172 | -> - [ ] 避免重复 API 调用 | |
| 173 | -> | |
| 174 | -> --- | |
| 175 | -> | |
| 176 | -> ## 3. 评分阈值 | |
| 177 | -> | |
| 178 | -> | 等级 | 总分范围 | 说明 | | |
| 179 | -> |------|----------|------| | |
| 180 | -> | **优秀** | 90-100 | 生产就绪,可直接部署 | | |
| 181 | -> | **良好** | 75-89 | 功能完善,小优化后可上线 | | |
| 182 | -> | **及格** | 60-74 | 基本可用,需要改进 | | |
| 183 | -> | **不合格** | < 60 | 无法用于生产 | | |
| 184 | -> | |
| 185 | -> **目标**: 总分 ≥ 90(优秀等级) | |
| 186 | -> | |
| 187 | -> --- | |
| 188 | -> | |
| 189 | -> ## 4. 自动化测试 Checklist | |
| 190 | -> | |
| 191 | -> ### 4.1 单元测试覆盖 | |
| 192 | -> | |
| 193 | -> - [ ] API 响应解析测试 | |
| 194 | -> - [ ] yt-dlp 输出解析测试 | |
| 195 | -> - [ ] 字段映射正确性测试 | |
| 196 | -> - [ ] 错误处理测试(模拟 429/403) | |
| 197 | -> - [ ] 参数校验测试 | |
| 198 | -> | |
| 199 | -> ### 4.2 集成测试 | |
| 200 | -> | |
| 201 | -> - [ ] 端到端 trending 数据获取 | |
| 202 | -> - [ ] 多地区(US/JP/KR)测试 | |
| 203 | -> - [ ] 多分类(Music/Gaming)测试 | |
| 204 | -> - [ ] API 配额超限降级测试 | |
| 205 | -> | |
| 206 | -> ### 4.3 边界测试 | |
| 207 | -> | |
| 208 | -> - [ ] maxResults=1(最小值) | |
| 209 | -> - [ ] maxResults=50(最大值) | |
| 210 | -> - [ ] 空 API Key 处理 | |
| 211 | -> - [ ] 网络超时处理 | |
| 212 | -> - [ ] 无效 regionCode 处理 | |
| 213 | -> | |
| 214 | -> --- | |
| 215 | -> | |
| 216 | -> ## 5. 示例评分计算 | |
| 217 | -> | |
| 218 | -> ### 示例 A: 优秀实现 | |
| 219 | -> | |
| 220 | -> | 维度 | 得分 | 权重 | 加权分 | | |
| 221 | -> |------|------|------|--------| | |
| 222 | -> | 功能完整性 | 95 | 20% | 19.0 | | |
| 223 | -> | API 规范使用 | 92 | 15% | 13.8 | | |
| 224 | -> | 代码质量 | 90 | 15% | 13.5 | | |
| 225 | -> | 数据准确性 | 95 | 15% | 14.25 | | |
| 226 | -> | 反爬虫处理 | 88 | 15% | 13.2 | | |
| 227 | -> | 降级方案支持 | 90 | 10% | 9.0 | | |
| 228 | -> | 配置灵活性 | 95 | 5% | 4.75 | | |
| 229 | -> | 性能优化 | 85 | 5% | 4.25 | | |
| 230 | -> | **总分** | - | 100% | **91.75** ✅ | | |
| 231 | -> | |
| 232 | -> ### 示例 B: 及格实现 | |
| 233 | -> | |
| 234 | -> | 维度 | 得分 | 权重 | 加权分 | | |
| 235 | -> |------|------|------|--------| | |
| 236 | -> | 功能完整性 | 70 | 20% | 14.0 | | |
| 237 | -> | API 规范使用 | 65 | 15% | 9.75 | | |
| 238 | -> | 代码质量 | 60 | 15% | 9.0 | | |
| 239 | -> | 数据准确性 | 75 | 15% | 11.25 | | |
| 240 | -> | 反爬虫处理 | 50 | 15% | 7.5 | | |
| 241 | -> | 降级方案支持 | 40 | 10% | 4.0 | | |
| 242 | -> | 配置灵活性 | 50 | 5% | 2.5 | | |
| 243 | -> | 性能优化 | 40 | 5% | 2.0 | | |
| 244 | -> | **总分** | - | 100% | **60.0** ⚠️ | | |
| 245 | -> | |
| 246 | -> --- | |
| 247 | -> | |
| 248 | -> ## 6. 评分工具使用 | |
| 249 | -> | |
| 250 | -> ```bash | |
| 251 | -> # 运行完整评测 | |
| 252 | -> node bin/lemon.js skill evaluate --skill youtube-crawler --benchmark benchmark.md | |
| 253 | -> | |
| 254 | -> # 仅运行特定维度 | |
| 255 | -> node bin/lemon.js skill evaluate --skill youtube-crawler --dimension "功能完整性" | |
| 256 | -> ``` | |
| 257 | -> | |
| 258 | -> --- | |
| 259 | -> | |
| 260 | -> **生成时间**: 2026-04-01 | |
| 261 | -> **生成者**: digester-youtube-crawler |
system/agents/master/.claude/scheduled_tasks.json
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | "cron": "*/5 * * * *", |
| 6 | 6 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 7 | 7 | "createdAt": 1776052227208, |
| 8 | - "lastFiredAt": 1776236563458, | |
| 8 | + "lastFiredAt": 1776237140678, | |
| 9 | 9 | "recurring": true |
| 10 | 10 | }, |
| 11 | 11 | { |
| ... | ... | @@ -13,7 +13,7 @@ |
| 13 | 13 | "cron": "*/30 * * * *", |
| 14 | 14 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 15 | 15 | "createdAt": 1776052245083, |
| 16 | - "lastFiredAt": 1776235255476, | |
| 16 | + "lastFiredAt": 1776237066590, | |
| 17 | 17 | "recurring": true |
| 18 | 18 | }, |
| 19 | 19 | { |
| ... | ... | @@ -21,7 +21,7 @@ |
| 21 | 21 | "cron": "*/5 * * * *", |
| 22 | 22 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 23 | 23 | "createdAt": 1776053193746, |
| 24 | - "lastFiredAt": 1776236563458, | |
| 24 | + "lastFiredAt": 1776237140678, | |
| 25 | 25 | "recurring": true |
| 26 | 26 | }, |
| 27 | 27 | { |
| ... | ... | @@ -29,7 +29,7 @@ |
| 29 | 29 | "cron": "*/30 * * * *", |
| 30 | 30 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 31 | 31 | "createdAt": 1776053222608, |
| 32 | - "lastFiredAt": 1776234920433, | |
| 32 | + "lastFiredAt": 1776236761410, | |
| 33 | 33 | "recurring": true |
| 34 | 34 | }, |
| 35 | 35 | { |
| ... | ... | @@ -37,7 +37,7 @@ |
| 37 | 37 | "cron": "*/5 * * * *", |
| 38 | 38 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 39 | 39 | "createdAt": 1776053626720, |
| 40 | - "lastFiredAt": 1776236563458, | |
| 40 | + "lastFiredAt": 1776237140678, | |
| 41 | 41 | "recurring": true |
| 42 | 42 | }, |
| 43 | 43 | { |
| ... | ... | @@ -61,7 +61,7 @@ |
| 61 | 61 | "cron": "*/5 * * * *", |
| 62 | 62 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 63 | 63 | "createdAt": 1776054205658, |
| 64 | - "lastFiredAt": 1776236563458, | |
| 64 | + "lastFiredAt": 1776237140678, | |
| 65 | 65 | "recurring": true |
| 66 | 66 | }, |
| 67 | 67 | { |
| ... | ... | @@ -69,7 +69,7 @@ |
| 69 | 69 | "cron": "*/30 * * * *", |
| 70 | 70 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 71 | 71 | "createdAt": 1776054212905, |
| 72 | - "lastFiredAt": 1776235361836, | |
| 72 | + "lastFiredAt": 1776237167710, | |
| 73 | 73 | "recurring": true |
| 74 | 74 | }, |
| 75 | 75 | { |
| ... | ... | @@ -77,7 +77,7 @@ |
| 77 | 77 | "cron": "*/5 * * * *", |
| 78 | 78 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 79 | 79 | "createdAt": 1776054895100, |
| 80 | - "lastFiredAt": 1776236563458, | |
| 80 | + "lastFiredAt": 1776237140678, | |
| 81 | 81 | "recurring": true |
| 82 | 82 | }, |
| 83 | 83 | { |
| ... | ... | @@ -93,7 +93,7 @@ |
| 93 | 93 | "cron": "*/5 * * * *", |
| 94 | 94 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 95 | 95 | "createdAt": 1776059191836, |
| 96 | - "lastFiredAt": 1776236563458, | |
| 96 | + "lastFiredAt": 1776237140678, | |
| 97 | 97 | "recurring": true |
| 98 | 98 | }, |
| 99 | 99 | { |
| ... | ... | @@ -101,7 +101,7 @@ |
| 101 | 101 | "cron": "*/30 * * * *", |
| 102 | 102 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 103 | 103 | "createdAt": 1776059200746, |
| 104 | - "lastFiredAt": 1776235226389, | |
| 104 | + "lastFiredAt": 1776237045568, | |
| 105 | 105 | "recurring": true |
| 106 | 106 | }, |
| 107 | 107 | { |
| ... | ... | @@ -109,7 +109,7 @@ |
| 109 | 109 | "cron": "*/5 * * * *", |
| 110 | 110 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 111 | 111 | "createdAt": 1776084696837, |
| 112 | - "lastFiredAt": 1776236563458, | |
| 112 | + "lastFiredAt": 1776237140678, | |
| 113 | 113 | "recurring": true |
| 114 | 114 | }, |
| 115 | 115 | { |
| ... | ... | @@ -117,7 +117,7 @@ |
| 117 | 117 | "cron": "*/30 * * * *", |
| 118 | 118 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 119 | 119 | "createdAt": 1776084700624, |
| 120 | - "lastFiredAt": 1776235145120, | |
| 120 | + "lastFiredAt": 1776236938308, | |
| 121 | 121 | "recurring": true |
| 122 | 122 | }, |
| 123 | 123 | { |
| ... | ... | @@ -125,7 +125,7 @@ |
| 125 | 125 | "cron": "*/5 * * * *", |
| 126 | 126 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 127 | 127 | "createdAt": 1776085832378, |
| 128 | - "lastFiredAt": 1776236563458, | |
| 128 | + "lastFiredAt": 1776237140678, | |
| 129 | 129 | "recurring": true |
| 130 | 130 | }, |
| 131 | 131 | { |
| ... | ... | @@ -133,7 +133,7 @@ |
| 133 | 133 | "cron": "*/30 * * * *", |
| 134 | 134 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 135 | 135 | "createdAt": 1776085832383, |
| 136 | - "lastFiredAt": 1776235118052, | |
| 136 | + "lastFiredAt": 1776236917195, | |
| 137 | 137 | "recurring": true |
| 138 | 138 | }, |
| 139 | 139 | { |
| ... | ... | @@ -141,7 +141,7 @@ |
| 141 | 141 | "cron": "*/5 * * * *", |
| 142 | 142 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 143 | 143 | "createdAt": 1776118330655, |
| 144 | - "lastFiredAt": 1776236563458, | |
| 144 | + "lastFiredAt": 1776237140678, | |
| 145 | 145 | "recurring": true |
| 146 | 146 | }, |
| 147 | 147 | { |
| ... | ... | @@ -149,7 +149,7 @@ |
| 149 | 149 | "cron": "*/30 * * * *", |
| 150 | 150 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 151 | 151 | "createdAt": 1776118330660, |
| 152 | - "lastFiredAt": 1776234858256, | |
| 152 | + "lastFiredAt": 1776236658152, | |
| 153 | 153 | "recurring": true |
| 154 | 154 | }, |
| 155 | 155 | { |
| ... | ... | @@ -157,7 +157,7 @@ |
| 157 | 157 | "cron": "*/5 * * * *", |
| 158 | 158 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 159 | 159 | "createdAt": 1776120116893, |
| 160 | - "lastFiredAt": 1776236563458, | |
| 160 | + "lastFiredAt": 1776237140678, | |
| 161 | 161 | "recurring": true |
| 162 | 162 | }, |
| 163 | 163 | { |
| ... | ... | @@ -165,7 +165,7 @@ |
| 165 | 165 | "cron": "*/30 * * * *", |
| 166 | 166 | "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。", |
| 167 | 167 | "createdAt": 1776120121001, |
| 168 | - "lastFiredAt": 1776235031832, | |
| 168 | + "lastFiredAt": 1776236831521, | |
| 169 | 169 | "recurring": true |
| 170 | 170 | }, |
| 171 | 171 | { |
| ... | ... | @@ -173,7 +173,7 @@ |
| 173 | 173 | "cron": "*/5 * * * *", |
| 174 | 174 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 175 | 175 | "createdAt": 1776138190787, |
| 176 | - "lastFiredAt": 1776236563458, | |
| 176 | + "lastFiredAt": 1776237140678, | |
| 177 | 177 | "recurring": true |
| 178 | 178 | }, |
| 179 | 179 | { |
| ... | ... | @@ -181,7 +181,7 @@ |
| 181 | 181 | "cron": "*/5 * * * *", |
| 182 | 182 | "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。", |
| 183 | 183 | "createdAt": 1776220913135, |
| 184 | - "lastFiredAt": 1776236385983, | |
| 184 | + "lastFiredAt": 1776237066590, | |
| 185 | 185 | "recurring": true |
| 186 | 186 | }, |
| 187 | 187 | { | ... | ... |