paperclipai/paperclip · error

Could not read managed install manifest at

Error message

Could not read managed install manifest at ${paths.manifestPath}: ${String(error)}

What it means

readInstallManifest could not read or parse install.json (missing, invalid JSON, or unsupported shape) and the underlying error is wrapped with the manifest path; callers treat this as no manifest.

Solutions

  1. Check permissions and contents of ${paths.manifestPath} and retry.
  2. Re-install the payload so a readable manifest is written.
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at cli/src/install-store.ts:229 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-08-18). Data as JSON: /api/errors/43810274a12844d1. Report an issue: GitHub.

Appendix: source

Thrown at cli/src/install-store.ts:229

  }
  return path.join(paths.installsRoot, source, identifier);
}

export function readInstallManifest(paths = resolveInstallStorePaths()): InstallManifest | null {
  try {
    const value = JSON.parse(fs.readFileSync(paths.manifestPath, "utf8")) as InstallManifest;
    if (
      value.schemaVersion !== INSTALL_MANIFEST_VERSION ||
      (value.source !== "npm" && value.source !== "git") ||
      !Array.isArray(value.previous) ||
      typeof value.payloadPath !== "string"
    ) {
      throw new Error("unsupported manifest shape");
    }
    return value;
  } catch (error) {
    if ((error as NodeJS.ErrnoException).code === "ENOENT") return null;
    throw new Error(`Could not read managed install manifest at ${paths.manifestPath}: ${String(error)}`);
  }
}

export function writeInstallManifestAtomic(
  manifest: InstallManifest,
  paths = resolveInstallStorePaths(),
): void {
  ensurePrivateDirectory(paths.cliRoot);
  const temporaryPath = `${paths.manifestPath}.tmp-${process.pid}-${Date.now()}`;
  try {
    fs.writeFileSync(temporaryPath, `${JSON.stringify(manifest, null, 2)}\n`, { mode: 0o600 });
    fs.renameSync(temporaryPath, paths.manifestPath);
  } finally {
    fs.rmSync(temporaryPath, { force: true });
  }
}

function assertPayloadPath(payloadPath: string, paths: InstallStorePaths): void {

View on GitHub (pinned to 01ad858492)