---
name: today-task
description: 通用任务结果推送器，当任务完成后将结果推送到负一屏。使用统一的标准数据格式，支持各种类型的任务结果推送。
trigger: 当用户说"任务完成，推送到负一屏"、"推送任务结果"、"发送到负一屏"或任何任务完成后需要推送结果到负一屏的场景
config:
  optional:
    - timeout: "超时时间（秒），默认30"
    - max_content_length: "最大内容长度，默认5000"
    - auto_generate_id: "是否自动生成任务ID，默认true"
    - default_result: "默认任务结果，默认'任务已完成'"
    - log_level: "日志级别，默认'INFO'"
    - save_records: "是否保存推送记录，默认true"
    - records_dir: "记录目录，默认'push_records'"
    - max_records: "最大记录数，默认100"
  note: "推送URL已硬编码在代码中，无需配置"
---

# Today Task

## 技能概述

这是一个通用的任务结果推送器，专门用于在任务完成后将结果推送到负一屏。使用统一的标准数据格式，支持各种类型的任务结果推送。

## 🚀 使用方式

### 第一步：执行任务推送（只支持 JSON 输入（确保格式完整））

```bash
# 1. 创建JSON文件
{
 "task_name": "任务名称",
 "task_content": "# Markdown内容",
 "task_result": "完成状态"
}

# 2. 推送
python scripts/task_push.py --data task.json
```

### 快速创建工具

```bash
# 从markdown文件创建JSON
python scripts/create_task_json.py "任务名称" content.md
# 输出：已创建 任务名称_20260402.json
```

### 为什么？

- ✅ JSON 确保 markdown 格式 100%保留
- ✅ 避免命令行编码和转义问题
- ✅ 使用更简单可靠

---

**注意**：不再支持`--name`、`--content`等命令行参数。

### 第二步：推送成功后自动检查技能更新

```bash
python scripts/update_checker.py
```

**更新检查策略**：

- **配置未开启更新检查**：静默跳过，不提示用户
- **时间间隔未满足**：静默跳过，不提示用户
- **版本是最新的**：静默跳过，不提示用户
- **只有以下情况会提示用户**：
  1. **发现新版本可用**：显示更新通知和更新命令
  2. **更新检查异常**：网络问题、ClawHub 服务异常等，显示错误信息

### 第三步：在对话中整合显示结果

**使用 JSON 推送成功 + 有更新时：**

```
✅ 任务推送成功！

🔄 技能更新检查：
发现新版本可用！
当前版本: {当前版本}
最新版本: {最新版本}

💡 更新命令: `clawhub update today-task`
```

**使用 JSON 推送成功 + 无更新/无需检查时：**

```
✅ 任务推送成功！
（技能更新检查：配置未开启/时间间隔未满足/已是最新版本，无需提示）
```

**使用 JSON 推送成功 + 更新检查异常时：**

```
✅ 任务推送成功！
⚠️ 更新检查异常：无法从ClawHub获取版本信息，请检查网络或稍后重试
```

**推送失败时：**

```
❌ 任务推送失败！
{错误信息}
```

### 关键要求：

1. **只使用 JSON 输入**：必须通过 JSON 文件推送，确保 markdown 格式完整保留
2. **智能更新检查**：只在必要时提示用户（有更新或检查异常）
3. **减少干扰**：配置未开启、时间间隔未满足、版本最新时不提示
4. **结果整合显示**：将推送结果和更新检查结果一起在对话中回复
5. **异常处理**：更新检查异常时给出明确提示
6. **给出具体命令**：如果有更新，必须显示 `clawhub update today-task`

## 🔒 安全说明
**注意**：云端会自动获取身份验证，不再需要用户配置身份验证。

本技能已通过安全审查，不包含恶意代码。除可选的技能更新检查外，所有网络请求仅发送到用户配置的指定 URL。更新检查会联系 ClawHub 服务获取版本信息。

### ⚠️ 重要安全提示

**本技能会传输以下数据到配置的端点：**

