đ´ čŞĺĺ Chrome ăćŹä˝ă掺ăăŚăăââăăłă㍠ID ĺé˘ă¨6ćéăă¨čŞĺˇąäżŽĺžŠăŽć§ć
ćĺ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ăľăźăăšăéçŁăăŚăăžă
- AIă§ăĺŻăŚăŚăĺăäťçľăżăăä˝ăŁăŚć120ä¸ăŤăă芹㯠noteăŽććč¨äş ăŤđ°
- OSS: github.com/bokuwalily đ
- ćć°ć ĺ ąăťăĺăĺăă㯠X @bokuwalily ă¸đ
- AIĺ°ĺ ĽăťčŞĺĺăŽç¸čŤă¨ĺŽčŁ ăăłăăŹ7ćŹăŽé ĺ¸ăŻ ĺ ŹĺźLINE ăăđŹ
çăă㎠â¤ď¸ ăăˇă§ă˘ăĺąăżăŤăŞăăžăďź