Use after a release succeeds, when maintainers need to sync apps/kimi-code/CHANGELOG.md into docs/en/release-notes/changelog.md and docs/zh/release-notes/changelog.md, then open a PR on a dedicated branch.
70
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
kimi-code uses changesets for versioning. Each package gets its own CHANGELOG.md. The user-facing CLI package, @moonshot-ai/kimi-code, writes its changelog here:
apps/kimi-code/CHANGELOG.mdThis file is the only upstream source for the documentation-site changelog. Internal package changelogs such as packages/*/CHANGELOG.md do not go into the documentation site.
After the release flow finishes (Release PR merged → Version Packages completed → npm publish succeeded), maintainers manually run this skill to copy the new CLI changelog entries into the docs site, translate the English increment into Chinese, wait for an optional human review, then commit on a dedicated branch and open a PR.
apps/kimi-code/CHANGELOG.md contains version blocks that are not yet in docs/en/release-notes/changelog.md.gen-docs flow does not run this automatically; maintainers must explicitly do it after release.Do not run this before the Release PR is merged. At that point, changesets has not yet written the new version into apps/kimi-code/CHANGELOG.md.
| File | Role | Edited by |
|---|---|---|
apps/kimi-code/CHANGELOG.md | Only upstream source, generated by changesets | Never edit manually |
docs/en/release-notes/changelog.md | English docs changelog; source of truth for docs | This skill |
docs/zh/release-notes/changelog.md | Chinese docs changelog, translated from English | This skill, following translate-docs |
Core rule: the English docs changelog is the source of truth, and Chinese is translated from English. This matches translate-docs.
Before editing, confirm:
npm view @moonshot-ai/kimi-code versions --json) or has a matching GitHub Release tag.apps/kimi-code/CHANGELOG.md is that new version.If any condition is not true, stop and confirm with the user.
Do not edit or commit directly on main. All sync work happens on a dedicated branch created in step 1.
Start from an up-to-date default branch:
git fetch origin
git checkout main
git pull --ff-only origin mainBefore creating the branch, peek at the version range so the branch name matches the newest version being synced:
rg '^## ' apps/kimi-code/CHANGELOG.md | head -5
rg '^## ' docs/en/release-notes/changelog.md | head -5Name the branch after the newest upstream version that is not yet in the English docs page:
docs/changelog-sync-<newest-version>Example: syncing 0.2.1 only → docs/changelog-sync-0.2.1.
git checkout -b docs/changelog-sync-<newest-version>If the branch already exists locally or on the remote, stop and confirm with the user instead of reusing it.
Use the same version lists from step 1. Confirm:
Use upstream order: newest version first.
Upstream entries look like this:
- [#317](https://github.com/...) [`2f51db4`](https://github.com/...) Thanks [@user](https://github.com/...)! - Clean up lint warnings ...Changesets may add a Thanks ...! credit, but it must be removed every time. Keep:
## 0.2.0.Thanks ...! credit have been removed.Remove:
# @moonshot-ai/kimi-code because the docs page already has # Changelog.### Patch Changes, ### Minor Changes, and ### Major Changes.[#317](...).[`2f51db4`](...).Thanks [@user](...)! credit, including the multi-author form Thanks [@a](...), [@b](...)!. Drop the whole Thanks ...! segment every time, regardless of whether the feature is enabled.After stripping, each entry is - <body text>.
Drop SDK-only and provider-internal detail. This changelog serves @moonshot-ai/kimi-code CLI and web users. Within an entry, keep only what CLI/web users can perceive, and remove sentences that document internals instead of user-visible behavior. Apply this on both the English and Chinese pages:
getExperimentalFeatures() — that belongs in the SDK changelog, not here.<tools_added>, protocol field explanations, "the wire protocol is unchanged", cache-hit mechanics) unless they are the behavior a user perceives.SessionEnd reports archive when a session is archived"). Keep the new events or capability itself and how to configure it.Do not change facts or drop a real user-facing behavior — only trim the internal-only scaffolding. For over-long, internal-heavy entries, this trim applies on the English page too, not only in translation.
Upstream language rule: gen-changesets requires changelog entries to be English. If the upstream CLI changelog contains a non-English entry, stop and report it to the user. Do not silently rewrite it while syncing docs.
Public-text rule: do not copy real internal endpoints, key names, account names, or service names into docs changelogs. Replace examples with neutral placeholders such as example.com, example.test, or YOUR_API_KEY while preserving the user-visible meaning.
Before classifying, merge related entries and drop redundant ones from the user-facing changelog:
Features: keep when users would try it or must react to it — new capabilities create demand readers did not know to seek. Collapse only behavior that takes effect solely behind an experimental flag.Polish: keep only must-react items — a notification users may want to turn off, a behavior change to a command they already use, a default flip with an opt-out. Fold improved experiences the product surfaces in context (recovery cards, post-install guidance, progress or status displays): they are discovered at the moment of need, and pre-reading about them helps nobody. Also fold subtle or transient tweaks (status wording, spacing, animations) and internal-behavior adjustments — nobody acts on them.Bug Fixes: keep only behavior-change fixes — the fix changes how something works going forward, so readers must update a habit, a config, or a widely-adopted workaround. Everything else folds, for one of two opposite reasons. Loud failures (crashes, refusals, interrupted runs): the fix itself notifies whoever was hit — announcement value falls as bug visibility rises. Silent past damage (dropped data, wrong results the user never noticed): the changelog cannot repair the past, and in this product the notice names no locatable instance and no realistic action — users cannot enumerate which old sessions were affected, and they do not audit finished sessions; a "some past outputs may be wrong" line is anxiety without an outlet, not diligence. The rare exception is a retrospective notice with a concrete, locatable action (for example rotating a token after a credential-handling flaw); keep those. Never keep a fix merely because it was severe, and never keep one because the bug class feels important.Features is gated by the test alone and has no count. The defaults yield whenever more entries genuinely pass the reader-action test: keep them and flag the overflow for the human reviewer; never fold a qualifying entry just to hit the number, and never pad a section to reach it. The reviewer owns the final cutoff — the curator's job is to surface the borderline calls, not to resolve them silently.Bug Fixes: Fix several known issues. When entries beyond fixes were also collapsed, use Fix several known issues and make various refinements. instead (Chinese: 修复了一些已知问题。 / 修复了一些已知问题,并做了若干细节优化。). End the catch-all line with a pointer to the upstream file so folded entries stay reachable, phrased as a separate short sentence — See the [changelog on GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md) for more technical entries. (Chinese: 更详细的变更记录见 [GitHub](https://github.com/MoonshotAI/kimi-code/blob/main/apps/kimi-code/CHANGELOG.md)。). Link the file itself, never a per-version anchor — GitHub's generated heading anchors are fragile. Keep the pointer wording restrained ("more technical entries"): upstream only contains changes that received a changeset, so never claim the list is complete.Bug Fixes section is the catch-all line alone; if the whole version has no user-facing change, the version block is a single section with that line. Match the catch-all to what was folded — never claim fixes that did not happen: when the folded entries include fixes, use the forms above under Bug Fixes; when everything folded is polish or internal work, place the catch-all under Polish as Make several refinements and internal improvements. (Chinese: 做了若干细节优化和内部改进。).Bug Fixes section tends to accumulate many narrow UI/polish fixes that read as noise when listed one by one. When three or more fixes target the same area (for example several tool cards in the TUI, or the web session/conversation surface) or the same class of problem (for example several "jumping/flickering/collapsing during streaming" fixes), merge them into one higher-level entry. Examples:
Bug Fixes.The docs changelog uses five section types:
| English section | Chinese section | Meaning |
|---|---|---|
### Features | ### 新功能 | New user-facing functionality, such as a new command, flag, mode, or capability that did not exist before |
### Polish | ### 优化 | User-visible improvements to existing functionality, including UX adjustments, behavior tweaks, and performance improvements that are not fixes or new capabilities |
### Bug Fixes | ### 修复 | Fixes for behavior that was broken |
### Refactors | ### 重构 | Internal changes with no user-visible behavior change, including build, CI, tests, dependency cleanup, and internal renames |
### Other | ### 其他 | Anything that does not fit above, such as CDN/endpoint swaps and docs-related artifacts |
With the catch-all rule above, Refactors and Other rarely appear in newly synced versions: entries with no user-perceivable effect fold into the catch-all, and an entry that does change user-perceivable default behavior (for example an engine default flip with an opt-out flag) is classified by that effect, usually Polish. Reserve Other for genuinely unclassifiable but user-facing entries. Older versions keep whatever sections they already have — do not rewrite history.
Classification process:
git show <hash>.gh pr view <NNN>.Other. Do not guess or force entries into Features.Features vs. Polish: ask whether the entry introduces something the user could not do before. If yes (new command, flag, mode, viewer, or capability), use Features. If it only improves an existing surface (a UI panel that already existed, an existing prompt, an existing tool card, an existing payload pipeline), use Polish. Verbs like Add do not automatically mean Features — a small visual addition to an existing UI is still polish.
Default-behavior changes: changing the default value of an existing capability (for example flipping a feature on by default) is usually Polish, because the capability already existed. Use Features only when the new default materially changes the out-of-box experience for most users in a way they could not get before. When genuinely ambiguous, flag it and confirm with the reviewer rather than guessing.
Keyword hints:
Add ... command/flag/option/mode/viewer, Introduce, Support, Allow, Enable, Implement, New ... command/flag/optionFix, Resolve, Correct, Address, Prevent ... from, Stop ... from, ... no longer ...Polish, Optimize, Improve, Enhance, Speed up, Reduce, Cap, Shorten, Wrap, Clarify, Tweak, Adjust, Offload, Show ... in existing surface, performance and UX adjustments to existing featuresRefactor, Rename, Clean up, Simplify, Remove unused, Migrate to, Unify, Restructure, Internal, dependency bumps, pure CI/build/test changesWithin each version, section order is:
Features → Polish → Bug Fixes → Refactors → OtherOmit empty sections. Within each section, order entries by reader value, not upstream order:
Polish, put directly user-visible UX or performance improvements (something users can see or feel) before protocol or internal-behavior adjustments (something that makes the model or pipeline behave more reliably but is invisible to users).Do not reword or exaggerate entries just to make them look more important; only reorder existing entries.
Never change the English page header:
# Changelog
This page documents the changes in each Kimi Code CLI release.Insert new version blocks immediately after the header paragraph and before the previous latest version.
Every version heading must carry its release date in parentheses:
## <version> (YYYY-MM-DD)Take the date from the version's published GitHub Release tag, not from when you run the sync:
git log -1 --format=%cs "@moonshot-ai/kimi-code@<version>"Use the half-width parenthesis form (YYYY-MM-DD) on the English page. Never invent or guess a date; if the tag is missing, stop and confirm with the user.
Example:
## 0.2.0 (2026-05-26)
### Bug Fixes
- Fix the TUI not restoring the current todo list after resuming a session.
### Refactors
- Clean up lint warnings across the CLI, SDK examples, and bundled runtime code without changing product behavior.
- Update the native release workflow to use current GitHub artifact actions.Doc links: an entry that changes a documented config surface may end with a pointer to the docs page — see [X](...) for details (Chinese: 详见 [X](...)。). Keep it a real Markdown link into the docs tree with a relative path (for example ../configuration/config-files.md#loop-control). When the link text is a config key or another identifier, code-style the text inside the brackets: loop_control. Never wrap the whole link in backticks — `[loop_control](...)` renders as raw inline code that exposes the relative path instead of a clickable link.
After updating the English page, translate only the newly added English content into docs/zh/release-notes/changelog.md.
Follow translate-docs, direction en → zh. Changelog direction is English-to-Chinese even though many other docs flows use Chinese-to-English.
Chinese page requirements:
Header:
# 变更记录
本页记录 Kimi Code CLI 每个版本的变更内容。Preserve version headings including the release date, but use full-width parentheses on the Chinese page, such as ## 0.2.0(2026-05-26). The date must match the English page; only the parenthesis style differs (half-width () in English, full-width () in Chinese).
Translate section headings exactly:
### Features → ### 新功能### Bug Fixes → ### 修复### Polish → ### 优化### Refactors → ### 重构### Other → ### 其他The Chinese page must mirror the English page 1:1 for versions, sections, section order, entry order, and entry counts.
Keep the classification and entry order from the English page. Do not reclassify or reorder while translating.
Translate only entry body text. Do not add entries that are not present in English.
Follow docs/AGENTS.md for Chinese typography: full-width punctuation, spaces between Chinese and English, and the glossary.
Structural fidelity does not mean literal translation. The Chinese entries should read like a concise, idiomatic Chinese changelog. Keep the same facts as the English entry, but rephrase for natural Chinese prose.
Guidelines:
通过缓存已渲染消息行,使终端在长篇对话中保持响应。缓存已渲染消息行,提升长对话下终端的响应速度。加固默认系统提示词和内置工具描述。优化默认系统提示词与内置工具描述,避免 Agent 阻塞后台任务。插件现在可以在其清单中声明 hooks。插件现支持在 kimi.plugin.json 中声明生命周期 hooks。--allowed-host--allowed-host <host>传入 --allowed-host 以允许额外的 host。例如 ... (多句展开)例如 kimi web --allowed-host example.com。Example — translating a feature entry:
English source:
- Add a --allowed-host flag to kimi web that lets extra Host header values pass the DNS-rebinding check, and include allow guidance in the 403 error message. Pass --allowed-host <host> to allow an extra host.Before (literal, wordy):
- 为 `kimi web` 新增 `--allowed-host` 标志,允许额外的 Host 请求头值通过 DNS 重绑定检查,并在 403 错误消息中包含允许指引。传入 `--allowed-host <host>` 以允许额外的 host。例如 `kimi web --allowed-host example.com`。After (concise, idiomatic):
- `kimi web` 新增 `--allowed-host <host>` 选项,可将指定 Host 加入 DNS 重绑定白名单;403 错误会提示如何通过 `--allowed-host` 或 `KIMI_CODE_ALLOWED_HOSTS` 放行,例如 `kimi web --allowed-host example.com`。Review:
git diff docs/en/release-notes/changelog.md docs/zh/release-notes/changelog.mdCheck:
Bug Fixes — or under Polish when nothing folded is a fix (both the reader-action test and the channel test applied); the catch-all wording matches what was folded and never claims fixes that did not happen; section sizes stay within the density defaults (about 2 Polish, 3 Bug Fixes) unless extra qualifying entries were deliberately kept and flagged for review. The catch-all line ends with the upstream changelog pointer (file link, no version anchor).Thanks ...! credit remains (remove it every time).Then run the docs build:
pnpm --filter docs run buildAfter verification passes, before committing, ask the user whether they want to review the sync result. Use AskQuestion with options such as:
If the user chooses review:
Show the uncommitted diff:
git diff docs/en/release-notes/changelog.md docs/zh/release-notes/changelog.mdSummarize synced versions, section counts, and anything that needed manual classification. List every entry folded into a catch-all line (short titles, one line each), any section that exceeds the density defaults, and every borderline call flagged during curation — the reviewer cannot own a cutoff they cannot see.
Tell the user to reply when they are done reviewing, or to ask for edits.
Do not commit, push, or open a PR until the user explicitly says review is complete, or asks to proceed.
If the user requests edits during review, make the changes, re-run verification from step 7, and return to this checkpoint.
Only run this step when the user skipped review or confirmed review is complete.
Stage only the changelog docs files:
git add docs/en/release-notes/changelog.md docs/zh/release-notes/changelog.mdUse a neutral docs-sync commit message:
docs(changelog): sync <version range> from apps/kimi-code/CHANGELOG.mdDo not create a changeset for changelog docs sync. Docs sync does not enter the bundle.
Run immediately after step 9.
Push the branch:
git push -u origin HEADCreate the PR with gh pr create. Title follows Conventional Commits:
docs(changelog): sync <version range> from apps/kimi-code/CHANGELOG.mdFill in .github/pull_request_template.md. For changelog sync PRs:
N/A — post-release docs maintenance (no issue required).pnpm --filter docs run build).gen-docs is not needed because this is the dedicated changelog sync flow.Example body:
## Related Issue
N/A — post-release docs maintenance
## Problem
The docs-site changelog has not yet been synced for `<version range>` after the npm release.
## What changed
- Synced `<version range>` from `apps/kimi-code/CHANGELOG.md` into `docs/en/release-notes/changelog.md`
- Translated the new English increment into `docs/zh/release-notes/changelog.md`
- Verified with `pnpm --filter docs run build`
## Checklist
- [x] I have read the CONTRIBUTING document.
- [x] I have linked a related issue, or explained the problem above.
- [ ] I have added tests that prove my feature works. (N/A — docs-only sync)
- [x] Ran `gen-changesets` skill, or this PR needs no changeset. (No changeset — docs sync is out of bundle)
- [x] Ran `gen-docs` skill, or this PR needs no doc update. (This PR is the dedicated changelog sync)Return the PR URL to the user when done.
apps/kimi-code/CHANGELOG.md..changeset/*.md drafts into the docs site.docs/changelog-sync-* branch and open a PR; never push changelog docs sync directly to main.| Mistake | Fix |
|---|---|
| Adding entries directly to the English docs page without reading upstream | Use apps/kimi-code/CHANGELOG.md as the source |
| Copying PR links or commit hashes into docs | Strip them; keep only body text |
Leaving the Thanks ...! credit in docs | Remove it every time, including the multi-author form |
| Leaving near-duplicate micro-tweaks as separate bullets | Merge small tweaks to the same surface into one higher-level entry (e.g. composer height + font → composer's default styling) |
| Listing many narrow fixes to the same surface as separate bullets | When three or more fixes target the same UI area or the same class of problem, merge them into one higher-level fix entry; keep genuinely distinct or high-value fixes standalone |
| Listing low-signal fixes or internal changes as standalone bullets | Collapse them into the single catch-all line (Fix several known issues.) placed last under Bug Fixes; treat the section-size defaults (about 2 Polish, 3 Bug Fixes) as a density guard, not a quota |
| Folding a qualifying entry just to hit the section-size default | The defaults are density guards; keep entries that genuinely pass the reader-action test and flag the overflow for the human reviewer |
| Keeping a fix because it was severe or hard-won | Severity makes the announcement redundant — the fix itself notifies whoever was hit; keep only behavior-change fixes and retrospective notices with a concrete, locatable action |
| Keeping an improvement the product surfaces in context (recovery cards, post-install guidance, progress displays) | The product is the better channel — right users, moment of need; fold it (channel test) |
| Folding a new capability because its control is visible somewhere in the UI | Visible is not discoverable — users do not explore; a toggle, menu item, or settings page that only waits to be found needs the changelog announcement |
| Keeping a silent-impact fix out of diligence (dropped data, wrong results the user never noticed) | The changelog does not repair the past; if the notice names no locatable instance and no realistic action, it is anxiety without an outlet — fold it |
| Overstating the catch-all pointer (for example claiming the upstream changelog is complete) | Keep the pointer restrained — See the [changelog on GitHub](...) for more technical entries.; upstream only contains changes that received a changeset |
Writing Fix several known issues. when nothing folded is a fix | Never claim fixes that did not happen; all-polish/internal folds go under Polish as Make several refinements and internal improvements. |
| Listing a server/API entry that only backs a web feature already listed | Drop the API entry and keep the web UI entry, unless the API has independent user value |
| Rewording upstream English entries | Upstream is frozen; copy the body text unless the user explicitly asks otherwise |
| Leaving English text untranslated in the Chinese page | The Chinese page must be fully Chinese except preserved technical terms |
| Editing upstream changelog text | Do not edit upstream |
| Losing two-space indentation in multi-line list items | Restore indentation so Markdown lists stay valid |
Copying ### Patch Changes into docs | Remove changesets headings and classify under Features / Bug Fixes / Polish / Refactors / Other |
| Guessing unclear entries as Features | Inspect commit/PR; if still unclear, use Other |
Treating any Add ... line as Features | If the entry only adds a small element to an existing UI/surface, use Polish |
| Filing UX or performance tweaks under Other | Use Polish for user-visible improvements to existing functionality |
| Preserving upstream order when a small entry hides a larger change | Reorder within the section so the highest-value, most obvious items appear first |
| Reclassifying entries while translating | Chinese classification must mirror English |
| Leaving empty sections | Delete sections with no entries |
| Putting everything under Other for convenience | Classify what can be classified first |
| Translating tool names, command names, or config keys | Keep them as written |
| Wrapping a whole doc link in backticks | Code-style the link text inside the brackets instead, so the link stays clickable: loop_control |
| Keeping hook/event payload-mechanics clauses | Drop what an event reports or carries; keep the new capability and how to configure it |
| Creating a changeset for docs sync | Do not create one |
Committing or pushing directly on main | Create docs/changelog-sync-<version>, commit there, then open a PR |
| Committing or opening a PR before the user skips review or confirms review is done | Wait at the human review checkpoint |
| Using curly quotes or half-width Chinese punctuation | Follow docs/AGENTS.md |
| Omitting the release date from a version heading, or guessing it | Add (YYYY-MM-DD) (full-width () in Chinese) taken from the published tag |
apps/kimi-code/CHANGELOG.md is not published on npm or GitHub Releases.apps/kimi-code/CHANGELOG.md.docs/AGENTS.md does not answer it.docs/changelog-sync-* branch already exists for the same version and you cannot confirm whether it is stale.d4e0ad4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.