Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

## Unreleased

- The `agy` install hint now points at the official `https://antigravity.google/cli/install.sh`;
the npm package it named does not exist.
- Configure the model each agent runs with: `jury agents model <agent> <model>` saves a default in
`~/.jury/config.json`, a `model` field per agent in `jury.config.json` sets one per repository,
and `--model <agent>=<model>` sets one for a run, each overriding the one before. The model is
passed as a flag or environment variable only when Jury runs the agent, on first runs, resumed
rounds, replies and judging alike; the agent's own configuration is never changed. Supported for
codex, claude, grok, opencode, qwen, copilot and kimi; a configured model for any other agent
stops the run with an error. Runs record the models used, and `jury agents` shows them (#99).
every built-in agent except amp, which has no per-run model flag; a configured model for amp
stops the run with an error. Runs record the models used, and `jury agents` shows them (#99, #103, #104, #108, #111).
- Add `jury agents jury` to save default reviewers globally in `~/.jury/config.json`, beside the
global judge: `jury agents jury claude,droid`, `--reset`, and a checkbox picker when run with no
arguments in a terminal. Runs without `--jury` use them; repository `reviewer` roles and
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ See [models](docs/configuration.md#models) for each agent's flag and the precede
| `claude` | Anthropic Claude Code | `npm i -g @anthropic-ai/claude-code` | reviewer |
| `grok` | xAI Grok | `npm i -g @vibe-kit/grok-cli` | reviewer |
| `droid` | Factory Droid | `curl -fsSL https://app.factory.ai/cli \| sh` | reviewer |
| `agy` | Google Antigravity | see Antigravity's docs | reviewer |
| `agy` | Google Antigravity | `curl -fsSL https://antigravity.google/cli/install.sh \| bash` | reviewer |
| `qwen` | Qwen Code | `npm i -g @qwen-code/qwen-code` | opt-in |
| `copilot` | GitHub Copilot CLI | `npm i -g @github/copilot` | opt-in |
| `opencode` | OpenCode | `npm i -g opencode-ai` | opt-in |
Expand Down
5 changes: 4 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,11 @@ one stops the run before any agent starts rather than silently using its default
| `qwen` | `--model` | qwen 0.24.4 |
| `copilot` | `--model` | Copilot CLI 1.0.88 |
| `kimi` | `--model`, an alias defined in `~/.kimi-code/config.toml` | Kimi Code 2.1.1 |
| `droid` | `--model` after `exec` (`droid exec --help` lists the IDs) | droid 0.226.2 |
| `agy` | `--model` (`agy models` lists them) | agy 1.2.10 |
| `cursor` | `--model` (`cursor-agent --list-models` lists them) | cursor-agent 2026.09.23 |
| `trae` | `--model` after `exec` | traecli 0.207.1 |
| `amp` | not supported: `--mode` selects model, prompt and tools together | — |
| `droid`, `agy`, `cursor`, `trae` | not yet verified; set the model in the CLI's own configuration | — |

A built-in definition supports models by marking the flag's position with a `"{{modelArgs}}"`
element in every command it runs and giving `modelArgs` (for example `["--model", "{{model}}"]`),
Expand Down
9 changes: 7 additions & 2 deletions lib/agents/agy.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"cwd": "worktree",
"argv": [
"agy",
"{{modelArgs}}",
"--dangerously-skip-permissions",
"--add-dir",
"{{worktree}}",
Expand All @@ -22,6 +23,7 @@
"supported": true,
"argv": [
"agy",
"{{modelArgs}}",
"--dangerously-skip-permissions",
"--add-dir",
"{{worktree}}",
Expand All @@ -36,9 +38,12 @@
],
"idFrom": "\"conversation_id\"\\s*:\\s*\"([^\"]+)\""
},
"modelNote": "no per-run model flag verified for this CLI yet; set its model in the CLI's own configuration",
"modelArgs": [
"--model",
"{{model}}"
],
"report": "agy-json",
"expectSeconds": 420,
"install": "npm install -g @google/antigravity-cli",
"install": "curl -fsSL https://antigravity.google/cli/install.sh | bash",
"docs": "https://antigravity.google/docs/cli"
}
7 changes: 6 additions & 1 deletion lib/agents/cursor.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"cwd": "worktree",
"argv": [
"cursor-agent",
"{{modelArgs}}",
"-p",
"--output-format",
"json",
Expand All @@ -15,6 +16,7 @@
],
"judgeArgv": [
"cursor-agent",
"{{modelArgs}}",
"-p",
"--output-format",
"json",
Expand All @@ -28,7 +30,10 @@
"supported": false,
"reason": "fresh conversation with finding context; never extract session ids from assistant prose"
},
"modelNote": "no per-run model flag verified for this CLI yet; set its model in the CLI's own configuration",
"modelArgs": [
"--model",
"{{model}}"
],
"report": "result-json",
"expectSeconds": 400,
"install": "curl https://cursor.com/install -fsS | bash",
Expand Down
7 changes: 6 additions & 1 deletion lib/agents/droid.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"argv": [
"droid",
"exec",
"{{modelArgs}}",
"--cwd",
"{{worktree}}",
"--auto",
Expand All @@ -23,6 +24,7 @@
"argv": [
"droid",
"exec",
"{{modelArgs}}",
"--cwd",
"{{worktree}}",
"--auto",
Expand All @@ -36,7 +38,10 @@
],
"idFrom": "\"session_id\"\\s*:\\s*\"([^\"]+)\""
},
"modelNote": "no per-run model flag verified for this CLI yet; set its model in the CLI's own configuration",
"modelArgs": [
"--model",
"{{model}}"
],
"report": "result-json",
"expectSeconds": 130,
"install": "curl -fsSL https://app.factory.ai/cli | sh",
Expand Down
7 changes: 6 additions & 1 deletion lib/agents/trae.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"argv": [
"traecli",
"exec",
"{{modelArgs}}",
"--sandbox",
"read-only",
"--skip-git-repo-check",
Expand All @@ -17,6 +18,7 @@
"judgeArgv": [
"traecli",
"exec",
"{{modelArgs}}",
"--sandbox",
"workspace-write",
"--skip-git-repo-check",
Expand All @@ -29,7 +31,10 @@
"supported": false,
"reason": "exec session ids are not documented in its output; replies start fresh with finding context"
},
"modelNote": "no per-run model flag verified for this CLI yet; set its model in the CLI's own configuration",
"modelArgs": [
"--model",
"{{model}}"
],
"report": "whole",
"expectSeconds": 900,
"install": "sh -c \"$(curl -fsSL https://trae.cn/trae-cli/install_v2.sh)\"",
Expand Down
12 changes: 9 additions & 3 deletions test/models.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,20 @@ async function scratch(t, prefix) {
// Where each CLI's model flag lands, verified against its own --help:
// codex-cli 0.156.1 (exec and exec resume: -m, --model), Claude Code 2.1.281
// (--model), opencode 1.18.32 (run: -m, --model), qwen 0.24.4 (-m, --model),
// Copilot CLI 1.0.88 (--model), Kimi Code 2.1.1 (-m, --model).
// Copilot CLI 1.0.88 (--model), Kimi Code 2.1.1 (-m, --model), droid 0.226.2
// (exec: -m, --model), agy 1.2.10 (--model), cursor-agent 2026.09.23 (--model),
// traecli 0.207.1 (exec: -m, --model).
const FLAG_AT = {
codex: { argv: 2, judgeArgv: 2, resume: 3 },
claude: { argv: 1, judgeArgv: 1, resume: 1 },
opencode: { argv: 2, judgeArgv: 2, resume: 2 },
qwen: { argv: 1, judgeArgv: 1, resume: 1 },
copilot: { argv: 1, judgeArgv: 1 },
kimi: { argv: 1, judgeArgv: 1, resume: 1 },
droid: { argv: 2, resume: 2 },
agy: { argv: 1, resume: 1 },
cursor: { argv: 1, judgeArgv: 1 },
trae: { argv: 2, judgeArgv: 2 },
};
const byName = new Map(DEFAULTS.agents.map(a => [a.name, a]));

Expand All @@ -54,8 +60,8 @@ test("each supported agent gets its model flag in every command, and nothing wit
assert.deepEqual(withModel(grok.argv, { ...grok, model: "grok-4.3" }), grok.argv);
});

test("agents without a verified per-run model say so and refuse a configured model", () => {
for (const name of ["amp", "droid", "agy", "cursor", "trae"]) {
test("agents without a per-run model say so and refuse a configured model", () => {
for (const name of ["amp"]) {
const agent = byName.get(name);
assert.equal(supportsModel(agent), false, name);
assert.ok(agent.modelNote, `${name} explains why`);
Expand Down
Loading