Skip to content

Commit 40c01fe

Browse files
author
Laurent Guitton
committed
feat: bump to v2.17.0 — opencode provider + per-CLI model picker
opencode-cli joins Claude Code and Codex as a first-class AI provider with binary discovery, `opencode run` dispatch, and Settings status. Each CLI agent now exposes its own model selector; opencode enumerates its catalog dynamically, Claude Code uses its stable aliases, and Codex falls back to free-text entry. The chosen model is persisted per provider and forwarded via `--model`. 🪄 Commit via GitWand
1 parent 1b2645a commit 40c01fe

14 files changed

Lines changed: 52 additions & 41 deletions

File tree

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [2.17.0] - 2026-06-04
11+
12+
v2.17 rounds out the agent-CLI lineup with **opencode** as a first-class AI provider, and gives every CLI agent its own model picker — a second select under the provider dropdown, scoped per provider so switching back restores the previous choice.
13+
14+
### Added
15+
16+
- **opencode as a first-class AI provider**`opencode-cli` joins `claude-code-cli` and `codex-cli` in the `AIProvider` union. Detection mirrors the existing CLI providers (binary discovery across PATH + common install locations, login-shell env so the agent finds its auth), and it appears in Settings → AI with the same status/re-detect pattern. Prompts run one-shot via `opencode run`.
17+
- **Per-provider model selection** — for the three CLI agents (Claude Code, Codex, opencode) a second select appears under the provider picker. opencode enumerates its catalog dynamically (`opencode models`, `provider/model` form, with a Refresh button); Claude Code advertises its stable aliases (`sonnet`/`opus`/`haiku`); Codex falls back to free-text entry. The chosen model is forwarded to each CLI via `--model`.
18+
- **`aiModelByProvider` setting** — the model is persisted per provider (keyed by provider id), so switching providers restores each one's previous choice. An empty value means "let the CLI use its own configured default".
19+
20+
### Technical
21+
22+
- New Rust commands `detect_opencode_cli`, `opencode_cli_prompt` (`opencode run [--model …]`), and `opencode_list_models` (`opencode models`), plus a `model` argument threaded into `claude_cli_prompt` and `codex_cli_prompt`. `OpencodeCliInfo` type added; commands registered in `lib.rs`. Mirrored across all three layers: `commands/ai.rs`, `dev-server.mjs`, and the `backend-ai.ts` wrapper.
23+
- `useAIProvider` gains `modelForProvider` / `listModelsForProvider` helpers and dispatches `opencode-cli` in `suggest()` / `rawPrompt()`. `aiModelByProvider` added to both the `useSettings` `AppSettings` and the `SettingsPanel` `Settings` interface.
24+
- Unit tests for the model-selection helpers and CLI dispatch (`useAIProvider-opencode.test.ts`).
25+
- i18n: `aiProviderOpencodeCli`, opencode hints, and the `aiModelCli*` model-picker keys across all five locales (en, fr, es, pt-BR, zh-CN).
26+
1027
## [2.16.0] - 2026-05-29
1128

1229
v2.16 adds native OS notifications for pull-request activity — review requests, new comments, CI pass/fail flips, and merge/close — surfaced while GitWand is in the background, with zero extra network requests beyond the existing Launchpad poll.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<p align="center">
2222
<img alt="License" src="https://img.shields.io/badge/license-MIT-8B5CF6">
2323
<img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-100%25-3178C6">
24-
<img alt="Version" src="https://img.shields.io/badge/version-2.16.0-22c55e">
24+
<img alt="Version" src="https://img.shields.io/badge/version-2.17.0-22c55e">
2525
</p>
2626

2727
---

ROADMAP.md

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,6 @@
66

77
## What's Next
88

9-
### v2.17.0 — opencode provider + per-CLI model picker
10-
11-
_Round out the agent-CLI lineup and let each one expose its own models._
12-
13-
**opencode as a first-class AI provider**
14-
15-
- Add `opencode-cli` to the `AIProvider` union (`useAIProvider.ts`) alongside `claude-code-cli` and `codex-cli`
16-
- Detection + launch plumbing mirroring the existing CLI providers (binary discovery, `shell_env` login-shell env so the agent finds its auth)
17-
- Settings → AI: opencode appears in the provider select with the same enable/disable + status pattern
18-
19-
**Per-provider model selection (second select list)**
20-
21-
- For the three CLI agents — Claude Code, Codex, opencode — surface a **second select list** under the provider picker to choose the model, replacing the current free-text `aiModel` field for these providers
22-
- Each provider advertises its own model list (e.g. Claude Code → Claude models; Codex → OpenAI models; opencode → its configured catalog); the list is provider-scoped and resets to that provider's default on switch
23-
- `aiModel` persists per provider so switching back restores the previous choice; `SettingsPanel.vue` + `useSettings.ts` AppSettings kept in sync (duplicate-interfaces guard)
24-
- Graceful fallback to free text when a provider can't enumerate its models
25-
26-
---
27-
289
### v2.18.0 — Inline CI Check Annotations
2910