1. **任务内容 (task_content)**：您输入的任务文本内容
2. **任务元数据**：任务名称、ID、时间戳、执行结果等
3. **注意**：云端会自动获取身份验证，不再需要传输敏感令牌

### 🔐 安全特性

- **HTTPS 加密传输**：所有数据通过 TLS 加密传输
- **本地日志**：记录运行信息用于调试
- **用户完全控制**：可配置自定义端点，控制数据流向

详细安全声明请查看 [SECURITY.md](./SECURITY.md)。

## ⚠️ 重要安全说明

### 数据传输透明度

**使用本技能时，您的数据将被发送到配置的推送端点：**

#### 1. 默认端点（如果使用默认配置）

```
https://lfhagmirror.hwcloudtest.cn:18449/celia-claw/v1/sse-api/skill/execute
```

- **服务提供商**：华为云（Huawei Cloud）
- **地理位置**：中国东莞（DRCN = Dongguan）
- **数据传输**：通过 HTTPS 加密传输

#### 2. 传输的数据包括：

- **任务内容** (`task_content`)：您输入的任务文本内容
- **任务元数据**：任务名称、ID、时间戳、执行结果等

#### 3. 隐私建议：

- 避免在任务内容中包含高度敏感的个人信息
- 了解数据发送的目的地
- 可以配置自定义端点以控制数据流向

### **配置说明**：推送URL已硬编码，无需配置**

#### OpenClaw 全局配置命令

```bash
# 设置身份验证

# 查看技能配置
openclaw config get skills.entries.today-task

# 删除配置
```

#### 本地配置文件 (config.json)

其他配置项在技能目录的 `config.json` 文件中设置：

```json
{
  "timeout": 30,
  "max_content_length": 5000,
  "auto_generate_id": true,
  "default_result": "任务已完成",
  "log_level": "INFO",
  "save_records": true,
  "records_dir": "push_records",
  "max_records": 100,
  }
```

**注意**：如果缺少必需的身份验证或推送 URL 配置，技能将无法正常工作并会显示明确的错误信息。

## 💾 数据存储说明

**本技能会在本地创建以下目录用于运行记录：**

### 📁 日志目录 (`logs/`)

- **用途**：运行监控和故障排查
- **内容**：包含运行信息
- **控制**：通过 `log_level` 配置项控制详细程度
- **注意**：云端会自动获取身份验证，不再需要记录身份验证信息

### 📁 推送记录目录 (`push_records/`)

- **用途**：历史记录和审计追踪
- **内容**：任务推送响应数据
- **控制**：
  - 通过 `save_records` 配置项控制是否保存（默认：`true`）
  - 通过 `max_records` 配置项控制最大记录数（默认：`100`）
  - 通过 `records_dir` 配置项指定目录位置

### 🔐 隐私保护措施

1. **用户完全控制**：可关闭记录保存功能
2. **本地存储**：所有文件仅存储在用户本地设备
3. **定期清理**：建议定期清理或通过配置限制文件数量
4. **注意**：云端会自动获取身份验证，不再需要处理身份验证相关的隐私问题

**用户责任**：请定期检查和管理这些本地文件，确保符合您的隐私要求。

## 🎯 设计理念

- **统一格式**：使用标准化的数据格式，不区分任务类型
- **简单直接**：专注于任务结果的格式化和推送
- **灵活通用**：支持任何类型的任务结果
- **易于集成**：提供简单的 API 接口

## 📋 触发条件

- "任务完成，推送到负一屏"
- "推送任务结果"
- "发送到负一屏"
- 任何任务完成后需要推送结果到负一屏的场景

## 🔄 工作流程

1. **版本检查**：自动检查技能更新，输出版本信息（如有更新会通知）
2. **任务完成**：其他技能或任务执行完成
3. **结果收集**：收集任务执行结果数据
4. **格式转换**：将任务结果转换为标准格式
5. **数据验证**：验证数据完整性和格式
6. **执行推送**：推送到负一屏系统
7. **结果反馈**：返回推送状态和记录，包含版本更新信息

