Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
94be6e9
refactor: split Linux egui host from shared backend
H-Chris233 Aug 30, 2026
f072851
fix: keep CI contracts portable across runners
H-Chris233 Aug 30, 2026
7e2b4d8
fix(ci): preserve CRLF while removing qwen dependency
H-Chris233 Aug 30, 2026
f0a7c28
fix(ci): regenerate target lockfile and install ripgrep
H-Chris233 Aug 30, 2026
e187dcf
fix(ci): gate desktop-only selection voice module
H-Chris233 Aug 30, 2026
4aa550c
ci: limit native build parallelism on cross-platform runners
H-Chris233 Aug 30, 2026
f306c51
fix(host): expose blocking task seam to coordinator
H-Chris233 Aug 30, 2026
752eaa0
fix(settings): avoid macOS default hotkey collision
H-Chris233 Aug 30, 2026
e52e6f4
docs: record cross-platform CI evidence
H-Chris233 Aug 30, 2026
11e2133
ci: expose Linux validation package artifact
H-Chris233 Aug 30, 2026
02a7e34
ci: grant reusable Linux package permissions
H-Chris233 Aug 31, 2026
512e83d
refactor: remove legacy coordinator dictation facade
H-Chris233 Aug 31, 2026
96b3f40
ci: skip unsupported MSI prerelease builds
H-Chris233 Aug 31, 2026
4c24d7e
ci: install minisign only for signed Linux releases
H-Chris233 Aug 31, 2026
35bfd7e
fix: keep test-only coordinator session helper
H-Chris233 Aug 31, 2026
33ffe88
refactor: move style preview diagnostics into core
H-Chris233 Aug 31, 2026
e1f50e7
fix: import shared preferences type from core
H-Chris233 Aug 31, 2026
d3fca35
refactor: centralize enabled vocabulary projection
H-Chris233 Aug 31, 2026
53cf546
ci: install ripgrep for Linux package gates
H-Chris233 Aug 31, 2026
29d653b
test: make source contract line-ending agnostic
H-Chris233 Aug 31, 2026
e3bed3e
fix: keep Linux desktop entry standards compliant
H-Chris233 Aug 31, 2026
95f93b5
docs: expose core style diagnostics contract
H-Chris233 Aug 31, 2026
ea228c1
ci: resolve Linux package version in app directory
H-Chris233 Aug 31, 2026
b42464b
refactor: centralize ASR vocabulary priority
H-Chris233 Aug 31, 2026
3536395
fix: use shared vocabulary note constant
H-Chris233 Aug 31, 2026
3d3603c
refactor: keep vocabulary priority inside core
H-Chris233 Aug 31, 2026
5562632
test: retain starting-stop queue coverage
H-Chris233 Aug 31, 2026
9683423
ci: scope Linux updater URL to the current repository
H-Chris233 Aug 31, 2026
f99a97a
docs: close implementation and artifact evidence
H-Chris233 Aug 31, 2026
52c1e76
docs: record final CI artifact evidence
H-Chris233 Aug 31, 2026
4155586
fix(android): align updater plugin versions
H-Chris233 Aug 31, 2026
6ec4920
fix(android): pin updater crate exactly
H-Chris233 Aug 31, 2026
9c7e27f
refactor(core): remove unused type anchor
H-Chris233 Aug 31, 2026
f24988d
docs: record final artifact runs
H-Chris233 Aug 31, 2026
d26dc98
fix(remote-input): preserve beta status fields
H-Chris233 Aug 31, 2026
0b3dd15
fix(tauri): finish beta host merge
H-Chris233 Aug 31, 2026
5b8775a
fix(asr): pass scoped operation to native qwen adapter
H-Chris233 Aug 31, 2026
80be78c
fix(macos): bundle mlx metallib as a resource
H-Chris233 Aug 31, 2026
06e85f7
test(remote-input): update status wire contract
H-Chris233 Aug 31, 2026
39d6823
feat: share Less Computer voice flow with Linux
H-Chris233 Sep 1, 2026
dc514b7
refactor(core): centralize host-independent runtime policy
H-Chris233 Sep 2, 2026
8e0380c
refactor(core): complete 2.0 backend consolidation
H-Chris233 Sep 2, 2026
f016a23
fix(ci): prepare Sherpa after cache restore
H-Chris233 Sep 2, 2026
408b29d
fix(macos): route native model paths through Core store
H-Chris233 Sep 2, 2026
8013c38
fix(macos): use ModelStore catalog API
H-Chris233 Sep 2, 2026
4887d5b
fix(ci): serialize macOS native test build
H-Chris233 Sep 2, 2026
dd29cd3
test(ci): preserve macOS cargo diagnostics
H-Chris233 Sep 2, 2026
584bc03
fix(macos): release input source lock before await
H-Chris233 Sep 2, 2026
58a0d99
test(core): replace legacy hotkey injection gate
H-Chris233 Sep 2, 2026
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
130 changes: 94 additions & 36 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: CI
# 多平台跨语言质量门禁。release-tauri.yml 是发版流水线(仅打包构建),这里负责
# 在合并前快速验证两件事:
# 1. 全部前端/契约测试与 vite bundle 通过(捕获行为、合同及跨 locale 类型 drift)
# 2. Rust 后端在 macOS / Windows / Linux 都能 cargo check 过(捕获 cfg 漏分支 / 平台 API 误用)
# 2. Tauri 后端在 macOS / Windows、移动端在 Android 编译;Linux 只编译共享 core 与 egui host。
# 跑 build-mac.sh / windows-package-msvc.ps1 / Tauri bundle 太重;只跑轻量 cargo check + vite build。

