mcpField
D
daily-update

daily-update

github.com/ar9av生产力3.6k2.3k 次安装1 天前更新
代码仓库

关于 daily-update

daily-update 是用于维护 Obsidian wiki 的技能。它检查来源文件是否有更新、刷新索引和活动记录、写入更新状态,并可定期运行 wiki 健康检查。

主要功能

  1. 01检查来源文件是否更新
  2. 02刷新 wiki 索引
  3. 03更新 hot.md 活动记录
  4. 04写入按 vault 隔离的状态
  5. 05定期运行 wiki-lint 检查
  6. 06设置每日计划任务

适用场景

  1. 01执行例行 wiki 维护
  2. 02找出需要重新摄取的来源文件
  3. 03安排每日更新索引和活动记录
  4. 04按计划检查 wiki 健康状况

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ar9av/obsidian-wiki --skill daily-update

安装后在 Claude Code 中输入/daily-update确认已加载。

详细介绍

每日更新 — Wiki 维护周期

对 Wiki 执行轻量维护:检查源文件是否为最新、刷新索引、更新 hot.md,并写入终端通知读取的状态文件。

开始之前

  1. 解析配置 — 按照 llm-wiki/SKILL.md 中的 Config Resolution Protocol 执行(内联 @name 覆盖 → 向上遍历 CWD 查找 .env → 全局配置 → 提示用户设置)。由此获取 OBSIDIAN_VAULT_PATH 和 OBSIDIAN_WIKI_REPO。
  2. 推导作用域限定于 Vault 的状态目录 — 所有运行时状态均限定于解析出的 Vault,而非全局:
    VAULT_ID=$(echo "$OBSIDIAN_VAULT_PATH" | md5sum 2>/dev/null | cut -c1-8 || md5 -q - <<< "$OBSIDIAN_VAULT_PATH" | cut -c1-8)
    STATE_DIR="$(obsidian_wiki_config_dir)/state/$VAULT_ID"
    mkdir -p "$STATE_DIR"
    
  3. 读取 $OBSIDIAN_VAULT_PATH/.manifest.json。

模式

运行模式(默认 — 由 cron 或 /daily-update 触发)

执行维护周期:

步骤 1:检查源文件是否为最新

将 .manifest.json 中的每个源与其文件修改时间进行比较。分类如下:

  • 最新 — mtime ≤ ingested_at
  • 过期 — mtime > ingested_at(存在尚未摄取的新内容)
  • 缺失 — 源文件已不存在

步骤 2:刷新索引

obsidian-wiki memory index --vault "$OBSIDIAN_VAULT_PATH"

此操作会在 memory lock 的保护下,将 index.md 与磁盘上的页面进行核对:补充缺失的条目、移除已删除页面对应的条目,并保留所有者自己的部分不变。记下输出中的 added/removed,供步骤 6 的日志行使用。不要用 find 枚举页面后手动编辑索引。

步骤 3:更新 hot.md

obsidian-wiki memory hot --vault "$OBSIDIAN_VAULT_PATH"

Recent Activity、Active Threads 和 Flagged Contradictions 会根据日志、待办事项索引和页面 frontmatter 重新生成;## Key Takeaways 则保持不变。如果要点已超过约 48 小时,并且 Vault 自那以后发生了实质性变化,则刷新要点:读取最近更新的 10 个页面,并通过 stdin 使用 --takeaways - 传入一份约 500 字的新摘要。否则保留原内容——不含新要点的重建既省事又正确。

如果任一命令报告 Vault 尚未迁移,请停止并告知用户运行 obsidian-wiki memory migrate(预览),然后运行 --apply;不要改为手动编辑。

步骤 4:写入状态

写入“开始之前”部分推导出的、作用域限定于 Vault 的 $STATE_DIR:

date +%s > "$STATE_DIR/.last_update"
echo "<stale_count>" > "$STATE_DIR/.pending_delta"
echo "$OBSIDIAN_VAULT_PATH" > "$STATE_DIR/.vault_path"

