paperclipai/paperclip · error · Error
Downgrade cancelled. Re-run with --yes to confirm…
Error message
Downgrade cancelled. Re-run with --yes to confirm explicitly.
What it means
The update target resolves to a version older than the installed one and the operator declined the explicit downgrade confirmation; the downgrade is aborted by user choice.
Solutions
- Re-run with --yes to confirm the downgrade explicitly.
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at cli/src/commands/update.ts:221 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/202cd22a2cf18e48.
Report an issue: GitHub.
Appendix: source
Thrown at cli/src/commands/update.ts:224
try {
restarted = await (overrides.restartActiveService ?? restartActiveManagedService)(installed.version);
} catch (error) {
return rollbackAfterServiceValidationFailure(
paths,
overrides.restartActiveService ?? restartActiveManagedService,
error,
"Updated git payload",
);
}
emit(options, { mode, source: "git", changed: true, currentSha: manifest.sha, targetSha, reused: installed.reused, restarted }, pc.yellow(`Updated unreleased git payload ${manifest.sha.slice(0, 12)} → ${targetSha.slice(0, 12)} from ${manifest.repo}@${manifest.ref}${restarted ? " and restarted the active service" : ""}.`));
return;
}
const targetVersion = await resolvePublishedVersion(request.spec, runCommand);
const currentVersion = manifest?.version ?? (mode === "global-npm" ? packageVersion : undefined);
const comparison = currentVersion ? compareVersions(targetVersion, currentVersion) : 1;
if (options.check) { emit(options, { mode, currentVersion: currentVersion ?? null, targetVersion, updateAvailable: comparison > 0, downgrade: comparison < 0, channel: request.channel }, comparison > 0 ? `Update available: ${targetVersion}` : comparison < 0 ? `Target ${targetVersion} is older than ${currentVersion}.` : `paperclipai ${targetVersion} is current.`); if (comparison > 0) process.exitCode = 10; return; }
if (mode === "global-npm") {
if (comparison < 0 && options.yes !== true) { const confirmed = await (overrides.confirm ?? defaultConfirm)(`Downgrade paperclipai from ${currentVersion} to ${targetVersion}?`); if (!confirmed) throw new Error("Downgrade cancelled. Re-run with --yes to confirm explicitly."); }
const args = ["install", "-g", `paperclipai@${targetVersion}`, `--registry=${PUBLIC_NPM_REGISTRY}`, `--@paperclipai:registry=${PUBLIC_NPM_REGISTRY}`]; console.log(`Running: npm ${args.join(" ")}`);
if (!options.dryRun) {
const npmConfigDir = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-npm-"));
const npmUserConfigPath = path.join(npmConfigDir, "npmrc");
try {
fs.writeFileSync(npmUserConfigPath, `registry=${PUBLIC_NPM_REGISTRY}\n@paperclipai:registry=${PUBLIC_NPM_REGISTRY}\n`, { mode: 0o600 });
await runCommand("npm", args, {
env: {
...process.env,
npm_config_registry: PUBLIC_NPM_REGISTRY,
NPM_CONFIG_REGISTRY: PUBLIC_NPM_REGISTRY,
npm_config_userconfig: npmUserConfigPath,
NPM_CONFIG_USERCONFIG: npmUserConfigPath,
},
maxBuffer: 16 * 1024 * 1024,
});
} finally {
fs.rmSync(npmConfigDir, { recursive: true, force: true });View on GitHub (pinned to 01ad858492)