Repository: apollographql/rover (language: rust)

Issue:
rover dev does not work without APOLLO_KEY since v0.27.0
<!--
  Please fill out each section below, otherwise, your issue may be closed. This info allows Rover maintainers to diagnose (and fix!) your issue as quickly as possible.

  Useful Links:
  - Documentation: https://go.apollo.dev/r/docs

  Before opening a new issue, please search existing issues: https://github.com/apollographql/rover/issues
-->

## Description

Previously rover dev did work without APOLLO_KEY nor config,
```
% rover config list
No profiles found.
Profiles: 

% echo $APOLLO_KEY

```

but v0.27.0 not. There is a workaround which is giving random string with APPOLO_KEY
```
APOLLO_KEY=hoge rover dev  --supergraph-config ./supergraph.yaml --router-config ./config.local.yaml
```

We are wondering whether APOLLO_KEY is required to run rover dev or not at v0.27.0. 

### Steps to reproduce

It dose not work
```
rover dev  --supergraph-config ./supergraph.yaml --router-config ./router/config.local.yaml
```

It dose work
```
APOLLO_KEY=hoge rover dev  --supergraph-config ./supergraph.yaml --router-config ./config.local.yaml
```

### Expected result

rover dev works without APOLLO_KEY.

### Actual result

```
% rover dev --supergraph-port 4000 --supergraph-config ./supergraph.yaml --router-config ./router/config.local.yaml 

** Notice: Changes in This Release! **
This version includes significant updates to the `rover dev` command.
We highly recommend reviewing the updated documentation to ensure a smooth experience.
Read more: https://www.apollographql.com/docs/rover/commands/dev

warning: Do not run this command in production! It is intended for local development only.

error[E020]: No configuration profiles were found, and this command requires one.
        It looks like you may be new here. Welcome! To authenticate with Apollo Studio, run `rover config auth`, or set `$APOLLO_KEY` to a valid Apollo Studio API key.
```

### Environment

```
% rover info
Rover Info:
Version: 0.27.0
Install Location: /Users/ikuto.yata/.rover/bin/rover
OS: Mac OS 15.2.0 [64-bit]
Shell: /bin/zsh
```




Discussion / hints:
Hi @ikuto0608, yer can totally see where this is coming from. Working on a fix now and we should be able to get this out in a new patch release.

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 49bb5e6af..cb340eb23 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ All notable changes to Rover will be documented in this file.
 
 This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-<!-- # [x.x.x] (unreleased) - 2024-mm-dd
+<!-- # [x.x.x] (unreleased) - 2025-mm-dd
 
 > Important: x potentially breaking changes below, indicated by **❗ BREAKING ❗**
 
@@ -18,6 +18,58 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
 
 ## 📚 Documentation -->
 
+# [0.27.1] - 2025-02-17
+
+> **If using Rover with Connectors,** you will need to specify `APOLLO_ROVER_DEV_ROUTER_VERSION=2.0.0-preview.X` when using `rover dev`
+
+## 🐛 Fixes
+
+- **Create output parent directories if they do not already exist - @dotdat PR #2396**
+
+  One small regression with release of v0.27.0 was that if an output directory to `supergraph compose` was specified,
+  but one of the parent directories did not exist, the command would fail. In previous versions the parent directories
+  would be created instead and the command would succeed. This is now corrected and the previous behaviour restored.
+
+- **Clean up how default subgraphs are defined in `rover dev` - @dotdat PR #2397 fixes #2394**
+
+  An issue has been reported where `rover dev` would prompt repeatedly for the subgraph name and URL despite the
+  user having given those values already. This was due to multiple factors, including not accounting for CLI args in 
+  the default case and some faulty other faulty logic. This has now been restored.
+
+- **Refine how composition produces artifacts for targets - @dotdat PR #2398 fixes #2393**
+
+  Due to changes in the `supergraph` binary from 2.9+, writing directly to a file is now supported. However,
+  this feature is not available in earlier versions of `supergraph`. As such Rover should be responsible for 
+  orchestrating how the output from `supergraph` binary ends up in a file, rather than delegating that responsibility
+  to the `supergraph` binary and thus being at the mercy of which version is used. This allowed a further refactor that
+  eliminated complexity around composition outputs.
+
+- **Ensure credentials are checked when needed and not before - @jonathanrainer PR #2400 fixes #2399**
+
+  Due to the `rover dev` refactor there were situations where credentials were being required when they were ultimately 
+  not being used. As such we stopped supporting the use case where no `profile` was defined and no `APOLLO_KEY` env var
+  was provided, which is a very common pattern. This is now corrected.
+
+## 🛠 Maintenance
+
+- **Update `apollographql/router` to v1.60.1 - @jonathanrainer PR #2388**
+- **Update Node.js packages - @jonathanrainer PR #2390**
+
+  Includes `eslint` to v9.20.0 and `prettier` to v3.5.0
+
+- **Update `node` CircleCI orb to v7.1.0 - @jonathanrainer PR #2391**
+- **Pin dependencies - @jonathanrainer PR #2401**
+- **Update Rust and Node.js packages - @jonathanrainer PR #2402**
+
+  Includes `eslint` to v9.20.1, `mockito` to v1.6.1, `node` to v20.18.3 and `prettier` to v3.5.1
+
+- **Update CI node Docker Image to v20.18.3 - @jonathanrainer PR #2403**
+- **Update `mockall` to v0.13.1 - @jonathanrainer PR #24045**
+
+## 📚 Documentation
+
+- **Remove obsolete language from `rover dev --help` - @dylan-apollo PR #2395**
+
 # [0.27.0] - 2025-02-10
 
 > Important: 3 potentially breaking changes below, indicated by **❗ BREAKING ❗**
