diff options
| author | Seth Vargo <[email protected]> | 2025-08-06 16:56:06 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-06 20:56:06 +0000 |
| commit | 5cd63a6abc0531ec5e6781b2fa065cd22a64eede (patch) | |
| tree | 3cf02f469f8604fb6e00cd3dc272ab1a6f410e8f /packages/cli/src/ui/commands/setupGithubCommand.ts | |
| parent | b55467c1dd3515b35607a2abfbdefaa79bf6a48f (diff) | |
feat(cli): get the run-gemini-cli version from the GitHub API (#5708)
Diffstat (limited to 'packages/cli/src/ui/commands/setupGithubCommand.ts')
| -rw-r--r-- | packages/cli/src/ui/commands/setupGithubCommand.ts | 78 |
1 files changed, 58 insertions, 20 deletions
diff --git a/packages/cli/src/ui/commands/setupGithubCommand.ts b/packages/cli/src/ui/commands/setupGithubCommand.ts index 047e11eb..1b5b3277 100644 --- a/packages/cli/src/ui/commands/setupGithubCommand.ts +++ b/packages/cli/src/ui/commands/setupGithubCommand.ts @@ -5,8 +5,13 @@ */ import path from 'path'; -import { execSync } from 'child_process'; -import { isGitHubRepository } from '../../utils/gitUtils.js'; + +import { CommandContext } from '../../ui/commands/types.js'; +import { + getGitRepoRoot, + getLatestGitHubRelease, + isGitHubRepository, +} from '../../utils/gitUtils.js'; import { CommandKind, @@ -18,26 +23,29 @@ export const setupGithubCommand: SlashCommand = { name: 'setup-github', description: 'Set up GitHub Actions', kind: CommandKind.BUILT_IN, - action: (): SlashCommandActionReturn => { + action: async ( + context: CommandContext, + ): Promise<SlashCommandActionReturn> => { if (!isGitHubRepository()) { throw new Error( 'Unable to determine the GitHub repository. /setup-github must be run from a git repository.', ); } - let gitRootRepo: string; + // Find the root directory of the repo + let gitRepoRoot: string; try { - gitRootRepo = execSync('git rev-parse --show-toplevel', { - encoding: 'utf-8', - }).trim(); - } catch { + gitRepoRoot = getGitRepoRoot(); + } catch (_error) { + console.debug(`Failed to get git repo root:`, _error); throw new Error( 'Unable to determine the GitHub repository. /setup-github must be run from a git repository.', ); } - const version = 'v0'; - const workflowBaseUrl = `https://raw.githubusercontent.com/google-github-actions/run-gemini-cli/refs/tags/${version}/examples/workflows/`; + // Get the latest release tag from GitHub + const proxy = context?.services?.config?.getProxy(); + const releaseTag = await getLatestGitHubRelease(proxy); const workflows = [ 'gemini-cli/gemini-cli.yml', @@ -46,16 +54,29 @@ export const setupGithubCommand: SlashCommand = { 'pr-review/gemini-pr-review.yml', ]; - const command = [ - 'set -e', - `mkdir -p "${gitRootRepo}/.github/workflows"`, - ...workflows.map((workflow) => { - const fileName = path.basename(workflow); - return `curl -fsSL -o "${gitRootRepo}/.github/workflows/${fileName}" "${workflowBaseUrl}/${workflow}"`; - }), - 'echo "Workflows downloaded successfully. Follow steps in https://github.com/google-github-actions/run-gemini-cli/blob/v0/README.md#quick-start (skipping the /setup-github step) to complete setup."', - 'open https://github.com/google-github-actions/run-gemini-cli/blob/v0/README.md#quick-start', - ].join(' && '); + const commands = []; + + // Ensure fast exit + commands.push(`set -eEuo pipefail`); + + // Make the directory if it doesn't exist + commands.push(`mkdir -p "${gitRepoRoot}/.github/workflows"`); + + for (const workflow of workflows) { + const fileName = path.basename(workflow); + const curlCommand = buildCurlCommand( + `https://raw.githubusercontent.com/google-github-actions/run-gemini-cli/refs/tags/${releaseTag}/examples/workflows/${workflow}`, + [`--output "${gitRepoRoot}/.github/workflows/${fileName}"`], + ); + commands.push(curlCommand); + } + + commands.push( + `echo "Successfully downloaded ${workflows.length} workflows. Follow the steps in https://github.com/google-github-actions/run-gemini-cli/blob/${releaseTag}/README.md#quick-start (skipping the /setup-github step) to complete setup."`, + `open https://github.com/google-github-actions/run-gemini-cli/blob/${releaseTag}/README.md#quick-start`, + ); + + const command = `(${commands.join(' && ')})`; return { type: 'tool', toolName: 'run_shell_command', @@ -67,3 +88,20 @@ export const setupGithubCommand: SlashCommand = { }; }, }; + +// buildCurlCommand is a helper for constructing a consistent curl command. +function buildCurlCommand(u: string, additionalArgs?: string[]): string { + const args = []; + args.push('--fail'); + args.push('--location'); + args.push('--show-error'); + args.push('--silent'); + + for (const val of additionalArgs || []) { + args.push(val); + } + + args.sort(); + + return `curl ${args.join(' ')} "${u}"`; +} |
