affaan-m/ECC · error · Error

Another Nasiko lifecycle operation is already in progress; i

Error message

Another Nasiko lifecycle operation is already in progress; inspect ${lockPath} before recovering a stale lock.

What it means

acquireLifecycleLock failed to exclusively create the lifecycle lock file, meaning another install/uninstall is running concurrently; the error points at the lock path for stale-lock recovery instead of retrying blindly.

Source

Thrown at scripts/lib/nasiko-release.js:241

    && metadata.license === release.license
    && metadata.sourceUrl === release.sourceUrl);
  return { installed: true, qualified, version: qualified ? metadata.version : null, executable, binaryDigest, metadataPath: metadataPathFor(executable) };
}

function writeMetadataExclusive(metadataPath, metadata) {
  fs.writeFileSync(metadataPath, `${JSON.stringify(metadata, null, 2)}\n`, { mode: 0o600, flag: 'wx' });
}

function acquireLifecycleLock(installDirectory, fileSystem = fs) {
  const lockPath = path.join(installDirectory, '.ecc-nasiko-lifecycle.lock');
  let descriptor;
  try {
    descriptor = fileSystem.openSync(lockPath, 'wx', 0o600);
    fileSystem.writeFileSync(descriptor, `${JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString() })}\n`);
    fileSystem.fsyncSync(descriptor);
  }
  catch (error) {
    if (error.code === 'EEXIST') throw new Error(`Another Nasiko lifecycle operation is already in progress; inspect ${lockPath} before recovering a stale lock.`);
    if (descriptor !== undefined) {
      try { fileSystem.closeSync(descriptor); } finally { fileSystem.rmSync(lockPath, { force: true }); }
    }
    throw error;
  }
  return () => {
    try { fileSystem.closeSync(descriptor); } finally { fileSystem.rmSync(lockPath, { force: true }); }
  };
}

async function installNasiko(options = {}, dependencies = {}) {
  const version = options.version || 'v0.1.0';
  const base = getQualifiedRelease(version, dependencies.platform || process.platform, dependencies.arch || process.arch);
  const release = dependencies.releaseOverride ? { ...base, ...dependencies.releaseOverride } : base;
  const installDirectory = validateInstallDirectory(options.installDir || defaultInstallDirectory(release, dependencies.environment || process.env, dependencies.homeDirectory || os.homedir()));
  const destination = path.join(installDirectory, release.binaryName);
  const plan = { dryRun: Boolean(options.dryRun), version, platform: release.os, architecture: release.arch, manifestDigest: release.manifestDigest, binaryDigest: release.binaryDigest, registryOrigin: REGISTRY_ORIGIN, destination, license: release.license, sourceUrl: release.sourceUrl };
  if (options.dryRun) return plan;

View on GitHub (pinned to 06c5e118c4)

Solutions

  1. Provide a value that satisfies the validation: Another Nasiko lifecycle operation is already in progress; inspect lockPath before recovering a stale lock.
  2. Check the calling command or configuration for the reported field and correct it, then retry.
  3. Run the command with --help to review the expected input shape and allowed values.

Example fix

Correct the invalid input so that the following holds: Another Nasiko lifecycle operation is already in progress; inspect lockPath before recovering a stale lock.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at scripts/lib/nasiko-release.js:241 when the library encounters an invalid state.

Common situations: Raised when input validation fails because: Another Nasiko lifecycle operation is already in progress; inspect lockPath before recovering a stale lock.. Typically caused by a missing, malformed, or out-of-range argument or configuration value.


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