Skip to content

Route extension requests through api.Client - #14059

Merged
williammartin merged 7 commits into
trunkfrom
williammartin-route-extension-http
Aug 4, 2026
Merged

Route extension requests through api.Client#14059
williammartin merged 7 commits into
trunkfrom
williammartin-route-extension-http

Conversation

@williammartin

@williammartin williammartin commented Aug 4, 2026

Copy link
Copy Markdown
Member

Description

Part of #13991

This PR migrates the gh extension repository and release lookups to use the api.Client for API interactions. There should be no user visible change.

Three call sites move across: hasScript, fetchLatestRelease and fetchReleaseFromTag. Three deliberately stay on the raw http.Client:

  • repoExists distinguishes exactly 200 (exists) from exactly 404 (does not exist) and treats every other status as an error, while ignoring the response body entirely.
  • downloadAsset streams the extension binary to disk and sends Accept: application/octet-stream.
  • fetchCommitSHA sends Accept: application/vnd.github.v3.sha and reads the body as a bare SHA.

api.Client.REST unmarshals every 2xx other than 204 and 205 as JSON, does not surface the response status on success, and offers no way to set a per-request header or to reach the raw response body. So none of those three can go through it as it stands: repoExists would start accepting unexpected 2xx statuses as "exists" and would reject a bodyless or non-JSON 200, and the other two have no body it can decode. All three keep safeurl.JoinPathWithHostPrefix, since they still build the full URL themselves.

They are deferred rather than excluded. All three are GitHub API requests that should route through api.Client once it exposes a lower-level surface carrying request headers, response status and a streamable body without duplicating endpoint derivation. Each carries a TODO(api-client-rollout) comment recording its specific reason.

hasScript treats a 404 as a value rather than an error. Because api.Client.REST turns a 404 into an api.HTTPError, that is now expressed with errors.As instead of a status switch.

One detail changed. hasScript previously returned true without ever reading the body, whereas api.Client.REST reads it. The call passes nil as the response destination, so the body is not decoded into anything and its shape is irrelevant: the object returned for a file, the array returned for a directory listing, and the objects returned for symlinks and submodules all still yield true. What remains is that the body must be valid JSON at all, which required updating two stubs in manager_test.go that returned the bare string script. The real endpoint always returns JSON.

pkg/cmd/extension/http.go had no test file at all, so this PR adds one. It covers the three migrated functions and pins the behaviour of repoExists that kept it on raw HTTP: a 200 succeeds with a JSON, empty or non-JSON body, a 404 is (false, nil), and 201 and 204 remain errors.

Acceptance Test

The existing extension.txtar script covers create, install, exec, upgrade and remove for a script extension, which exercises both of the functions whose behaviour changed.

