Static site that aggregates disguise designer release notes (r14–r32) into a single searchable table. Uses AI (via GitHub Models) to extract and categorise changes from HTML release pages. AI-extracted content may be inaccurate — always refer to the official release notes.
scrape.mjs— Node CLI script. Fetches release pages fromhelp.disguise.one, converts HTML to markdown via turndown, sends to AI for structured extraction, outputsdata/releases.json.index.html— Single static HTML file with inline CSS/JS. Loadsdata/releases.jsonvia fetch. Provides search, sort, and filter UI.data/releases.json— Generated tree-structured file committed to repo. Schema:[{ version, build, starter_build, released, url, changes: [{ dsof, category, description }] }].data/.ai-cache.json— AI response cache keyed by content hash. Committed to repo.validate.mjs— Node CLI script, no dependencies. Validatesdata/releases.jsonbefore the daily PR is allowed to auto-merge. Structural checks apply to every entry; stricter quality checks apply only to entries that are new or changed versus the base ref, because pre-r30 entries contain known junk (emptybuild, emptyreleased, comma-joineddsof) that is grandfathered in.
node scrape.mjs— Scrape all release pages and extract with AI (requiresAI_TOKENenv var)node scrape.mjs --version r32— Scrape a specific major versionnode scrape.mjs --version r32.2 --force— Re-extract a version, ignoring cachenode scrape.mjs --cache-only— Rebuild releases.json from AI cache (no fetching or API calls)node scrape.mjs --fix-urls— Patch cached entries with correct anchor URLsnpx serve .— Serve locally for testing (fetch requires HTTP, not file://)node validate.mjs— Validatedata/releases.jsonagainstorigin/masternode validate.mjs --no-base— Structure/quality checks only, no comparison (note: fails on grandfathered legacy entries)
.github/workflows/update-releases.yml— Daily scrape. Always opens/updates the rollingauto/update-releasesPR, then auto-merges it only if validation passes, the diff is purely additive, and nothing outsidedata/changed. A failed validation leaves the PR open and fails the run..github/workflows/validate.yml— Runsvalidate.mjson human PRs. Its job is nameddata-validationto match the commit status the daily workflow posts, so one required check covers both paths.
- Use conventional commits (e.g.,
feat:,fix:,chore:) - No framework for the frontend — plain HTML/CSS/JS
- turndown is the only npm dependency (HTML to markdown conversion)