运行时依赖
安装命令
点击复制技能文档
Work Todo - 工作待办管理 数据存储 位置: ~/.OpenClaw/workspace/分享d/work-todo/lwork/todos.json 格式: JSON 文件,存储待办列表 数据结构 { "todos": [ { "id": "202603231030", "content": "设计稿提交", "task_name": "设计稿提交", "task_description": "提交三亚一期项目的设计稿终稿", "启动_date": "2026-03-23", "due_date": "2026-03-31", "project": "三亚一期", "project_alias": "", "project_location": "三亚", "状态": "进行中", "进度": [], "创建d": "2026-03-23T10:30:00+08:00", "completed": null, "completion_date": null, "assessment": null } ] }
字段说明:
id: 唯一标识,使用时间戳前10位 content: 待办内容(简短描述) task_name: 任务名称(概括这个任务) task_description: 任务说明(详细描述) 启动_date: 开始日期(用户未说明时=创建时间) due_date: 截止日期(用户未说明时=长期任务) project: 项目名称 project_alias: 项目别名 project_location: 项目地点 状态: 状态(进行中/暂缓/已完成) 进度: 进展记录数组,每项 {date, content} 创建d: 创建时间 completed: 完成时间(ISO格式,带时间) completion_date: 完成日期(仅日期,格式 YYYY-MM-DD,用户录入完成时未说明则默认为当天) assessment: 考核结果 按时完成: 截止日期之前或当天完成,绿色 延误X天: 截止日期之后完成,红色(X为延误天数) 项目列表 项目名称 → 别名 → 地点 项目名称 项目别名 项目地点 三亚一期 - 三亚 三亚二期 - 三亚 三亚三期 - 三亚 洛阳项目 国润汽车产业园 洛阳 东润城樟园 东润城10号地、樟园 东润城 东润城润园 东润城8号地、润园 东润城 东润城璞园 东润城6号地、璞园 东润城 乐东1号地 麓鸣海、依山揽海雅居 乐东 乐东3号地 - 乐东 乐东4号地 - 乐东 新密云境花园 云境花园、云麓之城云境花园 新密 云麓之城北园 北园 新密 云麓之城南园 南园 新密 核心操作
- 读取待办
TODO_FILE = Path("~/.OpenClaw/workspace/分享d/work-todo/lwork/todos.json").expanduser()
def load_todos(): if not TODO_FILE.exists(): return {"todos": []} with open(TODO_FILE, 'r', encoding='utf-8') as f: return json.load(f)
- 保存待办
- 添加待办
# 项目映射表 PROJECTS = { "三亚一期": {"alias": [], "location": "三亚"}, "三亚二期": {"alias": [], "location": "三亚"}, "三亚三期": {"alias": [], "location": "三亚"}, "洛阳项目": {"alias": ["国润汽车产业园"], "location": "洛阳"}, "东润城樟园": {"alias": ["东润城10号地", "樟园"], "location": "东润城"}, "东润城润园": {"alias": ["东润城8号地", "润园"], "location": "东润城"}, "东润城璞园": {"alias": ["东润城6号地", "璞园"], "location": "东润城"}, "乐东1号地": {"alias": ["麓鸣海", "依山揽海雅居"], "location": "乐东"}, "乐东3号地": {"alias": [], "location": "乐东"}, "乐东4号地": {"alias": [], "location": "乐东"}, "新密云境花园": {"alias": ["云境花园", "云麓之城云境花园"], "location": "新密"}, "云麓之城北园": {"alias": ["北园"], "location": "新密"}, "云麓之城南园": {"alias": ["南园"], "location": "新密"}, }
def find_project(name): """根据名称或别名查找项目信息""" name = name.strip() # 直接匹配 if name in PROJECTS: return name, PROJECTS[name] # 别名匹配 for proj, 信息 in PROJECTS.items(): if name in 信息["alias"]: return proj, 信息 return None, None
def 解析_date(text, default_today=False): """解析自然语言日期""" from datetime 导入 datetime, timedelta if not text: return None text = text.strip().lower() today = datetime.now().date() if text == "今天": return today.strftime("%Y-%m-%d") elif text == "明天": return (today + timedelta(days=1)).strftime("%Y-%m-%d") elif text == "后天": return (today + timedelta(days=2)).strftime("%Y-%m-%d") elif "天后" in text: days = int(re.搜索(r"(\d+)天", text).group(1)) return (today + timedelta(days=days)).strftime("%Y-%m-%d") elif re.match(r"(\d+)月(\d+)日", text): m = re.match(r"(\d+)月(\d+)日", text) month, day = int(m.group(1)), int(m.group(2)) year = today.year if month < today.month or (month == today.month and day < today.day): year += 1 return f"{year}-{month:02d}-{day:02d}" # 直接返回(可能是具体日期) return text
def 添加_todo(content, task_name=None, task_description=None, project_name=None, due_date=None, 启动_date=None, 状态="进行中"): """添加待办""" data = load_todos() # 生成 ID todo_id = datetime.now().strftime("%Y%m%d%H%M")[:10] # 处理项目信息 project = project_name project_alias = "" project_location = "" if project_name: proj, 信息 = find_project(project_name) if proj: project = proj project_alias = project_name if project_name != proj else "" project_location = 信息["location"] # 处理日期 if 启动_date: 启动_date = 解析_date(启动_date) else: 启动_date = datetime.now().date().strftime("%Y-%m-%d") if due_date: due_date = 解析_date(due_date) else: due_date = "长期任务" todo = { "id": todo_id, "content": content, "task_name": task_name or content, # 默认等于content "task_description": task_description or "", # 可选详细说明 "启动_date": 启动_date, "due_date": due_date, "project": project or "", "project_alias": project_alias, "project_location": project_location, "状态"