From 893b59d0973a1721b15cbbec475c077674b81caf Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sun, 26 Apr 2026 16:30:05 +0200 Subject: [PATCH] feat(ai): Add model option to Claude CLI --- README.md | 2 +- doc/codereview.txt | 2 ++ lua/codereview/ai/providers/claude_cli.lua | 8 ++++++-- lua/codereview/config.lua | 3 ++- tests/codereview/ai/providers/claude_cli_spec.lua | 15 ++++++++++++--- tests/codereview/ai/subprocess_spec.lua | 12 +++++++++++- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 87d85ac..373b6e6 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ require("codereview").setup({ review_level = "info", -- "info" | "suggestion" | "warning" | "error" max_file_size = 500, -- skip files larger than N lines (0 = unlimited) - claude_cli = { cmd = "claude", agent = "code-review" }, + claude_cli = { cmd = "claude", model = nil, agent = "code-review" }, codex_cli = { cmd = "codex", model = nil }, copilot_cli = { cmd = "copilot", model = nil, agent = nil }, gemini_cli = { cmd = "gemini", model = nil }, diff --git a/doc/codereview.txt b/doc/codereview.txt index 679ea36..fc7db60 100644 --- a/doc/codereview.txt +++ b/doc/codereview.txt @@ -319,6 +319,7 @@ Options for AI review. See |codereview-ai-review|. claude_cli = { cmd = "claude", -- path or name of the claude binary + model = nil, -- optional model override agent = "code-review", -- Claude agent/profile name }, codex_cli = { @@ -398,6 +399,7 @@ Requirements: provider = "claude_cli", claude_cli = { cmd = "claude", -- binary name or full path + model = "opus", -- optional model override agent = "code-review", -- agent/profile name }, } diff --git a/lua/codereview/ai/providers/claude_cli.lua b/lua/codereview/ai/providers/claude_cli.lua index bf20a6b..0fd9c88 100644 --- a/lua/codereview/ai/providers/claude_cli.lua +++ b/lua/codereview/ai/providers/claude_cli.lua @@ -2,8 +2,12 @@ local config = require("codereview.config") local utils = require("codereview.ai.providers.utils") local M = {} -function M.build_cmd(claude_cmd, agent) +function M.build_cmd(claude_cmd, model, agent) local cmd = { claude_cmd, "-p" } + if model and model ~= "" then + table.insert(cmd, "--model") + table.insert(cmd, model) + end if agent then table.insert(cmd, "--agent") table.insert(cmd, agent) @@ -22,7 +26,7 @@ function M.run(prompt, callback, opts) local pcfg = cfg.ai.claude_cli or {} local claude_cmd = pcfg.cmd or cfg.ai.claude_cmd or "claude" local agent = (not opts.skip_agent) and (pcfg.agent or cfg.ai.agent) or nil - local cmd = M.build_cmd(claude_cmd, agent) + local cmd = M.build_cmd(claude_cmd, pcfg.model, agent) return utils.run_cli(prompt, callback, cmd) end diff --git a/lua/codereview/config.lua b/lua/codereview/config.lua index 3b7b0ff..1e09a02 100644 --- a/lua/codereview/config.lua +++ b/lua/codereview/config.lua @@ -43,6 +43,7 @@ ---@class codereview.config.ai.ClaudeCLI ---@field cmd? string Claude CLI command (default: `claude`) +---@field model? string Claude model name ---@field agent? string Claude Agent (default: `code-review`) ---@class codereview.config.ai.CodexCLI @@ -104,7 +105,7 @@ local defaults = { provider = "claude_cli", review_level = "info", max_file_size = 500, - claude_cli = { cmd = "claude", agent = "code-review" }, + claude_cli = { cmd = "claude", model = nil, agent = "code-review" }, codex_cli = { cmd = "codex", model = nil }, copilot_cli = { cmd = "copilot", model = nil, agent = nil }, gemini_cli = { cmd = "gemini", model = nil }, diff --git a/tests/codereview/ai/providers/claude_cli_spec.lua b/tests/codereview/ai/providers/claude_cli_spec.lua index c8bc1cc..26962d4 100644 --- a/tests/codereview/ai/providers/claude_cli_spec.lua +++ b/tests/codereview/ai/providers/claude_cli_spec.lua @@ -1,6 +1,12 @@ package.loaded["codereview.config"] = { get = function() - return { ai = { enabled = true, provider = "claude_cli", claude_cli = { cmd = "claude", agent = "code-review" } } } + return { + ai = { + enabled = true, + provider = "claude_cli", + claude_cli = { cmd = "claude", model = nil, agent = "code-review" }, + }, + } end, } package.loaded["codereview.log"] = { debug = function() end, warn = function() end, error = function() end } @@ -13,10 +19,13 @@ describe("ai.providers.claude_cli", function() assert.same({ "claude", "-p" }, claude_cli.build_cmd("claude")) end) it("includes agent flag when provided", function() - assert.same({ "claude", "-p", "--agent", "code-review" }, claude_cli.build_cmd("claude", "code-review")) + assert.same({ "claude", "-p", "--agent", "code-review" }, claude_cli.build_cmd("claude", nil, "code-review")) end) it("omits agent flag when nil", function() - assert.same({ "claude", "-p" }, claude_cli.build_cmd("claude", nil)) + assert.same({ "claude", "-p" }, claude_cli.build_cmd("claude", nil, nil)) + end) + it("includes model flag when provided", function() + assert.same({ "claude", "-p", "--model", "model" }, claude_cli.build_cmd("claude", "model", nil)) end) end) end) diff --git a/tests/codereview/ai/subprocess_spec.lua b/tests/codereview/ai/subprocess_spec.lua index 60be771..3dd446e 100644 --- a/tests/codereview/ai/subprocess_spec.lua +++ b/tests/codereview/ai/subprocess_spec.lua @@ -14,7 +14,7 @@ describe("ai.subprocess", function() end) it("includes agent flag when provided", function() - local cmd = subprocess.build_cmd("claude", "code-review") + local cmd = subprocess.build_cmd("claude", nil, "code-review") assert.same({ "claude", "-p", "--agent", "code-review" }, cmd) end) @@ -22,5 +22,15 @@ describe("ai.subprocess", function() local cmd = subprocess.build_cmd("claude", nil) assert.same({ "claude", "-p" }, cmd) end) + + it("includes model flag when provided", function() + local cmd = subprocess.build_cmd("claude", "model") + assert.same({ "claude", "-p", "--model", "model" }, cmd) + end) + + it("omits model flag when model is nil", function() + local cmd = subprocess.build_cmd("claude", nil, nil) + assert.same({ "claude", "-p" }, cmd) + end) end) end)