diff --git a/README.md b/README.md index 70e53035..354ca27e 100644 --- a/README.md +++ b/README.md @@ -108,12 +108,12 @@ Browse sibling episode files and the active mpv queue in one overlay modal. Open ## Requirements -| | Required | Optional | -| -------------- | --------------------------------------- | -------------------------------------- | -| **Player** | [`mpv`](https://mpv.io) with IPC socket | — | +| | Required | Optional | +| -------------- | --------------------------------------- | ---------------------------------------------------------- | +| **Player** | [`mpv`](https://mpv.io) with IPC socket | — | | **Processing** | `ffmpeg`, `mecab` + `mecab-ipadic` | `guessit` (AniSkip), `alass` / `ffsubsync` (subtitle sync) | -| **Media** | — | `yt-dlp`, `chafa`, `ffmpegthumbnailer` | -| **Selection** | — | `fzf` / `rofi` | +| **Media** | — | `yt-dlp`, `chafa`, `ffmpegthumbnailer` | +| **Selection** | — | `fzf` / `rofi` | > [!NOTE] > [`bun`](https://bun.sh) is required if building from source or using the CLI wrapper: `subminer`. Pre-built releases (AppImage, DMG, installer) do not require it. @@ -236,8 +236,6 @@ subminer stats -b # stats daemon in background subminer stats -s # stop background stats daemon ``` ---- - ## Documentation Full guides on configuration, Anki setup, Jellyfin, immersion tracking, and more: **[docs.subminer.moe](https://docs.subminer.moe)** diff --git a/backlog/tasks/task-268 - Address-CodeRabbit-review-action-items-for-PR-38.md b/backlog/tasks/task-268 - Address-CodeRabbit-review-action-items-for-PR-38.md index 155230d9..52f156f7 100644 --- a/backlog/tasks/task-268 - Address-CodeRabbit-review-action-items-for-PR-38.md +++ b/backlog/tasks/task-268 - Address-CodeRabbit-review-action-items-for-PR-38.md @@ -4,7 +4,7 @@ title: 'Address CodeRabbit review action items for PR #38' status: Done assignee: [] created_date: '2026-04-01 05:35' -updated_date: '2026-04-01 05:40' +updated_date: '2026-04-01 06:07' labels: - pr-review - coderabbit @@ -27,8 +27,18 @@ Review unresolved CodeRabbit feedback on PR #38 and implement the actionable fix - [x] #3 Relevant local verification for the affected areas passes. +## Implementation Notes + + +2026-04-01: Reopened for follow-up CodeRabbit round after commit 233bde58. Remaining actionable items: guard maxMatches <= 0 in duplicate exact-match helper and strengthen the duplicate tracking test fixture to prove deduplication as well as sorting. + +2026-04-01: Follow-up round addressed locally. Added guard for maxMatches <= 0 in duplicate exact-match scanning and strengthened the pre-add duplicate tracking test fixture to prove deduplication as well as sorting. + + ## Final Summary Addressed all unresolved actionable CodeRabbit comments on PR #38. Fixed duplicate tracking so empty duplicate lists are not persisted after sentence-card creation, sanitized Yomitan add-note noteId values to accept only positive integers, preserved paused playback for configured subtitle-seek keybindings when pause state is unknown, and short-circuited duplicate exact-match scanning for single-result lookups. Added regression tests for each case and verified with `bun test` on the affected suites plus `bun run typecheck`, `bun run test:fast`, `bun run test:env`, `bun run build`, and `bun run test:smoke:dist`. + +Follow-up CodeRabbit round addressed locally: `findExactDuplicateNoteIds()` now returns early when `maxMatches <= 0`, and the sentence-card duplicate tracking regression test now uses a repeated duplicate ID to assert deduplication plus sorting. Re-verified with targeted duplicate/card tests, `bun run typecheck`, and `bun run test:fast`. diff --git a/scripts/build-yomitan.mjs b/scripts/build-yomitan.mjs index 40d0e913..a52d10e0 100644 --- a/scripts/build-yomitan.mjs +++ b/scripts/build-yomitan.mjs @@ -51,9 +51,16 @@ function ensureSubmodulePresent() { } function getSourceState() { - const revision = readCommand('git', ['rev-parse', 'HEAD'], submoduleDir); - const dirty = readCommand('git', ['status', '--short', '--untracked-files=no'], submoduleDir); - return { revision, dirty }; + try { + const revision = readCommand('git', ['rev-parse', 'HEAD'], submoduleDir); + const dirty = readCommand('git', ['status', '--short', '--untracked-files=no'], submoduleDir); + return { revision, dirty }; + } catch (error) { + if (process.env.SUBMINER_YOMITAN_ALLOW_MISSING_GIT === '1') { + return { revision: 'unknown', dirty: '' }; + } + throw error; + } } function isBuildCurrent(force) {