changelog
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesenurb changelog
nurb 更新日志
One surface: , the static page behind nurb.dev/changelog. One per released version, newest first. There is no build step and no data file; the HTML is the data.
site/changelog.html<article class="release">Releases are the unit. A nurb release is a version bump merged to main; the publish workflow tags it and creates a GitHub release whose generated notes list the merged PRs. The changelog entry for a version is written from those PRs, filtered hard.
一个页面:,即nurb.dev/changelog对应的静态页面。每个发布版本对应一个元素,按版本从新到旧排列。这里没有构建步骤和数据文件;HTML本身就是数据。
site/changelog.html<article class="release">版本是基本单位。nurb的版本发布指的是将版本号更新的PR合并到main分支;发布工作流会为其打上标签并创建GitHub Release,自动生成的发布说明会列出所有已合并的PR。某个版本的更新日志条目就是基于这些PR编写的,且会严格筛选内容。
Step 1: Find the gap
步骤1:找出遗漏的版本
The newest in is the high-water mark.
id="vX.Y.Z"site/changelog.htmlbash
grep -m1 'id="v' site/changelog.html
gh release list --limit 20Every tagged release newer than the high-water mark needs an entry. If the user describes a feature in free text instead, write that one entry into the version it shipped in (or the pending version if it hasn't shipped yet) and skip the sweep.
When /release invokes this before the bump PR merges, the newest version has no tag or GitHub release yet. Write its entry anyway: source it from the PRs merged since the last release () plus whatever the release branch itself ships, date it today, and keep the tag link, which goes live when the release publishes. The entry lands as part of the release PR, so commit it there instead of leaving it uncommitted.
gh pr list --state merged --base main --json title,number,mergedAtFor each missing version:
bash
gh release view vX.Y.Z --json publishedAt,bodyThe body lists the PRs. Read a PR () whenever its title alone doesn't tell you what a user would notice.
gh pr view Nsite/changelog.htmlid="vX.Y.Z"bash
grep -m1 'id="v' site/changelog.html
gh release list --limit 20所有比最高版本新的带标签版本都需要编写条目。如果用户用自由文本描述了某个功能,则将该条目写入其所属的已发布版本(若尚未发布则写入待发布版本),无需遍历所有版本。
当/release在版本更新PR合并前调用此流程时,最新版本还没有标签或GitHub Release。即便如此也要编写条目:基于自上次发布以来合并的PR()加上版本分支本身包含的内容,日期设为当天,保留标签链接(发布后链接会自动生效)。该条目作为版本更新PR的一部分提交,而非保留为未提交状态。
gh pr list --state merged --base main --json title,number,mergedAt对于每个遗漏的版本:
bash
gh release view vX.Y.Z --json publishedAt,body发布说明的正文会列出PR。如果仅看PR标题无法判断用户是否会注意到相关变化,就查看PR详情()。
gh pr view NStep 2: Filter to what earns a line
步骤2:筛选值得写入的内容
Most PRs are not changelog lines. A PR earns one only if someone using nurb could notice the difference without reading the code.
Yes: a new capability in the viewer or the modeling vocabulary, a new check, a behavior change they'd feel, a fix for something that visibly broke, a change to how their AI works with them (asks for measurements, names sliders in their words).
No: CI, tests, refactors, repo docs, CLAUDE.md, release plumbing, skill-file mechanics with no visible effect, marketing site tweaks.
Group by capability, not by PR. Several PRs polishing one feature collapse into one line. A version whose every PR is internal gets no entry at all; say so in the report rather than padding.
大多数PR无需写入更新日志。只有当使用nurb的用户无需查看代码就能察觉到变化时,该PR才值得写入一条日志。
符合条件的情况:查看器或建模词汇新增功能、新增检查项、用户能感知到的行为变化、修复可见的故障、AI交互方式的变化(如要求测量数据、用用户的语言命名滑块)。
不符合条件的情况:CI配置、测试、重构、仓库文档、CLAUDE.md、发布流程相关修改、无可见效果的技能文件机制调整、营销网站微调。
按功能分组,而非按PR分组。多个优化同一功能的PR合并为一条日志。如果某个版本的所有PR都是内部修改,则无需编写条目;在报告中说明即可,不要凑数。
Step 3: Draft the copy
步骤3:撰写文案
The audience is a hobbyist with a printer, not a programmer. They talk to their AI and judge parts in a browser.
- Never mention Python, module names, function names, build123d, OCCT, or agent-harness jargon. is "diagonal printing";
stand()is "your AI can inspect a part".nurb inspect - "Your AI" is the actor for agent-side changes, matching the landing page.
- Sentence case, second person, plain English. Say what changed and what they can now do, then stop. No rationale, no design defense.
- No em-dashes, no exclamation points, no emoji, no marketing fluff.
- Each line gets a tag: ,
new, orimproved. Onlyfixedalso carries the class (new); the other two are<b class="tag new">and<b class="tag">improved</b>.<b class="tag">fixed</b> - A headline capability may lead its line with a bold two-or-three-word name: .
<b>Assemblies.</b>
受众是拥有3D打印机的爱好者,而非程序员。他们会与AI对话,并在浏览器中评估模型。
- 绝不要提及Python、模块名、函数名、build123d、OCCT或agent-harness这类术语。译为「倾斜打印」;
stand()译为「你的AI可以检查模型」。nurb inspect - 涉及Agent端的变化时,以「你的AI」作为主语,与首页风格保持一致。
- 使用句首大写、第二人称、通俗易懂的中文。说明变化内容以及用户现在可以做什么,点到为止。无需解释理由或辩护设计。
- 不要使用破折号、感叹号、表情符号或营销话术。
- 每条日志都要加上标签:、
new或improved。只有fixed标签需要添加类名(new);另外两个标签的格式为<b class="tag new">和<b class="tag">improved</b>。<b class="tag">fixed</b> - 重要功能可以在条目前加上两到三个词的加粗名称:。
<b>装配功能。</b>
Step 4: Write the page
步骤4:写入页面
Insert the new at the top of , right after the paragraph. Copy the markup shape of the entry below it exactly:
<article class="release" id="vX.Y.Z"><main>.ledehtml
<article class="release" id="v0.9.0">
<div class="meta"><span class="ver"><a href="https://github.com/Shpigford/nurb/releases/tag/v0.9.0">v0.9.0</a></span><time datetime="2026-07-31">July 31, 2026</time></div>
<ul>
<li><b class="tag new">new</b><span><b>Diagonal printing.</b> A part that prints better tilted...</span></li>
<li><b class="tag">fixed</b><span>...</span></li>
</ul>
</article>The date is the release's date, not today (a pre-merge entry uses today, which becomes the publish date when the PR merges). Never reword or delete an already-published entry; its is a live anchor.
publishedAtid将新的插入到标签的顶部,紧跟在段落之后。完全复制下方已有条目的标记格式:
<article class="release" id="vX.Y.Z"><main>.ledehtml
<article class="release" id="v0.9.0">
<div class="meta"><span class="ver"><a href="https://github.com/Shpigford/nurb/releases/tag/v0.9.0">v0.9.0</a></span><time datetime="2026-07-31">July 31, 2026</time></div>
<ul>
<li><b class="tag new">new</b><span><b>Diagonal printing.</b> A part that prints better tilted...</span></li>
<li><b class="tag">fixed</b><span>...</span></li>
</ul>
</article>日期使用版本的日期,而非当天(预合并条目使用当天日期,PR合并后会自动变为发布日期)。绝不要修改或删除已发布的条目;其是有效的锚点链接。
publishedAtidStep 5: Verify
步骤5:验证
Look at the page, don't just lint it: serve (), open with whatever browser tooling is available, and screenshot it. Check the new entry renders like its neighbors, then kill the server. Also, silence is pass on both of these:
site/python3 -m http.server 7878 -d sitehttp://localhost:7878/changelog.htmlbash
git diff -U0 site/changelog.html | grep '^+.*—' # em-dashes in what you added
grep -o 'id="v[0-9.]*"' site/changelog.html | uniq -d # duplicate versionsAnd confirm by eye that versions still descend down the page.
查看页面效果,不要仅依赖代码检查:启动目录的服务(),用可用的浏览器打开并截图。检查新条目与已有条目的渲染效果一致,然后关闭服务。同时,确保以下两个命令没有输出内容:
site/python3 -m http.server 7878 -d sitehttp://localhost:7878/changelog.htmlbash
git diff -U0 site/changelog.html | grep '^+.*—' # 检查新增内容中是否有破折号
grep -o 'id="v[0-9.]*"' site/changelog.html | uniq -d # 检查是否有重复的版本号还要目视确认版本号仍按从新到旧的顺序排列。
Step 6: Report
步骤6:报告
List each version with its lines and tags, plus one line for what was skipped and why. Leave the change uncommitted unless asked.
列出每个版本的日志条目及标签,再用一行说明被跳过的内容及原因。除非被要求,否则不要提交更改。