Local-first cross-platform desktop workspace for Claude Code / agents: multi-agent, Git worktrees, code diffs, skill marketplace, multi-model, Computer Use, task-aware desktop pets, with WeChat, Feishu, DingTalk, Telegram, WhatsApp and H5 access.
This report presents the forensic synthetic code analysis of NanmiCoder/cc-haha, a TypeScript project with 14,244 GitHub stars. SynthScan v2.0 examined 1,076,190 lines of code across 3813 source files, recording 4122 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 4.8 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 4122 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/mac_helper.py | 193 | def send_keystroke_via_osascript(character: str, modifiers: list[str] | None = None) -> None: | CODE |
| LOW | runtime/mac_helper.py | 264 | def ensure_screen_recording_permission() -> None: | CODE |
| LOW | runtime/mac_helper.py | 507 | def detect_screen_recording_permission() -> bool | None: | CODE |
| LOW | runtime/mac_helper.py | 555 | def detect_accessibility_permission() -> bool: | CODE |
| LOW | runtime/test_helpers.py | 77 | def test_common_keys_present_in_both(self): | CODE |
| LOW | runtime/test_helpers.py | 138 | def test_both_helpers_same_commands(self): | CODE |
| LOW | runtime/test_helpers.py | 147 | def test_expected_commands_exist(self): | CODE |
| LOW | runtime/test_helpers.py | 167 | def test_unknown_command_returns_error(self): | CODE |
| LOW | runtime/test_helpers.py | 197 | def test_json_output_function_exists(self): | CODE |
| LOW | runtime/test_helpers.py | 223 | def test_check_permissions_always_granted(self): | CODE |
| LOW | runtime/test_helpers.py | 253 | def test_check_permissions_uses_ax_api_instead_of_system_events(self): | CODE |
| LOW | runtime/test_helpers.py | 259 | self.assertIn("def detect_accessibility_permission()", source) | CODE |
| LOW | runtime/test_helpers.py | 275 | def test_clipboard_shortcuts_use_osascript_path(self): | CODE |
| LOW | runtime/test_helpers.py | 310 | def test_input_functions_identical(self): | CODE |
| LOW | desktop/scripts/build-sidecars.test.ts | 44 | function controlledSidecarEnvironment( | CODE |
| LOW | desktop/scripts/build-sidecars.test.ts | 238 | async function fetchBeforeCompiledSidecarDeadline( | CODE |
| LOW | desktop/scripts/electron-output-guard.ts | 13 | export function findRunningElectronOutputProcesses( | CODE |
| LOW | desktop/scripts/electron-dev.ts | 32 | export function resolveElectronExecutable(desktopRoot: string, platform = process.platform) { | CODE |
| LOW | desktop/scripts/build-sidecars.ts | 48 | async function stageHostRipgrepForOfflineBuild() { | CODE |
| LOW | desktop/scripts/build-sidecars.ts | 99 | async function hasMatchingRipgrepManifest( | CODE |
| LOW | desktop/electron/main.ts | 158 | function resolveStartupWindowBackground(): string { | CODE |
| LOW | desktop/electron/main.ts | 167 | function installSystemAppearanceWatch() { | CODE |
| LOW | desktop/electron/main.ts | 249 | function resolveMainRendererServerAccess(): PreviewLocalAccess | null { | CODE |
| LOW | desktop/electron/ipc/capabilities.ts | 305 | export function validateElectronIpcPayload(channel: ElectronIpcChannel, payload: unknown): boolean { | CODE |
| LOW | desktop/electron/ipc/capabilities.ts | 309 | export function isElectronIpcChannelAllowedForPetWindow(channel: ElectronIpcChannel): boolean { | CODE |
| LOW | desktop/electron/ipc/previewMessage.ts | 34 | function isSelectionScreenshotKind(value: unknown): value is 'full' | 'viewport' | 'element' | 'region' { | CODE |
| LOW | desktop/electron/ipc/previewMessage.ts | 92 | export function shouldForwardPreviewMessage(input: { | CODE |
| LOW | desktop/electron/services/systemProxyBridge.ts | 259 | export function sanitizeProxyRequestHeaders(headers: http.IncomingHttpHeaders): http.IncomingHttpHeaders { | CODE |
| LOW | desktop/electron/services/systemProxyBridge.ts | 317 | async function requestStreamingUsingRule( | CODE |
| LOW | desktop/electron/services/dialogs.ts | 4 | export function toElectronOpenDialogOptions(options: DialogOpenOptions = {}): OpenDialogOptions { | CODE |
| LOW | desktop/electron/services/dialogs.ts | 16 | export function toElectronSaveDialogOptions(options: DialogSaveOptions = {}): SaveDialogOptions { | CODE |
| LOW | desktop/electron/services/windows.ts | 41 | export function hasMeaningfulIntersection( | CODE |
| LOW | desktop/electron/services/windows.ts | 56 | export function isWindowStateVisibleOnAnyDisplay( | CODE |
| LOW | desktop/electron/services/windows.ts | 70 | export function clampWindowStateToVisibleWorkArea( | CODE |
| LOW | desktop/electron/services/windows.ts | 157 | export function windowChromeOptionsForPlatform( | CODE |
| LOW | desktop/electron/services/windows.ts | 233 | export function refreshWindowsDragHitTest( | CODE |
| LOW | desktop/electron/services/updateSmoke.ts | 101 | export function createUpdateSmokeUpdaterFromEnv(env: UpdateSmokeEnv): ElectronUpdaterLike | null { | CODE |
| LOW | desktop/electron/services/notifications.ts | 15 | export function validateNotificationOptions(value: unknown): value is DesktopNotificationOptions { | CODE |
| LOW | desktop/electron/services/notifications.ts | 26 | export function notificationPermissionState( | CODE |
| LOW | desktop/electron/services/notifications.ts | 32 | export function requestNotificationPermission( | CODE |
| LOW | desktop/electron/services/keychain.ts | 14 | export function installMacOsChromiumKeychainPromptGuard( | CODE |
| LOW⚡ | desktop/electron/services/notificationSmoke.ts | 58 | export function parseNotificationSmokeDelay(value: string | undefined): number { | CODE |
| LOW⚡ | desktop/electron/services/notificationSmoke.ts | 65 | function shouldTriggerSyntheticAction(value: string | undefined): boolean { | CODE |
| LOW⚡ | desktop/electron/services/notificationSmoke.ts | 69 | export function appendNotificationSmokeLog(logPath: string, event: NotificationSmokeLogEvent) { | CODE |
| LOW⚡ | desktop/electron/services/notificationSmoke.ts | 74 | export function logNotificationSmokeRendererAck(env: NodeJS.ProcessEnv, payload: unknown): boolean { | CODE |
| LOW | desktop/electron/services/notificationSmoke.ts | 85 | export function scheduleNotificationSmoke({ | CODE |
| LOW | desktop/electron/services/pets.ts | 115 | export function createCustomPetCatalogLoader( | CODE |
| LOW | desktop/electron/services/pets.ts | 352 | async function assertDirectoryIdentities(identities: DirectoryIdentity[]): Promise<void> { | CODE |
| LOW | desktop/electron/services/pets.ts | 553 | function resolvePortableRelativePath( | CODE |
| LOW | desktop/electron/services/pets.ts | 604 | async function captureImageDirectoryIdentities( | CODE |
| LOW | desktop/electron/services/pets.ts | 623 | function hasExpectedImageSignature(data: Buffer, mimeType: CustomPetImageMimeType): boolean { | CODE |
| LOW | desktop/electron/services/pets.ts | 674 | function hasEmbeddedImageAnimation(data: Buffer, mimeType: CustomPetImageMimeType): boolean { | CODE |
| LOW | desktop/electron/services/pets.ts | 1013 | async function assertCustomPetTargetAvailable(targetPath: string): Promise<void> { | CODE |
| LOW | desktop/electron/services/pets.ts | 1063 | function validatedCustomPetIdentity(input: { | CODE |
| LOW | desktop/electron/services/pets.ts | 1121 | export async function createCustomPetFromAtlasBytes( | CODE |
| LOW | desktop/electron/services/pets.ts | 1324 | function packageCanBeSkippedForExhaustedBudget(entry: Dirent): boolean { | CODE |
| LOW | desktop/electron/services/menu.ts | 26 | export function buildApplicationMenuTemplate( | CODE |
| LOW | desktop/electron/services/menu.ts | 93 | export function buildRendererContextMenuTemplate( | CODE |
| LOW | desktop/electron/services/menu.ts | 116 | export async function installRendererContextMenu(window: BrowserWindow) { | CODE |
| LOW | desktop/electron/services/appIdentity.ts | 10 | export function applyWindowsAppUserModelId( | CODE |
| 2903 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | runtime/win_helper.py | 269 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | runtime/win_helper.py | 271 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | runtime/win_helper.py | 545 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | runtime/win_helper.py | 547 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 100 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 102 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 123 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 178 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 180 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 223 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 225 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 566 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 568 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 579 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 581 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 631 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | runtime/win_helper.py | 633 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | desktop/src/types/chat.ts | 6 | // ─── Client → Server ────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/types/chat.ts | 82 | // ─── Server → Client ────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/types/chat.ts | 321 | // ─── UI Message model (rendered in MessageList) ─────────────────── | COMMENT |
| MEDIUM | desktop/src/stores/workflowStore.ts | 451 | // ── Selectors ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/stores/workflowStore.ts | 542 | // ── Event parsing ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/stores/chatStore.ts | 4054 | // ─── History mapping helpers ───────── | COMMENT |
| MEDIUM | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 6 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 8 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 98 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 100 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 110 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 112 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 159 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …top/src/components/chat/CurrentTurnChangeCard.test.tsx | 161 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/lib/openWithItems.test.ts | 5 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/lib/openWithItems.test.ts | 7 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/lib/openWithItems.test.ts | 66 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/lib/openWithItems.test.ts | 68 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/lib/openWithItems.ts | 4 | // ─── File-type description ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/lib/openWithItems.ts | 46 | // ─── Open-with items ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 22 | // ─── the shape our own system prompt asks the model for ──────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 30 | // ─── prefixes ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 39 | // ─── bare filenames ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 46 | // ─── the property-access traps ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 58 | // ─── other non-paths ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 67 | // ─── sentence boundaries (the #1145 lesson, mirrored) ────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/lib/filePathBoundary.test.ts | 67 | // ─── sentence boundaries (the #1145 lesson, mirrored) ────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/i18n/locales/zh-TW.ts | 148 | // ─── Title Bar ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/i18n/locales/zh-TW.ts | 153 | // ─── Open Project ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/i18n/locales/zh-TW.ts | 158 | // ─── Open With ───────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/i18n/locales/zh-TW.ts | 2243 | // ─── Model Selector ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/i18n/locales/zh-TW.ts | 2252 | // ─── Directory Picker ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | desktop/src/i18n/locales/zh-TW.ts | 2262 | // ─── File Search ────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 4 | // ─── Common ────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 45 | // ─── Sidebar ────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 184 | // ─── Assistant Output Targets ────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 192 | // ─── Workspace Panel ─────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 278 | // ─── Status Bar ────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 284 | // ─── Settings ────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/src/i18n/locales/zh-TW.ts | 1669 | // ─── Empty Session ────────────────────────────────────── | COMMENT |
| 446 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | desktop/scripts/install-macos-unsigned.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | desktop/src-tauri/src/lib.rs | 1721 | // 历史用途:此前 sidecar launcher 用 dynamic file:// import 加载磁盘上 | COMMENT |
| LOW | desktop/src-tauri/src/main.rs | 1 | // Prevents additional console window on Windows in release | COMMENT |
| LOW | desktop/src/stores/chatStore.test.ts | 1961 | COMMENT | |
| LOW | desktop/src/stores/chatStore.test.ts | 9921 | expect({ afterFirst, afterSecond }).toEqual({ | COMMENT |
| LOW | desktop/src/stores/chatStore.ts | 1021 | // 这里曾经还有一道守卫:扫描整个 messages,只要某条 hydrated 回复与来文逐字相同 | COMMENT |
| LOW | desktop/src/components/chat/ChatInput.tsx | 281 | const useCompactControls = isMobileComposer || !fitsAtLeast(TOOLBAR_LOCATION_MIN_WIDTH) | COMMENT |
| LOW | …sktop/src/components/activity/SessionActivityPanel.tsx | 681 | // session area. `rail` used to be an in-flow flex sibling, which is why the | COMMENT |
| LOW | desktop/src/components/markdown/MarkdownRenderer.tsx | 581 | ) | COMMENT |
| LOW | desktop/src/components/layout/TabBar.test.tsx | 1521 | const active = screen.getByText('Active One').closest('.tab-bar-interactive') | COMMENT |
| LOW | desktop/src/components/layout/TabBar.test.tsx | 1561 | // the enemy: a 3px line across the bottom is exactly the cut that the | COMMENT |
| LOW | desktop/src/components/layout/TabBar.tsx | 41 | const DRAG_START_THRESHOLD = 4 | COMMENT |
| LOW | desktop/src/components/layout/TabBar.tsx | 241 | // a scrollLeft computed without them. Measured on a 1280px window with seven | COMMENT |
| LOW | desktop/src/components/layout/TabBar.tsx | 801 | // borderless so paper runs unbroken from the tab into the view below. | COMMENT |
| LOW | desktop/src/lib/assistantOutputTargets.ts | 341 | // A deliverable produced by a shell command is never in `changedFiles` — the | COMMENT |
| LOW | desktop/src/pages/SettingsNavigation.test.tsx | 81 | const rail = screen.getByRole('button', { name: 'Providers' }) | COMMENT |
| LOW | src/main.tsx | 1 | // These side-effects must run before all other imports: | COMMENT |
| LOW | src/main.tsx | 1041 | // the tengu_kairos GrowthBook gate is on, force brief on. Permission | COMMENT |
| LOW | src/main.tsx | 1061 | // isAssistantMode() runs below. The daemon has already checked | COMMENT |
| LOW | src/main.tsx | 1501 | } | COMMENT |
| LOW | src/main.tsx | 1601 | if (dynamicMcpConfig && !areMcpConfigsAllowedWithEnterpriseMcpConfig(dynamicMcpConfig)) { | COMMENT |
| LOW | src/main.tsx | 1981 | // .claude/settings.json PATH/GIT_DIR/GIT_WORK_TREE) so gitExe() and | COMMENT |
| LOW | src/main.tsx | 2001 | // a cache hit. The microtask from await getIsGit() drains at the | COMMENT |
| LOW | src/main.tsx | 2021 | // persists it on the first user message; REPL's useTerminalTitle reads it | COMMENT |
| LOW | src/main.tsx | 2581 | // Sequencing matters: the warmup scans disk for .orphaned_at markers, | COMMENT |
| LOW | src/main.tsx | 2621 | if (outputFormat === 'stream-json' || outputFormat === 'json') { | COMMENT |
| LOW | src/main.tsx | 2781 | // Desktop/bridge sessions (`--sdk-url`) are different: the user is | COMMENT |
| LOW | src/QueryEngine.ts | 441 | // an assistant/user/compact_boundary message — which doesn't happen until | COMMENT |
| LOW | src/query.ts | 281 | transition: undefined, | COMMENT |
| LOW | src/query.ts | 421 | ) | COMMENT |
| LOW | src/query.ts | 601 | // Skip this check if compaction just happened - the compaction result is already | COMMENT |
| LOW | src/query.ts | 1081 | const isWithheld413 = | COMMENT |
| LOW | src/query.ts | 1561 | // Drain pending notifications. LocalShellTask completions are 'next' | COMMENT |
| LOW | src/ink/output.ts | 741 | nextCode <= 0x7e | COMMENT |
| LOW | src/ink/dom.ts | 41 | // Used to skip empty renders during React 19's effect double-invoke in test mode | COMMENT |
| LOW | src/ink/dom.ts | 61 | // naturally cancels (pure accumulator, no target tracking). | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 721 | // padding) begins. Exposed via ScrollBoxHandle.getViewportTop() so | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 741 | node.pendingScrollDelta = undefined | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 761 | // transiently SHRINK scrollHeight (tail unmount + stale heightCache | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 801 | // startup) the probe has resolved — same timing guarantee the | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 881 | } else { | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 961 | // 1. Dirty children — their content changed, blitted pixels are | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 981 | // check cached.y−delta === screenY reduces to delta === delta | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 1101 | boxBackgroundColor, | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 1221 | nodeCache.set(node, rect) | COMMENT |
| LOW | src/ink/render-node-to-output.ts | 1241 | // Without this, a spinner inside a ScrollBox dirties the wrapper on every | COMMENT |
| LOW | src/ink/searchHighlight.ts | 41 | const rowOff = row * w | COMMENT |
| LOW | src/ink/ink.tsx | 121 | // pass in onRender can read it and App.tsx can update it from mouse | COMMENT |
| LOW | src/ink/ink.tsx | 141 | private readonly selectionListeners = new Set<() => void>(); | COMMENT |
| LOW | src/ink/ink.tsx | 161 | // INSIDE the BSU/ESU block so clear+paint is atomic. Writing ERASE_SCREEN | COMMENT |
| LOW | src/ink/ink.tsx | 461 | // captureScrolledRows reads the rows that are about to scroll out | COMMENT |
| LOW | src/ink/ink.tsx | 481 | // captureScrolledRows and shift* are a pair: capture grabs rows about | COMMENT |
| LOW | src/ink/ink.tsx | 501 | // the footer endpoint pins the selection, text scrolls away under | COMMENT |
| LOW | src/ink/ink.tsx | 521 | // so the diff picks up selection as ordinary cell changes and | COMMENT |
| LOW | src/ink/ink.tsx | 561 | // cells at sibling boundaries that per-node damage tracking misses. | COMMENT |
| LOW | src/ink/ink.tsx | 621 | }); | COMMENT |
| LOW | src/ink/ink.tsx | 641 | // After resize, prepend ERASE_SCREEN too. The diff only writes cells | COMMENT |
| LOW | src/ink/ink.tsx | 741 | writeDiffToTerminal(this.terminal, optimized, this.altScreenActive && !SYNC_OUTPUT_SUPPORTED); | COMMENT |
| LOW | src/ink/ink.tsx | 1481 | // We unconditionally send all disable sequences because terminal detection | COMMENT |
| LOW | src/ink/parse-keypress.ts | 21 | // Modifier is optional - when absent, defaults to 1 (no modifiers) | COMMENT |
| 413 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | desktop/src/stores/chatStore.ts | 5645 | // Step 1: Collect Agent tool_use blocks → map agent name to toolUseId | COMMENT |
| LOW | desktop/src/stores/chatStore.ts | 5665 | // Step 2: Extract <teammate-message> content by teammate_id | COMMENT |
| LOW | desktop/src/stores/chatStore.ts | 5695 | // Step 3: Correlate and build notifications | COMMENT |
| LOW | src/tasks/LocalShellTask/LocalShellTask.tsx | 294 | // Step 1: Get the task and shell command from current state | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 277 | // Step 1: Protect literal backslashes (\\) first - in both BRE and ERE, \\ is literal backslash | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 279 | // Step 2: Replace escaped metacharacters with placeholders (these should become unescaped in JS) | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 285 | // Step 3: Escape unescaped metacharacters (these are literal in BRE) | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 291 | // Step 4: Replace placeholders with their JS equivalents | COMMENT |
| LOW | src/server/api/computer-use.ts | 344 | // Step 1: Check python | COMMENT |
| LOW | src/server/api/computer-use.ts | 374 | // Step 2: Extract runtime files to ~/.claude/.runtime/ | COMMENT |
| LOW | src/server/api/computer-use.ts | 387 | // Step 3: Create venv | COMMENT |
| LOW | src/server/api/computer-use.ts | 427 | // Step 4: Ensure pip | COMMENT |
| LOW | src/server/api/computer-use.ts | 448 | // Step 5: Install requirements | COMMENT |
| LOW | src/server/services/sessionService.ts | 2506 | // Step 1: Try matching the transcript model name directly (current behavior) | COMMENT |
| LOW | src/server/services/sessionService.ts | 2518 | // Step 2: Prefer the model this session actually launched with. Some | COMMENT |
| LOW | src/server/services/sessionService.ts | 2534 | // Step 3: If transcript model name didn't match, try matching with | COMMENT |
| LOW⚡ | src/server/services/sessionService.ts | 2579 | // Step 1: Try matching the transcript model name directly | COMMENT |
| LOW⚡ | src/server/services/sessionService.ts | 2589 | // Step 2: Fallback to provider configured model names. | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 753 | // Step 1: Migrate to single file format (consolidates V1/V2 files, cleans up legacy cache) | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 756 | // Step 2: Sync enabledPlugins from settings.json to installed_plugins.json | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 764 | // Step 3: Initialize in-memory session state | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 1183 | // Step 2: Start with existing data (or start empty if no file exists) | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 1192 | // Step 3: Update V2 scopes based on settings.json (settings is source of truth) | COMMENT |
| LOW | src/utils/plugins/installedPluginsManager.ts | 1148 | // Step 1: Build a map of pluginId -> scope from all settings.json files | COMMENT |
| LOW | src/utils/plugins/installedPluginsManager.ts | 1312 | // Step 4: Save to single file (V2 format) | COMMENT |
| LOW⚡ | src/utils/plugins/pluginLoader.ts | 1360 | // Step 1: Load or create the plugin manifest | COMMENT |
| LOW⚡ | src/utils/plugins/pluginLoader.ts | 1365 | // Step 2: Create the base plugin object | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1376 | // Step 3: Auto-detect optional directories in parallel | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1532 | // Step 4: Register agents directory if detected | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1641 | // Step 5: Load hooks configuration | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1789 | // Step 6: Load plugin settings | COMMENT |
| LOW | src/utils/permissions/permissionSetup.ts | 993 | // We need to check if base tools were explicitly provided (not just empty default) | COMMENT |
| LOW | src/components/MarkdownTable.tsx | 107 | // Step 1: Get minimum (longest word) and ideal (full content) widths | COMMENT |
| LOW⚡ | src/components/MarkdownTable.tsx | 123 | // Step 2: Calculate available space | COMMENT |
| LOW⚡ | src/components/MarkdownTable.tsx | 130 | // Step 3: Calculate column widths that fit available space | COMMENT |
| LOW | src/components/MarkdownTable.tsx | 158 | // Step 4: Calculate max row lines to determine if vertical format is needed | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 353 | // Step 1: Transform lines to line objects with type information | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 356 | // Step 2: Group adjacent add/remove lines for word-level diffing | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 359 | // Step 3: Number the diff lines | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 368 | // Step 4: Render formatting | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 40 | ### Step 1: Analyze the Session | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 52 | ### Step 2: Interview the User | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 90 | ### Step 3: Write the SKILL.md | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 148 | ### Step 4: Confirm and Save | COMMENT |
| LOW⚡ | src/services/compact/sessionMemoryCompact.ts | 242 | // Step 1: Handle tool_use/tool_result pairs | COMMENT |
| LOW | src/services/compact/sessionMemoryCompact.ts | 288 | // Step 2: Handle thinking blocks that share message.id with kept assistant messages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | desktop/src/stores/chatStore.ts | 5645 | // Step 1: Collect Agent tool_use blocks → map agent name to toolUseId | COMMENT |
| LOW | desktop/src/stores/chatStore.ts | 5665 | // Step 2: Extract <teammate-message> content by teammate_id | COMMENT |
| LOW | desktop/src/stores/chatStore.ts | 5695 | // Step 3: Correlate and build notifications | COMMENT |
| LOW | src/tasks/LocalShellTask/LocalShellTask.tsx | 294 | // Step 1: Get the task and shell command from current state | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 277 | // Step 1: Protect literal backslashes (\\) first - in both BRE and ERE, \\ is literal backslash | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 279 | // Step 2: Replace escaped metacharacters with placeholders (these should become unescaped in JS) | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 285 | // Step 3: Escape unescaped metacharacters (these are literal in BRE) | COMMENT |
| LOW⚡ | src/tools/BashTool/sedEditParser.ts | 291 | // Step 4: Replace placeholders with their JS equivalents | COMMENT |
| LOW | src/server/api/computer-use.ts | 344 | // Step 1: Check python | COMMENT |
| LOW | src/server/api/computer-use.ts | 374 | // Step 2: Extract runtime files to ~/.claude/.runtime/ | COMMENT |
| LOW | src/server/api/computer-use.ts | 387 | // Step 3: Create venv | COMMENT |
| LOW | src/server/api/computer-use.ts | 427 | // Step 4: Ensure pip | COMMENT |
| LOW | src/server/api/computer-use.ts | 448 | // Step 5: Install requirements | COMMENT |
| LOW | src/server/services/sessionService.ts | 2506 | // Step 1: Try matching the transcript model name directly (current behavior) | COMMENT |
| LOW | src/server/services/sessionService.ts | 2518 | // Step 2: Prefer the model this session actually launched with. Some | COMMENT |
| LOW | src/server/services/sessionService.ts | 2534 | // Step 3: If transcript model name didn't match, try matching with | COMMENT |
| LOW⚡ | src/server/services/sessionService.ts | 2579 | // Step 1: Try matching the transcript model name directly | COMMENT |
| LOW⚡ | src/server/services/sessionService.ts | 2589 | // Step 2: Fallback to provider configured model names. | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 753 | // Step 1: Migrate to single file format (consolidates V1/V2 files, cleans up legacy cache) | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 756 | // Step 2: Sync enabledPlugins from settings.json to installed_plugins.json | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 764 | // Step 3: Initialize in-memory session state | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 1183 | // Step 2: Start with existing data (or start empty if no file exists) | COMMENT |
| LOW⚡ | src/utils/plugins/installedPluginsManager.ts | 1192 | // Step 3: Update V2 scopes based on settings.json (settings is source of truth) | COMMENT |
| LOW | src/utils/plugins/installedPluginsManager.ts | 1148 | // Step 1: Build a map of pluginId -> scope from all settings.json files | COMMENT |
| LOW | src/utils/plugins/installedPluginsManager.ts | 1312 | // Step 4: Save to single file (V2 format) | COMMENT |
| LOW⚡ | src/utils/plugins/pluginLoader.ts | 1360 | // Step 1: Load or create the plugin manifest | COMMENT |
| LOW⚡ | src/utils/plugins/pluginLoader.ts | 1365 | // Step 2: Create the base plugin object | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1376 | // Step 3: Auto-detect optional directories in parallel | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1532 | // Step 4: Register agents directory if detected | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1641 | // Step 5: Load hooks configuration | COMMENT |
| LOW | src/utils/plugins/pluginLoader.ts | 1789 | // Step 6: Load plugin settings | COMMENT |
| LOW | src/components/MarkdownTable.tsx | 107 | // Step 1: Get minimum (longest word) and ideal (full content) widths | COMMENT |
| LOW⚡ | src/components/MarkdownTable.tsx | 123 | // Step 2: Calculate available space | COMMENT |
| LOW⚡ | src/components/MarkdownTable.tsx | 130 | // Step 3: Calculate column widths that fit available space | COMMENT |
| LOW | src/components/MarkdownTable.tsx | 158 | // Step 4: Calculate max row lines to determine if vertical format is needed | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 353 | // Step 1: Transform lines to line objects with type information | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 356 | // Step 2: Group adjacent add/remove lines for word-level diffing | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 359 | // Step 3: Number the diff lines | COMMENT |
| LOW⚡ | src/components/StructuredDiff/Fallback.tsx | 368 | // Step 4: Render formatting | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 40 | ### Step 1: Analyze the Session | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 52 | ### Step 2: Interview the User | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 90 | ### Step 3: Write the SKILL.md | COMMENT |
| LOW | src/skills/bundled/skillify.ts | 148 | ### Step 4: Confirm and Save | COMMENT |
| LOW⚡ | src/services/compact/sessionMemoryCompact.ts | 242 | // Step 1: Handle tool_use/tool_result pairs | COMMENT |
| LOW | src/services/compact/sessionMemoryCompact.ts | 288 | // Step 2: Handle thinking blocks that share message.id with kept assistant messages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | adapters/feishu/streaming-card.ts | 220 | this.deps.larkClient.im.message.create({ | CODE |
| CRITICAL | adapters/feishu/streaming-card.ts | 355 | this.deps.larkClient.im.message.patch({ | CODE |
| CRITICAL | adapters/feishu/streaming-card.ts | 369 | this.deps.larkClient.im.message.patch({ | CODE |
| CRITICAL | adapters/feishu/streaming-card.ts | 424 | this.deps.larkClient.im.message.patch({ | CODE |
| CRITICAL | adapters/feishu/streaming-card.ts | 577 | this.deps.larkClient.im.message.patch({ | CODE |
| CRITICAL | src/tools/AgentTool/UI.tsx | 839 | const toolResultBlock = lastToolResult.data.message.message.content.find(c => c.type === 'tool_result'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | release-notes/v0.4.3.md | 58 | - #830:尊重自定义 provider context window。 | CODE |
| MEDIUM | src/main.tsx | 3339 | // of a remote assistant session. The agentic loop runs remotely; this | COMMENT |
| MEDIUM | src/query.ts | 198 | // budget for the whole agentic turn; `remaining` is computed per iteration | COMMENT |
| MEDIUM | src/tools/AgentTool/loadAgentsDir.ts | 128 | maxTurns?: number // Maximum number of agentic turns before stopping | CODE |
| MEDIUM | src/utils/betas.ts | 440 | // excluded by getAllModelBetas() since non-agentic Haiku calls don't need them. | COMMENT |
| MEDIUM | src/utils/attachments.ts | 1081 | // During proactive agentic loops, task-notification commands would otherwise | COMMENT |
| MEDIUM | src/utils/attachments.ts | 1315 | // long agentic sessions, where this accumulated 60-105× per session. | COMMENT |
| MEDIUM | src/services/api/claude.ts | 775 | // (query.ts decrements across the agentic loop). | COMMENT |
| MEDIUM | src/services/api/claude.ts | 1201 | // non-agentic queries (compact, side_question, extract_memories, etc.) | COMMENT |
| MEDIUM | src/services/api/claude.ts | 1535 | // per-call so non-agentic queries keep their own stable header set. | COMMENT |
| MEDIUM | src/services/api/claude.ts | 1569 | // Only latch from agentic queries so a classifier call doesn't flip the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ktop/scripts/e2e-deepseek-thinking-ui-agent-browser.sh | 192 | .find((node) => node.getAttribute('placeholder') === placeholder); | CODE |
| LOW | …ktop/scripts/e2e-deepseek-thinking-ui-agent-browser.sh | 279 | .find((node) => node.getAttribute('placeholder') === placeholder); | CODE |
| LOW | …ktop/scripts/e2e-deepseek-thinking-ui-agent-browser.sh | 285 | .filter((node) => node.getAttribute('placeholder') === '与主模型相同'); | CODE |
| LOW | desktop/src/stores/hahaOpenAIOAuthStore.test.ts | 60 | email: 'user@example.com', | CODE |
| LOW | desktop/src/stores/hahaOpenAIOAuthStore.test.ts | 73 | email: 'user@example.com', | CODE |
| LOW | desktop/src/stores/hahaOpenAIOAuthStore.test.ts | 85 | email: 'user@example.com', | CODE |
| LOW | scripts/quality-gate/desktop-smoke/deterministic.ts | 82 | apiKey: 'desktop-ui-smoke-fake-key', | CODE |
| LOW | …ripts/quality-gate/desktop-smoke/deterministic.test.ts | 56 | apiKey: 'desktop-ui-smoke-fake-key', | CODE |
| LOW | src/server/__tests__/haha-grok-oauth-service.test.ts | 90 | email: 'user@example.com', | CODE |
| LOW | src/server/__tests__/haha-grok-oauth-service.test.ts | 100 | email: 'user@example.com', | CODE |
| LOW | src/server/__tests__/haha-grok-oauth-service.test.ts | 137 | email: 'user@example.com', | CODE |
| LOW | src/server/__tests__/haha-grok-oauth-api.test.ts | 41 | email: 'user@example.com', | CODE |
| LOW | src/server/__tests__/haha-grok-oauth-api.test.ts | 49 | expect(statusText).toContain('user@example.com') | CODE |
| LOW | src/server/__tests__/providers.test.ts | 555 | email: 'user@example.com', | CODE |
| LOW | src/server/services/diagnosticsShare.test.ts | 81 | email: 'user@example.com', | CODE |
| LOW | src/server/services/diagnosticsShare.test.ts | 105 | 'user@example.com', | CODE |
| LOW | src/utils/plugins/pluginLoader.ts | 1117 | * "name": "John Doe", | COMMENT |
| LOW | src/utils/plugins/marketplaceManager.ts | 1244 | * "owner": { "name": "John Doe", "email": "john@example.com" }, | COMMENT |
| LOW | src/utils/mcp/elicitationValidation.ts | 24 | example: 'user@example.com', | CODE |
| LOW | src/utils/__tests__/tokens.test.ts | 28 | content: [{ type: 'text', text: 'placeholder' }], | CODE |
| LOW | src/skills/bundled/loremIpsum.ts | 273 | // Just dump the lorem ipsum text into the conversation | COMMENT |
| LOW | src/services/openaiAuth/storage.test.ts | 90 | email: 'user@example.com', | CODE |
| LOW | src/services/openaiAuth/storage.test.ts | 103 | email: 'user@example.com', | CODE |
| LOW | src/services/openaiAuth/fetch.test.ts | 30 | email: 'user@example.com', | CODE |
| LOW | src/services/openaiAuth/fetch.ts | 24 | export const OPENAI_OAUTH_DUMMY_KEY = 'openai-oauth-dummy-key' | CODE |
| LOW | src/services/grokAuth/storage.test.ts | 35 | email: 'user@example.com', | CODE |
| LOW | src/services/grokAuth/fetch.ts | 13 | export const GROK_OAUTH_DUMMY_KEY = 'grok-oauth-dummy-key' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/server/services/sessionService.ts | 2225 | // 3. Look for AI-generated title (written by titleService) | COMMENT |
| HIGH | src/utils/claudeInChrome/setup.ts | 320 | REM Generated by Claude Code - do not edit manually | CODE |
| HIGH | src/utils/claudeInChrome/setup.ts | 325 | # Generated by Claude Code - do not edit manually | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | package-lock.json | 5300 | "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | site/package-lock.json | 1802 | "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | src/tools/PowerShellTool/commandSemantics.ts | 71 | // robocopy.exe: Windows native robust file copy | COMMENT |
| MEDIUM | src/utils/swarm/backends/PaneBackendExecutor.ts | 341 | // A more robust check would query the backend for pane existence | COMMENT |
| MEDIUM | src/utils/powershell/parser.ts | 1068 | // and extracting .Redirections) is both simpler and more robust: it catches | COMMENT |
| MEDIUM | src/hooks/useVoiceIntegration.tsx | 176 | // the gap is seamless once transcript text arrives. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | runtime/win_helper.py | 265 | except Exception: | CODE |
| LOW⚡ | runtime/win_helper.py | 277 | except Exception: | CODE |
| LOW⚡ | runtime/win_helper.py | 541 | except Exception: | CODE |
| LOW⚡ | runtime/win_helper.py | 553 | except Exception: | CODE |
| LOW | runtime/win_helper.py | 159 | except Exception: | CODE |
| LOW | runtime/win_helper.py | 239 | except Exception: | CODE |
| LOW | runtime/win_helper.py | 405 | except Exception: | CODE |
| LOW | runtime/win_helper.py | 430 | except Exception: | CODE |
| LOW | runtime/win_helper.py | 763 | except Exception as exc: | CODE |
| LOW | runtime/mac_helper.py | 219 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 365 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 371 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 382 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 522 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 530 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 570 | except Exception: | CODE |
| LOW | runtime/mac_helper.py | 769 | except Exception as exc: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/win_helper.py | 7 | CODE | |
| LOW | runtime/mac_helper.py | 2 | CODE | |
| LOW | runtime/test_helpers.py | 12 | CODE | |
| LOW | runtime/test_helpers.py | 19 | CODE | |
| LOW | runtime/test_helpers.py | 19 | CODE | |
| LOW | desktop/scripts/assemble-generated-pet-atlas.py | 4 | CODE | |
| LOW | desktop/scripts/build-pet-sheet-guide.py | 13 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/win_helper.py | 281 | CODE | |
| LOW | runtime/win_helper.py | 434 | CODE | |
| LOW | runtime/win_helper.py | 478 | CODE | |
| LOW | runtime/mac_helper.py | 350 | CODE | |
| LOW | runtime/mac_helper.py | 448 | CODE | |
| LOW | runtime/mac_helper.py | 608 | CODE | |
| LOW | runtime/test_helpers.py | 33 | CODE | |
| LOW | desktop/scripts/build-pet-sheet-guide.py | 134 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/tools/TodoWriteTool/prompt.ts | 100 | print("Hello World") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/test_helpers.py | 35 | # Read the file and extract just the KEY_MAP dict | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | desktop/scripts/install-macos-unsigned.sh | 15 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/utils/hooks.ts | 1211 | // TODO: Add tests for EPIPE handling. | COMMENT |