From 906a5e6c19409616afe3d170499432b4ff9cc9a4 Mon Sep 17 00:00:00 2001 From: dongmucat <1127093059@qq.com> Date: Fri, 2 Oct 2026 02:20:20 +0800 Subject: [PATCH] fix(triage): parse level-2 issue headings (ISSUE-179) Signed-off-by: dongmucat <1127093059@qq.com> --- .github/scripts/issue-triage-lib.ts | 2 +- .github/scripts/issue-triage-lib_test.ts | 67 ++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 .github/scripts/issue-triage-lib_test.ts diff --git a/.github/scripts/issue-triage-lib.ts b/.github/scripts/issue-triage-lib.ts index c81e4f03..6e921842 100644 --- a/.github/scripts/issue-triage-lib.ts +++ b/.github/scripts/issue-triage-lib.ts @@ -27,7 +27,7 @@ import { buildMaintainerHandoffBrief } from "./issue-handoff-brief.ts"; export function parseIssueBody(body: string | null): ParsedIssueBody { const sections: Record = {}; const rawBody = body ?? ""; - const headingMatches = [...rawBody.matchAll(/^###\s+(.+)$/gm)]; + const headingMatches = [...rawBody.matchAll(/^#{2,3}\s+(.+)$/gm)]; for (let index = 0; index < headingMatches.length; index += 1) { const current = headingMatches[index]; diff --git a/.github/scripts/issue-triage-lib_test.ts b/.github/scripts/issue-triage-lib_test.ts new file mode 100644 index 00000000..5eaf217e --- /dev/null +++ b/.github/scripts/issue-triage-lib_test.ts @@ -0,0 +1,67 @@ +import type { GitHubIssue } from "./github.ts"; +import { analyzeIssue, parseIssueBody } from "./issue-triage-lib.ts"; + +function assertEquals(actual: unknown, expected: unknown) { + const actualJson = JSON.stringify(actual); + const expectedJson = JSON.stringify(expected); + + if (actualJson !== expectedJson) { + throw new Error(`Expected ${expectedJson}, received ${actualJson}`); + } +} + +function featureIssue(body: string): GitHubIssue { + return { + number: 1, + title: "[Feature] Improve issue triage", + body, + state: "open", + labels: [{ name: "enhancement" }], + comments: 0, + created_at: "2026-10-01T00:00:00Z", + updated_at: "2026-10-01T00:00:00Z", + user: { login: "contributor" }, + html_url: "https://github.com/iflytek/skillhub/issues/1", + }; +} + +Deno.test("level-2 headings satisfy required feature sections", () => { + const result = analyzeIssue( + featureIssue(`## Problem +Filled issues are marked as incomplete. + +## Proposed solution +Recognize level-2 headings during triage.`), + [], + new Date("2026-10-01T00:00:00Z"), + ); + + assertEquals(result.missingFields, []); + assertEquals(result.route === "needs-info", false); +}); + +Deno.test("level-3 Issue Form headings keep their existing behavior", () => { + const parsed = parseIssueBody(`### Problem +Filled issues are marked as incomplete. + +### Proposed Solution +Recognize headings generated by Issue Forms.`); + + assertEquals(parsed.sections, { + problem: "Filled issues are marked as incomplete.", + "proposed solution": "Recognize headings generated by Issue Forms.", + }); +}); + +Deno.test("mixed level-2 and level-3 headings are parsed together", () => { + const parsed = parseIssueBody(`## Problem +Filled issues are marked as incomplete. + +### Proposed Solution +Recognize both supported heading levels.`); + + assertEquals(parsed.sections, { + problem: "Filled issues are marked as incomplete.", + "proposed solution": "Recognize both supported heading levels.", + }); +});