Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
1032a7e
chore(workspace): ban Connection::open + scope rusqlite via cargo-deny
utof Apr 23, 2026
8c5b69b
refactor(db,desktop): WriteCmd::Shutdown + explicit join eliminate ma…
utof Apr 23, 2026
54a11de
chore(db): add minijinja workspace dep for FTS trigger codegen
utof Apr 23, 2026
0889860
refactor(db): add schema::spec FtsAggregation data model
utof Apr 23, 2026
f3f8d95
fix(db): backtick bare identifiers in schema::spec doc comments
utof Apr 23, 2026
4a088d1
feat(db): add minijinja template for FTS trigger codegen
utof Apr 23, 2026
c09c49c
feat(db): render_fts_triggers + install_fts_triggers + 5 snapshots
utof Apr 23, 2026
fb2c422
feat(db): install FTS triggers idempotently at writer startup
utof Apr 23, 2026
c545ad0
chore(db): WHY comments on FTS install + h.join() in smoke test
utof Apr 23, 2026
f86dfda
test(db): assert install_fts_triggers is idempotent
utof Apr 23, 2026
56c1e16
test(db): assert legacy V007 trigger names are dropped on install
utof Apr 23, 2026
ab3c0da
chore(db): iterate LEGACY_TRIGGER_NAMES in fts_legacy_dropped test
utof Apr 23, 2026
18cc96c
test(db): proptest hash-change + restore round-trip for FTS triggers
utof Apr 23, 2026
c6e569c
chore(db): SLOTS const + shadow_hash debug_assert + attach_tag_raw WHY
utof Apr 23, 2026
19626ad
refactor(db): extract crates/db/tests/common/mod.rs (helpers only)
utof Apr 23, 2026
2e65ae0
refactor(db): move search semantics tests to crates/db/tests/
utof Apr 23, 2026
d48d68e
refactor(db): restore dropped doc comment on test_rebuild_idempotence…
utof Apr 23, 2026
d434ca2
refactor(db): move trigger-maintenance tests + apply style consistency
utof Apr 23, 2026
1a25185
refactor(db): move search proptests + delete in-source mod tests
utof Apr 23, 2026
e936dc7
refactor(db): inline WHY on unreachable_pub allow in common/mod.rs
utof Apr 23, 2026
d6272b9
feat(desktop): add TanStack Query/Zustand/Router deps + queryClient s…
utof Apr 23, 2026
7fc4df4
docs(desktop): add WHY comment for non-default gcTime in queryClient
utof Apr 23, 2026
7908cde
feat(desktop): add TanStack Query options factories for files/tags/vo…
utof Apr 23, 2026
66cb3b7
feat(desktop): add Zustand UI store with 4 slices
utof Apr 23, 2026
cd94cf6
feat(desktop): add useDomainEvents hook for AppEvent → invalidateQueries
utof Apr 23, 2026
fced345
feat(desktop): add NotificationStack component (toast queue UI)
utof Apr 23, 2026
ebb9d29
feat(desktop): wire TanStack Router with createHashHistory + placehol…
utof Apr 23, 2026
f3d2141
feat(desktop): App.tsx → root-route shell + IndexRoute body extraction
utof Apr 23, 2026
891432d
refactor(desktop): ScanButton → useMutation + Zustand scan slice
utof Apr 23, 2026
b001cb9
refactor(desktop): SearchBar → dual-field Zustand store dispatch
utof Apr 23, 2026
fa10fcb
a11y(desktop): restore aria-label on SearchBar input
utof Apr 23, 2026
072b1b1
refactor(desktop): StatusBar/TagSidebar → store-driven; delete Watche…
utof Apr 23, 2026
192b7c5
test(desktop): rewrite 5 test files for Batch H state migration
utof Apr 23, 2026
7bac455
docs(desktop): WHY block on TagSidebar test spy pattern
utof Apr 23, 2026
ecd4c96
deps(app): add tracing-appender + propagate directories to crates/app
utof Apr 24, 2026
b9961bd
feat(app): add SubscriberOpts + init_subscriber + log-dir resolver
utof Apr 24, 2026
758e9b5
refactor(cli): switch to perima_app::telemetry::init_subscriber
utof Apr 24, 2026
faaccd6
feat(desktop): wire perima_app::telemetry::init_subscriber
utof Apr 24, 2026
6dd47cc
feat(app,db): add #[tracing::instrument] on UseCases + writer dispatch
utof Apr 24, 2026
b4419f3
feat(cli): add `perima debug-report` subcommand + build.rs git SHA ca…
utof Apr 24, 2026
1b36228
fix(cli): debug-report uses actual rolling-appender filenames
utof Apr 24, 2026
46a8a26
perf(media): amortize fast_image_resize Resizer across thumbnail-work…
utof Apr 24, 2026
1a3b06a
fix(media): rename test-side `resized` to satisfy clippy::similar_names
utof Apr 24, 2026
0f7cee6
fix(media): surface MediaSource open errors at WARN, not DEBUG
utof Apr 24, 2026
3811586
test(media): regression-test Resizer reuse vs per-call allocation
utof Apr 24, 2026
ce4c704
test(media): convert resize_only_bench to print-only; track follow-up…
utof Apr 24, 2026
ae59413
fix(desktop): restore const fn AppState::new for clippy 1.95
utof Apr 24, 2026
19d68c1
fix(test): isolate manifest_created assertion to per-test tempdir
utof Apr 24, 2026
cdb04c0
ci(windows): replace taiki-e/install-action with cargo-binstall
utof Apr 24, 2026
d4d9c5f
test(cli): ignore manifest_created on windows pending #138
utof Apr 24, 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
43 changes: 35 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,46 @@ jobs:

- uses: Swatinem/rust-cache@v2

- uses: taiki-e/install-action@just

# WHY: `just ci` runs `cargo deny check`, `typos`, and
# `cargo nextest run`. All three are external binaries — none ship
# with the Rust toolchain. Using taiki-e/install-action fetches
# prebuilt binaries (seconds) rather than `cargo install` (minutes),
# which matters on the 3-OS matrix. Nextest swap landed in commit
# adopting `cargo nextest run` workspace-wide (closes #121) — the
# SQLite lock-order inversion that `cargo test` reproduces ~20% is
# documented in CLAUDE.md + GH #131.
- uses: taiki-e/install-action@cargo-deny
- uses: taiki-e/install-action@typos
- uses: taiki-e/install-action@cargo-nextest
# adopting `cargo nextest run` workspace-wide (closes #121).
#
# WHY split Windows from Linux/macOS: taiki-e/install-action's
# PowerShell wrapper aborts on windows-latest when the runner image
# leaks BASH_FUNC_* env vars (Shellshock mitigation correctly
# rejects them; their 10-iter retry doesn't catch it; manual reruns
# don't help — see issue #137 for full analysis + reproduction).
# cargo-binstall fetches the same prebuilt release binaries without
# going through bash, sidestepping the env leak entirely.
- name: Install just (Linux/macOS)
if: runner.os != 'Windows'
uses: taiki-e/install-action@just
- name: Install cargo-deny (Linux/macOS)
if: runner.os != 'Windows'
uses: taiki-e/install-action@cargo-deny
- name: Install typos (Linux/macOS)
if: runner.os != 'Windows'
uses: taiki-e/install-action@typos
- name: Install cargo-nextest (Linux/macOS)
if: runner.os != 'Windows'
uses: taiki-e/install-action@cargo-nextest

# WHY cargo-binstall on Windows only — workaround for #137. binstall
# is a prebuilt-binary fetcher; doesn't invoke bash so the windows-
# latest BASH_FUNC_* leak doesn't apply. Self-install is one zip
# extract; per-tool install is ~5s. If the runner image fix lands
# upstream, revert this step + drop the `if: runner.os != 'Windows'`
# gates above and verify 5+ consecutive Windows runs stay green.
- name: Install just/cargo-deny/typos/cargo-nextest (Windows via cargo-binstall — workaround #137)
if: runner.os == 'Windows'
shell: pwsh
run: |
Invoke-WebRequest -Uri "https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-pc-windows-msvc.zip" -OutFile binstall.zip
Expand-Archive binstall.zip -DestinationPath "$env:USERPROFILE\.cargo\bin" -Force
cargo binstall --no-confirm --locked just cargo-deny typos-cli cargo-nextest

- uses: actions/setup-node@v4
with:
Expand Down
42 changes: 41 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ thiserror = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tracing = "0.1"
tracing-appender = "0.2"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
tokio = { version = "1", features = ["full"] }
tokio-util = { version = "0.7", features = ["rt"] }
Expand Down Expand Up @@ -98,6 +99,7 @@ image = "0.25"
nom-exif = "2.7"
mp4parse = "0.17"
mime_guess = "2"
minijinja = { version = "2", default-features = false, features = ["macros", "loader"] }

[profile.release]
lto = "thin"
Expand Down
29 changes: 29 additions & 0 deletions apps/desktop/bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 5 additions & 2 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"packageManager": "bun@1.3.11",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"build": "tsc -b tsconfig.app.json && vite build",
"test": "vitest run",
"lint": "eslint src/ --max-warnings 0",
"preview": "vite preview",
Expand All @@ -16,11 +16,14 @@
"node": ">=20.19 <21 || >=22.12"
},
"dependencies": {
"@tanstack/react-query": "^5",
"@tanstack/react-router": "^1",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-dialog": "^2",
"neverthrow": "^8",
"react": "^19",
"react-dom": "^19"
"react-dom": "^19",
"zustand": "^5"
},
"devDependencies": {
"@evilmartians/lefthook": "^2.1.6",
Expand Down
Loading
Loading