chore: address final review must-fix items
This commit is contained in:
+7
-6
@@ -49,10 +49,10 @@ Guidance for OpenCode (and Claude Code) working under `backend/`. See root `AGEN
|
|||||||
cooldown instead of retrying every tick, and writes go through
|
cooldown instead of retrying every tick, and writes go through
|
||||||
`Store.Get` + `Store.Upsert` so new chapter never reorders list.
|
`Store.Get` + `Store.Upsert` so new chapter never reorders list.
|
||||||
Fetches use `bogdanfinn/tls-client` with Chrome profile as defence in depth
|
Fetches use `bogdanfinn/tls-client` with Chrome profile as defence in depth
|
||||||
against fingerprint-based blocking; any failure log and skip. kagane sits
|
against fingerprint-based blocking; any failure log and skip. kagane and
|
||||||
behind a Cloudflare JavaScript challenge the TLS client can't clear, so it is
|
novelfull sit behind Cloudflare JavaScript challenges the TLS client can't
|
||||||
browser-only: fetched over CDP via `BROWSER_WS_URL`, and simply not polled
|
clear, so they are browser-only: fetched over CDP via `BROWSER_WS_URL`, and
|
||||||
when that's unset. See
|
simply not polled when that's unset. See
|
||||||
`docs/superpowers/specs/2026-07-26-server-latest-chapter-polling-design.md`.
|
`docs/superpowers/specs/2026-07-26-server-latest-chapter-polling-design.md`.
|
||||||
Poller's `Store.Get` + `Store.Upsert` not wrapped in transaction, so
|
Poller's `Store.Get` + `Store.Upsert` not wrapped in transaction, so
|
||||||
userscript `PUT` that commits between the two can get overwritten by
|
userscript `PUT` that commits between the two can get overwritten by
|
||||||
@@ -77,5 +77,6 @@ Guidance for OpenCode (and Claude Code) working under `backend/`. See root `AGEN
|
|||||||
(background latest-chapter poller; defaults on, `1h`/`10m`/`14`/`20s`).
|
(background latest-chapter poller; defaults on, `1h`/`10m`/`14`/`20s`).
|
||||||
`USERSCRIPT_PATH` (file served at `/u/{token}/manga-bookmark.user.js`,
|
`USERSCRIPT_PATH` (file served at `/u/{token}/manga-bookmark.user.js`,
|
||||||
default `/userscript/manga-bookmark.user.js`, supplied by bindmount).
|
default `/userscript/manga-bookmark.user.js`, supplied by bindmount).
|
||||||
`BROWSER_WS_URL` (headless-shell CDP endpoint for kagane; unset disables
|
`BROWSER_WS_URL` (headless-shell CDP endpoint for kagane and novelfull;
|
||||||
browser polling and leaves that site to the userscript alone).
|
unset disables browser polling and leaves those sites to the userscript
|
||||||
|
alone).
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 172" role="img" aria-label="mangaBookmark">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 172" role="img" aria-label="BookmarkManager">
|
||||||
<title>mangaBookmark</title>
|
<title>BookmarkManager</title>
|
||||||
<g fill="#100f0e" stroke="#f2ece5" stroke-width="5" stroke-linejoin="round" stroke-linecap="round">
|
<g fill="#100f0e" stroke="#f2ece5" stroke-width="5" stroke-linejoin="round" stroke-linecap="round">
|
||||||
<path fill="none" d="M28 36H4v114h192V36h-24"></path>
|
<path fill="none" d="M28 36H4v114h192V36h-24"></path>
|
||||||
<path fill="none" d="M28 23H17v127h166V23h-11"></path>
|
<path fill="none" d="M28 23H17v127h166V23h-11"></path>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 973 B After Width: | Height: | Size: 977 B |
@@ -3,10 +3,10 @@ Guidance for OpenCode (and Claude Code) working under `userscript/`. See root `A
|
|||||||
### Userscript structure (single IIFE, `manga-bookmark.user.js`)
|
### Userscript structure (single IIFE, `manga-bookmark.user.js`)
|
||||||
|
|
||||||
1. **Site adapters** — one per host, `detect(location, document)` return page `type` + IDs. Identify type/IDs from **URL regex** (most stable); pull `title`/`cover` from **`og:title`/`og:image` meta tags**, not CSS classes.
|
1. **Site adapters** — one per host, `detect(location, document)` return page `type` + IDs. Identify type/IDs from **URL regex** (most stable); pull `title`/`cover` from **`og:title`/`og:image` meta tags**, not CSS classes.
|
||||||
2. **API client** — `apiGet/apiPut/apiDelete` with bearer header; `localStorage` key `mangabm:cache` for instant render + offline fallback.
|
2. **API client** — `apiGet/apiPut/apiDelete` with bearer header; `localStorage` key `bmgr:manga:cache` for instant render + offline fallback.
|
||||||
3. **Progress logic** — auto-upsert `last_chapter` only when `chapterNum >= stored last_chapter_num` (re-reading old chapters must not regress progress; unparseable -> set current). Manual panel override forces any value.
|
3. **Progress logic** — auto-upsert `last_chapter` only when `chapterNum >= stored last_chapter_num` (re-reading old chapters must not regress progress; unparseable -> set current). Manual panel override forces any value.
|
||||||
4. **Retry queue** — every write go through `pushBookmark`/`pushDelete`, so
|
4. **Retry queue** — every write go through `pushBookmark`/`pushDelete`, so
|
||||||
failed mutation park in `localStorage` (`mangabm:queue`) and replayed on
|
failed mutation park in `localStorage` (`bmgr:manga:queue`) and replayed on
|
||||||
next navigation, reconnect, or `refresh()`. Entries are markers
|
next navigation, reconnect, or `refresh()`. Entries are markers
|
||||||
(`{key, op, sendStatus, attempts}`), never payloads — body read from
|
(`{key, op, sendStatus, attempts}`), never payloads — body read from
|
||||||
cache at send time, so one entry per key give ordering and coalescing for
|
cache at send time, so one entry per key give ordering and coalescing for
|
||||||
|
|||||||
Reference in New Issue
Block a user