jackwener/OpenCLI · error · CommandExecutionError
Browser session required for twitter mute-word
Error message
Browser session required for twitter mute-word
What it means
CommandExecutionError thrown at the start of the mute-word command's func when the injected page object is falsy. This CLI is browser-based: it drives a Playwright-style page to navigate X.com's muted-keyword settings. Without an active browser session the automation cannot run, so it aborts immediately instead of failing later on page.goto.
Source
Thrown at clis/twitter/mute-word.js:26
}
return keyword;
}
cli({
site: 'twitter',
name: 'mute-word',
access: 'write',
description: 'Add a muted word or phrase on Twitter/X',
domain: 'x.com',
strategy: Strategy.UI,
browser: true,
args: [
{ name: 'keyword', type: 'string', positional: true, required: true, help: 'Word or phrase to mute' },
],
columns: ['keyword', 'status', 'message'],
func: async (page, kwargs) => {
if (!page) {
throw new CommandExecutionError('Browser session required for twitter mute-word');
}
const keyword = parseKeyword(kwargs.keyword);
await page.goto('https://x.com/settings/add_muted_keyword');
await page.wait({ selector: '[data-testid="primaryColumn"]' }).catch(() => {});
const result = await page.evaluate(`(async () => {
const keyword = ${JSON.stringify(keyword)};
let writeStarted = false;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const visible = (node) => {
if (!node) return false;
const style = window.getComputedStyle ? window.getComputedStyle(node) : null;
return !style || (style.visibility !== 'hidden' && style.display !== 'none');
};
const textOf = (node) => String(node?.innerText || node?.textContent || '').trim();
const lowerTextOf = (node) => textOf(node).toLowerCase();
const exactTextOf = (node) => lowerTextOf(node).replace(/\\s+/g, ' ');View on GitHub (pinned to 49907e53dc)
Solutions
- Run the command with browser automation enabled so the registry injects an active page (launch the CLI in its browser/session mode).
- Ensure the browser session is started before invoking the command and not closed by an earlier step.
- Check upstream browser-launch errors (missing Chromium, display issues in CI) that leave page undefined.
- If embedding the CLI, pass a real page object rather than null/undefined.
Example fix
// before
await cliRun('twitter mute-word "spoiler"'); // no browser session configured
// after
const session = await opencli.browser.launch();
await cliRun('twitter mute-word "spoiler"', { browser: session });
await session.close(); Defensive patterns
Strategy: validation
Validate before calling
if (!page) throw new Error('Browser session required: launch the opencli browser session before running twitter mute-word'); Type guard
function hasPage(p) {
return !!p && typeof p.goto === 'function' && typeof p.evaluate === 'function';
} Try / catch
try {
await run(['twitter', 'mute-word', kw]);
} catch (err) {
if (err.message.includes('Browser session required')) {
const session = await opencli.browser.launch();
await run(['twitter', 'mute-word', kw], { browser: session });
await session.close();
} else throw err;
} Prevention
- Always launch the browser session before any browser-based twitter command
- Do not close/reuse a dead session across multiple CLI invocations
- In CI, provision a display or headless browser before invoking browser commands
When it happens
Trigger: Invoking the twitter mute-word command outside a browser-session context (no `page` argument supplied by the opencli registry), e.g. running the CLI in a mode where browser automation was not launched or the session was closed before the command executed.
Common situations: Running the command via a non-browser strategy/registry configuration; browser launch failure upstream left page undefined; invoking the command programmatically without establishing the browser session the CLI expects.
Related errors
- 12306 whoami failed: ${probe.detail}
- Unexpected 12306 probe: ${JSON.stringify(probe)}
- Waiting for 12306 tk auth cookie
- ${label} failed: ${error?.message ?? error}
- --resume-file requires --all
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/ff6e3defe71c51c1.
Report an issue: GitHub.