affaan-m/ECC · error · Error

Non-interactive setup requires --yes.

Error message

Non-interactive setup requires --yes.

What it means

Thrown by setup.js in needsConfirmation flow when the run is non-interactive (no TTY) but --yes was not passed. A non-interactive run cannot answer the confirmation prompt, so setup aborts rather than guessing consent for a filesystem-mutating operation.

Source

Thrown at scripts/setup.js:448

    }

    if (interactiveDefaults) {
      const confirmationAction = interactiveDefaults.multipleScopes
        ? 'Resume migration'
        : (
          interactiveDefaults.installed && interactiveDefaults.scope !== options.scope
            ? 'Migrate'
            : 'Apply'
        );
      options = {
        ...options,
        confirmationAction,
      };
    }

    if (needsConfirmation) {
      if (!interactive) {
        throw new Error('Non-interactive setup requires --yes.');
      }
      if (!terminal) {
        terminal = readline.createInterface({
          input: process.stdin,
          output: process.stdout,
        });
      }
      if (!await confirm(options, terminal)) {
        printResult({
          action: 'cancelled',
          hooks: options.hooks || 'standard',
          pluginId: 'ecc@ecc',
          scope: options.scope || 'detected',
        }, options.json);
        return;
      }
    }

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Add `--yes` to skip confirmation in non-interactive runs.
  2. Add `--dry-run` first to preview the planned changes.
  3. Provide a TTY if you genuinely want the interactive confirmation.

Example fix

# before
node scripts/setup.js --mode claude-plugin --scope user --hooks standard
# after
node scripts/setup.js --mode claude-plugin --scope user --hooks standard --yes
Defensive patterns

Strategy: validation

Validate before calling

if (!process.stdin.isTTY && !process.argv.includes('--yes') && !process.argv.includes('--dry-run')) {
  console.error('Non-interactive run requires --yes');
  process.exit(2);
}

Type guard

function isInteractive() { return Boolean(process.stdin.isTTY); }

Try / catch

try { await confirm(options, terminal); } catch (err) { console.error(err.message); process.exit(2); }

Prevention

When it happens

Trigger: Running setup with all required flags in CI but forgetting --yes; piping input that makes stdin non-TTY; running under cron/systemd.

Common situations: Automated install pipelines; Docker build steps; any harness that does not allocate a terminal.

Related errors


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