Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
375 commits
Select commit Hold shift + click to select a range
3738c7c
refactor(frontend): integrate Alpine.js Persist plugin for localStora…
pythoninthegrass Jan 17, 2026
7312f6e
chore: regenerate app icons from updated logo
pythoninthegrass Jan 17, 2026
1a0e220
feat(taskfile): add browser selection to npm:test:e2e command
pythoninthegrass Jan 17, 2026
8b2cc14
ci: add comprehensive test workflow for GitHub Actions
pythoninthegrass Jan 17, 2026
ea22f6e
docs: move task-152 to completed
pythoninthegrass Jan 17, 2026
4c06f0f
feat(testing): add @tauri tags and E2E_MODE for fast default test run…
pythoninthegrass Jan 17, 2026
e29395a
docs: add E2E_MODE usage notes to AGENTS.md
pythoninthegrass Jan 17, 2026
77c2633
fix(tests): stabilize 4 flaky WebKit e2e tests with data-testid selec…
pythoninthegrass Jan 17, 2026
b4fd922
test(playlist): refactor task-150 tests to use mock API routes
pythoninthegrass Jan 17, 2026
5cf42f0
docs(backlog): mark task-150 complete with all ACs validated
pythoninthegrass Jan 17, 2026
1e335b7
docs(backlog): move task-160 to completed
pythoninthegrass Jan 17, 2026
e269346
feat(playlists): batch delete via multi-select and Delete/Backspace (…
pythoninthegrass Jan 17, 2026
3c1e2ed
fix(playlists): batch delete respects multi-selection and works in Tauri
pythoninthegrass Jan 17, 2026
6c66fe4
feat(themes): implement Metro Teal theme preset (task-162)
pythoninthegrass Jan 17, 2026
a1c53e7
docs(backlog): add implementation plan for task-046 Settings Menu
pythoninthegrass Jan 17, 2026
b2c8ba6
feat(ui): refine sidebar collapse, footer sizing, and icon hover states
pythoninthegrass Jan 17, 2026
8cace07
docs(backlog): complete task-046 and task-162
pythoninthegrass Jan 17, 2026
a1b19b8
feat(settings): toggle settings view with Cmd-, or Escape
pythoninthegrass Jan 17, 2026
f5cbad8
feat: metadata editor
pythoninthegrass Jan 17, 2026
d9659b6
docs: update backlog tasks
pythoninthegrass Jan 17, 2026
1be28dd
feat(testing): add property-based testing with fast-check and Vitest
pythoninthegrass Jan 17, 2026
d31fa5f
docs(AGENTS): add fast-check to Context7 libraries, organize by category
pythoninthegrass Jan 17, 2026
91e935e
fix(ui): metro-teal theme and track selection styling fixes
pythoninthegrass Jan 17, 2026
ed98805
feat: implement custom macOS title bar with overlay mode
pythoninthegrass Jan 17, 2026
93d580f
docs: add synthetic benchmarking plan for library scanning performance
pythoninthegrass Jan 17, 2026
2ce97c3
feat: implement "Show in Finder" context menu functionality
pythoninthegrass Jan 17, 2026
017b281
fix: show in finder
pythoninthegrass Jan 17, 2026
6a1e795
chore (settings.json): allow more actions
pythoninthegrass Jan 17, 2026
122a347
refactor: remove track info, block delete track when editing metadata
pythoninthegrass Jan 17, 2026
5450404
fix: now playing divider line color between tracks
pythoninthegrass Jan 18, 2026
5a95730
feat: add back/forward navigation to metadata editor for sequential t…
pythoninthegrass Jan 18, 2026
4630491
chore: add backlog task files for task-153, task-165, task-167
pythoninthegrass Jan 18, 2026
99f1751
fix: metadata editor navigation starts at first track in selection
pythoninthegrass Jan 18, 2026
eaaf30a
fix: disable navigation at batch boundaries instead of wrapping
pythoninthegrass Jan 18, 2026
332b080
fix: metadata navigation starts in batch mode, first nav goes to firs…
pythoninthegrass Jan 18, 2026
eb2eba0
fix: swap prev/next when exiting batch mode
pythoninthegrass Jan 18, 2026
62593e9
fix: prevent viewport shift when multi-selecting tracks
pythoninthegrass Jan 18, 2026
f8d2d09
Revert "fix: prevent viewport shift when multi-selecting tracks"
pythoninthegrass Jan 18, 2026
fddb610
fix: prevent viewport shift on track selection in metro-teal theme
pythoninthegrass Jan 18, 2026
21bb9c2
docs: update backlog tasks
pythoninthegrass Jan 18, 2026
a61cd53
chore: update llm permissions
pythoninthegrass Jan 18, 2026
1f14f59
feat: ignore artist prefixes
pythoninthegrass Jan 18, 2026
7c1600e
feat: add comprehensive logging to all frontend operations
pythoninthegrass Jan 18, 2026
685041e
feat: add navigation logging for view and section switching
pythoninthegrass Jan 18, 2026
de2514d
feat: double click settings cog to toggle
pythoninthegrass Jan 18, 2026
696dfd6
chore: llm perms
pythoninthegrass Jan 18, 2026
5723e0e
feat: add file_mtime_ns and file_size columns to library table
pythoninthegrass Jan 18, 2026
dc3d349
feat: implement synthetic library benchmarking suite
pythoninthegrass Jan 18, 2026
0c401cf
feat: add Taskfile commands for benchmark suite
pythoninthegrass Jan 18, 2026
c706cfd
feat: include bench taskfile in main taskfile
pythoninthegrass Jan 18, 2026
43b787e
fix: add PYTHONPATH to bench taskfile for module imports
pythoninthegrass Jan 18, 2026
90185ad
fix: handle macOS /tmp symlink in path validation
pythoninthegrass Jan 18, 2026
39824f5
feat: add graceful KeyboardInterrupt handling to benchmark scripts
pythoninthegrass Jan 18, 2026
7f26451
chore: use only local seed directory for clone dataset
pythoninthegrass Jan 18, 2026
aa10dcd
feat: add database persistence, logging, and CSV results to benchmark…
pythoninthegrass Jan 18, 2026
7435364
feat: implement 3-phase performance optimizations for library scanning
pythoninthegrass Jan 18, 2026
b5c1baa
refactor: remove redundant app/backend directory
pythoninthegrass Jan 18, 2026
15f0288
docs: update backlog tasks
pythoninthegrass Jan 18, 2026
2ba1293
feat: add infinite scroll to library view using Alpine.js Intersect p…
pythoninthegrass Jan 19, 2026
2b3185b
docs: add implementation complexity analysis to Alpine.js plugin tasks
pythoninthegrass Jan 19, 2026
dcbf1de
fix: correct npm path prefix in tauri.conf.json for monorepo structure
pythoninthegrass Jan 19, 2026
8586aa2
Revert "feat: add infinite scroll to library view using Alpine.js Int…
pythoninthegrass Jan 19, 2026
b7a625f
refactor: remove infinite scroll, preserve intersect plugin for album…
pythoninthegrass Jan 19, 2026
3e7c490
docs: clarify album art lazy loading scope after intersect plugin ana…
pythoninthegrass Jan 19, 2026
712580a
feat: implement Last.fm scrobbling integration
pythoninthegrass Jan 19, 2026
b473c3e
feat: add Last.fm frontend integration for settings and scrobbling
pythoninthegrass Jan 19, 2026
c07689d
fix: add requests dependency to PEX build for Last.fm API integration
pythoninthegrass Jan 19, 2026
f8720f0
chore: update llm perms
pythoninthegrass Jan 19, 2026
28b2ce8
ci: add requests to pex deps
pythoninthegrass Jan 19, 2026
ce7faa7
docs: update backlog tasks
pythoninthegrass Jan 19, 2026
45c6fda
feat: last.fm integration
pythoninthegrass Jan 19, 2026
79547ff
ci: add playwright mcp
pythoninthegrass Jan 19, 2026
1c75a4a
feat: Add double-click to jump to current track in library view
pythoninthegrass Jan 19, 2026
a9b7019
docs: update backlog tasks
pythoninthegrass Jan 19, 2026
5739203
chore: consistent platform deps
pythoninthegrass Jan 19, 2026
a27f413
docs: update llm instrx
pythoninthegrass Jan 19, 2026
1b67d75
docs: update backlog tasks
pythoninthegrass Jan 19, 2026
fcfb3fb
fix(scrobble): use Math.ceil for played_time/duration to prevent off-…
pythoninthegrass Jan 20, 2026
85f3a64
fix(lastfm): use fraction-based threshold comparison for robustness
pythoninthegrass Jan 20, 2026
8bc0073
test(lastfm): add E2E tests for scrobble threshold behavior (task-007)
pythoninthegrass Jan 20, 2026
9e7b665
docs: add SECURITY.md
pythoninthegrass Jan 20, 2026
0a74265
feat: watched folders
pythoninthegrass Jan 20, 2026
b06c9c4
docs: update backlog tasks
pythoninthegrass Jan 20, 2026
dfa15bb
feat(playlists): fix library-to-playlist drag-drop and add reorder vi…
pythoninthegrass Jan 20, 2026
ed6046a
docs: update backlog tasks
pythoninthegrass Jan 20, 2026
79a92fd
feat(backend): implement Rust database layer and scanner modules
pythoninthegrass Jan 21, 2026
3a0bcd6
feat(library): add Rust library commands and migration analysis
pythoninthegrass Jan 22, 2026
595f23d
docs: update backlog tasks
pythoninthegrass Jan 22, 2026
f9502a5
chore: update llm instrx
pythoninthegrass Jan 22, 2026
0b38622
feat(queue): migrate queue API to Rust Tauri commands
pythoninthegrass Jan 22, 2026
f3f7ced
docs: update task-183 with implementation notes
pythoninthegrass Jan 22, 2026
92e894a
docs: mark task-183 as done
pythoninthegrass Jan 22, 2026
452cc28
feat(events): replace WebSocket with Tauri event system
pythoninthegrass Jan 22, 2026
f210a20
feat(playlists): migrate playlists API to Rust Tauri commands
pythoninthegrass Jan 22, 2026
fcd8209
docs: mark task-185 as done
pythoninthegrass Jan 22, 2026
354ec90
fix(playlists): use global workaround for drag-drop in Tauri
pythoninthegrass Jan 22, 2026
183d963
docs: mark task-191 as done
pythoninthegrass Jan 22, 2026
16573ef
fix(sidebar): add delay before playlist reorder activation
pythoninthegrass Jan 22, 2026
6146050
docs: add task-192 for playlist reorder delay
pythoninthegrass Jan 22, 2026
72b9819
chore: update llm perms
pythoninthegrass Jan 22, 2026
5ef3d9d
docs: update llm instrx
pythoninthegrass Jan 22, 2026
cc3b996
feat: Favorites API migrated from FastAPI to Rust
pythoninthegrass Jan 22, 2026
957b029
feat(settings): migrate Settings API to Rust using Tauri Store
pythoninthegrass Jan 22, 2026
ebeaeff
fix(playback): resolve shuffle and rapid-next regressions
pythoninthegrass Jan 22, 2026
83364d9
refactor: move scanning to rust w/logging, add manual scan to settings
pythoninthegrass Jan 22, 2026
927cae5
chore: update llm perms
pythoninthegrass Jan 22, 2026
e33a6bf
feat(lastfm): implement Phase 1 core infrastructure
pythoninthegrass Jan 22, 2026
f787eec
feat(lastfm): implement Phase 2 settings commands
pythoninthegrass Jan 22, 2026
c0c6e9a
feat(lastfm): implement Phase 3 authentication commands
pythoninthegrass Jan 22, 2026
8fa5681
feat(lastfm): implement scrobbling commands (Phase 4)
pythoninthegrass Jan 22, 2026
3d2d6e8
feat(lastfm): implement queue commands and background retry (Phase 5)
pythoninthegrass Jan 22, 2026
2d98554
feat(lastfm): implement loved tracks import (Phase 6)
pythoninthegrass Jan 22, 2026
8e28e21
feat(frontend): migrate Last.fm API to Tauri commands (Phase 7)
pythoninthegrass Jan 22, 2026
c299f4b
fix(lastfm): improve error message display for connection failures
pythoninthegrass Jan 22, 2026
bc05b09
docs: add comprehensive Last.fm implementation documentation
pythoninthegrass Jan 22, 2026
086b1b7
chore(backlog): update task-189 with completed Phases 4-6
pythoninthegrass Jan 22, 2026
7f88b62
test(lastfm): add comprehensive E2E tests for queue and import (Phase 8)
pythoninthegrass Jan 22, 2026
3e976da
chore(backlog): mark task-189 complete - Last.fm migration finished
pythoninthegrass Jan 22, 2026
3b3b1c2
fix(e2e): update Last.fm UI text and add missing HTTP mocks
pythoninthegrass Jan 22, 2026
5877cfa
fix(e2e): fix all 34 Last.fm E2E tests
pythoninthegrass Jan 23, 2026
01738fd
fix(e2e): fix 6 failing tests and metadata editor navigation
pythoninthegrass Jan 23, 2026
ace2ec1
chore(backlog): mark task-195 complete and archive legacy tasks
pythoninthegrass Jan 23, 2026
360218e
fix(watcher): prevent UI freeze during manual scan
pythoninthegrass Jan 23, 2026
e6912e3
refactor(ui): rename "Reconciliation Scan" to "Manual Scan"
pythoninthegrass Jan 23, 2026
bc6d3f9
style(ui): apply opaque styling to playlist context menu
pythoninthegrass Jan 23, 2026
f66a802
fix(ui): prevent context menu and text selection on sidebar items
pythoninthegrass Jan 23, 2026
cb1118d
test(frontend): add property-based tests using fast-check
pythoninthegrass Jan 23, 2026
0bf7f43
test(backend): add property-based tests using proptest
pythoninthegrass Jan 23, 2026
dc85d7f
docs(testing): add JavaScript and Rust property test documentation
pythoninthegrass Jan 23, 2026
2072eb4
chore: update mise runtimes
pythoninthegrass Jan 23, 2026
9feabb0
feat!: complete Tauri migration - remove Python sidecar
pythoninthegrass Jan 23, 2026
6cb8de0
chore: remove python static analysis
pythoninthegrass Jan 23, 2026
bbe8368
docs: update backlog tasks
pythoninthegrass Jan 24, 2026
b2cbf5a
feat: move Last.fm scrobbling to Rust audio thread
pythoninthegrass Jan 25, 2026
bc52cf3
refactor: remove frontend Last.fm scrobbling logic
pythoninthegrass Jan 25, 2026
97cbc66
feat: re-enable queue events with debouncing
pythoninthegrass Jan 25, 2026
8cb2e26
fix: library capping visible tracks at 100
pythoninthegrass Jan 25, 2026
2b92d61
chore: update deps
pythoninthegrass Jan 25, 2026
3ef1bdd
docs: update backlog tasks
pythoninthegrass Jan 25, 2026
b2fdf7e
feat: add queue_state table and database operations
pythoninthegrass Jan 25, 2026
543ed26
feat: add queue state Tauri commands and events
pythoninthegrass Jan 25, 2026
df60cc7
feat: integrate queue state persistence in frontend
pythoninthegrass Jan 25, 2026
3dc0175
docs: update task-197 acceptance criteria status
pythoninthegrass Jan 25, 2026
7e8df29
docs: update backlog tasks status
pythoninthegrass Jan 25, 2026
207c267
fix: make queue state session-only (reset on app start)
pythoninthegrass Jan 25, 2026
407058b
docs: update task-197 AC #6 to reflect session-only behavior
pythoninthegrass Jan 25, 2026
9655011
fix: resolve Rust 2024 never type fallback warning
pythoninthegrass Jan 25, 2026
b3976a6
docs: create task-201 for Rust 2024 edition migration
pythoninthegrass Jan 25, 2026
26b7394
docs: link task-197 to task-201 (Rust 2024 migration)
pythoninthegrass Jan 25, 2026
54dbc20
docs: mark task-197 as Done (Phase 2 state consolidation complete)
pythoninthegrass Jan 25, 2026
7dcad78
feat: add play history tracking for shuffle navigation (task-200)
pythoninthegrass Jan 25, 2026
30ab5c9
test: add Playwright tests for shuffle navigation history (task-200)
pythoninthegrass Jan 25, 2026
4d0fba7
docs: update task-200 with implementation notes and testing guidance
pythoninthegrass Jan 25, 2026
c2cf140
docs: mark task-200 as Done (shuffle navigation history complete)
pythoninthegrass Jan 25, 2026
0957392
feat: add artwork LRU cache and consolidate time formatting utilities
pythoninthegrass Jan 25, 2026
c2843d3
feat: create frontend settings service for backend sync
pythoninthegrass Jan 25, 2026
7a387d9
feat: initialize settings service before Alpine starts
pythoninthegrass Jan 25, 2026
2030e26
feat: migrate ui store settings to backend persistence
pythoninthegrass Jan 25, 2026
45396c2
feat: migrate sidebar component settings to backend
pythoninthegrass Jan 25, 2026
8d1ac21
feat: migrate library column settings to backend
pythoninthegrass Jan 25, 2026
3ae76c0
docs: update task-198 with settings unification implementation
pythoninthegrass Jan 25, 2026
0112554
chore: update backlog task metadata (timestamps and ordinals)
pythoninthegrass Jan 25, 2026
57e23d2
fix: replace $watch with Alpine.effect in ui store
pythoninthegrass Jan 25, 2026
e41611e
fix: prevent queue event listener from overriding shuffle state durin…
pythoninthegrass Jan 25, 2026
0b78072
fix: clear queue on startup and enqueue only subsequent tracks in seq…
pythoninthegrass Jan 25, 2026
37f0af4
fix: prevent double-queuing of clicked track in sequential mode
pythoninthegrass Jan 25, 2026
25fa679
fix: prevent race condition causing tracks to play twice on double-click
pythoninthegrass Jan 25, 2026
a52f6f8
feat(tests): add API mocking infrastructure for Playwright tests
pythoninthegrass Jan 25, 2026
5b2655c
docs: update backlog tasks
pythoninthegrass Jan 25, 2026
6a327ce
fix(tests): make column and sorting tests flexible for browser mode
pythoninthegrass Jan 25, 2026
ee39250
fix(tests): update scrobble and sidebar tests for current architecture
pythoninthegrass Jan 25, 2026
db85304
feat(tests): add comprehensive frontend E2E test coverage
pythoninthegrass Jan 25, 2026
9ab0862
docs(backlog): add test coverage task with Phase 1 complete
pythoninthegrass Jan 25, 2026
33123ec
feat(tests): add Phase 2 E2E and unit tests for error states, setting…
pythoninthegrass Jan 25, 2026
70c4f8b
docs(backlog): update task progress - Phase 2 tests complete, task-20…
pythoninthegrass Jan 25, 2026
8b5cb33
docs(backlog): mark Phase 2 item #12 column headers complete
pythoninthegrass Jan 25, 2026
82e25a6
feat(tests): add Phase 3 backend Rust command tests
pythoninthegrass Jan 25, 2026
5787fcf
docs(backlog): update task-203 with Phase 3 progress
pythoninthegrass Jan 25, 2026
93c8fcd
feat(tests): add event emission and thread safety tests
pythoninthegrass Jan 25, 2026
8f1a153
docs(backlog): mark Phase 3 items #19 and #20 complete
pythoninthegrass Jan 25, 2026
463102a
feat(coverage): add Phase 4 coverage measurement and CI integration
pythoninthegrass Jan 25, 2026
ecf49b6
feat(tests): add library store Vitest unit tests
pythoninthegrass Jan 25, 2026
554acc5
ci: remove legacy Python tests and use self-hosted runners
pythoninthegrass Jan 25, 2026
ad51d93
docs: update test commands and counts in AGENTS.md and testing.md
pythoninthegrass Jan 25, 2026
8e5cd31
test: fix Vitest property test failures (Phase 1)
pythoninthegrass Jan 25, 2026
ccab82f
test: fix Playwright drag-and-drop test skips (Phase 2)
pythoninthegrass Jan 25, 2026
297794f
test: fix Rust property test failures (Phase 3)
pythoninthegrass Jan 25, 2026
bce9fa5
docs: update test counts in AGENTS.md after task-204 fixes
pythoninthegrass Jan 25, 2026
36f179f
fix: handle NaN/Infinity and clamp seek position to duration
pythoninthegrass Jan 25, 2026
6a8a211
test: fix flaky property tests by excluding NaN from float generators
pythoninthegrass Jan 25, 2026
0ec9da3
fix: trim value in _stripIgnoredPrefix early return
pythoninthegrass Jan 25, 2026
5c89849
docs: update test counts in testing.md
pythoninthegrass Jan 25, 2026
08f2236
feat(backend): make export_diagnostics async to prevent UI blocking
pythoninthegrass Jan 25, 2026
4c7c553
feat(frontend): add .log extension and loading state to log export
pythoninthegrass Jan 25, 2026
567fb09
test: add E2E tests for non-blocking log export
pythoninthegrass Jan 25, 2026
ed6d743
docs: mark task-206 as completed
pythoninthegrass Jan 25, 2026
8194615
docs: update backlog tasks
pythoninthegrass Jan 25, 2026
9d970a4
chore (settings-view.js): rename log file
pythoninthegrass Jan 25, 2026
e0d0d7b
chore: add proptest saved case
pythoninthegrass Jan 25, 2026
3ce4b8b
fix(ui): remove jittery animations from volume slider
pythoninthegrass Jan 25, 2026
48257ac
test(playback): add E2E test for smooth volume slider dragging
pythoninthegrass Jan 25, 2026
23a8104
fix(player): update volume optimistically for immediate UI feedback
pythoninthegrass Jan 25, 2026
470f267
fix(player-controls): commit volume immediately on drag release
pythoninthegrass Jan 25, 2026
51f54d7
test(playback): add E2E tests for rapid volume slider interactions
pythoninthegrass Jan 25, 2026
a18cb33
docs: update backlog tasks
pythoninthegrass Jan 25, 2026
8269d09
refactor: migrate to Rust 2024 edition
pythoninthegrass Jan 25, 2026
065dcf2
fix(lastfm): improve loved tracks import matching and add logging
pythoninthegrass Jan 25, 2026
c95edfd
fix(library): improve missing track reconciliation and locate UX
pythoninthegrass Jan 26, 2026
8108718
docs: update backlog tasks
pythoninthegrass Jan 26, 2026
a96bf94
docs: mark completed backlog tasks
pythoninthegrass Jan 26, 2026
f1b7e3e
merge: resolve conflicts with tauri-migration versions
pythoninthegrass Jan 26, 2026
81fc2b4
ci: switch to ubuntu, bump deps
pythoninthegrass Jan 26, 2026
a9d4b8a
fix(ci): fix Deno formatting in vite.config.js
pythoninthegrass Jan 26, 2026
90dd494
fix(ci): install system dependencies and fix Playwright port conflict
pythoninthegrass Jan 26, 2026
ab370c4
fix(config): update deno.jsonc to use flat options format
pythoninthegrass Jan 26, 2026
c2b6fcd
fix(ci): update webkit2gtk package to 4.1 for Ubuntu 24.04
pythoninthegrass Jan 26, 2026
4342d32
style: apply deno fmt with updated config (single quotes)
pythoninthegrass Jan 26, 2026
fa24f06
fix(taskfile): replace npm lint/format with deno commands
pythoninthegrass Jan 26, 2026
cb24938
fix(rust): resolve clippy linting warnings
pythoninthegrass Jan 26, 2026
d84dc45
fix(js): resolve deno linting warnings
pythoninthegrass Jan 26, 2026
4ff1d00
chore(rust): apply clippy auto-fixes for remaining files
pythoninthegrass Jan 26, 2026
fd2e474
fix(tests): correct import paths in error-states Playwright tests
pythoninthegrass Jan 26, 2026
2f64739
chore: remove python remnants
pythoninthegrass Jan 26, 2026
b85862b
fix(ci): install webkit browser for Playwright E2E tests
pythoninthegrass Jan 26, 2026
b8db04d
feat(tests): add fail-fast with maxFailures=5 for CI
pythoninthegrass Jan 26, 2026
c2d9873
fix(ci): install Playwright browsers from project directory
pythoninthegrass Jan 26, 2026
d22a8cc
feat(ci): auto-cancel superseded workflow runs
pythoninthegrass Jan 26, 2026
6c5cad9
perf(ci): cache cargo-tarpaulin binary to speed up Rust tests
pythoninthegrass Jan 26, 2026
3c98d33
perf(tests): optimize Playwright E2E performance for CI
pythoninthegrass Jan 26, 2026
27f55ef
fix(tests): adjust Playwright timeouts to avoid flaky failures
pythoninthegrass Jan 26, 2026
71f0cb7
perf(rust): optimize dev build performance and trim tokio features
pythoninthegrass Jan 26, 2026
6ccd698
perf(ci): disable incremental compilation for faster clean builds
pythoninthegrass Jan 26, 2026
8fb6ede
feat(tasks): add cargo-nextest support and build timing analysis
pythoninthegrass Jan 26, 2026
1c2265d
docs: add cargo check workflow and build:timings task
pythoninthegrass Jan 26, 2026
41a151f
docs(rust): add dependency audit analysis
pythoninthegrass Jan 26, 2026
ad8578a
perf(ci): add path filters to skip CI for non-business logic changes
pythoninthegrass Jan 26, 2026
a51d43b
docs: update backlog tasks
pythoninthegrass Jan 26, 2026
387bd5f
fix (ci): revert to self-hosted gha runner
pythoninthegrass Jan 27, 2026
8340c73
ci (test.yml): switch to hybrid workflows
pythoninthegrass Jan 27, 2026
5e0fb95
perf(ci): remove Rust dependency cache from self-hosted jobs
pythoninthegrass Jan 27, 2026
6d5b08b
perf(ci): remove npm cache from self-hosted jobs
pythoninthegrass Jan 27, 2026
86d5323
refactor(ci): make rust-tests depend on build job
pythoninthegrass Jan 27, 2026
365ac3b
perf(ci): enable incremental compilation for self-hosted Rust jobs
pythoninthegrass Jan 27, 2026
4612180
fix(ci): prevent duplicate workflow runs on PRs
pythoninthegrass Jan 27, 2026
078615d
chore (Cargo.toml): remove unused deps
pythoninthegrass Jan 27, 2026
3b2b216
ci: split build vs. test servers
pythoninthegrass Jan 27, 2026
41ae2b4
chore: remove unused deps
pythoninthegrass Jan 27, 2026
e89f09f
ci: uniform runs-on directives
pythoninthegrass Jan 27, 2026
9d71ba1
ci: use all available arm64 macs
pythoninthegrass Jan 27, 2026
80ece76
docs: update backlog tasks
pythoninthegrass Jan 27, 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
  •  
  •  
  •  
34 changes: 33 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,57 @@
"allow": [
"Bash(backlog:*)",
"Bash(cat:*)",
"Bash(deno fmt:*)",
"Bash(deno lint:*)",
"Bash(fd:*)",
"Bash(git add:*)",
"Bash(git bisect:*)",
"Bash(git commit:*)",
"Bash(git log:*)",
"Bash(git show:*)",
"Bash(git push:*)",
"Bash(git rev-parse:*)",
"Bash(git revert:*)",
"Bash(head:*)",
"Bash(ls:*)",
"Bash(lsof:*)",
"Bash(npm:*)",
"Bash(npx:*)",
"Bash(pre-commit:*)",
"Bash(pytest:*)",
"Bash(python:*)",
"Bash(python3:*)",
"Bash(rg:*)",
"Bash(ruff:*)",
"Bash(sqlite3:*)",
"Bash(task:*)",
"Bash(timeout:*)",
"Bash(tree:*)",
"Bash(uv:*)",
"mcp__backlog__get_task_creation_guide",
"mcp__backlog__get_workflow_overview",
"mcp__backlog__task_create",
"mcp__backlog__task_list",
"mcp__backlog__task_search",
"mcp__backlog__task_view",
"mcp__context7__query-docs",
"mcp__mantic__search_files",
"mcp__screencap__screenshot_app",
"mcp__sequential-thinking__sequentialthinking",
"mcp__serena__activate_project",
"mcp__serena__find_file",
"mcp__serena__find_referencing_symbols",
"mcp__serena__find_symbol",
"mcp__serena__get_current_config",
"mcp__serena__get_symbols_overview",
"mcp__serena__initial_instructions",
"mcp__serena__list_dir",
"mcp__serena__read_memory",
"mcp__serena__think_about_task_adherence",
"Read(//tmp/**)",
"Read(//Users/*/Desktop/**)",
"Read(//Users/*/Downloads/**)"
"Read(//Users/*/Downloads/**)",
"WebSearch"
],
"deny": []
},
Expand Down
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
# Last.fm API Integration
# Get your API key and secret from: https://www.last.fm/api/account/create
LASTFM_API_KEY=your_lastfm_api_key_here
LASTFM_API_SECRET=your_lastfm_api_secret_here

