mcpField
D
daily-update

daily-update

github.com/ar9av生産性3.6k2.3k 回インストール1 日前に更新
リポジトリ

daily-update について

daily-updateは、Obsidian wikiを保守するスキルです。ソースの更新状況を確認し、インデックスと活動記録を更新して状態を保存し、定期的なwikiの健全性チェックも実行できます。

主な機能

  1. 01ソースの更新状況確認
  2. 02wikiインデックスの更新
  3. 03hot.mdの活動記録更新
  4. 04vault単位の状態保存
  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を入力して読み込まれたか確認します。

詳細

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"

メモリロック下で、ディスク上のページと 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 + verified
  • QMD refreshed: update only + verified
  • QMD skipped: QMD_WIKI_COLLECTION unset
  • QMD skipped: qmd CLI unavailable
  • QMD failed: <short error summary>

コメント