From eb553f53ac9689ab2056fceea0c7b0504f642101 Mon Sep 17 00:00:00 2001
From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Date: Sun, 15 Feb 2026 00:41:16 -0600
Subject: [PATCH 01/15] fix: ensure sqlite migration logs to stderr instead of
stdout (#13691)
---
packages/opencode/src/index.ts | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts
index 0c4fb5d1951..39e77782f59 100644
--- a/packages/opencode/src/index.ts
+++ b/packages/opencode/src/index.ts
@@ -82,14 +82,14 @@ const cli = yargs(hideBin(process.argv))
const marker = path.join(Global.Path.data, "opencode.db")
if (!(await Bun.file(marker).exists())) {
- console.log("Performing one time database migration, may take a few minutes...")
- const tty = process.stdout.isTTY
+ const tty = process.stderr.isTTY
+ process.stderr.write("Performing one time database migration, may take a few minutes..." + EOL)
const width = 36
const orange = "\x1b[38;5;214m"
const muted = "\x1b[0;2m"
const reset = "\x1b[0m"
let last = -1
- if (tty) process.stdout.write("\x1b[?25l")
+ if (tty) process.stderr.write("\x1b[?25l")
try {
await JsonMigration.run(Database.Client().$client, {
progress: (event) => {
@@ -99,22 +99,22 @@ const cli = yargs(hideBin(process.argv))
if (tty) {
const fill = Math.round((percent / 100) * width)
const bar = `${"■".repeat(fill)}${"・".repeat(width - fill)}`
- process.stdout.write(
+ process.stderr.write(
`\r${orange}${bar} ${percent.toString().padStart(3)}%${reset} ${muted}${event.label.padEnd(12)} ${event.current}/${event.total}${reset}`,
)
- if (event.current === event.total) process.stdout.write("\n")
+ if (event.current === event.total) process.stderr.write("\n")
} else {
- console.log(`sqlite-migration:${percent}`)
+ process.stderr.write(`sqlite-migration:${percent}${EOL}`)
}
},
})
} finally {
- if (tty) process.stdout.write("\x1b[?25h")
+ if (tty) process.stderr.write("\x1b[?25h")
else {
- console.log(`sqlite-migration:done`)
+ process.stderr.write(`sqlite-migration:done${EOL}`)
}
}
- console.log("Database migration complete.")
+ process.stderr.write("Database migration complete." + EOL)
}
})
.usage("\n" + UI.logo())
@@ -190,7 +190,7 @@ try {
if (formatted) UI.error(formatted)
if (formatted === undefined) {
UI.error("Unexpected error, check log file at " + Log.file() + " for more details" + EOL)
- console.error(e instanceof Error ? e.message : String(e))
+ process.stderr.write((e instanceof Error ? e.message : String(e)) + EOL)
}
process.exitCode = 1
} finally {
From 985c2a3d15c13512b9bb456882b97ebe863cae5f Mon Sep 17 00:00:00 2001
From: Brandon Julio Thenaro
Date: Sun, 15 Feb 2026 21:45:34 +0800
Subject: [PATCH 03/15] fix(desktop): focus window after update/relaunch
(#13701)
---
packages/desktop/src-tauri/src/windows.rs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/packages/desktop/src-tauri/src/windows.rs b/packages/desktop/src-tauri/src/windows.rs
index 2ddcb0506d8..056720055b5 100644
--- a/packages/desktop/src-tauri/src/windows.rs
+++ b/packages/desktop/src-tauri/src/windows.rs
@@ -22,6 +22,8 @@ impl MainWindow {
pub fn create(app: &AppHandle) -> Result {
if let Some(window) = app.get_webview_window(Self::LABEL) {
+ let _ = window.set_focus();
+ let _ = window.unminimize();
return Ok(Self(window));
}
@@ -50,6 +52,9 @@ impl MainWindow {
let window = window_builder.build()?;
+ // Ensure window is focused after creation (e.g., after update/relaunch)
+ let _ = window.set_focus();
+
setup_window_state_listener(app, &window);
#[cfg(windows)]
From 37611217282b81458bcd5a74850bd96787721b06 Mon Sep 17 00:00:00 2001
From: Denys
+
+
+
AI-агент для програмування з відкритим кодом.
+ + ++ English | + 简体中文 | + 繁體中文 | + 한국어 | + Deutsch | + Español | + Français | + Italiano | + Dansk | + 日本語 | + Polski | + Русский | + Bosanski | + العربية | + Norsk | + Português (Brasil) | + ไทย | + Türkçe | + Українська +
+ +[](https://opencode.ai) + +--- + +### Встановлення + +```bash +# YOLO +curl -fsSL https://opencode.ai/install | bash + +# Менеджери пакетів +npm i -g opencode-ai@latest # або bun/pnpm/yarn +scoop install opencode # Windows +choco install opencode # Windows +brew install anomalyco/tap/opencode # macOS і Linux (рекомендовано, завжди актуально) +brew install opencode # macOS і Linux (офіційна формула Homebrew, оновлюється рідше) +sudo pacman -S opencode # Arch Linux (Stable) +paru -S opencode-bin # Arch Linux (Latest from AUR) +mise use -g opencode # Будь-яка ОС +nix run nixpkgs#opencode # або github:anomalyco/opencode для найновішої dev-гілки +``` + +> [!TIP] +> Перед встановленням видаліть версії старші за 0.1.x. + +### Десктопний застосунок (BETA) + +OpenCode також доступний як десктопний застосунок. Завантажуйте напряму зі [сторінки релізів](https://github.com/anomalyco/opencode/releases) або [opencode.ai/download](https://opencode.ai/download). + +| Платформа | Завантаження | +| --------------------- | ------------------------------------- | +| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` | +| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` | +| Windows | `opencode-desktop-windows-x64.exe` | +| Linux | `.deb`, `.rpm` або AppImage | + +```bash +# macOS (Homebrew) +brew install --cask opencode-desktop +# Windows (Scoop) +scoop bucket add extras; scoop install extras/opencode-desktop +``` + +#### Каталог встановлення + +Скрипт встановлення дотримується такого порядку пріоритету для шляху встановлення: + +1. `$OPENCODE_INSTALL_DIR` - Користувацький каталог встановлення +2. `$XDG_BIN_DIR` - Шлях, сумісний зі специфікацією XDG Base Directory +3. `$HOME/bin` - Стандартний каталог користувацьких бінарників (якщо існує або його можна створити) +4. `$HOME/.opencode/bin` - Резервний варіант за замовчуванням + +```bash +# Приклади +OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash +``` + +### Агенти + +OpenCode містить два вбудовані агенти, між якими можна перемикатися клавішею `Tab`. + +- **build** - Агент за замовчуванням із повним доступом для завдань розробки +- **plan** - Агент лише для читання для аналізу та дослідження коду + - За замовчуванням забороняє редагування файлів + - Запитує дозвіл перед запуском bash-команд + - Ідеально підходить для дослідження незнайомих кодових баз або планування змін + +Також доступний допоміжний агент **general** для складного пошуку та багатокрокових завдань. +Він використовується всередині системи й може бути викликаний у повідомленнях через `@general`. + +Дізнайтеся більше про [agents](https://opencode.ai/docs/agents). + +### Документація + +Щоб дізнатися більше про налаштування OpenCode, [**перейдіть до нашої документації**](https://opencode.ai/docs). + +### Внесок + +Якщо ви хочете зробити внесок в OpenCode, будь ласка, прочитайте нашу [документацію для контриб'юторів](./CONTRIBUTING.md) перед надсиланням pull request. + +### Проєкти на базі OpenCode + +Якщо ви працюєте над проєктом, пов'язаним з OpenCode, і використовуєте "opencode" у назві, наприклад "opencode-dashboard" або "opencode-mobile", додайте примітку до свого README. +Уточніть, що цей проєкт не створений командою OpenCode і жодним чином не афілійований із нами. + +### FAQ + +#### Чим це відрізняється від Claude Code? + +За можливостями це дуже схоже на Claude Code. Ось ключові відмінності: + +- 100% open source +- Немає прив'язки до конкретного провайдера. Ми рекомендуємо моделі, які надаємо через [OpenCode Zen](https://opencode.ai/zen), але OpenCode також працює з Claude, OpenAI, Google і навіть локальними моделями. З розвитком моделей різниця між ними зменшуватиметься, а ціни падатимуть, тому незалежність від провайдера має значення. +- Підтримка LSP з коробки +- Фокус на TUI. OpenCode створено користувачами neovim та авторами [terminal.shop](https://terminal.shop); ми й надалі розширюватимемо межі можливого в терміналі. +- Клієнт-серверна архітектура. Наприклад, це дає змогу запускати OpenCode на вашому комп'ютері й керувати ним віддалено з мобільного застосунку, тобто TUI-фронтенд - лише один із можливих клієнтів. + +--- + +**Приєднуйтеся до нашої спільноти** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode) diff --git a/README.zh.md b/README.zh.md index b2f288f5ba5..113d476b2ed 100644 --- a/README.zh.md +++ b/README.zh.md @@ -31,7 +31,8 @@ Norsk | Português (Brasil) | ไทย | - Türkçe + Türkçe | + Українська [](https://opencode.ai) diff --git a/README.zht.md b/README.zht.md index be4ef053c01..b5181044438 100644 --- a/README.zht.md +++ b/README.zht.md @@ -31,7 +31,8 @@ Norsk | Português (Brasil) | ไทย | - Türkçe + Türkçe | + Українська [](https://opencode.ai) From 878ddc6a0a9eff4fe990dfc241a8eb1c72f0659d Mon Sep 17 00:00:00 2001 From: Filip <34747899+neriousy@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:46:56 +0100 Subject: [PATCH 05/15] fix(app): keybind [shift+tab] (#13695) --- packages/app/src/context/command.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/app/src/context/command.tsx b/packages/app/src/context/command.tsx index 237d7188467..03437c97359 100644 --- a/packages/app/src/context/command.tsx +++ b/packages/app/src/context/command.tsx @@ -316,8 +316,10 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex const isPalette = palette().has(sig) const option = keymap().get(sig) const modified = event.ctrlKey || event.metaKey || event.altKey + const isTab = event.key === "Tab" - if (isEditableTarget(event.target) && !isPalette && !isAllowedEditableKeybind(option?.id) && !modified) return + if (isEditableTarget(event.target) && !isPalette && !isAllowedEditableKeybind(option?.id) && !modified && !isTab) + return if (isPalette) { event.preventDefault() From 3c85cf4fac596928713685068c6c92f356b848f3 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash