Make Any Website into CLI & Use your logged-in browser by AI agent.
This report presents the forensic synthetic code analysis of jackwener/OpenCLI, a JavaScript project with 26,627 GitHub stars. SynthScan v2.0 examined 328,606 lines of code across 2380 source files, recording 1211 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 6.3 places this repository in the Low AI signal 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 1211 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 |
|---|---|---|---|---|
| MEDIUM | autoresearch/eval-skill.ts | 24 | // ── Types ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | autoresearch/eval-skill.ts | 42 | // ── Task Definitions (inline, to avoid YAML dependency) ──────────── | COMMENT |
| MEDIUM | autoresearch/eval-skill.ts | 95 | // ── Run Task ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | autoresearch/eval-skill.ts | 191 | // ── Main ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 80 | // ─── Console log forwarding ────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 108 | // ─── WebSocket connection ──────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 216 | // ─── WebSocket keepalive ───────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 267 | // ─── Browser target leases ─────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 1183 | // ─── Lifecycle events ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 1256 | // ─── Popup status API ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 1298 | // ─── Command dispatcher ───────────────────────────────────────────── | COMMENT |
| MEDIUM | extension/src/background.ts | 1364 | // ─── Action handlers ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …erpowers/plans/2026-03-31-daemon-lifecycle-redesign.md | 560 | // ── Built-in: daemon ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/postinstall.js | 23 | // ── Completion script content ────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/postinstall.js | 58 | // ── Helpers ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/postinstall.js | 74 | // ── Main ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/postinstall.js | 146 | // ── Spotify credentials template ──────────────────────────────────── | COMMENT |
| MEDIUM | scripts/postinstall.js | 162 | // ── Browser Bridge setup hint ─────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/trending.js | 3 | // ── CLI definition ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/timeline.js | 5 | // ── Twitter GraphQL constants ────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/timeline.js | 140 | // ── CLI definition ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/thread.js | 6 | // ── Twitter GraphQL constants ────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/thread.js | 103 | // ── CLI definition ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/utils.js | 234 | // ── Engagement scoring (P3) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/twitter/search.js | 6 | // ── Public-search operator surface ───────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/utils.js | 148 | // ── Formatting helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/utils.js | 208 | // ── Deep links ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/utils.js | 243 | // ── Argument validation ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/utils.js | 288 | // ── Empty-result helper ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/book.js | 57 | // ── info section ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/book.js | 85 | // ── chapters section ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/weread-official/book.js | 108 | // ── progress section ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.js | 105 | // ── New chat (must happen before model/thinking selection) ────── | COMMENT |
| MEDIUM | clis/gemini/ask.js | 110 | // ── Early validation: model format & thinking value ──────────── | COMMENT |
| MEDIUM | clis/gemini/ask.js | 132 | // thinking selection) ────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.js | 168 | // ── Model selection ────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.js | 187 | // ── Thinking validation and selection ────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/models.js | 19 | // ── Shared helpers (embedded in browser scripts) ────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/models.js | 247 | // ── Parse models from menu items ────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/models.js | 276 | // ── Close the menu ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/models.js | 283 | // ── Exported script builders ────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/models.js | 436 | // ── Command registration ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/models.test.js | 215 | // ── DOM fixture tests (jsdom) ────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 147 | // ── Command registration ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 186 | // ── validateAskModelValue ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 258 | // ── gemini ask orchestration ───────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 265 | // ── Baseline behavior (no --model) ─────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 302 | // ── Omitted --model (no model change) ──────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 334 | // ── Valid model selection ──────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 412 | // ── Alias rejection ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 460 | // ── Invalid / unavailable model ────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 523 | // ── Browser Bridge envelope unwrap ─────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 558 | // ── Ordering and state ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 588 | // ── Model selection + --new interaction ────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 615 | // ── Valid thinking selection (current model matched) ───────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 680 | // ── Invalid thinking value (not standard or extended) ──────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 706 | // ── Current-model-scoped validation ────────────────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 756 | // ── Union fallback when current model unknown ──────────────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 792 | // ── Graceful degradation when discovery returns empty ──────────── | COMMENT |
| MEDIUM | clis/gemini/ask.test.js | 827 | // ── Failed thinking selection ──────────────────────────────────── | COMMENT |
| 217 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | extension/src/cdp.ts | 519 | function registerFrameTargetCleanup(): void { | CODE |
| LOW | extension/src/cdp.ts | 743 | function getOrCreateNetworkCaptureEntry(tabId: number, requestId: string, fallback?: { | CODE |
| LOW | extension/src/cdp.ts | 743 | function getOrCreateNetworkCaptureEntry(tabId: number, requestId: string, fallback?: { | CODE |
| LOW | extension/src/background.ts | 629 | function getOwnedContainerGroupTitles(role: OwnedWindowRole): string[] { | CODE |
| LOW | extension/src/background.ts | 644 | async function focusOwnedWindowIfRequested(windowId: number, mode: WindowMode): Promise<void> { | CODE |
| LOW | extension/src/background.ts | 650 | async function toOwnedContainerGroupCandidate(group: chrome.tabGroups.TabGroup): Promise<OwnedContainerGroupCandidate | | CODE |
| LOW | extension/src/background.ts | 667 | function selectOwnedContainerGroupCandidate(candidates: OwnedContainerGroupCandidate[]): OwnedContainerGroupCandidate | | CODE |
| LOW | extension/src/background.ts | 677 | async function collectOwnedGroupCandidates(role: OwnedWindowRole): Promise<OwnedContainerGroupCandidate[]> { | CODE |
| LOW | extension/src/background.ts | 763 | function updateOwnedSessionWindowForTabs(role: OwnedWindowRole, tabIds: number[], windowId: number): void { | CODE |
| LOW | extension/src/background.ts | 789 | async function ensureCanonicalGroupTitle(role: OwnedWindowRole, group: OwnedContainerGroup): Promise<OwnedContainerGroup | CODE |
| LOW | extension/src/background.ts | 799 | async function convergeOwnedGroupDuplicates( | CODE |
| LOW | extension/src/background.ts | 858 | async function ensureOwnedContainerGroup( | CODE |
| LOW | extension/src/background.ts | 882 | async function ensureOwnedContainerGroupUnlocked( | CODE |
| LOW | extension/src/background.ts | 932 | async function ensureOwnedContainerWindow( | CODE |
| LOW | extension/src/background.ts | 946 | async function ensureOwnedContainerWindowUnlocked( | CODE |
| LOW | extension/src/background.ts | 1040 | async function findReusableOwnedContainerTab(windowId: number, ownedGroupId?: number | null): Promise<number | undefined | CODE |
| LOW | extension/src/background.ts | 1076 | async function createOwnedTabLeaseUnlocked(leaseKey: string, initialUrl?: string): Promise<ResolvedTab> { | CODE |
| LOW | extension/src/background.ts | 1381 | function normalizeUrlForComparison(url?: string): string { | CODE |
| LOW | extension/src/background.ts | 1408 | function enumerateCrossOriginFrames(tree: any): Array<{ index: number; frameId: string; url: string; name: string }> { | CODE |
| LOW | extension/src/background.ts | 1999 | function stripOpenCliFrameRoutingParams(params: Record<string, unknown>, stripFrameId: boolean): Record<string, unknown> | CODE |
| LOW | extension/src/background.ts | 2039 | async function handleNetworkCaptureStart(cmd: Command, leaseKey: string): Promise<Result> { | CODE |
| LOW | extension/src/background.ts | 2121 | async function reconcileTargetLeaseRegistry(): Promise<void> { | CODE |
| LOW | tests/e2e/browser-auth-helpers.ts | 8 | export async function expectGracefulAuthFailure(args: string[]) { | CODE |
| LOW | tests/e2e/browser-public.test.ts | 38 | function isBrowserBridgeUnavailable(result: CliResult): boolean { | CODE |
| LOW | tests/e2e/browser-public.test.ts | 96 | function expectNonEmptyDataOrSkipEnv(data: any[] | null, label: string): data is any[] { | CODE |
| LOW | tests/e2e/browser-public.test.ts | 122 | function countTiebaReplyFloorOverlap(left: any[] | null, right: any[] | null): number { | CODE |
| LOW | tests/e2e/browser-public.test.ts | 147 | async function getTiebaReadCandidateOrSkip( | CODE |
| LOW | tests/e2e/browser-public.test.ts | 238 | async function expectImdbDataOrChallengeSkip(args: string[], label: string): Promise<any[] | null> { | CODE |
| LOW | tests/e2e/browser-ax-chrome.test.ts | 280 | function shouldFailOnBridgeUnavailable(): boolean { | CODE |
| LOW | tests/e2e/public-commands.test.ts | 12 | function isExpectedChineseSiteRestriction(code: number, stderr: string): boolean { | CODE |
| LOW | tests/e2e/public-commands.test.ts | 26 | function isExpectedApplePodcastsRestriction(code: number, stderr: string): boolean { | CODE |
| LOW | tests/e2e/public-commands.test.ts | 32 | function isExpectedGoogleRestriction(code: number, stderr: string): boolean { | CODE |
| LOW | clis/ctrip/hotel-search.js | 70 | function assertCheckinBeforeCheckout(checkin, checkout) { | CODE |
| LOW | clis/twitter/download.js | 149 | function normalizeUserMediaOperation(operation) { | CODE |
| LOW | clis/twitter/download.js | 160 | function normalizeUserByScreenNameOperation(operation) { | CODE |
| LOW | clis/twitter/article.test.js | 17 | function createPageWithEvaluateResults(evaluateResults) { | CODE |
| LOW | clis/twitter/article.test.js | 60 | async function evaluateArticleFetchScript(script, payload) { | CODE |
| LOW | clis/twitter/tweets.js | 101 | function normalizeUserTweetsOperation(operation) { | CODE |
| LOW | clis/twitter/tweets.js | 112 | function normalizeUserByScreenNameOperation(operation) { | CODE |
| LOW | clis/twitter/tweets.js | 230 | function normalizePageDelaySeconds(rawDelay) { | CODE |
| LOW | clis/twitter/post.js | 37 | function isUnsupportedInsertTextError(err) { | CODE |
| LOW | clis/twitter/post.js | 146 | async function attachImagesViaDataTransfer(page, absPaths) { | CODE |
| LOW | clis/twitter/lists.js | 79 | export function getListsManagementInstructions(data) { | CODE |
| LOW | clis/twitter/bookmark-folder.js | 86 | export function parseBookmarkFolderTimeline(data, seen) { | CODE |
| LOW | clis/twitter/utils.js | 202 | export function isRecoverableFileInputError(error) { | CODE |
| LOW | clis/twitter/utils.js | 207 | export async function waitForComposerMediaReady(page, expectedCount = 1) { | CODE |
| LOW | clis/twitter/shared.js | 75 | export function buildTwitterArticleScopeSource(tweetId) { | CODE |
| LOW | clis/twitter/shared.js | 105 | export function normalizeTwitterScreenName(value) { | CODE |
| LOW | clis/twitter/shared.js | 137 | export function normalizeTwitterOperationFlags(value) { | CODE |
| LOW | clis/twitter/shared.js | 146 | function normalizeOperationFallback(fallback) { | CODE |
| LOW | clis/twitter/shared.js | 171 | export function looksLikePrivateTwitterTimeline(data) { | CODE |
| LOW | clis/twitter/shared.js | 177 | export function normalizeTwitterGraphqlPayload(value) { | CODE |
| LOW | clis/twitter/shared.js | 193 | export function sanitizeTwitterOperationMetadata(resolved, fallback) { | CODE |
| LOW | clis/twitter/shared.js | 225 | export function parseOperationFromBundleText(text, operationName) { | CODE |
| LOW | clis/twitter/shared.js | 260 | export async function resolveTwitterOperationMetadata(page, operationName, fallback) { | CODE |
| LOW | clis/twitter/search.js | 184 | function buildSearchTimelineRequest(operation, rawQuery, product, count, cursor) { | CODE |
| LOW | clis/twitter/list-batch-utils.js | 7 | export function parseCommaSeparatedUsernames(rawValue, example) { | CODE |
| LOW | clis/twitter/list-batch-utils.js | 37 | export function parseBatchIntervalSeconds(rawValue) { | CODE |
| LOW | clis/mercury/utils.js | 89 | export function normalizeReimbursementInput(kwargs) { | CODE |
| LOW | clis/mercury/utils.js | 202 | export async function assertCreateExpenseSurface(page) { | CODE |
| 499 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | autoresearch/save-adapters/zhihu-search-detail.ts | 18 | // Step 1: Navigate | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-search-detail.ts | 21 | // Step 2: Search API — filter results by type, extract question IDs | COMMENT |
| LOW | autoresearch/save-adapters/zhihu-search-detail.ts | 33 | // Step 3: For each result, fetch question stats (answer_count, follower_count) | COMMENT |
| LOW | autoresearch/save-adapters/zhihu-search-detail.ts | 47 | // Step 4: Format output | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 18 | // Step 1: Navigate to note detail page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 21 | // Step 2: Extract note metadata (title, author, likes) | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 29 | // Step 3: Scroll the note container to trigger comment loading | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 37 | // Step 4: Extract comments from DOM | COMMENT |
| LOW | autoresearch/save-adapters/xhs-note-comments.ts | 54 | // Step 5: Merge note meta + comments into unified output | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 18 | // Step 1: Navigate to question page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 21 | // Step 2: Fetch question detail | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 29 | // Step 3: Fetch top answers | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 38 | // Step 4: Fetch related questions | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 46 | // Step 5: Merge three layers into unified output | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 18 | // Step 1: Navigate to search page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 20 | // Step 2: Wait for async render via MutationObserver | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 28 | // Step 3: Scroll 3x to load more content | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 33 | // Step 4: Extract from DOM with deduplication | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 16 | // Step 1: Navigate to explore page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 18 | // Step 2: Wait for initial content via MutationObserver | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 26 | // Step 3: Multi-round adaptive scroll (early stop when no new content) | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 35 | // Step 4: Extract with noteId deduplication + parse likes as integers | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 57 | // Step 5: Sort by likes descending | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 59 | // Step 6: Slice and format | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-hot-detail.ts | 16 | // Step 1: Navigate | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-hot-detail.ts | 19 | // Step 2: Fetch hot list (handle 16+ digit IDs) | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-hot-detail.ts | 29 | // Step 3: For each hot question, fetch its top answer | COMMENT |
| LOW | autoresearch/save-adapters/zhihu-hot-detail.ts | 46 | // Step 4: Format output | COMMENT |
| LOW | docs/guide/electron-app-cli.md | 68 | ### Step 1: Build `status` | COMMENT |
| LOW | docs/guide/electron-app-cli.md | 79 | ### Step 2: Build `dump` | COMMENT |
| LOW | docs/guide/electron-app-cli.md | 90 | ### Step 3: Build `read` | COMMENT |
| LOW | docs/guide/electron-app-cli.md | 102 | ### Step 4: Build `send` | COMMENT |
| LOW | docs/guide/electron-app-cli.md | 111 | ### Step 5: Build `new` | COMMENT |
| LOW | docs/superpowers/plans/2026-03-28-perf-smart-wait.md | 463 | // Step 1: Install fetch/XHR interceptor BEFORE trigger | COMMENT |
| LOW | docs/superpowers/plans/2026-03-28-perf-smart-wait.md | 466 | // Step 2: Execute the trigger action | COMMENT |
| LOW⚡ | docs/superpowers/plans/2026-03-28-perf-smart-wait.md | 480 | // Step 3: Wait for network capture instead of fixed sleep | COMMENT |
| LOW⚡ | docs/superpowers/plans/2026-03-28-perf-smart-wait.md | 483 | // Step 4: Retrieve captured data | COMMENT |
| LOW⚡ | docs/superpowers/plans/2026-03-28-perf-smart-wait.md | 486 | // Step 5: Select from response if specified | COMMENT |
| LOW⚡ | clis/pixiv/illusts.js | 29 | // Step 1: get all illust IDs | COMMENT |
| LOW⚡ | clis/pixiv/illusts.js | 38 | // Step 2: batch fetch details (Pixiv supports up to ~48 IDs per request) | COMMENT |
| LOW⚡ | clis/pixiv/illusts.test.js | 33 | // Step 1: profile/all returns illust IDs | COMMENT |
| LOW⚡ | clis/pixiv/illusts.test.js | 39 | // Step 2: batch detail response | COMMENT |
| LOW⚡ | clis/twitter/reply-dm.js | 26 | // Step 1: Navigate to messages to get conversation list | COMMENT |
| LOW⚡ | clis/twitter/reply-dm.js | 29 | // Step 2: Collect conversations with scroll-to-load | COMMENT |
| LOW | clis/twitter/reply-dm.js | 101 | // Step 3: Iterate through conversations and send message | COMMENT |
| LOW⚡ | clis/twitter/unretweet.js | 55 | // Step 1: click Unretweet button → opens menu | COMMENT |
| LOW⚡ | clis/twitter/unretweet.js | 58 | // Step 2: wait for and click the confirm menu item. The confirm | COMMENT |
| LOW⚡ | clis/twitter/retweet.js | 55 | // Step 1: click Retweet button → opens menu | COMMENT |
| LOW⚡ | clis/twitter/retweet.js | 58 | // Step 2: wait for and click the confirm menu item. The confirm | COMMENT |
| LOW⚡ | clis/twitter/accept.js | 29 | // Step 1: Navigate to DM requests page | COMMENT |
| LOW⚡ | clis/twitter/accept.js | 32 | // Step 2: Get conversations with scroll-to-load | COMMENT |
| LOW | clis/twitter/accept.js | 90 | // Step 3: Find first unvisited conversation with keyword match in preview | COMMENT |
| LOW | clis/twitter/accept.js | 102 | // Step 4: Click this conversation to open it | COMMENT |
| LOW | clis/twitter/accept.js | 119 | // Step 5: Read full chat content and find Accept button | COMMENT |
| LOW | clis/gemini/models.js | 453 | // Step 1: Open the picker menu (click the model-picker button). | COMMENT |
| LOW⚡ | clis/gemini/models.js | 472 | // Step 2: Wait for React to render the menu. | COMMENT |
| LOW⚡ | clis/gemini/models.js | 475 | // Step 3: Read model entries from the open menu. | COMMENT |
| LOW⚡ | clis/gemini/models.js | 488 | // Step 4: Close the menu. The current Gemini UI can show thinking | COMMENT |
| LOW⚡ | clis/gemini/models.js | 493 | // Step 5: Close the menu. | COMMENT |
| LOW⚡ | clis/gemini/utils.js | 2140 | // Step 1: Open the picker menu. | COMMENT |
| 58 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | autoresearch/save-adapters/zhihu-search-detail.ts | 18 | // Step 1: Navigate | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-search-detail.ts | 21 | // Step 2: Search API — filter results by type, extract question IDs | COMMENT |
| LOW | autoresearch/save-adapters/zhihu-search-detail.ts | 33 | // Step 3: For each result, fetch question stats (answer_count, follower_count) | COMMENT |
| LOW | autoresearch/save-adapters/zhihu-search-detail.ts | 47 | // Step 4: Format output | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 18 | // Step 1: Navigate to note detail page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 21 | // Step 2: Extract note metadata (title, author, likes) | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 29 | // Step 3: Scroll the note container to trigger comment loading | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-note-comments.ts | 37 | // Step 4: Extract comments from DOM | COMMENT |
| LOW | autoresearch/save-adapters/xhs-note-comments.ts | 54 | // Step 5: Merge note meta + comments into unified output | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 18 | // Step 1: Navigate to question page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 21 | // Step 2: Fetch question detail | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 29 | // Step 3: Fetch top answers | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 38 | // Step 4: Fetch related questions | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-question-full.ts | 46 | // Step 5: Merge three layers into unified output | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 18 | // Step 1: Navigate to search page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 20 | // Step 2: Wait for async render via MutationObserver | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 28 | // Step 3: Scroll 3x to load more content | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-search-full.ts | 33 | // Step 4: Extract from DOM with deduplication | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 16 | // Step 1: Navigate to explore page | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 18 | // Step 2: Wait for initial content via MutationObserver | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 26 | // Step 3: Multi-round adaptive scroll (early stop when no new content) | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 35 | // Step 4: Extract with noteId deduplication + parse likes as integers | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 57 | // Step 5: Sort by likes descending | COMMENT |
| LOW⚡ | autoresearch/save-adapters/xhs-explore-deep.ts | 59 | // Step 6: Slice and format | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-hot-detail.ts | 16 | // Step 1: Navigate | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-hot-detail.ts | 19 | // Step 2: Fetch hot list (handle 16+ digit IDs) | COMMENT |
| LOW⚡ | autoresearch/save-adapters/zhihu-hot-detail.ts | 29 | // Step 3: For each hot question, fetch its top answer | COMMENT |
| LOW | autoresearch/save-adapters/zhihu-hot-detail.ts | 46 | // Step 4: Format output | COMMENT |
| LOW⚡ | clis/pixiv/illusts.js | 29 | // Step 1: get all illust IDs | COMMENT |
| LOW⚡ | clis/pixiv/illusts.js | 38 | // Step 2: batch fetch details (Pixiv supports up to ~48 IDs per request) | COMMENT |
| LOW⚡ | clis/pixiv/illusts.test.js | 33 | // Step 1: profile/all returns illust IDs | COMMENT |
| LOW⚡ | clis/pixiv/illusts.test.js | 39 | // Step 2: batch detail response | COMMENT |
| LOW⚡ | clis/twitter/reply-dm.js | 26 | // Step 1: Navigate to messages to get conversation list | COMMENT |
| LOW⚡ | clis/twitter/reply-dm.js | 29 | // Step 2: Collect conversations with scroll-to-load | COMMENT |
| LOW | clis/twitter/reply-dm.js | 101 | // Step 3: Iterate through conversations and send message | COMMENT |
| LOW⚡ | clis/twitter/unretweet.js | 55 | // Step 1: click Unretweet button → opens menu | COMMENT |
| LOW⚡ | clis/twitter/unretweet.js | 58 | // Step 2: wait for and click the confirm menu item. The confirm | COMMENT |
| LOW⚡ | clis/twitter/retweet.js | 55 | // Step 1: click Retweet button → opens menu | COMMENT |
| LOW⚡ | clis/twitter/retweet.js | 58 | // Step 2: wait for and click the confirm menu item. The confirm | COMMENT |
| LOW⚡ | clis/twitter/accept.js | 29 | // Step 1: Navigate to DM requests page | COMMENT |
| LOW⚡ | clis/twitter/accept.js | 32 | // Step 2: Get conversations with scroll-to-load | COMMENT |
| LOW | clis/twitter/accept.js | 90 | // Step 3: Find first unvisited conversation with keyword match in preview | COMMENT |
| LOW | clis/twitter/accept.js | 102 | // Step 4: Click this conversation to open it | COMMENT |
| LOW | clis/twitter/accept.js | 119 | // Step 5: Read full chat content and find Accept button | COMMENT |
| LOW | clis/gemini/models.js | 453 | // Step 1: Open the picker menu (click the model-picker button). | COMMENT |
| LOW⚡ | clis/gemini/models.js | 472 | // Step 2: Wait for React to render the menu. | COMMENT |
| LOW⚡ | clis/gemini/models.js | 475 | // Step 3: Read model entries from the open menu. | COMMENT |
| LOW⚡ | clis/gemini/models.js | 488 | // Step 4: Close the menu. The current Gemini UI can show thinking | COMMENT |
| LOW⚡ | clis/gemini/models.js | 493 | // Step 5: Close the menu. | COMMENT |
| LOW⚡ | clis/gemini/utils.js | 2140 | // Step 1: Open the picker menu. | COMMENT |
| LOW⚡ | clis/gemini/utils.js | 2145 | // Step 2: Wait for React to render the menu. | COMMENT |
| LOW⚡ | clis/gemini/utils.js | 2148 | // Step 3: Click the thinking toggle to expand thinking options. | COMMENT |
| LOW⚡ | clis/gemini/utils.js | 2153 | // Step 4: Wait for the expanded thinking items to render. | COMMENT |
| LOW⚡ | clis/gemini/utils.js | 2157 | // Step 5: Select the requested thinking level (also closes the menu). | COMMENT |
| LOW⚡ | clis/jimeng/generate.js | 28 | // Step 1: Count existing images before generation | COMMENT |
| LOW⚡ | clis/jimeng/generate.js | 31 | // Step 2: Clear and set prompt | COMMENT |
| LOW⚡ | clis/jimeng/generate.js | 45 | // Step 3: Click generate | COMMENT |
| LOW⚡ | clis/jimeng/generate.js | 50 | // Step 4: Wait for new images to appear | COMMENT |
| LOW | clis/jimeng/generate.js | 66 | // Step 5: Extract image URLs (use thumbnail URLs which are accessible) | COMMENT |
| LOW | clis/chatgpt-app/ax.js | 371 | // Step 1: Click the "Options" button to open the popover (support English, Simplified and Traditional Chinese UI) | COMMENT |
| 42 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | autoresearch/eval-skill.ts | 74 | { name: "form-fill-basic", task: "Fill the Customer Name with 'OpenCLI' and Telephone with '555-0100'. Do not submit." | CODE |
| LOW | autoresearch/browse-tasks.json | 445 | "opencli browser eval \"var n=document.querySelector('[name=custname]');n.value='Alice';n.dispatchEvent(new Event( | CODE |
| LOW | docs/adapters/browser/linkedin.md | 74 | opencli linkedin connect https://www.linkedin.com/in/example/ --expected-name "Jane Doe" --note "quick note" --send | CODE |
| LOW | docs/adapters/browser/linkedin.md | 78 | opencli linkedin safe-send --thread-url https://www.linkedin.com/messaging/thread/abc/ --expected-name "Jane Doe" --mess | CODE |
| LOW | clis/mercury/utils.js | 253 | allInputs.find((field) => /yyyy|mm|dd|\\d{4}-\\d{2}-\\d{2}/i.test(field.getAttribute('placeholder') || '')); | CODE |
| LOW | clis/mercury/utils.js | 262 | /category|select/i.test(\`\${field.getAttribute('placeholder') || ''} \${field.getAttribute('aria-label' | CODE |
| LOW | clis/reuters/reuters.test.js | 63 | authors: [{ name: 'Jane Doe' }, { name: 'Bob Smith' }], | CODE |
| LOW | clis/producthunt/utils.test.js | 29 | expect(posts[0].author).toBe('Jane Doe'); | CODE |
| LOW | clis/doubao/utils.js | 122 | placeholder: placeholderNode?.getAttribute('placeholder') | CODE |
| LOW | clis/chatwise/utils.js | 83 | placeholder: placeholderEl?.getAttribute('aria-label') || placeholderEl?.textContent || el.getAttribute('pla | CODE |
| LOW | clis/linkedin-learning/search.test.js | 29 | expect(parseAuthors([{ firstName: 'Jane', lastName: 'Doe' }])).toBe('Jane Doe'); | CODE |
| LOW | clis/xiaohongshu/publish.js | 1069 | const placeholder = (el.getAttribute('placeholder') || '').trim(); | CODE |
| LOW | clis/slock/in-page.test.js | 344 | globalThis.localStorage = { getItem: () => 'fake-token', setItem: () => {} }; | CODE |
| LOW | clis/jike/comment.js | 49 | const ph = ta.getAttribute('placeholder') || ''; | CODE |
| LOW | clis/qoder/_utils.js | 139 | editor.getAttribute('placeholder') || '', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 112 | expect(assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: true | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 114 | expect(assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', pending: true, connectA | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 116 | expect(assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/' }, 'Jane Doe', 'https:// | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 121 | expect(assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', alreadyConnected: true | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 123 | expect(assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', pending: true }, 'Jane | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 125 | expect(assessProfileSafety({ name: 'Wrong Person', url: 'https://www.linkedin.com/in/wrong/', connectAvailable: | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 130 | const result = assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/?mini=true', conne | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 131 | expect(result).toMatchObject({ ok: true, blockReason: 'verified', actualValue: 'Jane Doe', connectable: true }); | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 137 | const result = assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailabl | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 142 | const result = assessProfileSafety({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailabl | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 191 | const page = makeFakePage({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: true, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 194 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 197 | expect(rows[0]).toMatchObject({ status: 'connectable_dry_run', recipient: 'Jane Doe', reason: 'verified', connec | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 203 | const page = makeFakePage({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', alreadyConnected: true, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 206 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 209 | expect(rows[0]).toMatchObject({ status: 'not_connectable', recipient: 'Jane Doe', reason: 'already_connected', c | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 217 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 230 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 238 | const page = makeFakePage({ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: true, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 242 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 250 | { name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: true, connectHref: '/preload | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 251 | { found: true, matchedName: 'Jane Doe', matchedUrl: 'https://www.linkedin.com/in/jane/' }, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 255 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 259 | expect(rows[0]).toMatchObject({ status: 'sent_verified', recipient: 'Jane Doe', reason: 'sent_invitation_verifie | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 266 | { name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: true, connectHref: '/preload | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 273 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 277 | expect(rows[0]).toMatchObject({ status: 'sent_verified', recipient: 'Jane Doe', reason: 'sent_invitation_verifie | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 285 | { name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: true, connectHref: '/preload | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 292 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 296 | expect(rows[0]).toMatchObject({ status: 'send_unverified', recipient: 'Jane Doe', reason: 'sent_invitation_not_f | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 304 | { name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: false, moreAvailable: true, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 305 | { found: true, matchedName: 'Jane Doe', matchedUrl: 'https://www.linkedin.com/in/jane/' }, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 309 | 'expected-name': 'Jane Doe', | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 312 | expect(rows[0]).toMatchObject({ status: 'sent_verified', recipient: 'Jane Doe', reason: 'sent_invitation_verifie | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 319 | [{ name: 'Jane Doe', url: 'https://www.linkedin.com/in/jane/', connectAvailable: false, moreAvailable: true, | CODE |
| LOW⚡ | clis/linkedin/connect.test.js | 324 | 'expected-name': 'Jane Doe', | CODE |
| LOW | clis/linkedin/connect.test.js | 64 | function evaluateProfileProbe(html, expectedName = 'Jane Doe') { | CODE |
| LOW | clis/linkedin/connect.test.js | 82 | expect(matchInvitationName('Jane Q. Doe', 'Jane Doe')).toBe(true); | CODE |
| LOW | clis/linkedin/connect.test.js | 83 | expect(matchInvitationName('Janet Doe', 'Jane Doe')).toBe(false); | CODE |
| LOW | clis/linkedin/connect.test.js | 162 | expect(probe.name).toBe('Jane Doe'); | CODE |
| LOW | clis/linkedin/salesnav-message.test.js | 142 | { status: 200, json: { data: { fullName: 'Jane Doe', defaultPosition: { title: 'QA', companyName: 'Acme' }, degree | CODE |
| LOW | clis/linkedin/salesnav-message.test.js | 153 | recipient: 'Jane Doe', | CODE |
| LOW | src/browser/dom-snapshot.test.ts | 168 | 'placeholder', 'href', 'role', 'data-testid', 'autocomplete', | CODE |
| LOW | src/browser/dom-snapshot.test.ts | 294 | expect(js).toContain('placeholder'); | CODE |
| LOW | src/browser/find.ts | 39 | 'placeholder', | CODE |
| 3 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | designs/self-repair-protocol.md | 141 | COMMENT | |
| LOW | extension/src/cdp.ts | 141 | // Retry attach up to 3 times — other extensions (1Password, Playwright MCP Bridge) | COMMENT |
| LOW | extension/src/background.ts | 21 | let contextIdPromise: Promise<string> | null = null; | COMMENT |
| LOW | extension/src/background.ts | 321 | // Ledger of every interactive group id we have created or adopted in the | COMMENT |
| LOW | extension/src/background.ts | 721 | const group = await chrome.tabGroups.get(groupId); | COMMENT |
| LOW | clis/dblp/author.js | 1 | // dblp author — resolve an author name to a PID and list their publications | COMMENT |
| LOW | clis/wechat-channels/publish.js | 381 | const targetDay = dt.getDate(); | COMMENT |
| LOW | clis/codex/_actions.js | 1 | // Shared helpers for Codex conversation management (pin/unpin/archive/rename). | COMMENT |
| LOW | clis/codex/model.js | 1 | import { cli, Strategy } from '@jackwener/opencli/registry'; | COMMENT |
| LOW | clis/semanticscholar/utils.js | 1 | // Shared helpers for the Semantic Scholar (`api.semanticscholar.org`) adapter. | COMMENT |
| LOW | clis/grok/utils.js | 241 | } | COMMENT |
| LOW | clis/openalex/utils.js | 1 | // Shared helpers for the OpenAlex (`api.openalex.org`) adapter. | COMMENT |
| LOW | clis/hupu/hot.js | 1 | // Hupu hot/home threads — public SSR HTML scrape via in-page DOM walk. | COMMENT |
| LOW | clis/weixin/download.js | 21 | // | COMMENT |
| LOW | clis/eastmoney/kuaixun.js | 1 | // eastmoney kuaixun — 7x24 real-time market news feed. | COMMENT |
| LOW | clis/facebook/notifications.test.js | 1 | // Facebook notifications — unit tests for pure helpers + JSDOM fixture | COMMENT |
| LOW | clis/facebook/notifications.js | 1 | // Facebook notifications — pulls the rendered notification feed from | COMMENT |
| LOW | clis/facebook/notifications.js | 21 | // - Upfront `--limit` validation: positive integer in [1, 100], no | COMMENT |
| LOW | clis/xiaoe/catalog.js | 1 | // Xiaoe (小鹅通) catalog — list chapters + sections of a course / column | COMMENT |
| LOW | clis/xiaoe/courses.js | 1 | // Xiaoe (小鹅通) purchased-courses list — pulls "已购内容" tab cards from | COMMENT |
| LOW | clis/xiaoe/content.js | 1 | // Xiaoe (小鹅通) content extractor — pulls rendered article text from a | COMMENT |
| LOW | clis/xiaoe/xiaoe.test.js | 1 | // Xiaoe adapter contract + helper tests. | COMMENT |
| LOW | clis/reddit/home.js | 61 | await page.goto('https://www.reddit.com'); | COMMENT |
| LOW | clis/reddit/read.js | 141 | const postId = normalizeRedditPostId(kwargs['post-id']); | COMMENT |
| LOW | clis/xiaohongshu/publish.js | 1241 | } | COMMENT |
| LOW | clis/chatgpt/utils.js | 2481 | // Cover both message shapes from CONVERSATION_MESSAGE_SELECTOR: | COMMENT |
| LOW | clis/trae-solo/renderer-storage.js | 1 | // Renderer-side storage commands for Trae SOLO. | COMMENT |
| LOW | clis/trae-solo/skill-fs.js | 1 | // File-system based skill commands — work without TRAE SOLO being focused | COMMENT |
| LOW | clis/trae-solo/skill.js | 1 | // Read-only commands for the TRAE SOLO Skills Marketplace panel: | COMMENT |
| LOW | clis/trae-solo/task-fs.js | 1 | // File-system based task commands. Each TRAE SOLO conversation is stored | COMMENT |
| LOW | clis/trae-solo/_state.js | 1 | // Helpers for reading Trae SOLO's VSCode-style state.vscdb files. | COMMENT |
| LOW | clis/trae-solo/state-fs.js | 1 | // VSCode-style state.vscdb read commands for Trae SOLO. | COMMENT |
| LOW | clis/tiktok/follow.js | 1 | // Follow a TikTok user via in-page button click + state verification. | COMMENT |
| LOW | clis/tiktok/comment.js | 1 | // Post a comment on a TikTok video via in-page button click + state | COMMENT |
| LOW | clis/tiktok/unfollow.js | 1 | // Unfollow a TikTok user via in-page button click + state verification. | COMMENT |
| LOW | clis/tiktok/utils.js | 161 | } | COMMENT |
| LOW | clis/slock/attachment-download.js | 1 | // attachment-download.js | COMMENT |
| LOW | clis/slock/task-create.js | 1 | // task-create.js | COMMENT |
| LOW | clis/slock/api-base-canary.test.js | 1 | // api-base-canary.test.js | COMMENT |
| LOW | clis/slock/task-convert.js | 1 | // task-convert.js | COMMENT |
| LOW | clis/slock/server-override-canary.test.js | 1 | // server-override-canary.test.js | COMMENT |
| LOW | clis/slock/error-detail-canary.test.js | 1 | // error-detail-canary.test.js | COMMENT |
| LOW | clis/slock/site-session-canary.test.js | 1 | // site-session-canary.test.js | COMMENT |
| LOW | clis/slock/short-id-canary.test.js | 1 | // short-id-canary.test.js | COMMENT |
| LOW | clis/slock/attachment-upload.test.js | 81 | COMMENT | |
| LOW | clis/slock/in-page.js | 1 | import { UUID_RE } from './resolve.js'; | COMMENT |
| LOW | clis/slock/in-page.js | 61 | // etc.). Reading localStorage there throws SecurityError "Access is denied". | COMMENT |
| LOW | clis/slock/in-page.js | 141 | // other 404s in surrounding logic (threads-404 / channel-404 mean | COMMENT |
| LOW | clis/slock/attachment-upload.js | 1 | // attachment-upload.js | COMMENT |
| LOW | clis/antigravity/_actions.js | 1 | // Shared helpers for Antigravity sidebar conversation management. | COMMENT |
| LOW | clis/antigravity/audit-extras.js | 1 | // Deep-audit gap closers for Antigravity (port 9234). | COMMENT |
| LOW | clis/qoder/ui.js | 1 | // Global UI commands for Qoder. | COMMENT |
| LOW | clis/qoder/_utils.js | 1 | // Shared helpers for the Qoder adapter. | COMMENT |
| LOW | clis/kimi/audit-extras.js | 1 | // Deep-audit gap closers for Kimi (kimi.com). | COMMENT |
| LOW | clis/linkedin/connect.js | 181 | }); | COMMENT |
| LOW | src/cli.ts | 1321 | count: messages.length, | COMMENT |
| LOW | src/execution.ts | 421 | // reclaims it if the release is lost. | COMMENT |
| LOW | src/browser/stealth.ts | 181 | return fn; | COMMENT |
| LOW | src/browser/stealth.ts | 221 | COMMENT | |
| LOW | src/browser/stealth.ts | 261 | // When DevTools or CDP debugger is attached, Chrome may alter the | COMMENT |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | clis/chatgpt-app/ax.js | 70 | print(String(data: data, encoding: .utf8)!) | CODE |
| HIGH | clis/chatgpt-app/ax.js | 290 | print("Sent") | CODE |
| HIGH⚡ | clis/chatgpt-app/ax.js | 412 | print("Selected: \(target)") | CODE |
| HIGH | clis/chatgpt-app/ax.js | 445 | print("false"); exit(0) | CODE |
| HIGH | clis/chatgpt-app/ax.js | 458 | print("false"); exit(0) | CODE |
| HIGH | clis/chatgpt-app/ax.js | 461 | print(targets.contains(where: { hasButton(win, desc: $0) }) ? "true" : "false") | CODE |
| HIGH | clis/chatgpt-app/ax.js | 501 | print("false"); exit(0) | CODE |
| HIGH | clis/chatgpt-app/ax.js | 514 | print("false"); exit(0) | CODE |
| HIGH | clis/chatgpt-app/ax.js | 516 | print(hasTemporaryChatText(win) ? "true" : "false") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | extension/src/background.test.ts | 1167 | const createCalls = chrome.alarms.create.mock.calls.filter((c: unknown[]) => c[0] === alarmName); | CODE |
| CRITICAL | extension/src/background.test.ts | 2068 | const createGroupCalls = chrome.tabs.group.mock.calls.filter((call: any[]) => call[0]?.createProperties); | CODE |
| CRITICAL | extension/src/background.test.ts | 2094 | const createGroupCalls = chrome.tabs.group.mock.calls.filter((call: any[]) => call[0]?.createProperties); | CODE |
| CRITICAL | …lls/opencli-adapter-author/references/api-discovery.md | 251 | opencli browser eval "window.__pinia.state.value.someStore.someMethod({...})" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | autoresearch/eval-save.ts | 123 | // Phase 1: init — create scaffold | COMMENT |
| MEDIUM | autoresearch/eval-save.ts | 134 | // Phase 2: write — overwrite scaffold with real adapter code | COMMENT |
| MEDIUM | docs/adapters/browser/linkedin-learning.md | 27 | opencli linkedin-learning course https://www.linkedin.com/learning/agentic-ai-build-your-first-agentic-ai-system | CODE |
| MEDIUM | clis/linkedin-learning/search.test.js | 69 | url: 'https://www.linkedin.com/learning/agentic-ai-build-your-first-agentic-ai-system', | CODE |
| MEDIUM | clis/linkedin-learning/course.test.js | 23 | expect(parseSlug('https://www.linkedin.com/learning/agentic-ai-build/?foo=1')) | CODE |
| MEDIUM | clis/linkedin-learning/course.test.js | 28 | expect(() => parseSlug('https://evil.example/learning/agentic-ai-build')).toThrow(ArgumentError); | CODE |
| MEDIUM | clis/linkedin-learning/course.test.js | 58 | expect(row.url).toBe('https://www.linkedin.com/learning/agentic-ai-build-your-first-agentic-ai-system'); | CODE |
| MEDIUM | skills/opencli-usage/SKILL.md | 120 | opencli plugin create <name> # scaffold a new plugin | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | clis/hf/paper.js | 3 | // AI-generated keyword list HF curates. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/browser/shape-filter.ts | 64 | // it as a raw segment list (keeps us robust to unexpected input). | COMMENT |
| MEDIUM | …r/__fixtures__/article-extract/wikipedia-markdown.html | 967 | <li id="cite_note-commonmark.org-30"><span class="mw-cite-backlink"><b><a href="#cite_ref-commonmark.org_30-0">^</a> | CODE |
| MEDIUM | …r/__fixtures__/article-extract/wikipedia-markdown.html | 967 | <li id="cite_note-commonmark.org-30"><span class="mw-cite-backlink"><b><a href="#cite_ref-commonmark.org_30-0">^</a> | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/adapters/browser/pubmed.md | 68 | export NCBI_API_KEY=YOUR_API_KEY | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | autoresearch/commands/run.ts | 46 | ## Scope (files you can modify) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-doc-coverage.sh | 8 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-doc-coverage.sh | 45 | # Check if doc exists in browser/ or desktop/ subdirectories | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/cli.ts | 2792 | // TODO: implement data fetching | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/daemon.ts | 247 | async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> { | CODE |