on:
Expand All @@ -12,6 +12,12 @@ on:
pull_request:
branches: [main, beta]
workflow_dispatch:
inputs:
upload_linux_validation_artifact:
description: Build and upload the Linux egui validation packages (never a release)
required: false
default: false
type: boolean

# 同一 PR 快速重复推送时取消旧运行;workflow_dispatch 用 run_id 隔离。
concurrency:
Expand Down Expand Up @@ -107,7 +113,7 @@ jobs:
run: node scripts/ci-disable-macos-qwen3.mjs

- name: Check Tauri backend (Android target)
run: cargo check --manifest-path src-tauri/Cargo.toml --target aarch64-linux-android
run: cargo check --locked --manifest-path src-tauri/Cargo.toml --target aarch64-linux-android

- name: Initialize generated Android project
run: npm run tauri -- android init --ci
Expand All @@ -121,7 +127,7 @@ jobs:
WRY_ANDROID_PACKAGE: com.openless.app
run: |
mkdir -p "$WRY_ANDROID_KOTLIN_FILES_OUT_DIR"
cargo check --manifest-path src-tauri/Cargo.toml --target x86_64-linux-android
cargo check --locked --manifest-path src-tauri/Cargo.toml --target x86_64-linux-android

- name: Copy Android production and test scaffolding
run: node scripts/copy-android-scaffolding.mjs
Expand Down Expand Up @@ -165,6 +171,71 @@ jobs:
-x :app:rustBuildX86_64Debug
--no-daemon

linux-core-contract:
name: Linux core and egui host
runs-on: ubuntu-22.04
defaults:
run:
working-directory: openless-all/app
steps:
- uses: actions/checkout@v4
with:
submodules: false

- uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- uses: swatinem/rust-cache@v2
with:
workspaces: 'openless-all/app -> target'

- name: Install Linux native dependencies without WebKitGTK
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential \
libasound2-dev \
libdbus-1-dev \
libssl-dev \
libwayland-dev \
libx11-dev \
libxkbcommon-dev \
ripgrep \
pkg-config

- name: Test and lint shared backend
run: |
cargo test --locked -p openless-core
cargo clippy --locked -p openless-core --all-targets -- -D warnings

- name: Test Linux host and UI contract
run: |
cargo test --locked -p openless-linux-egui --all-targets
cargo check --locked -p openless-linux-egui --all-targets

- name: Verify dependency direction, compatibility baseline, and secret surfaces
shell: pwsh
run: |
./scripts/check-core-deps.ps1
./scripts/check-core-deps.ps1 openless-linux-egui
./scripts/check-command-event-baseline.ps1
./scripts/check-core-secret-surface.ps1
./scripts/check-core-test-isolation.ps1
./scripts/check-core-runtime-seam.ps1
./scripts/check-linux-public-surface.ps1

linux-egui-validation-artifact:
name: Linux egui validation artifact
if: github.event_name == 'workflow_dispatch' && inputs.upload_linux_validation_artifact
needs: linux-core-contract
permissions:
contents: write
uses: ./.github/workflows/release-linux-egui.yml
with:
release_tag: ''
secrets: inherit

