v1.1.0-beta.067 - feat: move issues to another series + bulk-match merge guard
๐ "Move" โ re-file issues under the correct series (admin)
- When a bulk Custom-ID match (or any double-assignment) collapses two different comics onto one series, there was no way to separate them โ issue.seriesId was never user-editable anywhere. Added a per-series "Move" action: enter Select mode, pick one or more issues, and move them to another series. Each issue's file is relocated into the destination series' folder on disk (no-clobber; " (n)" suffix on a name clash) and its seriesId is re-pointed.
- The destination can be an EXISTING series (searchable picker) or a NEW unmatched series created from a name (which you then match in the Smart Matcher) โ so issues from a series that was deleted during a merge can still be recovered.
๐ก๏ธ Smart Matcher: confirm before a bulk Custom-ID merges separate folders
- Applying one Custom ID to a multi-select silently assigned the same series to every selected item โ for FOLDERS that merges them into one series (the reported bug). The bulk apply now warns ("Merge these folders into one series?") when more than one selected item is a folder, and proceeds only on confirm. Loose-file selections (issues of a single series, the intended bulk use that auto-maps issue numbers) are unaffected.
๐ New endpoint: POST /api/library/issue/move (admin-only)
- Body { issueIds[], targetSeriesId? | newSeriesName? }. Relocates files, re-points seriesId, audit-logs MOVE_ISSUES. A file-move conflict leaves that issue in place (DB stays in sync with disk) and is reported in the response.
๐งช Tests
- issue-move: admin guard, empty-selection guard, move-to-existing (re-points seriesId + relocates file), create-new-unmatched-series, destination-required.
โ Verification
- tsc clean; eslint . 0 errors; vitest 293 passed (+5); next build clean