其他
需要执行或配置 Obsidian Wiki…
当用户触发 /daily-update、daily update、morning sync、refresh wiki index 或 launchd 9AM cron,或首次设置/验证每日 cron 与终端通知时,运行 wiki 每日维护循环。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
需要执行或配置 Obsidian Wik特定
解决思路
- 解析配置:按 `llm-wiki/SKILL.md` 的 Config Resolution Protocol 执行(inline `@name` override → 向 CWD 上层查找 `.env` → 全局配置 → 提示 setup),得到 `OBSIDIAN_VAULT_PATH` 和 `OBSIDIAN_WIKI_REPO`。
- 派生 vault-scoped 状态目录:所有运行状态按解析出的 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`。
- Run Mode(默认,由 cron 或 `/daily-update` 触发):执行维护循环。
- Step 1 源新鲜度检查:将 `.manifest.json` 中每个 source 与其文件 mtime 比较;`mtime ≤ ingested_at` 为 Fresh,`mtime > ingested_at` 为 Stale(有新内容未 ingest),源文件不存在为 Missing。
- Step 2 索引刷新:读取 `$OBSIDIAN_VAULT_PATH/index.md`;若 vault 中有页面缺失于索引或索引中有多余页面,则更新索引;用 `find $OBSIDIAN_VAULT_PATH -name "*.md" -not -path "*/_*"` 枚举 vault 页面并与索引对账。
- Step 3 更新 hot.md:读取 `hot.md`;若其 `updated:` frontmatter 显示超过 48 小时,则重新生成:读取最近修改的 10 个 wiki 页面,写入约 500 词的最新语义快照,以便下次会话无需完整爬取 vault 即可获得上下文。
- Step 4 写状态到“Before You Start”派生的 vault-scoped `$STATE_DIR`:`date +%s > "$STATE_DIR/.last_update"`;`echo "<stale_count>" > "$STATE_DIR/.pending_delta"`;`echo "$OBSIDIAN_VAULT_PATH" > "$STATE_DIR/.vault_path"`。
- Step 4a 调度健康检查(wiki-lint):`LINT_SCHEDULE`(默认 `weekly`)控制本循环多频繁运行 `wiki-lint`;`manual` 从不自动运行,完全跳过本步;`daily` 每个循环都运行;`weekly` 仅在 `$STATE_DIR/.last_lint` 缺失或超过 7 天时运行;设置 `LINT_SCHEDULE="${LINT_SCHEDULE:-weekly}"`、`NOW=$(date +%s)`、`LAST_LINT=$(cat "$STATE_DIR/.last_lint" 2>/dev/null || echo 0)`。
- Step 4a 续:若调度要求运行,调用 `wiki-lint` skill,然后记录 `date +%s > "$STATE_DIR/.last_lint"`;将其摘要(broken links、orphans、stale pages)作为 `Health check:` 行并入 Step 7 报告;本循环未运行 lint 时完全省略该行。
- Step 5 启动 impl-validator:循环后作为 subagent 启动 `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 为 `.last_update` 是否包含最近 Unix 时间戳(60 秒内)、`.pending_delta` 是否为非负整数、`hot.md` 的 `updated:` frontmatter 是否为今天、`index.md` 列出的页面数是否至少等于 vault 中存在的页面数。
- Step 5 续:记录日志前先处理所有 FAIL。
- Step 6 记录日志:向 `$OBSIDIAN_VAULT_PATH/log.md` 追加:`- [TIMESTAMP] DAILY-UPDATE fresh=N stale=N missing=N index_added=N hot_refreshed=true|false lint=ran|skipped`。
- Step 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(若本循环未运行 lint 则省略该行);以及 Stale sources (run to sync): `/wiki-history-ingest claude — N sessions since last ingest`、`/wiki-history-ingest codex — N sessions since last ingest`。
- Setup Mode(由 "set up the daily cron" 或 "install terminal notification" 触发):引导用户完成首次设置。
- Setup Step 1 验证脚本存在:检查 `$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh` 存在且可执行;若不存在,指向该脚本给用户。
- Setup Step 2 安装 launchd 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"`;然后 `launchctl load "$HOME/Library/LaunchAgents/com.obsidian-wiki.daily-update.plist"`。
- Setup Step 3 安装终端通知(可选):询问用户 "Do you want a terminal reminder when your wiki is stale? (y/n)";若答 no 或环境为 headless/VPS,则跳过本步。
- Setup Step 3 续:若安装,检测 shell:`SHELL_NAME=$(basename "$SHELL")`;zsh 用 `$HOME/.zshrc`,bash 用 `$HOME/.bashrc`,其他 shell 提示手动添加 source 行;检查该 rc 文件中是否已 source `wiki-notify.sh`,若没有则追加空行、`# obsidian-wiki terminal notification`、`source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh`。
- Setup Step 3 续:Fish shell 的 source 语法不同,提供手动说明:在 `~/.config/fish/config.fish` 加 `bass source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh`(需要 bass 插件,或原生复制逻辑)。
- Setup Step 4 运行脚本一次:`bash "$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh"`;这会初始化 `$STATE_DIR/.last_update`,使终端通知立即可用。
- Setup Step 5 确认:告知用户 cron 每天 9 AM 运行(若错过则下次登录运行);`wiki-lint` 健康检查按 `LINT_SCHEDULE` 节奏(默认 `weekly`)作为该循环一部分运行——可在 `.env` 设 `LINT_SCHEDULE=daily` 或 `manual` 改变;wiki 超过 20 小时 stale 时出现终端通知;状态存于 `<global config dir>/state/<vault-id>/`(默认 XDG-style `~/.config/obsidian-wiki`,若 legacy `~/.obsidian-wiki` 已存在则用它),支持多 vault 独立;可随时运行 `/daily-update` 强制同步;日志写到 `/tmp/obsidian-wiki-daily.log`。
- QMD Refresh After Vault Writes:QMD 是搜索索引,不是 source of truth;若 `$QMD_WIKI_COLLECTION` 为空或未设置,跳过本步。
- QMD 仅在 skill 写入或重写 vault markdown 后运行;若 QMD refresh 失败,不要回滚 vault 变更,单独报告 QMD 状态。
- QMD 使用 `$QMD_CLI`(若设置),否则用 `qmd`;运行 `${QMD_CLI:-qmd} update`。
- 若输出说需要 vectors 或 embeddings 可能 stale,运行 `${QMD_CLI:-qmd} embed`。
- 用 `${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"` 验证 collection;或当已知具体页面路径时用 `${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5`。
- 记录 QMD 状态之一:`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>`。
适用边界 · 注意事项
- 未按 `llm-wiki/SKILL.md` 完成配置解析(缺少 `OBSIDIAN_VAULT_PATH`、`OBSIDIAN_WIKI_REPO` 或 `.manifest.json`)时,不要运行维护循环。
- 非 macOS 或无法使用 launchd 时,Setup Mode 的 launchd plist 安装不适用;需改用手动运行或替换调度器。
- `QMD_WIKI_COLLECTION` 未设置或 `qmd` CLI 不可用时,跳过 QMD refresh;QMD refresh 失败也不应回滚 vault 变更。