步骤 4a:定时健康检查(wiki-lint)

LINT_SCHEDULE(默认值为 weekly)用于控制本周期运行 wiki-lint 的频率:

  • manual — 从不自动运行;完全跳过此步骤。
  • daily — 每个周期都运行 wiki-lint。
  • weekly — 仅当 $STATE_DIR/.last_lint 不存在或已超过 7 天时运行 wiki-lint。
LINT_SCHEDULE="${LINT_SCHEDULE:-weekly}"
NOW=$(date +%s)
LAST_LINT=$(cat "$STATE_DIR/.last_lint" 2>/dev/null || echo 0)

如果计划要求运行,则调用 wiki-lint 技能,然后记录此次运行:

date +%s > "$STATE_DIR/.last_lint"

将其摘要(发现的损坏链接、孤立页面或过期页面)并入步骤 7 的报告,作为 Health check: 行;未运行 lint 的周期则完全省略此行。

步骤 5:启动 impl-validator

周期结束后,将 impl-validator 作为子 Agent 启动:

impl-validator check:
  goal: "Daily wiki maintenance — index reconciled, hot.md refreshed, state file written"
  artifacts:
    - $OBSIDIAN_VAULT_PATH/index.md
    - $OBSIDIAN_VAULT_PATH/hot.md
    - $STATE_DIR/.last_update
    - $STATE_DIR/.pending_delta
  checks:
    - Does .last_update contain a recent Unix timestamp (within the last 60 seconds)?
    - Does .pending_delta contain a non-negative integer?
    - Does hot.md have an updated: frontmatter field set to today?
    - Does index.md list at least as many pages as exist in the vault?

记录日志前,先处理所有 FAIL。

步骤 6:记录日志

追加到 $OBSIDIAN_VAULT_PATH/log.md:

obsidian-wiki memory log DAILY-UPDATE fresh=<N> stale=<N> missing=<N> index_added=<N> hot_refreshed=<true|false> lint=<ran|skipped>

步骤 7:向用户报告

## Daily Wiki Update

- Sources: N fresh · N stale · N missing
- Index: N pages (N added, N removed)
- hot.md: refreshed / up to date
- Health check: N broken links, N orphans, N stale pages (omit this line if lint didn't run this cycle)

Stale sources (run to sync):
  /wiki-history-ingest claude   — N sessions since last ingest
  /wiki-history-ingest codex    — N sessions since last ingest
设置模式(由“设置每日 cron”或“安装终端通知”触发)

引导用户完成首次设置:

步骤 1:检查脚本是否存在

检查 $OBSIDIAN_WIKI_REPO/scripts/daily-update.sh 是否存在且可执行。如果不是,请告知用户该文件的位置。

步骤 2:安装调度器——根据平台选择(uname -s)。

macOS(Darwin)——launchd:

# Replace placeholder in plist
sed "s|OBSIDIAN_WIKI_REPO|$OBSIDIAN_WIKI_REPO|g" \
  "$OBSIDIAN_WIKI_REPO/scripts/com.obsidian-wiki.daily-update.plist" \
  > "$HOME/Library/LaunchAgents/com.obsidian-wiki.daily-update.plist"

# Load it
launchctl load "$HOME/Library/LaunchAgents/com.obsidian-wiki.daily-update.plist"

使用 systemd 的 Linux(systemctl --user 可用)——用户级定时器:

UNIT_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user"
mkdir -p "$UNIT_DIR"
sed "s|OBSIDIAN_WIKI_REPO|$OBSIDIAN_WIKI_REPO|g" \
  "$OBSIDIAN_WIKI_REPO/scripts/obsidian-wiki-daily-update.service" \
  > "$UNIT_DIR/obsidian-wiki-daily-update.service"
cp "$OBSIDIAN_WIKI_REPO/scripts/obsidian-wiki-daily-update.timer" "$UNIT_DIR/"
systemctl --user daemon-reload
systemctl --user enable --now obsidian-wiki-daily-update.timer

在无头服务器上,用户级定时器只有在用户已登录时才会运行,除非启用了 lingering——建议执行 sudo loginctl enable-linger "$USER"。

其他情况(无 systemd、容器、未使用 systemd 的 WSL)——使用 crontab。通过 crontab -e 追加此行;如果已有 obsidian-wiki 每日更新行,则跳过:

0 9 * * * /bin/bash "$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh" >> /tmp/obsidian-wiki-daily.log 2>&1

将 $OBSIDIAN_WIKI_REPO 替换为实际的仓库路径——cron 不会加载 shell 环境变量。

步骤 3:安装终端通知(可选)

询问用户:“是否希望在知识库过期时收到终端提醒?(y/n)”——如果用户回答否,或当前环境为无头环境/VPS,则跳过此步骤。

如果回答是,检测用户使用的 shell,并选择相应的 rc 文件:

SHELL_NAME=$(basename "$SHELL")   # zsh, bash, fish, etc.
case "$SHELL_NAME" in
  zsh)  RC_FILE="$HOME/.zshrc" ;;
  bash) RC_FILE="$HOME/.bashrc" ;;
  *)    echo "Shell '$SHELL_NAME' not auto-detected. Add the source line manually to your shell rc file." ; return ;;
