diff --git a/.github/workflows/sync-codeql-cli.yml b/.github/workflows/sync-codeql-cli.yml index 479ba17e8282..a8e067ec0e69 100644 --- a/.github/workflows/sync-codeql-cli.yml +++ b/.github/workflows/sync-codeql-cli.yml @@ -92,7 +92,7 @@ jobs: branchCheckout=$(git checkout -b $branchname) if [[ ! $? -eq 0 ]]; then - echo "Branch $branchname already exists in `github/docs-internal`. Exiting..." + echo "Branch $branchname already exists in 'github/docs-internal'. Exiting..." exit 0 fi git add . diff --git a/assets/images/_fixtures/screenshot.png b/assets/images/_fixtures/screenshot.png index ea7ede838ceb..6464af82ac75 100644 Binary files a/assets/images/_fixtures/screenshot.png and b/assets/images/_fixtures/screenshot.png differ diff --git a/assets/images/banner-images/hero-1.png b/assets/images/banner-images/hero-1.png index 60df8ea86ed2..fc6e97fc7cc2 100644 Binary files a/assets/images/banner-images/hero-1.png and b/assets/images/banner-images/hero-1.png differ diff --git a/assets/images/banner-images/hero-2.png b/assets/images/banner-images/hero-2.png index 0d02dfd6c078..be6ce3cf2fdb 100644 Binary files a/assets/images/banner-images/hero-2.png and b/assets/images/banner-images/hero-2.png differ diff --git a/assets/images/banner-images/hero-3.png b/assets/images/banner-images/hero-3.png index 7de28041c963..05fa9bb53f83 100644 Binary files a/assets/images/banner-images/hero-3.png and b/assets/images/banner-images/hero-3.png differ diff --git a/assets/images/banner-images/hero-4.png b/assets/images/banner-images/hero-4.png index 8d2bcb1ebaf6..d177ffd57c35 100644 Binary files a/assets/images/banner-images/hero-4.png and b/assets/images/banner-images/hero-4.png differ diff --git a/assets/images/banner-images/hero-5.png b/assets/images/banner-images/hero-5.png index ef06249436e7..24bd51149d28 100644 Binary files a/assets/images/banner-images/hero-5.png and b/assets/images/banner-images/hero-5.png differ diff --git a/assets/images/banner-images/hero-6.png b/assets/images/banner-images/hero-6.png index 3f68a2ebdf33..12e212e8492d 100644 Binary files a/assets/images/banner-images/hero-6.png and b/assets/images/banner-images/hero-6.png differ diff --git a/assets/images/enterprise/management-console/upload-license.png b/assets/images/enterprise/management-console/upload-license.png index 4c4362766f9d..31b621f2aac0 100644 Binary files a/assets/images/enterprise/management-console/upload-license.png and b/assets/images/enterprise/management-console/upload-license.png differ diff --git a/assets/images/help/actions/actions-vnet-injected-larger-runners-architecture.png b/assets/images/help/actions/actions-vnet-injected-larger-runners-architecture.png index 84515a6bd12b..0042781e8154 100644 Binary files a/assets/images/help/actions/actions-vnet-injected-larger-runners-architecture.png and b/assets/images/help/actions/actions-vnet-injected-larger-runners-architecture.png differ diff --git a/assets/images/help/billing/copilot-billing-entity-dropdown.png b/assets/images/help/billing/copilot-billing-entity-dropdown.png index c4964c37a40e..cc8bf89687ee 100644 Binary files a/assets/images/help/billing/copilot-billing-entity-dropdown.png and b/assets/images/help/billing/copilot-billing-entity-dropdown.png differ diff --git a/assets/images/help/billing/org-budget-example.png b/assets/images/help/billing/org-budget-example.png index 9b6ba13cf122..21051d85e039 100644 Binary files a/assets/images/help/billing/org-budget-example.png and b/assets/images/help/billing/org-budget-example.png differ diff --git a/assets/images/help/billing/overview-product-summary.png b/assets/images/help/billing/overview-product-summary.png index 4e9dc18ce55a..dcc993cfd3b9 100644 Binary files a/assets/images/help/billing/overview-product-summary.png and b/assets/images/help/billing/overview-product-summary.png differ diff --git a/assets/images/help/billing/premium-request-analytics-chart-download.png b/assets/images/help/billing/premium-request-analytics-chart-download.png index 23a3ee503c53..f399146ecabe 100644 Binary files a/assets/images/help/billing/premium-request-analytics-chart-download.png and b/assets/images/help/billing/premium-request-analytics-chart-download.png differ diff --git a/assets/images/help/billing/premium-request-analytics-chart.png b/assets/images/help/billing/premium-request-analytics-chart.png index 887f04557d9e..fa76097fd89c 100644 Binary files a/assets/images/help/billing/premium-request-analytics-chart.png and b/assets/images/help/billing/premium-request-analytics-chart.png differ diff --git a/assets/images/help/billing/premium-request-analytics-org-table.png b/assets/images/help/billing/premium-request-analytics-org-table.png index 301dd6359315..48636f41a9b6 100644 Binary files a/assets/images/help/billing/premium-request-analytics-org-table.png and b/assets/images/help/billing/premium-request-analytics-org-table.png differ diff --git a/assets/images/help/billing/product-usage-chart.png b/assets/images/help/billing/product-usage-chart.png index 4381cbd9eeb1..2dceb3579f21 100644 Binary files a/assets/images/help/billing/product-usage-chart.png and b/assets/images/help/billing/product-usage-chart.png differ diff --git a/assets/images/help/business-accounts/download-invoice.png b/assets/images/help/business-accounts/download-invoice.png index 86e955b2e78c..3b37bdeabb40 100644 Binary files a/assets/images/help/business-accounts/download-invoice.png and b/assets/images/help/business-accounts/download-invoice.png differ diff --git a/assets/images/help/business-accounts/pay-invoice-button.png b/assets/images/help/business-accounts/pay-invoice-button.png index 0ff630bbd774..35dfa78c2820 100644 Binary files a/assets/images/help/business-accounts/pay-invoice-button.png and b/assets/images/help/business-accounts/pay-invoice-button.png differ diff --git a/assets/images/help/business-accounts/view-invoice-link.png b/assets/images/help/business-accounts/view-invoice-link.png index e887e43e200b..cc5341fda454 100644 Binary files a/assets/images/help/business-accounts/view-invoice-link.png and b/assets/images/help/business-accounts/view-invoice-link.png differ diff --git a/assets/images/help/code-quality/ai-suggestions-repo-fixes.png b/assets/images/help/code-quality/ai-suggestions-repo-fixes.png index 09c174dd99a5..606d1dfea3eb 100644 Binary files a/assets/images/help/code-quality/ai-suggestions-repo-fixes.png and b/assets/images/help/code-quality/ai-suggestions-repo-fixes.png differ diff --git a/assets/images/help/code-quality/ai-suggestions-repo.png b/assets/images/help/code-quality/ai-suggestions-repo.png index 021a6291ecc4..746ff5cadf9e 100644 Binary files a/assets/images/help/code-quality/ai-suggestions-repo.png and b/assets/images/help/code-quality/ai-suggestions-repo.png differ diff --git a/assets/images/help/code-quality/all-findings-overview-repo.png b/assets/images/help/code-quality/all-findings-overview-repo.png index 9c36414073f8..5578e830c16f 100644 Binary files a/assets/images/help/code-quality/all-findings-overview-repo.png and b/assets/images/help/code-quality/all-findings-overview-repo.png differ diff --git a/assets/images/help/code-quality/all-findings-rules-repo.png b/assets/images/help/code-quality/all-findings-rules-repo.png index 9d704ef80fbf..0c83958bf416 100644 Binary files a/assets/images/help/code-quality/all-findings-rules-repo.png and b/assets/images/help/code-quality/all-findings-rules-repo.png differ diff --git a/assets/images/help/code-quality/cca-pr-ai-findings.png b/assets/images/help/code-quality/cca-pr-ai-findings.png index 06b78a025e80..c6580f92ff7a 100644 Binary files a/assets/images/help/code-quality/cca-pr-ai-findings.png and b/assets/images/help/code-quality/cca-pr-ai-findings.png differ diff --git a/assets/images/help/code-quality/click-rule-name.png b/assets/images/help/code-quality/click-rule-name.png index 4b3c7aecd253..bd9b20696a83 100644 Binary files a/assets/images/help/code-quality/click-rule-name.png and b/assets/images/help/code-quality/click-rule-name.png differ diff --git a/assets/images/help/code-quality/click-show-more.png b/assets/images/help/code-quality/click-show-more.png index e34bb914fe1c..d94f98edfa8a 100644 Binary files a/assets/images/help/code-quality/click-show-more.png and b/assets/images/help/code-quality/click-show-more.png differ diff --git a/assets/images/help/code-quality/code-quality-merge-block.png b/assets/images/help/code-quality/code-quality-merge-block.png index 3e5dc8694f12..a6b611237ae4 100644 Binary files a/assets/images/help/code-quality/code-quality-merge-block.png and b/assets/images/help/code-quality/code-quality-merge-block.png differ diff --git a/assets/images/help/code-quality/generate-fix.png b/assets/images/help/code-quality/generate-fix.png index 1a5c57ae882d..4316fd7c6c11 100644 Binary files a/assets/images/help/code-quality/generate-fix.png and b/assets/images/help/code-quality/generate-fix.png differ diff --git a/assets/images/help/code-quality/invoke-coding-agent.png b/assets/images/help/code-quality/invoke-coding-agent.png index ff0c50afe5e1..c88e3582d188 100644 Binary files a/assets/images/help/code-quality/invoke-coding-agent.png and b/assets/images/help/code-quality/invoke-coding-agent.png differ diff --git a/assets/images/help/code-quality/merge-block-warnings.png b/assets/images/help/code-quality/merge-block-warnings.png index caf3d0d11b8e..f6e5103c2166 100644 Binary files a/assets/images/help/code-quality/merge-block-warnings.png and b/assets/images/help/code-quality/merge-block-warnings.png differ diff --git a/assets/images/help/code-quality/standard-findings-filters.png b/assets/images/help/code-quality/standard-findings-filters.png index eeb34fa47063..5662cbfb1445 100644 Binary files a/assets/images/help/code-quality/standard-findings-filters.png and b/assets/images/help/code-quality/standard-findings-filters.png differ diff --git a/assets/images/help/code-quality/user-pr-ai-findings.png b/assets/images/help/code-quality/user-pr-ai-findings.png index 14a25d1a3c0c..b3395ad7ea5e 100644 Binary files a/assets/images/help/code-quality/user-pr-ai-findings.png and b/assets/images/help/code-quality/user-pr-ai-findings.png differ diff --git a/assets/images/help/codespaces/codespace-annotated-vscode.png b/assets/images/help/codespaces/codespace-annotated-vscode.png index f89253162b9f..f833fe95003e 100644 Binary files a/assets/images/help/codespaces/codespace-annotated-vscode.png and b/assets/images/help/codespaces/codespace-annotated-vscode.png differ diff --git a/assets/images/help/codespaces/codespace-overview-annotated.png b/assets/images/help/codespaces/codespace-overview-annotated.png index bea7ee72287c..ab9f7df30447 100644 Binary files a/assets/images/help/codespaces/codespace-overview-annotated.png and b/assets/images/help/codespaces/codespace-overview-annotated.png differ diff --git a/assets/images/help/codespaces/jetbrains-checkout-submenu.png b/assets/images/help/codespaces/jetbrains-checkout-submenu.png index 4e58b110d9b0..41d247975a13 100644 Binary files a/assets/images/help/codespaces/jetbrains-checkout-submenu.png and b/assets/images/help/codespaces/jetbrains-checkout-submenu.png differ diff --git a/assets/images/help/copilot/activity-report-enterprise.png b/assets/images/help/copilot/activity-report-enterprise.png index 28a340d04f6b..d559de1f3cae 100644 Binary files a/assets/images/help/copilot/activity-report-enterprise.png and b/assets/images/help/copilot/activity-report-enterprise.png differ diff --git a/assets/images/help/copilot/activity-report-non-ghe.png b/assets/images/help/copilot/activity-report-non-ghe.png index ac94003279df..ca83d2f80779 100644 Binary files a/assets/images/help/copilot/activity-report-non-ghe.png and b/assets/images/help/copilot/activity-report-non-ghe.png differ diff --git a/assets/images/help/copilot/activity-report-org.png b/assets/images/help/copilot/activity-report-org.png index 9e616c246279..accc31020363 100644 Binary files a/assets/images/help/copilot/activity-report-org.png and b/assets/images/help/copilot/activity-report-org.png differ diff --git a/assets/images/help/copilot/ask-to-explain.png b/assets/images/help/copilot/ask-to-explain.png index 91de670e31f7..0a823abae8f6 100644 Binary files a/assets/images/help/copilot/ask-to-explain.png and b/assets/images/help/copilot/ask-to-explain.png differ diff --git a/assets/images/help/copilot/azure-data-studio-extensions-icon.png b/assets/images/help/copilot/azure-data-studio-extensions-icon.png index 6a4b67a55d9c..324117edde81 100644 Binary files a/assets/images/help/copilot/azure-data-studio-extensions-icon.png and b/assets/images/help/copilot/azure-data-studio-extensions-icon.png differ diff --git a/assets/images/help/copilot/code-review/automatic-code-review.png b/assets/images/help/copilot/code-review/automatic-code-review.png index ecc728796568..49a5283cf131 100644 Binary files a/assets/images/help/copilot/code-review/automatic-code-review.png and b/assets/images/help/copilot/code-review/automatic-code-review.png differ diff --git a/assets/images/help/copilot/code-review/vscode-review-button.png b/assets/images/help/copilot/code-review/vscode-review-button.png index 5682f8e10d52..f646f6ca9f30 100644 Binary files a/assets/images/help/copilot/code-review/vscode-review-button.png and b/assets/images/help/copilot/code-review/vscode-review-button.png differ diff --git a/assets/images/help/copilot/code-review/xcode-ccr-button.png b/assets/images/help/copilot/code-review/xcode-ccr-button.png index 4d591809a549..e2068c080311 100644 Binary files a/assets/images/help/copilot/code-review/xcode-ccr-button.png and b/assets/images/help/copilot/code-review/xcode-ccr-button.png differ diff --git a/assets/images/help/copilot/code-review/xcode-review-popup.png b/assets/images/help/copilot/code-review/xcode-review-popup.png index 8a7b0d608809..1c227b222f77 100644 Binary files a/assets/images/help/copilot/code-review/xcode-review-popup.png and b/assets/images/help/copilot/code-review/xcode-review-popup.png differ diff --git a/assets/images/help/copilot/coding-agent/assign-to-copilot-dialog.png b/assets/images/help/copilot/coding-agent/assign-to-copilot-dialog.png index ea7c79eccd87..500aa9a0f15d 100644 Binary files a/assets/images/help/copilot/coding-agent/assign-to-copilot-dialog.png and b/assets/images/help/copilot/coding-agent/assign-to-copilot-dialog.png differ diff --git a/assets/images/help/copilot/coding-agent/mobile-status-dropdown.png b/assets/images/help/copilot/coding-agent/mobile-status-dropdown.png index 8a5221d09c18..308a3b5dded8 100644 Binary files a/assets/images/help/copilot/coding-agent/mobile-status-dropdown.png and b/assets/images/help/copilot/coding-agent/mobile-status-dropdown.png differ diff --git a/assets/images/help/copilot/coding-agent/open-workbench.png b/assets/images/help/copilot/coding-agent/open-workbench.png index 907af082ec38..59d06a65f67b 100644 Binary files a/assets/images/help/copilot/coding-agent/open-workbench.png and b/assets/images/help/copilot/coding-agent/open-workbench.png differ diff --git a/assets/images/help/copilot/content-exclusions-last-edited-by.png b/assets/images/help/copilot/content-exclusions-last-edited-by.png index 914515e0fb85..1945f4454d1a 100644 Binary files a/assets/images/help/copilot/content-exclusions-last-edited-by.png and b/assets/images/help/copilot/content-exclusions-last-edited-by.png differ diff --git a/assets/images/help/copilot/copilot-chat-dashboard.png b/assets/images/help/copilot/copilot-chat-dashboard.png index 6852057637bd..3c2c682f15c0 100644 Binary files a/assets/images/help/copilot/copilot-chat-dashboard.png and b/assets/images/help/copilot/copilot-chat-dashboard.png differ diff --git a/assets/images/help/copilot/copilot-cli-welcome.png b/assets/images/help/copilot/copilot-cli-welcome.png index 1df1e7c126ad..6cd91c326e01 100644 Binary files a/assets/images/help/copilot/copilot-cli-welcome.png and b/assets/images/help/copilot/copilot-cli-welcome.png differ diff --git a/assets/images/help/copilot/copilot-creates-sub-issues-workbench.png b/assets/images/help/copilot/copilot-creates-sub-issues-workbench.png index 97829156af9d..3dad8422d4c5 100644 Binary files a/assets/images/help/copilot/copilot-creates-sub-issues-workbench.png and b/assets/images/help/copilot/copilot-creates-sub-issues-workbench.png differ diff --git a/assets/images/help/copilot/copilot-creates-sub-issues.png b/assets/images/help/copilot/copilot-creates-sub-issues.png index 051befcb6b3d..e41eaee81368 100644 Binary files a/assets/images/help/copilot/copilot-creates-sub-issues.png and b/assets/images/help/copilot/copilot-creates-sub-issues.png differ diff --git a/assets/images/help/copilot/copilot-disabled-for-repo.png b/assets/images/help/copilot/copilot-disabled-for-repo.png index 7bd72e8c6af5..a2ea04e2a8f8 100644 Binary files a/assets/images/help/copilot/copilot-disabled-for-repo.png and b/assets/images/help/copilot/copilot-disabled-for-repo.png differ diff --git a/assets/images/help/copilot/copilot-gridtoy-change.png b/assets/images/help/copilot/copilot-gridtoy-change.png index d2175a1f7aff..948778961748 100644 Binary files a/assets/images/help/copilot/copilot-gridtoy-change.png and b/assets/images/help/copilot/copilot-gridtoy-change.png differ diff --git a/assets/images/help/copilot/copilot-usage-tab.png b/assets/images/help/copilot/copilot-usage-tab.png index 1bce1ea57dfc..ffb1a18959e6 100644 Binary files a/assets/images/help/copilot/copilot-usage-tab.png and b/assets/images/help/copilot/copilot-usage-tab.png differ diff --git a/assets/images/help/copilot/highlight-lines.png b/assets/images/help/copilot/highlight-lines.png index e3eabbb24d8e..492e44c5471b 100644 Binary files a/assets/images/help/copilot/highlight-lines.png and b/assets/images/help/copilot/highlight-lines.png differ diff --git a/assets/images/help/copilot/manage-licenses.png b/assets/images/help/copilot/manage-licenses.png index 61b9cae0b866..0ad762ed306a 100644 Binary files a/assets/images/help/copilot/manage-licenses.png and b/assets/images/help/copilot/manage-licenses.png differ diff --git a/assets/images/help/copilot/mermaid-gantt-chart-example.png b/assets/images/help/copilot/mermaid-gantt-chart-example.png index c180eb4acb3d..96291304f034 100644 Binary files a/assets/images/help/copilot/mermaid-gantt-chart-example.png and b/assets/images/help/copilot/mermaid-gantt-chart-example.png differ diff --git a/assets/images/help/copilot/organization-access-menu.png b/assets/images/help/copilot/organization-access-menu.png index e28a14320c58..b5223bfd767a 100644 Binary files a/assets/images/help/copilot/organization-access-menu.png and b/assets/images/help/copilot/organization-access-menu.png differ diff --git a/assets/images/help/copilot/spark-data-access.png b/assets/images/help/copilot/spark-data-access.png index 2de58a5b29cd..cbb288acd318 100644 Binary files a/assets/images/help/copilot/spark-data-access.png and b/assets/images/help/copilot/spark-data-access.png differ diff --git a/assets/images/help/copilot/spark-fix-all-errors.png b/assets/images/help/copilot/spark-fix-all-errors.png index 59a4c05d1276..7bbd4ebfd403 100644 Binary files a/assets/images/help/copilot/spark-fix-all-errors.png and b/assets/images/help/copilot/spark-fix-all-errors.png differ diff --git a/assets/images/help/copilot/spark-github-user-visibility.png b/assets/images/help/copilot/spark-github-user-visibility.png index 030d7778d55e..d88f06f9b00b 100644 Binary files a/assets/images/help/copilot/spark-github-user-visibility.png and b/assets/images/help/copilot/spark-github-user-visibility.png differ diff --git a/assets/images/help/copilot/track-spending-prs.png b/assets/images/help/copilot/track-spending-prs.png index 7ea9257b7327..4e1dc337f179 100644 Binary files a/assets/images/help/copilot/track-spending-prs.png and b/assets/images/help/copilot/track-spending-prs.png differ diff --git a/assets/images/help/copilot/track-spending.png b/assets/images/help/copilot/track-spending.png index 7df7c87a808e..148c391c5f2e 100644 Binary files a/assets/images/help/copilot/track-spending.png and b/assets/images/help/copilot/track-spending.png differ diff --git a/assets/images/help/copilot/vs-custom-instructions-option.png b/assets/images/help/copilot/vs-custom-instructions-option.png index abaa6158b726..25296f7ae874 100644 Binary files a/assets/images/help/copilot/vs-custom-instructions-option.png and b/assets/images/help/copilot/vs-custom-instructions-option.png differ diff --git a/assets/images/help/copilot/vsc-manage-models-list.png b/assets/images/help/copilot/vsc-manage-models-list.png index 4144779f539e..df4dab9b97bb 100644 Binary files a/assets/images/help/copilot/vsc-manage-models-list.png and b/assets/images/help/copilot/vsc-manage-models-list.png differ diff --git a/assets/images/help/copilot/vsc-manage-models-option.png b/assets/images/help/copilot/vsc-manage-models-option.png index bcc1d114b7e8..878a0e843ce6 100644 Binary files a/assets/images/help/copilot/vsc-manage-models-option.png and b/assets/images/help/copilot/vsc-manage-models-option.png differ diff --git a/assets/images/help/copilot/vscode-current-usage.png b/assets/images/help/copilot/vscode-current-usage.png index ba22d7fe8890..f2629b0bb428 100644 Binary files a/assets/images/help/copilot/vscode-current-usage.png and b/assets/images/help/copilot/vscode-current-usage.png differ diff --git a/assets/images/help/copilot/xcode-chat-about-file.png b/assets/images/help/copilot/xcode-chat-about-file.png index fdcfd08f277b..dc02b3ab5e58 100644 Binary files a/assets/images/help/copilot/xcode-chat-about-file.png and b/assets/images/help/copilot/xcode-chat-about-file.png differ diff --git a/assets/images/help/dependabot/dependabot-self-hosted-runner-log.png b/assets/images/help/dependabot/dependabot-self-hosted-runner-log.png index a8f89dce7aec..8f50786404f9 100644 Binary files a/assets/images/help/dependabot/dependabot-self-hosted-runner-log.png and b/assets/images/help/dependabot/dependabot-self-hosted-runner-log.png differ diff --git a/assets/images/help/dependabot/dependabot-vnet-active-jobs.png b/assets/images/help/dependabot/dependabot-vnet-active-jobs.png index 4631c6415855..0b940de49b82 100644 Binary files a/assets/images/help/dependabot/dependabot-vnet-active-jobs.png and b/assets/images/help/dependabot/dependabot-vnet-active-jobs.png differ diff --git a/assets/images/help/desktop/current-branch-menu.png b/assets/images/help/desktop/current-branch-menu.png index 56e12d6159a8..64cb45b87e1d 100644 Binary files a/assets/images/help/desktop/current-branch-menu.png and b/assets/images/help/desktop/current-branch-menu.png differ diff --git a/assets/images/help/desktop/publish-branch-button.png b/assets/images/help/desktop/publish-branch-button.png index 9b345e89eef0..21599d5723ce 100644 Binary files a/assets/images/help/desktop/publish-branch-button.png and b/assets/images/help/desktop/publish-branch-button.png differ diff --git a/assets/images/help/enterprises/organizations-tab.png b/assets/images/help/enterprises/organizations-tab.png index 65ab80421bc0..87c6d9645148 100644 Binary files a/assets/images/help/enterprises/organizations-tab.png and b/assets/images/help/enterprises/organizations-tab.png differ diff --git a/assets/images/help/issues/attach-file.png b/assets/images/help/issues/attach-file.png index b375c12699ce..2454f3c8dae5 100644 Binary files a/assets/images/help/issues/attach-file.png and b/assets/images/help/issues/attach-file.png differ diff --git a/assets/images/help/issues/issue-example.png b/assets/images/help/issues/issue-example.png index c0ddc6f4507c..a17a2d66b214 100644 Binary files a/assets/images/help/issues/issue-example.png and b/assets/images/help/issues/issue-example.png differ diff --git a/assets/images/help/issues/issue-type.png b/assets/images/help/issues/issue-type.png index 3da77552cbe0..5c708b8157fe 100644 Binary files a/assets/images/help/issues/issue-type.png and b/assets/images/help/issues/issue-type.png differ diff --git a/assets/images/help/issues/sub-issue.png b/assets/images/help/issues/sub-issue.png index 872341db72cf..3ed46ded5bdc 100644 Binary files a/assets/images/help/issues/sub-issue.png and b/assets/images/help/issues/sub-issue.png differ diff --git a/assets/images/help/profile/profile-block-or-report-button.png b/assets/images/help/profile/profile-block-or-report-button.png index aa2c62014fcb..d43ff9efea28 100644 Binary files a/assets/images/help/profile/profile-block-or-report-button.png and b/assets/images/help/profile/profile-block-or-report-button.png differ diff --git a/assets/images/help/profile/profile-unblock-or-report-user.png b/assets/images/help/profile/profile-unblock-or-report-user.png index 6c61debb1da4..f1780ff8a91c 100644 Binary files a/assets/images/help/profile/profile-unblock-or-report-user.png and b/assets/images/help/profile/profile-unblock-or-report-user.png differ diff --git a/assets/images/help/projects-v2/example-board.png b/assets/images/help/projects-v2/example-board.png index 6341281a07d0..bbf96a9a627d 100644 Binary files a/assets/images/help/projects-v2/example-board.png and b/assets/images/help/projects-v2/example-board.png differ diff --git a/assets/images/help/projects-v2/example-roadmap.png b/assets/images/help/projects-v2/example-roadmap.png index a2551a1c4330..b1ddb9a72d0e 100644 Binary files a/assets/images/help/projects-v2/example-roadmap.png and b/assets/images/help/projects-v2/example-roadmap.png differ diff --git a/assets/images/help/projects-v2/example-table.png b/assets/images/help/projects-v2/example-table.png index c5a3c16f9a1d..12f53f4f66f2 100644 Binary files a/assets/images/help/projects-v2/example-table.png and b/assets/images/help/projects-v2/example-table.png differ diff --git a/assets/images/help/pull_requests/attach-file.png b/assets/images/help/pull_requests/attach-file.png index 665723ad821e..4b3112e83efe 100644 Binary files a/assets/images/help/pull_requests/attach-file.png and b/assets/images/help/pull_requests/attach-file.png differ diff --git a/assets/images/help/pull_requests/checks-summary-for-various-commits.png b/assets/images/help/pull_requests/checks-summary-for-various-commits.png index 25878c18bb4a..5cd6a1b44368 100644 Binary files a/assets/images/help/pull_requests/checks-summary-for-various-commits.png and b/assets/images/help/pull_requests/checks-summary-for-various-commits.png differ diff --git a/assets/images/help/pull_requests/merge-pull-request-options.png b/assets/images/help/pull_requests/merge-pull-request-options.png index 1268b4013764..9d223a43d54c 100644 Binary files a/assets/images/help/pull_requests/merge-pull-request-options.png and b/assets/images/help/pull_requests/merge-pull-request-options.png differ diff --git a/assets/images/help/repository/code-scanning-branch-filter.png b/assets/images/help/repository/code-scanning-branch-filter.png index 0a8008046a4d..368b2d3f0578 100644 Binary files a/assets/images/help/repository/code-scanning-branch-filter.png and b/assets/images/help/repository/code-scanning-branch-filter.png differ diff --git a/assets/images/help/repository/create-repository-name.png b/assets/images/help/repository/create-repository-name.png index 4e6485c0c1fe..67b6779d13a5 100644 Binary files a/assets/images/help/repository/create-repository-name.png and b/assets/images/help/repository/create-repository-name.png differ diff --git a/assets/images/help/repository/create-repository-owner.png b/assets/images/help/repository/create-repository-owner.png index c5f271f1fbba..b39a4688ece5 100644 Binary files a/assets/images/help/repository/create-repository-owner.png and b/assets/images/help/repository/create-repository-owner.png differ diff --git a/assets/images/help/repository/delete-comment-edit-details.png b/assets/images/help/repository/delete-comment-edit-details.png index 7c657589c9cc..dbae34d4da50 100644 Binary files a/assets/images/help/repository/delete-comment-edit-details.png and b/assets/images/help/repository/delete-comment-edit-details.png differ diff --git a/assets/images/help/repository/delete-file-button.png b/assets/images/help/repository/delete-file-button.png index 7c58920a9a5b..d8d82c943c7b 100644 Binary files a/assets/images/help/repository/delete-file-button.png and b/assets/images/help/repository/delete-file-button.png differ diff --git a/assets/images/help/repository/filter-code-scanning-alerts.png b/assets/images/help/repository/filter-code-scanning-alerts.png index 3a852ca67d6e..514d26c4045f 100644 Binary files a/assets/images/help/repository/filter-code-scanning-alerts.png and b/assets/images/help/repository/filter-code-scanning-alerts.png differ diff --git a/assets/images/help/repository/repos-create-properties.png b/assets/images/help/repository/repos-create-properties.png index 2421499017fe..5e33b332389d 100644 Binary files a/assets/images/help/repository/repos-create-properties.png and b/assets/images/help/repository/repos-create-properties.png differ diff --git a/assets/images/help/repository/secret-scanning-dismiss-alert-web-ui-link-partner-documentation.png b/assets/images/help/repository/secret-scanning-dismiss-alert-web-ui-link-partner-documentation.png index 5b65a1c61c77..15198ed48714 100644 Binary files a/assets/images/help/repository/secret-scanning-dismiss-alert-web-ui-link-partner-documentation.png and b/assets/images/help/repository/secret-scanning-dismiss-alert-web-ui-link-partner-documentation.png differ diff --git a/assets/images/help/security/security-campaigns-tracking-overview-2tabs.png b/assets/images/help/security/security-campaigns-tracking-overview-2tabs.png index c9756bc0477b..8399b7833f94 100644 Binary files a/assets/images/help/security/security-campaigns-tracking-overview-2tabs.png and b/assets/images/help/security/security-campaigns-tracking-overview-2tabs.png differ diff --git a/assets/images/help/security/security-campaigns-tracking-overview-code-only.png b/assets/images/help/security/security-campaigns-tracking-overview-code-only.png index 9f9d980b5902..f88485a98437 100644 Binary files a/assets/images/help/security/security-campaigns-tracking-overview-code-only.png and b/assets/images/help/security/security-campaigns-tracking-overview-code-only.png differ diff --git a/assets/images/help/sponsors/delete-stripe-account.png b/assets/images/help/sponsors/delete-stripe-account.png index cc47bd5d0bf2..024d80ada792 100644 Binary files a/assets/images/help/sponsors/delete-stripe-account.png and b/assets/images/help/sponsors/delete-stripe-account.png differ diff --git a/assets/images/site/evergreens/boxwood.png b/assets/images/site/evergreens/boxwood.png index 0c9f1073c9f2..9640fac31337 100644 Binary files a/assets/images/site/evergreens/boxwood.png and b/assets/images/site/evergreens/boxwood.png differ diff --git a/assets/images/social-cards/code-security.png b/assets/images/social-cards/code-security.png index be6192f5dbe9..46cfccf5347c 100644 Binary files a/assets/images/social-cards/code-security.png and b/assets/images/social-cards/code-security.png differ diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/about-secret-risk-assessment.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/about-secret-risk-assessment.md index abdfcdedaf4a..c91f18311cb3 100644 --- a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/about-secret-risk-assessment.md +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/about-secret-risk-assessment.md @@ -56,8 +56,4 @@ Because the {% data variables.product.prodname_secret_risk_assessment %} report ## Next steps -Now that you know about the {% data variables.product.prodname_secret_risk_assessment %} report, you may want to learn how to: - -* Generate the report to see your organization risk. Navigate to {% data reusables.security-overview.navigate-to-risk-assessment %}. -* Interpret the results of the report. See [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results). -* Enable {% data variables.product.prodname_GH_secret_protection %} to improve your secret leak footprint. See [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/choosing-github-secret-protection#enabling-secret-protection). +To start analyzing your organization's secret risk, see [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/assess-your-secret-risk). diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/assess-your-secret-risk.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/assess-your-secret-risk.md new file mode 100644 index 000000000000..5891d34fe4ac --- /dev/null +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/assess-your-secret-risk.md @@ -0,0 +1,42 @@ +--- +title: 'Running the secret risk assessment for your organization' +shortTitle: 'Assess your secret risk' +intro: 'Determine your organization''s exposure to leaked secrets by generating a {% data variables.product.prodname_secret_risk_assessment %} report.' +product: '{% data reusables.gated-features.secret-risk-assessment-report %}' +permissions: '{% data reusables.permissions.secret-risk-assessment-report-generation %}' +type: how_to +versions: + feature: secret-risk-assessment +topics: + - Code Security + - Secret scanning + - Secret Protection + - Organizations + - Security +--- + +## Generating an initial {% data variables.product.prodname_secret_risk_assessment %} + +{% data reusables.organizations.navigate-to-org %} +{% data reusables.organizations.security-overview %} +{% data reusables.security-overview.open-assessments-view %} +{% data reusables.security-overview.generate-secret-risk-assessment-report %} + + {% data reusables.secret-risk-assessment.notification-report-ready %} + +## Rerunning the {% data variables.product.prodname_secret_risk_assessment %} + +> [!NOTE] +> You can only generate a secret risk assessment report once every 90 days. + +{% data reusables.organizations.navigate-to-org %} +{% data reusables.organizations.security-overview %} +{% data reusables.security-overview.open-assessments-view %} +1. Towards the top right side of the existing report, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}. +1. Select **Rerun scan**. + + {% data reusables.secret-risk-assessment.notification-report-ready %} + +## Next steps + +Now that you've generated a {% data variables.product.prodname_secret_risk_assessment %} report for your organization, learn how to interpret the results. See [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results). diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/export-risk-report-csv.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/export-risk-report-csv.md new file mode 100644 index 000000000000..6fdf4356f217 --- /dev/null +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/export-risk-report-csv.md @@ -0,0 +1,25 @@ +--- +title: 'Exporting the secret risk assessment report to CSV' +shortTitle: 'Export risk report CSV' +intro: 'Export the {% data variables.product.prodname_secret_risk_assessment %} report to a CSV file for detailed investigation and stakeholder sharing.' +product: '{% data reusables.gated-features.secret-risk-assessment-report %}' +permissions: '{% data reusables.permissions.secret-risk-assessment-report-generation %}' +type: how_to +versions: + feature: secret-risk-assessment +topics: + - Code Security + - Secret scanning + - Secret Protection + - Organizations + - Security +--- + +{% data reusables.organizations.navigate-to-org %} +{% data reusables.organizations.security-overview %} +{% data reusables.security-overview.open-assessments-view %} +1. Towards the top-right side of the report, select the {% octicon "kebab-horizontal" aria-label="More options" %} dropdown menu, then click {% octicon "download" aria-hidden="true" aria-label="download" %} **Download CSV**. + +## Next steps + +To better understand the fields of your CSV file, see [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/risk-report-csv-contents). diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/index.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/index.md index ec77bf0a7291..9c133af6d461 100644 --- a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/index.md +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/index.md @@ -12,7 +12,10 @@ topics: - Security children: - /about-secret-risk-assessment + - /assess-your-secret-risk - /viewing-the-secret-risk-assessment-report-for-your-organization + - /export-risk-report-csv + - /risk-report-csv-contents - /interpreting-secret-risk-assessment-results - /choosing-github-secret-protection - /calculating-the-cost-savings-of-push-protection diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results.md index 881b7253df20..90b87d45503f 100644 --- a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results.md +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results.md @@ -23,7 +23,7 @@ In this tutorial, you'll interpret your secret risk assessment results, and lear ## Prerequisites -You must generate a {% data variables.product.prodname_secret_risk_assessment %} report and wait for the scan to complete. See [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/viewing-the-secret-risk-assessment-report-for-your-organization#generating-an-initial-secret-risk-assessment). +You must generate a {% data variables.product.prodname_secret_risk_assessment %} report and wait for the scan to complete. See [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/assess-your-secret-risk). ## Step 1: Understand your dashboard metrics @@ -71,7 +71,7 @@ If you see **many secrets of the same type** (for example, multiple AWS keys), t * Developers may not be using environment variables * Missing documentation on secret management -## Step 5: Prioritizing remediation and related actions +## Step 5: Prioritize remediation and related actions Now that you understand the metrics, prioritize remediation based on risk. diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/risk-report-csv-contents.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/risk-report-csv-contents.md new file mode 100644 index 000000000000..bd1cd264107a --- /dev/null +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/risk-report-csv-contents.md @@ -0,0 +1,32 @@ +--- +title: 'Contents of the secret risk assessment report CSV' +shortTitle: 'Risk report CSV contents' +intro: 'Understand the data included in the CSV export of the {% data variables.product.prodname_secret_risk_assessment %} report.' +product: '{% data reusables.gated-features.secret-risk-assessment-report %}' +permissions: '{% data reusables.permissions.secret-risk-assessment-report-generation %}' +type: reference +versions: + feature: secret-risk-assessment +topics: + - Code Security + - Secret scanning + - Secret Protection + - Organizations + - Security +--- + +The {% data variables.product.prodname_secret_risk_assessment %} report CSV file includes the following information: + +| CSV column | Name | Description | +| ---------- | ---------------------- | --------------------------------------------------------- | +| A | `Organization Name` | The name of the organization the secret was detected in | +| B | `Name` | The token name for the type of secret | +| C | `Slug` | The normalized string for the token. This corresponds to `Token` in the table of supported secrets. See [AUTOTITLE](/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets). | +| D | `Push Protected` | A `boolean` to indicate whether the secret would be detected and blocked by push protection if it were enabled | +| E | `Non-Provider Pattern` | A `boolean` to indicate whether the secret matched a non-provider pattern and would generate an alert if {% data variables.product.prodname_secret_scanning %} with non-provider patterns were enabled | +| F | `Secret Count` | An aggregate count of the active and inactive secrets found for the token type | +| G | `Repository Count` | An aggregate count of distinct repositories in which the secret type was found, including public, private,{% ifversion ghec or ghes %} internal,{% endif %} and archived repositories | + +## Next steps + +To learn which secrets you should prioritize for remediation, see [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results#step-5-prioritizing-remediation-and-related-actions). diff --git a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/viewing-the-secret-risk-assessment-report-for-your-organization.md b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/viewing-the-secret-risk-assessment-report-for-your-organization.md index 1da3a7007dc4..71ce15a8b456 100644 --- a/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/viewing-the-secret-risk-assessment-report-for-your-organization.md +++ b/content/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/viewing-the-secret-risk-assessment-report-for-your-organization.md @@ -1,7 +1,7 @@ --- title: 'Viewing the secret risk assessment report for your organization' -shortTitle: 'View secret risk assessment' -intro: 'You can generate and view the {% data variables.product.prodname_secret_risk_assessment %} report for your organization from the "Security" tab.' +shortTitle: 'View risk report' +intro: 'Understand your organization''s exposure to leaked secrets at a glance by viewing your most recent {% data variables.product.prodname_secret_risk_assessment %} report.' product: '{% data reusables.gated-features.secret-risk-assessment-report %}' permissions: '{% data reusables.permissions.secret-risk-assessment-report-generation %}' allowTitleToDifferFromFilename: true @@ -16,65 +16,6 @@ topics: - Security --- -{% data reusables.secret-risk-assessment.report-intro %} {% data reusables.secret-risk-assessment.link-conceptual-information %} - -You can generate the {% data variables.product.prodname_secret_risk_assessment %} report for your organization, review it, and export the results to CSV. - -## Generating an initial {% data variables.product.prodname_secret_risk_assessment %} - -{% data reusables.organizations.navigate-to-org %} -{% data reusables.organizations.security-overview %} -{% data reusables.security-overview.open-assessments-view %} -{% data reusables.security-overview.generate-secret-risk-assessment-report %} - -{% data reusables.secret-risk-assessment.notification-report-ready %} - -{% note %} - -Did you successfully generate the {% data variables.product.prodname_secret_risk_assessment %} report for your organization? - -Yes No - -{% endnote %} - -## Rerunning the {% data variables.product.prodname_secret_risk_assessment %} - -{% data reusables.security-overview.secret-risk-assessment-report-generation-cadence %} - -{% data reusables.organizations.navigate-to-org %} -{% data reusables.organizations.security-overview %} -{% data reusables.security-overview.open-assessments-view %} -1. Towards the top right side of the existing report, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}. -1. Select **Rerun scan**. - - {% data reusables.secret-risk-assessment.notification-report-ready %} - -## Viewing the {% data variables.product.prodname_secret_risk_assessment %} - {% data reusables.organizations.navigate-to-org %} {% data reusables.organizations.security-overview %} {% data reusables.security-overview.open-assessments-view %} You can see the most recent report on this page. - -## Exporting the {% data variables.product.prodname_secret_risk_assessment %} to CSV - -{% data reusables.organizations.navigate-to-org %} -{% data reusables.organizations.security-overview %} -{% data reusables.security-overview.open-assessments-view %} -1. Towards the top right side of the report, click {% octicon "kebab-horizontal" aria-label="More options" %}. -1. Select **Download CSV**. - -The {% data variables.product.prodname_secret_risk_assessment %} CSV file includes the following information. - -| CSV column | Name | Description | -| ---------- | ---------------------- | --------------------------------------------------------- | -| A | `Organization Name` | The name of the organization the secret was detected in | -| B | `Name` | The token name for the type of secret | -| C | `Slug` | The normalized string for the token. This corresponds to `Token` in the table of supported secrets. See [AUTOTITLE](/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets). | -| D | `Push Protected` | A `boolean` to indicate whether the secret would be detected and blocked by push protection if it were enabled | -| E | `Non-Provider Pattern` | A `boolean` to indicate whether the secret matched a non-provider pattern and would generate an alert if {% data variables.product.prodname_secret_scanning %} with non-provider patterns were enabled | -| F | `Secret Count` | An aggregate count of the active and inactive secrets found for the token type | -| G | `Repository Count` | An aggregate count of distinct repositories in which the secret type was found, including public, private,{% ifversion ghec or ghes %} internal{% endif %}, and archived repositories | - -## Next steps - -Now that you've generated {% data variables.product.prodname_secret_risk_assessment %} for your organization, learn how to interpret the results. See [AUTOTITLE](/code-security/securing-your-organization/understanding-your-organizations-exposure-to-leaked-secrets/interpreting-secret-risk-assessment-results). diff --git a/data/reusables/gated-features/secret-risk-assessment-report.md b/data/reusables/gated-features/secret-risk-assessment-report.md index 35a39767d737..fe8a83263779 100644 --- a/data/reusables/gated-features/secret-risk-assessment-report.md +++ b/data/reusables/gated-features/secret-risk-assessment-report.md @@ -1 +1 @@ -{% data variables.product.prodname_secret_risk_assessment_caps %} is available for free in organizations on {% data variables.product.prodname_team %} and {% data variables.product.prodname_enterprise %} +Free for organizations on {% data variables.product.prodname_team %} and {% data variables.product.prodname_enterprise %} diff --git a/src/content-linter/lib/linting-rules/table-column-integrity.ts b/src/content-linter/lib/linting-rules/table-column-integrity.ts index 35a2893bf689..5d9e7bdef91e 100644 --- a/src/content-linter/lib/linting-rules/table-column-integrity.ts +++ b/src/content-linter/lib/linting-rules/table-column-integrity.ts @@ -10,8 +10,9 @@ const TABLE_ROW_REGEX = /^\s*\|.*\|\s*$/ // Regex to detect table separator rows (contains only |, :, -, and whitespace) const TABLE_SEPARATOR_REGEX = /^\s*\|[\s\-:|\s]*\|\s*$/ // Regex to detect Liquid-only cells (whitespace, liquid tag, whitespace) -const LIQUID_ONLY_CELL_REGEX = /^\s*{%\s*(ifversion|else|endif|elsif).*%}\s*$/ - +const LIQUID_ONLY_CELL_REGEX = /^\s*{%\s*(ifversion|else|endif|elsif|for|endfor).*%}\s*$/ +// Regex to use for splitting on non-escaped pipes only +const NON_ESCAPED_PIPE_REGEX = /(? 0 && cells[0].trim() === '') { @@ -45,7 +47,7 @@ function isLiquidOnlyRow(row: string): boolean { const trimmed = row.trim() if (!trimmed.includes('|')) return false - const cells = trimmed.split('|') + const cells = trimmed.split(NON_ESCAPED_PIPE_REGEX) // Remove empty cells from leading/trailing | const filteredCells = cells.filter((cell, index) => { if (index === 0 && cell.trim() === '') return false @@ -72,10 +74,22 @@ export const tableColumnIntegrity = { const lines = params.lines let inTable = false + let inCodeFence = false let expectedColumnCount: number | null = null for (let i = 0; i < lines.length; i++) { const line = lines[i] + + // Toggle code fence state + if (line.trim().startsWith('```')) { + inCodeFence = !inCodeFence + continue + } + + if (inCodeFence) { + continue + } + const isTableRow = TABLE_ROW_REGEX.test(line) const isSeparatorRow = TABLE_SEPARATOR_REGEX.test(line) diff --git a/src/content-linter/tests/unit/table-column-integrity-simple.ts b/src/content-linter/tests/unit/table-column-integrity-simple.ts index de8eb55724a9..4980fce6f999 100644 --- a/src/content-linter/tests/unit/table-column-integrity-simple.ts +++ b/src/content-linter/tests/unit/table-column-integrity-simple.ts @@ -60,4 +60,207 @@ describe(tableColumnIntegrity.names.join(' - '), () => { const errors = result.markdown expect(errors.length).toBe(0) }) + + test('Escaped pipes (\\|) are not counted as column separators', async () => { + const markdown = [ + '| Command | Description |', + '|---------|-------------|', + '| `git log --oneline \\| head` | Shows recent commits |', + '| `echo "hello \\| world"` | Prints text with pipe |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Escaped pipes mixed with real separators work correctly', async () => { + const markdown = [ + '| Code | Output | Notes |', + '|------|--------|-------|', + '| `echo "a \\| b" \\| wc` | 1 | Pipe in string and command |', + '| `grep "x" file` | matches | No pipes here |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Liquid for/endfor statements are ignored in table rows', async () => { + const markdown = [ + '| Item | Details |', + '|------|---------|', + '| {% for item in collection %} |', + '| Product A | Available |', + '| Product B | Sold out |', + '| {% endfor %} |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Mixed liquid statements (ifversion, for, endif) are ignored', async () => { + const markdown = [ + '| Feature | Status | Version |', + '|---------|--------|---------|', + '| {% ifversion ghes %} |', + '| {% for version in site.data.versions %} |', + '| Basic | Active | 1.0 |', + '| {% endfor %} |', + '| {% endif %} |', + '| Advanced | Beta | 2.0 |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Tables inside code fences are ignored', async () => { + const markdown = [ + 'Here is some example markdown:', + '', + '```markdown', + '| Name | Age |', + '|------|-----|', + '| Alice | 25 | Extra column that would normally cause error |', + '| Bob |', + '```', + '', + 'But this real table should be validated:', + '', + '| Product | Price |', + '|---------|-------|', + '| Widget | $10 |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Tables inside different code fence types are ignored', async () => { + const markdown = [ + '```', + '| Malformed | Table |', + '|-----------|-------|', + '| Too | Many | Columns | Here |', + '```', + '', + '```text', + '| Another | Bad |', + '|---------|-----|', + '| Missing |', + '```', + '', + '```yaml', + '| YAML | Example |', + '|------|---------|', + '| key: | value | extra |', + '```', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('File paths with pipes are handled correctly (regression test)', async () => { + // This test catches the specific issue from content/actions/tutorials/build-and-test-code/python.md + // where the old regex /[^\\]\|/ was consuming characters before pipes and miscounting columns + const markdown = [ + '| Directory | Ubuntu | macOS |', + '|-----------|--------|-------|', + '|**Tool Cache Directory** |`/opt/hostedtoolcache/*`|`/Users/runner/hostedtoolcache/*`|', + '|**Python Tool Cache**|`/opt/hostedtoolcache/Python/*`|`/Users/runner/hostedtoolcache/Python/*`|', + '|**PyPy Tool Cache**|`/opt/hostedtoolcache/PyPy/*`|`/Users/runner/hostedtoolcache/PyPy/*`|', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Complex file paths with multiple characters before pipes', async () => { + // Additional test to ensure the lookbehind regex works with various characters before pipes + const markdown = [ + '| Pattern | Linux Path | Windows Path |', + '|---------|------------|--------------|', + '| Cache | `/home/user/.cache/*` | `C:\\Users\\user\\AppData\\*` |', + '| Logs | `/var/log/app/*` | `C:\\ProgramData\\logs\\*` |', + '| Config | `/etc/myapp/*` | `C:\\Program Files\\MyApp\\*` |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Code fence spanning multiple lines with tables inside', async () => { + const markdown = [ + 'Here is some documentation:', + '', + '```markdown', + '# Example Document', + '', + '| Bad | Table |', + '|-----|-------|', + '| Missing | column | here | extra |', + '| Another | bad | row |', + '', + 'More content here', + '```', + '', + 'This real table should be validated:', + '', + '| Good | Table |', + '|------|-------|', + '| Valid | Row |', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Multiple code fences with tables between them', async () => { + const markdown = [ + '```js', + '| Bad | JS | Table |', + '|-----|----|----|', + '| Extra | column | here | bad |', + '```', + '', + 'Real table that should be checked:', + '', + '| Name | Status |', + '|------|--------|', + '| Test | Pass |', + '', + '```bash', + '| Command | Output |', + '|---------|--------|', + '| ls | file1.txt | file2.txt | extra |', + '```', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) + + test('Code fence with language identifier', async () => { + const markdown = [ + '```typescript', + 'const badTable = `', + '| Name | Age |', + '|------|-----|', + '| Alice | 25 | Extra |', + '`', + '```', + '', + '```yaml', + 'table:', + ' - name: Bad', + ' - age: 30', + ' - extra: column', + '```', + ].join('\n') + const result = await runRule(tableColumnIntegrity, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) }) diff --git a/src/content-render/scripts/render-content-markdown.ts b/src/content-render/scripts/render-content-markdown.ts deleted file mode 100755 index 76e0f7e1f5cf..000000000000 --- a/src/content-render/scripts/render-content-markdown.ts +++ /dev/null @@ -1,86 +0,0 @@ -import fs from 'fs' -import path from 'path' - -import { renderLiquid } from '@/content-render/liquid/index' -import shortVersionsMiddleware from '@/versions/middleware/short-versions' -import type { ExtendedRequest } from '@/types' - -const { loadPages } = await import('@/frame/lib/page-data') -const { allVersions } = await import('@/versions/lib/all-versions') - -const contentCopilotDir = path.join(process.cwd(), 'content-copilot') - -if (!fs.existsSync(contentCopilotDir)) fs.mkdirSync(contentCopilotDir) - -// Load all pages -const allPages = await loadPages() -const pages = allPages.filter( - (page) => - // Files we want to check: English and FPT only - // Files we do not want to check: - // any index.md files - // /graphql/overview/explorer.md since it's not a real content page - // /early-access/ since we don't want copilot looking at these - page.languageCode === 'en' && - page.applicableVersions.includes('free-pro-team@latest') && - !page.relativePath.endsWith('index.md') && - !page.relativePath.endsWith('graphql/overview/explorer.md') && - !page.relativePath.includes('/early-access/'), -) - -for (const page of pages) { - console.log(`---\nStart: Creating directories for: ${page.relativePath}`) - const dirnames = page.relativePath.substring(0, page.relativePath.lastIndexOf('/')) - - fs.mkdirSync(`${contentCopilotDir}/${dirnames}`, { recursive: true }) - // Context needed to render the content liquid - const req = { language: 'en' } as ExtendedRequest - const contextualize = (request: ExtendedRequest): void => { - if (!request.context) return - if (!request.context.currentVersion) return - request.context.currentVersionObj = - request.context.allVersions?.[request.context.currentVersion] - shortVersionsMiddleware(request, null, () => {}) - } - - req.context = { - currentLanguage: 'en', - currentVersion: 'free-pro-team@latest', - page: {} as any, // Empty page object used only for context initialization - allVersions, - } - contextualize(req) - - try { - console.log(`Rendering markdown for: ${page.title}`) - let frontmatterMarkdown = `# ${await renderLiquid(page.title, req.context)}\n\n` - - if (page.intro) { - frontmatterMarkdown += `${await renderLiquid(page.intro, req.context)}\n\n` - } - - if (page.permissions) { - frontmatterMarkdown += `**Who can use this feature**: ${await renderLiquid( - page.permissions, - req.context, - )}\n` - } - - if (page.product) { - frontmatterMarkdown += `${await renderLiquid(page.product, req.context)}\n` - } - const rendered = await renderLiquid(page.markdown, req.context) - console.log('Rendered markdown') - console.log(`Writing file to: ${contentCopilotDir}/${page.relativePath}`) - fs.writeFileSync( - `${contentCopilotDir}/${page.relativePath}`, - frontmatterMarkdown + rendered, - 'utf8', - ) - console.log(`Done: written file\n---`) - } catch (err: any) { - // Standard catch-all for error handling in scripts - console.log(err) - } -} -console.log(`Finished - content is available in: ${contentCopilotDir}`) diff --git a/src/fixtures/tests/images.ts b/src/fixtures/tests/images.ts index 7db30efc83ee..876e6902b006 100644 --- a/src/fixtures/tests/images.ts +++ b/src/fixtures/tests/images.ts @@ -15,14 +15,16 @@ describe('render Markdown image tags', () => { const sources = $('source', pictures) expect(sources.length).toBe(1) const srcset = sources.attr('srcset') - expect(srcset).toBe(`/assets/cb-646451/mw-${MAX_WIDTH}/images/_fixtures/screenshot.webp 2x`) + expect(srcset).toMatch( + new RegExp(`^/assets/cb-\\w+/mw-${MAX_WIDTH}/images/_fixtures/screenshot\\.webp 2x$`), + ) const type = sources.attr('type') expect(type).toBe('image/webp') const imgs = $('img', pictures) expect(imgs.length).toBe(1) const src = imgs.attr('src') - expect(src).toBe('/assets/cb-646451/images/_fixtures/screenshot.png') + expect(src).toMatch(/^\/assets\/cb-\w+\/images\/_fixtures\/screenshot\.png$/) const alt = imgs.attr('alt') expect(alt).toBe('This is the alt text') diff --git a/src/frame/middleware/resolve-recommended.ts b/src/frame/middleware/resolve-recommended.ts index 81124bf5355f..12d81c9fb864 100644 --- a/src/frame/middleware/resolve-recommended.ts +++ b/src/frame/middleware/resolve-recommended.ts @@ -105,17 +105,17 @@ async function resolveRecommended( const page = req.context?.page const rawRecommended = (page as any)?.rawRecommended const spotlight = (page as any)?.spotlight - - // Collect article paths from both rawRecommended and spotlight - const articlePaths: string[] = [] + // Collect article paths from rawRecommended or spotlight if there are no + // recommended articles + let articlePaths: string[] = [] // Add paths from rawRecommended if (rawRecommended && Array.isArray(rawRecommended)) { articlePaths.push(...rawRecommended) } - // Add paths from spotlight (legacy field) - if (spotlight && Array.isArray(spotlight)) { + // Add paths from spotlight (legacy field) if no recommended articles + if (articlePaths.length === 0 && spotlight && Array.isArray(spotlight)) { const spotlightPaths = spotlight .filter((item: any) => item && typeof item.article === 'string') .map((item: any) => item.article) @@ -126,6 +126,8 @@ async function resolveRecommended( return next() } + // remove duplicate articles + articlePaths = [...new Set(articlePaths)] const resolved: ResolvedArticle[] = [] for (const rawPath of articlePaths) { diff --git a/src/frame/tests/resolve-recommended.test.ts b/src/frame/tests/resolve-recommended.test.ts index 05bc6c94280a..a9667a5cd93a 100644 --- a/src/frame/tests/resolve-recommended.test.ts +++ b/src/frame/tests/resolve-recommended.test.ts @@ -80,31 +80,10 @@ describe('resolveRecommended middleware', () => { test('should resolve recommended articles when they exist', async () => { const testPage: Partial = { - mtime: Date.now(), title: 'Test Article', - rawTitle: 'Test Article', intro: 'Test intro', - rawIntro: 'Test intro', relativePath: 'copilot/tutorials/article.md', - fullPath: '/full/path/copilot/tutorials/article.md', - languageCode: 'en', - documentType: 'article', - markdown: 'Test content', - versions: {}, applicableVersions: ['free-pro-team@latest'], - permalinks: [ - { - languageCode: 'en', - pageVersion: 'free-pro-team@latest', - title: 'Test Article', - href: '/en/copilot/tutorials/article', - hrefWithoutLanguage: '/copilot/tutorials/article', - }, - ], - renderProp: vi.fn().mockResolvedValue('rendered'), - renderTitle: vi.fn().mockResolvedValue('Test Article'), - render: vi.fn().mockResolvedValue('rendered content'), - buildRedirects: vi.fn().mockReturnValue({}), } mockFindPage.mockReturnValue(testPage as any) @@ -129,6 +108,40 @@ describe('resolveRecommended middleware', () => { expect(mockNext).toHaveBeenCalled() }) + test('should not resolve spotlight articles when there are recommended articles', async () => { + const testPage: Partial = { + title: 'Test Article', + intro: 'Test intro', + relativePath: 'copilot/tutorials/article.md', + applicableVersions: ['free-pro-team@latest'], + } + + mockFindPage.mockReturnValueOnce(testPage as any) + + const req = createMockRequest({ + rawRecommended: ['/copilot/tutorials/article'], + spotlight: [{ article: '/copilot/tutorials/spotlight-article' }], + }) + + await resolveRecommended(req, mockRes, mockNext) + + expect(mockFindPage).toHaveBeenCalledTimes(1) + expect(mockFindPage).toHaveBeenCalledWith( + '/en/copilot/tutorials/article', + req.context!.pages, + req.context!.redirects, + ) + expect((req.context!.page as any).recommended).toEqual([ + { + title: 'Test Article', + intro: '

