Issue forms and needs-info: ask short bug reports for steps to reproduce (#2416)

* Triage bot: needs-info for short bug reports without steps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TPWBBSRPfPYWgrrhbznewR

* Issue forms for bugs and feature requests; document needs-info

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TPWBBSRPfPYWgrrhbznewR

---------

Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
authored and GitHub committed 2026-10-18 05:44:48 -04:00
1 parent 136a3e9a2f
commit 003abc2149
9 files changed
+433 -45

No files matched your search

+13 -12
View File
@@ -66,13 +66,13 @@ function repoArgs(context) {
return { owner: context.repo.owner, repo: context.repo.repo };
}
// The text under a `## <name>` heading, up to the next heading.
// The text under a `## <name>` heading (`###` in issue forms), up to the next heading.
function section(body, name) {
const lines = body.split('\n');
const start = lines.findIndex((l) => new RegExp(`^##\\s*${name}\\s*$`, 'i').test(l.trim()));
const start = lines.findIndex((l) => new RegExp(`^#{2,3}\\s*${name}\\s*$`, 'i').test(l.trim()));
if (start < 0) return '';
const rest = lines.slice(start + 1);
const end = rest.findIndex((l) => /^##\s/.test(l));
const end = rest.findIndex((l) => /^#{2,3}\s/.test(l));
return (end < 0 ? rest : rest.slice(0, end)).join('\n');
}
@@ -129,18 +129,13 @@ function classifyPaths(paths) {
return [...labels].sort();
}
async function ensureNeedsTriage(github, context) {
async function ensureLabel(github, context, name, color, description) {
try {
await github.rest.issues.getLabel({ ...repoArgs(context), name: NEEDS_TRIAGE });
await github.rest.issues.getLabel({ ...repoArgs(context), name });
} catch (e) {
if (e.status !== 404) throw e;
try {
await github.rest.issues.createLabel({
...repoArgs(context),
name: NEEDS_TRIAGE,
color: NEEDS_TRIAGE_COLOR,
description: NEEDS_TRIAGE_DESCRIPTION,
});
await github.rest.issues.createLabel({ ...repoArgs(context), name, color, description });
} catch (e2) {
if (e2.status !== 422) throw e2; // created meanwhile
}
@@ -171,7 +166,9 @@ async function proposal(github, context, item) {
async function apply(github, context, number, labels) {
if (!labels.length) return;
if (labels.includes(NEEDS_TRIAGE)) await ensureNeedsTriage(github, context);
if (labels.includes(NEEDS_TRIAGE)) {
await ensureLabel(github, context, NEEDS_TRIAGE, NEEDS_TRIAGE_COLOR, NEEDS_TRIAGE_DESCRIPTION);
}
await github.rest.issues.addLabels({ ...repoArgs(context), issue_number: number, labels });
}
@@ -296,6 +293,10 @@ module.exports = {
NEEDS_TRIAGE,
classifyIssue,
classifyPaths,
ensureLabel,
isMaintainer,
labelNames,
section,
parseTriage,
handleOpened,
handleLabeled,