Your AI workspace for models, agents, and productivity.
This report summarizes scanner evidence for CherryHQ/cherry-studio, a TypeScript project with 53,119 GitHub stars. SynthScan examined 1,857,755 lines of code across 9978 source files, recording 3030 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 2.5 (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? 2453 finding(s).
Are imports declared and package/API names verified? 97 finding(s).
Are wrappers, guards, and repeated structures necessary? 2642 finding(s).
Which changes need focused human review? 3030 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 3030 distinct pattern matches across 18 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 | electron.vite.config.ts | 63 | export function resolveSentryBuildSettings(env: NodeJS.ProcessEnv) { | CODE |
| LOW | …sources/skills/office-transform/scripts/office/docx.py | 242 | def reject_unrepresentable_content(paragraph, index: int) -> None: | CODE |
| LOW | tests/__mocks__/renderer/useDataApi.ts | 287 | function notifyMockInfiniteQuerySubscribers(key: string) { | CODE |
| LOW | tests/__mocks__/renderer/useDataApi.ts | 297 | async function applyMockInfiniteQueryMutation(key: string, value: unknown) { | CODE |
| LOW | tests/e2e/regression/agents.ts | 15 | export async function startBuiltinAssistantTask(page: Page): Promise<void> { | CODE |
| LOW | tests/e2e/regression/models.ts | 42 | export async function skipNewProviderModelSetup(page: Page): Promise<void> { | CODE |
| LOW | docs/references/ai/remote-agent-implementation.md | 138 | function encodeAgentCheckpointPage(page: AgentCheckpointPage): Uint8Array | CODE |
| LOW | scripts/skills-common.ts | 53 | export function buildAgentsSkillsGitignore(skillNames: string[]): string { | CODE |
| LOW | scripts/skills-common.ts | 71 | export function buildClaudeSkillsGitignore(skillNames: string[]): string { | CODE |
| LOW | scripts/skills-check.ts | 65 | function checkTrackedFilesAgainstWhitelist(skillNames: string[], errors: string[]) { | CODE |
| LOW | scripts/generate-system-provider-ids.ts | 56 | export function renderSystemProviderIdsFile(ids: string[]): string { | CODE |
| LOW | scripts/download-binaries.js | 144 | function sweepUnreferencedVersions(cacheRoot, maxAgeMs) { | CODE |
| LOW | scripts/publishRegistryCatalog.js | 69 | function readPublishedMinAppVersion(manifestPath) { | CODE |
| LOW | scripts/invalidate-electron-rebuild-metadata.js | 4 | function invalidateElectronRebuildMetadata(moduleDirectory) { | CODE |
| LOW | scripts/i18n-main-keys.ts | 4 | export function collectMainTranslationKeys(content: string, filename: string): { keys: string[]; dynamic: string[] } { | CODE |
| LOW | scripts/fix-tailwind-canonical-classes.ts | 97 | function canonicalizeCssVariableToken(originalToken: string, canonicalToken: string): string { | CODE |
| LOW | scripts/fix-tailwind-canonical-classes.ts | 122 | function collectCanonicalClassFindings( | CODE |
| LOW | scripts/fix-tailwind-canonical-classes.ts | 196 | export function findTailwindCanonicalClassFindingsInContent( | CODE |
| LOW | scripts/update-languages.ts | 50 | function generateLanguagesFileContent(languages: Record<string, LanguageData>): string { | CODE |
| LOW | scripts/i18n-check-unused.ts | 126 | function getJsxAttributeStringValue(node: Node): string | null { | CODE |
| LOW | scripts/i18n-check-unused.ts | 172 | function collectTemplateExpressionMatches( | CODE |
| LOW | scripts/i18n-check-unused.ts | 215 | function collectExactSourceTextReferences( | CODE |
| LOW | scripts/i18n-check-unused.ts | 229 | function collectShortcutReferences(localeKeys: Set<string>, usedKeys: Set<string>): void { | CODE |
| LOW | scripts/packaging/artifact-build-completed.js | 20 | function normalizeArtifactFilePath(file, productName, version, platform, releaseProductName = productName) { | CODE |
| LOW | scripts/packaging/after-pack.js | 8 | function installComputerUseRuntime(context) { | CODE |
| LOW | scripts/packaging/before-pack.js | 101 | async function prepareNativeModulesForElectron( | CODE |
| LOW | scripts/packaging/before-pack.js | 173 | function prepareSystemSpeechHelper( | CODE |
| LOW | scripts/release/validate-release-state.js | 3 | function validateReleaseBranchHead({ branchSha, workflowSha }) { | CODE |
| LOW | scripts/release/hotfix-release-notes.js | 87 | function updateHotfixReleaseMetadata({ builderPath, historyPath, prBody, version }) { | CODE |
| LOW | scripts/release/edition.js | 64 | function getExpectedReleaseArtifacts({ edition, platform, productName, version }) { | CODE |
| LOW | scripts/uiContract/__tests__/maintainedAnchors.test.ts | 16 | async function documentedMaintainedTokens(): Promise<string[]> { | CODE |
| LOW | scripts/__tests__/release-workflow.test.ts | 453 | function createPreparedReleaseFixture(targetVersion = '1.1.0', baseVersion = '1.0.0'): GitFixture { | CODE |
| LOW | scripts/voice-runtime-smoke/rendererExpression.ts | 5 | export function createVoiceRuntimeSmokeExpression( | CODE |
| LOW | scripts/e2e/ondemand/profile.ts | 36 | export async function prepareAuthenticatedProfile(page: Page, config: ProfileConfig): Promise<void> { | CODE |
| LOW | scripts/e2e/regression/process.ts | 44 | export function windowsProcessExecutablePath(pid: number): string { | CODE |
| LOW | scripts/e2e/regression/process.ts | 79 | export function terminateOwnedMacProcessGroup(record: ProcessOwner, signal: 'SIGTERM' | 'SIGKILL' = 'SIGTERM'): void { | CODE |
| LOW | scripts/e2e/regression/process.ts | 103 | export async function waitForMacProcessGroupExit(groupId: number, timeoutMs = 8_000): Promise<boolean> { | CODE |
| LOW | scripts/e2e/regression/builtinAgents.ts | 9 | export function resolveBuiltinAssistantAgent( | CODE |
| LOW | scripts/e2e/regression/cherryInOauth.ts | 129 | async function resolveAuthorizationDestination( | CODE |
| LOW | scripts/e2e/regression/debugBridge.ts | 37 | export async function inspectOwnedAppEnvironment(record: AppRecord): Promise<{ | CODE |
| LOW | scripts/e2e/regression/debugBridge.ts | 52 | export async function prepareWindowsCdpConnection(record: AppRecord): Promise<void> { | CODE |
| LOW | scripts/e2e/regression/debugBridge.ts | 96 | export async function captureCherryInAuthorizationUrl( | CODE |
| LOW | scripts/e2e/regression/debugBridge.ts | 146 | export async function sendCherryInCallbackToOwnedApp(record: AppRecord, callback: string): Promise<void> { | CODE |
| LOW | scripts/linux-native/download.js | 73 | function ensureLinuxNativeArtifact({ | CODE |
| LOW | scripts/linux-native/compat.js | 65 | function assertVersionRequirements(requirements) { | CODE |
| LOW | scripts/linux-native/compat.js | 176 | function readInstalledPackageVersion(projectRoot, packageName) { | CODE |
| LOW | packages/extension-table-plus/src/cell/table-cell.ts | 30 | function createCellSelectionDecorationSet(doc: ProseMirrorNode, selection: Selection): DecorationSet { | CODE |
| LOW | …ries/components/composites/composite-input.stories.tsx | 433 | render: function SelectVariantInteractiveExample() { | CODE |
| LOW | …ries/components/composites/composite-input.stories.tsx | 778 | render: function EmailVariantInteractiveExample() { | CODE |
| LOW | …ries/components/composites/composite-input.stories.tsx | 978 | render: function SubscribeNewsletterExample() { | CODE |
| LOW | …ui/stories/components/composites/menu-list.stories.tsx | 210 | function SmallMenuWithGroupsExample() { | CODE |
| LOW | …ui/stories/components/composites/menu-list.stories.tsx | 270 | function SettingsSubmenuActiveBoldExample() { | CODE |
| LOW | …ges/ui/stories/components/primitives/input.stories.tsx | 317 | render: function RealTimeValidationExample() { | CODE |
| LOW | …es/ui/stories/components/primitives/switch.stories.tsx | 521 | render: function InteractiveLoadingExample() { | CODE |
| LOW | …/ui/stories/components/primitives/textarea.stories.tsx | 98 | render: function WithCharacterCountExample() { | CODE |
| LOW | …/ui/stories/components/primitives/combobox.stories.tsx | 498 | render: function TriggerSearchFontListExample() { | CODE |
| LOW | …/ui/stories/components/primitives/combobox.stories.tsx | 536 | render: function CustomFilterOptionExample() { | CODE |
| LOW | …s/components/primitives/description-switch.stories.tsx | 272 | render: function NotificationSettingsExample() { | CODE |
| LOW | …s/components/primitives/description-switch.stories.tsx | 385 | render: function ApplicationSettingsExample() { | CODE |
| LOW | …s/components/primitives/description-switch.stories.tsx | 558 | render: function ComplexSettingsPanelExample() { | CODE |
| 2102 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …sources/skills/office-transform/scripts/office/docx.py | 35 | # ── read: extract ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …sources/skills/office-transform/scripts/office/docx.py | 88 | # ── write: patch-copy ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …sources/skills/office-transform/scripts/office/xlsx.py | 57 | # ── A1 primitives (both paths) ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …sources/skills/office-transform/scripts/office/xlsx.py | 103 | # ── read: extract ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …sources/skills/office-transform/scripts/office/xlsx.py | 253 | # ── write: patch-copy ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ources/skills/office-transform/scripts/office/ooxml.py | 91 | # ── minidom helpers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/skills/skill-creator/eval-viewer/generate_review.py | 284 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …es/skills/skill-creator/eval-viewer/generate_review.py | 286 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docs/references/ai/stream-manager.md | 472 | // ── Single dispatch entry ───────────────────────────────────────── | COMMENT |
| MEDIUM | docs/references/ai/stream-manager.md | 493 | // ── Subscription management ─────────────────────────────────────── | COMMENT |
| MEDIUM | docs/references/ai/stream-manager.md | 499 | // ── Control ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/references/ai/stream-manager.md | 514 | // ── Inspection (read-only snapshot) ─────────────────────────────── | COMMENT |
| MEDIUM | …s/data/best-practice-default-values-and-nullability.md | 189 | // ─── DB schema ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/data/best-practice-default-values-and-nullability.md | 207 | // ─── Zod schema ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/data/best-practice-default-values-and-nullability.md | 239 | // ─── Service ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/data/best-practice-default-values-and-nullability.md | 260 | // ─── Row → Entity ───────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/download-binaries.js | 205 | // ── Tool definitions ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/download-binaries.js | 458 | // ── Core logic ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/download-binaries.js | 666 | // ── Main ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/icons-generate-avatars.ts | 306 | // ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/icons-generate-avatars.ts | 308 | // ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 19 | // ─── Helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 46 | // ─── Single-color fill conversion ──────────────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 82 | // ─── Multi-color opacity mapping ───────────────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 103 | // ─── Narrow luminance range opacity spread ──────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 136 | // ─── White fill handling: backgroundWasDark ────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 189 | // ─── url(#gradient) fills ──────────────────────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 189 | // ─── url(#gradient) fills ──────────────────────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 203 | // ─── Removal of defs/clipPath/attributes ───────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 264 | // ─── Phase 0: Mask-based shape extraction ──────────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 347 | // ─── Integration: backgroundWasDark threshold ──────────────────────── | COMMENT |
| MEDIUM | …ages/ui/scripts/__tests__/svgo-convert-to-mono.test.ts | 387 | // ─── Cutout / luminance mask preservation ───────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 22 | // ─── colorToLuminance ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 73 | // ─── isWhiteFill ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 105 | // ─── parseSvgPathBounds ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 162 | // ─── parseViewBox ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 186 | // ─── isLargeShape ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 204 | // ─── normalizeColor ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/ui/scripts/__tests__/svg-utils.test.ts | 222 | // ─── isMonochromeSvg ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 18 | // ─── Helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 35 | // ─── Rule 1: <rect> background ────────────────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 106 | // ─── Rule 2: Rounded-rect path background ─────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 177 | // ─── Rule 3: Large dark traced background ──────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 285 | // ─── Rule 4: Large white background path ───────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 301 | // ─── detectOnly mode ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 341 | // ─── Element collection: skip mask/clipPath/defs ───────────────────── | COMMENT |
| MEDIUM | …es/ui/scripts/__tests__/svgo-remove-background.test.ts | 374 | // ─── Preserves non-background elements ─────────────────────────────── | COMMENT |
| MEDIUM | …ponents/composites/entity-selector/entity-selector.tsx | 98 | // ── Keyboard navigation ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/scripts/upstream.ts | 59 | // ── models.dev ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/scripts/upstream.ts | 157 | // ── OpenRouter ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/scripts/upstream.ts | 340 | // ── merge across sources (the fix for the minimax-m3 video gap) ─────────────── | COMMENT |
| MEDIUM | packages/provider-registry/scripts/upstream.ts | 399 | // ── raw upstream API shapes ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/src/utils/normalize.ts | 9 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/src/utils/normalize.ts | 11 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/src/utils/normalize.ts | 141 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/provider-registry/src/utils/normalize.ts | 143 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/provider-registry/src/schemas/imageParamCatalog.ts | 33 | // ── Value-type helpers ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …kages/provider-registry/src/schemas/provider-models.ts | 51 | // ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | …kages/provider-registry/src/schemas/provider-models.ts | 53 | // ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | packages/provider-registry/src/schemas/provider.ts | 20 | // ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| 402 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …erer/services/voice/__tests__/DictationService.test.ts | 343 | expect(harness.voice.discardSession.mock.calls.filter(([sessionId]) => sessionId === 'session-4')).toHaveLength(0) | CODE |
| CRITICAL | …erer/services/voice/__tests__/DictationService.test.ts | 708 | expect(harness.voice.discardSession.mock.calls.at(-1)?.[0]).toBe('session-2') | CODE |
| CRITICAL⚡ | src/main/core/window/__tests__/WindowManager.test.ts | 508 | const call = win.webContents.on.mock.calls.find(([event]) => event === 'will-frame-navigate') | CODE |
| CRITICAL | src/main/core/window/__tests__/WindowManager.test.ts | 451 | const call = win.webContents.on.mock.calls.find(([event]) => event === 'will-navigate') | CODE |
| CRITICAL | …c/main/features/browser/__tests__/GuestSession.test.ts | 214 | expect(mock.debugger.sendCommand.mock.calls.filter(([method]) => method === 'Page.enable')).toHaveLength(1) | CODE |
| CRITICAL | …c/main/features/browser/__tests__/GuestSession.test.ts | 239 | expect(mock.debugger.sendCommand.mock.calls.filter(([method]) => method === 'Runtime.evaluate')).toHaveLength(1) | CODE |
| CRITICAL | …c/main/features/browser/__tests__/GuestSession.test.ts | 252 | expect(mock.debugger.sendCommand.mock.calls.some(([method]) => method === 'DOM.describeNode')).toBe(false) | CODE |
| CRITICAL | …c/main/features/browser/__tests__/GuestSession.test.ts | 282 | expect(mock.debugger.sendCommand.mock.calls.map(([method]) => method)).toEqual(['Page.enable']) | CODE |
| CRITICAL | …c/main/features/browser/__tests__/GuestSession.test.ts | 470 | mock.debugger.sendCommand.mock.calls.filter(([method]) => method === 'Page.createIsolatedWorld') | CODE |
| CRITICAL | …ledge/tasks/__tests__/indexDocumentsJobHandler.test.ts | 293 | MockMainCacheServiceExport.cacheService.setShared.mock.calls.filter( | CODE |
| CRITICAL | …ledge/tasks/__tests__/indexDocumentsJobHandler.test.ts | 325 | MockMainCacheServiceExport.cacheService.setShared.mock.calls.filter( | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 412 | const delivery = container.ipcApiService.send.mock.calls.find( | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 440 | const focusListener = electron.app.on.mock.calls.find(([event]) => event === 'browser-window-focus')![1] | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 445 | const delivery = container.ipcApiService.send.mock.calls.find((call) => call[1] === 'chat.screenshot.attachment')! | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 462 | const delivery = container.ipcApiService.send.mock.calls.find((call) => call[1] === 'chat.screenshot.attachment')! | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 526 | const payload = container.ipcApiService.send.mock.calls.findLast( | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 534 | const retried = container.ipcApiService.send.mock.calls.findLast( | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 551 | const payload = container.ipcApiService.send.mock.calls.findLast( | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 559 | const retried = container.ipcApiService.send.mock.calls.findLast( | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 585 | const delivery = container.ipcApiService.send.mock.calls.find((call) => call[1] === 'chat.screenshot.attachment') | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 701 | const storedIds = container.mediaProtocolService.store.mock.results.map((r) => r.value as string) | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 1751 | const subscriber = container.preferenceService.subscribeChange.mock.calls.at(-1)?.[1] | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 1761 | const subscriber = container.preferenceService.subscribeChange.mock.calls.at(-1)?.[1] | CODE |
| CRITICAL | …/screenshot/__tests__/ScreenshotOverlayService.test.ts | 1773 | const subscribeChange = () => container.preferenceService.subscribeChange.mock.calls.at(-1)?.[1] | CODE |
| CRITICAL | …main/services/webview/__tests__/WebviewService.test.ts | 250 | const handleRequest = siteSession.webRequest.onBeforeSendHeaders.mock.calls.at(-1)![0] | CODE |
| CRITICAL | …in/services/webview/__tests__/annotationExport.test.ts | 190 | const setupCommands = guest.debugger.sendCommand.mock.calls.filter(([method]) => | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 292 | const call = win.webContents.on.mock.calls.find(([event]) => event === 'render-process-gone') | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 520 | const popup = win.webContents.setWindowOpenHandler.mock.calls.at(-1)![0] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 535 | const popup = win.webContents.setWindowOpenHandler.mock.calls.at(-1)![0] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 552 | const popup = win.webContents.setWindowOpenHandler.mock.calls.at(-1)![0] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 553 | const navigate = win.webContents.on.mock.calls.find(([event]) => event === 'will-navigate')![1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 574 | const closedPopup = win.webContents.setWindowOpenHandler.mock.calls.at(-1)![0] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 584 | const popup = win.webContents.setWindowOpenHandler.mock.calls.at(-1)![0] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 696 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 729 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 740 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 753 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 788 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 816 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 834 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'did-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 1646 | const listener = win.webContents.on.mock.calls.find(([event]) => event === 'will-attach-webview')?.[1] | CODE |
| CRITICAL | src/main/services/__tests__/MainWindowService.test.ts | 1684 | const call = win.webContents.on.mock.calls.find(([event]) => event === 'will-navigate') | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | resources/skills/find-skills/SKILL.md | 38 | ### Step 1: Understand What They Need | COMMENT |
| LOW⚡ | resources/skills/find-skills/SKILL.md | 46 | ### Step 2: Check the Leaderboard First | COMMENT |
| LOW⚡ | resources/skills/find-skills/SKILL.md | 54 | ### Step 3: Search for Skills | COMMENT |
| LOW | resources/skills/find-skills/SKILL.md | 66 | ### Step 4: Verify Quality Before Recommending | COMMENT |
| LOW | resources/skills/find-skills/SKILL.md | 74 | ### Step 5: Present Options to the User | COMMENT |
| LOW | resources/skills/find-skills/SKILL.md | 95 | ### Step 6: Install (Uses the Active Permission Mode) | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 201 | ### Step 1: Spawn all runs (with-skill AND baseline) in the same turn | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 231 | ### Step 2: While runs are in progress, draft assertions | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 239 | ### Step 3: As runs complete, capture timing data | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 253 | ### Step 4: Grade, aggregate, and launch the viewer | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 299 | ### Step 5: Read the feedback | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 369 | ### Step 1: Generate trigger eval queries | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 392 | ### Step 2: Review with user | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 407 | ### Step 3: Run the optimization loop | COMMENT |
| LOW | resources/skills/skill-creator/SKILL.md | 434 | ### Step 4: Apply the result | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/grader.md | 21 | ### Step 1: Read the Transcript | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/grader.md | 27 | ### Step 2: Examine Output Files | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/grader.md | 33 | ### Step 3: Evaluate Each Assertion | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/grader.md | 43 | ### Step 4: Extract and Verify Claims | COMMENT |
| LOW | resources/skills/skill-creator/agents/grader.md | 61 | ### Step 5: Read User Notes | COMMENT |
| LOW | resources/skills/skill-creator/agents/grader.md | 68 | ### Step 6: Critique the Evals | COMMENT |
| LOW | resources/skills/skill-creator/agents/grader.md | 81 | ### Step 7: Write Grading Results | COMMENT |
| LOW | resources/skills/skill-creator/agents/grader.md | 101 | ### Step 8: Read Executor Metrics and Timing | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 22 | ### Step 1: Read Both Outputs | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 29 | ### Step 2: Understand the Task | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 37 | ### Step 3: Generate Evaluation Rubric | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 60 | ### Step 4: Evaluate Each Output Against the Rubric | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 68 | ### Step 5: Check Assertions (if provided) | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 77 | ### Step 6: Determine the Winner | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/comparator.md | 87 | ### Step 7: Write Comparison Results | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 23 | ### Step 1: Read Comparison Result | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 29 | ### Step 2: Read Both Skills | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 39 | ### Step 3: Read Both Transcripts | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 49 | ### Step 4: Analyze Instruction Following | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 59 | ### Step 5: Identify Winner Strengths | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 69 | ### Step 6: Identify Loser Weaknesses | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 77 | ### Step 7: Generate Improvement Suggestions | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 87 | ### Step 8: Write Analysis Results | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 205 | ### Step 1: Read Benchmark Data | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 211 | ### Step 2: Analyze Per-Assertion Patterns | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 220 | ### Step 3: Analyze Cross-Eval Patterns | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 227 | ### Step 4: Analyze Metrics Patterns | COMMENT |
| LOW⚡ | resources/skills/skill-creator/agents/analyzer.md | 234 | ### Step 5: Generate Notes | COMMENT |
| LOW | resources/skills/skill-creator/agents/analyzer.md | 249 | ### Step 6: Write Notes | COMMENT |
| LOW | .agents/skills/gh-create-issue/SKILL.md | 12 | ### Step 1: Determine Template Type | COMMENT |
| LOW⚡ | .agents/skills/gh-create-issue/SKILL.md | 55 | ### Step 2: Read the Selected Template | COMMENT |
| LOW⚡ | .agents/skills/gh-create-issue/SKILL.md | 62 | ### Step 3: Collect Information | COMMENT |
| LOW⚡ | .agents/skills/gh-create-issue/SKILL.md | 66 | ### Step 4: Build and Preview Issue Content | COMMENT |
| LOW | .agents/skills/gh-create-issue/SKILL.md | 79 | ### Step 5: Create Issue | COMMENT |
| LOW | .agents/skills/create-skill/SKILL.md | 12 | ### Step 1: Gather Intent | COMMENT |
| LOW | .agents/skills/create-skill/SKILL.md | 23 | ### Step 2: Read Guidelines | COMMENT |
| LOW | .agents/skills/create-skill/SKILL.md | 27 | ### Step 3: Create Skill Structure | COMMENT |
| LOW | .agents/skills/create-skill/SKILL.md | 53 | ### Step 4: Sync (if public) | COMMENT |
| LOW | .agents/skills/create-skill/SKILL.md | 67 | ### Step 5: Validate | COMMENT |
| LOW | .agents/skills/create-skill/SKILL.md | 77 | ### Step 6: Summary | COMMENT |
| LOW | .agents/skills/prepare-release/SKILL.md | 23 | ### Step 1: Determine Version | COMMENT |
| LOW | .agents/skills/prepare-release/SKILL.md | 46 | ### Step 2: Collect Commits | COMMENT |
| LOW | .agents/skills/prepare-release/SKILL.md | 71 | ### Step 3: Generate Bilingual Release Notes | COMMENT |
| LOW | .agents/skills/prepare-release/SKILL.md | 154 | ### Step 4: Update Files | COMMENT |
| LOW | .agents/skills/prepare-release/SKILL.md | 162 | ### Step 5: Present for Review | COMMENT |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | dev-app-update.yml | 1 | # provider: generic | COMMENT |
| LOW | vitest.config.ts | 41 | // an N-API module). Vitest runs under system Node, so the module must be built for the | COMMENT |
| LOW | scripts/download-binaries.js | 201 | } | COMMENT |
| LOW | …kages/ui/stories/components/primitives/kbd.stories.tsx | 221 | // <div className="flex flex-wrap gap-4"> | COMMENT |
| LOW | …kages/ui/stories/components/primitives/kbd.stories.tsx | 241 | // </TooltipTrigger> | COMMENT |
| LOW | packages/provider-registry/src/providers/tokenhub.ts | 1 | import { defineProvider } from './types' | COMMENT |
| LOW | packages/provider-registry/src/utils/normalize.ts | 121 | // `kimi-k2-250905`) denote the same model line. This is the SINGLE definition shared by the build | COMMENT |
| LOW | packages/provider-registry/src/creators/iflytek.ts | 1 | import { defineCreator } from './types' | COMMENT |
| LOW | packages/system-speech/windows/SystemSpeechHelper.cpp | 1 | #if !defined(_M_X64) | COMMENT |
| LOW | .github/workflows/sync-registry-data.yml | 1 | name: Sync provider-registry data | COMMENT |
| LOW | src/renderer/utils/style.ts | 201 | // @media (max-width: ${breakpoints[key]}px) { | COMMENT |
| LOW | …renderer/components/CodeBlockView/HtmlPreviewFrame.tsx | 1 | /* eslint-disable @eslint-react/dom/no-missing-iframe-sandbox -- sandbox is always supplied via the (defaulted) prop; th | COMMENT |
| LOW | …erer/components/chat/messages/markdown/CitationSup.tsx | 41 | COMMENT | |
| LOW | …er/components/chat/messages/list/MessageAnchorLine.tsx | 161 | // • ticks overflow → the strip scrolls inside the fixed margins. | COMMENT |
| LOW | …er/components/chat/messages/list/MessageAnchorLine.tsx | 321 | fadeTop || fadeBottom | COMMENT |
| LOW | …mponents/chat/messages/list/chatVirtualizerRuntime.tsx | 161 | // a gesture when its first scroll event arrives within this window. Once seeded, | COMMENT |
| LOW | src/renderer/components/layout/TabsProvider.tsx | 101 | } | COMMENT |
| LOW | src/renderer/hooks/translate/useTranslateHistories.ts | 81 | // already-loaded pages. Resetting (issue #19687) shrinks an infinite | COMMENT |
| LOW | src/renderer/data/hooks/useDataApi.ts | 521 | // Memoized so the returned `trigger` keeps a stable identity across renders | COMMENT |
| LOW | src/renderer/data/hooks/__tests__/useDataApi.test.ts | 561 | }) | COMMENT |
| LOW | …derer/pages/settings/McpSettings/AddMcpServerModal.tsx | 61 | // "stdio-server-example": { | COMMENT |
| LOW | …pages/miniApps/MiniAppSettings/useMiniAppVisibility.ts | 61 | // status, and the local row's stale `status` then misclassifies the row in | COMMENT |
| LOW | src/renderer/pages/agents/components/SessionItem.tsx | 121 | )} | COMMENT |
| LOW | …c/renderer/pages/knowledge/panels/dataSource/styles.ts | 1 | // The checkbox is an inline-level box, so by default it aligns to its text baseline. | COMMENT |
| LOW | src/shared/IpcChannel.ts | 121 | COMMENT | |
| LOW | src/shared/types/file/ipc.ts | 541 | // | COMMENT |
| LOW | src/shared/utils/__tests__/redaction.test.ts | 221 | expect(redactUrlParams('not a url')).toBe('not a url') | COMMENT |
| LOW | src/shared/ai/builtinTools.ts | 21 | COMMENT | |
| LOW | src/shared/ai/builtinTools.ts | 41 | // Nothing goes unvalidated: the AI SDK still checks every tool call against these schemas, and | COMMENT |
| LOW | src/shared/ai/builtinTools.ts | 481 | // 2. A refinement is invisible to `toJSONSchema` (it emits no `format` keyword), so the schema | COMMENT |
| LOW | src/shared/data/types/file.ts | 181 | COMMENT | |
| LOW | src/shared/data/types/file.ts | 201 | // Discrimination on `origin` means an internal entry doesn't *have* an | COMMENT |
| LOW | src/shared/data/types/file.ts | 381 | COMMENT | |
| LOW | src/shared/data/types/file.ts | 521 | } | COMMENT |
| LOW | src/shared/data/types/file.ts | 561 | COMMENT | |
| LOW | src/shared/data/cache/cacheSchemas.ts | 181 | 'translate.detecting': boolean | COMMENT |
| LOW | src/shared/data/cache/cacheSchemas.ts | 341 | // Job system: state snapshot + progress, broadcast main → all windows. TTL 60s | COMMENT |
| LOW | src/shared/data/cache/cacheSchemas.ts | 361 | // Nothing evicts an entry — that is the point, and it costs a handful of rows per | COMMENT |
| LOW | src/main/core/power/PowerService.ts | 241 | this.registerDisposable(() => powerMonitor.removeListener('shutdown', shutdownListener)) | COMMENT |
| LOW | src/main/core/preboot/chromiumFlags.ts | 61 | app.commandLine.appendSwitch('password-store', 'gnome-libsecret') | COMMENT |
| LOW | src/main/core/paths/constants.ts | 1 | // EARLIEST path constants for the Electron main process. | COMMENT |
| LOW | src/main/core/paths/pathRegistry.ts | 161 | // BabelDOC runtime cache (layout model, fonts, CMap/tiktoken assets) | COMMENT |
| LOW | src/main/core/window/windowRegistry.ts | 41 | // Managed by MainWindowService: dynamic options (theme-driven backgroundColor / | COMMENT |
| LOW | src/main/core/window/windowRegistry.ts | 241 | } | COMMENT |
| LOW | src/main/core/window/windowRegistry.ts | 321 | alwaysOnTop: { level: 'floating' }, | COMMENT |
| LOW | src/main/core/window/windowRegistry.ts | 361 | movable: true, | COMMENT |
| LOW | src/main/core/window/windowRegistry.ts | 481 | // IpcApi handler via wm.behavior.setAlwaysOnTop; passing no level lets | COMMENT |
| LOW | src/main/core/window/WindowManager.ts | 1581 | public peekWindowBounds(type: WindowType): WindowBoundsState | undefined { | COMMENT |
| LOW | src/main/core/window/quirks.ts | 41 | // Why: On macOS, hiding/closing a floating panel-style window lets the | COMMENT |
| LOW | src/main/core/window/quirks.ts | 81 | // Why: [macOS] the level passed to setAlwaysOnTop() is not sticky across | COMMENT |
| LOW | …ain/core/window/__tests__/WindowManager.quirks.test.ts | 761 | const win = firstWindow() | COMMENT |
| LOW | src/main/core/job/JobManager.ts | 1761 | // Idempotency guard (invariant, defense-in-depth): never run a handler for a | COMMENT |
| LOW | …main/core/job/__tests__/JobManager.integration.test.ts | 141 | // for that type are treated as orphans and cancelled. | COMMENT |
| LOW | …core/application/__tests__/Application.getPath.test.ts | 21 | // We use `importActual + spread` to keep the real `shouldAutoEnsure` | COMMENT |
| LOW | …es/knowledge/pipeline/vectorstore/indexStore/schema.ts | 161 | // rejects any duplicate loudly (the assignment is race-free only because all writes to a base's | COMMENT |
| LOW | …pipeline/vectorstore/indexStore/KnowledgeIndexStore.ts | 181 | // failure modes: | COMMENT |
| LOW | src/main/features/miniApp/install/installFlow.ts | 401 | // HONESTY gate: the user's file changed since the card was shown — say so, plainly, | COMMENT |
| LOW | src/main/features/miniApp/capabilities/file.ts | 301 | // Lease taken BEFORE the queue, exactly as `save` does — and for a reason queueing | COMMENT |
| LOW | src/main/features/miniApp/runtime/webviewHost.ts | 21 | COMMENT | |
| LOW | src/main/features/apiGateway/app.ts | 101 | set.status = 403 | COMMENT |
| 64 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/smoke/crawl4aiProviderPreset.test.ts | 88 | await section.getByPlaceholder('API Key').fill('dummy-key-for-layout') | CODE |
| LOW | tests/e2e/smoke/queritFetchProbe.test.ts | 137 | await section.getByPlaceholder('API Key', { exact: true }).fill('querit-e2e-fake-key') | CODE |
| LOW | scripts/i18n-check-hardcoded-strings.ts | 32 | 'placeholder', | CODE |
| LOW | scripts/i18n-check-hardcoded-strings.ts | 48 | const UI_PROPERTIES = ['message', 'text', 'title', 'label', 'placeholder', 'description', 'detail'] | CODE |
| LOW | …ui/stories/components/composites/scrollbar.stories.tsx | 24 | Line {i + 1}: Lorem ipsum dolor sit amet, consectetur adipiscing elit. | CODE |
| LOW | …ui/stories/components/composites/scrollbar.stories.tsx | 24 | Line {i + 1}: Lorem ipsum dolor sit amet, consectetur adipiscing elit. | CODE |
| LOW | …ries/components/composites/composite-input.stories.tsx | 1173 | placeholder="John Doe" | CODE |
| LOW | …ges/ui/stories/components/primitives/input.stories.tsx | 284 | <Input type="email" placeholder="email@example.com" defaultValue="user@example.com" /> | CODE |
| LOW | …ges/ui/stories/components/primitives/input.stories.tsx | 574 | <Input id="profile-name" placeholder="John Doe" /> | CODE |
| LOW | …es/ui/stories/components/primitives/drawer.stories.tsx | 155 | defaultValue="John Doe" | CODE |
| LOW | …es/ui/stories/components/primitives/drawer.stories.tsx | 196 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et | CODE |
| LOW | …es/ui/stories/components/primitives/drawer.stories.tsx | 196 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et | CODE |
| LOW | …es/ui/stories/components/primitives/dialog.stories.tsx | 197 | defaultValue="John Doe" | CODE |
| LOW | …es/ui/stories/components/primitives/dialog.stories.tsx | 265 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et | CODE |
| LOW | …es/ui/stories/components/primitives/dialog.stories.tsx | 265 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et | CODE |
| LOW | …/stories/components/primitives/input-group.stories.tsx | 517 | <InputGroupInput type="email" placeholder="email@example.com" defaultValue="user@example.com" /> | CODE |
| LOW | …/ui/stories/components/primitives/combobox.stories.tsx | 66 | label: 'John Doe', | CODE |
| LOW | …omposites/search-input/__tests__/search-input.test.tsx | 17 | expect(screen.getByRole('searchbox')).toHaveAttribute('placeholder', '搜索') | CODE |
| LOW | …/src/components/primitives/__tests__/combobox.test.tsx | 76 | expect(input).toHaveAttribute('placeholder', 'Beta') | CODE |
| LOW | …nderer/components/RichEditor/extensions/placeholder.ts | 15 | name: 'placeholder', | CODE |
| LOW | …nderer/components/RichEditor/extensions/placeholder.ts | 29 | key: new PluginKey('placeholder'), | CODE |
| LOW | …nderer/components/RichEditor/extensions/placeholder.ts | 60 | const classes = ['placeholder'] | CODE |
| LOW | …/RichEditor/__tests__/markdownParsePerformance.test.ts | 78 | const sentence = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. ' | CODE |
| LOW | …/RichEditor/__tests__/markdownParsePerformance.test.ts | 78 | const sentence = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. ' | CODE |
| LOW | src/renderer/components/composer/composerPreset.ts | 16 | placeholder?: PlaceholderOptions['placeholder'] | CODE |
| LOW | …r/components/composer/__tests__/composerPreset.test.ts | 23 | 'placeholder', | CODE |
| LOW | src/renderer/components/popups/PromptPopup.tsx | 11 | 'defaultValue' | 'onValueChange' | 'placeholder' | 'ref' | 'value' | CODE |
| LOW | …rceCatalog/dialogs/edit/__tests__/EditDialogs.test.tsx | 1441 | expect(instructionsInput).toHaveAttribute('placeholder', 'Tell this assistant how to respond') | CODE |
| LOW | …rceCatalog/dialogs/edit/__tests__/EditDialogs.test.tsx | 1891 | expect(input).toHaveAttribute('placeholder', 'Unlimited') | CODE |
| LOW | …dows/quickAssistant/home/__tests__/HomeWindow.test.tsx | 347 | expect(input).toHaveAttribute('placeholder', 'Ask Claude Sonnet') | CODE |
| LOW | …lSettings/__tests__/ContextManagementSettings.test.tsx | 73 | expect(input).toHaveAttribute('placeholder', 'settings.models.context_management.max_messages_unlimited') | CODE |
| LOW | …erer/pages/settings/__tests__/BrowserSettings.test.tsx | 200 | { ...chrome, displayName: 'Work', account: 'user@example.com' }, | CODE |
| LOW | …erer/pages/settings/__tests__/BrowserSettings.test.tsx | 206 | account: 'user@example.com' | CODE |
| LOW | …viderSettings/ModelList/__tests__/ModelDrawer.test.tsx | 998 | expect(screen.getByLabelText('Max output tokens')).toHaveAttribute('placeholder', 'e.g. 65536') | CODE |
| LOW | …/main/features/browser/__tests__/browserImport.test.ts | 198 | account: 'user@example.com' | CODE |
| LOW | src/main/features/browser/__tests__/actions.test.ts | 226 | expect((target as HTMLInputElement).value).toBe('user@example.com') | CODE |
| LOW | …/features/knowledge/__tests__/KnowledgeService.test.ts | 2344 | arrangeReadable('placeholder') | CODE |
| LOW | …s/apiGateway/tokens/__tests__/fallbackEstimate.test.ts | 26 | const prompt = 'lorem ipsum dolor sit amet '.repeat(5_000) | CODE |
| LOW | …s/apiGateway/tokens/__tests__/fallbackEstimate.test.ts | 26 | const prompt = 'lorem ipsum dolor sit amet '.repeat(5_000) | CODE |
| LOW | …/__tests__/messageRules.anthropicSerialization.test.ts | 92 | model: createAnthropic({ apiKey: 'dummy-key', baseURL })('claude-sonnet-4-5'), | CODE |
| LOW | src/main/ai/runtime/pi/piTransportStream.test.ts | 11 | apiKey: 'placeholder', | CODE |
| LOW | src/main/ai/runtime/pi/piTransportStream.test.ts | 58 | apiKey: 'placeholder', | CODE |
| LOW | src/main/ai/runtime/pi/PiRuntimeConnection.test.ts | 428 | providerConfig: { name: 'P', baseUrl: 'https://x', apiKey: 'placeholder', api: 'anthropic-messages', models: [] }, | CODE |
| LOW | src/main/ai/runtime/pi/PiRuntimeConnection.test.ts | 625 | apiKey: 'placeholder', | CODE |
| LOW | src/main/ai/runtime/pi/PiRuntimeConnection.test.ts | 685 | apiKey: 'placeholder', | CODE |
| LOW | …main/ai/contextBuild/__tests__/toolOutputStore.test.ts | 37 | const BIG_TEXT = Array.from({ length: 200 }, (_, i) => `log line ${i + 1} — lorem ipsum dolor sit amet`).join('\n') | CODE |
| LOW | …main/ai/contextBuild/__tests__/toolOutputStore.test.ts | 37 | const BIG_TEXT = Array.from({ length: 200 }, (_, i) => `log line ${i + 1} — lorem ipsum dolor sit amet`).join('\n') | CODE |
| LOW | src/main/data/db/schemas/__tests__/file.test.ts | 79 | dbh.db.insert(fileEntryTable).values(baseExternal('placeholder', { externalPath: null })) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 304 | except subprocess.TimeoutExpired: | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 231 | except (json.JSONDecodeError, OSError, KeyError): | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 429 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 97 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 135 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 111 | except OSError: | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 300 | except (ProcessLookupError, ValueError): | CODE |
| HIGH | …es/skills/skill-creator/eval-viewer/generate_review.py | 341 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | …es/skills/skill-creator/scripts/aggregate_benchmark.py | 146 | except json.JSONDecodeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …dialogs/create/__tests__/ResourceCreateWizard.test.tsx | 264 | // Step 1: Next is blocked until name + model are set. | COMMENT |
| LOW | src/main/core/preboot/v2MigrationGate.ts | 132 | // Step 0: Resolve all migration-critical paths, including v1 legacy | COMMENT |
| LOW⚡ | …Sdk/params/features/__tests__/inLoopCompaction.test.ts | 423 | // Step 1: over budget → full fold. | COMMENT |
| LOW⚡ | …Sdk/params/features/__tests__/inLoopCompaction.test.ts | 429 | // Step 2: loop re-appends history + a huge new tool result → over budget again. | COMMENT |
| LOW⚡ | …n/ai/channels/adapters/feishu/FeishuAppRegistration.ts | 59 | // Step 1: init — check supported auth methods | COMMENT |
| LOW⚡ | …n/ai/channels/adapters/feishu/FeishuAppRegistration.ts | 63 | // Step 2: begin — start device flow | COMMENT |
| LOW | src/main/ai/channels/adapters/wechat/WeChatProtocol.ts | 362 | // Step 1: get upload URL | COMMENT |
| LOW | src/main/ai/channels/adapters/wechat/WeChatProtocol.ts | 389 | // Step 2: upload(官方优先直接 POST upload_full_url,否则回退用 upload_param 拼接) | COMMENT |
| LOW | src/main/data/migration/v2/migrators/ChatMigrator.ts | 342 | // Step 1: Verify export files exist | COMMENT |
| LOW | src/main/data/migration/v2/migrators/ChatMigrator.ts | 358 | // Step 2: Load assistant data for model lookup | COMMENT |
| LOW | src/main/data/migration/v2/migrators/ChatMigrator.ts | 402 | // Step 3: Count topics and estimate messages | COMMENT |
| LOW | src/main/data/migration/v2/migrators/ChatMigrator.ts | 416 | // Step 4: Validate sample data | COMMENT |
| LOW | …ain/data/migration/v2/migrators/PreferencesMigrator.ts | 104 | // Step 1: Detect conflicts between simple and complex mappings (strict mode) | COMMENT |
| LOW | …ain/data/migration/v2/migrators/PreferencesMigrator.ts | 119 | // Step 2: Process simple mappings | COMMENT |
| LOW | …ain/data/migration/v2/migrators/PreferencesMigrator.ts | 160 | // Step 3: Process complex mappings | COMMENT |
| LOW⚡ | src/main/data/services/MessageService.ts | 989 | // Step 1: Verify topic exists and fetch its current state. | COMMENT |
| LOW⚡ | src/main/data/services/MessageService.ts | 993 | // Step 2: Resolve parentId based on the three possible input states: | COMMENT |
| LOW | src/main/data/services/MessageService.ts | 1019 | // Step 3: Insert the message using the resolved parentId. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/__mocks__/renderer/CacheService.ts | 386 | // Test scaffold: seed a shared cache entry with an arbitrary string key, | COMMENT |
| MEDIUM | docs/references/mini-app/probes.md | 25 | ## Shared scaffolding | COMMENT |
| MEDIUM | docs/references/knowledge/knowledge-service.md | 228 | (see [operation guards](./operation-guards.md#enableembeddingmodel)). Changing a base that already has an embedding mode | CODE |
| MEDIUM⚡ | packages/provider-registry/src/schemas/enums.ts | 65 | // agentic tools (e.g. external web search via Tavily/Exa). | COMMENT |
| MEDIUM | packages/provider-registry/src/creators/cohere.ts | 211 | // ── North (agentic code) ── | COMMENT |
| MEDIUM | packages/ai-sdk-provider/CHANGELOG.md | 19 | - [#14988](https://github.com/CherryHQ/cherry-studio/pull/14988) [`11604e0`](https://github.com/CherryHQ/cherry-studio/c | CODE |
| MEDIUM | packages/aiCore/CHANGELOG.md | 61 | - [#14988](https://github.com/CherryHQ/cherry-studio/pull/14988) [`11604e0`](https://github.com/CherryHQ/cherry-studio/c | CODE |
| MEDIUM | packages/aiCore/src/core/context/janitor.ts | 249 | // the bulk of an agentic history, and their full text is the least useful | COMMENT |
| MEDIUM | packages/web-search/CHANGELOG.md | 41 | - [#21807](https://github.com/CherryHQ/cherry-studio/pull/21807) [`48d529d`](https://github.com/CherryHQ/cherry-studio/c | CODE |
| MEDIUM | src/renderer/utils/errorDiagnosis.ts | 129 | return `## Context\nThe prompt exceeds the model's context window. Suggest clearing chat history, removing large att | CODE |
| MEDIUM | …igEditPanel/__tests__/useConfigDraftController.test.ts | 468 | // Not the applied provider: clearing the model is only a scaffold to get a dirty draft, and the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/aiCore/README.md | 109 | apiKey: 'your-api-key' | CODE |
| HIGH | packages/aiCore/README.md | 130 | apiKey: 'your-api-key' | CODE |
| HIGH | …ToolSettings/ApiGatewaySettings/ApiGatewaySettings.tsx | 64 | const authorizationHeader = `Authorization: Bearer ${apiKey || 'your-api-key'}` | CODE |
| HIGH | …ToolSettings/ApiGatewaySettings/ApiGatewaySettings.tsx | 273 | value={`Authorization: Bearer ${apiKey ? (apiKeyVisible ? apiKey : '•'.repeat(Math.min(apiKey.length, | CODE |
| HIGH | src/shared/data/presets/mcpServers.ts | 95 | BRAVE_API_KEY: 'YOUR_API_KEY' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ents/CodeBlockView/__tests__/HtmlPreviewFrame.test.tsx | 66 | // reliable boundary — the only robust exfiltration guard is to run no scripts at all. | COMMENT |
| MEDIUM | …/components/chat/panes/__tests__/ArtifactPane.test.tsx | 801 | // re-bind via `mockImplementation` (more robust than `mockResolvedValue` | COMMENT |
| MEDIUM | …review/plugins/html/__tests__/HtmlFilePreview.test.tsx | 135 | // parent.api; the only robust guard is running no scripts at all, backed by a strict CSP. | COMMENT |
| MEDIUM | src/renderer/hooks/useSmoothStream.ts | 137 | // median (median over GAP_SAMPLES is already robust to the ~few-percent | COMMENT |
| MEDIUM | src/main/core/preboot/__tests__/chromiumFlags.test.ts | 85 | // each test is the robust pattern. | COMMENT |
| MEDIUM | src/main/core/preboot/__tests__/v2MigrationGate.test.ts | 190 | // is the robust pattern, no explicit doUnmock needed. | COMMENT |
| MEDIUM | …c/main/core/preboot/__tests__/userDataLocation.test.ts | 165 | // The robust pattern is: resetModules() in beforeEach + fresh | COMMENT |
| MEDIUM | …ain/ai/streamManager/__tests__/AiStreamManager.test.ts | 3360 | // transport-owned `exec.timings` — keeps manager robust to AI SDK | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/ui/docs/variable-catalog.md | 217 | ## 9. Rules for AI-generated code | COMMENT |
| HIGH⚡ | src/main/services/TopicNamingService.ts | 129 | // title → one AI summary title. Once a real title exists (AI-generated or | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/skills/office-transform/scripts/office_patch_copy.py | 72 | CODE | |
| LOW | …sources/skills/office-transform/scripts/office/docx.py | 125 | CODE | |
| LOW | …sources/skills/office-transform/scripts/office/docx.py | 242 | CODE | |
| LOW | …sources/skills/office-transform/scripts/office/docx.py | 144 | CODE | |
| LOW | …sources/skills/office-transform/scripts/office/xlsx.py | 170 | CODE | |
| LOW | …sources/skills/office-transform/scripts/office/pptx.py | 32 | CODE | |
| LOW | …es/skills/skill-creator/eval-viewer/generate_review.py | 85 | CODE | |
| LOW | …es/skills/skill-creator/eval-viewer/generate_review.py | 149 | CODE | |
| LOW | …es/skills/skill-creator/eval-viewer/generate_review.py | 288 | CODE | |
| LOW | resources/skills/skill-creator/scripts/run_eval.py | 36 | CODE | |
| LOW | resources/skills/skill-creator/scripts/package_skill.py | 42 | CODE | |
| LOW | …es/skills/skill-creator/scripts/improve_description.py | 51 | CODE | |
| LOW | …es/skills/skill-creator/scripts/aggregate_benchmark.py | 67 | CODE | |
| LOW | …ources/skills/skill-creator/scripts/generate_report.py | 16 | CODE | |
| LOW | resources/skills/skill-creator/scripts/utils.py | 7 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ources/skills/office-transform/scripts/office/ooxml.py | 125 | except Exception as error: # noqa: BLE001 - any parse failure means the part is unusable | CODE |
| MEDIUM | …es/skills/skill-creator/eval-viewer/generate_review.py | 409 | print(f"Error: {workspace} is not a directory", file=sys.stderr) | CODE |
| LOW | resources/skills/skill-creator/scripts/run_eval.py | 225 | except Exception as e: | CODE |
| MEDIUM | resources/skills/skill-creator/scripts/run_eval.py | 278 | print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) | CODE |
| LOW | resources/skills/skill-creator/scripts/package_skill.py | 106 | except Exception as e: | CODE |
| MEDIUM | …es/skills/skill-creator/scripts/improve_description.py | 206 | print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) | CODE |
| MEDIUM | resources/skills/skill-creator/scripts/run_loop.py | 265 | print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ponents/CodeBlockView/__tests__/CodeBlockView.test.tsx | 241 | print(42) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …nts/composites/horizontal-scroll-container.stories.tsx | 127 | <p className="text-sm text-gray-600">This is a sample card content for demonstration purposes.</p> | CODE |
| LOW | .github/ISSUE_TEMPLATE/2_question.yml | 60 | placeholder: "For example: use case, solutions you've tried, etc. Don't forget to include relevant screenshots/rec | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …sources/skills/office-transform/scripts/office/xlsx.py | 449 | def set_cell_value(doc: minidom.Document, cell, value) -> None: | CODE |
| LOW | …sources/skills/office-transform/scripts/office/xlsx.py | 519 | def update_dimension(worksheet, edited: list[tuple[int, int]]) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …sources/skills/skill-creator/scripts/quick_validate.py | 7 | CODE |