➜  williammartin-symmetrical-potato git:(williammartin-route-extension-http) GH_ACCEPTANCE_HOST=github.com \
GH_ACCEPTANCE_ORG=gh-acceptance-testing \
GH_ACCEPTANCE_TOKEN="$(gh auth token --hostname github.com)" \
GH_ACCEPTANCE_SCRIPT=extension.txtar \
go test -tags=acceptance -count=1 -v -run '^TestExtensions$' ./acceptance
=== RUN   TestExtensions
=== RUN   TestExtensions/extension
=== PAUSE TestExtensions/extension
=== CONT  TestExtensions/extension
    testscript.go:584: WORK=$WORK
        PATH=/var/folders/z7/869nt6ns29d77xln9h9bm8680000gn/T/testscript-main4114609494/bin:/Users/williammartin/go/pkg/mod/golang.org/[email protected]/bin:/Users/williammartin/.local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/Users/williammartin/.local/bin
        GOTRACEBACK=system
        HOME=$WORK
        TMPDIR=$WORK/.tmp
        devnull=/dev/null
        /=/
        :=:
        $=$
        exe=
        SCRIPT_NAME=extension
        GH_CONFIG_DIR=$WORK
        GH_HOST=github.com
        ORG=gh-acceptance-testing
        GH_TOKEN=gho_************************************
        RANDOM_STRING=uSPkADAHyR
        GH_TELEMETRY=false
        
        # Skip if Bash is not available given script extension (0.000s)
        > [!exec:bash] skip
        # Setup environment variables used for testscript (0.000s)
        > env EXT_NAME=${SCRIPT_NAME}-${RANDOM_STRING}
        > env EXT_SCRIPT=gh-${EXT_NAME}
        > env REPO=gh-${EXT_NAME}
        # Use gh as a credential helper (0.704s)
        > exec gh auth setup-git
        # Create local repository for extension (0.364s)
        > exec gh extension create $EXT_NAME
        > cd $REPO
        $WORK/gh-extension-uSPkADAHyR
        # Setup v1 executable baseline for extension (0.083s)
        > mv ../v1.sh $EXT_SCRIPT
        > chmod 777 $EXT_SCRIPT
        > exec git add $EXT_SCRIPT
        > exec git commit -m 'Setup extension as v1'
        [stdout]
        [master df71a47] Setup extension as v1
         1 file changed, 1 insertion(+), 31 deletions(-)
        # Upload local extension repository (3.913s)
        > exec gh repo create $ORG/$REPO --private --source . --push
        [stdout]
        https://github.com/gh-acceptance-testing/gh-extension-uSPkADAHyR
        branch 'master' set up to track 'origin/master'.
        [stderr]
        To https://github.com/gh-acceptance-testing/gh-extension-uSPkADAHyR.git
         * [new branch]      HEAD -> master
        # Defer repo cleanup (0.000s)
        > defer gh repo delete --yes $ORG/$REPO
        # Verify extension shows up in search, sleep for indexing (12.873s)
        > exec gh repo edit --add-topic gh-extension
        > sleep 10
        > exec gh extension search --owner $ORG $EXT_NAME
        [stdout]
                gh-acceptance-testing/gh-extension-uSPkADAHyR
        > stdout ${ORG}/${REPO}
        # Verify repository can be installed as extension (2.236s)
        > exec gh extension install $ORG/$REPO
        [stderr]
        Cloning into '$WORK/.local/share/gh/extensions/gh-extension-uSPkADAHyR'...
        > exec gh extension list
        [stdout]
        gh extension-uSPkADAHyR gh-acceptance-testing/gh-extension-uSPkADAHyR   df71a476
        > stdout ${ORG}/${REPO}
        # Verify v1 extension behavior before upgrade (0.368s)
        > exec gh extension exec $EXT_NAME
        [stdout]
        gh ext create v1
        > stdout 'gh ext create v1'
        # Setup v2 executable upgrade for extension (1.505s)
        > mv ../v2.sh $EXT_SCRIPT
        > chmod 777 $EXT_SCRIPT
        > exec git add $EXT_SCRIPT
        > exec git commit -m 'Upgrade extension to v2'
        [stdout]
        [master 3da95fb] Upgrade extension to v2
         1 file changed, 1 insertion(+), 2 deletions(-)
        > exec git push -u origin
        [stdout]
        branch 'master' set up to track 'origin/master'.
        [stderr]
        To https://github.com/gh-acceptance-testing/gh-extension-uSPkADAHyR.git
           df71a47..3da95fb  master -> master
        # Verify v2 extension upgrade (1.979s)
        > exec gh extension upgrade $EXT_NAME
        [stdout]
        [extension-uSPkADAHyR]: Updating df71a47..3da95fb
        Fast-forward
         gh-extension-uSPkADAHyR | 3 +--
         1 file changed, 1 insertion(+), 2 deletions(-)
        upgraded from df71a476 to 3da95fb2
        [stderr]
        From https://github.com/gh-acceptance-testing/gh-extension-uSPkADAHyR
           df71a47..3da95fb  master     -> origin/master
        > exec gh extension exec $EXT_NAME
        [stdout]
        gh ext upgrade v2
        > stdout 'gh ext upgrade v2'
        # Verify extension can be removed (0.056s)
        > exec gh extension remove $EXT_NAME
        > ! stdout ${ORG}/${REPO}
        PASS
        