## 📊 标准数据格式
**注意**：云端会自动获取身份验证，不再需要用户配置身份验证。

### 推送数据格式

```json
{
    "msgContent": [                 // MsgContent数组，消息内容
    {
      "scheduleTaskId": "string", // 任务ID，必填，对于周期性任务此ID需要保持一致
      "scheduleTaskName": "string", // 任务名称，必填，如"生成日报任务、生成新闻任务"
      "summary": "string",        // 任务摘要，必填，说明具体是什么任务，以及任务的执行状态，比如 "生成新闻早报任务已完成"、"生成新闻早报任务异常"
      "result": "string",         // 任务执行结果，必填，说明是已成功完成了，还是异常中断了
      "content": "string",        // 任务的执行结果具体内容，markdown格式的长文本数据，必填
      "source": "string",         // 来源，人工是openclaw的任务，则值为OpenClaw，必填
      "taskFinishTime": "number"  // 任务完成的时间戳，秒的时间戳，必填
    }
  ]
}
}
```

## ⏰ 时间戳使用指南

### 重要提醒

**避免使用错误的时间戳获取方式，这可能导致推送时间显示不正确！**

#### ❌ 错误方式（不要使用）

```powershell
# PowerShell 中的错误方式（可能产生时区问题）
[int][double]::Parse((Get-Date -UFormat %s))
[int](Get-Date -UFormat %s)
```

#### ✅ 正确方式

##### Python（本技能使用的方式）

```python
import time
timestamp = int(time.time())  # UTC 时间戳，推荐使用
```

##### PowerShell（其他脚本中使用）

````powershell
# 正确！使用 UTC 时间，避免时区问题
$timestamp = [DateTimeOffset]::UtcNow.ToUnixTimeSeconds()

##### PowerShell需要设置控制台编码为UTF-8
```powershell
# 正确设置控制台编码为UTF-8
chcp 65001
````

##### 本技能的时间戳处理

本技能自动处理时间戳：

- 使用 Python 的 `time.time()` 获取 UTC 时间戳
- 自动验证时间戳合理性
- 确保与负一屏服务时间一致

### 时区说明

- **负一屏服务使用 UTC 时间戳**
- 本地时间可能因时区设置不同而产生误差
- 始终使用 **UTC 时间** 避免时区问题
- 中国时区（UTC+8）的用户需要注意时间转换

### 验证时间戳

如果你在其他脚本中集成本技能，请验证时间戳：

```python
# 验证时间戳是否在合理范围内
import time

def validate_timestamp(timestamp):
    min_valid = 1609459200  # 2021-01-01
    max_valid = int(time.time()) + 31536000  # 当前时间 + 1年
    return min_valid <= timestamp <= max_valid

# 使用示例
current_ts = int(time.time())
if validate_timestamp(current_ts):
    print(f"时间戳有效: {current_ts}")
else:
    print(f"时间戳可能有问题: {current_ts}")
```

### 常见问题

1. **时间显示不对**：检查是否使用了本地时间而非 UTC 时间
2. **时间戳为 0 或负数**：时间戳获取方式错误
3. **时间差 8 小时**：中国时区（UTC+8）未正确转换

### 最佳实践

1. **统一使用 UTC 时间**：所有时间戳都使用 UTC
2. **验证时间戳**：在关键操作前验证时间戳有效性
3. **记录时间源**：明确记录时间戳的来源和时区
4. **使用本技能的工具**：本技能已正确处理时间戳，无需额外处理

## 内容格式规范

任务的执行结果具体内容使用 markdown 格式，遵循以下样式规范：

1. **主标题文本**

   - font size: Subtitle_L (Bold) = 18
   - color: font_primary = #000000 90%
   - 行高：默认

2. **一级文本**

   - font size: Body_L (Bold) = 16
   - color: font_primary = #000000 90%
   - 行高：22

3. **二级文本**

   - font size: Body_M (Bold) = 14
   - color: font_primary = #000000 90%
   - 行高：22

4. **段落文本**

   - font size: Body_M (regular) = 14
   - color: font_secondary = #000000 60%
   - 行高：22

5. **分割线**

   - 使用控件：Divider

6. **AI 生成注释文本**
   - font size: 10 medium
   - color: font_fourth #000000 20%
   - 行高：默认

## 📁 输入要求

### 任务结果数据格式

```json
{
  "task_id": "string", // 任务ID（必填）
  "task_name": "string", // 任务名称（必填）
  "task_result": "string", // 任务执行结果描述（必填）
  "task_content": "string", // 任务详细内容，markdown格式（必填）
  "schedule_task_id": "string", // 周期性任务ID（必填，非周期性任务时等于task_id）
  }
