diff --git a/packages/loopover-miner/lib/purge-cli.js b/packages/loopover-miner/lib/purge-cli.js index 77a8227439..91b2bc81e1 100644 --- a/packages/loopover-miner/lib/purge-cli.js +++ b/packages/loopover-miner/lib/purge-cli.js @@ -24,6 +24,7 @@ import { countStoreByRepo, describeError, } from "./store-maintenance.js"; +import { argsWantJson, reportCliFailure } from "./cli-error.js"; const PURGE_USAGE = "Usage: loopover-miner purge --repo [--dry-run] [--json]"; @@ -166,8 +167,7 @@ function renderPurgeSummary(summary) { export function runPurge(args, options = {}) { const parsed = parsePurgeArgs(args); if ("error" in parsed) { - console.error(parsed.error); - return 2; + return reportCliFailure(argsWantJson(args), parsed.error); } if (parsed.dryRun) { diff --git a/test/unit/miner-purge-cli.test.ts b/test/unit/miner-purge-cli.test.ts index a0d0e2e41b..89f6d79385 100644 --- a/test/unit/miner-purge-cli.test.ts +++ b/test/unit/miner-purge-cli.test.ts @@ -232,6 +232,15 @@ describe("runPurge --dry-run (#5564)", () => { expect(error).toHaveBeenCalledWith(expect.stringContaining("Usage: loopover-miner purge")); }); + it("emits the {ok:false,error} JSON envelope for an argument error when --json is passed (#5915)", () => { + const log = vi.spyOn(console, "log").mockImplementation(() => undefined); + const error = vi.spyOn(console, "error").mockImplementation(() => undefined); + expect(runPurge(["--json"])).toBe(2); + expect(error).not.toHaveBeenCalled(); + const result = JSON.parse(String(log.mock.calls[0]?.[0])); + expect(result).toEqual({ ok: false, error: expect.stringContaining("Usage: loopover-miner purge") }); + }); + it("opens the real default on-disk stores in dry-run when no resolveDbPaths override is supplied", () => { const root = tempDir(); const previousDirs: Record = {