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 when the like attempt completed without starting a write (unconfirmed is false) but returned ok:false, meaning the like definitively did not happen. The action failed cleanly, so the message advises opening the tweet in the browser and retrying.

Source

Thrown at clis/twitter/like.js:77

            await new Promise(r => setTimeout(r, 1000));

            // Verify success by checking if the 'unlike' button reappeared
            const verifyArticle = findTargetArticle() || targetArticle;
            const verifyBtn = verifyArticle?.querySelector('[data-testid="unlike"]');
            if (verifyBtn) {
                return { ok: true, message: 'Tweet successfully liked.' };
            } else {
                return { ok: false, unconfirmed: true, message: 'Like action was initiated but UI did not update as expected.' };
            }
        } catch (e) {
            return { ok: false, unconfirmed: writeStarted, message: e.toString() };
        }
    })()`);
        if (result.unconfirmed) {
            throw new TimeoutError('twitter like confirmation', 1, `${result.message} Check the tweet before retrying; the like may already have succeeded.`);
        }
        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. Open the tweet in the browser to verify its visibility and current like state
  2. Confirm the session is logged in and can interact with the tweet
  3. Re-run `twitter like` once the page state is verified
  4. Check the underlying result.message (the first argument) for the in-page failure reason
  5. Update the library if Twitter changed its UI selectors
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-check: confirm the tweet is visible and not already liked
await page.goto(target.url);
await page.wait({ selector: '[data-testid="primaryColumn"]' });

Try / catch

try {
  await clis.twitter.like.func(page, { url });
} catch (e) {
  if (e.message.includes('Nothing changed')) {
    // clean failure: inspect result reason, verify session/tweet, retry once
  } else throw e;
}

Prevention

When it happens

Trigger: During `twitter like`, the in-page evaluate returned {ok:false, unconfirmed:false} — e.g. the like button/confirmation was never found, the write never started, and no exception escalated to the TimeoutError branch.

Common situations: Tweet is protected/deleted or the account cannot see it; already-liked state causing the button lookup to fail; Twitter DOM/selector changes; page loaded partially (primaryColumn present but the like control not rendered); logged-out or restricted session.

Related errors


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