affaan-m/ECC · error · Error

does not point to a readable local Itô CLI file.

Error message

${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.

What it means

This is the first failure inside assertUsableExecutable: fs.realpathSync.native(candidate) threw, meaning the configured path could not be resolved at all — typically ENOENT (some component of the path does not exist), EACCES (no permission on a parent directory), or a symlink loop. The message reports it as 'not a readable local Itô CLI file' before canonical-entry or permission checks run.

Solutions

  1. Check the path component-by-component: ls -l "$ECC_ITO_CLI_EXECUTABLE" — fix whichever parent is missing.
  2. If dist/bin/ito.js is absent, rebuild: cd cli/ito-compute-cli && npm ci && npm run check.
  3. If the repo moved, re-export ECC_ITO_CLI_EXECUTABLE to the new absolute location.

Example fix

# before
$ ls "$ECC_ITO_CLI_EXECUTABLE"
ls: cannot access '.../dist/bin/ito.js': No such file or directory

# after — build the CLI, then retry
$ cd ito-cloud-runtime/cli/ito-compute-cli && npm ci && npm run check
$ ls "$ECC_ITO_CLI_EXECUTABLE"  # now resolves
Defensive patterns

Strategy: validation

Validate before calling

import fs from 'node:fs';
function assertItoEntryResolves(p) {
  let real;
  try { real = fs.realpathSync.native(p); }
  catch { throw new Error(`ECC_ITO_CLI_EXECUTABLE path does not resolve: ${p} (build the CLI or fix the path)`); }
  return real;
}

Type guard

function itoEntryResolves(p) {
  try { fs.realpathSync.native(p); return true; } catch { return false; }
}

Prevention

When it happens

Trigger: ECC_ITO_CLI_EXECUTABLE points at dist/bin/ito.js that was never built (npm run build/check skipped), the repo was moved or deleted, or a parent directory is unreadable by the current user.

Common situations: Forgetting the build step so dist/ does not exist; cloning ito-cloud-runtime fresh after the env var already points to the old checkout path; running under a different container user that cannot traverse the repo directory.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@06c5e118c4 (2026-08-18). Data as JSON: /api/errors/95e5587504f20c40. Report an issue: GitHub.

Appendix: source

Thrown at scripts/ito.js:212

      "run npm ci and npm run check, then set",
      `${EXECUTABLE_OVERRIDE} to the explicit absolute dist/bin/ito.js path.`,
    ].join(" "));
  }

  if (!path.isAbsolute(configured)) {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} must be an absolute path explicitly configured by the operator.`
    );
  }
  return assertUsableExecutable(configured);
}

function assertUsableExecutable(candidate) {
  let canonicalCandidate;
  try {
    canonicalCandidate = fs.realpathSync.native(candidate);
  } catch {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.`
    );
  }
  if (!isCanonicalItoEntry(canonicalCandidate)) {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} must point to the canonical dist/bin/ito.js entry.`
    );
  }
  if (!isUsableExecutable(canonicalCandidate)) {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.`
    );
  }
  return canonicalCandidate;
}

function isCanonicalItoEntry(candidate) {
  const pathSegments = path

View on GitHub (pinned to 06c5e118c4)