From f8e781f0e98688607d4c5c5085ed65810b970aca Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 22 May 2026 21:05:21 +0200 Subject: [PATCH] Initial snapshot before step 6 options.js split --- .gitignore | 3 + AGENTS.md | 169 ++ CLAUDE.md | 1 + CLAUDE.md.bak | 122 ++ background.js | 1077 ++++++++++ content.js | 542 +++++ docs/EXTENSION_ID.md | 37 + docs/INSTALL.md | 227 +++ docs/README.md | 79 + host/com.rcjav.host.json | 9 + host/com.rcjav.host.json.template | 9 + host/install-host.ps1 | 75 + host/rcjav-host.bat | 8 + host/rcjav-host.log | 1 + host/rcjav-host.py | 2041 +++++++++++++++++++ host/register-host.bat | 17 + icons/icon-128.png | Bin 0 -> 810 bytes icons/icon-32.png | Bin 0 -> 286 bytes manifest.json | 44 + options.css | 367 ++++ options.html | 806 ++++++++ options.js | 3133 +++++++++++++++++++++++++++++ popup.css | 191 ++ popup.html | 74 + popup.js | 659 ++++++ samples/sim-dupe.js | 50 + 26 files changed, 9741 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 CLAUDE.md.bak create mode 100644 background.js create mode 100644 content.js create mode 100644 docs/EXTENSION_ID.md create mode 100644 docs/INSTALL.md create mode 100644 docs/README.md create mode 100644 host/com.rcjav.host.json create mode 100644 host/com.rcjav.host.json.template create mode 100644 host/install-host.ps1 create mode 100644 host/rcjav-host.bat create mode 100644 host/rcjav-host.log create mode 100644 host/rcjav-host.py create mode 100644 host/register-host.bat create mode 100644 icons/icon-128.png create mode 100644 icons/icon-32.png create mode 100644 manifest.json create mode 100644 options.css create mode 100644 options.html create mode 100644 options.js create mode 100644 popup.css create mode 100644 popup.html create mode 100644 popup.js create mode 100644 samples/sim-dupe.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0af246 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +host/__pycache__/ +host/logs/ +host/state/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..3687a6a --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,169 @@ +# rclone-jav (Brave extension + native messaging host) + +Session memory for Claude. Read before making changes here. + +## Architecture + +``` +Brave tab title -> content script extracts JAV ID + -> background.js connectNative("com.rcjav.host") + -> host/rcjav-host.bat (portable: py launcher or python on PATH) + -> host/rcjav-host.py + -> subprocess python rc-jav.py --search ID --basic --no-color --format json + -> structured hits back through native port + -> popup or in-page overlay +``` + +Two separate codebases: +- This repo: Brave extension + native messaging host. +- `D:\DEV\Project\rclone-jav\` — Python rc-jav CLI. The host shells out to `rc-jav.py` here. + +## Folder layout (post-rename) + +``` +D:\DEV\Extensions\Production\rclone-jav\ (PC 1) +D:\DEV\Extensions\Staging\rclone-jav\ (PC 2) +├── manifest.json +├── background.js +├── content.js +├── popup.{html,js,css} +├── options.{html,js} +├── host\ +│ ├── rcjav-host.py +│ ├── rcjav-host.bat (portable: py launcher fallback) +│ ├── install-host.ps1 (self-elevates to HKLM) +│ ├── register-host.bat (prompts for ID, calls install-host.ps1) +│ ├── com.rcjav.host.json (generated; UTF-8 NO BOM) +│ └── (logs) +└── docs\ + ├── INSTALL.md (gotcha table at the bottom) + └── README.md +``` + +## Critical gotchas (learned the hard way) + +| Symptom | Cause | Fix | +|---|---|---| +| "Specified native messaging host not found" | UTF-8 BOM in com.rcjav.host.json | `WriteAllText` with `UTF8Encoding($false)` | +| Same error after registering HKCU | Brave on Windows ignores HKCU on some installs | Register HKLM too. `install-host.ps1` does both. | +| Host launches then disconnects | Python text-mode stdio mangles 4-byte length prefix | `msvcrt.setmode(stdin/stdout, O_BINARY)` at host startup | +| Host log says "stdin closed, exiting" immediately | bat-side stderr leak corrupts protocol | `python -u` + redirect stderr to log file | +| `Missing closing '}'` in install-host.ps1 | Em-dashes in comments + LF endings + Windows PS 5.1 (cp1252 fallback) | Strip em-dashes from .ps1 files, or save with BOM, or use pwsh | +| Brave reload != Brave restart | NM cache survives extension reload | Kill all brave.exe processes then reopen | +| `IBW-902z` page title fails to parse | `\b` after `\d` blocked by following word char | Extension regex uses `[a-zA-Z]?\b` trailing — captured but discarded | +| Delete safety too broad | Allowlist reduced `cq:JAV` to `cq:` | Match full configured prefixes, not remote roots | +| Overlay feels ~1.5s late on SPA pages | `SPA_SETTLE_MS` waits before auto-check | Current value is 800ms; tune carefully if detection gets flaky | + +## Internal names — keep as-is + +- Native messaging host: `com.rcjav.host` (NOT renamed despite extension rename) +- Window flag in content.js: `__rclonex_loaded__` (idempotency guard for content script re-injection) +- CSS IDs starting with `rclonex-` (overlay) +- Host logs: `host/logs/rcjav-host.log`, `host/logs/rcjav-host-events.log`, `host/logs/rcjav-host-stderr.log`, `host/logs/deletes.log` +- Host scan progress state: `host/state/scan-state.json` + +Don't rename these unless there's a real reason. They're orthogonal to the user-facing extension name. + +## Settings + +Stored in `chrome.storage.sync` under key `settings`. Per-extension-ID namespacing → if extension is reloaded under a different path, settings are wiped. + +**Backup/restore lives in Options → Setup & Transfer** — JSON export/import to survive reloads or PC migrations. Use it before renaming or relocating the extension. + +DEFAULT_SETTINGS lives in background.js. Keep in sync with options.html defaults. + +## Decision log + +### Deletion allowlist uses full prefixes (2026-05-20) + +**Decision:** host delete allowlist must use full configured path prefixes (`cq:JAV`, trash dir, etc.), not only remote roots like `cq:`. + +**Reasoning:** Reducing `cq:JAV` to `cq:` lets any path on the same rclone remote pass the safety check. Deletion is opt-in but must be tightly scoped. + +**Important:** extension delete calls must forward `rcjav_path`, or the host may read the wrong `config.json` and derive the wrong allowlist. + +### Toolbar popup setting gates auto-check (2026-05-20) + +**Decision:** `triggers.toolbarClick` does not remove the MV3 popup, but it does gate whether the popup auto-runs `checkTab` on open. If disabled, popup stays idle until user clicks Re-Scan. + +### Quick search and ID padding (2026-05-20) + +**Decision:** rc-jav canonical JAV IDs use at least 3 digits (`ABC-027`) and preserve 4+ digit IDs (`ABCD-1294`). Quick search emits canonical uppercase globs only. + +**Reasoning:** user clarified real JAV filenames are never `ABC-27` or `ABC-0027`; they are `ABC-027`. User also never uses lowercase filenames, so quick search should not use rclone `--ignore-case` because it added noticeable delay. + +**Operational note:** this changes cache keys. Run `python rc-jav.py --scan` in `D:\DEV\Project\rclone-jav` after this change. + +### No-match overlay metadata (2026-05-20) + +**Decision:** host search response includes `cache_meta` and `scanned_remotes` from rc-jav JSON so no-match overlays can show what was scanned instead of falling back to "library". + +### IBW-902z trailing letter (2026-05-20) + +**Decision:** minimal regex fix in extension only. NOT a full variant-suffix rewrite of the index. + +**Reasoning:** User's library uses one ID per number (either `IBW-902` OR `IBW-902z`, not both). Page titles failing on `IBW-902z` is the real bug. Extension regex now matches optional trailing letter and discards it. rc-jav's index continues to strip trailing letters at extract_id time. Effective: extension queries `IBW-902` for any title `IBW-902` or `IBW-902z`, finds the file regardless of how it's named on rclone. + +**Revisit if:** both `IBW-902.mp4` and `IBW-902z.mp4` ever coexist in library — they'd collide on the same ID. Then implement variant suffix (#var_Z) end-to-end. + +### Native messaging host name stayed `com.rcjav.host` + +When extension was renamed `rclonex` → `rclone-jav`, the NM host name was NOT renamed. Reason: zero user impact (it's an internal identifier in registry/manifest), but every rename costs registry rewrites + script churn. Not worth it. + +### WinCatalog backslash normalization + +Done in rc-jav catalog loading. Catalog CSV/XML paths are normalized from Windows `\` to rclone-style `/` before the extension sees them. + +## When making changes + +- Extension settings schema change → update `DEFAULT_SETTINGS` in background.js AND defaults in options.html + options.js load() +- New native messaging action → handler in rcjav-host.py + DISPATCH map + extension code that sends it +- New options pane → sidebar item in options.html + new `.pane` div + load/save bindings in options.js +- Any rc-jav.py CLI change → host invocation in rcjav-host.py handle_search must keep pace + +--- + +## Console consolidation refactor — execution status + +**Spec / blueprint:** +- `D:\DEV\Project\rclone-jav\mockups\console-consolidation-claude.html` (refactor spec — decision table, sequence, acceptance criteria) +- `D:\DEV\Project\rclone-jav\mockups\console-consolidation-options.html` (Codex's visual annotation variant) + +**Shipped (in execution order):** + +1. **Sim Dupe deleted from popup.** Button + click handler removed from `popup.html` / `popup.js`. Payload preserved in `samples/sim-dupe.js` for future layout work. +2. **CSS extracted from options.html.** Embedded `