äŒè©±ãã°ã¯ã»ãã·ã§ã³ãéããç¬éããå¿åŽãå§ãŸããŸããæ10äžã®å€§åŠçããæãæã¡ã§60äžãŸã§ç©ã¿äžããäŒç€Ÿéœåã®è§£éã§äžåºŠ0ã«æ»ããããããå幎ã§Claude CodeèªåŸç°å¢ã建ãŠãŠæå120äžã«éããèæ¯ã«ã¯ãã仿¥ãã£ãããšããã¡ãããšç¿æä»¥éã«åŒãç¶ãä»çµã¿ããããŸããããã®æ žå¿ã vault-auto-ingest.sh ã§ãã
ãªããã®ä»çµã¿ãå¹ãã®ã
Claude Codeã®ãèšæ¶ãã¯ããã©ã«ãã§æ¶ãã
Claude Codeã®ã»ãã·ã§ã³ã¯äŒè©±ããšã«ç¬ç«ããŠããŸãã仿¥ã®é·ãäœæ¥ã»ãã·ã§ã³ã§å€æãããã°ã®åå ã詊è¡é¯èª€ã®æ«ã«éžãã ã¢ãŒããã¯ãã£ã®çç±ãããã®æ¹åã¯äžåºŠå€±æããããšããçµéšå€ââãããã¯ã»ãã·ã§ã³ãéãããšæ¬¡ã®äŒè©±ã§ã¯åç §ã§ããŸããã
ææãã©ã³ã§ãããããã¯ããã髿§èœãªã¢ãã«ã䜿ã£ãŠããŠããæèãåŒãç¶ãããªããã°æ¯åãŒãããã®èª¬æãèŠããŸãããåãåãããšã調ã¹ãããäžåºŠå€±æããã¯ããªã®ã«ãŸãåãæ¹åãžé²ãã§ããŸã£ãããšããçµéšãããæ¹ã¯å€ãã¯ãã§ãã
å人éçºãéç£ãããã§ãŒãºã§ã¯ããã®åé¡ã¯èŽåœçã§ãã䞊è¡ããŠèµ°ããããžã§ã¯ãã3æ¬ã»4æ¬ã«ãªããšãåãããžã§ã¯ãã®ãä»ã©ãã«ããããã人éãæã§è¿œãã®ã¯ããéçãæ¥ãŸãããããŠClaudeããååã®äŒè©±ãåç §ã§ããªãã®ã§åãæ€èšãç¹°ãè¿ããŸãã
解決çã¯ãäœæ¥ã§ãªãç°å¢ããäœãããš
ãã®åé¡ã«å¯ŸããŠæåã¯ãæ¯æ¥æã§ãŸãšããŠã¡ã¢ãããããšè©Šã¿ãŸãããç¶ããŸããã§ãããäœæ¥ã®å¢ãããããšãã¯ãŸãšããæžãæ°ã«ãªãããç²ããŠãããšãã¯ãã£ãšæžããªãã人éã®æå¿åã«é Œãä»çµã¿ã¯ãå人éçºã®éç£ãã§ãŒãºã§ã¯æ©èœããŸããã
çãã¯ãæ¯æ©èªåã§Claudeã®äŒè©±ãã°ãObsidianãžæµã蟌ãç°å¢ãäœããããšã§ãããç°å¢ãæŽãã°ãæå¿åãæ°åãé¢ä¿ãããŸãããMacãåæã«ãããŸãã
Obsidianãéžãã çç±ã¯ã·ã³ãã«ã§ããããŒã«ã«ã®Markdownãã¡ã€ã«ãªã®ã§ãClaude CodeããçŽæ¥èªã¿æžãã§ããŸããGitã§ããŒãžã§ã³ç®¡çã§ããŸãã[[ãªã³ã¯]] æ§æã§ç¥èå士ãç¹ããããŸããæ¯æãã°ãæµã蟌ã¿ããããžã§ã¯ãéã®ãªã³ã¯ãèªç¶ã«è²ã£ãŠããââããããå€ä»ãè³ããšããŠæ©èœãå§ããç¬éãããäœæ¥ã®è³ªãå€ãããŸããã
ãªãäžéæ§é ãå¿ èŠã«ãªã£ãã
åçŽã«ãæ¯æ¥4:55ã«ã¹ã¯ãªãããåãããã ãã§ã¯ãå®éã«åãããŠã¿ããš3çš®é¡ã®é害ãçºçããŸããããããããå®å®³ãåºããŠåããŠæ°ã¥ãããã®ã§ãã
ã¹ãªãŒãåçµ: Macã®èãéããŠå¯ããšãcaffeinate -sïŒAC黿ºæã®ã¿æå¹ïŒã§ã¯ã¹ãªãŒããé²ããŸãããã¹ã¯ãªãããéäžã§æ¢ãŸããæ¬¡ã®ã¹ããããåããŸã§ãã®æ¥ã®åŠçãå®ã¶ãããã«ãªããŸãã
äºéå®è¡ã¬ãŒã¹: 2026-06-10ã«å®éã«çºçããé害ã§ããlaunchdããã®å®æçºç«ãšãæåå®è¡ãéãªããŸãããäž¡æ¹ãåãVaultãGitã§æäœããããšããçµæãã³ã³ããªã¯ããèµ·ããŸããã
ã¿ã€ã ã¢ãŠã: 2026-06-13ã«çµæ¥å
šã¹ãããã倱æããæ¥ããããŸãããclaude -p ã«ãã28æéåã®ãã°æ¶åãã40åã®ã¿ã€ã ã¢ãŠãæ ã«åãŸããå
šãŠåãããŸããããã°ã«ã¯ 04:55:00éå§â05:40:01ã§step2 timeout ãšãããã¿ãŒã³ã4ã¹ãããåãå®å
šã«äžå®ã§äžŠãã§ããŸãã
ããã3ã€ã®å®é害ãã倿®µã¹ãããåçºç«ããcaffeinate ã¹ãªãŒã鲿¢ããã¹ãããããŒã«ãŒã«ããåªçãªãã©ã€ããšããäžéæ§é ãäœãããŸãããèšèšããçãŸããã®ã§ã¯ãªããå®éã«å£ããçµéšããç©ã¿äžãã£ããã®ã§ãã
ãç°å¢ãè²ã€ããšããæèŠ
ä»çµã¿ãå®å®ããŠåãå§ãããšãObsidianã«æ¯æãã°ãéãç©ãã£ãŠãããŸããClaudeããã®ãã°ãèªãã§ãããžã§ã¯ãå¥ã®èšäºãæŽæ°ããhot.mdïŒçŽè¿ã®æèãŸãšãïŒã«ä»é±ã®è«ç¹ãç©ãŸããŠãããŸãã
次ã®äŒè©±ã§Claudeãhot.mdãšwiki/ãèªããšããå
é±ã®å€æããäžåºŠå€±æããã¢ãããŒããã䞊è¡ããŠãã3ãããžã§ã¯ãã®çŸåšå°ããå
šéšç¥ã£ãç¶æ
ã§äœæ¥ãå§ããããŸãããããæå120äžã®ç°å¢ã®æ ¹å¹¹ã§ããäŒè©±ãçµãã£ãŠãå¿ããªããå€ä»ãé·æèšæ¶ãããClaude Codeã®èœåãæ¬æ¥ã®ããã³ã·ã£ã«ã§åŒãåºãåææ¡ä»¶ã«ãªã£ãŠããŸãã
å šäœã®æµã
4å±€ã¢ãŒããã¯ãã£
ã¹ã¯ãªãããæ±ãããŒã¿ã®æµãã¯ä»¥äžã®4å±€ã§ãã
ãå±€1ãClaude Code ã»ãã·ã§ã³ãã°ïŒã»ãã·ã§ã³çµäºæã«Stop hookãæžãåºãïŒ
â extract_conversations.pyïŒstep1: ææ°åïŒ
ãå±€2ã~/Documents/my-knowledge-base/raw/conversations/
â claude -pïŒstep2a: Claudeç±æ¥ãã°ãæ¶å, timeout 1500sïŒ
~/Documents/my-knowledge-base/raw/codex-conversations/
â claude -pïŒstep2b: Codexç±æ¥ãã°ãæ¶å, timeout 1500sïŒ
ãå±€3ãObsidian VaultïŒ~/Documents/claude-obsidian/wiki/ïŒ
âââ hot.mdïŒçŽè¿ãµããªïŒ
âââ index.mdïŒå
šäœç®æ¬¡ïŒ
âââ projects/ / learning/ / career/ ... ïŒãã¡ã€ã³å¥èšäºïŒ
âââ today-brief.mdïŒstep2.5: 仿¥ã®è¡åææ¡ïŒ
â git add -A && git commit && git push
ãå±€4ãprivate repoïŒå®å
šç¶²: èããŠãrevertå¯èœïŒ
å±€2ããClaudeç±æ¥ããšãCodexç±æ¥ãã®2æ¬ã«åå²ããŠããã®ã2026-06-11以éã®å€æŽã§ããããšããš1æ¬ã§å šéšåŠçããŠãããšãããæŽ»åãå€ãæ¥ã«40åã®ã¿ã€ã ã¢ãŠãæ ã«åãŸããªããªããŸãããåå²åŸã¯å1500ç§ïŒ25åïŒã®ç¬ç«ããã¿ã€ã ã¢ãŠããæã¡ãçæ¹ã倱æããŠã次ã®ã¹ãããã§æ®ãã ãå詊è¡ã§ããããã«ãªã£ãŠããŸãã
倿®µã¹ãããçºç«ã®å®è£
launchd plistïŒ~/Library/LaunchAgents/com.shun.vault-auto-ingest.plistïŒã§å®çŸ©ãã4ã€ã®ã¹ããããã1æ¥ãããŠãæåãããŸã§å詊è¡ããç¹°ãè¿ããŸãã
<key>StartCalendarInterval</key>
<array>
<dict><key>Hour</key><integer>4</integer><key>Minute</key><integer>55</integer></dict>
<dict><key>Hour</key><integer>8</integer><key>Minute</key><integer>20</integer></dict>
<dict><key>Hour</key><integer>10</integer><key>Minute</key><integer>45</integer></dict>
<dict><key>Hour</key><integer>12</integer><key>Minute</key><integer>15</integer></dict>
</array>
RunAtLoad 㯠false ã§ãããã°ã€ã³æã®èªåèµ·åã¯ããŸãããã¹ããã4æ¬ã ããçºç«æºã§ãã
ã¹ã¯ãªããã®åé ã§åœæ¥åã®æåããŒã«ãŒã確èªããæ¢ã«çµãã£ãŠããã°å³çµäºããŸãã
TODAY=$(date +%Y%m%d)
DONE_MARKER="$HOME/.claude/logs/.vault-ingest-done-${TODAY}"
# 0. æ¬æ¥åãæ¢ã«æåããŠããã°å³çµäº
[ -f "$DONE_MARKER" ] && exit 0
ããã«ããã4:55ã«æåãããªã8:20ã»10:45ã»12:15ã®3åã¯ããã¡ã€ã«ç¢ºèªããŠçµäºããšããç¡å®³ãªç©ºæ¯ãã«ãªããŸãã4:55ã«å€±æïŒã¹ãªãŒãåçµã»ãããæªæ¥ç¶ã»launchdäžæé害ãªã©ïŒããå Žåã ãã8:20ãå®éã«åŠçãåŒãç¶ããŸãã
caffeinate ã«ããã¹ãªãŒã鲿¢
MacBookã§éçšããå Žåãèãéãããš caffeinate -sïŒAC黿ºæã®ã¿æå¹ïŒã§ã¯é²ããããŸãããããã§ã¹ã¯ãªããèªèº«ã -iïŒã·ã¹ãã ã¹ãªãŒã鲿¢ïŒãš -s ã®äž¡æ¹ã§èªå·±åå®è¡ããæ§é ã«ãªã£ãŠããŸãã
if [ -z "${CAFFEINATED:-}" ]; then
exec /usr/bin/caffeinate -i -s env CAFFEINATED=1 /bin/bash "$0" "$@"
fi
CAFFEINATED ç°å¢å€æ°ããªããã° caffeinate é
äžã§èªåèªèº«ãåå®è¡ãããã以éã®åŠçã caffeinate ã®åã®äžã«çœ®ããŸããäžåºŠã ãåå®è¡ãããŠä»¥é㯠CAFFEINATED=1 ãã»ãããããŠããã®ã§ç¡éã«ãŒãã«ã¯ãªããŸããã
-s ã¯ããããªãŒé§åæã¯ç¡å¹ã§ããèéãã¹ãªãŒãã§åçµããå Žåãtimeout ãåã£ãŠæ¬¡ã®ã¹ããããããçŽããŸããStep2ãéäžãŸã§æžãã§ããã°ããŒã«ãŒã§æžãã åãã¹ãããããæ®ãã ãå®è¡ããŸãã
lockdir ã«ããäºéå®è¡é²æ¢
mkdir ã®ååæ§ïŒåæã«2ããã»ã¹ãåŒãã§ãçæ¹ã ãæåããïŒã䜿ã£ãããã¯æ©æ§ã§ããBashã®ãã¡ã€ã«ããã¯ãšããŠåºã䜿ãããŠããææ³ã§ãã
LOCKDIR="$HOME/.claude/locks/vault-auto-ingest.lock"
if ! /bin/mkdir "$LOCKDIR" 2>/dev/null; then
oldpid=$(cat "$LOCKDIR/pid" 2>/dev/null || true)
if [ -n "${oldpid:-}" ] && kill -0 "$oldpid" 2>/dev/null; then
echo "[$(date '+%F %T')] å¥ã€ã³ã¹ã¿ã³ã¹å®è¡äž(pid=${oldpid}) â skip" >> "$LOG"
exit 0
fi
rm -rf "$LOCKDIR"
/bin/mkdir "$LOCKDIR" 2>/dev/null || exit 0
fi
echo $$ > "$LOCKDIR/pid"
trap 'rm -rf "$LOCKDIR"' EXIT INT TERM
æ¢åã®lockdirããã£ãŠãPIDã確èªããããã»ã¹ãçããŠããã°ãå¥ã€ã³ã¹ã¿ã³ã¹ãåäœäžããšããŠçµäºããŸããããã»ã¹ãæ»ãã§ããã°ïŒååãç°åžžçµäºããŠããã¯ãæ®ã£ãå ŽåïŒstaleãšããŠååããæ°ãã«ããã¯ãååŸããŠåŠçãç¶ããŸããtrap ã§ã¹ã¯ãªããçµäºæã«å¿
ãlockdirãåé€ããŸãã
ã¹ãããããŒã«ãŒã«ããåªçãªãã©ã€
æã工倫ãèŠã£ãã®ãããã§ããstep2ïŒVaultãžã®ingestïŒãClaudeãšCodexã§2æ¬ã«åå²ããåã ãç¬ç«ããããŒã«ãŒãæã¡ãŸãã
STEP2A_MARKER="$HOME/.claude/logs/.vault-ingest-step2a-claude-${TODAY}"
STEP2B_MARKER="$HOME/.claude/logs/.vault-ingest-step2b-codex-${TODAY}"
ingest_src 颿°ããã®ããŒã«ãŒãèŠãŠãå®äºæžã¿ãªãã¹ãããã»æªå®äºãªãå®è¡ãã倿ããŸãã
ingest_src() {
local marker="$1" src="$2" name="$3" to="$4" extra="$5"
[ -f "$marker" ] && { echo "[...] step2($name) ã¯æ¬æ¥å®æœæžã¿ â skip" >> "$LOG"; return 0; }
cd "$VAULT" && run_to "$to" "$CLAUDE" -p \
"...ïŒVaultã®ã«ãŒã«ã«åŸã£ãŠ wiki/ ãæŽæ°ããããã³ããïŒ..." \
--dangerously-skip-permissions >> "$LOG" 2>&1 \
&& { touch "$marker"; return 0; } \
|| { echo "[...] WARN: step2($name) 倱æ/timeoutïŒæ¬¡ã¹ãããã§å詊è¡ïŒ" >> "$LOG"; return 1; }
}
ingest_src "$STEP2A_MARKER" "$KB/raw/conversations/" "claude" 1500 ""
ingest_src "$STEP2B_MARKER" "$KB/raw/codex-conversations/" "codex" 1500 "Codexç±æ¥ã§ãæ¢åèšäºã«çµ±åãéè€ã¯è¿œèšã§ãŸãšããã"
[ -f "$STEP2A_MARKER" ] && [ -f "$STEP2B_MARKER" ] && touch "$STEP2_MARKER"
åäœãã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã
4:55 çºç«
âââ DONE_MARKER ãªã â åŠçç¶è¡
âââ step2a å®è¡ïŒclaudeç±æ¥, 1500säžéïŒ â æå â STEP2A_MARKER äœæ
âââ step2b å®è¡ïŒcodexç±æ¥, 1500säžéïŒ â timeout! â ããŒã«ãŒãªã
âââ briefçæ â 倱æïŒstep2bæªå®ã§ãã°ãèãïŒ â DONE_MARKER äœããªã
âââ notify_fail ã§ Desktop ã« FAILED ãã¡ã€ã« + éç¥
8:20 çºç«
âââ DONE_MARKER ãªã â åŠçç¶è¡
âââ step2a â STEP2A_MARKER ãã â skipïŒåå®è¡ããªãïŒ
âââ step2b â ããŒã«ãŒãªã â å®è¡ â æå â STEP2B_MARKER äœæ
âââ briefçæ â æå
âââ DONE_MARKER äœæ â
âââ FAILED ãã¡ã€ã«åé€
10:45 / 12:15 çºç«
âââ DONE_MARKER ãã â exit 0ïŒç©ºæ¯ãïŒ
step2aãæåããŠããã°8:20ã¯step2bã ããå®è¡ããŸããstep2aãstep2bãäž¡æ¹çµãã£ãŠããã°8:20ã¯briefã ããå®è¡ããŸããã©ã®æç¹ã®ã¹ããããäœãæ åœããããåçã«æ±ºãŸããããã4:55ã«å€±æããŠãå¿ ãåœæ¥äžã«çµããããšããä¿èšŒãç¶æã§ããŸãã
launchd PATH ãšããŒããã€ããªã®è£å®
launchdã®å®è¡ç°å¢ã¯ /usr/bin:/bin:/usr/sbin:/sbin çšåºŠã®æå°PATHããæã¡ãŸãããgit commit åŸã®ããã¯ïŒnode補ïŒãåãã commit èªäœã倱æãããšãããã©ãããåé¿ãããããã¹ã¯ãªããåé ã§nvmã®ææ°nodeãèªåæ¢çŽ¢ããŠè¿œå ããŠããŸãã
NODE_BIN=$(ls -d "$HOME"/.nvm/versions/node/*/bin 2>/dev/null | sort -V | tail -1)
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
[ -n "$NODE_BIN" ] && export PATH="${NODE_BIN}:$PATH"
sort -VïŒããŒãžã§ã³é ãœãŒãïŒã®æ«å°Ÿãåãããšã§ãnvmã«è€æ°ããŒãžã§ã³ãå
¥ã£ãŠããŠãåžžã«ææ°ã䜿ããŸããããŒãžã§ã³ãçŽæžãããŠããªãã®ã§ãnvm install ã§ããŒãžã§ã³ãå¢ããŠãã¹ã¯ãªããåŽã®ä¿®æ£ã¯äžèŠã§ãã
ãŸããmacOS TCCïŒãã©ã€ãã·ãŒä¿è·ïŒã«ãã /bin/bash ã«ãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹æš©éããªããšlaunchdãã ~/Documents/ 以äžã«æžããŸãããã¹ã¯ãªããã¯ãããæ©ææ€ç¥ããŠãµã€ã¬ã³ã倱æãé²ããŸãã
if ! ( cd "$VAULT" 2>/dev/null && git rev-parse --git-dir >/dev/null 2>&1 ); then
echo "[...] â FDAæªä»äž: launchdãã '$VAULT' ã«ã¢ã¯ã»ã¹äžå¯(TCCä¿è·)ã" >> "$LOG"
notify_fail "FDAæªä»äž: vault ã«ã¢ã¯ã»ã¹äžå¯ïŒèšå®âãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹â/bin/bashïŒ"
exit 1
fi
exit 0 ãè¿ããŠããŸããšãæåãããã«èŠããŠDONE_MARKERãäœãããæ¬¡ã®ã¹ããããå詊è¡ããŸãããTCC倱æã¯ exit 1 ã§æç€ºããæ¬¡ã¹ãããã«åŒãç¶ããŸãã
å®è£ ã®è©³çް
timeout ãã«ããŒãšã確å®ã«åããèšèš
ã¹ã¯ãªããã®æ žå¿çãªå€æã®ã²ãšã€ããrun_to 颿°ã§ãã
TIMEOUT_BIN="/opt/homebrew/bin/timeout"
[ -x "$TIMEOUT_BIN" ] || TIMEOUT_BIN=""
run_to() { local s=$1; shift; if [ -n "$TIMEOUT_BIN" ]; then "$TIMEOUT_BIN" --kill-after=30 "$s" "$@"; else "$@"; fi; }
GNU coreutils ã® timeout ãæç€ºãã¹ã§åŒãã§ããŸããmacOS æšæºã® /usr/bin ã«ã¯ GNU çã® timeout ããããŸããã/opt/homebrew/bin/timeout ãååšããªãç°å¢ã§ã¯ TIMEOUT_BIN ã空ã«ããŠçŽ éãïŒãã³ã°èæ§ã¯èœã¡ããåäœã¯ç¶æïŒããŸãã
--kill-after=30 ãå°å³ã«éèŠã§ããSIGTERM ãéã£ãŠãã 30 ç§åŸã«ããã»ã¹ããŸã çããŠããã° SIGKILL ã§åŒ·å¶çµäºããŸããclaude -p ã¯éãåŠçãããŠãããšã SIGTERM ãç¡èŠããããšãããããã--kill-after ããªããšãã¿ã€ã ã¢ãŠãåŸãããã»ã¹ãçãç¶ã㊠lockdir ãæŽãã ãŸãŸããšããææªã®ã±ãŒã¹ãèµ·ãããŸãã
step2aïŒClaude ç±æ¥ãã°ïŒãš step2bïŒCodex ç±æ¥ãã°ïŒã«ã¯ãããã 1500 ç§ïŒ25 åïŒã®äžéãæž¡ããŠããŸããåè¿°ã®ãšãããããšããšã¯ 2400 ç§ïŒ40 åïŒã®åäžåŠçã§ãããæŽ»åéãå¢ããã«ã€ããŠåãŸããªããªããŸããã2 æ¬ã«åå²ããŠå 1500 ç§ã«ããããšã§ãäžæ¹ãæ»ãã§ã次ã®ã¹ãããã¯æ®ãã ããåå®è¡ã§ããããã«ãªã£ãŠããŸãã
wake çŽåŸã®ãããåŸ ã¡ãšããªãã©ã€ãæ€ç¥ã®é£é
Mac ã 4:55 ã«èµ·åºããŠããWi-Fi ã®æ¥ç¶ãå®å®ãããŸã§ã«æ°åç§ãããããšããããŸããclaude ã git push ãããããå¿
èŠãšãããããæ¥ç¶åã«èµ°ããšå³ãšã©ãŒã§ãã
net_ok=""
for _ in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do
if /usr/bin/nc -z -G 3 1.1.1.1 443 2>/dev/null; then net_ok=1; break; fi
sleep 5
done
[ -z "$net_ok" ] && echo "[...] WARN: ç¶²æªæ¥ç¶ã®ãŸãŸç¶è¡ïŒå€±ææã¯æ¬¡ã¹ããããå詊è¡ïŒ" >> "$LOG"
18 å à 5 ç§ = æå€§ 90 ç§åŸ
ã¡ãŸããnc -z -G 3 㯠3 ç§ã§ã¿ã€ã ã¢ãŠããã TCP ã³ãã¯ã·ã§ã³ãã¹ãã§ãcurl ãã軜éã§ãã90 ç§çµã£ãŠãç¹ãããªãå Žåã¯ãèŠåãåºããŠç¶è¡ãã«ããŠããŸããããã§ exit 1 ã«ããŠããŸããšããªãã©ã€ã³ç°å¢ã§ã® step1ïŒããŒã«ã«åŠçïŒãŸã§æ¢ãŸãããã§ãã倱æãããæ¬¡ã¹ããããèªåå詊è¡ãããšããèšèšãåæã«ããã®ã§ãããã¯ãæ¢ããã«èšé²ãã§ååã§ãã
ç¶ããŠããªãã©ã€ãæ€ç¥ã 3 段éã§é£éããŸãã
â claude ãã€ããªã®ååšç¢ºèª: ã¢ããããŒãã§ symlink å
ãæ¶ããã±ãŒã¹ãæ©ææ€ç¥ããŸããclaude update ãå®è¡ãããšäžæçã«ãã€ããªãäžåšã«ãªãããšããããããããµã€ã¬ã³ã倱æã®åå ã«ãªããŸãã
â¡ macOS TCC ã®ããªãã©ã€ã: Vault ã ~/Documents/ 以äžã«ããå Žåãlaunchd ããåãããã»ã¹ã«ãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹æš©éããªããšæžããŸããã
if ! ( cd "$VAULT" 2>/dev/null && git rev-parse --git-dir >/dev/null 2>&1 ); then
echo "[...] â FDAæªä»äž: launchdãã '$VAULT' ã«ã¢ã¯ã»ã¹äžå¯(TCCä¿è·)ã" >> "$LOG"
notify_fail "FDAæªä»äž: vault ã«ã¢ã¯ã»ã¹äžå¯ïŒèšå®âãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹â/bin/bashïŒ"
exit 1
fi
ããã§ exit 0 ãè¿ããšDONE_MARKER ãäœãããŠããŸããæ¬¡ã®ã¹ãããããæåããããšèª€èªããŠå詊è¡ããŸãããTCC 倱æã¯å¿
ã exit 1 ã§çµäºããæ¬¡ã¹ãããã«åŒãç¶ããŸãããã®åºå¥ãåŸè¿°ãã倱æè©±ã®æ ¹ã§ããããŸãã
ãã°è¥å€§ã¬ãŒããš brief ã®é®®åºŠå€å®
claude -p ã®åºåããã°ã«å
šéšæžã蟌ããšãæ°é±éã§æ°å MB ã«ãªããŸãã
if [ -f "$LOG" ] && [ "$(stat -f%z "$LOG" 2>/dev/null || echo 0)" -gt 5242880 ]; then
mv "$LOG" "${LOG}.old"
fi
5 MBïŒ5,242,880 ãã€ãïŒãè¶
ããã .old ã«ãªããŒã ããŠæ°èŠãã°ãå§ããŸããstat -f%z 㯠macOS ã®ãã¡ã€ã«ãµã€ãºååŸã³ãã³ãã§ããGNU stat ãšãªãã·ã§ã³ãç°ãªããã || echo 0 ã§ãã©ãŒã«ããã¯ãå
¥ããŠããŸãã
brief ã®é®®åºŠå€å®ãéèŠãªéšåã§ãã
START_STAMP=$(mktemp /tmp/vault-ingest-start.XXXXXX)
ã¹ã¯ãªããåé ã§ãã®äžæãã¡ã€ã«ãäœããstep2.5ïŒbrief çæïŒã®åŸã«ããããæ°ãããã確èªããŸãã
if [ -s "$BRIEF_SRC" ] && [ "$BRIEF_SRC" -nt "$START_STAMP" ]; then
# ã¢ãŒã«ã€ãåŠç
touch "$DONE_MARKER"
else
notify_fail "ããªãŒãçæãæªå®"
fi
-ntïŒnewer thanïŒã§æ¯èŒããããšã§ããæšæ¥çæãããå€ã today-brief.md ãæ®ã£ãŠããå Žåã«ä»æ¥ã®ææãšããŠèª€ã¢ãŒã«ã€ããããäºæ
ãé²ããŸããbrief ãä»åã®ã©ã³éå§ããæ°ãããªããã°æåãšã¿ãªãããDONE_MARKER ãäœããã«æ¬¡ã¹ããããžåŒãç¶ããŸãã
LLM åºåãæ±ºå®è«ã§äžæžããã
claude -p ã wiki/index.md ãæŽæ°ãããšãããç·ããŒãžæ°ãã誀ã£ãå€ã§æžãããšããããŸããã¢ãã«ãæèããæšæž¬ããŠåºåãããããå®éã®ãã¡ã€ã«æ°ãšäžèŽããŸããã
real=$(find "$VAULT/wiki" -name '*.md' -not -path '*/.*' | wc -l | tr -d ' ')
sed -i '' -E "s/ç·ããŒãžæ°ïŒ[0-9]+/ç·ããŒãžæ°ïŒ${real}/" "$INDEX_FILE"
find ã§å®ãã¡ã€ã«æ°ãæ°ãçŽããsed ã§åŒ·å¶äžæžãããŸããgit commit ã®çŽåã«å
¥ãããšã§ãLLM çæã®æ°å€ã決å®è«çãªå€ã«å·®ãæ¿ããããç¶æ
ã§ã³ããããããŸãããLLM ã®åºåããæ°å€ã¯åŸæ®µã®æ±ºå®çãã§ãã¯ã§äžæžãããããšããèšèšã§ãã
ã«ã¬ã³ããŒã® last-known-good ãã¿ãŒã³
brief ã«ã仿¥ã®äºå®ããæžããšããã«ã¬ã³ããŒæ å ±ãååŸã§ããªãæ¥ã¯éå»ã®æ å ±ãä¿æããŸãã
if [ -n "$CAL_SRC" ]; then
cp "$CAL_TMP" "$CAL_SNAPSHOT"
cp "$CAL_SNAPSHOT" "$CAL_LASTGOOD" # æåããã last-good ãæŽæ°
elif [ -s "$CAL_LASTGOOD" ]; then
# ååŸå€±æ: åå good ãæž©åã stale å°ãä»ããŠåºå
{ tail -n +4 "$CAL_LASTGOOD"; } > "$CAL_SNAPSHOT"
fi
Google Calendar APIïŒADC èªèšŒïŒãš icalBuddyïŒããŒã«ã« Apple ã«ã¬ã³ããŒïŒãé ã«è©Šããäž¡æ¹å€±æãããååæåæã® _calendar-snapshot.md.lastgood ã䜿ããŸãããæ£å
žã絶察ã«ç©ºã§æœ°ããªãããšããååã§ããstale ã§ããããšãåé ã® â ïž ã§æç€ºããbrief çæããã³ããã«ãstale ãšããã°ååŸæ¥æç¹ã®å€ã§ããç¹ãæãããšæž¡ããŸãã
ç§ãè©°ãŸã£ã話
é害â : å šã¹ããããç§åäœã§åãå Žæã§æ»ãã æ¥ïŒ2026-06-13ïŒ
~/Desktop/Daily Brief/ ã« FAILED-20260613.md ãæ®ã£ãŠããŠæ°ã¥ããŸããããã°ãéããšã4 æ¬ã®ã¹ãããå
šéšãå®å
šã«åããã¿ãŒã³ã§ããã
04:55:00 ===== auto-ingest éå§ =====
05:40:01 WARN: step2(claude) 倱æ/timeoutïŒæ¬¡ã¹ãããã§å詊è¡ïŒ
08:20:00 ===== auto-ingest éå§ =====
09:05:01 WARN: step2(claude) 倱æ/timeoutïŒæ¬¡ã¹ãããã§å詊è¡ïŒ
10:45:00 ===== auto-ingest éå§ =====
11:30:01 WARN: step2(claude) 倱æ/timeoutïŒæ¬¡ã¹ãããã§å詊è¡ïŒ
12:15:00 ===== auto-ingest éå§ =====
13:00:01 WARN: step2(claude) 倱æ/timeoutïŒæ¬¡ã¹ãããã§å詊è¡ïŒ
å
šã¹ãããã 45 å 01 ç§ã§ã¿ã€ã ã¢ãŠãããŠããŸããåœæã® step2 ã¿ã€ã ã¢ãŠã㯠2400 ç§ïŒ40 åïŒã§ãããclaude -p ã 40 åéãã£ãšåŠçãç¶ããŠã¿ã€ã ã¢ãŠããããæ¬¡ã¹ããããå詊è¡ããŠãåãçµæããšããã«ãŒãã 4 åç¹°ãè¿ãããŸããã
æåã«çã£ãã®ã¯ git commit åŸã®ãšã©ãŒã¡ãã»ãŒãžã§ãããã°ã«ãcommit-msg ããã¯ããnode not foundããšããæååãèŠãããããããŒããã€ããªãåå ã ãšæããŸãããããã claude -p "say OK" ãæåã§èµ°ããããšå³åº§ã« exit 0 ãè¿ããŸãããcommit ãæåã§è©Šããšæ®éã«éããŸãã
çå ã¯äžéæ§ã® claude -p åŽã®é害ã§ããã06-12 ã¯æ£åžžåäœã06-13 åœæ¥ã ãå
šãªã¯ãšã¹ãããã³ã°ããç¶æ
ã«ãªã£ãŠããïŒããããã¬ãŒãå¶éããµãŒãã¹åŽã®äžæé害ïŒãç¿æ¥ã«ã¯è§£æ¶ãããŠããŸãããcommit-msg ããã¯èª¬ã¯å®å
šã«å€ãã§ããã
ãã®çµéšããåŸãæèšã 2 ã€ãããŸããäžã€ã¯ããšã©ãŒã¡ãã»ãŒãžã¯ç¯äººã®ç®æã§ãã£ãŠç¢ºå®ã§ã¯ãªããå®éã«èµ°ãããŠåãåããããããäžã€ã¯ FAILED ããŒã«ãŒã®æé€ã«é¢ãããã®ã§ããåœæã®ã¯ãªãŒã³ã¢ããã¯ãåœæ¥ã® FAILED ãã¡ã€ã«ãæåæã«åé€ãããã ãã§ããã06-13 ã® FAILED ãã¡ã€ã«ã¯ãç¿æ¥ä»¥éãæºäžã«æ®ãç¶ããŸãã
# ä¿®æ£åŸ: é廿¥ã® FAILED ãæ£åžžçšŒåæ¥ã«æã
find "$HOME/Desktop/Daily Brief" -maxdepth 1 -name "FAILED-*.md" ! -name "FAILED-${TODAY}.md" -delete 2>/dev/null
ãã® 1 è¡ã远å ããããšã§ãè€æ°æ¥é£ç¶ã§é害ãèµ·ããŠããæåã«æ£åžžçšŒåããæ¥ã«é廿¥åãå šéšæ¶ããããã«ãªããŸããã
é害â¡: launchd ãšæåå®è¡ã Vault ãåæã«æžãããšããïŒ2026-06-10ïŒ
ããæãã¹ã¯ãªããã®é²æã確èªããããšããŠæåã§ã vault-auto-ingest.sh ãèµ°ãããŸãããæ¢ã« launchd ã® 4:55 ã¹ããããåããŠããŸãããäž¡æ¹ãåã Vault ã« git add -A && git commit ãèµ°ãããçµæãã³ã³ããªã¯ããèµ·ããŸããã
error: cannot lock ref 'refs/heads/main': is at xxx but expected yyy
åŠçãéäžã§ã¶ã€ãã£ããããVault ã®ç¶æ ãäžéå端ã«ãªããæåã§ãªã»ãããå¿ èŠã«ãªããŸããã
åè¿°ã® mkdir ããã¯ã§è§£æ±ºããŠããŸããããã€ã³ãã¯ãstale lock ã®èªåååãã§ãã
if ! /bin/mkdir "$LOCKDIR" 2>/dev/null; then
oldpid=$(cat "$LOCKDIR/pid" 2>/dev/null || true)
if [ -n "${oldpid:-}" ] && kill -0 "$oldpid" 2>/dev/null; then
echo "[...] å¥ã€ã³ã¹ã¿ã³ã¹å®è¡äž(pid=${oldpid}) â skip" >> "$LOG"
exit 0
fi
rm -rf "$LOCKDIR"
/bin/mkdir "$LOCKDIR" 2>/dev/null || exit 0
fi
kill -0 "$oldpid" ã¯ã·ã°ãã«ãéãããããã»ã¹ãçããŠãããã ãã確èªããŸããããã»ã¹ãæ»ãã§ããã° stale 㪠lockdir ãåé€ããŠèªåãããã¯ãååŸããŸããããã«ãããååãç°åžžçµäºã㊠lockdir ãæ®ã£ããŸãŸæ¬¡å以éãå
šéšã¹ãããããç¶ããããšããææªã±ãŒã¹ãé²ãã§ããŸãã
é害â¢: ãæåããŠããã¯ããªã®ã«äœãæŽæ°ãããªããTCC ã®çœ
Vault ã ~/Documents/claude-obsidian/ ã«çœ®ããŠããææããããŸãïŒåŸã« TCC ä¿è·å€ã® ~/claude-obsidian/ ãžç§»èšïŒãåœæã®ã¹ã¯ãªãã㯠TCC ãšã©ãŒãé©åã«åŠçããŠããããcd "$VAULT" ã«å€±æããŠã exit 0 ã§çµäºããŠããŸããã
# ä¿®æ£åã®åé¡ã³ãŒãïŒã€ã¡ãŒãžïŒ
cd "$VAULT" && git rev-parse --git-dir >/dev/null 2>&1 || exit 0
^^^^^^
ãã® exit 0 ã DONE_MARKER ãäœãåæãå£ã
ã¹ã¯ãªããã exit 0 ã§çµäºãããšãåŒã³åºãå
ã® launchd ã¯ãæ£åžžçµäºããããšã¿ãªããŸãããããæ¬¡ã®åŠçã§ãåãããšãèµ·ãããããDONE_MARKER ãäžåäœãããªããŸãŸ 4 ã¹ãããå
šéšããæåããããã«èŠããŠäœãããªããç¶æ
ã«ãªããŸãã
çç¶ã¯äžæè°ãªãã®ã§ããããã°ã«ã¯ã===== å®äº =====ãã 4 åèšé²ãããŠããŸããããã Vault ã¯æŽæ°ãããŠããŸãããDONE_MARKER ããããŸããã
åå ã«æ°ã¥ããã®ã¯ãæåã§ã¹ã¯ãªããã察話å®è¡ãããšãã«åºãã¡ãã»ãŒãžã§ããlaunchd ããèµ°ããš /bin/bash ã« Full Disk Access ããªããããcd "$VAULT" ããµã€ã¬ã³ãã«å€±æããŠããŸããã
ä¿®æ£åŸã¯ TCC 倱æã exit 1 ã§æç€ºãããã¹ã¯ãããã« FAILED ãã¡ã€ã«ãäœã£ãŠéç¥ããŸãã
if ! ( cd "$VAULT" 2>/dev/null && git rev-parse --git-dir >/dev/null 2>&1 ); then
notify_fail "FDAæªä»äž: vault ã«ã¢ã¯ã»ã¹äžå¯ïŒèšå®âãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹â/bin/bashïŒ"
exit 1 # DONE_MARKER ã¯äœãããªã â æ¬¡ã¹ããããå詊è¡
fi
exit 0 ãš exit 1 ã®åºå¥ããæåããããæ¬¡ã¹ããããåŒãç¶ãããåããŸããèªååã®æèã§ã¯ããµã€ã¬ã³ããªæååœè£
ãæã蚺æãã«ããé害ã§ãã
é害â£: caffeinate -s ãä¿¡ãããã
æåã®å®è£
ã§ã¯ caffeinate -s ã ããã¹ã¯ãªããåé ã«çœ®ããŠããŸããã
# åæã®èª€ã£ãå®è£
caffeinate -s "$0" "$@"
-s ãã©ã°ã®èª¬æã¯ãã·ã¹ãã ã¹ãªãŒããé²ããã§ãããããå®éã«ã¯ AC 黿ºã«æ¥ç¶ãããŠãããšãããå¹ããŸãããããããªãŒé§åäžã«èãéãããš macOS ã¯ã¹ãªãŒãã«å
¥ããcaffeinate -s ã®åäžã«ããã¹ã¯ãªãããäžç·ã«åçµããŸãã
ç¿æç¢ºèªãããšã¹ã¯ãªããã¯èµ·åãã圢跡ãããã®ã«äžéå端ãªç¶æ ã§çµãã£ãŠããŸãããtimeout ãåŸããåã£ããã lockdir ã¯æ¶ããŠããŸãããstep2a ã®ããŒã«ãŒã¯ååšããã®ã« step2b ã®ããŒã«ãŒããªãç¶æ ã§ãã
ä¿®æ£ã¯ -iïŒã·ã¹ãã ã¹ãªãŒã鲿¢ïŒãš -s ã®äœµçšã«å€ããããšã§ããã
if [ -z "${CAFFEINATED:-}" ]; then
exec /usr/bin/caffeinate -i -s env CAFFEINATED=1 /bin/bash "$0" "$@"
fi
-i ã¯ããããªãŒé§åã§ãæå¹ã§ãããã ãèãéããå Žåã®ã¹ãªãŒãïŒãã£ã¹ãã¬ã€ã¹ãªãŒãã§ã¯ãªããµã¹ãã³ãã«çžåœãããã®ïŒã¯ -i ã§ãå®å
šã«ã¯é²ããªãç¶æ³ããããŸãããããåæãšããèšèšããtimeout ãåã£ãŠæ¬¡ã¹ããããæ®ããå詊è¡ããšãã倿®µã¹ãããæ§é ã§ããcaffeinate ã¯ãããŸã§ã¹ãªãŒãããé
ããããè£å©ã§ããããå¿
ãåŠçãå®äºããããä¿èšŒããã®ã¯ããŒã«ãŒãšå€æ®µã¹ãããã®çµã¿åããã§ãã
å®éã«ãè©°ãŸã£ãæéãã®ç·é
ãããã®éå®³ãæŽçãããšããã¹ãŠ 1 æ¥ä»¥å ã®å®å®³ã§æžãã§ããŸããã¹ãªãŒãåçµã¯æ¬¡ã® 8:20 ã¹ããããååããŸãããäºéå®è¡ã¬ãŒã¹ã¯æåãªã»ããã« 10 åããããŸããã06-13 ã®çµæ¥é害ã¯ç¿æ¥ã® 4:55 ã¹ãããã§èªåå埩ããŸãããTCC ã®çœ ã¯ãæ°ã¥ããŸã§æ°æ¥ããããŸãããæ°ã¥ããŠããä¿®æ£ã¯ 30 å以å ã§ããã
ã©ã®é害ããæ°ã¥ãããã®ã¯ãã°ãšãã¹ã¯ãããã® FAILED ãã¡ã€ã«ã®ãããã§ãããµã€ã¬ã³ãã«å€±æããŠããããVault ãäœæ¥ãæŽæ°ãããŠããªãããšã«æ°ã¥ããªãã£ããããããŸãããnotify_fail ã§ãã¹ã¯ãããã« FAILED ãã¡ã€ã«ã眮ãèšèšã¯ãæ°ã¥ãã®æ©äŒãæå€§åããããã®ãã®ã§ããèªååã¯ãåãããŠçµãããã§ã¯ãªããå£ãããšã確å®ã«æ°ã¥ããããŸã§èšèšããŠåããŠåãããšããã®ãå幎ã®å®æã§ãã
ã€ãŸãããã€ã³ã
ååã»äžæ®µã§4ã€ã®å®é害ïŒå šã¹ãããæ»æ» ã»äºéå®è¡ã¬ãŒã¹ã»TCCçœ ã»caffeinate誀信ïŒãåãäžããŸãããããã§ã¯ããããŸã§å€§ãããªãã確å®ã«è©°ãŸãã现ãããã€ã³ããç¶²çŸ ããŸãã
set -u ãšlaunchdç°å¢å€æ°ã®çµã¿åããã§å³æ»ãã
ã¹ã¯ãªããåé ã« set -u ãæžããŠããŸãïŒå®éã®ã³ãŒãã«ãããŸãïŒãæªå®çŸ©å€æ°ãåç
§ãããšå³ exit 1 ãããªãã·ã§ã³ã§ããlaunchd ããèµ°ãã·ã§ã«ã¯ãã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ãšéã£ãŠå€ãã®ç°å¢å€æ°ãæªå®çŸ©ã§ãã${VAR:-} 圢åŒã§ããã©ã«ãå€ãäžããŠããªã倿°ãåç
§ãããšã察話å®è¡ã§ã¯åé¡ãªãã®ã«launchdå®è¡ã ãæ»ã¬ãšããçŸè±¡ãèµ·ããŸãããã®ã¹ã¯ãªããã§ã¯ ${CAFFEINATED:-} ${oldpid:-} ${net_ok:-} ãšå
šãŠããã©ã«ã空æåãæç€ºããŠããŸããèŠèœãšããšåå äžæã®exit 1ãéç£ãããŸãã
RunAtLoad ãèšå®ãå¿ãããšæ¯åãã°ã€ã³æã«èµ°ã
plistã« <key>RunAtLoad</key><false/> ãæç€ºããŠããŸããæžããªããšããã©ã«ãã true ã«ãªããMac ãåèµ·åãŸãã¯ãã°ã€ã³ãããã³ã«ã¹ã¯ãªããã1åäœèšã«çºç«ããŸããDONE_MARKERãããã°å³çµäºããã®ã§å®å®³ã¯åºãŸããããèµ·åçŽåŸã®CPUè² è·ãšæå³ããªããã°æ±æãç©ã¿éãªããŸãã
trap ãæžããªããšlockdirãæ®ãç¶ããŠæ¬¡å以éãå
šã¹ãããã«ãªã
trap 'rm -rf "$LOCKDIR"' EXIT INT TERM
ãã®1è¡ããªããšãã¹ã¯ãªããã Ctrl+C ã kill ã§åæ¢ããéã«lockdirãæ®ããŸããæ¬¡ã®çºç«æã« mkdir ã§ããã¯ååŸã詊ã¿ããšæ¢ålockdirããããããå¥ã€ã³ã¹ã¿ã³ã¹å®è¡äžããšèª€å€æããŠskipããŸãããããPIDã確èªããã³ãŒããæžããŠããã° stale ãèªåååã§ããŸããstale ååããªãå Žåã¯æ°žé ã«ã¹ããããããŸãã
deepå€ã«èµ°ããšæ¥ä»ãå€ãã£ãŠDONE_MARKERã2ã€çæããã
4:55ã¹ããããæ·±å€0:10ã«åãå§ããå ŽåïŒæåèµ·åãªã©ã§ïŒãåŠçéäžã§ date +%Y%m%d ãå€ããDONE_MARKERã®ãã¡ã€ã«åãå€ãããŸãããããé²ãããã¹ã¯ãªããã¯ã©ã³éå§æç¹ã®æ¥ä»ã BD="$TODAY" ã§åºå®ããŸãã
BD="$TODAY" # æ¥ä»è·šã察ç: è©äŸ¡ã¯ã©ã³éå§æã®æ¥ä»ã§åºå®
ARCH_FILE="$VAULT/wiki/briefs/daily/today-brief-${BD}.md"
TODAY ã¯ã¹ã¯ãªããåé ã§äžåºŠã ãååŸããŸãã24æããŸããé·æéåŠçã§ãããã¡ã€ã«åã¯ãã©ã³ãéå§ããæ¥ãã§çµ±äžãããŸãã
stat -f%z ã¯macOSå°çšãªãã·ã§ã³
ãã°ããŒããŒã·ã§ã³ã®ã³ãŒãã§ãã
[ "$(stat -f%z "$LOG" 2>/dev/null || echo 0)" -gt 5242880 ]
GNU statïŒLinuxïŒã§ã¯ -c%s ã§ããmacOS ã§åããåæã§æžããŠãããã stat -f%z ã䜿ã£ãŠããŸãããLinuxãžç§»æ€ããããšãããšç¡é³ã§ echo 0 ã«èœã¡ãŠåžžã«ããŒããŒã·ã§ã³ãããŸããã|| echo 0 ã®ãã©ãŒã«ããã¯ãããããå£ãã¯ããŸãããããã°ãè¥å€§ãç¶ããŸãã
launchd ã® StandardErrorPath ãèšå®ããªããšæšæºãšã©ãŒãæ¶ãã
plistã«ã¯ä»¥äžãå ¥ã£ãŠããŸãã
<key>StandardErrorPath</key>
<string>/Users/.../.claude/logs/vault-auto-ingest.launchd.log</string>
ãããæžããªããšãlaunchdçµç±ã§èµ°ã£ãããã»ã¹ã®æšæºãšã©ãŒã /dev/null çžåœã«æšãŠãããŸããstep2ã® claude -p ãäœããstderrã«åºããŠããŠãæ°žé ã«èŠããŸããã察話å®è¡ã§ã¯èŠããŠlaunchdå®è¡ã§ã¯èŠããªãããšãã蚺æå°é£ãªç¶æ³ãçãŸããŸãã
nodeçcommit-msgããã¯ãPATHè£å®ãªãã§æ»ã¬
Vault ã® git commit ãèµ°ããããš commit-msg ããã¯ãå®è¡ãããŸãããã®ããã¯ã node 補ã®å Žåãlaunchd ã®æå°PATHïŒ/usr/bin:/bin çšåºŠïŒã«ã¯ node ããããŸãããgit commit ããããã¯å®è¡å€±æãã§æ¢ãŸãã倿Žãäžåã³ããããããªããŸãŸçµãããŸããã¹ã¯ãªãã㯠nvm ã® node ãèªåæ¢çŽ¢ããŠPATHã«è¿œå ããŠããŸãã
NODE_BIN=$(ls -d "$HOME"/.nvm/versions/node/*/bin 2>/dev/null | sort -V | tail -1)
[ -n "$NODE_BIN" ] && export PATH="${NODE_BIN}:$PATH"
sort -V ã§ããŒãžã§ã³é ãœãŒãã®æ«å°Ÿãåãã®ãããœã§ããæååãœãŒãã«ãããš v9.x ã v10.x ããåŸã«æ¥ããšããé転ãèµ·ããŸãã
step2bã®ããã³ããã§ãæ¢åèšäºãžã®çµ±åããæç€ºããªããšéè€èšäºãéç£ããã
step2aïŒClaudeç±æ¥ãã°ïŒãå
ã«èµ°ããVaultèšäºãæŽæ°ããŸãããã®åŸã«step2bïŒCodexç±æ¥ãã°ïŒãèµ°ããšããåããããã¯ã®èšäºãæ°èŠäœæããããšããŸããããã³ããã«æç€ºçãªæç€ºããªããšãåãå
容ã®èšäºã projects/foo.md ãš projects/foo-2.md ã«åè£ããŸãã
ingest_src "$STEP2B_MARKER" "$KB/raw/codex-conversations/" "codex" 1500 \
"Codexç±æ¥ã§ãèã®ç¥èãšããŠæ¢åèšäºã«çµ±åããClaudeåŽãšéè€ãã話é¡ã¯æ°èšäºãäœãã远èšã§ãŸãšããã"
ãã®è¿œå ããã³ããïŒextra åŒæ°ïŒãstep2bã«ã ãæž¡ãããŸããstep2aã®çµæãèŠãäžã§ãçµ±åããŠè¿œèšããšããæç€ºãæ©èœããŸãã
-nt æ¯èŒã®START_STAMPãæ¶ãå¿ãããšbriefãåžžã«ãå€ãããšå€å®ããã
START_STAMP=$(mktemp /tmp/vault-ingest-start.XXXXXX)
ãã®äžæãã¡ã€ã«ã¯ã¹ã¯ãªããçµäºæã«åé€ãããŸããããã /tmp ã«æ®ã£ãŠãããšæ¬¡åã©ã³æã«åãååã§äœããããå€ã START_STAMP ãšã®æ¯èŒã§ today-brief.md ããå€ãããšå€å®ãããŠDONE_MARKERãäœãããªãã«ãŒãã«å
¥ãããšããããŸããã¹ã¯ãªããæ«å°Ÿã® rm -f "$START_STAMP" ã¯å¿
é ã§ãã
ããŒã«ãŒãã¡ã€ã«ã7æ¥ä»¥äžæ®ãç¶ãããš /tmp ãè¥å€§ãã
find "$HOME/.claude/logs" -maxdepth 1 -name '.vault-ingest-*' -mtime +7 -delete 2>/dev/null
æ¥æ¬¡ã§äœãããããŒã«ãŒãã¡ã€ã«ãæŸçœ®ãããšã1幎ã§365ãã¡ã€ã«ã ~/.claude/logs/ ã«æºãŸããŸãã-mtime +7 ã§7æ¥ããå€ããã®ã宿åé€ããŸãããã®æé€ã©ã€ã³ãèšå¿µã«å
¥ã£ãŠããŸãã
ãã¹ããã©ã¯ãã£ã¹
å®éã«å幎éåãããŠåºãŸã£ãéçšååã12åã«ãŸãšããŸãã
â ãæåããšã次ã¹ãããã«åŒãç¶ã倱æããexit codeã§åé¢ãã
TCCé害ã§ãããããæèšã§ããexit 0 ãè¿ããšDONE_MARKERãäœãããæ¬¡ã®ã¹ãããã¯å詊è¡ããŸãããæ¬ç©ã®å€±æã¯å¿
ã exit 1 ã«ããŸããããµã€ã¬ã³ããªæååœè£
ããèªååã§æã蚺æãã«ããé害ã®åœ¢ã§ãã
â¡ DONE_MARKERã¯ãå šã¹ãããå®äºåŸãã«ã ãäœã
step2aå®äºæç¹ã§DONE_MARKERãäœã£ãŠããŸããšãstep2bãšbriefãæªå®ã§ãã仿¥ã¯çµãã£ããã«ãªããŸãããã®ã¹ã¯ãªããã§ã¯ brief ã START_STAMP ããæ°ããå Žåã«ã ã DONE_MARKER ãäœããŸããæåŸã®ææç©ãåºåãããåŸã«åããŠãã©ã°ãç«ãŠãããšããé åºã®ååã§ãã
⢠äžéããŒã«ãŒã§éšåãªãã©ã€ãå¯èœã«ãã
åçŽãªãdone/not doneãã®2ç¶æ ã§ã¯ãªããstep2aã»step2bããããã«åããŒã«ãŒãæãããŸããstep2aãæåããŠããã°æ¬¡ã¹ãããã¯step2aãã¹ãããããŠstep2bããå§ããŸããã¹ãããæ°ãå¢ããã»ã©éšåãªãã©ã€ã®äŸ¡å€ã倧ãããªããŸãã
⣠caffeinate ã¯ã¹ãªãŒãããé ããããè£å©ãšå²ãåã
-i -s ã®äž¡æ¹ã䜿ã£ãŠããèãéããMacBookã®ãµã¹ãã³ãã¯å®å
šã«ã¯é²ããŸãããcaffeinate ã¯ãã¹ããšãã©ãŒãã§ãããå¿
ãå®äºããããä¿èšŒããã®ã¯ããŒã«ãŒãšå€æ®µã¹ãããã§ããcaffeinate ã«é Œããããèšèšã¯ããããªãŒéçšã§å¿
ãå£ããŸãã
†ã¹ãããæ°ã¯ãäžçªé ã倱æã§ãåœæ¥äžã«çµãããããéç®ãã
4ã¹ãããïŒ4:55 / 8:20 / 10:45 / 12:15ïŒã¯ãæŒãŸã§ã«çµããã°åœæ¥äžã«äœ¿ããããšãã芳ç¹ããèšèšãããŠããŸããæ4:55ã«å€±æããŠãææª12:15ã«æåããã°ããã®æ¥ã®æŽ»åãã°ã«åºã¥ããbriefã䜿ããŸããç¿æã®çºç«ã¯ãç¿æ¥åã®åŠçãã«äœ¿ãããã§ãã
⥠--kill-after=30 ãå¿
ãä»ãã
run_to() { "$TIMEOUT_BIN" --kill-after=30 "$s" "$@"; }
SIGTERM åŸ30ç§ã§SIGKILLãéããŸããclaude -p ã¯éãåŠçäžã«SIGTERMãç¡èŠããããšããããŸããkill-afterããªããšãã¿ã€ã ã¢ãŠãåŸãããã»ã¹ãçãç¶ããŠlockdirãæŽãã ãŸãŸãã«ãªããŸãã
⊠LLMåºåã®æ°å€ã¯åŸæ®µã®æ±ºå®è«ã§äžæžããã
real=$(find "$VAULT/wiki" -name '*.md' -not -path '*/.*' | wc -l | tr -d ' ')
sed -i '' -E "s/ç·ããŒãžæ°ïŒ[0-9]+/ç·ããŒãžæ°ïŒ${real}/" "$INDEX_FILE"
Claudeã wiki/index.md ã«æžããç·ããŒãžæ°ãã¯æšæž¬ã§ããå®ãã¡ã€ã«ãæ°ããŠäžæžãããŸããgit commitçŽåã«å
¥ãããšã§ããªããžããªã«ã¯å¿
ã宿ž¬å€ãã³ããããããŸããLLMãçæããæ°å€ã¯æš©åšã«ããªãããšããèšèšååã§ãã
â§ ååŸå€±æã§ãååå€ãä¿æããïŒlast-known-goodïŒ
ã«ã¬ã³ããŒæ
å ±ã¯ Google Calendar API â icalBuddy â lastgood ãšãã3段ãã©ãŒã«ããã¯ã«ãªã£ãŠããŸãããååŸã§ããªãã£ããã空ã«ãããã§ã¯ãªããååæåæã®å€ãstaleãšããŠä¿æããããbriefããã³ããã«ã¯ â ïžstale ãããã°æç€ºããããæç€ºããŸããæ
å ±ãå€ããŠããŒãããæçã§ãã
⚠倱æããèŠãããšãããã«çœ®ã
FAILED_FILE="$HOME/Desktop/Daily Brief/FAILED-${TODAY}.md"
notify_fail() {
mkdir -p "$HOME/Desktop/Daily Brief"
{ echo "# Daily Brief çæå€±æ â ..."; echo "- èªåå詊è¡: 8:20 / 10:45 / 12:15 ..."; } > "$FAILED_FILE"
/usr/bin/osascript -e "display notification ..."
}
ãã°ãã¡ã€ã«ã¯ãèŠã«è¡ããªããšæ°ã¥ããªãããã®ã§ãããã¹ã¯ãããã« FAILED ãã¡ã€ã«ã眮ããmacOS éç¥ãæããããšã§ãèªååãå£ããŠããããšããç®ã«å ¥ããŸãããããŠæåæã«ãã®ãã¡ã€ã«ãèªååé€ããŸããã倱æäžã ãååšããããã¡ã€ã«ãæ£åžžçšŒåã®èšŒæã«ãªããŸãã
â© é廿¥ã®FAILEDãã¡ã€ã«ãæé€ãã
06-13ã®é£ç¶é害ã®åŸåŠçã§è¿œå ãã1è¡ã§ãã
find "$HOME/Desktop/Daily Brief" -maxdepth 1 -name "FAILED-*.md" ! -name "FAILED-${TODAY}.md" -delete 2>/dev/null
ãåœæ¥ã®æåæã«åœæ¥åã ãæ¶ããèšèšã§ã¯ãè€æ°æ¥é£ç¶é害ã®ããšã§æºäžã«FAILEDãã¡ã€ã«ãæºãŸãç¶ããŸããæ£åžžçšŒåããæåã®æ¥ã«é廿¥åãå šéšæ¶ãããšããèšèšã«ããŸãã
⪠nvm node ã¯çµ¶å¯Ÿãã¹ã§ã¯ãªãããŒãžã§ã³èªåæ¢çŽ¢ã«ãã
launchd plistã®EnvironmentVariablesã«ã¯ v24.13.0 ã®ãã¹ãçŽæžãããŠããŸãïŒåç
§ãã¡ã€ã«8è¡ç®ïŒããã ãã¹ã¯ãªããå
ã® node æ¢çŽ¢ã¯çµ¶å¯ŸããŒãžã§ã³åºå®ã§ã¯ãªã sort -V | tail -1 ã§ææ°ãåããŸããpliståŽã®åºå®ãã¹ã䜿ãããå Žå㯠nvm install ã®ãã³ã«æŽæ°ãå¿
èŠã«ãªããŸããã¹ã¯ãªããåŽã®åçæ¢çŽ¢ã䜿ããšããŒãžã§ã³æŽæ°åŸãä¿®æ£äžèŠã§ããã©ã¡ããä¿¡é Œã®æ ¹æ ã«ããããæèããŠäœ¿ãåããŸãã
â« ãåãããšãå£ãããšãæ°ã¥ãããã¯å¥ã®èšèšåé¡
æåã®ããŒãžã§ã³ã¯ãåãããšãããŸã§ããèããŠããŸããã§ãããå£ãããšããVault ãäœæ¥ãæŽæ°ãããŠããªãããšã«æ°ã¥ããªãã£ããããããŸãããFAILED ãã¡ã€ã«ã»éç¥ã»ç¿æ¥ã®briefãå€ãããšã§æ°ã¥ãããšããè€æ°ã®æ€ç¥çµè·¯ãæå³çã«èšèšããŸããèªååã¯ãå£ãããšã確å®ã«æ°ã¥ããããŸã§èšèšããŠåããŠä¿¡é Œã§ããŸãã
ãŸãšã
vault-auto-ingest.sh ã®äžéæ§é ãæ¯ãè¿ããŸãã
倿®µã¹ãããåçºç«ã¯ãæåãããŸã§1æ¥ãããŠãªãã©ã€ããããšããä¿èšŒãäžããŸãã4:55ã«å§ãŸã£ãŠææª12:15ãŸã§äœ¿ãèšèšã§ãããã»ãšãã©ã®æ¥ã¯4:55ã8:20ã«çµãããŸããæ®ãã®2ã¹ãããã¯DONE_MARKERã確èªããŠå³çµäºãã空æ¯ãã«ãªããŸãã
caffeinate -i -s ã«ããã¹ãªãŒã鲿¢ã¯ããã»ã¹ãéäžã§åçµããããšãé²ãè£å©ã§ããããããªãŒé§åã§ã®èéãã«ã¯å®å
šã«ã¯å¯Ÿæã§ããŸããããåçµããã©ã³ã¯timeoutãåããæ¬¡ã¹ããããåŒãç¶ããŸããcaffeinate ãšããŒã«ãŒæ§é ã®çµã¿åããã§ãããšãäžéšãæ»ãã§ãåã«é²ããæ§é ãæç«ããŸãã
ã¹ãããããŒã«ãŒã«ããåªçãªãã©ã€ãæãéèŠãªéšåã§ããstep2aãšstep2bãããããç¬ç«ããããŒã«ãŒãæã¡ãå®äºæžã¿ã®ã¹ãããã¯åå®è¡ãããŸããã40åæ ã«åãŸããªãã£ãåŠçã25åÃ2æ¬ã«åå²ããçæ¹ãæ»ãã§ã次ã®ã¹ãããã¯æ®ãã ããå®è¡ããŸããããã«ãããäžéštimeoutãããäžéšçµãã£ããã«å€ãããŸãã
ãã®ä»çµã¿ãæ¯æå®å®ããŠåãããã«ãªã£ãŠäœãå€ãã£ãããClaude Codeãç¿æã« hot.md ãèªããšãæšæ¥ã®å€æã»äžåºŠå€±æããã¢ãŒããã¯ãã£ã®çç±ã»äžŠè¡ããŠãã3ãããžã§ã¯ãã®çŸåšå°ãç¥ã£ãç¶æ
ã§äœæ¥ãå§ããããŸããæ¯åãŒãããã®èª¬æãäžèŠã«ãªããŸãã䞊è¡ãããžã§ã¯ãã3æ¬ã»4æ¬ã«ãªã£ãŠã管çã³ã¹ããå¢ããŸããã
æå120äžã®ç°å¢ã¯ãäŒè©±ãã°ã確å®ã«åŒãç¶ããã®ãå€éãã¬ã€ã³ãããã£ãŠããæç«ããŠããŸããèªååã®äŸ¡å€ã¯ãåããããšããã§ã¯ãªããå£ããŠãèªåã§å埩ããŠæ°ã¥ããªãã»ã©åœããåã«åãç¶ãããšããã«çºæ®ãããŸãã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- å¶äœç©ã»èšäºã¯ bokuwalily.com ã«ãŸãšããŠããŸãð¥ïž
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