# Taskfile Env Precedence
# * Manipulate venv path
# * https://taskfile.dev/docs/experiments/env-precedence
TASK_X_ENV_PRECEDENCE=1
Empty file removed .github/workflows/.gitkeep
Empty file.
254 changes: 254 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
name: Test Suite

on:
push:
branches: [main]
paths:
# Rust source and config
- '**/*.rs'
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/build.rs'
# JavaScript/TypeScript source
- '**/*.js'
- '**/*.ts'
- '**/*.jsx'
- '**/*.tsx'
- '**/*.mjs'
# Frontend assets and templates
- '**/*.html'
- '**/*.css'
# Node.js config
- '**/package.json'
- '**/package-lock.json'
- '**/tsconfig.json'
- '**/vite.config.js'
- '**/vitest.config.js'
- '**/playwright.config.js'
# Tauri config
- '**/tauri.conf.json'
# Task runner config
- 'taskfile.yml'
# Test files
- 'tests/**/*'
- '**/tests/**/*'
# CI workflow itself
- '.github/workflows/test.yml'
pull_request:
branches: [main]
paths:
# Rust source and config
- '**/*.rs'
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/build.rs'
# JavaScript/TypeScript source
- '**/*.js'
- '**/*.ts'
- '**/*.jsx'
- '**/*.tsx'
- '**/*.mjs'
# Frontend assets and templates
- '**/*.html'
- '**/*.css'
# Node.js config
- '**/package.json'
- '**/package-lock.json'
- '**/tsconfig.json'
- '**/vite.config.js'
- '**/vitest.config.js'
- '**/playwright.config.js'
# Tauri config
- '**/tauri.conf.json'
# Task runner config
- 'taskfile.yml'
# Test files
- 'tests/**/*'
- '**/tests/**/*'
# CI workflow itself
- '.github/workflows/test.yml'

