mrkeyoor.com_
Wed 16 Sept 05:23 UTC
Dev Toolsevaluationupdated 25 Aug 2026

cli review

GitHub CLI, usually invoked as `gh`, puts GitHub pull requests, issues, releases, Codespaces, Actions, and repository operations in the terminal. It is the official command-line client for GitHub.com, GitHub Enterprise Cloud, and GitHub Enterprise Server 2.20 or newer.

+75stars / 7d
Verdict

Our cli/cli build finished in 66 seconds, but its full Go test run ended after 382 seconds with 224 of 226 packages passing, so contributors should budget for a large suite and investigate the two unexplained failures. For daily GitHub work, gh is still the default recommendation because it covers the service broadly, ships signed immutable releases, and has current maintenance. Use a narrower local Git interface if you rarely touch pull requests, Actions, or the GitHub API.

We ran it

Lab card: what happened when we ran cliScreenshot of cli (cli.github.com)
Install✓ · 65s463 packages
Build✓ · 66s
Tests✗ · 382s224 passed · 2 failed of 226 (go test)
Repo1358 files~272,998 lines of source · 23 MB · 13 CI workflows · tests dir

Answers from our run

Does cli build from source?

Dependencies installed in 65 seconds (463 packages), and the build succeeded in 66 seconds. We cloned commit 5d3c481 into a clean Debian container with 3 CPUs and no project-specific setup.

Do cli's tests pass?

Not all of them: 224 of 226 passed and 2 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use cli?

GitLab-first teams: gh supports GitHub products, while GitLab's official CLI is a separate project hosted on GitLab.

What are the alternatives to cli?

GitLab CLI, Lazygit, hub. Our cli/cli build finished in 66 seconds, but its full Go test run ended after 382 seconds with 224 of 226 packages passing, so contributors should budget for a large suite and investigate the two unexplained failures.

Setup4/5Install and build passed; authentication still needs deliberate setup
Docs5/5Clear platform installs, manual pages, and source build guidance
Community5/5Pushed Aug 25 with active issues and pull requests
Maturity5/5Official client with frequent signed, immutable releases

Discussed on

  1. hnGitHub CLI26 points

Who it’s for

Developers who spend most of the day in a terminal and regularly work with GitHub pull requests, issues, releases, or Actions.
Teams that want scripts to use GitHub operations without hand-writing REST or GraphQL requests.
GitHub Enterprise users who need the same command shape across hosted and self-managed instances.
Coding-agent users who want GitHub's maintained gh agent skill rather than an ad hoc shell prompt.

Who it’s NOT for

GitLab-first teams: gh supports GitHub products, while GitLab's official CLI is a separate project hosted on GitLab.
Developers who want a transparent wrapper around git: the README explicitly describes gh as a standalone tool, unlike the older hub proxy model.
Automation that cannot tolerate ambiguous authentication errors: open issue #14053 reports rate-limit and network failures being described as an invalid token.
Users who cannot update promptly after security fixes: v2.98.0 corrected Codespaces port forwarding that had bound a local port to every network interface by default.

Setup reality

Our sandbox install succeeded in 65 seconds and pulled 463 Go packages. The build then completed in 66 seconds, so a source checkout is workable even though the repository spans 1,358 files and about 272,998 lines.

Normal use still needs GitHub authentication, either through the interactive login flow or an appropriate token for unattended work. Enterprise users must select their host, and commands can require extra scopes depending on the GitHub feature they touch.

Our test command ran for 382 seconds and ended with 224 of 226 packages passing. The final log only showed several packages passing and then FAIL; it did not identify the two failing packages or their cause, so we cannot say whether the container or the code was responsible.

GitHub work fits into one terminal client

GitHub CLI covers the service work that plain git does not. Pull requests, issues, repository creation, releases, Actions runs, Codespaces, gists, and API calls all sit under gh. The README supports GitHub.com, Enterprise Cloud, and Enterprise Server 2.20 or newer. That breadth is why it earns a place on a developer machine: it reduces browser switching without pretending that Git itself has changed.

The distinction from hub is useful. GitHub describes hub as a proxy around git, while gh is a standalone program with its own command tree. That choice makes commands such as gh pr checkout, gh run watch, and gh release create explicit. It also means old scripts written around git hub-style-subcommand behavior do not transfer mechanically. Lazygit solves another problem again, giving local Git a terminal interface while leaving hosted-service operations mostly outside its scope.

The official client follows GitHub features quickly