3011
Overlay check-run annotations in the diff — the exact line that failed the linter or typecheck, right where you need it in the review.
@@ -172,6 +153,7 @@ Positioning: neither "yet another Git GUI" nor an IDE. A first-class Git navigat
172153
173154
| Version | Highlights |
174155
|---------|-----------|
156+
| **v2.17.0** | opencode provider + per-CLI model picker — `opencode-cli` as a first-class AI provider (`opencode run`, binary discovery, Settings status), second model select under the provider picker for the three CLI agents (opencode enumerates via `opencode models`, Claude Code aliases, Codex free-text), `aiModelByProvider` persisted per provider, `--model` threaded through all three CLIs |
175157
| **v2.16.0** | PR Activity Notifications — background Launchpad poller, zero-network snapshot diff (`useLaunchpadNotifications`) for CI flips / review requests / new comments / merge-close, native OS notifications via `tauri-plugin-notification` (background-only), Settings granularity (All · Reviews & comments · CI failures only · None) + "by people" bot filter, enriched `workspace_prs_all` (CI/review/comment fields) |
176158
| **v2.15.1** | Git Tree polish & quick actions — Force push (branch context menu + protected-trunk/diverged-remote guard), Quick Stash `⌘⇧,` (instant, AI label) + pending badge in the commit area, Submodules in the Git Tree (branch-picker section, per-commit pointed-SHA badge, click-to-navigate) |
177159
| **v2.15.0** | Git Tree multi-branch — Git Tree as primary view, Log panel removed, unified context menus, stash/branch/tag management from the graph, DAG trunk-pinning, WIP node, search bar |

apps/desktop/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitwand/desktop",
3-
"version": "2.16.0",
3+
"version": "2.17.0",
44
"private": true,
55
"description": "GitWand Desktop — lightweight Git client with smart conflict resolution (Tauri + Vue 3)",
66
"type": "module",

apps/desktop/src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "gitwand-desktop"
3-
version = "2.16.0"
3+
version = "2.17.0"
44
description = "GitWand Desktop — standalone merge conflict resolution"
55
authors = ["Laurent Guitton <lb.guitton@gmail.com>"]
66
license = "MIT"

apps/desktop/src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-config-schema/schema.json",
33
"productName": "GitWand",
4-
"version": "2.16.0",
4+
"version": "2.17.0",
55
"identifier": "com.gitwand.desktop",
66
"build": {
77
"frontendDist": "../dist",

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitwand/cli",
3-
"version": "2.16.0",
3+
"version": "2.17.0",
44
"description": "GitWand CLI — resolve Git conflicts from your terminal or CI pipeline",
55
"type": "module",
66
"main": "dist/index.js",

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitwand/core",
3-
"version": "2.16.0",
3+
"version": "2.17.0",
44
"description": "GitWand core — automatic Git conflict resolution engine (powers @gitwand/cli, @gitwand/mcp, and the GitWand desktop app)",
55
"type": "module",
66
"main": "dist/index.js",

packages/mcp/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitwand/mcp",
3-
"version": "2.16.0",
3+
"version": "2.17.0",
44
"mcpName": "io.github.devlint/gitwand",
55
"description": "GitWand MCP server — smart Git conflict resolution for AI agents (Claude, Cursor, Windsurf, Claude Code)",
66
"type": "module",

packages/mcp/server.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
33
"name": "io.github.devlint/gitwand",
44
"description": "Auto-resolves Git merge conflicts so agents only touch the complex hunks.",
5-
"version": "2.16.0",
5+
"version": "2.17.0",
66
"repository": {
77
"url": "https://github.com/devlint/GitWand",
88
"source": "github"
@@ -11,7 +11,7 @@
1111
{
1212
"registryType": "npm",
1313
"identifier": "@gitwand/mcp",
14-
"version": "2.16.0",
14+
"version": "2.17.0",
1515
"transport": {
1616
"type": "stdio"
1717
}

0 commit comments

Comments
 (0)