äŒè©±ãã°ãObsidianã®é·æèšæ¶ã«å€ãã â æ¯æ©èªåã§èžçãããã€ãã©ã€ã³
ãClaude Codeç°å¢ãã·ãªãŒãºã§ããèšæ¶ã4å±€ã«åãã話ã§ãäŒè©±ãã°ïŒå±€1ããObsidian VaultïŒå±€4ããšæžããŸããããä»åã¯ãã®å±€1ããå±€4ãžæ¯æ©èªåã§èžçããé 管ã®å®è£ ãæžããŸãã
äŒè©±ãã°ã¯çã®ãŸãŸã ãšå·šå€§ã§èªããŸãããäžæ¹Obsidianã®äººéWikiã¯æ§é åãããé·æèšæ¶ã§ãããã®2ã€ããæ¯æ©ãçŽè¿28æéåã ãããã¡ã€ã³æ§é ãå®ã£ãŠè¿œèšãããã®ãç¡äººã§åããŠããŸãããã£ãŠã¿ãŠåãã£ããµã€ã¬ã³ã倱æã®æœ°ãæ¹ãšæé ãããªã仿ããããã®èšäºã®äžèº«ã§ãã
å šäœåïŒæ¡å â èžç â ããã¯ã¢ãã
launchdããæ¯æèµ·åããŠããããŸãã«3å·¥çšã§ãã
- æ¡åïŒäŒè©±ãã°ïŒå±€1ïŒãææ°åããïŒ
extract_conversations.pyïŒ - èžçïŒ
claude -pãããã¬ã¹ã§ãçŽè¿28æéã®å·®åã ããVaultã®è©²åœãã¡ã€ã³ã«è¿œèš - ããã¯ã¢ããïŒæ¯å
git commit+ private repo ã« pushïŒèããŠãrevertå¯èœïŒ
èžçã¯ãœãŒã¹å¥ã«2æ¬ïŒClaudeäŒè©±ãšCodexäŒè©±ïŒã«åããŠããŸããçç±ã¯åŸè¿°ããŸããã1æ¬ã«ãŸãšãããšæéæ ã«åãŸããæ¯æ©timeoutããŠããããã§ãã
çœ 1ïŒlaunchdããã¯ä¿è·ãã©ã«ãã«è§ŠããªãïŒTCCïŒ
æåã«å
šéšè©°ãŸã£ãã®ãããã§ããVaultã¯iCloudåæã® ~/Documents é
äžã«ãããmacOSã®TCCïŒãã©ã€ãã·ãŒä¿è·ïŒã§å®ãããŠããŸããlaunchdãã git ãèµ°ãããŠããä¿è·é åã«æžããã«å€±æããã
ãããåä»ãªã®ã¯ããããããµã€ã¬ã³ã倱æãã«ãªããããããšãã ããããªãã©ã€ãã§æ©ææ€ç¥ããŠå€§å£°ã§ãã°ïŒéç¥ããŸãã
# launchdé
äžã§ã¯ ~/Documents(ä¿è·é å) ã«è§Šããªãå Žåãããã
# ããã§æ©ææ€ç¥ãããµã€ã¬ã³ã倱æ(exit 0åœè£
)ãé²ãã
if ! ( cd "$VAULT" && git rev-parse --git-dir >/dev/null 2>&1 ); then
echo "â FDAæªä»äž: launchdãã '$VAULT' ã«ã¢ã¯ã»ã¹äžå¯(TCCä¿è·)" >> "$LOG"
notify_fail "FDAæªä»äžïŒèšå®âãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹â/bin/bash ãèš±å¯ïŒ"
exit 1
fi
解決ã¯ãã·ã¹ãã èšå® â ãã©ã€ãã·ãŒãšã»ãã¥ãªã㣠â ãã«ãã£ã¹ã¯ã¢ã¯ã»ã¹ ã§ /bin/bash ãèš±å¯ããã¹ã¯ãªããèªèº«ã¯ä¿è·å€ïŒ~/.claude/scripts/ïŒã«çœ®ããŸãã~/Documents ã«çœ®ããšlaunchdããexecã§ããŸããã
symlinkã§
~/ã«éããæ¡ã詊ããŸããããiCloudãsymlinkãç«¶ååŠçããŠå£ãããäžå¯ã§ãããä¿è·é åãšiCloudåæãéãªããšãçŽæã«åããå¶çŽãå¢ããŸããã¹ã¯ãªããã¯ä¿è·å€ã»ããŒã¿ã¯ä¿è·å ããšçœ®ãå Žæãå²ãåãã®ãå®å®ããŸãã
çœ 2ïŒã¹ãªãŒããšäºéå®è¡ â èªå·±å埩åã«ãã
èãéããŠã¹ãªãŒããããšãå€éãžã§ãã¯åçµããŸããcaffeinate -s ã¯AC黿ºæããå¹ããªãã®ã§ãããããªãŒé§åã ãšæ®éã«æ¢ãŸããããã§**ãæåãããŸã§è€æ°ã¹ãããã§å詊è¡ãæåãããå³çµäºã**ã®èªå·±å埩åã«ããŸããã
- plist㯠4:55 / 8:15 / 10:15 / 12:15 ãªã©è€æ°ã¹ãããã§çºç«
- æ¬æ¥åãæåæžã¿ãªããåŸç¶ã¹ããã㯠done ããŒã«ãŒãèŠãŠå³
exit 0ïŒç©ºæ¯ãã§ãã°ãæ±ããªãïŒ - äºéå®è¡ã¯
mkdirããã¯ã§æé€ïŒããã»ã¹æ»æŽ»ã§staleãèªåååïŒ
DONE_MARKER="$HOME/.claude/logs/.vault-ingest-done-${TODAY}"
[ -f "$DONE_MARKER" ] && exit 0 # æ¬æ¥æåæžã¿ãªãå³çµäº
èžçã2æ¬ïŒClaude/CodexïŒã«å²ã£ãã®ãåãçç±ã§ããæŽ»åã®å€ãæ¥ã¯28æéåã®ãã°æ¶åïŒèšäºãªã©ã€ãã40åæ ã«åãŸãã飿¥timeoutãããããåå ã§ããããã£ãã·ã¥ãåçµããŠããŸããããµãã¹ãããããšã«ç¬ç«ããŒã«ãŒãæãããçæ¹ãtimeoutããŠã次ã¹ããããæ®ãã ãå詊è¡ããŸãã
æé ãããªãïŒground truth ãå¥ã«æã€
ããããã¡ã°ã倧äºãªåŠã³ã§ããclaude -p ã«ãäŒè©±ãã°ãã仿¥ã®ããªãŒããæžãããšæãããšãããŒãã«ç¡ãäºå®ã®æææéãæèŠæ¥æ°ãããããããåµäœããããšããããŸããããM/DãM/Dããšããæ£æãèŠãŠããã®æéãã£ãšææãããããšèšããŸããŠããŸãã
察çã¯2ã€ã§ãã
â ã«ã¬ã³ããŒã®å®äœã¹ãããã·ã§ãããæ£å žã«ããã æ£æã§ã¯ãªããGoogle Calendar APIããåã£ãæå»ä»ãã®äºå®ã ground truth ãšããŠå¥ãã¡ã€ã«ã«èœãšããããããå¯äžã®æ£å žã¹ã±ãžã¥ãŒã«ãšããŠèªãããšæç€ºããŸãã
â¡ ååŸå€±ææã¯last-known-goodãæž©åããã APIã倱æããŠããæ£å
žãç©ºã§æœ°ããªããååæåæã®å€ã stale å°ä»ãã§æ®ããŸãã
if [ -n "$CAL_SRC" ]; then
cp "$CAL_TMP" "$CAL_SNAPSHOT"; cp "$CAL_SNAPSHOT" "$CAL_LASTGOOD"
elif [ -s "$CAL_LASTGOOD" ]; then
# ååŸå€±æ: åågoodãæž©åã â ïžstale å°ã§åæ§ç¯ïŒlast-known-goodïŒ
{ echo "â ïž æ¬æ¥ååŸå€±æã以äžã¯ååæåæç¹ã®å€(stale)ã"; tail -n +4 "$CAL_LASTGOOD"; } > "$CAL_SNAPSHOT"
fi
ãããŠããã³ããåŽã§ã匷ãçžããŸãããããŒãã«ç¡ãæ å ±ãæšæž¬ã§è¶³ããªããæ¥ä»ã»æéã®äž»åŒµã¯ç¢ºå®æ å ±ãšæšæž¬ãæç€ºçã«åããããAIã«é·æèšæ¶ãæžããããªããåµäœã®äœå°ãæ§é ã§æœ°ããããããŸããã
鮮床å€å®ïŒå€ãææç©ãã仿¥ã®ææããšèª€èªããªã
ããªãŒããæ¥ä»ã€ãã§ã¢ãŒã«ã€ããããšããããã®ã©ã³ã®éå§æå»ããæ°ãããã¡ã€ã«ã ããã仿¥ã®ææãšèªããŸãã
START_STAMP=$(mktemp ...) # ã©ã³éå§æå»ã¹ã¿ã³ã
# ...çæ...
if [ -s "$BRIEF_SRC" ] && [ "$BRIEF_SRC" -nt "$START_STAMP" ]; then
cp "$BRIEF_SRC" "$ARCH_FILE"; touch "$DONE_MARKER" # æ°ããæã ãå®äºæ±ã
else
notify_fail "ããªãŒãæªå® â æ¬¡ã¹ãããã§èªåå詊è¡" # å€ããŸãŸïŒå€±æãå詊è¡ãž
fi
ãããç¡ããšãçæãtimeoutããŠãã忥ã®å€ãããªãŒãããã³ããŒããŠãæåããšèšé²ããŠããŸãã鮮床ãmtimeã§å€å®ããããšã§ã倱æãæåã«åœè£ ããªãããã«ããŠããŸãã
èžãã èœãšã穎
- launchdããä¿è·é åã«æžãããµã€ã¬ã³ã倱æ â TCCããªãã©ã€ãã§æ©ææ€ç¥ã»FDAä»äž
- symlinkã§ä¿è·å€ã«éããæ¡ â iCloudãç«¶ååŠçã§å£ããäžå¯
- ã¹ãªãŒãåçµã»äºéå®è¡ â è€æ°ã¹ãããå詊è¡ïŒmkdirããã¯ïŒdoneããŒã«ãŒ
- 28håã1æ¬ã ãšæ è¶ éã§é£æ¥timeout â ãœãŒã¹å¥2æ¬ïŒãµãç¬ç«ããŒã«ãŒ
- äºå®ã®æææéãåµäœ â ã«ã¬ã³ããŒå®äœãæ£å žåïŒlast-known-goodïŒæšæž¬çŠæ¢ããã³ãã
- å€ãææç©ã仿¥ã®ææãšèª€èª â ã©ã³éå§ã¹ã¿ã³ãããæ°ããæã ãå®äºæ±ã
ãŸãšã
- äŒè©±ãã°ïŒå±€1ïŒâ ObsidianïŒå±€4ïŒãæ¯æ©ã»çŽè¿28hå·®åã ãèªåèžç
- ä¿è·é åã¯TCCã§åŒŸããããæ©ææ€ç¥ã§å€§å£°ããµã€ã¬ã³ã倱æãèš±ããªã
- ã¹ãªãŒãã»äºéå®è¡ã¯è€æ°ã¹ãããå詊è¡ïŒããã¯ïŒdoneããŒã«ãŒã§èªå·±å埩
- AIã«èšæ¶ãæžããããªãground truthãå¥ã«æã¡ãæšæž¬ãæ§é ã§çŠãã
- mtime鮮床å€å®ã§å€±æãæåã«åœè£ ãããªã
次åã¯ããã®ç¡äººãžã§ãã®èŠªç ââ Claude Codeã®èªåŸã«ãŒãã24æéåããã³ã¹ãã§æŽèµ°ãæ¢ãããæžããŸãã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- äœã£ãã¢ããªã¯ ããŒããã©ãªãª ã«ãŸãšããŠããŸãð±
- æ°çã»éçºã®è£åŽã¯ X @bokuwalily ã§çºä¿¡ããŠããŸãð
- OSS: github.com/bokuwalily ð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