Install
openclaw skills install @thcjp/reminder-engine-freeopenclaw skills install @thcjp/reminder-engine-free不是教你配置定时任务,而是教你安全可靠地创建一次性提醒。时间解析、安全校验、频道投递,一条龙服务。
创建一次性提醒看似简单,但涉及多个关键环节:如何把用户的口语化时间转换为精确时间戳?如何防止任务内容中的恶意命令注入?如何将结果可靠地投递到目标频道?本技能聚焦提醒创建的完整流程,帮助Agent建立安全可靠的提醒引擎。
┌─────────────────────────────────────────────────────────┐
│ 提醒引擎 (免费版) │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ 时间解析层 │ │
│ │ 相对时间(30s/5m/2h/1d) │ 绝对时间(3pm) │ │
│ │ ↓ 转换为 ISO 8601 │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 安全校验层 │ │
│ │ 拒绝命令替换 │ 拒绝Shell元字符 │ │
│ │ 拒绝危险前缀 │ 拒绝双引号与换行 │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 上下文获取层 │ │
│ │ session_status → agent + to │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 提醒创建层 │ │
│ │ cron add --session main --system-event │ │
│ │ --announce --delete-after-run │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ 确认回复层 │ │
│ │ "好的,X分钟后提醒你XXX" │ │
│ └────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
用户说"30秒后提醒我查天气":
session_status
date -u -d "+30 seconds" +"%Y-%m-%dT%H:%M:%SZ"
skill-platform cron add \
--name "reminder-weather" \
--at "2026-07-18T10:00:30Z" \
--session main \
--system-event "检查北京天气" \
--agent machu \
--announce \
--channel discord \
--to "channel:1476104553148452958" \
--delete-after-run
配置完整的安全校验流程:
session_status
./scripts/sanitize-message.sh "检查北京天气"
date -u -d "today 15:00" +"%Y-%m-%dT%H:%M:%SZ"
skill-platform cron add \
--name "reminder-afternoon" \
--at "2026-07-18T15:00:00Z" \
--session main \
--system-event "下午3点的提醒" \
--agent machu \
--announce \
--channel discord \
--to "channel:1476104553148452958" \
--delete-after-run
echo "好的,将在下午3点提醒你"
将提醒创建流程封装为可复用脚本:
#!/bin/bash
USER_TIME="$1" # 用户输入的时间
TASK_CONTENT="$2" # 任务内容
CHANNEL="${3:-discord}" # 投递频道,默认discord
if ! ./scripts/sanitize-message.sh "$TASK_CONTENT"; then
echo "错误:任务内容包含非法字符"
echo "请避免使用:\$() \` ; | & > < \" 或危险命令"
exit 1
fi
SESSION_INFO=$(session_status)
AGENT=$(echo "$SESSION_INFO" | jq -r '.deliveryContext.accountId')
TO=$(echo "$SESSION_INFO" | jq -r '.deliveryContext.to')
REMIND_AT=$(date -u -d "$USER_TIME" +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null)
if [ -z "$REMIND_AT" ]; then
echo "错误:无法解析时间 '$USER_TIME'"
echo "支持格式:30s/5m/2h/1d 或 3pm/today 15:00"
exit 1
fi
NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
if [[ "$REMIND_AT" < "$NOW" ]]; then
echo "错误:提醒时间必须在未来"
exit 1
fi
JOB_ID=$(skill-platform cron add \
--name "reminder-$(date +%s)" \
--at "$REMIND_AT" \
--session main \
--system-event "$TASK_CONTENT" \
--agent "$AGENT" \
--announce \
--channel "$CHANNEL" \
--to "$TO" \
--delete-after-run \
--output json | jq -r '.id')
echo "✓ 提醒已创建"
echo " 时间:$REMIND_AT"
echo " 内容:$TASK_CONTENT"
echo " 投递:$CHANNEL → $TO"
echo " 作业ID:$JOB_ID"
支持两类时间格式:
| 类型 | 格式 | 示例 | 转换方式 |
|---|---|---|---|
| 相对时间 | <数字><单位> | 30s/5m/2h/1d | date -u -d "+30 seconds" |
| 绝对时间 | 自然语言/ISO | 3pm/today 15:00/tomorrow 9am | date -u -d "today 15:00" |
时间解析决策树:
用户输入的时间
├── 包含数字+单位(s/m/h/d)?
│ └── 是 → 相对时间,从当前时刻计算
│ ├── 30s → +30 seconds
│ ├── 5m → +5 minutes
│ ├── 2h → +2 hours
│ └── 1d → +1 day
├── 包含 am/pm 或具体时刻?
│ └── 是 → 绝对时间,按今日/明日计算
│ ├── 3pm → today 15:00
│ ├── 9am today → today 09:00
│ └── 12pm tomorrow → tomorrow 12:00
└── 无法识别?
└── 询问用户用明确格式表达
转换规则:
YYYY-MM-DDTHH:MM:SSZ输入: 用户提供时间解析所需的指令和必要参数。 处理: 按照skill规范执行时间解析操作,遵循单一意图原则。 输出: 返回时间解析的执行结果,包含操作状态和输出数据。
核心原则:拒绝(REJECT)危险模式,而非转义(escape)。
| 检测项 | 危险模式 | 拒绝理由 |
|---|---|---|
| 命令替换 | $()、` | 可执行任意命令 |
| Shell元字符 | ;、|、&、>、< | 可注入Shell命令 |
| 双引号 | " | 破坏CLI引用 |
| 换行符 | \n | 可注入多行命令 |
| 危险命令前缀 | sudo、rm、wget、curl、bash等 | 高危操作 |
校验脚本(scripts/sanitize-message.sh):
#!/bin/bash
CONTENT="$1"
if [[ "$CONTENT" =~ \$\(.*\) ]] || [[ "$CONTENT" =~ '`' ]]; then
echo "拒绝:包含命令替换"
exit 1
fi
if [[ "$CONTENT" =~ [;\|&\>\<] ]]; then
echo "拒绝:包含Shell元字符"
exit 2
fi
if [[ "$CONTENT" =~ [\"] ]]; then
echo "拒绝:包含双引号"
exit 3
fi
if [[ "$CONTENT" =~ $'\n' ]]; then
echo "拒绝:包含换行符"
exit 4
fi
DANGEROUS=("sudo" "rm " "wget " "curl " "bash " "sh " "chmod " "chown ")
for cmd in "${DANGEROUS[@]}"; do
if [[ "$CONTENT" =~ ^$cmd ]] || [[ "$CONTENT" =~ " $cmd" ]]; then
echo "拒绝:包含危险命令前缀"
exit 5
fi
done
echo "安全"
exit 0
被拒绝时的回复模板:
抱歉,你的任务内容包含非法字符,请重新表述。
请避免使用以下内容:
- 命令替换:$() 或反引号
- Shell符号:; | & > <
- 双引号:"
- 危险命令:sudo、rm、wget、curl、bash等
示例:
❌ "提醒我运行 `rm -rf /tmp`"
✅ "提醒我清理临时目录"
输入: 用户提供安全校验所需的指令和必要参数。 处理: 按照skill规范执行安全校验操作,遵循单一意图原则。 输出: 返回安全校验的执行结果,包含操作状态和输出数据。
| 频道 | 参数 | 获取方式 |
|---|---|---|
| Discord | --channel discord --to "channel:<id>" | 从 session_status 获取 |
| Telegram | --channel telegram --to "+<phone>" | 用户提供手机号 |
获取投递上下文:
session_status
返回结构包含:
deliveryContext.accountId:用于 --agent 参数(如 machu)deliveryContext.to:用于 --to 参数(如 channel:1476104553148452958)输入: 用户提供单频道投递所需的指令和必要参数。 处理: 按照skill规范执行单频道投递操作,遵循单一意图原则。 输出: 返回单频道投递的执行结果,包含操作状态和输出数据。
创建提醒后,向用户回复确认信息:
确认回复模板:
| 场景 | 回复模板 |
|---|---|
| 相对时间 | "好的,将在 X 分钟/小时后提醒你 XXX" |
| 绝对时间 | "好的,将在今天/明天 X 点提醒你 XXX" |
| 创建失败 | "抱歉,提醒创建失败:[原因]" |
| 内容被拒 | "抱歉,任务内容包含非法字符,请重新表述" |
注意事项:
输入: 用户提供确认回复所需的指令和必要参数。 处理: 按照skill规范执行确认回复操作,遵循单一意图原则。 输出: 返回确认回复的执行结果,包含操作状态和输出数据。
skill-platform cron list
skill-platform cron list --name "reminder-*"
skill-platform cron run <job-id>
skill-platform cron remove <job-id>
skill-platform cron runs --id <job-id> --limit 5
生命周期状态:
创建 → 活跃(active) → 执行(executing) → 完成(done)
↓
自动删除(deleteAfterRun)
输入: 用户提供提醒生命周期管理所需的指令和必要参数。 处理: 按照skill规范执行提醒生命周期管理操作,遵循单一意图原则。 输出: 返回提醒生命周期管理的执行结果,包含操作状态和输出数据。 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:一次性提醒创建引、擎免费版、含时间解析、确认回复与基础生、提醒引擎免费版是、的一次性提醒创建、不同于定时任务配、置指南、本技能聚焦、如何安全可靠地创、建一次性提醒、的完整流程、Use、when、需要项目管理、任务规划、进度跟踪、团队协作时使用、不适用于实际人员、绩效评估、适用于独立开发者、企业团队和自动化、工作流场景等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。
input_params参数,支持创建/查询/导出操作角色:普通用户
场景描述:用户说"30秒后提醒我查天气",立即创建提醒并投递到Discord。
session_status
./scripts/sanitize-message.sh "检查北京天气"
date -u -d "+30 seconds" +"%Y-%m-%dT%H:%M:%SZ"
skill-platform cron add \
--name "reminder-weather" \
--at "2026-07-18T10:00:30Z" \
--session main \
--system-event "检查北京天气" \
--agent machu \
--announce \
--channel discord \
--to "channel:1476104553148452958" \
--delete-after-run
echo "好的,将在30秒后提醒你查天气"
角色:职场人士
场景描述:用户说"下午3点提醒我开会",创建定时提醒。
./scripts/sanitize-message.sh "下午3点开会"
date -u -d "today 15:00" +"%Y-%m-%dT%H:%M:%SZ"
NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
if [[ "2026-07-18T15:00:00Z" < "$NOW" ]]; then
echo "今天3点已过,将顺延至明天"
date -u -d "tomorrow 15:00" +"%Y-%m-%dT%H:%M:%SZ"
fi
skill-platform cron add \
--name "reminder-meeting" \
--at "2026-07-18T15:00:00Z" \
--session main \
--system-event "下午3点开会" \
--agent machu \
--announce \
--channel discord \
--to "channel:1476104553148452958" \
--delete-after-run
echo "好的,将在今天下午3点提醒你开会"
角色:安全意识用户
场景描述:用户尝试创建包含危险命令的提醒,引擎拒绝并提示重新表述。
./scripts/sanitize-message.sh "运行 rm -rf /tmp"
echo "抱歉,你的任务内容包含非法字符,请重新表述。"
echo "请避免使用:sudo、rm、wget、curl、bash等危险命令"
echo "示例:"
echo " ❌ 提醒我运行 rm -rf /tmp"
echo " ✅ 提醒我清理临时目录"
转义(escape)是将危险字符转换为安全形式,但容易遗漏边界情况,导致绕过攻击。拒绝(reject)是直接拒绝包含任何危险模式的输入,强制用户重新表述,从根本上消除风险。这是安全领域的"白名单优于黑名单"原则的体现。
支持两类:(1) 相对时间,如 30s(30秒)、5m(5分钟)、2h(2小时)、1d(1天);(2) 绝对时间,如 3pm(下午3点)、9am today(今天上午9点)、12pm tomorrow(明天中午12点)。所有时间最终转换为ISO 8601格式(UTC)。
调用 session_status 工具获取当前会话的投递上下文。返回的 deliveryContext.accountId 用于 --agent 参数,deliveryContext.to 用于 --to 参数。这确保提醒结果投递到用户当前所在的频道。
--session main 而非 isolated?一次性提醒通常需要继承主会话上下文(如引用之前的对话),使用 main 模式可确保提醒在正确上下文中触发。同时使用 --system-event payload类型,将提醒文本作为系统事件传递给主会话。--delete-after-run 确保执行后自动清理。
建议用户使用日历应用而非提醒引擎。提醒引擎设计为短期提醒(分钟级到小时级),长时间跨度的提醒更适合日历系统。若用户坚持创建,引擎仍会执行,但建议提示用户:"此提醒距离现在超过48小时,建议同时添加到日历以免遗漏"。
-d 参数(GNU date,Linux/macOS自带)| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Agent Gateway | 运行时 | 必需 | Agent平台内置 |
| skill-platform CLI | 工具 | 必需 | Agent平台内置 |
| session_status工具 | 工具 | 必需 | Agent平台内置 |
| jq | 工具 | 否 | 系统包管理器安装 |
| Discord Bot | 投递通道 | 否 | 注册Discord Bot获取 |
| Telegram Bot | 投递通道 | 否 | 注册Telegram Bot获取 |
| LLM API | API | 必需 | 由Agent平台内置LLM提供 |
本技能基于原始开源提醒创建作品改进,保留原始版权声明:
本改进作品在原始作品基础上进行了深度差异化改造,包括但不限于:
原始MIT license允许使用、复制、修改和分发,需保留版权声明。本改进作品在保留原始版权声明的基础上添加自有署名,完全符合MIT license要求。
本免费体验版限制以下高级功能:
解锁全部功能请使用专业版:reminder-engine-pro
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
输入:用户提供操作指令和必要参数
输出:返回执行结果,包含操作状态和输出数据
用户: 执行核心功能
Skill: 正在执行核心功能...
Skill: 执行完成,结果如下: 操作成功