Repository navigation
Address stable release review findings; retire extern-contrib - #1055
Conversation
- Close the expanded mobile menu before jumping to a section so the heading is not hidden behind it. - Privacy notice: script settings live in the site's localStorage and may be cloud-synced; the messages.html session is sent with requests. - Child protection: messages are not end-to-end encrypted. - Make the English classic-page language test set XMOJ_LANG=en, and count every evaluation of the native history script in the profile fixture so re-execution is detectable. - 3.8.8 release notes as HTML, since Notes is inserted with innerHTML. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Reviewer's GuideAddresses selected automated review findings from the stable release PR by fixing mobile navbar scrolling, correcting privacy and encryption disclosures, making language/profile regression tests reflect real behavior, and formatting release notes for the update dialog; unrelated findings were intentionally left unchanged. Sequence diagram for mobile navbar section navigationsequenceDiagram
participant User
participant SiteNav
participant Bootstrap
participant Browser
User->>SiteNav: click section link
SiteNav->>Bootstrap: Collapse.getOrCreateInstance(siteNav).hide()
Bootstrap-->>SiteNav: hidden.bs.collapse
SiteNav->>Browser: history.pushState(null, "", link.hash)
SiteNav->>Browser: target.scrollIntoView()
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
PRs created with GITHUB_TOKEN need a maintainer to approve their workflow runs, so the auto-merge on the actions/temp version PR never completes on its own. Create it with the app token like the other workflows. UpdateVersion still skips it because the actor ends in [bot]. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
Deploying xmoj-script-dev-channel with
|
| Latest commit: |
0f68da7
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://98d258d0.xmoj-script-dev-channel.pages.dev |
| Branch Preview URL: | https://fix-release-review.xmoj-script-dev-channel.pages.dev |
There was a problem hiding this comment.
Review completed against the latest diff
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 8 files
Requires human review: Auto-approval blocked because this review re-detected 1 unresolved issue already reported by Cubic.
Re-trigger cubic
- Navbar: treat / and /index.html as the same page, let modifier and non-primary clicks through, and keep intercepting clicks during the close animation so the last tapped link wins. - Wording fixes on the privacy and child-protection pages. - UpdateToRelease: skip fork PRs (no secrets to mint the app token) and scope the app token to contents and pull-requests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
- Remove the dev -> extern-contrib sync and the merge.yml job that could never run (its only job required ref extern-contrib). - UpdateVersion: pass the PR title through env instead of pasting it into the shell command. - Prerelease: skip when a release for the current version exists, so a merge without a version bump cannot overwrite a published release. - Qodana: skip fork PRs, which do not receive QODANA_TOKEN. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
There was a problem hiding this comment.
All reported issues were addressed across 9 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
Fork PRs get no secrets and the bot cannot push to forks, so their version cannot be bumped before merge. On a push to dev that touches XMOJ.user.js, look up the PR whose merge commit it is; if it came from a fork, run UpdateVersion in fork-merged mode: bump on actions/version-<PR> from dev and open an auto-merging PR as the GitHub App. Runs only on the trusted push, never on fork events, and never checks out fork code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
There was a problem hiding this comment.
All reported issues were addressed across 3 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
- UpdateVersionFork processes every merged fork PR to dev that has no Update.json entry, oldest first, each from the latest dev. A run dropped by the concurrency group loses nothing: the next run picks its PR up. - fork-merged mode reuses an open version PR on a rerun and waits for it to merge, so the next bump starts from a dev with this version. - Prerelease only skips when the version is already a stable release; an existing prerelease of the same version is still refreshed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
Qodana is no longer used and the workflow is disabled on GitHub; this also drops the fork guard added to it earlier in this PR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
What does this PR aim to accomplish?:
Address the valid automated review findings on the stable release PR #1052 (cubic, Codex, GitHub code quality), so they land in
devbeforedevis merged intomaster. This PR does not touchXMOJ.user.js, so it does not trigger a version bump.It also makes the release version PR (
actions/temp→dev, e.g. #1054) auto-merge without a maintainer approving its workflow runs, and retiresextern-contrib: fork PRs now targetdevdirectly.How does this PR accomplish the above?:
Fixed:
site.js): on phones, the expanded menu is part of the sticky navbar, so tapping 功能/安装/常见问题 scrolled the heading underneath the open menu. Section links now close the menu first and scroll once it has collapsed. Checked headless at 390×800: before, the menu stayed open (bottom 353px) with the heading at 80px, hidden; after, the menu closes and each heading sits at 80px below the 65px bar.privacy.html): script settings live in xmoj.tech'slocalStorage(UtilityEnabled), not in the userscript manager, and can be cloud-synced. The section heading no longer claims everything stays on-device, and it notes that the messages.html session is sent with API requests.child-protection.html): no longer says administrators cannot see messages. It now matches the privacy notice: messages are encrypted in the database, but this is not end-to-end encryption.tests/chinese-language.test.cjs): the "classic English page" case passedenglish: true, which only stubbedquerySelector. English is detected from theXMOJ_LANG=encookie, so the test now sets that cookie, and the unused option is removed.tests/fixtures/profile.html,tests/profile-page.test.cjs): the native history script counted runs only when jQuery was present, and the test never loads jQuery, so re-execution could never be detected. It now counts every evaluation, and the test asserts the count is exactly 1, meaning only the page's own load ran it.Update.json): the update dialog insertsNoteswithinnerHTML, so the Markdown bullets showed up as literal hyphens. They are now an HTML list.Not changed:
site.js/ the update check pick it up.#Installanchors (Codex):404.htmlinserts<base href="/">(/XMOJ-Script/on github.io) before any resource. Every later relative URL, including fragment-only#Install, resolves against the site root, so these already load the root stylesheet and go to the homepage sections.document.writein the profile fixture (code quality): the fixture copies the native xmoj.tech profile markup on purpose. It is test-only and never shipped.Release workflow (
.github/workflows/UpdateToRelease.yml):GITHUB_TOKEN, so its workflow runs waited for manual approval andgh pr merge --autonever finished by itself. It now gets a GitHub App token (APP_ID/APP_PRIVATE_KEY, as UpdateVersion, Prerelease, Release and Daily already do) and uses it for checkout,gh pr createandgh pr merge.[bot], which includes the app, and UpdateToRelease only runs on PRs tomaster.Second review round (f117fe9):
/and/index.htmlcount as the same page; Cmd/Ctrl/Shift/Alt and non-primary clicks pass through; clicks during the close animation are still intercepted, so the last tapped link wins.contents/pull-requests.Retiring
extern-contrib(eab4141, 5685b2a):sync-to-extern-contrib.ymlandmerge.yml. The latter never ran: it triggered on pushes todev, but its job required theextern-contribref.envinstead of pasting${{ github.event.pull_request.title }}into the shell.XMOJ.user.js.main.yml, already disabled on GitHub).dev. Docs site: Send external contributors to dev; extern-contrib is retired docs#11.first_time_contributors, sync: dev to extern-contrib #1053 is closed, and theextern-contribbranch is deleted (it was at d8aa02f, with no content that isn't ondev).master(1d9bc7c).Fork version bumps (581153a):
UpdateVersionForkworkflow. It runs on pushes todevthat touchXMOJ.user.js, which is a trusted event, so no fork event ever gets secrets and no fork code is checked out. It finds the PR whosemerge_commit_shais the pushed commit. If that PR came from a fork (including a deleted one), it runsUpdateVersion.jsin the newfork-mergedmode: bump onactions/version-<PR>fromdev, then open an auto-merging PR as the app. Prerelease skips the fork merge itself (version unchanged) and publishes when the bump PR merges.ghand a local remote produced matching 3.9.1 versions, pushedactions/version-4242, and opened the auto-merge PR; a title containing"…" $(…)and backticks was stored as plain text, never executed.devsince 2026-10-06 that has noUpdate.jsonentry, oldest first, each from the latestdev. It waits for each version PR to merge before the next and reuses an open version PR on a rerun.workflow_dispatchis available for manual reruns. Prerelease now skips only when the version is already a stable release. Dry run with two fork PRs and simulated merges: consecutive versions, and a second pass skipped both.pull_request_target.npm test: 99/99 pass locally. The UpdateToRelease change can only be verified on the next dev → master release PR.By submitting this pull request, I confirm the following:
git rebase)🤖 Generated with Claude Code
https://claude.ai/code/session_01E5dr7XTsCeoamqLSiT9rLp
Summary by Sourcery
Address stable-release review findings and streamline contribution and version-release automation around the dev branch.
New Features:
Bug Fixes:
Enhancements:
CI:
Documentation:
Tests: