OpenClaw-hot-skills-zh persona-heartbeat

install
source · Clone the upstream repo
git clone https://github.com/L-LesterYu/OpenClaw-hot-skills-zh
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/L-LesterYu/OpenClaw-hot-skills-zh "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/ai-persona-os-zh/skills/persona-heartbeat" ~/.claude/skills/l-lesteryu-openclaw-hot-skills-zh-persona-heartbeat && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/L-LesterYu/OpenClaw-hot-skills-zh "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/ai-persona-os-zh/skills/persona-heartbeat" ~/.openclaw/skills/l-lesteryu-openclaw-hot-skills-zh-persona-heartbeat && rm -rf "$T"
manifest: skills/ai-persona-os-zh/skills/persona-heartbeat/SKILL.md
source content

人格心跳

AI 人格操作系统的环境监控和健康心跳系统。本技能处理程序化的上下文健康检查、主动建议展示、会话恢复和记忆维护。

阶段 1:上下文健康检查

目的: 监控上下文窗口使用量并根据阈值触发相应操作。

步骤 1.1:确定当前上下文使用量

通过可用的系统指标检查当前上下文窗口使用百分比。

context_usage_pct = get_context_window_usage()
computed.context_level = context_usage_pct

步骤 1.2:应用阈值逻辑并呈现用户可见消息

根据上下文使用量,确定用户看到的内容以及需要采取的操作:

使用范围用户可见行为
< 50%无 — 正常运行
50-69%无 — 内部记录以供跟踪
70-84%"📝 上下文 [X]% — 继续前正在保存检查点。"然后委托给 persona-checkpoint
85-94%"🟠 上下文 [X]% — 已保存紧急检查点。建议尽快启动新会话。"
95%+"🔴 上下文 [X]% — 严重。正在保存必要信息。请启动新会话。"
if context_usage_pct >= 95:
    show_critical_warning()
    save_essential_state()
    computed.action_taken = "critical_checkpoint"
elif context_usage_pct >= 85:
    show_emergency_warning()
    delegate_to_checkpoint()
    computed.action_taken = "emergency_checkpoint"
elif context_usage_pct >= 70:
    show_checkpoint_notice()
    delegate_to_checkpoint()
    computed.action_taken = "standard_checkpoint"
else:
    computed.action_taken = "none"

步骤 1.3:记录阈值跨越事件

跟踪阈值跨越时间,避免在同一会话中重复通知。

if computed.action_taken != "none":
    timestamp = current_timestamp()
    append_to_session_log(threshold_event, timestamp)

阶段 2:主动建议引擎

目的: 在顾问模式启用时提供有用建议,遵循严格规则以避免噪音。

激活条件: 仅当 USER.md 中顾问模式为开启状态时。

步骤 2.1:检查顾问模式状态

user_config = read_file("~/workspace/USER.md")
advisor_enabled = parse_advisor_mode(user_config)
computed.advisor_active = advisor_enabled

步骤 2.2:评估建议条件

仅在满足所有条件时才展示建议:

  • 发现了关于用户目标的重要新上下文
  • 发现了未注意到的模式或机会
  • 存在时间敏感的机会
  • 当前未进行复杂任务
  • 未超过每会话最多 1 条建议的限制
  • 上一条建议未被忽略/拒绝
if not advisor_enabled:
    return  # 完全跳过建议引擎

suggestion_contexts = [
    "new_goal_context",
    "unnoticed_pattern",
    "time_sensitive_opportunity"
]

blockers = [
    "complex_task_active",
    "session_quota_exceeded",
    "previous_ignored"
]

if any_suggestion_context() and not any_blocker():
    computed.suggestion_eligible = true
else:
    computed.suggestion_eligible = false

步骤 2.3:格式化并展示建议

格式:

💡 建议

[一句话描述注意到的情况]

[一句话提出行动方案]

要我执行吗?(是/否)

示例:

<invoke name="$ASK_USER_QUESTION"> <parameter name="question_data">{ "questions": [ { "question": "💡 建议\n\n我注意到您在过去一小时内创建了三个功能相似的脚本。\n\n要我将其整合为一个可复用的模块吗?\n\n要我执行吗?", "key": "suggestion_response", "options": ["yes", "no"] } ] }</parameter> </invoke>
if computed.suggestion_eligible:
    formatted_suggestion = format_suggestion(context, proposal)
    response = ask_user(formatted_suggestion)
    
    if response == "yes":
        execute_suggested_action()
        computed.suggestion_accepted = true
    else:
        log_suggestion_declined()
        computed.suggestion_accepted = false
    
    mark_session_suggestion_quota_used()

阶段 3:会话启动检测

目的: 检测新会话并静默恢复先前的工作上下文。

步骤 3.1:检测新会话中的第一条消息

is_session_start = detect_new_session()
computed.is_new_session = is_session_start

if not is_session_start:
    return  # 跳过会话启动流程

步骤 3.2:静默加载核心人格文件

读取基础文件,不向用户展示内容。

soul_content = read_file("~/workspace/SOUL.md")
user_content = read_file("~/workspace/USER.md")
memory_content = read_file("~/workspace/MEMORY.md")

computed.persona_loaded = true

步骤 3.3:检查昨天的日志

yesterday_date = get_yesterday_date()  # 格式:YYYY-MM-DD
log_path = "~/workspace/memory/daily-{yesterday_date}.md"

if file_exists(log_path):
    yesterday_log = read_file(log_path)
    computed.has_previous_log = true
else:
    computed.has_previous_log = false

步骤 3.4:展示未完成项目或保持静默

