äŒç€Ÿéœåã§è§£éãããŠåå ¥ã0ã«ãªã£ãæ¥ãæåã«ç¢ºèªããã®ã¯ãèªåã®èªååãå šéšçããŠããããã ã£ããçãã¯ååããŒã ã£ãã
ãªããã®ä»çµã¿ãå¹ãã®ã
å人éçºã®èªååã20æ¬ãè¶ ããããããããããµã€ã¬ã³ããã¹ããæ¥åžžã«ãªããŸãã
人éã®èªç¥ã«ã¯äžéããããŸãã3æ¬ã®launchdãžã§ããªãæ¯æç®ã§ç¢ºèªã§ããŸãã10æ¬ã«ãªããšé±1ã«ãªããŸãã26æ¬ã«ãªããšââãã確èªããªããªããŸããããã¶ãåããŠãã ããããšããæèŠã§æ¥ã ãéããŠããããããŠæ°ã¥ãããšããæ¢ãŸã£ãŠãã3é±éçµã£ãŠãããããŸãã
ç§ãè§£éçŽåŸã«äœéšããçŸå®ã¯ãŸãã«ããã§ããã坿¥åå ¥ãæ60äžãã£ãé ãèªååã§æ¯ããŠããä»çµã¿ãéãã«æ»ãã§ããŸãããäŒç€Ÿå¡ãšããŠã®çµŠæããã£ãã®ã§èª°ãæ°ã¥ããªãã£ããæå0ã«ãªã£ãŠåããŠããã®ãžã§ãããã€ããæ¢ãŸã£ãŠããã ïŒããå¯èŠåãããŸããã
launchdã®å£ãæ¹ã¯éãã§ãã
macOSã®launchdïŒåžžé§ããŒã¢ã³ç®¡çã®ããã¿ïŒã¯ãã¹ã¯ãªãããã¯ã©ãã·ã¥ãããšäœãèšããã«æ¬¡ã®èµ·åäºå®ãŸã§åŸ
ã¡ãŸããexit 78ãè¿ããŠããŠããlaunchctl listãçŽæ¥å©ããªãéã誰ãç¥ããŸãããç§ã®ç°å¢ã§ã2026幎6æã«com.shun.agentmemoryã6æ¥éã¯ã©ãã·ã¥ã«ãŒãããŠããããšããããŸãããããŒãã¯éããŠããŠãworkerãå±
ãªããåçç¶æ
ãââHTTPãªã¯ãšã¹ãã¯å
šéš404ãè¿ãã®ã«ãããã»ã¹ã ãååšããŠãããæ»æŽ»ç£èŠã®ããããå®è£
ïŒããã»ã¹ååšç¢ºèªã ãïŒã§ã¯å®å
šã«èŠèœãšããŸãã
ããããçµéšããautomation-health.shãããã§ãã¯ããã ããã§ãªããèŠã€ãããå³åº§ã«çŽããèšèšã«ããçç±ã§ãã
äœæ¥ã§ã¯ãªããç°å¢ãã®åé¡
èªååã®å€±æã¯ã¿ã¹ã¯ã®å€±æãšéããŸããã¿ã¹ã¯ã倱æããã°èª°ããæããŸããã§ãç°å¢ãè ã£ãŠããŠãã誰ãæããŸããããã£ãããšãããªãã®çç£æ§ãäžãã£ãŠããã ãã§ãã
æå120äžãæ¯ããŠããã®ã¯åå¥ã®ã¹ã¯ãªãã1æ¬ã§ã¯ãªãããããã絡ã¿åã£ãŠåãç¶ãããç°å¢ãã§ããskill-harvestãauto-skillãçæããäŒè©±ãã°ãKnowledge Baseã«èç©ããObsidian Vaultã«åæããagentmemoryãClaudeéã§èšæ¶ãå ±æããââãã®é£éã®ã©ããäžæ¬ãæ¢ãŸããšãæ°é±éåŸã«ããªããæè¿Claudeã®ææ¡ãèããªããšããæèŠã«ãªããŸããåå ããããã®ã¯ããã«åŸã§ãã
automation-health.shãæ€æ»ããã®ã¯ããŸãã«ãã®é£éã®åãªã³ã¯ã§ããlaunchdã®å®æãžã§ãã ãã§ãªããhookã¹ã¯ãªããã®å®è¡æš©éãskill-harvestã®ãã°é®®åºŠãäŒè©±ãã°ã®æçµæŽæ°ãObsidian Vaultã®èªåæŽæ°ããŒã«ãŒãagentmemoryã®HTTPçéââå
šéšã1ã³ãã³ãã§æšªæããŠãREDã1ã€ã§ãããã°exit 1ã§çµäºããŸãã
[éçºè
] bash ~/.claude/scripts/automation-health.sh
â
exit 0 â ALL GREEN / WARN
exit 1 â RED ãã â StopHookãææ
ãã®exit 1èšèšãéèŠã§ããClaudeã®ã»ãã·ã§ã³çµäºæã«çºç«ããStopHookã«ãã®ã¹ã¯ãªãããçµã¿èŸŒãã°ããClaudeãéãããã³ã«èªååã®å¥åº·ã確èªããããæšæºã«ãªããŸããcronã«å ¥ããã°æ¯æç¢ºèªããŸããã©ã¡ããã確èªããããšæãæå¿ãã«äŸåããªãä»çµã¿ã§ãã
å šäœã®æµã
automation-health.shã¯9ã€ã®ã»ã¯ã·ã§ã³ãé çªã«æ€æ»ããŸããã©ã®ã»ã¯ã·ã§ã³ãåãåºåã¹ã¿ã€ã«ã§ãïŒ
â ç· â æ£åžž
â é» â èŠåïŒèŽåœçã§ã¯ãªããã±ã¢å¿
èŠïŒ
â èµ€ â 倱æïŒexit 1ã®åå ã«ãªãïŒ
å šäœã®æ§é ãã¢ã¹ããŒå³ã§ç€ºããŸãïŒ
bash automation-health.sh
â
ââ [1] launchd ãžã§ã (com.shun.* / com.lily.*)
â å
šplistãã«ãŒã â launchctl list ã§ç
§å
â æªããŒãïŒ â launchctl bootstrap ã§å³èªååæå
¥
â åæå
¥å€±æ â â RED
â åå exit â 0 â â RED
â
ââ [2] hooks (8æ¬ã®ã·ã§ã«ã¹ã¯ãªãã)
â pre_git_guard / pre_secrets_check / pre_env_guard
â post_audit_log / post_format / post_tsc_check
â stop_notify / user_prompt_submit
â äžåš â â RED / å®è¡æš©éãªã â â WARN
â
ââ [3] skill-harvest
â .harvest.log ã®æçµæŽæ°ã48h以å
ã
â
ââ [4] äŒè©±ãã° (Stop hook â é·æèšæ¶)
â ~/Documents/my-knowledge-base/raw/conversations/
â INDEX.md ã®é®®åºŠã24h以å
ã
â
ââ [5] Obsidian Vault 飿º
â hot.md ã®èªåæŽæ°ããŒã«ãŒååšç¢ºèª
â index.md ã®ã«ãã¬ããžïŒå®ãã¡ã€ã«æ°ãšèšèŒããŒãžæ°ã®äžèŽïŒ
â
ââ [5.5] agentmemory ãµãŒã
â launchctl ç¶æ
AND http://localhost:3111/agentmemory/health â 200
â ã©ã¡ãããæ¬ ããŠããŠã â RED
â
ââ [6] remember èšæ¶å±€
â now.md / recent.md / archive.md ã®ååšç¢ºèª
â now.md ã®éè€ããŒã¹ããæ€ç¥ïŒconsolidate é
å»¶ã®å
åïŒ
â
ââ [7] ãã£ã¹ã¯ / æ®éªž
â ~/.claude å®å¹ãµã€ãºïŒ>5GB ã§ âïŒ
â security_warnings_state_*.json ã®æ®éªžæ°
â
ââ [8] 鱿¬¡/ææ¬¡ããã (7æ¬)
â ãã°ãã¡ã€ã«ã®æçµæŽæ°æå» vs 蚱容æéäºç®
â
ââ [9] cron â launchd éè€
åäžã¹ã¯ãªããã䞡系統ã«ç»é²ãããŠããªããã確èª
ïŒç§»è¡åŸã®äºéå®è¡ãã°ãé²ãïŒ
â
fail > 0 â exit 1ïŒRED ããïŒ
warn > 0 â exit 0ïŒèŽåœçåé¡ãªãïŒ
fail = 0, warn = 0 â exit 0ïŒALL GREENïŒ
ã»ã¯ã·ã§ã³[1]ãæ žå¿ââèªåèªå·±ä¿®åŸ©
æãéèŠãªã®ã¯ã»ã¯ã·ã§ã³[1]ã®å®è£ ã§ããããã§ãã¯ããŠå ±åããã ããã®ã¹ã¯ãªãããæžãããšã¯ç°¡åã§ããã§ããããã§ã¯ãREDãèŠãŠæåã§çŽãããšãã人éã®æéãæ®ããŸãã
automation-health.shã®launchdã»ã¯ã·ã§ã³ã¯ãæªããŒãã®ãžã§ããçºèŠããç¬éã«èªåã§åæå
¥ããŸãïŒ
# å
š com.shun.* / com.lily.* plist ãç£èŠãæªããŒããèŠã€ãããåªçã«èªååbootstrap
# ïŒãããç¡ããšããžã§ããlaunchdããå€ããŠããµã€ã¬ã³ãã«çºç«ããªããªãïŒ
uid_num=$(id -u)
for plist in "$HOME_DIR"/Library/LaunchAgents/com.shun.*.plist \
"$HOME_DIR"/Library/LaunchAgents/com.lily.*.plist; do
[ -e "$plist" ] || continue
job=$(basename "$plist" .plist)
line=$(launchctl list 2>/dev/null | grep -E "\b${job}\b")
if [ -z "$line" ]; then
if launchctl bootstrap "gui/${uid_num}" "$plist" 2>/dev/null; then
ok "$job: æªããŒã â èªåã§åããŒããã"
else
ng "$job: æªããŒãã»åããŒã倱æ (æå launchctl bootstrap èŠ)"
fi
else
exitc=$(echo "$line" | awk '{print $2}')
if [ "$exitc" = "0" ] || [ "$exitc" = "-" ]; then
ok "$job: ããŒãæž / last exit=$exitc"
else
ng "$job: last exit=$exitc (åå倱æ)"
fi
fi
done
launchctl listã®2åç®ãexit codeã§ãã0ã¯æ£åžžçµäºã-ã¯ãçŸåšå®è¡äžãŸãã¯ãŸã äžåºŠãèµ·åããŠããªããããã以å€ã®æ°å€ã¯ååã®ç°åžžçµäºã§ããexit 78ïŒèšå®ãšã©ãŒïŒãexit 1ïŒã¹ã¯ãªããå
ãšã©ãŒïŒãéãã«è¿ãç¶ããŠãããžã§ããããã®1ã«ãŒãã§å
šéšææããŸãã
æªããŒãã®å Žåã¯launchctl bootstrap gui/${uid_num} <plist>ã§å³åº§ã«åæå
¥ããŸããgui/${uid_num}ãšããã¿ãŒã²ããæå®ããã€ã³ãã§ãmacOS 10.15以éã®çŸè¡APIã§ãïŒå€ãlaunchctl loadã¯deprecatedã§ãïŒãåæå
¥èªäœã倱æãããšãã ãngïŒREDïŒãšããŠèšé²ããæ¬¡ã®å€å®ã«é²ã¿ãŸãã
ã»ã¯ã·ã§ã³[5.5]ââããã»ã¹ååšç¢ºèªã ãã§ã¯äžååãªçç±
agentmemoryã®ç£èŠãã2段éãã«ãªã£ãŠããã®ã«ã¯çç±ããããŸããã³ãŒãå ã®ã³ã¡ã³ãã«ãã®ãŸãŸæ®ããŠãããŸãïŒ
# 2026-06-11 ç£æ»ã®æèš: launchd ã® exit 78 ã¯ã©ãã·ã¥ã«ãŒãã6æ¥é誰ã«ãæ°ã¥ãããã
# ããã«ãããŒãã¯éãã worker äžåšã§å
šAPI 404ãã®åçç¶æ
ã¯æ»æŽ»ç£èŠã§ã¯èŠããªãã
# launchd ç¶æ
+ /agentmemory/health ã® HTTP 200 ã®äž¡æ¹ãèŠãã
å®éã®ç¢ºèªããžãã¯ã¯ããã§ãïŒ
am_code=$(curl -s -o /dev/null -w '%{http_code}' -m 3 \
http://localhost:3111/agentmemory/health 2>/dev/null || echo 000)
if [ "$am_code" = "200" ]; then ok "皌åäž (pid=$am_pid / health 200)"
elif [ "$am_code" = "000" ]; then ng "ããã»ã¹ã¯å±
ãã port 3111 ç¡å¿ç"
else ng "port 3111 ã¯éãã /agentmemory/health=$am_code â worker äžåšã®åçç¶æ
"
fi
HTTPã®å¿çã³ãŒããŸã§ç¢ºèªããããšã§ããããã»ã¹ã¯çããŠãããAPIã¯æ»ãã§ããããšããåçç¶æ ãæ€åºã§ããŸããåãçºæ³ãagentmemory以å€ã«ã暪å±éã§ããŸãââWebãµãŒããAIã¢ãã«ã®API proxyãanything that serves HTTPã
ã»ã¯ã·ã§ã³[8]ââæå»ããŒã¹ã®æ»æŽ»ç¢ºèª
鱿¬¡ã»ææ¬¡ãããã®æ»æŽ»ã¯ãæåŸã«ãã°ãæžãããæå»ãã§å€å®ããŸãã7æ¬ã®ããããžã§ãã«å¯ŸããŠããããã蚱容æéäºç®ããèšå®ããŠããŸãïŒ
declare -a CRON_JOBS=(
"weekly cleanup-misc:~/.claude/logs/cleanup-misc.log:192" # 鱿¬¡â8æ¥èš±å®¹
"weekly env-audit:~/.claude/logs/env-audit-latest.md:192"
"monthly plugin-purge:~/.claude/logs/plugin-purge.log:744" # ææ¬¡â31æ¥
"weekly plugin-auto-disable:~/.claude/logs/plugin-auto-disable.log:192"
"weekly dotfiles-snapshot:~/.claude/logs/dotfiles-snapshot.log:192"
"weekly agents-index:~/.claude/logs/agents-index.log:192"
"daily plugin-usage:~/.claude/scripts/plugin-audit-latest.md:48" # æ¯æ¥â2æ¥
)
鱿¬¡ãããã¯192æéïŒ8æ¥ïŒãææ¬¡ã¯744æéïŒ31æ¥ïŒãæ¥æ¬¡ã¯48æéã蚱容å€ã§ãããã°ã®mtimeãäºç®ãè¶
éããŠããã°â WARNãšããŠå ±åããŸãããžã§ããå®éã«çºç«ãã蚌æ ã¯ãã°ãžã®æžã蟌ã¿ã ããªã®ã§ããã°ãèŠãããšãäžçªç¢ºå®ã§ãã
å
·äœäŸãšããŠãcom.shun.plugin-auto-disableã®plistãèŠããšïŒ
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key> <integer>6</integer>
<key>Minute</key> <integer>45</integer>
<key>Weekday</key> <integer>0</integer>
</dict>
æ¯é±æ¥ææ¥ã®06:45ã«plugin-auto-disable.sh applyãå®è¡ãããã°ã~/.claude/logs/plugin-auto-disable.logã«è¿œèšããŸãããã®plistãlaunchdã«æ£ããããŒããããŠããŠããã¹ã¯ãªããåŽããšã©ãŒã§çµäºããŠããã°ãã°ã¯æ¢ãŸããŸããã»ã¯ã·ã§ã³[1]ã§ããŒãç¶æ
ã確èªããã»ã¯ã·ã§ã³[8]ã§ãã°ã®é®®åºŠã確èªããââ2å±€ã®ç¢ºèªããã£ãŠã¯ãããŠãæ¬åœã«åããŠããããšèšããŸãã
å®è£ ã®è©³çް
launchctl bootstrap ã䜿ãçç±ââãå€ãAPIããèžãŸãªã
macOSã®launchctlã«ã¯æ°æ§2ã€ã®APIãååšããŸããå€ãæ¹ã¯launchctl load <plist>ãæ°ããæ¹ã¯launchctl bootstrap <target> <plist>ã§ãã
Catalinaãããããlaunchctl loadã¯deprecatedã«ãªããŸãããå®è¡ããŠãåãããšã¯ãããŸããããšã©ãŒã¡ãã»ãŒãžããã°ã«åºããåèµ·ååŸã«æåãå€ããããšããããŸããautomation-health.shã®ã»ã¯ã·ã§ã³[1]ãbootstrapã䜿ã£ãŠããã®ã¯ãã®ããã§ãïŒ
uid_num=$(id -u)
if launchctl bootstrap "gui/${uid_num}" "$plist" 2>/dev/null; then
ok "$job: æªããŒã â èªåã§åããŒããã"
else
ng "$job: æªããŒãã»åããŒã倱æ (æå launchctl bootstrap èŠ)"
fi
gui/${uid_num}ãšããæååãã¿ãŒã²ããã§ããid -uã§ãã°ã€ã³äžãŠãŒã¶ãŒã®UIDïŒéåžžã¯501ïŒãååŸããgui/501ãšããã¿ãŒã²ããã«å¯ŸããŠplistãæå
¥ããŸãããã®ã¿ãŒã²ããæå®ããªããšããã°ã€ã³æžã¿ã®GUIã»ãã·ã§ã³ã§åããžã§ãïŒHomebrew補ããŒã«ãåŒã¶ã¹ã¯ãªããçïŒããããŒã¢ã³ãšããŠç»é²ãããŠããŸããPATHãå
šãéãç°å¢ã§å®è¡ãããåé¡ãèµ·ããŸãã
2>/dev/nullãä»ããçç±ãéèŠã§ãããã§ã«ããŒãæžã¿ã®ãžã§ãã«bootstrapãå©ããšãšã©ãŒãåºãŸããåªçã«å®è¡ã§ããããã«ããããããšã©ãŒåºåãæšãŠãŠæ»ãå€ã ãèŠãèšèšã«ããŠããŸãã
plistã® EnvironmentVariables ãæ»æŽ»ã«é¢ããçç±
com.shun.plugin-auto-disable.plistã®å
é ãèŠããšãPATHãæç€ºçã«æžã蟌ãŸããŠããŸãïŒ
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/Users/âŠ/.nvm/versions/node/v24.13.0/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/âŠ/.local/bin</string>
</dict>
launchdã¯.zshrcã.bashrcãèªã¿ãŸãããçŽ ã®launchdç°å¢ã®PATHã¯/usr/bin:/bin:/usr/sbin:/sbinãããããŸãããnodeãbrewãclaudeããå
šéšèŠããŸããã
ãã®PATHåé¡ã§2åããããŸãããæåã¯nodeç³»ã®ã¹ã¯ãªããããcommand not found: nodeãã§é»ã£ãŠæ»ãã§ããã2åç®ã¯Homebrew補ã®jqãåŒã¶ã¹ã¯ãªãããåãçç±ã§ãµã€ã¬ã³ã倱æããŠãããã¹ã¯ãªããæ¬äœã«äœãåé¡ããªããã¿ãŒããã«ã§æåå®è¡ãããšåãââãã®çç¶ãæã蚺æãã«ããã§ãã
解決çã¯plistã«PATHãæžã蟌ãäžæã§ãã~/.nvm/versions/node/v24.13.0/binã®ããã«ããŒãžã§ã³åºå®ã®ãã¹ã«ãªãã®ãé£ç¹ã§ãããæé»PATHã§é»ã£ãŠå€±æãããããã£ãšãŸãã§ããç§ã¯nodeã®ããŒãžã§ã³ãå€ããããšã«1åãããæŽæ°ãå¿ãã3æ¥éãžã§ããåããŠããªãã£ãããšããããŸãããã以éãnodeç³»ãžã§ãã®plistã«ã¯# nvm version: X.X.Xãšããã³ã¡ã³ããä»ããŠplistæŽæ°ã®ãã£ããã«ããŠããŸãã
ã»ã¯ã·ã§ã³[6]âânow.mdã®éè€ããŒã¹ãæ€ç¥
rememberãã©ã°ã€ã³ã®now.mdã¯ãäŒè©±ããšã«1è¡ãã€èŠçŽã远èšãããŸãã宿çã«Haikusãconsolidateã³ãã³ãã§now.mdârecent.mdâarchive.mdã«ææ Œãããã®ã§ããããã®ææ ŒåŠçãé
å»¶ãããšnow.mdã«åãèŠçŽãäœåè¡ãæºãŸããŸãã
ã¹ã¯ãªããã¯ãã®ãããŒã¹ãããæ€ç¥ããŸãïŒ
dup=$(grep -vE '^\s*$|^##|^#' "$nowf" 2>/dev/null \
| sort | uniq -c | sort -rn | head -1 | awk '{print $1}')
if [ "${dup:-0}" -ge 3 ]; then
wn "now.md ã«åäžèŠçŽã ${dup} å (consolidate é
å»¶ã®å
å)"
else
ok "now.md éè€ãªã (consolidate å¥å
š)"
fi
空è¡ã»èŠåºãè¡ãé€å»ããŠããsort | uniq -cã§åºçŸåæ°ãæ°ããæå€ã®ãã®ãåãåºãââ3å以äžåãè¡ãããã°WARNã§ãããConsolidateã¯Haikusãéåæã§åããŠããããåé¡ãªãããšæã£ãŠããææããããŸããããHaikusãžã®å§è²ãäœããã®çç±ã§æ¢ãŸããšnow.mdãæ°çŸè¡ã«ãªããæ¬¡ã®Consolidateæã«ãå€ãèšæ¶ããšããŠèª€ã£ãŠææ ŒããŠããŸããŸããå®éã«ã2é±éåã®èŠçŽã仿¥ã®éèŠèšæ¶ã«ææ ŒããŠããããšããç¶æ
ã1床çµéšããŠããããã®ãã§ãã¯ã远å ããŸããã
ã»ã¯ã·ã§ã³[9]ââcomm -12ã§äºéç»é²ãçãåºã
cron_sh=$(crontab -l 2>/dev/null | grep -vE '^[[:space:]]*#' \
| grep -oE '/[^ ]+\.sh' | xargs -n1 basename 2>/dev/null | sort -u)
launchd_sh=$(grep -hoE '/[^<> ]+\.sh' \
"$HOME"/Library/LaunchAgents/com.shun.*.plist 2>/dev/null \
| xargs -n1 basename 2>/dev/null | sort -u)
dup=$(comm -12 <(printf '%s\n' "$cron_sh") <(printf '%s\n' "$launchd_sh") \
| grep -vE '^[[:space:]]*$')
commã³ãã³ãã¯2ã€ã®ãœãŒãæžã¿ãªã¹ããåãåãããäž¡æ¹ã«å
±éããè¡ïŒ-12ãªãã·ã§ã³ã§1åç®ã»2åç®ãé衚瀺ã«ããæ®ãïŒããè¿ããŸããcronãšlaunchdã®äž¡æ¹ã«ç»é²ãããŠããã¹ã¯ãªããåã®äžèЧãåããŸãã
ã¹ã¯ãªããã®çµ¶å¯Ÿãã¹ã§ã¯ãªãbasenameïŒãã¡ã€ã«åã ãïŒã§æ¯èŒããŠããã®ã¯ãcronãšlaunchdã§ãã¹ã埮åŠã«éãããšãããããã§ãã~/scripts/foo.shãš$HOME/scripts/foo.shã¯åããã¡ã€ã«ã§ããæå忝èŒã§ã¯å¥ç©ã«ãªããŸãã
ã»ã¯ã·ã§ã³[7]ââãã£ã¹ã¯ãšãŽããã¡ã€ã«ã®2段æ§ã
ãã£ã¹ã¯ãã§ãã¯ã¯ã~/.claudeå
šäœã®ãµã€ãºããšããã©ã°ã€ã³ã®disabledãã£ãã·ã¥ããå¥ã
ã«èšæž¬ããŸãïŒ
cdir_total_mb=$(du -sm "$CLAUDE" 2>/dev/null | awk '{print $1}')
disabled_mb=$(du -sm "$CLAUDE/plugins/.disabled-cache" 2>/dev/null | awk '{print $1}')
cdir_mb=$(( ${cdir_total_mb:-0} - ${disabled_mb:-0} ))
.disabled-cacheã¯plugin-auto-disable.shãäžæéé¿ãããã©ã°ã€ã³ã®å¯éãã£ãã·ã¥ã§ããæå€§ã§1.2GBã«ãªãããšããããŸãããapplyârestoreã§æ»ãããæŽçæžã¿ãŽãããªã®ã§å®å¹ãµã€ãºããé€å€ããŸãããããé€å€ããªããš~/.claudeãåžžæWARNã«ãªãããã€ãºã§æ¬åœã®WARNãåãããŸãã
ç§ãè©°ãŸã£ã話
â ãObsidianã®ã«ãã¬ããžãæ°žä¹ WARNã«ãªã£ããââé ããã£ã¬ã¯ããªã®çœ
ã»ã¯ã·ã§ã³[5]ã®Obsidian飿ºãã§ãã¯ã«ãããããã³ãŒãããããŸãïŒ
real=$(find "$VAULT" -name '*.md' -not -path '*/.*' 2>/dev/null | wc -l | tr -d ' ')
stated=$(grep -oE 'ç·ããŒãžæ°ïŒ[0-9]+' "$vidx" 2>/dev/null \
| grep -oE '[0-9]+' | head -1)
if [ -n "$stated" ] && [ "$stated" = "$real" ]; then
ok "index.md ã«ãã¬ããžäžèŽ (${real}p)"
else
wn "index.md èšèŒ ${stated:-?}p â å® ${real}p (index.md ã®æŽæ°ãå¿
èŠ)"
fi
-not -path '*/.*'ãä»ããŠããŸãããæåã¯ããããããŸããã§ãããObsidianã®å
éšãã¡ã€ã«ã¯.obsidian/ãã£ã¬ã¯ããªã«ãç§ã®èªåããã¯ã¢ããåºåã¯.backup/ã«æ ŒçŽãããŠããŸããã©ã¡ããé ããã£ã¬ã¯ããªïŒå
é ããããïŒã§ãããfindã¯ããã©ã«ãã§ããããæŸããŸãã
index.mdã«ã¯ãç·ããŒãžæ°ïŒ47ããšæžããŠãããã§ãfindã¯.backup/å
ã®å€ãã¹ãããã·ã§ãããå«ããŠ63ä»¶èŠã€ãããindex.mdãæ£ããæŽæ°ããŠã絶察ã«statedãšrealãäžèŽããªãã
çç¶ã¯ãæ¯åWARNãåºããããããããªããã§ãããåå ã«æ°ã¥ããŸã§4æ¥ããããŸãããã¹ã¯ãªããã®ãããã°ãšããŠfind "$VAULT" -name '*.md' | head -20ãå®è¡ãããšãã.backup/2026-06-10/some-page.mdãšããè¡ãèŠãŠããããããããããšãããšãªããŸãããé ããã£ã¬ã¯ããªãé€å€ãã-not -path '*/.*'ã®1ãã©ã°ã§è§£æ±ºããŸããããããã§ãã¯ããžãã¯ãæ£ãããŠãããŒã¿ã®ã¹ã³ãŒããééã£ãŠããã°æ°žä¹
ã«WARNã«ãªãããšããæèšã§ãã
â¡ãcronâlaunchdç§»è¡åŸã6é±éäºéå®è¡ãç¶ããŠããã
ã¹ã¯ãªããå ã®ã³ã¡ã³ãã«ãã®ãŸãŸæ®ããŠãããŸãïŒ
# 2026-06-01: cronâlaunchd ç§»è¡ã§ãcron ãæ¶ãå¿ããŠäž¡æ¹ã«ç»é²ïŒæ¯ãµã€ã¯ã«äºéå®è¡ã
# ãçºçããŠãããããåäžã¹ã¯ãªããã䞡系統ã«ååšããªãããåžžæç£èŠããã
agents-index.shãcronããlaunchdã«ç§»è¡ããŸãããplistãæžããŠããŒãããŠåäœç¢ºèªââå®ç§ã«æããŸããããã ãcronã®å€ããšã³ããªãåé€ãå¿ããŸãããæ¯é±æ¥æã®åãæé垯ã«agents-index.shã2åå®è¡ãããŠããŸããã
6é±éæ°ã¥ããªãã£ãçç±ã¯ãå®å®³ãèŠãã«ããã£ããããã§ããagents-index.shã¯ã¹ãçãªåŠçã§ã2åå®è¡ããŠãåãçµæã«ãªããŸããã€ã³ããã¯ã¹ãå£ããããã§ãããšã©ãŒãã°ãåºãããã§ããªããã§ãæ¯é±2åãäœèšãªCPUæéãšãã°è¿œèšãèµ°ã£ãŠããŸããã
comm -12ã«ããã»ã¯ã·ã§ã³[9]ã®ãã§ãã¯ã远å ããã®ã¯ãã®çµéšããã§ããç§»è¡çŽåŸã«å®è¡ããã°1åã§æ°ã¥ããåé¡ãããã§ãã¯ããªãã£ããã6é±éç¶ããŸããã
â¢ãenv-auditã®ãã°ãã¹ãæ¯åå€ãã£ãŠæ€ç¥ã§ããªãã£ãã
ã»ã¯ã·ã§ã³[8]ã®CRON_JOBSé
åã«ãããããç¹å¥åŠçããããŸãïŒ
if [[ "$path" == *"env-audit-latest.md" ]]; then
real=$(ls -t "$CLAUDE/logs/"env-audit-*.md 2>/dev/null | head -1)
[ -n "$real" ] && path="$real"
fi
env-audit.shã¯å®è¡ã®ãã³ã«env-audit-2026-06-10.mdã®ããã«æ¥ä»å
¥ãã®ãã¡ã€ã«ãçæããŸããåºå®ãã¹ãæããªããããenv-audit-latest.mdãšããããã¬ãŒã¹ãã«ããã¹ããé
åã«æžããŠãããå®éã«ã¯ls -tã§ææ°ãã¡ã€ã«ãæ¢ãç¹å¥åå²ãå
¥ããŠããŸãã
æåã¯ãã©ã®ãã¡ã€ã«ããªãã®ã§log/åºåãªã â NGããšåºç¶ããŸãããCRON_JOBSã®å®çŸ©ãèŠããšç¢ºãã«ååšããªããã¹ãæžããŠããããã¹ã¯ãªãããäžåºŠãåããŠããªãããšå€æããããŸããããls ~/.claude/logs/ã§å®æ
ã確èªãããenv-audit-2026-06-11.mdãååšããŠããŸããã
åºå®ãã¹ãæ³å®ããŠèšèšãããã§ãã¯ããåçåœåã®ã¹ã¯ãªããã«å¯Ÿå¿ã§ããŠããªãã£ããã¹ã¯ãªããã®åºåå ãåºå®ã«ãããããã§ãã¯åŽãåçã«æ¢ãããã©ã¡ããã«çµ±äžããå¿ èŠããããŸããç§ã¯åŸè ïŒãã§ãã¯åŽã§æ¢ãïŒãéžã³ãŸããããçæ³ã¯ãå šãžã§ããåºå®ãã¹ã«ãã°ãæžããèšèšã§ãããã ãæ¢åã¹ã¯ãªãããå šéšæžãçŽãå·¥æ°ã¯æããªãã£ãã®ã§ãç¹å¥åå²ã§åœåº§ã®å¯Ÿå¿ãããŸããã
â£ãagentmemoryã6æ¥éã¯ã©ãã·ã¥ã«ãŒãããŠãããââåçç¶æ ã®çºèŠ
ãããã»ã¯ã·ã§ã³[5.5]ã2段éãã§ãã¯ã«ããçŽæ¥ã®åå ã§ããã³ã¡ã³ãã«æ¥ä»ãŸã§æ®ããŠãããŸãïŒ
# 2026-06-11 ç£æ»ã®æèš: launchd ã® exit 78 ã¯ã©ãã·ã¥ã«ãŒãã6æ¥é誰ã«ãæ°ã¥ãããã
# ããã«ãããŒãã¯éãã worker äžåšã§å
šAPI 404ãã®åçç¶æ
ã¯æ»æŽ»ç£èŠã§ã¯èŠããªãã
# launchd ç¶æ
+ /agentmemory/health ã® HTTP 200 ã®äž¡æ¹ãèŠãã
çç¶ã¯ãClaudeã®èšæ¶ãå
±æãããªããã§ãããäŒè©±Aã§èŠããããšãäŒè©±Bã§åºãŠããªããã§ãClaudeèªäœã¯æ£åžžã«åããŠãããagentmemoryããã»ã¹ã¯ps auxã§èŠããŠããïŒååšããŠããïŒãããŒã3111ãžã®curlã¯ãæ¥ç¶æåŠãã§ã¯ãªããå¿çãªããã§ããã
launchctl list | grep agentmemoryãå©ããšãPIDã-ã§çµäºã³ãŒãã78ãexit 78ã¯launchdèŠçŽã§ãèšå®ãã¡ã€ã«ã®ãšã©ãŒããæå³ããŸããèµ·åããããšããŠã¯ã¯ã©ãã·ã¥ãããŸãèµ·åããããšããŠã¯ã¯ã©ãã·ã¥ããââããã6æ¥éç¹°ãè¿ãããŠããŸããã
ããã»ã¹ååšç¢ºèªã ãã®æ»æŽ»ç£èŠã§ã¯çµ¶å¯Ÿã«ææã§ããŸãããps auxã§ããã»ã¹ãèŠããŠããã¯ã©ãã·ã¥ã«ãŒãäžã®ãŸã³ããã§ããããšããããŸããæ£ç¢ºã«èšããšãlaunchdã¯é£ç¶ã¯ã©ãã·ã¥ãæ€ç¥ãããšãã¹ããããªã³ã°ãã«å
¥ããæ¬¡ã®åèµ·åãæ°åç§åŸã«é
ãããŸãããã®é
å»¶æéå
ã«ããã»ã¹ãã§ãã¯ãæã€ãšãããããšåºãŸãã
http://localhost:3111/agentmemory/healthãžã®curlãçå®ãèªããŸãïŒ
am_code=$(curl -s -o /dev/null -w '%{http_code}' -m 3 \
http://localhost:3111/agentmemory/health 2>/dev/null || echo 000)
if [ "$am_code" = "200" ]; then ok "皌åäž (pid=$am_pid / health 200)"
elif [ "$am_code" = "000" ]; then ng "ããã»ã¹ã¯å±
ãã port 3111 ç¡å¿ç"
else ng "port 3111 ã¯éãã /agentmemory/health=$am_code â worker äžåšã®åçç¶æ
"; fi
000ã¯ãæ¥ç¶èªäœãæç«ããªããïŒããŒããéããŠãããã¿ã€ã ã¢ãŠãïŒã404ã500ã¯ãããŒãã¯éããŠãããworkerãæ©èœããŠããªããããã®3ãã¿ãŒã³ãåºå¥ããããšã§ããèµ·åããŠãããæ©èœããŠããªãããšããåçç¶æ
ãææã§ããŸãã
ãã®çµéšä»¥éãHTTPãæäŸãããã¹ãŠã®ãµãŒãã¹ã«ãã®2段ãã§ãã¯ã暪å±éããŠããŸããlaunchdç¶æ 確èªãšHTTPãã«ã¹ãšã³ããã€ã³ãã®curlââãã®2ã€ãã»ããã§åããŠãæ¬åœã«åããŠããããšèšããŸãã
â€ãnow.mdã1200è¡ã«ãªã£ãŠConsolidateãè©°ãŸã£ãã
4ã€ç®ãšã¯å¥ã®çç¶ãšããŠãããææãããClaudeã®ææ¡ããªããšãªãèãããšæããŸãããå ·äœçã«ã¯ãå é±è©±ããããšãå¿ããŠããããåã説æã2åæ±ããããããšããäœæã§ãã
~/.remember/now.mdãwc -lã§ç¢ºèªããã1247è¡ã§ãããéåžžã¯30ã50è¡çšåºŠã§ããConsolidateåŠçãæ¢ãŸã£ãŠãnow.mdã«1000件以äžã®èŠçŽãç©ã¿äžãã£ãŠããŸããã
åå ã¯Haikusãžã®å§è²ã¿ã¹ã¯ã倱æããŠããããšã§ããConsolidateã¯ããã¯ã°ã©ãŠã³ãã§éåæã«åãããã倱æããŠããŠãèª°ãæ°ã¥ããŸãããã¿ã¹ã¯ãã¥ãŒã«ãšã©ãŒããããæ°ããConsolidateãç©ã¿äžãã£ãŠããã ãã§äžååŠçãããŠããŸããã§ããã
æåã§claude --model haiku -p "~/.remember/now.md ãèªãã§consolidateããŠãã ãã"ãšå®è¡ããŠè§£æ¶ããŸããããæ€ç¥ã1é±éé
ããŸãããã»ã¯ã·ã§ã³[6]ã®éè€ããŒã¹ãæ€ç¥ãå
¥ããã®ã¯ãã®çµéšãçŽæ¥ã®ãã£ããã§ãã
éè€è¡ã3件以äžãããšããã®ã¯ãåãäŒè©±ã«ãŒããäœåºŠãèŠçŽãããããµã€ã³ã§ããæ®éã®äŒè©±ã§ã¯åãèŠçŽã2å以äžnow.mdã«æžãããããšã¯ãããŸããã3ä»¶ãšãããããå€ã¯ãå¶ç¶ã®éè€ããšãConsolidateè©°ãŸãããåããããã«çµéšåã§æ±ºããŸããã
ããã ãã®ãã§ãã¯ãç©ã¿äžããŠãããšããå šéšç·ã§ALL GREENã«ãªãæ¥ããããã«çããããããããŸããç§ã®ç°å¢ã§ã¯æ¯æã ããã1ã2åã®WARNãåºãŸããããããæ£åžžãã§ããWARNã1åããªãæ¥ããããæ€ç¥ã§ããWARNãæ¯æ¥ããããããåŠçã§ããŠããç¶æ ãã®æ¹ãèªååç°å¢ãšããŠã¯å¥å šã ãšæã£ãŠããŸãã
äœãèšããªãã·ã¹ãã ãä¿¡é Œããã®ã¯ãã³ãŒããååšããªãããšãããã°ããªã蚌æ ããšèªããããªãã®ã§ãã
ã€ãŸãããã€ã³ã
p2ã§ã¯ãè©°ãŸã£ã話ãã5æ¬ã¹ããŒãªãŒåœ¢åŒã§æžããŸãããããã§ã¯ãã¹ããŒãªãŒã«ãªããªãã£ãå°å³ãªçœ ããç¶²çŸ ããŸããã©ããå®éã«ãããããŠããŸãã
-
plistã®XMLæ§æã1ç®æééãããš
launchctl bootstrapããError: 125ãããèšããªããåå ã¯äœãããããªããplutil -lint ~/Library/LaunchAgents/com.shun.xxx.plistãå©ããšãUnexpected character '/' at line 18ãã®ããã«å ·äœçãªè¡çªå·ãåºããplistãç·šéãããplutil -lintãèµ°ãããããplistã®ã»ãŒãåæé ãšããŠäœã«å»ãå¿ èŠããããŸãã -
ProgramArgumentså ã®ãªãã€ã¬ã¯ããšStandardOutPathã®äºéæžã蟌ã¿ãcom.shun.plugin-auto-disable.plistãèŠããšãProgramArgumentsã®äžã§>> ~/.claude/logs/plugin-auto-disable.log 2>&1ãšæžããŠããã®ã«ãStandardOutPath/StandardErrorPathã«ãåããã¹ãæžããŠããŸããããã¯æå³çãªèšèšã§ãlaunchdèªäœã®èµ·å倱æïŒplistèªã¿èŸŒã¿ãšã©ãŒçïŒã¯ProgramArgumentså ãªãã€ã¬ã¯ãããåã«èµ·ããStandardErrorPathã«ããèšé²ãããªãããã§ããç¥ããã«ãã©ã¡ãããæ¶ãããšlaunchdèµ·å倱æãç¡é³ã«ãªããŸãã -
macOSã®ã¹ãªãŒãäžã¯
StartCalendarIntervalãã¹ãããããããcom.shun.plugin-auto-disableã¯æ¯é±æ¥æ06:45ã«èµ·åããŸããããã®æå»ã«MacãéããŠããã°çºç«ããŸãããPower Napãæå¹ãªç°å¢ã§ã¯äžéšãžã§ããèµ·åããŸããä¿èšŒãªããã¹ã¯ãªãããçºç«ãããã©ããã®å¯äžã®èšŒæ ã¯ãã°ã®mtimeã ãã§ãââãããautomation-health.shã»ã¯ã·ã§ã³[8]ã®ã192æé以å ã«ãã°ãæŽæ°ãããŠãããããã§ãã¯ãååšããçç±ã§ãããlaunchdã«ç»é²ãã=å¿ ãå®è¡ããããã¯èª€ãã§ãã -
set -uãlaunchdããå®è¡ããã¹ã¯ãªããã«å ¥ãããšã.zshrcå®çŸ©ã®ç°å¢å€æ°ã®æ¬ èœã§exit 1ãã¿ãŒããã«ããæåå®è¡ãããšæ£åžžã«åãã®ã«ãlaunchdããåŒã¶ãšå³èœã¡ãçç¶ãlaunchdç°å¢ã«ã¯$EDITORã$NVM_DIRã¯ååšããŸããã察çã¯2æïŒplistã®EnvironmentVariablesã«å šå¿ èŠå€æ°ãåæããããlaunchdåãã¹ã¯ãªããã§ã¯set -uãå€ããŠ${VAR:-default}ãã¿ãŒã³ã§é²åŸ¡ããã -
plistãç·šéããŠãå€ãèšå®ãlaunchdå ã«æ®ãç¶ããã
automation-health.shã»ã¯ã·ã§ã³[1]ã®èªåre-bootstrapã¯ãæªããŒããã®ãšãã ãæ©èœããŸããæ¢ã«ããŒãæžã¿ã§å€ãèšå®ã®ãŸãŸåããŠãããžã§ãã¯åèµ·åããŠãããŸãããplistã倿Žãããlaunchctl bootout gui/$(id -u) <label>ã§äžåºŠå€ããŠããlaunchctl bootstrap gui/$(id -u) <plist>ã§åæå ¥ãå¿ é ã§ãããã®æé ãç¥ããã«ãplistãæžãæããã®ã«åããå€ãããªããã§1æé溶ãããŸããã -
ãžã§ãã©ãã«ïŒ
<key>Label</key>ã®æååïŒãšplistãã¡ã€ã«åãäžäžèŽã ãšèªåãã§ãã¯ã誀åäœãããããšãã°com.shun.foo.plistã«<string>com.shun.bar</string>ãšæžããšãlaunchctl listã«ã¯com.shun.barãšããŠç»é²ãããŸããautomation-health.shã¯basename "$plist" .plistã§ã©ãã«ãæšå®ããŠgrepããã®ã§ãäžäžèŽããããšãæªããŒãâèªåre-bootstrapâãã§ã«ããŒãæžã¿ã®ãããšã©ãŒâREDããšãã誀å€å®ãåºãŸããã©ãã«ãšãã¡ã€ã«åã¯å¿ ãäžèŽãããã -
ã¯ã©ãã·ã¥ã«ãŒãäžã®ã¹ããããªã³ã°ã§
ps auxã®çµæãã¿ã€ãã³ã°ã«ãã£ãŠå€ãããlaunchdã¯é£ç¶ã¯ã©ãã·ã¥ãæ€ç¥ãããšThrottleIntervalïŒããã©ã«ã10ç§ïŒã§åèµ·åãé å»¶ãããŸããé å»¶æéå ã«ããã»ã¹ã確èªãããšãããªãããæ¬¡ã®èµ·å詊è¡äžã«ç¢ºèªãããšãããããšãªããps aux | grep agentmemoryã ãã§ã¯çå®ãèŠããŸãããlaunchctl list | grep com.shun.agentmemoryã§PIDãšçµäºã³ãŒããåæã«ç¢ºèªããããæ£è§£ã§ãã -
age_hãè¿ã-1ãç®è¡æ¯èŒã§trueãšèªãã§ããŸããage_hã¯ãã¡ã€ã«ãååšããªãå Žå-1ãè¿ããŸãã[ "$a" -le 48 ]ãšããæ¯èŒåŒã¯-1 -le 48ãtrueãšå€å®ããã®ã§ãããã°ãã¡ã€ã«ãªã=鮮床OKããšãã誀å€å®ã«ãªããŸããå®ã³ãŒãã§ã¯[ "$a" -ge 0 ] && [ "$a" -le 48 ]ãšã0以äžãã€X以äžãã®2段æ¯èŒã«ããŠãã®çœ ãé¿ããŠããŸããåããã¿ãŒã³ãã³ããŒãããšãã¯2段æ¯èŒããšã³ããŒããã -
CRON_JOBSé åã®IFSåºåãæå:ããã°ãã¹ãå«ãç°å¢ã§ã¯IFS=":"åå²ã厩ãããIFS=":" read -r name path budget <<< "$entry"ã§:åºåãã«ããŠããã®ã§ãä»®ã«ãã°ãã¹ã«:ãå«ãŸãããš$pathãš$budgetãæå³ããªãäœçœ®ã§å²ããŸããmacOSã®ãã¹ã«:ã¯éåžžå ¥ããªãããæèããã«ã³ãããããšå£ããŸãã -
hookã¹ã¯ãªããã«å®è¡æš©éããªããšClaude Codeãå®å šç¡é³ã§ã¹ãããããã
settings.jsonã§hookãèšå®ããŠãchmod +xãããŠããªããã°hookã¯å®è¡ãããŸããããšã©ãŒããã°ãäœãåºãªããautomation-health.shã»ã¯ã·ã§ã³[2]ã[ ! -x "$f" ]ã§WARNãåºãã®ã¯ãããçç±ã§ããæ°ããhookã远å ãããå¿ ãchmod +xããããŠautomation-health.shãèµ°ãããŠç·ã«ãªãããšã確èªããŠããä¿¡é Œããã -
comm -12ã¯ãœãŒãæžã¿å ¥åãåæã§ãããunsortedã ãšéè€ãèŠèœãšããã»ã¯ã·ã§ã³[9]ã®cron/launchdéè€æ€ç¥ã§comm -12ã䜿ã£ãŠããŸãããããã¯2ã€ã®å ¥åãsort -uæžã¿ã§ããããšãåæã«ããŸããcron_shãlaunchd_shãçæãããã€ãã«sort -uãå ¥ãå¿ãããšãéè€ããã£ãŠãæ€ç¥ãããŸãããå®ã³ãŒãã§ã¯å倿°ã®æåŸã«| sort -uãå ¥ããŠããŸãã
ãã¹ããã©ã¯ãã£ã¹
26æ¬ã®launchdãžã§ããå幎éçšããŠãããããæåããããã°6é±éã®ç¡é³é害ãé²ããããšç¢ºä¿¡ã§ããèšèšæéã10æ¬ä»¥äžãŸãšããŸãã
1. ãžã§ãã©ãã«ãšplistãã¡ã€ã«åãå¿ ãäžèŽããã
<key>Label</key><string>com.shun.hoge</string>ã®ã©ãã«ãšplistãã¡ã€ã«åcom.shun.hoge.plistãäžèŽãããŸããäžäžèŽã¯ãããã°ã³ã¹ããæ°åã«ããŸããlaunchctl list | grep com.shunã§èŠããŠããã©ãã«ãšls ~/Library/LaunchAgents/com.shun*.plistã®ãªã¹ãã1察1ã§å¯Ÿå¿ããŠããç¶æ
ãç¶æããŠãã ããã
2. å šãžã§ãã«EnvironmentVariablesã§PATHãæç€ºãã
launchdã¯.zshrcã.bashrcãèªã¿ãŸãããçŽ ã®launchdç°å¢ã®PATHã¯/usr/bin:/bin:/usr/sbin:/sbinã®ã¿ã§ããnodeãbrewãclaudeããã¹ãŠèŠããªããnodeã®ããŒãžã§ã³ãæŽæ°ããããšã¯plistã®PATHãæŽæ°ãå¿ããã«ãç§ã¯plistå
ã«# nvm version: v24.13.0ãšããã³ã¡ã³ããProgramArgumentsã®çŽåè¡ã«æžããããŒãžã§ã³å€æŽã®éã®ãªãã€ã³ããŒã«ããŠããŸãã
3. launchctl loadãæšãŠãŠlaunchctl bootstrap gui/$(id -u)ã䜿ã
launchctl loadã¯macOS Catalina以édeprecatedãåãããšããããŸããããã°ã«äœãåºãã«æåãå€ããããšããããŸããlaunchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.shun.xxx.plistãçŸè¡APIãUIDååŸã¯id -uïŒæ°å€ã ãåºãïŒã§ãgui/501ã®ãããªã¿ãŒã²ãããçµã¿ç«ãŠãŸãã
4. plistç·šéåŸã¯å¿
ãplutil -lintâbootoutâbootstrapã®3ã¹ããã
plutil -lint ~/Library/LaunchAgents/com.shun.xxx.plist
launchctl bootout "gui/$(id -u)" com.shun.xxx
launchctl bootstrap "gui/$(id -u)" ~/Library/LaunchAgents/com.shun.xxx.plist
ãã®3ã¹ããããæé ãšããŠæ±ºãããplistã®å 容倿Žã¯launchdã«èªååæ ãããŸããã
5. ã·ã§ã«ã¹ã¯ãªããã«æž¡ãåŒæ°ã¯ProgramArgumentså
ã§/bin/zsh -c "..."çµç±ã«ãã
>>ã2>&1ã®ã·ã§ã«ãªãã€ã¬ã¯ãã¯ãProgramArgumentsã«çŽæ¥æžããŠãæ©èœããŸãããlaunchdã¯ã·ã§ã«ãä»ããã«ããã°ã©ã ãå®è¡ããããã§ãã/bin/zsh -c "command >> log 2>&1"ã®ãã¿ãŒã³ã§å
ããcom.shun.plugin-auto-disable.plistãå®éã«ãã®ãã¿ãŒã³ã䜿ã£ãŠããŸãã
6. ãã§ãã¯ã¹ã¯ãªããã¯ãå ±åãããã ãã§ãªããèŠã€ãããçŽããèšèšã«ãã
automation-health.shã®ã»ã¯ã·ã§ã³[1]ããæªããŒããæ€ç¥ãããå³launchctl bootstrapã§åæå
¥ãããèšèšãªã®ã¯ããREDãèŠãŠæåã§çŽãããšãã人éã®æéãçãããã§ããèªååã®ã¢ãã¿ãªã³ã°ã¹ã¯ãªããã人éã®ä»å
¥ãåæã«ããŠããã°ãããã¯ã¢ãã¿ãªã³ã°ã®è²¬ä»»æŸæ£ã§ããèªå修埩ã§ãããã®ã¯èªå修埩ããèªå修埩ã§ããªããã®ïŒåããŒãèªäœã倱æïŒã ãREDãšããŠäººéã«éç¥ããã
7. HTTPãµãŒãã¹ã¯ããã»ã¹ç¢ºèªïŒãã«ã¹ãšã³ããã€ã³ãã®2段確èªã培åºãã
ps aux | grep <process>ã§ããã»ã¹ãååšããŠãããã®ããã»ã¹ãã¯ã©ãã·ã¥ã«ãŒãäžããããŒãã¯éããŠãããworkerãäžåšã®åçç¶æ
ãã§ããããšããããŸãã
am_code=$(curl -s -o /dev/null -w '%{http_code}' -m 3 \
http://localhost:3111/agentmemory/health 2>/dev/null || echo 000)
ãã®ãã¿ãŒã³ã¯agentmemoryã«éãããHTTPãæäŸããå
šãµãŒãã¹ã«æšªå±éã§ããŸãã000=æ¥ç¶äžèœã2xx=æ£åžžããã以å€=ãéããŠãããå£ããŠãããã®3段éã§åºå¥ããŠãã ããã
8. exit 1èšèšã§cron/StopHookããæ©æ¢°çã«æŸããããã«ãã
automation-health.shã¯REDã1ã€ã§ãexit 1ã§çµãããŸããããããã€ã³ãã§ã
bash ~/.claude/scripts/automation-health.sh || say "èªååã«åé¡ããããŸã"
ã®ããã«åŸç¶ã®åŠçã«é£éã§ããŸããStopHookã«çµã¿èŸŒãã°Claude Codeãéãããã³ã«èªåæ€æ»ã«ãªããŸããcronã«å
¥ããã°æ¯æç¢ºèªã«ãªããŸããã確èªããããšæãæå¿ãã«äŸåããªãèšèšã®æ žå¿ã¯exit 1ã§ãã
9. ãžã§ãã®ãã°ã¯åºå®ãã¹ã«æžã蟌ãèšèšã«ãã
automation-health.shã»ã¯ã·ã§ã³[8]ã§ã®å®éã®èŠåŽïŒenv-audit-*.mdãåçåœåã§ãã§ãã¯ã§ããªãã£ãïŒã¯ãããžã§ããåºå®ãã¹ã«ãã°ãæžããªããããšãæ ¹æ¬åå ã§ããæ°ããããããžã§ããæžããšãã¯ãProgramArgumentså
ã§>> ~/.claude/logs/<jobname>.log 2>&1ã®ããã«åºå®ãã¹ãžã®ãªãã€ã¬ã¯ããæšæºãã¿ãŒã³ã«ãããåºå®ãã¹ãžã®æžã蟌ã¿ãããã°ãç£èŠåŽãmtimeãåãã ãã§æ»æŽ»ç¢ºèªã§ããŸãã
10. 鱿¬¡ã»ææ¬¡ã»æ¥æ¬¡ã®èš±å®¹æéäºç®ãçš®å¥ããšã«èšå®ãã
ãã°ã®mtimeãbudget_hour以å
ãåŠãã§æ»æŽ»ãå€å®ãããšããå
šãžã§ãã«åãéŸå€ãé©çšããã®ã¯ééãã§ããæ¥æ¬¡ãããã«192æéïŒ8æ¥ïŒèš±å®¹ãèšå®ããã°ã7æ¥éæ¢ãŸã£ãŠããŠãWARNãåºãŸãããautomation-health.shã§ã¯daily=48h / weekly=192h / monthly=744hãš3çš®ã®äºç®ãå®çŸ©ããŠããŸãã
11. cronãšlaunchdã®ç§»è¡åŸã¯comm -12ã§éè€ãã§ãã¯ãå³å®è¡ãã
cronããlaunchdã«ç§»è¡ãããã®æ¥ã«automation-health.shãèµ°ãããŠãã»ã¯ã·ã§ã³[9]ã®REDããªãããšã確èªããã確èªããªããã°ãç§ã®ããã«6é±éäºéå®è¡ãç¶ããŠãæ°ã¥ããŸããããç§»è¡å®äºãã®å®äºæ¡ä»¶ã«ãautomation-health.shãGREENããå«ããŠãã ããã
12. now.mdã®è¡æ°ãé±1åã¯ç®èŠãã
wc -l ~/.remember/now.mdãé±ã«äžåºŠå©ãã ãã§Consolidateã®è©°ãŸããæ©æçºèŠã§ããŸããæ£åžžæã¯30ã50è¡çšåºŠã§ãã100è¡ãè¶
ããŠããã°èŠæ³šæã300è¡ãè¶
ããŠããã°Consolidateãæ¢ãŸã£ãŠããŸããautomation-health.shã®ã»ã¯ã·ã§ã³[6]ãéè€ããŒã¹ãæ€ç¥ïŒåäžèŠçŽã3å以äžïŒãããŠããŸããããããŸã§ãçç¶ãé²ãã åŸã®æ€ç¥ãã§ããè¡æ°ç¢ºèªã®æ¹ãæ©ãã
13. ALL GREENããç®æšãã«ããªã
æ¯æ1ã2åã®WARNãåºãç¶æ ãæ£åžžã§ãããWARNãåºã=æ€ç¥ç³»ãçããŠãããã§ããããWARNãäžååºãªãæ¥ãã®æ¹ããããäžèªç¶ã§ããç®æšã¯ãREDããŒãã«ä¿ã€ãã§ããããWARNããŒãã«ä¿ã€ãã§ã¯ãããŸãããWARNãå šéšæ¶ãããšãããšããã§ãã¯ã®ãããå€ãçãããŠWARNãé ãæ¹åã«èªæãããŸããäœãèšããªãã·ã¹ãã ãä¿¡é Œããã®ã¯ãã³ãŒããååšããªãããšãããã°ããªã蚌æ ããšèªãè¡çºãšåãã§ãã
ãŸãšã
è§£éãããæ¥ã«ãèªååã®ååãæ¢ãŸã£ãŠããããšæžããŸããããã®ãšãautomation-health.shãããã°ãæ¢ãŸã£ãã®ãè§£éã®3é±éåã ãšããããåå
¥ãŒãã§ãåå 調æ»ãããã3æ¥éã¯æ¶ããŠããŸããã
æå120äžãæ¯ããŠããã®ã¯ã©ã®1æ¬ã®ã¹ã¯ãªããã§ããªãã26æ¬ã絡ã¿åã£ãŠåãç¶ãããç°å¢ãã§ãããã®ç°å¢ã®å¥åº·ã1ã³ãã³ãã§æšªæç¢ºèªããåé¡ãèªå修埩ããexit 1ã§cron/StopHookã«æŸãããââãã®èšèšã®æ©æµã¯èªååã®æ¬æ°ãå¢ããã»ã©å€§ãããªããŸãã
launchdã¯å£ããŠãäœãèšããŸãããã ããç§ãã¡ãæ¯æ1åãæ©æ¢°ã«èãä»çµã¿ãäœããããªãã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- å¶äœç©ã»èšäºã¯ bokuwalily.com ã«ãŸãšããŠããŸãð¥ïž
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