Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
31f4e7a
chore: bump version to 1.1.18
coolbirdzik Oct 2, 2026
8f6b042
feat(ui): add video playlist and tag clipboard shortcuts
coolbirdzik Oct 2, 2026
6cac56f
feat(video): implement video decoding options and error handling
coolbirdzik Oct 3, 2026
ec6040a
feat: Enhance app update notifications and tag management features
coolbirdzik Oct 3, 2026
778126d
feat: enhance search functionality and keyboard shortcuts
coolbirdzik Oct 3, 2026
a31d265
refactor: improve formatting of diagnostic log messages in tempDiag f…
coolbirdzik Oct 3, 2026
9415c27
feat: update Microsoft Store submission process for automatic publish…
coolbirdzik Oct 3, 2026
0bb0bf6
feat(chips_input): enhance chip rendering with KeyedSubtree for bette…
coolbirdzik Oct 3, 2026
7e0e7f7
feat: Add Cleaner Agent Analysis Panel and related functionality
coolbirdzik Oct 15, 2026
09680fe
Add comprehensive tests for Cleaner Agent features and enhance docume…
coolbirdzik Oct 16, 2026
6b828b0
feat: streamline CI checks by consolidating formatting, analysis, and…
coolbirdzik Oct 16, 2026
8b96968
feat: refactor path handling in CleanerSuggestionScanner and tests fo…
coolbirdzik Oct 16, 2026
1d39743
feat: add support for Google Play and Microsoft Store listings
coolbirdzik Oct 17, 2026
a50dfce
test: update torrent screen tests for platform-specific client imports
coolbirdzik Oct 17, 2026
8396633
feat(torrent): Implement end-to-end testing for torrent library funct…
coolbirdzik Oct 17, 2026
37ae82c
feat: Implement torrent launch functionality and enhance tag color ma…
coolbirdzik Oct 17, 2026
2a8616a
feat: Enhance media kit playback tests and add grid tag strip component
coolbirdzik Oct 17, 2026
cf96604
feat(tab-pane): implement state retention for preview and properties …
coolbirdzik Oct 17, 2026
f16ccff
feat: Refactor file operations handling and add clipboard tests for v…
coolbirdzik Oct 17, 2026
ba67d32
feat: Add plainUri method to MagnetLink and enhance clipboard functio…
coolbirdzik Oct 17, 2026
8204866
Merge branch 'main' of github.com:nth-zik/coolbird-tagify into develop
coolbirdzik Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
217 changes: 114 additions & 103 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ on:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
workflow_dispatch:
inputs:
full_e2e:
description: 'Run every E2E suite and ignore recorded passes'
type: boolean
default: false

env:
FLUTTER_VERSION: '3.47.2'
Expand All @@ -19,6 +25,18 @@ env:
ONEDRIVE_CLIENT_ID: ${{ secrets.ONEDRIVE_CLIENT_ID }}

jobs:
store-listings:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/setup-node@v7.0.0
with:
node-version: '22'
- name: Validate shared Store descriptions and submission scripts
run: node --test scripts/tests/store_listings.test.mjs scripts/tests/google_play_listings.test.mjs
- name: Validate E2E suite selection rules
run: node --test scripts/tests/e2e_select.test.mjs

# Analyze and test
analyze:
runs-on: ubuntu-latest
Expand All @@ -31,32 +49,49 @@ jobs:
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: Check formatting, analysis and unit/widget tests
run: bash scripts/check_quality.sh

# Picks the E2E suites this change needs, so unrelated pushes skip the
# Windows E2E job. Pushes/PRs to main run every suite; develop diffs against
# its last green run. Suites that already passed on the same source
# fingerprint are skipped. Rules: cb_file_manager/integration_test/e2e_impact.json.
# Force a full run with workflow_dispatch (full_e2e), the `e2e:full` PR label
# or `[e2e full]` in the head commit message.
e2e-select:
name: Select E2E suites
runs-on: ubuntu-latest
permissions:
contents: read
actions: read
outputs:
run: ${{ steps.select.outputs.run }}
suites: ${{ steps.select.outputs.suites }}
fingerprint: ${{ steps.select.outputs.fingerprint }}
steps:
- name: Checkout code
uses: actions/checkout@v7.0.1
with:
fetch-depth: 0

- name: Install dependencies
run: |
cd ${{ env.PROJECT_DIR }}
flutter pub get

