diff --git a/Dockerfile b/Dockerfile index bee215efbe9b..2573d0924ce9 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:20251114-221740-gd084d271e AS base +FROM ghcr.io/github/gh-base-image/gh-base-noble:20251119-090131-gb27dc275c 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/enforcing-policies/enforcing-policy-with-pre-receive-hooks/about-pre-receive-hooks.md b/content/admin/enforcing-policies/enforcing-policy-with-pre-receive-hooks/about-pre-receive-hooks.md index 505f2dc300aa..98ccf11b8b1a 100644 --- a/content/admin/enforcing-policies/enforcing-policy-with-pre-receive-hooks/about-pre-receive-hooks.md +++ b/content/admin/enforcing-policies/enforcing-policy-with-pre-receive-hooks/about-pre-receive-hooks.md @@ -44,6 +44,26 @@ Due to risk of failure and performance impact for all users of your instance, we > [!NOTE] > To avoid rejection of a push due to a timeout, all combined pre-receive hooks should run in under five seconds. +## Pre-receive hook timeouts + +Pre-receive hooks in {% data variables.product.prodname_ghe_server %} have a fixed timeout budget of 5 seconds (shared across all hooks). This is intentional design to prevent resource exhaustion from long-running hooks and to prevent runaway scripts from blocking repository operations indefinitely. + +All pre-receive hooks for a repository share a **cumulative timeout budget**: +- If hook A takes 3 seconds, hook B gets 2 seconds remaining (from 5 second default) +- If hook A times out at 5 seconds, hook B never executes + +> [!IMPORTANT] +> Pre-receive hook timeouts are handled differently from exit codes: +> - **Exit codes**: Enforcement configuration is honored (non-enforced hooks don't block pushes) +> - **Timeouts**: Push may fail regardless of enforcement configuration + +### Timeout behavior + +Scenario | Enforcement = Enabled | Enforcement = Disabled/Testing +----------|----------------------|-------------------------------- +Exit code ≠ 0 | Push rejected | Push continues (warning only) +Timeout exceeded | Push rejected | Warning + push may still fail + {% ifversion ghes > 3.16 %} {% data reusables.repositories.push-rule-and-prereceive-hooks %} diff --git a/content/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app.md b/content/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app.md index dfc96c67a483..a009953a3e29 100644 --- a/content/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app.md +++ b/content/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app.md @@ -20,7 +20,7 @@ Your JWT must be signed using the `RS256` algorithm and must contain the followi |---|---|---| |`iat`| Issued At | The time that the JWT was created. To protect against clock drift, we recommend that you set this 60 seconds in the past and ensure that your server's date and time is set accurately (for example, by using the Network Time Protocol). | |`exp`| Expires At | The expiration time of the JWT, after which it can't be used to request an installation token. The time must be no more than 10 minutes into the future. | -|`iss`| Issuer | The client ID or application ID of your {% data variables.product.prodname_github_app %}. This value is used to find the right public key to verify the signature of the JWT. You can find your app's IDs on the settings page for your {% data variables.product.prodname_github_app %}. Use of the client ID is recommended. For more information about navigating to the settings page for your {% data variables.product.prodname_github_app %}, see [AUTOTITLE](/apps/maintaining-github-apps/modifying-a-github-app-registration#navigating-to-your-github-app-settings).| +|`iss`| Issuer | The {% ifversion client-id-for-app %}client ID or {% endif %}application ID of your {% data variables.product.prodname_github_app %}. This value is used to find the right public key to verify the signature of the JWT. You can find your app's ID{% ifversion client-id-for-app %}s{% endif %} on the settings page for your {% data variables.product.prodname_github_app %}.{% ifversion client-id-for-app %} Use of the client ID is recommended.{% endif %} For more information about navigating to the settings page for your {% data variables.product.prodname_github_app %}, see [AUTOTITLE](/apps/maintaining-github-apps/modifying-a-github-app-registration#navigating-to-your-github-app-settings).| |`alg`| Message authentication code algorithm | This should be `RS256` since your JWT must be signed using the `RS256` algorithm. | To use a JWT, pass it in the `Authorization` header of an API request. For example: @@ -47,7 +47,7 @@ Most programming languages have a package that can generate a JWT. In all cases, > [!NOTE] > You must run `gem install jwt` to install the `jwt` package in order to use this script. -In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace `YOUR_CLIENT_ID` with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` and `YOUR_CLIENT_ID` in double quotes. +In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` and {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} in double quotes. ```ruby require 'openssl' @@ -63,10 +63,11 @@ payload = { iat: Time.now.to_i - 60, # JWT expiration time (10 minute maximum) exp: Time.now.to_i + (10 * 60), - + {% ifversion client-id-for-app %} # {% data variables.product.prodname_github_app %}'s client ID - iss: "YOUR_CLIENT_ID" - + iss: "YOUR_CLIENT_ID"{% else %} +# {% data variables.product.prodname_github_app %}'s app ID + iss: "YOUR_APP_ID"{% endif %} } jwt = JWT.encode(payload, private_key, "RS256") @@ -92,12 +93,19 @@ if len(sys.argv) > 1: else: pem = input("Enter path of private PEM file: ") +{% ifversion client-id-for-app %} # Get the Client ID if len(sys.argv) > 2: client_id = sys.argv[2] else: client_id = input("Enter your Client ID: ") - +{% else %} +# Get the App ID +if len(sys.argv) > 2: + app_id = sys.argv[2] +else: + app_id = input("Enter your APP ID: ") +{% endif %} # Open PEM with open(pem, 'rb') as pem_file: @@ -108,9 +116,11 @@ payload = { 'iat': int(time.time()), # JWT expiration time (10 minutes maximum) 'exp': int(time.time()) + 600, - + {% ifversion client-id-for-app %} # {% data variables.product.prodname_github_app %}'s client ID - 'iss': client_id + 'iss': client_id{% else %} + # {% data variables.product.prodname_github_app %}'s app ID + 'iss': app_id{% endif %} } @@ -125,14 +135,16 @@ This script will prompt you for the file path where your private key is stored a ### Example: Using Bash to generate a JWT > [!NOTE] -> You must pass your Client ID and the file path where your private key is stored as arguments when running this script. +> You must pass your {% ifversion client-id-for-app %}Client ID{% else %}App ID{% endif %} and the file path where your private key is stored as arguments when running this script. ```bash copy #!/usr/bin/env bash -set -o pipefail +{% ifversion client-id-for-app %} client_id=$1 # Client ID as first argument - +{% else %} +app_id=$1 # App ID as first argument +{% endif %} pem=$( cat $2 ) # file path of the private key as second argument now=$(date +%s) @@ -151,7 +163,7 @@ header=$( echo -n "${header_json}" | b64enc ) payload_json="{ \"iat\":${iat}, \"exp\":${exp}, - \"iss\":\"${client_id}\" + {% ifversion client-id-for-app %}\"iss\":\"${client_id}\"{% else %}\"iss\":\"${app_id}\"{% endif %} }" # Payload encode payload=$( echo -n "${payload_json}" | b64enc ) @@ -170,13 +182,16 @@ printf '%s\n' "JWT: $JWT" ### Example: Using PowerShell to generate a JWT -In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace `YOUR_CLIENT_ID` with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` in double quotes. +In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` in double quotes. ```powershell copy #!/usr/bin/env pwsh +{% ifversion client-id-for-app %} $client_id = YOUR_CLIENT_ID - +{% else %} +$app_id = YOUR_APP_ID +{% endif %} $private_key_path = "YOUR_PATH_TO_PEM" $header = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{ @@ -187,7 +202,7 @@ $header = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Conve $payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{ iat = [System.DateTimeOffset]::UtcNow.AddSeconds(-10).ToUnixTimeSeconds() exp = [System.DateTimeOffset]::UtcNow.AddMinutes(10).ToUnixTimeSeconds() - iss = $client_id + {% ifversion client-id-for-app %}iss = $client_id{% else %}iss = $app_id{% endif %} }))).TrimEnd('=').Replace('+', '-').Replace('/', '_'); $rsa = [System.Security.Cryptography.RSA]::Create() diff --git a/content/billing/concepts/cost-centers.md b/content/billing/concepts/cost-centers.md index 034ce454799b..894eac856c2e 100644 --- a/content/billing/concepts/cost-centers.md +++ b/content/billing/concepts/cost-centers.md @@ -35,3 +35,4 @@ For more details, see [AUTOTITLE](/billing/reference/cost-center-allocation). * The maximum number of resources per cost center is 10,000. * A maximum of 50 resources can be added to or removed from a cost center at a time. * Azure subscriptions can only be added to or removed from cost centers through the UI. +* Outside collaborators can only be added to cost centers via the cost center API. For more information, see [AUTOTITLE](/billing/tutorials/control-costs-at-scale#add-resources-to-the-cost-center). diff --git a/content/copilot/concepts/agents/code-review.md b/content/copilot/concepts/agents/code-review.md index 1580e239df44..5d428c67f997 100644 --- a/content/copilot/concepts/agents/code-review.md +++ b/content/copilot/concepts/agents/code-review.md @@ -26,7 +26,28 @@ category: This article provides an overview of {% data variables.copilot.copilot_code-review_short %}. For instructions on how to request a code review from {% data variables.product.prodname_copilot_short %}, see [AUTOTITLE](/copilot/how-tos/agents/copilot-code-review/using-copilot-code-review). -### {% data variables.copilot.copilot_code-review-tools-preview_cap %} +## Availability + +{% data variables.copilot.copilot_code-review_short %} is supported in: + +* {% data variables.product.prodname_dotcom_the_website %} +* {% data variables.product.prodname_mobile %} +* {% data variables.product.prodname_vscode_shortname %} +* {% data variables.product.prodname_vs %} +* Xcode +* JetBrains IDEs + +{% data variables.copilot.copilot_code-review_short %} is a premium feature, available with the {% data variables.copilot.copilot_pro_short %}, {% data variables.copilot.copilot_pro_plus_short %}, {% data variables.copilot.copilot_business_short %}, and {% data variables.copilot.copilot_enterprise_short %} plans. See [Copilot plans](https://github.com/features/copilot/plans?ref_product=copilot&ref_type=purchase&ref_style=text). + +If you receive {% data variables.product.prodname_copilot_short %} from an organization then, to be able to request a pull request review from {% data variables.product.prodname_copilot_short %} on {% data variables.product.prodname_dotcom_the_website %} or in {% data variables.product.prodname_mobile %}, the **{% data variables.copilot.copilot_code-review_short %}** option must be enabled in the {% data variables.product.prodname_copilot_short %} policy settings for the organization. See [AUTOTITLE](/copilot/how-tos/administer/organizations/managing-policies-for-copilot-in-your-organization). + +## Excluded files + +Dependency management files (such as package.json and Gemfile.lock) and certain other types of files (such as log files and SVGs) are excluded from {% data variables.copilot.copilot_code-review_short %}. If you include any of these files in a pull request, {% data variables.copilot.copilot_code-review_short %} will not consider the file when carrying out the review. Similarly, using {% data variables.copilot.copilot_code-review_short %} on one of these files in your IDE, will not generate review comments. + +For more information, see [AUTOTITLE](/copilot/reference/review-excluded-files). + +## {% data variables.copilot.copilot_code-review-tools-preview_cap %} > [!NOTE] > @@ -50,21 +71,6 @@ In the event that {% data variables.product.prodname_actions %} is unavailable o > > Usage charges will apply when the feature becomes generally available. -## Availability - -{% data variables.copilot.copilot_code-review_short %} is supported in: - -* {% data variables.product.prodname_dotcom_the_website %} -* {% data variables.product.prodname_mobile %} -* {% data variables.product.prodname_vscode_shortname %} -* {% data variables.product.prodname_vs %} -* Xcode -* JetBrains IDEs - -{% data variables.copilot.copilot_code-review_short %} is a premium feature, available with the {% data variables.copilot.copilot_pro_short %}, {% data variables.copilot.copilot_pro_plus_short %}, {% data variables.copilot.copilot_business_short %}, and {% data variables.copilot.copilot_enterprise_short %} plans. See [Copilot plans](https://github.com/features/copilot/plans?ref_product=copilot&ref_type=purchase&ref_style=text). - -If you receive {% data variables.product.prodname_copilot_short %} from an organization then, to be able to request a pull request review from {% data variables.product.prodname_copilot_short %} on {% data variables.product.prodname_dotcom_the_website %} or in {% data variables.product.prodname_mobile %}, the **{% data variables.copilot.copilot_code-review_short %}** option must be enabled in the {% data variables.product.prodname_copilot_short %} policy settings for the organization. See [AUTOTITLE](/copilot/how-tos/administer/organizations/managing-policies-for-copilot-in-your-organization). - ## Code review monthly quota Each time {% data variables.product.prodname_copilot_short %} reviews a pull request, or reviews code in your IDE, your monthly quota of Copilot premium requests is reduced by one. diff --git a/content/copilot/reference/ai-models/model-hosting.md b/content/copilot/reference/ai-models/model-hosting.md index 2aa0dfbc9845..498e0558fa97 100644 --- a/content/copilot/reference/ai-models/model-hosting.md +++ b/content/copilot/reference/ai-models/model-hosting.md @@ -46,11 +46,20 @@ Used for: ## Anthropic models + + + + +{% data reusables.copilot.claude-promo-period %} See [Model multipliers](/copilot/reference/ai-models/supported-models#model-multipliers). + + + Used for: * {% data variables.copilot.copilot_claude_haiku_45 %} * {% data variables.copilot.copilot_claude_sonnet_45 %} * {% data variables.copilot.copilot_claude_opus_41 %} +* {% data variables.copilot.copilot_claude_opus_45 %} * {% data variables.copilot.copilot_claude_sonnet_40 %} These models are hosted by Amazon Web Services, Anthropic PBC, and Google Cloud Platform. {% data variables.product.github %} has provider agreements in place to ensure data is not used for training. Additional details for each provider are included below: @@ -80,8 +89,6 @@ When using {% data variables.copilot.copilot_gemini %} models, input prompts and {% data reusables.copilot.grok-promo-period %} -Complimentary access to Grok Code Fast 1 is continuing past the previously announced end time. A new end date has not been set. We may update or conclude this promotion at any time. Regular pricing applies after the extension ends. See [AUTOTITLE](/copilot/reference/ai-models/supported-models#model-multipliers). - These models are hosted on xAI. xAI operates {% data variables.copilot.copilot_grok_code %} in {% data variables.product.prodname_copilot %} under a zero data retention API policy. This means xAI commits that user content (both inputs sent to the model and outputs generated by the model): Will **not** be: diff --git a/content/copilot/reference/ai-models/supported-models.md b/content/copilot/reference/ai-models/supported-models.md index bb200cd4e228..e45b20d77846 100644 --- a/content/copilot/reference/ai-models/supported-models.md +++ b/content/copilot/reference/ai-models/supported-models.md @@ -98,6 +98,14 @@ Each model has a premium request multiplier, based on its complexity and resourc For more information about premium requests, see [AUTOTITLE](/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests). + + + + +{% data reusables.copilot.claude-promo-period %} + + + {% data reusables.copilot.model-multipliers %} ## Next steps diff --git a/content/copilot/reference/index.md b/content/copilot/reference/index.md index 2f9e400bf016..5cf4d79e94f5 100644 --- a/content/copilot/reference/index.md +++ b/content/copilot/reference/index.md @@ -17,6 +17,7 @@ children: - /metrics-data - /copilot-billing - /agentic-audit-log-events + - /review-excluded-files - /copilot-usage-metrics contentType: reference --- diff --git a/content/copilot/reference/review-excluded-files.md b/content/copilot/reference/review-excluded-files.md new file mode 100644 index 000000000000..4a651c87749f --- /dev/null +++ b/content/copilot/reference/review-excluded-files.md @@ -0,0 +1,86 @@ +--- +title: Files excluded from {% data variables.copilot.copilot_code-review %} +shortTitle: Review excluded files +intro: 'Understand the types of files that are excluded from a review by {% data variables.product.prodname_copilot_short %}.' +versions: + feature: copilot +topics: + - Copilot +category: + - Author and optimize with Copilot +contentType: reference +--- + +Certain types of files are excluded from {% data variables.copilot.copilot_code-review_short %}. These include dependency management files, log files, SVG files, and files in locations typically reserved for vendor files or automatically generated files. + +If you include any of these files in a pull request, {% data variables.copilot.copilot_code-review_short %} will not consider the file when carrying out the review. Similarly, using {% data variables.copilot.copilot_code-review_short %} on one of these files in your IDE, will not generate review comments. + +This is an example of some of the files that are excluded from {% data variables.copilot.copilot_code-review_short %}: + +* `.gitignore` +* `package-lock.json` +* `yarn.lock` +* `jest.config.js` +* `next.config.js` +* `tailwind.config.js` +* `tsconfig.json` +* `requirements.txt` +* `Pipfile.lock` +* `Gemfile.lock` +* `composer.lock` +* `Cargo.lock` +* `go.sum` +* `paket.lock` +* `pubspec.lock` +* `stack.yaml` +* `elm.json` +* `Project.toml` +* `Manifest.toml` +* `renv.lock` +* `build.sbt` +* `Package.resolved` +* `deps.edn` +* `build.gradle` +* `mix.lock` +* `build.gradle.kts` +* `cpanfile` +* `Podfile.lock` +* `conanfile.txt` +* `info.rkt` +* `rockspec` +* `opam` +* `rebar.config` +* `nimble` +* `shard.yml` +* `dub.json` +* `dub.sdl` +* `GPR` +* `Mason.toml` +* `fpm.toml` +* `pack.pl` +* `baseline.st` +* `PacletInfo.m` +* `info.ss` +* `Jpkg` +* `box.json` +* `GNAVI.xml` + +Files matching these patterns are also excluded: + +* `**/*.svg` +* `**/*.log` +* `**/*.lock` +* `**/go.sum` +* `**/*.ipynb.raw.html` +* `**/dist/**/*` +* `**/node_modules/**/*` +* `**/*.min.js` +* `**/*.d.ts` +* `**/coverage/**/*` +* `**/*.bundle.js` +* `**/*.map` +* `**/out/**/*` +* `**/vendor/**/*` +* `**/bin/**/*` +* `**/generated/**/*` +* `**/generated-sources/**/*` diff --git a/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md b/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md index b11722a45be5..be07decf8ef4 100644 --- a/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md +++ b/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md @@ -52,7 +52,7 @@ You{% ifversion custom-org-roles %}, and any users with the "Edit custom propert ![Screenshot the page to set values for repositories. A button, labeled with a pencil icon and "Edit properties", is highlighted with an orange outline.](/assets/images/help/repository/edit-properties.png) -1. In the modal dialog that appears, select a value for each property you'd like to set for the selected repositories. +1. In the modal dialog that appears, select a value for each property you'd like to set for the selected repositories. This value cannot exceed 75 characters in length. 1. Click **Save changes**. ## Viewing values for repositories in your organization diff --git a/content/sponsors/receiving-sponsorships-through-github-sponsors/using-a-fiscal-host-to-receive-github-sponsors-payouts.md b/content/sponsors/receiving-sponsorships-through-github-sponsors/using-a-fiscal-host-to-receive-github-sponsors-payouts.md index 1e347cec56b9..b429cf3a4eb0 100644 --- a/content/sponsors/receiving-sponsorships-through-github-sponsors/using-a-fiscal-host-to-receive-github-sponsors-payouts.md +++ b/content/sponsors/receiving-sponsorships-through-github-sponsors/using-a-fiscal-host-to-receive-github-sponsors-payouts.md @@ -24,6 +24,7 @@ When you sign up for a {% data variables.product.prodname_sponsors %} profile so * [Open Collective Europe](https://opencollective.com/europe) * [Open Source Collective](https://opencollective.com/opensource) * [Python Software Foundation](https://www.python.org/psf-landing/) +* [Radiant Earth](https://radiant.earth/) * [Software in the Public Interest](https://www.spi-inc.org/) * [Software Underground](https://softwareunderground.org/) diff --git a/data/features/client-id-for-app.yml b/data/features/client-id-for-app.yml new file mode 100644 index 000000000000..7a98fcd59dac --- /dev/null +++ b/data/features/client-id-for-app.yml @@ -0,0 +1,6 @@ +# Reference: #14091 + +versions: + fpt: '*' + ghec: '*' + ghes: '>=3.18' diff --git a/data/reusables/copilot/claude-promo-period.md b/data/reusables/copilot/claude-promo-period.md new file mode 100644 index 000000000000..ea437677b145 --- /dev/null +++ b/data/reusables/copilot/claude-promo-period.md @@ -0,0 +1 @@ +> [!Important] {% data variables.copilot.copilot_claude_opus_45 %} has a promotional multiplier of **1** through Friday, December 5, 2025. After that date, the multiplier will change to **3**. diff --git a/data/reusables/enterprise-onboarding/creating-custom-properties.md b/data/reusables/enterprise-onboarding/creating-custom-properties.md index 64db02761a57..11a4856beeb6 100644 --- a/data/reusables/enterprise-onboarding/creating-custom-properties.md +++ b/data/reusables/enterprise-onboarding/creating-custom-properties.md @@ -25,7 +25,7 @@ You can add custom properties to your enterprise to make those properties availa {% data reusables.enterprise-accounts.access-enterprise %} 1. In the left sidebar, under "Policies", click **Custom properties**. 1. To add a new custom property, in the upper-right corner, click **New property**. -1. Enter a name, description, and type for the custom property. The name must be unique across all of your organizations, and cannot contain spaces. +1. Enter a name, description, and type for the custom property. The name must be unique across all of your organizations, can't contain spaces, and cannot exceed 75 characters in length. 1. Optionally, select **Allow repository actors to set this property**. When enabled, repository users and apps with the repository-level `custom properties` fine-grained permission will be able to set and update the property value for their repository. Additionally, any actor creating a repository can set the property on the repository. 1. Optionally, select **Require this property for all repositories** and add a default value. This means that you require that all repositories in your enterprise have a value for this property. Repositories that don’t have an explicit value for this property will inherit the default value. 1. Click **Save property**. diff --git a/data/tables/copilot/model-multipliers.yml b/data/tables/copilot/model-multipliers.yml index 10ce00d0ad46..e84196b9e475 100644 --- a/data/tables/copilot/model-multipliers.yml +++ b/data/tables/copilot/model-multipliers.yml @@ -17,6 +17,10 @@ multiplier_paid: 10 multiplier_free: Not applicable +- name: Claude Opus 4.5 + multiplier_paid: 1 (**3** after Dec 5, 2025) + multiplier_free: Not applicable + - name: Claude Sonnet 4 multiplier_paid: 1 multiplier_free: Not applicable diff --git a/data/tables/copilot/model-release-status.yml b/data/tables/copilot/model-release-status.yml index 78ef028992e9..d20ba3f0bacc 100644 --- a/data/tables/copilot/model-release-status.yml +++ b/data/tables/copilot/model-release-status.yml @@ -82,6 +82,13 @@ ask_mode: true edit_mode: true +- name: 'Claude Opus 4.5' + provider: 'Anthropic' + release_status: 'Public preview' + agent_mode: true + ask_mode: true + edit_mode: true + - name: 'Claude Sonnet 4' provider: 'Anthropic' release_status: 'GA' diff --git a/data/tables/copilot/model-supported-clients.yml b/data/tables/copilot/model-supported-clients.yml index 151dc7bcc116..bb94dddca429 100644 --- a/data/tables/copilot/model-supported-clients.yml +++ b/data/tables/copilot/model-supported-clients.yml @@ -29,6 +29,14 @@ xcode: true jetbrains: true +- name: Claude Opus 4.5 + dotcom: true + vscode: true + vs: false + eclipse: false + xcode: false + jetbrains: false + - name: Claude Sonnet 4 dotcom: true vscode: true diff --git a/data/tables/copilot/model-supported-plans.yml b/data/tables/copilot/model-supported-plans.yml index 63d94d9f89dd..c0db26603d48 100644 --- a/data/tables/copilot/model-supported-plans.yml +++ b/data/tables/copilot/model-supported-plans.yml @@ -26,6 +26,13 @@ business: false enterprise: true +- name: Claude Opus 4.5 + free: false + pro: true + pro_plus: true + business: true + enterprise: true + - name: Claude Sonnet 4 free: false pro: true diff --git a/data/variables/copilot.yml b/data/variables/copilot.yml index 07fd47e4c8f5..ca733c518085 100644 --- a/data/variables/copilot.yml +++ b/data/variables/copilot.yml @@ -138,6 +138,7 @@ copilot_claude: 'Claude' copilot_claude_haiku_45: 'Claude Haiku 4.5' copilot_claude_opus: 'Claude Opus 4' copilot_claude_opus_41: 'Claude Opus 4.1' +copilot_claude_opus_45: 'Claude Opus 4.5' copilot_claude_sonnet: 'Claude Sonnet' copilot_claude_sonnet_35: 'Claude Sonnet 3.5' copilot_claude_sonnet_37: 'Claude Sonnet 3.7' diff --git a/src/landings/components/journey/JourneyLearningTracks.module.scss b/src/landings/components/journey/JourneyLearningTracks.module.scss index 58e3fff5fda1..44b7dcf89f29 100644 --- a/src/landings/components/journey/JourneyLearningTracks.module.scss +++ b/src/landings/components/journey/JourneyLearningTracks.module.scss @@ -1,11 +1,12 @@ -.learningTracks { +.journeyTracks { + margin-bottom: 1rem; + margin-left: 1rem; +} + +.trackCard { border: 1px solid var(--borderColor-default, var(--color-border-default, #d1d9e0)); border-radius: 12px; - padding: 1.5rem; - padding-bottom: 0.75rem; - margin-bottom: 1rem; - margin-left: 1rem; box-shadow: 0px 1px 3px 0px rgba(31, 35, 40, 0.08), 0px 1px 0px 0px rgba(31, 35, 40, 0.06); @@ -15,6 +16,24 @@ --bgColor-default, var(--color-canvas-default, #ffffff) ); + transition: all 0.2s ease-in-out; + + // journey card hover effect only when the card is not expanded + &:not([open]):hover { + box-shadow: + 0 0.25rem 0.5rem 0 rgba(31, 35, 40, 0.12), + 0 0.125rem 0.25rem 0 rgba(31, 35, 40, 0.08); + transform: translateY(-2px); + background-color: var(--bgColor-muted, var(--color-canvas-subtle)); + } +} + +.trackSummary { + list-style: none; + cursor: pointer; + display: block; + position: relative; + padding: 1.5rem 1.5rem 1.75rem 1.5rem; } .trackHeader { @@ -26,25 +45,25 @@ gap: 0.5rem; } -.anchorLink { - color: var(--fgColor-default, var(--color-fg-default, #1f2328)); - text-decoration: none; -} - .trackDescription { - margin: 0 0 1rem 0; - color: var(--fgColor-muted, var(--color-fg-muted, #656d76)); + margin: 0; + padding-right: 2rem; + + p { + margin: 0; + color: var(--fgColor-muted, var(--color-fg-muted, #656d76)); + } } .expandButton { - top: 0; - right: 0; + top: 1.5rem; + right: 1.5rem; } .trackGuides { - margin-top: 1rem; - margin-bottom: 1rem; - padding-left: 0; + margin-top: 0; + margin-bottom: 0; + padding: 0 1.5rem 0.75rem 1.5rem; list-style: none; counter-reset: guide-counter; } @@ -76,11 +95,6 @@ line-height: 1; } -.guideLink { - color: var(--fgColor-accent, var(--color-accent-fg, #0969da)); - text-decoration: none; -} - /* Hide only the timeline line that extends below the last badge, preserve everything else */ .timelineContainer :global(.Timeline-Item:last-child::before) { background: linear-gradient( @@ -189,21 +203,20 @@ } .mobileItem .mobileTile { - border: 1px solid - var(--borderColor-default, var(--color-border-default, #d1d9e0)); - border-radius: 12px; - padding: 1rem; margin-top: 0.5rem; text-align: left; - box-shadow: - 0px 1px 3px 0px rgba(31, 35, 40, 0.08), - 0px 1px 0px 0px rgba(31, 35, 40, 0.06); - position: relative; - z-index: 3; - background-color: var( - --bgColor-default, - var(--color-canvas-default, #ffffff) - ); + + .trackCard { + z-index: 3; + } + + .trackSummary { + padding: 1rem 1rem 1.75rem 1rem; + } + + .trackGuides { + padding: 0 1rem 0.75rem 1rem; + } } /* Desktop: show Timeline component */ diff --git a/src/landings/components/journey/JourneyLearningTracks.tsx b/src/landings/components/journey/JourneyLearningTracks.tsx index 03997a07873c..20cbcc355b34 100644 --- a/src/landings/components/journey/JourneyLearningTracks.tsx +++ b/src/landings/components/journey/JourneyLearningTracks.tsx @@ -1,6 +1,6 @@ /* filepath: /workspaces/docs-internal/src/landings/components/journey/JourneyLearningTracks.tsx */ import { ChevronDownIcon, ChevronUpIcon } from '@primer/octicons-react' -import { Button, Details, Timeline, Token, useDetails } from '@primer/react' +import { Details, Timeline, Token, useDetails } from '@primer/react' import { Link } from '@/frame/components/Link' import { JourneyTrack } from '@/journeys/lib/journey-path-resolver' import styles from './JourneyLearningTracks.module.scss' @@ -14,40 +14,38 @@ export const JourneyLearningTracks = ({ tracks }: JourneyLearningTracksProps) => return null } - const renderTrackContent = (track: JourneyTrack, trackIndex: number) => { + const renderTrackContent = (track: JourneyTrack) => { const { getDetailsProps, open } = useDetails({}) return ( - <> -
-

{track.title}

- -
-

{track.description}

-
- -
    - {(track.guides || []).map((article: { href: string; title: string }) => ( -
  1. - - {article.title} - -
  2. - ))} -
-
- + + +
    + {(track.guides || []).map((article: { href: string; title: string }) => ( +
  1. + + {article.title} + +
  2. + ))} +
+ ) } @@ -60,10 +58,8 @@ export const JourneyLearningTracks = ({ tracks }: JourneyLearningTracksProps) => return ( {trackIndex + 1} - -
- {renderTrackContent(track, trackIndex)} -
+ + {renderTrackContent(track)}
) @@ -76,11 +72,7 @@ export const JourneyLearningTracks = ({ tracks }: JourneyLearningTracksProps) => {tracks.map((track, trackIndex) => (
{trackIndex + 1}
-
-
- {renderTrackContent(track, trackIndex)} -
-
+
{renderTrackContent(track)}
{trackIndex < tracks.length - 1 &&
}
))}