$npx -y skills add coinmini/go2sleep --skill site夜间早睡提醒 Skill,用张雪峰老师的真实语录提醒主人按时休息。 触发词:早睡、熬夜、雪峰语录、健康提醒、sleep reminder、66天挑战、 帮我设置早睡提醒、今日语录、早睡进度。
| 1 | # 早睡雪峰 · 66天治愈计划 |
| 2 | |
| 3 | ## 背景 |
| 4 | |
| 5 | 张雪峰老师(1984—2026.03.24)因心源性猝死去世,享年仅41岁。他留下的语录充满对年轻人的真诚建议。本 Skill 从他的公开语录中精选66条,每晚提醒主人一条,帮助养成早睡习惯。 |
| 6 | |
| 7 | **为什么是66天?** |
| 8 | - 行为科学研究表明,66天是养成一个稳定习惯的平均周期 |
| 9 | - 66 = 六六大顺,寓意坚持下去一切顺利 |
| 10 | |
| 11 | ## 配套网站 |
| 12 | |
| 13 | 语录数据和打卡记录托管在 Cloudflare Pages: |
| 14 | |
| 15 | - **语录数据**:`https://go2sleep.ai/data/quotes.json` |
| 16 | - **打卡接口**:`https://go2sleep.ai/api/checkin`(POST) |
| 17 | - **打卡记录**:`https://go2sleep.ai/api/checkins`(GET) |
| 18 | - **浏览页面**:`https://go2sleep.ai/` |
| 19 | |
| 20 | |
| 21 | ## 1. 设置每晚定时提醒 |
| 22 | |
| 23 | 当 agent 首次读取本 skill 后,**必须依次完成以下步骤**: |
| 24 | |
| 25 | ### 1.1 询问昵称(必须查重) |
| 26 | |
| 27 | 问主人: |
| 28 | > "给自己起个昵称吧,打卡记录会显示在网站上。(例如:小明、sleepy_cat)" |
| 29 | |
| 30 | 主人回答后,**必须先查重**: |
| 31 | ``` |
| 32 | GET https://go2sleep.ai/api/checkins?user={昵称} |
| 33 | ``` |
| 34 | - 如果返回 `total > 0` → 告诉主人"这个昵称已被占用,换一个吧",重新询问 |
| 35 | - 如果返回 `total === 0` → 昵称可用,继续下一步 |
| 36 | |
| 37 | **不要跳过查重。** 昵称是用户的唯一标识。 |
| 38 | |
| 39 | ### 1.2 询问提醒时间 |
| 40 | |
| 41 | 问主人: |
| 42 | > "你希望每晚几点收到早睡提醒?(例如:22:00、23:30)" |
| 43 | |
| 44 | **不要跳过,不要使用默认时间。** 必须等主人明确回答。 |
| 45 | |
| 46 | ### 1.3 创建定时任务 |
| 47 | |
| 48 | 根据主人回答的时间,生成对应的 cron 表达式(分钟偏移几分钟避免整点,如 22:00 → `"02 22 * * *"` 即 22:02)。 |
| 49 | |
| 50 | 使用 CronCreate 工具创建每晚提醒: |
| 51 | |
| 52 | - **cron**: 根据主人指定的时间生成 |
| 53 | - **recurring**: `true` |
| 54 | - **durable**: `true`(跨会话持久化) |
| 55 | - **prompt**: 见下方"提醒执行流程" |
| 56 | |
| 57 | 将昵称和提醒时间记住(存入 agent memory),后续提醒流程需要用到。 |
| 58 | |
| 59 | 主人可以说"换个时间提醒"来修改 cron 表达式。 |
| 60 | |
| 61 | ## 2. 提醒执行流程 |
| 62 | |
| 63 | 每次定时任务触发时,按以下步骤执行: |
| 64 | |
| 65 | ### 步骤 1:从 API 获取进度 |
| 66 | |
| 67 | 使用 WebFetch 获取该用户的打卡记录: |
| 68 | ``` |
| 69 | GET https://go2sleep.ai/api/checkins?user={nickname} |
| 70 | ``` |
| 71 | |
| 72 | 根据返回数据计算: |
| 73 | - `current_day` = `total + 1`(下一天的序号) |
| 74 | - 如果 `total >= 66` → 已完成挑战,跳到步骤 7 |
| 75 | - 如果最近一条记录的日期是今天 → 跳过(防止重复提醒) |
| 76 | |
| 77 | 如果 API 请求失败,使用本文件底部的"离线兜底语录",随机展示一条。 |
| 78 | |
| 79 | ### 步骤 2:获取语录 |
| 80 | |
| 81 | 使用 WebFetch 获取语录数据: |
| 82 | |
| 83 | ``` |
| 84 | GET https://go2sleep.ai/data/quotes.json |
| 85 | ``` |
| 86 | |
| 87 | 从 `quotes` 数组中取第 `current_day` 条(`id` 等于 `current_day` 的记录)。 |
| 88 | |
| 89 | 如果 WebFetch 失败,使用本文件底部的"离线兜底语录"。 |
| 90 | |
| 91 | ### 步骤 3:展示提醒 |
| 92 | |
| 93 | 用温暖、治愈的语气展示: |
| 94 | |
| 95 | ``` |
| 96 | 🌙 早睡提醒 · 第 {current_day}/66 天 |
| 97 | |
| 98 | 「{quote.text}」 |
| 99 | —— 张雪峰 |
| 100 | |
| 101 | 💭 {quote.health_reflection} |
| 102 | |
| 103 | 晚安。身体是一切的本钱。 |
| 104 | 今天是你坚持早睡的第 {current_day} 天。 |
| 105 | |
| 106 | [{'■' * done}{'□' * remaining}] {current_day}/66({percentage}%) |
| 107 | ``` |
| 108 | |
| 109 | ### 步骤 4:打卡上报 |
| 110 | |
| 111 | 使用 WebFetch 向打卡 API 发送 POST 请求: |
| 112 | |
| 113 | ``` |
| 114 | POST https://go2sleep.ai/api/checkin |
| 115 | Headers: { "Content-Type": "application/json", "X-Agent-Token": "go2sleep-agent-token-2026" } |
| 116 | Body: { |
| 117 | "day": {current_day}, |
| 118 | "quote_id": {quote.id}, |
| 119 | "quote_text": "{quote.text}", |
| 120 | "reminded_at": "{当前ISO时间}", |
| 121 | "nickname": "{agent memory 中的昵称}" |
| 122 | } |
| 123 | ``` |
| 124 | |
| 125 | 打卡失败不影响提醒流程,仅记录警告。 |
| 126 | |
| 127 | ### 步骤 5:送花(首次提醒时) |
| 128 | |
| 129 | 使用 WebFetch 向送花 API 发送 POST 请求,代表 agent 替主人在网站上献花一次: |
| 130 | |
| 131 | ``` |
| 132 | POST https://go2sleep.ai/api/flowers |
| 133 | ``` |
| 134 | |
| 135 | 首次提醒时送花成功(计入网站献花总数),之后由后端 IP 去重自动处理,无需额外判断。送花失败不影响提醒流程。 |
| 136 | |
| 137 | ### 步骤 6:第66天特别处理 |
| 138 | |
| 139 | 当 `current_day` = 66 时,展示完成祝贺: |
| 140 | |
| 141 | ``` |
| 142 | 🎉 恭喜!66天早睡挑战完成! |
| 143 | |
| 144 | 你坚持了整整66天,六六大顺! |
| 145 | 张雪峰老师的66条语录已经全部陪你走过。 |
| 146 | |
| 147 | 从今天起,早睡已经是你的习惯了。 |
| 148 | 愿你一生健康,前路顺遂。 |
| 149 | |
| 150 | 是否继续每晚提醒?(输入"继续"或"停止") |
| 151 | ``` |
| 152 | |
| 153 | ## 3. 手动交互 |
| 154 | |
| 155 | | 主人说 | 执行 | |
| 156 | |--------|------| |
| 157 | | "今日语录" / "给我看今天的雪峰语录" | 获取当天对应的语录并展示 | |
| 158 | | "早睡进度" / "雪峰早睡进度" | 展示进度面板:当前天数、连续打卡、完成百分比 | |
| 159 | | "停止早睡提醒" | 使用 CronDelete 删除定时任务 | |
| 160 | | "换个时间提醒" | 询问新时间,删除旧 cron,创建新 cron | |
| 161 | | "随机一条雪峰语录" | 随机从66条中选一条展示 | |
| 162 | |
| 163 | ## 4. 会话启动检查 |
| 164 | |
| 165 | 每次新会话开始时,如果 agent memory 中有昵称记录: |
| 166 | - 检查 CronCreate 定时任务是否仍然存在 |
| 167 | - 如果任务已过期或不存在,提示主人:"你的早睡提醒任务已过期,要重新设置吗?" |
| 168 | - CronCreate 的 recurring 任务7天会自动过期,需要定期重建 |
| 169 | - 可通过 `GET https://go2sleep.ai/api/checkins?user={nickname}` 查看当前进度 |
| 170 | |
| 171 | ## 5. 离线兜底语录 |
| 172 | |
| 173 | 当 WebFetch 无法访问网站时,使用以下10条代表性语录: |
| 174 | |
| 175 | 1. 「人生真好玩儿,下辈子还来。人活着就是为了体验那些你没有体验过的美好。」— 想体验更多美好,就要让身体撑得更久。今晚早睡,是为了明天更多的美好。 |
| 176 | 2. 「人生没有白走的路,每一步都算数。」— 早睡的每一天也算数,66天后你会感谢今天的自己。 |
| 177 | 3. 「选择比努力更重要,但'有得选'的前提是你足够努力。」— 选择早睡就是选择健康,这是最不需要门槛的正确选择。 |
| 178 | 4. 「熬得住才能出众,否则就是平庸。」— 熬得住是指坚持,不是指熬夜。好的身体才能支撑长远的路。 |
| 179 | 5. 「看清现实不是悲观,是为了更好地出发。」— 看清熬夜的危害不是焦虑,是为了更清醒地珍惜身体。 |
| 180 | 6. 「只有一条路不能选择——那就是放弃的路。」— 别放弃早睡计划,坚持下去,你已经走了这么远。 |
| 181 | 7. 「其实你在任何一个领域里边,熬个8年,熬个10年,一定是这个领域里的头部。」— 前提是你的身体能撑住8年10年。 |
| 182 | 8. 「北京给了我选择人生的底气。」— 好的睡眠给你面对一切的底气。 |
| 183 | 9. 「劝人学医,天打雷劈。」— 劝人熬夜,也该天打雷劈。今晚放下手机,早点睡吧。 |
| 184 | 10. 「属于你的另一个全世界,终会以豁然开朗的姿态呈现。」— 好好休息,明天醒来的世界会更清晰、更豁然。 |