Local, open-source AI app builder for power users ✨ v0 / Lovable / Replit / Bolt alternative 🌟 Star if you like it!
This report presents the forensic synthetic code analysis of dyad-sh/dyad, a TypeScript project with 20,913 GitHub stars. SynthScan v2.0 examined 425,991 lines of code across 1931 source files, recording 1122 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 4.3 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 1122 distinct pattern matches across 16 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 | .claude/hooks/tests/python_good_commands.txt | 5 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/python_good_commands.txt | 7 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 21 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 23 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 32 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 34 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 43 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 45 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 54 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 56 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 63 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 65 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 72 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 74 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 82 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 84 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 92 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 94 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 100 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/python_good_commands.txt | 102 | # ============================================================================= | COMMENT |
| MEDIUM | …laude/hooks/tests/python_security_blocked_commands.txt | 5 | # ============================================================================= | COMMENT |
| MEDIUM | …laude/hooks/tests/python_security_blocked_commands.txt | 7 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 50 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 52 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 62 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 64 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 73 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 75 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 80 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 82 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 89 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 91 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 98 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | …laude/hooks/tests/python_security_blocked_commands.txt | 100 | # ============================================================================= | COMMENT |
| MEDIUM | …laude/hooks/tests/python_security_blocked_commands.txt | 113 | # ============================================================================= | COMMENT |
| MEDIUM | …laude/hooks/tests/python_security_blocked_commands.txt | 115 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 75 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 77 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 87 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 89 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 297 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 299 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 308 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 310 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 694 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 696 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 704 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 706 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 767 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 769 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 777 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/good_commands.txt | 779 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 4 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 6 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 60 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 62 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 146 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 148 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 161 | # ============================================================================= | COMMENT |
| MEDIUM | .claude/hooks/tests/good_commands.txt | 163 | # ============================================================================= | COMMENT |
| 216 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plans/supabase-finegrained-redeploy.md | 116 | export async function getSupabaseFunctionsAffectedBySharedModules({ | CODE |
| LOW | plans/supabase-finegrained-redeploy.md | 273 | export async function deployAllSupabaseFunctions(args) { | CODE |
| LOW | plans/catalog-data.ts | 339 | export function buildLanguageModelCatalogResponse( | CODE |
| LOW | plans/hybrid-harness-improvements.md | 64 | export function setModelClientFetchForTesting(f: typeof fetch | undefined) { | CODE |
| LOW | .claude/hooks/gh-permission-hook.py | 242 | def neutralize_code_spans_in_double_quotes(match: re.Match) -> str: | STRING |
| LOW | .claude/hooks/tests/test_permission_request_hook.py | 48 | def test_invalid_json_passthrough(self): | CODE |
| LOW | .claude/hooks/tests/test_permission_request_hook.py | 59 | def test_non_dict_tool_input_passthrough(self): | CODE |
| LOW | .claude/hooks/tests/test_permission_request_hook.py | 73 | def test_bash_commands_analyzed(self): | CODE |
| LOW | .claude/hooks/tests/test_permission_request_hook.py | 83 | def test_no_claude_cli_passthrough(self, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_permission_request_hook.py | 96 | def test_response_format_documented(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 114 | def test_policy_has_green_section(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 120 | def test_policy_has_yellow_section(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 126 | def test_policy_has_red_section(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 137 | def test_policy_covers_git_force_push(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 142 | def test_policy_covers_shell_patterns(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 148 | def test_policy_covers_curl_pipe_sh(self): | CODE |
| LOW⚡ | .claude/hooks/tests/test_permission_request_hook.py | 153 | def test_policy_covers_safe_commands(self): | CODE |
| LOW | .claude/hooks/tests/test_python_permission_hook.py | 105 | def test_passthrough_commands() -> tuple[int, int, list[str]]: | CODE |
| LOW | .claude/hooks/tests/test_python_permission_hook.py | 124 | def test_security_blocked_commands() -> tuple[int, int, list[str]]: | CODE |
| LOW⚡ | .claude/hooks/tests/test_stop_hook.py | 95 | def test_analyze_returns_none_when_no_cli(self, tmp_path, monkeypatch): | CODE |
| LOW⚡ | .claude/hooks/tests/test_stop_hook.py | 104 | def test_no_claude_cli_allows_stop(self, tmp_path): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 48 | def test_invalid_json_allows_stop(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 59 | def test_stop_hook_active_allows_stop(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 70 | def test_missing_transcript_allows_stop(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 80 | def test_nonexistent_transcript_allows_stop(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 123 | def test_parses_valid_json_response(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 141 | def test_parses_json_in_markdown_code_fence(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 158 | def test_returns_none_for_no_json(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 174 | def test_returns_none_for_malformed_json(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 190 | def test_returns_none_on_nonzero_returncode(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 206 | def test_returns_none_on_subprocess_error(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 219 | def test_returns_none_for_empty_transcript(self, tmp_path, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 231 | def test_response_format_documented(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 238 | def test_hook_checks_stop_hook_active(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 258 | def test_extracts_incomplete_tasks(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 290 | def test_extracts_completed_tasks(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 299 | def test_handles_nonexistent_file(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 322 | def test_blocks_with_remaining_tasks(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 347 | def test_allows_stop_with_all_tasks_completed(self, monkeypatch): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 369 | def test_reads_incomplete_tasks_fixture(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 397 | def test_reads_completed_tasks_fixture(self): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 426 | def test_reads_assistant_messages(self, tmp_path): | CODE |
| LOW | .claude/hooks/tests/test_stop_hook.py | 438 | def test_truncates_large_transcripts(self, tmp_path): | CODE |
| LOW | …ills/fix-issue/scripts/test_sanitize_issue_markdown.py | 49 | def test_excessive_whitespace(self): | CODE |
| LOW | …ills/fix-issue/scripts/test_sanitize_issue_markdown.py | 70 | def test_preserves_code_blocks(self): | CODE |
| LOW | …ills/fix-issue/scripts/test_sanitize_issue_markdown.py | 85 | def test_preserves_inline_code(self): | CODE |
| LOW | …ills/fix-issue/scripts/test_sanitize_issue_markdown.py | 111 | def test_removes_control_characters(self): | CODE |
| LOW | shared/ports.ts | 56 | export function getProxyFallbackPortStart(): number { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 27 | async function configurePackageManagerCache(userDataDir: string) { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 63 | async function createUpgradeablePnpmShim(userDataDir: string) { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 141 | async function restorePackageManagerCache() { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 280 | async function addLocalDependencyWithIgnoredBuild(appPath: string) { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 320 | function extendSocketFirewallTestTimeout(testInfo: TestInfo) { | CODE |
| LOW | e2e-tests/setup_flow.spec.ts | 300 | async function setupGoogleKeyAndExpectResume( | CODE |
| LOW | e2e-tests/setup_flow.spec.ts | 338 | async function expectProviderApiKeySaved( | CODE |
| LOW | e2e-tests/setup_flow.spec.ts | 379 | async function triggerDyadProReturnDeepLink(electronApp: ElectronApplication) { | CODE |
| LOW | e2e-tests/setup_flow.spec.ts | 440 | async function attachHomeChatContextFile(po: PageObject, filePath: string) { | CODE |
| LOW | e2e-tests/custom_apps_folder.spec.ts | 7 | async function expectCustomAppsFolderSetting( | CODE |
| LOW | e2e-tests/managed_node.spec.ts | 13 | function createManagedNodeFixtureArchive(userDataDir: string) { | CODE |
| LOW | e2e-tests/safe_storage_keychain_identity.spec.ts | 270 | function writeGithubTokenCiphertext( | CODE |
| 621 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .claude/skills/multi-pr-review/SKILL.md | 26 | ### Step 1: Determine PR Number and Repo | COMMENT |
| LOW | .claude/skills/multi-pr-review/SKILL.md | 39 | ### Step 2: Fetch PR Diff and Context | COMMENT |
| LOW | .claude/skills/multi-pr-review/SKILL.md | 57 | ### Step 3: Spawn Review Agents in Parallel | COMMENT |
| LOW | .claude/skills/multi-pr-review/SKILL.md | 132 | ### Step 4: Collect and Parse Results | COMMENT |
| LOW | .claude/skills/multi-pr-review/SKILL.md | 136 | ### Step 5: Validate Issues with Reasoned Analysis | COMMENT |
| LOW⚡ | .claude/skills/multi-pr-review/SKILL.md | 158 | ### Step 6: Determine Merge Verdict | COMMENT |
| LOW⚡ | .claude/skills/multi-pr-review/SKILL.md | 166 | ### Step 7: Deduplicate Against Existing Comments | COMMENT |
| LOW⚡ | .claude/skills/multi-pr-review/SKILL.md | 174 | ### Step 8: Post GitHub Comments | COMMENT |
| LOW | .claude/skills/swarm-to-plan/SKILL.md | 25 | ### Step 1: Set Up Context | COMMENT |
| LOW⚡ | .claude/skills/swarm-to-plan/SKILL.md | 37 | ### Step 2: Create the Planning Team | COMMENT |
| LOW⚡ | .claude/skills/swarm-to-plan/SKILL.md | 47 | ### Step 3: Create Tasks | COMMENT |
| LOW⚡ | .claude/skills/swarm-to-plan/SKILL.md | 56 | ### Step 4: Spawn Teammates | COMMENT |
| LOW | .claude/skills/swarm-to-plan/SKILL.md | 101 | ### Step 5: Collect Initial Analyses | COMMENT |
| LOW | .claude/skills/swarm-to-plan/SKILL.md | 105 | ### Step 6: Facilitate Cross-Role Debate | COMMENT |
| LOW | .claude/skills/swarm-to-plan/SKILL.md | 137 | ### Step 7: Synthesize Questions for the Human | COMMENT |
| LOW⚡ | .claude/skills/swarm-to-plan/SKILL.md | 150 | ### Step 8: Share Clarifications and Gather Final Input | COMMENT |
| LOW⚡ | .claude/skills/swarm-to-plan/SKILL.md | 154 | ### Step 9: Compile the Final Plan | COMMENT |
| LOW⚡ | .claude/skills/swarm-to-plan/SKILL.md | 158 | ### Step 10: Write the Plan | COMMENT |
| LOW | .claude/skills/swarm-to-plan/SKILL.md | 273 | ### Step 11: Shutdown Team | COMMENT |
| LOW⚡ | .claude/skills/deep-review/SKILL.md | 10 | ## Step 1: Determine the diff to review | COMMENT |
| LOW⚡ | .claude/skills/deep-review/SKILL.md | 17 | ## Step 2: Gather shared context | COMMENT |
| LOW⚡ | .claude/skills/deep-review/SKILL.md | 25 | ## Step 3: Launch the review workflow | COMMENT |
| LOW | .claude/skills/deep-review/SKILL.md | 48 | ## Step 4: Report | COMMENT |
| LOW | .claude/skills/deep-review/SKILL.md | 52 | ## Step 5: False positives — exclude these (give this list to every finder and verifier) | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 29 | ### Step 1: Determine PR Number and Repo | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 42 | ### Step 2: Fetch PR Diff and Context | COMMENT |
| LOW⚡ | .claude/skills/swarm-pr-review/SKILL.md | 60 | ### Step 3: Create the Review Team | COMMENT |
| LOW⚡ | .claude/skills/swarm-pr-review/SKILL.md | 70 | ### Step 4: Create Review Tasks | COMMENT |
| LOW⚡ | .claude/skills/swarm-pr-review/SKILL.md | 79 | ### Step 5: Spawn Teammates | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 154 | ### Step 6: Collect Initial Reviews | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 158 | ### Step 7: Facilitate Discussion | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 194 | ### Step 8: Compile Consensus | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 205 | ### Step 9: Determine Merge Verdict | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 213 | ### Step 10: Post GitHub Comments | COMMENT |
| LOW | .claude/skills/swarm-pr-review/SKILL.md | 281 | ### Step 11: Shutdown Team | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 421 | // Step 1: Add first pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 437 | // Step 2: AI added a new message, add another pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 514 | // Step 1: User sends initial prompt | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 525 | // Step 2: AI responds with tool call, tool adds screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 580 | // Step 3: AI continues, tool adds another screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1082 | // Step 0: web_crawl + list_files | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1105 | // Step 1: model generates a search_replace tool call | COMMENT |
| LOW | src/prompts/neon_prompt.ts | 100 | ## Step 0: Inspect the App Before Scaffolding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tsconfig.node.json | 21 | COMMENT | |
| LOW | plans/web-fetch-local-agent.md | 141 | ### Key Implementation Details | COMMENT |
| LOW | plans/web-fetch-local-agent.md | 181 | // 1. Validate URL scheme (http/https only) | COMMENT |
| LOW | plans/neondb-integration.md | 421 | NEON_AUTH_COOKIE_SECRET=your-cookie-secret-here # Secret for session cookies | COMMENT |
| LOW | .claude/hooks/gh-permission-hook.py | 141 | ) | COMMENT |
| LOW | .claude/hooks/gh-permission-hook.py | 201 | # - Zero or more VAR=value assignments (no spaces in value, or quoted) | COMMENT |
| LOW | .claude/hooks/gh-permission-hook.py | 281 | COMMENT | |
| LOW | .claude/hooks/gh-permission-hook.py | 521 | """ | COMMENT |
| LOW | .claude/hooks/tests/good_commands.txt | 761 | gh api repos/$(gh repo view --json nameWithOwner -q .nameWithOwner)/pulls/2524/comments --paginate 2>/dev/null | jq -r ' | COMMENT |
| LOW | e2e-tests/safe_storage_keychain_identity.spec.ts | 121 | // SecItemCopyMatching searches the search list, not the default keychain, | COMMENT |
| LOW | e2e-tests/safe_storage_keychain_identity.spec.ts | 361 | // the same ciphertext — unless the session derived its key from a different | COMMENT |
| LOW | e2e-tests/safe_storage_keychain_identity.spec.ts | 461 | // "survives the pre-ready identity flip" test above. | COMMENT |
| LOW | …sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt | 221 | COMMENT | |
| LOW | …sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt | 1101 | # you may not use this file except in compliance with the License. | COMMENT |
| LOW | …sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt | 1121 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | COMMENT |
| LOW | …sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt | 1141 | # The "traditional" practice of packing multiple parameters into a | COMMENT |
| LOW | …sts/snapshots/capacitor.spec.ts_upgraded-capacitor.txt | 1321 | # | COMMENT |
| LOW | e2e-tests/helpers/test-ports.ts | 1 | // Base port for fake LLM servers - each worker gets its own port | COMMENT |
| LOW | scripts/ci-cleanup-macos.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/cla.yml | 41 | #custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA' | COMMENT |
| LOW | .github/workflows/ci.yml | 121 | COMMENT | |
| LOW | worker/dyad-sw.js | 21 | self.addEventListener("fetch", (event) => { | COMMENT |
| LOW | src/main.ts | 341 | // Remove GitHub tokens that older versions embedded in git remote URLs | COMMENT |
| LOW | src/atoms/chatAtoms.ts | 541 | // Sidecar overlay for tool-input XML preview during Pro/Agent v2 streaming. | COMMENT |
| LOW | …/pro/main/ipc/handlers/local_agent/tool_definitions.ts | 521 | inputSchema: tool.inputSchema, | COMMENT |
| LOW | …c/handlers/local_agent/tools/json_schema_to_ts.spec.ts | 1041 | // contentMediaType, contentSchema | COMMENT |
| LOW | …c/handlers/local_agent/tools/json_schema_to_ts.spec.ts | 1061 | // 7. Remote `$ref` (http://, file://, relative file paths) renders as | COMMENT |
| LOW | …c/handlers/local_agent/tools/json_schema_to_ts.spec.ts | 1081 | // signature (from `additionalProperties`, `unevaluatedProperties`, or | COMMENT |
| LOW | …c/handlers/local_agent/tools/json_schema_to_ts.spec.ts | 1101 | // `maxItems: 10000` from blowing up the rendered declaration. | COMMENT |
| LOW | …c/handlers/local_agent/tools/json_schema_to_ts.spec.ts | 1121 | // have (deviation #3). | COMMENT |
| LOW | …in/ipc/handlers/local_agent/tools/json_schema_to_ts.ts | 581 | const required: string[] = Array.isArray(schema.required) | COMMENT |
| LOW | src/utils/minidump_summary.ts | 41 | // MINIDUMP_DIRECTORY entry (one per stream): a u32 stream type, then a | COMMENT |
| LOW | src/utils/minidump_summary.ts | 141 | // 6 * u64 home params = 48 | COMMENT |
| LOW | src/utils/minidump_summary.test.ts | 1 | import { describe, it, expect } from "vitest"; | COMMENT |
| LOW | src/testing/hybrid_chat_harness.tsx | 1281 | // teardown"): | COMMENT |
| LOW | …testing/hybrid_chat_harness.smoke.integration.test.tsx | 1 | // Smoke test for setupHybridChatHarness — the real React <ChatPanel> (RTL under | COMMENT |
| LOW | src/testing/chat_flow_harness.smoke.test.ts | 1 | // @vitest-environment node | COMMENT |
| LOW | src/__tests__/evals/helpers/eval_recorder.ts | 1 | import { mkdir, writeFile } from "node:fs/promises"; | COMMENT |
| LOW | src/__tests__/evals/helpers/prompts.ts | 1 | // System prompts used by the eval suites. | COMMENT |
| LOW | src/db/schema.ts | 61 | // If supabaseProjectId is a branch, then the parent project id set. | COMMENT |
| LOW | src/db/schema.ts | 321 | .default(sql`0`), | COMMENT |
| LOW | src/ipc/utils/mcp_oauth_integration.test.ts | 1 | // @vitest-environment node | COMMENT |
| LOW | src/ipc/utils/mcp_oauth_provider.ts | 181 | private readonly preregisteredClientSecret: string | undefined; | COMMENT |
| LOW | src/ipc/utils/mcp_oauth_flow.ts | 361 | COMMENT | |
| LOW | src/ipc/processors/response_processor.ts | 321 | COMMENT | |
| LOW | src/ipc/handlers/mcp_error_classifiers.ts | 1 | // String classifiers for untyped SDK error messages. Extracted so | COMMENT |
| LOW | src/ipc/handlers/mcp_error_classifiers.ts | 21 | // Resource Metadata." | COMMENT |
| LOW | src/ipc/handlers/mcp_error_classifiers.ts | 61 | } | COMMENT |
| LOW | src/ipc/handlers/tests_handlers.ts | 421 | // app dir just in case. | COMMENT |
| LOW | src/ipc/handlers/neon_handlers.ts | 761 | branchType: outgoingBranchType, | COMMENT |
| LOW | src/ipc/handlers/migration_handlers.ts | 21 | COMMENT | |
| LOW | …s/__tests__/local_agent_list_files.integration.test.ts | 1 | // Migrated from e2e-tests/local_agent_list_files.spec.ts, then converted from | COMMENT |
| LOW | …dlers/__tests__/context_compaction.integration.test.ts | 1 | // Migrated from e2e-tests/context_compaction.spec.ts, then converted from the | COMMENT |
| LOW | …s/__tests__/local_agent_step_limit.integration.test.ts | 1 | // Migrated from e2e-tests/local_agent_step_limit.spec.ts, then converted from | COMMENT |
| LOW | …handlers/__tests__/supabase_branch.integration.test.ts | 1 | // Migrated from e2e-tests/supabase_branch.spec.ts ("supabase branch selection | COMMENT |
| LOW | …tests__/local_agent_search_replace.integration.test.ts | 1 | // Migrated from e2e-tests/local_agent_search_replace.spec.ts, then converted | COMMENT |
| LOW | …/__tests__/local_agent_code_search.integration.test.ts | 1 | // Migrated from e2e-tests/local_agent_code_search.spec.ts, then converted from | COMMENT |
| LOW | …handlers/__tests__/local_agent_ask.integration.test.ts | 1 | // Migrated from e2e-tests/local_agent_ask.spec.ts, then converted from the | COMMENT |
| LOW | …ndlers/__tests__/cancelled_message.integration.test.ts | 1 | // Migrated from e2e-tests/cancelled_message.spec.ts, then converted from the | COMMENT |
| LOW | src/ipc/handlers/__tests__/retry.integration.test.ts | 1 | // Migrated from e2e-tests/retry.spec.ts, then converted from the node chat-flow | COMMENT |
| 7 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .claude/skills/pr-fix-comments/SKILL.md | 225 | 🤖 Generated by Claude Code | CODE |
| HIGH | e2e-tests/ai_e2e_testing.spec.ts | 4 | // End-to-end coverage for the AI-generated E2E testing feature (the Tests | COMMENT |
| HIGH | testing/fake-llm-server/chatCompletionHandler.ts | 252 | "## Key Decisions Made\n- Completed initial task as requested\n\n## Current Task State\nConversation was compact | CODE |
| HIGH | testing/fake-llm-server/anthropicMessagesHandler.ts | 330 | "## Key Decisions Made\n- Completed initial task as requested\n\n## Current Task State\nConversation was compact | CODE |
| HIGH | src/ipc/handlers/shell_handler.ts | 70 | // The dyad-apps tree contains AI-generated code, so opening arbitrary files | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | plans/better-e2e.md | 136 | ### 7. Scrub scaffold/template versions from app-file snapshots | COMMENT |
| MEDIUM | plans/better-e2e.md | 185 | | Weeks 3–4 | #5 vitest harness + payload cluster (~18 specs), #7 scaffold scrubbing | suite shrinks; payload tests | CODE |
| MEDIUM | plans/better-e2e.md | 186 | | Ongoing | #6 migrate-on-touch, #8 smoke consolidation, #10 guardrails | e2e converges on the 36 specs | CODE |
| MEDIUM | docs/architecture.md | 36 | ### Why isn't Dyad more agentic? | COMMENT |
| MEDIUM | docs/architecture.md | 52 | One approach that we don't use is a more agentic-style like what Claude Code and Cursor does where it iteratively search | CODE |
| MEDIUM | rules/e2e-testing.md | 129 | ## CI scaffold dependency installs | COMMENT |
| MEDIUM | src/ipc/handlers/__tests__/undo.integration.test.ts | 122 | // scaffold's "Welcome to Your Blank App" page; in the minimal fixture the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .claude/hooks/python-permission-hook.py | 338 | # Use shlex for robust argument parsing | COMMENT |
| MEDIUM | .github/workflows/claude-pr-review.yml | 3 | # https://github.com/anthropics/claude-code-action/blob/main/examples/pr-review-comprehensive.yml | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 332 | # harness imports the fake-llm-server in-process, so its own | COMMENT |
| MEDIUM | src/ipc/utils/git_utils.ts | 1020 | // -z gives NUL-delimited output for robust parsing of paths with spaces. | COMMENT |
| MEDIUM | src/ipc/utils/playwright_report.ts | 305 | // Normalize all separators to POSIX. A global replace is more robust than | COMMENT |
| MEDIUM | src/ipc/handlers/app_collection_handlers.ts | 184 | // but we null out explicitly first so the operation is robust regardless | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/add-macos-cert.sh | 9 | # Check if the variable is set | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 221 | # Check if the path is inside the project directory | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 252 | # Check if this is a python/python3 command | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 272 | # Check if the script is inside .claude directory | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 302 | # Check if this even looks like a python command before denying | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 318 | # Check if command starts with python or python3 | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 363 | # Check if next argument is an allowed module | COMMENT |
| LOW | .claude/hooks/python-permission-hook.py | 443 | # Check if the script is inside the .claude directory | COMMENT |
| LOW | .claude/hooks/gh-permission-hook.py | 351 | # Check if this is a gh api command | STRING |
| LOW | .claude/hooks/gh-permission-hook.py | 455 | # Check if command has input data (implies write operation) | STRING |
| LOW | .github/workflows/ci.yml | 88 | # Check if all changed files are in config-only directories (.claude, rules) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 421 | // Step 1: Add first pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 437 | // Step 2: AI added a new message, add another pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 514 | // Step 1: User sends initial prompt | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 525 | // Step 2: AI responds with tool call, tool adds screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 580 | // Step 3: AI continues, tool adds another screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1082 | // Step 0: web_crawl + list_files | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1105 | // Step 1: model generates a search_replace tool call | COMMENT |
| LOW | src/prompts/neon_prompt.ts | 100 | ## Step 0: Inspect the App Before Scaffolding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/add-macos-cert.sh | 24 | # Create a keychain | COMMENT |
| MEDIUM⚡ | .claude/hooks/tests/test_stop_hook.py | 106 | # Create a minimal transcript | COMMENT |
| MEDIUM | .claude/hooks/tests/test_stop_hook.py | 442 | # Create a large transcript with many messages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .claude/hooks/python-permission-hook.py | 96 | # Replace safe redirect patterns (2>&1, >/dev/null) before checking | COMMENT |
| HIGH | .claude/hooks/gh-permission-hook.py | 299 | # Replace safe redirect patterns (like 2>&1, 2>/dev/null) before checking | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …/components/preview_panel/dyadScreenshotClient.test.ts | 194 | client.parent.postMessage.mock.calls.map(([message]) => message), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …gent_advanced.spec.ts_local-agent---mention-apps-1.txt | 659 | "placeholder": { | CODE |
| LOW | …ocal_agent_auto.spec.ts_local-agent---auto-model-1.txt | 673 | "placeholder": { | CODE |
| LOW | src/supabase_admin/supabase_management_client.ts | 431 | userId: "fake-user-id", | CODE |
| LOW | …c/pro/main/ipc/handlers/local_agent/tools/web_crawl.ts | 57 | - Replace all \`<img src="...">\` with: \`<img src="/assets/placeholder.svg" alt="placeholder" />\` | CODE |
| LOW | …c/pro/main/ipc/handlers/local_agent/tools/web_crawl.ts | 58 | - If using Next.js Image component: \`<Image src="/assets/placeholder.svg" alt="placeholder" width={400} height={300} /> | CODE |
| LOW | …c/pro/main/ipc/handlers/local_agent/tools/web_crawl.ts | 81 | - Replace all \`<img src="...">\` with: \`<img src="/assets/placeholder.svg" alt="placeholder" />\` | CODE |
| LOW | …c/pro/main/ipc/handlers/local_agent/tools/web_crawl.ts | 82 | - If using Next.js Image component: \`<Image src="/assets/placeholder.svg" alt="placeholder" width={400} height={300} /> | CODE |
| LOW | …c/handlers/local_agent/tools/planning_questionnaire.ts | 77 | - "placeholder" (string, optional): Placeholder for text inputs | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .claude/hooks/python-permission-hook.py | 123 | CODE | |
| LOW | .claude/hooks/python-permission-hook.py | 288 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …t_web_fetch.spec.ts_local-agent---web-fetch-1.aria.yml | 11 | - paragraph: Here's a summary of the page content. The getting started guide covers three main items. Let me know if you | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …de/skills/fix-issue/scripts/sanitize_issue_markdown.py | 65 | CODE |