From ca53d8f23d1ab2ea69f08c924364a3775a8c8168 Mon Sep 17 00:00:00 2001 From: nghetienhiep <13849419+nghetienhiep@users.noreply.github.com> Date: Wed, 15 Jul 2026 07:06:51 +0000 Subject: [PATCH] fix(miner): honor --json on purge arg-parse errors runPurge's arg-parse failure path used a bare console.error/return 2 instead of the shared reportCliFailure/argsWantJson contract, so `purge --json` on a bad --repo value printed plain stderr text instead of the documented {ok:false,error} envelope. Closes #5915 --- packages/loopover-miner/lib/purge-cli.js | 4 ++-- test/unit/miner-purge-cli.test.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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 = {