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 summarizes scanner evidence for gitkraken/vscode-gitlens, a TypeScript project with 9,960 GitHub stars. SynthScan examined 937,584 lines of code across 2479 source files, recording 1344 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 2.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1243 finding(s).
Are imports declared and package/API names verified? 87 finding(s).
Are wrappers, guards, and repeated structures necessary? 882 finding(s).
Which changes need focused human review? 1344 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1344 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/graphHelpers.ts | 227 | export async function ensureGraphDetailsPanelOpen(graphWebview: FrameLocator, timeout = 10000): Promise<void> { | CODE |
| LOW | tests/e2e/baseTest.ts | 151 | function patchTestVSCodeProductJson(vscodePath: string): void { | CODE |
| LOW | tests/e2e/specs/rebase.test.ts | 94 | async function getRebaseWebviewWithRetry( | CODE |
| LOW | tests/e2e/specs/graphDetails.test.ts | 223 | async function expectDetailsPanelDismissed(graphWebview: FrameLocator): Promise<void> { | CODE |
| LOW | tests/e2e/specs/graphRowActions.test.ts | 75 | async function expectActionBackdropToMatchRow(row: Locator): Promise<void> { | CODE |
| LOW | tests/e2e/specs/localization.test.ts | 178 | async function expectPanelHeaderLocalized(header: Locator, key: string, label: string): Promise<void> { | CODE |
| LOW | tests/e2e/specs/quickWizard.test.ts | 135 | async function selectCommandAndWaitForStepWithOptionalRepo( | CODE |
| LOW | tests/e2e/specs/quickWizard.test.ts | 168 | async function selectCommandSubcommandAndWaitForStepWithOptionalRepo( | CODE |
| LOW | tests/e2e/specs/quickWizard.test.ts | 217 | async function reverseCommandSubcommandAndRepo( | CODE |
| LOW | packages/utils/src/date.ts | 335 | function getDateTimeFormatOptionsFromFormatString( | CODE |
| LOW | packages/utils/src/logger.scoped.ts | 132 | function defineLazyBoundErrorMethod(scope: ScopedLogger): void { | CODE |
| LOW | packages/utils/src/gitRefs.ts | 14 | export function getBranchNameWithoutRemote(name: string): string { | CODE |
| LOW | packages/utils/src/gitRefs.ts | 18 | export function getRemoteNameFromBranchName(name: string): string { | CODE |
| LOW | packages/utils/src/string.ts | 107 | export function compareSubstringIgnoreCase( | CODE |
| LOW | packages/utils/src/string.ts | 405 | 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/pausedOperation.ts | 69 | export function getPausedOperationVariant( | 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/components/src/components/overlays/popover.ts | 108 | function isShadowIncludingAncestor(possibleAncestor: Node, node: Node): boolean { | CODE |
| LOW | packages/git-cli/src/cliGitProvider.ts | 1249 | function getDefaultGlobalExcludesPath(): string | undefined { | CODE |
| LOW | packages/git-cli/src/parsers/sshSignatureParser.ts | 14 | export function extractCommitterFromCommitObject(commitObject: string): { name: string; email: string } | undefined { | CODE |
| LOW | packages/git-cli/src/parsers/sshSignatureParser.ts | 31 | export function extractSshPublicKeyFromCommitObject(commitObject: string): SshPublicKey | undefined { | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 136 | export function getShaAndDatesWithFilesLogParser( | CODE |
| LOW⚡ | packages/git-cli/src/parsers/logParser.ts | 153 | export function getShaAndFilesAndStatsLogParser(): ShaAndFilesAndStatsLogParser { | CODE |
| LOW⚡ | packages/git-cli/src/parsers/logParser.ts | 161 | export function getShaAndFileRangeLogParser(): ShaAndFileRangeLogParser { | CODE |
| LOW⚡ | packages/git-cli/src/parsers/logParser.ts | 169 | export function getShaAndFileSummaryLogParser(): ShaAndFileSummaryLogParser { | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 219 | export function getStashFilesOnlyLogParser(): StashFilesOnlyLogParser { | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 463 | function createLogParserWithFilesAndStats(): LogParserWithFilesAndStats<void>; | CODE |
| LOW | packages/git-cli/src/parsers/logParser.ts | 761 | function createLogParserWithFileSummary(): LogParserWithFileSummary<void>; | CODE |
| LOW | packages/git-cli/src/providers/status.ts | 39 | export function computeDeadlockBackstopMs(gitTimeout: number | undefined): number { | CODE |
| LOW | packages/git-cli/src/providers/blame.ts | 529 | function createProgressiveGitBlame(repoPath: string): { | CODE |
| LOW | packages/git-cli/src/providers/graph.ts | 96 | function computeDecorationFingerprint( | CODE |
| LOW | packages/git-cli/src/providers/maintenance.ts | 159 | function encodePendingConfigChange(change: PendingConfigChange): string { | CODE |
| LOW | packages/git-cli/src/providers/maintenance.ts | 163 | function decodePendingConfigChange(value: string): PendingConfigChange | undefined { | CODE |
| LOW | packages/git-cli/src/providers/maintenance.ts | 196 | function isFsmonitorDaemonUnsupported(result: Pick<GitResult, 'exitCode' | 'stdout' | 'stderr'>): boolean { | CODE |
| LOW | packages/git-cli/src/providers/maintenance.ts | 203 | function fsmonitorFeatureForPlatform(): GitFeatures | undefined { | CODE |
| LOW | packages/git-cli/src/providers/commits.ts | 2131 | export function parseCatFileBatchForSshSigners( | CODE |
| LOW | packages/git-cli/src/providers/config.ts | 165 | export function parseConfigRegexNullOutput(data: string | undefined): Map<string, string[]> { | CODE |
| LOW | packages/git-cli/src/providers/config.ts | 223 | export function mayConfigDifferByCheckout(listing: string): boolean { | CODE |
| LOW | …git-cli/src/providers/__tests__/integration/helpers.ts | 203 | export function createShadowCheckedGitService(options: Omit<CliGitServiceOptions, 'verifyBaseRemeasure'>): GitService { | CODE |
| LOW | …rc/providers/__tests__/integration/maintenance.test.ts | 54 | function blockNextSparseCheckoutReapply(repo: TestRepo): { started: Promise<void>; release(): void } { | CODE |
| LOW | …ers/__tests__/integration/branches.aheadOfBase.test.ts | 67 | function createBranchFromDetachedHead(repoPath: string, name: string, startPoint: string): void { | CODE |
| LOW | …c/providers/__tests__/integration/graphSession.test.ts | 795 | function createUpstreamRebindFixture() { | CODE |
| LOW | …cli/src/providers/__tests__/integration/shadowCheck.ts | 26 | export function takeBaseRemeasureMismatches(): Error[] { | CODE |
| LOW | …ers/__tests__/integration/branches.mergeTarget.test.ts | 65 | function createBranchFromDetachedHead(repoPath: string, name: string, startPoint: string): void { | CODE |
| LOW | …/__tests__/integration/maintenance.commitGraph.test.ts | 47 | async function readNewestCommitGraphChunkIds(repoPath: string): Promise<string[]> { | CODE |
| LOW | …oviders/__tests__/integration/pausedOperations.test.ts | 18 | function setupConflictedCherryPick(r: TestRepo): void { | CODE |
| LOW | …oviders/__tests__/integration/pausedOperations.test.ts | 82 | function setupTwoStepConflictedRebase(r: TestRepo): void { | CODE |
| LOW | packages/git-cli/src/exec/git.ts | 596 | export function inferSigningFormatFromError(ex: unknown): SigningFormat | undefined { | CODE |
| LOW | packages/git/src/errors.ts | 440 | function getMissingBranchErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 514 | function getMissingSetUpstreamBranchErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 536 | function getGenericBranchErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 945 | function getCherryPickContinueErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 1004 | function getMergeContinueErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 1063 | function getRebaseContinueErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 1122 | function getRevertContinueErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 1892 | function getMissingTagErrorMessage( | CODE |
| LOW | packages/git/src/errors.ts | 1985 | function getGenericTagErrorMessage(tag: string, reason: TagErrorReason | undefined, l10n: Translator): string { | CODE |
| LOW | packages/git/src/errors.ts | 2289 | export function getDeferredRequestFailure(ex: unknown): (() => void) | undefined { | CODE |
| 808 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …providers/__tests__/integration/graph.ancestry.test.ts | 229 | const readFile = clone.provider.context.fs.readFile.bind(clone.provider.context.fs); | CODE |
| CRITICAL | …providers/__tests__/integration/graph.ancestry.test.ts | 258 | const readFile = repo.provider.context.fs.readFile.bind(repo.provider.context.fs); | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 209 | const baseSSHUrl = pr.toRef.repository.links.clone.find(link => link.name === 'ssh')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 210 | let baseHTTPSUrl = pr.toRef.repository.links.clone.find(link => link.name === 'https')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 212 | baseHTTPSUrl = pr.toRef.repository.links.clone.find(link => link.name === 'http')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 215 | const headSSHUrl = pr.fromRef.repository.links.clone.find(link => link.name === 'ssh')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 216 | let headHTTPSUrl = pr.fromRef.repository.links.clone.find(link => link.name === 'https')?.href ?? null; | CODE |
| CRITICAL⚡ | …/integrations/src/providers/bitbucket-server/models.ts | 218 | headHTTPSUrl = pr.fromRef.repository.links.clone.find(link => link.name === 'http')?.href ?? null; | CODE |
| CRITICAL | …src/__tests__/bitbucketServerPullRequestSearch.test.ts | 134 | pr.toRef.repository.project.key.toLowerCase() === project.toLowerCase() && | CODE |
| CRITICAL | src/webviews/apps/shared/components/promo.ts | 140 | command = promo.content.webview.link.command.substring('command:'.length) as GlExtensionCommands; | CODE |
| CRITICAL | src/webviews/apps/plus/graph/sidebar/sidebar-panel.ts | 950 | const data = this._actions.state.panels.pullRequests.value.get(); | CODE |
| CRITICAL | …apps/plus/graph/sidebar/__tests__/sidebarState.test.ts | 53 | const data = actions.state.panels.worktrees.value.get(); | CODE |
| CRITICAL⚡ | …apps/plus/graph/sidebar/__tests__/sidebarState.test.ts | 113 | const before = actions.state.panels.worktrees.value.get(); | CODE |
| CRITICAL⚡ | …apps/plus/graph/sidebar/__tests__/sidebarState.test.ts | 119 | actions.state.panels.worktrees.value.get(), | CODE |
| CRITICAL⚡ | …apps/plus/graph/sidebar/__tests__/sidebarState.test.ts | 129 | const before = actions.state.panels.worktrees.value.get(); | CODE |
| CRITICAL⚡ | …apps/plus/graph/sidebar/__tests__/sidebarState.test.ts | 133 | assert.strictEqual(actions.state.panels.worktrees.value.get(), before); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 974 | const scoped = this._actions.resources.scopeFiles.value.get(); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2437 | const value = entry?.result ?? (entry != null ? this._actions.resources.review.value.get() : undefined); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2508 | const files = inReview ? this._actions.resources.scopeFiles.value.get() : undefined; | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3674 | const scopeFilesValue = this._actions.resources.scopeFiles.value.get(); | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3804 | this._actions.resources.branchCompareSummary.loading.get() || | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3805 | this._actions.resources.branchCompareSide.loading.get() | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3808 | this._actions.resources.branchCompareSummary.error.get() ?? | CODE |
| CRITICAL⚡ | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 3809 | this._actions.resources.branchCompareSide.error.get() | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 4084 | const scopeFilesValue = this._actions.resources.scopeFiles.value.get(); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 4418 | this._actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 4511 | const reviewValue = this._actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1205 | getResourceValue: () => this.actions.resources.review.value.get(), | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1252 | const current = entry.result ?? this.actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1429 | const current = entry?.result ?? (isCurrent ? this.actions.resources.review.value.get() : undefined); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1464 | this.actions.resources.scopeFiles.value.get(), | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1558 | const current = entry.result ?? (isCurrent ? this.actions.resources.review.value.get() : undefined); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1682 | const files = isCurrent ? this.actions.resources.scopeFiles.value.get() : undefined; | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1728 | const current = entry?.result ?? this.actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1771 | this.actions.resources.scopeFiles.value.get(), | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1867 | const currentValue = this.actions.resources.review.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 1897 | getResourceValue: () => this.actions.resources.compose.value.get(), | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2010 | const planValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2030 | const resourceValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2146 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2203 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2311 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2349 | const latest = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2386 | const currentValue = this.actions.resources.compose.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2505 | const planValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2515 | const resourceValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2549 | const planValue = this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2637 | const current = entry?.result ?? this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2664 | const current = entry?.result ?? this.actions.resources.resolve.value.get(); | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2787 | if (this.actions.resources.resolve.value.get() != null) return; | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 2795 | if (this.actions.resources.resolve.value.get() != null) return; | CODE |
| CRITICAL | …pps/plus/graph/components/detailsWorkflowController.ts | 3598 | this.actions.resources.scopeFiles.value.get(), | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1032 | ? !this._data.session.current.rowsStatsDeferred.isLoaded() | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1598 | if (isWipRow || this._data.session.current.ids.has(id)) { | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1679 | if (isWipRowId(selectSha) || this._data.session.current.ids.has(selectSha)) { | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 1841 | if (isWipRowId(rowId) || this._data.session.current.ids.has(rowId)) { | CODE |
| CRITICAL | src/webviews/plus/graph/graphWebview.ts | 3620 | this._data.session.current.avatars.set(email, dataUri); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tsconfig.core-dts.json | 1 | { | COMMENT |
| LOW | tsconfig.core-dts.json | 21 | "incremental": false, | COMMENT |
| LOW | pnpm-workspace.yaml | 161 | # would force a major jump. | COMMENT |
| LOW | tests/e2e/baseTest.ts | 241 | // Skip onboarding/welcome screens — ephemeral test environments shouldn't show welcome views | COMMENT |
| LOW | tests/e2e/baseTest.ts | 441 | ...(runtimeDir ? { XDG_RUNTIME_DIR: runtimeDir } : {}), | COMMENT |
| LOW | tests/e2e/baseTest.ts | 561 | await waitForGitLensActivation(evaluate); | COMMENT |
| LOW | tests/e2e/specs/mcp.test.ts | 261 | expect(config.args).toContain('--scheme=cursor'); | COMMENT |
| LOW | tests/e2e/specs/rebase.test.ts | 221 | // pointer events for the full action budget. `notifications.clearAll` dismisses them outright, which | COMMENT |
| LOW | tests/e2e/specs/graphHeader.test.ts | 81 | await ensureGraphDetailsPanelOpen(webview, MaxTimeout); | COMMENT |
| LOW | tests/e2e/specs/treeView.test.ts | 121 | await expect(row).toBeVisible({ timeout: 30000 }); | COMMENT |
| LOW | tests/e2e/specs/treeView.test.ts | 141 | // with content but has no visible box, and waiting for it to appear on its own can only time out. | COMMENT |
| LOW | tests/e2e/specs/graphDetails.test.ts | 181 | // Identify the row by its ROLE, not by its visible text. The row reads "Working Changes" only while | COMMENT |
| LOW | tests/e2e/specs/quickWizard.test.ts | 2101 | title: /Create Worktree/i, | COMMENT |
| LOW | tests/e2e/specs/quickWizard.test.ts | 2161 | COMMENT | |
| LOW | tests/e2e/specs/graphPin.test.ts | 661 | // Pinned sits to the LEFT of HEAD... | COMMENT |
| LOW | tests/e2e/specs/graphConflictResolution.test.ts | 181 | /** Open the Commit Graph and wait until the conflicted WIP row has rendered. */ | COMMENT |
| 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 | // parent = node ?? this.root; | COMMENT |
| LOW | packages/utils/src/trie.ts | 621 | // let fullPath = ''; | COMMENT |
| LOW | packages/components/src/controllers/modifierKeys.ts | 41 | window.addEventListener('keyup', this._onKey, { capture: true }); | 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/refs.ts | 81 | 'for-each-ref', | COMMENT |
| LOW | packages/git-cli/src/providers/stash.ts | 441 | } | COMMENT |
| LOW | packages/git-cli/src/providers/graph.ts | 461 | return { stream: stream }; | COMMENT |
| LOW | packages/git-cli/src/providers/graph.ts | 681 | if (wt.sha != null) { | COMMENT |
| LOW | packages/git-cli/src/providers/graph.ts | 1481 | COMMENT | |
| LOW | packages/git-cli/src/providers/graph.ts | 2441 | // The full path (seeded fallback or unseeded full walk) re-derives everything → every channel changed. | COMMENT |
| LOW | packages/git-cli/src/providers/maintenance.ts | 841 | // Untracked cache is only CORRECT when directory mtimes are reliable; on network/virtual filesystems | COMMENT |
| LOW | packages/git-cli/src/providers/maintenance.ts | 1141 | // Re-check registration with a FRESH read (bypass the registered-repos TTL cache): the report that | COMMENT |
| LOW | packages/git-cli/src/providers/branches.ts | 1201 | // never matches the requested name, and would read as deleted — wiping a live branch's | COMMENT |
| LOW | packages/git-cli/src/providers/branches.ts | 2381 | if (!movedForward) return undefined; | COMMENT |
| LOW | …git-cli/src/providers/__tests__/integration/helpers.ts | 121 | // Everything below can throw (a spawned `git` failing, or the provider constructor) — without the | COMMENT |
| LOW | packages/git-cli/src/exec/git.ts | 1041 | gitCommand, | COMMENT |
| LOW | packages/git-cli/src/exec/git.ts | 1521 | COMMENT | |
| LOW | packages/git/src/features.ts | 61 | // A bare `fetch` reads every remote when `fetch.all` is set | COMMENT |
| LOW | packages/git/src/features.ts | 81 | // the loose-objects + incremental-repack tasks the auto tier uses landed in 2.30 (and `core.multiPackIndex` | COMMENT |
| LOW | packages/git/src/cache.ts | 801 | // (`gkConfig`/`config` below) or the branch itself is created/renamed/deleted. Every op that | COMMENT |
| LOW | packages/git/src/watching/watcherPatterns.ts | 1 | import { isAbsolute } from '@gitlens/utils/path.js'; | COMMENT |
| LOW | …s/git/src/watching/__tests__/watchSession.node.test.ts | 1341 | const received: WatcherRepoChangeEvent[] = []; | 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/commit-graph-ui/src/graph.scss | 41 | // NOTE: while the results bar is up, the tree gets an INLINE `max-height` of its rows' total height | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 561 | // not force their width — without it rows shrink to content and the columns collapse. | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 621 | cursor: pointer; | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 701 | // High-contrast selection ring (old-engine parity: `--selected-row-border: 1px solid`). A | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 781 | width: var(--row-graph-width); | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 821 | bottom: 0; | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1041 | // Opaque chip matching the effective row surface so it cleanly cuts the main icon's corner. | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1121 | // segments, top→bottom). It EXPANDS rightward over the lanes into a role-COLORED pill (each segment filled | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1181 | // past one level of nesting (see `--gutter-node-dim` below). | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1481 | COMMENT | |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1561 | // (`.gl-graph__gutter-edges`): the chain's OWN lane art (its verticals + dot) never renders into either | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1641 | } | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 1841 | // match here for exactly that reason — the message sits on the OTHER line). Only the trailing margin | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 3161 | // `.gl-graph__ref-pill#{$pill-filled}` wherever a rule needs to react to the pill being filled. | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 3221 | box-shadow 150ms ease-out; | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 3241 | inset 0 0 0 1px var(--ref-color), | COMMENT |
| LOW | packages/plus/commit-graph-ui/src/graph.scss | 3281 | color: var(--pill-on-fill); | COMMENT |
| 265 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/webview-styling.md | 179 | ## Quick guardrails | COMMENT |
| MEDIUM | docs/telemetry-events.md | 263 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 336 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 380 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 424 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 468 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 513 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 557 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 601 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 645 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | docs/telemetry-events.md | 691 | // Groups every request of one AI session — the whole user-facing task. Set by conflict resolution (`type: 'resolveCon | COMMENT |
| MEDIUM | packages/utils/src/diff.ts | 1 | // Annotates diff to make is easier for agentic reference to line number. | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 571 | // Shared scaffold for the pointer-driven drags (column-boundary resize, graph-column resize, h-scroll | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 577 | // unregister `resizeDragCleanup`. Each hand-rolled copy of this scaffold leaked differently over time | COMMENT |
| MEDIUM | …/shared/components/details-header/gl-details-header.ts | 104 | // 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 | 85 | // this scaffold was reshaped to avoid. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 105 | // ── git_status ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 131 | // ── git_branch ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 141 | // ── git_log_or_diff ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpGitReadTools.test.ts | 168 | // ── git_blame ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpSurface.test.ts | 99 | // ── Mode gating ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/specs/mcpSurface.test.ts | 127 | // ── Declared parameters ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/e2e/helpers/mcpHelper.ts | 512 | // ── Private helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 5640 | // ─── Interaction (delegated; rows carry no per-row listeners) ────────────── | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 8579 | // ─── Controllable scroll-into-view ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/webviews/apps/shared/styles/colors.scss | 28 | // ─── surface ──────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/webviews/apps/shared/styles/colors.scss | 54 | // ─── border ───────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/webviews/apps/shared/styles/colors.scss | 82 | // ─── divider ──────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/webviews/apps/shared/styles/colors.scss | 103 | // ─── feedback ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/webviews/apps/shared/styles/colors.scss | 224 | // ─── actions ──────────────────────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/git-cli/src/providers/operations.ts | 1369 | // no CLI-length limit (so no batching), and robust for paths with spaces/newlines. | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.scss | 2576 | // Loading spinner shown while the host computes diffstats. Absolutely pinned to the column header's | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 3326 | // TODO: a paging append re-scans every row. `recomputeDisplayRows` already computes a robust identity- | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 5182 | // header height, see graph.scss) so the header stays interactive (mode picker, hide, resize). Absolutely | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 9630 | // construction. Absolutely-positioned overlays report offsetWidth too but don't take flex-line | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 10660 | // Loading spinner while the host resolves diffstats. Absolutely pinned to the column's inline-end | COMMENT |
| MEDIUM | packages/plus/commit-graph-ui/src/graph.ts | 11588 | // Electron/WSL compositor, and `drop` intermittently never fired). Pointer events are the robust | COMMENT |
| MEDIUM | …/integrations/src/__tests__/perConnectionReads.test.ts | 362 | // robust regardless of the provider's paging mode. | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 219 | # Heredoc-delimited output is robust even if the value ever spans lines — this is the | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 269 | # itself is downloaded by the harness, so no path is emitted for it. | COMMENT |
| MEDIUM | src/uris/deepLinks/deepLinkService.ts | 709 | // to a separate service where it can be used outside of the context of deep linking. Then the deep link service should | COMMENT |
| 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 | 109 | await expect(this.input).toHaveAttribute('placeholder', placeholder, { timeout: timeout }); | CODE |
| LOW | tests/e2e/pageObjects/components/quickPick.ts | 119 | 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 | …c/webviews/apps/shared/__tests__/wireSerialize.test.ts | 31 | name: 'John Doe', | CODE |
| LOW | …c/webviews/apps/shared/__tests__/wireSerialize.test.ts | 35 | name: 'Jane Doe', | CODE |
| LOW | src/commands/quick-wizard/quickCommand.ts | 172 | }: Omit<Partial<QuickPickStep<T>>, 'placeholder'> & { | CODE |
| LOW | src/commands/quick-wizard/utils/steps.utils.ts | 55 | options?: Omit<Partial<QuickPickStep<T>>, 'placeholder'>, | CODE |
| LOW | src/git/__tests__/graphRowProcessor.test.ts | 35 | avatars: new Map<string, string>([['test@test.com', 'https://avatar']]), | CODE |
| LOW | src/git/__tests__/graphRowProcessor.test.ts | 45 | email: 'test@test.com', | CODE |
| 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 | 90 | // Step 1: commit1 - merge-tree --write-tree --merge-base (clean) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 105 | // Step 2: commit2 - merge-tree --write-tree --merge-base (CONFLICT) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 147 | // Step 1: commit1 - CONFLICT on file1.txt | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 162 | // Step 2: commit2 - clean merge | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 177 | // Step 3: commit3 - CONFLICT on file2.txt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …s/apps/plus/graph/components/gl-graph-details-panel.ts | 2744 | // 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 |
|---|---|---|---|---|
| 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 | 90 | // Step 1: commit1 - merge-tree --write-tree --merge-base (clean) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 105 | // Step 2: commit2 - merge-tree --write-tree --merge-base (CONFLICT) | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 147 | // Step 1: commit1 - CONFLICT on file1.txt | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 162 | // Step 2: commit2 - clean merge | COMMENT |
| LOW | …kages/git-cli/src/providers/__tests__/branches.test.ts | 177 | // Step 3: commit3 - CONFLICT on file2.txt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/plus/integrations/src/providers/azureDevOps.ts | 1564 | // TODO: implement repos version | COMMENT |
| LOW | …es/plus/integrations/src/providers/bitbucket-server.ts | 442 | // TODO: implement repos version | COMMENT |
| LOW | packages/plus/integrations/src/providers/bitbucket.ts | 459 | // TODO: implement repos version | COMMENT |
| LOW | src/webviews/apps/shared/components/tree/tree-view.ts | 1119 | // 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 |
| MEDIUM | src/plus/ai/actions/__tests__/generateCommits.test.ts | 54 | const prose = `Here is the commit organization:\n${commitsObject}\nLet me know if you need changes.`; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/runner/src/index.ts | 52 | async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> { | CODE |