cross-platform:
name: ${{ matrix.label }} checks
strategy:
Expand All @@ -178,23 +249,21 @@ jobs:
- os: windows-latest
label: Windows
preflight: true
- os: ubuntu-latest
label: Linux
preflight: false
runs-on: ${{ matrix.os }}
env:
# 新增 shared Core 后,macOS 首次编译同时构建 MLX C++ 依赖和完整
# Tauri test binary;限制并发避免 arm64 runner 在峰值内存处被系统终止。
CARGO_BUILD_JOBS: 2
CARGO_PROFILE_TEST_DEBUG: 0
CMAKE_BUILD_PARALLEL_LEVEL: 2
defaults:
run:
working-directory: openless-all/app
steps:
- uses: actions/checkout@v4
with:
# 只在 macOS 初始化 MLX 子模块;Linux 的 C 后端单独初始化 qwen-asr
# 只在 macOS 初始化 MLX 子模块;Windows 不解析该依赖
submodules: ${{ matrix.os == 'macos-latest' && 'recursive' || 'false' }}

- name: Initialize Linux C ASR submodule
if: runner.os == 'Linux'
shell: bash
run: git submodule update --init src-tauri/vendor/qwen-asr
- name: Disable macOS-only Qwen3 MLX dependency
if: runner.os != 'macOS'
run: node scripts/ci-disable-macos-qwen3.mjs
Expand All @@ -214,21 +283,10 @@ jobs:
with:
workspaces: 'openless-all/app/src-tauri -> target'

- name: Install Linux check dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential \
curl \
file \
libasound2-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libssl-dev \
libwebkit2gtk-4.1-dev \
libxdo-dev \
wget
- name: Prepare Windows Sherpa static libraries
if: runner.os == 'Windows'
shell: pwsh
run: ./scripts/prepare-windows-sherpa.ps1

- name: Install frontend dependencies
run: npm ci
Expand All @@ -242,7 +300,7 @@ jobs:
if: matrix.preflight
shell: pwsh
run: |
foreach ($script in @("./scripts/windows-preflight.ps1", "./scripts/windows-build-gnu.ps1", "./scripts/windows-runtime-smoke.ps1")) {
foreach ($script in @("./scripts/windows-preflight.ps1", "./scripts/windows-build-gnu.ps1", "./scripts/windows-runtime-smoke.ps1", "./scripts/prepare-windows-sherpa.ps1")) {
$errors = $null
[System.Management.Automation.PSParser]::Tokenize((Get-Content -Raw $script), [ref]$errors) | Out-Null
if ($errors) {
Expand Down Expand Up @@ -271,27 +329,27 @@ jobs:
if: runner.os == 'macOS'
env:
OPENLESS_CODEX_TEST_EXE: codex
run: cargo test --manifest-path src-tauri/Cargo.toml --lib coding_agent::codex::live::hardening_actually_narrows_the_writable_roots -- --ignored --nocapture --test-threads=1
run: cargo test --locked --manifest-path src-tauri/Cargo.toml --lib coding_agent::codex::live::hardening_actually_narrows_the_writable_roots -- --ignored --nocapture --test-threads=1

- name: Check Tauri backend (cargo check)
run: cargo check --manifest-path src-tauri/Cargo.toml
run: cargo check --locked --manifest-path src-tauri/Cargo.toml

- name: Run Rust backend unit tests
if: runner.os != 'Windows'
run: cargo test --manifest-path src-tauri/Cargo.toml --lib
run: cargo test --locked --manifest-path src-tauri/Cargo.toml --lib

- name: Compile Rust backend unit tests (Windows)
# Windows runner 能链接 lib test binary,但干净镜像缺少可选 native runtime
# DLL entrypoint 时,进程会在 test harness 启动前退出。这里保留 cfg/link
# 覆盖;Rust-only 后端单测由下一步实际执行
# 覆盖;共享 Core 的公开 compatibility contract 由下一步实际执行
if: runner.os == 'Windows'
run: cargo test --manifest-path src-tauri/Cargo.toml --lib --no-run
run: cargo test --locked --manifest-path src-tauri/Cargo.toml --lib --no-run

- name: Run Rust-only backend unit tests (Windows)
# 只把纯 Rust 后端模块编进独立 test crate不链接完整 Tauri app lib。
# 这样 Windows CI 能实际执行 coordinator/hotkey/recorder/insertion 逻辑单测
# 独立 test crate 不链接完整 Tauri app lib,只验证公开 Core contract
# Windows 专属 Tauri 测试在此 runner 只做上一步的 cfg/link 编译覆盖
if: runner.os == 'Windows'
run: cargo test --manifest-path src-tauri/backend-tests/Cargo.toml
run: cargo test --locked --manifest-path src-tauri/backend-tests/Cargo.toml

- name: Check Tauri backend with Rust 1.88 MSRV
run: cargo +1.88.0 check --locked --manifest-path src-tauri/Cargo.toml
Expand Down
Loading
Loading