Supercharge Git inside VS Code and unlock untapped knowledge within each repository — Visualize code authorship at a glance via Git blame annotations and CodeLens, seamlessly navigate and explore Git repositories, gain valuable insights via rich visualizations and powerful comparison commands, and so much more
This report presents the forensic synthetic code analysis of gitkraken/vscode-gitlens, a TypeScript project with 9,864 GitHub stars. SynthScan v2.0 examined 541,407 lines of code across 1787 source files, recording 771 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 2.4 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 771 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/baseTest.ts | 80 | function patchTestVSCodeProductJson(vscodePath: string): void { | CODE |
| LOW | tests/e2e/specs/rebase.test.ts | 76 | async function getRebaseWebviewWithRetry( | CODE |
| LOW | tests/e2e/specs/quickWizard.test.ts | 130 | async function selectCommandAndWaitForStepWithOptionalRepo( | CODE |
| LOW | tests/e2e/specs/quickWizard.test.ts | 163 | async function selectCommandSubcommandAndWaitForStepWithOptionalRepo( | CODE |
| LOW | tests/e2e/specs/quickWizard.test.ts | 212 | async function reverseCommandSubcommandAndRepo( | CODE |
| LOW | packages/utils/src/date.ts | 260 | function getDateTimeFormatOptionsFromFormatString( | CODE |
| LOW | packages/utils/src/logger.scoped.ts | 85 | function defineLazyBoundErrorMethod(scope: ScopedLogger): void { | CODE |
| LOW | packages/utils/src/string.ts | 108 | export function compareSubstringIgnoreCase( | CODE |
| LOW | packages/utils/src/string.ts | 393 | export function getTokensFromTemplateRegex(template: string): TokenMatch[] { | CODE |
| LOW | packages/utils/src/diff.ts | 4 | export function annotateDiffWithNewLineNumbers(diff: string): string { | CODE |
| LOW | packages/utils/src/version.ts | 66 | export function compareByVersionDescending(a: string, b: string): number { | CODE |
| LOW | packages/utils/src/__tests__/promiseCache.test.ts | 28 | async function recordUnhandledRejections(fn: () => Promise<void>): Promise<unknown[]> { | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 126 | export function getShaAndDatesWithFilesLogParser( | CODE |
| LOW⚡ | packages/git-cli/src/parsers/logParser.ts | 143 | export function getShaAndFilesAndStatsLogParser(): ShaAndFilesAndStatsLogParser { | CODE |
| LOW⚡ | packages/git-cli/src/parsers/logParser.ts | 151 | export function getShaAndFileRangeLogParser(): ShaAndFileRangeLogParser { | CODE |
| LOW⚡ | packages/git-cli/src/parsers/logParser.ts | 159 | export function getShaAndFileSummaryLogParser(): ShaAndFileSummaryLogParser { | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 209 | export function getStashFilesOnlyLogParser(): StashFilesOnlyLogParser { | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 450 | function createLogParserWithFilesAndStats(): LogParserWithFilesAndStats<void>; | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 748 | function createLogParserWithFileSummary(): LogParserWithFileSummary<void>; | CODE |
| LOW | packages/git-cli/src/providers/blame.ts | 534 | function createProgressiveGitBlame(repoPath: string): { | CODE |
| LOW | packages/git-cli/src/providers/graph.ts | 102 | function computeDecorationFingerprint( | CODE |
| LOW | …c/providers/__tests__/integration/graphSession.test.ts | 508 | async function assertRestoreMatchesFreshWalk( | CODE |
| LOW | packages/git-cli/src/exec/git.ts | 460 | export function inferSigningFormatFromError(ex: unknown): SigningFormat | undefined { | CODE |
| LOW | packages/git/src/repositoryService.ts | 63 | export function clearGlobalRepositoryServiceResolver(): void { | CODE |
| LOW | packages/git/src/repositoryService.ts | 84 | export function setGlobalRepositoryServiceResolver( | CODE |
| LOW | packages/git/src/cache.ts | 43 | export function areUriScopedCachedGitTypes(types: string[]): types is UriScopedCachedGitTypes[] { | CODE |
| LOW | packages/git/src/parsers/diffParser.ts | 46 | function parseFileStatusAndMetadata( | CODE |
| LOW | packages/git/src/parsers/diffParser.ts | 223 | export function countDiffInsertionsAndDeletions(file: ParsedGitDiffFile): { insertions: number; deletions: number } { | CODE |
| LOW | packages/git/src/watching/watcherPatterns.ts | 49 | export function shouldIgnoreWorkingTreePath(absolutePath: string): boolean { | CODE |
| LOW | packages/git/src/utils/autolink.utils.ts | 78 | export function ensureCachedBranchNameRegexes( | CODE |
| LOW⚡ | packages/git/src/utils/branch.utils.ts | 34 | export function getBranchNameWithoutRemote(name: string): string { | CODE |
| LOW⚡ | packages/git/src/utils/branch.utils.ts | 38 | export function getBranchTrackingWithoutRemote(ref: GitBranchReference): string | undefined { | CODE |
| LOW⚡ | packages/git/src/utils/branch.utils.ts | 42 | export function getRemoteNameFromBranchName(name: string): string { | CODE |
| LOW | packages/git/src/utils/branch.utils.ts | 122 | export async function getLocalBranchUpstreamNames(branches: PageableResult<GitBranch>): Promise<Set<string>> { | CODE |
| LOW | packages/git/src/utils/remote.utils.ts | 10 | export function getHighlanderProviderName(remotes: GitRemote<RemoteProvider>[]): string | undefined { | CODE |
| LOW | packages/git/src/utils/remote.utils.ts | 68 | export function getRemoteProviderThemeIconString(provider: RemoteProvider | undefined): string { | CODE |
| LOW | packages/git/src/utils/remote.utils.ts | 72 | export function getRemoteUpstreamDescription(remote: GitRemote): string { | CODE |
| LOW | packages/git/src/utils/remote.utils.ts | 119 | export function getNameFromRemoteResource(resource: RemoteResource): string { | CODE |
| LOW | packages/git/src/utils/fetch.utils.ts | 22 | export function getLastFetchedUpdateInterval(lastFetched: number): number { | CODE |
| LOW | packages/git/src/utils/mergeConflicts.utils.ts | 3 | export function createConflictDetectionError(reason: ConflictDetectionErrorReason): ConflictDetectionResult { | CODE |
| LOW | packages/git/src/utils/mergeConflicts.utils.ts | 7 | function getConflictDetectionErrorMessage(reason: ConflictDetectionErrorReason): string { | CODE |
| LOW | packages/git/src/utils/contributor.utils.ts | 26 | export function calculateContributionScore( | CODE |
| LOW | packages/git/src/utils/commit.utils.ts | 9 | export function formatCurrentUserDisplayName(name: string, style: CurrentUserNameStyle): string { | CODE |
| LOW | packages/git/src/utils/commit.utils.ts | 25 | export function formatIdentityDisplayName( | CODE |
| LOW | packages/git/src/utils/commit.utils.ts | 32 | export function assertsCommitHasFullDetails(commit: GitCommit): asserts commit is GitCommitWithFullDetails { | CODE |
| LOW | packages/git/src/utils/commit.utils.ts | 66 | export function createUncommittedChangesCommit( | CODE |
| LOW | packages/git/src/utils/repository.utils.ts | 4 | export function getRepositoryOrWorktreePath(uri: Uri): string { | CODE |
| LOW | packages/git/src/utils/issue.utils.ts | 3 | export function getRepositoryIdentityForIssue(issue: IssueShape | Issue): IssueRepositoryIdentityDescriptor { | CODE |
| LOW | packages/git/src/utils/resourceDescriptor.utils.ts | 17 | export function isIssueResourceDescriptor(resource: ResourceDescriptor): resource is IssueResourceDescriptor { | CODE |
| LOW | packages/git/src/utils/reference.utils.ts | 105 | export function getReferenceNameWithoutRemote(ref: GitReference): string { | CODE |
| LOW | packages/git/src/utils/revision.utils.ts | 34 | export function isShaWithOptionalRevisionSuffix(rev: string): boolean { | CODE |
| LOW | packages/git/src/utils/revision.utils.ts | 51 | export function isUncommittedWithParentSuffix(rev: string | undefined): rev is `${typeof uncommitted}${'^' | ':^'}` { | CODE |
| LOW | packages/git/src/utils/revision.utils.ts | 55 | export function isUncommittedStagedWithParentSuffix( | CODE |
| LOW | packages/git/src/utils/revision.utils.ts | 71 | export function resetAbbreviatedShaLength(): void { | CODE |
| LOW | packages/git/src/utils/reachability.utils.ts | 15 | export function computeGraphRowContextFlags( | CODE |
| LOW | packages/git/src/utils/reachability.utils.ts | 79 | export function createReachabilityTableBuilder(seed?: GraphReachabilityTable): { | CODE |
| LOW | packages/git/src/utils/pullRequest.utils.ts | 17 | export function getComparisonRefsForPullRequest(repoPath: string, prRefs: PullRequestRefs): PullRequestComparisonRefs { | CODE |
| LOW | packages/git/src/utils/pullRequest.utils.ts | 26 | export function getPullRequestIdentityFromMaybeUrl(search: string): PullRequestUrlIdentity | undefined { | CODE |
| LOW | packages/git/src/utils/pullRequest.utils.ts | 44 | export function getRepositoryIdentityForPullRequest( | CODE |
| LOW | packages/git/src/utils/pullRequest.utils.ts | 80 | export function isMaybeNonSpecificPullRequestSearchUrl(search: string): boolean { | CODE |
| 428 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 177 | const baseSSHUrl = pr.toRef.repository.links.clone.find(link => link.name === 'ssh')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 178 | let baseHTTPSUrl = pr.toRef.repository.links.clone.find(link => link.name === 'https')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 180 | baseHTTPSUrl = pr.toRef.repository.links.clone.find(link => link.name === 'http')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 183 | const headSSHUrl = pr.fromRef.repository.links.clone.find(link => link.name === 'ssh')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 184 | let headHTTPSUrl = pr.fromRef.repository.links.clone.find(link => link.name === 'https')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 186 | headHTTPSUrl = pr.fromRef.repository.links.clone.find(link => link.name === 'http')?.href ?? null; | CODE |
| CRITICAL | src/webviews/apps/shared/components/promo.ts | 132 | command = promo.content.webview.link.command.substring('command:'.length) as GlExtensionCommands; | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 612 | const scoped = this._actions.resources.scopeFiles.value.get(); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2499 | const scopeFilesValue = this._actions.resources.scopeFiles.value.get(); | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2627 | .loading=${this._actions.resources.branchCompareSummary.loading.get() || | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2628 | this._actions.resources.branchCompareSide.loading.get()} | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2629 | .errorMessage=${this._actions.resources.branchCompareSummary.error.get() ?? | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2630 | this._actions.resources.branchCompareSide.error.get()} | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2900 | const scopeFilesValue = this._actions.resources.scopeFiles.value.get(); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3171 | this._actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3270 | const reviewValue = this._actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 844 | if (this.actions.resources.review.status.get() !== 'success') return; | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 846 | const value = this.actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 925 | const current = entry?.result ?? this.actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 968 | const currentValue = this.actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1012 | if (this.actions.resources.compose.status.get() !== 'success') return; | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1014 | const value = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1152 | const planValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1166 | const resourceValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1275 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1332 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1438 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1476 | const latest = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1504 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1603 | const planValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1613 | const resourceValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1642 | const planValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1707 | const current = entry?.result ?? this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1734 | const current = entry?.result ?? this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1776 | const currentValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 795 | ? !this._data.session.current.rowsStatsDeferred.isLoaded() | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1006 | if (isWipRow || this._data.session.current.ids.has(id)) { | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1023 | if (this._data.session.current.ids.has(arg.selectSha)) { | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1092 | this._data.session.current.ids.has(rowId) | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 2302 | if (this._data.session.current.avatars.has(email)) continue; | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 2334 | this._data.session.current.avatars.set(email, uri.toString(true)); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .devcontainer/devcontainer.json | 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the | COMMENT |
| LOW | packages/utils/src/trie.ts | 281 | // let node: PathNode<T> | undefined; | COMMENT |
| LOW | packages/utils/src/trie.ts | 601 | // node = n; | COMMENT |
| LOW | packages/utils/src/trie.ts | 621 | // let fullAncestorPath!: string; | COMMENT |
| LOW | …git-cli/src/parsers/__tests__/rebaseTodoParser.test.ts | 21 | }); | COMMENT |
| LOW | …git-cli/src/parsers/__tests__/rebaseTodoParser.test.ts | 241 | 'Should parse 40-char SHA', | COMMENT |
| LOW | …git-cli/src/parsers/__tests__/rebaseTodoParser.test.ts | 261 | # t, reset <label> = reset HEAD to a label | COMMENT |
| LOW | packages/git-cli/src/providers/graph.ts | 661 | // The subset of `undoableTipShas` that turn out to have a child (are an ancestor of another | COMMENT |
| LOW | packages/git-cli/src/providers/graph.ts | 1301 | // `selectSha` already IS the resolved HEAD, otherwise take the current branch tip (also populated for | COMMENT |
| LOW | packages/git-cli/src/providers/__tests__/stash.test.ts | 1 | // Tests removed: `findOldestStashTimestamp` was deleted alongside the stash ancestry-filtering | COMMENT |
| LOW | …ckages/git/src/watching/__tests__/watchSession.test.ts | 721 | sub.onDidChange(e => received.push(e)); | COMMENT |
| LOW | packages/git/src/utils/__tests__/remote.test.ts | 21 | // For git@... the scheme part is undefined in the regex (no protocol prefix like ssh://) | COMMENT |
| LOW | packages/plus/agents/src/sanitizePrompt.ts | 1 | import { truncate } from '@gitlens/utils/string.js'; | COMMENT |
| LOW | …ckages/plus/agents/src/providers/claudeCodeProvider.ts | 1921 | status: peerSession.status, | COMMENT |
| LOW | packages/plus/commit-graph/src/colors.ts | 1 | // Lane palette tuning — all lanes share ONE perceptual lightness (OKLCH L) and differ only by hue, so | COMMENT |
| LOW | packages/plus/integrations/src/lite.ts | 1 | // A lightweight, token-scoped entry point for stateless single-shot provider reads. | COMMENT |
| LOW | …s/src/providers/__tests__/providersApi.interop.test.ts | 1 | import * as assert from 'node:assert/strict'; | COMMENT |
| LOW | …plus/integrations/src/providers/bitbucket/bitbucket.ts | 841 | case 404: // Not found | COMMENT |
| LOW | packages/plus/integrations/src/__tests__/fakeRuntime.ts | 1 | // Minimal `IntegrationServiceContext` implementation for unit tests. | COMMENT |
| LOW | …integrations/src/authentication/manualTokenProvider.ts | 1 | // Convenience for "manual token" auth — when a consumer already has an access | COMMENT |
| LOW | .github/workflows/codeql.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | .github/workflows/codeql.yml | 61 | - name: Initialize CodeQL | COMMENT |
| LOW | src/constants.views.ts | 81 | export type ViewContainerIds = `workbench.view.extension.${ViewContainerTypes}`; | COMMENT |
| LOW | src/agents/agentStatusService.ts | 621 | * OS-level cross-window focus across a multi-window VS Code app is unreliable). */ | COMMENT |
| LOW | src/webviews/rebase/rebaseEditor.ts | 141 | // false positives that flicker the editor open with an empty/stale state. Confirm there | COMMENT |
| LOW | src/webviews/apps/home/events.ts | 261 | // ============================================================ | COMMENT |
| LOW | src/webviews/apps/home/home.ts | 141 | // and the user isn't focused there — afford a longer window so bursts (branch ops, | COMMENT |
| LOW | …bviews/apps/shared/components/tree/gl-wip-tree-pane.ts | 341 | // The WIP feed (commit details / graph) emits TWO rows per mixed path — one with | COMMENT |
| LOW | src/webviews/apps/shared/controllers/modifier-keys.ts | 41 | // `keydown`/`keyup` only fire when the webview iframe has keyboard focus — mouse hover | COMMENT |
| LOW | src/webviews/apps/plus/composer/composer.scss | 61 | // --d2h-dark-file-header-bg-color: #161b22; | COMMENT |
| LOW | …ebviews/apps/plus/composer/components/details-panel.ts | 621 | ></gl-diff-file>`; | COMMENT |
| LOW | …ebviews/apps/plus/composer/components/details-panel.ts | 641 | // hunk => hunk.index, | COMMENT |
| LOW | src/webviews/apps/plus/composer/components/app.ts | 1461 | COMMENT | |
| LOW | …ebviews/apps/plus/composer/components/commits-panel.ts | 1121 | const changes = getFileChanges(unassignedHunks.unstaged); | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 161 | // The whole rail is the hit surface — the host resolves the NEAREST marker to the cursor's y | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 961 | // The scroll var itself snaps (vars don't interpolate) — easing the dim keeps it in step with the | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 1021 | // The message yields first (its high flex-shrink + 14rem floor) so pills keep their FULL name until | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 1481 | // on hover: the pill FILLS with its lane color and the text flips to a readable contrast. | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 1601 | } | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 1721 | font-size: 1rem; | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2341 | // Keyboard-only: a mouse click must not flash a focus ring (`:focus-visible` is keyboard/programmatic- | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2361 | // font-size: inherit !important; | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2381 | // } | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2401 | font-size: var(--vscode-font-size); | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2421 | // } | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2441 | COMMENT | |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2461 | // border: 1px solid transparent; | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2481 | // } | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2501 | // margin-left: -0.2rem; | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2521 | COMMENT | |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2541 | COMMENT | |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2561 | COMMENT | |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2581 | // // > *:not(:last-child), | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2661 | // } | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2681 | // max-width: 100rem; | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2701 | COMMENT | |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2721 | // font-size: 1.1rem; | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2741 | // &__dismiss { | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2761 | // } | COMMENT |
| LOW | src/webviews/apps/plus/graph/graph.scss | 2781 | // color: var(--alert-foreground); | COMMENT |
| 113 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/specs/blame.test.ts | 163 | await git.commit('placeholder', 'README.md', '# clone failed'); | CODE |
| LOW | tests/e2e/pageObjects/components/quickPick.ts | 106 | await expect(this.input).toHaveAttribute('placeholder', placeholder, { timeout: timeout }); | CODE |
| LOW | tests/e2e/pageObjects/components/quickPick.ts | 116 | return this.input.getAttribute('placeholder'); | CODE |
| LOW⚡ | …/git-cli/src/parsers/__tests__/signatureParser.test.ts | 64 | const output = `B${fieldSeparator}John Doe${fieldSeparator}ABCD1234${fieldSeparator}${fieldSeparator}${fieldSeparator} | CODE |
| LOW⚡ | …/git-cli/src/parsers/__tests__/signatureParser.test.ts | 70 | assert.strictEqual(result?.signer, 'John Doe', 'Should have correct signer'); | CODE |
| LOW⚡ | …/git-cli/src/parsers/__tests__/signatureParser.test.ts | 71 | assert.strictEqual(result?.errorMessage, 'gpg: BAD signature from "John Doe"', 'Should include error message'); | CODE |
| LOW | …/git-cli/src/parsers/__tests__/signatureParser.test.ts | 198 | assert.strictEqual(result?.signer, 'user@example.com', 'Should have email as signer'); | CODE |
| LOW | …ages/git-cli/src/parsers/__tests__/blameParser.test.ts | 59 | author: 'John Doe', | CODE |
| LOW | …ages/git-cli/src/parsers/__tests__/blameParser.test.ts | 62 | committer: 'John Doe', | CODE |
| LOW | …ages/git-cli/src/parsers/__tests__/blameParser.test.ts | 77 | assert.strictEqual(commit.author.name, 'John Doe', 'Should have correct author name'); | CODE |
| LOW | …ages/git-cli/src/parsers/__tests__/blameParser.test.ts | 211 | author: 'John Doe', | CODE |
| LOW | …ages/git-cli/src/parsers/__tests__/blameParser.test.ts | 214 | committer: 'John Doe', | CODE |
| LOW⚡ | packages/git/src/utils/__tests__/search.utils.test.ts | 152 | const result = parseSearchQuery(q('@:"John Doe"')); | CODE |
| LOW⚡ | packages/git/src/utils/__tests__/search.utils.test.ts | 155 | assert.ok(authors.has('"John Doe"')); | CODE |
| LOW⚡ | packages/git/src/utils/__tests__/search.utils.test.ts | 159 | const result = parseSearchQuery(q('@:"John Doe')); | CODE |
| LOW⚡ | packages/git/src/utils/__tests__/search.utils.test.ts | 162 | assert.ok(authors.has('"John Doe')); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 15 | assert.strictEqual(result, 'jane.smith@example.org'); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 24 | const result = extractEmailFromSigner('John Doe'); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 37 | const result = extractEmailFromSigner('user@example.com'); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 38 | assert.strictEqual(result, 'user@example.com'); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 64 | const result = extractEmailFromSigner('/C=US/O=Org/CN=Name/email=test@example.org'); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 65 | assert.strictEqual(result, 'test@example.org'); | CODE |
| LOW | …ed/components/commit/__tests__/signature-badge.test.ts | 203 | signer: 'John Doe', | CODE |
| LOW | src/webviews/apps/shared/__tests__/ipc.test.ts | 34 | name: 'John Doe', | CODE |
| LOW | src/webviews/apps/shared/__tests__/ipc.test.ts | 38 | name: 'Jane Doe', | CODE |
| LOW | src/git/__tests__/graphRowProcessor.test.ts | 28 | avatars: new Map<string, string>([['test@test.com', 'https://avatar']]), | CODE |
| LOW | src/git/__tests__/graphRowProcessor.test.ts | 38 | email: 'test@test.com', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 74 | // ── git_status ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 97 | // ── git_branch ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 107 | // ── git_log_or_diff ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 134 | // ── git_blame ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/helpers/mcpHelper.ts | 226 | // ── Private helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 760 | // ─── Branch/tag sheet (prototype) ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …webviews/apps/plus/graph/graph-wrapper/gl-lit-graph.ts | 4037 | // ─── Interaction (delegated; rows carry no per-row listeners) ────────────── | COMMENT |
| MEDIUM | …webviews/apps/plus/graph/graph-wrapper/gl-lit-graph.ts | 4880 | // ─── Controllable scroll-into-view ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ebviews/apps/plus/graph/graph-wrapper/graph-wrapper.ts | 1722 | // ─── Experimental commit-graph engine handlers ──────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/webviews/apps/plus/composer/components/app.ts | 1606 | // Determine if any of the combined commits were AI-generated | COMMENT |
| HIGH | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 1627 | // the user has typed or AI-generated, preserve their work. | COMMENT |
| HIGH | src/git/utils/-webview/remote.utils.ts | 150 | // Resolve AI-generated PR details centrally before URL construction | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .claude/skills/ux-review/SKILL.md | 44 | ## Step 1: Gather Context | COMMENT |
| LOW⚡ | .claude/skills/ux-review/SKILL.md | 55 | ## Step 2: Identify User-Facing Changes | COMMENT |
| LOW⚡ | .claude/skills/ux-review/SKILL.md | 65 | ## Step 3: Trace User Flows | COMMENT |
| LOW⚡ | .claude/skills/ux-review/SKILL.md | 73 | ## Step 4: Evaluate Against Seven Lenses | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 86 | // Step 1: commit1 - merge-tree --write-tree --merge-base (clean) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 101 | // Step 2: commit2 - merge-tree --write-tree --merge-base (CONFLICT) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 143 | // Step 1: commit1 - CONFLICT on file1.txt | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 158 | // Step 2: commit2 - clean merge | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 173 | // Step 3: commit3 - CONFLICT on file2.txt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | AGENTS.md | 73 | ├── git/ # Git orchestration layer (gitProviderService.ts, actions, formatters) | CODE |
| MEDIUM | docs/webview-styling.md | 135 | ## Quick guardrails | COMMENT |
| MEDIUM | packages/utils/src/diff.ts | 1 | // Annotates diff to make is easier for agentic reference to line number. | COMMENT |
| MEDIUM | …/shared/components/details-header/gl-details-header.ts | 83 | // right-anchored actions slot via two flex spacers. Only render the scaffold when there's | COMMENT |
| MEDIUM | …pps/plus/graph/components/gl-details-wip-empty-pane.ts | 102 | // this scaffold was reshaped to avoid. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/git-cli/src/providers/operations.ts | 839 | // no CLI-length limit (so no batching), and robust for paths with spaces/newlines. | COMMENT |
| MEDIUM | …/integrations/src/__tests__/perConnectionReads.test.ts | 179 | // robust regardless of the provider's paging mode. | COMMENT |
| MEDIUM | src/uris/deepLinks/deepLinkService.ts | 610 | // to a separate service where it can be used outside of the context of deep linking. Then the deep link service should | COMMENT |
| MEDIUM | …webviews/apps/plus/graph/graph-wrapper/gl-lit-graph.ts | 5938 | // Electron/WSL compositor, and `drop` intermittently never fired). Pointer events are the robust | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/utils/src/__tests__/event.test.ts | 97 | // Event access after dispose should return None/noop | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 86 | // Step 1: commit1 - merge-tree --write-tree --merge-base (clean) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 101 | // Step 2: commit2 - merge-tree --write-tree --merge-base (CONFLICT) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 143 | // Step 1: commit1 - CONFLICT on file1.txt | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 158 | // Step 2: commit2 - clean merge | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 173 | // Step 3: commit3 - CONFLICT on file2.txt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/plus/integrations/src/providers/azureDevOps.ts | 478 | // TODO: implement repos version | COMMENT |
| LOW | …es/plus/integrations/src/providers/bitbucket-server.ts | 232 | // TODO: implement repos version | COMMENT |
| LOW | packages/plus/integrations/src/providers/bitbucket.ts | 271 | // TODO: implement repos version | COMMENT |
| LOW | src/webviews/apps/shared/components/tree/tree-view.ts | 794 | // TODO: implement badge and indicator decorations | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/codeql.yml | 54 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customi | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/runner/src/index.ts | 52 | async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> { | CODE |