* feat(ci): add auto-generated CHANGELOG.md synced from releases (#4872)
Add a Keep a Changelog CHANGELOG.md that is fully derived from the project's
GitHub Releases, so users no longer have to dig through commit history to see
what changed between versions.
- scripts/generate-changelog.js: fetch releases via the gh CLI, keep only
stable vX.Y.Z tags (nightly/preview omitted), and re-group each release's
auto-generated "What's Changed" list into Added/Changed/Fixed/Performance/
Documentation/Other sections by the conventional-commit prefix every PR title
uses. Zero runtime deps (node builtins + gh).
- release.yml: regenerate and commit CHANGELOG.md on stable releases; the
commit rides the existing release-branch PR into main.
- package.json: add 'npm run changelog'.
- .prettierignore: skip the generated file.
- Seed CHANGELOG.md from the current stable release history.
Closes#4872
* ci(release): make CHANGELOG regeneration non-blocking
Add continue-on-error to the CHANGELOG step. Its only realistic failures
(the gh API read and the git push) are transient, and the generator rebuilds
from the full release history each run, so a skipped update self-heals on the
next stable release. This keeps a changelog hiccup from blocking the
version-bump PR to main that follows.
* fix(ci): harden changelog generator per review
Address review findings on the changelog generator:
- Command injection: fetchReleasesJsonl built a shell string with the repo
interpolated; switch to execFileSync (no shell) plus an owner/name format
check so --repo can never be a shell payload.
- Empty-response clobber: if the API returns zero stable releases (rate limit,
auth, 5xx), refuse to overwrite CHANGELOG.md and exit 1 instead of committing
a header-only stub. Paired with set -euo pipefail in the workflow so the
failure is visible and the non-blocking step self-heals next release.
- Arg parsing: switch getArgs() to parseArgs() (already imported) so a --dryrun
typo errors instead of silently overwriting, and -h works as documented.
- Breaking changes: capture the conventional-commit ! marker and prefix the
entry with **BREAKING** (the repo uses feat()!:/refactor()!: in practice).
- Bot authors: ENTRY_RE now accepts a trailing [bot] so GitHub App authors
(e.g. @dependabot[bot]) are not dropped from release notes.
Regenerates CHANGELOG.md (two entries now flagged **BREAKING**).
* refactor(ci): simplify changelog generator
Quality-only cleanup (output is byte-identical; 23 tests green):
- Single source of truth for sections: derive TYPE_TO_SECTION and
SECTION_ORDER from one SECTIONS list so they can't drift.
- Parse each entry once: formatRelease now reuses the categorize() result for
the noise check, section lookup, and formatEntry (was parsed up to 3x).
- Drop the redundant sortKey field; sort directly from version.
- Collapse the duplicated double-.map() setup in the selectStableReleases test.
* docs: update quota exceeded alternatives to OpenRouter and Fireworks
- Update README.md news section to recommend OpenRouter and Fireworks
as primary alternatives, with ModelStudio as third option
- Update retry.ts quota error message to include OpenRouter and
Fireworks URLs for users whose OAuth quota has been exhausted
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
* fix(test): update retry test assertions to match new quota error message
* docs: update free tier quota to 100 req/day with sunset notice and alternatives
Update all references to reflect the Qwen OAuth free tier policy change:
- 1,000 → 100 requests/day across code, i18n, and docs
- Add 2026-04-15 sunset date everywhere
- Guide users to OpenRouter, Fireworks AI, or ModelStudio in docs
- Remove CHANGELOG.md
---------
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: tanzhenxin <tanzhenxing1987@gmail.com>