diff --git a/Dockerfile b/Dockerfile
index 32fd39deaa54..426426a4407f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,7 +8,7 @@
# ---------------------------------------------------------------
# To update the sha:
# https://github.com/github/gh-base-image/pkgs/container/gh-base-image%2Fgh-base-noble
-FROM ghcr.io/github/gh-base-image/gh-base-noble:20251009-110343-g5a525d4e1 AS base
+FROM ghcr.io/github/gh-base-image/gh-base-noble:20251010-155737-g547a87a71 AS base
# Install curl for Node install and determining the early access branch
# Install git for cloning docs-early-access & translations repos
diff --git a/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md b/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md
index ba7a9fc3f5aa..9702466346f2 100644
--- a/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md
+++ b/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md
@@ -16,6 +16,7 @@ topics:
- Enterprise
- SSH
---
+
You can execute these commands from anywhere on the VM after signing in as an SSH admin user. For more information, see [AUTOTITLE](/admin/configuration/configuring-your-enterprise/accessing-the-administrative-shell-ssh).
## General
@@ -140,6 +141,94 @@ This utility applies {% data variables.enterprise.management_console %} settings
ghe-config-apply
```
+{% ifversion ghes > 3.18 %}
+
+### ghe-crypto
+
+This utility is used to verify and list {% data variables.enterprise.management_console %} `github-ssl` crypto settings for TLS and SSH connections.
+
+The list of configurable `github-ssl` fields can be viewed via `ghe-crypto --help`.
+
+#### Listing default cipher suites and algorithms
+
+The `list` command returns default crypto settings for a given field. Use the `-o json` flag to output the results in JSON format.
+
+To list TLS 1.2 cipher suites:
+
+```shell
+ghe-crypto list tlsv12-ciphersuites
+```
+
+To list TLS 1.3 cipher suites:
+
+```shell
+ghe-crypto list tlsv13-ciphersuites
+```
+
+To list SSH ciphers:
+
+```shell
+ghe-crypto list ssh-ciphers
+```
+
+To list SSH MAC algorithms:
+
+```shell
+ghe-crypto list ssh-mac-algorithms
+```
+
+To list SSH key exchange algorithms:
+
+```shell
+ghe-crypto list ssh-kex-algorithms
+```
+
+To list SSH signature types:
+
+```shell
+ghe-crypto list ssh-signature-types
+```
+
+Example output in JSON format:
+
+```shell
+$ ghe-crypto list tlsv12-ciphersuites -o json
+> [
+> "ECDHE-ECDSA-AES128-GCM-SHA256",
+> "ECDHE-ECDSA-CHACHA20-POLY1305",
+> "ECDHE-ECDSA-AES256-GCM-SHA384",
+> "ECDHE-RSA-AES128-GCM-SHA256",
+> "ECDHE-RSA-CHACHA20-POLY1305",
+> "ECDHE-RSA-AES256-GCM-SHA384"
+> ]
+```
+
+#### Checking cipher suites and algorithms
+
+The `check` command validates a single line of crypto settings delimited by `,`. This is useful before applying configuration changes.
+
+To check TLS 1.2 cipher suites:
+
+```shell
+ghe-crypto check tlsv12-ciphersuites CIPHER1,CIPHER2,CIPHER3
+```
+
+To check TLS 1.3 cipher suites:
+
+```shell
+ghe-crypto check tlsv13-ciphersuites TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256
+```
+
+To check SSH ciphers:
+
+```shell
+ghe-crypto check ssh-ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
+```
+
+For more information about configuring cipher suites and cryptographic algorithms, see [AUTOTITLE](/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-tls#configuring-cipher-suites-and-cryptographic-algorithms).
+
+{% endif %}
+
### ghe-console
This utility opens the GitHub Rails console on your {% data variables.product.prodname_enterprise %} appliance. {% data reusables.command_line.use_with_support_only %}
diff --git a/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-tls.md b/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-tls.md
index 1af65eb39492..398877221500 100644
--- a/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-tls.md
+++ b/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-tls.md
@@ -120,4 +120,392 @@ To resolve these errors, you must update the Subject Alternative Names (SANs) yo
```
{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+{% ifversion ghes > 3.18 %}
+
+## Configuring cipher suites and cryptographic algorithms
+
+You can configure the cipher suites and cryptographic algorithms that {% data variables.product.prodname_ghe_server %} uses for TLS connections and SSH connections.
+
+### About cipher suite and algorithm configuration
+
+{% data variables.product.prodname_ghe_server %} allows you to configure which cipher suites and cryptographic algorithms to use for:
+
+* **TLS connections** on ports 443 (HTTPS web interface) and 8443 (HTTPS management console)
+* **SSH connections** on port 22 (Git operations via SSH) and port 122 (administrative shell access)
+
+The default secure cipher suites are based on industry-standard TLS hardening recommendations and modern security best practices. Most organizations should use these defaults unless specific compliance or security requirements dictate otherwise.
+
+Organizations may need to customize cipher suites and cryptographic algorithms to meet specific organizational security policies, industry standards, or regulatory requirements.
+
+Starting in {% data variables.product.prodname_ghe_server %} 3.19, TLS ciphers are configurable and the web gateway uses more secure cipher defaults. To maintain backwards compatibility with existing instances, newly provisioned instances will use these new defaults.
+
+> [!WARNING]
+> Configuring overly restrictive cipher suites may prevent clients from connecting to your instance. Always test changes in a non-production environment first, ensure at least one cipher suite is compatible with your clients, and verify connectivity after applying configuration changes.
+
+> [!NOTE]
+> When configuring TLS cipher suites, use comma-separated values in your configuration commands. {% data variables.product.prodname_ghe_server %} automatically converts comma delimiters to colons for the HAProxy configuration. Cipher suites are evaluated in the order specified, so list your preferred ciphers first.
+
+### Configuring TLS cipher suites
+
+You can configure the cipher suites used for TLS 1.2 and TLS 1.3 connections.
+
+#### Listing available TLS cipher suites
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. To view the default secure cipher suites for TLS 1.2, run the following command.
+
+ ```shell copy
+ ghe-crypto list tlsv12-ciphersuites
+ ```
+
+1. To view the default secure cipher suites for TLS 1.3, run the following command.
+
+ ```shell copy
+ ghe-crypto list tlsv13-ciphersuites
+ ```
+
+#### Viewing current cipher configuration
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. To view the configured TLS 1.2 cipher suites, run the following command.
+
+ ```shell copy
+ ghe-config github-ssl.tlsv12-ciphersuites
+ ```
+
+1. To view the configured TLS 1.3 cipher suites, run the following command.
+
+ ```shell copy
+ ghe-config github-ssl.tlsv13-ciphersuites
+ ```
+
+ If these commands return empty values, the instance is using the secure defaults.
+
+#### Setting TLS 1.2 cipher suites
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Check your desired TLS 1.2 cipher suites using the `ghe-crypto check` command. Replace `CIPHER1,CIPHER2,CIPHER3` with a comma-separated list of cipher suites.
+
+ ```shell copy
+ ghe-crypto check tlsv12-ciphersuites CIPHER1,CIPHER2,CIPHER3
+ ```
+
+ For example:
+
+ ```shell
+ ghe-crypto check tlsv12-ciphersuites ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES256-GCM-SHA384
+ ```
+
+1. If the cipher string is valid, set the TLS 1.2 cipher suites. Replace `CIPHER1,CIPHER2,CIPHER3` with your comma-separated list.
+
+ ```shell copy
+ ghe-config github-ssl.tlsv12-ciphersuites 'CIPHER1,CIPHER2,CIPHER3'
+ ```
+
+ For example:
+
+ ```shell
+ ghe-config github-ssl.tlsv12-ciphersuites 'ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES256-GCM-SHA384'
+ ```
+
+1. Check the configuration.
+
+ ```shell copy
+ ghe-config-check
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+#### Setting TLS 1.3 cipher suites
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Check your desired TLS 1.3 cipher suites using the `ghe-crypto check` command. Replace `CIPHER1,CIPHER2,CIPHER3` with a comma-separated list of cipher suites.
+
+ ```shell copy
+ ghe-crypto check tlsv13-ciphersuites CIPHER1,CIPHER2,CIPHER3
+ ```
+
+ For example:
+
+ ```shell
+ ghe-crypto check tlsv13-ciphersuites TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256
+ ```
+
+1. If the cipher string is valid, set the TLS 1.3 cipher suites. Replace `CIPHER1,CIPHER2,CIPHER3` with your comma-separated list.
+
+ ```shell copy
+ ghe-config github-ssl.tlsv13-ciphersuites 'CIPHER1,CIPHER2,CIPHER3'
+ ```
+
+ For example:
+
+ ```shell
+ ghe-config github-ssl.tlsv13-ciphersuites 'TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256'
+ ```
+
+1. Check the configuration.
+
+ ```shell copy
+ ghe-config-check
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+### Configuring SSH cryptographic algorithms
+
+You can configure the cryptographic algorithms used for SSH connections on port 22 (Git operations) and port 122 (administrative shell access).
+
+#### Listing available SSH algorithms
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. To view the default secure SSH ciphers, run the following command.
+
+ ```shell copy
+ ghe-crypto list ssh-ciphers
+ ```
+
+1. To view the default secure SSH MAC algorithms, run the following command.
+
+ ```shell copy
+ ghe-crypto list ssh-mac-algorithms
+ ```
+
+1. To view the default secure SSH key exchange algorithms, run the following command.
+
+ ```shell copy
+ ghe-crypto list ssh-kex-algorithms
+ ```
+
+1. To view the default secure SSH signature types, run the following command.
+
+ ```shell copy
+ ghe-crypto list ssh-signature-types
+ ```
+
+#### Viewing current SSH configuration
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. To view the configured SSH ciphers, run the following command.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-ciphers
+ ```
+
+1. To view the configured SSH MAC algorithms, run the following command.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-mac-algorithms
+ ```
+
+1. To view the configured SSH key exchange algorithms, run the following command.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-kex-algorithms
+ ```
+
+1. To view the configured SSH signature types, run the following command.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-signature-types
+ ```
+
+ If these commands return empty values, the instance is using the secure defaults.
+
+#### Setting SSH ciphers
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Check your desired SSH ciphers using the `ghe-crypto check` command. Replace `cipher1,cipher2,cipher3` with a comma-separated list of ciphers.
+
+ ```shell copy
+ ghe-crypto check ssh-ciphers cipher1,cipher2,cipher3
+ ```
+
+ For example:
+
+ ```shell
+ ghe-crypto check ssh-ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
+ ```
+
+1. If the cipher string is valid, set the SSH ciphers. Replace `cipher1,cipher2,cipher3` with your comma-separated list.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-ciphers 'cipher1,cipher2,cipher3'
+ ```
+
+ For example:
+
+ ```shell
+ ghe-config github-ssl.ssh-ciphers 'chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com'
+ ```
+
+1. Check the configuration.
+
+ ```shell copy
+ ghe-config-check
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+#### Setting SSH MAC algorithms
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Check your desired SSH MAC algorithms using the `ghe-crypto check` command. Replace `mac1,mac2,mac3` with a comma-separated list of MAC algorithms.
+
+ ```shell copy
+ ghe-crypto check ssh-mac-algorithms mac1,mac2,mac3
+ ```
+
+ For example:
+
+ ```shell
+ ghe-crypto check ssh-mac-algorithms hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
+ ```
+
+1. If the MAC algorithm string is valid, set the SSH MAC algorithms. Replace `mac1,mac2,mac3` with your comma-separated list.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-mac-algorithms 'mac1,mac2,mac3'
+ ```
+
+ For example:
+
+ ```shell
+ ghe-config github-ssl.ssh-mac-algorithms 'hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com'
+ ```
+
+1. Check the configuration.
+
+ ```shell copy
+ ghe-config-check
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+#### Setting SSH key exchange algorithms
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Check your desired SSH key exchange algorithms using the `ghe-crypto check` command. Replace `kex1,kex2,kex3` with a comma-separated list of key exchange algorithms.
+
+ ```shell copy
+ ghe-crypto check ssh-kex-algorithms kex1,kex2,kex3
+ ```
+
+ For example:
+
+ ```shell
+ ghe-crypto check ssh-kex-algorithms curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp521
+ ```
+
+1. If the key exchange algorithm string is valid, set the SSH key exchange algorithms. Replace `kex1,kex2,kex3` with your comma-separated list.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-kex-algorithms 'kex1,kex2,kex3'
+ ```
+
+ For example:
+
+ ```shell
+ ghe-config github-ssl.ssh-kex-algorithms 'curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp521'
+ ```
+
+1. Check the configuration.
+
+ ```shell copy
+ ghe-config-check
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+#### Setting SSH signature types
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Check your desired SSH signature types using the `ghe-crypto check` command. Replace `sig1,sig2,sig3` with a comma-separated list of signature types.
+
+ ```shell copy
+ ghe-crypto check ssh-signature-types sig1,sig2,sig3
+ ```
+
+ For example:
+
+ ```shell
+ ghe-crypto check ssh-signature-types ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384
+ ```
+
+1. If the signature type string is valid, set the SSH signature types. Replace `sig1,sig2,sig3` with your comma-separated list.
+
+ ```shell copy
+ ghe-config github-ssl.ssh-signature-types 'sig1,sig2,sig3'
+ ```
+
+ For example:
+
+ ```shell
+ ghe-config github-ssl.ssh-signature-types 'ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384'
+ ```
+
+1. Check the configuration.
+
+ ```shell copy
+ ghe-config-check
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+### Troubleshooting cipher configuration
+
+If clients cannot connect to {% data variables.location.product_location %} after changing cipher configuration, you can troubleshoot the issue.
+
+1. Check that your clients support the configured TLS or SSH protocol versions.
+1. Verify that at least one configured cipher suite is compatible with your clients.
+1. Review the instance logs for TLS handshake failures or SSH connection errors. For more information about accessing logs, see [AUTOTITLE](/admin/monitoring-and-managing-your-instance/monitoring-your-instance/about-system-logs).
+1. Temporarily restore the default settings to verify the issue is cipher-related. For more information, see [Restoring default cipher suite and algorithm settings](#restoring-default-cipher-suite-and-algorithm-settings).
+1. If the issue persists after restoring defaults, contact {% data variables.contact.contact_ent_support %}.
+
+### Restoring default cipher suite and algorithm settings
+
+To restore the default secure cipher suites or algorithms, unset the configuration value.
+
+{% data reusables.enterprise_installation.ssh-into-target-instance %}
+
+1. Unset the configuration setting. Replace `SETTING` with the name of the setting you want to restore to defaults.
+
+ ```shell copy
+ ghe-config --unset github-ssl.SETTING
+ ```
+
+ For example, to restore default TLS 1.2 cipher suites:
+
+ ```shell
+ ghe-config --unset github-ssl.tlsv12-ciphersuites
+ ```
+
+{% data reusables.enterprise.apply-configuration %}
+
+1. If you configured a user message or maintenance mode, remove the message and disable maintenance mode.
+
+{% endif %}
diff --git a/content/billing/how-tos/products/view-productlicense-use.md b/content/billing/how-tos/products/view-productlicense-use.md
index f8af40b952ac..9e1ad6c67ff2 100644
--- a/content/billing/how-tos/products/view-productlicense-use.md
+++ b/content/billing/how-tos/products/view-productlicense-use.md
@@ -112,14 +112,11 @@ To show more detailed information for the top 100 users or organizations consumi
## Downloading usage reports
-Visit the "Metered Usage" page to access a metered billing report for all products, or navigate to the "Premium request analytics" page for a specialized report tailored for Premium request activity tracking.
-
-### General usage reports
+Visit the "Metered Usage" page to access a metered billing report for all products, or navigate to the "Premium request analytics" page for a specialized report tailored for Premium request activity tracking.
1. At the top of the page, click **Get usage report**.
-1. If prompted, specify the report details:
- * Metered usage page: in the dialog displayed, define details of the report that you want to download and click **Email me the report**.
- * Premium request analytics page: the report will contain usage for the last 45 days.
+1. Specify the report details.
+1. Click **Email me the report**.
When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours.
diff --git a/content/billing/reference/billing-reports.md b/content/billing/reference/billing-reports.md
index 779345fd9d62..8c2ae3e5de20 100644
--- a/content/billing/reference/billing-reports.md
+++ b/content/billing/reference/billing-reports.md
@@ -17,25 +17,26 @@ redirect_from:
contentType: reference
---
-The usage reports show detailed information about your account’s {% data variables.product.github %} usage, including how much of each SKU was used and the resulting billable amount.
+Usage reports show detailed information about your account’s {% data variables.product.github %} usage, including how much of each SKU was used and the resulting billable amount.
-To generate a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use).
+To generate a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports).
## Report types
-There are three different types of reports.
+The following report types are available.
* Metered usage page:
- * **Summarized metered usage reports**: A summary of usage for all paid products for a maximum period of one year.
- * **Detailed metered usage reports**: A detailed usage report for all paid products for a maximum period of 31 days.
+ * **Summarized usage report**: A summary of usage for all paid products for a maximum period of one year.
+ * **Detailed usage report**: A detailed usage report for all paid products for a maximum period of 31 days.
* Premium request analytics page:
- * **Premium request analytics usage reports**: A detailed, user-based report on usage of premium requests for the last 45 days.
+ * **Premium requests usage report**: A detailed per-user breakdown of premium requests consumed for a maximum period of 31 days.
+ * **Legacy premium request usage report**: A detailed, user-based report of premium request usage for the last 45 days.
-### Summarized metered usage reports
+### Summarized usage report
This report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amount` fields based on the combination of the following values: `date`, `sku`, `repository`, `cost_center_name`. If the usage report is for an enterprise with organizations, the amounts will be summarized by the organization value as well.
-### Detailed metered usage reports
+### Detailed usage report
The detailed usage report includes the same fields as the summarized report and adds `username` and `workflow_path`.
@@ -43,13 +44,21 @@ This report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amo
{% data reusables.billing.usage-reports-api-limitation %}
-### Premium request analytics usage reports
+### Premium requests usage report
-This report includes each recorded use of a premium request and includes the following fields: `Timestamp`,`User`,`Model`,`Requests Used`,`Exceeds Monthly Quota`, and `Total Monthly Quota`.
+This report includes additional detail about premium request usage. The report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amount` fields based on the combination of the following values: `date`, `model`, `username`.
-## Metered usage report fields
+This report contains usage beginning October 01, 2025 00:00 UTC.
-The usage report contains the following fields.
+### Legacy premium request usage report
+
+This report includes each recorded use of a premium request and includes the following fields: `Timestamp`,`User`,`Model`,`Requests Used`,`Exceeds Monthly Quota`, and `Total Monthly Quota`. The time period of the report is the most recent 45 days.
+
+This report will be closing down on December 1, 2025, at which point all premium request usage activity will be available via the Premium requests usage report.
+
+## Usage report fields
+
+The usage reports contain the following fields.
| Field | Description |
|---------------------------|-------------|
@@ -61,37 +70,27 @@ The usage report contains the following fields.
| `applied_cost_per_quantity` | The unit cost of the product SKU. |
| `gross_amount` | The amount of the product SKU that was used. |
| `discount_amount` | The amount of usage that was discounted. Usage that is discounted as part of your account’s included usage is reflected in this field. Also includes discounts for {% data variables.product.prodname_actions %} usage for standard {% data variables.product.github %}-hosted runners in public repositories and for self-hosted runners. |
-| `net_amount` | The billable amount of usage after applying the `discount_amount`. This is the amount that your account will be billed. `gross_amount - discount_amount = net_amount`. |
-| `username` | The user associated with the usage, if applicable. Only available in the detailed report. |
+| `net_amount` | The billable amount of usage after applying the `discount_amount`. This is the amount that your account will be billed. `gross_amount - discount_amount = net_amount` |
+| `username` | The user associated with the usage, if applicable.
Not included in the `Summarized usage report`. |
| `organization` | The organization associated with the usage, if applicable. |
| `repository` | The repository associated with the usage, if applicable. |
-| `workflow_path` | The path of the {% data variables.product.prodname_actions %} workflow that generated the usage, if applicable. Only available in the detailed report. |
+| `workflow_path` | The path of the {% data variables.product.prodname_actions %} workflow that generated the usage, if applicable.
Only available in the `Detailed usage report` |
| `cost_center_name` | The cost center associated with the usage, if applicable. |
+| `model` | The model used. This might be an LLM like `claude-sonnet-4`, or a product-specific model like `Code Review model`.
Only available in the `Premium request usage report` |
+| `exceeds_quota` | Indicates whether the premium request exceeds the user's monthly quota:
- `FALSE`: The request is covered by the monthly quota included in the user's plan.
- `TRUE`: The request exceeds the monthly quota and will be billed
Only available in the `Premium request usage report` |
+| `total_monthly_quota` | The number of requests included in the user's current plan. {% ifversion fpt or ghec %}See [AUTOTITLE](/copilot/concepts/billing/individual-plans) and [AUTOTITLE](/copilot/concepts/billing/organizations-and-enterprises).{% endif %}
Only available in the `Premium request usage report` |
+
+## Receiving the report
+
+Usage reports are sent via email to the default email address associated with your {% data variables.product.github %} account. You can only request one usage report per account at a time.
-### Metered usage report fields that are closing down
+## Metered usage report fields that have closed down
{% data variables.product.github %} aims to minimize changes to the usage report structure, however at times the report structure or fields may change.
-| Closing down | Replacement |
+The following fields have been removed from the usage reports.
+
+| Field | Replacement |
|--------------------|---------------------|
| `usage_at` | Refer to `date` instead. |
| `workflow_name` | Refer to `workflow_path` instead. |
-
-## Premium request analytics usage report fields
-
-{% data reusables.billing.premium-request-analytics-start %}
-
-The premium request analytics report contains the following fields.
-
-| Field | Description |
-|---------------------------|-------------|
-| Timestamp | The full UTC date and time in ISO 18601 format. |
-| User | The {% data variables.product.github %} handle of the user associated with the usage. |
-| Model | The model used. This might be an LLM like `claude-sonnet-4`, or a product-specific model like `Code Review model`.
-| Requests Used | The total number of requests used. |
-| Exceeds Monthly Quota | This field indicates whether the premium request will be billed separately:
- `FALSE`: The request is covered by the monthly quota included in the user's plan.
- `TRUE`: The request exceeds the monthly quota and will be billed |
-| Total Monthly Quota | This field records the total number of requests included in the user's current plan{% ifversion fpt or ghec %}, see [AUTOTITLE](/copilot/concepts/billing/individual-plans) and [AUTOTITLE](/copilot/concepts/billing/organizations-and-enterprises){% endif %}. |
-
-## Receiving the report
-
-Usage reports are sent via email to the default email address associated with your {% data variables.product.github %} account. You can only request one usage report per account at a time.
diff --git a/content/copilot/concepts/agents/coding-agent/about-coding-agent.md b/content/copilot/concepts/agents/coding-agent/about-coding-agent.md
index 64e109acb36a..c7714ed7989f 100644
--- a/content/copilot/concepts/agents/coding-agent/about-coding-agent.md
+++ b/content/copilot/concepts/agents/coding-agent/about-coding-agent.md
@@ -144,9 +144,7 @@ Users can include hidden messages in issues assigned to {% data variables.produc
* **{% data variables.copilot.copilot_coding_agent %} only works with repositories hosted on {% data variables.product.github %}**. If your repository is stored using a different code hosting platform, {% data variables.product.prodname_copilot_short %} won't be able to work on it.
* **You cannot select the AI model used by {% data variables.copilot.copilot_coding_agent %}**. A model picker is not available to switch between models, and {% data variables.product.company_short %} reserves the right to change models at any time.
- If you are a {% data variables.copilot.copilot_pro %} or {% data variables.copilot.copilot_pro_plus %} subscriber, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.copilot_claude_sonnet_45 %}.
-
- If you are a {% data variables.copilot.copilot_for_business %} or {% data variables.copilot.copilot_enterprise %} subscriber, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.cca_current_model %} by default, or {% data variables.copilot.copilot_claude_sonnet_45 %} if the model has been enabled by an administrator. See [AUTOTITLE](/copilot/concepts/policies).
+ Currently, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.copilot_claude_sonnet_45 %}.
## Hands-on practice
diff --git a/content/copilot/concepts/prompting/response-customization.md b/content/copilot/concepts/prompting/response-customization.md
index 70626a0650ff..cf3b4939d783 100644
--- a/content/copilot/concepts/prompting/response-customization.md
+++ b/content/copilot/concepts/prompting/response-customization.md
@@ -34,7 +34,7 @@ contentType: concepts
{% jetbrains %}
-> [!NOTE] This version of this article is about custom instructions in JetBrains IDEs. Click the tabs above for other environments.
+> [!NOTE] This version of this article is about custom instructions and prompt files in JetBrains IDEs. Click the tabs above for other environments.
{% endjetbrains %}
{% xcode %}
@@ -74,7 +74,7 @@ You can create two types of repository custom instructions for {% data variables
There are two types of files you can use to provide context and instructions to {% data variables.copilot.copilot_chat %} in {% data variables.product.prodname_vscode_shortname %}:
* **Repository custom instructions** allow you to specify instructions and preferences that {% data variables.product.prodname_copilot_short %} will consider when working in the context of the repository.
-* **Prompt files** (public preview) allow you to save common prompt instructions and relevant context in Markdown files (`*.prompt.md`) that you can then reuse in your chat prompts. Prompt files are only available in {% data variables.product.prodname_vscode_shortname %}.
+* **Prompt files** (public preview) allow you to save common prompt instructions and relevant context in Markdown files (`*.prompt.md`) that you can then reuse in your chat prompts. {% data reusables.copilot.prompt-files-available-in-editors %}
While custom instructions help to add codebase-wide context to each AI workflow, prompt files let you add instructions to a specific chat interaction.
@@ -88,7 +88,14 @@ While custom instructions help to add codebase-wide context to each AI workflow,
{% jetbrains %}
-{% data variables.product.prodname_copilot %} can provide chat responses that are tailored to the way your team works, the tools you use, or the specifics of your project, if you provide it with enough context to do so. Instead of repeatedly adding this contextual detail to your chat questions, you can create a custom instructions file in your repository that automatically adds this information for you. The additional information is not displayed in the chat, but is available to {% data variables.product.prodname_copilot_short %} to allow it to generate higher quality responses.
+{% data variables.product.prodname_copilot %} can provide chat responses that are tailored to the way your team works, the tools you use, or the specifics of your project, if you provide it with enough context to do so. Instead of repeatedly adding this contextual detail to your chat questions, you can create a custom instructions file in your repository that automatically adds this information for you.
+
+There are two types of files you can use to provide context and instructions to {% data variables.copilot.copilot_chat %} in JetBrains IDEs:
+
+* **Repository custom instructions** allow you to specify instructions and preferences that {% data variables.product.prodname_copilot_short %} will consider when working in the context of the repository.
+* **Prompt files** (public preview) allow you to save common prompt instructions and relevant context in Markdown files (`*.prompt.md`) that you can then reuse in your chat prompts. {% data reusables.copilot.prompt-files-available-in-editors %}
+
+While custom instructions help to add codebase-wide context to each AI workflow, prompt files let you add instructions to a specific chat interaction.
{% endjetbrains %}
@@ -229,6 +236,55 @@ Common use cases include:
{% data reusables.copilot.repository-custom-instructions-example %}
+## About prompt files
+
+> [!NOTE] Prompt files are {% data variables.release-phases.public_preview %} and subject to change.
+
+Prompt files let you build and share reusable prompt instructions with additional context. A prompt file is a Markdown file, stored in your workspace, that mimics the existing format of writing prompts in {% data variables.copilot.copilot_chat_short %} (for example, `Rewrite #file:x.ts`). This allows blending natural language instructions and additional context.
+
+Common use cases include:
+
+* **Code generation**. Create reusable prompts for components, tests, or migrations (for example, React forms, or API mocks).
+* **Domain expertise**. Share specialized knowledge through prompts, such as security practices, or compliance checks.
+* **Team collaboration**. Document patterns and guidelines with references to specs and documentation.
+* **Onboarding**. Create step-by-step guides for complex processes or project-specific patterns.
+
+You can have multiple prompt files in your workspace, each of which defines a prompt for a different purpose.
+
+### Examples
+
+The following examples demonstrate how to use prompt files.
+
+* `New React form.prompt.md` - contains instructions for a reusable task to generate a form using React.
+
+ ```markdown
+ Your goal is to generate a new React form component.
+
+ Ask for the form name and fields if not provided.
+
+ Requirements for the form:
+ - Use form design system components: [design-system/Form.md](../docs/design-system/Form.md)
+ - Use `react-hook-form` for form state management:
+ - Always define TypeScript types for your form data
+ - Prefer *uncontrolled* components using register
+ - Use `defaultValues` to prevent unnecessary rerenders
+ - Use `yup` for validation:
+ - Create reusable validation schemas in separate files
+ - Use TypeScript types to ensure type safety
+ - Customize UX-friendly validation rules
+ ```
+
+* `API security review.prompt.md` - contains reusable information about security practices for REST APIs, which can be used to do security reviews of REST APIs.
+
+ ```markdown
+ Secure REST API review:
+ - Ensure all endpoints are protected by authentication and authorization
+ - Validate all user inputs and sanitize data
+ - Implement rate limiting and throttling
+ - Implement logging and monitoring for security events
+ …
+ ```
+
{% endjetbrains %}
{% xcode %}
diff --git a/content/copilot/how-tos/configure-custom-instructions/add-repository-instructions.md b/content/copilot/how-tos/configure-custom-instructions/add-repository-instructions.md
index dab200764129..4b12d26d77e6 100644
--- a/content/copilot/how-tos/configure-custom-instructions/add-repository-instructions.md
+++ b/content/copilot/how-tos/configure-custom-instructions/add-repository-instructions.md
@@ -631,3 +631,43 @@ To enable prompt files, configure the workspace settings.
For more information about prompt files, see [Custom instructions for {% data variables.product.prodname_copilot %} in VS Code](https://code.visualstudio.com/docs/copilot/copilot-customization#_reusable-prompt-files-experimental) in the {% data variables.product.prodname_vscode %} documentation.
{% endvscode %}
+
+{% jetbrains %}
+
+## Using prompt files
+
+{% data reusables.copilot.prompt-files-preview-note %}
+
+Prompt files let you build and share reusable prompt instructions with additional context. A prompt file is a Markdown file, stored in your workspace, that mimics the existing format of writing prompts in {% data variables.copilot.copilot_chat_short %} (for example, `Rewrite #file:x.ts`). You can have multiple prompt files in your workspace, each of which defines a prompt for a different purpose.
+
+When writing prompt instructions, you can reference other files in the workspace by using Markdown links—for example, `[index](../../web/index.ts)`—or by using the `#file:../../web/index.ts` syntax. Paths are relative to the prompt file. Referencing other files allows you to provide additional context, such as API specifications or product documentation.
+
+Once prompt files are saved, their instructions will apply to the current workspace in JetBrains IDEs that you open with {% data variables.product.prodname_copilot_short %} enabled.
+
+### Creating prompt files using the command line
+
+1. Create the `.github/prompts` directory if it doesn't already exist in your workspace. This directory will be the location for your prompt files.
+1. Create a prompt file in the `.github/prompts` directory. The prompt file name can contain alphanumeric characters and spaces and should describe the purpose of the prompt information the file will contain. The file name must end with the `.prompt.md` file name extension, for example `TESTPROMPT.prompt.md`.
+1. Write the prompt instructions using Markdown formatting, and save the file.
+
+### Creating prompt files using the settings page
+
+{% data reusables.copilot.jetbrains-settings %}
+1. Under **Tools**, under **{% data variables.product.prodname_copilot %}**, click **Edit Settings**.
+1. Under "Settings Categories", click **Customizations**.
+1. Under "Prompt Files", click **Workspace**, to create a prompt file in your workspace.
+1. Enter a name for the prompt file, excluding the `.prompt.md` file name extension. The prompt file name can contain alphanumeric characters and spaces and should describe the purpose of the prompt information the file will contain.
+1. Click **Ok** to save the prompt file name.
+1. Write the prompt instructions using Markdown formatting, and save the file.
+
+### Using prompt files
+
+1. In the chat input box, type `/` followed by the name of the prompt file. For example, `/TESTPROMPT`.
+1. Optionally, attach additional files, to provide more context.
+1. Optionally, type additional information in the chat prompt box.
+
+ Whether you need to do this or not depends on the contents of the prompt you are using.
+
+1. Submit the chat prompt.
+
+{% endjetbrains %}
diff --git a/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md b/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md
index eb5858ce0cb5..3db71dbfd0d6 100644
--- a/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md
+++ b/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md
@@ -30,9 +30,8 @@ There are multiple ways to view your premium request usage:
* [View current usage directly within your IDE](#viewing-usage-in-your-ide)
* [Viewing an overview in your Billing and licensing settings](#viewing-an-overview-in-your-billing-and-licensing-settings)
* [View detailed analytics of your usage](#viewing-detailed-analytics-of-your-usage)
-* [Download a usage report for your personal account](#downloading-a-usage-report-for-your-personal-account)
-If you reach your limit for premium requests, you will be notified with a message in each of the {% data variables.product.prodname_copilot_short %} interfaces you use.
+If you reach your limit for premium requests, you will be notified with a message in each of the {% data variables.product.prodname_copilot_short %} interfaces you use. To download a usage report, see [Downloading usage reports](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports).
For information about viewing premium request usage for an organization or enterprise, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use).
@@ -67,15 +66,9 @@ You can view an overview of your premium request usage at any time in your "Bill

-### Downloading a usage report for your personal account
+### Downloading a usage report
-Reports include all premium request usage, both within and beyond your allowance.
-
-{% data reusables.user-settings.access_billing_settings_url %}
-1. In the side bar, click **Premium request analytics** to show detailed analytics.
-1. At the top of the page, click **Get usage report** to generate a CSV report of your premium request use for the past 45 days.
-
-When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours. For details of the fields included in the reports, see [AUTOTITLE](/billing/reference/billing-reports#premium-request-analytics-usage-report-fields).
+For details on how to request a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports).
## Optimizing usage of premium requests
diff --git a/content/copilot/reference/ai-models/supported-models.md b/content/copilot/reference/ai-models/supported-models.md
index 3b129cf6e33b..e2f0ca607387 100644
--- a/content/copilot/reference/ai-models/supported-models.md
+++ b/content/copilot/reference/ai-models/supported-models.md
@@ -47,10 +47,10 @@ This table lists the AI models available in {% data variables.product.prodname_c
| {% data variables.copilot.copilot_gpt_5 %} | OpenAI | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_o3 %} | OpenAI | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_o4_mini %} | OpenAI | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_claude_sonnet_45 %} | Anthropic | {% data variables.release-phases.public_preview_caps %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
+| {% data variables.copilot.copilot_claude_sonnet_45 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_opus_41 %} | Anthropic | GA | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_opus %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_claude_sonnet_35 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
+| {% data variables.copilot.copilot_claude_sonnet_35 %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-11-06 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_sonnet_37 %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_sonnet_37 %} Thinking | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_sonnet_40 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
@@ -87,7 +87,7 @@ The following table shows which models are available in each client.
| {% data variables.copilot.copilot_claude_sonnet_40 %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_gemini_25_pro %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_gemini_flash %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_grok_code %} | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} |
+| {% data variables.copilot.copilot_grok_code %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
{% endrowheaders %}
diff --git a/content/copilot/tutorials/customization-library/custom-instructions/your-first-custom-instructions.md b/content/copilot/tutorials/customization-library/custom-instructions/your-first-custom-instructions.md
index 74453f1cd5e7..f0f585d23db0 100644
--- a/content/copilot/tutorials/customization-library/custom-instructions/your-first-custom-instructions.md
+++ b/content/copilot/tutorials/customization-library/custom-instructions/your-first-custom-instructions.md
@@ -20,7 +20,7 @@ topics:
You can customize {% data variables.product.prodname_copilot %}'s responses using two types of files:
* **Custom instructions** provide ongoing guidance for how {% data variables.product.prodname_copilot %} should behave across all your interactions.
-* **Prompt files (public preview)** define reusable prompts for specific tasks that you can invoke when needed. Prompt files are only available in {% data variables.product.prodname_vscode_shortname %}. For an introductory example, see [AUTOTITLE](/copilot/tutorials/customization-library/prompt-files/your-first-prompt-file).
+* **Prompt files (public preview)** define reusable prompts for specific tasks that you can invoke when needed. {% data reusables.copilot.prompt-files-available-in-editors %} For an introductory example, see [AUTOTITLE](/copilot/tutorials/customization-library/prompt-files/your-first-prompt-file).
While custom instructions help to add context to each AI workflow, prompt files let you add instructions to a specific chat interaction.
diff --git a/content/copilot/tutorials/customization-library/index.md b/content/copilot/tutorials/customization-library/index.md
index 0e7590b0254d..5727ee7951c2 100644
--- a/content/copilot/tutorials/customization-library/index.md
+++ b/content/copilot/tutorials/customization-library/index.md
@@ -1,6 +1,6 @@
---
title: Customization library
-intro: 'Discover a curated collection of customizations, including custom instructions and prompt files (VS Code only), to enhance your {% data variables.product.prodname_copilot %} experience.'
+intro: 'Discover a curated collection of customizations, including custom instructions and prompt files ({% data variables.product.prodname_vscode_shortname %} and JetBrains IDEs only), to enhance your {% data variables.product.prodname_copilot %} experience.'
allowTitleToDifferFromFilename: true
versions:
feature: copilot
@@ -20,4 +20,3 @@ children:
- /prompt-files
contentType: tutorials
---
-
diff --git a/content/copilot/tutorials/customization-library/prompt-files/your-first-prompt-file.md b/content/copilot/tutorials/customization-library/prompt-files/your-first-prompt-file.md
index 11720189a8c0..f710fd5ed8d2 100644
--- a/content/copilot/tutorials/customization-library/prompt-files/your-first-prompt-file.md
+++ b/content/copilot/tutorials/customization-library/prompt-files/your-first-prompt-file.md
@@ -21,7 +21,7 @@ contentType: tutorials
You can customize {% data variables.product.prodname_copilot %}'s responses using two types of files:
* **Custom instructions** provide ongoing guidance for how {% data variables.product.prodname_copilot %} should behave across all your interactions. For an introductory example, see [AUTOTITLE](/copilot/tutorials/customization-library/custom-instructions/your-first-custom-instructions).
-* **Prompt files (public preview)** define reusable prompts for specific tasks that you can invoke when needed. Prompt files are only available in {% data variables.product.prodname_vscode_shortname %}.
+* **Prompt files (public preview)** define reusable prompts for specific tasks that you can invoke when needed. {% data reusables.copilot.prompt-files-available-in-editors %}
## Your first prompt file
diff --git a/data/reusables/copilot/prompt-files-available-in-editors.md b/data/reusables/copilot/prompt-files-available-in-editors.md
new file mode 100644
index 000000000000..0d0cb3b07460
--- /dev/null
+++ b/data/reusables/copilot/prompt-files-available-in-editors.md
@@ -0,0 +1 @@
+Prompt files are only available in {% data variables.product.prodname_vscode_shortname %} and JetBrains IDEs.
diff --git a/data/reusables/copilot/prompt-files-preview-note.md b/data/reusables/copilot/prompt-files-preview-note.md
index 5666c4501167..1764fb474696 100644
--- a/data/reusables/copilot/prompt-files-preview-note.md
+++ b/data/reusables/copilot/prompt-files-preview-note.md
@@ -1,3 +1,3 @@
> [!NOTE]
-> * {% data variables.product.prodname_copilot_short %} prompt files are in {% data variables.release-phases.public_preview %} and subject to change. Prompt files are only available in {% data variables.product.prodname_vscode_shortname %}. See [AUTOTITLE](/copilot/concepts/prompting/response-customization?tool=vscode#about-prompt-files).
+> * {% data variables.product.prodname_copilot_short %} prompt files are in {% data variables.release-phases.public_preview %} and subject to change. {% data reusables.copilot.prompt-files-available-in-editors %} See [AUTOTITLE](/copilot/concepts/prompting/response-customization?tool=vscode#about-prompt-files).
> * For community-contributed examples of prompt files for specific languages and scenarios, see the [Awesome GitHub Copilot Customizations](https://github.com/github/awesome-copilot/blob/main/README.prompts.md) repository.
diff --git a/src/content-linter/scripts/lint-content.ts b/src/content-linter/scripts/lint-content.ts
index 2d0f18ca8612..a60ef3c83e77 100755
--- a/src/content-linter/scripts/lint-content.ts
+++ b/src/content-linter/scripts/lint-content.ts
@@ -575,18 +575,22 @@ function getMarkdownLintConfig(errorsOnly, runRules) {
for (const searchRule of ruleConfig.rules) {
const searchRuleSeverity = getRuleSeverity(searchRule, isPrecommit)
if (errorsOnly && searchRuleSeverity !== 'error') continue
- searchReplaceRules.push(searchRule)
+ // Add search-replace rules to frontmatter configuration for rules that make sense in frontmatter
+ // This ensures rules like TODOCS detection work in frontmatter
+ // Rules with applyToFrontmatter should ONLY run in the frontmatter pass (which lints the entire file)
+ // to avoid duplicate detections
+ if (searchRule.applyToFrontmatter) {
+ frontmatterSearchReplaceRules.push(searchRule)
+ } else {
+ // Only add to content rules if not a frontmatter-specific rule
+ searchReplaceRules.push(searchRule)
+ }
if (searchRule['partial-markdown-files']) {
dataSearchReplaceRules.push(searchRule)
}
if (searchRule['yml-files']) {
ymlSearchReplaceRules.push(searchRule)
}
- // Add search-replace rules to frontmatter configuration for rules that make sense in frontmatter
- // This ensures rules like TODOCS detection work in frontmatter
- if (searchRule.applyToFrontmatter) {
- frontmatterSearchReplaceRules.push(searchRule)
- }
}
if (searchReplaceRules.length > 0) {
diff --git a/src/events/components/events.ts b/src/events/components/events.ts
index b3a4ea19d4bb..bcb56b34be0d 100644
--- a/src/events/components/events.ts
+++ b/src/events/components/events.ts
@@ -98,6 +98,7 @@ export function sendEvent({
// Content information
referrer: getReferrer(document.referrer),
+ title: document.title,
href: location.href, // full URL
hostname: location.hostname, // origin without protocol or port
path: location.pathname, // path without search or host
@@ -118,6 +119,9 @@ export function sendEvent({
is_headless: isHeadless(),
viewport_width: document.documentElement.clientWidth,
viewport_height: document.documentElement.clientHeight,
+ screen_width: window.screen.width,
+ screen_height: window.screen.height,
+ pixel_ratio: window.devicePixelRatio || 1,
// Location information
timezone: new Date().getTimezoneOffset() / -60,
diff --git a/src/events/lib/schema.ts b/src/events/lib/schema.ts
index 8db06bd96f0c..e16260bb5b8d 100644
--- a/src/events/lib/schema.ts
+++ b/src/events/lib/schema.ts
@@ -44,6 +44,10 @@ const context = {
description: 'The browser value of `document.referrer`.',
format: 'uri-reference',
},
+ title: {
+ type: 'string',
+ description: 'The browser value of `document.title`.',
+ },
href: {
type: 'string',
description: 'The browser value of `location.href`.',
@@ -142,12 +146,27 @@ const context = {
viewport_width: {
type: 'number',
description: 'The viewport width, not the overall device size.',
- minimum: 1,
+ minimum: 0,
},
viewport_height: {
type: 'number',
description: 'The viewport height, not the overall device height.',
- minimum: 1,
+ minimum: 0,
+ },
+ screen_width: {
+ type: 'number',
+ description: 'The screen width of the device.',
+ minimum: 0,
+ },
+ screen_height: {
+ type: 'number',
+ description: 'The screen height of the device.',
+ minimum: 0,
+ },
+ pixel_ratio: {
+ type: 'number',
+ description: 'The device pixel ratio.',
+ minimum: 0,
},
// Location information
diff --git a/src/events/tests/middleware.ts b/src/events/tests/middleware.ts
index 40e0ce8af7bb..084401720e76 100644
--- a/src/events/tests/middleware.ts
+++ b/src/events/tests/middleware.ts
@@ -32,6 +32,7 @@ describe('POST /events', () => {
path: '/github/docs/issues',
hostname: 'github.com',
referrer: 'https://github.com/github/docs',
+ title: 'Issues · github/docs',
search: '?q=is%3Aissue+is%3Aopen+example+',
href: 'https://github.com/github/docs/issues?q=is%3Aissue+is%3Aopen+example+',
path_language: 'en',
@@ -44,6 +45,9 @@ describe('POST /events', () => {
is_headless: false,
viewport_width: 1418,
viewport_height: 501,
+ screen_width: 1920,
+ screen_height: 1080,
+ pixel_ratio: 2,
// Location information
timezone: -7,
@@ -64,6 +68,7 @@ describe('POST /events', () => {
path: '/github/docs/issues',
hostname: 'github.com',
referrer: 'https://github.com/github/docs',
+ title: 'Issues · github/docs',
search: '?q=is%3Aissue+is%3Aopen+example+',
href: 'https://github.com/github/docs/issues?q=is%3Aissue+is%3Aopen+example+',
path_language: 'en',
@@ -76,6 +81,9 @@ describe('POST /events', () => {
is_headless: false,
viewport_width: 1418,
viewport_height: 501,
+ screen_width: 1920,
+ screen_height: 1080,
+ pixel_ratio: 2,
// Location information
timezone: -7,
diff --git a/src/events/types.ts b/src/events/types.ts
index b66f5e30613b..cbe3c5302338 100644
--- a/src/events/types.ts
+++ b/src/events/types.ts
@@ -24,6 +24,7 @@ export type EventProps = {
created: string
page_event_id: string
referrer: string
+ title?: string
href: string
hostname: string
path: string
@@ -31,9 +32,10 @@ export type EventProps = {
hash: string
path_language: string
path_version: string
+ path_product?: string
path_article: string
- path_document_type: string
- path_type: string
+ page_document_type: string
+ page_type: string
status: number
is_logged_in: boolean
dotcom_user: string
@@ -42,15 +44,21 @@ export type EventProps = {
os_version: string
browser: string
browser_version: string
+ is_headless: boolean
+ viewport_width?: number
+ viewport_height?: number
+ screen_width?: number
+ screen_height?: number
+ pixel_ratio?: number
timezone: number
user_language: string
+ os_preference: string
application_preference: string
color_mode_preference: string
- os_preference: string
code_display_preference: string
+ experiment_variation?: string
event_group_key?: string
event_group_id?: string
- is_headless: boolean
}
}