New files:
bulk-check.html, bulk-check.js, bulk-check.css
Popup gains a 📋 launcher button next to the ⚙ Options gear. Clicking
it sends `open-bulk-check` to background.js and closes the popup;
background.js owns window lifecycle:
- chrome.storage.session.bulkCheckWindowId stashes the open window id
- existing id → chrome.windows.update({ focused, drawAttention })
- missing or stale id → chrome.windows.create({ type:'popup',
width:640, height:540 }) and stash the new id
- chrome.windows.onRemoved clears the stale id on close
Last-paste persisted to chrome.storage.local.bulkCheckLastPaste,
debounced 500ms on input, restored on window open. quickMode is read
from settings at run time, matching previous behavior. Ctrl/Cmd+Enter
inside the textarea triggers the check.
Options page no longer carries the Bulk ID Check fieldset: removed
from options.html (Library Review pdesc updated to note the
relocation) and the matching handlers from options.js
(1903 → 1852 lines). No manifest permission changes — own-page
chrome.windows.create needs no extra permission.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Continues the options.js split. New file:
options-library-issues.js 453 lines
After this step:
options-cache.js 161 lines
options-dupe-review.js 616 lines
options-library-issues.js 453 lines
options.js 1903 lines (was 2356 after step 6)
Library Issues block was fully self-contained (lastLibraryIssues,
_libraryIssuesDirty, renderLibraryIssues, _closeLibraryIssues, and the
bottom IIFE wrapping _optScanTimer / _setOptScanningState /
_pollOptProgress for optimization-scan progress polling). No external
callers of its identifiers.
Reads _configuredScanRoots / _cacheSkippedByRemote and calls
rememberConfiguredScanRoots from options-cache.js by bare reference —
same cross-file binding pattern proven in step 6.
node --check passes on each file and on the concatenation of all four
files in load order. Concat = 3133 lines, matching pre-split total.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Splits the 3133-line options.js into three vanilla scripts loaded in
order at the bottom of options.html:
options-cache.js 161 lines (Cache & Scans block)
options-dupe-review.js 616 lines (Duplicate Review + Keep Ranking)
options.js 2356 lines (everything else)
No behavior change. Cross-file references work because classic <script>
tags share the global declarative environment: top-level `let` bindings
in options-cache.js (_configuredScanRoots, _cacheSkippedByRemote) are
visible by bare reference in options.js, where Library Issues still
reads them. Calls into options.js from the extracted files
(escapeHtml, openModal/closeModal, keepActionViewport,
clearNativeRepairCard, renderNativeMessagingFailure) all occur inside
event handlers, resolved at call time after options.js parses.
node --check passes on each file individually and on the concatenation
of all three in load order. Brace counts balanced.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>