diff --git a/tools/gemini-cli-bot/metrics/index.ts b/tools/gemini-cli-bot/metrics/index.ts index 3f18c610b8..e2dcfbe7de 100644 --- a/tools/gemini-cli-bot/metrics/index.ts +++ b/tools/gemini-cli-bot/metrics/index.ts @@ -42,43 +42,16 @@ function processOutputLine(line: string, results: string[]) { const trimmedLine = line.trim(); if (!trimmedLine) return; - let metricName = ''; - let metricValue = 0; - - try { - const parsed = JSON.parse(trimmedLine); - if ( - parsed && - typeof parsed === 'object' && - 'metric' in parsed && - 'value' in parsed - ) { - metricName = parsed.metric; - metricValue = parseFloat(parsed.value); - results.push(`${metricName},${metricValue}`); - } else { - const parts = trimmedLine.split(','); - if (parts.length === 2) { - metricName = parts[0]; - metricValue = parseFloat(parts[1]); - results.push(trimmedLine); - } else { - results.push(trimmedLine); - return; // Unable to parse for deltas - } - } - } catch { - const parts = trimmedLine.split(','); - if (parts.length === 2) { - metricName = parts[0]; - metricValue = parseFloat(parts[1]); - results.push(trimmedLine); - } else { - results.push(trimmedLine); - return; // Unable to parse for deltas - } + const parts = trimmedLine.split(','); + if (parts.length !== 2) { + results.push(trimmedLine); + return; } + const metricName = parts[0]; + const metricValue = parseFloat(parts[1]); + results.push(trimmedLine); + // Calculate and append deltas if the metric is a valid number if (metricName && !isNaN(metricValue)) { const avg7d = getHistoricalAverage(metricName, 7); diff --git a/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts b/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts index c1dc63f842..953ffeb25d 100644 --- a/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts +++ b/tools/gemini-cli-bot/metrics/scripts/domain_expertise.ts @@ -2,11 +2,9 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ -import { GITHUB_OWNER, GITHUB_REPO, type MetricOutput } from '../types.js'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; diff --git a/tools/gemini-cli-bot/metrics/scripts/latency.ts b/tools/gemini-cli-bot/metrics/scripts/latency.ts index 669c627e06..efb6b97f46 100644 --- a/tools/gemini-cli-bot/metrics/scripts/latency.ts +++ b/tools/gemini-cli-bot/metrics/scripts/latency.ts @@ -2,11 +2,9 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ -import { GITHUB_OWNER, GITHUB_REPO, type MetricOutput } from '../types.js'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { @@ -32,7 +30,7 @@ try { `; const output = execSync( `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, - { encoding: 'utf-8' }, + { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }, ); const data = JSON.parse(output).data.repository; diff --git a/tools/gemini-cli-bot/metrics/scripts/open_issues.ts b/tools/gemini-cli-bot/metrics/scripts/open_issues.ts index be7fe1f8d5..875a79732d 100644 --- a/tools/gemini-cli-bot/metrics/scripts/open_issues.ts +++ b/tools/gemini-cli-bot/metrics/scripts/open_issues.ts @@ -2,25 +2,24 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ 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 query = 'query($owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { issues(states: OPEN) { totalCount } } }'; const output = execSync( - `gh api graphql -f query='${query}'`, + `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, { encoding: 'utf-8', + stdio: ['ignore', 'pipe', 'ignore'], }, ).trim(); const parsed = JSON.parse(output); const totalCount = parsed?.data?.repository?.issues?.totalCount ?? 0; - console.log(`open_issues,${totalCount}`); + process.stdout.write(`open_issues,${totalCount}\n`); } catch { // Fallback if gh fails or no issues found - console.log('open_issues,0'); + process.stdout.write('open_issues,0\n'); } diff --git a/tools/gemini-cli-bot/metrics/scripts/open_prs.ts b/tools/gemini-cli-bot/metrics/scripts/open_prs.ts index 698a5a083b..722a5888bf 100644 --- a/tools/gemini-cli-bot/metrics/scripts/open_prs.ts +++ b/tools/gemini-cli-bot/metrics/scripts/open_prs.ts @@ -2,25 +2,24 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ 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 query = 'query($owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { pullRequests(states: OPEN) { totalCount } } }'; const output = execSync( - `gh api graphql -f query='${query}'`, + `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, { encoding: 'utf-8', + stdio: ['ignore', 'pipe', 'ignore'], }, ).trim(); const parsed = JSON.parse(output); const totalCount = parsed?.data?.repository?.pullRequests?.totalCount ?? 0; - console.log(`open_prs,${totalCount}`); + process.stdout.write(`open_prs,${totalCount}\n`); } catch { // Fallback if gh fails or no PRs found - console.log('open_prs,0'); + process.stdout.write('open_prs,0\n'); } diff --git a/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts b/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts index a51bc0efd9..868a49262e 100644 --- a/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts +++ b/tools/gemini-cli-bot/metrics/scripts/review_distribution.ts @@ -2,11 +2,9 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ -import { GITHUB_OWNER, GITHUB_REPO, type MetricOutput } from '../types.js'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { @@ -28,7 +26,7 @@ try { `; const output = execSync( `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, - { encoding: 'utf-8' }, + { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }, ); const data = JSON.parse(output).data.repository; diff --git a/tools/gemini-cli-bot/metrics/scripts/throughput.ts b/tools/gemini-cli-bot/metrics/scripts/throughput.ts index 1821a482a1..7d28a0b844 100644 --- a/tools/gemini-cli-bot/metrics/scripts/throughput.ts +++ b/tools/gemini-cli-bot/metrics/scripts/throughput.ts @@ -2,11 +2,9 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ -import { GITHUB_OWNER, GITHUB_REPO, type MetricOutput } from '../types.js'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { @@ -30,7 +28,7 @@ try { `; const output = execSync( `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, - { encoding: 'utf-8' }, + { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }, ); const data = JSON.parse(output).data.repository; diff --git a/tools/gemini-cli-bot/metrics/scripts/time_to_first_response.ts b/tools/gemini-cli-bot/metrics/scripts/time_to_first_response.ts index fa44b46574..eaed28b2b9 100644 --- a/tools/gemini-cli-bot/metrics/scripts/time_to_first_response.ts +++ b/tools/gemini-cli-bot/metrics/scripts/time_to_first_response.ts @@ -2,11 +2,9 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ -import { GITHUB_OWNER, GITHUB_REPO, type MetricOutput } from '../types.js'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { @@ -50,7 +48,7 @@ try { `; const output = execSync( `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, - { encoding: 'utf-8' }, + { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }, ); const data = JSON.parse(output).data.repository; diff --git a/tools/gemini-cli-bot/metrics/scripts/user_touches.ts b/tools/gemini-cli-bot/metrics/scripts/user_touches.ts index ca4dc586c7..54ad603153 100644 --- a/tools/gemini-cli-bot/metrics/scripts/user_touches.ts +++ b/tools/gemini-cli-bot/metrics/scripts/user_touches.ts @@ -2,11 +2,9 @@ * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 - * - * @license */ -import { GITHUB_OWNER, GITHUB_REPO, type MetricOutput } from '../types.js'; +import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { @@ -31,7 +29,7 @@ try { `; const output = execSync( `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, - { encoding: 'utf-8' }, + { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }, ); const data = JSON.parse(output).data.repository; diff --git a/tools/gemini-cli-bot/metrics/types.ts b/tools/gemini-cli-bot/metrics/types.ts index 20739f3843..7b2156bc9c 100644 --- a/tools/gemini-cli-bot/metrics/types.ts +++ b/tools/gemini-cli-bot/metrics/types.ts @@ -3,12 +3,5 @@ * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 */ -export interface MetricOutput { - metric: string; - value: number | string; - timestamp: string; - details?: Record; -} - export const GITHUB_OWNER = 'google-gemini'; export const GITHUB_REPO = 'gemini-cli';