关于 daily-update
daily-update 是用于维护 Obsidian wiki 的技能。它检查来源文件是否有更新、刷新索引和活动记录、写入更新状态,并可定期运行 wiki 健康检查。
主要功能
- 01检查来源文件是否更新
- 02刷新 wiki 索引
- 03更新 hot.md 活动记录
- 04写入按 vault 隔离的状态
- 05定期运行 wiki-lint 检查
- 06设置每日计划任务
适用场景
- 01执行例行 wiki 维护
- 02找出需要重新摄取的来源文件
- 03安排每日更新索引和活动记录
- 04按计划检查 wiki 健康状况
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ar9av/ obsidian-wiki --skill daily-update安装后在 Claude Code 中输入/daily-update确认已加载。
详细介绍
每日更新 — Wiki 维护周期
对 Wiki 执行轻量维护:检查源文件是否为最新、刷新索引、更新 hot.md,并写入终端通知读取的状态文件。
开始之前
- 解析配置 — 按照
llm-wiki/SKILL.md中的 Config Resolution Protocol 执行(内联@name覆盖 → 向上遍历 CWD 查找.env→ 全局配置 → 提示用户设置)。由此获取OBSIDIAN_VAULT_PATH和OBSIDIAN_WIKI_REPO。 - 推导作用域限定于 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" - 读取
$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 + verifiedQMD refreshed: update only + verifiedQMD skipped: QMD_WIKI_COLLECTION unsetQMD skipped: qmd CLI unavailableQMD failed: <short error summary>