jackwener/OpenCLI · warning · ArgumentError

xianyu rank must be a positive integer from xianyu inbox

Error message

xianyu rank must be a positive integer from xianyu inbox

What it means

normalizeRank validates the 'rank' parameter, which selects a message by its position from xianyu inbox listings. It throws ArgumentError when the value is non-empty but not a pure digit string (e.g. 'abc', '1.5', '-3').

Source

Thrown at clis/xianyu/im.js:25

export function normalizeLimit(value, defaultValue = DEFAULT_INBOX_LIMIT, maxValue = MAX_INBOX_LIMIT, label = 'limit') {
    const raw = String(value ?? '').trim();
    if (!raw) return defaultValue;
    if (!/^\d+$/.test(raw)) {
        throw new ArgumentError(`xianyu ${label} must be an integer between 1 and ${maxValue}`);
    }
    const n = Number(raw);
    if (!Number.isSafeInteger(n) || n < 1 || n > maxValue) {
        throw new ArgumentError(`xianyu ${label} must be an integer between 1 and ${maxValue}`);
    }
    return n;
}

export function normalizeRank(value) {
    const raw = String(value ?? '').trim();
    if (!raw) return 0;
    if (!/^\d+$/.test(raw)) {
        throw new ArgumentError('xianyu rank must be a positive integer from xianyu inbox');
    }
    const n = Number(raw);
    if (!Number.isSafeInteger(n) || n < 1) {
        throw new ArgumentError('xianyu rank must be a positive integer from xianyu inbox');
    }
    return n;
}

export function requireText(value, label) {
    const text = String(value ?? '').replace(/\s+/g, ' ').trim();
    if (!text) {
        throw new ArgumentError(`${label} cannot be empty`);
    }
    return text;
}

export function requireEvaluateObject(payload, label) {
    if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Pass a positive integer rank as shown in xianyu inbox output
  2. Omit or pass empty to default to 0
  3. Convert ordinals/labels to numbers before calling
  4. Validate with /^\d+$/ before invoking

Example fix

// before
await xianyuReply({ rank: 'first' }); // throws
// after
await xianyuReply({ rank: '1' });
Defensive patterns

Strategy: validation

Validate before calling

if (rank != null && rank !== '' && !/^\d+$/.test(String(rank))) {
  throw new Error('rank must be a positive integer');
}

Type guard

function isValidRank(v) {
  return v === '' || v == null || (/^\d+$/.test(String(v)) && Number(v) >= 1);
}

Try / catch

try {
  await xianyuReply({ rank });
} catch (e) {
  if (e?.name === 'ArgumentError' && /rank/.test(e.message)) {
    throw new Error(`bad rank '${rank}': use the numeric rank from xianyu inbox`);
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling a xianyu command with rank='first', rank='1.5', rank='-1', or any non-numeric string; empty string returns 0 and is allowed.

Common situations: Passing a label or ordinal word instead of the numeric rank shown in inbox output; locale-formatted numbers ('1st'); parsing errors upstream.

Related errors


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