习惯追踪

SKILL生活服务
生活服务 未标注权限 许可证不明确
安装这个技能

习惯追踪:每日打卡,自动统计连续天数、最高记录和总打卡次数,支持多习惯管理,数据本地JSON持久化

累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

ClawHub 市场
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install clawhub_534422530/laosi-habit-checkin

技能档案

生活服务
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方clawhub_534422530仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式ClawHub 市场安装包 clawhub
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791735783
正文体量4.6 KBSKILL.md 原文大小,越大说明说明书写得越细

SKILL.md 全文

4.6 KB
模型实际读到的说明书原文,来自技能仓库

Habit Checkin - 习惯追踪

> 激活词: 打卡 / 签到 / 习惯 / checkin

功能

  • 每日一键打卡
  • 自动计算连续天数(streak)
  • 历史最佳记录
  • 多习惯独立追踪
  • 本地 JSON 持久化

Python 实现

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"
  }
}

使用场景

  1. 阅读习惯: 每天读10分钟书,打卡记录
  2. 健身打卡: 跑步/健身/拉伸,坚持看得见
  3. 早睡早起: 23点前睡+7点前起,双重打卡
  4. 戒断习惯: 戒糖/戒烟/戒刷短视频,天数就是动力
  5. 学习追踪: 每天学英语/编程,连续天数激励

核心心理机制

  • 不要断链(Don't break the chain) — Jerry Seinfeld 的经典方法
  • 连续天数 > 总天数 — streak 比 total 更有激励性
  • 最佳记录 — 激励你超越自己的历史高点

依赖

  • Python 3.8+
  • 无第三方依赖

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。