Files
jellytau/scripts
dtourolle 62873cab3d feat(search): answer search from a local index; tier downloads by lifetime
Search's instant leg read only downloaded items, so with no downloads it
returned nothing and every keystroke fell through to a full Recursive=true
server query. It now reads the whole synced catalog through the same
availability CTE get_items uses, gated on the same include_catalog_browse
flag so search and browse cannot diverge. (UR-065, DR-108)

Also fixes three defects found while confirming that:

- items_fts grew by a full duplicate index every catalog pass. INSERT OR
  REPLACE fires no AFTER DELETE trigger without recursive_triggers, so the
  old index row was orphaned, and a TEXT PRIMARY KEY meant the replacement
  took a fresh rowid and inserted a second entry. Now a real upsert, with
  migration 021 rebuilding existing indexes. (DR-110)
- DELETE FROM items existed nowhere, so server-side deletions never
  propagated. Adds a post-crawl mark-and-sweep, scoped to crawled types,
  skipping downloaded items, and refusing to run after a partial crawl
  because items.parent_id cascades. (DR-110)
- The index omitted MusicArtist, Playlist and People, which search groups
  results by. Adds them plus people_fts (migration 022). (DR-111)

Re-indexing moves from a frontend startup call to a Rust background task
with a 6h TTL, so a long session no longer searches a stale catalog and a
restart no longer forces a crawl regardless of freshness. (DR-109, IR-030)

Downloads gain a lifetime tier. Eviction selected every completed row by
age with no download_source filter, so hitting the storage limit deleted
the oldest download -- typically one saved deliberately for offline -- to
make room for a precached track. It now reclaims only 'auto' rows, and
expired ones are reclaimed first, before live cache is evicted.
(DR-126, DR-127)

Downloaded video and audio-only handoffs now play from disk instead of
streaming; the video path had never consulted downloads at all. No
transcode is involved: MPV runs video=no and ExoPlayer has no surface for
an Audio item. (DR-123 in part, DR-128)

FTS queries are built as quoted phrases so apostrophes, hyphens and
slashes are data rather than operator syntax, and the item-type filter is
bound rather than interpolated.

Specs: docs/specs/catalog-index-search.md,
docs/specs/read-through-media-cache.md

Includes concurrently-developed favourites browsing and background-audio
stream-end handling; the two workstreams share offline.rs, lib.rs and
online.rs, so no subset of files builds independently.
2026-08-04 17:35:17 +02:00
..
2026-07-02 20:01:43 +02:00
2026-01-26 22:21:54 +01:00
2026-01-26 22:21:54 +01:00
2026-01-26 22:21:54 +01:00
2026-01-26 22:21:54 +01:00
2026-06-20 15:32:32 +02:00
2026-01-26 22:21:54 +01:00

Development Scripts

Collection of utility scripts for building, testing, and deploying JellyTau.

Testing Scripts

test-all.sh

Run all tests (frontend + Rust backend).

./scripts/test-all.sh

test-frontend.sh

Run frontend tests only.

./scripts/test-frontend.sh          # Run all tests
./scripts/test-frontend.sh --watch  # Watch mode
./scripts/test-frontend.sh --ui     # Open UI

test-rust.sh

Run Rust tests only.

./scripts/test-rust.sh              # Run all tests
./scripts/test-rust.sh -- --nocapture  # Show println! output

Android Scripts

build-android.sh

Build the Android APK.

./scripts/build-android.sh          # Debug build
./scripts/build-android.sh release  # Release build

deploy-android.sh

Install APK on connected Android device.

./scripts/deploy-android.sh         # Deploy debug APK
./scripts/deploy-android.sh release # Deploy release APK

build-and-deploy.sh

Build and deploy in one command.

./scripts/build-and-deploy.sh       # Build + deploy debug
./scripts/build-and-deploy.sh release  # Build + deploy release

check-android.sh

Check Android development environment setup.

./scripts/check-android.sh

logcat.sh

View Android logcat filtered for the app.

./scripts/logcat.sh

Traceability & Documentation

extract-traces.ts

Extract requirement IDs (TRACES) from source code and generate a traceability matrix mapping requirements to implementation locations.

bun run traces                    # Generate markdown report
bun run traces:json              # Generate JSON report
bun run traces:markdown           # Save to docs/traceability.md
bun run traces:coverage           # Coverage gate — exits non-zero below 50%

The script scans all TypeScript, Svelte, and Rust files (plus scripts/) looking for TRACES: comments and generates a comprehensive mapping of:

  • Which code files implement which requirements
  • Line numbers and code context
  • Coverage summary by requirement type (UR, IR, DR, JA)

bun run traces:coverage is the supported way to check requirement coverage locally — it runs the same computation CI does. Coverage denominators are derived from docs/requirements.md at run time; they are never hardcoded. An ID that appears in a TRACES: comment but is not defined in requirements.md is reported as orphaned and does not count toward coverage (see DR-093).

Removed: check-req-coverage.sh, check-test-coverage.sh, and find-req-implementations.sh were deleted in July 2026. They read an undocumented @req: tag convention parallel to TRACES:, grepped src-tauri/ unscoped (hanging on ~40 GB of target/ artifacts), and in one case reported "all requirements implemented" from an empty result set. extract-traces.ts is the single source of truth for requirement coverage. See docs/specs/req-coverage-script-removal.md.

Example TRACES comment in code:

// TRACES: UR-005, UR-026 | DR-029
function handlePlayback() { ... }

See docs/traceability.md for the latest generated mapping.

CI/CD Validation

The traceability system is integrated with Gitea Actions CI/CD:

  • Automatically validates TRACES on every push and pull request
  • Enforces minimum 50% coverage threshold
  • Warns if new code lacks TRACES comments
  • Generates traceability reports automatically

For details, see:

Utility Scripts

clean.sh

Clean all build artifacts.

./scripts/clean.sh

NPM Script Aliases

You can also run these via npm/bun:

bun run test:all           # All tests
bun run test:rust          # Rust tests
bun run android:build      # Build Android APK
bun run android:deploy     # Deploy to device
bun run android:dev        # Build + deploy debug
bun run android:check      # Check environment
bun run clean              # Clean artifacts