diff --git a/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts b/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts index e4b72099ee..9aa5ce74d4 100644 --- a/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts +++ b/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts @@ -97,7 +97,7 @@ try { const reviewersOnPR = new Map(); for (const review of pr.reviews.nodes) { if ( - ['MEMBER', 'OWNER'].includes(review.authorAssociation) && + ['MEMBER', 'OWNER', 'COLLABORATOR'].includes(review.authorAssociation) && review.author?.login ) { const login = review.author.login.toLowerCase(); @@ -138,19 +138,8 @@ try { totalMaintainerReviews > 0 ? maintainerReviewsWithExpertise / totalMaintainerReviews : 0; - const timestamp = new Date().toISOString(); - - process.stdout.write( - JSON.stringify({ - metric: 'domain_expertise', - value: Math.round(ratio * 100) / 100, - timestamp, - details: { - totalMaintainerReviews, - maintainerReviewsWithExpertise, - }, - }) + '\n', - ); + + console.log(`domain_expertise,${Math.round(ratio * 100) / 100}`); } catch (err) { process.stderr.write(err instanceof Error ? err.message : String(err)); process.exit(1); diff --git a/tools/gemini-cli-bot/metrics/scripts/open_issues.ts b/tools/gemini-cli-bot/metrics/scripts/open_issues.ts index 4996ec7ce4..0443f190e9 100644 --- a/tools/gemini-cli-bot/metrics/scripts/open_issues.ts +++ b/tools/gemini-cli-bot/metrics/scripts/open_issues.ts @@ -5,15 +5,19 @@ */ import { execSync } from 'node:child_process'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; try { + const query = `query { repository(owner: "${GITHUB_OWNER}", name: "${GITHUB_REPO}") { issues(states: OPEN) { totalCount } } }`; const count = execSync( - 'gh issue list --state open --limit 1000 --json number --jq length', + `gh api graphql -f query='${query}'`, { encoding: 'utf-8', }, ).trim(); - console.log(`open_issues,${count}`); + const parsed = JSON.parse(count); + const totalCount = parsed?.data?.repository?.issues?.totalCount ?? 0; + console.log(`open_issues,${totalCount}`); } catch { // Fallback if gh fails or no issues found console.log('open_issues,0'); diff --git a/tools/gemini-cli-bot/metrics/scripts/open_prs.ts b/tools/gemini-cli-bot/metrics/scripts/open_prs.ts index 35819ef0f9..8cf21b2667 100644 --- a/tools/gemini-cli-bot/metrics/scripts/open_prs.ts +++ b/tools/gemini-cli-bot/metrics/scripts/open_prs.ts @@ -5,15 +5,19 @@ */ import { execSync } from 'node:child_process'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; try { + const query = `query { repository(owner: "${GITHUB_OWNER}", name: "${GITHUB_REPO}") { pullRequests(states: OPEN) { totalCount } } }`; const count = execSync( - 'gh pr list --state open --limit 1000 --json number --jq length', + `gh api graphql -f query='${query}'`, { encoding: 'utf-8', }, ).trim(); - console.log(`open_prs,${count}`); + const parsed = JSON.parse(count); + const totalCount = parsed?.data?.repository?.pullRequests?.totalCount ?? 0; + console.log(`open_prs,${totalCount}`); } catch { // Fallback if gh fails or no PRs found console.log('open_prs,0'); diff --git a/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts b/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts index 05f6b71740..0d7defa256 100644 --- a/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts +++ b/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts @@ -41,7 +41,7 @@ try { for (const review of pr.reviews.nodes) { if ( - ['MEMBER', 'OWNER'].includes(review.authorAssociation) && + ['MEMBER', 'OWNER', 'COLLABORATOR'].includes(review.authorAssociation) && review.author?.login ) { const login = review.author.login.toLowerCase(); @@ -66,16 +66,7 @@ try { counts.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / counts.length; } - const timestamp = new Date().toISOString(); - - process.stdout.write( - JSON.stringify({ - metric: 'review_distribution_variance', - value: Math.round(variance * 100) / 100, - timestamp, - details: reviewCounts, - }) + '\n', - ); + console.log(`review_distribution_variance,${Math.round(variance * 100) / 100}`); } catch (err) { process.stderr.write(err instanceof Error ? err.message : String(err)); process.exit(1); diff --git a/tools/gemini-cli-bot/reflexes/scripts/README.md b/tools/gemini-cli-bot/reflexes/scripts/README.md new file mode 100644 index 0000000000..ec9efcef55 --- /dev/null +++ b/tools/gemini-cli-bot/reflexes/scripts/README.md @@ -0,0 +1,14 @@ +# Pulse Reflex Scripts + +This directory contains lightweight, high-frequency automation scripts executed by the Pulse workflow (`.github/workflows/gemini-cli-bot-pulse.yml`) every 30 minutes. + +## Purpose + +Pulse scripts are intended for "reflexive" actions that require faster response times than the daily Brain runs, such as: +- Initial issue triage and labeling. +- Detecting and responding to urgent triggers. +- Basic maintenance tasks. + +## Script Format + +Scripts should be standalone TypeScript (`.ts`) files and will be executed using `npx tsx`.