- name: Verify formatting
run: |
cd ${{ env.PROJECT_DIR }}
dart format --output=none --set-exit-if-changed .

- name: Analyze project
run: |
cd ${{ env.PROJECT_DIR }}
flutter analyze
- uses: actions/setup-node@v7.0.0
with:
node-version: '22'

- name: Run tests
run: |
cd ${{ env.PROJECT_DIR }}
flutter test
- name: Select suites
id: select
env:
GH_TOKEN: ${{ github.token }}
run: node scripts/ci/e2e_select.mjs

# Desktop E2E (integration_test on Windows; requires --dart-define=CB_E2E=true)
e2e-windows:
name: E2E integration tests (Windows)
runs-on: windows-latest
needs: analyze
needs: [analyze, e2e-select]
if: needs.e2e-select.outputs.run == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v7.0.1
Expand All @@ -66,6 +101,7 @@ jobs:
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: Install dependencies
run: |
Expand All @@ -80,104 +116,67 @@ jobs:
(Get-Content $_.FullName) -replace 'cmake_minimum_required\(VERSION [0-9.]+\)', 'cmake_minimum_required(VERSION 3.14)' | Set-Content $_.FullName
}

# The fetch scripts verify SHA-256 and skip when the cached files match.
- name: Cache llama.cpp and aria2 runtimes
uses: actions/cache@v4
with:
path: |
${{ env.PROJECT_DIR }}/windows/llama
${{ env.PROJECT_DIR }}/windows/aria2
key: windows-runtimes-${{ hashFiles('scripts/fetch_llama_runtime.sh', 'scripts/fetch_aria2_runtime.sh') }}

# The llama.cpp runtime (Vulkan DLLs + llama-server.exe) is not committed
# to git. The integration test build runs CMake's INSTALL target, which
# bundles these DLLs, so they must be present before the app is built.
- name: Fetch llama.cpp runtime
- name: Fetch llama.cpp and aria2 runtimes
shell: bash
run: bash scripts/fetch_llama_runtime.sh

- name: Stop stray cb_file_hub.exe
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0

# Flutter desktop integration_test does NOT support multiple test files
# in one `flutter test integration_test` invocation: each file launches
# its own cb_file_hub.exe and the second/third launch fails with
# "Error waiting for a debug connection: The log reader stopped
# unexpectedly, or never started." Run each test file in its own step
# and kill stray app processes between runs.
# See: cb_file_manager/integration_test/app_e2e_test.dart header,
# cb_file_manager/tool/e2e_parallel.dart header.

- name: Run integration tests - app_e2e_test
run: |
cd ${{ env.PROJECT_DIR }}
# Keep the machine-readable test events after a failure. The default
# reporter only leaves GitHub with an aggregate count, which makes a
# Windows-only E2E regression impossible to diagnose from the job.
dart run tool/run_e2e_with_log.dart --json-report
bash scripts/fetch_llama_runtime.sh
bash scripts/fetch_aria2_runtime.sh

- name: Upload app E2E diagnostics
# Flutter desktop integration_test does NOT support multiple test files
# in one `flutter test integration_test` invocation, so e2e_run.mjs runs
# one process per suite and kills stray cb_file_hub.exe between them.
# It keeps going after a failure so every regression shows up in one run.
# showcase_screenshots_e2e_test (marketing screenshots) and the other
# files under "notInCi" in e2e_impact.json are intentionally not run here.
# See: cb_file_manager/integration_test/app_e2e_test.dart header.
- name: Run selected E2E suites
id: run
run: node scripts/ci/e2e_run.mjs --suites "${{ needs.e2e-select.outputs.suites }}"

# Keep the machine-readable test events after a failure. The default
# reporter only leaves GitHub with an aggregate count, which makes a
# Windows-only E2E regression impossible to diagnose from the job.
- name: Upload E2E diagnostics
if: always()
uses: actions/upload-artifact@v7.0.1
with:
name: app-e2e-diagnostics-${{ github.run_attempt }}
name: e2e-diagnostics-${{ github.run_attempt }}
if-no-files-found: warn
path: |
${{ env.PROJECT_DIR }}/build/e2e_report.jsonl
${{ env.PROJECT_DIR }}/build/e2e_report/
${{ env.PROJECT_DIR }}/build/e2e_failed_tests.txt

- name: Stop stray cb_file_hub.exe (after app_e2e_test)
if: always()
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0

