Enhancement suite for Gemini, AI Studio, Claude, ChatGPT & DeepSeek — plus a prompt manager for any website, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude、ChatGPT 与 DeepSeek 的增强套件;其中的提示词管理器可用于任意网站,如 DeepSeek Harness。
This report summarizes scanner evidence for Nagi-ovo/gemini-voyager, a TypeScript project with 20,511 GitHub stars. SynthScan examined 739,193 lines of code across 5189 source files, recording 1140 pattern matches distributed across 11 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? 1049 finding(s).
Are imports declared and package/API names verified? 63 finding(s).
Are wrappers, guards, and repeated structures necessary? 1045 finding(s).
Which changes need focused human review? 1140 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 1140 distinct pattern matches across 11 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 | custom-vite-plugins.ts | 181 | export function selfContainedContentScripts(entries: readonly string[]): PluginOption { | CODE |
| LOW | public/response-complete-observer.js | 55 | function isGeminiGenerationRequest(url, bodyText) { | CODE |
| LOW | public/prevent-auto-scroll.js | 84 | function handlePossibleRouteChange() { | CODE |
| LOW | public/prevent-auto-scroll.js | 271 | function collectVerticalScrollPositions(target) { | CODE |
| LOW | public/prevent-auto-scroll.js | 285 | function restoreVerticalScrollPositions(positions) { | CODE |
| LOW | scripts/dev-build-assets.ts | 26 | export function readViteManifestAssetPaths(manifestPath: string): Set<string> { | CODE |
| LOW | scripts/dev-build-assets.ts | 54 | export function shouldPruneDevBuildAssets( | CODE |
| LOW | scripts/__tests__/buildPluginCatalogFixtures.ts | 122 | export function makePackagedFixtureCatalog(gemini: Record<string, unknown> = {}): string { | CODE |
| LOW | scripts/lib/pluginChecks.ts | 91 | export function checkPrimitivesAreShippable( | CODE |
| LOW | scripts/lib/siteKnowledge.ts | 15 | export function isSiteKnowledgeSourceFile(file: string): boolean { | CODE |
| LOW | scripts/lib/pluginEngineRelease.ts | 148 | export function unreleasedPluginEngineIssues(root: string): string[] { | CODE |
| LOW | scripts/lib/pluginEngineRelease.ts | 161 | export function preparePluginEngineRelease(root: string): PluginEngineReleasePlan { | CODE |
| LOW | scripts/lib/selectorImportOwners.ts | 140 | export function selectorPatternImportOwner(file: string, site: string): boolean { | CODE |
| LOW | scripts/lib/primitiveContractsSeam.ts | 32 | export function renderContractModulesSource(verbsDir = VERBS_DIR): string { | CODE |
| LOW | scripts/lib/primitiveContractsSeam.ts | 47 | export function installPrimitiveContractsSeam(): void { | CODE |
| LOW | scripts/lib/buildSiteLocators.ts | 12 | export function readPublishedSiteLocators(catalogDir: string, siteId: string) { | CODE |
| LOW | scripts/lib/siteFragmentOwnership.ts | 90 | export function inspectSiteFragmentOwnership(root: string): LocatorViolation[] { | CODE |
| LOW | scripts/lib/locatorLiterals.ts | 184 | function insensitiveAttributePattern(value: string): RegExp | null { | CODE |
| LOW | scripts/lib/buildPluginCatalog.ts | 227 | function assertPublishableSemanticKeys(host: string, site: CatalogSite): void { | CODE |
| LOW | scripts/lib/buildPluginCatalog.ts | 242 | function assertPublishableRouteWords(host: string, site: CatalogSite): void { | CODE |
| LOW | packages/bridge-protocol/src/validate/ops.ts | 446 | export function validateWaitReplyProgress(raw: unknown): Validation<WaitReplyProgress> { | CODE |
| LOW | packages/create-voyager-plugin/src/bundledSites.ts | 30 | export function requireBundledSiteAdapter(id: string): SiteAdapter { | CODE |
| LOW | src/core/types/highlight.ts | 68 | export function normalizeHighlightColorPalette( | CODE |
| LOW | src/core/types/highlight.ts | 349 | export function isHighlightConversationUrl(value: string, platform: HighlightPlatform): boolean { | CODE |
| LOW | src/core/types/keyboardShortcut.ts | 46 | export function keyboardShortcutFromEvent({ | CODE |
| LOW | src/core/types/keyboardShortcut.ts | 134 | export function keyboardShortcutBindingsEqual(a: KeyboardShortcut, b: KeyboardShortcut): boolean { | CODE |
| LOW | src/core/types/keyboardShortcut.ts | 149 | export function findKeyboardShortcutConflict( | CODE |
| LOW | src/core/types/keyboardShortcut.ts | 186 | export function isRestorableKeyboardShortcutStorage(value: unknown): boolean { | CODE |
| LOW | src/core/types/keyboardShortcut.ts | 228 | export function normalizeKeyboardShortcutConfig( | CODE |
| LOW | src/core/gemini/turnSelectors.ts | 41 | export function getBundledGeminiTurnSelectors(key: GeminiTurnSelectorKey): string[] { | CODE |
| LOW | src/core/gemini/turnSelectors.ts | 53 | export function getGeminiUserTurnObserverScope(selector: string): GeminiUserTurnObserverScope { | CODE |
| LOW | src/core/gemini/turnOwnership.ts | 5 | export function isOriginalGeminiTranscriptElement(element: Element): boolean { | CODE |
| LOW | src/core/gemini/turnIntegrity.ts | 30 | export function stripGeminiTurnNonContent(root: HTMLElement): void { | CODE |
| LOW | src/core/gemini/turnIntegrity.ts | 60 | export function acceptsGeminiTurnCollection( | CODE |
| LOW | src/core/gemini/domBoundary.ts | 70 | export function hasGeminiBoundaryConflict( | CODE |
| LOW | src/core/gemini/sidebarTitles.ts | 9 | export function readGeminiActiveSidebarTitle( | CODE |
| LOW | src/core/gemini/sidebarTitles.ts | 30 | export function readCorroboratedGeminiTitle( | CODE |
| LOW | src/core/gemini/nativeHealth.ts | 129 | export function buildNativeHealthIssueUrl( | CODE |
| LOW | src/core/gemini/sidebar/titleProof.ts | 15 | export function currentGeminiSidebarTitle(doc: Document): string | null { | CODE |
| LOW | src/core/gemini/sidebar/queries.ts | 20 | export function readGeminiSidebarElements( | CODE |
| LOW | src/core/gemini/sidebar/queries.ts | 41 | export function closestGeminiSidebarElement( | CODE |
| LOW | src/core/gemini/sidebar/queries.ts | 62 | export function packagedGeminiSidebarRoot(): HTMLElement | null { | CODE |
| LOW | src/core/gemini/sidebar/proof.ts | 35 | export function isOriginalGeminiSidebarNode(element: Element): boolean { | CODE |
| LOW | src/core/gemini/sidebar/proof.ts | 98 | export function acceptsGeminiSidebarElement( | CODE |
| LOW | src/core/gemini/sidebar/proof.ts | 116 | export function acceptsGeminiSidebarScroller( | CODE |
| LOW | src/core/gemini/sidebar/actions.ts | 33 | export function isProvenGeminiSidebarToggle(button: Element): button is HTMLButtonElement { | CODE |
| LOW | src/core/gemini/sidebar/actions.ts | 50 | export function remoteGeminiSidebarToggle(doc: Document = document): HTMLButtonElement | null { | CODE |
| LOW | src/core/gemini/sidebar/actions.ts | 91 | export function remoteGeminiActionsContainer(row: HTMLElement): HTMLElement | null { | CODE |
| LOW | src/core/gemini/composer/ownedInput.ts | 13 | export function findOwnedGeminiMainInputs(doc: Document): HTMLElement[] { | CODE |
| LOW | src/core/gemini/composer/native.ts | 13 | export function isNativeComposerElementVisible(element: HTMLElement): boolean { | CODE |
| LOW | src/core/gemini/content/reads.ts | 50 | export function preservesGeminiContentFrames(candidate: Element, host: Element): boolean { | CODE |
| LOW | src/core/gemini/content/reads.ts | 75 | export function bundledGeminiAnswerElement(host: HTMLElement): HTMLElement { | CODE |
| LOW | src/core/gemini/content/reads.ts | 83 | export function resolveGeminiAnswerElement( | CODE |
| LOW | src/core/gemini/content/reads.ts | 184 | export function acceptsGeminiContentCollection( | CODE |
| LOW | src/core/gemini/content/reads.ts | 211 | export function acceptsGeminiContextImages(host: HTMLElement, view: GeminiSelectorView): boolean { | CODE |
| LOW | src/core/gemini/content/conversation.ts | 42 | export function resolveGeminiConversationRoot( | CODE |
| LOW | src/core/gemini/math/userLatex.ts | 56 | export function resolveGeminiUserLatexLines( | CODE |
| LOW | src/core/gemini/selectors/validation.ts | 19 | export function isGeminiSelectorProfileKey(key: string): key is GeminiSelectorProfileKey { | CODE |
| LOW | src/core/gemini/selectors/validation.ts | 23 | export function readGeminiSelectorProfiles(value: unknown): GeminiSelectorPatch | null { | CODE |
| LOW | src/core/gemini/selectors/service.ts | 22 | export function initializeGeminiSelectors( | CODE |
| 957 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …pages/background/__tests__/cloudStableIdentity.test.ts | 338 | expect(result.data.folders.data.folders.map((folder) => folder.id).sort()).toEqual([ | CODE |
| CRITICAL | src/pages/popup/__tests__/Popup.test.tsx | 58 | extensionApi.storage.local.get.mock.calls.filter( | CODE |
| CRITICAL | src/pages/popup/__tests__/Popup.test.tsx | 67 | extensionApi.storage.sync.get.mock.calls.filter( | CODE |
| CRITICAL | src/pages/popup/__tests__/Popup.test.tsx | 194 | const messageTypes = extensionApi.runtime.sendMessage.mock.calls.map( | CODE |
| CRITICAL | src/pages/popup/__tests__/Popup.test.tsx | 338 | const bulkReads = extensionApi.storage.sync.get.mock.calls.filter( | CODE |
| CRITICAL | src/pages/popup/__tests__/Popup.pluginSites.test.tsx | 265 | const requestedLocalKeys = extensionApi.storage.local.get.mock.calls.flatMap(([keys]) => | CODE |
| CRITICAL | src/pages/popup/__tests__/Popup.pluginSites.test.tsx | 269 | const messageTypes = extensionApi.runtime.sendMessage.mock.calls.map( | CODE |
| CRITICAL | …ialPlugins/__tests__/OfficialPluginList.popup.test.tsx | 214 | extensionApi.storage.local.set.mock.calls.some(([updates]) => | CODE |
| CRITICAL | …Plugins/__tests__/OfficialPluginOptions.popup.test.tsx | 81 | extensionApi.storage.local.set.mock.calls.some(([updates]) => | CODE |
| CRITICAL | …Plugins/__tests__/OfficialPluginOptions.popup.test.tsx | 137 | expect(extensionApi.storage.sync.set.mock.calls.map(([payload]) => payload)).toEqual([ | CODE |
| CRITICAL | …Plugins/__tests__/OfficialPluginOptions.popup.test.tsx | 189 | extensionApi.storage.sync.set.mock.calls.some(([payload]) => | CODE |
| CRITICAL | …Plugins/__tests__/OfficialPluginOptions.popup.test.tsx | 329 | expect(extensionApi.storage.sync.set.mock.calls.map(([payload]) => payload)).toEqual([ | CODE |
| CRITICAL | …/pages/popup/officialPlugins/__tests__/popupHarness.ts | 109 | extensionApi.storage.onChanged.removeListener.mock.calls.map(([listener]) => listener), | CODE |
| CRITICAL | …_/OfficialPluginOptions.gemsEffectsSync.popup.test.tsx | 79 | extensionApi.storage.local.set.mock.calls.some(([updates]) => | CODE |
| CRITICAL | …_/OfficialPluginOptions.gemsEffectsSync.popup.test.tsx | 203 | expect(extensionApi.storage.sync.set.mock.calls.map(([payload]) => payload)).toEqual([ | CODE |
| CRITICAL | …_/OfficialPluginOptions.gemsEffectsSync.popup.test.tsx | 298 | extensionApi.tabs.sendMessage.mock.calls.filter(([, message]) => isSyncRequest(message)); | CODE |
| CRITICAL | …fficialPlugins/__tests__/PluginSiteRows.popup.test.tsx | 129 | const listeners = extensionApi.permissions.onAdded.addListener.mock.calls.map( | CODE |
| CRITICAL | …s/__tests__/OfficialPluginList.controls.popup.test.tsx | 85 | extensionApi.storage.local.set.mock.calls.some(([updates]) => | CODE |
| CRITICAL | …s/__tests__/OfficialPluginList.controls.popup.test.tsx | 303 | expect(extensionApi.storage.sync.set.mock.calls.map(([payload]) => payload)).toEqual([ | CODE |
| CRITICAL | …alPlugins/__tests__/OfficialPluginCards.popup.test.tsx | 211 | expect(extensionApi.storage.sync.set.mock.calls.map(([payload]) => payload)).toEqual([ | CODE |
| CRITICAL | src/pages/panel/__tests__/PanelApp.storage.test.tsx | 40 | extensionApi.storage.sync.set.mock.calls.filter(([updates]) => | CODE |
| CRITICAL | src/pages/panel/__tests__/PanelApp.sites.test.tsx | 47 | extensionApi.runtime.sendMessage.mock.calls.map( | CODE |
| CRITICAL | src/pages/panel/__tests__/PanelApp.sync.test.tsx | 179 | const status = extensionApi.runtime.sendMessage.mock.calls.findIndex( | CODE |
| CRITICAL | …es/content/folder/__tests__/folderActivityView.test.ts | 289 | harness.store.data.folderContents.copy.find((c) => c.conversationId === 'imported-7f3a'); | CODE |
| CRITICAL | …es/content/folder/__tests__/folderActivityView.test.ts | 296 | harness.store.data.folderContents.copy = harness.store.data.folderContents.copy.map((c) => | CODE |
| CRITICAL | …es/content/folder/__tests__/aistudioFolderSync.test.ts | 42 | return mockBrowser.storage.local.get.mock.calls.filter(([keys]) => keys === key).length; | CODE |
| CRITICAL | …es/content/folder/__tests__/aistudioFolderSync.test.ts | 215 | mockBrowser.storage.local.set.mock.calls.filter(([values]) => GLOBAL_KEY in values).length; | CODE |
| CRITICAL | …/aistudioPersistenceCharacterization.migration.test.ts | 105 | const writtenKeys = mockBrowser.storage.local.set.mock.calls.map(([values]) => | CODE |
| CRITICAL | …ages/content/folder/__tests__/observerBatching.test.ts | 172 | owners.store.data.folderContents.f1.map(({ conversationId }) => conversationId), | CODE |
| CRITICAL | …ages/content/folder/__tests__/observerBatching.test.ts | 188 | owners.store.data.folderContents.f1.map((conversation) => conversation.conversationId), | CODE |
| CRITICAL | …content/folder/__tests__/folderRuntimeMessages.test.ts | 88 | const call = mockBrowser.runtime.onMessage.addListener.mock.calls.at(-1); | CODE |
| CRITICAL | …content/folder/__tests__/folderRuntimeMessages.test.ts | 182 | const settingsListener = mockBrowser.storage.onChanged.addListener.mock.calls.at(-1)![0]; | CODE |
| CRITICAL | …content/folder/__tests__/folderRuntimeMessages.test.ts | 183 | const messageListener = mockBrowser.runtime.onMessage.addListener.mock.calls.at(-1)![0]; | CODE |
| CRITICAL | …gTree/__tests__/characterization.aistudioStore.test.ts | 97 | return mockBrowser.storage.local.set.mock.calls.filter(([values]) => | CODE |
| CRITICAL | …c/pages/content/visualEffects/__tests__/sakura.test.ts | 393 | const staleDrainMessage = channel.port1.postMessage.mock.calls.at(-1)?.[0] as { | CODE |
| CRITICAL | …c/pages/content/visualEffects/__tests__/sakura.test.ts | 406 | const latestDrainMessage = channel.port1.postMessage.mock.calls.at(-1)?.[0] as { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/release.yml | 12 | # ------------------------- | COMMENT |
| MEDIUM | .github/workflows/security.yml | 38 | # ── Dependency Review ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/security.yml | 58 | # ── Bun Audit ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 19 | # ── Change detection ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 89 | # ── Format (oxfmt) ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 113 | # ── Lint (oxlint) ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 129 | # ── TypeScript ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 146 | # ── Tests ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 163 | # ── Plugin catalog check ────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 184 | # ── Native Swift Tests + Xcode Build ───────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 217 | # ── Build (all browsers) ────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 237 | # ── Docs build ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 258 | # ── i18n consistency ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 271 | # ── PR size label ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 308 | # ── Summary (required-check anchor) ─────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/sidebarAutoHide/hoverIntent.ts | 215 | // ─── Mouse Event Handlers ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/sidebarAutoHide/controller.ts | 125 | // ─── Sidebar Toggle ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/sidebarAutoHide/controller.ts | 209 | // ─── Shared Infrastructure ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/export/canvasContent.ts | 44 | // ── Document Canvas (immersive-editor .ProseMirror) ──────────────── | COMMENT |
| MEDIUM | src/pages/content/export/canvasContent.ts | 158 | // ── Public API ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/export/canvasContent.ts | 176 | // ── Detection helpers ────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/content/export/__tests__/canvasDocExtractor.test.ts | 17 | // ── isAnyCanvasOpen ──────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/content/export/__tests__/canvasDocExtractor.test.ts | 35 | // ── assistantHasCanvasDoc ────────────────────────────────────── | COMMENT |
| MEDIUM | …es/content/export/__tests__/canvasDocExtractor.test.ts | 74 | // ── Document Canvas (ProseMirror) ────────────────────────────── | COMMENT |
| MEDIUM | …es/content/export/__tests__/canvasDocExtractor.test.ts | 170 | // ── Code Canvas (Monaco editor) ──────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/coachmark/index.ts | 107 | // ── Seen-state (shared array, synced) ─────────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/coachmark/index.ts | 171 | // ── DOM helpers ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/pages/content/coachmark/index.ts | 230 | // ── Engine ────────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/features/prompt/model/promptMarkdown.ts | 12 | * `<YOUR_API_KEY>` is simply removed. | COMMENT |
| HIGH | src/features/prompt/model/promptMarkdown.ts | 12 | * `<YOUR_API_KEY>` is simply removed. | COMMENT |
| HIGH | …features/prompt/model/__tests__/promptMarkdown.test.ts | 24 | expect(rendered('Use <YOUR_API_KEY> here.')).toContain('<YOUR_API_KEY>'); | CODE |
| HIGH | …features/prompt/model/__tests__/promptMarkdown.test.ts | 24 | expect(rendered('Use <YOUR_API_KEY> here.')).toContain('<YOUR_API_KEY>'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ore/services/__tests__/AccountIsolationService.test.ts | 98 | email: 'user@example.com', | CODE |
| LOW | …ore/services/__tests__/AccountIsolationService.test.ts | 151 | email: 'user@example.com', | CODE |
| LOW | …ore/services/__tests__/AccountIsolationService.test.ts | 287 | <conversations-list><a aria-label="Mail ops@example.org">Mail ops@example.org</a></conversations-list> | CODE |
| LOW | …alog/sites/chatgpt/selector-data/actions-packaged.json | 19 | "composerLabelAttributes": ["aria-label", "aria-placeholder", "placeholder"], | CODE |
| LOW | …/export/services/__tests__/DOMContentExtractor.test.ts | 142 | <img src="about:blank" alt="placeholder" /> | CODE |
| LOW | src/pages/background/__tests__/cloudSyncScopeHarness.ts | 79 | callback('fake-token'), | CODE |
| LOW | …es/background/__tests__/cloudSyncHighlightUndo.test.ts | 123 | callback('fake-token'), | CODE |
| LOW | …omponents/__tests__/CloudSyncSettingsDownload.test.tsx | 430 | email: 'user@example.com', | CODE |
| LOW | …omponents/__tests__/CloudSyncSettingsDownload.test.tsx | 440 | accountKey: `email:${hashString('user@example.com')}`, | CODE |
| LOW | …omponents/__tests__/CloudSyncSettingsDownload.test.tsx | 470 | `email:${hashString('user@example.com')}`, | CODE |
| LOW | …/components/__tests__/CloudSyncSettingsUpload.test.tsx | 110 | context: { routeUserId: '0', email: 'user@example.com' }, | CODE |
| LOW | src/pages/panel/__tests__/PanelApp.i18n.test.tsx | 54 | for (const name of ['aria-label', 'title', 'placeholder']) { | CODE |
| LOW | src/pages/panel/__tests__/PanelApp.i18n.test.tsx | 72 | expect(query('.search input')?.getAttribute('placeholder')).toBe(own(locale, 'panelSearch')); | CODE |
| LOW | …tent/highlight/__tests__/HighlightEditorBudget.test.ts | 82 | { platform: 'gemini', accountKey: 'user@example.com', accountId: 1, routeUserId: '0' }, | CODE |
| LOW | …/pages/content/researchPack/__tests__/receiver.test.ts | 576 | '<p data-placeholder="Ask anything" class="placeholder">' + | CODE |
| LOW | src/pages/content/draftSave/geminiDraftPolicy.ts | 50 | input.getAttribute('placeholder'), | CODE |
| LOW | src/pages/content/draftSave/geminiDraftPolicy.ts | 53 | richTextarea?.getAttribute('placeholder'), | CODE |
| LOW | …content/draftSave/__tests__/onlineDraftTargets.test.ts | 96 | field().removeAttribute('placeholder'); | CODE |
| LOW | …content/draftSave/__tests__/onlineDraftTargets.test.ts | 152 | field().removeAttribute('placeholder'); | CODE |
| LOW | src/pages/content/quoteReply/quoteInsertion.ts | 32 | input.getAttribute('placeholder'), | CODE |
| LOW | src/pages/content/quoteReply/quoteInsertion.ts | 35 | richTextarea?.getAttribute('placeholder'), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | public/fetchInterceptor.js | 286 | // Step 2: Processing | COMMENT |
| LOW⚡ | scripts/build-safari.sh | 10 | # Step 1: Build the extension using Vite | COMMENT |
| LOW⚡ | scripts/build-safari.sh | 14 | # Step 2: Check if dist_safari exists | COMMENT |
| LOW⚡ | scripts/build-safari.sh | 22 | # Step 3: Convert to Safari App Extension (requires macOS) | COMMENT |
| LOW | src/pages/content/folder/FolderRepositoryLoads.ts | 267 | // Step 1: Read both stores, including durable copies that cannot fit in localStorage. | COMMENT |
| LOW⚡ | src/pages/content/folder/FolderRepositoryLoads.ts | 290 | // Step 2: If current this.data already has valid structure, keep it | COMMENT |
| LOW⚡ | src/pages/content/folder/FolderRepositoryLoads.ts | 299 | // Step 3: Last resort - initialize empty data and log critical error | COMMENT |
| LOW | src/pages/content/watermarkRemover/downloadFeedback.ts | 252 | // Step 3: Done, auto-dismiss after 2s | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | public/fetchInterceptor.js | 286 | // Step 2: Processing | COMMENT |
| LOW⚡ | scripts/build-safari.sh | 10 | # Step 1: Build the extension using Vite | COMMENT |
| LOW⚡ | scripts/build-safari.sh | 14 | # Step 2: Check if dist_safari exists | COMMENT |
| LOW⚡ | scripts/build-safari.sh | 22 | # Step 3: Convert to Safari App Extension (requires macOS) | COMMENT |
| LOW | src/pages/content/folder/FolderRepositoryLoads.ts | 267 | // Step 1: Read both stores, including durable copies that cannot fit in localStorage. | COMMENT |
| LOW⚡ | src/pages/content/folder/FolderRepositoryLoads.ts | 290 | // Step 2: If current this.data already has valid structure, keep it | COMMENT |
| LOW⚡ | src/pages/content/folder/FolderRepositoryLoads.ts | 299 | // Step 3: Last resort - initialize empty data and log critical error | COMMENT |
| LOW | src/pages/content/watermarkRemover/downloadFeedback.ts | 252 | // Step 3: Done, auto-dismiss after 2s | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/release.yml | 21 | # 1. Calculates the next version. | COMMENT |
| LOW | .github/workflows/security.yml | 1 | name: Security | COMMENT |
| LOW | src/core/types/storageKeys/appearanceKeys.ts | 21 | // Sidebar behavior | COMMENT |
| LOW | src/core/types/storageKeys/appearanceKeys.ts | 41 | GV_GEMS_MRU: 'gvGemsMru', | COMMENT |
| LOW | src/core/types/storageKeys/appearanceKeys.ts | 61 | // from any Gemini page to refresh the snapshot without navigating. | COMMENT |
| LOW | src/core/types/storageKeys/conversationKeys.ts | 41 | MARKDOWN_FIX_ENABLED: 'gvMarkdownFixEnabled', | COMMENT |
| LOW | src/core/types/storageKeys/pluginKeys.ts | 1 | /** | COMMENT |
| LOW | src/core/types/storageKeys/pluginKeys.ts | 21 | // (chrome.storage.local). Full key: `${prefix}${location.host}`, e.g. | COMMENT |
| LOW | src/core/types/storageKeys/pluginKeys.ts | 41 | // (chrome.storage.local). Shape: Record<'local.<id>', LocalPluginRecord> (see | COMMENT |
| LOW | src/pages/background/promptNudgeRegistration.ts | 1 | import browser from 'webextension-polyfill'; | COMMENT |
| LOW | src/pages/content/index.tsx | 381 | // Initialize i18n early to ensure translations are available | COMMENT |
| LOW | src/pages/content/folder/NativeSidebarObserver.ts | 181 | } | COMMENT |
| LOW | src/pages/content/export/responseActionImageButton.ts | 101 | // click-through so the button itself receives every click uniformly. Without | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/en/guide/nanobanana.md | 9 | Images generated by Gemini™ come with a visible watermark by default. While this is intended for safety, there are creat | CODE |
| HIGH | …atermarkRemover/__tests__/packagedImagePreview.test.ts | 14 | host.innerHTML = `<single-image _ngcontent-ng-c2="" _nghost-ng-c3="" class="generated-image large"><div _ngcontent-ng- | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …es/content/export/__tests__/exportOutputGolden.test.ts | 200 | print("hi") | CODE |
| HIGH | …es/content/export/__tests__/exportOutputGolden.test.ts | 258 | print("hi") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/pages/content/folder/NativeConversationMenus.ts | 163 | // observer. This mirrors the proven, robust export-button observer: it | COMMENT |