Test intro

', + href: '/copilot/tutorials/article', + category: ['copilot', 'tutorials'], + }, + ]) + expect(mockNext).toHaveBeenCalled() + }) + test('should handle articles not found', async () => { mockFindPage.mockReturnValue(undefined) @@ -160,31 +173,10 @@ describe('resolveRecommended middleware', () => { test('should handle mixed valid and invalid articles', async () => { const testPage: Partial = { - mtime: Date.now(), title: 'Valid Article', - rawTitle: 'Valid Article', intro: 'Valid intro', - rawIntro: 'Valid intro', relativePath: 'test/valid.md', - fullPath: '/full/path/test/valid.md', - languageCode: 'en', - documentType: 'article', - markdown: 'Valid content', - versions: {}, applicableVersions: ['free-pro-team@latest'], - permalinks: [ - { - languageCode: 'en', - pageVersion: 'free-pro-team@latest', - title: 'Valid Article', - href: '/en/test/valid', - hrefWithoutLanguage: '/test/valid', - }, - ], - renderProp: vi.fn().mockResolvedValue('rendered'), - renderTitle: vi.fn().mockResolvedValue('Valid Article'), - render: vi.fn().mockResolvedValue('rendered content'), - buildRedirects: vi.fn().mockReturnValue({}), } mockFindPage.mockReturnValueOnce(testPage as any).mockReturnValueOnce(undefined) @@ -206,31 +198,10 @@ describe('resolveRecommended middleware', () => { test('should try page-relative path when content-relative fails', async () => { const testPage: Partial = { - mtime: Date.now(), title: 'Relative Article', - rawTitle: 'Relative Article', intro: 'Relative intro', - rawIntro: 'Relative intro', relativePath: 'copilot/relative-article.md', - fullPath: '/full/path/copilot/relative-article.md', - languageCode: 'en', - documentType: 'article', - markdown: 'Relative content', - versions: {}, applicableVersions: ['free-pro-team@latest'], - permalinks: [ - { - languageCode: 'en', - pageVersion: 'free-pro-team@latest', - title: 'Relative Article', - href: '/en/copilot/relative-article', - hrefWithoutLanguage: '/copilot/relative-article', - }, - ], - renderProp: vi.fn().mockResolvedValue('rendered'), - renderTitle: vi.fn().mockResolvedValue('Relative Article'), - render: vi.fn().mockResolvedValue('rendered content'), - buildRedirects: vi.fn().mockReturnValue({}), } // Mock findPage to fail on first call (content-relative) and succeed on second (page-relative) @@ -267,31 +238,10 @@ describe('resolveRecommended middleware', () => { test('returns paths without language or version prefixes', async () => { const testPage: Partial = { - mtime: Date.now(), title: 'Tutorial Page', - rawTitle: 'Tutorial Page', intro: 'Tutorial intro', - rawIntro: 'Tutorial intro', relativePath: 'copilot/tutorials/tutorial-page/index.md', - fullPath: '/full/path/copilot/tutorials/tutorial-page/index.md', - languageCode: 'en', - documentType: 'article', - markdown: 'Tutorial content', - versions: {}, applicableVersions: ['free-pro-team@latest'], - permalinks: [ - { - languageCode: 'en', - pageVersion: 'free-pro-team@latest', - title: 'Tutorial Page', - href: '/en/copilot/tutorials/tutorial-page', - hrefWithoutLanguage: '/copilot/tutorials/tutorial-page', - }, - ], - renderProp: vi.fn().mockResolvedValue('rendered'), - renderTitle: vi.fn().mockResolvedValue('Tutorial Page'), - render: vi.fn().mockResolvedValue('rendered content'), - buildRedirects: vi.fn().mockReturnValue({}), } mockFindPage.mockReturnValue(testPage as any) @@ -322,31 +272,10 @@ describe('resolveRecommended middleware', () => { test('should filter out articles not available in current version', async () => { // Create a test page that is only available in fpt, not ghec const fptOnlyPage: Partial = { - mtime: Date.now(), title: 'FPT Only Article', - rawTitle: 'FPT Only Article', intro: 'This article is only for FPT', - rawIntro: 'This article is only for FPT', relativePath: 'test/fpt-only.md', - fullPath: '/full/path/test/fpt-only.md', - languageCode: 'en', - documentType: 'article', - markdown: 'FPT only content', - versions: { fpt: '*' }, // Only available in free-pro-team applicableVersions: ['free-pro-team@latest'], // Not available in ghec - permalinks: [ - { - languageCode: 'en', - pageVersion: 'free-pro-team@latest', - title: 'FPT Only Article', - href: '/en/test/fpt-only', - hrefWithoutLanguage: '/test/fpt-only', - }, - ], - renderProp: vi.fn().mockResolvedValue('rendered'), - renderTitle: vi.fn().mockResolvedValue('FPT Only Article'), - render: vi.fn().mockResolvedValue('rendered content'), - buildRedirects: vi.fn().mockReturnValue({}), } mockFindPage.mockReturnValue(fptOnlyPage as any) diff --git a/src/secret-scanning/data/public-docs.yml b/src/secret-scanning/data/public-docs.yml index fb3dfdc6abca..f7ac53854689 100644 --- a/src/secret-scanning/data/public-docs.yml +++ b/src/secret-scanning/data/public-docs.yml @@ -1974,7 +1974,7 @@ base64Supported: false isduplicate: false - provider: Databricks - supportedSecret: Databricks Access Token + supportedSecret: Databricks API Token secretType: databricks_access_token versions: fpt: '*' @@ -4060,6 +4060,18 @@ hasValidityCheck: false base64Supported: false isduplicate: false +- provider: OneSignal + supportedSecret: OneSignal Rich API Key + secretType: onesignal_rich_authentication_token + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: false + hasPushProtection: false + hasValidityCheck: false + base64Supported: false + isduplicate: false - provider: Onfido supportedSecret: Onfido Live API Token secretType: onfido_live_api_token @@ -4253,6 +4265,18 @@ hasValidityCheck: '{% ifversion ghes %}false{% else %}true{% endif %}' base64Supported: false isduplicate: false +- provider: Pineapple Technologies Limited + supportedSecret: Pineapple Technologies Incident API Key + secretType: pineapple_technologies_incident_api_key + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: false + hasPushProtection: false + hasValidityCheck: false + base64Supported: false + isduplicate: false - provider: Pinecone supportedSecret: Pinecone API Key secretType: pinecone_api_key,
pinecone_environment @@ -4616,6 +4640,30 @@ hasValidityCheck: false base64Supported: false isduplicate: false +- provider: Rainforest Pay + supportedSecret: Rainforest API Key + secretType: rainforest_api_key + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: false + hasPushProtection: false + hasValidityCheck: false + base64Supported: false + isduplicate: false +- provider: Rainforest Pay + supportedSecret: Rainforest Sandbox API Key + secretType: rainforest_sandbox_api_key + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: false + hasPushProtection: false + hasValidityCheck: false + base64Supported: false + isduplicate: false - provider: Ramp supportedSecret: Ramp OAuth Client ID secretType: ramp_client_id @@ -4655,6 +4703,18 @@ hasValidityCheck: false base64Supported: false isduplicate: false +- provider: Raycast + supportedSecret: Raycast Access Token + secretType: raycast_access_token + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: false + hasPushProtection: false + hasValidityCheck: false + base64Supported: false + isduplicate: false - provider: ReadMe supportedSecret: ReadMe API Key secretType: readmeio_api_access_token diff --git a/src/secret-scanning/lib/config.json b/src/secret-scanning/lib/config.json index c31371ce762e..c27a54dddca6 100644 --- a/src/secret-scanning/lib/config.json +++ b/src/secret-scanning/lib/config.json @@ -1,5 +1,5 @@ { - "sha": "b4cde342632f4327023e8d9b3729bcc5387461bb", - "blob-sha": "f5614a575d8844d4ba53e0d2704d4feea885ae1e", + "sha": "2b0240ae95dae6b0857b3b679d3c01d88da5aa2e", + "blob-sha": "60dd4263fa67848500bb3595fff950b7b8b81520", "targetFilename": "code-security/secret-scanning/introduction/supported-secret-scanning-patterns" } \ No newline at end of file