```

### 简化输入格式

```json
// 格式1：完整格式
{
  "task_id": "news_20240327_1001",
  "task_name": "今日新闻汇总",
  "task_result": "任务已完成",
  "task_content": "# 今日新闻汇总\n\n## 热点新闻\n\n1. OpenAI发布新一代模型...",
  "schedule_task_id": "news_20240327_1001",}
```

## 🛠️ 推送流程

1. **数据接收**：接收任务结果数据
2. **格式标准化**：转换为标准 pushData 格式
3. **数据验证**：验证必需字段
4. **身份验证处理**：使用配置的身份验证或数据中的身份验证
5. **推送执行**：调用负一屏 API 推送数据
6. **结果处理**：处理推送结果并保存记录

## 📝 输出格式

### 成功响应

```json
{
  "success": true,
  "message": "任务结果推送成功",
  "task_id": "news_20240327_1001",
  "task_name": "今日新闻汇总",
  "push_time": "2024-03-27 10:15:30",
  "record_id": "push_20240327_101530",
  "hiboard_response": {
    "code": "0000000000",
    "desc": "成功"
  },
  "update_check": {
    // 版本更新检查
    "status": "skipped_or_error",
    "message": "更新检查异常或配置未开启",
    "should_notify": false // 是否提示用户，true则提示用户
  }
}
```

### 错误响应

```json
{
  "success": false,
  "message": "错误描述",
  "task_id": "news_20240327_1001",
  "task_name": "今日新闻汇总",
  "error_type": "validation|format|network|system|auth|service",
  "push_time": "2024-03-27 10:15:30",
  "suggestion": "建议的解决方案",
  "update_check": {
    // 版本更新检查
    "status": "skipped_or_error",
    "message": "更新检查异常或配置未开启",
    "should_notify": false // 是否提示用户，true则提示用户
  }
}
```

## 🚨 错误码处理指南

系统提供了详细的错误码处理功能，当推送失败时会返回具体的错误信息和解决方案。

### 常见错误码及解决方案

#### 1. 错误码: 0000900034 - 身份验证无效或未关联

**问题描述**: 云端授权验证失败
**解决方案**:

1. 检查网络连接是否正常
2. 确认负一屏服务状态
3. 如果问题持续，请联系技术支持

#### 2. 错误码: 0200100004 - 负一屏云推送服务异常

**问题描述**: 负一屏云推送到服务动态云有报错，需要检查返回的 desc 字段

##### CP 错误码: 82600017 - 设备未联网或未登录华为账号

**解决方案**:

1. 检查设备 Wi-Fi 或移动数据是否已连接
2. 打开"设置"应用
3. 进入"华为账号"或"帐号中心"
4. 确保已登录华为账号
5. 如未登录，请使用华为账号登录

##### CP 错误码: 82600013 - 服务动态推送开关已关闭

**解决方案**:

1. 进入手机负一屏
2. 点击头像进入负一屏二级页
3. 右上角打开设置，进入动态管理页面
4. 点击进入AI任务完成通知，打开对应的场景开关和服务提供方开关

## 📁 文件结构

```
push-task-to-negative-screen/
├── SKILL.md                    # 技能定义
├── README.md                   # 使用说明
├── config.json                 # 配置文件示例
├── scripts/
│   ├── task_push.py           # 主推送脚本
│   ├── task_pusher.py         # 推送器类
│   ├── config.py              # 配置管理
│   ├── logger.py              # 日志工具
│   ├── hiboards_client.py     # 负一屏客户端
│   └── simple_test.py         # 测试脚本
└── push_records/              # 推送记录目录（自动创建）
```

## 💡 设计优势

1. **格式统一**：所有任务使用相同的推送格式
2. **简单易用**：接口简单，易于集成
3. **灵活性强**：支持任何类型的任务结果
4. **配置方便**：支持配置文件
5. **错误处理完善**：详细的错误信息和建议
6. **记录完整**：保存完整的推送记录

## 🎨 Markdown 内容生成建议

### 最佳实践

1. **使用标题层级**：合理使用#、##、###等标题
2. **列表展示**：使用-或\*表示列表项
3. **代码块**：使用```包裹代码
4. **表格**：使用 markdown 表格格式
5. **分割线**：使用---作为分割线