esac

检查该 rc 文件中是否已引入 wiki-notify.sh。如果没有,则追加:

echo "" >> "$RC_FILE"
echo "# obsidian-wiki terminal notification" >> "$RC_FILE"
echo "source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh" >> "$RC_FILE"

Fish shell 的 source 语法不同——提供以下手动操作说明:

# Add to ~/.config/fish/config.fish:
bass source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh
# (requires bass plugin, or copy the logic natively)

步骤 4:运行一次脚本

bash "$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh"

此操作会初始化 $STATE_DIR/.last_update,让终端通知立即生效。

步骤 5:确认

告知用户:

  • 调度器每天上午 9 点运行(如果错过,launchd 和 systemd 定时器会在下次登录/启动时补运行;普通 cron 不会)
  • wiki-lint 健康检查会按照 LINT_SCHEDULE 设定的周期(默认为 weekly)在该周期内运行——在 .env 中设置 LINT_SCHEDULE=daily 或 manual 可更改此设置
  • 知识库超过 20 小时未更新时会显示终端通知
  • 状态存储在 <global config dir>/state/<vault-id>/ 中(默认使用 XDG 风格的 ~/.config/obsidian-wiki,如果 ~/.obsidian-wiki 已存在,则使用该旧路径)——支持多个 vault 独立运行
  • 用户可随时运行 /daily-update 强制同步
  • 日志写入 /tmp/obsidian-wiki-daily.log(launchd、cron)或 journalctl --user -u obsidian-wiki-daily-update(systemd)

Vault 写入后的 QMD 刷新

QMD 是搜索索引,而非事实来源。如果 $QMD_WIKI_COLLECTION 为空或未设置,则跳过此步骤。仅在此技能写入或重写 vault Markdown 后运行。如果 QMD 刷新失败,不要回滚 vault 更改;应单独报告 QMD 状态。

如果已设置 $QMD_CLI,则使用它;否则使用 qmd。

${QMD_CLI:-qmd} update

如果输出提示需要向量或嵌入可能已过期,请运行:

${QMD_CLI:-qmd} embed

使用以下任一方式验证集合:

${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"

或者,在已知特定页面路径时:

${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5

记录以下其中一项:

  • QMD refreshed: update + embed + verified
  • QMD refreshed: update only + verified
  • QMD skipped: QMD_WIKI_COLLECTION unset
  • QMD skipped: qmd CLI unavailable
  • QMD failed: <short error summary>

评论

支持 Markdown