# Cancel in-progress runs when a new push supersedes them
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
# Frontend E2E tests with Playwright
playwright-tests:
name: Playwright E2E Tests
runs-on: [macOS, ARM64]
timeout-minutes: 20

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'

- name: Install frontend dependencies
working-directory: ./app/frontend
run: npm ci

- name: Install Playwright browsers
working-directory: ./app/frontend
run: npx playwright install --with-deps webkit

- name: Run Playwright tests
working-directory: ./app/frontend
run: npx playwright test
env:
CI: true

- name: Upload Playwright report
if: always()
uses: actions/upload-artifact@v6
with:
name: playwright-report
path: playwright-report/
retention-days: 30

- name: Upload test results
if: always()
uses: actions/upload-artifact@v6
with:
name: playwright-results
path: test-results/
retention-days: 30

# Linting and code quality
lint:
name: Lint and Format Check
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'

- name: Install Deno
uses: denoland/setup-deno@v2
with:
deno-version: v2.x

- name: Check Deno formatting
run: deno fmt --check

- name: Run Deno lint
run: deno lint

# Vitest unit tests with coverage
vitest-tests:
name: Vitest Unit Tests
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: app/frontend/package-lock.json

- name: Install frontend dependencies
working-directory: ./app/frontend
run: npm ci

