diff --git a/.github/workflows/chained_e2e.yml b/.github/workflows/chained_e2e.yml index 4a5de8bf7c..5e208e7e20 100644 --- a/.github/workflows/chained_e2e.yml +++ b/.github/workflows/chained_e2e.yml @@ -184,7 +184,7 @@ jobs: needs: - 'merge_queue_skipper' - 'parse_run_context' - runs-on: 'macos-latest-large' + runs-on: 'macos-latest' if: | github.repository == 'google-gemini/gemini-cli' && always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip != 'true') steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ef8bdb58d..28f682c30e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -231,7 +231,7 @@ jobs: test_mac: name: 'Test (Mac) - ${{ matrix.node-version }}, ${{ matrix.shard }}' - runs-on: 'macos-latest-large' + runs-on: 'macos-latest' needs: - 'merge_queue_skipper' if: "github.repository == 'google-gemini/gemini-cli' && needs.merge_queue_skipper.outputs.skip == 'false'" @@ -244,8 +244,6 @@ jobs: matrix: node-version: - '20.x' - - '22.x' - - '24.x' shard: - 'cli' - 'others' diff --git a/.github/workflows/deflake.yml b/.github/workflows/deflake.yml index a6a7d3664f..c58d9120f3 100644 --- a/.github/workflows/deflake.yml +++ b/.github/workflows/deflake.yml @@ -78,7 +78,7 @@ jobs: deflake_e2e_mac: name: 'E2E Test (macOS)' - runs-on: 'macos-latest-large' + runs-on: 'macos-latest' if: "github.repository == 'google-gemini/gemini-cli'" steps: - name: 'Checkout' diff --git a/tools/gemini-cli-bot/metrics/scripts/latency.ts b/tools/gemini-cli-bot/metrics/scripts/latency.ts index 7dd5dcd1f6..25fb469931 100644 --- a/tools/gemini-cli-bot/metrics/scripts/latency.ts +++ b/tools/gemini-cli-bot/metrics/scripts/latency.ts @@ -10,18 +10,23 @@ import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { + const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) + .toISOString() + .split('T')[0]; const query = ` query($owner: String!, $repo: String!) { - repository(owner: $owner, name: $repo) { - pullRequests(last: 100, states: MERGED) { - nodes { + pullRequests: search(query: "repo:$owner/$repo is:pr is:merged merged:>=${sevenDaysAgo}", type: ISSUE, first: 100) { + nodes { + ... on PullRequest { authorAssociation createdAt mergedAt } } - issues(last: 100, states: CLOSED) { - nodes { + } + issues: search(query: "repo:$owner/$repo is:issue is:closed closed:>=${sevenDaysAgo}", type: ISSUE, first: 100) { + nodes { + ... on Issue { authorAssociation createdAt closedAt @@ -34,32 +39,38 @@ try { `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, { encoding: 'utf-8' }, ); - const data = JSON.parse(output).data.repository; + const data = JSON.parse(output).data; + + const prs = data.pullRequests.nodes + .filter((p: any) => p.mergedAt && p.createdAt) + .map( + (p: { + authorAssociation: string; + createdAt: string; + mergedAt: string; + }) => ({ + association: p.authorAssociation, + latencyHours: + (new Date(p.mergedAt).getTime() - new Date(p.createdAt).getTime()) / + (1000 * 60 * 60), + }), + ); + + const issues = data.issues.nodes + .filter((p: any) => p.closedAt && p.createdAt) + .map( + (i: { + authorAssociation: string; + createdAt: string; + closedAt: string; + }) => ({ + association: i.authorAssociation, + latencyHours: + (new Date(i.closedAt).getTime() - new Date(i.createdAt).getTime()) / + (1000 * 60 * 60), + }), + ); - const prs = data.pullRequests.nodes.map( - (p: { - authorAssociation: string; - mergedAt: string; - createdAt: string; - }) => ({ - association: p.authorAssociation, - latencyHours: - (new Date(p.mergedAt).getTime() - new Date(p.createdAt).getTime()) / - (1000 * 60 * 60), - }), - ); - const issues = data.issues.nodes.map( - (i: { - authorAssociation: string; - closedAt: string; - createdAt: string; - }) => ({ - association: i.authorAssociation, - latencyHours: - (new Date(i.closedAt).getTime() - new Date(i.createdAt).getTime()) / - (1000 * 60 * 60), - }), - ); const isMaintainer = (assoc: string) => ['MEMBER', 'OWNER', 'COLLABORATOR'].includes(assoc); diff --git a/tools/gemini-cli-bot/metrics/scripts/throughput.ts b/tools/gemini-cli-bot/metrics/scripts/throughput.ts index 3806dd407a..d668a05914 100644 --- a/tools/gemini-cli-bot/metrics/scripts/throughput.ts +++ b/tools/gemini-cli-bot/metrics/scripts/throughput.ts @@ -10,17 +10,22 @@ import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { + const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) + .toISOString() + .split('T')[0]; const query = ` query($owner: String!, $repo: String!) { - repository(owner: $owner, name: $repo) { - pullRequests(last: 100, states: MERGED) { - nodes { + pullRequests: search(query: "repo:$owner/$repo is:pr is:merged merged:>=${sevenDaysAgo}", type: ISSUE, first: 100) { + nodes { + ... on PullRequest { authorAssociation mergedAt } } - issues(last: 100, states: CLOSED) { - nodes { + } + issues: search(query: "repo:$owner/$repo is:issue is:closed closed:>=${sevenDaysAgo}", type: ISSUE, first: 100) { + nodes { + ... on Issue { authorAssociation closedAt } @@ -32,7 +37,7 @@ try { `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, { encoding: 'utf-8' }, ); - const data = JSON.parse(output).data.repository; + const data = JSON.parse(output).data; const prs = data.pullRequests.nodes .map((p: { authorAssociation: string; mergedAt: string }) => ({ @@ -54,11 +59,7 @@ try { const calculateThroughput = ( items: { association: string; date: number }[], ) => { - if (items.length < 2) return 0; - const first = items[0].date; - const last = items[items.length - 1].date; - const days = (last - first) / (1000 * 60 * 60 * 24); - return days > 0 ? items.length / days : items.length; // items per day + return items.length / 7; // items per day over a fixed 7-day window }; const prOverall = calculateThroughput(prs); diff --git a/tools/gemini-cli-bot/metrics/scripts/user_touches.ts b/tools/gemini-cli-bot/metrics/scripts/user_touches.ts index 5ccffa94fc..f629f26e28 100644 --- a/tools/gemini-cli-bot/metrics/scripts/user_touches.ts +++ b/tools/gemini-cli-bot/metrics/scripts/user_touches.ts @@ -10,18 +10,23 @@ import { GITHUB_OWNER, GITHUB_REPO } from '../types.js'; import { execSync } from 'node:child_process'; try { + const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) + .toISOString() + .split('T')[0]; const query = ` query($owner: String!, $repo: String!) { - repository(owner: $owner, name: $repo) { - pullRequests(last: 100, states: MERGED) { - nodes { + pullRequests: search(query: "repo:$owner/$repo is:pr is:merged merged:>=${sevenDaysAgo}", type: ISSUE, first: 100) { + nodes { + ... on PullRequest { authorAssociation comments { totalCount } reviews { totalCount } } } - issues(last: 100, states: CLOSED) { - nodes { + } + issues: search(query: "repo:$owner/$repo is:issue is:closed closed:>=${sevenDaysAgo}", type: ISSUE, first: 100) { + nodes { + ... on Issue { authorAssociation comments { totalCount } } @@ -33,7 +38,7 @@ try { `gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`, { encoding: 'utf-8' }, ); - const data = JSON.parse(output).data.repository; + const data = JSON.parse(output).data; const prs = data.pullRequests.nodes; const issues = data.issues.nodes;