feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: improve diff tool display and token efficiency - #1146

Merged
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad
Apr 23, 2026
Merged

feat: improve diff tool display and token efficiency#1146
brendan-kellam merged 5 commits into
mainfrom
cursor/improve-diff-tool-0aad

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

This PR implements the feedback from the Slack thread on the diff tool:

  1. Truncate SHAs to 7 characters: Full commit SHAs (40-character hashes) are now displayed as 7-character truncated versions for a more compact display
  2. Use RepoBadge component: Repository references now consistently use the RepoBadge component instead of a plain monospace span, matching the pattern used by other tools like read_file, list_commits, etc.
  3. Git-diff format output: The tool now outputs diffs in standard git-diff format instead of JSON, which is more token-efficient and better suited for LLM reasoning (as this format appears heavily in training data)
image

Changes

  • Modified getDiff.ts to format the API response into git-diff format and fetch repo info
  • Updated getDiffToolComponent.tsx to truncate SHAs and use RepoBadge
  • Added GetDiffRepoInfo type to metadata for repository information

Slack Thread

Open in WebOpen in Cursor

Summary by CodeRabbit

  • New Features

    • Diff output now formatted as git-unified diffs instead of JSON
    • Repository metadata resolution and display added to diff tool
  • Improvements

    • Commit SHA references shortened to 7 characters
    • Repository display updated with an enhanced badge component
  • Tests

    • Added tests validating Git-diff formatting and multi-hunk/file cases

- Truncate full commit SHAs to 7 characters for compact display
- Use RepoBadge component for consistent repository rendering
- Convert JSON output to git-diff format for better token efficiency
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@coderabbitai

coderabbitaiBot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83a2e127-3e0e-4ad8-9e77-56c5c2901996

📥 Commits

Reviewing files that changed from the base of the PR and between e5f89fb and 7b3c100.

📒 Files selected for processing (1)
  • CHANGELOG.md

Walkthrough

Converts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails.

Changes

Cohort / File(s)Summary
Changelog
CHANGELOG.md
Adds unreleased entry documenting SHA truncation, RepoBadge adoption, and output change from JSON to git-diff.
Diff Formatting Utility & Tests
packages/web/src/features/tools/utils.ts, packages/web/src/features/tools/utils.test.ts
New exported formatDiffAsGitDiff() converting typed diff responses to git-unified diff text; comprehensive Vitest suite verifying headers, hunks, additions, deletions, multiple files and hunk ordering.
Diff Tool Integration
packages/web/src/features/tools/getDiff.ts
get_diff now looks up repo via getRepoInfoByName(), throws if not found, includes repoInfo in returned metadata, and returns git-diff text via formatDiffAsGitDiff(). Adds GetDiffRepoInfo type and updates GetDiffMetadata.
UI Rendering
packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
Uses truncateSha for base/head, displays commit icon with truncated SHAs in mono badge, and replaces inline metadata.repo text with RepoBadge using metadata.repoInfo.

Sequence Diagram(s)

sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 25.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately captures the main objectives of the pull request: improving diff tool display (truncating SHAs, using RepoBadge) and token efficiency (switching to git-diff format).
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/improve-diff-tool-0aad

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

cursoragentand others added 2 commits April 23, 2026 17:53
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
@brendan-kellam
brendan-kellam marked this pull request as ready for review April 23, 2026 18:26

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)

71-74: Redundant null check.

getRepoInfoByName is wrapped with sew() and returns T | ServiceError — it never resolves to null/undefined. The !repoInfoResult branch is dead code; isServiceError alone is sufficient.

- if (isServiceError(repoInfoResult) || !repoInfoResult) {+ if (isServiceError(repoInfoResult)) {
throw new Error(`Repository "${repo}" not found.`);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The
null/undefined guard after calling getRepoInfoByName is redundant because
getRepoInfoByName (wrapped by sew) returns either a valid repo info or a
ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a902810e-371d-43b9-9647-19f6c727aec5

📥 Commits

Reviewing files that changed from the base of the PR and between d111397 and 8d1cb5f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsx
  • packages/web/src/features/tools/getDiff.test.ts
  • packages/web/src/features/tools/getDiff.ts

Comment threadpackages/web/src/features/tools/getDiff.test.ts Outdated
Comment threadpackages/web/src/features/tools/utils.test.ts
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
Comment threadpackages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam
brendan-kellam merged commit 0eb791b into mainApr 23, 2026
6 checks passed
@brendan-kellam
brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
@github-actionsgithub-actionsBot mentioned this pull request Apr 23, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brendan-kellam@cursoragent