From f25055e9b688617154c8080288484d9e4ec9f7c7 Mon Sep 17 00:00:00 2001 From: Howon Lee Date: Mon, 7 Apr 2025 17:12:36 -0700 Subject: [PATCH 1/5] adding it --- docs/integrations/code-graph.md | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 docs/integrations/code-graph.md diff --git a/docs/integrations/code-graph.md b/docs/integrations/code-graph.md new file mode 100644 index 00000000..d0c2cf18 --- /dev/null +++ b/docs/integrations/code-graph.md @@ -0,0 +1,57 @@ +# CodeRabbit Code Graph + +## What is Code Graph? + +Code Graph is an intelligent code analysis feature that enhances your code reviews by automatically mapping relationships between files in your codebase. By +understanding how your code connects and interacts, Code Graph provides concrete snippets of context that makes reviews more effective and insightful. + +## How Code Graph Enhances Your Reviews + +When reviewing code with CodeRabbit, Code Graph automatically: + +- **Maps symbol definitions and references** across your entire codebase +- **Analyzes commit history** to identify files that frequently change together +- **Builds relationship graphs** showing how different parts of your code connect +- **Enriches reviews with contextual information** about related code + +## Key Features + +### Three Types of Contextual Information + +Code Graph adds three powerful layers of context to your reviews: + +1. **Definition Files**: Files containing definitions that are referenced in the current code +2. **Reference Files**: Files that reference symbols defined in the current code +3. **Related Files**: Files that appear related based on usage patterns and commit history + +### Language Support + +Code Graph works with: + +- Bash +- C +- C# +- C++ +- CSS +- Elixir +- Go +- Java +- JavaScript +- Kotlin +- Lua +- PHP +- Python +- Ruby +- Rust +- Scala +- Swift +- TSX +- TypeScript + +## Availability + +Code Graph is available on the Lite tier and above. + +--- + +Learn more about CodeRabbit's advanced features at [coderabbit.ai](https://coderabbit.ai) From 2d7fd3e24e66e006bfeb2486193b45f894fea564 Mon Sep 17 00:00:00 2001 From: Howon Lee Date: Mon, 7 Apr 2025 17:14:01 -0700 Subject: [PATCH 2/5] thinking --- docs/integrations/code-graph.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/integrations/code-graph.md b/docs/integrations/code-graph.md index d0c2cf18..f86fdab2 100644 --- a/docs/integrations/code-graph.md +++ b/docs/integrations/code-graph.md @@ -1,3 +1,10 @@ +--- +title: Code Graph +description: Learn about CodeRabbit's intelligent graph-based code analysis. +sidebar_label: Code Graph +sidebar_position: 6 +--- + # CodeRabbit Code Graph ## What is Code Graph? From 6bc9112f5ca02d4c90d75cb08a767998eb212f85 Mon Sep 17 00:00:00 2001 From: Howon Lee Date: Tue, 8 Apr 2025 09:08:15 -0700 Subject: [PATCH 3/5] cga --- .../{code-graph.md => code-graph-analysis.md} | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) rename docs/integrations/{code-graph.md => code-graph-analysis.md} (61%) diff --git a/docs/integrations/code-graph.md b/docs/integrations/code-graph-analysis.md similarity index 61% rename from docs/integrations/code-graph.md rename to docs/integrations/code-graph-analysis.md index f86fdab2..dd0bd582 100644 --- a/docs/integrations/code-graph.md +++ b/docs/integrations/code-graph-analysis.md @@ -1,31 +1,33 @@ --- -title: Code Graph +title: Code Graph Analysis description: Learn about CodeRabbit's intelligent graph-based code analysis. -sidebar_label: Code Graph +sidebar_label: Code Graph Analysis sidebar_position: 6 --- -# CodeRabbit Code Graph +# CodeRabbit Code Graph Analysis -## What is Code Graph? +## What is Code Graph Analysis? -Code Graph is an intelligent code analysis feature that enhances your code reviews by automatically mapping relationships between files in your codebase. By +Code Graph Analysis is an intelligent code analysis feature that enhances your code reviews by automatically mapping relationships between files in your codebase. By understanding how your code connects and interacts, Code Graph provides concrete snippets of context that makes reviews more effective and insightful. -## How Code Graph Enhances Your Reviews +## How Code Graph Analysis Enhances Your Reviews -When reviewing code with CodeRabbit, Code Graph automatically: +When reviewing code with CodeRabbit, Code Graph Analysis automatically: - **Maps symbol definitions and references** across your entire codebase - **Analyzes commit history** to identify files that frequently change together - **Builds relationship graphs** showing how different parts of your code connect - **Enriches reviews with contextual information** about related code +Code Graph Analysis is also available in the CodeRabbit Chat. CodeRabbit Chat will automatically analyze your codebase with it when the agent deems it necessary. + ## Key Features ### Three Types of Contextual Information -Code Graph adds three powerful layers of context to your reviews: +Code Graph Analysis adds three powerful layers of context to your reviews: 1. **Definition Files**: Files containing definitions that are referenced in the current code 2. **Reference Files**: Files that reference symbols defined in the current code @@ -33,7 +35,7 @@ Code Graph adds three powerful layers of context to your reviews: ### Language Support -Code Graph works with: +Code Graph Analysis works with: - Bash - C @@ -57,7 +59,7 @@ Code Graph works with: ## Availability -Code Graph is available on the Lite tier and above. +Code Graph Analysis is available on the Lite tier and above. --- From 40d4085bb9f29c07cb76720ccd7a6c4cdbf896cb Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Tue, 8 Apr 2025 09:41:51 -0400 Subject: [PATCH 4/5] oxc and prisma-lint changelog (#270) add files and changelog --- docs/changelog.md | 11 +++++++++++ docs/tools/oxc.md | 46 +++++++++++++++++++++++++++++++++++++++++++++ docs/tools/tools.md | 9 +++++---- 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 docs/tools/oxc.md diff --git a/docs/changelog.md b/docs/changelog.md index 7c455f3e..1218e4f9 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,17 @@ description: The latest updates and changes to CodeRabbit. sidebar_position: 13 --- +## April 8, 2025 + +### New Static Analysis Tools + +We've expanded our static analysis capabilities with two new tools: + +- **OXC**: 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/tools) for more details. + ## April 1, 2025 ### Code Graph Analysis diff --git a/docs/tools/oxc.md b/docs/tools/oxc.md new file mode 100644 index 00000000..ac01dfe0 --- /dev/null +++ b/docs/tools/oxc.md @@ -0,0 +1,46 @@ +--- +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/tools.md b/docs/tools/tools.md index a700825f..71651f3a 100644 --- a/docs/tools/tools.md +++ b/docs/tools/tools.md @@ -55,9 +55,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] | Code Quality | +| Javascript | [Biome][Biome], [OXC][OXC] | Code Quality | | JSON, JSONC | [Biome][Biome] | Code Quality | -| JSX | [Biome][Biome] | Code Quality | +| JSX | [Biome][Biome], [OXC][OXC] | Code Quality | | Kotlin | [detekt][detekt] | Code Quality | | Kubernetes | [Checkov][Checkov] | Code Security | | Markdown | [markdownlint][markdownlint], [LanguageTool][LanguageTool] | Code Quality, Grammar Checking | @@ -73,8 +73,8 @@ Remove extraneous f prefix | SQL | [SQLFluff][SQLFluff] | Code Quality | | Swift | [SwiftLint][SwiftLint] | Code Quality | | Terraform | [Checkov][Checkov] | Code Security | -| TSX | [Biome][Biome] | Code Quality | -| Typescript | [Biome][Biome] | Code Quality | +| TSX | [Biome][Biome], [OXC][OXC] | Code Quality | +| Typescript | [Biome][Biome], [OXC][OXC] | Code Quality | | YAML | [YAMLlint][YAMLlint] | Code Quality | | Prisma | [Prisma Lint][PrismaLint] | Code Quality | @@ -102,3 +102,4 @@ Remove extraneous f prefix [Semgrep]: ./semgrep.md [Pipeline]: ./pipeline-remediation.md [PrismaLint]: ./prisma-lint.md +[OXC]: ./oxc.md From f53d3ddcacb5daf3e6836d619d0bfdc5d6e202e8 Mon Sep 17 00:00:00 2001 From: alexcoderabbitai Date: Tue, 8 Apr 2025 10:13:10 -0400 Subject: [PATCH 5/5] add linked issues guide (#271) * add linked issues guide * move down * reorder * add specific information --- docs/guides/agent_chat.md | 2 +- docs/guides/commands.md | 7 ++ docs/guides/custom-reports.md | 2 +- docs/guides/issue-chat.md | 2 +- docs/guides/issue-creation.md | 2 +- docs/guides/linked-issues.md | 175 +++++++++++++++++++++++++++++ docs/guides/ondemand-reports.md | 2 +- docs/guides/review-instructions.md | 2 +- docs/guides/scheduled-reports.md | 2 +- static/img/guides/linked-issue.png | Bin 0 -> 15196 bytes 10 files changed, 189 insertions(+), 7 deletions(-) create mode 100644 docs/guides/linked-issues.md create mode 100644 static/img/guides/linked-issue.png diff --git a/docs/guides/agent_chat.md b/docs/guides/agent_chat.md index 7c50d028..40847871 100644 --- a/docs/guides/agent_chat.md +++ b/docs/guides/agent_chat.md @@ -2,7 +2,7 @@ title: Chat and Agentic Chat sidebar_label: Chat and Agentic Chat description: Learn about CodeRabbit Pro's chat and agentic chat system -sidebar_position: 8 +sidebar_position: 3 --- # CodeRabbit Chat diff --git a/docs/guides/commands.md b/docs/guides/commands.md index 82cc44e0..a2a2f70b 100644 --- a/docs/guides/commands.md +++ b/docs/guides/commands.md @@ -1,3 +1,10 @@ +--- +title: Commands +sidebar_label: Commands +description: Learn how to control CodeRabbit using commands in pull request comments +sidebar_position: 1 +--- + # CodeRabbit Commands > 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. diff --git a/docs/guides/custom-reports.md b/docs/guides/custom-reports.md index 2efbab41..30655bfb 100644 --- a/docs/guides/custom-reports.md +++ b/docs/guides/custom-reports.md @@ -2,7 +2,7 @@ title: Custom Reports sidebar_label: Custom Reports description: Learn how to create custom reports with CodeRabbit Pro's flexible reporting system -sidebar_position: 7 +sidebar_position: 8 --- ```mdx-code-block diff --git a/docs/guides/issue-chat.md b/docs/guides/issue-chat.md index 5ce44be7..a555f2c0 100644 --- a/docs/guides/issue-chat.md +++ b/docs/guides/issue-chat.md @@ -2,7 +2,7 @@ title: Issue Chat sidebar_label: Issue Chat description: Learn how to use CodeRabbit's chat capabilities within issues -sidebar_position: 10 +sidebar_position: 4 --- ```mdx-code-block diff --git a/docs/guides/issue-creation.md b/docs/guides/issue-creation.md index f3e81f1d..7c461477 100644 --- a/docs/guides/issue-creation.md +++ b/docs/guides/issue-creation.md @@ -2,7 +2,7 @@ title: Issue Creation sidebar_label: Issue Creation description: Learn how to create issues directly through CodeRabbit -sidebar_position: 9 +sidebar_position: 5 --- ```mdx-code-block diff --git a/docs/guides/linked-issues.md b/docs/guides/linked-issues.md new file mode 100644 index 00000000..3528f0a9 --- /dev/null +++ b/docs/guides/linked-issues.md @@ -0,0 +1,175 @@ +--- +title: Linked Issues +sidebar_label: Linked Issues +description: Learn how to effectively use linked issues with CodeRabbit for better pull request assessments +sidebar_position: 6 +--- + +# Linked Issues + +CodeRabbit provides intelligent assessment of linked issues to validate whether pull requests properly address their requirements. This guide explains how to effectively use linked issues and write clear issue descriptions for optimal results. + +## Understanding Linked Issues + +A linked issue is one that is explicitly referenced in your pull request description using platform-specific syntax: + +- GitHub: `fixes #123`, `closes #123`, `resolves #123` +- GitLab: `closes #123`, `fixes #123`, or full URLs +- Jira/Linear: Full URLs to tickets + +When CodeRabbit detects linked issues, it analyzes them against your pull request changes to determine if the requirements are met: + +![Linked Issue Assessment Example](/img/guides/linked-issue.png) + +## Best Practices for Issue Writing + +### Issue Titles + +Create descriptive, technical titles that clearly state the goal: + +✅ Good Examples: + +- "Add PrismaLint integration to configuration flow" +- "Fix race condition in user authentication" +- "Implement caching for GraphQL queries" + +❌ Poor Examples: + +- "Fix bug" +- "Update code" +- "Improve performance" + +### Issue Descriptions + +Write comprehensive descriptions that provide clear technical context: + +1. **Problem Statement** + + - Clearly describe what needs to be changed + - Include technical details about affected components + - Reference specific files or functions if known + +2. **Expected Solution** + - Outline the desired implementation approach + - Include code examples or pseudo-code when relevant + - List specific acceptance criteria + +Example Description: + +```markdown +Problem: +The configuration system doesn't validate Prisma schema files before deployment, +leading to potential runtime errors. + +Solution: +Integrate PrismaLint into the configuration flow to: + +- Validate schema files during PR checks +- Enforce consistent naming conventions +- Prevent common Prisma anti-patterns + +Affected Components: + +- Configuration validation pipeline +- CI/CD workflow +- Schema validation logic + +Acceptance Criteria: + +- [ ] PrismaLint runs on all PR checks +- [ ] Failed validations block merging +- [ ] Clear error messages for schema issues +``` + +### Consistent Terminology + +Use consistent terminology between issues and pull requests: + +✅ Good: + +- Use the same technical terms consistently +- Reference components with their exact names +- Maintain consistent naming patterns + +❌ Poor: + +- Mixing different terms for the same component +- Using vague or non-technical language +- Inconsistent capitalization or formatting + +## Linking Issues Effectively + +### In Pull Requests + +1. **Direct References** + + ```markdown + Fixes #123 + Resolves organization/repo#456 + Closes https://github.com/org/repo/issues/789 + ``` + +2. **Multiple Issues** + + ```markdown + This PR addresses: + + - Fixes #123 + - Closes #456 + - Resolves https://jira.company.com/browse/PROJ-789 + ``` + +### Cross-References + +For better traceability: + +1. Add PR references in issue comments +2. Use complete URLs when linking external systems +3. Maintain bidirectional links between related issues + +## How CodeRabbit Assesses Linked Issues + +CodeRabbit evaluates linked issues by: + +1. Analyzing issue titles and descriptions +2. Comparing changes in the pull request +3. Validating if requirements are met +4. Providing an assessment with: + - ✅: If the objective has been addressed in the PR. The 'Explanation' column will be left blank. + - ❌: If the objective has not been addressed in the PR. Here a brief explanation is added to the 'Explanation' column. + - ❓: If it is unclear whether the objective has been addressed. Here a brief explanation is added to the 'Explanation' column. + +:::note +Only the issue title and description are considered in the assessment. Comments and discussion threads are not currently analyzed. +::: + +## Tips for Better Assessments + +1. **Be Specific** + + - Include clear, measurable objectives + - List specific technical requirements + - Reference affected code components + +2. **Provide Context** + + - Explain why changes are needed + - Document current behavior + - Describe expected outcomes + +3. **Use Technical Details** + + - Include file paths when known + - Reference specific functions or classes + - Mention relevant technologies + +4. **Keep It Focused** + - One main objective per issue + - Clear scope boundaries + - Specific acceptance criteria + +## Related Resources + +- [Review Instructions](./review-instructions.md) +- [Issue Chat](./issue-chat.md) +- [Issue Creation](./issue-creation.md) diff --git a/docs/guides/ondemand-reports.md b/docs/guides/ondemand-reports.md index bad251f7..471dc04c 100644 --- a/docs/guides/ondemand-reports.md +++ b/docs/guides/ondemand-reports.md @@ -2,7 +2,7 @@ title: On-demand Reports sidebar_label: On-demand Reports description: CodeRabbit offers a way to generate on-demand reports using a simple API request -sidebar_position: 8 +sidebar_position: 9 --- ```mdx-code-block diff --git a/docs/guides/review-instructions.md b/docs/guides/review-instructions.md index dfb8ff70..fd2b76e8 100644 --- a/docs/guides/review-instructions.md +++ b/docs/guides/review-instructions.md @@ -5,7 +5,7 @@ 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: 3 +sidebar_position: 2 --- The guide explains how to add custom review instructions for the entire project. diff --git a/docs/guides/scheduled-reports.md b/docs/guides/scheduled-reports.md index 04bb06e6..8c56b465 100644 --- a/docs/guides/scheduled-reports.md +++ b/docs/guides/scheduled-reports.md @@ -2,7 +2,7 @@ title: Scheduled Reports sidebar_label: Scheduled Reports description: Learn how to set up automated recurring reports with CodeRabbit Pro -sidebar_position: 6 +sidebar_position: 7 --- ```mdx-code-block diff --git a/static/img/guides/linked-issue.png b/static/img/guides/linked-issue.png new file mode 100644 index 0000000000000000000000000000000000000000..ba585890858045cc655316283ce15e1bce0f7e5f GIT binary patch literal 15196 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 ZeUyhHEn{f5d0~K$l(@WDsffXs{{vx&ov#1@ literal 0 HcmV?d00001