Local, open-source AI app builder for power users ✨ v0 / Lovable / Replit / Bolt alternative 🌟 Star if you like it!
This report summarizes scanner evidence for dyad-sh/dyad, a TypeScript project with 22,132 GitHub stars. SynthScan examined 912,724 lines of code across 3531 source files, recording 1973 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 3.1 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1597 finding(s).
Are imports declared and package/API names verified? 45 finding(s).
Are wrappers, guards, and repeated structures necessary? 1647 finding(s).
Which changes need focused human review? 1973 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1973 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | 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/version-preview-state-machine.md | 414 | function useVersionPreviewRecovery(): RecoverySnapshot[]; | CODE |
| LOW | plans/hybrid-harness-improvements.md | 64 | export function setModelClientFetchForTesting(f: typeof fetch | undefined) { | CODE |
| LOW | plans/search-chats-tool.md | 148 | function projectChatMessageForSearch( | 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 | 91 | export function getProxyFallbackPortStart(): number { | CODE |
| LOW | shared/node_module_resolution.ts | 43 | export async function resolveNodeModulePackageJsonPath( | CODE |
| LOW | shared/node_module_resolution.ts | 62 | export function resolveNodeModulePackageJsonPathSync( | CODE |
| LOW | shared/node_module_resolution.ts | 81 | export function resolveTypeScriptPackageJsonPath( | CODE |
| LOW | shared/node_module_resolution.ts | 87 | export function resolveTypeScriptPackageJsonPathSync(appPath: string): string { | CODE |
| LOW | shared/node_module_resolution.ts | 124 | export function getTypeScriptCompilerPath(packageJsonPath: string): string { | CODE |
| LOW⚡ | shared/preview_hostname.ts | 23 | export function getPreviewCookieNamespace(appId: number): string { | CODE |
| LOW⚡ | shared/preview_hostname.ts | 30 | export function isPreviewNamespacedCookie(name: string): boolean { | CODE |
| LOW⚡ | shared/preview_hostname.ts | 35 | export function getCookiePreviewNamespace(name: string): string | undefined { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 28 | async function configurePackageManagerCache( | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 71 | async function createUpgradeablePnpmShim(userDataDir: string) { | CODE |
| LOW | e2e-tests/package_manager.spec.ts | 115 | async function createBlockedFirewallShim(userDataDir: string) { | CODE |
| 1255 more matches not shown… | ||||
| 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 |
| 271 more matches not shown… | ||||
| 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 | .claude/skills/run-benchmark/scripts/run-arm.sh | 1 | #!/bin/bash | 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 | benchmarks/app-builder/record-tours.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/app-builder/run-cell.sh | 41 | # The cell now runs the app's dev server, so `pnpm install` executes inside the | COMMENT |
| LOW | benchmarks/app-builder/run-cell.sh | 61 | # ("openrouter/deepseek/deepseek-v4-flash-0731"). Rather than encode that rule, | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/score-checkpoint.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …lder/cuj-tests/tours/checkpoint-tour-relay-crm.spec.ts | 1 | // Relay CRM — video tour of the checkpoint-3 app. | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/portalis/fixtures.ts | 1 | import { openOptions } from "../interactions"; | COMMENT |
| LOW | …ks/app-builder/cuj-tests/portalis/checkpoint-3.spec.ts | 1 | import { clickMenuItem } from "../interactions"; | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/ledgerly/fixtures.ts | 1 | // Shared Ledgerly suite helpers (design/app-4-ledgerly.md, "Test fixtures & | COMMENT |
| LOW | …ks/app-builder/cuj-tests/ledgerly/checkpoint-3.spec.ts | 1 | // Ledgerly — checkpoint 3 CUJ suite (design/app-4-ledgerly.md, M3 CUJ table + | COMMENT |
| LOW | …ks/app-builder/cuj-tests/ledgerly/checkpoint-3.spec.ts | 1361 | maxRedirects: 0, | COMMENT |
| LOW | …ks/app-builder/cuj-tests/ledgerly/checkpoint-2.spec.ts | 1 | // Ledgerly — checkpoint 2 CUJ suite (design/app-4-ledgerly.md, M2 CUJ table + | COMMENT |
| LOW | …ks/app-builder/cuj-tests/ledgerly/checkpoint-1.spec.ts | 1 | // Ledgerly — checkpoint 1 CUJ suite (design/app-4-ledgerly.md, M1 CUJ table + | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/slotline/fixtures.ts | 1 | // Shared Slotline suite helpers (design/app-5-slotline.md, "Test fixtures & | COMMENT |
| LOW | …ks/app-builder/cuj-tests/slotline/checkpoint-3.spec.ts | 1 | // Slotline — checkpoint 3 CUJ suite (design/app-5-slotline.md, M3 CUJ table + | COMMENT |
| LOW | …ks/app-builder/cuj-tests/slotline/checkpoint-2.spec.ts | 1 | // Slotline — checkpoint 2 CUJ suite (design/app-5-slotline.md, M2 CUJ table + | COMMENT |
| LOW | …ks/app-builder/cuj-tests/slotline/checkpoint-1.spec.ts | 1 | // Slotline — checkpoint 1 CUJ suite (design/app-5-slotline.md, M1 CUJ table + | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/curbside/fixtures.ts | 1 | // Shared Curbside suite helpers (design/app-6-curbside.md, "Test fixtures & | COMMENT |
| LOW | …ks/app-builder/cuj-tests/curbside/checkpoint-3.spec.ts | 1 | // Curbside — checkpoint 3 CUJ suite (design/app-6-curbside.md, M3 CUJ table + | COMMENT |
| LOW | …ks/app-builder/cuj-tests/curbside/checkpoint-2.spec.ts | 1 | // Curbside — checkpoint 2 CUJ suite (design/app-6-curbside.md, M2 CUJ table + | COMMENT |
| LOW | …ks/app-builder/cuj-tests/curbside/checkpoint-1.spec.ts | 1 | // Curbside — checkpoint 1 CUJ suite (design/app-6-curbside.md, M1 CUJ table + | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/deskhero/fixtures.ts | 1 | // Shared Deskhero suite helpers (design/app-2-deskhero.md, "Suite mechanics"). | COMMENT |
| LOW | benchmarks/app-builder/cuj-tests/deskhero/fixtures.ts | 41 | // Unique token for one test's data (identities, subjects, markers). Tests share | COMMENT |
| LOW | …s/app-builder/cuj-tests/relay-crm/checkpoint-1.spec.ts | 1 | // Relay CRM — checkpoint 1 CUJ suite (design/app-1-relay-crm.md, "CUJ suite | COMMENT |
| LOW | benchmarks/app-builder/oracle/preflight.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/app-builder/oracle/run-suite.sh | 41 | [[ -f "$APP_DIR/schema.sql" ]] || { echo "[oracle] $APP_DIR/schema.sql missing"; exit 1; } | COMMENT |
| LOW | scripts/ci-cleanup-macos.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/claude-rules-review.yml | 1 | # Weekly review of AGENTS.md and rules/ to ensure documentation stays | 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-auth-bootstrap.js | 41 | // Best effort: the value is already snapshotted above either way. | COMMENT |
| LOW | worker/dyad-sw.js | 21 | self.addEventListener("fetch", (event) => { | COMMENT |
| LOW | worker/dyad-recorder-client.js | 41 | // The vm/happy-dom unit test sets this before the script runs so it can drive | COMMENT |
| LOW | worker/dyad-recorder-client.js | 81 | // conservative — a false positive costs one placeholder to replace, a false | COMMENT |
| LOW | src/main.ts | 521 | await encryptStoredMcpSecrets(); | 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 | 21 | ptype?: string; // crashing process type: "browser" (main) / "renderer" / "gpu-process" / … | COMMENT |
| 116 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 | 422 | // Step 1: Add first pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 438 | // Step 2: AI added a new message, add another pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 515 | // Step 1: User sends initial prompt | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 526 | // Step 2: AI responds with tool call, tool adds screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 581 | // Step 3: AI continues, tool adds another screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1083 | // Step 0: web_crawl + list_files | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1106 | // Step 1: model generates a search_replace tool call | COMMENT |
| LOW | src/prompts/neon_prompt.ts | 135 | ## Step 0: Inspect the App Before Scaffolding | COMMENT |
| 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 | 312 | "## 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 | 334 | "## Key Decisions Made\n- Completed initial task as requested\n\n## Current Task State\nConversation was compact | CODE |
| HIGH | testing/fake-llm-server/responsesHandler.ts | 299 | "## Key Decisions Made\n- Completed initial task as requested\n\n## Current Task State\nConversation was compact | CODE |
| HIGH | worker/dyad-recorder-client.js | 57 | // in an AI-generated app — to lift with one `querySelector`. | COMMENT |
| HIGH | src/__tests__/dyad_recorder_client.test.ts | 161 | // AI-generated app — to lift with one `querySelector`. | COMMENT |
| HIGH | src/ipc/handlers/shell_handler.ts | 94 | // The dyad-apps tree contains AI-generated code, so opening arbitrary files | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | plans/version-preview-state-machine.md | 518 | ### Phase 6: remove legacy orchestration | COMMENT |
| MEDIUM | plans/subagent.md | 333 | ### Model-facing orchestration tools | COMMENT |
| MEDIUM | plans/subagent.md | 426 | ### Phase 2: Manager, durability, and orchestration | COMMENT |
| MEDIUM | plans/machine-followup.md | 388 | ## Accepted backlog and guardrails | COMMENT |
| 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 | plans/sandboxed-e2e-test-runtime.md | 278 | ### 5. Lifecycle orchestration and coordination | COMMENT |
| 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 | e2e-tests/local_agent_run_build.spec.ts | 62 | // Build mode creates an app from the actual bundled Vite scaffold. | COMMENT |
| MEDIUM | benchmarks/app-builder/design/runner-scoring.md | 126 | ### 3. Run orchestration (build phase) | COMMENT |
| MEDIUM | rules/e2e-testing.md | 202 | ## CI scaffold dependency installs | COMMENT |
| MEDIUM | src/ipc/handlers/proposal_handlers.ts | 157 | // created before agentic messages were eagerly marked approved. | COMMENT |
| MEDIUM | src/ipc/handlers/__tests__/undo.integration.test.ts | 154 | // scaffold's "Welcome to Your Blank App" page; in the minimal fixture the | COMMENT |
| MEDIUM | src/coolify_deploy/build_config.test.ts | 50 | // Railpack detects it and every scaffold carries `next start`. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/snapshots/engine.spec.ts_send-message-to-engine-1.txt | 507 | "placeholder": { | CODE |
| LOW | …gent_advanced.spec.ts_local-agent---mention-apps-1.txt | 949 | "placeholder": { | CODE |
| LOW | …spec.ts_smart-auto-should-send-message-to-engine-1.txt | 483 | "placeholder": { | CODE |
| LOW | …apshots/mention_app.spec.ts_mention-app-with-pro-1.txt | 483 | "placeholder": { | CODE |
| LOW | …nd-message-to-engine---anthropic-claude-sonnet-4-1.txt | 490 | "placeholder": { | CODE |
| LOW | …ocal_agent_auto.spec.ts_local-agent---auto-model-1.txt | 960 | "placeholder": { | CODE |
| LOW | …ne.spec.ts_send-message-to-engine---openai-gpt-5-1.txt | 482 | "placeholder": { | CODE |
| LOW | …sts/helpers/page-objects/components/GitLabConnector.ts | 12 | export const FAKE_GITLAB_TOKEN = "glpat-fake-token"; | CODE |
| LOW | testing/fake-llm-server/cloudflare.ts | 123 | ok(res, { id: "fake-token-id", status: "active" }); | CODE |
| LOW | testing/fake-llm-server/gitlab.ts | 23 | export const FAKE_GITLAB_TOKEN = "glpat-fake-token"; | CODE |
| LOW | …s/app-builder/cuj-tests/relay-crm/checkpoint-1.spec.ts | 32 | const ADA_PHONE = "555-0100"; | CODE |
| LOW | worker/dyad-recorder-client.js | 847 | case "placeholder": | CODE |
| LOW | worker/dyad-recorder-client.js | 849 | (e) => e.getAttribute("placeholder") === descriptor.value, | CODE |
| LOW | worker/dyad-recorder-client.js | 893 | const placeholder = el.getAttribute && el.getAttribute("placeholder"); | CODE |
| LOW | worker/dyad-recorder-client.js | 895 | candidates.push({ kind: "placeholder", value: placeholder, exact: true }); | CODE |
| LOW | src/supabase_admin/supabase_management_client.ts | 604 | userId: "fake-user-id", | CODE |
| LOW | …n/ipc/handlers/local_agent/local_agent_handler.test.ts | 699 | row(5, "placeholder"), | CODE |
| LOW | …n/ipc/handlers/local_agent/local_agent_handler.test.ts | 709 | expect(serialized).not.toContain("placeholder"); | 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 | 80 | - "placeholder" (string, optional): Placeholder for text inputs | CODE |
| LOW | src/shared/coolify_admin_email.test.ts | 21 | ["admin@example.com", false, "reserved for documentation"], | CODE |
| LOW | src/shared/coolify_admin_email.test.ts | 87 | expect(adminEmailRefusal("admin@example.com")).toBe(undeliverable); | CODE |
| LOW | src/__tests__/dyad_recorder_client.test.ts | 491 | locator: { kind: "placeholder", value: "Email", exact: true }, | CODE |
| LOW | src/__tests__/dyad_recorder_client.test.ts | 496 | locator: { kind: "placeholder", value: "Email", exact: true }, | CODE |
| LOW | src/__tests__/dyad_recorder_client.test.ts | 547 | locator: { kind: "placeholder", value: "API key", exact: true }, | CODE |
| LOW | src/__tests__/dyad_recorder_client.test.ts | 562 | locator: { kind: "placeholder", value: "Email address", exact: true }, | CODE |
| LOW | src/lib/test_recorder/codegen.test.ts | 54 | expect(locatorToCode({ kind: "placeholder", value: "Email" })).toBe( | CODE |
| LOW | src/lib/test_recorder/codegen.test.ts | 102 | locatorToCode({ kind: "placeholder", value: "Email", exact: true }), | CODE |
| LOW | src/lib/test_recorder/codegen.test.ts | 205 | locator: { kind: "placeholder", value: "Bio" }, | CODE |
| LOW | src/lib/test_recorder/codegen.test.ts | 251 | locator: { kind: "placeholder", value: "Email" }, | CODE |
| LOW | src/lib/test_recorder/codegen.ts | 31 | case "placeholder": | CODE |
| LOW | src/lib/test_recorder/merge.test.ts | 7 | ({ kind: "placeholder", value }) as const; | CODE |
| LOW | src/lib/test_recorder/types.ts | 13 | "placeholder", | CODE |
| LOW⚡ | src/prompts/supabase_prompt.test.ts | 46 | "user@example.com", | CODE |
| LOW⚡ | src/prompts/supabase_prompt.test.ts | 54 | email: "user@example.com", | CODE |
| LOW⚡ | src/prompts/supabase_prompt.test.ts | 59 | email: "user@example.com", | CODE |
| LOW⚡ | src/prompts/supabase_prompt.test.ts | 63 | "user@example.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .claude/hooks/python-permission-hook.py | 338 | # Use shlex for robust argument parsing | COMMENT |
| MEDIUM | benchmarks/app-builder/run-cell.sh | 3 | # patched headless harness against neon-sim + the engine recording proxy. | COMMENT |
| MEDIUM | benchmarks/app-builder/run-cell.sh | 151 | # app = base + appId%1000 (the harness always creates app id 1), proxy = | COMMENT |
| MEDIUM | benchmarks/app-builder/cuj-tests/score-checkpoint.sh | 166 | # harness, so detect it and mark the checkpoint unscored instead. | COMMENT |
| MEDIUM⚡ | benchmarks/app-builder/oracle/preflight.sh | 2 | # Pre-flight gate: prove the harness is sane BEFORE any model cell is scored. | COMMENT |
| MEDIUM⚡ | benchmarks/app-builder/oracle/preflight.sh | 7 | # A benchmark with no controls cannot tell "the model is bad" from "the harness | COMMENT |
| MEDIUM⚡ | benchmarks/app-builder/oracle/preflight.sh | 8 | # is broken" — this session produced five distinct harness defects that each | 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 | 1698 | // -z gives NUL-delimited output for robust parsing of paths with spaces. | COMMENT |
| MEDIUM | src/ipc/utils/playwright_report.ts | 307 | // 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 |
|---|---|---|---|---|
| CRITICAL | …/components/preview_panel/dyadScreenshotClient.test.ts | 194 | client.parent.postMessage.mock.calls.map(([message]) => message), | CODE |
| CRITICAL | …onents/preview_panel/DeployDialog.integration.test.tsx | 526 | vercel.projects.createProjectEnv.mock.invocationCallOrder.at(-1)!, | CODE |
| CRITICAL | …onents/preview_panel/DeployDialog.integration.test.tsx | 745 | vercel.projects.createProjectEnv.mock.invocationCallOrder.at(-1)!, | CODE |
| 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 | 422 | // Step 1: Add first pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 438 | // Step 2: AI added a new message, add another pending message | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 515 | // Step 1: User sends initial prompt | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 526 | // Step 2: AI responds with tool call, tool adds screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 581 | // Step 3: AI continues, tool adds another screenshot | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1083 | // Step 0: web_crawl + list_files | COMMENT |
| LOW | …in/ipc/handlers/local_agent/prepare_step_utils.test.ts | 1106 | // Step 1: model generates a search_replace tool call | COMMENT |
| LOW | src/prompts/neon_prompt.ts | 135 | ## 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 |
|---|---|---|---|---|
| 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 | 13 | - 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 | .claude/skills/run-benchmark/scripts/run-arm.sh | 8 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …de/skills/fix-issue/scripts/sanitize_issue_markdown.py | 65 | CODE |