Auto-Updater Skill
一个面向 Other 场景的 Agent 技能。原始说明:Automatically update Clawdbot and all installed skills once daily. Runs via cron, checks for updates, applies them, and messages the user with a summary of what changed.
name: habit-checkin
version: 1.0.0
description: 习惯追踪 - 每天打卡,自动计算连续天数/历史最佳/总打卡数,多习惯管理,本地JSON持久化
tags: [habit, tracking, daily-life, health, motivation, streak]
author: laosi
source: original
激活词: 打卡 / 签到 / 习惯 / checkin
import os, json
from datetime import datetime, date
HABIT_FILE = os.path.join(os.path.dirname(__file__), "habit_streaks.json")
class HabitTracker:
def __init__(self):
os.makedirs(os.path.dirname(HABIT_FILE), exist_ok=True)
self.habits = self._load()
def _load(self):
if os.path.exists(HABIT_FILE):
with open(HABIT_FILE, encoding="utf-8") as f:
return json.load(f)
return {}
def _save(self):
with open(HABIT_FILE, "w", encoding="utf-8") as f:
json.dump(self.habits, f, ensure_ascii=False, indent=2)
def _today(self):
return date.today().isoformat()
def checkin(self, name: str = "default") -> dict:
"""打卡一次"""
today = self._today()
if name not in self.habits:
self.habits[name] = {
"dates": [],
"streak": 0,
"best": 0,
"total": 0,
"created": today
}
h = self.habits[name]
if today in h["dates"]:
return {"status": "already_done", "habit": name, "streak": h["streak"]}
# 检查是否连续
h["dates"].append(today)
h["total"] += 1
if h["dates"]:
last_date = h["dates"][-2] if len(h["dates"]) >= 2 else None
from datetime import timedelta
if last_date and date.fromisoformat(last_date) == date.today() - timedelta(days=1):
h["streak"] += 1
else:
h["streak"] = 1
else:
h["streak"] = 1
if h["streak"] > h["best"]:
h["best"] = h["streak"]
self._save()
return {
"status": "checked_in",
"habit": name,
"streak": h["streak"],
"best": h["best"],
"total": h["total"]
}
def stats(self, name: str = "default") -> dict:
"""查看习惯统计"""
if name not in self.habits:
return {"exists": False}
h = self.habits[name]
return {
"exists": True,
"habit": name,
"streak": h["streak"],
"best": h["best"],
"total": h["total"],
"last_checkin": h["dates"][-1] if h["dates"] else None,
"created": h["created"]
}
def list_all(self) -> list:
"""列出所有习惯"""
return [self.stats(n) for n in self.habits]
# 使用示例
tracker = HabitTracker()
# 每天早上打卡
result = tracker.checkin("阅读")
if result["status"] == "checked_in":
print(f"✅ {result['habit']} 打卡成功!连续 {result['streak']} 天")
elif result["status"] == "already_done":
print(f"✅ 今天已打卡,连续 {result['streak']} 天")
# 查看统计
s = tracker.stats("阅读")
print(f"📊 {s['habit']}: 连续{s['streak']}天 🏆最佳{s['best']}天 📅共{s['total']}天")
# 一周戒糖打卡
tracker.checkin("戒糖")
# 阅读打卡
python -c "from habit_tracker import HabitTracker; r=HabitTracker().checkin('阅读'); print(f'连续{r[\"streak\"]}天')"
# 查看所有习惯
python -c "from habit_tracker import HabitTracker; [print(f'{s[\"habit\"]}: {s[\"streak\"]}d') for s in HabitTracker().list_all()]"
{
"阅读": {
"dates": ["2026-05-26", "2026-05-27", "2026-05-28"],
"streak": 3,
"best": 7,
"total": 15,
"created": "2026-05-01"
}
}