360 Secure SkillHub
360 安全技能中心

周计划自动分配日程器

将周工作计划按子步骤的 #周一~#周五 时间标签拆分:标签一致的任务整体分配、不一致的按子步骤拆分,并有出差/地点约束与最空的天兜底;生成5份日计划文件。配套3个cron任务完成周五复制下周计划、周日拆分、次日推送飞书,并支持从日计划勾选项回收已完成内容。

seairteng
seairteng
热度 18.98
最近更新 2026-08-18 15:24:47
分类:自动化依赖:代码执行 / 读写文件 / 第三方 API应用场景:工作流 / 任务管理 / 日程安排 / 自动化脚本

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add week-to-day-splitter
Metadata
name
week-to-day-splitter
version
1.1.0
description
⚠️ **本 skill 包含以下能力,使用前请仔细阅读 SKILL.md 顶部「⚠️ 阅读前必读」章节**: - 文件读写 + 飞书 webhook 推送(daily plan 全文) - 3 个 cron 任务(每天自动执行) 周工作计划自动拆分到日计划系统 — 按子步骤时间标签,把周计划智能拆分成 5 个 daily plan。 适用场景: - 每周固定节奏的项目管理(周一-周五) - 多项目并行(每个项目含多个子步骤,时间标签驱动) - 想从一份周计划自动生成 5 份日计划 - 每天 15:00 推送次日计划到飞书私聊 本 skill 含完整工作流:v7 算法 + 周五复制 + 周日拆分 + 周日-周四推送。

周计划自动分配日程器 (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 优先级):
  1. 按子步骤时间标签分配(最优先)
  2. 出差/拜访约束(同地点 ≤2 任务)
  3. 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 优先级分配

  1. 按子步骤时间标签分配(最优先)—— 用户的时间标签 = 用户偏好
  2. 出差/拜访约束(同地点 ≤2 任务)—— 避免同一天跑多个地方
  3. 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 找不到周计划

根因:周计划文件路径配置错误,或文件名格式不符。

修复:

  1. 验证 WEEK_DIR 路径正确
  2. 验证文件名是 【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