周计划自动分配日程器 (week-to-day-splitter)
把一份周工作计划,按子步骤的 #周一/#周二/.../#周五 时间标签,自动拆分成 5 个日工作计划。
⚠️ 阅读前必读:本 skill 的能力范围
本 skill 不只是"本地计划管理",还包含以下能力:
执行能力:
- 📁 文件读写(`${NOTES_DIR}/00-工作计划/001周工作计划/` 和 `${NOTES_DIR}/00-工作计划/002日工作计划/`)
- 📤 推送 daily plan 到飞书(每天 15:00,含任务名/截止日/地点/责任人)
外发数据范围(推送到飞书):
- 任务标题(可能含客户名、项目名等)
- 项目截止日期(可能含商业敏感信息)
- 地点信息(可能含未公开拜访地点)
- 责任人(@客户名)
- 备注(可能含未公开商业策略)
隐私影响:
- 如果飞书 webhook 泄漏,daily plan 内容会被第三方获取
- 如果 daily plan 包含客户名/合同金额,违规外发可能导致法律责任
- 建议:仅在企业内部飞书 + 仅推送非敏感 daily plan
如果不同意上述,请不要安装本 skill。
结构化权限声明(Structured Permissions)
| 权限 | 必填 | 范围 | 用途 / 风险 |
|---|---|---|---|
| `file_read` | ✅ | `${NOTES_DIR}/00-工作计划/` | 读取周计划 + 日计划 |
| `file_write` | ✅ | `${NOTES_DIR}/00-工作计划/002日工作计划/` | 写覆盖 5 个 daily plan(自动备份) |
| `network` | ✅ | 飞书 webhook(可选) | 推送 daily plan 到飞书 |
| `exec` | ✅ | node split_weekly.js | 拆分算法执行 |
| `install_cron` | ✅ | 3 个 cron 任务 | 周五复制 + 周日拆分 + 推送 |
warning: daily plan 内容会被自动推送到飞书(用户配置 webhook URL)
disable_command: `openclaw cron remove ` 禁用 3 个 cron
核心特性
- v7 算法核心:任务整体 vs 拆分(同子步骤时间标签 → 整体;不同 → 拆分)
- 时间标签驱动分配(3 优先级):
- 按子步骤时间标签分配(最优先)
- 出差/拜访约束(同地点 ≤2 任务)
- Fallback 找最空的天
- swapDays 移除:行程动态,不硬编码 swap,人工调整
- 零依赖:纯 Node.js 标准库
- 可测试:split_weekly.js 支持 dry-run 输出
- 完整 cron 工作流:周五15:00 复制 → 周日14:00 拆分 → 周日-周四15:00 推送
系统架构
┌─────────────────────────────────────────────────┐
│ 每周工作流循环 │
├─────────────────────────────────────────────────┤
│ │
│ [周五 15:00 cron] → copy_next_week_plan.js │
│ ├─ 找当前周计划(mtime 最新)│
│ ├─ 复制副本 + 改名【下周一-五】│
│ └─ 项目截止 +7 天 │
│ │
│ [周五-周日] 用户手动调整副本 │
│ 改项目截止(今天+30天) │
│ 添加/删除任务 │
│ │
│ [周日 14:00 cron] → split_weekly.js v7 │
│ ├─ 解析周计划 │
│ ├─ 按时间标签分配 │
│ ├─ 任务整体 vs 拆分 │
│ ├─ 写 5 个 daily plan │
│ └─ 飞书请示 │
│ │
│ [周日-周四 15:00 cron] → 推送次日计划 │
│ 读次日 daily plan │
│ message tool 推私聊 │
│ │
└─────────────────────────────────────────────────┘
快速开始
1. 准备周计划目录
# 推荐路径(可改成任意同步盘)
mkdir -p "${NOTES_DIR}/001周工作计划"
mkdir -p "${NOTES_DIR}/002日工作计划"
2. 部署脚本
mkdir -p ~/.openclaw/workspace/.analysis/weekly_planner
cp scripts/*.js ~/.openclaw/workspace/.analysis/weekly_planner/
3. 配置路径
编辑 split_weekly.js 第 27-28 行:
const WEEK_DIR = '${NOTES_DIR}/001周工作计划';
const DAY_DIR = '${NOTES_DIR}/002日工作计划';
4. 创建第一份周计划
文件名格式:【YYYYMMDD-YYYYMMDD】周工作计划.md
# 【20260817-20260821】周工作计划
## 任务清单
### 1. 项目 A
`@客户A` `[截止:20260915]` `📍地点A`
- **已推进**:基础调研完成
- **下一步**:
- 与客户 A 沟通项目意向 `#沟通 #周一`
- 调研客户 A 的需求清单 `#调研 #周二`
### 2. 项目 B
`@客户B` `[截止:20260920]` `📍地点B`
- **已推进**:方案初稿完成
- **下一步**:
- 拜访客户 B 当面汇报 `#拜访 #周三`
5. 测试 dry-run
cd ~/.openclaw/workspace/.analysis/weekly_planner
node split_weekly.js --dry-run
# 应该输出类似:
# === split_weekly.js v7 启动(v7 算法)===
# [解析] 找到 2 个任务
# [分配] 任务 1 → 周一
# [分配] 任务 2.1 → 周二,任务 2.2 → 周三
# === 验证输出 ===
6. 配置 3 个 cron
# 周五 15:00 复制下周周计划
openclaw cron add "周五复制下周周计划" \
--schedule "0 15 * * 5" --tz "Asia/Shanghai" \
--message "运行命令:node ~/.openclaw/workspace/.analysis/weekly_planner/copy_next_week_plan.js
完成后飞书告知结果"
# 周日 14:00 拆分周计划
openclaw cron add "周日拆分周计划" \
--schedule "0 14 * * 0" --tz "Asia/Shanghai" \
--message "运行命令:node ~/.openclaw/workspace/.analysis/weekly_planner/split_weekly.js
读 5 个 daily plan → 用 message tool 飞书请示(plain text)"
# 周日-周四 15:00 推送次日
openclaw cron add "推送次日工作计划" \
--schedule "0 15 * * 0-4" --tz "Asia/Shanghai" \
--message "今天 \${dayName},推送次日(\${nextDayName})的日工作计划给用户私聊
1. 计算次日日期
2. 用 read 工具读次日 daily plan
3. 用 message tool 推私聊(plain text)"
⚙️ checkbox 进展追踪工作流(v1.1.0 新增)
用户 在 daily plan 中勾选 - [x] 完成项,周五 15:00 cron 自动合并到当前周计划"已推进",然后复制到下周计划。
工作流
用户 编辑 daily plan(勾选 - [x])
↓
周五 15:00 cron (copy_next_week_plan.js)
├─ 5-pre. 从本周 5 个 daily plan 提取 - [x]
├─ 5. 合并到当前周计划"已推进"(fingerprint 去重)
└─ 6-8. 复制当前周计划 → 下周计划(日期 +7、截止 +7)
关键实现
1. split_weekly.js formatDailyPlan() 输出 checkbox 格式
生成的 daily plan 任务头用 ### 1. 格式(与周计划一致),子步骤用 - [ ]:
### 1. 任务标题:
- [ ] 子步骤1 `#动作 #时间标签`
- [ ] 子步骤2 `#动作 #时间标签`
2. copy_next_week_plan.js extractCompletedSubSteps()
从本周 5 个 daily plan 提取所有 - [x] 项,返回 Map<taskId, items[]>。
3. copy_next_week_plan.js mergeCompletedIntoProgress()
合并到周计划"已推进"段落:
- 收集已推进段落的所有 fingerprint(text +
`#动作`) - 过滤已存在的项(避免重复)
- 按任务块(split by
###)逐块替换已推进段落 - 必要时新建空已推进段
4. 严格 action tag 匹配(用户 拍板)
提取时只匹配动作类型库的标签:
const EXECUTION_TAGS = ['踏勘', '拜访', '来访', '出差'];
const DOCUMENT_TAGS = ['写方案', '拟协议', '写报告', '调研'];
const TEMPORARY_TAGS = ['沟通', '请示', '跟进', '确认', '等待', '流转'];
const ACTION_TAG_REGEX = new RegExp('#(' + ALL_ACTION_TAGS.join('|') + ')');
不在库的动作标签会被忽略(用户 自己改)。不在库的不输出 `#xxx`。
已知 bug 修复
- ✅ 任务标题格式
1、→### 1.(与周计划一致) - ✅ checkedRegex 允许行首空格
- [x]匹配 - ✅ 全局正则漏掉任务 14 的 bug(任务块后跟
## 约束段而非下一个### N.,改用split(/(?=### )/)替代 lookahead) - ✅ checkedRegex 不会被多行合并文本影响(用户 手动编辑造成)
- ✅ Action tag 严格匹配(防止 用户 之前误标
#进展等不再使用的标签残留)
隐私清理
发版前必检:
- ❌ 真实路径(
/Users/home/...) - ❌ 真实姓名("用户")
- ❌ 项目代号(A/B/C 等抽象名)
- ❌ 责任人("张总"、"谢总"等)
- ❌ cron ID
- ❌ 飞书 user_id
详见 README.md。
必备头部:类型说明(用户拍板,2026-08-18)
铁律:任何周计划文件,标题之后、
## 任务清单之前,必须包含## 类型说明章节。原因:方便读者理解任务标题下的
#项目类型和子步骤后的#动作类型。
标准类型说明模板(直接复制)
## 类型说明
### 项目类型(写在任务标题下 `#xxx`)
| # 标签 | 含义 |
|---|---|
| `#设备投放` | 智能设备投放 |
| `#合作共建` | 双方合作共建 |
| `#产业导入` | 产业基地 |
| `#活动举办` | 大会、活动 |
| `#全域治理` | 全域土地治理 |
| `#城市更新` | 城市更新 |
| `#文创开发` | 文创产品 |
| `#乡村振兴` | 乡村项目 |
| `#商业运营` | 商业运营 |
| `#视频短剧` | 视频短剧/漫剧 |
| `#供应商合作` | 与供应商合作 |
| `#景区运营` | 演艺、活动、招商运维、舞台演出 |
### 动作类型(写在下一步分支后 `#xxx`)
**🌍 执行型**(占用整天/半天,1 天最多 2 个)
- `#踏勘` 现场勘测
- `#拜访` 去别人场地面谈
- `#来访` 到我们场地面谈
- `#出差` 异地出行
**📝 文档型**(占用 1-3 小时,1 天最多 2 个)
- `#写方案` 方案撰写
- `#拟协议` 协议起草
- `#写报告` 报告撰写
- `#调研` 线上调研(搜集情报、找知情人、写调研报告)
**⚡ 临时型**(占用 30 分钟以内,1 天可多任务)
- `#沟通` 微信/邮件/电话
- `#请示` 请示上级
- `#跟进` 跟进进度
- `#确认` 信息确认
- `#等待` 等待对方回复
- `#流转` 内部流程流转
自动保护机制
copy_next_week_plan.js 已加自动补章节逻辑:
- 复制下周周计划时,自动检查原文件是否含
## 类型说明 - 缺失时自动从内置
TYPES_SECTION常量模板补上(防止再次丢失)
事故案例(2026-08-18):
- 用户 8/15-16 期间要求过"周计划前面要有对标签的解释"
- 8/16 15:30 我重写文件时漏了头部章节
- 用户 8/18 09:34 才发现,过了 1 天 18 小时
- 修复:恢复章节 + 加自动补机制 + SKILL.md 明确写为必备部分
周计划文件格式规范
文件命名
| 类型 | 格式 | 示例 |
|---|---|---|
| 周计划 | 【YYYYMMDD-YYYYMMDD】周工作计划.md |
【20260817-20260821】周工作计划.md |
| 日计划 | 【YYYYMMDD】周X工作计划.md |
【20260817】周一工作计划.md |
任务结构
### N. 任务名(可选:跨周标记)
`@联系人` `[截止:YYYYMMDD]` `📍地点` `⚠️`(可选:阻塞标记)
- **已推进**:xxx(已完成的事)
- **下一步**:
- 子步骤1 `#动作类型 #时间标签`(#周一/#周二/.../#周五/#待定)
- 子步骤2 `#动作类型 #时间标签`
- **任务备注**:xxx(可选)
时间标签语法
| 标签 | 含义 |
|---|---|
#周一 |
安排在周一 |
#周二 |
安排在周二 |
#周三 |
安排在周三 |
#周四 |
安排在周四 |
#周五 |
安排在周五 |
#待定 |
不指定,由算法分配 |
动作类型语法
| 动作 | 性质 |
|---|---|
#沟通 |
沟通类(电话/微信) |
#拜访 |
出差类 |
#调研 |
信息收集 |
#等待 |
被动等待 |
#实施 |
现场操作 |
#汇报 |
当面/书面 |
#待定 |
临时任务 |
截止日期语义
- 任务标题下的
[截止:YYYYMMDD]= 整个项目预期完成时间 - 子步骤后的
#周一/#周二/...= 这一步最晚完成时间
v7 算法核心
任务整体 vs 拆分
# 示例 1:整体(子步骤时间标签一致 → 整体)
### 1. 项目 A
- 调研情况 `#调研 #周一`
- 沟通反馈 `#沟通 #周一`
→ 任务 1 整体分配到周一
# 示例 2:拆分(子步骤时间标签不同 → 拆分)
### 2. 项目 B
- 调研需求 `#调研 #周一`
- 拜访客户 `#拜访 #周三`
→ 任务 2.1 分配到周一,任务 2.2 分配到周三
3 优先级分配
- 按子步骤时间标签分配(最优先)—— 用户的时间标签 = 用户偏好
- 出差/拜访约束(同地点 ≤2 任务)—— 避免同一天跑多个地方
- Fallback 找最空的天 —— 没有时间标签时均匀分配
swapDays 移除(v7 关键改动)
旧版本:硬编码 swapDays(如"周一项目 A"必须 swap) v7 版本:不硬编码,行程由用户时间标签决定,swap 由用户人工调整
理由:硬编码 swap 规则不灵活,用户的真实行程随时变化。
3 个 cron 推荐配置
| 时间 | 任务 | cron 表达式 | 说明 |
|---|---|---|---|
| 周五 15:00 | 复制下周周计划 | 0 15 * * 5 |
找 mtime 最新周计划,复制 +7 天 |
| 周日 14:00 | 拆分周计划 | 0 14 * * 0 |
v7 算法拆分到 5 天 |
| 周日-周四 15:00 | 推送次日计划 | 0 15 * * 0-4 |
早上推送当天计划 |
时区:Asia/Shanghai
周日 cron 流程
14:00 cron 触发
↓
agent 跑 split_weekly.js v7
↓
脚本读周计划 → 解析任务 → 按时间标签分配
↓
写 5 个 daily plan 到 ${NOTES_DIR}/002日工作计划/
↓
agent 读 5 个 daily plan
↓
用 message tool 飞书请示(plain text,不加表格)
↓
用户回复修改项(飞书格式 A 或直接编辑文件)
↓
算法反向同步:修改 daily plan → 更新周计划(时间标签 + 任务内容)
故障排查
Q1: 周计划无法解析
根因:周计划 Markdown 格式不符(任务结构缺字段)。
修复:参考 SKILL.md 第 4 节格式规范,确保每个任务含 @联系人 [截止:YYYYMMDD] 📍地点 和 #动作 #时间标签。
Q2: 拆分结果不均(某天任务特别多)
根因:用户时间标签集中在某天。
修复:在子步骤里增加其他时间标签(如 #调研 #周一 改成 #调研 #周一或#周二)。
Q3: 周五 cron 找不到周计划
根因:周计划文件路径配置错误,或文件名格式不符。
修复:
- 验证
WEEK_DIR路径正确 - 验证文件名是
【YYYYMMDD-YYYYMMDD】周工作计划.md格式
Q4: 算法反向同步失败
根因:手动编辑 daily plan 格式破坏。
修复:保留原有任务编号(1., 2., ...),算法才能匹配。
隐私与免责声明
数据安全
- 所有数据存储在用户本地(同步盘)
- 脚本无外部 API 调用(除可选的飞书 webhook)
- 算法完全本地运行
路径占位符
- 默认
${NOTES_DIR}是占位符,用户必须替换为实际路径 - 推荐放在坚果云 / iCloud / OneDrive 等同步盘
飞书集成
- 可选:每天 15:00 推送次日计划到飞书
- 用户配置 webhook URL(公开或私有)
- 推送内容是用户的 daily plan(不涉及隐私数据外发)
性能指标
| 操作 | 耗时 |
|---|---|
| 解析周计划(~15 任务) | < 100ms |
| v7 拆分算法 | < 50ms |
| 写 5 个 daily plan | < 50ms |
| 整体 dry-run | < 1 秒 |
License
MIT
