Claudio Ortolina
d8d5524e41
Replace Process.sleep with sys.get_state in error notifier tests
...
Deterministic GenServer state polling instead of timing-based waits.
Fixes #169 .
2026-04-17 12:58:50 +01:00
Claudio Ortolina
e6a8488137
Use Notes.change_note/2 instead of Note.changeset/2 in notes component
...
Closes #171
2026-04-17 12:56:08 +01:00
Claudio Ortolina
4c5a3393e2
Run query reporter tests with async false
...
Avoid getting spurious failures due to interference by other tests
2026-04-17 10:29:43 +01:00
Claudio Ortolina
e98d7d1d8a
Add asset build step to lint CI job
2026-04-17 10:19:10 +01:00
Claudio Ortolina
96a1ea0923
Update node to 25.9.0
2026-04-17 10:19:10 +01:00
dependabot[bot]
ae14149a42
Bump node from 24-slim to 25-slim
...
Bumps node from 24-slim to 25-slim.
---
updated-dependencies:
- dependency-name: node
dependency-version: 25-slim
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-04-17 10:19:10 +01:00
Claudio Ortolina
f1013070bd
Monitor Dockerfile updates via Dependabot
...
Closes #175
2026-04-17 08:14:44 +01:00
Claudio Ortolina
d0d9c4ea75
Ignore some Claude working directories
2026-04-17 08:11:48 +01:00
Claudio Ortolina
2648d10034
Formalize standard set of Claude permissions
2026-04-17 08:11:31 +01:00
Claudio Ortolina
bbe1722c9f
Handle unencodable structs in QueryReporter params
2026-04-17 07:10:45 +01:00
Claudio Ortolina
90838d1a3f
Add tests for RecordActions and Chat component
...
Covers all action handlers on LiveHelpers.RecordActions and all
update/event clauses on Components.Chat — including streaming
chunk/done/error transitions and the retry re-send path.
Closes #179
2026-04-17 07:01:07 +01:00
Claudio Ortolina
298c1dfc57
Document why multipart dependency is needed
...
Closes #182
2026-04-16 23:16:03 +01:00
Claudio Ortolina
fbc548e903
Explicitly trust Wikipedia's HTML
...
Closes #168
2026-04-16 23:14:00 +01:00
Claudio Ortolina
464e627a63
Remove unnecessary padding from detail views
2026-04-16 22:54:39 +01:00
Claudio Ortolina
e511d352e3
Use cheaper model for mechanical skills
2026-04-16 19:27:49 +01:00
Claudio Ortolina
6b35b5cde5
Trigger search on Enter in search inputs inside forms
2026-04-16 15:15:47 +01:00
Claudio Ortolina
58c60193f2
Use pipe
2026-04-16 10:38:08 +01:00
Claudio Ortolina
840547c509
Speed up structured modal animation
2026-04-16 09:31:30 +01:00
Claude
6781c41fdf
Fix mobile click delay with touch-action manipulation
...
Closes the 300ms tap delay on mobile browsers by setting
touch-action: manipulation on all interactive elements.
https://claude.ai/code/session_01BnwMp4VhD3HK9zkycqmiFh
2026-04-16 09:01:52 +01:00
Claudio Ortolina
fea1231304
Replace refresh scrobble list icon
...
Makes it for a better animation
2026-04-15 22:52:28 +01:00
Claudio Ortolina
7899f621f3
Preserve rule picker state across parent re-renders
2026-04-15 15:11:17 +01:00
Claudio Ortolina
2124c982f7
Handle possible non-existent record id in search filter
2026-04-15 15:10:28 +01:00
Claudio Ortolina
f6e78022a4
Update project conventions
2026-04-15 15:03:41 +01:00
Claudio Ortolina
9fa94714c8
Update architecture docs
2026-04-15 15:03:21 +01:00
Claudio Ortolina
c816f2de4a
Add scrobbled tracks search parser
...
Introduces ListeningStats.SearchParser with NimbleParsec supporting
record:, album_mbid:, artist_mbid:, artist:, album:, track: filters.
Links scrobble count on record page to filtered scrobbled tracks view.
2026-04-15 14:56:38 +01:00
Claudio Ortolina
851cb36858
Fix dl accessibility violations on stats dashboard
2026-04-15 14:16:24 +01:00
Claudio Ortolina
4194fb8b6d
Update dependencies
...
oban_web 2.12.2 => 2.12.3
2026-04-15 13:50:52 +01:00
Claudio Ortolina
405235e2b3
Add picker to create scrobble rules on the fly
2026-04-15 10:53:58 +01:00
Claudio Ortolina
b9612a2a26
Fix records on this day for partial release dates
...
SQLite interprets bare years (e.g. "1970") as Julian day numbers
in strftime, producing wrong month-day matches. Filter to only
full YYYY-MM-DD dates before comparing.
2026-04-15 07:29:58 +01:00
Claudio Ortolina
ebd9e5445f
Fix how long ago for records with year release dates
2026-04-15 07:20:01 +01:00
Claudio Ortolina
d75508531e
Generate parse_type/parse_format from module attributes
2026-04-14 16:56:04 +01:00
Claudio Ortolina
2bb755b1c8
Parse matching record fields in Records.Record
2026-04-14 16:51:06 +01:00
Claudio Ortolina
8db324d74a
Extract shared badge/dropdown to ScrobbleComponents
2026-04-14 16:50:40 +01:00
Claudio Ortolina
888b5a68e6
Update all callers to use matching_records
...
Migrate StatsLive.Index, ScrobbledTracksLive.Index, and TopAlbums to
consume matching_records list instead of scalar record IDs. Remove the
derive_legacy_record_ids bridge function. TopAlbums now uses a dropdown
for multi-record badges with play count display.
2026-04-14 16:14:59 +01:00
Claudio Ortolina
9ef918a621
Update record_status_badges with matching_records and dropdown
2026-04-14 16:10:57 +01:00
Claudio Ortolina
dd3bb47989
Add tests for mixed collected/wishlisted matching records
2026-04-14 16:07:14 +01:00
Claudio Ortolina
2c6e6e7ca2
Return matching_records list from top_albums_attach_metadata
...
Apply the same release-group JSON aggregation pattern to top albums
queries. Add JSON parsing in get_top_albums/1 and
get_top_albums_by_days/2.
2026-04-14 16:05:51 +01:00
Claudio Ortolina
cfd267627c
Return matching_records list from tracks_with_record_info_query
...
Replace scalar collected_record_id/wishlisted_record_id subqueries with
a single matching_records JSON array grouped by release group
(records.musicbrainz_id). Add parse_matching_records/1 for JSON parsing
and derive_legacy_record_ids/2 as a temporary bridge for existing
templates. Update tests to use shared musicbrainz_id fixtures.
2026-04-14 14:17:02 +01:00
Claudio Ortolina
9f4135661e
Replace scalar record IDs with matching_records JSON array in tracks query
...
Replaces collected_record_id and wishlisted_record_id correlated
subqueries in tracks_with_record_info_query with a single
matching_records json_group_array subquery that returns all records
sharing the same release ID. Adds parse_matching_records/1 for JSON
deserialization. Updates recent_activity/2 and list_tracks/1 to parse
the JSON at the boundary. Derives legacy collected_record_id and
wishlisted_record_id from matching_records so existing LiveViews keep
working. The get_top_albums test is temporarily skipped pending the
top_albums_attach_metadata update.
2026-04-14 14:12:14 +01:00
Claudio Ortolina
4f1e596c5c
Update typst from 0.3.3 to 0.3.4
2026-04-14 11:08:24 +01:00
Claudio Ortolina
e43bccb9bc
Extract shared index logic into LiveHelpers.IndexActions
...
Closes #150
2026-04-13 23:09:22 +01:00
Claudio Ortolina
4fa13d5422
Reset chat state when navigating between entities
...
The Chat component kept stale messages and chat references
when patching to a different artist/record because update/2
only refreshed the chat list, not the active chat state.
2026-04-13 18:32:19 +01:00
Claudio Ortolina
6a6410bcaa
Have the LLM use square bracketed links for internal references
2026-04-13 14:24:36 +01:00
Claudio Ortolina
96bb0fc403
Try and control ChatGPT's tone and "helpfulness"
2026-04-13 14:09:43 +01:00
Claudio Ortolina
e10df1985e
Reuse binding in test
2026-04-13 13:34:23 +01:00
Claudio Ortolina
b422cccf09
Make format merge assertion order-independent
2026-04-13 13:17:03 +01:00
Claudio Ortolina
726b7d5ef8
Add tests for chat auto-open via query param
2026-04-13 13:16:28 +01:00
Claudio Ortolina
f7628267b3
Add @moduledoc to OpenAI.API
2026-04-13 13:15:43 +01:00
Claudio Ortolina
a1b775f0ae
Fix architecture docs to reflect gpt-5.1 for CollectionChat
2026-04-13 13:15:10 +01:00
Claudio Ortolina
bdc1cd3992
Prevent callback return value from halting stream
...
The delta branch in decode_responses_event now explicitly returns
:ok after invoking the callback, so a callback returning {:error, _}
cannot be mistaken for a stream-level error by decode_events.
2026-04-13 13:14:33 +01:00