From 8176ff779552f8b895de17d93b3f71b49872ecde Mon Sep 17 00:00:00 2001 From: iptoux Date: Wed, 27 May 2026 20:33:41 +0200 Subject: [PATCH 1/2] chore: release v0.2.7 --- CHANGELOG.md | 11 +++++++++++ Cargo.toml | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/tauri.conf.json | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f32223e..d141f70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +### Changed + +### Fixed + +### Removed + + +## [0.2.7] - 2026-05-27 + +### Added + - **Sidebar File Diff section + center diff viewer**: new collapsible **File Diff** panel sits between Project Files and Git Commits in the sidebar. Backend module `src-tauri/src/git_status.rs` exposes `git_status_changes` (`git status --porcelain=v1 -z` + merged `--numstat` for staged/unstaged, untracked line counts via file read), `git_file_diff` (unified diff, synthetic `+++` body for untracked files), `git_stage_file` / `git_unstage_file`, and `git_status_watch_start` / `git_status_watch_stop` — a `notify`-based recursive watcher on the work tree (debounced 300 ms) emits `git_status_dirty` via Tauri so the UI refreshes without manual polling. `ChangedFile` rows show a status marker (`M`/`A`/`D`/`R`/`?`/`C`), path, and `+N`/`-N` counts; hover reveals **stage** (`+`) and **unstage** (`−`) actions. Clicking a row opens (or focuses) a `CenterTabKind::FileDiff { rel_path, staged }` tab with an inline diff viewer (`src/workbench/file_diff/`) that classifies lines (`@@` hunk headers, `+`/`-`/`---`/`+++`). Frontend bridge mirrors all types and adds `listen_git_status_dirty` with an RAII `TauriEventListener`. Per-workspace `sidebar_diff_open` (default **open**) persists expand/collapse; `open_center_diff_tab` deduplicates tabs per path. Sidebar panels block is now a **three-slot** layout (Explorer → Diff → Graph) with two `SidebarResizer` handles and `SIDEBAR_DIFF_HEIGHT_PCT_*` in `localStorage`. 18+ new `SbDiff*` i18n keys in all 13 locales. Component CSS in `file_diff_section/file-diff-section.css` and `file_diff/file-diff.css` (theme tokens only). - **Terminal context menu + native clipboard (Linux-safe)**: workspace xterm terminals now expose a right-click context menu with **Copy**, **Paste**, and **Select all** (`src/workbench/terminal_context_menu.rs`, mounted from `WorkspacePanel`). **Shift+right-click** pastes directly (Linux terminal convention). Keyboard shortcuts: **Ctrl+Shift+C/V** for copy/paste; **Ctrl+C** copies only when text is selected, otherwise SIGINT goes to the shell. Clipboard I/O bypasses the unreliable WebKitGTK `navigator.clipboard` path via new Tauri commands `clipboard_read_text` / `clipboard_write_text` backed by **`arboard`** (`src-tauri/src/clipboard.rs`, X11 + Wayland); the frontend uses `clipboard_*_text_compat()` in `tauri_bridge.rs` with a Web Clipboard fallback for `trunk serve`. `public/terminal_bootstrap.mjs` dispatches `blxcode-terminal-contextmenu`, `blxcode-terminal-paste-request`, and `blxcode-terminal-copy-request` custom events; `terminal_glue.rs` gained `getSelection`, `paste`, `selectAll`, `clearSelection`, and `focus` wrappers. Copy clears selection only after a successful write; failures surface as toasts (`WsTermToastCopyFailed` / `WsTermToastPasteFailed`). Global `contextmenu` suppression in `workbench/mod.rs` skips `.ws-term-cell__xterm` / `.xterm` targets. 7 new `WsTermMenu*` / `WsTermToast*` i18n keys in all 13 locales. CSS: `.terminal-context-menu` in `styles.css`. diff --git a/Cargo.toml b/Cargo.toml index 663ff53..2c3f7c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "blxcode-ui" -version = "0.2.6" +version = "0.2.7" edition = "2021" license = "MIT" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 7f20249..d448741 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "blxcode" -version = "0.2.6" +version = "0.2.7" description = "Local-first desktop workbench for AI coding agents, terminals, memory, tasks, and an embedded browser." authors = ["BLXCode contributors"] edition = "2021" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 2f4a162..1399c16 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "BLXCode", - "version": "0.2.6", + "version": "0.2.7", "identifier": "com.bitslix.blxcode", "build": { "beforeDevCommand": "node scripts/tauri-before-build.cjs --dev", From 08b90d57d7cfc33321e826036dbd7528c87adcc3 Mon Sep 17 00:00:00 2001 From: iptoux Date: Wed, 27 May 2026 21:11:44 +0200 Subject: [PATCH 2/2] fix(ci): replace mapfile with read loop for compatibility in release workflow - Updated the release workflow to use a read loop instead of mapfile for gathering file paths, ensuring compatibility with macOS's older bash version. - Adjusted the handling of signatures in the release process to follow the same pattern for consistency. --- .github/workflows/release.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fa3ea72..4f44364 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -311,7 +311,11 @@ jobs: TAG: ${{ needs.resolve.outputs.release_tag }} run: | set -euo pipefail - mapfile -t files < <(find target -path '*/release/bundle/*' -type f \( \ + # macOS /bin/bash is 3.2 (no mapfile); use read loop instead. + files=() + while IFS= read -r f; do + files+=("$f") + done < <(find target -path '*/release/bundle/*' -type f \( \ -name '*.dmg' \ -o -name '*.app.tar.gz' \ -o -name '*.app.tar.gz.sig' \ @@ -332,7 +336,11 @@ jobs: REPO: ${{ github.repository }} TAG: ${{ needs.resolve.outputs.release_tag }} run: | - mapfile -t signatures < <(find target -path '*/release/bundle/*' -name '*.sig' -type f) + set -euo pipefail + signatures=() + while IFS= read -r sig; do + signatures+=("$sig") + done < <(find target -path '*/release/bundle/*' -name '*.sig' -type f) if [[ ${#signatures[@]} -eq 0 ]]; then echo "No updater signatures found; skipping latest.json" exit 0