# showcase_screenshots_e2e_test is a marketing screenshot generator, not a
# functional test suite. It is intentionally skipped on CI -- run it
# locally with `flutter test integration_test/showcase_screenshots_e2e_test.dart`
# when refreshing marketing screenshots.

- name: Run integration tests - video_thumbnails_e2e_test
run: |
cd ${{ env.PROJECT_DIR }}
flutter test integration_test/video_thumbnails_e2e_test.dart -d windows --dart-define=CB_E2E=true

- name: Stop stray cb_file_hub.exe (after video_thumbnails_e2e_test)
if: always()
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0

- name: Run integration tests - media_kit_playback_e2e_test
run: |
cd ${{ env.PROJECT_DIR }}
flutter test integration_test/media_kit_playback_e2e_test.dart -d windows

- name: Stop stray cb_file_hub.exe (after media_kit_playback_e2e_test)
if: always()
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0

- name: Run integration tests - ffmpeg_thumbnail_e2e_test
run: |
cd ${{ env.PROJECT_DIR }}
flutter test integration_test/ffmpeg_thumbnail_e2e_test.dart -d windows

- name: Stop stray cb_file_hub.exe (after ffmpeg_thumbnail_e2e_test)
if: always()
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0

- name: Run integration tests - file_drag_drop_e2e_test
${{ env.PROJECT_DIR }}/build/e2e-media-kit-ci.jsonl
${{ env.PROJECT_DIR }}/build/e2e-media-kit/
${{ env.PROJECT_DIR }}/build/e2e-torrent-ci.jsonl

# The cache key is the record: e2e_select.mjs lists `e2e-pass-<fingerprint>-*`
# keys and skips those suites when the same source is tested again.
- name: Write E2E pass marker
if: always() && steps.run.outputs.passed != ''
shell: bash
run: |
cd ${{ env.PROJECT_DIR }}
flutter test integration_test/file_drag_drop_e2e_test.dart -d windows
mkdir -p "$RUNNER_TEMP/e2e-pass-marker"
echo "${{ steps.run.outputs.passed }} passed at ${{ github.sha }}" > "$RUNNER_TEMP/e2e-pass-marker/passed.txt"

- name: Stop stray cb_file_hub.exe (after file_drag_drop_e2e_test)
if: always()
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0

- name: Run integration tests - breadcrumb_address_bar_overflow_e2e_test
run: |
cd ${{ env.PROJECT_DIR }}
flutter test integration_test/breadcrumb_address_bar_overflow_e2e_test.dart -d windows

- name: Stop stray cb_file_hub.exe (cleanup)
if: always()
shell: cmd
run: taskkill /F /IM cb_file_hub.exe /T 2>nul & exit /b 0
- name: Record passed suites
if: always() && steps.run.outputs.passed != ''
uses: actions/cache/save@v4
with:
path: ${{ runner.temp }}/e2e-pass-marker
key: e2e-pass-${{ needs.e2e-select.outputs.fingerprint }}-${{ steps.run.outputs.passed }}

# Build Windows
build-windows:
Expand All @@ -192,6 +191,7 @@ jobs:
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: Install dependencies
run: |
Expand All @@ -206,11 +206,21 @@ jobs:
(Get-Content $_.FullName) -replace 'cmake_minimum_required\(VERSION [0-9.]+\)', 'cmake_minimum_required(VERSION 3.14)' | Set-Content $_.FullName
}

- name: Cache llama.cpp and aria2 runtimes
uses: actions/cache@v4
with:
path: |
${{ env.PROJECT_DIR }}/windows/llama
${{ env.PROJECT_DIR }}/windows/aria2
key: windows-runtimes-${{ hashFiles('scripts/fetch_llama_runtime.sh', 'scripts/fetch_aria2_runtime.sh') }}

# The llama.cpp runtime (Vulkan DLLs + llama-server.exe) is not committed
# to git; fetch it before building so CMake can bundle it.
- name: Fetch llama.cpp runtime
- name: Fetch llama.cpp and aria2 runtimes
shell: bash
run: bash scripts/fetch_llama_runtime.sh
run: |
bash scripts/fetch_llama_runtime.sh
bash scripts/fetch_aria2_runtime.sh

- name: Build Windows
shell: bash
Expand All @@ -237,6 +247,7 @@ jobs:
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: Install dependencies
run: |
Expand Down
Loading
Loading