auto: sync OpenClaw config 2026-09-17 22:13

This commit is contained in:
2026-09-17 22:13:37 +08:00
parent a48974bf4a
commit e21152e1a9
9 changed files with 368 additions and 23 deletions
@@ -1,11 +1,11 @@
---
name: "birthday-reminder"
description: "管理家人/朋友生日提醒。农历或阳历生日,每年换算公历,生日前7天、前3天、当天通过钉钉提醒杨轩。"
description: "管理家人/朋友生日提醒。农历或阳历生日,每年换算公历,生日前7天、前3天、当天通过钉钉+飞书双通道提醒杨轩。"
---
# 生日提醒 skill
统一管理杨轩的家人/朋友生日提醒。支持农历或阳历生日,每年换算公历日期,在生日**前7天、前3天、当天**通过钉钉当前对话提醒杨轩。
统一管理杨轩的家人/朋友生日提醒。支持农历或阳历生日,每年换算公历日期,在生日**前7天、前3天、当天**通过**钉钉 + 飞书两个通道**提醒杨轩。
## 触发场景
@@ -49,14 +49,17 @@ for year in range(2026, 2031):
## 创建 cron 任务(核心流程)
每个生日建**3一次性 cron 任务**(前7天/前3天/当天),使用 `isolated` session + announce 投递到钉钉
每个生日建**3一次性 cron 任务**(前7天/前3天/当天),每对含**钉钉 + 飞书各一条**。单条 cron 只能投一个渠道,双通道靠「孪生任务」实现
关键投递参数**必须显式设置,否则不会推送到钉钉**):
- `--session isolated`
- `--announce --channel dingtalk-connector --to 0464031658857345`
- `--wake now --delete-after-run`
投递目标(**必须显式设置,否则不会推送**):
命令模板:
- 钉钉:`--announce --channel dingtalk-connector --to 0464031658857345`
- 飞书:`--announce --channel feishu --to oc_8eecfa0e1cc185c1cb19b4f3950cbc52`
**必须用私聊 chat_id**;用用户 open_id 会被拒:`Sending messages to users is temporarily unavailable`
- 两条都加:`--session isolated --agent main --wake now --delete-after-run`
- 飞书任务 `--name` 加后缀「(飞书)」,文案与钉钉版完全一致
命令模板(钉钉版;飞书版把 `--channel`/`--to` 换成上面飞书值,`--name` 加「(飞书)」):
```bash
cd /home/yangxuan/.openclaw && openclaw cron create "<UTC时间ISO>" \
@@ -67,6 +70,8 @@ cd /home/yangxuan/.openclaw && openclaw cron create "<UTC时间ISO>" \
--to "0464031658857345" --wake now --delete-after-run
```
一次建多条时写 python/shell 脚本循环调用(2026-09-17 用脚本一次建了 20 条飞书孪生任务),比逐条手敲快得多。
注意:`--at` 时间不带时区按 UTC 处理。北京时间 = UTC+8。
## 步骤
@@ -74,13 +79,17 @@ cd /home/yangxuan/.openclaw && openclaw cron create "<UTC时间ISO>" \
1. 记录/更新生日信息到 MEMORY.md 的"🎂 生日提醒"区域
2. 若农历生日,用 lunar_python 换算当年及下一年的公历日期;若阳历则固定
3. 计算三个提醒日(前7天/前3天/当天)
4. 为每年分别创建3个一次性 cron 任务(isolated + announce 钉钉)**必须带 `--agent main`**(多 agent 环境下无 owner 任务会让调度器卡死,阻塞所有提醒);投递只交给 delivery`--announce --channel dingtalk-connector`**禁止在 `--message`/command 里手动调 `openclaw message send`**CLI 不认识 dingtalk-connector,会失败)
5. 验证:`openclaw cron get <id>` 确认任务 delivery 为 dingtalk-connector 且 agentId=main"message send" 在整库应无残留
4. 为每年分别创建 3 对(共 6 条)一次性 cron 任务:**钉钉 + 飞书各一条**isolated session**必须带 `--agent main`**(多 agent 环境下无 owner 任务会让调度器卡死,阻塞所有提醒);投递只交给 delivery,**禁止在 `--message`/command 里手动调 `openclaw message send`**CLI 不认识 dingtalk-connector,会失败)
5. 验证:`openclaw cron list` 过滤「生日」,确认每个提醒日都有**钉钉 + 飞书**两条、effectiveAgentId=main、delivery.to 正确"message send" 在整库应无残留
6. 更新 MEMORY.md 记录已完成设置的年份
## 验证
创建后必须确认任务 delivery 已配置为 `dingtalk-connector:0464031658857345`,否则提醒不会推送到钉钉(main session 的 system-event 默认不投递)。
创建后必须确认 delivery 已按渠道正确配置,否则提醒不会推送:
- 钉钉任务 → `dingtalk-connector:0464031658857345`
- 飞书任务 → `feishu:oc_8eecfa0e1cc185c1cb19b4f3950cbc52`chat_id,非 open_id
main session 的 system-event 默认不投递,必须显式走 announce。)
## 注意事项
@@ -7,7 +7,7 @@ description: "消息发不出去/跨频道发送:Cross-context messaging denie
用于「这条消息发不出去」「改投钉钉/飞书」「飞书私聊推不动」这类场景:把消息实际送到**当前会话未绑定**的频道,并拿到可核实的送达证据。与定时提醒无关(提醒的路由写在 cron `delivery` 上,见 `scheduled-reminders`)。
## 事实基础(本机 2026-09-16 实测,OpenClaw 2026.8.1
## 事实基础(本机实测:2026-09-16 OpenClaw 2026.8.1;文件/附件权限 2026-09-17 OpenClaw 2026.9.4
- `message(action=send)` **受会话绑定频道限制**:主会话绑 feishu 时,指定 `channel="dingtalk-connector"` 直接被拒:
`Cross-context messaging denied: action=send target provider "dingtalk-connector" while bound to "feishu"`
@@ -18,6 +18,12 @@ description: "消息发不出去/跨频道发送:Cross-context messaging denie
# → ✅ Sent via DingTalk. Message ID: card_...
```
- 飞书「机器人主动向用户发私聊」当前不可用,报 `Feishu send failed: Sending messages to users is temporarily unavailable.`**群 / chat_id 可达、open_id 私聊不可达**,可复现;此时按第 3 步改投钉钉。
- 飞书**发文本**与**发文件/附件**是两条不同权限:
- 带 `--media <路径>`.md/.docx/.pdf 等)时,若应用缺 `im:resource` 权限,上传阶段即失败:
`Feishu file upload failed: ... feishu_code:99991672 ... Access denied. One of the following scopes is required: [im:resource:upload, im:resource]`
- 这是**应用权限缺失,不是投递内容问题**:换格式、换路径、重试都无效,必须由杨轩在开放平台给应用开通 `im:resource`。
- 诊断用 `feishu_app_scopes` 看 `im:resource` 是否在 granted;开通后再发即成功(2026-09-17 实测 .md/.docx/.pdf 均以 `kind=media` 送达)。
- 缺该权限时文本仍可发:先发文本并告知用户去开通权限,不要反复重试文件。
- 该飞书故障**换 CLI 也一样报错**(`openclaw message send --channel feishu ...` 同样失败)→ 属飞书侧限制,不是 CLI 或工具层问题。
## 步骤
@@ -25,11 +31,13 @@ description: "消息发不出去/跨频道发送:Cross-context messaging denie
1. 先用 `message(action=send)` 发当前频道。读错误分类:
- `Cross-context messaging denied` → 走第 2 步(跨频道)。
- `Sending messages to users is temporarily unavailable` → 走第 3 步(换通道)。
- `im:resource` / `99991672`(带 `--media` 时)→ 权限缺失,走第 6 步(开通权限,不要重试文件)。
2. 跨频道补发:`openclaw message send --channel <频道> --target <目标id> --message "..."`。
目标 id 用该频道已知可达的会话:钉钉 `0464031658857345`;飞书 DM chat_id 见 `scheduled-reminders` 的「投递通道」。发送后回读输出确认 `✅ Sent via ...` + Message ID。
3. 原频道本身不可达时(如飞书主动私聊),把结果改投用户实际能收到的通道(钉钉),并在正文里说明「原频道故障 + 已改投」,让用户知道换通道的原因。
4. 核对送达:只有 CLI 输出 `✅ Sent via ...` 或 `message` 工具返回成功才算发出;任何 `Feishu send failed` / `denied` 都不算,不要在回复里声称已送达。
5. 原频道恢复或用户要求切回时,改回原频道,并撤掉临时的替代通道推送,避免同一条内容双通道重复打扰。
6. **发文件被权限拦住时**`feishu_app_scopes` 确认缺的权限,把开放平台的申请链接给杨轩开通(链接可从报错原文里取,形如 `https://open.feishu.cn/app/<appId>/auth?q=im:resource:upload,im:resource`);开通后直接重发即可,无需改投其他通道。
## 注意
@@ -33,6 +33,7 @@ description: "创建/管理定时提醒(每周/每天/睡前等周期或一次
- **通了没有要实测,不要推断**:可临时建一条一次性测试任务,用 `automations run <jobId>` 立即跑一次,看 `state.lastDelivered` / `lastDeliveryError`,验证完把测试任务删掉。
- **测试只发一次**:验证投递时按上面的 run 方式做,不要额外往群或私聊手发多条诊断消息;确需手发时正文标注「测试/请忽略」。
- **cron 的 delivery 与手动发消息是两条路**:本 skill 的投递只写在 delivery 参数上;「消息发不出去 / 要跨频道手动投递」另见 `cross-channel-send`
- **要同一条推两个通道时用「孪生任务」**:**单条 cron 只能投一个渠道**(`delivery.channel` 只有一个值)。杨轩要「钉钉和飞书一起提醒」时,同一天建两条任务(各带一个渠道、文案完全一致),飞书那条在 `--name` 加后缀「(飞书)」以便分辨。典型应用:生日提醒(见 `birthday-reminder`,已按 3 对×每人落地)。不要试图用一条任务投多个渠道,也不要在 payload 里叠 `message send` 来凑第二个通道。
## 创建一条周期提醒
@@ -20,19 +20,20 @@ description: "管理按摩放松记录:查询/新增技师联系人(cc_contr
- 口令存 `~/.openclaw/.env``DB_PASSWORD_放松保健`,由脚本内部读取(不进命令行、不打印)
- **禁止 root、禁止 docker exec 直连、禁止跨库**;旧写法(root 账号、`db-query --database "按摩放松"`)已废弃
### 中文乱码 / 写入失败(实测坑
### 中文读写:无需再手写 SET NAMES2026-09-17 起
`db-conn.sh` 的 mysql 客户端连接字符集默认是 **latin1**(读写都受影响;这是 `db-conn.sh` 层面的行为,**其他 agent 的库同样适用**):
`db-conn.sh` 4 处 mysql 调用点已统一带 `--default-character-set=utf8mb4`,**中文读写直接用即可,不必再在 SQL 前加 `SET NAMES utf8mb4;`**(实测 `select @@character_set_client` 返回 utf8mb4;中文字段写入 + 回读无 1265、无乱码)。这是 `db-conn.sh` 层面的行为,**其他 agent 的库同样适用**
- 读:不带 `SET NAMES utf8mb4;` 时中文列全部返回 `???`
- 写:中文 INSERT/UPDATE 报 `ERROR 1265 Data truncated for column '<列名>'`
把该语句放在同一条 `--sql` 的最前面即可正常读写:
若仍出现中文返回 `???` 或写入报 `ERROR 1265 Data truncated for column '<列名>'`
```bash
~/.openclaw/scripts/db-conn.sh wellness --sql "SET NAMES utf8mb4; SELECT contract_name,record_locale,comment FROM cc_contract_record ORDER BY record_date DESC LIMIT 5"
~/.openclaw/scripts/db-conn.sh wellness --sql "select @@character_set_client"
```
返回不是 utf8mb4,说明脚本被改动或调用到了旧副本——报给杨轩修脚本,不要靠每条 SQL 手动兜底。
修复前写入的历史行可能仍是乱码(如 `早上...`),字符集修复**不会自动回填**历史数据,需单独处理。
## 表结构
### cc_contract — 技师/联系人