diff --git a/Cargo.lock b/Cargo.lock
index b923ab794..9a656565c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -184,9 +184,9 @@ dependencies = [
 
 [[package]]
 name = "apollo-federation"
-version = "2.0.0-preview.6"
+version = "2.0.0-rc.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fb3caac3f7ca459562c22a95d9a880f45e1f73ecb50827215884cf814845dbb"
+checksum = "c7197883b68f81e2ba587f9b430f5f3a05b2d91adfe470ea16526de32e27fe77"
 dependencies = [
  "apollo-compiler",
  "derive_more",
@@ -906,9 +906,9 @@ dependencies = [
 
 [[package]]
 name = "bzip2-sys"
-version = "0.1.11+1.0.8"
+version = "0.1.12+1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+checksum = "72ebc2f1a417f01e1da30ef264ee86ae31d2dcd2d603ea283d3c244a883ca2a9"
 dependencies = [
  "cc",
  "libc",
@@ -1001,9 +1001,9 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.2.13"
+version = "1.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda"
+checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9"
 dependencies = [
  "jobserver",
  "libc",
@@ -1079,9 +1079,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.5.28"
+version = "4.5.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff"
+checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -1089,9 +1089,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.5.27"
+version = "4.5.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7"
+checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9"
 dependencies = [
  "anstream",
  "anstyle",
@@ -1437,9 +1437,9 @@ dependencies = [
 
 [[package]]
 name = "csv-core"
-version = "0.1.11"
+version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
+checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d"
 dependencies = [
  "memchr",
 ]
@@ -1770,9 +1770,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
 
 [[package]]
 name = "document-features"
-version = "0.2.10"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
+checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d"
 dependencies = [
  "litrs",
 ]
@@ -1870,9 +1870,9 @@ dependencies = [
 
 [[package]]
 name = "equivalent"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
 
 [[package]]
 name = "errno"
@@ -2731,7 +2731,7 @@ dependencies = [
  "hyper 1.6.0",
  "hyper-util",
  "log",
- "rustls 0.23.22",
+ "rustls 0.23.23",
  "rustls-native-certs 0.8.1",
  "rustls-pki-types",
  "tokio",
@@ -3654,9 +3654,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.8.3"
+version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924"
+checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
 dependencies = [
  "adler2",
 ]
@@ -4040,9 +4040,9 @@ dependencies = [
 
 [[package]]
 name = "openssl"
-version = "0.10.70"
+version = "0.10.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6"
+checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
 dependencies = [
  "bitflags 2.8.0",
  "cfg-if",
@@ -4072,18 +4072,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
 
 [[package]]
 name = "openssl-src"
-version = "300.4.1+3.4.0"
+version = "300.4.2+3.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c"
+checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2"
 dependencies = [
  "cc",
 ]
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.105"
+version = "0.9.106"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc"
+checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
 dependencies = [
  "cc",
  "libc",
@@ -4787,15 +4787,14 @@ dependencies = [
 
 [[package]]
 name = "ring"
-version = "0.17.8"
+version = "0.17.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
+checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24"
 dependencies = [
  "cc",
  "cfg-if",
  "getrandom 0.2.15",
  "libc",
- "spin",
  "untrusted",
  "windows-sys 0.52.0",
 ]
@@ -4827,7 +4826,7 @@ dependencies = [
 
 [[package]]
 name = "rover"
-version = "0.27.0"
+version = "0.27.1"
 dependencies = [
  "anyhow",
  "apollo-federation-types",
@@ -5155,9 +5154,9 @@ dependencies = [
 
 [[package]]
 name = "rustls"
-version = "0.23.22"
+version = "0.23.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7"
+checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395"
 dependencies = [
  "log",
  "once_cell",
@@ -5700,9 +5699,9 @@ dependencies = [
 
 [[package]]
 name = "smallvec"
-version = "1.13.2"
+version = "1.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
 
 [[package]]
 name = "snafu"
@@ -5989,9 +5988,9 @@ dependencies = [
 
 [[package]]
 name = "tempfile"
-version = "3.16.0"
+version = "3.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91"
+checksum = "a40f762a77d2afa88c2d919489e390a12bdd261ed568e60cfa7e48d4e20f0d33"
 dependencies = [
  "cfg-if",
  "fastrand",
@@ -6252,7 +6251,7 @@ version = "0.26.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37"
 dependencies = [
- "rustls 0.23.22",
+ "rustls 0.23.23",
  "tokio",
 ]
 
@@ -6329,9 +6328,9 @@ dependencies = [
 
 [[package]]
 name = "toml_edit"
-version = "0.22.23"
+version = "0.22.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee"
+checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
 dependencies = [
  "indexmap 2.7.1",
  "serde",
@@ -7263,9 +7262,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
 name = "winnow"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f"
+checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603"
 dependencies = [
  "memchr",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 5b9ae3100..cece24d84 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,7 +11,7 @@ license-file = "./LICENSE"
 name = "rover"
 readme = "README.md"
 repository = "https://github.com/apollographql/rover/"
-version = "0.27.0"
+version = "0.27.1"
 default-run = "rover"
 
 publish = false
diff --git a/README.md b/README.md
index ade956e85..f53e36f5f 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ Commands:
   contract
           Contract configuration commands
   dev
-          Combine multiple subgraphs into a local supergraph
+          This command starts a local router that can query across one or more running GraphQL APIs (subgraphs) through one endpoint (supergraph). As you add, edit, and remove subgraphs, `rover dev` automatically composes all of their schemas into a new supergraph schema, and the router reloads
   supergraph
           Supergraph schema commands
   graph
diff --git a/crates/rover-client/.schema/hash.id b/crates/rover-client/.schema/hash.id
index 22c4005ce..f532a7f67 100644
--- a/crates/rover-client/.schema/hash.id
+++ b/crates/rover-client/.schema/hash.id
@@ -1,1 +1,1 @@
-ac90bf0fcaaad6f001ca180cf0a04401c832a545d967c2d7f5708c0f113c55a0
\ No newline at end of file
+d4c8437fc059063f8ccc55acac46df789444a459924796bfae1e1dbfd7904ba6
\ No newline at end of file
diff --git a/crates/rover-client/.schema/schema.graphql b/crates/rover-client/.schema/schema.graphql
index a8d887bf1..49aeb95c1 100644
--- a/crates/rover-client/.schema/schema.graphql
+++ b/crates/rover-client/.schema/schema.graphql
@@ -13,6 +13,9 @@ type Organization {
   """
   id: ID!
 
+  """The user memberships belonging to an Organization"""
+  memberships: [AccountMembership!]
+
   """Name of the organization, which can change over time and isn't unique."""
   name: String!
   auditLogExports: [AuditLogExport!]
@@ -24,7 +27,47 @@ type Organization {
   services(includeDeleted: Boolean): [Graph!]! @deprecated(reason: "Use graphs field instead")
 }
 
+"""An invitation for a user to join an organization."""
+type AccountInvitation {
+  """An accepted invitation cannot be used anymore"""
+  acceptedAt: Timestamp
+
+  """Who accepted the invitation"""
+  acceptedBy: User
+
+  """Time the invitation was created"""
+  createdAt: Timestamp!
+
+  """Who created the invitation"""
+  createdBy: User
+  email: String!
+  id: ID!
+
+  """Last time we sent an email for the invitation"""
+  lastSentAt: Timestamp
+
+  """Access role for the invitee"""
+  role: UserPermission!
+}
+
+"""The membership association between a user and an organization."""
+type AccountMembership {
+  """The timestamp when the user was added to the organization."""
+  createdAt: Timestamp!
+
+  """The user's role within the organization'."""
+  role: UserPermission!
+
+  """The user that belongs to the organization."""
+  user: User!
+}
+
 type OrganizationMutation {
+  """Send an invitation to join the organization by E-mail"""
+  invite(email: String!, role: UserPermission): AccountInvitation
+
+  """Update a user's role within an organization"""
+  updateUserRole(role: UserPermission!, userID: ID!): User
   createGraph(graphType: GraphType!, hiddenFromUninvitedNonAdmin: Boolean!, id: ID!, title: String!, variantCreationConfig: VariantCreationConfig): GraphCreationResult!
 
   """Trigger a request for an audit export"""
@@ -1973,6 +2016,9 @@ type GraphVariant {
   """
   contractFilterConfigDescription: String
 
+  """Federation version this variant uses"""
+  federationVersion: String
+
   """Represents whether this variant is a Proposal."""
   isProposal: Boolean
 
@@ -2003,6 +2049,39 @@ type GraphVariant {
   """
   sourceVariant: GraphVariant
 
+  """
+  Returns a list of the top operations reported for this variant within a given time range.
+  
+  Note: Access to this field is restricted and not enabled by default. Please contact Apollo support if you require access.
+  """
+  topOperationsReport(
+    """Optional filters to refine the results"""
+    filter: TopOperationsReportVariantFilterInput
+
+    """
+    The starting timestamp for the report.
+    
+    - Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).
+    - The duration between 'from' and 'to' must not exceed 8 days.
+    """
+    from: Timestamp!
+
+    """Maximum number of records to return (default: 10)"""
+    limit: Int! = 10
+
+    """Sorting criteria for the report"""
+    orderBy: TopOperationsReportOrderByInput
+
+    """
+    The ending timestamp for the report.
+    
+    - Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).
+    - 'to' must be at least 6 hours from the current time.
+    - The duration between 'from' and 'to' must not exceed 8 days.
+    """
+    to: Timestamp!
+  ): [TopOperationRecord!]!
+
   """
   A list of the saved [operation collections](https://www.apollographql.com/docs/studio/explorer/operation-collections/) associated with this variant.
   """
@@ -2251,6 +2330,11 @@ type GraphVariantMutation {
   Unlinks a specified PersistedQueryList from the variant of the parent GraphVariantMutation.
   """
   unlinkPersistedQueryList: UnlinkPersistedQueryListResultOrError!
+
+  """
+  Provides access to mutation fields for modifying a GraphOS Schema Proposals with the provided ID. Learn more at https://www.apollographql.com/docs/graphos/delivery/schema-proposals
+  """
+  proposal: ProposalMutationResult!
   updateURL(url: String): GraphVariant
 
   """Delete the variant."""
@@ -3025,6 +3109,11 @@ input MultiSubgraphCheckAsyncInput {
 
 """GraphQL mutations"""
 type Mutation {
+  """
+  Provides access to mutation fields for modifying a an organization with the provided ID.
+  """
+  organization(id: ID!): OrganizationMutation
+
   """
   Provides access to mutation fields for modifying an Apollo user with the
   provided ID.
@@ -3069,7 +3158,7 @@ type Mutation {
   """
   Provides access to mutation fields for modifying a GraphOS Schema Proposals with the provided ID. Learn more at https://www.apollographql.com/docs/graphos/delivery/schema-proposals
   """
-  proposal(id: ID!): ProposalMutationResult!
+  proposal(id: ID!): ProposalMutationResult! @deprecated(reason: "Use GraphVariantMutation.proposal instead")
 }
 
 """
@@ -3546,6 +3635,11 @@ type Order {
   router: Router!
 }
 
+enum Ordering {
+  ASCENDING
+  DESCENDING
+}
+
 """Return an Order or an error"""
 union OrderOrError = Order
 
@@ -4832,6 +4926,12 @@ type Graph implements Identity {
   """Get a check workflow for this graph by its ID"""
   checkWorkflow(id: ID!): CheckWorkflow
 
+  """
+  When this is true, this graph will be hidden from non-admin members of the org who haven't been explicitly assigned a
+  role on this graph.
+  """
+  hiddenFromUninvitedNonAdminAccountMembers: Boolean!
+
   """
   A list of the proposal variants for this graph sorted by created at date.
   limit defaults to Int.MAX_VALUE, offset defaults to 0
@@ -4907,6 +5007,17 @@ type GraphMutation {
   """
   renameKey(id: ID!, newKeyName: String): GraphApiKey
 
+  """
+  Soft delete a graph. Data associated with the graph is not permanently deleted; Apollo support can undo.
+  """
+  delete: Void
+
+  """Undelete a soft deleted graph."""
+  undelete: Graph
+
+  """Update hiddenFromUninvitedNonAdminAccountMembers"""
+  updateHiddenFromUninvitedNonAdminAccountMembers(hiddenFromUninvitedNonAdminAccountMembers: Boolean!): Graph
+
   """
   Creates a contract schema from a source variant and a set of filter configurations
   """
@@ -5053,6 +5164,52 @@ type GraphMutation {
     """
     introspectionEndpoint: String
   ): CheckPartialSchemaResult! @deprecated(reason: "Use GraphVariant.submitSubgraphCheckAsync instead.\nThis mutation polls to wait for the check to finish,\nwhile subgraphSubgraphCheckAsync triggers returns\nwithout waiting for the check to finish.")
+
+  """Update schema check configuration for a graph."""
+  updateCheckConfiguration(
+    """Operations to ignore during validation."""
+    excludedOperations: [ExcludedOperationInput!]
+
+    """Clients to ignore during validation."""
+    excludedClients: [ClientFilterInput!]
+
+    """Operation names to ignore during validation."""
+    excludedOperationNames: [OperationNameFilterInput!]
+
+    """Variant overrides for validation."""
+    includedVariants: [String!]
+
+    """
+    Only check operations from the last <timeRangeSeconds> seconds. The default is 7 days (604,800 seconds).
+    """
+    timeRangeSeconds: Long
+
+    """
+    Minimum number of requests within the window for a query to be considered.
+    """
+    operationCountThreshold: Int
+
+    """
+    Number of requests within the window for a query to be considered, relative to
+    total request count. Expected values are between 0 and 0.05 (minimum 5% of
+    total request volume)
+    """
+    operationCountThresholdPercentage: Float
+
+    """Default configuration to include operations on the base variant."""
+    includeBaseVariant: Boolean
+
+    """Whether to run Linting during schema checks."""
+    enableLintChecks: Boolean
+
+    """
+    How submitted build input diffs are handled when they don't match a Proposal
+    """
+    proposalChangeMismatchSeverity: ProposalChangeMismatchSeverity @deprecated(reason: "Graph-level configuration is no longer supported")
+    downgradeStaticChecks: Boolean
+    downgradeDefaultValueChange: Boolean
+    enableCustomChecks: Boolean
+  ): CheckConfiguration!
 }
 
 """
@@ -5296,6 +5453,60 @@ ISO 8601, extended format with nanoseconds, Zulu (or "[+-]seconds" as a string o
 """
 scalar Timestamp
 
+type TopOperationRecord {
+  """The graph this operation was reported from."""
+  graphId: String!
+
+  """The graph variant this operation was reported from."""
+  graphVariant: String!
+
+  """The operation name or null if the operation is unnamed."""
+  name: String
+
+  """The unique id for this operation."""
+  operationId: String!
+
+  """
+  The total number of requests for this operation for the specified time range.
+  """
+  requestCount: Long!
+
+  """
+  The operation's signature body or null if the signature is unavailable due to parse errors.
+  """
+  signature: String
+
+  """
+  The operation type or null if the operation type could not be determined from the signature.
+  """
+  type: OperationType
+}
+
+enum TopOperationsReportOrderByColumn {
+  REQUEST_COUNT
+}
+
+input TopOperationsReportOrderByInput {
+  """
+  The order column used for the operation results. Defaults to ordering by total request count.
+  """
+  column: TopOperationsReportOrderByColumn!
+
+  """
+  The direction used to order operation results. Defaults to descending order.
+  """
+  direction: Ordering!
+}
+
+input TopOperationsReportVariantFilterInInput {
+  clientName: [String]
+  clientVersion: [String]
+}
+
+input TopOperationsReportVariantFilterInput {
+  in: TopOperationsReportVariantFilterInInput!
+}
+
 """Counts of changes."""
 type TotalChangeSummaryCounts {
   """
@@ -5444,13 +5655,21 @@ type UserMembership {
   createdAt: Timestamp!
 
   """The user's permission level within the organization."""
-  permission: UserPermission!
+  permission: UserPermission! @deprecated(reason: "Use role instead.")
+
+  """The user's role within the organization'."""
+  role: UserPermission!
 
   """The user that belongs to the organization."""
   user: User!
 }
 
 type UserMutation {
+  """
+  Hard deletes the associated user. Throws an error otherwise with reason included.
+  """
+  hardDelete: Void
+
   """Creates a new user API key for this user."""
   newKey(keyName: String!): UserApiKey!
 
diff --git a/crates/rover-client/package-lock.json b/crates/rover-client/package-lock.json
index 596e11e9c..7bc9ddc76 100644
--- a/crates/rover-client/package-lock.json
+++ b/crates/rover-client/package-lock.json
@@ -58,23 +58,22 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz",
-      "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
+      "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.8",
+        "@babel/generator": "^7.26.9",
         "@babel/helper-compilation-targets": "^7.26.5",
         "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helpers": "^7.26.7",
-        "@babel/parser": "^7.26.8",
-        "@babel/template": "^7.26.8",
-        "@babel/traverse": "^7.26.8",
-        "@babel/types": "^7.26.8",
-        "@types/gensync": "^1.0.0",
+        "@babel/helpers": "^7.26.9",
+        "@babel/parser": "^7.26.9",
+        "@babel/template": "^7.26.9",
+        "@babel/traverse": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -90,14 +89,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz",
-      "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
+      "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.8",
-        "@babel/types": "^7.26.8",
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -196,27 +195,27 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
-      "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
+      "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.7"
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
-      "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+      "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.8"
+        "@babel/types": "^7.26.9"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -242,32 +241,32 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz",
-      "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+      "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/parser": "^7.26.8",
-        "@babel/types": "^7.26.8"
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz",
-      "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
+      "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.8",
-        "@babel/parser": "^7.26.8",
-        "@babel/template": "^7.26.8",
-        "@babel/types": "^7.26.8",
+        "@babel/generator": "^7.26.9",
+        "@babel/parser": "^7.26.9",
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -276,9 +275,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
-      "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
+      "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -392,9 +391,9 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
-      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
+      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -475,6 +474,19 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
+      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@graphql-eslint/eslint-plugin": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/@graphql-eslint/eslint-plugin/-/eslint-plugin-4.3.0.tgz",
@@ -510,13 +522,13 @@
       }
     },
     "node_modules/@graphql-tools/batch-execute": {
-      "version": "9.0.11",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.11.tgz",
-      "integrity": "sha512-v9b618cj3hIrRGTDrOotYzpK+ZigvNcKdXK3LNBM4g/uA7pND0d4GOnuOSBQGKKN6kT/1nsz4ZpUxCoUvWPbzg==",
+      "version": "9.0.12",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.12.tgz",
+      "integrity": "sha512-AUKU/KLez9LvBFh8Uur4h5n2cKrHnBFADKyHWMP7/dAuG6vzFES047bYsKQR2oWhzO26ucQMVBm9GGw1+VCv8A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/utils": "^10.7.0",
+        "@graphql-tools/utils": "^10.8.1",
         "dataloader": "^2.2.3",
         "tslib": "^2.8.1"
       },
@@ -528,14 +540,14 @@
       }
     },
     "node_modules/@graphql-tools/code-file-loader": {
-      "version": "8.1.14",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.14.tgz",
-      "integrity": "sha512-vNm67L1Xnxbg+TGls/X3LNMlNxzslXQ2cRJZVCFPtWeu8NMXRDBPA8+vH+3gVtpjlF5FJ/3+Q6rTuJxAjo/TPQ==",
+      "version": "8.1.15",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.15.tgz",
+      "integrity": "sha512-XlrzWfuoBRfpx/5Uw8VBP5rmMJyQVv8HMd6k/7TxFT/cXU34rcQfmRk6f3J7gD5+3ueqgwPcmaIn3CRp+Z0r0w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/graphql-tag-pluck": "8.3.13",
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/graphql-tag-pluck": "8.3.14",
+        "@graphql-tools/utils": "^10.8.1",
         "globby": "^11.0.3",
         "tslib": "^2.4.0",
         "unixify": "^1.0.0"
@@ -548,16 +560,16 @@
       }
     },
     "node_modules/@graphql-tools/delegate": {
-      "version": "10.2.11",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.11.tgz",
-      "integrity": "sha512-eLqczQkDlSHpz0foBWfjISSsHiedMOBz4spaa1ako1eM4bX9VxQa/HWQuMK8dmAf8By+F47OzvLUNa03Aq6vXw==",
+      "version": "10.2.13",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.13.tgz",
+      "integrity": "sha512-FpxbNZ5OA3LYlU1CFMlHvNLyBgSKlDu/D1kffVbd4PhY82F6YnKKobAwwwA8ar8BhGOIf+XGw3+ybZa0hZs7WA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/batch-execute": "^9.0.11",
+        "@graphql-tools/batch-execute": "^9.0.12",
         "@graphql-tools/executor": "^1.3.10",
         "@graphql-tools/schema": "^10.0.11",
-        "@graphql-tools/utils": "^10.7.0",
+        "@graphql-tools/utils": "^10.8.1",
         "@repeaterjs/repeater": "^3.0.6",
         "dataloader": "^2.2.3",
         "dset": "^3.1.2",
@@ -571,13 +583,13 @@
       }
     },
     "node_modules/@graphql-tools/executor": {
-      "version": "1.3.13",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.3.13.tgz",
-      "integrity": "sha512-4aRat1dUv3jQIhRRXPQwnyVFaCNsDjnYV/JhxgUjhvk1Eo3cyW0sNKgERvMNzo6/v0OPGDpNAPdTD8Alv7p9qg==",
+      "version": "1.3.14",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.3.14.tgz",
+      "integrity": "sha512-tDk8bYIgbVmGNh7cYewi5/yNCq6UoVl9ugDU4rF//+E1R5TxkXNe9nu6AonE+j6XkA/z+FofVawOqCCiJhJ40g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/utils": "^10.8.1",
         "@graphql-typed-document-node/core": "^3.2.0",
         "@repeaterjs/repeater": "^3.0.4",
         "@whatwg-node/disposablestack": "^0.0.5",
@@ -592,14 +604,14 @@
       }
     },
     "node_modules/@graphql-tools/executor-common": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.1.tgz",
-      "integrity": "sha512-Gan7uiQhKvAAl0UM20Oy/n5NGBBDNm+ASHvnYuD8mP+dAH0qY+2QMCHyi5py28WAlhAwr0+CAemEyzY/ZzOjdQ==",
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.2.tgz",
+      "integrity": "sha512-FD3QYYzypurGESKJ9vjKXmsmC3UuZEghHcADSGGW8NcZB66vNN557zdJ3+lwVSdYuIjiyXhyLVp1mn59w2eMQQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@envelop/core": "^5.0.2",
-        "@graphql-tools/utils": "^10.7.0"
+        "@graphql-tools/utils": "^10.8.1"
       },
       "engines": {
         "node": ">=18.0.0"
@@ -609,14 +621,14 @@
       }
     },
     "node_modules/@graphql-tools/executor-graphql-ws": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.1.tgz",
-      "integrity": "sha512-TqdNLuDuLgaB8xOe+H4+3Sx9jyhRMpEwJTA+5MOvrMRPIPYW4P7w4KYouClS1zAmn4193pNRSt11lZptjIoLPw==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.2.tgz",
+      "integrity": "sha512-P5Z8K9h4H/eNMgMMZ9gQmRDYCb2yMERc+Eaag3EJ0ifeBXZS54uhAFB3All/YzY6zy0B8BUzjHb+w+/Zan6XOg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/executor-common": "^0.0.1",
-        "@graphql-tools/utils": "^10.7.0",
+        "@graphql-tools/executor-common": "^0.0.2",
+        "@graphql-tools/utils": "^10.8.1",
         "@whatwg-node/disposablestack": "^0.0.5",
         "graphql-ws": "^6.0.3",
         "isomorphic-ws": "^5.0.0",
@@ -631,14 +643,14 @@
       }
     },
     "node_modules/@graphql-tools/executor-http": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.2.6.tgz",
-      "integrity": "sha512-D+gcyDlqKFiwVEubf9HxNijG7LAck0ApXypv/oBzBIOt7avy+PkNopcjSikxy0BvxkIfyjaAtnYlmgf4kC6Y8g==",
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.2.7.tgz",
+      "integrity": "sha512-2zPcin33Ea3GlU2p6enn2ByGh1+nfivbI2+TJLROUByjfseTH6IuAiBK0R7p0ajQevysYQw2Gh+749i4RFA3WA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/executor-common": "^0.0.1",
-        "@graphql-tools/utils": "^10.7.0",
+        "@graphql-tools/executor-common": "^0.0.2",
+        "@graphql-tools/utils": "^10.8.1",
         "@repeaterjs/repeater": "^3.0.4",
         "@whatwg-node/disposablestack": "^0.0.5",
         "@whatwg-node/fetch": "^0.10.1",
@@ -655,13 +667,13 @@
       }
     },
     "node_modules/@graphql-tools/executor-legacy-ws": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.11.tgz",
-      "integrity": "sha512-Iiy34ZSdqn2XCPwcopCXxs1MrpJvsZkPlEdGs2/kyhwDmKCsc50cGmXaktyvfVvOhJWdMzePBtXyOFfhlf7g7w==",
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.12.tgz",
+      "integrity": "sha512-thZTsx4rGbekMdJxpv0r4ettUsGRpkhSx1z86bn/WEAItn2GjPL/lR508OtP8o/BHFGrQOEIURhwtSpetdINGA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/utils": "^10.8.1",
         "@types/ws": "^8.0.0",
         "isomorphic-ws": "^5.0.0",
         "tslib": "^2.4.0",
@@ -675,14 +687,14 @@
       }
     },
     "node_modules/@graphql-tools/graphql-file-loader": {
-      "version": "8.0.13",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.13.tgz",
-      "integrity": "sha512-eJJsYld43I6XYTLzGvHVIVg7w3yx3oPcbG3oq5mZdZnARQ12FSgWgqUKqVOdEbVK74Kw4BG/CpVOLcTD/nUKxQ==",
+      "version": "8.0.14",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.14.tgz",
+      "integrity": "sha512-Mlcd8u1u6WMRgvvERKfFRL0txTLKtmbmq0x8DzIZ7BACrYCv2rwtV79J51LbFUNBO6cMzu8rzoxTneqYm6dRNg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/import": "7.0.12",
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/import": "7.0.13",
+        "@graphql-tools/utils": "^10.8.1",
         "globby": "^11.0.3",
         "tslib": "^2.4.0",
         "unixify": "^1.0.0"
@@ -695,9 +707,9 @@
       }
     },
     "node_modules/@graphql-tools/graphql-tag-pluck": {
-      "version": "8.3.13",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.13.tgz",
-      "integrity": "sha512-U9rd24TAMjz37siV8mSgiOYqxCrX2u6v1wkrZII/+hDiL7BoawHC7Xz2Q+72mAeZTYdsqLJQ4LzjsiB2faoFGw==",
+      "version": "8.3.14",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.14.tgz",
+      "integrity": "sha512-dRo5f5/VwLI8bHRfgxl0q11fGFB/K+0/8Z8goPRQOT/Olik1RYnHVPhnK5BGSTLAMVpE3E7F+5jntkXLmuHuRA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -706,7 +718,7 @@
         "@babel/plugin-syntax-import-assertions": "^7.20.0",
         "@babel/traverse": "^7.16.8",
         "@babel/types": "^7.16.8",
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/utils": "^10.8.1",
         "tslib": "^2.4.0"
       },
       "engines": {
@@ -717,13 +729,13 @@
       }
     },
     "node_modules/@graphql-tools/import": {
-      "version": "7.0.12",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.12.tgz",
-      "integrity": "sha512-vnvrCFyPtccNQujftnsfTLV0JFJhLKSpEi1+xkYiXp/DJxh1ua06sw2+/o+0trmxtoWDJviv21cnNpyskWXx0Q==",
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.13.tgz",
+      "integrity": "sha512-END2Bg0bvLnXDHi8WUbD7xrnf8komlIkKMOzSexFLeGpEYPlMsBOM6m0RW31Zk8zdN01gLPAyyT4tQXSIzCGIw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/utils": "^10.8.1",
         "resolve-from": "5.0.0",
         "tslib": "^2.4.0"
       },
@@ -735,13 +747,13 @@
       }
     },
     "node_modules/@graphql-tools/json-file-loader": {
-      "version": "8.0.12",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.12.tgz",
-      "integrity": "sha512-1p9db6p0Fs0bJoWM9Pn/G6BCDxJ1eiqTOe+B0O/49+7dpcx8GEQ0m+R6k2OSG5PD1g9+3+nKT9gKHVB/S6sDYg==",
+      "version": "8.0.13",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.13.tgz",
+      "integrity": "sha512-T8s05fcWvwkB9iM77RQ8WBGylkzZQ+aFzYZabg51jXvusiXWLCN3BSKPsEvSPpb3Y7JJBAK4e+Hu7UmZxqolkA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/utils": "^10.8.1",
         "globby": "^11.0.3",
         "tslib": "^2.4.0",
         "unixify": "^1.0.0"
@@ -754,14 +766,14 @@
       }
     },
     "node_modules/@graphql-tools/load": {
-      "version": "8.0.13",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.13.tgz",
-      "integrity": "sha512-gWn2tiyF/LU53aeLvJbuYHjZpExaDnj7PEuwE415x/Rzgjsa415c6p0xHhagHdlNF3oq5B67FKCvdbOtmoPQNg==",
+      "version": "8.0.14",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.14.tgz",
+      "integrity": "sha512-ECdc/hoSs455B6ksO25mEK/FWDPQqWXQ5aMUgjqaApiPasipOfdsZEINHc8ikm/T+hF++/h6+9PDJNsIideWuQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/schema": "^10.0.17",
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/schema": "^10.0.18",
+        "@graphql-tools/utils": "^10.8.1",
         "p-limit": "3.1.0",
         "tslib": "^2.4.0"
       },
@@ -773,13 +785,13 @@
       }
     },
     "node_modules/@graphql-tools/merge": {
-      "version": "9.0.18",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.18.tgz",
-      "integrity": "sha512-KFUj976w2egCM1huOstonTCnyeFwvPEK9jeIgDRawKF9Um0VO6E1jdfVry3lbP71hT5i9LMbRRhN/UPI0ZGoQA==",
+      "version": "9.0.19",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.19.tgz",
+      "integrity": "sha512-iJP3Xke+vgnST58A1Q/1+y3bzfbYalIMnegUNupYHNvHHSE0PXoq8YieqQF8JYzWVACMxiq/M4Y1vW75mS2UVg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/utils": "^10.8.1",
         "tslib": "^2.4.0"
       },
       "engines": {
@@ -790,14 +802,14 @@
       }
     },
     "node_modules/@graphql-tools/schema": {
-      "version": "10.0.17",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.17.tgz",
-      "integrity": "sha512-7WIKZvhuELcgEk+Gv+jVPVOqkeFYTQ1tgfdldzu1kBXVK/uAtil3Xt6EoPYgLBpI0QIY7801nubvW7N78wcjMQ==",
+      "version": "10.0.18",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.18.tgz",
+      "integrity": "sha512-6j2O/07v1zbGvASizMSO7YZdGt/9HfPDx8s9n75sD2xoGfeJ2aRSmI4LkyuvqOpi0ecaa9xErnMEEvUaKBqMbw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/merge": "^9.0.18",
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/merge": "^9.0.19",
+        "@graphql-tools/utils": "^10.8.1",
         "tslib": "^2.4.0"
       },
       "engines": {
@@ -808,16 +820,16 @@
       }
     },
     "node_modules/@graphql-tools/url-loader": {
-      "version": "8.0.25",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.25.tgz",
-      "integrity": "sha512-8SstnWQCN3gXfsX5z8bZtLXElZm55e84hzaJxB+iJCz8Q8jt+cikHlBXc7y0buG5t/fPeaGht2X5QsBMMEi73w==",
+      "version": "8.0.26",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.26.tgz",
+      "integrity": "sha512-oX8WWpiHHhLvxYUoo0QVN0Jjn2x2Tx9EvfccH+r7Mmgr4QpDU+t5Kpzr7qCRt9kO1SNW1ns1MeiXVWXPjoT6MQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@graphql-tools/executor-graphql-ws": "^2.0.1",
         "@graphql-tools/executor-http": "^1.1.9",
-        "@graphql-tools/executor-legacy-ws": "^1.1.11",
-        "@graphql-tools/utils": "^10.8.0",
+        "@graphql-tools/executor-legacy-ws": "^1.1.12",
+        "@graphql-tools/utils": "^10.8.1",
         "@graphql-tools/wrap": "^10.0.16",
         "@types/ws": "^8.0.0",
         "@whatwg-node/fetch": "^0.10.0",
@@ -834,9 +846,9 @@
       }
     },
     "node_modules/@graphql-tools/utils": {
-      "version": "10.8.0",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.0.tgz",
-      "integrity": "sha512-c773cf9g3aLWWc8BjZs0VacBVjpq9kINpT0pxv9OvuxoxZVpgUSHnOCaJyTihs2AdR14fcKC9GjseEogUvgmvQ==",
+      "version": "10.8.1",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.1.tgz",
+      "integrity": "sha512-fI5NNuqeEAHyp7NuCDjvxWR5PTUXM4AqY9BoC59ZcX4nePAJje27ZsFHbAMS6EKDosY1K/D4ADxsO0P5+FH07A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -853,15 +865,15 @@
       }
     },
     "node_modules/@graphql-tools/wrap": {
-      "version": "10.0.29",
-      "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.29.tgz",
-      "integrity": "sha512-kQdosPBo6EvFhQV5s0XpN6+N0YN+31mCZTV7uwZisaUwwroAT19ujs2Zxz8Zyw4H9XRCsueLT0wqmSupjIFibQ==",
+      "version": "10.0.31",
+      "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.31.tgz",
+      "integrity": "sha512-W4sPLcvc4ZAPLpHifZQJQabL6WoXyzUWMh4n/NwI8mXAJrU4JAKKbJqONS8WC31i0gN+VCkBaSwssgbtbUz1Qw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@graphql-tools/delegate": "^10.2.11",
+        "@graphql-tools/delegate": "^10.2.13",
         "@graphql-tools/schema": "^10.0.11",
-        "@graphql-tools/utils": "^10.7.0",
+        "@graphql-tools/utils": "^10.8.1",
         "tslib": "^2.8.1"
       },
       "engines": {
@@ -1052,13 +1064,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@types/gensync": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz",
-      "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -1067,9 +1072,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.13.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
-      "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+      "version": "22.13.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz",
+      "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1114,9 +1119,9 @@
       }
     },
     "node_modules/@whatwg-node/node-fetch": {
-      "version": "0.7.8",
-      "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.8.tgz",
-      "integrity": "sha512-Pbv72nbu3AgL9ZaAwdzYcqoMhYGhSBxo49CC+Nt+tlhdDuMZXcf3+41qGghsGJykkxhgfgFcPLwtt2HPEjk57w==",
+      "version": "0.7.9",
+      "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.9.tgz",
+      "integrity": "sha512-rp4/lzxK5DDxFFdXcCR3gG4OyWPHqmN1GrKostx2NEy7sHUQA/B3j0M2z+qfMQVg5SC4RRm0eFwD73e+GgAM3A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1298,9 +1303,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001699",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
-      "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+      "version": "1.0.30001700",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
+      "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
       "dev": true,
       "funding": [
         {
@@ -1490,9 +1495,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.96",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz",
-      "integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==",
+      "version": "1.5.101",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz",
+      "integrity": "sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA==",
       "dev": true,
       "license": "ISC"
     },
@@ -1619,19 +1624,6 @@
         "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint/node_modules/@eslint/core": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
-      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
     "node_modules/espree": {
       "version": "10.3.0",
       "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
@@ -2010,9 +2002,9 @@
       }
     },
     "node_modules/graphql-ws": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.3.tgz",
-      "integrity": "sha512-mvLRHihMg0llF74vo16063HufZHMGaiMxAjzyj0ARYueIikGzj1khlbPNl7vUc2h9rxbq9pGpQYbqypgq1fAXA==",
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.4.tgz",
+      "integrity": "sha512-8b4OZtNOvv8+NZva8HXamrc0y1jluYC0+13gdh7198FKjVzXyTvVc95DCwGzaKEfn3YuWZxUqjJlHe3qKM/F2g==",
       "dev": true,
       "license": "MIT",
       "engines": {
diff --git a/docs/source/ci-cd.mdx b/docs/source/ci-cd.mdx
index 19d811fc9..9a506bbeb 100644
--- a/docs/source/ci-cd.mdx
+++ b/docs/source/ci-cd.mdx
@@ -51,7 +51,7 @@ jobs:
           name: Install
           command: |
             # download and install Rover
-            curl -sSL https://rover.apollo.dev/nix/v0.27.0 | sh
+            curl -sSL https://rover.apollo.dev/nix/v0.27.1 | sh
 
             # This allows the PATH changes to persist to the next `run` step
             echo 'export PATH=$HOME/.rover/bin:$PATH' >> $BASH_ENV
@@ -125,7 +125,7 @@ jobs:
 
       - name: Install Rover
         run: |
-          curl -sSL https://rover.apollo.dev/nix/v0.27.0 | sh
+          curl -sSL https://rover.apollo.dev/nix/v0.27.1 | sh
 
           # Add Rover to the $GITHUB_PATH so it can be used in another step
           # https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#adding-a-system-path
@@ -219,7 +219,7 @@ To avoid this issue, do one of the following:
 - Download the latest release via cURL and extract the binary like so (this downloads Rover `0.27.0` for Linux x86 architectures):
 
     ```
-    curl -L https://github.com/apollographql/rover/releases/download/v0.27.0/rover-v0.27.0-x86_64-unknown-linux-gnu.tar.gz | tar --strip-components=1 -zxv
+    curl -L https://github.com/apollographql/rover/releases/download/v0.27.1/rover-v0.27.1-x86_64-unknown-linux-gnu.tar.gz | tar --strip-components=1 -zxv
     ```
 
 #### Permission issues
diff --git a/docs/source/getting-started.mdx b/docs/source/getting-started.mdx
index af32f9b4c..80a57196c 100644
--- a/docs/source/getting-started.mdx
+++ b/docs/source/getting-started.mdx
@@ -20,7 +20,7 @@ To install a **specific version** of Rover (recommended for CI environments to e
 
 ```bash
 # Note the `v` prefixing the version number
-curl -sSL https://rover.apollo.dev/nix/v0.27.0 | sh
+curl -sSL https://rover.apollo.dev/nix/v0.27.1 | sh
 ```
 
 If your machine doesn't have the `curl` command, you can get the latest version from the [`curl` downloads page](https://curl.se/download.html).
@@ -43,7 +43,7 @@ To install a **specific version** of Rover (recommended for CI environments to e
 
 ```bash
 # Note the `v` prefixing the version number
-iwr 'https://rover.apollo.dev/win/v0.27.0' | iex
+iwr 'https://rover.apollo.dev/win/v0.27.1' | iex
 ```
 
 #### Installing from a binary mirror using the bash and PowerShell scripts
diff --git a/installers/binstall/scripts/nix/install.sh b/installers/binstall/scripts/nix/install.sh
index 13042862b..d1234ccbd 100755
--- a/installers/binstall/scripts/nix/install.sh
+++ b/installers/binstall/scripts/nix/install.sh
@@ -20,7 +20,7 @@ BINARY_DOWNLOAD_PREFIX="${APOLLO_ROVER_BINARY_DOWNLOAD_PREFIX:="https://github.c
 # Rover version defined in root cargo.toml
 # Note: this line is built automatically
 # in build.rs. Don't touch it!
-PACKAGE_VERSION="v0.27.0"
+PACKAGE_VERSION="v0.27.1"
 
 download_binary_and_run_installer() {
     downloader --check
diff --git a/installers/binstall/scripts/windows/install.ps1 b/installers/binstall/scripts/windows/install.ps1
index a9ac0433e..b6e93d24e 100644
--- a/installers/binstall/scripts/windows/install.ps1
+++ b/installers/binstall/scripts/windows/install.ps1
@@ -14,7 +14,7 @@
 # version found in Rover's Cargo.toml
 # Note: this line is built automatically
 # in build.rs. Don't touch it!
-$package_version = 'v0.27.0'
+$package_version = 'v0.27.1'
 
 function Install-Binary($rover_install_args) {
   $old_erroractionpreference = $ErrorActionPreference
diff --git a/installers/npm/package-lock.json b/installers/npm/package-lock.json
index be4ace551..2ec5486b5 100644
--- a/installers/npm/package-lock.json
+++ b/installers/npm/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "@apollo/rover",
-  "version": "0.27.0",
+  "version": "0.27.1",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "@apollo/rover",
-      "version": "0.27.0",
+      "version": "0.27.1",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
@@ -70,23 +70,22 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz",
-      "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
+      "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.8",
+        "@babel/generator": "^7.26.9",
         "@babel/helper-compilation-targets": "^7.26.5",
         "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helpers": "^7.26.7",
-        "@babel/parser": "^7.26.8",
-        "@babel/template": "^7.26.8",
-        "@babel/traverse": "^7.26.8",
-        "@babel/types": "^7.26.8",
-        "@types/gensync": "^1.0.0",
+        "@babel/helpers": "^7.26.9",
+        "@babel/parser": "^7.26.9",
+        "@babel/template": "^7.26.9",
+        "@babel/traverse": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -102,14 +101,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz",
-      "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
+      "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.8",
-        "@babel/types": "^7.26.8",
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -208,27 +207,27 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
-      "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
+      "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.7"
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
-      "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+      "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.8"
+        "@babel/types": "^7.26.9"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -477,32 +476,32 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz",
-      "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+      "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/parser": "^7.26.8",
-        "@babel/types": "^7.26.8"
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz",
-      "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
+      "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.8",
-        "@babel/parser": "^7.26.8",
-        "@babel/template": "^7.26.8",
-        "@babel/types": "^7.26.8",
+        "@babel/generator": "^7.26.9",
+        "@babel/parser": "^7.26.9",
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -511,9 +510,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
-      "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
+      "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1093,13 +1092,6 @@
         "@babel/types": "^7.20.7"
       }
     },
-    "node_modules/@types/gensync": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz",
-      "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/graceful-fs": {
       "version": "4.1.9",
       "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
@@ -1138,9 +1130,9 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "22.13.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
-      "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+      "version": "22.13.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz",
+      "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1471,6 +1463,19 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -1492,9 +1497,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001699",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
-      "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+      "version": "1.0.30001700",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
+      "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
       "dev": true,
       "funding": [
         {
@@ -1800,6 +1805,20 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/eastasianwidth": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -1816,9 +1835,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.96",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz",
-      "integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==",
+      "version": "1.5.101",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz",
+      "integrity": "sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA==",
       "dev": true,
       "license": "ISC"
     },
@@ -1851,6 +1870,51 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/escalade": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -2035,13 +2099,14 @@
       }
     },
     "node_modules/form-data": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
-      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+      "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
       "license": "MIT",
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
         "mime-types": "^2.1.12"
       },
       "engines": {
@@ -2074,7 +2139,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true,
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -2100,6 +2164,30 @@
         "node": "6.* || 8.* || >= 10.*"
       }
     },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+      "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.0",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/get-package-type": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -2110,6 +2198,19 @@
         "node": ">=8.0.0"
       }
     },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/get-stream": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -2155,6 +2256,18 @@
         "node": ">=4"
       }
     },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -2172,11 +2285,37 @@
         "node": ">=8"
       }
     },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/hasown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.2"
@@ -3200,6 +3339,15 @@
         "tmpl": "1.0.5"
       }
     },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
diff --git a/installers/npm/package.json b/installers/npm/package.json
index c34a7e0fc..aece0dfcd 100644
--- a/installers/npm/package.json
+++ b/installers/npm/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@apollo/rover",
-  "version": "0.27.0",
+  "version": "0.27.1",
   "description": "The new Apollo CLI",
   "main": "index.js",
   "bin": {


Test patch: