Skip to content

feat: improve diff tool display and token efficiency#1146

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

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

Conversation

@brendan-kellam
Copy link
Copy Markdown
Contributor

@brendan-kellam brendan-kellam commented Apr 23, 2026

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 Web Open 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
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 23, 2026

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 name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring 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 name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The 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 ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check 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.

cursoragent and 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
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

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 thread packages/web/src/features/tools/getDiff.test.ts Outdated
Comment thread packages/web/src/features/tools/utils.test.ts
Comment thread packages/web/src/features/tools/getDiff.ts Outdated
Comment thread packages/web/src/features/tools/getDiff.ts Outdated
@brendan-kellam brendan-kellam merged commit 0eb791b into main Apr 23, 2026
6 checks passed
@brendan-kellam brendan-kellam deleted the cursor/improve-diff-tool-0aad branch April 23, 2026 18:57
Sign up for free to 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