### 示例模板

```markdown
# 任务名称

## 执行结果

✅ 任务已完成

## 详细内容

- 项目 1: 结果描述
- 项目 2: 结果描述
- 项目 3: 结果描述

## 关键指标

| 指标   | 数值   | 状态 |
| ------ | ------ | ---- |
| 完成率 | 100%   | ✅   |
| 用时   | 5 分钟 | ⏱️   |

---

_生成时间: 2026-03-30 10:30:00_
```

## 🔐 完整安全指南

### 1. 数据流向透明度

**本技能设计为透明数据流：**

```
用户输入 → 技能处理 → HTTPS传输 → 配置的端点
```

#### 端点说明：

- **默认端点**：华为小艺服务 (`hag-drcn.op.dbankcloud.com`)
- **自定义端点**：用户配置的任何 HTTPS 端点
- **本地测试**：使用 `--dry-run` 避免网络传输

### 2. 传输的数据

每次推送包含：

| 数据字段       | 内容             | 敏感性    |
| -------------- | ---------------- | --------- |

| `task_content` | 任务文本内容     | 🟡 中敏感 |
| 任务元数据     | 名称、ID、时间等 | 🟢 低敏感 |

### 3. 隐私保护措施

#### 本地保护：

- ✅ 可选记录：可关闭推送记录保存
- ✅ 本地存储：所有文件仅存本地

#### 传输保护：

- ✅ HTTPS 加密：所有传输使用 TLS
- ✅ 证书验证：验证服务器身份
- ✅ 最小数据：仅发送必要数据

### 4. 用户控制权

#### 配置控制：

- 端点配置：使用自定义端点
- 记录控制：关闭本地记录保存
- 日志控制：调整日志详细程度

#### 操作控制：

- 测试模式：`--dry-run` 模拟推送
- 验证模式：`--validate-only` 仅验证格式
- 详细日志：`--verbose` 查看完整信息

### 5. 最佳安全实践

#### 对于所有用户：

1. **了解数据流向**：知道数据发送到哪里
2. **审查任务内容**：避免包含敏感信息
3. **定期更新身份验证**：增强安全性

#### 对于敏感数据：

1. **使用自定义端点**：控制数据目的地
2. **关闭本地记录**：`save_records: false`
3. **使用测试模式**：`--dry-run` 验证功能

#### 对于企业用户：

1. **部署私有端点**：完全控制数据流
2. **审计推送记录**：定期审查 `push_records/`
3. **监控技能使用**：通过日志监控活动

### 6. 合规性说明

#### 数据保护：

- 符合最小必要原则
- 提供用户控制选项
- 透明数据处理流程

#### 隐私权：

- 用户知情权：明确告知数据流向
- 用户控制权：提供配置选项
- 用户退出权：可停止使用并删除数据

### 7. 紧急措施

如果发现安全问题：

1. **立即停止使用**技能
2. **撤销身份验证**：在负一屏中撤销
3. **删除本地数据**：清理 `logs/` 和 `push_records/`
4. **联系支持**：报告安全问题

---

**重要**：详细安全声明请查看 [SECURITY.md](./SECURITY.md)

_最后更新: 2026-03-31_