Release v2.98.0 added worktree support to gh pr checkout and semantic or hybrid modes to issue search. Those are service-specific features that a generic Git client is unlikely to expose promptly. The same release fixed gh status, attestation retries, noninteractive project output, and whitespace handling in release scopes. For teams standardized on GitHub, one maintained client is easier to teach than a pile of curl scripts.

That closeness to GitHub cuts both ways. gh is a poor fit for a GitLab-first organization, and some commands depend on server capabilities or permissions that vary by host. The open issue count was 1,080 issues and pull requests on August 25, 2026, which describes a busy product and contributor queue rather than 1,080 confirmed defects. Recent activity includes both user reports and active pull requests, so the queue must be read alongside the same-day push.

Authentication is easy to start and worth configuring carefully

Interactive use begins with gh auth login, which can authenticate to GitHub.com or another hostname and store credentials through the available system store. Automation can supply tokens instead. That second route needs care: a token should have only the permissions its commands require, and a script should select the intended host when several GitHub instances are configured.

The rough edge is error diagnosis. Open issue #14053 reports that gh auth status can label rate-limit or network failures as an invalid token and recommend reauthentication. That matters in CI, where replacing a healthy credential would not fix an outage. Treat the message as one signal, then check connectivity and API rate limits before rotating secrets. The project was pushed on August 25, so the report sits in an actively maintained queue.

What happened when we ran it

Our sandbox installed 463 Go packages in 65 seconds, then built the checkout in another 66 seconds. The repository was 23 MB with 1,358 files and roughly 272,998 lines of source at commit 5d3c481. That is a substantial command-line application, yet the initial source build completed without needing secrets or privileged container access.

The test stage did not finish cleanly. After 382 seconds, the Go test summary counted 224 passing packages and 2 failing packages out of 226. The supplied log tail shows successful results for packages including jsoncolor, option, search, set, and surveyext, followed only by the final FAIL. It contains no failure message from the two packages, so assigning a cause would be guesswork.

That result changes the contributor recommendation more than the user recommendation. People installing a published binary do not need to compile 272,998 lines or run 226 package tests. Contributors and downstream packagers do. They should reproduce the two failures with fuller logs before treating the checkout as clean, and they should expect the complete test command to take materially longer than the 66-second build on a 3-CPU container.

Release verification is unusually concrete

The project publishes packages and precompiled binaries for macOS, Linux, and Windows, with platform-specific installation pages. Starting with v2.93.0, GitHub says gh releases are immutable. Since v2.50.0, the project has also published build provenance attestations, and the README demonstrates verification through gh at verify or Sigstore's cosign. That gives security-conscious teams a documented check beyond comparing a downloaded filename.

Version v2.98.0 also carried a security fix for gh codespace ports forward. The release says the local forwarded port had been bound to every available network interface by default and advises affected users to update. This is a concrete reason to keep the client current, especially on laptops that move between trusted and public networks. Pinning an old binary for reproducibility needs an update process, not permanent neglect.

Use it for GitHub, not as a replacement for Git

GitHub CLI is best when hosted workflow is the task: reviewing a pull request, watching an Actions run, creating a release, querying the API, or opening a Codespace. Its built-in extension system and agent skill widen that surface without forcing every feature into the core binary. The manual remains the better reference once the README's installation and positioning pages run out.

Local history editing still belongs to Git or a focused interface such as Lazygit. Cross-forge automation belongs in a tool that models several providers. Within its actual boundary, gh is an easy recommendation for GitHub users. The caveat from our 382-second test run is for builders: source compilation worked, but the checkout did not earn a fully clean test result in our container.

Alternatives

ProjectWhat it isPick it when
GitLab CLIGitLab's official terminal client for merge requests, issues, pipelines, and releases.pick this instead when your repositories and review workflow live on GitLab rather than GitHub.
Lazygit gh↗A keyboard-driven terminal interface for local Git operations.pick this instead when commits, branches, rebases, and diffs are the main job, with little need for GitHub API features.
hubThe older GitHub-oriented wrapper that extends the `git` command itself.pick this instead when an existing script depends on hub's git-proxy behavior and migration is not yet practical.

What people are saying

  1. [github-trending] stripe/link-cli
  2. [github-trending] aws/agentcore-cli
  3. [github-trending] bbernhard/signal-cli-rest-api
  4. [github-trending] google-gemini/gemini-cli
  5. [github-trending] larksuite/cli
  6. [github-trending] entireio/cli

Sources

  1. GitHub CLI README
  2. GitHub CLI repository
  3. GitHub CLI 2.98.0 release
  4. Authentication error report #14053
  5. GitHub CLI authentication manual

More dev tools reviews

noty · forward-implementation-first · breakscale · black · ASC · BrewUI · the whole board →