daily-update について
daily-updateは、Obsidian wikiを保守するスキルです。ソースの更新状況を確認し、インデックスと活動記録を更新して状態を保存し、定期的なwikiの健全性チェックも実行できます。
主な機能
- 01ソースの更新状況確認
- 02wikiインデックスの更新
- 03hot.mdの活動記録更新
- 04vault単位の状態保存
- 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を入力して読み込まれたか確認します。
詳細
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"
メモリロック下で、ディスク上のページと index.md を整合させます。欠落しているエントリを追加し、削除されたページのエントリを削除します。所有者自身のセクションは変更しません。ステップ 6 のログ行に記載する added/removed の値を出力から確認します。find でページを列挙したり、手作業でインデックスを編集したりしないでください。
ステップ 3:hot.md の更新
obsidian-wiki memory hot --vault "$OBSIDIAN_VAULT_PATH"
Recent Activity、Active Threads、Flagged Contradictions は、ログ、todo インデックス、ページのフロントマターから再生成されます。## Key Takeaways は変更せずに引き継がれます。要点が約 48 時間より古く、かつ Vault が実質的に変更されている場合は、要点を更新します。最後に更新されたページを 10 件読み、新しい約 500 語のスナップショットを --takeaways - を使って標準入力から渡します。それ以外の場合はそのままにします。新しい要点を追加せずに再構築しても、低コストで正確です。
いずれかのコマンドが 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 を起動します。
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
セットアップモード(「set up the daily cron」または「install terminal notification」で起動)
初回セットアップをユーザーに案内します。
ステップ 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
ヘッドレスサーバーでは、ユーザーがログインしている間だけユーザータイマーが動作します。ただし linger が有効な場合はその限りではありません — sudo loginctl enable-linger "$USER" を提案します。
それ以外(systemd なし、コンテナー、systemd なしの WSL)— crontab。obsidian-wiki の daily-update 行がすでにある場合はスキップし、crontab -e で次の行を追加します。
0 9 * * * /bin/bash "$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh" >> /tmp/obsidian-wiki-daily.log 2>&1
$OBSIDIAN_WIKI_REPO の箇所には実際のリポジトリパスを記述します — cron はシェルの環境変数を読み込みません。
ステップ 3:ターミナル通知をインストール(任意)
ユーザーに「wiki が古くなったとき、ターミナルでリマインダーを表示しますか?(y/n)」と尋ねます — 「いいえ」と回答した場合、または環境がヘッドレス/VPS の場合は、このステップをスキップします。
「はい」の場合、ユーザーのシェルを検出し、適切な 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 が source されているか確認します。されていない場合は、次を追加します。
echo "" >> "$RC_FILE"
echo "# obsidian-wiki terminal notification" >> "$RC_FILE"
echo "source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh" >> "$RC_FILE"
Fish シェルでは 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に設定すると変更できます- wiki が 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>