- name: Run Vitest with coverage
working-directory: ./app/frontend
run: npm run test:coverage
continue-on-error: true # Pre-existing prop-test failures

- name: Upload coverage report
if: always()
uses: actions/upload-artifact@v6
with:
name: vitest-coverage
path: app/frontend/coverage/
retention-days: 30

# Build verification
build:
name: Build Verification
runs-on: [macOS, ARM64]
timeout-minutes: 5
env:
CARGO_INCREMENTAL: 1 # Enable incremental compilation on self-hosted (reuses artifacts)
CARGO_TERM_COLOR: always

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Install frontend dependencies
working-directory: ./app/frontend
run: npm ci

- name: Build frontend
working-directory: ./app/frontend
run: npm run build

- name: Check Rust build
working-directory: ./src-tauri
run: cargo check --all-features

# Rust backend tests with coverage
rust-tests:
name: Rust Backend Tests
runs-on: [macOS, ARM64]
needs: build
timeout-minutes: 5
env:
CARGO_INCREMENTAL: 1 # Enable incremental compilation on self-hosted (reuses artifacts)
CARGO_TERM_COLOR: always

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Install cargo-tarpaulin
run: |
# Only install if not already cached
if ! command -v cargo-tarpaulin &> /dev/null; then
cargo install cargo-tarpaulin
else
echo "cargo-tarpaulin already installed (cached)"
fi

