Repository navigation
Conversation
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zjgtjy/index.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zjmuseum/temporaryexhibition.tsx
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zjol/paper.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zju/career/index.ts - lib/routes/zju/cse/index.ts - lib/routes/zju/cst/custom.ts - lib/routes/zju/cst/index.ts - lib/routes/zju/math/index.ts - lib/routes/zju/physics/index.ts - lib/routes/zju/sis/index.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zjut/cs/index.ts - lib/routes/zjut/da/index.ts - lib/routes/zjut/design.ts - lib/routes/zjut/index.ts - lib/routes/zjut/jwc/index.ts - lib/routes/zjut/news.ts - lib/routes/zjut/www/index.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zjuvag/blog.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zodgame/forum.tsx
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zongheng/detail.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zotero/versions.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zrblog/rss.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zsnews/index.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zsxq/group.ts - lib/routes/zsxq/user.ts - lib/routes/zsxq/utils.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zuel/notice.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zuvio/boards.ts - lib/routes/zuvio/student5.ts - lib/routes/zuvio/utils.tsx
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zxcs/novel.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zyshow/index.tsx
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zyw/hot.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zzu/dwzzb.ts - lib/routes/zzu/dzb.ts - lib/routes/zzu/gs.ts - lib/routes/zzu/jwc.ts - lib/routes/zzu/kjc.ts - lib/routes/zzu/math.ts - lib/routes/zzu/news.ts - lib/routes/zzu/rsc.ts - lib/routes/zzu/soft-news.ts - lib/routes/zzu/ss.ts - lib/routes/zzu/student.ts - lib/routes/zzu/sxy.ts - lib/routes/zzu/tzhb.ts - lib/routes/zzu/xbx.ts - lib/routes/zzu/xuan.ts - lib/routes/zzu/zcycwb.ts
Combine the reviewed route corrections and their follow-up adjustments. Affected files: - lib/routes/zzuli/campus.ts - lib/routes/zzuli/yjsc.ts
Remove retired services, obsolete source endpoints, and discontinued categories. Keep supported routes and categories available. Affected files: - lib/routes/163/news/rank.ts - lib/routes/app-center/namespace.ts - lib/routes/app-center/release.tsx - lib/routes/cdi/index.ts - lib/routes/ce/district.ts - lib/routes/dgjyw/index.ts - lib/routes/dgjyw/namespace.ts - lib/routes/lfsyd/old-home.ts - lib/routes/linkedin/cn/index.ts - lib/routes/linkedin/cn/renderer.ts - lib/routes/linkedin/cn/utils.tsx - lib/routes/odaily/post.ts - lib/routes/openai/chatgpt-atlas.ts - lib/routes/pku/ss/pg-admin.ts - lib/routes/tencent/news/coronavirus/data.tsx - lib/routes/tencent/news/coronavirus/total.tsx - lib/routes/tencent/news/coronavirus/utils.ts - lib/routes/theinitium/follow.ts - lib/routes/wikinews/index.ts - lib/routes/wikinews/namespace.ts - lib/routes/xjtu/2yuan/news.ts - lib/routes/zcmu/jwc/index.ts - lib/routes/zhibo8/forum.ts - lib/routes/zhibo8/post.ts
Merge current master while retaining the completed route review and retired service removals. Keep upstream source migrations and new feed functionality, including the ACEA API, Xiaomi data helpers, Yahoo Finance topic helper, Bilibili list URLs, Douban IP locations, and Douyin live-stream handling. Resolve overlapping changes without losing existing limit validation, bounded detail requests, stable item metadata, or route configuration corrections. Keep RSS image MIME inference and explicit media precedence alongside upstream attachment extraction, emitting a single enclosure per item.
Filtered requests keep a distinct source candidate cache. Expect the first unfiltered request to miss that cache, and verify that repeating the same unfiltered request returns all entries with a cache hit.
The docs site only builds pages for namespace keys, so the category links written into radar-rules.json/js pointed at missing pages. 0a3a66a fixed the API rules; do the same for the build output. Refs DIYgod#17785
The Format workflow rewrote the if/else chain into a switch through unicorn prefer-switch, whose fixer adds braces to every case. The repo config sets unicorn/switch-case-braces to "avoid", and oxlint applies fixes in a single pass, so the braces were committed and every later Format run failed on them without being able to fix them.
Same autofix as in seu: the prefer-switch fixer left braced cases that unicorn/switch-case-braces "avoid" rejects. The Format workflow fixed these in its own checkout but stopped on the seu errors before committing, so lint without --fix still fails here.
Douban lists replies from oldest to newest, 100 per page, so the route only ever saw the first 100 replies of a long topic and missed every new one. When the topic has more than one page, fetch the page that the paginator's last link points to and use its replies instead. Reply links now open that page (with author=1 in author-only mode), while the guid keeps the old format so existing items are not duplicated. Closes DIYgod#17743
Read the posts from the recent-activity API, as requested in the review of DIYgod#23262. The profile page only server-renders the latest two posts, while the API returns the user's post activity without authentication. Keep the social-post entries (the activity also lists comments and reactions on other posts), render rawContent as Markdown and append the image and video attachments. Closes DIYgod#23059 Co-authored-by: qqc20043 <147302501+qqc20043@users.noreply.github.com>
The MTProto path cached the resolved input entity for the default 5 minutes, so every process that started later or missed the cache called contacts.ResolveUsername again for each channel. That method is heavily rate limited, and once the account hit a flood wait the route failed with "A wait of N seconds is required" even for channels that the public web preview serves fine. Keep the channel ID and access hash for 30 days, since they do not change, and fall back to the web preview when MTProto raises a FloodWaitError. Other MTProto errors are still reported. Closes DIYgod#20454
Bumps [query-string](https://github.com/sindresorhus/query-string) from 9.5.1 to 10.0.0. - [Release notes](https://github.com/sindresorhus/query-string/releases) - [Commits](sindresorhus/query-string@v9.5.1...v10.0.0) --- updated-dependencies: - dependency-name: query-string dependency-version: 10.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [youtubei.js](https://github.com/LuanRT/YouTube.js) from 18.2.0 to 18.3.0. - [Release notes](https://github.com/LuanRT/YouTube.js/releases) - [Changelog](https://github.com/LuanRT/YouTube.js/blob/main/CHANGELOG.md) - [Commits](LuanRT/YouTube.js@v18.2.0...v18.3.0) --- updated-dependencies: - dependency-name: youtubei.js dependency-version: 18.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…Ygod#23685) * chore(deps): bump the oxc group across 1 directory with 7 updates Bumps the oxc group with 7 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@oxc-parser/binding-wasm32-wasip1](https://github.com/oxc-project/oxc/tree/HEAD/napi/parser) | `0.154.0` | `0.155.0` | | [oxc-parser](https://github.com/oxc-project/oxc/tree/HEAD/napi/parser) | `0.154.0` | `0.155.0` | | [@oxlint/plugins](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint-plugins) | `1.88.0` | `1.89.0` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.73.0` | `0.74.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.88.0` | `1.89.0` | | [oxlint-plugin-eslint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint-plugin-eslint) | `1.88.0` | `1.89.0` | | [oxlint-tsgolint](https://github.com/oxc-project/tsgolint) | `7.0.2004` | `7.0.2005` | Updates `@oxc-parser/binding-wasm32-wasip1` from 0.154.0 to 0.155.0 - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/napi/parser/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/crates_v0.155.0/napi/parser) Updates `oxc-parser` from 0.154.0 to 0.155.0 - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/napi/parser/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/crates_v0.155.0/napi/parser) Updates `@oxlint/plugins` from 1.88.0 to 1.89.0 - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.89.0/npm/oxlint-plugins) Updates `oxfmt` from 0.73.0 to 0.74.0 - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.74.0/npm/oxfmt) Updates `oxlint` from 1.88.0 to 1.89.0 - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.89.0/npm/oxlint) Updates `oxlint-plugin-eslint` from 1.88.0 to 1.89.0 - [Release notes](https://github.com/oxc-project/oxc/releases) - [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint-plugin-eslint/CHANGELOG.md) - [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.89.0/npm/oxlint-plugin-eslint) Updates `oxlint-tsgolint` from 7.0.2004 to 7.0.2005 - [Release notes](https://github.com/oxc-project/tsgolint/releases) - [Commits](oxc-project/tsgolint@v7.0.2004...v7.0.2005) --- updated-dependencies: - dependency-name: "@oxc-parser/binding-wasm32-wasip1" dependency-version: 0.155.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: oxc - dependency-name: "@oxlint/plugins" dependency-version: 1.89.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: oxc - dependency-name: oxc-parser dependency-version: 0.155.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: oxc - dependency-name: oxfmt dependency-version: 0.74.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: oxc - dependency-name: oxlint dependency-version: 1.89.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: oxc - dependency-name: oxlint-plugin-eslint dependency-version: 1.89.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: oxc - dependency-name: oxlint-tsgolint dependency-version: 7.0.2005 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: oxc ... Signed-off-by: dependabot[bot] <support@github.com> * style: fix lint issue --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.6.0 to 4.7.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](docker/login-action@dbcb813...81c6f93) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: 4.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Brings the fork from upstream 5eb4e37 (2026-06-03) to the current upstream master. The only conflict was .github/workflows/semgrep.yml: upstream bumped actions/checkout to v7.0.1, the fork keeps its SARIF upload fix on top of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The merged upstream lint and format config (oxlint, oxfmt) flags the Message Center, Microsoft Learn and easylife365 routes. Apply its autofixes and fix the two guards in intune-whats-new by hand. The Message Center limit now uses Number() instead of parseInt, so a value like "10abc" falls back to the default instead of reading as 10. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Message Center reads limit with Number() like upstream's routes do, and intune-whats-new stops its sibling walk on a heading via one regex. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| // A cache hit costs no navigation, so it never draws on the budget: a warm poll still | ||
| // returns every listing fully enriched however little time is left. | ||
| // eslint-disable-next-line no-await-in-loop -- one shared tab, so the detail pages must be visited in turn | ||
| const cached = await cache.get(key); |
| } else if (Date.now() < deadline) { | ||
| try { | ||
| // eslint-disable-next-line no-await-in-loop -- same shared tab | ||
| await page.goto(`${HOST}/rent_store/${b.id}/`, { waitUntil: 'domcontentloaded' }); |
| // eslint-disable-next-line no-await-in-loop -- same shared tab | ||
| await page.goto(`${HOST}/rent_store/${b.id}/`, { waitUntil: 'domcontentloaded' }); | ||
| // eslint-disable-next-line no-await-in-loop -- same shared tab | ||
| await page.waitForSelector('#serverApp-state', { state: 'attached', timeout: DETAIL_STATE_TIMEOUT }); |
| // eslint-disable-next-line no-await-in-loop -- same shared tab | ||
| await page.waitForSelector('#serverApp-state', { state: 'attached', timeout: DETAIL_STATE_TIMEOUT }); | ||
| // eslint-disable-next-line no-await-in-loop -- same shared tab | ||
| detail = detailOf(await page.content()); |
| let iReqOffSet = 0; | ||
|
|
||
| do { | ||
| bHasNextPage = false; | ||
| // eslint-disable-next-line no-await-in-loop | ||
| const data = await ofetch(strBaseUrl, { | ||
| const { code, results } = await ofetch(strBaseUrl, { |
| /* eslint-disable no-await-in-loop */ | ||
| const result = await got(sublink); | ||
| pages.push(load(result.data)); | ||
| const html = await fetchBjxPage(sublink, context); |
| return []; | ||
| } | ||
| if (Array.isArray(value)) { | ||
| return value.flatMap(findBlogCards); |
| if (Array.isArray(value.cards) && value.cards.every(isBlogCard)) { | ||
| return value.cards; | ||
| } | ||
| return Object.values(value).flatMap(findBlogCards); |
| if (tokens.length === 1 && tokens[0].type === 'h3') { | ||
| return <h3>{tokens[0].content}</h3>; | ||
| } | ||
| return <p>{tokens.map(renderToken)}</p>; |
| } | ||
| } | ||
|
|
||
| async function checkRSS(response) { |
| // `<br>` separates 駅 from 徒歩, and cheerio's .text() would run them together. | ||
| const stationEl = th('最寄駅'); | ||
| const stationHtml = stationEl ? $(stationEl).next('td').html() : null; | ||
| const stationText = value(stationHtml?.replaceAll(/<br\s*\/?>/gi, ' ').replaceAll(/<[^>]+>/g, '') ?? null); |
| } | ||
|
|
||
| function decodeMedia(value: string, secret: string): string { | ||
| const digest = createHash('md5').update(secret).digest('hex'); |
The CI lint config (.oxlintrc.ci.json) enables anti-slop/no-known-value-widening, which rejects the Record<string, string> bindings in the easylife365 and Message Center routes. A Map keeps typed string-key lookups without the open dictionary type, and the easylife365 table moves to module scope. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A dispatch of the custom image workflow on a branch now pushes only the long-sha tag and skips the Coolify webhook, so a branch image can be test-deployed by its sha without moving latest or redeploying production. Pushes to master keep latest, the date tag and the deploy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fork appended "|| true" to the scan so an empty SARIF file would not break the upload. The upload step's hashFiles guard already covers that, and "|| true" also hid blocking findings and scan errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every master build since 2026-07-07 failed at the deploy step with HTTP 401: the bearer header was dropped in favour of a bare webhook URL, and "?force=true" was appended to a URL that already has a query. Send the token from the COOLIFY_API_TOKEN secret and let curl -G append force=true with the right separator. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two close pushes to master could finish out of order, so an older build pushed latest and redeployed last. A concurrency group without cancel-in-progress lets the running build finish before a newer one starts; GitHub keeps only the newest pending run, so the last push always builds last. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An unset COOLIFY_API_TOKEN expanded to an empty bearer and failed with a bare 401. Check it first and name the missing secret. The secrets now reach curl through env instead of being expanded into the script. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
This PR is being auto-closed because it has a broken Docker build without any fixes. Push a fix and reopen when ready. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Gap:
masteris 3243 commits behind DIYgod/RSSHub (fork point 5eb4e37, 2026-06-03), so the image Coolify runs has none of upstream's fixes since then. The daily sync has failed since 2026-06-04.Change:
d02dd85admergesupstream/master(9515261) intomaster. The only conflict was.github/workflows/semgrep.yml. The resolution takes upstream'sactions/checkoutv7.0.1 and keeps the fork's SARIF upload fix on top.ca0b02201andfe243c86cmake the fork's own routes pass upstream's newer oxlint/oxfmt rules (Message Center, Microsoft Learn Intune and Entra, easylife365), then simplify the result. Behavior change: the Message Centerlimitis now read withNumber(), like upstream's routes, so a value like10abcfalls back to the default 20.19736a93freplaces theRecord<string, string>lookup tables in easylife365 and Message Center with module-levelMaps. CI's code-scanning lint (.oxlintrc.ci.json, run bylint.yml) enablesanti-slop/no-known-value-widening, and that rule rejected them. The local prek chain andpnpm lintuse.oxlintrc.json, where the rule is off, which is why the pre-commit run did not catch it. Check locally withpnpm exec oxlint --type-aware --config=.oxlintrc.ci.json <paths>.af6198e17changesdocker-custom.yml:latestand the date tag are set only on the default branch, the long-sha tag always, and the Coolify webhook runs only on the default branch.9054fdb89drops the fork's|| truefrom the semgrep scan. The upload step'shashFilesguard already avoids the empty-SARIF error, and|| truealso swallowed blocking findings and scan errors. Note: this fork has noSEMGREP_APP_TOKEN, sosemgrep ciprints a login error, scans nothing and exits 0 by its default. The job stays green without scanning (run 40421054614).pull_request_targetruns the base branch's copy of the workflow, so this PR's CI does not exercise the change.c52baa9d3fixes the Coolify deploy step, which has failed withcurl: (22) ... 401on everymasterbuild since 2026-07-07 (run 29312235007). It sendsAuthorization: Bearerfrom the new secretCOOLIFY_API_TOKEN, andcurl -G --data-urlencode force=trueappendsforce=truewith the separator the URL needs. Before,?force=truewas appended to a URL that already had a query. That Coolify's deploy API requires the bearer token is taken from the Coolify docs: UNVERIFIED.fcfe2bb03adds a per-refconcurrencygroup withoutcancel-in-progress. The running build finishes, GitHub keeps only the newest pending run, and an older build can no longer pushlatestlast.a91409239makes the deploy step stop with a named error whenCOOLIFY_API_TOKENis unset, instead of sending an empty bearer and failing with a bare 401. Both secrets now reach curl throughenv.sync-upstream.ymlanddocker-compose.custom.yml.Merge with a merge commit, not squash or rebase. A squash cuts the upstream ancestry, and every later sync would then conflict. I chose a merge over rebasing the fork's 38 commits onto upstream for two reasons: a rebased branch reaches
masteronly by force-pushing it, and the daily sync (gh repo sync, the merge-upstream API) creates merge commits anyway.Cause: the sync stopped because
secrets.SYNC_TOKENreturnsHTTP 401: Bad credentialsonmerge-upstream(every run since 2026-06-04). Divergence was not the cause: the API merged a divergedmasterfrom April to June. A person has to rotate the token, which needs contents and workflows write on this repository. This PR does not fix that.Out of scope:
docker-compose.custom.yml. For the synced code it needsPLAYWRIGHT_CDP_ENDPOINTinstead ofPUPPETEER_WS_ENDPOINT,ghcr.io/browserless/chromiumwithTOKEN, and thereal-browserservice andPUPPETEER_REAL_BROWSER_SERVICEremoved. That is scheduled after build(compose): stop publishing host ports and take the Basic Auth value from the environment [10m] #76. Until then the oldPUPPETEER_WS_ENDPOINTis still read as a fallback forPLAYWRIGHT_WS_ENDPOINT. Whether that path works against browserless v1 is unverified, as before. None of the fork's routes use a browser.Person's step before merging: in Coolify, create an API token with the deploy permission only. In this repository, set it as the Actions secret
COOLIFY_API_TOKEN. Without it, the deploy step after the merge fails again with 401.COOLIFY_WEBHOOK_URLstays as it is. The old secretCOOLIFY_WEBHOOK_APITOKENis unused since 0c81dca and can be deleted once the new one works.Test deployment: in Actions, run Docker Custom Build (
workflow_dispatch) on branchclaude/i-29-upstream-sync-09e719. That run pushes onlyghcr.io/workoho/rsshub:<full head sha>: it moves neither:latestnor the date tag, and it skips the Coolify webhook. Then point a test resource in Coolify at that sha tag and retest the custom routes. Merging intomasterafterwards builds:latestand deploys production as before. That the{{is_default_branch}}gating works on a dispatch is from the docker/metadata-action docs and unverified until the first dispatch run.Code scanning: the open oxlint and CodeQL alerts on
refs/pull/78/mergesit in upstream files that are identical toupstream/master. They are left as they are. Fork-only paths have no open alerts after19736a93f.Hooks: the shared
core.hooksPathpoints at an old husky hook that cannot execute on Windows. Upstream now uses prek. The merge commitd02dd85adwas made with no hook (accepted by the person): it would have linted and autofixed about 3000 upstream files. Instead I ranpnpm exec prek run --filesby hand on the 14 fork files: format-description, oxlint, eslint, oxfmt and typecheck all pass, after the fixes inca0b02201. The later commits ran upstream's prek hook in full, through a per-commandcore.hooksPathoverride.Verified: on Windows with Node 24.22.1 and pnpm 12.15.0:
pnpm buildpasses, and all 7 fork routes are inassets/build/routes.json.vitest run lib/registry.test.ts lib/registry-dev.test.ts lib/app.test.ts lib/config.test.ts: 55 tests pass.node dist/index.mjs), all 7 fork routes returned 200 with items against the live sources.?limit=5returned 5 items on Message Center.An AI agent wrote this text in my name, on my instructions.