Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .github/scripts/draft-local-plugin-release-notes.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,7 @@ function categoriesFromReleaseItems(items) {
for (const category of RELEASE_CATEGORY_ORDER) {
const categoryItems = items.filter((item) => item.category === category);
if (categoryItems.length === 0) continue;
releaseCategories[category] = categoryItems.map((item) => item.text_cn);
releaseCategories[category] = categoryItems.map((item) => item.text_en);
const docCategory = RELEASE_TO_DOC_CATEGORY[category];
docsCategories.cn[docCategory] = categoryItems.map((item) => item.text_cn);
docsCategories.en[docCategory] = categoryItems.map((item) => item.text_en);
Expand Down Expand Up @@ -1039,7 +1039,7 @@ function markdownFromReleaseItems(items, coverage) {
lines.push("");
lines.push(`### ${category}`);
for (const item of categoryItems) {
lines.push(`- ${item.text_cn}`);
lines.push(`- ${item.text_en}`);
}
}
lines.push("");
Expand Down Expand Up @@ -1237,7 +1237,9 @@ export function manualDraftFromNotes(notes, evidence) {
validation_report: validationReport,
validation_attempt_count: 1,
repair_attempt_count: 0,
release_notes_markdown: ensureSourceHint(text),
release_notes_markdown: ensureSourceHint(
markdownFromReleaseItems(draft.release_items, draft.coverage),
),
};
}

Expand Down
20 changes: 20 additions & 0 deletions .github/scripts/draft-local-plugin-release-notes.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,9 @@ test("postprocesses a single misclassified performance item into Improved", () =
assert.equal(processed.release_items[0].category, "Improved");
assert.match(processed.release_items[0].text_cn, /向量扫描性能优化/);
assert.match(processed.release_notes_markdown, /### Improved/);
assert.doesNotMatch(processed.release_categories.Improved[0], /\p{Script=Han}/u);
assert.match(processed.docs_categories.cn.Improvements[0], /\p{Script=Han}/u);
assert.doesNotMatch(processed.docs_categories.en.Improvements[0], /\p{Script=Han}/u);
});

test("postprocesses mixed endpoint and auth fixes without dropping either concern", () => {
Expand Down Expand Up @@ -554,6 +557,9 @@ test("repairs postprocessed language validation issues with exact context", asyn
["text_cn", "text_en"],
);
assert.equal(requests[1].release_notes_repair_context.previous_release_items[0].source_refs[0], "abc1234");
const visibleNotes = result.release_notes_markdown.split("<!-- doc-agent-release-notes-json")[0];
assert.match(visibleNotes, /Plugin Health Dashboard/);
assert.doesNotMatch(visibleNotes, /插件健康看板/);
assert.match(result.release_notes_markdown, /插件健康看板/);
assert.match(result.release_notes_markdown, /doc-agent-release-notes-json/);
});
Expand Down Expand Up @@ -618,6 +624,9 @@ test("standalone latest draft validation allows one initial response plus three
assert.equal(result.needs_review, false);
assert.equal(result.validation_attempt_count, 4);
assert.equal(result.repair_attempt_count, 3);
const visibleNotes = result.release_notes_markdown.split("<!-- doc-agent-release-notes-json")[0];
assert.match(visibleNotes, /Plugin Health Dashboard/);
assert.doesNotMatch(visibleNotes, /插件健康看板/);
assert.match(result.release_notes_markdown, /插件健康看板/);
});

Expand Down Expand Up @@ -750,6 +759,17 @@ test("manual stable notes are revalidated against collected evidence", () => {
const draft = manualDraftFromNotes(notes, evidence);
assert.equal(draft.ok, true);
assert.equal(draft.release_items[0].category, "Fixed");
const visibleNotes = draft.release_notes_markdown.split("<!-- doc-agent-release-notes-json")[0];
assert.match(visibleNotes, /Restores Hermes bridge state/);
assert.doesNotMatch(visibleNotes, /修复 Hermes/);
const embeddedJson = draft.release_notes_markdown.match(
/<!--\s*doc-agent-release-notes-json\s*\n([\s\S]*?)\n-->/,
)?.[1];
assert.ok(embeddedJson, "release notes should retain the hidden bilingual payload");
const embeddedPayload = JSON.parse(embeddedJson);
assert.equal(embeddedPayload.items[0].text_cn, "修复 Hermes 桥接状态恢复。");
assert.equal(embeddedPayload.items[0].text_en, "Restores Hermes bridge state.");
assert.deepEqual(embeddedPayload.items[0].source_refs, ["abc1234"]);
assert.match(draft.release_notes_markdown, /source-id=openclaw-local-plugin/);

assert.throws(
Expand Down
Loading