Commit cc6b1f0db93add6a82057438965e7786d56789e4
1 parent
23de2e1d
feat: Company Overview page with per-agent heartbeat controls
- Add Company Overview tab as default landing page - Show company info: status, uptime, agent count, heartbeat status - Start/Stop company buttons (activate/deactivate all agent heartbeats) - Per-agent heartbeat controls: interval dropdown, start/stop buttons - Backend APIs: GET status, POST start/shutdown, PUT/POST agent heartbeat - Track startedAt timestamp for uptime calculation - Update CEO agent.md with mandatory 5-step startup workflow - Fix company nav to default to overview tab
Showing
27 changed files
with
1722 additions
and
50 deletions
data/agents/.tasks/T-mn75tcbj.json
| ... | ... | @@ -8,5 +8,7 @@ |
| 8 | 8 | "nodeId": null, |
| 9 | 9 | "executionConvId": "task-T-mn75tcbj", |
| 10 | 10 | "createdAt": "2026-03-26T07:37:14.144Z", |
| 11 | - "status": "dispatched" | |
| 11 | + "status": "done", | |
| 12 | + "completedAt": "2026-03-26T07:45:54.272Z", | |
| 13 | + "summary": "已完成 LemonV.cc 运营体系设计,输出完整运营手册至 workspace/operations_manual.md。手册包含:1)多平台发布策略(抖音/小红书/B站/视频号差异化策略+发布时机+标题优化公式)2)数据监控指标体系(战略/内容/转化3级指标+实时监控看板+异常预警)3)内容审核标准(质量评分+合规红线+品牌调性指南)4)迭代优化机制(数据驱动闭环+A/B测试流程)5)完整SOP流程(内容生产/数据监控/危机处理)+检查清单+数据看板设计" | |
| 12 | 14 | } |
| 13 | 15 | \ No newline at end of file | ... | ... |
data/agents/.tasks/T-mn768315.json
0 → 100644
| 1 | +{ | |
| 2 | + "taskId": "T-mn768315", | |
| 3 | + "from": "master", | |
| 4 | + "to": "lemonv:ceo", | |
| 5 | + "task": "【催促执行】任务 T-mn75rjw1 行业调研已分发多时但仍未开始。请立即执行 AI 互动玩具行业深度调研,输出 workspace/industry_analysis.md。调研需包含:1)全球市场规模与趋势 2)竞品分析(Furby/Cozmo/Moxie) 3)用户画像 4)技术趋势(大模型/语音/情感计算)。完成后立即汇报。", | |
| 6 | + "priority": "P0", | |
| 7 | + "goalId": null, | |
| 8 | + "nodeId": null, | |
| 9 | + "executionConvId": "task-T-mn768315", | |
| 10 | + "createdAt": "2026-03-26T07:48:41.950Z", | |
| 11 | + "status": "dispatched" | |
| 12 | +} | |
| 0 | 13 | \ No newline at end of file | ... | ... |
data/agents/.tasks/T-mn76862j.json
0 → 100644
| 1 | +{ | |
| 2 | + "taskId": "T-mn76862j", | |
| 3 | + "from": "master", | |
| 4 | + "to": "lemonv:cto", | |
| 5 | + "task": "【催促执行】任务 T-mn75t0dg 技术架构设计已分发但仍未开始。请立即执行 LemonV.cc 技术架构设计,输出 workspace/tech_architecture.md。需包含:1)热点采集系统(爬虫/数据源/API) 2)内容生成流水线(AI剧本/角色/音频) 3)数据存储方案 4)数据反馈与迭代系统 5)系统架构图和数据流图。完成后立即汇报。", | |
| 6 | + "priority": "P0", | |
| 7 | + "goalId": null, | |
| 8 | + "nodeId": null, | |
| 9 | + "executionConvId": "task-T-mn76862j", | |
| 10 | + "createdAt": "2026-03-26T07:48:45.887Z", | |
| 11 | + "status": "dispatched" | |
| 12 | +} | |
| 0 | 13 | \ No newline at end of file | ... | ... |
data/agents/lemonv/coo/memory/hippocampus.md
0 → 100644
| 1 | +## 记忆 - 2026-03-26 | |
| 2 | + | |
| 3 | +### 已完成的重要任务 | |
| 4 | + | |
| 5 | +**T-mn75tcbj - LemonV.cc 运营体系设计** (P0) | |
| 6 | +- 状态: ✅ 已完成 | |
| 7 | +- 输出: workspace/operations_manual.md (完整运营手册) | |
| 8 | +- 内容涵盖: | |
| 9 | + - 多平台发布策略(抖音/小红书/B站/视频号差异化) | |
| 10 | + - 数据监控指标体系(3级指标 + 实时/日报/预警看板) | |
| 11 | + - 内容审核标准(质量评分 + 合规红线 + 品牌调性) | |
| 12 | + - 迭代优化机制(数据驱动闭环 + A/B测试) | |
| 13 | + - 完整 SOP 流程(内容生产/数据监控/危机处理) | |
| 14 | + - 检查清单(发布前/数据监控/审核) | |
| 15 | + - 数据看板设计(管理层/运营层/内容分析) | |
| 16 | + | |
| 17 | +### 运营体系关键设计决策 | |
| 18 | + | |
| 19 | +1. **发布平台优先级**: 抖音 > 小红书 > B站 > 视频号 | |
| 20 | +2. **核心指标**: 完播率≥40%, 互动率≥5%, 转化率≥2% | |
| 21 | +3. **内容质量红线**: 虚假宣传、侵权、不当竞争一票否决 | |
| 22 | +4. **品牌调性**: 温暖、智慧、有趣、专业、可靠 | |
| 23 | +5. **迭代频率**: 每日监控 → 每周复盘 → 每月优化 → 每季革新 | |
| 24 | + | |
| 25 | +### 待跟进事项 | |
| 26 | + | |
| 27 | +- 根据 CEO 反馈调整运营体系 | |
| 28 | +- 待招聘运营团队成员后分发具体任务 | ... | ... |
data/agents/lemonv/coo/todo.md
0 → 100644
| 1 | +# COO Todo List | |
| 2 | + | |
| 3 | +## 进行中 | |
| 4 | + | |
| 5 | +## 待处理 | |
| 6 | + | |
| 7 | +## 已完成 | |
| 8 | + | |
| 9 | +- [x] **[P0] T-mn75tcbj** - 设计 AI 互动玩具内容运营体系 (2026-03-26) | |
| 10 | + - ✅ 内容发布流程设计(多平台策略、发布时机、标题优化) | |
| 11 | + - ✅ 数据监控指标体系(播放量、互动率、完播率、转化率) | |
| 12 | + - ✅ 内容审核标准(质量标准、合规要求、品牌调性) | |
| 13 | + - ✅ 迭代优化机制(数据反馈驱动的选题/内容/策略调整) | |
| 14 | + - ✅ 运营手册输出至 workspace/operations_manual.md | |
| 15 | + - ✅ SOP流程、检查清单、数据看板设计 | ... | ... |
data/agents/lemonv/coo/workspace/operations_manual.md
0 → 100644
| 1 | +# LemonV.cc 运营体系手册 | |
| 2 | + | |
| 3 | +> **文档版本**: v1.0 | |
| 4 | +> **创建时间**: 2026-03-26 | |
| 5 | +> **维护者**: COO (lemonv:coo) | |
| 6 | +> **适用范围**: AI 互动玩具内容运营团队 | |
| 7 | + | |
| 8 | +--- | |
| 9 | + | |
| 10 | +## 目录 | |
| 11 | + | |
| 12 | +1. [运营体系概览](#一运营体系概览) | |
| 13 | +2. [内容发布流程](#二内容发布流程) | |
| 14 | +3. [数据监控指标体系](#三数据监控指标体系) | |
| 15 | +4. [内容审核标准](#四内容审核标准) | |
| 16 | +5. [迭代优化机制](#五迭代优化机制) | |
| 17 | +6. [SOP 标准操作流程](#六sop-标准操作流程) | |
| 18 | +7. [检查清单](#七检查清单) | |
| 19 | +8. [数据看板设计](#八数据看板设计) | |
| 20 | + | |
| 21 | +--- | |
| 22 | + | |
| 23 | +## 一、运营体系概览 | |
| 24 | + | |
| 25 | +### 1.1 运营目标 | |
| 26 | + | |
| 27 | +| 维度 | 目标 | 关键指标 | | |
| 28 | +|------|------|----------| | |
| 29 | +| **内容产出** | 稳定高质量内容供应 | 日更≥3条,优质率≥80% | | |
| 30 | +| **用户增长** | 持续获取新用户 | 日新增≥1000,获客成本≤5元 | | |
| 31 | +| **用户活跃** | 提升互动参与 | 互动率≥5%,完播率≥40% | | |
| 32 | +| **商业转化** | 实现内容变现 | 转化率≥2%,ARPU≥50元 | | |
| 33 | + | |
| 34 | +### 1.2 运营团队架构 | |
| 35 | + | |
| 36 | +``` | |
| 37 | +COO (运营总监) | |
| 38 | + ├── 内容运营组 | |
| 39 | + │ ├── 内容策划 (选题、脚本) | |
| 40 | + │ ├── 内容制作 (拍摄、剪辑) | |
| 41 | + │ └── 内容审核 (质量把控) | |
| 42 | + ├── 渠道运营组 | |
| 43 | + │ ├── 多平台发布 (抖音/小红书/B站/视频号) | |
| 44 | + │ ├── 社群运营 (粉丝群、私域) | |
| 45 | + │ └── KOL合作 (达人对接) | |
| 46 | + └── 数据运营组 | |
| 47 | + ├── 数据分析 (指标监控) | |
| 48 | + ├── 用户研究 (反馈收集) | |
| 49 | + └── 策略优化 (AB测试) | |
| 50 | +``` | |
| 51 | + | |
| 52 | +### 1.3 运营节奏 | |
| 53 | + | |
| 54 | +| 周期 | 重点事项 | | |
| 55 | +|------|----------| | |
| 56 | +| **每日** | 内容发布、数据监控、评论互动 | | |
| 57 | +| **每周** | 周数据分析、选题会、策略调整 | | |
| 58 | +| **每月** | 月度复盘、内容规划、团队培训 | | |
| 59 | +| **每季** | 季度目标回顾、体系优化、资源调配 | | |
| 60 | + | |
| 61 | +--- | |
| 62 | + | |
| 63 | +## 二、内容发布流程 | |
| 64 | + | |
| 65 | +### 2.1 多平台发布策略 | |
| 66 | + | |
| 67 | +#### 平台定位与内容适配 | |
| 68 | + | |
| 69 | +| 平台 | 用户画像 | 内容形式 | 发布频率 | 最佳时长 | 核心策略 | | |
| 70 | +|------|----------|----------|----------|----------|----------| | |
| 71 | +| **抖音** | Z世代/年轻父母 | 竖屏短视频 | 日更2-3条 | 15-60s | 热点追踪+算法优化 | | |
| 72 | +| **小红书** | 90后妈妈/精致女性 | 图文+视频笔记 | 日更1-2条 | 图文/30-60s | 种草内容+真实体验 | | |
| 73 | +| **B站** | 年轻人/二次元 | 横屏中长视频 | 周更2-3条 | 3-10min | 深度内容+二次创作 | | |
| 74 | +| **视频号** | 全年龄段/家庭用户 | 竖屏短视频 | 日更1-2条 | 15-60s | 私域联动+直播转化 | | |
| 75 | +| **快手** | 下沉市场/家庭用户 | 竖屏短视频 | 日更1-2条 | 15-60s | 真实感+性价比 | | |
| 76 | + | |
| 77 | +#### 平台内容差异化策略 | |
| 78 | + | |
| 79 | +**抖音** | |
| 80 | +- 前3秒必须抓住注意力(强冲突/悬念/惊喜) | |
| 81 | +- 音乐选用平台热门BGM | |
| 82 | +- 善用特效、转场提升视觉冲击力 | |
| 83 | +- 标题带#话题,参与平台活动 | |
| 84 | + | |
| 85 | +**小红书** | |
| 86 | +- 封面图必须精美、信息明确 | |
| 87 | +- 标题突出"种草"、"测评"、"宝藏" | |
| 88 | +- 正文突出真实体验和使用场景 | |
| 89 | +- 善用表情符号提升可读性 | |
| 90 | + | |
| 91 | +**B站** | |
| 92 | +- 片头3秒内说明视频价值 | |
| 93 | +- 内容结构:引入→展开→高潮→总结 | |
| 94 | +- 弹幕互动设计(提问、投票) | |
| 95 | +- 评论区置顶引导互动 | |
| 96 | + | |
| 97 | +**视频号** | |
| 98 | +- 与公众号、社群形成闭环 | |
| 99 | +- 直播+短视频联动 | |
| 100 | +- 强调"转发给需要的朋友" | |
| 101 | +- 利用社交裂变 | |
| 102 | + | |
| 103 | +### 2.2 发布时机策略 | |
| 104 | + | |
| 105 | +#### 各平台最佳发布时间 | |
| 106 | + | |
| 107 | +| 平台 | 工作日黄金时段 | 周末黄金时段 | 发布间隔 | | |
| 108 | +|------|----------------|--------------|----------| | |
| 109 | +| **抖音** | 7:00-9:00, 12:00-13:00, 18:00-22:00 | 9:00-11:00, 19:00-23:00 | ≥2小时 | | |
| 110 | +| **小红书** | 7:00-9:00, 12:00-13:00, 20:00-22:00 | 10:00-12:00, 20:00-23:00 | ≥4小时 | | |
| 111 | +| **B站** | 12:00-13:00, 18:00-24:00 | 10:00-12:00, 18:00-24:00 | ≥6小时 | | |
| 112 | +| **视频号** | 7:00-9:00, 12:00-13:00, 21:00-22:00 | 9:00-11:00, 20:00-22:00 | ≥3小时 | | |
| 113 | + | |
| 114 | +#### 发布时间规划表(示例) | |
| 115 | + | |
| 116 | +``` | |
| 117 | +工作日发布计划 | |
| 118 | +├── 07:30 抖音 - 晨间正能量内容 | |
| 119 | +├── 12:00 小红书 - 午休种草内容 | |
| 120 | +├── 18:30 抖音 - 晚间娱乐内容 | |
| 121 | +├── 20:00 视频号 - 家庭向内容 | |
| 122 | +└── 21:00 B站 - 深度内容(周一/三/五) | |
| 123 | + | |
| 124 | +周末发布计划 | |
| 125 | +├── 10:00 抖音 - 周末亲子内容 | |
| 126 | +├── 11:00 小红书 - 周末探店/体验 | |
| 127 | +├── 15:00 抖音 - 轻松娱乐内容 | |
| 128 | +├── 20:00 视频号直播 | |
| 129 | +└── 21:00 B站 - 长视频内容 | |
| 130 | +``` | |
| 131 | + | |
| 132 | +### 2.3 标题优化策略 | |
| 133 | + | |
| 134 | +#### 标题公式库 | |
| 135 | + | |
| 136 | +| 类型 | 公式 | 示例 | | |
| 137 | +|------|------|------| | |
| 138 | +| **悬念型** | 数字+悬念 | "3个让娃安静1小时的秘密,最后一个绝了" | | |
| 139 | +| **痛点型** | 痛点+解决方案 | "孩子总是哭闹?这个AI玩具让他秒变乖" | | |
| 140 | +| **对比型** | 前后对比+效果 | "从鸡飞狗跳到母慈子孝,我只用了这一招" | | |
| 141 | +| **数字型** | 数字+价值承诺 | "5分钟搞定!AI带娃的10个神操作" | | |
| 142 | +| **情感型** | 情感共鸣+场景 | "当宝宝第一次对着玩具笑出声,我哭了" | | |
| 143 | +| **权威型** | 背书+效果 | "儿科医生推荐!这个玩具太省妈了" | | |
| 144 | + | |
| 145 | +#### 关键词库 | |
| 146 | + | |
| 147 | +**核心关键词** | |
| 148 | +- AI玩具、智能玩具、互动玩具 | |
| 149 | +- 早教、启蒙、益智 | |
| 150 | +- 省妈神器、带娃神器 | |
| 151 | +- 亲子互动、陪伴成长 | |
| 152 | + | |
| 153 | +**长尾关键词** | |
| 154 | +- 适合3岁宝宝的玩具 | |
| 155 | +- 能对话的毛绒玩具 | |
| 156 | +- 不插电的AI玩具 | |
| 157 | +- 帮助语言发展的玩具 | |
| 158 | + | |
| 159 | +#### 标题 A/B 测试流程 | |
| 160 | + | |
| 161 | +1. **准备阶段**: 同一内容准备2-3个标题变体 | |
| 162 | +2. **测试阶段**: 小流量测试(各1000曝光) | |
| 163 | +3. **评估阶段**: 对比点击率、完播率 | |
| 164 | +4. **决策阶段**: 选择表现更好的标题全量发布 | |
| 165 | +5. **记录阶段**: 记录结果,优化标题公式库 | |
| 166 | + | |
| 167 | +--- | |
| 168 | + | |
| 169 | +## 三、数据监控指标体系 | |
| 170 | + | |
| 171 | +### 3.1 核心指标体系 | |
| 172 | + | |
| 173 | +#### 一级指标(战略层) | |
| 174 | + | |
| 175 | +| 指标 | 定义 | 目标值 | 监控频率 | | |
| 176 | +|------|------|--------|----------| | |
| 177 | +| **DAU** | 日活跃用户数 | 增长10%/月 | 每日 | | |
| 178 | +| **MAU** | 月活跃用户数 | 增长15%/季 | 每月 | | |
| 179 | +| **GMV** | 成交总额 | 增长20%/月 | 每日 | | |
| 180 | +| **LTV** | 用户生命周期价值 | ≥200元 | 每月 | | |
| 181 | +| **CAC** | 获客成本 | ≤5元 | 每周 | | |
| 182 | + | |
| 183 | +#### 二级指标(内容层) | |
| 184 | + | |
| 185 | +| 指标 | 定义 | 计算公式 | 目标值 | 监控频率 | | |
| 186 | +|------|------|----------|--------|----------| | |
| 187 | +| **播放量** | 视频播放次数 | - | 单条≥1万 | 实时 | | |
| 188 | +| **完播率** | 完整播放比例 | 完播次数/播放次数 | ≥40% | 每日 | | |
| 189 | +| **互动率** | 互动行为比例 | (赞+评+转+藏)/播放量 | ≥5% | 每日 | | |
| 190 | +| **点赞率** | 点赞比例 | 点赞数/播放量 | ≥3% | 每日 | | |
| 191 | +| **评论率** | 评论比例 | 评论数/播放量 | ≥0.5% | 每日 | | |
| 192 | +| **转发率** | 转发比例 | 转发数/播放量 | ≥0.3% | 每日 | | |
| 193 | +| **收藏率** | 收藏比例 | 收藏数/播放量 | ≥0.5% | 每日 | | |
| 194 | + | |
| 195 | +#### 三级指标(转化层) | |
| 196 | + | |
| 197 | +| 指标 | 定义 | 计算公式 | 目标值 | 监控频率 | | |
| 198 | +|------|------|----------|--------|----------| | |
| 199 | +| **点击率(CTR)** | 点击链接比例 | 点击数/曝光数 | ≥5% | 每日 | | |
| 200 | +| **转化率(CVR)** | 完成购买比例 | 订单数/点击数 | ≥2% | 每日 | | |
| 201 | +| **客单价** | 平均订单金额 | GMV/订单数 | ≥150元 | 每日 | | |
| 202 | +| **复购率** | 再次购买比例 | 复购用户数/总用户数 | ≥20% | 每月 | | |
| 203 | +| **退款率** | 退款订单比例 | 退款订单数/总订单数 | ≤3% | 每周 | | |
| 204 | + | |
| 205 | +### 3.2 数据监控看板 | |
| 206 | + | |
| 207 | +#### 实时看板(5分钟刷新) | |
| 208 | + | |
| 209 | +``` | |
| 210 | +┌─────────────────────────────────────────────────────────────┐ | |
| 211 | +│ 实时数据监控看板 │ | |
| 212 | +├─────────────────────────────────────────────────────────────┤ | |
| 213 | +│ 今日播放量 今日互动数 今日转化数 实时在线 │ | |
| 214 | +│ 128,456 6,892 245 1,234 │ | |
| 215 | +│ ↑ 23% ↑ 18% ↑ 12% ↑ 5% │ | |
| 216 | +├─────────────────────────────────────────────────────────────┤ | |
| 217 | +│ 热门内容TOP3 │ 流量来源分布 │ | |
| 218 | +│ 1. 视频A - 45,230播放 │ 抖音 45% ▓▓▓▓▓▓▓▓▓▓ │ | |
| 219 | +│ 2. 视频B - 32,105播放 │ 小红书 25% ▓▓▓▓▓▓ │ | |
| 220 | +│ 3. 视频C - 28,670播放 │ B站 15% ▓▓▓▓ │ | |
| 221 | +│ │ 其他 15% ▓▓▓▓ │ | |
| 222 | +└─────────────────────────────────────────────────────────────┘ | |
| 223 | +``` | |
| 224 | + | |
| 225 | +#### 日报看板 | |
| 226 | + | |
| 227 | +| 指标 | 今日数据 | 昨日数据 | 周同比 | 状态 | | |
| 228 | +|------|----------|----------|--------|------| | |
| 229 | +| 内容发布数 | 5条 | 4条 | +25% | 🟢 | | |
| 230 | +| 总播放量 | 128,456 | 104,380 | +23% | 🟢 | | |
| 231 | +| 平均完播率 | 42% | 38% | +10% | 🟢 | | |
| 232 | +| 平均互动率 | 5.4% | 4.8% | +12% | 🟢 | | |
| 233 | +| 引流点击数 | 1,230 | 1,100 | +12% | 🟢 | | |
| 234 | +| 订单数 | 45 | 38 | +18% | 🟢 | | |
| 235 | +| 退款数 | 1 | 2 | -50% | 🟢 | | |
| 236 | + | |
| 237 | +#### 异常预警阈值 | |
| 238 | + | |
| 239 | +| 指标 | 预警阈值 | 处理时限 | | |
| 240 | +|------|----------|----------| | |
| 241 | +| 播放量较均值下降 | >30% | 2小时内 | | |
| 242 | +| 互动率低于目标 | <3% | 4小时内 | | |
| 243 | +| 完播率低于目标 | <30% | 当日 | | |
| 244 | +| 转化率低于目标 | <1% | 当日 | | |
| 245 | +| 负面评论激增 | >10条/小时 | 1小时内 | | |
| 246 | +| 投诉/举报 | 任何 | 30分钟内 | | |
| 247 | + | |
| 248 | +### 3.3 数据分析方法论 | |
| 249 | + | |
| 250 | +#### 内容表现分析框架 | |
| 251 | + | |
| 252 | +``` | |
| 253 | +内容健康度评分 = | |
| 254 | + 完播率 * 30% + | |
| 255 | + 互动率 * 25% + | |
| 256 | + 转发率 * 20% + | |
| 257 | + 收藏率 * 15% + | |
| 258 | + 涨粉率 * 10% | |
| 259 | + | |
| 260 | +评分标准: | |
| 261 | +- 90-100分: 爆款内容,加大推广 | |
| 262 | +- 70-89分: 优质内容,保持风格 | |
| 263 | +- 50-69分: 普通内容,需要优化 | |
| 264 | +- <50分: 低效内容,分析原因 | |
| 265 | +``` | |
| 266 | + | |
| 267 | +#### 用户行为漏斗分析 | |
| 268 | + | |
| 269 | +``` | |
| 270 | +曝光 → 点击 → 播放 → 完播 → 互动 → 转化 → 复购 | |
| 271 | + │ │ │ │ │ │ │ | |
| 272 | + │ │ │ │ │ │ └─ 复购率目标: ≥20% | |
| 273 | + │ │ │ │ │ └─ 转化率目标: ≥2% | |
| 274 | + │ │ │ │ └─ 互动率目标: ≥5% | |
| 275 | + │ │ │ └─ 完播率目标: ≥40% | |
| 276 | + │ │ └─ 播放率目标: ≥60% | |
| 277 | + │ └─ 点击率目标: ≥5% | |
| 278 | + └─ 曝光量目标: 日增10% | |
| 279 | + | |
| 280 | +流失节点分析: | |
| 281 | +- 曝光→点击: 优化标题/封面 | |
| 282 | +- 点击→播放: 优化加载速度/前3秒 | |
| 283 | +- 播放→完播: 优化内容节奏/悬念设置 | |
| 284 | +- 完播→互动: 增加互动引导 | |
| 285 | +- 互动→转化: 优化转化路径/CTA | |
| 286 | +- 转化→复购: 优化产品体验/售后 | |
| 287 | +``` | |
| 288 | + | |
| 289 | +--- | |
| 290 | + | |
| 291 | +## 四、内容审核标准 | |
| 292 | + | |
| 293 | +### 4.1 质量标准 | |
| 294 | + | |
| 295 | +#### 内容评分维度 | |
| 296 | + | |
| 297 | +| 维度 | 权重 | 优秀标准 | 合格标准 | 不合格 | | |
| 298 | +|------|------|----------|----------|--------| | |
| 299 | +| **创意性** | 25% | 独特视角,有记忆点 | 有一定新意 | 同质化严重 | | |
| 300 | +| **信息价值** | 25% | 干货满满,有收获感 | 有一定信息量 | 空洞无物 | | |
| 301 | +| **制作质量** | 20% | 画面清晰,剪辑流畅 | 基本合格 | 画面模糊/剪辑混乱 | | |
| 302 | +| **情感共鸣** | 15% | 强烈共鸣,引发分享 | 有一定感染力 | 毫无感染力 | | |
| 303 | +| **品牌契合** | 15% | 完美体现品牌调性 | 基本符合 | 偏离品牌定位 | | |
| 304 | + | |
| 305 | +#### 评分标准 | |
| 306 | + | |
| 307 | +- **A级 (90-100分)**: 优质内容,优先推荐,可加大投放 | |
| 308 | +- **B级 (70-89分)**: 良好内容,正常发布,持续优化 | |
| 309 | +- **C级 (50-69分)**: 合格内容,建议修改后再发 | |
| 310 | +- **D级 (<50分)**: 不合格内容,禁止发布,重新制作 | |
| 311 | + | |
| 312 | +### 4.2 合规要求 | |
| 313 | + | |
| 314 | +#### 内容红线(一票否决) | |
| 315 | + | |
| 316 | +| 类别 | 禁止内容 | 处罚措施 | | |
| 317 | +|------|----------|----------| | |
| 318 | +| **违法违规** | 违反法律法规、危害国家安全 | 删除+封号+上报 | | |
| 319 | +| **虚假宣传** | 夸大功效、虚假承诺、误导消费者 | 删除+整改+警告 | | |
| 320 | +| **侵权内容** | 盗用他人作品、侵犯肖像权/版权 | 删除+道歉+赔偿 | | |
| 321 | +| **不当竞争** | 贬低竞品、恶意对比、造谣中伤 | 删除+整改+警告 | | |
| 322 | +| **隐私泄露** | 泄露用户/儿童隐私信息 | 删除+整改+培训 | | |
| 323 | +| **危险行为** | 展示危险玩法、不当使用方式 | 删除+整改+警示 | | |
| 324 | + | |
| 325 | +#### 儿童内容特殊要求 | |
| 326 | + | |
| 327 | +| 要求项 | 具体标准 | | |
| 328 | +|--------|----------| | |
| 329 | +| **年龄标注** | 必须清晰标注适用年龄 | | |
| 330 | +| **安全提示** | 含小零件需标注窒息风险 | | |
| 331 | +| **使用监督** | 强调家长陪伴和指导 | | |
| 332 | +| **内容健康** | 禁止暴力、恐怖、色情暗示 | | |
| 333 | +| **隐私保护** | 不得收集儿童个人信息 | | |
| 334 | +| **广告规范** | 符合儿童广告相关规定 | | |
| 335 | + | |
| 336 | +### 4.3 品牌调性标准 | |
| 337 | + | |
| 338 | +#### LemonV 品牌人格 | |
| 339 | + | |
| 340 | +| 维度 | 品牌特质 | 内容表现 | | |
| 341 | +|------|----------|----------| | |
| 342 | +| **温暖** | 像家人一样关怀 | 语言亲切,关注情感需求 | | |
| 343 | +| **智慧** | AI赋能的科技感 | 展示技术实力,但不冰冷 | | |
| 344 | +| **有趣** | 让带娃变得轻松 | 幽默风趣,制造惊喜 | | |
| 345 | +| **专业** | 早教专家的品质 | 内容有据可依,不瞎说 | | |
| 346 | +| **可靠** | 值得信赖的伙伴 | 承诺必达,问题必解 | | |
| 347 | + | |
| 348 | +#### 内容语言风格指南 | |
| 349 | + | |
| 350 | +**✅ 应该说** | |
| 351 | +- "这款AI玩具能帮孩子..." | |
| 352 | +- "作为两个孩子的妈妈,我发现..." | |
| 353 | +- "让我们一起来看看..." | |
| 354 | +- "这个功能真的太实用了..." | |
| 355 | + | |
| 356 | +**❌ 禁止说** | |
| 357 | +- "不买就会落后..."(制造焦虑) | |
| 358 | +- "别人家孩子都..."(攀比心理) | |
| 359 | +- "保证孩子一定..."(过度承诺) | |
| 360 | +- 任何贬低父母的表述 | |
| 361 | + | |
| 362 | +#### 视觉风格规范 | |
| 363 | + | |
| 364 | +| 元素 | 规范 | | |
| 365 | +|------|------| | |
| 366 | +| **主色调** | 温暖橙(#FF6B35) + 天空蓝(#4ECDC4) | | |
| 367 | +| **字体** | 圆体/手写体为主,体现亲和力 | | |
| 368 | +| **画面** | 明亮、温馨、真实场景 | | |
| 369 | +| **人物** | 多样化家庭,避免刻板印象 | | |
| 370 | +| **产品** | 清晰展示,突出互动场景 | | |
| 371 | + | |
| 372 | +--- | |
| 373 | + | |
| 374 | +## 五、迭代优化机制 | |
| 375 | + | |
| 376 | +### 5.1 数据驱动的迭代闭环 | |
| 377 | + | |
| 378 | +``` | |
| 379 | +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ | |
| 380 | +│ 数据收集 │ → │ 分析洞察 │ → │ 策略调整 │ → │ 执行验证 │ | |
| 381 | +└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ | |
| 382 | + ↑ │ | |
| 383 | + └──────────────────────────────────────────────────────┘ | |
| 384 | + 反馈闭环 | |
| 385 | +``` | |
| 386 | + | |
| 387 | +### 5.2 选题优化机制 | |
| 388 | + | |
| 389 | +#### 选题表现追踪表 | |
| 390 | + | |
| 391 | +| 选题方向 | 发布数 | 平均播放量 | 平均互动率 | 爆款率 | 趋势判断 | | |
| 392 | +|----------|--------|------------|------------|--------|----------| | |
| 393 | +| 产品测评 | 20 | 35,000 | 6.2% | 25% | 🔥 加强 | | |
| 394 | +| 使用教程 | 15 | 28,000 | 5.8% | 20% | ✅ 保持 | | |
| 395 | +| 亲子互动 | 18 | 42,000 | 7.5% | 35% | 🔥 加强 | | |
| 396 | +| 育儿知识 | 12 | 15,000 | 3.2% | 8% | ⚠️ 优化 | | |
| 397 | +| 用户故事 | 10 | 38,000 | 8.2% | 30% | 🔥 加强 | | |
| 398 | + | |
| 399 | +#### 选题迭代决策树 | |
| 400 | + | |
| 401 | +``` | |
| 402 | +选题表现评估 | |
| 403 | + │ | |
| 404 | + ├─ 播放量高 + 互动率高 → 加大投入,形成系列 | |
| 405 | + │ | |
| 406 | + ├─ 播放量高 + 互动率低 → 优化内容钩子,增加互动引导 | |
| 407 | + │ | |
| 408 | + ├─ 播放量低 + 互动率高 → 优化标题封面,提升点击率 | |
| 409 | + │ | |
| 410 | + └─ 播放量低 + 互动率低 → 暂停该选题方向,分析原因 | |
| 411 | +``` | |
| 412 | + | |
| 413 | +### 5.3 内容优化机制 | |
| 414 | + | |
| 415 | +#### 完播率优化策略 | |
| 416 | + | |
| 417 | +| 完播率区间 | 问题诊断 | 优化策略 | | |
| 418 | +|------------|----------|----------| | |
| 419 | +| <20% | 开头不吸引 | 优化前3秒,强钩子开场 | | |
| 420 | +| 20-40% | 节奏拖沓 | 加快节奏,删减冗余 | | |
| 421 | +| 40-60% | 中段流失 | 增加转折点/悬念 | | |
| 422 | +| >60% | 表现良好 | 保持风格,分析成功因素 | | |
| 423 | + | |
| 424 | +#### 互动率优化策略 | |
| 425 | + | |
| 426 | +| 互动类型 | 优化方法 | | |
| 427 | +|----------|----------| | |
| 428 | +| **点赞** | 内容有价值感、情感共鸣、实用干货 | | |
| 429 | +| **评论** | 结尾提问、争议性观点、求助互动 | | |
| 430 | +| **转发** | 社交货币、身份表达、实用价值 | | |
| 431 | +| **收藏** | 干货总结、教程攻略、资源汇总 | | |
| 432 | + | |
| 433 | +### 5.4 发布策略优化 | |
| 434 | + | |
| 435 | +#### A/B 测试清单 | |
| 436 | + | |
| 437 | +| 测试项 | 测试方案 | 评估指标 | 测试周期 | | |
| 438 | +|--------|----------|----------|----------| | |
| 439 | +| 发布时间 | A:早7点 vs B:晚8点 | 播放量、互动率 | 1周 | | |
| 440 | +| 视频时长 | A:15s vs B:60s | 完播率、互动率 | 2周 | | |
| 441 | +| 标题风格 | A:悬念型 vs B:数字型 | 点击率 | 1周 | | |
| 442 | +| 封面设计 | A:人物 vs B:产品特写 | 点击率 | 1周 | | |
| 443 | +| CTA位置 | A:开头 vs B:结尾 | 转化率 | 2周 | | |
| 444 | + | |
| 445 | +#### 发布策略迭代流程 | |
| 446 | + | |
| 447 | +1. **数据监控**: 每日跟踪各内容表现 | |
| 448 | +2. **周度复盘**: 每周分析哪些策略有效 | |
| 449 | +3. **月度优化**: 基于数据调整发布计划 | |
| 450 | +4. **季度革新**: 大版本策略更新 | |
| 451 | + | |
| 452 | +--- | |
| 453 | + | |
| 454 | +## 六、SOP 标准操作流程 | |
| 455 | + | |
| 456 | +### 6.1 内容生产 SOP | |
| 457 | + | |
| 458 | +#### 阶段一:选题策划(每周一) | |
| 459 | + | |
| 460 | +``` | |
| 461 | +Step 1: 数据回顾 | |
| 462 | +├── 回顾上周内容表现数据 | |
| 463 | +├── 识别高表现选题方向 | |
| 464 | +└── 分析低表现内容原因 | |
| 465 | + | |
| 466 | +Step 2: 热点洞察 | |
| 467 | +├── 查看平台热榜/热搜 | |
| 468 | +├── 分析竞品热门内容 | |
| 469 | +└── 收集用户反馈和需求 | |
| 470 | + | |
| 471 | +Step 3: 选题确定 | |
| 472 | +├── 确定本周核心选题(3-5个) | |
| 473 | +├── 制定内容排期表 | |
| 474 | +└── 分配制作任务 | |
| 475 | + | |
| 476 | +输出: 周内容排期表 | |
| 477 | +``` | |
| 478 | + | |
| 479 | +#### 阶段二:内容制作(每周二-五) | |
| 480 | + | |
| 481 | +``` | |
| 482 | +Step 1: 脚本撰写 | |
| 483 | +├── 明确内容目标和核心信息 | |
| 484 | +├── 撰写脚本(开头3秒+内容主体+CTA) | |
| 485 | +├── 内部审核脚本 | |
| 486 | +└── 输出: 审核通过的脚本 | |
| 487 | + | |
| 488 | +Step 2: 拍摄/制作 | |
| 489 | +├── 准备场景和道具 | |
| 490 | +├── 按脚本拍摄/制作 | |
| 491 | +├── 素材整理备份 | |
| 492 | +└── 输出: 原始素材 | |
| 493 | + | |
| 494 | +Step 3: 后期剪辑 | |
| 495 | +├── 粗剪:筛选素材,拼接结构 | |
| 496 | +├── 精剪:添加字幕、特效、音乐 | |
| 497 | +├── 调色:统一视觉风格 | |
| 498 | +├── 终审:输出成品 | |
| 499 | +└── 输出: 成品视频 | |
| 500 | +``` | |
| 501 | + | |
| 502 | +#### 阶段三:审核发布(每日) | |
| 503 | + | |
| 504 | +``` | |
| 505 | +Step 1: 内容审核 | |
| 506 | +├── 自审:制作人员自查 | |
| 507 | +├── 复审:审核人员全面检查 | |
| 508 | +├── 终审:负责人确认 | |
| 509 | +└── 输出: 审核通过/修改意见 | |
| 510 | + | |
| 511 | +Step 2: 发布准备 | |
| 512 | +├── 撰写标题和描述 | |
| 513 | +├── 制作封面图 | |
| 514 | +├── 准备话题标签 | |
| 515 | +└── 设置发布时间 | |
| 516 | + | |
| 517 | +Step 3: 正式发布 | |
| 518 | +├── 按排期时间发布 | |
| 519 | +├── 发布后30分钟监控数据 | |
| 520 | +├── 及时回复评论 | |
| 521 | +└── 记录发布数据 | |
| 522 | +``` | |
| 523 | + | |
| 524 | +### 6.2 数据监控 SOP | |
| 525 | + | |
| 526 | +#### 每日数据监控流程 | |
| 527 | + | |
| 528 | +``` | |
| 529 | +09:00 - 查看昨日数据日报 | |
| 530 | + ├── 对比目标完成情况 | |
| 531 | + ├── 识别异常数据 | |
| 532 | + └── 标记需关注内容 | |
| 533 | + | |
| 534 | +12:00 - 午间数据检查 | |
| 535 | + ├── 上午发布内容表现 | |
| 536 | + ├── 互动评论回复 | |
| 537 | + └── 处理紧急问题 | |
| 538 | + | |
| 539 | +18:00 - 晚间数据检查 | |
| 540 | + ├── 全天数据汇总 | |
| 541 | + ├── 明日发布准备确认 | |
| 542 | + └── 问题升级汇报 | |
| 543 | + | |
| 544 | +22:00 - 夜间数据检查(值班) | |
| 545 | + ├── 监控异常预警 | |
| 546 | + └── 处理紧急事务 | |
| 547 | +``` | |
| 548 | + | |
| 549 | +#### 每周数据复盘流程 | |
| 550 | + | |
| 551 | +``` | |
| 552 | +周一上午 - 周数据复盘会 | |
| 553 | +Step 1: 数据回顾 (30分钟) | |
| 554 | +├── 关键指标达成情况 | |
| 555 | +├── 内容表现TOP10/BOTTOM10 | |
| 556 | +├── 各平台数据对比 | |
| 557 | +└── 用户增长和画像变化 | |
| 558 | + | |
| 559 | +Step 2: 问题分析 (30分钟) | |
| 560 | +├── 未达标指标原因分析 | |
| 561 | +├── 用户反馈问题汇总 | |
| 562 | +├── 竞品动态分析 | |
| 563 | +└── 技术和流程问题 | |
| 564 | + | |
| 565 | +Step 3: 策略调整 (30分钟) | |
| 566 | +├── 下周内容选题调整 | |
| 567 | +├── 发布策略优化 | |
| 568 | +├── 资源调配决策 | |
| 569 | +└── 行动计划分配 | |
| 570 | + | |
| 571 | +输出: 周复盘报告 + 下周行动计划 | |
| 572 | +``` | |
| 573 | + | |
| 574 | +### 6.3 危机处理 SOP | |
| 575 | + | |
| 576 | +#### 负面舆情处理流程 | |
| 577 | + | |
| 578 | +``` | |
| 579 | +Level 1: 一般负面评论 (1-2条) | |
| 580 | +├── 监控人员发现 | |
| 581 | +├── 24小时内回复处理 | |
| 582 | +├── 记录备案 | |
| 583 | +└── 无需升级 | |
| 584 | + | |
| 585 | +Level 2: 集中负面反馈 (>5条/小时) | |
| 586 | +├── 立即通知运营负责人 | |
| 587 | +├── 2小时内制定回应方案 | |
| 588 | +├── 协调产品/客服配合 | |
| 589 | +├── 持续监控舆情发展 | |
| 590 | +└── 当日提交事件报告 | |
| 591 | + | |
| 592 | +Level 3: 重大舆情危机 (热搜/媒体介入) | |
| 593 | +├── 立即启动危机响应小组 | |
| 594 | +├── 1小时内上报CEO | |
| 595 | +├── 暂停相关推广 | |
| 596 | +├── 统一对外口径 | |
| 597 | +├── 法务/PR介入 | |
| 598 | +└── 每小时汇报进展 | |
| 599 | +``` | |
| 600 | + | |
| 601 | +--- | |
| 602 | + | |
| 603 | +## 七、检查清单 | |
| 604 | + | |
| 605 | +### 7.1 内容发布前检查清单 | |
| 606 | + | |
| 607 | +#### 基础信息检查 | |
| 608 | + | |
| 609 | +- [ ] 视频文件已导出,画质清晰 | |
| 610 | +- [ ] 视频时长符合平台要求 | |
| 611 | +- [ ] 封面图已制作,清晰醒目 | |
| 612 | +- [ ] 标题已撰写,符合规范 | |
| 613 | +- [ ] 描述文案已完成 | |
| 614 | +- [ ] 话题标签已添加 | |
| 615 | +- [ ] 关联商品/链接已设置 | |
| 616 | + | |
| 617 | +#### 内容质量检查 | |
| 618 | + | |
| 619 | +- [ ] 前3秒能抓住注意力 | |
| 620 | +- [ ] 内容无明显错误 | |
| 621 | +- [ ] 字幕准确无错别字 | |
| 622 | +- [ ] 背景音乐音量适中 | |
| 623 | +- [ ] 品牌露出自然不突兀 | |
| 624 | +- [ ] CTA引导清晰 | |
| 625 | + | |
| 626 | +#### 合规检查 | |
| 627 | + | |
| 628 | +- [ ] 无违规内容 | |
| 629 | +- [ ] 年龄标注清晰(如适用) | |
| 630 | +- [ ] 安全提示已添加(如适用) | |
| 631 | +- [ ] 无侵权素材 | |
| 632 | +- [ ] 无虚假宣传 | |
| 633 | + | |
| 634 | +### 7.2 数据监控检查清单 | |
| 635 | + | |
| 636 | +#### 每日检查 | |
| 637 | + | |
| 638 | +- [ ] 查看昨日数据日报 | |
| 639 | +- [ ] 检查各平台发布状态 | |
| 640 | +- [ ] 回复用户评论(>90%) | |
| 641 | +- [ ] 监控异常数据预警 | |
| 642 | +- [ ] 记录当日关键数据 | |
| 643 | + | |
| 644 | +#### 每周检查 | |
| 645 | + | |
| 646 | +- [ ] 完成周数据复盘 | |
| 647 | +- [ ] 更新内容选题库 | |
| 648 | +- [ ] 检查竞品动态 | |
| 649 | +- [ ] 优化发布排期 | |
| 650 | +- [ ] 团队进度同步会 | |
| 651 | + | |
| 652 | +#### 每月检查 | |
| 653 | + | |
| 654 | +- [ ] 月度目标达成评估 | |
| 655 | +- [ ] 运营体系健康度检查 | |
| 656 | +- [ ] 团队绩效评估 | |
| 657 | +- [ ] 下月运营计划制定 | |
| 658 | +- [ ] 运营手册更新 | |
| 659 | + | |
| 660 | +### 7.3 审核检查清单 | |
| 661 | + | |
| 662 | +#### 初审清单(制作人员) | |
| 663 | + | |
| 664 | +- [ ] 脚本与成品一致性 | |
| 665 | +- [ ] 技术质量(画面/声音/剪辑) | |
| 666 | +- [ ] 内容完整性 | |
| 667 | +- [ ] 基础合规检查 | |
| 668 | + | |
| 669 | +#### 复审清单(审核人员) | |
| 670 | + | |
| 671 | +- [ ] 内容质量评分 | |
| 672 | +- [ ] 品牌调性符合度 | |
| 673 | +- [ ] 完整合规检查 | |
| 674 | +- [ ] 平台适配性检查 | |
| 675 | + | |
| 676 | +#### 终审清单(负责人) | |
| 677 | + | |
| 678 | +- [ ] 整体质量把关 | |
| 679 | +- [ ] 发布时机确认 | |
| 680 | +- [ ] 风险最终评估 | |
| 681 | +- [ ] 发布授权 | |
| 682 | + | |
| 683 | +--- | |
| 684 | + | |
| 685 | +## 八、数据看板设计 | |
| 686 | + | |
| 687 | +### 8.1 管理层看板 | |
| 688 | + | |
| 689 | +#### 战略仪表盘(CEO/CXO 级别) | |
| 690 | + | |
| 691 | +``` | |
| 692 | +┌────────────────────────────────────────────────────────────────────┐ | |
| 693 | +│ LemonV 运营战略仪表盘 │ | |
| 694 | +│ 数据日期: 2026-03-26 │ | |
| 695 | +├────────────────────────────────────────────────────────────────────┤ | |
| 696 | +│ │ | |
| 697 | +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ | |
| 698 | +│ │ 月活用户 │ │ 月营收 │ │ 获客成本 │ │ 用户LTV │ │ | |
| 699 | +│ │ │ │ │ │ │ │ │ │ | |
| 700 | +│ │ 125.4K │ │ ¥486.2K │ │ ¥4.2 │ │ ¥218 │ │ | |
| 701 | +│ │ ↑ 18% │ │ ↑ 22% │ │ ↓ 8% │ │ ↑ 12% │ │ | |
| 702 | +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ | |
| 703 | +│ │ | |
| 704 | +├────────────────────────────────────────────────────────────────────┤ | |
| 705 | +│ │ | |
| 706 | +│ 月度趋势图 渠道贡献占比 │ | |
| 707 | +│ ┌──────────────────────────────────┐ ┌───────────────┐ │ | |
| 708 | +│ │ \\ / │ │ 抖音 42% │ │ | |
| 709 | +│ │ \\ /\\ / │ │ 小红书 28% │ │ | |
| 710 | +│ │ \\ / \\ /\\ / │ │ B站 18% │ │ | |
| 711 | +│ │ \\ / \\ / \\ / │ │ 视频号 12% │ │ | |
| 712 | +│ │ \\__/ \\/ \\_/ │ └───────────────┘ │ | |
| 713 | +│ └──────────────────────────────────┘ │ | |
| 714 | +│ 1月 2月 3月 4月 5月 6月 │ | |
| 715 | +│ │ | |
| 716 | +├────────────────────────────────────────────────────────────────────┤ | |
| 717 | +│ 本周关键行动 │ | |
| 718 | +│ ├── ✅ 亲子互动系列内容播放量提升35%,计划扩展为固定栏目 │ | |
| 719 | +│ ├── ⚠️ 育儿知识类内容表现下滑,需优化内容形式 │ | |
| 720 | +│ └── 🔥 视频号直播转化效果突出,计划增加直播频次 │ | |
| 721 | +│ │ | |
| 722 | +└────────────────────────────────────────────────────────────────────┘ | |
| 723 | +``` | |
| 724 | + | |
| 725 | +### 8.2 运营层看板 | |
| 726 | + | |
| 727 | +#### 日常运营仪表盘 | |
| 728 | + | |
| 729 | +``` | |
| 730 | +┌────────────────────────────────────────────────────────────────────┐ | |
| 731 | +│ LemonV 日常运营仪表盘 │ | |
| 732 | +├────────────────────────────────────────────────────────────────────┤ | |
| 733 | +│ │ | |
| 734 | +│ 今日核心指标 │ | |
| 735 | +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ | |
| 736 | +│ │ 发布数 │ │ 播放量 │ │ 互动数 │ │ 引流数 │ │ 订单数 │ │ | |
| 737 | +│ │ 5 │ │ 128,456 │ │ 6,892 │ │ 1,230 │ │ 45 │ │ | |
| 738 | +│ │ ↑ 1 │ │ ↑ 23% │ │ ↑ 18% │ │ ↑ 12% │ │ ↑ 18% │ │ | |
| 739 | +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ | |
| 740 | +│ │ | |
| 741 | +├────────────────────────────────────────────────────────────────────┤ | |
| 742 | +│ │ | |
| 743 | +│ 平台数据分布 内容表现TOP5 │ | |
| 744 | +│ ┌──────────────────────┐ ┌──────────────────────────────┐ │ | |
| 745 | +│ │ 抖音 ████████ 45% │ │ 1. 亲子互动挑战 │ 45,230 │ 🟢 │ │ | |
| 746 | +│ │ 小红书 ██████ 28% │ │ 2. 产品测评#12 │ 32,105 │ 🟢 │ │ | |
| 747 | +│ │ B站 ████ 18% │ │ 3. 用户故事#8 │ 28,670 │ 🟢 │ │ | |
| 748 | +│ │ 视频号 ██ 9% │ │ 4. 使用教程#15 │ 18,420 │ 🟡 │ │ | |
| 749 | +│ └──────────────────────┘ │ 5. 育儿知识#7 │ 8,560 │ 🔴 │ │ | |
| 750 | +│ └──────────────────────────────┘ │ | |
| 751 | +│ │ | |
| 752 | +├────────────────────────────────────────────────────────────────────┤ | |
| 753 | +│ 待办事项 │ | |
| 754 | +│ ├── [审核] 明日发布内容待终审 (3条) │ | |
| 755 | +│ ├── [回复] 待回复用户评论 (23条) │ | |
| 756 | +│ ├── [优化] 视频号封面点击率低于均值,需优化 │ | |
| 757 | +│ └── [预警] 小红书账号互动率连续2天下降 │ | |
| 758 | +│ │ | |
| 759 | +└────────────────────────────────────────────────────────────────────┘ | |
| 760 | +``` | |
| 761 | + | |
| 762 | +### 8.3 内容分析看板 | |
| 763 | + | |
| 764 | +#### 内容效果分析表 | |
| 765 | + | |
| 766 | +| 内容ID | 标题 | 平台 | 播放量 | 完播率 | 互动率 | 质量评分 | 标签 | | |
| 767 | +|--------|------|------|--------|--------|--------|----------|------| | |
| 768 | +| V-001 | 3个让娃安静1小时的秘密 | 抖音 | 45,230 | 48% | 7.2% | 92 | 爆款 | | |
| 769 | +| V-002 | AI玩具开箱测评 | 小红书 | 32,105 | 42% | 6.8% | 88 | 优质 | | |
| 770 | +| V-003 | 宝宝的第一句话 | B站 | 28,670 | 55% | 8.5% | 95 | 爆款 | | |
| 771 | +| V-004 | 早教玩具怎么选 | 抖音 | 18,420 | 35% | 4.2% | 65 | 普通 | | |
| 772 | +| V-005 | 儿童语言发展指南 | 视频号 | 8,560 | 28% | 2.1% | 45 | 低效 | | |
| 773 | + | |
| 774 | +#### 用户画像看板 | |
| 775 | + | |
| 776 | +``` | |
| 777 | +┌────────────────────────────────────────────────────────────────────┐ | |
| 778 | +│ 用户画像分析 │ | |
| 779 | +├────────────────────────────────────────────────────────────────────┤ | |
| 780 | +│ │ | |
| 781 | +│ 性别分布 年龄分布 地域分布 │ | |
| 782 | +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ | |
| 783 | +│ │ 女性 78% │ │ 25-30 35% │ │ 一线城市 42% │ │ | |
| 784 | +│ │ 男性 22% │ │ 31-35 40% │ │ 新一线 28% │ │ | |
| 785 | +│ └──────────────┘ │ 36-40 20% │ │ 二线 18% │ │ | |
| 786 | +│ │ 其他 5% │ │ 其他 12% │ │ | |
| 787 | +│ └──────────────┘ └──────────────┘ │ | |
| 788 | +│ │ | |
| 789 | +│ 兴趣标签TOP10 │ | |
| 790 | +│ ┌────────────────────────────────────────────────────────────┐ │ | |
| 791 | +│ │ 育儿经验(85%) 早教启蒙(78%) 母婴用品(72%) 亲子活动(68%) │ │ | |
| 792 | +│ │ 玩具测评(65%) 绘本阅读(58%) 辅食制作(52%) 孕期知识(45%) │ │ | |
| 793 | +│ │ 儿童心理(42%) 家庭教育(38%) │ │ | |
| 794 | +│ └────────────────────────────────────────────────────────────┘ │ | |
| 795 | +│ │ | |
| 796 | +│ 活跃时段: 7:00-9:00, 12:00-13:00, 20:00-22:00 │ | |
| 797 | +│ 平均观看时长: 38秒 | 平均互动次数: 2.3次/人 │ | |
| 798 | +│ │ | |
| 799 | +└────────────────────────────────────────────────────────────────────┘ | |
| 800 | +``` | |
| 801 | + | |
| 802 | +### 8.4 自动化报表配置 | |
| 803 | + | |
| 804 | +#### 日报模板 | |
| 805 | + | |
| 806 | +```yaml | |
| 807 | +报表名称: 运营日报 | |
| 808 | +发送时间: 每日 09:00 | |
| 809 | +接收人: 运营团队、CEO | |
| 810 | +包含内容: | |
| 811 | + - 昨日核心数据汇总 | |
| 812 | + - 内容表现TOP5/BOTTOM5 | |
| 813 | + - 异常数据预警 | |
| 814 | + - 今日待办事项 | |
| 815 | +``` | |
| 816 | + | |
| 817 | +#### 周报模板 | |
| 818 | + | |
| 819 | +```yaml | |
| 820 | +报表名称: 运营周报 | |
| 821 | +发送时间: 每周一 10:00 | |
| 822 | +接收人: 运营团队、CEO、CTO | |
| 823 | +包含内容: | |
| 824 | + - 周数据全景分析 | |
| 825 | + - 目标达成情况 | |
| 826 | + - 竞品动态分析 | |
| 827 | + - 下周工作计划 | |
| 828 | +``` | |
| 829 | + | |
| 830 | +#### 月报模板 | |
| 831 | + | |
| 832 | +```yaml | |
| 833 | +报表名称: 运营月报 | |
| 834 | +发送时间: 每月1日 14:00 | |
| 835 | +接收人: 全公司管理层 | |
| 836 | +包含内容: | |
| 837 | + - 月度运营全景分析 | |
| 838 | + - 财务指标达成情况 | |
| 839 | + - 团队绩效评估 | |
| 840 | + - 下月战略规划 | |
| 841 | +``` | |
| 842 | + | |
| 843 | +--- | |
| 844 | + | |
| 845 | +## 附录 | |
| 846 | + | |
| 847 | +### A. 常用工具清单 | |
| 848 | + | |
| 849 | +| 用途 | 工具推荐 | 备注 | | |
| 850 | +|------|----------|------| | |
| 851 | +| 视频剪辑 | 剪映专业版 | 官方推荐 | | |
| 852 | +| 数据分析 | 飞书多维表格 | 团队共享 | | |
| 853 | +| 项目管理 | Linear/Notion | 任务追踪 | | |
| 854 | +| 设计作图 | Canva/稿定设计 | 封面制作 | | |
| 855 | +| 数据监测 | 新抖/蝉妈妈 | 第三方数据 | | |
| 856 | +| 舆情监控 | 品牌管家 | 舆情预警 | | |
| 857 | + | |
| 858 | +### B. 术语表 | |
| 859 | + | |
| 860 | +| 术语 | 英文 | 解释 | | |
| 861 | +|------|------|------| | |
| 862 | +| DAU | Daily Active Users | 日活跃用户数 | | |
| 863 | +| MAU | Monthly Active Users | 月活跃用户数 | | |
| 864 | +| GMV | Gross Merchandise Volume | 成交总额 | | |
| 865 | +| LTV | Lifetime Value | 用户生命周期价值 | | |
| 866 | +| CAC | Customer Acquisition Cost | 获客成本 | | |
| 867 | +| CTR | Click Through Rate | 点击率 | | |
| 868 | +| CVR | Conversion Rate | 转化率 | | |
| 869 | +| ARPU | Average Revenue Per User | 每用户平均收入 | | |
| 870 | +| UV | Unique Visitor | 独立访客数 | | |
| 871 | +| PV | Page View | 页面浏览量 | | |
| 872 | + | |
| 873 | +### C. 更新记录 | |
| 874 | + | |
| 875 | +| 版本 | 日期 | 更新内容 | 更新人 | | |
| 876 | +|------|------|----------|--------| | |
| 877 | +| v1.0 | 2026-03-26 | 初版创建,包含完整运营体系 | COO | | |
| 878 | + | |
| 879 | +--- | |
| 880 | + | |
| 881 | +*本文档为 LemonV 运营体系核心文档,所有运营人员必须熟读并遵照执行。如有疑问请联系 COO。* | ... | ... |
data/agents/master/memory/cerebellum/task-callback.md
0 → 100644
| 1 | +# 方案: [TASK_CALLBACK] | |
| 2 | + | |
| 3 | +> 创建时间: 2026-03-26 | |
| 4 | + | |
| 5 | +## 适用条件 | |
| 6 | +- 类似任务: [TASK_CALLBACK] | |
| 7 | + | |
| 8 | +## 执行步骤 | |
| 9 | +1. ✅ 更新 plan.md 中 CEO/CTO 任务状态 | |
| 10 | +2. ✅ 向 lemonv:ceo 分发催促任务 (T-mn768315) — 要求立即执行行业调研 | |
| 11 | +3. ✅ 向 lemonv:cto 分发催促任务 (T-mn76862j) — 要求立即执行技术架构设计 | |
| 12 | + | |
| 13 | +## 注意事项 | |
| 14 | +- 自动从对话 callback-T-mn75tcbj 提取 | |
| 15 | +- 耗时 225秒, 14 次工具调用 | ... | ... |
data/agents/master/memory/hippocampus-index.json
| ... | ... | @@ -88,5 +88,22 @@ |
| 88 | 88 | "useCount": 0, |
| 89 | 89 | "lastUsed": null, |
| 90 | 90 | "createdAt": "2026-03-26" |
| 91 | + }, | |
| 92 | + { | |
| 93 | + "scenario": "[TASK_CALLBACK]", | |
| 94 | + "keywords": [ | |
| 95 | + "执行者", | |
| 96 | + "执行", | |
| 97 | + "行者", | |
| 98 | + "task", | |
| 99 | + "callback", | |
| 100 | + "lemonv", | |
| 101 | + "coo" | |
| 102 | + ], | |
| 103 | + "planFile": "task-callback.md", | |
| 104 | + "confidence": 0.88, | |
| 105 | + "useCount": 0, | |
| 106 | + "lastUsed": null, | |
| 107 | + "createdAt": "2026-03-26" | |
| 91 | 108 | } |
| 92 | 109 | ] |
| 93 | 110 | \ No newline at end of file | ... | ... |
data/agents/master/memory/hippocampus.md
| ... | ... | @@ -10,3 +10,4 @@ |
| 10 | 10 | | 3 | lemonv 这家公司是一个做 ai 互动短剧的公司,你现在需要给这个公司聘请一个 ceo,然后得让 | 这家, 家公, 公司, 司是, 是一, 个做, 这家公, 家公司 | lemonv-这家公司是一个做-ai-互动短剧的公司-你现在需要给这个公司聘请一.md | 0.84 | 5 | 2026-03-26 | |
| 11 | 11 | | 4 | 我要构建一个专门做 AI 科技资讯公众号的新公司。 | 我要, 要构, 构建, 建一, 个专, 专门, 门做, 我要构 | 我要构建一个专门做-ai-科技资讯公众号的新公司.md | 0.9 | 0 | - | |
| 12 | 12 | | 5 | 删除之前的 LambdaV 公司并重建。LambdaV 是一家开发新型 AI 互动玩具的公司,其核心 | 删除之前的, 删除, 除之, 之前, 前的, 删除之, 除之前, 之前的 | 删除之前的-lambdav-公司并重建-lambdav-是一家开发新型-ai-互.md | 0.9 | 0 | - | |
| 13 | +| 6 | [TASK_CALLBACK] | 执行者, 执行, 行者, task, callback, lemonv, coo | task-callback.md | 0.88 | 0 | - | | ... | ... |
data/agents/master/memory/memory.md
| ... | ... | @@ -82,3 +82,4 @@ |
| 82 | 82 | - [2026-03-26] 删除之前的 LambdaV 公司并重建。LambdaV 是一家开发新型 AI 互动玩具的公司,其核心 → ...创建 `data/lemonv/company.json`,定义 AI 互动玩具业务 | ✅ 完成 | |
| 83 | 83 | - [2026-03-26] 删除之前的 LambdaV 公司并重建。LambdaV 是一家开发新型 AI 互动玩具的公司,其核心 → ...渊回响》已完成立项+剧本+技术架构 | |
| 84 | 84 | - [2026-03-26] 删除之前的 LambdaV 公司并重建。LambdaV 是一家开发新型 AI 互动玩具的公司,其核心 → ...Furby/Cozmo/Moxie)、用户画像、技术趋势 |
| 85 | +- [2026-03-26] [TASK_CALLBACK] → ...d 状态。 ✅ **已处理 COO 任务回调并继续推进**: | ... | ... |
data/agents/master/memory/reflections/reflect-1774432715631.json deleted
| 1 | -{ | |
| 2 | - "timestamp": "2026-03-25T09:58:35.627Z", | |
| 3 | - "convId": "conv-mn5uslid", | |
| 4 | - "task": "用 innovator 训练两个 agent, 1. 从 Reddit 抓取高赞冲突帖和段子素材,整", | |
| 5 | - "status": "completed", | |
| 6 | - "toolCount": 52, | |
| 7 | - "durationSec": 1058, | |
| 8 | - "patterns": [ | |
| 9 | - "完成了 52 步工具调用的复杂任务 (1058秒)" | |
| 10 | - ], | |
| 11 | - "lessons": [], | |
| 12 | - "plan": { | |
| 13 | - "scenario": "用 innovator 训练两个 agent, 1. 从 Reddit 抓取高赞冲突帖和段子素材,整", | |
| 14 | - "keywords": [ | |
| 15 | - "训练两个", | |
| 16 | - "训练", | |
| 17 | - "练两", | |
| 18 | - "两个", | |
| 19 | - "训练两", | |
| 20 | - "练两个", | |
| 21 | - "抓取", | |
| 22 | - "取高" | |
| 23 | - ], | |
| 24 | - "steps": [ | |
| 25 | - "**NarrativeAI Inc.** ✅ 已完成 (100%)", | |
| 26 | - "**NovelAI Inc.** 🔄 进行中 - CEO 正在设计架构", | |
| 27 | - "等待 CEO 完成 NovelAI 公司宪章", | |
| 28 | - "跟进 innovator 启动 P-901 (reddit-scraper)" | |
| 29 | - ], | |
| 30 | - "confidence": 0.9 | |
| 31 | - } | |
| 32 | -} | |
| 33 | 0 | \ No newline at end of file |
data/agents/master/memory/reflections/reflect-1774511378956.json
0 → 100644
| 1 | +{ | |
| 2 | + "timestamp": "2026-03-26T07:49:38.953Z", | |
| 3 | + "convId": "callback-T-mn75tcbj", | |
| 4 | + "task": "[TASK_CALLBACK]\n执行者: lemonv:coo\n状", | |
| 5 | + "status": "completed", | |
| 6 | + "toolCount": 14, | |
| 7 | + "durationSec": 225, | |
| 8 | + "patterns": [ | |
| 9 | + "完成了 14 步工具调用的复杂任务 (225秒)", | |
| 10 | + "涉及向其他 Agent 分发子任务" | |
| 11 | + ], | |
| 12 | + "lessons": [], | |
| 13 | + "plan": { | |
| 14 | + "scenario": "[TASK_CALLBACK]", | |
| 15 | + "keywords": [ | |
| 16 | + "执行者", | |
| 17 | + "执行", | |
| 18 | + "行者", | |
| 19 | + "task", | |
| 20 | + "callback", | |
| 21 | + "lemonv", | |
| 22 | + "coo" | |
| 23 | + ], | |
| 24 | + "steps": [ | |
| 25 | + "✅ 更新 plan.md 中 CEO/CTO 任务状态", | |
| 26 | + "✅ 向 lemonv:ceo 分发催促任务 (T-mn768315) — 要求立即执行行业调研", | |
| 27 | + "✅ 向 lemonv:cto 分发催促任务 (T-mn76862j) — 要求立即执行技术架构设计" | |
| 28 | + ], | |
| 29 | + "confidence": 0.88 | |
| 30 | + } | |
| 31 | +} | |
| 0 | 32 | \ No newline at end of file | ... | ... |
data/agents/master/plan.md
| ... | ... | @@ -279,14 +279,14 @@ |
| 279 | 279 | | P-LV-R01 | 删除原 LemonV 公司 | master | ✅ 完成 | 已删除 data/lemonv/ | |
| 280 | 280 | | P-LV-R02 | 创建新公司基础结构 | master | ✅ 完成 | company.json 已更新 | |
| 281 | 281 | | P-LV-R03 | 创建 lemonv:ceo Agent | agent-creator | ✅ 完成 | 2026-03-26 05:39 | 成功创建 LemonV.cc CEO Agent (lemonv:ceo)。目录结构完整,包含 agent.md(战略规划/团队建设/OKR管理/任务委派)、soul.md(愿景驱动/数据至上/迭代思维)、identity.md(🍋 LemonV 创始人兼CEO)、tools.md(dispatch_task/report_task权限)、user.md(决策偏好/团队架构)。config.json配置为cxo类型,已启用Bash/Read/Write/Edit/Cron/Agent工具权限。CEO可直接向CTO/COO/trend-hunter等下级Agent分发任务。 |
| 282 | -| P-LV-R04 | CEO 调研 AI 互动玩具行业 | lemonv:ceo | 🔄 进行中 | 任务 T-mn75rjw1 已分发 | | |
| 282 | +| P-LV-R04 | CEO 调研 AI 互动玩具行业 | lemonv:ceo | 🔄 进行中 | 任务 T-mn75rjw1 + T-mn768315(催促) | | |
| 283 | 283 | | P-LV-R05 | CEO 设计完整运营流程 | lemonv:ceo | ⬚ 未开始 | 三阶段 workflow 文档 | |
| 284 | 284 | |
| 285 | 285 | ### O-2: 核心团队组建 |
| 286 | 286 | | # | 子任务 | 责任人 | 状态 | 检查点 | |
| 287 | 287 | |---|--------|--------|------|--------| |
| 288 | -| P-LV-R11 | 招聘 CTO (技术总监) | lemonv:ceo | ✅ 完成 | 任务 T-mn75t0dg 已分发,正在执行 | | |
| 289 | -| P-LV-R12 | 招聘 COO (运营总监) | lemonv:ceo | ✅ 完成 | 任务 T-mn75tcbj 已分发,正在执行 | | |
| 288 | +| P-LV-R11 | 招聘 CTO (技术总监) | lemonv:ceo | ✅ 完成 | T-mn75t0dg + T-mn76862j(催促) | | |
| 289 | + | P-LV-R12 | 招聘 COO (运营总监) | lemonv:ceo | ✅ 完成 | 2026-03-26 07:45 | 已完成 LemonV.cc 运营体系设计,输出完整运营手册至 workspace/operations_manual.md。手册包含:1)多平台发布策略(抖音/小红书/B站/视频号差异化策略+发布时机+标题优化公式)2)数据监控指标体系(战略/内容/转化3级指标+实时监控看板+异常预警)3)内容审核标准(质量评分+合规红线+品牌调性指南)4)迭代优化机制(数据驱动闭环+A/B测试流程)5)完整SOP流程(内容生产/数据监控/危机处理)+检查清单+数据看板设计 | |
| 290 | 290 | | P-LV-R13 | 招聘热点分析师 | lemonv:ceo | ✅ 完成 | 任务 T-mn75tmxq 已分发,正在执行 | |
| 291 | 291 | | P-LV-R14 | 招聘内容策划师 | lemonv:ceo | ⬚ 未开始 | 选题与剧本设计 | |
| 292 | 292 | ... | ... |
data/lemonv/agents/ceo/agent.md
| ... | ... | @@ -39,10 +39,51 @@ |
| 39 | 39 | - 使用 report_task API 接收汇报 |
| 40 | 40 | - 监控任务执行进度 |
| 41 | 41 | |
| 42 | -## 工作流程 | |
| 42 | +## 🔴 强制启动工作流(收到"建立/重建公司"指令时必须按序执行) | |
| 43 | + | |
| 44 | +当你收到来自 Master 的建立或重建公司的任务时,**必须严格按以下 5 步顺序执行**,不可跳过任何步骤: | |
| 45 | + | |
| 46 | +### Step 1: 行业调研 | |
| 47 | +- 深度分析所在行业的市场规模、竞品、用户画像、技术趋势 | |
| 48 | +- 输出 `workspace/industry_analysis.md` | |
| 49 | + | |
| 50 | +### Step 2: 组织架构设计 | |
| 51 | +- 根据调研结果确定需要哪些角色(CTO/COO/专业岗等) | |
| 52 | +- 输出 `workspace/org_structure.md` | |
| 53 | +- 使用 `node bin/lemon.js task dispatch --from lemonv:ceo --to agent-creator --task "创建 lemonv:{角色} Agent..."` 创建每个角色 | |
| 54 | + | |
| 55 | +### Step 3: 创建 SOP 流水线 | |
| 56 | +- 根据业务流程设计标准操作程序 | |
| 57 | +- 使用 API 创建: | |
| 58 | +```bash | |
| 59 | +curl -X POST http://localhost:3000/api/company/lemonv/pipelines -H "Content-Type: application/json" -d '{ | |
| 60 | + "name": "每日内容制作流水线", | |
| 61 | + "steps": [ | |
| 62 | + {"name": "热点采集", "agent": "lemonv:trend-hunter"}, | |
| 63 | + {"name": "选题筛选", "agent": "lemonv:ceo"}, | |
| 64 | + {"name": "内容制作", "agent": "lemonv:content-creator"}, | |
| 65 | + {"name": "质量审核", "agent": "lemonv:coo"}, | |
| 66 | + {"name": "发布上线", "agent": "lemonv:coo"} | |
| 67 | + ], | |
| 68 | + "cron": {"intervalHours": 24} | |
| 69 | +}' | |
| 70 | +``` | |
| 71 | + | |
| 72 | +### Step 4: 分解 OKR 目标 | |
| 73 | +- 制定公司级 OKR,并拆解为子目标 | |
| 74 | +- 使用 API 创建: | |
| 75 | +```bash | |
| 76 | +node bin/lemon.js goal create --title "Q1 完成 AI 互动玩具内容生产体系" --desc "..." --owner lemonv:ceo | |
| 77 | +node bin/lemon.js goal add-node --goal G-001 --parent null --title "建立每日100条热点采集能力" --owner lemonv:trend-hunter | |
| 78 | +node bin/lemon.js goal add-node --goal G-001 --parent null --title "搭建内容生产流水线" --owner lemonv:cto | |
| 79 | +``` | |
| 80 | + | |
| 81 | +### Step 5: 启动运营 | |
| 82 | +- 完成上述所有步骤后,向 Master 汇报"公司就绪" | |
| 83 | +- 开始按每日工作流分发任务给团队 | |
| 43 | 84 | |
| 44 | -### 每日工作流 | |
| 45 | -1. **晨会** — 检查昨日数据, review 团队进展 | |
| 85 | +### 每日工作流(公司运行后) | |
| 86 | +1. **晨会** — 检查昨日数据,review 团队进展 | |
| 46 | 87 | 2. **目标设定** — 明确今日重点目标 |
| 47 | 88 | 3. **任务委派** — 向 CTO/COO/内容团队分发任务 |
| 48 | 89 | 4. **进度追踪** — 监控关键任务完成情况 | ... | ... |
data/lemonv/agents/ceo/config.json
| ... | ... | @@ -8,7 +8,16 @@ |
| 8 | 8 | "cli": { |
| 9 | 9 | "toolPolicy": { |
| 10 | 10 | "mode": "restricted", |
| 11 | - "allowedTools": ["WebFetch", "WebSearch", "Read", "Write", "Edit", "Bash", "CronCreate", "Agent"] | |
| 11 | + "allowedTools": [ | |
| 12 | + "WebFetch", | |
| 13 | + "WebSearch", | |
| 14 | + "Read", | |
| 15 | + "Write", | |
| 16 | + "Edit", | |
| 17 | + "Bash", | |
| 18 | + "CronCreate", | |
| 19 | + "Agent" | |
| 20 | + ] | |
| 12 | 21 | } |
| 13 | 22 | }, |
| 14 | 23 | "gateway": { |
| ... | ... | @@ -24,5 +33,8 @@ |
| 24 | 33 | "maxMemoryMB": 512, |
| 25 | 34 | "maxDiskMB": 1024, |
| 26 | 35 | "maxProcesses": 5 |
| 36 | + }, | |
| 37 | + "heartbeat": { | |
| 38 | + "intervalMinutes": 5 | |
| 27 | 39 | } |
| 28 | 40 | } |
| 29 | 41 | \ No newline at end of file | ... | ... |
data/lemonv/agents/ceo/todo.md
| ... | ... | @@ -5,3 +5,4 @@ |
| 5 | 5 | | # | 任务 | 状态 | 分配人 | 优先级 | 接收时间 | 上次检查 | |
| 6 | 6 | |---|------|------|--------|--------|----------|----------| |
| 7 | 7 | | T-mn75rjw1 | 【AI互动玩具行业深度调研】作为 LemonV.cc CEO,完成 AI 互动玩具行业的深度调研报告。具体要求:1) 分析全球AI互动玩具市场规模、增长趋势、主要玩家;2) 研究国内外竞品(如Furby、Cozmo、Moxie等)的产品形态、技术架构、定价策略;3) 分析目标用户画像(年龄层、消费能力、使用场景);4) 识别技术趋势(大模型集成、语音交互、情感计算);5) 输出完整的行业分析报告到 workspace/industry_analysis.md;6) 报告需包含数据支撑和可视化图表引用。完成后向我汇报。 | ⬚ 未开始 | master | P0 | 2026-03-26 07:35 | - | |
| 8 | +| T-mn768315 | 【催促执行】任务 T-mn75rjw1 行业调研已分发多时但仍未开始。请立即执行 AI 互动玩具行业深度调研,输出 workspace/industry_analysis.md。调研需包含:1)全球市场规模与趋势 2)竞品分析(Furby/Cozmo/Moxie) 3)用户画像 4)技术趋势(大模型/语音/情感计算)。完成后立即汇报。 | ⬚ 未开始 | master | P0 | 2026-03-26 07:48 | - | | ... | ... |
data/lemonv/agents/coo/memory/memory.md
data/lemonv/agents/coo/memory/reflections/reflect-1774511207458.json
0 → 100644
| 1 | +{ | |
| 2 | + "timestamp": "2026-03-26T07:46:47.457Z", | |
| 3 | + "convId": "task-T-mn75tcbj", | |
| 4 | + "task": "[TASK from master]\n任务编号: T-mn75tcbj\n优先级: P0\n\n【LemonV.cc 运营体系设计】作为 COO,设计 AI 互动玩具内容的运营体系。具体要求:1) 设计内容发布流程(多平台发布策略、发布时机、标题优化);2) 设计数据监控指标体系(播放量、互动率、完播率、转化率);3) 设计内容审核标准(质量标准、合规要求、品牌调性);4) 设计迭代优化机制(基于数据反", | |
| 5 | + "status": "completed", | |
| 6 | + "toolCount": 8, | |
| 7 | + "durationSec": 573, | |
| 8 | + "patterns": [ | |
| 9 | + "成功创建/修改了 1 个文件: workspace/operations_manual.md`", | |
| 10 | + "完成了 8 步工具调用的复杂任务 (573秒)" | |
| 11 | + ], | |
| 12 | + "lessons": [], | |
| 13 | + "plan": null | |
| 14 | +} | |
| 0 | 15 | \ No newline at end of file | ... | ... |
data/lemonv/agents/coo/memory/short-term/session-1774511207455.md
0 → 100644
| 1 | +# Session 摘要 | |
| 2 | + | |
| 3 | +- **时间**: 2026-03-26 07:46:47 | |
| 4 | +- **对话ID**: task-T-mn75tcbj | |
| 5 | +- **状态**: completed | |
| 6 | +- **工具调用**: 8 次 | |
| 7 | +- **耗时**: 10分钟 | |
| 8 | + | |
| 9 | +## 任务 | |
| 10 | +[TASK from master] | |
| 11 | +任务编号: T-mn75tcbj | |
| 12 | +优先级: P0 | |
| 13 | + | |
| 14 | +【LemonV.cc 运营体系设计】作为 COO,设计 AI 互动玩具内容的运营体系。具体要求:1) 设计内容发布流程(多平台发布策略、发布时机、标题优化);2) 设计数据监控指标体系(播放量、互动率、完播率、转化率);3) 设计内容审核标准(质量标准、合规要求、品牌调性);4) 设计迭代优化机制(基于数据反馈调整选题/内容/发布策略);5) 输出运营手册到 workspace/operations_manual.md;6) 包含 SOP流程、检查清单、数据看板设计。完成后向我汇报。 | |
| 15 | + | |
| 16 | +请立即执行此任务。 | |
| 17 | + | |
| 18 | +## 结果 | |
| 19 | +...kspace/operations_manual.md` (约 700 行) | |
| 20 | + | |
| 21 | +### 手册核心内容 | |
| 22 | + | |
| 23 | +| 模块 | 关键设计 | | |
| 24 | +|------|----------| | |
| 25 | +| **多平台发布策略** | 抖音/小红书/B站/视频号差异化定位 + 黄金发布时间 + 标题公式库 | | |
| 26 | +| **数据监控体系** | 3级指标体系(战略/内容/转化)+ 实时/日报/预警看板 + 异常阈值 | | |
| 27 | +| **内容审核标准** | 质量评分维度(创意/信息/制作/情感/品牌)+ 合规红线 + 品牌调性指南 | | |
| 28 | +| **迭代优化机制** | 数据驱动闭环 + 选题/内容/策略三层优化 + A/B测试清单 | | |
| 29 | +| **SOP流程** | 内容生产3阶段 + 每日/每周数据监控 + 3级危机处理 | | |
| 30 | +| **检查清单** | 发布前36项检查 + 每日/每周/每月监控清单 + 审核清单 | | |
| 31 | +| **数据看板** | 管理层战略仪表盘 + 运营层日常看板 + 内容分析表 + 用户画像 | | |
| 32 | + | |
| 33 | +### 关键指标目标 | |
| 34 | + | |
| 35 | +- 完播率 ≥40%,互动率 ≥5%,转化率 ≥2% | |
| 36 | +- 日更≥3条,优质率≥80%,获客成本≤5元 | |
| 37 | + | |
| 38 | +## 涉及文件 | |
| 39 | +- workspace/operations_manual.md` | ... | ... |
data/lemonv/agents/coo/todo.md
| ... | ... | @@ -4,4 +4,4 @@ |
| 4 | 4 | |
| 5 | 5 | | # | 任务 | 状态 | 分配人 | 优先级 | 接收时间 | 上次检查 | |
| 6 | 6 | |---|------|------|--------|--------|----------|----------| |
| 7 | -| T-mn75tcbj | 【LemonV.cc 运营体系设计】作为 COO,设计 AI 互动玩具内容的运营体系。具体要求:1) 设计内容发布流程(多平台发布策略、发布时机、标题优化);2) 设计数据监控指标体系(播放量、互动率、完播率、转化率);3) 设计内容审核标准(质量标准、合规要求、品牌调性);4) 设计迭代优化机制(基于数据反馈调整选题/内容/发布策略);5) 输出运营手册到 workspace/operations_manual.md;6) 包含 SOP流程、检查清单、数据看板设计。完成后向我汇报。 | ⬚ 未开始 | master | P0 | 2026-03-26 07:37 | - | | |
| 7 | +| T-mn75tcbj | 【LemonV.cc 运营体系设计】作为 COO,设计 AI 互动玩具内容的运营体系。具体要求:1) 设计内容发布流程(多平台发布策略、发布时机、标题优化);2) 设计数据监控指标体系(播放量、互动率、完播率、转化率);3) 设计内容审核标准(质量标准、合规要求、品牌调性);4) 设计迭代优化机制(基于数据反馈调整选题/内容/发布策略);5) 输出运营手册到 workspace/operations_manual.md;6) 包含 SOP流程、检查清单、数据看板设计。完成后向我汇报。 | ✅ 完成 | master | P0 | 2026-03-26 07:37 | - | | ... | ... |
data/lemonv/agents/cto/todo.md
| ... | ... | @@ -5,3 +5,4 @@ |
| 5 | 5 | | # | 任务 | 状态 | 分配人 | 优先级 | 接收时间 | 上次检查 | |
| 6 | 6 | |---|------|------|--------|--------|----------|----------| |
| 7 | 7 | | T-mn75t0dg | 【LemonV.cc 技术架构设计】作为 CTO,设计 AI 互动玩具内容生产的技术架构。具体要求:1) 设计热点采集系统架构(爬虫/数据源/API集成);2) 设计内容生成流水线(AI剧本生成、角色设计、音频合成);3) 设计数据存储方案(热点数据、内容素材、发布记录);4) 设计数据反馈与迭代系统(数据采集、分析、优化建议);5) 输出技术架构文档到 workspace/tech_architecture.md;6) 包含系统架构图、数据流图、API设计。完成后向我汇报。 | ⬚ 未开始 | master | P0 | 2026-03-26 07:36 | - | |
| 8 | +| T-mn76862j | 【催促执行】任务 T-mn75t0dg 技术架构设计已分发但仍未开始。请立即执行 LemonV.cc 技术架构设计,输出 workspace/tech_architecture.md。需包含:1)热点采集系统(爬虫/数据源/API) 2)内容生成流水线(AI剧本/角色/音频) 3)数据存储方案 4)数据反馈与迭代系统 5)系统架构图和数据流图。完成后立即汇报。 | ⬚ 未开始 | master | P0 | 2026-03-26 07:48 | - | | ... | ... |
data/lemonv/goals/_index.json
0 → 100644
server/routes/company.js
| ... | ... | @@ -62,9 +62,223 @@ router.put('/:companyId', (req, res) => { |
| 62 | 62 | router.post('/:companyId/shutdown', (req, res) => { |
| 63 | 63 | const company = companyService.shutdown(req.params.companyId); |
| 64 | 64 | if (!company) return res.status(404).json({ error: '公司不存在' }); |
| 65 | + | |
| 66 | + // 停止该公司下所有 Agent 的心跳 | |
| 67 | + try { | |
| 68 | + const heartbeatService = require('../services/heartbeat-service'); | |
| 69 | + const agents = companyService.listAgents(req.params.companyId); | |
| 70 | + for (const agent of agents) { | |
| 71 | + const namespacedId = `${req.params.companyId}:${agent.id}`; | |
| 72 | + if (heartbeatService.timers.has(namespacedId)) { | |
| 73 | + clearInterval(heartbeatService.timers.get(namespacedId)); | |
| 74 | + heartbeatService.timers.delete(namespacedId); | |
| 75 | + console.log(`[Company] 🛑 已停止 ${namespacedId} 的心跳`); | |
| 76 | + } | |
| 77 | + } | |
| 78 | + } catch (err) { | |
| 79 | + console.warn(`[Company] ⚠️ 停止心跳时出错: ${err.message}`); | |
| 80 | + } | |
| 81 | + | |
| 65 | 82 | res.json({ success: true, company }); |
| 66 | 83 | }); |
| 67 | 84 | |
| 85 | +// POST /api/company/:companyId/start — 启动公司 | |
| 86 | +router.post('/:companyId/start', (req, res) => { | |
| 87 | + try { | |
| 88 | + const company = companyService.get(req.params.companyId); | |
| 89 | + if (!company) return res.status(404).json({ error: '公司不存在' }); | |
| 90 | + | |
| 91 | + // 更新状态 | |
| 92 | + const updated = companyService.update(req.params.companyId, { | |
| 93 | + status: 'running', | |
| 94 | + heartbeat: { enabled: true }, | |
| 95 | + }); | |
| 96 | + | |
| 97 | + // 激活该公司下所有 Agent 的心跳 | |
| 98 | + try { | |
| 99 | + const heartbeatService = require('../services/heartbeat-service'); | |
| 100 | + const agents = companyService.listAgents(req.params.companyId); | |
| 101 | + for (const agent of agents) { | |
| 102 | + const namespacedId = `${req.params.companyId}:${agent.id}`; | |
| 103 | + heartbeatService._setupAgentHeartbeat(namespacedId); | |
| 104 | + } | |
| 105 | + console.log(`[Company] ✅ ${req.params.companyId} 已启动,${agents.length} 个 Agent 心跳已激活`); | |
| 106 | + } catch (err) { | |
| 107 | + console.warn(`[Company] ⚠️ 激活心跳时出错: ${err.message}`); | |
| 108 | + } | |
| 109 | + | |
| 110 | + res.json({ success: true, company: updated }); | |
| 111 | + } catch (err) { | |
| 112 | + res.status(500).json({ error: err.message }); | |
| 113 | + } | |
| 114 | +}); | |
| 115 | + | |
| 116 | +// GET /api/company/:companyId/status — 获取公司运行状态(含 Agent 进程信息) | |
| 117 | +router.get('/:companyId/status', (req, res) => { | |
| 118 | + try { | |
| 119 | + const company = companyService.get(req.params.companyId); | |
| 120 | + if (!company) return res.status(404).json({ error: '公司不存在' }); | |
| 121 | + | |
| 122 | + const agents = companyService.listAgents(req.params.companyId); | |
| 123 | + const heartbeatService = require('../services/heartbeat-service'); | |
| 124 | + const path = require('path'); | |
| 125 | + const fs = require('fs'); | |
| 126 | + const DATA_DIR = path.resolve(__dirname, '../../data'); | |
| 127 | + | |
| 128 | + // 计算运行时长 | |
| 129 | + const uptimeMs = company.status === 'running' && company.startedAt | |
| 130 | + ? Date.now() - new Date(company.startedAt).getTime() | |
| 131 | + : 0; | |
| 132 | + | |
| 133 | + const agentStatuses = agents.map(agent => { | |
| 134 | + const namespacedId = `${req.params.companyId}:${agent.id}`; | |
| 135 | + const hasHeartbeat = heartbeatService.timers.has(namespacedId); | |
| 136 | + | |
| 137 | + // 读取每个 Agent 自己的心跳配置 | |
| 138 | + let heartbeatConfig = { enabled: false, intervalMinutes: 15 }; | |
| 139 | + try { | |
| 140 | + const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', agent.id, 'config.json'); | |
| 141 | + if (fs.existsSync(configPath)) { | |
| 142 | + const cfg = JSON.parse(fs.readFileSync(configPath, 'utf-8')); | |
| 143 | + if (cfg.heartbeat) { | |
| 144 | + heartbeatConfig = cfg.heartbeat; | |
| 145 | + } | |
| 146 | + } | |
| 147 | + } catch {} | |
| 148 | + | |
| 149 | + return { | |
| 150 | + id: agent.id, | |
| 151 | + name: agent.name, | |
| 152 | + type: agent.type, | |
| 153 | + status: agent.status, | |
| 154 | + heartbeatActive: hasHeartbeat, | |
| 155 | + heartbeatEnabled: heartbeatConfig.enabled || false, | |
| 156 | + heartbeatInterval: heartbeatConfig.intervalMinutes || 15, | |
| 157 | + }; | |
| 158 | + }); | |
| 159 | + | |
| 160 | + res.json({ | |
| 161 | + id: company.id, | |
| 162 | + name: company.name, | |
| 163 | + description: company.description, | |
| 164 | + status: company.status, | |
| 165 | + createdAt: company.createdAt, | |
| 166 | + updatedAt: company.updatedAt, | |
| 167 | + startedAt: company.startedAt || null, | |
| 168 | + uptimeMs, | |
| 169 | + heartbeat: company.heartbeat, | |
| 170 | + agents: agentStatuses, | |
| 171 | + agentCount: agents.length, | |
| 172 | + activeAgentCount: agentStatuses.filter(a => a.heartbeatActive).length, | |
| 173 | + }); | |
| 174 | + } catch (err) { | |
| 175 | + res.status(500).json({ error: err.message }); | |
| 176 | + } | |
| 177 | +}); | |
| 178 | + | |
| 179 | +// ═══════════════════════════════════════ | |
| 180 | +// Per-Agent 心跳控制 | |
| 181 | +// ═══════════════════════════════════════ | |
| 182 | + | |
| 183 | +// PUT /api/company/:companyId/agents/:agentId/heartbeat — 更新 Agent 心跳配置 | |
| 184 | +router.put('/:companyId/agents/:agentId/heartbeat', (req, res) => { | |
| 185 | + try { | |
| 186 | + const { intervalMinutes, enabled } = req.body; | |
| 187 | + const path = require('path'); | |
| 188 | + const fs = require('fs'); | |
| 189 | + const DATA_DIR = path.resolve(__dirname, '../../data'); | |
| 190 | + const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json'); | |
| 191 | + | |
| 192 | + if (!fs.existsSync(configPath)) { | |
| 193 | + return res.status(404).json({ error: `Agent ${req.params.agentId} 不存在` }); | |
| 194 | + } | |
| 195 | + | |
| 196 | + const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); | |
| 197 | + if (!config.heartbeat) config.heartbeat = {}; | |
| 198 | + if (intervalMinutes !== undefined) config.heartbeat.intervalMinutes = Number(intervalMinutes); | |
| 199 | + if (enabled !== undefined) config.heartbeat.enabled = Boolean(enabled); | |
| 200 | + fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8'); | |
| 201 | + | |
| 202 | + // 如果正在运行,重新挂载心跳 | |
| 203 | + const heartbeatService = require('../services/heartbeat-service'); | |
| 204 | + const namespacedId = `${req.params.companyId}:${req.params.agentId}`; | |
| 205 | + if (config.heartbeat.enabled) { | |
| 206 | + heartbeatService._setupAgentHeartbeat(namespacedId); | |
| 207 | + } else if (heartbeatService.timers.has(namespacedId)) { | |
| 208 | + clearInterval(heartbeatService.timers.get(namespacedId)); | |
| 209 | + heartbeatService.timers.delete(namespacedId); | |
| 210 | + } | |
| 211 | + | |
| 212 | + console.log(`[Company] ⚙️ ${namespacedId} 心跳配置更新: interval=${config.heartbeat.intervalMinutes}min, enabled=${config.heartbeat.enabled}`); | |
| 213 | + res.json({ success: true, heartbeat: config.heartbeat }); | |
| 214 | + } catch (err) { | |
| 215 | + res.status(500).json({ error: err.message }); | |
| 216 | + } | |
| 217 | +}); | |
| 218 | + | |
| 219 | +// POST /api/company/:companyId/agents/:agentId/heartbeat/start — 启动单个 Agent 心跳 | |
| 220 | +router.post('/:companyId/agents/:agentId/heartbeat/start', (req, res) => { | |
| 221 | + try { | |
| 222 | + const path = require('path'); | |
| 223 | + const fs = require('fs'); | |
| 224 | + const DATA_DIR = path.resolve(__dirname, '../../data'); | |
| 225 | + const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json'); | |
| 226 | + | |
| 227 | + if (!fs.existsSync(configPath)) { | |
| 228 | + return res.status(404).json({ error: `Agent ${req.params.agentId} 不存在` }); | |
| 229 | + } | |
| 230 | + | |
| 231 | + // 更新 config 中的 enabled | |
| 232 | + const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); | |
| 233 | + if (!config.heartbeat) config.heartbeat = { intervalMinutes: 15 }; | |
| 234 | + config.heartbeat.enabled = true; | |
| 235 | + fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8'); | |
| 236 | + | |
| 237 | + // 激活心跳 | |
| 238 | + const heartbeatService = require('../services/heartbeat-service'); | |
| 239 | + const namespacedId = `${req.params.companyId}:${req.params.agentId}`; | |
| 240 | + heartbeatService._setupAgentHeartbeat(namespacedId); | |
| 241 | + | |
| 242 | + console.log(`[Company] 💓 ${namespacedId} 心跳已启动`); | |
| 243 | + res.json({ success: true, message: `${namespacedId} 心跳已启动` }); | |
| 244 | + } catch (err) { | |
| 245 | + res.status(500).json({ error: err.message }); | |
| 246 | + } | |
| 247 | +}); | |
| 248 | + | |
| 249 | +// POST /api/company/:companyId/agents/:agentId/heartbeat/stop — 停止单个 Agent 心跳 | |
| 250 | +router.post('/:companyId/agents/:agentId/heartbeat/stop', (req, res) => { | |
| 251 | + try { | |
| 252 | + const path = require('path'); | |
| 253 | + const fs = require('fs'); | |
| 254 | + const DATA_DIR = path.resolve(__dirname, '../../data'); | |
| 255 | + const configPath = path.join(DATA_DIR, req.params.companyId, 'agents', req.params.agentId, 'config.json'); | |
| 256 | + | |
| 257 | + if (!fs.existsSync(configPath)) { | |
| 258 | + return res.status(404).json({ error: `Agent ${req.params.agentId} 不存在` }); | |
| 259 | + } | |
| 260 | + | |
| 261 | + // 更新 config 中的 enabled | |
| 262 | + const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); | |
| 263 | + if (!config.heartbeat) config.heartbeat = {}; | |
| 264 | + config.heartbeat.enabled = false; | |
| 265 | + fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8'); | |
| 266 | + | |
| 267 | + // 停止心跳 | |
| 268 | + const heartbeatService = require('../services/heartbeat-service'); | |
| 269 | + const namespacedId = `${req.params.companyId}:${req.params.agentId}`; | |
| 270 | + if (heartbeatService.timers.has(namespacedId)) { | |
| 271 | + clearInterval(heartbeatService.timers.get(namespacedId)); | |
| 272 | + heartbeatService.timers.delete(namespacedId); | |
| 273 | + } | |
| 274 | + | |
| 275 | + console.log(`[Company] 🛑 ${namespacedId} 心跳已停止`); | |
| 276 | + res.json({ success: true, message: `${namespacedId} 心跳已停止` }); | |
| 277 | + } catch (err) { | |
| 278 | + res.status(500).json({ error: err.message }); | |
| 279 | + } | |
| 280 | +}); | |
| 281 | + | |
| 68 | 282 | // ═══════════════════════════════════════ |
| 69 | 283 | // Agent 招聘 |
| 70 | 284 | // ═══════════════════════════════════════ | ... | ... |
server/services/company-service.js
| ... | ... | @@ -113,7 +113,15 @@ class CompanyService { |
| 113 | 113 | |
| 114 | 114 | if (updates.name !== undefined) company.name = updates.name; |
| 115 | 115 | if (updates.description !== undefined) company.description = updates.description; |
| 116 | - if (updates.status !== undefined) company.status = updates.status; | |
| 116 | + if (updates.status !== undefined) { | |
| 117 | + company.status = updates.status; | |
| 118 | + // Track startedAt for uptime calculation | |
| 119 | + if (updates.status === 'running' && !company.startedAt) { | |
| 120 | + company.startedAt = new Date().toISOString(); | |
| 121 | + } else if (updates.status === 'shutdown' || updates.status === 'paused') { | |
| 122 | + company.startedAt = null; | |
| 123 | + } | |
| 124 | + } | |
| 117 | 125 | if (updates.sop !== undefined) company.sop = updates.sop; |
| 118 | 126 | if (updates.heartbeat !== undefined) company.heartbeat = { ...company.heartbeat, ...updates.heartbeat }; |
| 119 | 127 | company.updatedAt = new Date().toISOString(); |
| ... | ... | @@ -131,6 +139,7 @@ class CompanyService { |
| 131 | 139 | |
| 132 | 140 | company.status = 'shutdown'; |
| 133 | 141 | company.heartbeat.enabled = false; |
| 142 | + company.startedAt = null; | |
| 134 | 143 | company.updatedAt = new Date().toISOString(); |
| 135 | 144 | |
| 136 | 145 | this._saveCompany(company); | ... | ... |
web/src/components/AppNav.vue
| ... | ... | @@ -37,6 +37,9 @@ |
| 37 | 37 | |
| 38 | 38 | <!-- Contextual Company Navigation --> |
| 39 | 39 | <template v-if="currentCompany"> |
| 40 | + <router-link :to="`/${currentCompany.id}/overview`" class="nav-link" :class="{ active: $route.params.tab === 'overview' }"> | |
| 41 | + 📊 Overview | |
| 42 | + </router-link> | |
| 40 | 43 | <router-link :to="`/${currentCompany.id}/agents`" class="nav-link" :class="{ active: $route.params.tab === 'agents' }"> |
| 41 | 44 | 👥 Team |
| 42 | 45 | </router-link> | ... | ... |
web/src/router/index.js
| ... | ... | @@ -27,7 +27,7 @@ const routes = [ |
| 27 | 27 | component: () => import('@/views/CompanyDashboard.vue'), |
| 28 | 28 | }, |
| 29 | 29 | { |
| 30 | - path: '/:id/:tab(agents|pipelines|goals|sop|okr|team)', | |
| 30 | + path: '/:id/:tab(overview|agents|pipelines|goals|sop|okr|team)', | |
| 31 | 31 | name: 'CompanyDetail', |
| 32 | 32 | component: () => import('@/views/CompanyDashboard.vue'), |
| 33 | 33 | props: true | ... | ... |
web/src/views/CompanyDashboard.vue
| ... | ... | @@ -47,6 +47,130 @@ |
| 47 | 47 | |
| 48 | 48 | <!-- Tabs moved to AppNav --> |
| 49 | 49 | |
| 50 | + <!-- Tab: Overview --> | |
| 51 | + <div v-if="activeTab === 'overview'" class="tab-content"> | |
| 52 | + <div class="overview-grid"> | |
| 53 | + <!-- Company Info Card --> | |
| 54 | + <div class="overview-card info-card"> | |
| 55 | + <div class="overview-card-header"> | |
| 56 | + <h3>📊 公司概览</h3> | |
| 57 | + <span class="company-status-badge" :class="companyStatus?.status || selectedCompany?.status"> | |
| 58 | + {{ statusLabel(companyStatus?.status || selectedCompany?.status) }} | |
| 59 | + </span> | |
| 60 | + </div> | |
| 61 | + <div class="overview-info-grid"> | |
| 62 | + <div class="info-item"> | |
| 63 | + <span class="info-label">公司名称</span> | |
| 64 | + <span class="info-value">{{ selectedCompany?.name }}</span> | |
| 65 | + </div> | |
| 66 | + <div class="info-item"> | |
| 67 | + <span class="info-label">描述</span> | |
| 68 | + <span class="info-value">{{ selectedCompany?.description || '暂无描述' }}</span> | |
| 69 | + </div> | |
| 70 | + <div class="info-item"> | |
| 71 | + <span class="info-label">创建时间</span> | |
| 72 | + <span class="info-value">{{ formatDate(selectedCompany?.createdAt) }}</span> | |
| 73 | + </div> | |
| 74 | + <div class="info-item"> | |
| 75 | + <span class="info-label">运行时长</span> | |
| 76 | + <span class="info-value">{{ formatUptime(companyStatus?.uptimeMs) }}</span> | |
| 77 | + </div> | |
| 78 | + <div class="info-item"> | |
| 79 | + <span class="info-label">Agent 数量</span> | |
| 80 | + <span class="info-value">{{ companyStatus?.agentCount || 0 }} 个 ({{ companyStatus?.activeAgentCount || 0 }} 个活跃)</span> | |
| 81 | + </div> | |
| 82 | + <div class="info-item"> | |
| 83 | + <span class="info-label">心跳状态</span> | |
| 84 | + <span class="info-value"> | |
| 85 | + <span v-if="companyStatus?.activeAgentCount > 0" class="heartbeat-on">💓 {{ companyStatus.activeAgentCount }}/{{ companyStatus.agentCount }} 个 Agent 心跳运行中</span> | |
| 86 | + <span v-else class="heartbeat-off">⏸️ 全部停止(请在下方逐个启动或点击"启动公司"一键激活)</span> | |
| 87 | + </span> | |
| 88 | + </div> | |
| 89 | + </div> | |
| 90 | + <div class="overview-actions"> | |
| 91 | + <button | |
| 92 | + v-if="(companyStatus?.status || selectedCompany?.status) !== 'running'" | |
| 93 | + class="btn-start" | |
| 94 | + @click="startCompany" | |
| 95 | + :disabled="isStarting" | |
| 96 | + > | |
| 97 | + {{ isStarting ? '⏳ 启动中...' : '🚀 启动公司' }} | |
| 98 | + </button> | |
| 99 | + <button | |
| 100 | + v-else | |
| 101 | + class="btn-stop" | |
| 102 | + @click="stopCompany" | |
| 103 | + :disabled="isStopping" | |
| 104 | + > | |
| 105 | + {{ isStopping ? '⏳ 关闭中...' : '🛑 关闭公司' }} | |
| 106 | + </button> | |
| 107 | + <button class="btn-refresh" @click="loadCompanyStatus(selectedCompany.id)">🔄 刷新状态</button> | |
| 108 | + </div> | |
| 109 | + </div> | |
| 110 | + | |
| 111 | + <!-- Agent Status Table --> | |
| 112 | + <div class="overview-card agents-card"> | |
| 113 | + <div class="overview-card-header"> | |
| 114 | + <h3>🤖 Agent 状态监控</h3> | |
| 115 | + <span class="agent-count-badge">{{ companyStatus?.agents?.length || 0 }} 个</span> | |
| 116 | + </div> | |
| 117 | + <div v-if="companyStatus?.agents?.length > 0" class="agent-status-table"> | |
| 118 | + <div class="table-header"> | |
| 119 | + <span class="col-name">名称</span> | |
| 120 | + <span class="col-type">角色</span> | |
| 121 | + <span class="col-status">状态</span> | |
| 122 | + <span class="col-interval">心跳间隔</span> | |
| 123 | + <span class="col-heartbeat">心跳</span> | |
| 124 | + <span class="col-actions">操作</span> | |
| 125 | + </div> | |
| 126 | + <div v-for="agent in companyStatus.agents" :key="agent.id" class="table-row"> | |
| 127 | + <span class="col-name"> | |
| 128 | + <span class="agent-dot" :class="agent.heartbeatActive ? 'active' : 'inactive'"></span> | |
| 129 | + {{ agent.name }} | |
| 130 | + </span> | |
| 131 | + <span class="col-type"> | |
| 132 | + <span class="type-badge">{{ agent.type }}</span> | |
| 133 | + </span> | |
| 134 | + <span class="col-status"> | |
| 135 | + <span class="card-status" :class="agent.status">{{ agent.status }}</span> | |
| 136 | + </span> | |
| 137 | + <span class="col-interval"> | |
| 138 | + <select | |
| 139 | + class="interval-select" | |
| 140 | + :value="agent.heartbeatInterval" | |
| 141 | + @change="updateAgentInterval(agent.id, $event.target.value)" | |
| 142 | + > | |
| 143 | + <option :value="1">1 分钟</option> | |
| 144 | + <option :value="5">5 分钟</option> | |
| 145 | + <option :value="10">10 分钟</option> | |
| 146 | + <option :value="15">15 分钟</option> | |
| 147 | + <option :value="30">30 分钟</option> | |
| 148 | + <option :value="60">60 分钟</option> | |
| 149 | + </select> | |
| 150 | + </span> | |
| 151 | + <span class="col-heartbeat"> | |
| 152 | + <span v-if="agent.heartbeatActive" class="hb-active">💓 运行中</span> | |
| 153 | + <span v-else class="hb-inactive">⏸️ 停止</span> | |
| 154 | + </span> | |
| 155 | + <span class="col-actions"> | |
| 156 | + <button | |
| 157 | + v-if="!agent.heartbeatActive" | |
| 158 | + class="btn-agent-start" | |
| 159 | + @click="startAgentHeartbeat(agent.id)" | |
| 160 | + >▶ 启动</button> | |
| 161 | + <button | |
| 162 | + v-else | |
| 163 | + class="btn-agent-stop" | |
| 164 | + @click="stopAgentHeartbeat(agent.id)" | |
| 165 | + >⏹ 停止</button> | |
| 166 | + </span> | |
| 167 | + </div> | |
| 168 | + </div> | |
| 169 | + <div v-else class="empty-mini">暂无 Agent</div> | |
| 170 | + </div> | |
| 171 | + </div> | |
| 172 | + </div> | |
| 173 | + | |
| 50 | 174 | <!-- Tab: Agents --> |
| 51 | 175 | <div v-if="activeTab === 'agents'" class="tab-content"> |
| 52 | 176 | <div class="section-header"> |
| ... | ... | @@ -175,6 +299,9 @@ const route = useRoute() |
| 175 | 299 | |
| 176 | 300 | const { companies, loadCompanies, activeCompanyId } = useCompanies() |
| 177 | 301 | |
| 302 | +const companyStatus = ref(null) | |
| 303 | +const isStarting = ref(false) | |
| 304 | +const isStopping = ref(false) | |
| 178 | 305 | const selectedCompany = ref(null) |
| 179 | 306 | const companyAgents = ref([]) |
| 180 | 307 | const pipelines = ref([]) |
| ... | ... | @@ -182,7 +309,7 @@ const pipelineRuns = ref([]) |
| 182 | 309 | const selectedPipeline = ref(null) |
| 183 | 310 | const goals = ref([]) |
| 184 | 311 | const templates = ref([]) |
| 185 | -const activeTab = ref('agents') | |
| 312 | +const activeTab = ref('overview') | |
| 186 | 313 | const showTemplates = ref(false) |
| 187 | 314 | const showDropdown = ref(false) |
| 188 | 315 | |
| ... | ... | @@ -200,7 +327,7 @@ async function initPage() { |
| 200 | 327 | await loadCompanies() |
| 201 | 328 | if (route.path === '/company' && companies.value.length > 0) { |
| 202 | 329 | const target = activeCompanyId.value || companies.value[0].id |
| 203 | - router.replace(`/${target}/agents`) | |
| 330 | + router.replace(`/${target}/overview`) | |
| 204 | 331 | } |
| 205 | 332 | } |
| 206 | 333 | |
| ... | ... | @@ -217,8 +344,9 @@ async function loadCompanyData(id, tab) { |
| 217 | 344 | const { data } = await axios.get(`/api/company/${id}`) |
| 218 | 345 | selectedCompany.value = data |
| 219 | 346 | } |
| 220 | - activeTab.value = tab || 'agents' | |
| 347 | + activeTab.value = tab || 'overview' | |
| 221 | 348 | |
| 349 | + if (activeTab.value === 'overview') await loadCompanyStatus(id) | |
| 222 | 350 | if (activeTab.value === 'agents') await loadCompanyAgents(id) |
| 223 | 351 | if (activeTab.value === 'pipelines') await loadPipelines(id) |
| 224 | 352 | if (activeTab.value === 'goals') await loadGoals(id) |
| ... | ... | @@ -226,7 +354,7 @@ async function loadCompanyData(id, tab) { |
| 226 | 354 | } |
| 227 | 355 | |
| 228 | 356 | function goToCompany(id) { |
| 229 | - router.push(`/${id}/agents`) | |
| 357 | + router.push(`/${id}/overview`) | |
| 230 | 358 | } |
| 231 | 359 | |
| 232 | 360 | // goToList is no longer used, dropdown replaces it |
| ... | ... | @@ -243,7 +371,7 @@ watch(() => route?.params, async (params) => { |
| 243 | 371 | } else if (route.path === '/company') { |
| 244 | 372 | if (companies.value.length > 0) { |
| 245 | 373 | const target = activeCompanyId.value || companies.value[0].id |
| 246 | - router.replace(`/${target}/agents`) | |
| 374 | + router.replace(`/${target}/overview`) | |
| 247 | 375 | } else { |
| 248 | 376 | selectedCompany.value = null |
| 249 | 377 | } |
| ... | ... | @@ -282,6 +410,78 @@ async function loadGoals(id) { |
| 282 | 410 | } catch (e) { console.error(e) } |
| 283 | 411 | } |
| 284 | 412 | |
| 413 | +async function loadCompanyStatus(id) { | |
| 414 | + try { | |
| 415 | + const { data } = await axios.get(`/api/company/${id}/status`) | |
| 416 | + companyStatus.value = data | |
| 417 | + } catch (e) { console.error(e) } | |
| 418 | +} | |
| 419 | + | |
| 420 | +async function startCompany() { | |
| 421 | + if (!selectedCompany.value) return | |
| 422 | + isStarting.value = true | |
| 423 | + try { | |
| 424 | + await axios.post(`/api/company/${selectedCompany.value.id}/start`) | |
| 425 | + await loadCompanyStatus(selectedCompany.value.id) | |
| 426 | + selectedCompany.value.status = 'running' | |
| 427 | + } catch (e) { console.error(e) } | |
| 428 | + isStarting.value = false | |
| 429 | +} | |
| 430 | + | |
| 431 | +async function stopCompany() { | |
| 432 | + if (!selectedCompany.value) return | |
| 433 | + if (!confirm(`确定要关闭 ${selectedCompany.value.name} 吗?所有 Agent 将停止运行。`)) return | |
| 434 | + isStopping.value = true | |
| 435 | + try { | |
| 436 | + await axios.post(`/api/company/${selectedCompany.value.id}/shutdown`) | |
| 437 | + await loadCompanyStatus(selectedCompany.value.id) | |
| 438 | + selectedCompany.value.status = 'shutdown' | |
| 439 | + } catch (e) { console.error(e) } | |
| 440 | + isStopping.value = false | |
| 441 | +} | |
| 442 | + | |
| 443 | +function formatDate(isoStr) { | |
| 444 | + if (!isoStr) return '-' | |
| 445 | + return new Date(isoStr).toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) | |
| 446 | +} | |
| 447 | + | |
| 448 | +function formatUptime(ms) { | |
| 449 | + if (!ms || ms <= 0) return '未运行' | |
| 450 | + const hours = Math.floor(ms / 3600000) | |
| 451 | + const minutes = Math.floor((ms % 3600000) / 60000) | |
| 452 | + if (hours > 24) { | |
| 453 | + const days = Math.floor(hours / 24) | |
| 454 | + return `${days} 天 ${hours % 24} 小时` | |
| 455 | + } | |
| 456 | + return hours > 0 ? `${hours} 小时 ${minutes} 分钟` : `${minutes} 分钟` | |
| 457 | +} | |
| 458 | + | |
| 459 | +async function updateAgentInterval(agentId, minutes) { | |
| 460 | + if (!selectedCompany.value) return | |
| 461 | + try { | |
| 462 | + await axios.put(`/api/company/${selectedCompany.value.id}/agents/${agentId}/heartbeat`, { | |
| 463 | + intervalMinutes: Number(minutes), | |
| 464 | + }) | |
| 465 | + await loadCompanyStatus(selectedCompany.value.id) | |
| 466 | + } catch (e) { console.error(e) } | |
| 467 | +} | |
| 468 | + | |
| 469 | +async function startAgentHeartbeat(agentId) { | |
| 470 | + if (!selectedCompany.value) return | |
| 471 | + try { | |
| 472 | + await axios.post(`/api/company/${selectedCompany.value.id}/agents/${agentId}/heartbeat/start`) | |
| 473 | + await loadCompanyStatus(selectedCompany.value.id) | |
| 474 | + } catch (e) { console.error(e) } | |
| 475 | +} | |
| 476 | + | |
| 477 | +async function stopAgentHeartbeat(agentId) { | |
| 478 | + if (!selectedCompany.value) return | |
| 479 | + try { | |
| 480 | + await axios.post(`/api/company/${selectedCompany.value.id}/agents/${agentId}/heartbeat/stop`) | |
| 481 | + await loadCompanyStatus(selectedCompany.value.id) | |
| 482 | + } catch (e) { console.error(e) } | |
| 483 | +} | |
| 484 | + | |
| 285 | 485 | // switchTab removed, handled by goToTab and router watcher |
| 286 | 486 | |
| 287 | 487 | onMounted(() => { |
| ... | ... | @@ -610,4 +810,157 @@ function closeDropdown() { |
| 610 | 810 | .empty-state-card h2 { font-size: 20px; font-weight: 700; margin: 16px 0 8px; color: var(--text-primary); } |
| 611 | 811 | .empty-state-card p { font-size: 13px; color: var(--text-muted); margin-bottom: 24px; line-height: 1.6; } |
| 612 | 812 | .empty-icon { font-size: 54px; opacity: 0.9; animation: float 3s infinite ease-in-out; display: inline-block; filter: drop-shadow(0 4px 8px rgba(16,185,129,0.3)); } |
| 813 | + | |
| 814 | +/* ═══ Overview Tab ═══ */ | |
| 815 | +.overview-grid { | |
| 816 | + display: grid; | |
| 817 | + grid-template-columns: 1fr; | |
| 818 | + gap: 20px; | |
| 819 | +} | |
| 820 | + | |
| 821 | +.overview-card { | |
| 822 | + background: var(--bg-surface); | |
| 823 | + border: 1px solid var(--border-primary); | |
| 824 | + border-radius: 16px; | |
| 825 | + padding: 24px; | |
| 826 | + transition: all 0.2s; | |
| 827 | +} | |
| 828 | +.overview-card:hover { | |
| 829 | + border-color: var(--border-active); | |
| 830 | + box-shadow: 0 4px 20px rgba(0,0,0,0.08); | |
| 831 | +} | |
| 832 | + | |
| 833 | +.overview-card-header { | |
| 834 | + display: flex; | |
| 835 | + justify-content: space-between; | |
| 836 | + align-items: center; | |
| 837 | + margin-bottom: 20px; | |
| 838 | + padding-bottom: 12px; | |
| 839 | + border-bottom: 1px solid var(--border-primary); | |
| 840 | +} | |
| 841 | +.overview-card-header h3 { font-size: 16px; font-weight: 700; margin: 0; } | |
| 842 | + | |
| 843 | +.company-status-badge { | |
| 844 | + padding: 6px 14px; border-radius: 20px; | |
| 845 | + font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; | |
| 846 | +} | |
| 847 | +.company-status-badge.running { background: rgba(16,185,129,0.15); color: var(--accent-light); } | |
| 848 | +.company-status-badge.creating { background: rgba(59,130,246,0.15); color: var(--blue-text); } | |
| 849 | +.company-status-badge.shutdown { background: rgba(239,68,68,0.12); color: #f87171; } | |
| 850 | +.company-status-badge.paused { background: rgba(251,191,36,0.15); color: var(--yellow-text); } | |
| 851 | + | |
| 852 | +.overview-info-grid { | |
| 853 | + display: grid; | |
| 854 | + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); | |
| 855 | + gap: 16px; | |
| 856 | + margin-bottom: 20px; | |
| 857 | +} | |
| 858 | +.info-item { | |
| 859 | + display: flex; flex-direction: column; gap: 4px; | |
| 860 | + padding: 12px 16px; | |
| 861 | + background: var(--bg-primary); | |
| 862 | + border-radius: 10px; | |
| 863 | + border: 1px solid var(--border-primary); | |
| 864 | +} | |
| 865 | +.info-label { font-size: 11px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; } | |
| 866 | +.info-value { font-size: 14px; font-weight: 600; color: var(--text-primary); line-height: 1.4; } | |
| 867 | + | |
| 868 | +.heartbeat-on { color: var(--accent-light); } | |
| 869 | +.heartbeat-off { color: var(--text-muted); } | |
| 870 | + | |
| 871 | +.overview-actions { | |
| 872 | + display: flex; gap: 12px; padding-top: 12px; | |
| 873 | + border-top: 1px solid var(--border-primary); | |
| 874 | +} | |
| 875 | +.btn-start { | |
| 876 | + background: linear-gradient(135deg, #10b981, #059669); | |
| 877 | + color: #fff; border: none; padding: 10px 24px; border-radius: 10px; | |
| 878 | + font-size: 14px; font-weight: 700; cursor: pointer; transition: all 0.2s; | |
| 879 | +} | |
| 880 | +.btn-start:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 6px 20px rgba(16,185,129,0.3); } | |
| 881 | +.btn-start:disabled { opacity: 0.6; cursor: not-allowed; } | |
| 882 | + | |
| 883 | +.btn-stop { | |
| 884 | + background: linear-gradient(135deg, #ef4444, #dc2626); | |
| 885 | + color: #fff; border: none; padding: 10px 24px; border-radius: 10px; | |
| 886 | + font-size: 14px; font-weight: 700; cursor: pointer; transition: all 0.2s; | |
| 887 | +} | |
| 888 | +.btn-stop:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 6px 20px rgba(239,68,68,0.3); } | |
| 889 | +.btn-stop:disabled { opacity: 0.6; cursor: not-allowed; } | |
| 890 | + | |
| 891 | +.btn-refresh { | |
| 892 | + background: var(--bg-surface-hover); color: var(--text-secondary); | |
| 893 | + border: 1px solid var(--border-primary); padding: 10px 20px; border-radius: 10px; | |
| 894 | + font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.2s; | |
| 895 | +} | |
| 896 | +.btn-refresh:hover { background: var(--bg-primary); border-color: var(--border-active); } | |
| 897 | + | |
| 898 | +.agent-count-badge { | |
| 899 | + padding: 4px 10px; border-radius: 12px; | |
| 900 | + font-size: 12px; font-weight: 600; | |
| 901 | + background: rgba(59,130,246,0.12); color: var(--blue-text); | |
| 902 | +} | |
| 903 | + | |
| 904 | +/* Agent Status Table */ | |
| 905 | +.agent-status-table { display: flex; flex-direction: column; gap: 0; } | |
| 906 | +.table-header, .table-row { | |
| 907 | + display: grid; | |
| 908 | + grid-template-columns: 2fr 1fr 1fr 1fr 1fr 1fr; | |
| 909 | + gap: 8px; align-items: center; | |
| 910 | + padding: 10px 16px; | |
| 911 | +} | |
| 912 | +.table-header { | |
| 913 | + font-size: 11px; font-weight: 700; color: var(--text-muted); | |
| 914 | + text-transform: uppercase; letter-spacing: 0.5px; | |
| 915 | + border-bottom: 1px solid var(--border-primary); | |
| 916 | +} | |
| 917 | +.table-row { | |
| 918 | + font-size: 13px; font-weight: 600; color: var(--text-primary); | |
| 919 | + border-bottom: 1px solid var(--border-primary); | |
| 920 | + transition: background 0.15s; | |
| 921 | +} | |
| 922 | +.table-row:hover { background: var(--bg-primary); } | |
| 923 | +.table-row:last-child { border-bottom: none; } | |
| 924 | + | |
| 925 | +.interval-select { | |
| 926 | + width: 100%; padding: 4px 8px; border-radius: 6px; | |
| 927 | + border: 1px solid var(--border-primary); background: var(--bg-input, var(--bg-primary)); | |
| 928 | + color: var(--text-primary); font-size: 12px; font-weight: 600; | |
| 929 | + cursor: pointer; transition: border-color 0.2s; | |
| 930 | +} | |
| 931 | +.interval-select:focus { outline: none; border-color: var(--accent); } | |
| 932 | + | |
| 933 | +.btn-agent-start { | |
| 934 | + background: rgba(16,185,129,0.12); color: var(--accent-light); | |
| 935 | + border: 1px solid rgba(16,185,129,0.3); padding: 4px 12px; border-radius: 6px; | |
| 936 | + font-size: 11px; font-weight: 700; cursor: pointer; transition: all 0.2s; | |
| 937 | +} | |
| 938 | +.btn-agent-start:hover { background: rgba(16,185,129,0.2); } | |
| 939 | + | |
| 940 | +.btn-agent-stop { | |
| 941 | + background: rgba(239,68,68,0.08); color: #f87171; | |
| 942 | + border: 1px solid rgba(239,68,68,0.2); padding: 4px 12px; border-radius: 6px; | |
| 943 | + font-size: 11px; font-weight: 700; cursor: pointer; transition: all 0.2s; | |
| 944 | +} | |
| 945 | +.btn-agent-stop:hover { background: rgba(239,68,68,0.15); } | |
| 946 | + | |
| 947 | +.agent-dot { | |
| 948 | + display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; | |
| 949 | +} | |
| 950 | +.agent-dot.active { background: #10b981; box-shadow: 0 0 8px rgba(16,185,129,0.5); animation: pulse-dot 2s infinite; } | |
| 951 | +.agent-dot.inactive { background: var(--text-muted); opacity: 0.4; } | |
| 952 | + | |
| 953 | +@keyframes pulse-dot { | |
| 954 | + 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } | |
| 955 | +} | |
| 956 | + | |
| 957 | +.type-badge { | |
| 958 | + padding: 2px 8px; border-radius: 6px; | |
| 959 | + font-size: 11px; font-weight: 600; text-transform: uppercase; | |
| 960 | + background: var(--bg-primary); color: var(--text-tertiary); | |
| 961 | + border: 1px solid var(--border-primary); | |
| 962 | +} | |
| 963 | + | |
| 964 | +.hb-active { color: var(--accent-light); font-size: 12px; } | |
| 965 | +.hb-inactive { color: var(--text-muted); font-size: 12px; } | |
| 613 | 966 | </style> | ... | ... |