affaan-m/ECC · error

Unsupported Itô command "${command || "(missing)"}"; ECC per

Error message

Unsupported Itô command "${command || "(missing)"}"; ECC permits only login, logout, auth, find, status, and evals.

What it means

Thrown by parseArgs at scripts/ito.js:165-168 when the first non---json argument is not one of the SUPPORTED_COMMANDS (login, logout, auth, find, status, evals). The bridge only forwards a fixed command allowlist to the canonical Itô CLI; anything else is rejected before any subprocess is started. If no command is present at all (argv empty after --json stripping), command is undefined and the message interpolates '(missing)'. Note: --help/-h/empty argv returns help at ito.js:143-148 and never reaches this check.

Source

Thrown at scripts/ito.js:166

    return Object.freeze({ help: true, invocationArgs: [] });
  }

  if (environment.ECC_DRY_RUN === "1" || args.includes("--dry-run")) {
    throw new Error(
      "Itô compute has no paper or dry-run success mode. No CLI operation was invoked."
    );
  }

  const jsonIndexes = args
    .map((value, index) => (value === "--json" ? index : -1))
    .filter((index) => index >= 0);
  if (jsonIndexes.length > 1) {
    throw new Error("--json may only be provided once");
  }
  const withoutJson = args.filter((value) => value !== "--json");
  const command = withoutJson.shift();
  if (!SUPPORTED_COMMANDS.includes(command)) {
    throw new Error(
      `Unsupported Itô command "${command || "(missing)"}"; ECC permits only login, logout, auth, find, status, and evals.`
    );
  }
  if (command === "auth" && withoutJson.includes("--no-browser")) {
    throw new Error("--no-browser is valid only for ecc ito login; auth is validation-only.");
  }
  if (command === "evals") {
    validateNodeQualificationArgs(withoutJson, environment);
  }

  return Object.freeze({
    help: false,
    invocationArgs: Object.freeze([
      ...(jsonIndexes.length === 1 ? ["--json"] : []),
      command,
      ...withoutJson,
    ]),
  });

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Use one of the supported commands: login, logout, auth, find, status, evals (lowercase).
  2. Run `ecc ito --help` to see the canonical list for your installed version.
  3. If a flag was mistaken for the command (e.g. `ecc ito --no-browser`), put a supported command first: `ecc ito login --no-browser`.

Example fix

// before
$ ecc ito Authenticate
// after
$ ecc ito auth
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED = new Set(['login', 'logout', 'auth', 'find', 'status', 'evals']);
function assertSupportedCommand(cmd) {
  if (!SUPPORTED.has(cmd)) {
    throw new Error(`Unsupported ito command '${cmd}'. Supported: ${[...SUPPORTED].join(', ')}`);
  }
  return cmd;
}

Type guard

function isItoCommand(value) {
  return typeof value === 'string'
    && ['login', 'logout', 'auth', 'find', 'status', 'evals'].includes(value);
}

Prevention

When it happens

Trigger: `ecc ito foobar`; `ecc ito` (no command, no --help); `ecc ito --json` (only the flag); `ecc ito LIST` (case-sensitive — uppercase is rejected). The first token after stripping all --json occurrences is shifted out at ito.js:164 and tested.

Common situations: Typo in the subcommand (e.g. `ecc ito auths` instead of `auth`); copy/paste from docs that list a command not yet supported by the installed ECC version; CI job parameterized with an empty command variable that interpolates to nothing.

Related errors


AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13). Data as JSON: /api/errors/4ba91a9ff8cd4dc7. Report an issue: GitHub.