jackwener/OpenCLI · error · CommandExecutionError

Nothing changed. Open the tweet in the browser and retry.

Error message

Nothing changed. Open the tweet in the browser and retry.

What it means

This CommandExecutionError is thrown by the twitter hide-reply CLI when the in-page hide attempt returns a non-ok result after an optional retry on the parent URL. The library cannot hide the reply (e.g. the button was not found, the action was rejected, or Twitter returned an unexpected state), so it instructs the user to open the tweet manually and retry. It signals that no change was made to the reply's hidden state.

Source

Thrown at clis/twitter/hide-reply.js:121

                return { ok: false, message: 'Could not find "Hide reply" option. This may not be a reply on your tweet.' };
            }

            hideItem.click();
            await new Promise(r => setTimeout(r, 1500));

            return { ok: true, message: 'Reply successfully hidden.' };
        } catch (e) {
            return { ok: false, message: e.toString() };
        }
    })()`);
        let result = await runHideAttempt(true);
        if (result?.retryOnParent && result.parentUrl) {
            await page.goto(result.parentUrl);
            await page.wait({ selector: '[data-testid="primaryColumn"]' });
            result = await runHideAttempt(false);
        }
        if (!result.ok) {
            throw new CommandExecutionError(result.message, 'Nothing changed. Open the tweet in the browser and retry.');
        }
        await page.wait(2);
        return [{
                status: 'success',
                message: result.message
            }];
    }
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Verify the URL points to the specific reply to hide, not the parent tweet
  2. Open the tweet in a browser and check the reply's current state (already hidden/deleted?)
  3. Re-run after ensuring the browser session is logged in as an account that can hide the reply
  4. Retry later in case Twitter is rate-limiting or serving a changed UI
  5. Update/check the library for Twitter DOM selector changes

Example fix

// before
twitter hide-reply https://x.com/user/status/123
// after
twitter hide-reply https://x.com/user/status/123#reply-456  // target the reply itself, and confirm session/state first
Defensive patterns

Strategy: try-catch

Validate before calling

// verify URL points at a specific reply and a browser session exists
if (!/^https:\/\/(x|twitter)\.com\/[^/]+\/status\/\d+/.test(url)) throw new Error('Invalid tweet/reply URL');
if (!page) throw new Error('Open a browser session before hide-reply');

Type guard

function hasBrowserSession(p) { return typeof p === 'object' && p !== null && typeof p.goto === 'function' && typeof p.evaluate === 'function'; }

Try / catch

try {
  await clis.twitter.hideReply.func(page, { url });
} catch (e) {
  if (e.message.includes('Nothing changed')) {
    // verify reply state in browser, then decide whether to retry once
  } else throw e;
}

Prevention

When it happens

Trigger: Running `twitter hide-reply` with a URL whose reply cannot be hidden: the in-page evaluate returned ok:false (button not found, Twitter UI changed, reply already handled, or a page-level exception inside runHideAttempt), including after the retryOnParent re-navigation to result.parentUrl also failed.

Common situations: Passing a URL of the tweet instead of the specific reply; the reply is already hidden or deleted; Twitter DOM changes break the selector-based click; the logged-in session lacks permission to hide the reply (not the reply author or not the tweet author context expected); rate-limiting or a slow page load means the primaryColumn loaded but the hide control never rendered.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/97e5badaa775312b. Report an issue: GitHub.