--- PASS: TestExtensions (0.00s)
    --- PASS: TestExtensions/extension (24.71s)
PASS
ok      github.com/cli/cli/v2/acceptance        25.269s

Notes

This is a stacked PR. It targets #14013.

williammartin and others added 3 commits August 4, 2026 11:08
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: 598c3576-22dc-4d7f-a72d-4f84922174a1
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: d5151527-3286-43fd-a420-38f496a076fa
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: 598c3576-22dc-4d7f-a72d-4f84922174a1
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: a237433f-9657-4224-bad4-c4dc1c0fdc31
Copilot AI lite review requested due to automatic review settings August 4, 2026 09:11
@williammartin
williammartin force-pushed the williammartin-route-extension-http branch from 38bd255 to 73eb0a7 Compare August 4, 2026 09:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR continues the effort to consolidate GitHub API interactions behind api.Client by migrating the gh extension command’s repository and release lookup helpers to use api.NewClientFromHTTP(...).REST(...) instead of manually constructing URLs and calling http.Client directly. The intent is to keep user-visible behavior the same while enabling cross-cutting API request behavior in one place.

Changes:

  • Migrates extension lookup helpers (repoExists, hasScript, fetchLatestRelease, fetchReleaseFromTag) to route REST requests through api.Client.
  • Updates existing extension install tests to return JSON for the /contents/... endpoint, matching the real API shape.
  • Adds a new http_test.go file to cover the migrated helpers’ success and error paths.
Show a summary per file
File Description
pkg/cmd/extension/manager_test.go Updates /contents/... stubs to return JSON objects instead of a plain string body.
pkg/cmd/extension/http.go Switches selected helper functions from raw http.Client usage to api.Client.REST, including 404 handling via api.HTTPError.
pkg/cmd/extension/http_test.go Adds unit tests for the migrated helpers’ primary and error behaviors.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 3/3 changed files
  • Comments generated: 2
  • Review effort level: Lite

Comment thread pkg/cmd/extension/http.go Outdated
Comment thread pkg/cmd/extension/http_test.go
williammartin and others added 2 commits August 4, 2026 12:58
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: a237433f-9657-4224-bad4-c4dc1c0fdc31
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: a237433f-9657-4224-bad4-c4dc1c0fdc31
Co-authored-by: Copilot App <[email protected]>
Copilot-Session: a237433f-9657-4224-bad4-c4dc1c0fdc31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Suppressed comments (3)

pkg/cmd/extension/http.go:130

  • The TODO follow-up comment is incomplete (it ends with "constructed" and lacks a period). Finishing the sentence makes the deferred-work rationale clearer.
	// TODO(api-client-rollout)
	// This line of code is part of a mechanical roll out of the api client.
	// As a follow up, consider whether the api client can be injected to this call site, rather than constructed

pkg/cmd/extension/http.go:158

  • The TODO follow-up comment is incomplete (it ends with "constructed" and lacks a period). Please finish the sentence for clarity and consistency.
	// TODO(api-client-rollout)
	// This line of code is part of a mechanical roll out of the api client.
	// As a follow up, consider whether the api client can be injected to this call site, rather than constructed

pkg/cmd/extension/http.go:57

  • The TODO follow-up comment is incomplete (it ends with "constructed" and lacks a period), which makes the intent harder to read later. Please finish the sentence and add consistent punctuation/capitalization.

