From d47a4b41607178c6f211e8ec015f886ffa293e75 Mon Sep 17 00:00:00 2001 From: Hasit Mistry Date: Mon, 21 Apr 2025 16:21:00 -0700 Subject: [PATCH 01/48] Update Azure OpenAI integration docs with new model deployment names (#293) * Update deployment recommendations in Azure DevOps, Bitbucket, GitHub, and GitLab documentation * Fix typo in deployment recommendations across Azure DevOps, Bitbucket, GitHub, and GitLab documentation * Update deployment recommendations in Azure DevOps, Bitbucket, GitHub, and GitLab documentation * Update deployment instructions for Azure DevOps, Bitbucket, GitHub, and GitLab to clarify optional deployment names --- docs/self-hosted/azure-devops.md | 17 +++++++++++------ docs/self-hosted/bitbucket.md | 17 +++++++++++------ docs/self-hosted/github.md | 17 +++++++++++------ docs/self-hosted/gitlab.md | 17 +++++++++++------ 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/docs/self-hosted/azure-devops.md b/docs/self-hosted/azure-devops.md index 966413d0..e05af4c7 100644 --- a/docs/self-hosted/azure-devops.md +++ b/docs/self-hosted/azure-devops.md @@ -64,12 +64,17 @@ LLM_PROVIDER=azure-openai LLM_TIMEOUT=360000 AZURE_OPENAI_ENDPOINT= AZURE_OPENAI_API_KEY= -## it is recommended to use gpt-4o-mini, o3-mini, and o1 deployments. -AZURE_GPT4OMINI_DEPLOYMENT_NAME= -AZURE_O3MINI_DEPLOYMENT_NAME= -AZURE_O1_DEPLOYMENT_NAME= -# optionally, you can swap o3-mini with o1-mini -AZURE_O1MINI_DEPLOYMENT_NAME=[] +## it is recommended to deploy gpt-4.1-mini, o4-mini, o3 deployments, gpt-4.1 (optionally). +AZURE_GPT41MINI_DEPLOYMENT_NAME= +AZURE_O4MINI_DEPLOYMENT_NAME= +AZURE_O3_DEPLOYMENT_NAME= +AZURE_GPT41_DEPLOYMENT_NAME=[] +# optionally, deploy gpt-4o-mini instead of gpt-4.1-mini +AZURE_GPT4OMINI_DEPLOYMENT_NAME=[] +# optionally, deploy o3-mini instead of o4-mini +AZURE_O3MINI_DEPLOYMENT_NAME=[] +# optionally, deploy o1 instead of o3 +AZURE_O1_DEPLOYMENT_NAME=[] # OAuth2 Configuration (optional) # This will use client_credentials flow to get an access token, diff --git a/docs/self-hosted/bitbucket.md b/docs/self-hosted/bitbucket.md index f07abb5e..d42bdf76 100644 --- a/docs/self-hosted/bitbucket.md +++ b/docs/self-hosted/bitbucket.md @@ -56,12 +56,17 @@ LLM_PROVIDER=azure-openai LLM_TIMEOUT=360000 AZURE_OPENAI_ENDPOINT= AZURE_OPENAI_API_KEY= -## it is recommended to use gpt-4o-mini, o3-mini, and o1 deployments. -AZURE_GPT4OMINI_DEPLOYMENT_NAME= -AZURE_O3MINI_DEPLOYMENT_NAME= -AZURE_O1_DEPLOYMENT_NAME= -# optionally, you can swap o3-mini with o1-mini -AZURE_O1MINI_DEPLOYMENT_NAME=[] +## it is recommended to deploy gpt-4.1-mini, o4-mini, o3 deployments, gpt-4.1 (optionally). +AZURE_GPT41MINI_DEPLOYMENT_NAME= +AZURE_O4MINI_DEPLOYMENT_NAME= +AZURE_O3_DEPLOYMENT_NAME= +AZURE_GPT41_DEPLOYMENT_NAME=[] +# optionally, deploy gpt-4o-mini instead of gpt-4.1-mini +AZURE_GPT4OMINI_DEPLOYMENT_NAME=[] +# optionally, deploy o3-mini instead of o4-mini +AZURE_O3MINI_DEPLOYMENT_NAME=[] +# optionally, deploy o1 instead of o3 +AZURE_O1_DEPLOYMENT_NAME=[] # OAuth2 Configuration (optional) # This will use client_credentials flow to get an access token, diff --git a/docs/self-hosted/github.md b/docs/self-hosted/github.md index 15f4e980..74b816f9 100644 --- a/docs/self-hosted/github.md +++ b/docs/self-hosted/github.md @@ -67,12 +67,17 @@ LLM_PROVIDER=azure-openai LLM_TIMEOUT=360000 AZURE_OPENAI_ENDPOINT= AZURE_OPENAI_API_KEY= -## it is recommended to use gpt-4o-mini, o3-mini, and o1 deployments. -AZURE_GPT4OMINI_DEPLOYMENT_NAME= -AZURE_O3MINI_DEPLOYMENT_NAME= -AZURE_O1_DEPLOYMENT_NAME= -# optionally, you can swap o3-mini with o1-mini -AZURE_O1MINI_DEPLOYMENT_NAME=[] +## it is recommended to deploy gpt-4.1-mini, o4-mini, o3 deployments, gpt-4.1 (optionally). +AZURE_GPT41MINI_DEPLOYMENT_NAME= +AZURE_O4MINI_DEPLOYMENT_NAME= +AZURE_O3_DEPLOYMENT_NAME= +AZURE_GPT41_DEPLOYMENT_NAME=[] +# optionally, deploy gpt-4o-mini instead of gpt-4.1-mini +AZURE_GPT4OMINI_DEPLOYMENT_NAME=[] +# optionally, deploy o3-mini instead of o4-mini +AZURE_O3MINI_DEPLOYMENT_NAME=[] +# optionally, deploy o1 instead of o3 +AZURE_O1_DEPLOYMENT_NAME=[] # OAuth2 Configuration (optional) # This will use client_credentials flow to get an access token, diff --git a/docs/self-hosted/gitlab.md b/docs/self-hosted/gitlab.md index 7337b231..09d7ecac 100644 --- a/docs/self-hosted/gitlab.md +++ b/docs/self-hosted/gitlab.md @@ -62,12 +62,17 @@ LLM_PROVIDER=azure-openai LLM_TIMEOUT=360000 AZURE_OPENAI_ENDPOINT= AZURE_OPENAI_API_KEY= -## it is recommended to use gpt-4o-mini, o3-mini, and o1 deployments. -AZURE_GPT4OMINI_DEPLOYMENT_NAME= -AZURE_O3MINI_DEPLOYMENT_NAME= -AZURE_O1_DEPLOYMENT_NAME= -# optionally, you can swap o3-mini with o1-mini -AZURE_O1MINI_DEPLOYMENT_NAME=[] +## it is recommended to deploy gpt-4.1-mini, o4-mini, o3 deployments, gpt-4.1 (optionally). +AZURE_GPT41MINI_DEPLOYMENT_NAME= +AZURE_O4MINI_DEPLOYMENT_NAME= +AZURE_O3_DEPLOYMENT_NAME= +AZURE_GPT41_DEPLOYMENT_NAME=[] +# optionally, deploy gpt-4o-mini instead of gpt-4.1-mini +AZURE_GPT4OMINI_DEPLOYMENT_NAME=[] +# optionally, deploy o3-mini instead of o4-mini +AZURE_O3MINI_DEPLOYMENT_NAME=[] +# optionally, deploy o1 instead of o3 +AZURE_O1_DEPLOYMENT_NAME=[] # OAuth2 Configuration (optional) # This will use client_credentials flow to get an access token, From 84ad6b251ed40975f03ba3cb7728c9ac1af5ee4f Mon Sep 17 00:00:00 2001 From: Hasit Mistry Date: Mon, 21 Apr 2025 16:34:44 -0700 Subject: [PATCH 02/48] Add OBJECT_STORE_URI configuration to self-hosted integration docs (#294) --- docs/self-hosted/azure-devops.md | 5 ++++- docs/self-hosted/bitbucket.md | 5 ++++- docs/self-hosted/github.md | 5 ++++- docs/self-hosted/gitlab.md | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/self-hosted/azure-devops.md b/docs/self-hosted/azure-devops.md index e05af4c7..97137b11 100644 --- a/docs/self-hosted/azure-devops.md +++ b/docs/self-hosted/azure-devops.md @@ -112,8 +112,11 @@ AZURE_DEVOPS_BOT_USERNAME= CODERABBIT_LICENSE_KEY= CODERABBIT_API_KEY= -ENABLE_LEARNINGS=[true] ENABLE_METRICS=[true] +ENABLE_LEARNINGS=[true] +# if using CodeRabbit's learnings, also provide the following +# For example, s3://bucket/path/to/database, gs://bucket/path/to/database, etc. +OBJECT_STORE_URI=[] JIRA_HOST=[] JIRA_PAT=[] diff --git a/docs/self-hosted/bitbucket.md b/docs/self-hosted/bitbucket.md index d42bdf76..0adbeed6 100644 --- a/docs/self-hosted/bitbucket.md +++ b/docs/self-hosted/bitbucket.md @@ -107,8 +107,11 @@ BITBUCKET_SERVER_BOT_USERNAME= CODERABBIT_LICENSE_KEY= CODERABBIT_API_KEY= -ENABLE_LEARNINGS=[true] ENABLE_METRICS=[true] +ENABLE_LEARNINGS=[true] +# if using CodeRabbit's learnings, also provide the following +# For example, s3://bucket/path/to/database, gs://bucket/path/to/database, etc. +OBJECT_STORE_URI=[] JIRA_HOST=[] JIRA_PAT=[] diff --git a/docs/self-hosted/github.md b/docs/self-hosted/github.md index 74b816f9..8f7e4962 100644 --- a/docs/self-hosted/github.md +++ b/docs/self-hosted/github.md @@ -125,8 +125,11 @@ GITHUB_APP_PEM_FILE= CODERABBIT_LICENSE_KEY= CODERABBIT_API_KEY= -ENABLE_LEARNINGS=[true] ENABLE_METRICS=[true] +ENABLE_LEARNINGS=[true] +# if using CodeRabbit's learnings, also provide the following +# For example, s3://bucket/path/to/database, gs://bucket/path/to/database, etc. +OBJECT_STORE_URI=[] JIRA_HOST=[] JIRA_PAT=[] diff --git a/docs/self-hosted/gitlab.md b/docs/self-hosted/gitlab.md index 09d7ecac..42736e2f 100644 --- a/docs/self-hosted/gitlab.md +++ b/docs/self-hosted/gitlab.md @@ -116,8 +116,11 @@ GITLAB_WEBHOOK_SECRET= CODERABBIT_LICENSE_KEY= CODERABBIT_API_KEY= -ENABLE_LEARNINGS=[true] ENABLE_METRICS=[true] +ENABLE_LEARNINGS=[true] +# if using CodeRabbit's learnings, also provide the following +# For example, s3://bucket/path/to/database, gs://bucket/path/to/database, etc. +OBJECT_STORE_URI=[] JIRA_HOST=[] JIRA_PAT=[] From 19300f868099ba23bfbfe636ca08aec4df93dbc9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 04:29:49 +0000 Subject: [PATCH 03/48] Update schema.v2.json --- static/schema/schema.v2.json | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 2a779542..ceae9556 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -1097,33 +1097,10 @@ ], "default": "en-US", "description": "Set the language for docstrings by using the corresponding ISO language code." - }, - "path_instructions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path glob pattern. Example: **/*.js" - }, - "instructions": { - "type": "string", - "maxLength": 20000, - "description": "Provides additional guidelines for docstring generation based on file paths." - } - }, - "required": ["path", "instructions"], - "additionalProperties": false - }, - "default": [], - "description": "Path Instructions | Provide additional guidelines for docstring generation based on file paths." } }, "additionalProperties": false, - "default": { - "path_instructions": [] - }, + "default": {}, "description": "Settings related to the generation of docstrings." } }, From 9272f78aba758355770fa623543ed15bf916c4ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 10:45:54 +0000 Subject: [PATCH 04/48] Update schema.v2.json --- static/schema/schema.v2.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index ceae9556..2a779542 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -1097,10 +1097,33 @@ ], "default": "en-US", "description": "Set the language for docstrings by using the corresponding ISO language code." + }, + "path_instructions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "File path glob pattern. Example: **/*.js" + }, + "instructions": { + "type": "string", + "maxLength": 20000, + "description": "Provides additional guidelines for docstring generation based on file paths." + } + }, + "required": ["path", "instructions"], + "additionalProperties": false + }, + "default": [], + "description": "Path Instructions | Provide additional guidelines for docstring generation based on file paths." } }, "additionalProperties": false, - "default": {}, + "default": { + "path_instructions": [] + }, "description": "Settings related to the generation of docstrings." } }, From 163c57054b516c5a20190e4a62f68e53daf760a8 Mon Sep 17 00:00:00 2001 From: Nato Boram Date: Tue, 22 Apr 2025 13:26:30 -0400 Subject: [PATCH 05/48] =?UTF-8?q?=F0=9F=93=9D=20Path-based=20instructions?= =?UTF-8?q?=20for=20docstring=20generation=20(#296)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.md | 20 ++++++++++++++++++++ docs/finishing-touches/docstrings.md | 14 ++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 2b8b9611..bf13d57c 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,26 @@ description: The latest updates and changes to CodeRabbit. sidebar_position: 13 --- +## April 19, 2025 + +### Docstring Path Instructions + +You can now provide path-based instructions for the generation of docstring in `.coderabbit.yaml`. + +Example: + +```yaml +code_generation: + docstrings: + path_instructions: + - path: "**/*.ts" + instructions: | + End all docstrings with a notice that says "Auto-generated by CodeRabbit.". + Do not omit the closing tags; the docstring must be valid. +``` + +See the [docstrings documentation](/finishing-touches/docstrings#path-instructions) for more details. + ## April 14, 2025 ### Shopify CLI Integration & Bitbucket Cloud Reporting diff --git a/docs/finishing-touches/docstrings.md b/docs/finishing-touches/docstrings.md index 4de183b5..f57ecd65 100644 --- a/docs/finishing-touches/docstrings.md +++ b/docs/finishing-touches/docstrings.md @@ -33,6 +33,20 @@ CodeRabbit cannot perform further modifications to opened pull requests. From th This feature has been rigorously tested and is now available for all Pro plan users. Additionally, you can provide feedback about this feature on [Discord](https://discord.com/channels/1134356397673414807/1317286905557287022). +## Path Instructions + +You can customize the generated docstrings by providing instructions based on file paths in your `.coderabbit.yaml`. The `path` is a [minimatch](https://github.com/isaacs/minimatch) pattern. + +```yaml +code_generation: + docstrings: + path_instructions: + - path: "**/*.ts" + instructions: | + End all docstrings with a notice that says "Auto-generated by CodeRabbit.". + Do not omit the closing tags; the docstring must be valid. +``` + ## Supported software forges These software forges are supported: From 75032dbaa24507807249eb5796d029dbb0edf22d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 20:06:16 +0000 Subject: [PATCH 06/48] Update schema.v2.json --- static/schema/schema.v2.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 2a779542..b54dbdd9 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -116,11 +116,6 @@ "default": true, "description": "Enable free tier features for users not on a paid plan." }, - "auto_resolve_threads": { - "type": "boolean", - "default": true, - "description": "Automatically resolve threads when code changes address the feedback. When disabled, metrics are still tracked but threads won't be marked as resolved." - }, "reviews": { "type": "object", "properties": { @@ -1131,7 +1126,7 @@ "default": {} } }, - "additionalProperties": false + "additionalProperties": true } }, "$schema": "http://json-schema.org/draft-07/schema#" From ecb1e951288df73c5a311710728d70af273795bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:35:44 +0000 Subject: [PATCH 07/48] Update schema.v2.json --- static/schema/schema.v2.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index b54dbdd9..2a779542 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -116,6 +116,11 @@ "default": true, "description": "Enable free tier features for users not on a paid plan." }, + "auto_resolve_threads": { + "type": "boolean", + "default": true, + "description": "Automatically resolve threads when code changes address the feedback. When disabled, metrics are still tracked but threads won't be marked as resolved." + }, "reviews": { "type": "object", "properties": { @@ -1126,7 +1131,7 @@ "default": {} } }, - "additionalProperties": true + "additionalProperties": false } }, "$schema": "http://json-schema.org/draft-07/schema#" From cf67440cab8179329fda5791a6ab323dd9be39ba Mon Sep 17 00:00:00 2001 From: Howon Lee Date: Tue, 22 Apr 2025 14:39:16 -0700 Subject: [PATCH 08/48] Sahil ask for code graph thingy (#289) He asked --------- Co-authored-by: Howon Lee --- docs/guides/agent_chat.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/agent_chat.md b/docs/guides/agent_chat.md index 2ca396ad..f76c4931 100644 --- a/docs/guides/agent_chat.md +++ b/docs/guides/agent_chat.md @@ -37,11 +37,11 @@ CodeRabbit Chat integrates real-time web search capabilities, enabling it to fet Set `enabled` to false within `web_search` within `knowledge_base` within the config in order to turn this off. -### Code Definition Integration +### Code Graph Analysis Integration -CodeRabbit Chat is capable of taking definitions of code symbols from the symbol graph that CodeRabbit generates from your codebase. The CodeRabbit Chat response will indicate in its responses if it has found relevant symbols and snippets surrounding symbols in your codebase. +CodeRabbit Chat is capable of analyzing definitions of code symbols from the symbol graph it generates from your codebase. CodeRabbit can use these code definitions to enhance context when providing a chat response and review comments. CodeRabbit Chat will indicate in its response if it has found relevant symbols and snippets surrounding those symbols in your codebase. -Set the environment variable `ENABLE_CODE_GRAPH` in self-hosted CodeRabbit instances to turn this feature off. +Set the environment variable `ENABLE_CODE_GRAPH` to false in self-hosted CodeRabbit instances to turn this feature off in self-hosted instances. ### Jira and Linear Integration From 137a5fcf885861aeb0caf4ed7cd07e5f3942f4df Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Wed, 23 Apr 2025 12:53:41 -0400 Subject: [PATCH 09/48] Rewrite the Quickstart as a full tutorial. (#284) * Rewrite the Quickstart as a full tutorial. Add a new Quickstart screenshot. --------- Co-authored-by: Aravind Putrevu --- docs/getting-started/quickstart.md | 146 ++++++++++++++---- .../getting-started/quickstart-comment.png | Bin 0 -> 180404 bytes 2 files changed, 113 insertions(+), 33 deletions(-) create mode 100644 static/img/getting-started/quickstart-comment.png diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 280732f0..26d50f53 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -1,55 +1,135 @@ --- -title: Playing with CodeRabbit +title: Quickstart sidebar_label: Quickstart -description: Get started with CodeRabbit in less than 2 minutes +description: See CodeRabbit in action, using a live GitHub repository. sidebar_position: 1 --- -# Quickstart Guide +# Quickstart + +This tutorial gives you a hands-on demonstration of CodeRabbit, using a real, GitHub-based repository. It guides you through the following tasks: + +1. Integrate CodeRabbit into a GitHub-based repository that you own. +1. Observe CodeRabbit perform a code review of a pull request that you initiate. +1. Converse with CodeRabbit about the code review. +1. Prompt CodeRabbit to generate its own improvements to the pull request. + +When you complete this tutorial, you'll have seen CodeRabbit's code-review feature in action, and glimpsed a few of its other AI-driven abilities as well. + +For a more general overview of CodeRabbit, see [Introduction](/). :::note -Get started with CodeRabbit in three simple steps. No complex configuration needed. +While this tutorial focuses on GitHub, CodeRabbit also works with GitLab, Azure DevOps, and Bitbucket. For more information, see [Supported Git Platforms](/platforms/). ::: -## Steps to Enable CodeRabbit +## Before you begin -### Sign In with GitHub +Create a new, private repository on GitHub. Name the new repository `coderabbit-test`, and let it have otherwise default GitHub settings. -- Visit [coderabbit.ai](https://coderabbit.ai) -- Click "Sign in with GitHub" -- Authorize CodeRabbit +## Integrate CodeRabbit with your GitHub account -![CodeRabbit Login](/img/integrations/login-self-hosted-github.png) +To integrate CodeRabbit with your GitHub account, follow these steps: -### Add Your Repository +1. Visit [the CodeRabbit login page](https://app.coderabbit.ai/login). +1. Click **Login with GitHub**. +1. Click **Authorize coderabbitai**. -- Go to your [Dashboard](https://app.coderabbit.ai/dashboard) -- Click "Add Repositories" -- Select the repositories you want to enable +CodeRabbit takes a moment to set up the integration. After it finishes, the CodeRabbit dashboard appears. -![CodeRabbit Dashboard](/img/getting-started/dashboard-coderabbit.png) +## Add CodeRabbit to your repository -### You're Done 🎉 +To add CodeRabbit to your test repository, follow these steps: -- CodeRabbit will automatically start reviewing your Pull Requests -- Default configuration works out of the box -- No additional setup needed +1. On the CodeRabbit dashboard, click **Add Repositories**. A GitHub repository-access dialog appears. +1. Select the **Only select repositories** radio button. +1. From the **Select repositories** menu, select the `coderabbit-test` repository that you created earlier in this Quickstart. +1. Click **Install & Authorize**. +1. If a CodeRabbit **Complete your signup** dialog appears, then fill it out with the requested information before continuing. -## What's Next? +CodeRabbit is now ready to use with your test repository. The next steps demonstrate its core code-review features. -- Watch CodeRabbit -- Here's an example of CodeRabbit in action: - ![CodeRabbit PR Review Example](/img/getting-started/pr-examples.png) -- [View live example PR](https://github.com/tyaga001/devtoolsacademy/pull/39) -- [Configure CodeRabbit](/getting-started/configure-coderabbit) (optional) -- [Add custom review instructions](/guides/review-instructions) (optional) +## Let CodeRabbit perform a code review -## Need Help? +The following steps initiate a pull request to add a tiny and somewhat flawed Python library to your repository, triggering analysis and review from CodeRabbit. -- Join our [Discord community](https://discord.gg/coderabbit) for support -- Check out our [FAQ](/faq) -- Contact [support@coderabbit.ai](mailto:support@coderabbit.ai) +Use your usual Git workflow to perform the following steps in the `coderabbit-test` repository: -:::tip -CodeRabbit starts working immediately. You can customize its behavior later when needed. -::: +1. Create a branch named `add-utils`. + +1. In that new `add-utils` branch, create a new file called `simple_utils.py`, with the following content: + + ```python + # simple_utils.py - A tiny utility library + + def reverse_string(text): + """Reverses the characters in a string.""" + return text[::-1] + + def count_words(sentence): + return len(sentence.split()) + + def celsius_to_fahrenheit(celsius): + return (celsius * 9/5) + 32 + ``` + +1. Commit the added file to the `add-utils` branch. Use any text you want for the commit message. + +1. Create a pull request that proposes to merge the `add-utils` branch into the `main` branch. Use any text you want for the pull request message. + +After a few moments, CodeRabbit responds to the pull request using the `@coderabbitai` GitHub account. It performs the following actions, all of which are visible on the pull request's page on GitHub: + +- If you didn't write a pull request summary, then CodeRabbit adds a new summary to the pull request. +- CodeRabbit posts a comment titled **Walkthrough** containing analysis and commentary about the content of the pull request. +- CodeRabbit attaches a detailed code review to the pull request as another comment. + +Part of the review resembles the following screenshot: + +![An example code review comment](/img/getting-started/quickstart-comment.png) + +This shows that CodeRabbit has noticed some flaws with this Python library, including a lack of docstrings and input validation. The review comment identifies these flaws, and suggests how you might improve them. + +## Ask CodeRabbit for more information + +After CodeRabbit reviews a pull request, you can converse with it about its review. You can also give CodeRabbit special commands to request it to perform specific functions, such as generating appropriate code changes for you. + +1. Post the following as a new GitHub comment attached to the pull request: + + ```text + @coderabbitai Why do all of these functions need docstrings? Isn't it obvious enough what they do? + ``` + + After a few moments, CodeRabbit posts its reply, explaining its motivations for its recommendation. The reply might resemble the following: + + > You're right that these functions are quite self-explanatory from their names alone. Docstrings aren't strictly necessary for every function, especially in smaller projects with clear function names. + > + > While docstrings do provide benefits (IDE tooltips, documentation generation, help for future developers), they can sometimes feel redundant for very straightforward functions. It's ultimately a matter of coding style and project requirements. + > + > If you prefer to skip docstrings for obvious utility functions in this project, that's perfectly reasonable. Would you like me to adjust my review approach regarding documentation for this repository? + + In this case, CodeRabbit is offering to adjust its future behavior when reviewing changes to this repository. Instead, follow the next step to ask CodeRabbit to implement part of its suggestions. + +1. Post the following as another new comment: + + ```text + @coderabbitai generate docstrings + ``` + + After a few moments, CodeRabbit does the following: + + - CodeRabbit creates a new branch, based on `add-utils`. + - CodeRabbit commits changes to the branch that adds suggested docstrings to `add-utils`. + - CodeRabbit opens a new pull request between the new branch and `add-utils`. + +## Clean up + +Continue experimenting with CodeRabbit in your test repository for as long as you like. When you're finished, you can delete the repository. + +You are now ready to add CodeRabbit to other repositories that you own, and let it review some real pull requests. + +## What's next + +- [Integrate CodeRabbit](/platforms/) with your repositories on GitHub, GitLab, Azure DevOps, or Bitbucket. +- [Configure CodeRabbit](/getting-started/configure-coderabbit) beyond its default settings. +- [Add custom review instructions](/guides/review-instructions). +- [Get support for CodeRabbit](/getting-started/support). +- [Learn more about how CodeRabbit works](/overview/why-coderabbit). diff --git a/static/img/getting-started/quickstart-comment.png b/static/img/getting-started/quickstart-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..9813172b9ef33dfc7833efb242a6a79076bc5241 GIT binary patch literal 180404 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%0Df_XeMQ87^=b zCwvGDQXdn-vRElY);Hc2iz0s2xY=O+OF^CtZSCM~v{6SKW&dE&>$xww?dd}5g}o8oD9_R?rQMY-;4bUc$!%{;EWV^Oz=`0{H)%NY z_~aOE=t^p>RrPF29WNaKVeox|CS-k5xWC-9WTnb*YJyY}1Dau64c*GCOvm|;Py-)I zPlUDO9tyI0W7^MH=OGC^)T}&&7>a6GF0q=ku`RLhB1D#`oDoVIUKel-WqjR-(LpEJ8kzf)~9u7?9I; zbHRBQGf(@Dh<~yjZS-pdCDr-cC&MCbF?~2FA8M^gLotbKVdZwI2LnoX(LA_VZ=h2v zvP~q}uBjKnOgcSDwIoGS^k>+y7z)qpR^~hW_|fG20T+AaDD5&;K{Y5kZ~E>70Tu7A z1wJf(qAA^wktGSO1oLOE$(3*U8TTWC68PyXhYyQtK3!63WqW&v<8Jw$`#aYO_qF_h zrw1AtvyS&rSP!)ND!G1>7?pOS-8y{(L&0}sfdXFVh=fbYYPg+5?(~$ZB zYy1g3o(2}xu7X6_TuHYNQs>kYJ8fxB#Sk^mS`oZdc1ZO+9QvzvIp?y)Gm(e$A+_f?PV?;KsnpM5 zhd|?`9k=<8;pP@YJmBLGz#FH@h}!rpcGKcR;RH_$zIi zMD}}rR!fLoOUF}dPB#&pLYj|Aac1LC`4I$N;Y#8PIrqJ?uGll>TB1$bC*)*{iVP2? zei@^WOo*3h?+fu?Gek?&`9RBIe#k?#SDQdKQc?1kY(L`q;a}*xNJc0*uS=eYmLF z?4BQCzZI|7;<6P%|8j!$sU0DTv?vzSAWD(qCn#OSBicbB1I8XpB=Cz?5$9pv3sl%a zJ%%I*pT`wiL@a>6GA-Zdmk-y_s4Xtq0*%UVjYdr;x@pFl?5Cun?KlzTSNEXNiU#M9 z)X*@|i$Z)F+vSYhTnfn6E9;jUiSyX(kBdp9)?u_yhm)u{S5V5+q3>TZ%U9sN6BBV_ zs3fJ){$k>gR|CF@1u9`st!&k5R|}Fgd4n*CBzbWC5%l^IP(BJVVSa54msv^hSj}u) zK@R^6__lg`iX!pY%6aNeALu&SutH5fI-oOrMa@V+I|fgQUmH0|Dbh>=k>hmh?%m=I zRSBj;WRB}^5amf?yeAEKN_`nfi%^@)n_T*$s3>EoWZxI+Sj^hc)4aziUv7KtD2K4_ z-XRC8wqEG2pZ(tk`k%c_{e(7r3|$2Hx?o_f6{$KnMo?5kG44M)35I{jKRZFrw9N5Bjs0l`qAo#7yp?`Y_n&@*RpmM;)u> zrr@?VphOBgtzu4)$2&QKBtBZyURa7gyR`ww#RiNl$`}f1@2bMsPPPQYpAyppMlY%G zh&7sC<01%AES7X{)YflzQflS?N}SQ4+QTjHB4ghfXb-)f+|I<;0Zae@HL>YE3V? zN8kWRP(S|yT@Hglb`+b~saB@h-Ryp&j2%%s&=I^yJ^pDCl1~vqhp)qeDI6rjC1GM> zlE|Pyi=mdu`T2>=F#-yo;$VBbl&{Y90R=)`cX$&46QD@3#r}n5_3RY=AIX?MZvtxW z@1>7^tA5)$e7dHVP>h_$l6QG79~4&f!_!8bzkEPvb*y#OH zf7y{rOWW{-y9XKE*R%B0>N}cTy8Q#HAA|}hLknrrSy(h~Ma9JYb}(a2;`w;X+txwr zbLd|u>$8jWt=JT*T2D)KgjlJrI(`TCFIr@yyVLJken#@uWs+((=i3_{25FC^gp#fu7)F21hpS6 z)Y=MTjm49Q?oSp@4l32snC5(c99vpgJ;o*GImZbBXJ!+MJ6U~dduH4&gV|#x*V#(h zRu*hb80`hUga%2(5t!O-izg7&54S{McT6FvdA%I)a>ub6AyT-;p=}f}|CV-RICbUE zBjqc|9gOjW=w-eYES2?z_jHmf2{J{S!E0;BL>Q1$yhQ#IOpuM`Ms>-CW>6f`27fec z_<*1&L5Pt|MnlDwj4rX?D`6v%2OE2cujc74KqbVg4P?NKYGq3fp$8a+FRE0_mas`u z{M=Mw?~kh-NeeDF>!eVgV^{1G%zNRxqVsS;`72QYd1e=<4;Nh<+3k-XKX^k$S(UTs zT!>?dViabVwLtb-U^Ph9h5q=~nZ`e@>0bgAzRK;pA5}IrrZ}Ud6DTCn zg`wZG6iU9@y*?sIuU{|P|41R1pg9#Ti5bfjJ@fhBEyN$m!;hHI)`s4q$11)IwN^{M zFs%QNy|)aDvhCJ@6#=C~kPfA!1*BWLbLbE$>F!cgKw6M4rMtUBx?|{WX6R;yf$w(j zcfb4H`+a=AoP4J@IzlJFYap#7W=DnTLjJ~TpT5j=yw7~`Pov#iJ{g?_G zV)&fifqcG921@m&`~Ahb{C8Y(Nd2xMo>U_9(&}$2JH9$BcrnBA)2lFZ`YS&DlrFdQ z2L^frqO!k)mj5|R{kV(PeDd(wCvi?W+AJwfxxlE%HUw^zWW6^==?5bGH6?-j(qY|6)3 zYFtYsmWnl#W75A}Re}%-B+T+(kvqSNvj1w;|2ejyMn!woj{k`gmHo^A%afnCKTz2B zRBo34L*V{nQQk#Ac*Mf7YjUjqx6A+kzb`1Q*!VppfRG`bcu&P>np54e54P zAQZ!A{o%^K9A>)m0N3r8J~ z+QDFVvYEeKK@Nit595jNJ{a|G$vJMV=P1m!+OT6&h(^64Vy9J%LHdecBqs06{>#Nl z{2HOUh}Ik#d}U7)>_DnnV1RdcXb*Gl>g;qJUZL{2q-g)x#qjO5A+~43mn`KAb=hd@ z4ro1HdhFkY#H!{)RGriT68PiT)q!s`GUYD!CW~%zAHFY(Fm?RGvbR5Eg8w39!!tQ{ zM3eEIdF&W2n8zp?vm*GMdBD6q9N9l0`oJ>d15pQp4v%hl_?^6rS)I&5?bRhcibmG^RU@v;JLH zH{svJcgXPXQ?;G9^UDSY9lf*mKoHmY{`tBW{jcElmb+$@`I$fAlGU@(QfkyNP<&ji=P!Og~ z`K-Qk+TX1EyV~F93x3mFS)|`&pT_o%YK0k%&GulHYD}y#y(heq_i5edj zTIJN)HEv|Sjm9sA6ZxOoAD*~zz-{gxKGFUH0jC;y5?nl2 z35s|R#E{}1x@armZ11fVRO-ArHtMdFP2h=0M`fX-9<@sEi#Ko%bIdRBHW zubjaj79n`~{J8Zon_=rmPAQk?meb+0jdnPt>B5f)bw8$9`qtMs(D=!-(}qz+)}&mn z!bK3|MmuX=!4<9-(s2!B{ z_m^%8#abPNP^|`alyEA+0q>^?jJP%^JcS=@5$vQXGxt0DBrh{7r)K{UWw=Br#BaZb zsTeMug|F=V(3uN$)X-(Z(8?c*{fzdF%?Y`d#W>u@mjJWv(^bku(x=}zLn z*{eVPPO+G!XbP%-`;bsfF7TpBWv%_A>5~@62l~@&!P=R$j%rfSSbBM64-b_^Omxi} zPz>~~Y{4mLig!9pl2i?efZ8v{kytt?m1OKTYL`D?G9D` zG5`bdoC52{3s-OXarcRFU$wNW5XS3{t5;Hin;YbAR9WZF$&iA+RT*h z37|7_nf0U_!kuhKu@@V?@bX3t#U?FSsXM|R!7umpUTA}iGc^0hf2au?;CO|gZwb62;vi3^tZpeOf%O8+_)2qy=h}yh z?61vdl53!2^?Nfg0m#%Hu_zYlTNkCCfq6IR_;pbkm0>W3yZyrF&HfmYCgbZXJWy1o zUPRP6Ukn|W`FcGO>T9l*o(NVx8an&k58`dz8e4xZP$; z+Qs??ZyEv+5ufzyGOcSMeY%g(TT9c&}=Q}<<#=9NE@;H20v@_b>F9DB! z;bv_%5`$%A4dJlDW1`t^Ed*ZVN&4{}B;^PNgD^1fQ$dgG&ilJ-^VuhuR2+I&lw)PQ z5HRBP08N|S5_Z@#b}(Ef>Xr~(sO2=v3(%mj^Wk3krFCL=zADYqNo;bQrguqg4_e^o zGaGIPiw`sWU|)?Qsa7V}G!1y;pyOG+xRlQ#$@wd3+#s6RW!>XFxaOW(;K~N)3#N%e zYVFH?2Pu;5#;ja#pZq|5{1EGf)-1|WrK0%vx8_|8Mj89xeB@ z?uYYO4i|I%cfi}NGKxN})qnj%!eIY>StlryyQtunRx0omuYCCWlz!cQR+v^Pw^9=l z5b10_n9R;ehfBjA8jML9$egE~C5^}p$)H7Peqo>0JYaTmb=7-kniu^#jmq7AG2}y7 zp5x)MIJu}hK{_O-y3Cm8B9P}fexU%CZspBS%_Ppg=;spO#Xnk(TTfjx7wg|=h?tFc zwtW-SE`5nZbvpPeoSa+h=xFMvu%0g>PHClJ(sDgYbZ2$8;;BIW3&EwOCAA-7BCbah zXg8qp?#BMG6(JOKXfZMLV0tj3?G{P6$%C60!C}efPr-u^Kr-BQ{ci@oGrEptNu8A` zdZb`mZ-t{5hEobs-Vf>jFmen|Y1%S(J$Wa^;V5RDt#M%&PX91i=mulqocofbEhS$} zA?naD9JE;P^a!CDK~Vs9zJPGM_=FPlyRjyXP_$`iw43wP>9fl|u)GTl0Ec<--WKJ` z!fTa$2#NWu+^znD69MZ1Fsjb_lc&!|yXNJL&Mik$Nm_i|Wac0+B9^?33K8`E{RKB5%O+ku*UETP<-;kK3aSy?ICwI%%Am zTR?V=?Kn9_tBuWNEQ)2g(^{w01-XCwC552VnZ*x&|3+7<6aNeA-HC!vFt{3{3HI-q z$XJez%D$Gk2AU_yumYH(Q0qeY{9x%R8WoDL`O27au<5Tp4r$)twyT3>3sl|kg5%p; z-wN;U7+D0}ET7%HVjP7B^3_rB9wMe8UeJThS2ar@ncI$hk9h7a;_CeCfOJt#E(3gP z25+{;C+dbIe$=E3^&$(w@9g=){trFpho```?)1XKmR!Dduhr+uKFvy18b!47`i9@P zKL7!9JKrCF^i>%D$GOY}cyK}0O!g4_zMcA)$~Q{wk&LdKr;nXB*7=c*nnE#|pg-Tl zF$pBD1Jd9;g4mT2+am&|pmzN_SNh?PErRL9)mCHWXm<i0T6Uo4VicXiqb#|a!@%#&m6!ZRaVqxny>*9xzn?696wjt_QUi8ZLt+I2AlRYR-l8gN!Uyc6j`Cn@(Z}81 z?V2QhRiXhsekeze$}i;Sr-0YJPwKs%mMr)ON09NREbJ4VZVi5tHlC7!W5@rP+Wpq$ zI@Y%o;E`4SE9pqkMuqTzZY$dTAmrN*!VHZ|ucGx8mhE&Fg0j1lRC z+u`0x#zrku30n1z;zKuxx|hMxd!+;4i?Z9)*jI8B95x5*uIU7K0^A^l4)7yzulxgX zqaST>dpzXAp^sh|&)xwg?nSHQS9}Q3FaTDMK{>%wCfwc0%{q6@9SPnkW>V)z@D`(Z zDt>UIV#I6HZI*M$l8QqD%jfA8|4%|*%RSv;2~!vdrNpxtQHc4eVN1ZzfxEslcl#C= zQQDO3JE91;XzA%NA|GvYq~GiF6H}^uA@Vg=%y~gYQDcg*x z8sxyr!h%dx#M`6+Mc81q{yKFMzMH7S`*aB;VK?w=%jE%yN>zUf5%tF^o5T%wIbqLs z#e#|zVyP35o5Ht&32D(!PS#~$Kvd0CBz+6b7mIb<{yaVdyE-K-8f)&Z^NvME@^*&? z`re#E+9w7;MbC9*0YFb6%j_(`#zY7MEoRFnFC@LR#H@ckk>9TJqI~-_5O5TFAj5Nh z*BU$!bZu}HySHlXdtKq5UMbE=XGY51;D6IxY*d9EORoY>QsPWYX}fpxTg<(mPSlkc zA(qH>ws}z#I92U3k!_?5W{Lx!8;Q&oAia(0FiX`(Qlt>9u5$G~uWBrOM4KUp_J;eW z63@Cw5f|v@`Erm{B;uBGhxOf5phG!N8B_|x)AbX%;W%j&bQF#5dm({G1Y>@&h3#pI zD)dT$qDq>6^j3g$Kzgz#;=J;<9D6ETJ`UfwKr!yc7mU5pi&H{o4kdG1k}GhD4TCTE z*D0?lCbh1@Cx6m+#gI{5#3(dV_Ge&y9;XStQhFv*1lhU&jqkx+1$dk5J!RitQR091 zHb9rRgH_%)xMyh%k4%q@zMp+p*S2x4~CyGOi>jc<1CHTi$7ZyKRDdxWjKs>%9-ns#RrDtlHu3l9~yeqXF@IuCtp#!Ez zG;frK0Xikh#e@*R5U;h!pi@X#*iVRCYPw2<`&>evTD94}G%m1~EEPJEBw$fDm`jbC zl4)7w=_Tgz{oWu-OZ)l_O3;v>9~>uKb?()+zpg6K3HaW1Cs3hgfUCLP4GMd}<@Y8xWW2es$V)kt`@Pv)FAzg~Ncze_=k8>&tECT##7 zV9zH^T(mi+ose@%FaA)vzpywh{(GL>mgcIF9MVVF3n6i2Ba5?QD{dIc}mtLa%R zMKZ*TOixQb9p2YCKqPNh^mNX!>Zib&^V<>>5^OU*8r%zh2}|`jR zo%e9B%agrCjN0wmsDdAZfeciKbt6MS<7a?mc&5F ztlj&&rQ*FyV7-~S&28m~yp4ae0}$Eu9V*KTUXbMtUk|f5Iw+#$3W|0`bp=QLfIY4` z$HM}lMof`>qj!^qPfooyk4#q7zT6m%ceoF@w4#_&OTv)WV80u0u)%48 zb+!9nE9&a<7Vu6SHYs~+JdE>ty%V)^{@Qrj&&;cIpb`)erYy50VZ?O2tzM&%-bgT^ zIk(OVx;XJu8N48aXTjkbaaLJIi_k*_B6cxskil}RoE?c301R#u=mI_=7!t+W5PQO-6GNroy&T4BKtj-L(|J*{|MYKjFa7b`a^+UrnBm`K?$H&>yHUFlo@Jtu*vy@upm;< zH9xo$0?@%42nAzWwSXR88G}xa$;&p?MYS%Z!V6k5T{`PP-wpt3*K76ZHJwr(3HLrfp>2A&u^tB4Zhk|Q*iJWP8N?GUsm}`PAQ-r1 z!o>!zgqwb;&T zchAsJz%O`vm?eYCGTa1F9FW0H;RPmej+_rsGkxWrN;k&icIx?^RYT7sc5hogt_GRM zEVLXzV`lvQ{ad~7WBm=9wxcrX26oxhP%LTFOF3m-?GhIooZpRi2Dske-z|JbjYt+c z(b-tU?~DDA{u*jiClavS>{Y&+!Qb*2sq{L$!^^AyQ9(cnahGZYLS=%2B7CnpV z-oXH%;nq*Vt4S!(cNS7FU4LV+ zg{NLDjAf<9=F>Z=m6|>4G_QA68)(eZ}GsNcV_Zr)^7)tM=Yo@ZoE(6{cGjY3pkT!Acxp2t0> z8I`QWHZa_nBUk^Ss)m>_xKz*z4r@;H7~7oN@#%f{o(h;dPbq<_=mC~iv0=?n$N2by zD`d*5xy6WtTS#o{#ef$SR05dYP9do#j+v4tQe839Ko-= zBM&D%!6?)&f*gC!@i~r-CcYY1Uy%x=mI9SfT8$8Iq;+e4ei+qa3(QfmL#;yv6_W%cjw-Rsbu!wzJnY6RrCel!p_o)OI`ujzp3Vhg zIAni-lZ^5JIH^oS^jVsI?%aH%9U12i+vm8!_>HMnLq5NKYU~X4FNdFwI)|4YEf=V- z4@zT=<*U&IPb%_5-LDQrKP1;ccGqa(+4?iRlc4?{sj&FBL-lChZ3Zf3l<@^6=Rq>S zi;O0zCV@I zJ%ZC)_cjYO^3RvyjbQ|78L#ZC{jTy#gM*gAA73)I-`Ribyf&@f+NyP01!{iP`h2?g z&rz1{)8S1O%o9fxg?-*>DxxzBC0xRqEm+?fjddLoY-52|A>4Jp%9hXjJkkFfn}*jM zFWR$kP4VcV!ri9v;wq{_Ek7JnX>2a{x!d@H9J5eHD~aIS5It_usln-tPkH7muN_WU zFJd3fes+J<0+^PHLEvr24Ojz8oJ&cI#15bJgw1>xRwa;%|zmv&|G>xlxlvn2xv&3 z4^Stbmy~gS;VBG%Zbdd-D%lfGa(=q{yzLzz>GSsLsqTLXnyBcW4E*B#;IAbU1V7rD zfw|EZ;k({x4LP3fbU*kvMj4S}qXyKxslhF>o!^2=)z3bSrfmb(4J5?KI5;X76R(B! z@*Ua(&c|igS^Hjm#Pcd(E%9rbeh;qvf>mM`@?BLIOP#Jy(9PO*xt>Se;;SMK{p4r4 z*uA=a8}(Vt>-SRD(!?6!{kg3Abw3Yxur8L%l6j=-*eIwjs&8Wova;>JAoFF*eaOv3 zkH5aLke;BGi+-i{!hAc@nXqsd;Wbqa;HSfY1dE$nr0j|jc6CrvCps8)P?+A&P+0o4 z+QOJydS;|{#tED)bZxne)Y9nP zjemV}1KDCvdEGVdMs|J*6!FxC^VQyScfpF^Kw2ml{?>?Kfn8}EmIGqK;27hnSq`RzP*0hLJB&-$~w{>ZtEBT*_=bN z(M-YBhUOQQZiX@Wp|ND9LPrk$>AL_C92t3WNjZ>~6sJ05TrEY9nTK>)ivg&&jrX5#mVgz+is z9JzNF#vQGM_@7Hd7Cqw#IJpJRo(2=m8dNdh;@tmiu5l0&Pb4~0M znx4}a9_gB0JF7pt@_*(A#9A0yN+Gd3`+M=IB%?dPBh#)ot6(rsnGVI4PojUA7#)WK z(2`g8YQ>i8={h$x^@9XN8O&(^RkQ#-2E+L}uty37B^hZIOot2f&I_BQ37(2DQEw69Z(|1i4Q!1wWO z$E;Sl)6M>JnS^%Q#hM`=HiegJ1+=C|!i`z~z6v1_Ktrw!fB;x9AoiEjm&pwgz zxG}ccEh$@a_I-d(vjnT;Dtg;)1e-kq?ssHPM2Z->8x| zT#rqfS^<4r0V^SoFuRUQe|j`cG^&azgh8p&GloGSH=!gT9B3jXg7k9lVXfL8uVJ01 zm459wq9*IvjEy#$;>G`venCWX6ykoJ7d##QS#rc$sQCOw@LConlh#Kn`GP>V@-EX< z7B^dxQK9{%)dX!h_JjUw=~$M?u`%41WJz@9FKX%OsA)BOu;$u-j>k(Y-V+QTlvKAyr`;KPAfTryfoHcYqW$ zSGYKOH3UetoVPeZdEQXfug`wl;B&ctU~k+MzMx&!&gJxG%3&GvOBlg8?@Pqaa7tco zA`EY)bVW=^oA*M=gB?VbNv-Ew0wZK2w+b!YiTlPFgifIDrt;!Po>$CXI(ZFXPLZWK zhu&z+dC}<)kH^}^u-a<_`q^q*urgILeFU$?aAGJ+VPdlz{6B^#CIx=)?%x@~;+XXD z0QcuNnh(EoZZRdXZ&8?gC~AuTco-EZ#3Sab>=KR*$jC672rGGK;Y}n@t|@ z8#*UY#V7vO_^d!(n9b}?eE5FtLvpLqeCC$`8jn%~V5x%L48s9U$WI^M1#g}hIhqUm z@Xj+0`Ur`JO7nAE{2%>5Ek5sob91)UEyN9;Kdb(&crIP?*^{8tw}gHF`b~sAt;w}F z!{vV3FIy{oD*PLdIm8ttgm~OyP-<(Xm}FK!m&uz?Wiws+3Ar;I>TqF)QSGoWKU?xi z(0s5hZ)T%AELi*ze9nyY0HjN{Qf-ZKBSd1CG;rEiilihR`(QjQQmw%nE0xbl9cS;Q z#6}?cq3`7l5$udUEgZ&-|0Hg74e+8qCon$ckEafCiyeKxcN*tf@`E!+;a&16_k1DP zW~_RS*Sp3!2c1~d{d>jWtzFvQRI~0=*S)EZMN7jJnLyqc3ezbq4gt5_DMCOvu2S|) z^&z#FzclJM+XTb}?DFs{>IHPq98NXe(Rn{z@+Js#@1V)?Ph5<$-}D=8Wy&)ZPsq6y z@=8oNasV!oGI@6z*C?V{F;)FP~o)z=(RnEaz%n z=g=>l+amlq*q~eBY6HMwcXF~+F5+2%=!=I8R+sFp<|&H8^cvA}u^)cr0fHt#HwEg- zEMKM{Kj@-(<<7M`JiQhki&jR7C=CY^Za0Mz(#vn z*5yJfu_s{!%y#KAM(5gPT7)Q5+{T~_*Sl+%Qe9Cg>s4EWwt1o9pIyNxcaP%>@@U0g z^lFuAstMYIxSj7{maU}=CgiWIZixZm)`$+cEkIo(JVH$)f`m0JgMA`bA#9RKLH;qD zfh&IOGV7=uH}7|%I?Y$hE=o|~Iog`91ccS`}_8Pe1$mHpYM8kcp;ofIGpiynuna?@Tm;mEwa z-~s<6d(>VtQ}#IB*AnK$a{50YIJ)-{dl6Co#2tzaZ3p@+;xbT#LGB;$awslP*}CQT zuDVcau@`rNQ03nzGP^r01ljB;(`;%{zp+Q9mPOI!+#dO=EbN{CK`c|&T~y4V@WkCxURaW;X>Co8;B@ zkDns3XBIYd9Em{W%ZV`qyDyXQB2xTIv=6FYgp2foq<{OpI00n`pLGN1)eiZ4pp|_f z_CQWjTyt!V##{UAy3|R^fJnJRThZ#9x)>j{ttTf5A=8TvF2J9!L=<_5>oP2tP1!M7ShW56VH>{KI<)pilxGXO&DXa@? zzB5u;-VmqxoI^?ucW_L>w+Cx$k#~MRMezLy_*Iu`rXf{#+D06lI0+LBW-&q2iszTk2M;IaGWWFLikK$h~WPNM2sv9IFnB_yDLFe~(MR zWbvh@I`{YNnxnBfOh-GI1J*>2k_{z0#;M17!$3Bt$RLj(RmpY!-dRsLB_(4RTTP2*WIDuxc?xhKwN$740m z0aJj2+AGybD>@HPTUTEB+U~Y6mdQZ=WcNYu)UzG-ABr~v-Wr-UtN@wC^{03L6Aq)! z!H10Mv@#!WZ^m0}@?L3!^R*emJOq&LfUscMj_g+ax?$5bxhx(m(Z>XY)C~9fE zFVQh6n0%q(Ed{ca%vDSQhAm7BZ}ZqZ*-T}5-rV`#{FW;U_;eG`TrU-Qhz=$4E0mS$ zwa)&G9p@EjqoW4rtvpC`doDE-5f1=XacCgPnQKP^@^A1MQf6nIx~Xb+Y3A(8SB-_M zvp}l}S(T6`TwN%)ˤ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%0DMg!n&ShU-(J&23qTY$6 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 Ax&QzG literal 0 HcmV?d00001 From 66544ec8ce5aaaa561dc2211052bb1a43a7723c9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:35:20 +0000 Subject: [PATCH 10/48] Update schema.v2.json --- static/schema/schema.v2.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 2a779542..5573134e 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -285,6 +285,11 @@ "default": true, "description": "Abort the in-progress review if the pull request is closed or merged." }, + "disable_cache": { + "type": "boolean", + "default": false, + "description": "Disable caching of code and dependencies. This will force CodeRabbit to download the code and dependencies fresh from the repository each time." + }, "auto_review": { "type": "object", "properties": { From a45ee8c941d7765719b726aea56b9006f2471e0d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:56:22 +0000 Subject: [PATCH 11/48] Update schema.v2.json --- static/schema/schema.v2.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 5573134e..755a12e0 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -116,11 +116,6 @@ "default": true, "description": "Enable free tier features for users not on a paid plan." }, - "auto_resolve_threads": { - "type": "boolean", - "default": true, - "description": "Automatically resolve threads when code changes address the feedback. When disabled, metrics are still tracked but threads won't be marked as resolved." - }, "reviews": { "type": "object", "properties": { @@ -1136,7 +1131,7 @@ "default": {} } }, - "additionalProperties": false + "additionalProperties": true } }, "$schema": "http://json-schema.org/draft-07/schema#" From 5c3a7fdb32c11a9f83234ad13dbc9c58f80fcec0 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 29 Apr 2025 12:28:29 -0400 Subject: [PATCH 12/48] Reorganize and expand the Introduction page (#297) * Reorganize and expand the Introduction page, putting more emphasis on the ease of using CodeRabbit with quick integration and friendly chat, as well as tools and learnings. This change de-emphasizes how CodeRabbit works, removing an operational diagram and information about its use of web hooks. That material is better suited for deep-dive docs, or blog posts and such. --------- Co-authored-by: Aravind Putrevu --- docs/overview/introduction.md | 90 +++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index 6f2e2e5b..9c4fee30 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -9,56 +9,84 @@ description: slug: "/" --- -## What is CodeRabbit? +# Introduction -> **CodeRabbit** is an AI-powered code reviewer that delivers context-aware feedback on pull requests within minutes, reducing the time and effort needed for manual code reviews. It provides a fresh perspective and catches issues that are often missed, enhancing the overall review quality. +This page provides a conceptual introduction to CodeRabbit. For a hands-on tutorial, see [Quickstart](/getting-started/quickstart/). -Developers can interact directly with the bot within the code, offering additional context, asking questions, or even having the bot generate code. Over time, **CodeRabbit** learns from user input and improves its suggestions. +**CodeRabbit** is an AI-powered code reviewer that delivers context-aware feedback on pull requests within minutes, reducing the time and effort needed for manual code reviews. It complements manual reviews by providing a fresh perspective and catching issues that manual reviews often miss, enhancing the overall review quality. -:::tip -See CodeRabbit in action and watch the demo video below to see how it delivers real-time, context-aware feedback on your pull requests in just a few minutes. -::: +Developers can interact directly with the CodeRabbit bot within their existing Git platform's pull request interface to add context, ask questions, or even have the bot generate code. Over time, CodeRabbit learns from user input and improves its suggestions.
-## Integration with GitHub, GitLab and Azure DevOps +## Core features -> **CodeRabbit** integrates with GitHub, GitLab and Azure DevOps repositories to deliver continuous and incremental reviews for each commit in a pull request (PR) or merge request (MR). Review feedback is automatically sent back to the PR/MR and can be committed directly. +Core CodeRabbit features include the following: -It works via a webhook, monitoring Pull Request (PR) and Merge Request (MR) events. A comprehensive review is performed when a PR or MR is created, and for -incremental commits and comments addressed to the bot. The feedback is then sent directly back to the Pull Request or Merge Request. +- Integrates rapidly with popular Git platforms and workflows. +- Applies dozens of open-source, industry-standard code analyzers to every commit. +- Implements code reviews as familiar pull-request comments. +- Works with contributors through natural-language conversation in comments. +- Learns and adapts to your team's code style and review preferences. +- Provides an observability dashboard of code-contribution activity. +- Practices strong privacy and security, with no retention of analyzed code. +- Offers free use for public repositories, and flexible pricing for private codebases. -![CodeRabbit Code Review Flow showing how AI integrates with GitHub and GitLab for continuous pull request feedback.](/img/about/coderabbit-flow.png "CodeRabbit Code Review Flow") +## Seamless workflow integration -## Data Privacy and Security +CodeRabbit shares its reviews as comments attached to pull requests, using the same Git platform that your team already uses. Further commits in the same pull review prompt CodeRabbit to make further reviews, using the earlier reviews as context. -> **CodeRabbit** does not use data collected from code reviews to train or influence its models. All queries to Large Language Models (LLMs) are ephemeral, with zero retention. No data is shared with third parties. +Each time that it performs a code review, CodeRabbit runs the relevant code changes through [an array of industry-standard code linters, security analyzers, and other tools](/tools/). CodeRabbit synthesizes the output of these tools into its reviews, offering a high-level analysis that can suggest areas for further focus and improvement. -- **Temporary Storage**: Code is temporarily stored in memory during the review process and deleted afterward. -- **Stored Embeddings**: While the code itself isn’t stored, **CodeRabbit** stores embeddings based on chat conversations and workflow systems (Linear, Jira, GitHub/GitLab issues) to improve future reviews. -- **Compliance**: All data is kept confidential, isolated by organization, and complies with **SOC2 Type II** and **GDPR** standards. +Your team can have conversations with CodeRabbit about its reviews by replying to it with follow-up comments on pull requests, asking it questions or making observations about the review using natural language. CodeRabbit continues the conversation appropriately, offering further insights about the code changes, or adjusting its own review style based on feedback. -### Opting Out +### Customizable review preferences -You can opt out of data storage at any time without affecting your access to **CodeRabbit**. -:::warning -However, opting out may reduce the level of personalized review feedback. -::: +As you interact with CodeRabbit through chat, it learns the review preferences of your team, and applies them to all future reviews on a given repository. -## Try CodeRabbit Now +For example, if CodeRabbit uses a linter to suggest that your pull request use four-space indentations, but your team uses a two-space indentation style, then you can reply to CodeRabbit's pull-request comment to tell it exactly that. CodeRabbit acknowledges your feedback and adjusts all of its subsequent reviews with that repository appropriately. -> Ready to experience **CodeRabbit** in action? +For a video introduction to this feature, see [CodeRabbit Learnings](https://www.youtube.com/watch?v=Yu0cmmOYA-U). -:::tip -For open source projects CodeRabbit Pro is **_FREE_**, forever. +If you need to fine-tune CodeRabbit's behavior beyond this, then you can [add a CodeRabbit-specific configuration file](/getting-started/configure-coderabbit) to your repository, or use the CodeRabbit web UI to set further preferences. This file can include [path-based instructions](/guides/review-instructions) for how CodeRabbit should review different files within your codebase. -- No credit card required -- Unlimited public repositories +No matter how you tune and customize CodeRabbit, its default settings make it useful out of the box, able to meaningfully review pull requests within minutes of its introduction to a repository. -::: +### Platform integration options - +CodeRabbit integrates in just a few clicks with many popular Git platforms: + +- GitHub, including GitHub Enterprise Server +- GitLab, including self-managed GitLab +- Azure DevOps +- Bitbucket Cloud + +In addition, CodeRabbit can integrate with a number of popular workflow systems: + +- Jira +- Linear +- CircleCI + +## Data privacy and security + +CodeRabbit does not use data collected from code reviews to train or influence its models. All queries to large language models (LLMs) are ephemeral, with zero retention. No data is shared with third parties. + +- **Temporary Storage**: CodeRabbit temporarily stores your code in memory during the review process, and deletes it afterward. +- **Stored Embeddings**: While CodeRabbit doesn't store your code, it does store embeddings based on chat conversations and workflow systems (Linear, Jira, GitHub/GitLab issues) to improve future reviews. +- **Compliance**: All data is kept confidential, isolated by organization, and complies with SOC2 Type II and GDPR standards. + +You can opt out of data storage at any time without affecting your access to CodeRabbit. Opting out might reduce the level of personalized review feedback that CodeRabbit can provide you. + +## Flexible pricing, free for public use + +Public repositories can use the Pro tier of CodeRabbit at no charge, including all of the code-review features described on this page. Rate limits might apply. + +For private repositories, a number of pricing tiers are available. These range from a Free tier that offers unlimited code-change summaries, to an Enterprise tier with access to advanced features and SLA support. For more information, see [Pricing](https://www.coderabbit.ai/pricing). + +## What's next + +- [Quickstart](/getting-started/quickstart/) lets you experience your first CodeRabbit code review first-hand. + +- [Why CodeRabbit?](/overview/why-coderabbit) dives further into the philosophies and technologies that drive CodeRabbit. From bd7aeff563b500139c300a7415371f27bb559c6b Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 29 Apr 2025 14:11:01 -0400 Subject: [PATCH 13/48] Clarify that CodeRabbit is free for public repositories, specifically. (#300) --- docs/overview/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index 9c4fee30..56161eba 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -79,7 +79,7 @@ CodeRabbit does not use data collected from code reviews to train or influence i You can opt out of data storage at any time without affecting your access to CodeRabbit. Opting out might reduce the level of personalized review feedback that CodeRabbit can provide you. -## Flexible pricing, free for public use +## Flexible pricing, free for public repositories Public repositories can use the Pro tier of CodeRabbit at no charge, including all of the code-review features described on this page. Rate limits might apply. From fe08df394745074dcef3303c00e71d1f08cb75f8 Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Wed, 30 Apr 2025 11:11:19 -0400 Subject: [PATCH 14/48] fix oxlint (#288) --- docs/changelog.md | 6 +++++- docs/tools/oxc.md | 46 -------------------------------------------- docs/tools/oxlint.md | 46 ++++++++++++++++++++++++++++++++++++++++++++ docs/tools/tools.md | 10 +++++----- 4 files changed, 56 insertions(+), 52 deletions(-) delete mode 100644 docs/tools/oxc.md create mode 100644 docs/tools/oxlint.md diff --git a/docs/changelog.md b/docs/changelog.md index bf13d57c..656a0b5f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -66,7 +66,7 @@ We're thrilled to introduce agentic planning on GitHub for CodeRabbit chat as Ge We've expanded our static analysis capabilities with two new tools: -- **OXC**: A high-performance JavaScript/TypeScript linter written in Rust. +- **oxlint**: A high-performance JavaScript/TypeScript linter written in Rust. - **Prisma Lint**: A dedicated linter for Prisma schema files to help enforce consistent conventions and best practices. Both tools can be configured through their respective config files or through CodeRabbit's settings page. See our [tools documentation](https://docs.coderabbit.ai/tools/) for more details. @@ -124,6 +124,10 @@ We're thrilled to introduce agentic planning on GitHub for CodeRabbit chat as an We are continually expanding our support for static analysis tools. We've recently added support for: - SQLFluff +- Added oxlint for faster linting + - oxlint is a blazingly fast JavaScript/TypeScript linter written in Rust + - Replaces ESLint for basic linting while maintaining ESLint for more complex rules + - Up to 50-100x faster than traditional ESLint ## February 25, 2025 diff --git a/docs/tools/oxc.md b/docs/tools/oxc.md deleted file mode 100644 index ac01dfe0..00000000 --- a/docs/tools/oxc.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: OXC -sidebar_label: OXC -description: CodeRabbit's guide to OXC (Oxidation Compiler). ---- - -```mdx-code-block -import ProPlanNotice from '@site/src/components/ProPlanNotice.mdx'; - - -``` - -[OXC](https://github.com/oxc-project/oxc) is a collection of high-performance JavaScript/TypeScript tools written in Rust, including a linter that is 50-100x faster than ESLint. - -## Files - -OXC will run on files with the following extensions: - -- `.js` -- `.jsx` -- `.ts` -- `.tsx` - -## Configuration - -OXC supports the following config files: - -- `oxlint.json` -- `.oxlintrc` -- `.oxlintrc.json` -- `oxlint.config.json` - -:::note - -OXC does not require configuration to run. If no OXC config file is found and Biome is enabled, CodeRabbit will use Biome instead as OXC functionality is included within Biome. If Biome is not enabled or an OXC config file is found, CodeRabbit will use the default OXC config. - -::: - -## Rule Configuration - -While OXC embraces convention over configuration, you can customize rules in your config file if needed. The config file should be in JSON format. See the [OXC documentation](https://oxc-project.github.io) for more details on available rules and configuration options. - -## Links - -- [OXC GitHub Repository](https://github.com/oxc-project/oxc) -- [OXC Website](https://oxc.rust-server.org) diff --git a/docs/tools/oxlint.md b/docs/tools/oxlint.md new file mode 100644 index 00000000..8a93cbd2 --- /dev/null +++ b/docs/tools/oxlint.md @@ -0,0 +1,46 @@ +--- +title: oxlint +sidebar_label: oxlint +description: CodeRabbit's guide to oxlint. +--- + +```mdx-code-block +import ProPlanNotice from '@site/src/components/ProPlanNotice.mdx'; + + +``` + +[oxlint](https://github.com/oxc-project/oxc) is a blazingly fast JavaScript/TypeScript linter written in Rust that is 50-100x faster than ESLint. + +## Files + +oxlint will run on files with the following extensions: + +- `.js` +- `.jsx` +- `.ts` +- `.tsx` + +## Configuration + +oxlint supports the following config files: + +- `oxlint.json` +- `.oxlintrc` +- `.oxlintrc.json` +- `oxlint.config.json` + +:::note + +oxlint does not require configuration to run. If no oxlint config file is found and Biome is enabled, CodeRabbit will use Biome instead as oxlint functionality is included within Biome. If Biome is not enabled or an oxlint config file is found, CodeRabbit will use the default oxlint config. + +::: + +## Rule Configuration + +While oxlint embraces convention over configuration, you can customize rules in your config file if needed. The config file should be in JSON format. See the [oxlint documentation](https://oxc-project.github.io) for more details on available rules and configuration options. + +## Links + +- [oxlint GitHub Repository](https://github.com/oxc-project/oxc) +- [oxlint Website](https://oxc.rust-server.org) diff --git a/docs/tools/tools.md b/docs/tools/tools.md index 98bdc403..cb0a01a8 100644 --- a/docs/tools/tools.md +++ b/docs/tools/tools.md @@ -57,9 +57,9 @@ Remove extraneous f prefix | GitLab Pipelines | [Pipeline Remediation][Pipeline] | CI/CD Failure Remediation | | Go | [golangci-lint][golangci-lint] | Code Quality | | Helm | [Checkov][Checkov] | Code Security | -| Javascript | [Biome][Biome], [OXC][OXC] | Code Quality | +| Javascript | [Biome][Biome], [oxlint][oxlint] | Code Quality | | JSON, JSONC | [Biome][Biome] | Code Quality | -| JSX | [Biome][Biome], [OXC][OXC] | Code Quality | +| JSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | | Kotlin | [detekt][detekt] | Code Quality | | Kubernetes | [Checkov][Checkov] | Code Security | | Markdown | [markdownlint][markdownlint], [LanguageTool][LanguageTool] | Code Quality, Grammar Checking | @@ -76,8 +76,8 @@ Remove extraneous f prefix | SQL | [SQLFluff][SQLFluff] | Code Quality | | Swift | [SwiftLint][SwiftLint] | Code Quality | | Terraform | [Checkov][Checkov] | Code Security | -| TSX | [Biome][Biome], [OXC][OXC] | Code Quality | -| Typescript | [Biome][Biome], [OXC][OXC] | Code Quality | +| TSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | +| Typescript | [Biome][Biome], [oxlint][oxlint] | Code Quality | | YAML | [YAMLlint][YAMLlint] | Code Quality | | Prisma | [Prisma Lint][PrismaLint] | Code Quality | @@ -105,5 +105,5 @@ Remove extraneous f prefix [Semgrep]: ./semgrep.md [Pipeline]: ./pipeline-remediation.md [PrismaLint]: ./prisma-lint.md -[OXC]: ./oxc.md +[oxlint]: ./oxlint.md [ShopifyCLI]: ./shopify-cli.md From e3c987d6aa1c45a168011cb4d65b4959f6824534 Mon Sep 17 00:00:00 2001 From: Harjot Gill Date: Sun, 4 May 2025 11:04:16 -0700 Subject: [PATCH 15/48] update rate limits --- docs/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.md b/docs/faq.md index 794ecfc3..1cb42735 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -128,7 +128,7 @@ The following limits enforced _per developer_: | ---------------- | ------------------------------------------ | ----------------------------- | ----------------------------- | ----------------------------- | | Files per hour | 200/hour | 200/hour | 200/hour | 400/hour | | Files per PR | 100 | 100 | 100 | 200 | -| Reviews per hour | 4 back-to-back, then 3/hour (Summary only) | 4 back-to-back, then 3/hour | 3 back-to-back, then 2/hour | 5 back-to-back, then 4/hour | +| Reviews per hour | 3 back-to-back, then 3/hour (Summary only) | 4 back-to-back, then 4/hour | 3 back-to-back, then 3/hour | 5 back-to-back, then 5/hour | | Chat | N/A | 25 back-to-back, then 50/hour | 10 back-to-back, then 25/hour | 25 back-to-back, then 50/hour | ## Integration Guide {#integration-guide} From 4ec4d46670c7dbb95af9eb2368c7f8bdb4485dd4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 23:11:59 +0000 Subject: [PATCH 16/48] Update schema.v2.json --- static/schema/schema.v2.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 755a12e0..1442d1f0 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -849,11 +849,6 @@ "default": true, "description": "Enable the bot to reply automatically without requiring the user to tag it." }, - "create_issues": { - "type": "boolean", - "default": true, - "description": "Enable Issue creation by CodeRabbit from PR comments." - }, "integrations": { "type": "object", "properties": { From db5b5224410e70f772ccfefc3fe758afab322e2c Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 6 May 2025 10:51:14 -0400 Subject: [PATCH 17/48] Clarify Data privacy & security (#318) * Rewrite the "Data privacy and security" section to center around one bullet list, and end with a link to the Trust Center page for more information. * Typo --------- Co-authored-by: Aravind Putrevu --- docs/overview/introduction.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index 56161eba..adba404e 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -71,13 +71,16 @@ In addition, CodeRabbit can integrate with a number of popular workflow systems: ## Data privacy and security -CodeRabbit does not use data collected from code reviews to train or influence its models. All queries to large language models (LLMs) are ephemeral, with zero retention. No data is shared with third parties. +CodeRabbit collects only the minimum amount of information needed to provide you with our code review services. Our privacy and security posture centers around protecting your data through ephemerality: -- **Temporary Storage**: CodeRabbit temporarily stores your code in memory during the review process, and deletes it afterward. -- **Stored Embeddings**: While CodeRabbit doesn't store your code, it does store embeddings based on chat conversations and workflow systems (Linear, Jira, GitHub/GitLab issues) to improve future reviews. -- **Compliance**: All data is kept confidential, isolated by organization, and complies with SOC2 Type II and GDPR standards. +- All queries to large language models (LLMs) exist in-memory only, with zero retention after each query completes. +- We don't store a copy of your code. +- We don't use your code, code reviews, or other collected data to train LLMs. +- CodeRabbit doesn't share any collected customer data with third parties. +- We keep all customer data confidential, and isolated by organization. +- Our data collection and storage practices comply with SOC 2 and GDPR standards. -You can opt out of data storage at any time without affecting your access to CodeRabbit. Opting out might reduce the level of personalized review feedback that CodeRabbit can provide you. +For more information about how we protect your data, see [the CodeRabbit Trust Center](https://trust.coderabbit.ai). ## Flexible pricing, free for public repositories From 717bfc2b441cbb27a78140ed39e9b309794e1e18 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 6 May 2025 10:54:35 -0400 Subject: [PATCH 18/48] Clarify the "workflow integrations" section (#319) * Clarify that the "workflow integrations" are specifically about ticket management (except for CircleCI), and expand the discussion of ticket-management features. Add appropriate links. * Split the platform integration section into Git platforms and Issue plaforms. (On the bot's advice.) --------- Co-authored-by: Aravind Putrevu --- docs/overview/introduction.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index adba404e..e215f574 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -54,7 +54,7 @@ If you need to fine-tune CodeRabbit's behavior beyond this, then you can [add a No matter how you tune and customize CodeRabbit, its default settings make it useful out of the box, able to meaningfully review pull requests within minutes of its introduction to a repository. -### Platform integration options +### Git platform integration CodeRabbit integrates in just a few clicks with many popular Git platforms: @@ -63,11 +63,18 @@ CodeRabbit integrates in just a few clicks with many popular Git platforms: - Azure DevOps - Bitbucket Cloud -In addition, CodeRabbit can integrate with a number of popular workflow systems: +For more information, see [Supported Git Platforms](/platforms/). +### Issue-management integration + +You can integrate CodeRabbit with issue-management platforms. This lets you ask CodeRabbit to create tickets during code reviews, or chat with CodeRabbit about your code from within issue comments. Compatible platforms include the following: + +- GitHub Issues +- GitLab Issues - Jira - Linear -- CircleCI + +For more information, see [Issue Creation](/guides/issue-creation) and [Issue Chat](/guides/issue-chat). ## Data privacy and security From eb25e102ff603d42cd610a9cc0275e958ec79e3f Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 6 May 2025 10:58:18 -0400 Subject: [PATCH 19/48] Add a note explaining why CodeRabbit requests read-write access. (#320) * Add a note explaining why CodeRabbit requests read-write access to your repository, and linking to the Trust Center. * Make it a bit shorter. --------- Co-authored-by: Aravind Putrevu --- docs/getting-started/quickstart.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 26d50f53..096f94c6 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -44,6 +44,9 @@ To add CodeRabbit to your test repository, follow these steps: 1. Select the **Only select repositories** radio button. 1. From the **Select repositories** menu, select the `coderabbit-test` repository that you created earlier in this Quickstart. 1. Click **Install & Authorize**. + :::note + CodeRabbit requests read and write access to your repository in order for its code review, issue management, and pull request generation features to work. CodeRabbit never stores your code. For more information, see [the CodeRabbit Trust Center](https://trust.coderabbit.ai). + ::: 1. If a CodeRabbit **Complete your signup** dialog appears, then fill it out with the requested information before continuing. CodeRabbit is now ready to use with your test repository. The next steps demonstrate its core code-review features. From 8831f9b57616a57a2088378ed54121685f410ddc Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 6 May 2025 11:13:02 -0400 Subject: [PATCH 20/48] Initial ToC overhaul (#301) * Replace the autogenerated table of contents with a manually arranged ToC defined in sidebars.ts. Remove material related to ToC autogeneration from various pages' front matter. Reorder, reorganize, and retitle pages according to the new information architecture plan. Standardize page titles to use sentence case. * Fix a bad search-and-replace * Prettier-ized. --------- Co-authored-by: Aravind Putrevu --- docs/finishing-touches/docstrings.md | 3 +- docs/getting-started/adding-organizations.md | 4 +- docs/getting-started/configure-coderabbit.md | 4 +- docs/getting-started/quickstart.md | 2 +- .../subscription-management.md | 4 +- docs/getting-started/support.md | 4 +- docs/getting-started/upgrading-permissions.md | 4 +- docs/guides/agent_chat.md | 4 +- docs/guides/commands.md | 4 +- docs/guides/custom-reports.md | 4 +- docs/guides/issue-chat.md | 4 +- docs/guides/issue-creation.md | 4 +- docs/guides/linked-issues.md | 4 +- docs/guides/ondemand-reports.md | 4 +- docs/guides/scheduled-reports.md | 4 +- docs/integrations/code-graph-analysis.md | 4 +- docs/integrations/issue-integrations.md | 4 +- docs/integrations/knowledge-base.md | 4 +- docs/platforms/platforms.md | 4 +- docs/tools/tools.md | 4 +- sidebars.ts | 149 +++++++++++++++++- 21 files changed, 164 insertions(+), 62 deletions(-) diff --git a/docs/finishing-touches/docstrings.md b/docs/finishing-touches/docstrings.md index f57ecd65..5d78366e 100644 --- a/docs/finishing-touches/docstrings.md +++ b/docs/finishing-touches/docstrings.md @@ -1,6 +1,5 @@ --- -title: Docstrings generation with CodeRabbit -sidebar_label: Docstrings +title: Generate docstrings description: Automated docstrings pull requests with CodeRabbit --- diff --git a/docs/getting-started/adding-organizations.md b/docs/getting-started/adding-organizations.md index 81fa8cf6..5f4b635b 100644 --- a/docs/getting-started/adding-organizations.md +++ b/docs/getting-started/adding-organizations.md @@ -1,8 +1,6 @@ --- -title: Adding Organizations +title: Add organizations description: Learn how to add new organizations to CodeRabbit -sidebar_label: Adding Organizations -sidebar_position: 5 --- To add new organizations to CodeRabbit, follow these steps: diff --git a/docs/getting-started/configure-coderabbit.md b/docs/getting-started/configure-coderabbit.md index 09bcb8b3..e8ee2e06 100644 --- a/docs/getting-started/configure-coderabbit.md +++ b/docs/getting-started/configure-coderabbit.md @@ -1,11 +1,9 @@ --- -title: Configure CodeRabbit -sidebar_label: Configure +title: Add a configuration file description: CodeRabbit offers various configuration options to tailor the reviews to your specific requirements. Configuration can be made using one of the below options. -sidebar_position: 2 --- ```mdx-code-block diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 096f94c6..17cc091c 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -19,7 +19,7 @@ When you complete this tutorial, you'll have seen CodeRabbit's code-review featu For a more general overview of CodeRabbit, see [Introduction](/). :::note -While this tutorial focuses on GitHub, CodeRabbit also works with GitLab, Azure DevOps, and Bitbucket. For more information, see [Supported Git Platforms](/platforms/). +While this tutorial focuses on GitHub, CodeRabbit also works with GitLab, Azure DevOps, and Bitbucket. For more information, see [Integrate with Git platforms](/platforms/). ::: ## Before you begin diff --git a/docs/getting-started/subscription-management.md b/docs/getting-started/subscription-management.md index 31fb9ffe..4483ce78 100644 --- a/docs/getting-started/subscription-management.md +++ b/docs/getting-started/subscription-management.md @@ -1,8 +1,6 @@ --- -title: Subscription Management +title: Manage your subscription description: Learn how to manage your CodeRabbit subscription, including billing, plan changes, and seat management -sidebar_label: Subscription Management -sidebar_position: 7 --- This guide covers how to manage your subscription, including accessing billing information, changing plans, and adjusting your seat count. diff --git a/docs/getting-started/support.md b/docs/getting-started/support.md index 2014965c..9b1ef18b 100644 --- a/docs/getting-started/support.md +++ b/docs/getting-started/support.md @@ -1,8 +1,6 @@ --- -title: Support -sidebar_label: Support +title: Get support description: Get help with CodeRabbit and find answers to common questions. -sidebar_position: 3 --- Welcome to CodeRabbit Support. Please refer to the following sections for diff --git a/docs/getting-started/upgrading-permissions.md b/docs/getting-started/upgrading-permissions.md index 7980bd09..c5553abe 100644 --- a/docs/getting-started/upgrading-permissions.md +++ b/docs/getting-started/upgrading-permissions.md @@ -1,8 +1,6 @@ --- -title: Upgrading App Permissions +title: Set permissions description: Learn how to upgrade CodeRabbit's GitHub App permissions when new features are added -sidebar_label: Upgrading Permissions -sidebar_position: 6 --- Sometimes when we add new features to CodeRabbit, we need to request additional GitHub permissions. If you see a warning about permissions or resources not being accessible, you'll need to approve the new permissions. Here's how to do it: diff --git a/docs/guides/agent_chat.md b/docs/guides/agent_chat.md index f76c4931..4073951a 100644 --- a/docs/guides/agent_chat.md +++ b/docs/guides/agent_chat.md @@ -1,8 +1,6 @@ --- -title: Chat and Agentic Chat -sidebar_label: Chat and Agentic Chat +title: Discuss code reviews with CodeRabbit description: Learn about CodeRabbit Pro's chat and agentic chat system -sidebar_position: 3 --- # CodeRabbit Chat diff --git a/docs/guides/commands.md b/docs/guides/commands.md index a2a2f70b..f7cbe002 100644 --- a/docs/guides/commands.md +++ b/docs/guides/commands.md @@ -1,8 +1,6 @@ --- -title: Commands -sidebar_label: Commands +title: Control and manage code reviews description: Learn how to control CodeRabbit using commands in pull request comments -sidebar_position: 1 --- # CodeRabbit Commands diff --git a/docs/guides/custom-reports.md b/docs/guides/custom-reports.md index 30655bfb..c006207a 100644 --- a/docs/guides/custom-reports.md +++ b/docs/guides/custom-reports.md @@ -1,8 +1,6 @@ --- -title: Custom Reports -sidebar_label: Custom Reports +title: Customize reports description: Learn how to create custom reports with CodeRabbit Pro's flexible reporting system -sidebar_position: 8 --- ```mdx-code-block diff --git a/docs/guides/issue-chat.md b/docs/guides/issue-chat.md index 22de8959..ee4f83a7 100644 --- a/docs/guides/issue-chat.md +++ b/docs/guides/issue-chat.md @@ -1,8 +1,6 @@ --- -title: Issue Chat -sidebar_label: Issue Chat +title: Discuss issues and plan solutions description: Learn how to use CodeRabbit's chat capabilities within issues -sidebar_position: 4 --- ```mdx-code-block diff --git a/docs/guides/issue-creation.md b/docs/guides/issue-creation.md index 7c461477..f6228b57 100644 --- a/docs/guides/issue-creation.md +++ b/docs/guides/issue-creation.md @@ -1,8 +1,6 @@ --- -title: Issue Creation -sidebar_label: Issue Creation +title: Create issues description: Learn how to create issues directly through CodeRabbit -sidebar_position: 5 --- ```mdx-code-block diff --git a/docs/guides/linked-issues.md b/docs/guides/linked-issues.md index 3528f0a9..b8768c3d 100644 --- a/docs/guides/linked-issues.md +++ b/docs/guides/linked-issues.md @@ -1,8 +1,6 @@ --- -title: Linked Issues -sidebar_label: Linked Issues +title: Work with linked Issues description: Learn how to effectively use linked issues with CodeRabbit for better pull request assessments -sidebar_position: 6 --- # Linked Issues diff --git a/docs/guides/ondemand-reports.md b/docs/guides/ondemand-reports.md index 471dc04c..41dbe9bb 100644 --- a/docs/guides/ondemand-reports.md +++ b/docs/guides/ondemand-reports.md @@ -1,8 +1,6 @@ --- -title: On-demand Reports -sidebar_label: On-demand Reports +title: Generate reports description: CodeRabbit offers a way to generate on-demand reports using a simple API request -sidebar_position: 9 --- ```mdx-code-block diff --git a/docs/guides/scheduled-reports.md b/docs/guides/scheduled-reports.md index 8c56b465..44a11f56 100644 --- a/docs/guides/scheduled-reports.md +++ b/docs/guides/scheduled-reports.md @@ -1,8 +1,6 @@ --- -title: Scheduled Reports -sidebar_label: Scheduled Reports +title: Schedule reports description: Learn how to set up automated recurring reports with CodeRabbit Pro -sidebar_position: 7 --- ```mdx-code-block diff --git a/docs/integrations/code-graph-analysis.md b/docs/integrations/code-graph-analysis.md index dd0bd582..5958640a 100644 --- a/docs/integrations/code-graph-analysis.md +++ b/docs/integrations/code-graph-analysis.md @@ -1,8 +1,6 @@ --- -title: Code Graph Analysis +title: Analyze your code changes description: Learn about CodeRabbit's intelligent graph-based code analysis. -sidebar_label: Code Graph Analysis -sidebar_position: 6 --- # CodeRabbit Code Graph Analysis diff --git a/docs/integrations/issue-integrations.md b/docs/integrations/issue-integrations.md index a153839b..0ad69f54 100644 --- a/docs/integrations/issue-integrations.md +++ b/docs/integrations/issue-integrations.md @@ -1,8 +1,6 @@ --- -title: Issue Integrations +title: Integrate issue tracking description: Learn about CodeRabbit's integrations with issue tracking systems like Jira and Linear. -sidebar_label: Issue Integrations -sidebar_position: 5 --- CodeRabbit integrates with popular issue tracking systems to provide context from linked and related issues while reviewing code. diff --git a/docs/integrations/knowledge-base.md b/docs/integrations/knowledge-base.md index c15f2f9f..61ff141e 100644 --- a/docs/integrations/knowledge-base.md +++ b/docs/integrations/knowledge-base.md @@ -1,8 +1,6 @@ --- -title: Knowledge Base +title: Apply your code review preferences description: Learn about CodeRabbit's internal knowledge base and its integrations with external services. -sidebar_label: Knowledge Base -sidebar_position: 4 --- CodeRabbit utilizes an internal knowledge base that integrates with several external services to provide a seamless review and issue management experience. diff --git a/docs/platforms/platforms.md b/docs/platforms/platforms.md index 8114c500..996089fc 100644 --- a/docs/platforms/platforms.md +++ b/docs/platforms/platforms.md @@ -1,8 +1,6 @@ --- -title: Supported Git Platforms -sidebar_label: Supported Git Platforms +title: Integrate with Git platforms description: Overview of CodeRabbit's supported Git platforms. -sidebar_position: 1 --- CodeRabbit supports various Git platforms to provide code review for your repositories. For the cloud-hosted Git platforms, you can [login][login] to CodeRabbit and add your repositories. The following platforms are supported: diff --git a/docs/tools/tools.md b/docs/tools/tools.md index cb0a01a8..113c2fee 100644 --- a/docs/tools/tools.md +++ b/docs/tools/tools.md @@ -1,8 +1,6 @@ --- -title: Supported Tools -sidebar_label: Supported Tools +title: Configure third-party tool use description: Overview of CodeRabbit's supported linters and security analysis tools. -sidebar_position: 1 --- ```mdx-code-block diff --git a/sidebars.ts b/sidebars.ts index 5f41290e..8e701fc2 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -29,13 +29,152 @@ import type { SidebarsConfig } from "@docusaurus/plugin-content-docs" const sidebars: SidebarsConfig = { docsSidebar: [ { - type: "autogenerated", - dirName: ".", + type: "category", + collapsed: false, + label: "Get started with CodeRabbit", + items: ["overview/introduction", "getting-started/quickstart"], }, { - type: "link", - label: "API Reference", - href: "https://api.coderabbit.ai/api/swagger/", + type: "category", + collapsed: false, + label: "Add CodeRabbit to your repository", + items: [ + "platforms/platforms", + { + type: "category", + collapsed: true, + label: "Supported Git platforms", + items: [ + "platforms/github-com", + "platforms/github-enterprise-server", + "platforms/gitlab-com", + "platforms/self-hosted-gitlab", + "platforms/azure-devops", + "platforms/bitbucket-cloud", + ], + }, + "getting-started/adding-organizations", + "getting-started/upgrading-permissions", + { + type: "category", + collapsed: true, + label: "Self-host CodeRabbit", + items: [ + "self-hosted/github", + "self-hosted/gitlab", + "self-hosted/azure-devops", + "self-hosted/bitbucket", + ], + }, + ], + }, + { + type: "category", + collapsed: false, + label: "Configure CodeRabbit", + items: [ + "getting-started/configure-coderabbit", + "integrations/knowledge-base", + "tools/tools", + ], + }, + { + type: "category", + collapsed: false, + label: "Review pull requests", + items: [ + "guides/commands", + "guides/agent_chat", + { + type: "category", + collapsed: false, + label: "Analyze and improve your code", + items: [ + "integrations/code-graph-analysis", + "finishing-touches/docstrings", + ], + }, + ], + }, + { + type: "category", + collapsed: false, + label: "Create and resolve issues", + items: [ + "integrations/issue-integrations", + "guides/issue-chat", + "guides/issue-creation", + "guides/linked-issues", + ], + }, + { + type: "category", + collapsed: false, + label: "Generate reports", + items: [ + "guides/ondemand-reports", + "guides/custom-reports", + "guides/scheduled-reports", + ], + }, + { + type: "category", + collapsed: false, + label: "Reference", + items: [ + { + type: "link", + label: "CodeRabbit API", + href: "https://api.coderabbit.ai/api/swagger/", + }, + { + type: "category", + label: "Supported tools", + collapsed: true, + items: [ + "tools/actionlint", + "tools/biome", + "tools/buf", + "tools/checkov", + "tools/circleci", + "tools/cppcheck", + "tools/detekt", + "tools/eslint", + "tools/gitleaks", + "tools/golangci-lint", + "tools/hadolint", + "tools/languagetool", + "tools/markdownlint", + "tools/oxlint", + "tools/phpstan", + "tools/pipeline-remediation", + "tools/pmd", + "tools/prisma-lint", + "tools/regal", + "tools/rubocop", + "tools/ruff", + "tools/semgrep", + "tools/shellcheck", + "tools/sqlfluff", + "tools/swiftlint", + "tools/yamllint", + ], + }, + ], + }, + { + type: "category", + collapsed: false, + label: "Resources", + items: [ + "getting-started/support", + "getting-started/subscription-management", + "overview/why-coderabbit", + "faq", + "early-access", + "future-development", + "changelog", + ], }, ], } From 12c7d8aff454262e11f6ee26733882657c7d78e1 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Wed, 7 May 2025 13:32:28 -0400 Subject: [PATCH 21/48] Add the review-instructions guide back to the ToC. (#322) * Add the Review instructions page back to the ToC. It was accidentally dropped in #301. * Style tweaks --- docs/faq.md | 4 ++-- docs/guides/linked-issues.md | 2 +- docs/guides/review-instructions.md | 4 +--- docs/platforms/github-com.md | 2 +- sidebars.ts | 1 + 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index 1cb42735..dce43242 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -92,7 +92,7 @@ Email field and click Update to save your changes. ### Usage and Configuration - **Language Settings**: Configure review language in repository settings -- **Review Rules**: Customize via [Review Instructions](/guides/review-instructions) +- **Review Rules**: Customize via [review instructions](/guides/review-instructions) - **Branch Selection**: Default branch reviews enabled by default (configurable) ### Access & Permissions @@ -108,7 +108,7 @@ Interact with CodeRabbit by: 1. Replying directly to CodeRabbit comments 2. Tagging `@coderabbitai` in PR discussions 3. Adding review comments for specific lines -4. Customize via [Review Instructions](/guides/review-instructions) +4. Customize via [review instructions](/guides/review-instructions) :::tip Collaboration Mode When team members are active in PRs, use `@coderabbitai` to engage the bot. diff --git a/docs/guides/linked-issues.md b/docs/guides/linked-issues.md index b8768c3d..b802cb3b 100644 --- a/docs/guides/linked-issues.md +++ b/docs/guides/linked-issues.md @@ -168,6 +168,6 @@ Only the issue title and description are considered in the assessment. Comments ## Related Resources -- [Review Instructions](./review-instructions.md) +- [Add review instructions](/guides/review-instructions) - [Issue Chat](./issue-chat.md) - [Issue Creation](./issue-creation.md) diff --git a/docs/guides/review-instructions.md b/docs/guides/review-instructions.md index d756e938..c44b862c 100644 --- a/docs/guides/review-instructions.md +++ b/docs/guides/review-instructions.md @@ -1,11 +1,9 @@ --- -title: Review Instructions -sidebar_label: Review Instructions +title: Add review instructions description: CodeRabbit offers various customization options to tailor the reviews to your specific requirements. Customizations can be made using one of the below options. -sidebar_position: 2 --- The guide explains how to add custom review instructions for the entire project. diff --git a/docs/platforms/github-com.md b/docs/platforms/github-com.md index 4866fd00..ecc07272 100644 --- a/docs/platforms/github-com.md +++ b/docs/platforms/github-com.md @@ -109,7 +109,7 @@ CodeRabbit generates detailed statistics and test plans for each pull request. ![Test Plan by CodeRabbit](/img/integrations/test-plan.png) -> CodeRabbit also allows you to configure **custom review instructions** based on your organization's needs, in case you want it to follow specific guidelines beyond the standard review, to learn more on [adding custom review instructions](https://docs.coderabbit.ai/guides/review-instructions/) +> CodeRabbit also allows you to configure **custom review instructions** based on your organization's needs, in case you want it to follow specific guidelines beyond the standard review, to learn more on [adding custom review instructions](/guides/review-instructions) Whether you manage a popular repository or are working on a smaller project, whether it's hosted on **GitLab, GitHub, or self-hosted GitHub or GitLab**, CodeRabbit can help streamline your development process. This AI Code Review assistant is designed to save you time by automating code reviews and offering insightful feedback. diff --git a/sidebars.ts b/sidebars.ts index 8e701fc2..c6502d8b 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -75,6 +75,7 @@ const sidebars: SidebarsConfig = { items: [ "getting-started/configure-coderabbit", "integrations/knowledge-base", + "guides/review-instructions", "tools/tools", ], }, From 1fb70956cef615235f9b17916de88e218cdb253d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 23:28:25 +0000 Subject: [PATCH 22/48] Update schema.v2.json --- static/schema/schema.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 1442d1f0..73e19c22 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -892,7 +892,7 @@ "opt_out": { "type": "boolean", "default": false, - "description": "Opt out | Opt out of all knowledge base features that require data retention." + "description": "Disable Knowledge Base | Opt out of all knowledge base features that require data retention. If you opt out after opting in, all of your existing knowledge base data will be removed from the system." }, "web_search": { "type": "object", From ddb5840f30cf61863c090419d6c833449ae1a4f3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 15:45:16 +0000 Subject: [PATCH 23/48] Update schema.v2.json --- static/schema/schema.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 73e19c22..bc5d71ea 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -892,7 +892,7 @@ "opt_out": { "type": "boolean", "default": false, - "description": "Disable Knowledge Base | Opt out of all knowledge base features that require data retention. If you opt out after opting in, all of your existing knowledge base data will be removed from the system." + "description": "Opt Out | Disable all knowledge base features that require data retention. If you opt out after opting in, all of your existing knowledge base data will be removed from the system." }, "web_search": { "type": "object", From 3bd6ed922180d5aaa467f2b2b38c398b5eacfea9 Mon Sep 17 00:00:00 2001 From: Nick Busey Date: Thu, 8 May 2025 10:38:10 -0600 Subject: [PATCH 24/48] Updated docs for new caching and code indexing features (#323) --- docs/faq.md | 6 +++--- docs/overview/introduction.md | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index dce43242..f4158154 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -31,10 +31,10 @@ CodeRabbit works with all programming languages, with varying proficiency based - - No persistent code storage - - Temporary cloning during review only - Complete data isolation - - Immediate disposal post-review + - Caching of encrypted code and dependency archives for faster reviews + - Code indexing in which we store vector representations of code for efficient code base context + - Both caching and code indexing can be disabled which means we store nothing post-review - Uses only public datasets diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index e215f574..ed73a156 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -81,7 +81,6 @@ For more information, see [Issue Creation](/guides/issue-creation) and [Issue Ch CodeRabbit collects only the minimum amount of information needed to provide you with our code review services. Our privacy and security posture centers around protecting your data through ephemerality: - All queries to large language models (LLMs) exist in-memory only, with zero retention after each query completes. -- We don't store a copy of your code. - We don't use your code, code reviews, or other collected data to train LLMs. - CodeRabbit doesn't share any collected customer data with third parties. - We keep all customer data confidential, and isolated by organization. From 50a9d8f08519b71ce34a697d14cf6cd55d075a77 Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Fri, 9 May 2025 10:05:29 -0700 Subject: [PATCH 25/48] Fix/oxlint2 (#324) * fix capitalization * update oxlint docs * fix links * link and note fixes --- docs/changelog.md | 6 +++--- docs/tools/oxlint.md | 36 ++++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 656a0b5f..24e903ff 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -66,7 +66,7 @@ We're thrilled to introduce agentic planning on GitHub for CodeRabbit chat as Ge We've expanded our static analysis capabilities with two new tools: -- **oxlint**: A high-performance JavaScript/TypeScript linter written in Rust. +- **Oxlint**: A high-performance JavaScript/TypeScript linter written in Rust. - **Prisma Lint**: A dedicated linter for Prisma schema files to help enforce consistent conventions and best practices. Both tools can be configured through their respective config files or through CodeRabbit's settings page. See our [tools documentation](https://docs.coderabbit.ai/tools/) for more details. @@ -124,8 +124,8 @@ We're thrilled to introduce agentic planning on GitHub for CodeRabbit chat as an We are continually expanding our support for static analysis tools. We've recently added support for: - SQLFluff -- Added oxlint for faster linting - - oxlint is a blazingly fast JavaScript/TypeScript linter written in Rust +- Added Oxlint for faster linting + - Oxlint is a blazingly fast JavaScript/TypeScript linter written in Rust - Replaces ESLint for basic linting while maintaining ESLint for more complex rules - Up to 50-100x faster than traditional ESLint diff --git a/docs/tools/oxlint.md b/docs/tools/oxlint.md index 8a93cbd2..fd5e7e2c 100644 --- a/docs/tools/oxlint.md +++ b/docs/tools/oxlint.md @@ -1,7 +1,7 @@ --- -title: oxlint -sidebar_label: oxlint -description: CodeRabbit's guide to oxlint. +title: Oxlint +sidebar_label: Oxlint +description: CodeRabbit's guide to Oxlint. --- ```mdx-code-block @@ -10,37 +10,41 @@ import ProPlanNotice from '@site/src/components/ProPlanNotice.mdx'; ``` -[oxlint](https://github.com/oxc-project/oxc) is a blazingly fast JavaScript/TypeScript linter written in Rust that is 50-100x faster than ESLint. +[Oxlint](https://oxc.rs/docs/guide/usage/linter) is a blazingly fast JavaScript/TypeScript linter written in Rust that is 50-100x faster than ESLint. -## Files +## Supported Files -oxlint will run on files with the following extensions: +Oxlint will run on files with the following extensions: - `.js` +- `.mjs` +- `.cjs` - `.jsx` - `.ts` +- `.mts` +- `.cts` - `.tsx` +- `.vue` +- `.astro` +- `.svelte` ## Configuration -oxlint supports the following config files: +Oxlint supports the following configuration file: -- `oxlint.json` -- `.oxlintrc` - `.oxlintrc.json` -- `oxlint.config.json` :::note -oxlint does not require configuration to run. If no oxlint config file is found and Biome is enabled, CodeRabbit will use Biome instead as oxlint functionality is included within Biome. If Biome is not enabled or an oxlint config file is found, CodeRabbit will use the default oxlint config. +If no Oxlint config file is found and Biome is enabled, CodeRabbit will use Biome instead as Oxlint functionality is included within Biome. -::: +If Biome is not enabled or an Oxlint config file is found, CodeRabbit will use the `.oxlintrc.json` Oxlint config to run. -## Rule Configuration +Oxlint does not require configuration to run if Biome is disabled and Oxlint is enabled. -While oxlint embraces convention over configuration, you can customize rules in your config file if needed. The config file should be in JSON format. See the [oxlint documentation](https://oxc-project.github.io) for more details on available rules and configuration options. +::: ## Links -- [oxlint GitHub Repository](https://github.com/oxc-project/oxc) -- [oxlint Website](https://oxc.rust-server.org) +- [Oxlint GitHub Repository](https://github.com/oxc-project/oxc/releases/) +- [Oxlint Website](https://oxc.rs/docs/guide/usage/linter) From 6fdc21be1bf612da4255ab023701f26ed6d7cb41 Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Fri, 9 May 2025 12:29:55 -0700 Subject: [PATCH 26/48] fix missing pipeline terms for azure devops (#326) * fix missing pipeline terms for azure devops * fix duplicates --- docs/tools/pipeline-remediation.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/tools/pipeline-remediation.md b/docs/tools/pipeline-remediation.md index d03ad33d..2beb0213 100644 --- a/docs/tools/pipeline-remediation.md +++ b/docs/tools/pipeline-remediation.md @@ -94,7 +94,7 @@ With CodeRabbit CI/CD Pipeline Remediation, you have coderabbit automatically re ### GitLab CI/CD -- Pipeline failure analysis +- GitLab CI/CD Pipeline failure analysis - Integration with GitLab Advanced Security - Support for DAST (Dynamic Application Security Testing) findings - Remediation for SAST (Static Application Security Testing) issues @@ -105,16 +105,16 @@ With CodeRabbit CI/CD Pipeline Remediation, you have coderabbit automatically re ### CircleCI -- Workflow failure detection +- CircleCI Pipeline failure analysis - Job-level error analysis - Configuration validation - Dependency resolution CircleCI Integration -### Azure DevOps +### Azure DevOps Pipelines -- Pipeline failure detection +- Azure DevOps CI/CD Pipeline failure analysis - Integration with Azure DevOps Checks - Support for custom tasks and pipelines - Remediation for build issues @@ -174,4 +174,4 @@ Our tool handles a wide range of pipeline failures including: - [GitHub Actions Configuration](https://docs.github.com/en/actions) - [GitLab CI/CD Documentation](https://docs.gitlab.com/ee/ci/) - [CircleCI Documentation](https://circleci.com/docs/) -- [Azure DevOps Documentation](https://learn.microsoft.com/en-us/azure/devops/pipelines/get-started/pipelines-get-started?view=azure-devops) +- [Azure DevOps Pipeline Documentation](https://learn.microsoft.com/en-us/azure/devops/pipelines/get-started/pipelines-get-started?view=azure-devops) From 41703ce7be1f2688c03664e24c6a110448c33c86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 21:08:27 +0000 Subject: [PATCH 27/48] Update schema.v2.json --- static/schema/schema.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index bc5d71ea..198014dd 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -440,7 +440,7 @@ }, "timeout_ms": { "type": "number", - "maximum": 300000, + "maximum": 900000, "minimum": 0, "default": 90000, "description": "Time in milliseconds to wait for all GitHub Checks to conclude." From 6a8ef6780a20058fa318f292c47351e20f93c8fd Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Tue, 13 May 2025 15:06:29 -0400 Subject: [PATCH 28/48] update docs with PR Stage and others (#336) --- docs/guides/custom-reports.md | 56 +++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/docs/guides/custom-reports.md b/docs/guides/custom-reports.md index c006207a..7ed5a08e 100644 --- a/docs/guides/custom-reports.md +++ b/docs/guides/custom-reports.md @@ -76,6 +76,11 @@ Contained within the `` tag. - `State`: string ("open"/"closed") - Current state of the PR - `Mergeable`: boolean (true/false) - Whether the PR can be merged - `Is stale`: boolean - Whether PR has been inactive for over 168 hours +- `PR Stage`: string - The current stage of open PRs in Open or Draft state, can be one of: + - "Needs Author Action" - PR requires author attention due to merge conflicts, draft status, or requested changes + - "Waiting for Author to Merge" - PR has approvals and is ready for author to merge + - "Waiting for Code Reviews" - PR is waiting for reviewers to approve + - undefined - PR is not in an open state (is merged or closed) #### Basic Information @@ -124,60 +129,65 @@ Generate a summary of each pull request in the following bullet point format: - If 'Merged: true' set 'PR State: 🔀 Merged' - Else If 'Draft: true' set 'PR State: 📝 Draft' - Else If 'State: open' or 'State: active' set 'PR State: 💬 Open' - - Else If 'State: closed' and 'Merged: false' set 'PR State: 🔒 Closed' + - Else If 'State: closed' or 'State: DECLINED' and 'Merged: false' set 'PR State: 🔒 Closed' - Else set 'PR State: ❓ Unknown' - If the PR is stale, add '⚠️ Stale' at the end of the PR State. -- Mergeable (if PR State if not 'Merged'): Provide the mergeable status of the PR as 'Mergeable' or 'Not Mergeable'. +- Mergeable (if PR State is not 'Merged'): Provide the mergeable status of the PR as 'Mergeable' or 'Not Mergeable' based on the "Mergeable: " value. +- PR Stage (if PR State is not 'Merged'): Provide the stage of the PR based on the "PR Stage: " value. - Summary: In under 50 words provide a short summary of the PR. - Comments: In under 50 words provide a short summary of all comments found within , including each comments author username from . If there are no comments available, output 'No comments'. - **PR Link:** [#3001](https://github.com/mygithuborg/myrepo/pull/3001) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 💬 Open - **Mergeable:** Mergeable -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. +- **PR Stage:** Waiting for Code Reviews +- **Summary:** Summary of the PR. + **Comments:** Summary of PR comments or No comments. - **PR Link:** [#302](https://github.com/mygithuborg/thatrepo/pull/302) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 💬 Open - **Mergeable:** Mergeable -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. +- **PR Stage:** Waiting for Author to Merge +- **Summary:** Summary of the PR. +- **Comments:** Summary of the PR comments or No comments. - **PR Link:** [#3](https://github.com/mygithuborg/myotherrepo/pull/3) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 🔀 Merged -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. +- **Summary:** Summary of the PR. +- **Comments:** Summary of the PR comments or No comments. - **PR Link:** [#14](https://github.com/mygithuborg/frontend/pull/14) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 💬 Open +- **PR Stage:** Needs Author Action - **Mergeable:** Mergeable -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. +- **Summary:** Summary of the PR. +- **Comments:** Summary of the PR comments or No comments. - **PR Link:** [#13005](https://github.com/mygithuborg/backend/pull/13005) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 🔀 Merged -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. +- **Summary:** Summary of the PR. +- **Comments:** Summary of the PR comments or No comments. - **PR Link:** [#3006](https://github.com/mygithuborg/myrepo/pull/3006) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 🔀 Merged -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. +- **Summary:** Summary of the PR. +- **Comments:** Summary of the PR comments or No comments. - **PR Link:** [#3007](https://github.com/mygithuborg/myrepo/pull/3007) -- **Title:** [PR Title] +- **Title:** PR Title - **PR State:** 📝 Draft - **Mergeable:** Not Mergeable -- **Summary:** [Summary of the PR]. -- **Comments:** [Summary of the PR comments]. + **PR Stage:** Needs Author Action + + **Comments:** Summary of PR comments or No comments. ``` From b6101740ebcd9d39e08bdad47f0ead6a2ab58f4d Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Tue, 13 May 2025 15:38:09 -0400 Subject: [PATCH 29/48] Update/custom reporting data (#337) * update docs with PR Stage and others * cleanup example * fix cursor mistakes * fix order --- docs/guides/custom-reports.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guides/custom-reports.md b/docs/guides/custom-reports.md index 7ed5a08e..dbc04280 100644 --- a/docs/guides/custom-reports.md +++ b/docs/guides/custom-reports.md @@ -145,7 +145,7 @@ Generate a summary of each pull request in the following bullet point format: - **Mergeable:** Mergeable - **PR Stage:** Waiting for Code Reviews - **Summary:** Summary of the PR. - **Comments:** Summary of PR comments or No comments. +- **Comments:** Summary of the PR comments or No comments. - **PR Link:** [#302](https://github.com/mygithuborg/thatrepo/pull/302) - **Title:** PR Title @@ -164,8 +164,8 @@ Generate a summary of each pull request in the following bullet point format: - **PR Link:** [#14](https://github.com/mygithuborg/frontend/pull/14) - **Title:** PR Title - **PR State:** 💬 Open -- **PR Stage:** Needs Author Action - **Mergeable:** Mergeable +- **PR Stage:** Needs Author Action - **Summary:** Summary of the PR. - **Comments:** Summary of the PR comments or No comments. @@ -185,9 +185,9 @@ Generate a summary of each pull request in the following bullet point format: - **Title:** PR Title - **PR State:** 📝 Draft - **Mergeable:** Not Mergeable - **PR Stage:** Needs Author Action - - **Comments:** Summary of PR comments or No comments. +- **PR Stage:** Needs Author Action +- **Summary:** Summary of the PR. +- **Comments:** Summary of the PR comments or No comments. ``` From 1f02175554bb66126bdf6e93bab6e88d1860c34d Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Tue, 13 May 2025 21:52:26 -0400 Subject: [PATCH 30/48] Add documentation for the VSCode extension (#335) --- docs/guides/about-vscode.md | 35 +++++++++++++ docs/guides/install-vscode.md | 47 +++++++++++++++++ docs/guides/uninstall-vscode.md | 25 +++++++++ docs/guides/use-vscode.md | 93 +++++++++++++++++++++++++++++++++ docs/overview/introduction.md | 8 +++ sidebars.ts | 11 ++++ 6 files changed, 219 insertions(+) create mode 100644 docs/guides/about-vscode.md create mode 100644 docs/guides/install-vscode.md create mode 100644 docs/guides/uninstall-vscode.md create mode 100644 docs/guides/use-vscode.md diff --git a/docs/guides/about-vscode.md b/docs/guides/about-vscode.md new file mode 100644 index 00000000..5e6307fd --- /dev/null +++ b/docs/guides/about-vscode.md @@ -0,0 +1,35 @@ +--- +title: Review local changes +description: How to review your code with the VSCode extension. +slug: /code-editors +sidebar_label: Overview +--- + +This page is about the CodeRabbit VSCode extension. For a broader overview of CodeRabbit, see [Introduction](/). + +## About the VSCode extension + +The CodeRabbit VSCode extension lets you apply a limited subset of CodeRabbit’s code-review features to your local development environment, directly from the VSCode IDE. It also works with other text editors that are able to install and use VSCode extensions, such as Cursor and Windsurf. + +You can use the extension on its own, or you can use it to complement your local development on a repository whose remote has CodeRabbit installed. + +The extension is intended to let you use the power of CodeRabbit to rapidly tune and tidy your code changes locally, before you publish your changes to your team's remote repository and start a more thorough code review. + +## Features + +The extension includes the following features: + +- Automatic code reviews on every local Git commit +- Manually requested reviews of local code changes +- Full compatibility with text editors derived from VSCode, including Cursor and Windsurf + +## Price and limitations + +This extension is free to install and use, and works with any tier of CodeRabbit account. Rate limits apply to the number of local reviews that you can request per hour. + +The extension makes only basic CodeRabbit review features available, with default settings applied. Advanced CodeRabbit features, such as interactive chat and project learnings, aren't available through the VSCode extension. These features are available only by [integrating CodeRabbit on your remote repository](/platforms), and then allowing CodeRabbit to review pull requests. + +## What's next + +- [Install the VSCode extension](/guides/install-vscode) +- [Use the VSCode extension](/guides/use-vscode) diff --git a/docs/guides/install-vscode.md b/docs/guides/install-vscode.md new file mode 100644 index 00000000..85e3e5e0 --- /dev/null +++ b/docs/guides/install-vscode.md @@ -0,0 +1,47 @@ +--- +title: Install the VSCode extension +description: How to install the CodeRabbit VSCode extension +--- + +This page is about installing the CodeRabbit VSCode extension. For more information about the extension, see +[Review local changes](/code-editors). + +:::note +The instructions on this page are specific to using the extension with VSCode. If you are instead using a VSCode-compatible editor such as Cursor or Windsurf, then the steps that you need to follow are similar, but might require some adaptation. +::: + +## Before you begin + +Before you can use the CodeRabbit VSCode extension, you need a CodeRabbit account. + +If you don't already have an account, you can create one by visiting [the CodeRabbit login page](https://app.coderabbit.ai/login). + +## Install the extension + +To install the CodeRabbit VSCode extension, follow these steps: + +1. Visit [the extension's page on the Visual Studio Marketplace](https://coderabbit.link/vscode-docs). + +1. Click **Install**. + +1. If your browser asks you for permission to open VSCode, then click **Allow** or its equivalent control. + +1. A summary of the CodeRabbit VSCode extension appears in your VSCode window. If you would like VSCode to automatically check for and apply future updates to the extension, then keep the **Auto Update** checkbox selected. + +1. In VSCode, click **Install**. + +1. A **Log in to CodeRabbit to get started** dialog appears. Click **Login**. If the dialog gets dismissed or times out first, then you can follow these alternate steps: + + 1. Click the CodeRabbit icon in the VSCode activity bar. + + 1. Click the **Use CodeRabbit for Free** button. + +1. Grant VSCode permission to open your browser, if asked. + +1. In your web browser, log into your CodeRabbit account. + +This connects your CodeRabbit account with the CodeRabbit VSCode extension. + +## What's next + +- [Use the VSCode extension](/guides/use-vscode) diff --git a/docs/guides/uninstall-vscode.md b/docs/guides/uninstall-vscode.md new file mode 100644 index 00000000..27266d47 --- /dev/null +++ b/docs/guides/uninstall-vscode.md @@ -0,0 +1,25 @@ +--- +title: Uninstall the VSCode extension +description: How to uninstall the CodeRabbit VSCode extension +--- + +This page is about uninstalling the CodeRabbit VSCode extension. For more information about the extension, see +[Review local changes](/code-editors). + +:::note +The instructions on this page are specific to using the extension with VSCode. If you are instead using a VSCode-compatible editor such as Cursor or Windsurf, then the steps that you need to follow are similar, but might require some adaptation. +::: + +## Uninstall the extension + +To uninstall the VSCode extension, follow these steps: + +1. In the VSCode activity bar, click the CodeRabbit icon. + +1. In the CodeRabbit sidebar, click the door-shaped **Logout** icon. + +1. In the VSCode activity bar, click the **Extensions** icon. + +1. In the Extensions sidebar, click the gear-shaped **Manage** icon next to CodeRabbit in the list of installed extensions. + +1. Select **Uninstall**. diff --git a/docs/guides/use-vscode.md b/docs/guides/use-vscode.md new file mode 100644 index 00000000..06c8aba1 --- /dev/null +++ b/docs/guides/use-vscode.md @@ -0,0 +1,93 @@ +--- +title: Use the VSCode extension +description: How to review your code with the VSCode extension. +--- + +This page is about performing local code reviews using the CodeRabbit VSCode extension. For more information about the extension, see +[Review local changes](/code-editors). To learn how to install the extension, see [Install the VSCode extension](/guides/install-vscode). + +The CodeRabbit VSCode extension works by comparing changes in your current, checked-out Git branch against another branch in your local repository. You can use the extension to automatically perform full-branch changes after every commit, or make different kinds of comparisons by manually requesting a review. + +:::note +The instructions on this page are specific to using the extension with VSCode. If you are instead using a VSCode-compatible editor such as Cursor or Windsurf, then the steps that you need to follow are similar, but might require some adaptation. +::: + +## Automatically review local commits + +You can let CodeRabbit automatically review commits that you make to your local Git repository. These automatic reviews compare all committed changes against the branch that your working branch is based on. + +To perform an automatic review, follow these steps: + +1. Perform a Git commit using VSCode. After you do this, a dialog appears in your VSCode window, asking **Would you like to start a review?** + +1. Click **Yes.** The CodeRabbit sidebar appears in your VSCode window. + +1. Wait for the review to complete. This might take a few minutes. To cancel a review in progress, click **Stop the review**. + +After the review completes, you can browse and respond to review comments as described in [Work with code reviews](#work-with-code-reviews). + +For more options and control of code reviews performed using the CodeRabbit VSCode extension, you can manually request a review, as detailed in the following section. + +## Manually request code reviews + +To manually review changes in a local Git branch using the CodeRabbit VSCode extension, follow these steps: + +1. Click the CodeRabbit icon in the VSCode activity bar. The CodeRabbit sidebar appears. + +1. If you want to compare your code changes to a branch other than its base branch, then follow these steps: + + 1. In the sidebar, under **Branch**, click the name of the base branch. A **Select a base branch** dialog appears, listing other branches in your local Git repository. + + 1. Select the name of a base branch to compare against. + +1. Select one of the review-action options from the menu at the bottom of the CodeRabbit sidebar: + + - To review all changes between the base branch and your current branch, including both committed and uncommitted changes, select **Review all changes**. This is the default selection. + + - To limit the review to only changes on your branch that you have committed, select **Review committed changes**. This includes commits that you have pushed to your remote repository, if any, as well as any local commits. + + - To limit the review to only uncommitted changes on your branch, select **Review uncommitted changes**. This includes both staged and unstaged changes. + +1. Refer to the list of **Files to review** in the sidebar. This list represents all of the files that the selected review action includes. To change this list of files, repeat the previous step to choose a different review action, or use Git features like `git stash` to selectively remove changes. + +1. To perform the review, click the button part of the menu. The CodeRabbit sidebar displays a **Review** section with the review's progress. + +1. Wait for the review to complete. This might take a few minutes. To cancel a review in progress, click **Stop the review**. + +After the review completes, you can browse and respond to review comments as described in the following section. + +## Work with code reviews + +The CodeRabbit VSCode extension presents code reviews as a series of actionable comments, connected to specific files and lines. It gives you tools to apply its suggestions quickly, when possible. + +### Browse comments + +After the extension finishes its review, it adds any comments to the CodeRabbit sidebar under the **Files** heading in the **Reviews** section. + +Each item in **Files** is a comment referring to one or more lines in that file. Click the comment to see a detailed, inline comment in the editor, attached to the appropriate file and lines. + +You can react to these comments however you want: you can apply their advice literally, or let them guide you to find alternate solutions, or ignore them entirely. CodeRabbit comments are metadata stored with VSCode, and are not part of your files. The presence of comments doesn't block your use of version control. + +### Apply suggested changes + +Whenever possible, the CodeRabbit VSCode extension attaches discrete change suggestion to comments in the form of code diffs. For example, if it detects a typo in a new function name, the extension might attach a diff with a suggested correction. + +If you agree with CodeRabbit about the suggested fix and want to apply to exactly as it proposes, click the checkmark-shaped **Apply suggested change** icon in the inline comment. The extension makes the change for you in the editor. + +### Ignore or collapse comments + +To remove a comment from the editor, click its **Ignore** icon. + +To remove a comment but keep an icon in the editor noting its presence, click its **Collapse** icon. + +To see an ignored or collapsed comment in the editor again, click its summary in the CodeRabbit sidebar. + +### Browse previous reviews + +If you have performed reviews prior to the most recent review in the current VSCode window, then you can browse the comments from these reviews under the **Previous reviews** heading in the CodeRabbit sidebar. + +If a past review comment no longer applies to the current state of your code, then clicking that comment won't display a detailed comment or suggestion in the editor. + +## What's next + +- [Uninstall the VSCode extension](/guides/uninstall-vscode) diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index ed73a156..06150977 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -94,8 +94,16 @@ Public repositories can use the Pro tier of CodeRabbit at no charge, including a For private repositories, a number of pricing tiers are available. These range from a Free tier that offers unlimited code-change summaries, to an Enterprise tier with access to advanced features and SLA support. For more information, see [Pricing](https://www.coderabbit.ai/pricing). +## Review local changes from within VSCode + +As a separate, free product, CodeRabbit offers a VSCode extension that brings a subset of core CodeRabbit features to VSCode. This lets you use the power of CodeRabbit to tune and tidy your code changes locally before pushing your changes into a formal pull request for more thorough reviews. + +For more information, see [Review local changes](/code-editors). + ## What's next - [Quickstart](/getting-started/quickstart/) lets you experience your first CodeRabbit code review first-hand. +- [Review local changes](/code-editors) guides you through installing and using a subset of CodeRabbit features directly from your code editor. + - [Why CodeRabbit?](/overview/why-coderabbit) dives further into the philosophies and technologies that drive CodeRabbit. diff --git a/sidebars.ts b/sidebars.ts index c6502d8b..5c9cd912 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -108,6 +108,17 @@ const sidebars: SidebarsConfig = { "guides/linked-issues", ], }, + { + type: "category", + collapsed: false, + label: "Review local changes", + items: [ + "guides/about-vscode", + "guides/install-vscode", + "guides/use-vscode", + "guides/uninstall-vscode", + ], + }, { type: "category", collapsed: false, From 53941093a1ca6823bfb87af08d8dcceda0d9ddf3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 06:38:06 +0000 Subject: [PATCH 31/48] Update schema.v2.json --- static/schema/schema.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 198014dd..7a180370 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -630,7 +630,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Checkov | Checkov is a static code analysis tool for infrastructure-as-code files. | v3.2.334" + "description": "Enable Checkov | Checkov is a static code analysis tool for infrastructure-as-code files. | v3.2.420" } }, "additionalProperties": false, From bd8a5f86016c4cea7cb8192acb60366a0ab8d2ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 07:08:24 +0000 Subject: [PATCH 32/48] Update schema.v2.json --- static/schema/schema.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 7a180370..198014dd 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -630,7 +630,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Checkov | Checkov is a static code analysis tool for infrastructure-as-code files. | v3.2.420" + "description": "Enable Checkov | Checkov is a static code analysis tool for infrastructure-as-code files. | v3.2.334" } }, "additionalProperties": false, From cfaef41ac9f5d00ed085bab7af3ad9a31715671e Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Thu, 15 May 2025 16:57:38 -0400 Subject: [PATCH 33/48] Document the "Fix with AI" feature (#342) --- docs/guides/config-vscode.md | 61 +++++++++++++++++++++++++++++++++++ docs/guides/install-vscode.md | 2 ++ docs/guides/use-vscode.md | 38 +++++++++++++++------- sidebars.ts | 1 + 4 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 docs/guides/config-vscode.md diff --git a/docs/guides/config-vscode.md b/docs/guides/config-vscode.md new file mode 100644 index 00000000..7a1fb8bd --- /dev/null +++ b/docs/guides/config-vscode.md @@ -0,0 +1,61 @@ +--- +title: Configure the VSCode extension +description: How to configure the CodeRabbit VSCode extension +--- + +This page is about configuring the CodeRabbit VSCode extension. For more information about the extension, see +[Review local changes](/code-editors). + +:::note +The instructions on this page are specific to using the extension with VSCode. If you are instead using a VSCode-compatible editor such as Cursor or Windsurf, then the steps that you need to follow are similar, but might require some adaptation. +::: + +## Find the settings screen {#find} + +To navigate to the settings screen for the CodeRabbit VSCode extension, follow these steps: + +1. In the activity bar, click the Extensions icon. + +1. In the sidebar, under **Installed**, click the gear-shaped **Manage** icon in the CodeRabbit row. + +1. In the menu that appears, select **Settings**. + +The settings screen contains the following configuration controls. + +## Configure AI agent integration {#agent} + +The **Agent Type** setting lets you choose the extension's response to using the **Fix with AI** feature during code reviews. Your options are the following: + +- **Native**: The extension prompts the AI agent associated with your IDE to apply the suggested fix. + + This works only with VSCode, using Copilot. If you have this option selected when using a different IDE, then the extension instead copies the prompt to your clipboard. + +- **Claude Code**: The extension opens the Terminal pane of your IDE and tries to use the `claude` command-line program to apply the suggested fix to your code. You need to have Claude Code installed for this option to be effective. + +- **Clipboard**: The extension copies prompt text describing the suggested fix to your clipboard. From there, you can manually paste the prompt into the coding AI agent that you use with your IDE. + +For more information about the **Fix with AI** feature, see [Request help from your AI coding agent](/guides/use-vscode#agent). + +## Configure automatic review behavior {#auto-reviews} + +The **Auto Review Mode** setting lets you control the behavior of the automatic code reviews that the extension can perform after you make commits to your local Git repository. Your options are the following: + +- **Disabled**: The extension doesn't perform automatic code reviews. + +- **Prompt**: After every commit, the extension displays a dialog asking if you'd like it to perform a code review. + +- **Auto**: The extension always performs a review after every commit. + +For more information about this feature, see [Automatically review local commits](/guides/use-vscode#auto-reviews). + +## Set a review timeout {#timeout} + +The **Review Timeout** setting lets you specify how long the extension waits for a response from CodeRabbit remote servers before timing out a code review. The default value is `20`. + +To turn off timeouts, set this value to `0`. + +## What's next {#whats-next} + +- [Use the VSCode extension](/guides/use-vscode) + +- [Uninstall the VSCode extension](/guides/uninstall-vscode) diff --git a/docs/guides/install-vscode.md b/docs/guides/install-vscode.md index 85e3e5e0..abdd5d1f 100644 --- a/docs/guides/install-vscode.md +++ b/docs/guides/install-vscode.md @@ -45,3 +45,5 @@ This connects your CodeRabbit account with the CodeRabbit VSCode extension. ## What's next - [Use the VSCode extension](/guides/use-vscode) + +- [Configure the VSCode extension](/guides/config-vscode) diff --git a/docs/guides/use-vscode.md b/docs/guides/use-vscode.md index 06c8aba1..bfacd87b 100644 --- a/docs/guides/use-vscode.md +++ b/docs/guides/use-vscode.md @@ -12,7 +12,7 @@ The CodeRabbit VSCode extension works by comparing changes in your current, chec The instructions on this page are specific to using the extension with VSCode. If you are instead using a VSCode-compatible editor such as Cursor or Windsurf, then the steps that you need to follow are similar, but might require some adaptation. ::: -## Automatically review local commits +## Automatically review local commits {#auto-reviews} You can let CodeRabbit automatically review commits that you make to your local Git repository. These automatic reviews compare all committed changes against the branch that your working branch is based on. @@ -20,15 +20,17 @@ To perform an automatic review, follow these steps: 1. Perform a Git commit using VSCode. After you do this, a dialog appears in your VSCode window, asking **Would you like to start a review?** -1. Click **Yes.** The CodeRabbit sidebar appears in your VSCode window. +1. Click **Yes**. The CodeRabbit sidebar appears in your VSCode window. 1. Wait for the review to complete. This might take a few minutes. To cancel a review in progress, click **Stop the review**. -After the review completes, you can browse and respond to review comments as described in [Work with code reviews](#work-with-code-reviews). +After the review completes, you can browse and respond to review comments as described in [Work with code reviews](#work). -For more options and control of code reviews performed using the CodeRabbit VSCode extension, you can manually request a review, as detailed in the following section. +You can optionally configure the extension to either always or never perform automatic code reviews on commit, instead of displaying this yes-or-no dialog. For more information, see [Configure automatic review behavior](/guides/config-vscode#auto-reviews). -## Manually request code reviews +For more control of code reviews performed using the CodeRabbit VSCode extension, you can manually request a review, as detailed in the following section. + +## Manually request code reviews {#manual-reviews} To manually review changes in a local Git branch using the CodeRabbit VSCode extension, follow these steps: @@ -56,11 +58,11 @@ To manually review changes in a local Git branch using the CodeRabbit VSCode ext After the review completes, you can browse and respond to review comments as described in the following section. -## Work with code reviews +## Work with code reviews {#work} The CodeRabbit VSCode extension presents code reviews as a series of actionable comments, connected to specific files and lines. It gives you tools to apply its suggestions quickly, when possible. -### Browse comments +### Browse comments {#browse} After the extension finishes its review, it adds any comments to the CodeRabbit sidebar under the **Files** heading in the **Reviews** section. @@ -68,13 +70,25 @@ Each item in **Files** is a comment referring to one or more lines in that file. You can react to these comments however you want: you can apply their advice literally, or let them guide you to find alternate solutions, or ignore them entirely. CodeRabbit comments are metadata stored with VSCode, and are not part of your files. The presence of comments doesn't block your use of version control. -### Apply suggested changes +### Apply suggested changes {#apply} Whenever possible, the CodeRabbit VSCode extension attaches discrete change suggestion to comments in the form of code diffs. For example, if it detects a typo in a new function name, the extension might attach a diff with a suggested correction. If you agree with CodeRabbit about the suggested fix and want to apply to exactly as it proposes, click the checkmark-shaped **Apply suggested change** icon in the inline comment. The extension makes the change for you in the editor. -### Ignore or collapse comments +### Request help from your AI coding agent {#agent} + +If CodeRabbit determines that an AI coding agent could help with resolving one of its comments, then it adds a star-shaped **Fix with AI** icon to the inline display of that comment. To have the extension generate a request for an AI agent to address the comment, click this icon. + +Depending upon your IDE and the current extension settings, the extension performs one of the following actions: + +- If you are using VSCode with Copilot installed, then the extension can send the request directly to Copilot. +- If you have Claude Code installed, then the extension can send the request to the `claude` command-line program. +- As a fallback, the extension can copy the request, phrased as an AI prompt, to your clipboard. You can then manually paste this prompt into the coding AI of your IDE. + +For more information about configuring this behavior, see [Configure AI agent integration](/guides/config-vscode#agent). + +### Ignore or collapse comments {#ignore} To remove a comment from the editor, click its **Ignore** icon. @@ -82,12 +96,14 @@ To remove a comment but keep an icon in the editor noting its presence, click it To see an ignored or collapsed comment in the editor again, click its summary in the CodeRabbit sidebar. -### Browse previous reviews +### Browse previous reviews {#previous} If you have performed reviews prior to the most recent review in the current VSCode window, then you can browse the comments from these reviews under the **Previous reviews** heading in the CodeRabbit sidebar. If a past review comment no longer applies to the current state of your code, then clicking that comment won't display a detailed comment or suggestion in the editor. -## What's next +## What's next {#whats-next} + +- [Configure the VSCode extension](/guides/config-vscode) - [Uninstall the VSCode extension](/guides/uninstall-vscode) diff --git a/sidebars.ts b/sidebars.ts index 5c9cd912..1869c24c 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -116,6 +116,7 @@ const sidebars: SidebarsConfig = { "guides/about-vscode", "guides/install-vscode", "guides/use-vscode", + "guides/config-vscode", "guides/uninstall-vscode", ], }, From 0389c04855dac4a670f2faeaa554f1234a2d08e2 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Fri, 16 May 2025 08:43:12 -0400 Subject: [PATCH 34/48] Modify the IDE installation instructions to prefer using the IDE's marketplace UI (#341) * Modify the installation instructions to prefer using the IDE's marketplace UI to insatll, rather than the website. * Apply suggestions from code review Co-authored-by: Ankit Jena --------- Co-authored-by: Ankit Jena --- docs/guides/install-vscode.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/guides/install-vscode.md b/docs/guides/install-vscode.md index abdd5d1f..ec71e213 100644 --- a/docs/guides/install-vscode.md +++ b/docs/guides/install-vscode.md @@ -18,17 +18,17 @@ If you don't already have an account, you can create one by visiting [the CodeRa ## Install the extension -To install the CodeRabbit VSCode extension, follow these steps: +To install the CodeRabbit extension, follow these steps: -1. Visit [the extension's page on the Visual Studio Marketplace](https://coderabbit.link/vscode-docs). +1. In the editor activity bar, click **Extensions**. -1. Click **Install**. +1. In sidebar, type `coderabbit` into the **Search Extensions in Marketplace** search bar. After a moment, **CodeRabbit** appears in the sidebar as a search result. -1. If your browser asks you for permission to open VSCode, then click **Allow** or its equivalent control. +1. Select **CodeRabbit**. A summary of the CodeRabbit VSCode extension appears in the window's main pane, along with installation controls. -1. A summary of the CodeRabbit VSCode extension appears in your VSCode window. If you would like VSCode to automatically check for and apply future updates to the extension, then keep the **Auto Update** checkbox selected. +1. If you would like your editor to automatically check for and apply future updates to the extension, then keep the **Auto Update** checkbox selected. Otherwise, clear the checkbox. -1. In VSCode, click **Install**. +1. Click **Install**. 1. A **Log in to CodeRabbit to get started** dialog appears. Click **Login**. If the dialog gets dismissed or times out first, then you can follow these alternate steps: @@ -42,6 +42,12 @@ To install the CodeRabbit VSCode extension, follow these steps: This connects your CodeRabbit account with the CodeRabbit VSCode extension. +## Install using the marketplace website + +If you are using the VSCode IDE, and not an IDE that derives from it such as Cursor or Windsurf, then you can alternatively obtain and install the CodeRabbit VSCode extension by visiting [the extension's page on the Visual Studio Marketplace](https://coderabbit.link/vscode-docs). + +If you do install the extension this way, then you still need to connect your CodeRabbit account to the extension after installing it, as described in the previous section. + ## What's next - [Use the VSCode extension](/guides/use-vscode) From 2a470c3d860ded2ae81183cc35d54f96e397fd56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 May 2025 12:55:59 +0000 Subject: [PATCH 35/48] Update schema.v2.json --- static/schema/schema.v2.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 198014dd..1379587b 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -389,7 +389,7 @@ }, "additionalProperties": false, "default": {}, - "description": "Enable ast-grep | ast-grep is a code analysis tool that helps you to find patterns in your codebase using abstract syntax trees patterns. | v0.31.1" + "description": "Enable ast-grep | ast-grep is a code analysis tool that helps you to find patterns in your codebase using abstract syntax trees patterns. | v0.38.1" }, "shellcheck": { "type": "object", @@ -410,7 +410,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Ruff | Ruff is a Python linter and code formatter. | Enable Ruff integration. | v0.8.2" + "description": "Enable Ruff | Ruff is a Python linter and code formatter. | Enable Ruff integration. | v0.11.9" } }, "additionalProperties": false, @@ -555,7 +555,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable PHPStan | PHPStan requires [config file](https://phpstan.org/config-reference#config-file) in your repository root. Please ensure that this file contains the `paths:` parameter. | v2.0.3" + "description": "Enable PHPStan | PHPStan requires [config file](https://phpstan.org/config-reference#config-file) in your repository root. Please ensure that this file contains the `paths:` parameter. | v2.1.15" }, "level": { "type": "string", @@ -604,7 +604,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable YAMLlint | YAMLlint is a linter for YAML files. | Enable YAMLlint integration. | v1.35.1" + "description": "Enable YAMLlint | YAMLlint is a linter for YAML files. | Enable YAMLlint integration. | v1.37.1" } }, "additionalProperties": false, @@ -617,7 +617,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Gitleaks | Gitleaks is a secret scanner. | Enable Gitleaks integration. | v8.21.2" + "description": "Enable Gitleaks | Gitleaks is a secret scanner. | Enable Gitleaks integration. | v8.26.0" } }, "additionalProperties": false, @@ -643,7 +643,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable detekt | detekt is a static code analysis tool for Kotlin files. | v1.23.7" + "description": "Enable detekt | detekt is a static code analysis tool for Kotlin files. | v1.23.8" }, "config_file": { "type": "string", @@ -673,7 +673,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable RuboCop | RuboCop is a Ruby static code analyzer (a.k.a. linter ) and code formatter. | v1.73" + "description": "Enable RuboCop | RuboCop is a Ruby static code analyzer (a.k.a. linter ) and code formatter. | v1.75.5" } }, "additionalProperties": false, @@ -686,7 +686,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Buf | Buf offers linting for Protobuf files. | v1.47.2" + "description": "Enable Buf | Buf offers linting for Protobuf files. | v1.54.0" } }, "additionalProperties": false, @@ -699,7 +699,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Regal | Regal is a linter and language server for Rego. | v0.29.2" + "description": "Enable Regal | Regal is a linter and language server for Rego. | v0.33.1" } }, "additionalProperties": false, @@ -712,7 +712,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable actionlint | is a static checker for GitHub Actions workflow files. | v1.7.4" + "description": "Enable actionlint | is a static checker for GitHub Actions workflow files. | v1.7.7" } }, "additionalProperties": false, @@ -725,7 +725,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable PMD | PMD is an extensible multilanguage static code analyzer. It’s mainly concerned with Java. | v7.8.0" + "description": "Enable PMD | PMD is an extensible multilanguage static code analyzer. It’s mainly concerned with Java. | v7.13.0" }, "config_file": { "type": "string", @@ -742,7 +742,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Cppcheck | Cppcheck is a static code analysis tool for the C and C++ programming languages. | v2.10-2" + "description": "Enable Cppcheck | Cppcheck is a static code analysis tool for the C and C++ programming languages. | v2.17.1" } }, "additionalProperties": false, @@ -755,7 +755,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Semgrep | Semgrep is a static analysis tool designed to scan code for security vulnerabilities and code quality issues. | Enable Semgrep integration. | v1.99.0" + "description": "Enable Semgrep | Semgrep is a static analysis tool designed to scan code for security vulnerabilities and code quality issues. | Enable Semgrep integration. | v1.122.0" }, "config_file": { "type": "string", @@ -772,7 +772,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable CircleCI | CircleCI tool is a static checker for CircleCI config files. | v0.1.31151" + "description": "Enable CircleCI | CircleCI tool is a static checker for CircleCI config files. | v0.1.31687" } }, "additionalProperties": false, @@ -785,7 +785,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable SQLFluff | SQLFluff is an open source, dialect-flexible and configurable SQL linter. | v3.3.0" + "description": "Enable SQLFluff | SQLFluff is an open source, dialect-flexible and configurable SQL linter. | v3.4.0" } }, "additionalProperties": false, @@ -798,7 +798,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Prisma Schema linting | Prisma Schema linting helps maintain consistent and error-free schema files | v0.10.0" + "description": "Enable Prisma Schema linting | Prisma Schema linting helps maintain consistent and error-free schema files | v0.10.1" } }, "additionalProperties": false, @@ -811,7 +811,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable OXC | OXC is a JavaScript/TypeScript linter written in Rust. | v0.16.5" + "description": "Enable OXC | OXC is a JavaScript/TypeScript linter written in Rust. | v0.16.10" } }, "additionalProperties": false, From 0a25653d31d4206af49008d9c0823e5caf42cf66 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Fri, 16 May 2025 11:38:27 -0400 Subject: [PATCH 36/48] Add a couple more features to the IDE feature bullet-list. (#345) --- docs/guides/about-vscode.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/guides/about-vscode.md b/docs/guides/about-vscode.md index 5e6307fd..3e484ffe 100644 --- a/docs/guides/about-vscode.md +++ b/docs/guides/about-vscode.md @@ -19,9 +19,11 @@ The extension is intended to let you use the power of CodeRabbit to rapidly tune The extension includes the following features: -- Automatic code reviews on every local Git commit -- Manually requested reviews of local code changes -- Full compatibility with text editors derived from VSCode, including Cursor and Windsurf +- Automatic code reviews on every local Git commit. +- Manually requested reviews of local code changes. +- One-click application of simpler suggested code fixes. +- Integration with AI coding agents, including Copilot and Claude Code, to help you resolve more complex suggestions. +- Full compatibility with text editors derived from VSCode, including Cursor and Windsurf. ## Price and limitations From d868ab6cff86cc74ed2d05aab841b63785ed3327 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Fri, 16 May 2025 15:30:28 -0400 Subject: [PATCH 37/48] Default ToC menus to collapsed rather than expanded. (#344) --- sidebars.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sidebars.ts b/sidebars.ts index 1869c24c..4e1e68d3 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -30,13 +30,13 @@ const sidebars: SidebarsConfig = { docsSidebar: [ { type: "category", - collapsed: false, + collapsed: true, label: "Get started with CodeRabbit", items: ["overview/introduction", "getting-started/quickstart"], }, { type: "category", - collapsed: false, + collapsed: true, label: "Add CodeRabbit to your repository", items: [ "platforms/platforms", @@ -70,7 +70,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Configure CodeRabbit", items: [ "getting-started/configure-coderabbit", @@ -81,14 +81,14 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Review pull requests", items: [ "guides/commands", "guides/agent_chat", { type: "category", - collapsed: false, + collapsed: true, label: "Analyze and improve your code", items: [ "integrations/code-graph-analysis", @@ -99,7 +99,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Create and resolve issues", items: [ "integrations/issue-integrations", @@ -110,7 +110,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Review local changes", items: [ "guides/about-vscode", @@ -122,7 +122,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Generate reports", items: [ "guides/ondemand-reports", @@ -132,7 +132,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Reference", items: [ { @@ -177,7 +177,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - collapsed: false, + collapsed: true, label: "Resources", items: [ "getting-started/support", From 7d8efae808d2ce505ed6f7b3a494c5a9dd9823b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 May 2025 19:47:39 +0000 Subject: [PATCH 38/48] Update schema.v2.json --- static/schema/schema.v2.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 1379587b..8992fa7d 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -346,6 +346,19 @@ "additionalProperties": false, "default": {}, "description": "Docstrings | Options for generating Docstrings for your PRs/MRs." + }, + "unit_tests": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Unit Tests | Allow CodeRabbit to generate unit tests for PRs/MRs." + } + }, + "additionalProperties": false, + "default": {}, + "description": "Unit Tests | Options for generating unit tests for your PRs/MRs." } }, "additionalProperties": false, From a3f2a46fd67f01eea22843b63190eb44486c186c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 May 2025 21:36:20 +0000 Subject: [PATCH 39/48] Update schema.v2.json --- static/schema/schema.v2.json | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 8992fa7d..8dba06ac 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -1133,6 +1133,37 @@ "path_instructions": [] }, "description": "Settings related to the generation of docstrings." + }, + "unit_tests": { + "type": "object", + "properties": { + "path_instructions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "File path glob pattern. Example: **/*.js" + }, + "instructions": { + "type": "string", + "maxLength": 20000, + "description": "Provides additional guidelines for unit test generation based on file paths." + } + }, + "required": ["path", "instructions"], + "additionalProperties": false + }, + "default": [], + "description": "Unit Test Generation | Provide additional guidelines for unit test generation based on file paths." + } + }, + "additionalProperties": false, + "default": { + "path_instructions": [] + }, + "description": "Settings related to the generation of unit tests." } }, "additionalProperties": false, From 4282b9c8110df295dbf681201dba9446fb3dc88e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 06:37:52 +0000 Subject: [PATCH 40/48] Update schema.v2.json --- static/schema/schema.v2.json | 78 ++++++++---------------------------- 1 file changed, 17 insertions(+), 61 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 8dba06ac..198014dd 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -346,19 +346,6 @@ "additionalProperties": false, "default": {}, "description": "Docstrings | Options for generating Docstrings for your PRs/MRs." - }, - "unit_tests": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "default": true, - "description": "Unit Tests | Allow CodeRabbit to generate unit tests for PRs/MRs." - } - }, - "additionalProperties": false, - "default": {}, - "description": "Unit Tests | Options for generating unit tests for your PRs/MRs." } }, "additionalProperties": false, @@ -402,7 +389,7 @@ }, "additionalProperties": false, "default": {}, - "description": "Enable ast-grep | ast-grep is a code analysis tool that helps you to find patterns in your codebase using abstract syntax trees patterns. | v0.38.1" + "description": "Enable ast-grep | ast-grep is a code analysis tool that helps you to find patterns in your codebase using abstract syntax trees patterns. | v0.31.1" }, "shellcheck": { "type": "object", @@ -423,7 +410,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Ruff | Ruff is a Python linter and code formatter. | Enable Ruff integration. | v0.11.9" + "description": "Enable Ruff | Ruff is a Python linter and code formatter. | Enable Ruff integration. | v0.8.2" } }, "additionalProperties": false, @@ -568,7 +555,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable PHPStan | PHPStan requires [config file](https://phpstan.org/config-reference#config-file) in your repository root. Please ensure that this file contains the `paths:` parameter. | v2.1.15" + "description": "Enable PHPStan | PHPStan requires [config file](https://phpstan.org/config-reference#config-file) in your repository root. Please ensure that this file contains the `paths:` parameter. | v2.0.3" }, "level": { "type": "string", @@ -617,7 +604,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable YAMLlint | YAMLlint is a linter for YAML files. | Enable YAMLlint integration. | v1.37.1" + "description": "Enable YAMLlint | YAMLlint is a linter for YAML files. | Enable YAMLlint integration. | v1.35.1" } }, "additionalProperties": false, @@ -630,7 +617,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Gitleaks | Gitleaks is a secret scanner. | Enable Gitleaks integration. | v8.26.0" + "description": "Enable Gitleaks | Gitleaks is a secret scanner. | Enable Gitleaks integration. | v8.21.2" } }, "additionalProperties": false, @@ -656,7 +643,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable detekt | detekt is a static code analysis tool for Kotlin files. | v1.23.8" + "description": "Enable detekt | detekt is a static code analysis tool for Kotlin files. | v1.23.7" }, "config_file": { "type": "string", @@ -686,7 +673,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable RuboCop | RuboCop is a Ruby static code analyzer (a.k.a. linter ) and code formatter. | v1.75.5" + "description": "Enable RuboCop | RuboCop is a Ruby static code analyzer (a.k.a. linter ) and code formatter. | v1.73" } }, "additionalProperties": false, @@ -699,7 +686,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Buf | Buf offers linting for Protobuf files. | v1.54.0" + "description": "Enable Buf | Buf offers linting for Protobuf files. | v1.47.2" } }, "additionalProperties": false, @@ -712,7 +699,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Regal | Regal is a linter and language server for Rego. | v0.33.1" + "description": "Enable Regal | Regal is a linter and language server for Rego. | v0.29.2" } }, "additionalProperties": false, @@ -725,7 +712,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable actionlint | is a static checker for GitHub Actions workflow files. | v1.7.7" + "description": "Enable actionlint | is a static checker for GitHub Actions workflow files. | v1.7.4" } }, "additionalProperties": false, @@ -738,7 +725,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable PMD | PMD is an extensible multilanguage static code analyzer. It’s mainly concerned with Java. | v7.13.0" + "description": "Enable PMD | PMD is an extensible multilanguage static code analyzer. It’s mainly concerned with Java. | v7.8.0" }, "config_file": { "type": "string", @@ -755,7 +742,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Cppcheck | Cppcheck is a static code analysis tool for the C and C++ programming languages. | v2.17.1" + "description": "Enable Cppcheck | Cppcheck is a static code analysis tool for the C and C++ programming languages. | v2.10-2" } }, "additionalProperties": false, @@ -768,7 +755,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Semgrep | Semgrep is a static analysis tool designed to scan code for security vulnerabilities and code quality issues. | Enable Semgrep integration. | v1.122.0" + "description": "Enable Semgrep | Semgrep is a static analysis tool designed to scan code for security vulnerabilities and code quality issues. | Enable Semgrep integration. | v1.99.0" }, "config_file": { "type": "string", @@ -785,7 +772,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable CircleCI | CircleCI tool is a static checker for CircleCI config files. | v0.1.31687" + "description": "Enable CircleCI | CircleCI tool is a static checker for CircleCI config files. | v0.1.31151" } }, "additionalProperties": false, @@ -798,7 +785,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable SQLFluff | SQLFluff is an open source, dialect-flexible and configurable SQL linter. | v3.4.0" + "description": "Enable SQLFluff | SQLFluff is an open source, dialect-flexible and configurable SQL linter. | v3.3.0" } }, "additionalProperties": false, @@ -811,7 +798,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Prisma Schema linting | Prisma Schema linting helps maintain consistent and error-free schema files | v0.10.1" + "description": "Enable Prisma Schema linting | Prisma Schema linting helps maintain consistent and error-free schema files | v0.10.0" } }, "additionalProperties": false, @@ -824,7 +811,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable OXC | OXC is a JavaScript/TypeScript linter written in Rust. | v0.16.10" + "description": "Enable OXC | OXC is a JavaScript/TypeScript linter written in Rust. | v0.16.5" } }, "additionalProperties": false, @@ -1133,37 +1120,6 @@ "path_instructions": [] }, "description": "Settings related to the generation of docstrings." - }, - "unit_tests": { - "type": "object", - "properties": { - "path_instructions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path glob pattern. Example: **/*.js" - }, - "instructions": { - "type": "string", - "maxLength": 20000, - "description": "Provides additional guidelines for unit test generation based on file paths." - } - }, - "required": ["path", "instructions"], - "additionalProperties": false - }, - "default": [], - "description": "Unit Test Generation | Provide additional guidelines for unit test generation based on file paths." - } - }, - "additionalProperties": false, - "default": { - "path_instructions": [] - }, - "description": "Settings related to the generation of unit tests." } }, "additionalProperties": false, From 81a641c19e019ea9ed7ea0f81df785a659704c2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 08:13:30 +0000 Subject: [PATCH 41/48] Update schema.v2.json --- static/schema/schema.v2.json | 78 ++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 198014dd..8dba06ac 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -346,6 +346,19 @@ "additionalProperties": false, "default": {}, "description": "Docstrings | Options for generating Docstrings for your PRs/MRs." + }, + "unit_tests": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Unit Tests | Allow CodeRabbit to generate unit tests for PRs/MRs." + } + }, + "additionalProperties": false, + "default": {}, + "description": "Unit Tests | Options for generating unit tests for your PRs/MRs." } }, "additionalProperties": false, @@ -389,7 +402,7 @@ }, "additionalProperties": false, "default": {}, - "description": "Enable ast-grep | ast-grep is a code analysis tool that helps you to find patterns in your codebase using abstract syntax trees patterns. | v0.31.1" + "description": "Enable ast-grep | ast-grep is a code analysis tool that helps you to find patterns in your codebase using abstract syntax trees patterns. | v0.38.1" }, "shellcheck": { "type": "object", @@ -410,7 +423,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Ruff | Ruff is a Python linter and code formatter. | Enable Ruff integration. | v0.8.2" + "description": "Enable Ruff | Ruff is a Python linter and code formatter. | Enable Ruff integration. | v0.11.9" } }, "additionalProperties": false, @@ -555,7 +568,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable PHPStan | PHPStan requires [config file](https://phpstan.org/config-reference#config-file) in your repository root. Please ensure that this file contains the `paths:` parameter. | v2.0.3" + "description": "Enable PHPStan | PHPStan requires [config file](https://phpstan.org/config-reference#config-file) in your repository root. Please ensure that this file contains the `paths:` parameter. | v2.1.15" }, "level": { "type": "string", @@ -604,7 +617,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable YAMLlint | YAMLlint is a linter for YAML files. | Enable YAMLlint integration. | v1.35.1" + "description": "Enable YAMLlint | YAMLlint is a linter for YAML files. | Enable YAMLlint integration. | v1.37.1" } }, "additionalProperties": false, @@ -617,7 +630,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Gitleaks | Gitleaks is a secret scanner. | Enable Gitleaks integration. | v8.21.2" + "description": "Enable Gitleaks | Gitleaks is a secret scanner. | Enable Gitleaks integration. | v8.26.0" } }, "additionalProperties": false, @@ -643,7 +656,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable detekt | detekt is a static code analysis tool for Kotlin files. | v1.23.7" + "description": "Enable detekt | detekt is a static code analysis tool for Kotlin files. | v1.23.8" }, "config_file": { "type": "string", @@ -673,7 +686,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable RuboCop | RuboCop is a Ruby static code analyzer (a.k.a. linter ) and code formatter. | v1.73" + "description": "Enable RuboCop | RuboCop is a Ruby static code analyzer (a.k.a. linter ) and code formatter. | v1.75.5" } }, "additionalProperties": false, @@ -686,7 +699,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Buf | Buf offers linting for Protobuf files. | v1.47.2" + "description": "Enable Buf | Buf offers linting for Protobuf files. | v1.54.0" } }, "additionalProperties": false, @@ -699,7 +712,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Regal | Regal is a linter and language server for Rego. | v0.29.2" + "description": "Enable Regal | Regal is a linter and language server for Rego. | v0.33.1" } }, "additionalProperties": false, @@ -712,7 +725,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable actionlint | is a static checker for GitHub Actions workflow files. | v1.7.4" + "description": "Enable actionlint | is a static checker for GitHub Actions workflow files. | v1.7.7" } }, "additionalProperties": false, @@ -725,7 +738,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable PMD | PMD is an extensible multilanguage static code analyzer. It’s mainly concerned with Java. | v7.8.0" + "description": "Enable PMD | PMD is an extensible multilanguage static code analyzer. It’s mainly concerned with Java. | v7.13.0" }, "config_file": { "type": "string", @@ -742,7 +755,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Cppcheck | Cppcheck is a static code analysis tool for the C and C++ programming languages. | v2.10-2" + "description": "Enable Cppcheck | Cppcheck is a static code analysis tool for the C and C++ programming languages. | v2.17.1" } }, "additionalProperties": false, @@ -755,7 +768,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Semgrep | Semgrep is a static analysis tool designed to scan code for security vulnerabilities and code quality issues. | Enable Semgrep integration. | v1.99.0" + "description": "Enable Semgrep | Semgrep is a static analysis tool designed to scan code for security vulnerabilities and code quality issues. | Enable Semgrep integration. | v1.122.0" }, "config_file": { "type": "string", @@ -772,7 +785,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable CircleCI | CircleCI tool is a static checker for CircleCI config files. | v0.1.31151" + "description": "Enable CircleCI | CircleCI tool is a static checker for CircleCI config files. | v0.1.31687" } }, "additionalProperties": false, @@ -785,7 +798,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable SQLFluff | SQLFluff is an open source, dialect-flexible and configurable SQL linter. | v3.3.0" + "description": "Enable SQLFluff | SQLFluff is an open source, dialect-flexible and configurable SQL linter. | v3.4.0" } }, "additionalProperties": false, @@ -798,7 +811,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable Prisma Schema linting | Prisma Schema linting helps maintain consistent and error-free schema files | v0.10.0" + "description": "Enable Prisma Schema linting | Prisma Schema linting helps maintain consistent and error-free schema files | v0.10.1" } }, "additionalProperties": false, @@ -811,7 +824,7 @@ "enabled": { "type": "boolean", "default": true, - "description": "Enable OXC | OXC is a JavaScript/TypeScript linter written in Rust. | v0.16.5" + "description": "Enable OXC | OXC is a JavaScript/TypeScript linter written in Rust. | v0.16.10" } }, "additionalProperties": false, @@ -1120,6 +1133,37 @@ "path_instructions": [] }, "description": "Settings related to the generation of docstrings." + }, + "unit_tests": { + "type": "object", + "properties": { + "path_instructions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "File path glob pattern. Example: **/*.js" + }, + "instructions": { + "type": "string", + "maxLength": 20000, + "description": "Provides additional guidelines for unit test generation based on file paths." + } + }, + "required": ["path", "instructions"], + "additionalProperties": false + }, + "default": [], + "description": "Unit Test Generation | Provide additional guidelines for unit test generation based on file paths." + } + }, + "additionalProperties": false, + "default": { + "path_instructions": [] + }, + "description": "Settings related to the generation of unit tests." } }, "additionalProperties": false, From 7042a8ad2faf2d0933c4278fb524058546a60237 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Mon, 19 May 2025 14:47:32 -0400 Subject: [PATCH 42/48] Split the tools page into explainer and reference pages (#325) Split the tools page into seaprate explainer and references pages. Fixes #305. --- docs/tools/list.md | 74 +++++++++++++++++++++++++++++++++++++++++++++ docs/tools/tools.md | 70 +++--------------------------------------- sidebars.ts | 1 + 3 files changed, 80 insertions(+), 65 deletions(-) create mode 100644 docs/tools/list.md diff --git a/docs/tools/list.md b/docs/tools/list.md new file mode 100644 index 00000000..65f9d12d --- /dev/null +++ b/docs/tools/list.md @@ -0,0 +1,74 @@ +--- +title: List of supported tools +description: Overview of CodeRabbit's supported linters and security analysis tools +--- + +This is a list of the third-party open-source linters and security analysis tools that CodeRabbit uses to generate code reviews. + +For more information about fine-tuning the CodeRabbit configuration of a tool, click that tool's name in the following list. + +For an overview of how CodeRabbit uses these tools when generating code reviews, as well as general information about controlling their use, see [Configure third-party tools](/tools/). + +| Technology | Tools | Category | +| :-------------------------- | :--------------------------------------------------------- | :-------------------------------------------------- | +| All | [Gitleaks][Gitleaks], [Pipeline Remediation][Pipeline] | Code Security, CI/CD | +| Azure DevOps Pipelines | [Pipeline Remediation][Pipeline] | CI/CD Failure Remediation | +| CircleCI | [CircleCI][CircleCI], [Pipeline Remediation][Pipeline] | Configuration Validation, CI/CD Failure Remediation | +| CloudFormation | [Checkov][Checkov] | Code Security | +| Cppcheck | [Cppcheck][Cppcheck] | Code Quality | +| CSS | [Biome][Biome] | Code Quality | +| Docker | [Hadolint][Hadolint], [Checkov][Checkov] | Code Quality, Code Security | +| GitHub Actions | [actionlint][actionlint], [Pipeline Remediation][Pipeline] | Code Quality, CI/CD Failure Remediation | +| GitLab Pipelines | [Pipeline Remediation][Pipeline] | CI/CD Failure Remediation | +| Go | [golangci-lint][golangci-lint] | Code Quality | +| Helm | [Checkov][Checkov] | Code Security | +| Javascript | [Biome][Biome], [oxlint][oxlint] | Code Quality | +| JSON, JSONC | [Biome][Biome] | Code Quality | +| JSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | +| Kotlin | [detekt][detekt] | Code Quality | +| Kubernetes | [Checkov][Checkov] | Code Security | +| Markdown | [markdownlint][markdownlint], [LanguageTool][LanguageTool] | Code Quality, Grammar Checking | +| PHP | [PHPStan][PHPStan] | Code Quality | +| Plaintext | [LanguageTool][LanguageTool] | Grammar and Spell Checking | +| Java | [PMD][PMD] | Code Quality | +| Protobuf | [Buf][Buf] | Code Quality | +| Python | [Ruff][Ruff] | Code Quality | +| Regal | [Regal][Regal] | Code Quality | +| Ruby | [RuboCop][RuboCop] | Code Quality | +| Semgrep | [Semgrep][Semgrep] | Code Security | +| Shell (sh, bash, ksh, dash) | [ShellCheck][ShellCheck] | Code Quality | +| Shopify | [Shopify CLI][ShopifyCLI] | Code Quality | +| SQL | [SQLFluff][SQLFluff] | Code Quality | +| Swift | [SwiftLint][SwiftLint] | Code Quality | +| Terraform | [Checkov][Checkov] | Code Security | +| TSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | +| Typescript | [Biome][Biome], [oxlint][oxlint] | Code Quality | +| YAML | [YAMLlint][YAMLlint] | Code Quality | +| Prisma | [Prisma Lint][PrismaLint] | Code Quality | + +[ShellCheck]: /tools/shellcheck.md +[SQLFluff]: /tools/sqlfluff.md +[Ruff]: /tools/ruff.md +[markdownlint]: /tools/markdownlint.md +[LanguageTool]: /tools/languagetool.md +[Biome]: /tools/biome.md +[Hadolint]: /tools/hadolint.md +[SwiftLint]: /tools/swiftlint.md +[PHPStan]: /tools/phpstan.md +[golangci-lint]: /tools/golangci-lint.md +[YAMLlint]: /tools/yamllint.md +[Gitleaks]: /tools/gitleaks.md +[Checkov]: /tools/checkov.md +[detekt]: /tools/detekt.md +[RuboCop]: /tools/rubocop.md +[Buf]: /tools/buf.md +[actionlint]: /tools/actionlint.md +[Regal]: /tools/regal.md +[PMD]: /tools/pmd.md +[Cppcheck]: /tools/cppcheck.md +[CircleCI]: /tools/circleci.md +[Semgrep]: /tools/semgrep.md +[Pipeline]: /tools/pipeline-remediation.md +[PrismaLint]: /tools/prisma-lint.md +[oxlint]: /tools/oxlint.md +[ShopifyCLI]: /tools/shopify-cli.md diff --git a/docs/tools/tools.md b/docs/tools/tools.md index 113c2fee..45b376c5 100644 --- a/docs/tools/tools.md +++ b/docs/tools/tools.md @@ -3,6 +3,8 @@ title: Configure third-party tool use description: Overview of CodeRabbit's supported linters and security analysis tools. --- +This page provides an overview of how CodeRabbit uses third-party open-source tools to deliver its multifaceted code reviews. For a complete list of supported tools, see [Supported tools](/tools/list). + ```mdx-code-block import ProPlanNotice from '@site/src/components/ProPlanNotice.mdx'; @@ -40,68 +42,6 @@ Remove extraneous f prefix (F541) ``` -## Supported Tools - -| Technology | Tools | Category | -| :-------------------------- | :--------------------------------------------------------- | :-------------------------------------------------- | -| All | [Gitleaks][Gitleaks], [Pipeline Remediation][Pipeline] | Code Security, CI/CD | -| Azure DevOps Pipelines | [Pipeline Remediation][Pipeline] | CI/CD Failure Remediation | -| CircleCI | [CircleCI][CircleCI], [Pipeline Remediation][Pipeline] | Configuration Validation, CI/CD Failure Remediation | -| CloudFormation | [Checkov][Checkov] | Code Security | -| Cppcheck | [Cppcheck][Cppcheck] | Code Quality | -| CSS | [Biome][Biome] | Code Quality | -| Docker | [Hadolint][Hadolint], [Checkov][Checkov] | Code Quality, Code Security | -| GitHub Actions | [actionlint][actionlint], [Pipeline Remediation][Pipeline] | Code Quality, CI/CD Failure Remediation | -| GitLab Pipelines | [Pipeline Remediation][Pipeline] | CI/CD Failure Remediation | -| Go | [golangci-lint][golangci-lint] | Code Quality | -| Helm | [Checkov][Checkov] | Code Security | -| Javascript | [Biome][Biome], [oxlint][oxlint] | Code Quality | -| JSON, JSONC | [Biome][Biome] | Code Quality | -| JSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | -| Kotlin | [detekt][detekt] | Code Quality | -| Kubernetes | [Checkov][Checkov] | Code Security | -| Markdown | [markdownlint][markdownlint], [LanguageTool][LanguageTool] | Code Quality, Grammar Checking | -| PHP | [PHPStan][PHPStan] | Code Quality | -| Plaintext | [LanguageTool][LanguageTool] | Grammar and Spell Checking | -| Java | [PMD][PMD] | Code Quality | -| Protobuf | [Buf][Buf] | Code Quality | -| Python | [Ruff][Ruff] | Code Quality | -| Regal | [Regal][Regal] | Code Quality | -| Ruby | [RuboCop][RuboCop] | Code Quality | -| Semgrep | [Semgrep][Semgrep] | Code Security | -| Shell (sh, bash, ksh, dash) | [ShellCheck][ShellCheck] | Code Quality | -| Shopify | [Shopify CLI][ShopifyCLI] | Code Quality | -| SQL | [SQLFluff][SQLFluff] | Code Quality | -| Swift | [SwiftLint][SwiftLint] | Code Quality | -| Terraform | [Checkov][Checkov] | Code Security | -| TSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | -| Typescript | [Biome][Biome], [oxlint][oxlint] | Code Quality | -| YAML | [YAMLlint][YAMLlint] | Code Quality | -| Prisma | [Prisma Lint][PrismaLint] | Code Quality | - -[ShellCheck]: ./shellcheck.md -[SQLFluff]: ./sqlfluff.md -[Ruff]: ./ruff.md -[markdownlint]: ./markdownlint.md -[LanguageTool]: ./languagetool.md -[Biome]: ./biome.md -[Hadolint]: ./hadolint.md -[SwiftLint]: ./swiftlint.md -[PHPStan]: ./phpstan.md -[golangci-lint]: ./golangci-lint.md -[YAMLlint]: ./yamllint.md -[Gitleaks]: ./gitleaks.md -[Checkov]: ./checkov.md -[detekt]: ./detekt.md -[RuboCop]: ./rubocop.md -[Buf]: ./buf.md -[actionlint]: ./actionlint.md -[Regal]: ./regal.md -[PMD]: ./pmd.md -[Cppcheck]: ./cppcheck.md -[CircleCI]: ./circleci.md -[Semgrep]: ./semgrep.md -[Pipeline]: ./pipeline-remediation.md -[PrismaLint]: ./prisma-lint.md -[oxlint]: ./oxlint.md -[ShopifyCLI]: ./shopify-cli.md +## What's next + +- For a complete list of tools that CodeRabbit supports, see [Supported tools](/tools/list). diff --git a/sidebars.ts b/sidebars.ts index 4e1e68d3..801435c8 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -145,6 +145,7 @@ const sidebars: SidebarsConfig = { label: "Supported tools", collapsed: true, items: [ + "tools/list", "tools/actionlint", "tools/biome", "tools/buf", From 7ca9e0b8906ea769de342fdc6b66d85a0fc05024 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 19:37:16 +0000 Subject: [PATCH 43/48] Update schema.v2.json --- static/schema/schema.v2.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/static/schema/schema.v2.json b/static/schema/schema.v2.json index 8dba06ac..66ccd0a5 100644 --- a/static/schema/schema.v2.json +++ b/static/schema/schema.v2.json @@ -843,6 +843,19 @@ "additionalProperties": false, "default": {}, "description": "Configuration for Shopify Theme Check to ensure theme quality and best practices" + }, + "luacheck": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable Lua code linting | Luacheck helps maintain consistent and error-free Lua code | v1.2.0" + } + }, + "additionalProperties": false, + "default": {}, + "description": "Configuration for Lua code linting to ensure code quality" } }, "additionalProperties": false, From b0fdbf04656a7017d5519ce76b9b397bbbd9f64f Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Mon, 19 May 2025 16:36:58 -0400 Subject: [PATCH 44/48] Feat/luacheck (#349) * adding luacheck * update changelog * enhanced * add sidebar --- docs/changelog.md | 6 ++++++ docs/tools/list.md | 2 ++ docs/tools/luacheck.md | 49 ++++++++++++++++++++++++++++++++++++++++++ sidebars.ts | 1 + 4 files changed, 58 insertions(+) create mode 100644 docs/tools/luacheck.md diff --git a/docs/changelog.md b/docs/changelog.md index 24e903ff..9fe3847d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ description: The latest updates and changes to CodeRabbit. sidebar_position: 13 --- +## May 19, 2025 + +### Lua Support with Luacheck + +We're excited to announce enhanced support for Lua code analysis with [Luacheck](https://github.com/mpeterv/luacheck), a powerful static analyzer and linter for Lua code. + ## April 19, 2025 ### Docstring Path Instructions diff --git a/docs/tools/list.md b/docs/tools/list.md index 65f9d12d..d85b4c78 100644 --- a/docs/tools/list.md +++ b/docs/tools/list.md @@ -27,6 +27,7 @@ For an overview of how CodeRabbit uses these tools when generating code reviews, | JSX | [Biome][Biome], [oxlint][oxlint] | Code Quality | | Kotlin | [detekt][detekt] | Code Quality | | Kubernetes | [Checkov][Checkov] | Code Security | +| Lua | [Luacheck][Luacheck] | Code Quality | | Markdown | [markdownlint][markdownlint], [LanguageTool][LanguageTool] | Code Quality, Grammar Checking | | PHP | [PHPStan][PHPStan] | Code Quality | | Plaintext | [LanguageTool][LanguageTool] | Grammar and Spell Checking | @@ -72,3 +73,4 @@ For an overview of how CodeRabbit uses these tools when generating code reviews, [PrismaLint]: /tools/prisma-lint.md [oxlint]: /tools/oxlint.md [ShopifyCLI]: /tools/shopify-cli.md +[Luacheck]: /tools/luacheck.md diff --git a/docs/tools/luacheck.md b/docs/tools/luacheck.md new file mode 100644 index 00000000..3a8414b6 --- /dev/null +++ b/docs/tools/luacheck.md @@ -0,0 +1,49 @@ +--- +title: Luacheck +sidebar_label: Luacheck +description: CodeRabbit's guide to Luacheck. +--- + +```mdx-code-block +import ProPlanNotice from '@site/src/components/ProPlanNotice.mdx'; + + +``` + +[Luacheck](https://github.com/mpeterv/luacheck) is a static analyzer and linter for Lua code that detects various issues such as undefined global variables, unused variables and values, accessing uninitialized variables, unreachable code, and more. + +## Supported Files + +Luacheck will run on files with the following extensions: + +- `.lua` + +## Configuration + +Luacheck supports the following configuration files: + +- `.luacheckrc` +- `luacheckrc` +- `.luacheckrc.lua` +- `luacheckrc.lua` + +:::note + +Luacheck does not require configuration to run. If no configuration file is found, it will use default settings. + +::: + +## Features + +Luacheck can detect: + +- Usage of undefined global variables +- Unused variables and values +- Accessing uninitialized variables +- Unreachable code +- And many more issues + +## Links + +- [Luacheck GitHub Repository](https://github.com/mpeterv/luacheck) +- [Luacheck Documentation](https://luacheck.readthedocs.io/) diff --git a/sidebars.ts b/sidebars.ts index 801435c8..c61517d4 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -158,6 +158,7 @@ const sidebars: SidebarsConfig = { "tools/golangci-lint", "tools/hadolint", "tools/languagetool", + "tools/luacheck", "tools/markdownlint", "tools/oxlint", "tools/phpstan", From b35301746f778b7dbf99022247cebcbce29e7820 Mon Sep 17 00:00:00 2001 From: nimratcoderabbit Date: Tue, 20 May 2025 10:26:11 -0400 Subject: [PATCH 45/48] UPDATE CHANGELOG FOR VS CODE (#352) Co-authored-by: Nimrat Kaur --- docs/changelog.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 9fe3847d..6a21a8ab 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -11,6 +11,24 @@ sidebar_position: 13 We're excited to announce enhanced support for Lua code analysis with [Luacheck](https://github.com/mpeterv/luacheck), a powerful static analyzer and linter for Lua code. +## May 14, 2025 + +### CodeRabbit for VS Code, Cursor, and Windsurf Is Here 🎉 + +We're thrilled to announce that CodeRabbit's AI code reviews have officially landed inside **VS Code and all its forks, including Cursor and Windsurf!** No more review bottlenecks or context switches: now you can get _instant, inline feedback right in your editor, completely free._ + +**Why you'll love it:** + +- 📝 **Inline Code Reviews**: Senior-dev-level annotation on every line. CodeRabbit becomes your AI pair programmer, annotating staged & unstaged commits before you even open a PR. +- 🚀 **Built for Flow, Not Friction**: Code, review, commit—rise & repeat without breaking your flow state. Reviews run automatically on every commit so you ship faster. +- 🛠️ **Fix-with-AI**: One-Click Fix for quick tweaks; "Fix with AI" hands off more complex suggestions to your favorite coding agent, complete with full context. +- 🧩 **Compatible with Cursor, Windsurf & Language-Agnostic**: Works out of the box on VS Code, Cursor, Windsurf. Supports Java, JavaScript, PHP, Python, TypeScript, Go, Ruby, and more. + +Pair these IDE-embedded reviews with our deeper Git-platform reviews for a multi-layered approach that catches more bugs and cuts down overall review time. + +- [Join the launch discussion on Discord](https://discord.com/channels/1134356397673414807/1145813948193575023/1372210767838842950) +- [Install the CodeRabbit VSCode Extension](https://coderabbit.link/vscode) + ## April 19, 2025 ### Docstring Path Instructions From 57bdf564ff1c2af446ded9c5ae93b1c7df907431 Mon Sep 17 00:00:00 2001 From: Nick Busey Date: Tue, 20 May 2025 21:58:08 -0600 Subject: [PATCH 46/48] Add caching page (#353) --- docs/reference/caching.md | 20 ++++++++++++++++++++ sidebars.ts | 1 + 2 files changed, 21 insertions(+) create mode 100644 docs/reference/caching.md diff --git a/docs/reference/caching.md b/docs/reference/caching.md new file mode 100644 index 00000000..cea907c0 --- /dev/null +++ b/docs/reference/caching.md @@ -0,0 +1,20 @@ +# Caching + +CodeRabbit provides caching capabilities for code and dependencies to accelerate the review process. This feature enhances your development workflow by delivering faster feedback. + +## Security and Privacy + +- Cached data is encrypted (except for OSS projects) +- Cache expires after a maximum of one week +- Cached data is used exclusively for speeding up reviews + +## Configuration + +You can opt out of caching in two ways: + +1. **Disable Cache**: Configure `Review - Disable Cache` at either: + + - Organization level + - Repository level + +2. **Disable Data Retention**: Turn off the `Data Retention` setting in your Organization Settings to disable all data retention across your organization. diff --git a/sidebars.ts b/sidebars.ts index c61517d4..2668b5c1 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -175,6 +175,7 @@ const sidebars: SidebarsConfig = { "tools/yamllint", ], }, + "reference/caching", ], }, { From e2e308419dddcc575183abc92c05a5776765f0a1 Mon Sep 17 00:00:00 2001 From: Hasit Mistry Date: Wed, 21 May 2025 11:42:54 -0700 Subject: [PATCH 47/48] Update introduction.md to clarify Git platform integrations (#356) --- docs/overview/introduction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/overview/introduction.md b/docs/overview/introduction.md index 06150977..f937ac67 100644 --- a/docs/overview/introduction.md +++ b/docs/overview/introduction.md @@ -58,8 +58,8 @@ No matter how you tune and customize CodeRabbit, its default settings make it us CodeRabbit integrates in just a few clicks with many popular Git platforms: -- GitHub, including GitHub Enterprise Server -- GitLab, including self-managed GitLab +- GitHub, GitHub Enterprise Cloud, GitHub Enterprise Server, +- GitLab, GitLab Self-Managed - Azure DevOps - Bitbucket Cloud From d01fee9c3e1e76497e382b75c4a8ae7d825c37c7 Mon Sep 17 00:00:00 2001 From: Jason McIntosh Date: Fri, 23 May 2025 17:51:56 -0400 Subject: [PATCH 48/48] Expand and refactor the code-review docs (#355) * Split the current chat commands page into three pages: a reference page, a troubleshooting guide, and a best practices guide. Replace the chat commands page with two task-orience how-to guides, one about controlling code reviews, and one about generating improvements. Add a new overview page for the code review process. --- docs/guides/code-review-best-practices.md | 42 +++++ docs/guides/code-review-overview.md | 89 ++++++++++ docs/guides/code-review-troubleshooting.md | 17 ++ docs/guides/commands.md | 180 ++++++++++++++------- docs/guides/generate-improvements.md | 102 ++++++++++++ docs/reference/review-commands.md | 47 ++++++ sidebars.ts | 5 + 7 files changed, 422 insertions(+), 60 deletions(-) create mode 100644 docs/guides/code-review-best-practices.md create mode 100644 docs/guides/code-review-overview.md create mode 100644 docs/guides/code-review-troubleshooting.md create mode 100644 docs/guides/generate-improvements.md create mode 100644 docs/reference/review-commands.md diff --git a/docs/guides/code-review-best-practices.md b/docs/guides/code-review-best-practices.md new file mode 100644 index 00000000..83bd8abb --- /dev/null +++ b/docs/guides/code-review-best-practices.md @@ -0,0 +1,42 @@ +--- +title: Code review best practices +description: Best practices for managing CodeRabbit code reviews. +sidebar_label: Best practices +--- + +This page lists best practices for performing code reviews with CodeRabbit. + +For more information about working with +CodeRabbit through chat, see [Control and manage code reviews](/guides/commands). + +For a CodeRabbit command reference, see [Code review command reference](/reference/review-commands). + +## Recommended code-review workflow + +- Start with `@coderabbitai review` for checking new changes. +- Use `@coderabbitai full review` when major changes require a fresh perspective. +- Generate summaries after significant updates using `@coderabbitai summary`. + +## Managing large changes + +- Use `@coderabbitai pause` before making multiple commits. +- Resume reviews with `@coderabbitai resume` when ready. +- Consider `@coderabbitai full review` after substantial changes. + +## Documentation flow + +- Run `@coderabbitai generate docstrings` after finalizing function implementations. +- Learn more about [docstring generation](/finishing-touches/docstrings). + +## Overall tips + +- Commands are case-insensitive (`@coderabbitai REVIEW` works the same as `@coderabbitai review`). +- Commands can be issued by anyone with write access to the repository. +- Multiple commands can be used in sequence as needed. +- Use `@coderabbitai configuration` to export your settings before making changes. + +## Command response time + +- Most commands (pause, resume, ignore) take effect immediately. +- Review commands typically complete within a few minutes, depending on PR size. +- Docstring generation time varies based on the number of functions. diff --git a/docs/guides/code-review-overview.md b/docs/guides/code-review-overview.md new file mode 100644 index 00000000..cd511c76 --- /dev/null +++ b/docs/guides/code-review-overview.md @@ -0,0 +1,89 @@ +--- +title: Review pull requests +description: An overview of CodeRabbit's core code review features. +sidebar_label: Overview +--- + +The central feature of CodeRabbit is its ability to proactively review +new pull requests on your code repository. + +CodeRabbit reviews take the form of pull request comments that +include summaries, analyses, and initial critiques of the proposed changes. +This information, usually added to pull requests within minutes, can help your team perform more rapid, better-informed code reviews. + +The following sections present an overview of this feature. For a hands-on example that lets you experience a CodeRabbit code review using +a real repository, see [Quickstart](/getting-started/quickstart). + +## Automatically review pull requests {#review} + +After you [integrate CodeRabbit with your repository](/platforms), CodeRabbit proceeds +to automatically review every subsequent pull request, as soon as each one is created. + +CodeRabbit performs code reviews by attaching comments to the pull request. +These comments contain detailed summaries and analyses of the changes, +as well as listing out problems or areas for potential improvement that it found. + +CodeRabbit uses [a variety of open-source linters and security tools](/tools) and a custom +code verification agent to provide this analysis. CodeRabbit +also consults several models to further analyze and critique the proposed changes, +using all of the content of your repository as context. The code-review comment that CodeRabbit attaches +to your pull request synthesizes and summarizes all of the information collected from these different sources. + +For more information about the graph analysis that CodeRabbit includes with its reviews +when available, see [CodeRabbit Code Graph Analysis](/integrations/code-graph-analysis). + +### Events that trigger automated reviews {#events} + +By default, the following activity in your repository triggers CodeRabbit to +perform a code review: + +- If CodeRabbit sees a new pull request, then it immediately performs a full review + of the proposed code changes. +- If an open pull request that CodeRabbit has already reviewed gets modified with another + commit, then CodeRabbit performs an incremental review that focuses on the new commit. + +## Interact with CodeRabbit reviews {#interact} + +After CodeRabbit attaches its initial code-review comment to a pull request, you can +directly interact with CodeRabbit by mentioning its username, `@coderabbitai`, in comments +that you post to the pull request. + +These interactions can serve several purposes: + +- Free-form discussion about the pull request and the ongoing code review. +- Commands to have CodeRabbit perform specific actions regarding the code review. +- Prompts to have CodeRabbit generate its own improvements to the branch under review. + +### Chat with CodeRabbit {#chat} + +You can have open-ended, natural-language discussion with CodeRabbit during a code review, treating it +as an LLM-powered chatbot that has your entire code repository available for context. For more information, see [CodeRabbit Chat](/guides/agent_chat). + +### Manage CodeRabbit review behavior {#manage} + +CodeRabbit recognizes a variety of keyword-based commands that let you control its +behavior during a code review, including the following: + +- Pause or resume automated reviews of the pull request. +- Manually request a review, when automated reviews are paused. +- Resolve all open comments authored by CodeRabbit. + +For more information, see [Control and manage code reviews](/guides/commands). + +### Generate improvements {#generate} + +You can command CodeRabbit to generate improvements to the branch under review. +CodeRabbit accomplishes this by publishing a new branch based on the branch under review, +and creating a new pull request for your own review. + +Available code-generation commands let you request the following from CodeRabbit: + +- Implement the suggestions for improvements that CodeRabbit has made in its earlier code review comments. +- Generate inline documentation for any undocumented functions that this pull request proposes to add. + +For more information, see [Generate improvements](/guides/generate-improvements). + +## What's next {#whats-next} + +- [Control and manage code reviews](/guides/commands) +- [Generate code improvements](/guides/generate-improvements) diff --git a/docs/guides/code-review-troubleshooting.md b/docs/guides/code-review-troubleshooting.md new file mode 100644 index 00000000..72539453 --- /dev/null +++ b/docs/guides/code-review-troubleshooting.md @@ -0,0 +1,17 @@ +--- +title: Code review troubleshooting +description: Troubleshooting CodeRabbit code reviews. +sidebar_label: Troubleshooting +--- + +This page is about troubleshooting interactive code review sessions with CodeRabbit. For more information about working with +CodeRabbit through chat, see [Control and manage code reviews](/guides/commands). + +If a CodeRabbit command doesn't seem to work: + +1. Check that you have the necessary repository permissions. +2. Verify the command syntax. +3. Look for any response from CodeRabbit in the PR comments. +4. Use `@coderabbitai help` for command guidance. + +Need help? Join our community on [Discord](https://discord.gg/coderabbit) or [contact our support team](/getting-started/support). diff --git a/docs/guides/commands.md b/docs/guides/commands.md index f7cbe002..43e6283a 100644 --- a/docs/guides/commands.md +++ b/docs/guides/commands.md @@ -3,92 +3,152 @@ title: Control and manage code reviews description: Learn how to control CodeRabbit using commands in pull request comments --- -# CodeRabbit Commands +This page is about issuing direct commands to CodeRabbit during code reviews. +For a general overview of performing code reviews with CodeRabbit, see [Review pull requests](/guides/code-review-overview). -> Control your code reviews directly from pull request comments using CodeRabbit's command system. Each command starts with `@coderabbitai` followed by the specific action you want to take. +You can control CodeRabbit's behavior with a specific pull request by mentioning the +username of its bot, `@coderabbitai`, alongside keywords in comments or the pull +request description, as specified by the next sections of this page. -## Review Control Commands +For a complete CodeRabbit command reference, see [Code review command reference](/reference/review-commands). -### Managing Reviews +## Control automatic code reviews {#flow} -| Command | Description | Use Case | -| --------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------- | -| `@coderabbitai review` | Triggers an incremental review of new changes | When automatic reviews are disabled or you want to manually trigger a review | -| `@coderabbitai full review` | Performs a complete review of all files from scratch | When you want to get fresh insights on the entire PR | -| `@coderabbitai summary` | Regenerates the PR summary | When you want an updated overview after making changes | +By default, CodeRabbit automatically reviews every new pull request created in +your repository. It updates its review with comments whenever the pull request has new commits +pushed to it. -### Review Flow Control +The following sections show you how to tell CodeRabbit to modify this behavior with +a specific pull request, such as pausing reviews, or resolving open comments. -| Command | Description | Use Case | -| ---------------------- | ---------------------------------------- | --------------------------------------------------- | -| `@coderabbitai pause` | Temporarily stops reviews on the PR | When you're making multiple rapid changes | -| `@coderabbitai resume` | Restarts reviews after a pause | When you're ready for CodeRabbit to review again | -| `@coderabbitai ignore` | Permanently disables reviews for this PR | When you want to handle the review process manually | +For more information about permanently configuring the behavior of CodeRabbit on +your repository, see [Add a configuration file](/getting-started/configure-coderabbit). -### Comment Management +### Pause and resume automatic code reviews {#pause-resume} -| Command | Description | Use Case | -| ----------------------- | --------------------------------------- | ------------------------------------------------------- | -| `@coderabbitai resolve` | Resolves all CodeRabbit review comments | When you've addressed all feedback and want to clean up | +You can tell CodeRabbit to pause its automatic reviews of a pull request. If +you do, then you can still manually request CodeRabbit to review changes using +the commands listed on [Code review command reference](/reference/review-commands). -### Documentation Commands +To pause automated reviews of a pull request, post the following comment to the +pull request: -| Command | Description | Use Case | -| ----------------------------------- | -------------------------------------------- | --------------------------------------------------- | -| `@coderabbitai generate docstrings` | Generates docstrings for functions in the PR | When you need automatic documentation for your code | -| `@coderabbitai configuration` | Shows current CodeRabbit settings | When you need to check or export your configuration | +```text +@coderabbitai pause +``` -### Agentic Chat Commands +To resume automated reviews after pausing them, post the following comment to the +pull request: -| Command | Description | Use Case | -| -------------------- | ---------------------------------------------------------- | ---------------------------------------------------- | -| `@coderabbitai plan` | Get the agentic chat to plan an edit for previous comments | When you want CodeRabbit to change your code for you | +```text +@coderabbitai resume +``` -### Help & Support +### Disable automatic code reviews {#ignore} -| Command | Description | Use Case | -| -------------------- | ------------------------------------------ | ------------------------------------------ | -| `@coderabbitai help` | Displays available commands and usage info | When you need guidance on using CodeRabbit | +To disable automatic code reviews for a pull request, add the following line +anywhere in the pull request description: -## Best Practices +```text +@coderabbitai ignore +``` -### Review Workflow +As long as that text remains in the description, CodeRabbit will not +automatically review any commits associated with that pull request. +You can still [chat with CodeRabbit](/guides/agent_chat) and issue other commands in the pull +request comments. -- Start with `@coderabbitai review` for checking new changes -- Use `@coderabbitai full review` when major changes require a fresh perspective -- Generate summaries after significant updates using `@coderabbitai summary` +To enable automatic reviews on that pull request, delete "`@coderabbitai ignore`" +from the pull request description. CodeRabbit commences automatic reviews starting with +the next commit made to the branch under review. -### Managing Large Changes +## Manually request code reviews {#request} -- Use `@coderabbitai pause` before making multiple commits -- Resume reviews with `@coderabbitai resume` when ready -- Consider `@coderabbitai full review` after substantial changes +You can ask CodeRabbit to perform a code review at any time. This can be useful +when you have paused automated code reviews. Manually requested reviews have +two types: -### Documentation Flow +- A _full review_ disregards any comments that CodeRabbit has already made + on this pull request, and generates a complete review of the entire pull request. -- Run `@coderabbitai generate docstrings` after finalizing function implementations -- Learn more about [docstring generation](/finishing-touches/docstrings) +- An _incremental review_ takes all comments that CodeRabbit has made since its most recent full review into consideration, and generates a review of only the new changes. -## Tips +To manually request a full review, post the following comment to the +pull request: -- Commands are case-insensitive (`@coderabbitai REVIEW` works the same as `@coderabbitai review`) -- Commands can be issued by anyone with write access to the repository -- Multiple commands can be used in sequence as needed -- Use `@coderabbitai configuration` to export your settings before making changes +```text +@coderabbitai full review +``` -## Command Response Time +To manually request an incremental review, post the following comment to the +pull request: -- Most commands (pause, resume, ignore) take effect immediately -- Review commands typically complete within a few minutes, depending on PR size -- Docstring generation time varies based on the number of functions +```text +@coderabbitai review +``` -## Troubleshooting +## Resolve comments {#resolve} -If a command doesn't seem to work: +To have CodeRabbit mark all of its previous comments as resolved, post the following comment to the +pull request: -1. Check that you have the necessary repository permissions -2. Verify the command syntax -3. Look for any response from CodeRabbit in the PR comments -4. Use `@coderabbitai help` for command guidance +```text +@coderabbitai resolve +``` -Need help? Join our community on [Discord](https://discord.gg/coderabbit) or contact our support team. +## Update information about the pull request {#update} + +The commands in this section request CodeRabbit to generate and post updated information +about the pull request itself. + +### Update the summary text {#summary} + +To have CodeRabbit update the generated summary of the branch’s proposed changes +to the pull request’s description, post the following comment: + +```text +@coderabbitai summary +``` + +CodeRabbit updates the summary text to the description under the heading +"Summary by CodeRabbit". + +### Diagram the pull request history {#diagram} + +To have CodeRabbit post a comment that contains a sequence diagram which visualizes the +history of the pull request under review, post the following comment: + +```text +@coderabbitai generate sequence diagram +``` + +## Get information about CodeRabbit {#info} + +The commands in this section request CodeRabbit to display its own configuration +or documentation. + +### Display current configuration {#config} + +To have CodeRabbit post a comment listing out its current configuration +with your repository, post the following comment to the +pull request: + +```text +@coderabbitai configuration +``` + +### Display a quick-reference guide {#help} + +To have CodeRabbit post a comment to the pull request with a quick-reference +guide to its own commands and other features, post the following comment to the +pull request: + +```text +@coderabbitai help +``` + +## What's next {#whats-next} + +- [Generate code improvements](/guides/generate-improvements) +- [Best practices](/guides/code-review-best-practices) +- [Troubleshooting](/guides/code-review-troubleshooting) diff --git a/docs/guides/generate-improvements.md b/docs/guides/generate-improvements.md new file mode 100644 index 00000000..d194a7dd --- /dev/null +++ b/docs/guides/generate-improvements.md @@ -0,0 +1,102 @@ +--- +title: Generate improvements +description: Request coderabbit to generate its own code improvements during code reviews +--- + +```mdx-code-block +import ProPlanNotice from '@site/src/components/ProPlanNotice.mdx'; + + +``` + +This page is about using CodeRabbit to generate improvements to code under review. + +For a general overview of performing code reviews with CodeRabbit, see [Review pull requests](/guides/code-review-overview). + +## Overview of CodeRabbit code generation {#overview} + +:::note +This feature is available only on GitHub. +::: + +You can request CodeRabbit to generate improvements to a branch that it is currently reviewing. + +To do this, write out your request prompt in a comment addressed to `@coderabbitai`, +such as with the following examples: + +- `@coderabbitai Please implement the changes you suggested in your code review.` +- `@coderabbitai Add input validation with proper error messages to these new functions.` +- `@coderabbitai Break this large function into smaller, more focused methods.` + +In addition to this kind of free-form request, you can also give CodeRabbit keyword-based +commands for common code-generation requests, as described in [Code generation commands](#commands). +This includes the `plan` keyword, which acts as shorthand for the first prompt on the +previous list. + +After you give it a code-generation prompt or command, CodeRabbit delivers its suggested improvements by taking these steps: + +1. CodeRabbit posts a comment or two to the pull request, detailing its improvement plans. +1. CodeRabbit publishes a new branch, based on the open pull request's branch, to the remote repository. +1. CodeRabbit opens a new pull request based on this new branch, and links to it from the original pull request. + +CodeRabbit doesn't make any further changes to the new branch or to the new pull request +after it creates them. From that point on, it's fully up to you what to do with the new, suggested-change branch. + +The best practice is to effectively take ownership of the new branch for yourself, +deciding whether it's worth merging into the original pull request branch, and making +any further updates you'd like to make first. You can use comments in the new branch +to ask CodeRabbit to explain its changes, if needed, or to otherwise converse with +CodeRabbit about the suggested improvements. + +Because it's just an ordinary Git branch, the presence of the suggested-change branch +doesn't block the ongoing code review in the original pull request branch. You are +free to merge, defer, or close the suggested-change pull request that CodeRabbit made, using any method or timing that fits +your workflow. + +## Code generation commands {#commands} + +This section lists short commands that you can give CodeRabbit to have it accomplish +common code-generation tasks. For more complex tasks, you can instead write out full +prompts, as described in the previous section. + +For a complete CodeRabbit command reference, see [Code review command reference](/reference/review-commands). + +### Generate inline documentation {#docstrings} + +To have CodeRabbit generate missing documentation for function code added by +the pull request, post the following comment to the +pull request: + +```text +@coderabbitai generate docstrings +``` + +For more information about how CodeRabbit can generate inline documentation, including +the Git platforms and programming languages that this feature supports, see +[Docstrings](/finishing-touches/docstrings). + +### Generate solutions to open review comments {#plan} + +To have CodeRabbit generate and add a new repository branch with code improvements +that try to address its own code review comments, post the following comment to the +pull request: + +```text +@coderabbitai plan +``` + +Using this keyword is essentially shorthand for writing out a prompt like the following: + +```text +@coderabbitai Implement the changes that you suggested and apply them to this pull request. +``` + +If you want to give CodeRabbit more specific implement instructions other than a general +request to implement its own suggestions, then you can write out those instructions +as a full prompt, instead of using the one-word `plan` command. + +## What's next {#whats-next} + +- [Control and manage code reviews](/guides/commands) +- [Best practices](/guides/code-review-best-practices) +- [Troubleshooting](/guides/code-review-troubleshooting) diff --git a/docs/reference/review-commands.md b/docs/reference/review-commands.md new file mode 100644 index 00000000..011bf9d5 --- /dev/null +++ b/docs/reference/review-commands.md @@ -0,0 +1,47 @@ +--- +title: Code review commands +description: A list of commands that you can issue to CodeRabbit during code reviews. +--- + +This page lists the various commands that you can issue to CodeRabbit through +its chat interface during code reviews. For more information about working with +CodeRabbit through chat, see [Interact with CodeRabbit reviews](/guides/code-review-overview#interact). + +| Command | Description | Use Case | +| --------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------- | +| `@coderabbitai review` | Triggers an incremental review of new changes | When automatic reviews are disabled or you want to manually trigger a review | +| `@coderabbitai full review` | Performs a complete review of all files from scratch | When you want to get fresh insights on the entire PR | +| `@coderabbitai summary` | Regenerates the PR summary | When you want an updated overview after making changes | + +## Code review flow control + +| Command | Description | Use Case | +| ---------------------- | ---------------------------------------- | --------------------------------------------------- | +| `@coderabbitai pause` | Temporarily stops reviews on the PR | When you're making multiple rapid changes | +| `@coderabbitai resume` | Restarts reviews after a pause | When you're ready for CodeRabbit to review again | +| `@coderabbitai ignore` | Permanently disables reviews for this PR | When you want to handle the review process manually | + +## Comment management + +| Command | Description | Use Case | +| ----------------------- | --------------------------------------- | ------------------------------------------------------- | +| `@coderabbitai resolve` | Resolves all CodeRabbit review comments | When you've addressed all feedback and want to clean up | + +## Documentation commands + +| Command | Description | Use Case | +| ----------------------------------- | -------------------------------------------- | --------------------------------------------------- | +| `@coderabbitai generate docstrings` | Generates docstrings for functions in the PR | When you need automatic documentation for your code | +| `@coderabbitai configuration` | Shows current CodeRabbit settings | When you need to check or export your configuration | + +## Agentic chat commands + +| Command | Description | Use Case | +| -------------------- | ---------------------------------------------------------- | ---------------------------------------------------- | +| `@coderabbitai plan` | Get the agentic chat to plan an edit for previous comments | When you want CodeRabbit to change your code for you | + +## Help and support + +| Command | Description | Use Case | +| -------------------- | ------------------------------------------ | ------------------------------------------ | +| `@coderabbitai help` | Displays available commands and usage info | When you need guidance on using CodeRabbit | diff --git a/sidebars.ts b/sidebars.ts index 2668b5c1..210e385d 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -84,7 +84,11 @@ const sidebars: SidebarsConfig = { collapsed: true, label: "Review pull requests", items: [ + "guides/code-review-overview", "guides/commands", + "guides/generate-improvements", + "guides/code-review-best-practices", + "guides/code-review-troubleshooting", "guides/agent_chat", { type: "category", @@ -140,6 +144,7 @@ const sidebars: SidebarsConfig = { label: "CodeRabbit API", href: "https://api.coderabbit.ai/api/swagger/", }, + "reference/review-commands", { type: "category", label: "Supported tools",