From 6a067ea2f18d0d65221b286ca23b1d3c4ffdcd64 Mon Sep 17 00:00:00 2001 From: heimanba <371510756@qq.com> Date: Sat, 18 Jul 2026 19:03:46 +0800 Subject: [PATCH] fix(cli): report unsupported model listing in json Change-Id: I99fa70e7c0e6b5a574ebac55a1fbb2823b118f8b --- packages/cli/src/commands/models.ts | 6 +++++- packages/cli/tests/unit/cli-contracts.test.ts | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/commands/models.ts b/packages/cli/src/commands/models.ts index 45e6fb0..5f0de07 100644 --- a/packages/cli/src/commands/models.ts +++ b/packages/cli/src/commands/models.ts @@ -9,7 +9,11 @@ export async function modelsListCommand(options: { file: string; provider?: stri for (const listing of listings) { const name = listing.provider; if (!listing.supportsDynamicListing) { - if (!options.json) { + if (options.json) { + process.stdout.write( + `${JSON.stringify({ provider: name, supportsDynamicListing: false, models: [] }, null, 2)}\n`, + ); + } else { console.log(chalk.yellow(`\n Provider '${name}' does not support dynamic model listing.`)); if (name === "claude") { console.log(chalk.dim(` Claude models are specified directly (e.g. claude-sonnet-4-6, claude-opus-4-6).`)); diff --git a/packages/cli/tests/unit/cli-contracts.test.ts b/packages/cli/tests/unit/cli-contracts.test.ts index 08b1ead..affb7b6 100644 --- a/packages/cli/tests/unit/cli-contracts.test.ts +++ b/packages/cli/tests/unit/cli-contracts.test.ts @@ -438,6 +438,21 @@ test("models list keeps missing config guidance in the core runtime", async () = expect(result.stderr).toContain("File not found"); }); +test("models list JSON reports providers without dynamic listing support", async () => { + const dir = await makeTempDir(); + const configPath = await writeBailianVaultConfig(dir); + + const result = await runAgents(["models", "list", "--file", configPath, "--provider", "bailian", "--json"]); + + expect(result.exitCode).toBe(0); + expect(JSON.parse(result.stdout)).toEqual({ + provider: "bailian", + supportsDynamicListing: false, + models: [], + }); + expect(result.stderr).toBe(""); +}); + test("migrated CLI commands consume core service APIs instead of composing internals", async () => { const commands = ["destroy.ts", "session.ts", "state.ts", "deployment.ts", "validate.ts", "models.ts"]; const banned = [