feat(workflows): support recursive workstream labeling and new IDs (#17207)

This commit is contained in:
Bryan Morgan
2026-01-21 11:15:38 -05:00
committed by GitHub
parent c21c297133
commit 8605d0d024

View File

@@ -23,7 +23,9 @@ jobs:
const allowedParentUrls = [
'https://github.com/google-gemini/gemini-cli/issues/15374',
'https://github.com/google-gemini/gemini-cli/issues/15456',
'https://github.com/google-gemini/gemini-cli/issues/15324'
'https://github.com/google-gemini/gemini-cli/issues/15324',
'https://github.com/google-gemini/gemini-cli/issues/17202',
'https://github.com/google-gemini/gemini-cli/issues/17203'
];
async function getIssueParent(owner, repo, number) {
@@ -33,6 +35,7 @@ jobs:
issue(number:$number) {
parent {
url
number
}
}
}
@@ -40,7 +43,7 @@ jobs:
`;
try {
const result = await github.graphql(query, { owner, repo, number });
return result.repository.issue.parent ? result.repository.issue.parent.url : null;
return result.repository.issue.parent || null;
} catch (error) {
console.error(`Failed to fetch parent for #${number}:`, error);
return null;
@@ -75,20 +78,38 @@ jobs:
console.log(`Processing ${issuesToProcess.length} issue(s)...`);
for (const issue of issuesToProcess) {
const parentUrl = await getIssueParent(issue.owner, issue.repo, issue.number);
let currentNumber = issue.number;
let depth = 0;
const MAX_DEPTH = 5; // Safety limit for recursion
let matched = false;
let tracedParents = [];
if (parentUrl && allowedParentUrls.includes(parentUrl)) {
console.log(`SUCCESS: Issue #${issue.number} is a direct child of ${parentUrl}. Adding label.`);
await github.rest.issues.addLabels({
owner: issue.owner,
repo: issue.repo,
issue_number: issue.number,
labels: [labelToAdd]
});
} else {
// logging only for single execution to avoid spam
if (context.eventName === 'issues') {
console.log(`Issue #${issue.number} parent is ${parentUrl || 'None'}. No action.`);
}
while (depth < MAX_DEPTH) {
const parent = await getIssueParent(issue.owner, issue.repo, currentNumber);
if (!parent) {
break;
}
tracedParents.push(parent.url);
if (allowedParentUrls.includes(parent.url)) {
console.log(`SUCCESS: Issue #${issue.number} is a descendant of ${parent.url}. Trace: ${tracedParents.join(' -> ')}. Adding label.`);
await github.rest.issues.addLabels({
owner: issue.owner,
repo: issue.repo,
issue_number: issue.number,
labels: [labelToAdd]
});
matched = true;
break;
}
currentNumber = parent.number;
depth++;
}
if (!matched && context.eventName === 'issues') {
console.log(`Issue #${issue.number} did not match any allowed workstreams after checking ${depth} levels. Trace: ${tracedParents.join(' -> ') || 'None'}.`);
}
}