This issue also appears in the following locations of the same file:

  • line 128
  • line 156
	// TODO(api-client-rollout)
	// This line of code is part of a mechanical roll out of the api client.
	// As a follow up, consider whether the api client can be injected to this call site, rather than constructed
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@williammartin
williammartin force-pushed the williammartin-route-extension-http branch from 9289b7f to 420a538 Compare August 4, 2026 11:32
@williammartin
williammartin marked this pull request as ready for review August 4, 2026 11:33
@williammartin
williammartin requested a review from a team as a code owner August 4, 2026 11:33
@williammartin
williammartin requested a review from tidy-dev August 4, 2026 11:33
Base automatically changed from williammartin-migrate-repo-autolink to trunk August 4, 2026 16:55
@williammartin
williammartin merged commit 0f0e7fd into trunk Aug 4, 2026
32 checks passed
@williammartin
williammartin deleted the williammartin-route-extension-http branch August 4, 2026 16:55
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Aug 21, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [cli/cli](https://github.com/cli/cli) | minor | `v2.97.0` → `v2.98.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>cli/cli (cli/cli)</summary>

### [`v2.98.0`](https://github.com/cli/cli/releases/tag/v2.98.0): GitHub CLI 2.98.0

[Compare Source](cli/cli@v2.97.0...v2.98.0)

#### Security

A security vulnerability has been identified, and fixed, that binds the local forwarded port to all available network interfaces by default.

Users of `gh codespace ports forward` are advised to update `gh` to version `v2.98.0` as soon as possible.

For more information see: <GHSA-vfhh-p7hm-pxfh>

#### Support worktrees in `pr checkout`

Users can now checkout a pull request into a git worktree by using the new `--worktree PATH` flag in `gh pr checkout`:

```shell
gh pr checkout 12 --worktree ../wt-feature
```

#### Add semantic search to `search issues`

The `gh search issues` command now supports semantic search for issues. Users can select the search type by passing the `--search-type` flag:

```shell
gh search issues --search-type semantic ...

gh search issues --search-type hybrid ...
```

For more information about semantic search see: ["Improved Search for github issues is now generally available"](https://github.blog/changelog/2026-04-02-improved-search-for-github-issues-is-now-generally-available/).

#### What's Changed

##### ✨ Features

- Add --worktree flag to gh pr checkout by [@&#8203;tidy-dev](https://github.com/tidy-dev) in [#&#8203;13946](cli/cli#13946)
- Set GH\_EXTENSION=1 when gh invokes an extension by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14072](cli/cli#14072)
- Add --search-type flag for semantic and hybrid issue search by [@&#8203;michaeljacholke](https://github.com/michaeljacholke) in [#&#8203;14006](cli/cli#14006)

##### 🐛 Fixes

- Fix `RESTWithNext` error type, repairing `gh status` and attestation retries by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13988](cli/cli#13988)
- Trim spaces when parsing X-Oauth-Scopes in `gh release create` by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14065](cli/cli#14065)
- Fix project item-add output for non-TTY by [@&#8203;zwick](https://github.com/zwick) in [#&#8203;14056](cli/cli#14056)

##### 📚 Docs & Chores

- Slim down dependabot triage comments by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14019](cli/cli#14019)
- Require explicit MR review ownership by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14028](cli/cli#14028)
- Collapse spam triage into the agentic issue-triage workflow by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14027](cli/cli#14027)
- Run Dependabot triage every hour by [@&#8203;sergiou87](https://github.com/sergiou87) in [#&#8203;14030](cli/cli#14030)
- Route deploy key requests through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13989](cli/cli#13989)
- Route ssh key requests through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13994](cli/cli#13994)
- Route gpg key requests through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13997](cli/cli#13997)
- Route autolink requests through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14013](cli/cli#14013)
- Route extension requests through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14059](cli/cli#14059)
- Route release creation through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14062](cli/cli#14062)
- Tell agents to use the MR template in AGENTS.md by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14074](cli/cli#14074)
- Make Dependabot triage cheaper and more decisive by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14079](cli/cli#14079)
- Route release deletions through api.Client by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14077](cli/cli#14077)
- Give Dependabot triage a real reachability check by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14087](cli/cli#14087)
- Restore automatic spam issue closure by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14088](cli/cli#14088)
- Add a scheduled tech debt burndown skill by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14095](cli/cli#14095)
- Use reflect.Pointer instead of deprecated reflect.Ptr by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14098](cli/cli#14098)
- Clarify what belongs in the MR template's testing section by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14103](cli/cli#14103)
- Rename cli-code-reviewer skill to code-review by [@&#8203;BagToad](https://github.com/BagToad) in [#&#8203;14116](cli/cli#14116)
- Add aw-actions group to dependabot configuration by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;14123](cli/cli#14123)
- Isolate tests from local machine's auth and git configuration by [@&#8203;BagToad](https://github.com/BagToad) in [#&#8203;14128](cli/cli#14128)
- Don't ask for feature detection cleanup comments when not needed by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;14139](cli/cli#14139)
- Accept pre-release tags in deployment validation by [@&#8203;BagToad](https://github.com/BagToad) in [#&#8203;14193](cli/cli#14193)
- ci: add temporary step to verify Linux repo signing keys by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;14202](cli/cli#14202)
- Revert "ci: add temporary step to verify Linux repo signing keys" by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;14203](cli/cli#14203)
- Fix issue triage action compatibility \[skip changelog] by [@&#8203;tidy-dev](https://github.com/tidy-dev) in [#&#8203;14207](cli/cli#14207)

##### :dependabot: Dependencies

- chore(deps): bump github.com/sigstore/sigstore-go from 1.2.2 to 1.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14047](cli/cli#14047)
- chore(deps): bump the codeql-actions group across 1 directory with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14049](cli/cli#14049)
- chore(deps): bump google.golang.org/grpc from 1.82.1 to 1.83.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14048](cli/cli#14048)
- chore(deps): bump github.com/google/go-containerregistry from 0.21.7 to 0.21.8 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14066](cli/cli#14066)
- chore(deps): bump actions/attest from 4.2.1 to 4.2.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14100](cli/cli#14100)
- chore(deps): bump azure/login from 3.0.0 to 3.0.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14101](cli/cli#14101)
- chore(deps): bump the codeql-actions group across 1 directory with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14091](cli/cli#14091)
- chore(deps): bump github/gh-aw-actions/setup-cli from 0.83.4 to 0.85.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14068](cli/cli#14068)
- chore(deps): bump github.com/google/go-containerregistry from 0.21.8 to 0.21.9 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14119](cli/cli#14119)
- chore(deps): bump github.com/klauspost/compress from 1.19.1 to 1.19.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14120](cli/cli#14120)
- chore(deps): bump the aw-actions group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14147](cli/cli#14147)
- chore: sign APT repository with both keys by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;13271](cli/cli#13271)
- chore(deps): bump github.com/yuin/goldmark from 1.8.4 to 1.8.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14029](cli/cli#14029)
- chore(deps): bump actions/attest from 4.2.0 to 4.2.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14050](cli/cli#14050)
- Bump golangci-lint in CI to v2.12.2 by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;14102](cli/cli#14102)
- chore(deps): bump the aw-actions group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14124](cli/cli#14124)
- chore(deps): bump google.golang.org/protobuf from 1.36.11 to 1.36.12 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14140](cli/cli#14140)
- Upgrade gh-aw workflows to v0.85.4 by [@&#8203;tidy-dev](https://github.com/tidy-dev) in [#&#8203;14141](cli/cli#14141)
- Bump Go to 1.26.6 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;14143](cli/cli#14143)
- chore: bump go to 1.26.7 by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;14205](cli/cli#14205)
- chore(deps): bump github.com/stretchr/testify from 1.11.1 to 1.12.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14204](cli/cli#14204)
- chore(deps): bump the codeql-actions group across 1 directory with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14169](cli/cli#14169)
- chore(deps): bump golang.org/x/crypto from 0.54.0 to 0.55.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14164](cli/cli#14164)
- chore(deps): bump charm.land/lipgloss/v2 from 2.0.5 to 2.0.6 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14166](cli/cli#14166)
- Bump gh-aw-actions to v0.87.1 and recompile agentic workflows by [@&#8203;BagToad](https://github.com/BagToad) in [#&#8203;14210](cli/cli#14210)

#### New Contributors

- [@&#8203;sergiou87](https://github.com/sergiou87) made their first contribution in [#&#8203;14030](cli/cli#14030)
- [@&#8203;michaeljacholke](https://github.com/michaeljacholke) made their first contribution in [#&#8203;14006](cli/cli#14006)

**Full Changelog**: <cli/cli@v2.97.0...v2.98.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODguMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants