游戏竞品活动报告生成工具。当用户需要对某款游戏生成官媒发帖内容和官方活动报告时使用,依次执行数据获取、活动聚合、联网搜索、总结分析四个主要工作模块,最终保存并展示指定格式的竞品报告。触发示例:"帮我做一份 XXX 的竞品活动分析"、"生成 XXX 游戏官帖分析报告"、"最近 XXX 有什么官方活动?"。
Scanned 9/8/2026
Install to Claude Code
npx -y skills add infometa/workbuddyskills --skill databrain-competitor-events --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Databrain Competitor Events?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/infometa-databrain-competitor-events-workbuddyskills)More formats (shields.io, HTML) on the badges page.
---
name: databrain-competitor-events
description: 游戏竞品活动报告生成工具。当用户需要对某款游戏生成官媒发帖内容和官方活动报告时使用,依次执行数据获取、活动聚合、联网搜索、总结分析四个主要工作模块,最终保存并展示指定格式的竞品报告。触发示例:"帮我做一份 XXX 的竞品活动分析"、"生成 XXX 游戏官帖分析报告"、"最近 XXX 有什么官方活动?"。
disable: false
metadata: {"openclaw": {"requires": {"env": ["DATABRAIN_TOKEN", "PLATFORM"]}}}
---
# Competitor Event Report (主控 Skill)
你是竞品游戏活动分析报告的总协调者。解析参数后,为每个游戏并发启动子 Agent 执行 Step 1–4(数据采集、活动聚合、联网搜索、总结分析与报告生成),所有子 Agent 完成后,串行拼接各游戏报告段落,写入文件并展示报告。注意:后续的Utility工作还包括 **[Utility 任务一] 报告的存储与展示** 以及 **[Utility 任务二] 自动化例行任务引导**。两项任务均必须执行,不可跳过。
## 前置检查
**在解析任何参数之前,先读取已安装 plugin 根目录 `.env`;若不存在,再读取当前 Skill 目录下的 `.env`。**
- 若文件**不存在**(Read 返回错误)→ 进入**首次配置流程**(见下方)
- 若文件**存在**,逐行解析(跳过空行和 `#` 注释行),提取:
- `PLATFORM=` 后面的值 → 若为空或不存在该行 → 进入**首次配置流程**
- `DATABRAIN_TOKEN=` 后面的值 → 若为空或不存在该行 → 进入**首次配置流程**
---
### 首次配置流程
Read `submodules/first_time_setup.md`,按照其中的指示和流程来引导用户。
---
### 平台初始化说明
`.env` 读取完成后,记录 `PLATFORM` 的值。**BRANCH 变量不在此处解析**,将在后续每个需要做分支判断的决策点现场重新解析,以确保执行时准确生效。
---
---
## ⛔ 执行纪律(全局约束,优先级最高)
以下规则适用于本 Skill 的**所有步骤**,不得以任何理由违反:
1. **禁止跳过步骤**:严禁以"时间限制"、"复杂度"、"效率"、"任务量大"为由跳过任何步骤。每个步骤都是必须执行的环节。
2. **禁止生成精简版**:严禁擅自删减报告内容、合并活动、或以"内容过长"为由截断输出。报告必须原封不动地包含所有活动的完整分析。
3. **合法的失败处理**:若某个**单条目**因客观原因(网络错误、数据缺失)失败,记录失败原因后可跳过该条目,但不得整体跳过所在步骤。
4. **禁止擅自做 tradeoff**:遇到执行困难时,不得自行判断"这样更合理"并改变执行路径。应按流程继续,或明确告知用户遇到的问题。
---
## 输入参数
从用户请求中解析以下参数:
- **game_names**:待分析的游戏名称列表(一个或多个)。原则上保留用户输入的原始游戏名称,**禁止擅自翻译**(例如不得将英文名翻译为中文,中文译名可能有误);仅当用户输入存在明显拼写错误(typo)时,可修正为正确拼写。
- **start_time**:查询起始时间,精确到秒,如 `2025-01-01 00:00:00`
- **end_time**:查询结束时间,精确到秒,如 `2025-03-31 23:59:59`
- **my_game**(可选):己方运营的游戏,通过竞品分析获得提升改进的受益对象。若用户未输入,则当作通用游戏处理。
- **focus_direction**(可选):用户希望在启发建议中重点关注的方向,如"活动运营策略"、"社区互动方式"、"付费设计"等;若用户未提及则为空字符串
- **regions**(可选,非常见场景):用户需要按国家/语言分区查询时才会提及,通常以自然语言描述(如"美国"、"日本"、"巴西"、"英语区")。解析时须查阅 `references/country_language_code_mapping.csv`(重点参考 `language code` 和 `country code` 两列)将自然语言转换为对应的小写 code(如 `us`、`jp`、`br`、`en`);如用户提及**某个大洲**,收集所有涉及国家的小写code并拼接为"us,ca,mx"的字符串,合并为一个报告实体,无需再拆分为单个国家一一处理。**大多数请求不涉及 regions**,此时默认单一全局视角,不在文件名和报告中附加任何区域标识。
> `unified_edition_id` 无需用户提供,由 `game_search.py` 脚本根据游戏名称自动查询获得。
## 文件名约定
所有中间文件和输出文件使用统一的命名规则:
```
safe_name = game_name.replace(" ", "_").replace(":", "")
# 例:Honkai: Star Rail → Honkai_Star_Rail
# 文件前缀 file_key 由两种情况决定:
# · 未指定 regions(默认全局视角,主要场景):file_key = safe_name
# · 指定了 regions(多区域模式,少数场景): file_key = {safe_name}_{region}
# region 使用从映射表查到的小写 code,不做大小写转换
# 例:Honkai_Star_Rail_us, Honkai_Star_Rail_jp
```
最终报告文件名由 `file_key` 和是否提供 `my_game` 决定:
```
# 用户未提供 my_game:
reports/_report_{file_key}_{timestamp}.md
# 用户提供了 my_game,先将其转换为 safe_name:
my_game_safe = my_game.replace(" ", "_").replace(":", "")
reports/_report_{my_game_safe}_{file_key}_{timestamp}.md
```
> **查询多个具体的国家或语言时**:game_names × regions 的笛卡尔积决定最终报告数量。
> 例:3 个游戏 × 3 个区域 = 9 份独立报告,每份对应一个 (game, region) 对。
> **查询某个大洲时**:无需专门区分大洲内的具体国家,将整个大洲视为一个整体,合并在一起后生成一份报告即可。
各模块输入/输出文件(`{file_key}` 在全局模式时等于 `{safe_name}`,多区域模式时等于 `{safe_name}_{region}`):
| 模块 | 输出文件 |
|---|---|
| opinion-query | `cache/{file_key}_official_posts_{timestamp}.csv` 和 `cache/{file_key}_post_comments_{timestamp}.csv` |
| event_aggregation | `cache/_cluster_summary_{file_key}_{timestamp}.json` |
| online_search | `cache/_online_search_{file_key}_{timestamp}.json` |
| 总结分析 | `cache/_report_section_{file_key}_{timestamp}.md` |
| generate_final_report | 见上方最终报告文件名规则 |
---
## 前置工作一:输入埋点
输入参数解析完成后,立即 Read `submodules/input_logging.md`,按其指令执行一次埋点上报。埋点上报后明确返回成功/失败的结果。
---
## 前置工作二:统一生成全局 timestamp
在启动任何子 Agent 之前,使用 Bash 工具生成一个统一的全局 `timestamp`,所有子 Agent 共享同一个值:
```bash
python -c "from datetime import datetime; print(datetime.now().strftime('%Y%m%d_%H%M%S'))"
```
捕获输出(如 `20250323_143022`)作为全局 `{timestamp}`,**后续所有步骤(子 Agent、报告文件名)均使用此值,不得重新生成**。
> **精度要求:** timestamp 精确到秒(`%Y%m%d_%H%M%S`),年月日相同但时分秒不同则视为不同 timestamp。
> cache/ 目录中可能存有同一天多次执行的历史文件,**必须用完整精确的 timestamp(含时分秒)** 才能唯一定位本次执行的文件,仅匹配日期前缀将导致读取历史错误文件。
---
## 执行流程总览
**主要场景(全局模式,未指定 regions):**
```
解析 game_names(regions 为空,每个游戏对应一个全局查询)
│
├─ [并发] 子 Agent: game_1 → Step 1(全局) → Step 2 → Step 3 → Step 4 → 报告
├─ [并发] 子 Agent: game_2 → Step 1(全局) → Step 2 → Step 3 → Step 4 → 报告
└─ [并发] 子 Agent: game_N → Step 1(全局) → Step 2 → Step 3 → Step 4 → 报告
│
等待所有子 Agent 完成
│
[串行] 每个游戏各自写入独立报告文件 → 展示制品
```
**少数场景(多区域模式,用户明确指定了 regions):**
```
解析 game_names × regions,构建 (game, region) 对列表
│
├─ [并发] 子 Agent: (game_1, region_1) → Step 1(区域定向) → Step 2 → Step 3 → Step 4 → 报告
├─ [并发] 子 Agent: (game_1, region_2) → Step 1(区域定向) → Step 2 → Step 3 → Step 4 → 报告
└─ [并发] 子 Agent: (game_N, region_M) → Step 1(区域定向) → Step 2 → Step 3 → Step 4 → 报告
│
等待所有子 Agent 完成
│
[串行] 每个 (game, region) 对各自写入独立报告文件 → 展示制品
```
> **区域为某个大洲时**,收集所有涉及国家的小写code,并拼接为"us, ca, mx"的字符串例如`--country=us,ca,mx`。无需再拆分为单个国家一一处理。
> **并发粒度说明**:并发上限 3 作用于任务单元总数(全局模式 = 游戏数;多区域模式 = game × region 对数)。
> **并发调用失败时串行保底**:并发启动子agent遇到权限问题或其他报错时,改为串行执行任务保底。
---
## 并发阶段:为每个 (game, region) 对启动独立子 Agent
解析出 `game_names` 和 `regions` 后,构建完整的 **(game, region) 对列表**:
```
pairs = [(game, region) for game in game_names for region in regions]
# 若 regions 未指定,则视为 regions = [""](单一全局视角,region 传空字符串)
```
按以下规则并发启动子 Agent:
- **并发上限为 3**:每批最多同时启动 3 个子 Agent
- 若对总数 ≤ 3:**在同一条消息中**一次性启动所有子 Agent(并发)
- 若对总数 > 3:将列表按每批 3 个拆分,**每批在同一条消息中并发启动**,等待本批全部完成后再启动下一批
- 批次之间不得跳过等待,不得串行逐个启动
每个子 Agent 的 prompt 模板如下(将占位符替换为实际值):
```
你是竞品数据处理子 Agent,负责处理游戏「{game_name}」(区域:{region})从数据采集到报告段落生成的全流程。
当前 Skill 根目录:{skill_root}
游戏名称:{game_name}
区域标识:{region}(若为空字符串,表示不区分区域,走全局查询)
start_time:{start_time}
end_time:{end_time}
my_game:{my_game}
focus_direction:{focus_direction}
DATABRAIN_TOKEN:{DATABRAIN_TOKEN}
全局 timestamp:{timestamp}
**重要:全局 timestamp 已由主控统一生成并传入(值为 {timestamp}),后续所有步骤必须直接使用此值,禁止从文件名提取或重新生成。**
**⚠️ 严格的 timestamp 精度要求(违反将导致读取历史错误文件):**
cache/ 目录下积累了大量历史执行产生的中间文件,文件名格式相同、仅 timestamp 不同。
读取任何上一步骤的产出文件时,**必须使用主控传入的完整精确 timestamp(精确到秒,如 `20250323_143022`)**,一字不差地构造文件路径。
- ❌ **禁止** 使用 Glob、find、ls 等方式在 cache/ 下搜索匹配文件
- ❌ **禁止** 仅匹配日期前缀(如 `20250323_*`)—— 可能匹配到同一天其他历史执行的文件
- ❌ **禁止** 从目录列表中挑选"最新"或"最近"的文件
- ✅ **只允许** 用传入的 `{timestamp}` 直接硬构造完整路径,例如:
`{skill_root}/cache/{file_key}_official_posts_{timestamp}.csv`
- 若以精确路径访问时文件不存在,**立即上报错误**,不得降级为搜索历史文件作为替代
**文件命名前缀(file_key)规则:**
```
safe_name = game_name.replace(" ", "_").replace(":", "")
file_key = f"{safe_name}_{region}" if region else safe_name
# region 保持映射表查到的原始小写 code,不做大小写转换
```
后续所有中间文件和报告段落文件均以 `{file_key}` 为前缀,而非 `{safe_name}`。
**⛔ 禁止在执行步骤前进行无关的文件搜索或探路操作**,包括但不限于:
- 搜索 cache 目录下的历史 CSV / JSON 文件
- 用 Glob 查找同游戏名的历史输出文件
- 检查是否存在可复用的缓存
所有中间文件均由当前步骤现场生成,直接按步骤顺序执行即可。
请依次执行以下四个步骤。**每个步骤完成后立即输出一行进度日志**(格式见下),然后继续下一步:
### Step 1 — 舆情数据获取
若 region 为空字符串,Read `{skill_root}/submodules/opinion_query.md`,按其指令执行全局查询。
若 region 非空,Read `{skill_root}/submodules/region_query.md`,按其指令执行该区域的定向查询。
输出两个 CSV 文件路径,存放于 {skill_root}/cache/ 目录下:
- `{file_key}_official_posts_{timestamp}.csv`
- `{file_key}_post_comments_{timestamp}.csv`
使用查询返回的 entity_name 作为后续步骤的 game_name。
**不得**从 CSV 文件名中提取 timestamp,始终使用传入的全局 timestamp。
**Step 1 完成后立即输出:**
`[{game_name}({region})] ✅ Step 1 完成 — 舆情数据获取成功,共 {N} 条官方帖子,共 {n} 条帖子评论,timestamp={timestamp}`
### Step 2 — 活动聚合
Read `{skill_root}/submodules/event_aggregation.md`,按其指令执行。
传入:game_name(entity_name)、official_posts_csv、post_comments_csv、timestamp
- 输入文件路径必须为:
- `{skill_root}/cache/{file_key}_official_posts_{timestamp}.csv`
- `{skill_root}/cache/{file_key}_post_comments_{timestamp}.csv`
- **禁止搜索目录,直接使用上述精确路径读取 Step 1 的产出**
输出:{skill_root}/cache/_cluster_summary_{file_key}_{timestamp}.json
**Step 2 完成后立即输出:**
`[{game_name}({region})] ✅ Step 2 完成 — 活动聚合成功,共识别 {M} 个活动簇`
### Step 3 — 联网搜索
Read `{skill_root}/submodules/online_search.md`,按其指令执行。
传入:game_name、cache/_cluster_summary_{file_key}_{timestamp}.json、timestamp
- 输入文件路径必须为:
- `{skill_root}/cache/_cluster_summary_{file_key}_{timestamp}.json`
- **禁止搜索目录,直接使用上述精确路径读取 Step 2 的产出**
输出:{skill_root}/cache/_online_search_{file_key}_{timestamp}.json
**Step 3 完成后立即输出:**
`[{game_name}({region})] ✅ Step 3 完成 — 联网搜索成功,共搜索 {m} 个问题`
### Step 4 — 总结分析与报告段落生成
传入:game_name、{skill_root}/cache/_online_search_{file_key}_{timestamp}.json、my_game、focus_direction
- 输入文件路径必须为:
- `{skill_root}/cache/_online_search_{file_key}_{timestamp}.json`
- **禁止搜索目录,直接使用上述精确路径读取 Step 3 的产出**
输出:报告段落 {skill_root}/cache/_report_section_{file_key}_{timestamp}.md
基于 联网搜索的结果,逐个分析结果中的每个活动,按照以下要求生成该游戏的报告段落(Markdown 格式):
- 活动按 total_engagement 从高到低排列
- 整体使用**中文**输出
- **谨慎翻译游戏专有名词:** 仅当搜索来源中有明确的中文译名时才使用,否则保留原始语言
- focus_direction 若非空,在"可借鉴启发"中重点关注该方向;若为空,从以下角度中选择与帖子内容相符的方面针对 my_game 进行启发借鉴分析:活动运营与宣发策略、与玩家互动类活动、品牌联动、病毒梗传播方式、UGC 活动运营
**Top 正面/负面评论观点**:数据来源为输入 json 中的 positive_sentiment_comments 和 negative_sentiment_comments comment list,分别聚类并统计 Top 3 观点(依据相应的支持评论数从高到低排列)。
**正面/负面代表性评论**:按点赞量从高到低选取,过滤语义不明或重复的评论,正面和负面各语义至多展示三条,并附带中文翻译。
**空数据处理**:注意,评论数量及占比, Top 评论观点和代表性评论这三部分都可能无相关数据,此时在报告中输出"暂无相关数据"即可。
每个活动使用以下模板输出:
---
## 活动 {index}:{event_name}
**活动发布时间:** {event_release_date}
**活动发布内容:** {event_release_content}
**活动描述:** {event_description}
**代表主贴链接:** {content_url_lists[0]}
**代表主贴数据表现:** 浏览量:{tweets_view_lists[0]}, 点赞量:{tweets_like_lists[0]}, 回复量:{tweets_reply_lists[0]}, 转发量:{tweets_retweet_lists[0]}, 互动量:{engagement_lists[0]}
**评论数量及占比**:正面评论 {positive_sentiment_comment_no}条(占比xx%),负面评论 {negative_sentiment_comment_no}条(占比xx%),中性评论 {neutral_sentiment_comment_no}条(占比xx%)
**总互动量:** {total_engagement}
**Top 正面评论观点:**
- {top_positive_opinion_1}
- {top_positive_opinion_2}
- {top_positive_opinion_3}
**正面代表性评论:**
- {representative_positive_comment_1} (对应的评论中文翻译)
- {representative_positive_comment_2} (对应的评论中文翻译)
- {representative_positive_comment_3} (对应的评论中文翻译)
**Top 负面评论观点:**
- {top_negative_opinion_1}
- {top_negative_opinion_2}
- {top_negative_opinion_3}
**负面代表性评论:**
- {representative_negative_comment_1} (对应的评论中文翻译)
- {representative_negative_comment_2} (对应的评论中文翻译)
- {representative_negative_comment_3} (对应的评论中文翻译)
**宣发形式及策略:** {promotion_approach}
**可借鉴启发:** {implications}
---
将生成的完整报告段落(该游戏所有活动,**不含**总标题行)写入:
`{skill_root}/cache/_report_section_{file_key}_{timestamp}.md`
**Step 4 完成后立即输出:**
`[{game_name}({region})] ✅ Step 4 完成 — 总结分析完成,共生成 {N} 个活动报告,段落已写入 _report_section_{file_key}_{timestamp}.md`
全部完成后,返回以下 JSON(不要输出其他内容):
{
"game_name": "<entity_name>",
"region": "<region>",
"safe_name": "<safe_name>",
"file_key": "<file_key>",
"timestamp": "<timestamp>",
"event_count": <该任务单元的活动总数>,
"report_section_path": "<{skill_root}/cache/_report_section_{file_key}_{timestamp}.md 的完整路径>"
}
```
> **skill_root** 为当前 SKILL.md 所在目录的绝对路径,执行前通过 Bash `pwd` 或已知路径确认。
> 子Agent 执行任务所需的.md指令和脚本文件都存放于**skill_root**该目录下
---
## 最终汇总:拼接所有内容,生成唯一一份报告
等待所有子 Agent 返回结果后,收集每个子 Agent 的输出 JSON,汇总为列表:
```json
[
{ "game_name": "...", "region": "...", "safe_name": "...", "file_key": "...", "timestamp": "...", "event_count": N, "report_section_path": "..." },
...
]
```
若某个子 Agent 失败,记录失败原因,跳过该项,继续处理其余。
> **⚠️ 读取报告段落文件时的 timestamp 约束:**
> 每个子 Agent 已在返回 JSON 中提供了 `report_section_path`(包含完整的精确 timestamp)。
> 读取段落文件时**必须使用该路径**,不得自行在 cache/ 目录中搜索或猜测文件名。
> timestamp 必须与子 Agent 返回值完全一致(精确到秒),日期相同但时间不同的文件属于历史文件,**严禁读取**。
### 拼接规则
**最终只产出一份报告文件**,拼接方式视是否有 region 而定:
**① 报告总标题**(写在最前):
```
# {start_time} 至 {end_time} 官号竞品活动情报
> 共 {total_event_count} 个活动({game_1}:{N1} 个,{game_2}:{N2} 个,…)
---
```
**② 按游戏分组,按 game_names 原始顺序依次追加**:
- **无 region(全局模式)**:每个游戏插入游戏名标题,紧接其报告段落:
```
# {game_name}
{_report_section_{file_key}_{timestamp}.md 全部内容}
```
- **有 region(多区域模式)**:先按游戏分组,同一游戏内再按 regions 顺序排列各区域段落:
```
# {game_name}
## {region_1}
{_report_section_{file_key_region1}_{timestamp}.md 全部内容}
## {region_2}
{_report_section_{file_key_region2}_{timestamp}.md 全部内容}
```
**③** 所有游戏段落拼接完毕后,整体即为最终报告,按 **[Utility 任务一]** 规则写入文件并展示。
**灵活性说明:** 若用户在请求中提出了特定的格式要求或希望新增输出维度(如展示搜索来源、增加互动数据对比等),在生成报告时直接按用户要求调整,无需修改模板文件。新增的输出维度必须有真实准确的数据作为基础,禁止捏造。
## [Utility 任务一]储存并展示报告
报告存储分为**两个阶段**,必须按顺序执行:
> **🔁 现场解析 BRANCH(执行本任务前必读)**
> 回顾 `.env` 中读取到的 `PLATFORM` 值,按下表重新推导 BRANCH,并在心中明确声明:**当前 BRANCH = {A/B/C}**,后续仅执行对应分支,跳过其余。
>
> | PLATFORM 值 | BRANCH |
> |---|---|
> | `WorkBuddy` | `A` |
> | `Openclaw` | `B` |
> | 其他 / 空 | `C` |
---
### 阶段一:在当前工作目录下储存报告 (根据解析BRANCH,不同BRANCH采用不同的储存和展示方式)
最终只有**一份报告文件**,文件名规则(写入 default workspace 根目录):
- 若用户**未提供** `my_game`:`_report_{timestamp}.md`
- 若用户**提供了** `my_game`:`_report_{my_game_safe}_{timestamp}.md`
> 任何 Branch 均须遵守:必须原封不动保存报告全部内容,**禁止擅自删减**。如遇写入错误,检查占位符后重试,不得以"内容过长"为由跳过任何活动。
**[Branch A - WorkBuddy]** 使用标准分批写入协议,逐活动写入,最终**移除**占位符:
- 目标:将最终报告保存到 产物 - 制品 ,并要求调用结果展示
- **第一步:** 用 `write` 工具写入报告头部 + 第一个活动,末尾追加 `<!-- NEXT_BATCH -->`
- **第二步:** 用 `replace_in_file` 将 `<!-- NEXT_BATCH -->` 替换为下一个活动内容 + 新的 `<!-- NEXT_BATCH -->`,逐活动重复
- **第三步:** 最后一个活动直接替换 `<!-- NEXT_BATCH -->`,不再追加占位符
- **第四步:** 写入完成后使用 `open_result_view` 工具打开**存放于 WorkBuddy default workspace 根目录**的报告文件展示制品报告。(注意不是存放于{skill_root}/reports/ 目录的报告文件)
**[Branch B - Openclaw]** 使用标准分批写入协议,逐活动写入,最终**移除**占位符(文件存档用途,不通过 IM 推送完整报告):
- **第一步:** 用 `write` 工具写入报告头部 + 第一个活动,末尾追加 `<!-- NEXT_BATCH -->`
- **第二步:** 用 `replace_in_file` 将 `<!-- NEXT_BATCH -->` 替换为下一个活动内容 + 新的 `<!-- NEXT_BATCH -->`,逐活动重复
- **第三步:** 最后一个活动直接替换 `<!-- NEXT_BATCH -->`,不再追加占位符
- **第四步:** 报告生成完成后,直接在当前对话回复中输出摘要规则如下:
- **在当前对话中直接回复:** 不要使用 message tool 主动发送消息。
- **内容范围:** 仅输出每个游戏各活动的摘要内容,按以下格式发送:(活动名,互动量),**无需附带其他信息、不发送完整报告原文**
- **分条规则:** 每个游戏的摘要作为**一条独立消息**发送;若有多个游戏,则拆分成多条消息,按游戏顺序发送。
- **第五步:** 报告生成完成后,把生成的报告文件以文件传输的方式发送给用户。
**[Branch C - Others]** 使用标准分批写入协议,逐活动写入,最终**移除**占位符:
- **第一步:** 用 `write` 工具写入报告头部 + 第一个活动,末尾追加 `<!-- NEXT_BATCH -->`
- **第二步:** 用 `replace_in_file` 将 `<!-- NEXT_BATCH -->` 替换为下一个活动内容 + 新的 `<!-- NEXT_BATCH -->`,逐活动重复
- **第三步:** 最后一个活动直接替换 `<!-- NEXT_BATCH -->`,不再追加占位符
- **第四步:** 写入完成后,原封不动地打印输出报告的完整内容
---
### 阶段二:copy 到 reports 目录存档
阶段一完成后,使用 Bash 的 `cp` 命令将 default workspace 的报告文件**直接复制**到 skill 的 reports 目录,**禁止重新生成内容**:
```bash
cp "{default_workspace_file_path}" "{skill_root}/reports/_report_{filename}.md"
```
同时告知用户文件已保存:
| 文件 | 说明 |
|---|---|
| artifact 路径 | 制品展示文件 |
| `{skill_root}/reports/` | 本地存档副本 |
## [Utility 任务二] 自动化例行任务 (后续必要任务、不可跳过)
> **🔁 现场解析 BRANCH(执行本任务前必读)**
> 回顾 `.env` 中读取到的 `PLATFORM` 值,按下表重新推导 BRANCH,并在心中明确声明:**当前 BRANCH = {A/B/C}**,后续仅执行对应分支,跳过其余。
>
> | PLATFORM 值 | BRANCH |
> |---|---|
> | `WorkBuddy` | `A` |
> | `Openclaw` | `B` |
> | 其他 / 空 | `C` |
**[Branch A - WorkBuddy]**
WorkBuddy平台自带优秀的自动化任务工具,因此更推荐使用平台上提供的自动化功能。将以下引导信息输出给用户:
如果对本次生成报告满意,希望自动化例行报告,可前往WorkBuddy的"自动化"功能模块,进行定时任务的创建和管理。
**[Branch B - Openclaw]**
Read `{skill_root}/submodules/daily_push.md`,按其指令判断是否需要引导用户开启自动推送。
**[Branch C - Others]**
Read `{skill_root}/submodules/daily_push.md`,按其指令判断是否需要引导用户开启自动推送。
> 禁止在报告展示后添加任何形式的回顾或总结文字。
> 如果某个子模块执行失败,记录失败原因,检查对应中间文件是否存在,必要时从失败步骤重新执行,无需从头开始。
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!