mirror of
https://github.com/sourcebot-dev/sourcebot.git
synced 2025-12-11 20:05:25 +00:00
chore: Misc typos (UI, docs, code...), Makefile PATH with spaces (#369)
* chore: Fix misc typos (UI, docs, code...) * chore(dev): Support PATH with spaces in Makefile E.g. `Application Support` on MacOS * chore: Typos in schema v2 description * chore: more typos * chore(dev): Add _typos.toml
This commit is contained in:
parent
ee90edc46d
commit
9b13492cb3
27 changed files with 62 additions and 51 deletions
|
|
@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Fixed typos in UI, docs, code [#369](https://github.com/sourcebot-dev/sourcebot/pull/369)
|
||||||
|
|
||||||
## [4.5.1] - 2025-07-14
|
## [4.5.1] - 2025-07-14
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
6. Create a copy of `.env.development` and name it `.env.development.local`. Update the required environment variables.
|
6. Create a copy of `.env.development` and name it `.env.development.local`. Update the required environment variables.
|
||||||
|
|
||||||
7. If you're using a declerative configuration file, create a configuration file and update the `CONFIG_PATH` environment variable in your `.env.development.local` file.
|
7. If you're using a declarative configuration file, create a configuration file and update the `CONFIG_PATH` environment variable in your `.env.development.local` file.
|
||||||
|
|
||||||
8. Start Sourcebot with the command:
|
8. Start Sourcebot with the command:
|
||||||
```sh
|
```sh
|
||||||
|
|
|
||||||
2
Makefile
2
Makefile
|
|
@ -10,7 +10,7 @@ yarn:
|
||||||
zoekt:
|
zoekt:
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
go build -C vendor/zoekt -o $(PWD)/bin ./cmd/...
|
go build -C vendor/zoekt -o $(PWD)/bin ./cmd/...
|
||||||
export PATH=$(PWD)/bin:$(PATH)
|
export PATH="$(PWD)/bin:$(PATH)"
|
||||||
export CTAGS_COMMANDS=ctags
|
export CTAGS_COMMANDS=ctags
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
||||||
6
_typos.toml
Normal file
6
_typos.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[default.extend-words]
|
||||||
|
# Don't correct the surname "Do Not Exists"
|
||||||
|
dne = "dne"
|
||||||
|
|
||||||
|
[files]
|
||||||
|
extend-exclude = ["vendor/**/*", "CHANGELOG.md", "packages/web/src/lib/languageMetadata.ts"]
|
||||||
|
|
@ -27,7 +27,7 @@ To get Sourcebot to index these repositories:
|
||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
<Step title="Mount a volume">
|
<Step title="Mount a volume">
|
||||||
We need to mount a docker volume to the `repos` directory so Sourcebot can read it's contents. Sourcebot will **not** write to local repositories, so we can mount a seperate **read-only** volume:
|
We need to mount a docker volume to the `repos` directory so Sourcebot can read it's contents. Sourcebot will **not** write to local repositories, so we can mount a separate **read-only** volume:
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
docker run \
|
docker run \
|
||||||
|
|
|
||||||
|
|
@ -685,7 +685,7 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
@ -1387,7 +1387,7 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
@ -2171,7 +2171,7 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
|
||||||
|
|
@ -376,7 +376,7 @@ export const compileBitbucketConfig = async (
|
||||||
throw new Error(`No links found for ${isServer ? 'server' : 'cloud'} repo ${repoName}`);
|
throw new Error(`No links found for ${isServer ? 'server' : 'cloud'} repo ${repoName}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// In server case we get an array of lenth == 1 links in the self field, while in cloud case we get a single
|
// In server case we get an array of length == 1 links in the self field, while in cloud case we get a single
|
||||||
// link object in the html field
|
// link object in the html field
|
||||||
const link = isServer ? (repoLinks.self as { name: string, href: string }[])?.[0] : repoLinks.html as { href: string };
|
const link = isServer ? (repoLinks.self as { name: string, href: string }[])?.[0] : repoLinks.html as { href: string };
|
||||||
if (!link || !link.href) {
|
if (!link || !link.href) {
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ export class RepoManager implements IRepoManager {
|
||||||
// We can no longer use repo.cloneUrl directly since it doesn't contain the token for security reasons. As a result, we need to
|
// We can no longer use repo.cloneUrl directly since it doesn't contain the token for security reasons. As a result, we need to
|
||||||
// fetch the token here using the connections from the repo. Multiple connections could be referencing this repo, and each
|
// fetch the token here using the connections from the repo. Multiple connections could be referencing this repo, and each
|
||||||
// may have their own token. This method will just pick the first connection that has a token (if one exists) and uses that. This
|
// may have their own token. This method will just pick the first connection that has a token (if one exists) and uses that. This
|
||||||
// may technically cause syncing to fail if that connection's token just so happens to not have access to the repo it's referrencing.
|
// may technically cause syncing to fail if that connection's token just so happens to not have access to the repo it's referencing.
|
||||||
private async getCloneCredentialsForRepo(repo: RepoWithConnections, db: PrismaClient): Promise<{ username?: string, password: string } | undefined> {
|
private async getCloneCredentialsForRepo(repo: RepoWithConnections, db: PrismaClient): Promise<{ username?: string, password: string } | undefined> {
|
||||||
|
|
||||||
for (const { connection } of repo.connections) {
|
for (const { connection } of repo.connections) {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ The Sourcebot MCP server gives your LLM agents the ability to fetch code context
|
||||||
|
|
||||||
- Building custom LLM horizontal agents like like compliance auditing agents, migration agents, etc.
|
- Building custom LLM horizontal agents like like compliance auditing agents, migration agents, etc.
|
||||||
- _"Find all instances of hardcoded credentials"_
|
- _"Find all instances of hardcoded credentials"_
|
||||||
- _"Identify repositories that depend on this depreacted api"_
|
- _"Identify repositories that depend on this deprecated api"_
|
||||||
|
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
|
||||||
|
|
@ -684,7 +684,7 @@ const schema = {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
@ -1386,7 +1386,7 @@ const schema = {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
@ -2170,7 +2170,7 @@ const schema = {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
|
||||||
|
|
@ -309,7 +309,7 @@ export interface LocalConfig {
|
||||||
watch?: boolean;
|
watch?: boolean;
|
||||||
exclude?: {
|
exclude?: {
|
||||||
/**
|
/**
|
||||||
* List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.
|
* List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.
|
||||||
*/
|
*/
|
||||||
paths?: string[];
|
paths?: string[];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ This package contains shared code between the backend & webapp packages.
|
||||||
|
|
||||||
### Why two index files?
|
### Why two index files?
|
||||||
|
|
||||||
This package contains two index files: `index.server.ts` and `index.client.ts`. There is some code in this package that will only work in a Node.JS runtime (e.g., because it depends on the `fs` pacakge. Entitlements are a good example of this), and other code that is runtime agnostic (e.g., `constants.ts`). To deal with this, we these two index files export server code and client code, respectively.
|
This package contains two index files: `index.server.ts` and `index.client.ts`. There is some code in this package that will only work in a Node.JS runtime (e.g., because it depends on the `fs` package. Entitlements are a good example of this), and other code that is runtime agnostic (e.g., `constants.ts`). To deal with this, we these two index files export server code and client code, respectively.
|
||||||
|
|
||||||
For package consumers, the usage would look like the following:
|
For package consumers, the usage would look like the following:
|
||||||
- Server: `import { ... } from @sourcebot/shared`
|
- Server: `import { ... } from @sourcebot/shared`
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,7 @@ export const withOrgMembership = async <T>(userId: string, domain: string, fn: (
|
||||||
return notFound("User not a member of this organization");
|
return notFound("User not a member of this organization");
|
||||||
}
|
}
|
||||||
|
|
||||||
const getAuthorizationPrecendence = (role: OrgRole): number => {
|
const getAuthorizationPrecedence = (role: OrgRole): number => {
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case OrgRole.GUEST:
|
case OrgRole.GUEST:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -153,7 +153,7 @@ export const withOrgMembership = async <T>(userId: string, domain: string, fn: (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (getAuthorizationPrecendence(membership.role) < getAuthorizationPrecendence(minRequiredRole)) {
|
if (getAuthorizationPrecedence(membership.role) < getAuthorizationPrecedence(minRequiredRole)) {
|
||||||
return {
|
return {
|
||||||
statusCode: StatusCodes.FORBIDDEN,
|
statusCode: StatusCodes.FORBIDDEN,
|
||||||
errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS,
|
errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS,
|
||||||
|
|
@ -710,7 +710,7 @@ export const getRepoInfoByName = async (repoName: string, domain: string) => sew
|
||||||
// In this scenario, both repos will be named "github.com/sourcebot-dev/sourcebot".
|
// In this scenario, both repos will be named "github.com/sourcebot-dev/sourcebot".
|
||||||
// We will leave this as an edge case for now since it's unlikely to happen in practice.
|
// We will leave this as an edge case for now since it's unlikely to happen in practice.
|
||||||
//
|
//
|
||||||
// @v4-todo: we could add a unique contraint on repo name + orgId to help de-duplicate
|
// @v4-todo: we could add a unique constraint on repo name + orgId to help de-duplicate
|
||||||
// these cases.
|
// these cases.
|
||||||
// @see: repoCompileUtils.ts
|
// @see: repoCompileUtils.ts
|
||||||
const repo = await prisma.repo.findFirst({
|
const repo = await prisma.repo.findFirst({
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
|
|
||||||
export const getBrowseParamsFromPathParam = (pathParam: string) => {
|
export const getBrowseParamsFromPathParam = (pathParam: string) => {
|
||||||
const sentinalIndex = pathParam.search(/\/-\/(tree|blob)/);
|
const sentinelIndex = pathParam.search(/\/-\/(tree|blob)/);
|
||||||
if (sentinalIndex === -1) {
|
if (sentinelIndex === -1) {
|
||||||
throw new Error(`Invalid browse pathname: "${pathParam}" - expected to contain "/-/(tree|blob)/" pattern`);
|
throw new Error(`Invalid browse pathname: "${pathParam}" - expected to contain "/-/(tree|blob)/" pattern`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const repoAndRevisionPart = pathParam.substring(0, sentinalIndex);
|
const repoAndRevisionPart = pathParam.substring(0, sentinelIndex);
|
||||||
const lastAtIndex = repoAndRevisionPart.lastIndexOf('@');
|
const lastAtIndex = repoAndRevisionPart.lastIndexOf('@');
|
||||||
|
|
||||||
const repoName = lastAtIndex === -1 ? repoAndRevisionPart : repoAndRevisionPart.substring(0, lastAtIndex);
|
const repoName = lastAtIndex === -1 ? repoAndRevisionPart : repoAndRevisionPart.substring(0, lastAtIndex);
|
||||||
const revisionName = lastAtIndex === -1 ? undefined : repoAndRevisionPart.substring(lastAtIndex + 1);
|
const revisionName = lastAtIndex === -1 ? undefined : repoAndRevisionPart.substring(lastAtIndex + 1);
|
||||||
|
|
||||||
const { path, pathType } = ((): { path: string, pathType: 'tree' | 'blob' } => {
|
const { path, pathType } = ((): { path: string, pathType: 'tree' | 'blob' } => {
|
||||||
const path = pathParam.substring(sentinalIndex + '/-/'.length);
|
const path = pathParam.substring(sentinelIndex + '/-/'.length);
|
||||||
const pathType = path.startsWith('tree') ? 'tree' : 'blob';
|
const pathType = path.startsWith('tree') ? 'tree' : 'blob';
|
||||||
|
|
||||||
// @note: decodedURIComponent is needed here incase the path contains a space.
|
// @note: decodedURIComponent is needed here incase the path contains a space.
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ test('splitQuery groups all parts together when a quote capture group is not clo
|
||||||
expect(cursorIndex).toBe(0);
|
expect(cursorIndex).toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('splitQuery correclty locates the cursor index given the cursor position (1)', () => {
|
test('splitQuery correctly locates the cursor index given the cursor position (1)', () => {
|
||||||
const query = 'foo bar "fizz buzz"';
|
const query = 'foo bar "fizz buzz"';
|
||||||
|
|
||||||
const { queryParts: parts1, cursorIndex: index1 } = splitQuery(query, 0);
|
const { queryParts: parts1, cursorIndex: index1 } = splitQuery(query, 0);
|
||||||
|
|
@ -50,7 +50,7 @@ test('splitQuery correclty locates the cursor index given the cursor position (1
|
||||||
expect(parts3[index3]).toBe('"fizz buzz"');
|
expect(parts3[index3]).toBe('"fizz buzz"');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('splitQuery correclty locates the cursor index given the cursor position (2)', () => {
|
test('splitQuery correctly locates the cursor index given the cursor position (2)', () => {
|
||||||
const query = 'a b';
|
const query = 'a b';
|
||||||
expect(splitQuery(query, 0).cursorIndex).toBe(0);
|
expect(splitQuery(query, 0).cursorIndex).toBe(0);
|
||||||
expect(splitQuery(query, 1).cursorIndex).toBe(0);
|
expect(splitQuery(query, 1).cursorIndex).toBe(0);
|
||||||
|
|
|
||||||
|
|
@ -438,7 +438,7 @@ export { SearchSuggestionsBox };
|
||||||
|
|
||||||
export const splitQuery = (query: string, cursorPos: number) => {
|
export const splitQuery = (query: string, cursorPos: number) => {
|
||||||
const queryParts = [];
|
const queryParts = [];
|
||||||
const seperator = " ";
|
const separator = " ";
|
||||||
let cursorIndex = 0;
|
let cursorIndex = 0;
|
||||||
let accumulator = "";
|
let accumulator = "";
|
||||||
let isInQuoteCapture = false;
|
let isInQuoteCapture = false;
|
||||||
|
|
@ -452,7 +452,7 @@ export const splitQuery = (query: string, cursorPos: number) => {
|
||||||
isInQuoteCapture = !isInQuoteCapture;
|
isInQuoteCapture = !isInQuoteCapture;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isInQuoteCapture && query[i] === seperator) {
|
if (!isInQuoteCapture && query[i] === separator) {
|
||||||
queryParts.push(accumulator);
|
queryParts.push(accumulator);
|
||||||
accumulator = "";
|
accumulator = "";
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ export const useSuggestionModeAndQuery = ({
|
||||||
const suggestionModeMappings = useSuggestionModeMappings();
|
const suggestionModeMappings = useSuggestionModeMappings();
|
||||||
|
|
||||||
const { suggestionQuery, suggestionMode } = useMemo<{ suggestionQuery: string, suggestionMode: SuggestionMode }>(() => {
|
const { suggestionQuery, suggestionMode } = useMemo<{ suggestionQuery: string, suggestionMode: SuggestionMode }>(() => {
|
||||||
// When suggestions are not enabled, fallback to using a sentinal
|
// When suggestions are not enabled, fallback to using a sentinel
|
||||||
// suggestion mode of "none".
|
// suggestion mode of "none".
|
||||||
if (!isSuggestionsEnabled) {
|
if (!isSuggestionsEnabled) {
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ export const SyntaxReferenceGuide = () => {
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle>Syntax Reference Guide</DialogTitle>
|
<DialogTitle>Syntax Reference Guide</DialogTitle>
|
||||||
<DialogDescription className="text-sm text-foreground">
|
<DialogDescription className="text-sm text-foreground">
|
||||||
Queries consist of space-seperated regular expressions. Wrapping expressions in <Code>{`""`}</Code> combines them. By default, a file must have at least one match for each expression to be included.
|
Queries consist of space-separated regular expressions. Wrapping expressions in <Code>{`""`}</Code> combines them. By default, a file must have at least one match for each expression to be included.
|
||||||
</DialogDescription>
|
</DialogDescription>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<Table>
|
<Table>
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ export function ChangeOrgNameCard({ orgName, currentUserRole }: ChangeOrgNameCar
|
||||||
<CardTitle>
|
<CardTitle>
|
||||||
Organization Name
|
Organization Name
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
<CardDescription>{`Your organization's visible name within Sourceobot. For example, the name of your company or department.`}</CardDescription>
|
<CardDescription>{`Your organization's visible name within Sourcebot. For example, the name of your company or department.`}</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ export const SyntaxReferenceGuide = () => {
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle>Syntax Reference Guide</DialogTitle>
|
<DialogTitle>Syntax Reference Guide</DialogTitle>
|
||||||
<DialogDescription className="text-sm text-foreground">
|
<DialogDescription className="text-sm text-foreground">
|
||||||
Queries consist of space-seperated regular expressions. Wrapping expressions in <Code>{`""`}</Code> combines them. By default, a file must have at least one match for each expression to be included.
|
Queries consist of space-separated regular expressions. Wrapping expressions in <Code>{`""`}</Code> combines them. By default, a file must have at least one match for each expression to be included.
|
||||||
</DialogDescription>
|
</DialogDescription>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<Table>
|
<Table>
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import { prisma } from "@/prisma";
|
||||||
import { OrgRole } from "@sourcebot/db";
|
import { OrgRole } from "@sourcebot/db";
|
||||||
import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch";
|
import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { BetweenHorizonalStart, GitBranchIcon, LockIcon } from "lucide-react";
|
import { BetweenHorizontalStart, GitBranchIcon, LockIcon } from "lucide-react";
|
||||||
import { hasEntitlement } from "@sourcebot/shared";
|
import { hasEntitlement } from "@sourcebot/shared";
|
||||||
import { env } from "@/env.mjs";
|
import { env } from "@/env.mjs";
|
||||||
import { GcpIapAuth } from "@/app/[domain]/components/gcpIapAuth";
|
import { GcpIapAuth } from "@/app/[domain]/components/gcpIapAuth";
|
||||||
|
|
@ -106,7 +106,7 @@ export default async function Onboarding({ searchParams }: OnboardingProps) {
|
||||||
title: "MCP Server",
|
title: "MCP Server",
|
||||||
description: "Learn how to setup Sourcebot's MCP server to provide code context to your AI agents",
|
description: "Learn how to setup Sourcebot's MCP server to provide code context to your AI agents",
|
||||||
href: "https://docs.sourcebot.dev/docs/features/mcp-server",
|
href: "https://docs.sourcebot.dev/docs/features/mcp-server",
|
||||||
icon: <BetweenHorizonalStart className="w-4 h-4" />,
|
icon: <BetweenHorizontalStart className="w-4 h-4" />,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,7 @@ export const { handlers, signIn, signOut, auth } = NextAuth({
|
||||||
// to the client.
|
// to the client.
|
||||||
session.user = {
|
session.user = {
|
||||||
...session.user,
|
...session.user,
|
||||||
// Propogate the userId to the session.
|
// Propagate the userId to the session.
|
||||||
id: token.userId,
|
id: token.userId,
|
||||||
}
|
}
|
||||||
return session;
|
return session;
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ export const createOnboardingSubscription = async (domain: string) => sew(() =>
|
||||||
return {
|
return {
|
||||||
statusCode: StatusCodes.BAD_REQUEST,
|
statusCode: StatusCodes.BAD_REQUEST,
|
||||||
errorCode: ErrorCode.SUBSCRIPTION_ALREADY_EXISTS,
|
errorCode: ErrorCode.SUBSCRIPTION_ALREADY_EXISTS,
|
||||||
message: "Attemped to create a trial subscription for an organization that already has an active subscription",
|
message: "Attempted to create a trial subscription for an organization that already has an active subscription",
|
||||||
} satisfies ServiceError;
|
} satisfies ServiceError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ const rules = [
|
||||||
"Do NOT provide general feedback, summaries, explanations of changes, or praises for making good additions.",
|
"Do NOT provide general feedback, summaries, explanations of changes, or praises for making good additions.",
|
||||||
"Do NOT provide any advice that is not actionable or directly related to the changes.",
|
"Do NOT provide any advice that is not actionable or directly related to the changes.",
|
||||||
"Do NOT provide any comments or reviews on code that you believe is good, correct, or a good addition. Your job is only to identify issues and provide feedback on how to fix them.",
|
"Do NOT provide any comments or reviews on code that you believe is good, correct, or a good addition. Your job is only to identify issues and provide feedback on how to fix them.",
|
||||||
"If a review for a chunk contains different reviews at different line ranges, return a seperate review object for each line range.",
|
"If a review for a chunk contains different reviews at different line ranges, return a separate review object for each line range.",
|
||||||
"Focus solely on offering specific, objective insights based on the given context and refrain from making broad comments about potential impacts on the system or question intentions behind the changes.",
|
"Focus solely on offering specific, objective insights based on the given context and refrain from making broad comments about potential impacts on the system or question intentions behind the changes.",
|
||||||
"Keep comments concise and to the point. Every comment must highlight a specific issue and provide a clear and actionable solution to the developer.",
|
"Keep comments concise and to the point. Every comment must highlight a specific issue and provide a clear and actionable solution to the developer.",
|
||||||
"If there are no issues found on a line range, do NOT respond with any comments. This includes comments such as \"No issues found\" or \"LGTM\"."
|
"If there are no issues found on a line range, do NOT respond with any comments. This includes comments such as \"No issues found\" or \"LGTM\"."
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ export const generateDiffReviewPrompt = async (diff: sourcebot_diff, context: so
|
||||||
logger.debug("Executing generate_diff_review_prompt");
|
logger.debug("Executing generate_diff_review_prompt");
|
||||||
|
|
||||||
const prompt = `
|
const prompt = `
|
||||||
You are an expert software engineer that excells at reviewing code changes. Given the input, additional context, and rules defined below, review the code changes and provide a detailed review. The review you provide
|
You are an expert software engineer that excels at reviewing code changes. Given the input, additional context, and rules defined below, review the code changes and provide a detailed review. The review you provide
|
||||||
must conform to all of the rules defined below. The output format of your review must conform to the output format defined below.
|
must conform to all of the rules defined below. The output format of your review must conform to the output format defined below.
|
||||||
|
|
||||||
# Input
|
# Input
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,11 @@ export type FileTreeNode = Omit<RawFileTreeNode, 'children'> & {
|
||||||
children: FileTreeNode[];
|
children: FileTreeNode[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const buildCollapsableTree = (tree: RawFileTreeNode): FileTreeNode => {
|
const buildCollapsibleTree = (tree: RawFileTreeNode): FileTreeNode => {
|
||||||
return {
|
return {
|
||||||
...tree,
|
...tree,
|
||||||
isCollapsed: true,
|
isCollapsed: true,
|
||||||
children: tree.children.map(buildCollapsableTree),
|
children: tree.children.map(buildCollapsibleTree),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,15 +39,15 @@ interface PureFileTreePanelProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PureFileTreePanel = ({ tree: _tree, path }: PureFileTreePanelProps) => {
|
export const PureFileTreePanel = ({ tree: _tree, path }: PureFileTreePanelProps) => {
|
||||||
const [tree, setTree] = useState<FileTreeNode>(buildCollapsableTree(_tree));
|
const [tree, setTree] = useState<FileTreeNode>(buildCollapsibleTree(_tree));
|
||||||
const scrollAreaRef = useRef<HTMLDivElement>(null);
|
const scrollAreaRef = useRef<HTMLDivElement>(null);
|
||||||
const { navigateToPath } = useBrowseNavigation();
|
const { navigateToPath } = useBrowseNavigation();
|
||||||
const { repoName, revisionName } = useBrowseParams();
|
const { repoName, revisionName } = useBrowseParams();
|
||||||
|
|
||||||
// @note: When `_tree` changes, it indicates that a new tree has been loaded.
|
// @note: When `_tree` changes, it indicates that a new tree has been loaded.
|
||||||
// In that case, we need to rebuild the collapsable tree.
|
// In that case, we need to rebuild the collapsible tree.
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setTree(buildCollapsableTree(_tree));
|
setTree(buildCollapsibleTree(_tree));
|
||||||
}, [_tree]);
|
}, [_tree]);
|
||||||
|
|
||||||
const setIsCollapsed = useCallback((path: string, isCollapsed: boolean) => {
|
const setIsCollapsed = useCallback((path: string, isCollapsed: boolean) => {
|
||||||
|
|
|
||||||
|
|
@ -494,7 +494,7 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": ".+"
|
"pattern": ".+"
|
||||||
},
|
},
|
||||||
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always exluded.",
|
"description": "List of paths relative to the provided `path` to exclude from the index. .git, .hg, and .svn are always excluded.",
|
||||||
"default": [],
|
"default": [],
|
||||||
"examples": [
|
"examples": [
|
||||||
[
|
[
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue