æå0åããåå¹Žã§æå120äžãŸã§å±ããèªåŸç°å¢ã¯ã2026幎9æ1æ¥ 13:31 JSTãopen -a "Google Chrome" ããšã©ãŒã³ãŒã -600 ãè¿ããŠæ²é»ããããšã§ãæ ¹æ¬ããèšèšãçŽãããšã«ãªããŸããã
ãªããã®ä»çµã¿ãå¹ãã®ã
å人éçºã®èªååãäžå®ã®èŠæš¡ãè¶ ãããšãå¿ ãã¶ã€ããåé¡ããããŸããããžã§ãã¯åããŠããã®ã«ããã€ãããèªåã®äœæ¥ç°å¢ãå£ããŠããããšããç¶æ ã§ãã
2026幎9æ1æ¥ã®æãLily ã® Mac ã§ã¯ headless ã® Chrome ã3æ¬ãheadful ã1æ¬ãåèš4ããã»ã¹ãåæã«èµ°ã£ãŠããŸãããSNS ã®èªåãããããµã ãã€ã«çæãã¢ã«ãŠã³ãå¥ã®ãããã¡ã€ã«ç®¡çããããããç¬ç«ãããžã§ããšã㊠Playwright ãåŒãã§ããŸããããã®å
šå¡ã /Applications/Google Chrome.app/Contents/MacOS/Google Chrome ãçŽæ¥ exec ããŠãããããã ãã®ããšã§ãã
macOS ã® LaunchServices ã¯ãåäžã® CFBundleIdentifier ãæã€ã¢ããªããåãã¢ããªã®1ã€ã³ã¹ã¿ã³ã¹ããšããŠæ±ããŸãã Google Chrome ã® bundle ID 㯠com.google.Chromeãèªååãžã§ããå
ã«ãã® bundle ID ãæã€ããã»ã¹ãèµ·åããŠãããšãDock ãã¹ãããã©ã€ããã open -a "Google Chrome" ãæã£ãŠã OS ã¯ããã®ã¢ããªã¯ãã§ã«èµ·åäžã ãããæ¢åã®åé¢ãŠã£ã³ããŠãåºãã°ããããšå€æããŸãããããèªååããã»ã¹ã¯ãŠã£ã³ããŠãæããªãå Žåãã»ãšãã©ã§ãã人éãèŠã Chrome ãŠã£ã³ããŠã¯è¿ã£ãŠããªããããã -600 (procNotFound) ã®æ£äœã§ãã
ãã®åé¡ã®åä»ãªç¹ã¯ãçºçãããŸã§ãŸã£ããæ°ã¥ããªãããšã§ããèªååãžã§ãã¯æ£åžžã«åããŠããŸããexit code 㯠0 ã§ãããã°ãã¯ãªãŒã³ã§ãããã ã人éã Chrome ã䜿ãããšãããšãã ããäœãèµ·ããŸããã
äžè¬ã«ããã®åé¡ã¯ãèªååãžã§ããå¢ããã»ã©ç¢ºçãäžããããšããæ§è³ªãæã£ãŠããŸãããžã§ãã1æ¬ãªã Chrome ãæŽãã§ããæéã¯çãã3æ¬ã5æ¬ã10æ¬ãšå¢ããã«ã€ããChrome ãåžžæããããã®ãžã§ãã«æŒãããããŠããç¶æ ãåžžæ åããŸããæåãäžããããšããŠèªååãç©ã¿å¢ãã»ã©ãæ¬äœã® Chrome ã䜿ããªããªãæéã䌞ã³ããå æãé転ããŠããŸãã
è§£æ±ºã®æ¹åã¯2ã€èããããŸãããäžã€ã¯èªååãžã§ãã Chrome ã䜿ãçµãã£ããå¿ ã kill ãããããäžã€ã¯èªååå°çšã®ãã©ãŠã¶ã人éçšã® Chrome ãšååã®æ®µéããåé¢ãããåè ã¯ãžã§ãã®çµäºã¿ã€ãã³ã°ãå šä»¶ç®¡çããªããã°ãªãããæ°ãããžã§ãã远å ãããã³ã«æŒããçãŸããŸããåŸè ã¯äžåºŠäœã£ãŠããŸãã° OS ã¬ãã«ã§å¹²æžãæ¶ãããæä¹ çã¯åŸè ãããããŸããã
/Applications/Chrome Automation.app ãšããååã®å¥ãã³ãã«ãäœããbundle ID ã com.google.ChromeAutomation ã«å€æŽãããOS ããèŠãã°å®å
šã«å¥ã®ã¢ããªã§ããLaunchServices 㯠com.google.Chrome ãš com.google.ChromeAutomation ãå¥ã
ã«ç®¡çããŸããèªååãäœæ¬ Chrome Automation ãç«ã¡äžããããšã人éã® open -a "Google Chrome" ã¯å¥ã® bundle ID ãæ¢ãã®ã§åœ±é¿ãåããŸããã
ãã®ä»çµã¿ãå¹ãçç±ãäžè¡ã§èšãã°ãããªãœãŒã¹ã®ç«¶åã¯ãååãåããæç¹ã§æ¶ãããã§ããåãååãå ±æããŠããéã¯ãã©ã¡ãããæ®ºãã°ããäžæ¹ãæ»ã¬æ§é ã«ãªããŸããååãåããã°ãOS ã代ããã«éé¢ããŠãããŸãã
ãã ããããã«ã¯äžã€åä»ãªå®è£ äžã®å£ããããŸãã
Playwright ã® channel: 'chrome' ãªãã·ã§ã³ã¯ãèµ·åãããã©ãŠã¶ã®ãã¹ãå
éšãã¡ã€ã« playwright-core/lib/coreBundle.js ã«æžããŠããŸãããã®ãã¡ã€ã«ã¯ node_modules ã®äžã«ãããŸããnpm install ãå®è¡ãããã³ã«äžæžããã㊠/Applications/Google Chrome.app ã«æ»ããŸãã
ã€ãŸãããã¹ãæžãæããŠã宿çã«å ã«æ»ãããã®ãæ»ãããšããäºå®ãåæã«èšèšããããšããå®å®éçšã®éµã«ãªããŸãããæ»ãããšãèŠè¶ããŠã宿çã«è²ŒãçŽãããããã6æéããšã®èªå·±ä¿®åŸ©ã¹ã¯ãªããã®ååšæçŸ©ã§ãã
å šäœã®æµã
ã·ã¹ãã å šäœã®æ§æãå³ã§ç€ºããŸãã
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â npm installïŒãã€èµ°ããããããªãïŒ â
â â â
â playwright-core/lib/coreBundle.js â
â "...Google Chrome.app/Contents/MacOS/Google Chrome" â â å
ã«æ»ã
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
âæå€§6æé以å
ã«æ€ç¥
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â launchd com.shun.chrome-automation-repair â
â StartInterval: 21600ïŒ6æéããšïŒRunAtLoad: true â
â â â
â ~/.claude/scripts/chrome-automation-repair.sh â
â â
â 1. keychain_gate() â --use-mock-keychain æªèšå®ãèŠå â
â â
â 2. ããŒãžã§ã³æ¯èŒ â
â src_verïŒGoogle Chrome.appïŒ â
â dst_verïŒChrome Automation.appïŒ â
â äžèŽ â ã¹ããã â
â äžäžèŽ or äžåš â rebuild â
â cp -R /Applications/Google Chrome.app â
â /Applications/Chrome Automation.app â
â PlistBuddy: CFBundleIdentifier â
â â com.google.ChromeAutomation â
â PlistBuddy: CFBundleName â
â â Chrome Automation â
â codesign --force --deep --sign - â â ad-hoc å眲å
â â
â 3. playwright-core ã glob ã§æ€çŽ¢ïŒfind ããéãïŒ â
â ~/dev/*/node_modules/playwright-core/lib/coreBundle.jsâ
â ~/content/*/node_modules/playwright-core/... â
â â»ãã¹ã4éå±€ãŸã§å¯Ÿå¿ â
â sed: Google Chrome.app ã®ãã¹ â AUTO_BIN ã«çœ®æ â
â patched=N already=M â
â patched+already==0 â exit 1ïŒç¡é³æåãé²ãïŒ â
â â
â ãã°: ~/.claude/logs/chrome-automation-repair.log â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ãããæžã¿
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â playwright channel:'chrome' ã®è§£æ±ºå
â
â /Applications/Chrome Automation.app/ â
â Contents/MacOS/Google Chrome â â èªååãã³ãã«
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â å®å
šã«ç¬ç«
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â open -a "Google Chrome" â
â com.google.Chrome â 人éã® ChromeïŒå¹²æžãªãïŒ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ã¹ã¯ãªããã®æ žãšãªãéšåãå®ã³ãŒãã§ç¢ºèªããŸãããã
ãã³ãã«äœæãšããŒãžã§ã³ç®¡ç
SRC="/Applications/Google Chrome.app"
DST="/Applications/Chrome Automation.app"
BUNDLE_ID="com.google.ChromeAutomation"
AUTO_BIN="$DST/Contents/MacOS/Google Chrome"
ver() { /usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" \
"$1/Contents/Info.plist" 2>/dev/null; }
src_ver="$(ver "$SRC")"
dst_ver="$(ver "$DST")"
if [ ! -d "$DST" ] || [ "$src_ver" != "$dst_ver" ]; then
cp -R "$SRC" "$DST"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_ID" \
"$DST/Contents/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleName Chrome Automation" \
"$DST/Contents/Info.plist"
codesign --force --deep --sign - "$DST"
fi
ver() 颿°ã¯ PlistBuddy ã§ CFBundleShortVersionStringïŒäŸïŒ127.0.6533.120ïŒãèªã¿åºããŸããGoogle Chrome ãèªåã¢ããããŒããããš src_ver ãš dst_ver ããºã¬ããããæ¬¡ã®6æéãµã€ã¯ã«ã§èªåçã« Chrome Automation.app ãäœãçŽããŸãã
codesign --force --deep --sign - ã® -ïŒãã€ãã¹ïŒã¯ad-hoc 眲åãæå³ããŸããInfo.plist ã® bundle ID ãæžãæããæç¹ã§ Google ãä»ãã眲åã¯ç¡å¹ã«ãªããŸããå眲åãªãã§èµ·åããããšãããšãã«ããŒããã»ã¹ã SIGKILLïŒexit 137ïŒã§å³æ»ããŸããad-hoc 眲åã¯ä¿¡é Œãã§ãŒã³ãæããªãèªå·±çœ²åã§ãããããŒã«ã«å®è¡ã®ã¿ãªãåé¡ãããŸããã
playwright-core ã® glob æ€çŽ¢ãšããã
SCAN_ROOTS=("${HOME}/dev" "${HOME}/content")
list_core_bundles() {
local root sub
shopt -s nullglob
for root in "${SCAN_ROOTS[@]}"; do
for sub in \
"$root"/*/node_modules/playwright-core/lib/coreBundle.js \
"$root"/*/node_modules/playwright/node_modules/playwright-core/lib/coreBundle.js \
"$root"/*/*/node_modules/playwright-core/lib/coreBundle.js \
"$root"/*/*/node_modules/playwright/node_modules/playwright-core/lib/coreBundle.js
do
[ -f "$sub" ] && echo "$sub"
done
done
shopt -u nullglob
}
~/dev ãš ~/content 以äžã®ãªããžããªãæå€§4é局㮠glob ãã¿ãŒã³ã§èããŸããfind . -name "coreBundle.js" ã§å
šããªãŒãèµ°æ»ãããš4åããããšããããå®éã«ååšããã¬ã€ã¢ãŠãïŒ*/node_modules/playwright-core/... ã */node_modules/playwright/node_modules/playwright-core/... ã®2ãã¿ãŒã³ïŒãçŽæ¥ glob ã§å©ãããšã§å®è¡æéã 0.95ç§ ã«æããŠããŸãã
ãããé©çšéšå㯠sed -i '' ã«ããã€ã³ãã¬ãŒã¹çœ®æã§ãïŒ
patched=0; already=0
while IFS= read -r f; do
if /usr/bin/grep -q "$SRC/Contents/MacOS/Google Chrome" "$f" 2>/dev/null; then
/usr/bin/sed -i '' \
"s|$SRC/Contents/MacOS/Google Chrome|$AUTO_BIN|g" "$f" \
&& patched=$((patched+1))
elif /usr/bin/grep -q "$AUTO_BIN" "$f" 2>/dev/null; then
already=$((already+1))
fi
done < <(list_core_bundles)
if [ $((patched + already)) -eq 0 ]; then
log "ERROR: playwright-core ã1ä»¶ãèŠã€ãããªããSCAN_ROOTS ã確èªããã"
exit 1
fi
patched ã¯ä»åæžãæããä»¶æ°ãalready ã¯ãã§ã«ãããæžã¿ã®ä»¶æ°ã§ããäž¡æ¹ã0ã®å Žåãæ¢çŽ¢ãã¹ãå£ããŠããŠäœãèŠã€ãã£ãŠããªãããšãæå³ããŸããã0ä»¶ã ãã©æåæ±ãããé²ãããã« exit 1 ã§æç€ºçã«å€±æãããŸãããã®fail-loud èšèšã¯åŸã«ãªã£ãŠããªãçŽã£ãŠããªãã®ã«6æéæ°ã¥ããªãã£ãã®ãããšããçåãé²ããŸãã
launchd ã«ãã宿å®è¡
<key>StartInterval</key><integer>21600</integer>
<key>RunAtLoad</key><true/>
<key>LowPriorityIO</key><true/>
<key>Nice</key><integer>10</integer>
<key>ProcessType</key><string>Background</string>
<key>StandardOutPath</key>
<string>~/.claude/logs/chrome-automation-repair.log</string>
StartInterval: 21600 㯠21600ç§ = 6æéã§ããRunAtLoad: true ãªã®ã§ launchctl load ããç¬éã«ãäžåºŠèµ°ããŸããNice: 10 ãš LowPriorityIO: true ã§ CPUã»ãã£ã¹ã¯ã®åªå
床ãäžããããã¯ã°ã©ãŠã³ãã§äººéã®äœæ¥ã劚ããªãèšå®ã«ããŠããŸãã
6æéãšããééã®æå³ã¯ããnpm install ãèµ°ã£ãŠããæå€§6æé以å
ã«èªå修埩ããããšãã SLA ã§ããå®éã«èªååãžã§ãã npm install ãå©ãé »åºŠã¯äœããããã»ãšãã©ã®å Žåã¯æ¬¡ã®ãµã€ã¯ã«ãæ¥ãåã«ããããæ»ãããšã¯ãããŸãããäžãäžæ»ã£ãŠã6æéåŸã«ã¯çŽã£ãŠããããã®ãçŽãçªã®é·ãããæ¢ç¥ã®ãªã¹ã¯ãšããŠåãå
¥ããèšèšã§ãã
Keychain ã²ãŒãã®æ€ç¥
ã¹ã¯ãªããã®åé ã« keychain_gate() ãšããæ€ç¥åŠçããããŸãïŒ
keychain_gate() {
local hits
hits=$(grep -rIl --include='*.sh' --include='*.py' --include='*.js' \
--exclude-dir=node_modules ... \
-E 'Chrome Automation\.app/Contents/MacOS|Google Chrome\.app/Contents/MacOS' \
"${SCAN_ROOTS[@]}" ~/.claude/scripts 2>/dev/null \
| xargs -I{} grep -l -e '--headless' {} 2>/dev/null \
| xargs -I{} grep -L -e 'use-mock-keychain' {} 2>/dev/null \
| grep -v 'scent-media/scripts/ensure_chrome.sh' || true)
if [[ -n "$hits" ]]; then
log "WARNING: --use-mock-keychain ç¡ãã§Chromeãheadlessèµ·åããŠãã..."
echo "$hits" | sed 's/^/ /'
fi
}
Chrome Automation.app 㯠ad-hoc 眲åãªã®ã§ãmacOS Keychain ã®ãChrome Safe StorageãACL ãããåžžã«èš±å¯ããä»ããŠããChrome ã¢ããããŒãã§åãã«ããããã³ã« code hash ãå€ãã£ãŠèš±å¯ãç¡å¹ã«ãªããŸããheadless èµ·åæã« --use-mock-keychain --password-store=basic ãä»ããŠããªãã¹ã¯ãªããã¯ãKeychain ãžã®ã¢ã¯ã»ã¹ãã€ã¢ãã°ãæ¯åãããã¢ããããåå ã«ãªããŸãããããèªååã®ãç¡é³å€±æãã«ç¹ãããããä¿®æ£ã¯ããªããæ€ç¥ããŠèŠåããã²ãŒããå
¥ããŠããŸãã
ä»åã®å¯Ÿå¿ã§ä¿®æ£ãããªããžããªã¯ Playwright ã® channel:'chrome' 解決å
ã 16ç®æãshell ãš Python ã®çŽå©ãã 10ãã¡ã€ã«ãã³ããããããªããžããªã¯ 8æ¬ã«ãªããŸãããèŠæš¡ã倧ãããªãã»ã©ã1ç®æçŽãããã§ã¯çµãããªããå
šãªããžããªã暪æããŠä¿®æ£ãæ³¢åããããã€ãã®ä¿®æ£ã npm install ã§æ¶ããŠãèªåã§åŸ©æŽ»ããä»çµã¿ãå¿
èŠã ã£ãã®ãããã®æ§æãäœã£ãçç±ã§ãã
å®è£ ã®è©³çް
pgrep ã¬ãŒãââ皌åäžã¯åãã«ãããªã
ååã§ç€ºãããã³ãã«äœæããžãã¯ã«ã¯ãããäžæ®µã®å®å šåŒãå ¥ã£ãŠããŸããããŒãžã§ã³äžäžèŽãæ€ç¥ãããšããChrome Automation.app ãåããŠãããåãã«ããã¹ãããããåŠçã§ãã
if pgrep -f "Chrome Automation.app/Contents/MacOS" >/dev/null 2>&1; then
log "SKIP rebuild: èªååChromeã皌åäž (src=$src_ver dst=${dst_ver:-none})"
else
log "rebuild: src=$src_ver dst=${dst_ver:-none}"
rm -rf "$DST" || { log "ERROR: æ§ãã³ãã«åé€ã«å€±æ"; exit 1; }
cp -R "$SRC" "$DST" || { log "ERROR: ã³ããŒå€±æ"; exit 1; }
...
fi
cp -R ã¯15ã30ç§ããããŸããã³ããŒäžã« Chrome Automation.app ã® Contents/MacOS/Google Chrome ãèªãŸãããšããã€ããªãäžéå端ãªç¶æ
ã§å®è¡ããããžã§ãå
šäœãå£ããŸããpgrep -f "Chrome Automation.app/Contents/MacOS" ã§èµ·åäžã®ããã»ã¹ãæ¢ããå±
ãããæ¬¡ã®6æéãµã€ã¯ã«ãŸã§åŸ
ã€ãèšèšã«ããŠããŸãã
åãã«ããã¹ãããããŠã patched/already ã«ãŠã³ãã¯åŸç¶ã§å®è¡ãããŸãããã³ãã«ã®å®äœã¯å€ããŸãŸã§ããcoreBundle.js ã®ãã¹ãæ£ãããã°ãžã§ãã¯åãç¶ããŸãã
launchd ã®ã·ã§ã«ã¯äººéã® PATH ãæããªã
plist ã«ã¯ EnvironmentVariables ãããã¯ãå
¥ã£ãŠããŸãã
<key>EnvironmentVariables</key>
<dict>
<key>HOME</key><string>~</string>
<key>LANG</key><string>en_US.UTF-8</string>
<key>PATH</key>
<string>~/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
launchd ãèµ·åããã·ã§ã«ã¯ã/etc/launchd.conf ããç°å¢ãåŒãç¶ãã ãã§ã~/.zshrc ã ~/.zprofile ãèªã¿ãŸãããPATH ãæç€ºããªããã° /usr/bin:/bin ããéã£ãŠãããã/opt/homebrew/bin ã«ãã codesign ã PlistBuddy ãèŠã€ãããªãããšããç¶æ
ã«ãªããŸããHOME ãæç€ºããã®ã¯ ${HOME}/dev ãšããå±éãã·ã§ã«å€æ°ã§ã¯ãªã EnvironmentVariables çµç±ã§è§£æ±ºãããããã«ããããã§ããLANG 㯠grep ãæ¥æ¬èªãã¹ãå«ããã¡ã€ã«åãå£ããªãããã®ä¿éºã§ãã
ãã°ã®åºåå
ã StandardOutPath ãš StandardErrorPath ã«åãããŠããã®ãåãçç±ã§ããlaunchd ã¯æšæºåºåãšæšæºãšã©ãŒãå¥ãã¡ã€ã«ã«æžãåºããã©ã¡ãã ~/.claude/logs/ ã«èœãšããŸããçæ¹ã ãèŠãŠãããšãäœãèµ·ããŠããªããããã«èŠããããšããããŸãã
keychain_gate ã®ãã€ãã©ã€ã³èªã¿è§£ã
keychain_gate() ã®å®è£
ã¯ãgrep ã3段ãã§ãŒã³ããçããæ§é ãããŠããŸãã
grep -rIl ... \
-E 'Chrome Automation\.app/Contents/MacOS|Google Chrome\.app/Contents/MacOS' \
"${SCAN_ROOTS[@]}" "${HOME}/.claude/scripts" \
| xargs -I{} grep -l -e '--headless' {} \
| xargs -I{} grep -L -e 'use-mock-keychain' {}
1段ç®ã¯ãChrome ã®ãã€ããªãã¹ãçŽæ¥æžããŠãããã¡ã€ã«ããæ¢ããŸããnode_modulesã».gitã»profilesã»logsã»venvã»tests ã¯æ¢çŽ¢ããé€å€ãããŠããŸãã
2段ç®ã¯ --headless ãå«ããã¡ã€ã«ã ããæ®ããŸããGUI èµ·åããŠããã¹ã¯ãªãã㯠Keychain ãã€ã¢ãã°ãåºãŠãåé¡ãããŸããã
3段ç®ã¯ use-mock-keychain ããªããã¡ã€ã«ã ããæ®ããŸãïŒ-L ã¯ããããããªããã¡ã€ã«äžèЧããã©ã°ïŒã
ãã®3段ãéã£ããã¡ã€ã«ã¯ãheadless ã§ Chrome ã䜿ã£ãŠããã®ã« mock-keychain ãä»ããŠããªãããšããç¶æ
ã®ãã¡ã€ã«ã§ãããã®ãã³ã« Keychain ã®ãèš±å¯ããŸããïŒããã€ã¢ãã°ããããã¢ããããŸããèªååäžã«ãã€ã¢ãã°ãåºããšã次㮠click ãŸã§å
šããã»ã¹ãæ¢ãŸããŸããscent-media/scripts/ensure_chrome.sh ã ã grep -v ã§é€å€ããŠããã®ã¯ããã®1ä»¶ãå¥ã®çç±ã§æ¢ããŠæ¬ç©ã® Keychain ã䜿ãèšèšã«ãªã£ãŠããããã§ãã
ã¹ã¯ãªããã¯ãã®æ€ç¥ã§èªåä¿®æ£ã¯ããŸãããInstagram çã®æ°žç¶ãããã¡ã€ã«ã¯ã»ãã·ã§ã³ã¯ãããŒã Keychain ã®éµã§æå·åããŠãããéµãå€ãããšãã°ã€ã³ãå¹ãé£ã¶ããã§ããèŠåããã°ã«æµããŠäººéã«å€æãå§ããããããèšèšã®éžæã§ãã
æçµç¢ºèªã³ãã³ã
æ§æãèŒãããããããŸã§å®éã«åãã確èªããŸãã
# 1. launchd ã®ç»é²ç¢ºèª
launchctl list | grep chrome-automation-repair
# 2. ãã³ãã«ãçããŠããã
open -a "Chrome Automation" --args --version
# 3. playwright ãæ£ãããã¹ãèŠãŠããã
grep -r "Chrome Automation" ~/dev/*/node_modules/playwright-core/lib/coreBundle.js 2>/dev/null | head -5
# 4. 人éã® Chrome ã¯ç¬ç«ããŠèµ·åã§ããã
open -a "Google Chrome"
2çªã® --args --version 㯠Chrome ã« --version ãã©ã°ãæž¡ããŠèµ·åçŽåŸã®ããŒãžã§ã³æååïŒGoogle Chrome 127.0.6533.120 ãªã©ïŒãåºåãããŸãããŠã£ã³ããŠãéããã«æååã ãè¿ã£ãŠãããããã³ãã«ãæ£åžžã«èµ·åã§ããç¶æ
ã«ãããšå€æã§ããŸãã4çªã¯ -600 ãè¿ããã«äººéã® Chrome ãéãã°ãæçžã®éé¢ãå¹ããŠããããšã®æçµç¢ºèªã«ãªããŸãã
ç§ãè©°ãŸã£ã話
find ã4åããã£ãŠãã
æåã«æžããã¹ã¯ãªãã㯠find ã§æ¢çŽ¢ããŠããŸããã
find "${HOME}/dev" "${HOME}/content" \
-name "coreBundle.js" \
-path "*/playwright-core/lib/*"
å®è¡ããŠã¿ããšãå®äºãŸã§ 4å15ç§ããããŸããã~/dev é
äžã«ã¯ node_modules ãæ°çŸåãããfind ã¯ãã®ãã¹ãŠã®ãã£ã¬ã¯ããªãèããŸãã6æéããšã«4åãããåŠçã¯ããã¯ã°ã©ãŠã³ããšã¯ãã CPU ãšãã£ã¹ã¯ãç¡é§ã«æ¶è²»ããŸãããäœãããå®éã«èµ°ããããé
ãããšããäºå®ã«æåã®å®è£
ãŸã§æ°ã¥ããŠããŸããã§ããã
coreBundle.js ãååšããã¬ã€ã¢ãŠãã¯å®éã«ã¯2ãã¿ãŒã³ã ãã§ããçŽæ¥ã€ã³ã¹ããŒã«ãã playwright-core ã®å Žå㯠*/node_modules/playwright-core/lib/coreBundle.jsãplaywright çµç±ã§ãã¹ãããŠããå Žå㯠*/node_modules/playwright/node_modules/playwright-core/lib/coreBundle.jsããã®2ãã¿ãŒã³ããªããžããªæ·±ã2段ãŸã§ glob ã§çŽå©ãã«ãããšãããå®è¡æé㯠0.95ç§ã«ãªããŸããã
glob ãéãçç±ã¯ããã¡ã€ã«ã·ã¹ãã ã®èµ°æ»ã OS ã®ãã£ã¬ã¯ããªãšã³ããªåç §ã«èœãšããããã§ããfind ãå šããŒãããã©ãã®ã«å¯Ÿããglob ã¯ããã®ãã¿ãŒã³ã«äžèŽãããšã³ããªãååšããããã ãã確èªããŸããæ¢çŽ¢ç¯å²ãæ¢ç¥ã®æ§é ã«åãŸã£ãŠãããªããglob 㯠find ã®ä»£æ¿ãšããŠæç¢ºã«åªããŠããŸãã
ad-hoc 眲åãå¿ã㊠exit 137
æåã®å®è£
ã§ã¯ cp -R ãš PlistBuddy ã§æžãæãããšãããŸã§äœããcodesign ãå
¥ããŠããŸããã§ããããã¹ãã§ Chrome Automation.app ãèµ·åããããšãããšããã«ããŒããã»ã¹ã exit 137 ã§å³æ»ããŸããã
exit 137 㯠SIGKILLïŒ128 + 9ïŒã§ããããã»ã¹ãèªåããçµäºããã®ã§ã¯ãªããOS ã匷å¶çã«æ®ºããŠããŸããmacOS ã® Library Validation ããããã€ããªã¯ååšããã眲åã Info.plist ã® bundle ID ãšäžèŽããªãããšå€æãããšãããã«ããŒã SIGKILL ããŸããGoogle ãä»ãã眲å㯠com.google.Chrome ã«å¯ŸããŠçºè¡ããããã®ã§ãInfo.plist ã® CFBundleIdentifier ã com.google.ChromeAutomation ã«å€ããæç¹ã§ç¡å¹ã«ãªããŸãã
codesign --force --deep --sign - ã远å ããŠåå®è¡ãããšèµ·åããŸããã--force ã¯æ¢åã®çœ²åãäžæžãã--deep ã¯ã¡ã€ã³ãã€ããªã ãã§ãªããã¬ãŒã ã¯ãŒã¯ã»ãã«ããŒã»ãã©ã°ã€ã³ãã¹ãŠãå眲åã-ïŒãã€ãã¹ïŒã¯ Apple ã®èšŒææžãæããªã ad-hoc 眲åãæå®ããŸããGatekeeper ã¯ãã®çœ²åããä¿¡é ŒãããŸããããããŒã«ã«å®è¡ã§ããã°èµ·åã§ããŸããååã ããéçºå
ã確èªã§ããªãããšãã確èªãã€ã¢ãã°ãåºãŸãããã·ã¹ãã èšå®ã®ããã©ã€ãã·ãŒãšã»ãã¥ãªãã£ãããããã®ãŸãŸéãããäžåºŠæŒãã°ä»¥éã¯äžèŠã§ãã
æ¢çŽ¢0ä»¶ã§ã exit 0 ã§æåæ±ãã«ãªã£ãŠãã
åæå®è£
ã§ SCAN_ROOTS ãééã£ãŠèšå®ããããšããããŸãã~/dev ã§ã¯ãªã ~/Development ãšæžããŠããŸãããã£ã¬ã¯ããªãååšããªããã list_core_bundles ã1ä»¶ãè¿ããªãç¶æ
ã«ãªããŸããã
ãã®ãšããã¹ã¯ãªããã¯æåŸãŸã§æ£åžžçµäºã㊠exit 0 ãè¿ããŸãããpatched=0ã»already=0 ã§ãããã©ã¡ãã®æ¡ä»¶ã«ãåŒã£ããããããã°ã«ã¯ playwright patched=0 already=0 rebuilt=0 ãšåºãã ãã§ããlaunchd ã¯ãžã§ãã® exit code ããèŠãŠããªãã®ã§ãäœãä¿®æ£ãããŠããªãã®ã«6æéããšã«ãæåããŸããããšèšé²ããç¶ããŸããã
npm install ã§ãã¹ãæ»ã£ãåŸã修埩ãããªããŸãŸæå€§6æéæŸçœ®ããããããšããææªã±ãŒã¹ãããã§çºçããŸããpatched + already == 0 ã®å Žåã« exit 1 ã§æç€ºçã«å€±æãããã³ãŒãã¯ããã®å€±æããçãŸããŠããŸãã
if [ $((patched + already)) -eq 0 ]; then
log "ERROR: playwright-core ã1ä»¶ãèŠã€ãããªããSCAN_ROOTS ã確èªããã"
exit 1
fi
launchd 㯠exit code ã 0 以å€ã®ãšã StandardErrorPath ã«èšé²ããæ¬¡ã®ãµã€ã¯ã«ã§ãåå®è¡ããŸãã倱æã¯éšã
ããããããããæ£ããèšèšã§ãã
ãã¹ããæ·±ããªãã1ä»¶åãããŒããŠãã
æåã® glob ãã¿ãŒã³ã¯1éå±€ããã«ããŒããŠããŸããã§ããã
"$root"/*/node_modules/playwright-core/lib/coreBundle.js
ãã®1段ã§ã¯ ~/dev/social-autolike/node_modules/playwright/node_modules/playwright-core/lib/coreBundle.js ãåŒã£ããããŸãããplaywright ã playwright-core ãå
å
ãã圢ã§ã€ã³ã¹ããŒã«ãããŠããã±ãŒã¹ã§ããsocial-autolike 㯠playwright ãçŽæ¥ã€ã³ã¹ããŒã«ããŠããããããã®ãã¹ããçºçããŠããŸããã
çµæãšããŠãä»ã®15ç®æã¯ Chrome Automation.app ã«åããŠããã®ã«ãsocial-autolike ã ãã Google Chrome.app ãçŽå©ããç¶ããŠããŸãããä¿®æ£åŸã« dokuji-rosen-sns ã§ãåãåé¡ãèµ·ãããšãïŒåŸè¿°ïŒãçã£å
ã«ããã¹ãã®ãã¿ãŒã³ãå¢ããŠããªãããã確èªããç¿æ
£ãã€ããã®ã¯ãã®å€±æã®ãããã§ãã
preflight ã人éã® Chrome ããš pkill -9 ããŠãã
metrics-hub ã«ã¯ preflight_chrome.sh ãšããã¹ã¯ãªãããããããžã§ãéå§åã«å€ã Chrome ããã»ã¹ãæé€ãã圹å²ãæã£ãŠããŸããããã®ã¹ã¯ãªããã®å®è£
ãæ¬¡ã®ããã«ãªã£ãŠããŸããã
pkill -9 "Google Chrome"
pkill ã¯ããã»ã¹åã«éšåäžèŽããŸããGoogle Chrome ãšããæåå㯠com.google.Chrome ã com.google.ChromeAutomation ãäž¡æ¹ã®ããã»ã¹åã«å«ãŸããŸããèªååã®ãžã§ãã preflight ãå©ããã³ã«ã人éãéããŠãã Chrome ãŠã£ã³ããŠãå
šéš SIGKILL ã§æ®ºãããŠããŸããã
ããã«æªãããšã«ãããã¯ä¿®æ£ã®ãã£ãããã€ãã¿ã«ããå£ãæ¹ãããŸããChrome Automation.app ã䜿ã£ãŠãããžã§ãã¯æ£åžžã«åããŸããããã人éã® Chrome ãçªç¶èœã¡ãããšããçŸè±¡ã ããæ®ããŸãããžã§ãã®ãã°ã«ã¯äœãæ®ããŸããããChrome ãèœã¡ããªããšããèªèãèç©ãããŠåããŠãpreflight ãç¯äººã ãšæ°ã¥ããŸãã
ä¿®æ£ã¯ãããã»ã¹åã®ä»£ããã«ãã€ããªãã¹ã§çµã蟌ã圢ã«å€ããããšã§ãã
pkill -9 -f "Chrome Automation.app/Contents/MacOS"
-f ã¯ããã»ã¹ã®èµ·åã³ãã³ãã©ã€ã³å
šäœã«å¯ŸããŠäžèŽãåããŸããChrome Automation.app/Contents/MacOS ãšãããã¹ãå«ãããã»ã¹ã ãã察象ã«ããããšã§ã人éã® Chrome ã«ã¯è§Šããªãå®è£
ã«ãªããŸãã
4æ¬ç®ã®ãªãã1ã¶æé ãã§åã穎ãèžãã
9æ1æ¥ã®ä¿®æ£ã§ã16ç®æã® coreBundle.js ãš10ãã¡ã€ã«ã®çŽå©ãã倿Žãã8ãªããžããªãã³ãããããŸããããã®æç¹ã§ãå
šä»¶å¯Ÿå¿ããããšæã£ãŠããŸããã
9æ11æ¥ãdokuji-rosen-sns ã® tools/lib/browser.mjs ã channel:'chrome' ã®ãŸãŸã«ãªã£ãŠããããšãçºèŠããŸããsocial-autolike ã8æ12æ¥ã« chromium 忢±çãžç§»è¡ããåŸããdokuji-rosen-sns 㯠channel:'chrome' ã®ãŸãŸæ®ã£ãŠããŸãããä»ã®ãžã§ããš Chrome ãåãåãæ8æã10æ40åã ããèµ·åã180ç§ãè¶
ããŠã¿ã€ã ã¢ãŠãããçŸè±¡ã5æ¥éç¶ããŠããŸããã5æ¥ã§39åã®ãã³ã°ã8:00æ ã®125ããããæ¯æ¥æ¶ããŠããã«ãããããããã¢ã©ãŒãã¯ã次ã®ãµã€ã¯ã«ã§èªå埩垰ãã®1è¡ã§èªã¿æµãããŠããŸããã
ãã®æèšã¯ wiki ã«æ®ããäžè¬åœ¢ãšéãªããŸãããå ±é颿°ã®ä¿®æ£ã¯ããã®é¢æ°ã䜿ã£ãŠããå šãŠã®åŒã³åºãå ãžäŒæããªããšæå³ããªãããã¹ã¯ãªãããçŽããŠããåããã¿ãŒã³ã§æžãããå¥ãªããæ®ã£ãŠããéã¯ä¿®æ£ãå®äºãããšã¯èšããŸããã
chrome-automation-repair.sh ã® SCAN_ROOTS ã« ~/dev ãš ~/content ã®äž¡æ¹ãå
¥ããŠããã®ããçæ¹ã ãã«ããååšããªããªããèŠèœãšããªãããã§ãããªããæ°ããäœããã³ã«ããã®ãªã㯠channel:'chrome' ã䜿ã£ãŠããããã確èªããã®ã¯äººéã®äœæ¥ã§ãããã ãã¹ã¯ãªããã6æéããšã«èµ°ã patched ã1以äžã«ãªãã°ãå°ãªããšããåãããŒãã«æ°ã¥ããªããŸãŸ1ã¶æãçµã€ãäºæ
ã¯é²ããŸããä»ã®ãšãããã¹ã¯ãªããã patched=0 already=N ãè¿ãç¶ããŠãããã¡ã¯å
šä»¶ãæ£ããåããŠãããšå€æããŠããŸãã
ã€ãŸãããã€ã³ã
å®éã«èžãã å°é·ãç¶²çŸ ããŸãããèšå®ããŠã¿ããåããªããã®å€§åã¯ããã®ã©ããã§ãã
-
Info.plist ãæžãæããããš codesign ãå¿ããã
CFBundleIdentifierãcom.google.ChromeAutomationã«å€ããæç¹ã§ Google ãä»ãã眲åã¯ç¡å¹ã«ãªããŸããå眲åãªãã§èµ·åãããš Library Validation ã«åŒŸããããã«ããŒããã»ã¹ã exit 137ïŒSIGKILLïŒã§å³æ»ããŸããcodesign --force --deep --sign -ã®--deepã¯å¿ é ã§ãã--forceã ãã§ã¯ã¡ã€ã³ãã€ããªããæŽæ°ãããããã¬ãŒã ã¯ãŒã¯ã»ãã«ããŒã»ãã©ã°ã€ã³ãå€ã眲åã®ãŸãŸæ®ããŸãã -
findã§ node_modules ãå šèµ°æ»ãããfind ~/dev ~/content -name "coreBundle.js"ã¯å®äºãŸã§4å15ç§ããããŸããã~/dev以äžã®node_modulesãæ°çŸåããããã§ããcoreBundle.jsãååšããã¬ã€ã¢ãŠãã¯ã*/node_modules/playwright-core/lib/ããšã*/node_modules/playwright/node_modules/playwright-core/lib/ãã®2ãã¿ãŒã³ã ãã§ããããã glob ã§çŽå©ãã«ãããšå®è¡æéã 0.95ç§ã«ãªããŸããæ¢ç¥ã®æ§é ãå šèµ°æ»ããå¿ èŠã¯ãããŸããã -
ãã¹ããã¿ãŒã³ã1çš®é¡ããæžããªãã
playwrightãçŽæ¥ã€ã³ã¹ããŒã«ãããããžã§ã¯ãã¯*/node_modules/playwright-core/lib/coreBundle.jsãplaywrightçµç±ã§playwright-coreãå ¥ã£ãŠãããããžã§ã¯ãã¯*/node_modules/playwright/node_modules/playwright-core/lib/coreBundle.jsã®ãã¹ã圢ã§ããçæ¹ãã glob ã«æžããªããšãããäžæ¹ã®ãªããžããªãæ¯ååãããŒããŸããsocial-autolikeã§ãããèžã¿ã16ç®æçŽããã€ããã1ä»¶ã ãæ§ãã¹ãåãããŸãŸã«ãªã£ãŠããŸããã -
æ¢çŽ¢0ä»¶ã§ã exit 0 ã§æåæ±ãã«ãªãã
SCAN_ROOTSã«ååšããªããã¹ãæžããšlist_core_bundlesã1ä»¶ãè¿ãããpatched=0 already=0ã®ãŸãŸæ£åžžçµäºããŸããlaunchd 㯠exit 0 ããæåããšããŠèšé²ãã6æéããšã«ãäœãããªãåŠçããéãã«èµ°ãç¶ããŸããpatched + already == 0ã®ãšãexit 1ã§æç€ºçã«å€±æãããŠã¯ãããŠããã°ã« ERROR ãæ®ãæ¬¡ãµã€ã¯ã«ã§ãåå®è¡ãããŸãã -
pkill -9 "Google Chrome"ã人éã® Chrome ããšæ®ºãã ããã»ã¹åã®éšåäžèŽã¯com.google.Chromeãcom.google.ChromeAutomationãäž¡æ¹ã«ãããããŸããmetrics-hubã®preflight_chrome.shããŸãã«ããã§ãèªååãã³ãã«ãæé€ããããšãããã³ã«äººéã®éããŠããã¿ããå šéš SIGKILL ããŠããŸãããpkill -f "Chrome Automation.app/Contents/MacOS"ãšèµ·åã³ãã³ãã©ã€ã³å šäœã§çµãããšã§ã人éã® Chrome ã«ã¯è§Šããªãå®è£ ã«ãªããŸãã -
launchd ã®ã·ã§ã«ã¯
~/.zshrcãèªãŸãªãã launchd ãèµ·åããã·ã§ã«ã® PATH ã¯/usr/bin:/binã ãã§ãã/opt/homebrew/binã®codesignã PlistBuddy ãèŠããŸãããplist ã®EnvironmentVariablesã«PATHã»HOMEã»LANGãæç€ºããªããšãã¹ã¯ãªããããã³ãã³ããèŠã€ãããªããã§é»ã£ãŠèœã¡ãŸããLANGãen_US.UTF-8ã«ããªããšgrepãæ¥æ¬èªãå«ããã¡ã€ã«åãå£ãå ŽåããããŸãããã°ã«äœãåºãªããŸãŸ exit 127 ã§çµãããããçºèŠãé ããŸãã -
åãã«ãäžã« Chrome Automation.app ã®ãã€ããªãèªãŸããã
cp -R /Applications/Google\ Chrome.app /Applications/Chrome\ Automation.appã¯å®ç°å¢ã§15ã30ç§ããããŸãããã®éã«èªååãžã§ããChrome Automation.app/Contents/MacOS/Google Chromeã exec ããããšãããšãã³ããŒéäžã®ãã€ããªãæŽãã§ã¯ã©ãã·ã¥ããŸããpgrep -f "Chrome Automation.app/Contents/MacOS"ã§çšŒå確èªããå± ããæ¬¡ã®6æéãµã€ã¯ã«ã«å»¶æããŸãã -
Keychain ACL 㯠Chrome ã¢ããããŒãã§ç¡å¹ã«ãªãã Chrome Automation.app 㯠ad-hoc 眲åãªã®ã§ code hash ãåãã«ãã®ãã³ã«å€ãããŸããmacOS Keychain ã®ãChrome Safe Storageãã«ãåžžã«èš±å¯ããä»ããŠããChrome ãèªåã¢ããããŒãããŠåãã«ããèµ°ããš ACL ãç¡å¹ã«ãªããheadless èµ·åã®ãã³ã«ããã¹ã¯ãŒããèš±å¯ããŸããïŒããã€ã¢ãã°ãåºãŸããheadless èµ·åã«ã¯å šä»¶
--use-mock-keychain --password-store=basicãä»ããã®ãæ£è§£ã§ãããã ã Instagram çã®æ°žç¶ãããã¡ã€ã«ã¯ã»ãã·ã§ã³ã¯ãããŒã Keychain ã®éµã§æå·åããŠãããããmock ã«åãæ¿ãããšãã°ã€ã³ãå¹ãé£ã³ãŸããkeychain_gate()ãæ€ç¥ããŠèŠåããã ãã§èªåä¿®æ£ããªãèšèšã¯ããã®çç±ã«ãããŸãã -
ä¿®æ£ã1ãªããžããªã ãã«çãããšãé£ã1ã¶æåŸã«åã穎ãèžãã
channel:'chrome'ãçŽæ¥æå®ããŠããã¹ã¯ãªããã¯~/devãš~/contentã®å šãªããžããªã«æ£åšããŸãã1ä»¶çŽãããšããã§ãå¥ãªããžããªã®browser.mjsãå€ããã¹ãåãããŸãŸæ®ãç¶ããŸããå®éã«dokuji-rosen-snsããããèžã¿ãä»ãžã§ããš Chrome ãåãåãæ8ã10æ40åã ã180ç§è¶ ãã³ã°ããçŸè±¡ã5æ¥ç¶ããŸããã5æ¥ã§39åã»8:00æ ã®125ããããæ¯æ¥æ¶ããŠããã®ã«ãã¢ã©ãŒãããæ¬¡ tick ã§èªå埩垰ãã®1è¡ã§èªã¿æµãããŠããã®ãèšé²ããŠãããŸããä¿®æ£ã¯SCAN_ROOTSã®å šãªããžããªã暪æç¢ºèªãããŸã§ã1ã»ããã§ãã -
StandardOutPathãšStandardErrorPathãå¥ã ã«èŠãªããšãäœãèµ·ããŠããªããã«èŠããã launchd 㯠stdout ãš stderr ãå¥ãã¡ã€ã«ã«æžãåºããŸãããšã©ãŒã.err.logã ãã«åºãŠããŠã.logãã確èªããŠããªããã°æ°ã¥ããŸãããtail -f ~/.claude/logs/chrome-automation-repair.logãštail -f ~/.claude/logs/chrome-automation-repair.err.logãäž¡æ¹ç¢ºèªããç¿æ £ãæåããæã€ãšãç¡é³å€±æã®çºèŠãæ°æéããæ°åã«çž®ãŸããŸãã -
Chrome Automation.app ã®ååèµ·åã« Gatekeeper ãã€ã¢ãã°ãåºãã ad-hoc 眲å㯠Apple ã®ä¿¡é Œãã§ãŒã³ã«ä¹ã£ãŠããªããããååã ããéçºå ã確èªã§ããªãããéããŸããããåºãŸããã·ã¹ãã èšå®âãã©ã€ãã·ãŒãšã»ãã¥ãªãã£âããã®ãŸãŸéãããäžåºŠæŒãã°ä»¥éã¯åºãŸãããæ°ãã Mac ã«ç°å¢ãç§»ããçŽåŸããChrome ã®å€§å¹ ã¢ããããŒãåŸïŒãã³ãã«ãäœãçŽããã¿ã€ãã³ã°ïŒã«å¿ããã¡ã§ãã
ãã¹ããã©ã¯ãã£ã¹
ãããŸã§ã®æ§æãæ±çšååãšããŠæŽçããŸããChrome ãã³ãã«åé¢ã«éãããmacOS äžã®é·æçšŒåèªååå šè¬ã«äœ¿ããèšèšæéã§ãã
1. 人éãªãœãŒã¹ãšç¡äººãžã§ãã®ãªãœãŒã¹ã¯ãååãã®æ®µéããåããã
bundle IDã»ãããã¡ã€ã«ãã¹ã»ããŒãçªå·ã»PID ãã¡ã€ã«ãã©ããäžã€ã§ãå
±æããç¬éã«ãã©ã¡ãããæ®ºããšããäžæ¹ãæ»ã¬ãæ§é ãçãŸããŸããååãåããã ãã§ OS ã代ããã«éé¢ããŠãããŸããèšèšã®ã³ã¹ãã¯äžåºŠããã§ã以é㯠OS ã管çããŸãã
2. ãnpm install ã§å¿
ãæ»ãããèšèšã®åæã«ããã
ããããåœãŠãäºå®ãæ ¹æ ã«ããªãããæ»ãããšãèŠè¶ããŠå®æçã«è²ŒãçŽãããåœåããèšèšã«çµã¿èŸŒã¿ãŸããæå€§6æéã¯æ§çµè·¯ã«æ»ãçªãæ®ããŸãããããã¯æ¢ç¥ã®ãªã¹ã¯ãšããŠåãå
¥ããããŸãããçŽããããšãçŽãç¶ãããã¯å¥ã®ç¶æ
ã§ãã
3. ãããçµæãã«ãŠã³ããã0ä»¶ã fail-loud ã«ããã
patched=N already=M ã®2倿°ãæã¡ãpatched + already == 0 ãªã exit 1ããæ¢çŽ¢ãããäœããªãã£ããã¯ãäœãããªãã£ãããšå矩ã§ããé»ã£ãŠ exit 0 ã«ãããšãèšå®ãã¹ã6æéããšã«éãã«ç¹°ãè¿ãããŸãã
4. ããŒãžã§ã³æ¯èŒã§åªçæ§ã確ä¿ããäžèŠãªåãã«ããçãã
/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ã§ src_ver ãš dst_ver ãæ¯èŒããŠãåäžããŒãžã§ã³ãªãäœãããªãããå®è£
ãããšã6æéããšã®ãµã€ã¯ã«ãã»ãŒããŒã³ã¹ãã«ãªããŸããGoogle Chrome ãèªåã¢ããããŒããããšãã ãåãã«ããèµ°ããŸãã
5. åãã«ãåã« pgrep ã¬ãŒããå
¥ããã
pgrep -f "Chrome Automation.app/Contents/MacOS" ã§çšŒå確èªããå±
ããæ¬¡ã®ãµã€ã¯ã«ã«å»¶æããŸããã³ããŒäžã®ãã€ããªãæŽãŸããåé¡ã¯ããã®ã¬ãŒãã ãã§å®å
šã«é²ããŸãããä»ã¯è§Šããªãããšå€æã§ããä»çµã¿ãé·æçšŒåã®å®å®ãäœããŸãã
6. launchd plist ã® EnvironmentVariables ã« PATHã»HOMEã»LANG ãå¿
ãæžãã
ã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ã®èšå®ã launchd ã¯äžåèªã¿ãŸãããæå
ã§åãã¹ã¯ãªããã launchd ã§ã¯é»ã£ãŠæ»ã¬ããšããçŸè±¡ã®å€§åã¯ããã§ããæåãã plist ã«æžããŠããã ãã§ããã®çš®ã®ãã©ãã«ã¯ãŒãã«ãªããŸãã
7. find ãã glob ã䜿ããæ¢ç¥ã®ã¬ã€ã¢ãŠããçŽæ¥å©ãã
æ¢çŽ¢å¯Ÿè±¡ã®æ§é ãèªåã§ã³ã³ãããŒã«ã§ããŠãããªããå
šèµ°æ»ã¯åžžã«ããéãã§ããplaywright-core ã®çœ®ãå Žã¯2ãã¿ãŒã³ãããããŸãããglob ã§çŽå©ãã«ãããš find ã®270åã®1ã®æéã§çµãããŸãã
8. codesign 㯠--force --deep --sign - ã®3ãªãã·ã§ã³ã»ããã§äœ¿ãã
--force ã§æ¢å眲åãäžæžãã--deep ã§ãã¬ãŒã ã¯ãŒã¯ã»ãã«ããŒã»ãã©ã°ã€ã³å
šäœã«é©çšã- ã§ ad-hoc 眲åã1ã€ã§ãæ¬ ãããš Library Validation ã SIGKILL ããŸãã3ã€ã»ããã§èŠããŠããã°ããããŸããã
9. headless Chrome ã«ã¯ --use-mock-keychain --password-store=basic ãä»ããã
æ°žç¶ãããã¡ã€ã«ãæã€ãžã§ãïŒInstagram çïŒã ãã¯äŸå€ãšããŠãmock ã䜿ããšã»ãã·ã§ã³ãå¹ãé£ã¶ã®ã§æ¬ç©ã® Keychain ãæ®ããŸããã©ã¡ãã該åœããããææ¡ããäžã§ãheadless èµ·åã®å€§å㯠mock ãä»ããã®ãæ£ããèšå®ã§ãã
10. pkill 㯠-f ã§ãã«ãã¹äžèŽã«ãããããã»ã¹åã®éšåäžèŽã¯äœ¿ããªãã
pkill "Google Chrome" 㯠bundle ID ãéã£ãŠããŠãäž¡æ¹æ®ºããŸãã-f "Chrome Automation.app/Contents/MacOS" ãšèµ·åã³ãã³ãã©ã€ã³å
šäœã§çµãããšã§ã人éã® Chrome ã«è§Šããªãå®è£
ã«ãªããŸãã
11. ä¿®æ£ããã SCAN_ROOTS ã®å
šãªããžããªã暪æç¢ºèªããã
1ãªããžããªçŽããŠããåããã¿ãŒã³ã§æžãããå¥ãªããžããªãæ®ã£ãŠããéã¯ä¿®æ£ãå®äºããŠããŸãããgrep -r "channel:'chrome'" ~/dev ~/content --include="*.mjs" --include="*.js" 2>/dev/null ã§æŒããåºããå
šä»¶å¯Ÿå¿ããŠã¯ãããŠå®äºã§ãã
12. æçµç¢ºèªã³ãã³ããã¹ã¯ãªãããšã»ããã§æ®ãã
èšå®åŸã«äœã§ç¢ºèªããããæåããæ±ºããŠãããŸããä»åã®æ§æã¯æ¬¡ã®4ã³ãã³ãã§ãã
# 1. launchd ãžã®ç»é²ç¢ºèª
launchctl list | grep chrome-automation-repair
# 2. ãã³ãã«ãèµ·åã§ããç¶æ
ã
open -a "Chrome Automation" --args --version
# 3. playwright ãæ£ãããã¹ãèŠãŠããã
grep -r "Chrome Automation" ~/dev/*/node_modules/playwright-core/lib/coreBundle.js 2>/dev/null | head -5
# 4. 人éã® Chrome ã¯ç¬ç«ããŠèµ·åã§ããã
open -a "Google Chrome"
2çªã® --args --version ã Chrome ã®ããŒãžã§ã³æååïŒäŸïŒGoogle Chrome 127.0.6533.120ïŒãè¿ãã4çªã -600 ãªãã§éãã°ãéé¢ãæ£ããå¹ããŠããŸãããæ§æãå
¥ããã確èªã³ãã³ããŸã§èŸŒã¿ã§1ã»ããããšããçºæ³ã§ãå幎åŸã«åãç°å¢ãåçŸããã³ã¹ããäžããŸãã
13. ãã°ã¯ ~/.claude/logs/ ã«éããstdout ãš stderr ãäž¡æ¹ç¢ºèªããã
ã©ã¡ããã ãèŠãŠãããšããšã©ãŒã .err.log ã«åºãŠããã®ã«æ°ã¥ããªãç¶æ
ãç¶ããŸããtail -f ~/.claude/logs/*.log ~/.claude/logs/*.err.log ã§å
šãžã§ãã®ç¶æ
ãäžèЧã§ããããã«ããŠãããšãç¡é³å€±æã®çºèŠã³ã¹ããäžãããŸãã
14. 修埩çªïŒSLAïŒãæå³çã«éžã³ããã®æ ¹æ ãæ®ãã
StartInterval: 21600ïŒ6æéïŒã¯ãnpm install ãèµ°ã£ãŠãæå€§6æé以å
ã«ä¿®åŸ©ãããããšãã SLA ã§ããçãããã°ç¢ºå®æ§ãäžããäžæ¹ãCPU ãšãã£ã¹ã¯ãžã®åœ±é¿ãå¢ããŸããèªåã®ç°å¢ã§èš±å®¹ã§ããæå€§å€ãæå³çã«éžãã§ããã®æ ¹æ ã plist ã®ã³ã¡ã³ãã«æ®ããŠããããšãéèŠã§ãã
ãŸãšã
open -a "Google Chrome" ã -600 ãè¿ãã9æ1æ¥ã®ååŸãããèšèšãšããŠæ®ã£ããã®ãäžè¡ã§èšãã°ããç«¶åã¯ãªãœãŒã¹ãå
±æããŠããéã ãèµ·ãããååãåããã° OS ã代ããã«éé¢ããŠããããã§ãã
èªååã1æ¬ã®ãšãã¯åé¡ãèŠããŸããã2æ¬ã5æ¬ã10æ¬ãšç©ã¿äžããã«ã€ããŠã人éçšãªãœãŒã¹ãšèªååãªãœãŒã¹ãåãåå空éãå æãåããã©ã¡ãããæ®ºãã°ããäžæ¹ãå£ããæ§é ãéãã«åºæ¥äžãããŸããæåã䌞ã°ãããã«èªååãç©ã¿å¢ãã»ã©ãèªåã®äœæ¥ç°å¢ãå£ããââãã®éèª¬ã«æ°ã¥ããã®ãããã®èšèšã®ã¹ã¿ãŒãå°ç¹ã§ããã
npm install ã§æ»ããšããäºå®ããçŽããªããã°ãªããªãåé¡ããšããŠèŠãã®ãããããæ»ãããšãåæã«ããå®æä¿®åŸ©ããšããŠåãå
¥ããæç¹ã§ãä»çµã¿ã¯å®å®ããŸãããããããæ»ã£ãŠã6æé以å
ã«çŽãããã®ä¿®åŸ©çªãæ¢ç¥ã®ãªã¹ã¯ãšããŠèšèšã«çµã¿èŸŒãããšããé·æçšŒåã®éµã§ãã
chrome-automation-repair.sh ã6æéããšã«èµ°ããpatched=0 already=16 rebuilt=0 ãè¿ãç¶ããä»ãèªååãžã§ã㯠Chrome Automation.app ã䜿ãã人éã® Chrome ã¯ç¬ç«ããŠåããŠããŸãã9æ1æ¥ã®ãããªæã¯ãããæ¥ãŸããã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- å¶äœç©ã»èšäºã¯ bokuwalily.com ã«ãŸãšããŠããŸãð¥ïž
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