- name: Run Rust tests with coverage
working-directory: ./src-tauri
run: |
cargo tarpaulin --out Html --out Json --output-dir coverage \
--ignore-tests --skip-clean \
--fail-under 50
continue-on-error: true # Pre-existing prop-test failures

- name: Upload coverage report
if: always()
uses: actions/upload-artifact@v6
with:
name: rust-coverage
path: src-tauri/coverage/
retention-days: 30
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@
.aider*
*.db
*.sqlite
.playwright-mcp/
.pyscn/
.ruff*
.serena/
.task/
CLAUDE.md
playwright-report/
repomix-output.md
static/music
test-results/

# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down Expand Up @@ -188,6 +191,10 @@ lib-cov
coverage
*.lcov

# Rust coverage (cargo-llvm-cov, tarpaulin)
src-tauri/coverage/
tarpaulin-report.html

# nyc test coverage
.nyc_output

Expand Down Expand Up @@ -336,3 +343,6 @@ src/pydust.build.zig
# INCLUDE
!**/.gitkeep
!**/*.example

# Sidecar binaries (built by task pex:build)
src-tauri/bin/
15 changes: 9 additions & 6 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
{
"mcpServers": {
"mantic": {
"command": "npx",
"args": ["-y", "mantic.sh@latest", "server"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
},
"screencap": {
"command": "/Users/lance/.local/bin/uv",
"args": [
"--directory",
"/Users/lance/git/screencap",
"run",
"server.py"
],
"args": ["--directory", "/Users/lance/git/screencap", "run", "server.py"],
"env": {
"UV_PROJECT_ENVIRONMENT": "/Users/lance/git/screencap/.venv"
}
Expand Down
Loading
Loading