feat(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam
, '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(web): add GET /api/diff endpoint - #1063

Merged
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833
Mar 31, 2026
Merged

feat(web): add GET /api/diff endpoint#1063
brendan-kellam merged 6 commits into
mainfrom
brendan/feat-diff-api-SOU-833

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds GET /api/diff?repo=...&base=...&head=... endpoint that returns a structured diff between two git refs using a two-dot comparison
  • Diff response includes per-file oldPath/newPath and structured hunks with oldRange, newRange, heading, and body
  • Adds OpenAPI documentation with descriptions for all request and response fields under a new Git tag

Closes SOU-833

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added GET /api/diff endpoint returning structured diffs between two git refs (query: repo, base, head). Response includes files with old/new paths and hunks (ranges, optional heading, diff body).
    • Client surface updated to expose the diff API.
  • Documentation

    • Public API docs updated with a new "Git" tag and request/response schemas for the diff endpoint.
    • CHANGELOG updated under Unreleased.

Adds a new public API endpoint for retrieving structured diffs between two git refs. Includes OpenAPI documentation with descriptions for all request/response fields.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mintlify

mintlifyBot commented Mar 31, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
sourcebot🟢 ReadyView PreviewMar 31, 2026, 12:40 AM

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Mar 31, 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: cc87f117-e774-455b-b34e-026e8ba80084

📥 Commits

Reviewing files that changed from the base of the PR and between 38a49bc and 09da785.

📒 Files selected for processing (2)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts

Walkthrough

Adds a new public GET /api/diff endpoint: OpenAPI docs and schemas, a Next.js API route, Zod request/response schemas, a service implementation that runs git diff and parses output into structured file/hunk objects, and a changelog entry. (27 words)

Changes

Cohort / File(s)Summary
Changelog & OpenAPI spec
CHANGELOG.md, docs/api-reference/sourcebot-public.openapi.json
Changelog entry added; OpenAPI spec updated: new Git tag, GET /api/diff path, PublicGetDiffResponse schema, and renamed security schemes.
API Route
packages/web/src/app/api/(server)/diff/route.ts
New Next.js route exporting GET handler that validates query params and delegates to getDiff, returning JSON or service error responses.
Service implementation
packages/web/src/features/git/getDiffApi.ts
New getDiff function: validate refs, lookup repo, run git diff in repo cwd, map git errors to service errors, parse raw diff into file/hunk structures and return typed result.
Schemas (Zod)
packages/web/src/features/git/schemas.ts
Added getDiffRequestSchema and getDiffResponseSchema with nested file/hunk schemas describing ranges, headings, and diff body.
OpenAPI wrappers & registry
packages/web/src/openapi/publicApiSchemas.ts, packages/web/src/openapi/publicApiDocument.ts
Added OpenAPI-wrapped request/response schemas and registered GET /api/diff (operationId getDiff) under new Git tag; security scheme keys adjusted.
Module export
packages/web/src/features/git/index.ts
Re-exported new getDiff API exports from the git barrel module.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as API Route Handler
participant Service as getDiff Service
participant DB as Database
participant Git as Git Process
participant Parser as parse-diff
Client->>RouteHandler: GET /api/diff?repo=R&base=B&head=H
RouteHandler->>RouteHandler: Validate query (Zod)
alt invalid params
RouteHandler->>Client: 400 ServiceError
else
RouteHandler->>Service: getDiff({repo:R, base:B, head:H})
Service->>Service: Validate refs
alt invalid refs
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>DB: find repo by name/org
alt repo not found
Service->>RouteHandler: notFound error
RouteHandler->>Client: 404 ServiceError
else
Service->>Git: git diff B H (cwd repo)
Git->>Service: raw diff text / error
alt git error (bad/unknown rev)
Service->>RouteHandler: invalidGitRef error
RouteHandler->>Client: 400 ServiceError
else
Service->>Parser: parse raw diff
Parser->>Service: structured files & hunks
Service->>RouteHandler: GetDiffResult
RouteHandler->>Client: 200 JSON(GetDiffResult)
end
end
end
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat(web): add GET /api/diff endpoint' accurately and concisely describes the main change—adding a new GET /api/diff endpoint.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/feat-diff-api-SOU-833

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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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.

🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/diff/route.ts (1)

8-12: Consider reusing the existing request schema.

This local schema duplicates getDiffRequestSchema from @/features/git/schemas.ts. Reusing the existing schema would ensure consistency and reduce maintenance burden.

♻️ Proposed refactor
-import { z } from "zod";+import { getDiffRequestSchema } from "@/features/git/schemas";-const getDiffQueryParamsSchema = z.object({- repo: z.string(),- base: z.string(),- head: z.string(),-});+const getDiffQueryParamsSchema = getDiffRequestSchema;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/app/api/`(server)/diff/route.ts around lines 8 - 12, The
local duplicate schema getDiffQueryParamsSchema should be removed and the
existing getDiffRequestSchema reused: import getDiffRequestSchema from the
module that defines it, replace usages of getDiffQueryParamsSchema with
getDiffRequestSchema (or derive from it if you only need a subset), and update
any parsing/validation calls to call getDiffRequestSchema.parse(...) (or
.partial/.pick if needed) so the code uses the single shared schema rather than
duplicating validation logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/web/src/app/api/`(server)/diff/route.ts:
- Around line 8-12: The local duplicate schema getDiffQueryParamsSchema should
be removed and the existing getDiffRequestSchema reused: import
getDiffRequestSchema from the module that defines it, replace usages of
getDiffQueryParamsSchema with getDiffRequestSchema (or derive from it if you
only need a subset), and update any parsing/validation calls to call
getDiffRequestSchema.parse(...) (or .partial/.pick if needed) so the code uses
the single shared schema rather than duplicating validation logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14fe17ce-9836-47ea-8387-f376e74fea20

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa86ff and 60ba90e.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/app/api/(server)/diff/route.ts
  • packages/web/src/features/git/getDiffApi.ts
  • packages/web/src/features/git/index.ts
  • packages/web/src/features/git/schemas.ts
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts

@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: 1

🤖 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/openapi/publicApiDocument.ts`:
- Around line 247-265: The new OpenAPI path registered via registry.registerPath
for path '/api/diff' is missing an operationId; add a unique operationId (e.g.,
'getDiff' or 'getDiffBetweenCommits') to the object passed into
registry.registerPath so it matches other endpoints and enables codegen and
clearer docs—update the registration for the '/api/diff' endpoint to include
operationId alongside method, path, tags, summary, request, and responses.
🪄 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: 23d0f39d-5ed4-4c5a-b5a8-08854f01a31d

📥 Commits

Reviewing files that changed from the base of the PR and between 60ba90e and 81388ac.

📒 Files selected for processing (3)
  • docs/api-reference/sourcebot-public.openapi.json
  • packages/web/src/openapi/publicApiDocument.ts
  • packages/web/src/openapi/publicApiSchemas.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/api-reference/sourcebot-public.openapi.json

Comment threadpackages/web/src/openapi/publicApiDocument.ts
@brendan-kellam
brendan-kellam merged commit f8e21d6 into mainMar 31, 2026
7 checks passed
@brendan-kellam
brendan-kellam deleted the brendan/feat-diff-api-SOU-833 branch March 31, 2026 19:17
@github-actionsgithub-actionsBot mentioned this pull request Mar 31, 2026
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 29, 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.

1 participant

@brendan-kellam