Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
21e98d1
Add canonical packed glyph layer codec
kostyafarber Jul 27, 2026
81dc3dc
Store glyph layers as lazy SQLite blobs
kostyafarber Jul 27, 2026
25bc76c
Add packed layer golden and import stress tests
kostyafarber Jul 27, 2026
12d56cf
Stream foreign fonts into lazy SQLite layers
kostyafarber Jul 28, 2026
be05d96
Make lazy layer residency explicit
kostyafarber Jul 28, 2026
00e535f
Route eager font loading through streams
kostyafarber Jul 28, 2026
2242d58
Share streamed glyph and store write paths
kostyafarber Jul 28, 2026
90d6008
Consolidate canonical layer store paths
kostyafarber Jul 28, 2026
1437c03
Modularize packed glyph codecs
kostyafarber Jul 28, 2026
c4007d0
Cache canonical layer codec metadata
kostyafarber Jul 28, 2026
ac8b568
Finish lazy layer review cleanup
kostyafarber Jul 28, 2026
50bdc77
Pipeline canonical layer packing and writes
kostyafarber Jul 28, 2026
53155a6
Build import indexes after streaming
kostyafarber Jul 28, 2026
59b455c
Reduce canonical layer encoder allocations
kostyafarber Jul 28, 2026
b7d3ec2
Preserve TrueType quadratic layers
kostyafarber Jul 28, 2026
30b9ef6
Derive stable compiled outline identities
kostyafarber Jul 29, 2026
cf7c8c0
Compress canonical glyph layer storage
kostyafarber Jul 30, 2026
ffcb2f4
Avoid full font copies during layer hydration
kostyafarber Jul 30, 2026
01dfd65
Preserve Designspace metrics and source order
kostyafarber Jul 30, 2026
9113b09
Refine atomic layer replacement identities
kostyafarber Jul 30, 2026
cce0067
Tighten canonical layer validation
kostyafarber Jul 30, 2026
3a0a0be
Share bounded layer loads and stage imports
kostyafarber Jul 30, 2026
23bc249
Speed up values-only layer replay
kostyafarber Jul 30, 2026
dbcc9b6
Replace custom glyph codecs with MessagePack
kostyafarber Jul 31, 2026
cc62782
Merge main into agent/lazy-packed-glyph-layers
kostyafarber Jul 31, 2026
d1715f5
Modularize glyph layer storage
kostyafarber Jul 31, 2026
e3107e7
Restore complete Slug atlas residency
kostyafarber Jul 31, 2026
aaa3dbd
Gate visual and GPU E2E correctness
kostyafarber Jul 31, 2026
d146e53
Stabilize visual E2E snapshots
kostyafarber Aug 1, 2026
0297a8b
Generate glyph info before E2E builds
kostyafarber Aug 1, 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
51 changes: 24 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -310,12 +310,21 @@ jobs:
run: pnpm test:native

# ---------------------------------------------------------------------------
# Optional / manual jobs
# Required end-to-end correctness
# ---------------------------------------------------------------------------
playwright:
name: Playwright (Manual)
if: github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
e2e:
name: E2E ${{ matrix.name }}
strategy:
fail-fast: false
matrix:
include:
- name: Visual
project: visual
runner: macos-latest
- name: GPU
project: gpu
runner: macos-latest
runs-on: ${{ matrix.runner }}
permissions:
contents: read
steps:
Expand All @@ -332,12 +341,7 @@ jobs:
- name: Install toolchain
run: rustup show

- uses: Swatinem/rust-cache@v2
with:
shared-key: shift-rust

- name: Cache node_modules
id: modules-cache
uses: actions/cache@v6
with:
path: |
Expand All @@ -350,38 +354,30 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile --prefer-offline

- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v6
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ hashFiles('apps/desktop/node_modules/@playwright/test/package.json') }}

- name: Install Playwright browsers
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: pnpm --filter @shift/desktop exec playwright install

- name: Cache native module binary
id: native-cache
uses: actions/cache@v6
with:
path: crates/shift-bridge/*.node
key: native-module-${{ runner.os }}-${{ hashFiles('crates/**', 'Cargo.lock') }}

- uses: Swatinem/rust-cache@v2
if: steps.native-cache.outputs.cache-hit != 'true'
with:
shared-key: shift-rust-${{ runner.os }}

- name: Build native module
if: steps.native-cache.outputs.cache-hit != 'true'
run: pnpm build:native

- name: Run Playwright tests
run: xvfb-run pnpm test:playwright
env:
LIBGL_ALWAYS_SOFTWARE: "true"
- name: Run E2E tests
run: pnpm test:e2e:${{ matrix.project }}

- name: Upload snapshots on failure
- name: Upload Playwright failures
if: failure()
uses: actions/upload-artifact@v7
with:
name: playwright-results
name: playwright-${{ matrix.project }}-results
path: apps/desktop/e2e/test-results/
retention-days: 7

Expand All @@ -400,6 +396,7 @@ jobs:
- rust-fmt
- rust-check
- integration
- e2e
runs-on: ubuntu-latest
permissions: {}
steps:
Expand Down
23 changes: 6 additions & 17 deletions .github/workflows/perf.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,17 +119,9 @@ jobs:
- name: Run engine benchmarks
run: pnpm test:perf

playwright:
name: Playwright ${{ matrix.name }}
playwright-perf:
name: Playwright Perf
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
strategy:
fail-fast: false
matrix:
include:
- name: GPU
project: gpu
- name: Perf
project: perf
runs-on: macos-latest
permissions:
contents: read
Expand Down Expand Up @@ -212,22 +204,19 @@ jobs:
path: crates/shift-bridge/*.node
key: ${{ steps.native-cache.outputs.cache-primary-key }}

- name: Build E2E app
run: pnpm --filter @shift/desktop build:e2e

- name: Run Playwright ${{ matrix.name }} tests
run: pnpm --filter @shift/desktop exec playwright test --project=${{ matrix.project }}
- name: Run Playwright perf tests
run: pnpm test:e2e:perf

- name: Upload Playwright failures
if: failure()
uses: actions/upload-artifact@v7
with:
name: playwright-${{ matrix.project }}-results
name: playwright-perf-results
path: apps/desktop/e2e/test-results/
retention-days: 7

- name: Upload perf results
if: ${{ always() && matrix.project == 'perf' }}
if: always()
uses: actions/upload-artifact@v7
with:
name: perf-results
Expand Down
Loading