基于 SOC 职业分类
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/jacobm1978/hermes-local-agent --skill fix-arm-browser命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
Build a reliable multi-agent automation system under device, software, and API constraints using available tools and strategic resource allocation
Create hand-drawn style diagrams using Excalidraw JSON format. Generate .excalidraw files for architecture diagrams, flowcharts, sequence diagrams, concept maps, and more. Files can be opened at excalidraw.com or uploaded for shareable links.
Generate optimized product listings for eBay, Facebook Marketplace, Mercari, and Poshmark. Use when user provides item details and wants cross-platform listing descriptions with platform-specific optimization.
| name | fix-arm-browser |
| description | Fix headless Chromium crashes on ARM64 PRoot (Android/Termux) by switching to Firefox. |
| category | devops |
Chromium's headless shell crashes on ARM64 PRoot containers due to seccomp blocking critical system calls. Firefox works reliably as a drop-in replacement.
browser_navigate returns "Daemon failed to start" or "Target crashed"browser_snapshot returns "Empty page"# Verify architecture
uname -m # should be aarch64
# Verify chromium crashes
/root/.cache/ms-playwright/chromium_headless_shell-*/chrome-linux/headless_shell --version # usually works
# But actual navigation via playwright crashes
# Test firefox works
node -e "
const { firefox } = require('playwright-core');
(async () => {
const b = await firefox.launch({headless:true});
const p = await b.newPage();
await p.goto('https://httpbin.org/html');
console.log('OK:', p.url());
await b.close();
})();"
cd /root/.hermes/hermes-agent
npx playwright install firefox
Firefox installs to /root/.cache/ms-playwright/firefox-XXXX/
File: tools/browser_tool.py
Find (~line 889):
browser_env["AGENT_BROWSER_SOCKET_DIR"] = task_socket_dir
Add after it:
browser_env["AGENT_BROWSER_BROWSER"] = os.environ.get("AGENT_BROWSER_BROWSER", "firefox")
This ensures the browser tool passes the Firefox env var to the spawned agent-browser CLI daemon. Without this, the daemon still defaults to chromium when auto-launched by the gateway.
File: node_modules/agent-browser/dist/daemon.js
Two changes needed:
a) Read the env var (~line 334, where extensions are parsed):
const extensions = process.env.AGENT_BROWSER_EXTENSIONS
? process.env.AGENT_BROWSER_EXTENSIONS.split(',')
.map((p) => p.trim())
.filter(Boolean)
: undefined;
const browser = process.env.AGENT_BROWSER_BROWSER; // <-- add this
b) Pass it to the launcher (~line 359, in the manager.launch({...}) call):
await manager.launch({
id: 'auto',
action: 'launch',
headless: process.env.AGENT_BROWSER_HEADED !== '1',
executablePath: process.env.AGENT_BROWSER_EXECUTABLE_PATH,
extensions: extensions,
browser, // <-- add this line
profile: process.env.AGENT_BROWSER_PROFILE,
...
});
File: node_modules/agent-browser/dist/browser.js
Find line (~970):
const browserType = options.browser ?? 'chromium';
Change to:
const browserType = options.browser ?? process.env.AGENT_BROWSER_BROWSER ?? 'firefox';
This way:
options.browser (if passed explicitly) takes priorityAGENT_BROWSER_BROWSER env varfirefox instead of chromiumKill existing daemons — the gateway will auto-spawn with Firefox on next browser command:
for pid in $(ps aux | grep "daemon.js" | grep -v grep | awk '{print $2}'); do kill -9 $pid 2>/dev/null; done
# Firefox binary location
ls /root/.cache/ms-playwright/firefox-*/firefox/firefox-bin
# Quick standalone test
node -e "
const { firefox } = require('/root/.hermes/hermes-agent/node_modules/playwright-core');
(async () => {
const b = await firefox.launch({headless:true, executablePath:'/root/.cache/ms-playwright/firefox-1511/firefox/firefox-bin'});
const p = await b.newPage();
await p.goto('https://httpbin.org/html');
console.log('SUCCESS:', (await p.content()).includes('Herman') ? 'Firefox works' : 'FAIL');
await b.close();
})();\"
# Firefox binary location
ls /root/.cache/ms-playwright/firefox-*/firefox/firefox-bin
# Quick standalone test
node -e "
const { firefox } = require('/root/.hermes/hermes-agent/node_modules/playwright-core');
(async () => {
const b = await firefox.launch({headless:true, executablePath:'/root/.cache/ms-playwright/firefox-1511/firefox/firefox-bin'});
const p = await b.newPage();
await p.goto('https://httpbin.org/html');
console.log('SUCCESS:', (await p.content()).includes('Herman') ? 'Firefox works' : 'FAIL');
await b.close();
})();"
browser_* tools run in an isolated headless browser session. They cannot see or control the user's own Android browser tabs, Chrome windows, or app screens. They can only browse in their own hidden window.adb connect IP:PORT, then use adb shell input commands to tap and type into the user's actual screen tabs. The agent can build a shell script bridge to automate listing forms in the user's real browser.For scaling multi-platform automation:
If anything breaks, reverse the three patches:
browser_env["AGENT_BROWSER_BROWSER"] = ... from browser_tool.py (~line 890)const browser = process.env.AGENT_BROWSER_BROWSER; and browser, from daemon.js?? 'firefox' back to ?? 'chromium' in browser.js (~line 970)Chromium will be used again (but will still crash on PRoot ARM64).