Add path filters to CI workflows and create UI test workflow (#501)

* .github/workflows: add UI tests and path-filter Go CI

Add ui-tests.yml workflow to run svelte type checking and vitest
on push/PR to main when ui-svelte/ files change.

- Add path filters to go-ci.yml and go-ci-windows.yml to skip
  Go tests when only non-backend files change
- Filter on **/*.go, go.mod, go.sum, and Makefile

https://claude.ai/code/session_01E6acq54D8JjuE7pczxPGT7

* ui-svelte: remove unused declarations in SpeechInterface

Remove unused `generatedText` state and `clearAudio` function
that caused svelte-check errors.

https://claude.ai/code/session_01E6acq54D8JjuE7pczxPGT7

* .github/workflows: update Node.js to v24

Node 23 is end-of-life; bump to 24 in ui-tests.yml and release.yml.

https://claude.ai/code/session_01E6acq54D8JjuE7pczxPGT7

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Benson Wong
2026-02-01 15:11:49 -08:00
committed by GitHub
parent 20738f3623
commit 7b20fc011b
5 changed files with 75 additions and 15 deletions
+16
View File
@@ -3,9 +3,25 @@ name: Windows CI
on: on:
push: push:
branches: [ "main" ] branches: [ "main" ]
# only run when backend source changes
# cmd/ is excluded because it contains utilities without tests
paths:
- '**/*.go'
- '!cmd/**'
- 'go.mod'
- 'go.sum'
- 'Makefile'
- '.github/workflows/go-ci-windows.yml'
pull_request: pull_request:
branches: [ "main" ] branches: [ "main" ]
paths:
- '**/*.go'
- '!cmd/**'
- 'go.mod'
- 'go.sum'
- 'Makefile'
- '.github/workflows/go-ci-windows.yml'
# Allows manual triggering of the workflow # Allows manual triggering of the workflow
workflow_dispatch: workflow_dispatch:
+16
View File
@@ -3,9 +3,25 @@ name: Linux CI
on: on:
push: push:
branches: [ "main" ] branches: [ "main" ]
# only run when backend source changes
# cmd/ is excluded because it contains utilities without tests
paths:
- '**/*.go'
- '!cmd/**'
- 'go.mod'
- 'go.sum'
- 'Makefile'
- '.github/workflows/go-ci.yml'
pull_request: pull_request:
branches: [ "main" ] branches: [ "main" ]
paths:
- '**/*.go'
- '!cmd/**'
- 'go.mod'
- 'go.sum'
- 'Makefile'
- '.github/workflows/go-ci.yml'
# Allows manual triggering of the workflow # Allows manual triggering of the workflow
workflow_dispatch: workflow_dispatch:
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: "23" node-version: "24"
- name: Install dependencies and build UI - name: Install dependencies and build UI
run: | run: |
cd ui-svelte cd ui-svelte
+42
View File
@@ -0,0 +1,42 @@
name: UI Tests
on:
push:
branches: [ "main" ]
paths:
- 'ui-svelte/**'
- '.github/workflows/ui-tests.yml'
pull_request:
branches: [ "main" ]
paths:
- 'ui-svelte/**'
- '.github/workflows/ui-tests.yml'
workflow_dispatch:
jobs:
run-tests:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ui-svelte
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'npm'
cache-dependency-path: ui-svelte/package-lock.json
- name: Install dependencies
run: npm ci
- name: Type check
run: npm run check
- name: Run tests
run: npm test
@@ -12,7 +12,6 @@
let inputText = $state(""); let inputText = $state("");
let isGenerating = $state(false); let isGenerating = $state(false);
let generatedAudioUrl = $state<string | null>(null); let generatedAudioUrl = $state<string | null>(null);
let generatedText = $state<string | null>(null);
let generatedVoice = $state<string | null>(null); let generatedVoice = $state<string | null>(null);
let generatedTimestamp = $state<Date | null>(null); let generatedTimestamp = $state<Date | null>(null);
let error = $state<string | null>(null); let error = $state<string | null>(null);
@@ -148,7 +147,6 @@
// Create object URL for the audio blob and store metadata // Create object URL for the audio blob and store metadata
generatedAudioUrl = URL.createObjectURL(audioBlob); generatedAudioUrl = URL.createObjectURL(audioBlob);
generatedText = trimmedText;
generatedVoice = $selectedVoiceStore; generatedVoice = $selectedVoiceStore;
generatedTimestamp = new Date(); generatedTimestamp = new Date();
} catch (err) { } catch (err) {
@@ -167,18 +165,6 @@
abortController?.abort(); abortController?.abort();
} }
function clearAudio() {
if (generatedAudioUrl) {
URL.revokeObjectURL(generatedAudioUrl);
}
generatedAudioUrl = null;
generatedText = null;
generatedVoice = null;
generatedTimestamp = null;
error = null;
inputText = "";
}
function clearInput() { function clearInput() {
inputText = ""; inputText = "";
} }