Repository navigation
feat(auth): support GitHub CLI credentials - #4960
Conversation
Add a dedicated github-cli authentication mode with host-aware token resolution, in-memory caching, sanitized failures, tests, and documentation. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
There was a problem hiding this comment.
🟡 Changes recommended
Credential selection can send an enterprise token to public GitHub.
3 open findings
What changed in this PR
Adds GitHub CLI authentication to Specify, allowing developers to reuse gh credentials without storing a token in Specify configuration.
Changes:
- Adds shell-free token lookup, in-memory caching, and sanitized errors.
- Passes request hostnames through authentication providers.
- Adds authentication tests and configuration documentation.
AI-generated review for the requester (identity unavailable) by GitHub Copilot (model unknown, autonomous); analysis and drafting.
| File | Description |
|---|---|
| tests/specify_cli/authentication/test_authentication.py | Tests CLI lookup, caching, failures, and request integration. |
| src/specify_cli/authentication/http.py | Passes request hostnames to providers. |
| src/specify_cli/authentication/github.py | Implements GitHub CLI credential resolution. |
| src/specify_cli/authentication/config.py | Updates a comment about field-free CLI modes. |
| src/specify_cli/authentication/bitbucket.py | Accepts the optional hostname argument. |
| src/specify_cli/authentication/base.py | Extends the provider interface with hostname context. |
| src/specify_cli/authentication/azure_devops.py | Adopts the updated provider signature. |
| docs/reference/authentication.md | Documents GitHub CLI configuration and enterprise behavior. |
🧠 Review effort: Max
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Pass explicit GitHub CLI hostnames, map configured enterprise service hosts to their instance login, and route sanitized credential failures through existing URL error handling. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
Keep sanitized GitHub CLI credential failures distinct from offline errors in release checks and upgrade output, prove no HTTP fallback occurs, and document terminal failure caching. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
Prevent GitHub CLI tokens from following redirects to a different GitHub credential host while preserving authorization across public and configured enterprise aliases. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
Remove consumer-specific error handling, redirect policy changes, and shared provider API changes. Keep GitHub CLI host selection within the GitHub provider by treating each provider entry as one credential scope. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 434e2508-0633-4d40-8e0d-5edb92cbc177
There was a problem hiding this comment.
🟡 Changes recommended
Credential-scope validation and enterprise hostname selection need correction before approval.
6 open findings
Reject mixed-instance wildcard hosts · New Reject internal newlines in GitHub CLI tokens Document supported GitHub service aliases · New Support enterprise hosts whose names start with service aliases · New Add redirect credential-scope wiring coverage Test rejection of relative GitHub CLI executables
2 resolved since last review
🧠 Review effort: Max
Use hosts[0] as the credential hostname instead of inferring an instance from service prefixes. Document ordering and cover first-host selection, wildcard rejection, and cache isolation. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Classify GitHub CLI acquisition failures as URL errors so existing catalog handlers can warn and continue, while each affected HTTP request still fails without credential or anonymous fallback. Cache the sanitized reason without nesting URL-error wrappers. Add catalog-search regression, release-check, and redirect-wiring coverage; retain the approved first-host credential contract. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🔵 Needs a closer look
The security-sensitive credential acquisition and forwarding behavior warrants final human review.
5 open issues
Reject mixed-instance wildcard hosts Add redirect credential-scope wiring coverage Test rejection of relative GitHub CLI executables The GitHub auth-scheme table still lists onlybearer, so readers scanning it will miss… · New The PR summary says Enterprise credentials are resolved "for the request hostname", but this… · New
Review effort: Max
Add the GitHub CLI credential mode alongside bearer and remove the redundant prose below the table. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
Release checks still turn actionable GitHub CLI authentication failures into misleading offline-or-timeout errors.
5 open issues
Reject mixed-instance wildcard hosts Add redirect credential-scope wiring coverage Test rejection of relative GitHub CLI executables The “How it works” summary (steps 2–4, lines 329–333) describes retries and anonymous fallback… · New The PR summary says Enterprise credentials are resolved "for the request hostname", but this…
1 resolved since last review
Review effort: Max
Qualify the authentication process summary and HTTP helper docstrings: GitHub CLI acquisition errors stop the request immediately, whereas HTTP 401/403 after successful acquisition still permits matching-entry and anonymous fallback. No runtime behavior changes. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Reject decoded non-ASCII CLI output through the sanitized malformed-token path before returning or caching credentials. Extend failure-cache regression coverage to Latin-1 and non-Latin-1 Unicode and document the restriction. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Fixed in 12fe353: GitHub CLI tokens are now required to be ASCII after trimming. Non-ASCII output takes the existing sanitized malformed-token path before any successful token is cached or passed to HTTP headers. Regression cases cover both Latin-1 and non-Latin-1 Unicode, identical repeated diagnostics, and a single subprocess invocation. Documentation now states this restriction. No base-class or shared HTTP changes. The new Unicode cases failed before the fix and pass afterward. Validation: Posted on behalf of @mnriem by GitHub Copilot (GPT-6.1 Sol, interactive session with autonomous implementation; reasoning effort not explicitly selected). AI involvement: implementation, regression tests, documentation, validation, and comment drafting. |
Keep sanitized GitHub CLI diagnostics in release checks and upgrade failure rendering. Treat authentication failures as definitive in bundle catalog fetching and reference validation, rather than availability fallbacks. Add regressions that failed before the fix and document the caller behavior; preserve the first-host contract and authentication base classes. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Normalize captured whitespace before checking authentication error details so Rich line wrapping does not make release-command tests depend on terminal width. Assisted-by: GitHub Copilot (model: GPT-6.1 Sol, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>



Description
github-cliauthentication mode backed by the fixed, shell-freegh auth tokencommand.hosts[0]) togh auth token --hostnameand use that hostname as the cache key for successful or failed lookups in memory for the current process.Closes #4953
Testing
uv run specify --helpuv sync && uv run pytestThe exact template commands above were not run in this review round. Focused checks at
1dfc5244:.venv/bin/python -m pytest tests/specify_cli/authentication -o addopts='' -q --disable-warnings— 326 passed, 33 warnings.ruff check --isolated --select E4,E7,E9,F,S602,S604,S605 src/specify_cli/authentication/github.py tests/specify_cli/authentication/test_authentication.py— passed.Coverage includes first-host selection and cache isolation, missing or relative executables, sanitized subprocess and malformed-token failures, registered-provider HTTP wiring, declared-host redirect preservation and unlisted-host stripping, and catalog failure handling.
Earlier validation reported by the original implementation (not rerun in full for this description update):
uvx ruff@0.15.0 check src tests— passed..venv/bin/python -m pytest tests/specify_cli/authentication/test_authentication.py -q— 204 passed.LC_ALL=en_US.UTF-8 .venv/bin/python -m pytest tests -q— 12,212 passed, 71 skipped.AI Disclosure
AI disclosure: Implemented on behalf of @mnriem with GitHub Copilot using GPT-5.6 Sol in autonomous mode for the original implementation and its reported validation. Subsequent review fixes, regression tests, documentation, and validation were authored and executed by GitHub Copilot using GPT-6.1 Sol, primarily in autonomous mode, with the first-host policy directed by @mnriem. This description update and review replies use GPT-6.1 Sol in interactive mode with explicit user authorization. Reasoning-effort settings were not explicitly selected in this session. No claim of human line-by-line review is made.