if computed.has_previous_log:
    uncompleted_items = parse_uncompleted_items(yesterday_log)
    
    if uncompleted_items:
        surface_resumption_message(uncompleted_items)
        # 示例:"📋 从上次会话恢复:
        # • 修复登录流程中的认证 bug
        # • 审查 PR #42 的依赖项更新"
    else:
        # 无需展示 — 静默操作
        pass
else:
    # 无先前日志 — 静默操作
    pass

阶段 4:记忆维护

目的: 对记忆文件和日志执行静默维护,仅在有操作时才通知。

触发条件: 每约 10 次交互(近似值,非严格)。

步骤 4.1:检查 MEMORY.md 大小

memory_file = "~/workspace/MEMORY.md"
file_size = get_file_size(memory_file)

computed.memory_size_kb = file_size / 1024

if computed.memory_size_kb > 4:
    computed.memory_needs_pruning = true
else:
    computed.memory_needs_pruning = false

步骤 4.2:清理旧记忆条目

如果文件超过 4KB,移除 30 天前的条目。

if computed.memory_needs_pruning:
    cutoff_date = current_date() - 30_days
    memory_entries = parse_memory_entries(memory_file)
    
    entries_to_keep = filter(lambda e: e.date >= cutoff_date, memory_entries)
    pruned_count = len(memory_entries) - len(entries_to_keep)
    
    if pruned_count > 0:
        write_file(memory_file, entries_to_keep)
        computed.pruned_entries = pruned_count
    else:
        computed.pruned_entries = 0

步骤 4.3:归档旧日志

将 90 天前的日志移至归档目录。

log_directory = "~/workspace/memory/"
archive_directory = "~/workspace/memory/archive/"

daily_logs = glob(log_directory + "daily-*.md")
cutoff_date = current_date() - 90_days

logs_to_archive = []
for log in daily_logs:
    log_date = parse_date_from_filename(log)
    if log_date < cutoff_date:
        logs_to_archive.append(log)

if logs_to_archive:
    ensure_directory_exists(archive_directory)
    for log in logs_to_archive:
        move_file(log, archive_directory)
    
    computed.archived_logs = len(logs_to_archive)
else:
    computed.archived_logs = 0

步骤 4.4:检查前几天未完成的项目

recent_logs = get_logs_from_last_7_days("~/workspace/memory/")
uncompleted_items = []

for log in recent_logs:
    items = parse_uncompleted_items(log)
    uncompleted_items.extend(items)

if uncompleted_items and not already_surfaced_this_session():
    surface_once_per_session(uncompleted_items)
    computed.surfaced_uncompleted = true
else:
    computed.surfaced_uncompleted = false

步骤 4.5:仅在有操作时通知

actions_taken = []

if computed.pruned_entries > 0:
    actions_taken.append(f"清理了 {computed.pruned_entries} 条旧记忆条目")

if computed.archived_logs > 0:
    actions_taken.append(f"归档了 {computed.archived_logs} 份旧日志")

if actions_taken:
    notification = "🗂️ 维护:" + "、".join(actions_taken) + "。"
    display(notification)
else:
    # 静默操作 — 无通知
    pass

阶段 5:心跳输出格式

目的: 标准化地向用户呈现健康状态。

步骤 5.1:确定何时展示心跳

在以下情况展示心跳状态:

  • 用户明确请求("heartbeat"、"status"、"health check")
  • 上下文阈值跨越(70%+)
  • 执行了维护操作
  • 会话开始时发现未完成项目

步骤 5.2:格式化心跳头部

current_datetime = get_current_datetime()  # 格式:2026-02-17 14:30
model_name = get_current_model()  # 例如 "claude-opus-4-6"
version = "1.0.0"  # AI Persona OS 版本

header = f"🫀 {current_datetime} | {model_name} | AI Persona OS v{version}"

步骤 5.3:生成信号灯指标

确定健康指标,每个指标之间留空行:

indicators = []

# 上下文健康
if computed.context_level < 70:
    indicators.append("🟢 上下文:{computed.context_level}%(健康)")
elif computed.context_level < 85:
    indicators.append("🟡 上下文:{computed.context_level}%(建议关注)")
else:
    indicators.append("🔴 上下文:{computed.context_level}%(需要操作)")

# 记忆健康
if computed.memory_size_kb < 4:
    indicators.append("🟢 记忆:{computed.memory_size_kb}KB(健康)")
elif computed.memory_size_kb < 8:
    indicators.append("🟡 记忆:{computed.memory_size_kb}KB(建议关注)")
else:
    indicators.append("🔴 记忆:{computed.memory_size_kb}KB(需要操作)")

# 顾问状态
if computed.advisor_active:
    indicators.append("🟢 顾问:活跃")
else:
    indicators.append("⚪ 顾问:未激活")

# 未完成项目
if computed.surfaced_uncompleted:
    indicators.append("🟡 未完成:前几次会话有待处理项目")

步骤 5.4:组装并展示心跳

heartbeat_output = header + "\n\n" + "\n\n".join(indicators)
display(heartbeat_output)

示例输出:

🫀 2026-02-17 14:30 | claude-opus-4-6 | AI Persona OS v1.0.0

🟢 上下文:45%(健康)

🟢 记忆:2.8KB(健康)

🟢 顾问:活跃

⚪ 未完成:无

注意事项

  • 本技能主要在后台运行,大多数阶段静默执行
  • 仅在信息对用户有价值时才展示
  • 严格遵守每会话最多 1 条建议的规则
  • 记忆维护不应中断当前工作
  • 心跳格式提供快速的可视化健康评估