cli/pkg/cmd
Kynan Ware 35c2439fd9 Add GH_AGGRESSIVE_CACHING_TTL env var for opt-in process-wide caching
This is the opt-in surface for the new go-gh aggressive caching
support. Setting GH_AGGRESSIVE_CACHING_TTL to a Go duration string
(e.g. 30s, 1m, 5m, 1h) enables process-wide TTL caching for cacheable
REST and GraphQL requests on the standard authenticated HTTP client.

Motivation: heavy users running multiple parallel agent harnesses
(e.g. several Codex agents in lockstep) issue duplicate identical
requests within seconds of each other, exhausting the GitHub primary
REST rate limit and tripping secondary limits. A short TTL (~30s)
dedupes the lockstep traffic without changing what gh fundamentally
is. The trade-off (bounded staleness) is acceptable when explicitly
opted into.

Wiring:

  - api/http_client.go: NewHTTPClient reads GH_AGGRESSIVE_CACHING_TTL
    after honoring caller-supplied EnableCache. The env var only
    activates when:
      - opts.EnableCache is not already true (caller config wins)
      - opts.SkipDefaultHeaders is false (PlainHttpClient bypasses
        defaults and must not opt into caching by env var)
    Per-request X-GH-CACHE-TTL: 0 still bypasses for individual calls.

  - parseAggressiveCachingTTL is silent on failure: empty, '0',
    negative, or unparseable values disable the feature. Matches the
    convention for other GH_* env vars and avoids stderr noise from
    a transport layer. Users diagnose via the X-GH-Cache-Status
    response header.

  - help_topic.go: documents the env var, format, staleness caveat,
    intended use case, observability hook, cleanup path
    (gh config clear-cache), and explicit precedence rules.

Tests cover:

  - parseAggressiveCachingTTL edge cases (empty, valid, zero,
    negative, unparseable, missing unit, plain number).
  - Env var with positive duration enables caching end-to-end
    (miss -> hit pattern, network call only on first request).
  - Env var unset or with invalid value leaves caching disabled.
  - Caller-set EnableCache + CacheTTL takes precedence over env var.
  - SkipDefaultHeaders (PlainHttpClient path) bypasses aggressive
    caching even when env var is set.
  - Per-request X-GH-CACHE-TTL: 0 hard-bypasses cache when env var
    is set, and does not pollute the cached entry.

Manual smoke verified against live api.github.com:
  - REST GET: miss -> hit transitions work, X-GH-Cache-Status
    visible via 'gh api -i'.
  - GraphQL query: same miss -> hit pattern works.
  - Per-request opt-out: header returns no X-GH-Cache-Status,
    confirming bypass.
  - 'gh auth status', 'gh config clear-cache' continue to work.

Out of scope here:
  - ETag / If-None-Match revalidation (planned follow-up that layers
    on top of the same transport).
  - Rewriting commands like 'gh pr checks --watch' to take advantage
    of REST + ETag (separate decision, separate PR).

Depends on go-gh changes:
  - 'Fix per-request cache opt-out when global TTL is configured'
  - 'Restrict cacheable responses to 2xx'
  - 'Skip caching of GraphQL mutations and subscriptions'
  - 'Use atomic temp-file + rename for cache writes'
  - 'Vary cache key by Accept-Encoding, X-GitHub-Api-Version, ...'
  - 'Emit X-GH-Cache-Status response header for cache observability'

Related: cli/cli#13279, cli/cli#13293

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-05 14:08:37 -06:00
..
accessibility PR feedback 2025-04-30 15:05:07 -04:00
actions Remove trailing whitespace 2025-02-13 11:06:27 +05:00
agent-task fix(agent-task): resolve Copilot API URL dynamically (#12956) 2026-03-18 18:14:02 +00:00
alias Fixes #10590 2025-03-26 13:42:39 -04:00
api Disable telemetry for GHES 2026-04-17 11:50:24 +02:00
attestation Add missing //go:build integration tag to verify_integration_test.go 2026-04-28 18:20:23 +02:00
auth Print gh auth refresh for 401 returns 2026-04-20 12:07:14 -06:00
browse feat(browse): add blame flag 2026-03-03 19:03:40 -07:00
cache fix(cache delete): add unit tests and expand help doc 2026-01-20 08:30:34 +01:00
codespace Disable telemetry for GHES 2026-04-17 11:50:24 +02:00
completion Add sampled command telemetry 2026-04-16 21:42:46 +02:00
config Add sampled command telemetry 2026-04-16 21:42:46 +02:00
copilot Include CI context in telemetry 2026-04-20 12:02:56 +02:00
extension Update command.go 2026-04-27 10:19:56 -04:00
factory Apply review feedback 2026-04-17 12:28:52 +02:00
gist Add usage examples to gh gist edit command 2026-02-17 12:38:15 -07:00
gpg-key Fix StatusJSONResponse usage (#10810) 2025-05-01 20:22:43 +01:00
issue Merge pull request #13025 from cli/kw/refactor/reviewer-assignee-actor-symmetry 2026-03-25 11:43:18 -06:00
label Introduce color_labels support, update commands 2025-04-02 18:24:20 -04:00
licenses Bundle licenses at release time (#12625) 2026-02-18 17:59:27 +01:00
org Move config interfaces into gh package (#9060) 2024-05-10 10:39:36 +02:00
pr Remove numberFieldOnly API shortcut 2026-05-01 17:23:01 +02:00
preview Refactor MultiSelectWithSearch to use result struct 2026-01-26 13:29:22 -07:00
project Revert "refactor: deduplicate scope error handling between api/client.go and project queries" 2026-03-12 12:45:48 +01:00
release Fix infinite loop in 'gh release list --limit 0' 2026-04-04 18:13:25 +08:00
repo fix: address review feedback on squash merge commit message 2026-03-10 18:27:21 +05:30
root Add GH_AGGRESSIVE_CACHING_TTL env var for opt-in process-wide caching 2026-05-05 14:08:37 -06:00
ruleset Remove trailing whitespace 2025-02-13 11:06:27 +05:00
run Fix log terminal injection 2026-04-23 13:56:33 +02:00
search Disable telemetry for GHES 2026-04-17 11:50:24 +02:00
secret refactor: drop multierror in favor of std 2025-12-02 15:08:58 +01:00
send-telemetry Add sampled command telemetry 2026-04-16 21:42:46 +02:00
skills Merge pull request #13264 from SamMorrowDrums/sammorrowdrums/skill-ghec-data-residency 2026-04-24 11:45:28 +02:00
ssh-key Remove out of scope changes, update list commands 2025-03-31 11:58:30 -04:00
status Deprecate ColorScheme.Gray for ColorScheme.Muted 2025-04-06 10:18:48 -04:00
variable refactor: drop multierror in favor of std 2025-12-02 15:08:58 +01:00
version Add sampled command telemetry 2026-04-16 21:42:46 +02:00
workflow fix(workflow run): bail out on feature detection error 2026-02-17 11:48:25 +00:00